0

自動で日記書くようにした

http://shokai-log.tumblr.com


こういうのを毎日自動で書く。何していたかなんとなくわかって良い。
2012年08月11日 01時00分 @sho-virtualbox – 橋本障害

gitはadd 5回、commit 5回、pull 4回、push 4回、checkout 3回、tag 3回、mv 2回、clone 2回、reset 2回、init 1回使った
git 72回、node 55回、ls 51回、whereami 42回、cd 16回実行しました
HDD0.266GB使った。残り10.214GB空いてる



しくみ
https://github.com/shokai/autodiary これをcrontabで1日1回実行するだけ。
zshのhistoryを24時間分読んでtumblrに投稿する。
ruby autodiary.rb –run で動く。


元ネタ:Pitecanサーバ日記

0

emacsでAndroidのAPIも入力補完する

それなりに補完してくれて便利。
ソースコードの静的解析もしてくれてるみたいで、キャストとかしてるとおかしくなるが、インスタンスの持ってるメソッドを引数付きで出してくれたりもする。


必要なものをインストール

homebrewのemacs23.4.1に、yasnippetauto-completeajc-java-completeyasnippet-java-modeを入れる。


Androidのクラスを入力補完できるようにする


ajc-java-completeのTagファイルにAndroidのjarも突っ込めばおk
git clone git://github.com/jixiuf/ajc-java-complete.git
cd ajc-java-complete
javac Tags.java

CLASSPATHが通っている所jarを読んでくれるので、Android4.1とGoogle APIにもpathを通す。
export CLASSPATH=/usr/local/var/lib/android-sdk/add-ons/addon-google_apis-google-16/libs/:/usr/local/var/lib/android-sdk/platforms/android-16/android.jar:/System/Library/Frameworks/JavaVM.framework/Classes/classes.jar:$CLASSPATH
java Tags

~/.java_base.tag ができる。 ~/.emacs.d/ajc.tag に移動させた。
(require 'ajc-java-complete-config)
(set 'ajc-tag-file "~/.emacs.d/ajc.tag")
(add-hook 'java-mode-hook 'ajc-java-complete-mode)
emacsに読み込ませて完成。


jarを探すのはMacならmdfind使うと速いと思う。
mdfind android.jar
mdfind maps.jar
とかすればすぐ出てくる。


いろんな所からもらってきたelispやらがごっちゃになってるけど、ここに.emacs以下置いてある
https://github.com/shokai/mac-dot-emacs

参考:Android開発にも役立つEmacsの補完プラグイン – ajc-java-complete – Clouder::Blogger

0

Android開発環境をインストールしなおした

Macbook Air(Mountain Lion)にAndroid関係を入れなおした。
手順が多くてややこしい。

  • Android SDKをhomebrewでインストールした
  • Eclipse4.2入れた

Android SDKインストール

http://developer.android.com/sdk/index.htmlと同じ最新バージョンが確かめる。
brew info android
brew install android
which android
androidコマンドが使えるようになる。/usr/local/bin/androidにインストールされた。


各Androidバージョン毎のPlatform SDKをインストールする

(山ライオンにJavaが入ってなかったので、この時にインストールされた)
android
GUIが起動する。
必要なものだけインストールする。4.1と2.3.3をいれた。2.3.3の中には各メーカーの端末用のSDKがあるけど必要ないのでチェックはずした。


Androidアプリを作ってみる

せっかくだからちゃんとSDKがインストールできているか確かめる。
android list
どのバージョンのAndroid用のアプリを作るか、listで出てくるのでidをメモしておく


プロジェクト作ってビルドする
android create project --target 3 --name TestApp --path `pwd` --activity 'Test' --package org.shokai.testapp
android update project --path `pwd`
ant debug
–target 3だが、SDK Version3ではなくlistにあった id: 3 or “android-10″のこと。


Android接続して
adb install -r bin/TestApp-debug.apk
これでAndroidにTestというアプリがインストールされてる。

res/layout/main.xmlの中の”Hello World”とかの文字列変更してみたりするとよい


Eclipseインストール

いいかげんworkspaceという概念が古臭いので使いたくないけど、Javaのクラス階層が深すぎて仕方なくインストールする。

Eclipse 4.2 JUNOを入れた。
http://www.eclipse.org/downloads/


ダウンロードしたtar.gzをダブルクリックで解凍すると、Android SDKをインストールできずにエラーがでるので、Terminalで解凍しなければならない。
Cannot complete the request. This installation has not been configured properly for Software Updates.

cd ~/Downloads
tar -zxvf eclipse-SDK-4.2-macosx-cocoa-x86_64.tar.gz
mv eclipse /Applications/
open /Applications/eclipse
Eclipse.appを起動。


EclipseにAndroid Developer Toolsインストール


[Help]->[Install New Software]
Works with: に https://dl-ssl.google.com/android/eclipse/ を書いてadd。
Developer Toolsをインストールする。


Eclipseを再起動する。


homebrewで入れたAndroid SDKへのパスを設定する
[Eclipse]->[環境設定]->[Android]
SDK Location: /usr/local/Cellar/android-sdk/r18


あと、[Eclipse]->[環境設定]->[Java]->[Code Style]->[Formatter]で、
Tab plicyをSpaces onlyにすると良いと思います。

0

Mac/LinuxのWiFiで位置情報を取得

wifi_locationというrubygemを作った。Mac (Lion, Mountain Lion)と Ubuntu 12.04で動く。

gem install wifi_location
whereami --help
whereami --dump
whereamiというコマンドが付属してるので、これを使うと
{"towers":[{"bssid":"20:f3:a3:8c:66:ab","signal":-72},{"bssid":"00:0a:79:a5:7c:16","signal":-80},{"bssid":"1c:b1:7f:11:f8:c2","signal":-82},{"bssid":"20:f3:a3:32:58:f7","signal":-91},{"bssid":"の","signal":0},{"bssid":"00:24:a5:b8:90:e7","signal":-80},{"bssid":"10:c6:1f:ec:f8:49","signal":-56}],"location":{"latitude":35.640688,"longitude":139.6941365,"address":{"country":"日本","country_code":"JP","region":"東京都","city":"目黒区","street":"1丁目","street_number":"1"},"accuracy":40.0}}
こういうのが出てくる。
WiFiアクセスポイントのBSSID(Macアドレス)と電波強度を http://www.google.com/loc/json に送ると位置情報が得られる。かなり精度高い。


参考


これをRubyで実装するとこうなる


インストール

gem install wifi_location


Rubyから使う

#!/usr/bin/env ruby
require 'rubygems'
require 'wifi_location'
loc = WiFiLocation.location
puts "#{loc['latitude']}, #{loc['longitude']}"
p loc
WiFiLocation.locationが返すhashに、緯度経度住所番地国名などなどが入っている。


whereami

gem installするとwhereamiコマンドが使える。
whereami –map でgooglemapが開く
whereami –dump で全部表示
引数なしで、緯度経度のみ表示する。


オフラインで使う

WiFiLocation.towers でアクセスポイントのMacアドレスと電波強度だけを取得できる(googleには送らない)
これはオフラインでも使える。
whereami –towers も同様。


ライフログ的な

crontabに
*/5 * * * * ruby -e 'puts "#{Time.now.to_i}\t#{`whereami --towers`}"' >> ~/wifi-towers.txt
とか書いておく。5分毎に~/wifi-towers.txt にunixtimeと電波状況が保存される。


インターネットに接続してからまとめて位置情報に変換してみる
cat ~/wifi-towers.txt | ruby -rjson -rwifi_location -lane 'a=$_.split(/\t/); time = Time.at a[0].to_i; loc = WiFiLocation.location JSON.parse a[1]; puts "#{time}\t#{loc.inspect}"'

結果が出てくる。
2012-08-03 20:05:00 +0900       {"latitude"=>35.5470762, "longitude"=>139.6434858, "address"=>{"country"=>"日本", "country_code"=>"JP", "region"=>"神奈川県", "city"=>"横浜市", "street"=>"3丁目", "street_number"=>"14"}, "accuracy"=>45.0}
2012-08-03 20:10:00 +0900 {"latitude"=>35.5823082, "longitude"=>139.663203, "address"=>{"country"=>"日本", "country_code"=>"JP", "region"=>"神奈川県", "city"=>"川崎市", "street"=>"1丁目", "street_number"=>"667"}, "accuracy"=>49.0}
2012-08-03 20:15:00 +0900 {"latitude"=>35.69384, "longitude"=>139.703549, "address"=>{"country"=>"日本", "country_code"=>"JP", "region"=>"東京都", "city"=>"新宿区", "street"=>"1丁目", "street_number"=>"4"}, "accuracy"=>166000.0}


WiFiのBSSID取得するコマンド、ネイティブアプリなら誰でも実行できるし、ブラウザやスマホと違ってダイアログも出ないからほんと変なアプリは入れないようにしたほうが良いと思う

0

mongooseのvirtual attributes

Query投げて返ってきたDocumentsが関数を持っていて欲しい時にVirtual Attributes使う。

  • スキーマ.virtual(‘名前’).get(function(){ /**/ })
  • スキーマ.virtual(‘名前’).set(function(){ /**/ })
でgetter/setterを付けれる。

例えば、MongoDBにはidしか保存しないようにして、permalinkのURL等はidから組み立てる場合、そういう関数はmodelに持たせたい。


実装例

RecipeSchema.virtual(‘url’).get に関数を登録しておくと、 doc.url で呼び出せる。

mongoose_virtual_attr.js
var _ = require('underscore');
var mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/test', function(err){
if(err){
console.error(err);
process.exit(1);
}
});

var Schema = mongoose.Schema, ObjectId = Schema.ObjectId;

var RecipeSchema = new Schema({
id : {type: String, unique: true},
title : {type: String},
created_at : {type: Date, default: Date.now}
});
RecipeSchema.virtual('url').get(function(){
return 'http://shokai.org/'+this.id;
});

var Recipe = mongoose.model('Recipe', RecipeSchema);
Recipe.latests = function(num){
return this.find().sort('created_at', -1).limit(num);
};

var recipe = new Recipe({id: '29jg', title: '肉じゃが'});
recipe.save();

Recipe.latests(3).exec(function(err, docs){
if(err){
throw err;
}
else{
_.each(docs, function(doc){
console.log(doc.url);
});
}
mongoose.disconnect();
});


% npm install mongoose underscore
% node mongoose_virtual_attr.js
http://shokai.org/29jg


というのがやり方わかんないんだよねぇ・・と相談したらmyatsumoto氏が教えてくれた。