国内で有名なソーシャル系ボタン7つの説明ページへのリンク集
よく調べる気がするのでメモ
関係ないけどこの中でSSLに勝手に対応してくれるのはGoogleだけ。
はてなブックマークボタン
http://b.hatena.ne.jp/guide/bbutton
Facebook いいねボタン(デベロッパー登録が必要)
http://developers.facebook.com/docs/reference/plugins/like/
mixiチェックボタン(デベロッパー登録が必要)
http://developer.mixi.co.jp/connect/mixi_plugin/mixi_check/spec_mixi_check
Evernoteサイトメモリーボタン
http://www.evernote.com/about/developer/sitememory/developer.php
GREEのボタン
http://developer.gree.co.jp/connect/plugins/sf
CakePHPでdatetime型のフォームを日付と時間の二つのテキストフィールドにする
jQueryのDatePickerとかTimePickerを使うために、datetime型のフィールドを下のような状態のフォームで出力したかった。
結論
あまりスマートな方法は見つからなかった。
ただしそれほど汚いことはしなくていい
手順
- フォームヘルパを編集
- モデルのデータ受取り部分を編集
フォームヘルパを編集
<?php echo $form->dateText($fieldName, $options); echo $form->timeText($fieldName, $options); ?>
という感じで使えるようにするために、フォームヘルパに以下のようなコードを追加する
<?php function dateText($fieldName, $options = array()){ $options = $this->_initInputField($fieldName, array_merge( array('type' => 'text'), $options )); if($options['value'] && $options['value'] > '0000-00-00 00:00:00'){ $options['value'] = date('Y/m/d',strtotime($options['value'])); }else{ $options['value'] = ''; } return $this->input($fieldName, $options); } function timeText($fieldName, $options = array()){ $options = $this->_initInputField($fieldName, array_merge( array('type' => 'text'), $options )); if($options['value'] && $options['value'] > '0000-00-00 00:00:00'){ $options['value'] = date('H:i',strtotime($options['value'])); }else{ $options['value'] = ''; } return $this->input($fieldName, $options); }
モデルのデータ受取り部分を編集
date[Post][date][year],date[Post][date][month],date[Post][date][day]などの配列をまとめてdate[Post][date]という形にするのは、Modelのdeconstructという関数がやっているのでそれをAppModelなどで上書きしてやる
<?php /* * フォームから送られてきたデータを加工する関数 */ function deconstruct($field, $data) { if(isset($data['date']) && isset($data['time'])){ $time = strtotime($data['date']." ".$data['time']); $data['year'] = date('Y',$time); $data['month'] = date('m',$time); $data['day'] = date('d',$time); $data['hour'] = date('H',$time); $data['min'] = date('i',$time); } return parent::deconstruct($field, $data); }
以上
objective-cでretainCountが増えるとき減るときの確認
Objective-cでiPhoneやiPadのアプリ開発をしているが、GCのない言語をまともに使ったことがないので混乱している。
頭を整理するためにViewBasedApplicationを使って試してみる。
基本
- (void)viewDidLoad { [super viewDidLoad]; UIView *a = [[UIView alloc] init]; LOG(@"a retainCount:%d",[a retainCount]); // => 1 [self.view addSubview:a]; LOG(@"a retainCount:%d",[a retainCount]); // => 2 増えた [a removeFromSuperview]; LOG(@"a retainCount:%d",[a retainCount]); // => 1 }
- allocしたときに増える
- addSubviewしたとき増える
- removeFromSuperviewしたときに減る
addSubviewで増えたcountはいつ減るのか
さらにaにsubview bが、bにsubview cがついたとき
- UIView a
- UIview b
- UIView c
- UIview b
- (void)viewDidLoad { [super viewDidLoad]; UIView *a = [[UIView alloc] init]; [self.view addSubview:a]; LOG(@"a retainCount:%d",[a retainCount]); // => 2 UIView *b = [[[UIView alloc] init] autorelease]; UIView *c = [[[UIView alloc] init] autorelease]; [a addSubview:b]; [b addSubview:c]; LOG(@"a retainCount:%d",[a retainCount]); // => 2 LOG(@"b retainCount:%d",[b retainCount]); // => 2 LOG(@"c retainCount:%d",[c retainCount]); // => 2 [a removeFromSuperview]; LOG(@"a retainCount:%d",[a retainCount]); // => 1 (減った) LOG(@"b retainCount:%d",[b retainCount]); // => 2 (ここでは減らない) LOG(@"c retainCount:%d",[c retainCount]); // => 2 [a release]; LOG(@"b retainCount:%d",[b retainCount]); // => 1 (減った) LOG(@"c retainCount:%d",[c retainCount]); // => 2 (ここでは減らない) }
- aにsubviewがついてもaのcountは増えない(増えるように見える時があるのはなんだろ)
- bはaがリリースされるとretainCountが減る([a removeFromSuperview]のタイミングではない)
- cはbのdeallocが呼ばれないのでreleaseされないのだろう
MutableArrayやMutableDictionaryで増えたcountはいつ減るのか
- (void)viewDidLoad { [super viewDidLoad]; NSMutableArray *d = [NSMutableArray array]; NSObject *obj1 = [[NSObject alloc]init]; LOG(@"d retainCount:%d",[d retainCount]); // => 1 LOG(@"obj1 retainCount:%d",[obj1 retainCount]); // => 2 [d addObject:obj1]; LOG(@"d retainCount:%d",[d retainCount]); // => 1 LOG(@"obj1 retainCount:%d",[obj1 retainCount]); // => 2 [d release]; LOG(@"obj1 retainCount:%d",[obj1 retainCount]); // => 1 }
- addObjectするとobj1は増える
- MutableArrayを削除すればobj1は減る
autorelease
retainCountが1になったら殺すという死刑宣告。retainしてやれば延命できる。
あとは
Objective-C プログラミング言語:メモリ管理を熟読するのが早い
結論
- alloc, copy(なんちゃらcopy, copyなんちゃらを含む) , retain, addSubview, addObject(その他addなんちゃら)をすると増える
- addなんちゃらで増えたcountはaddしたオブジェクトが解放されれば減る
疑問
autoreleaseプールの仕組み。例えば
NSObject *a; for(int i=0; i<100; i++){ a = [[[NSObject alloc] init] autorelease]; }
は全部リリースされるのかどうか不安
一人暮らしをはじめる昔の自分に教えたいこと
6年ぐらい一人暮らしして、去年結婚してそれも終わった。
フライヤーが一番必要だとは思わえなかったのでノウハウを共有したい
家/物件
家具/家電
お金がなかったので家電はヤマダ電機とかで一番安いものを揃えた。結婚してから高くていいものに買い換えたが、どれもそんなに値段ほどの違いは感じなかったので基本的に安いものでいい気がする。
ただし、炊飯器だけはドンキホーテの一番安いやつから2万円台のものに買い換えた。信じられないぐらい米がうまくなって驚いた。
家具も無印を中心にニトリとかで買った。最初のころにホームセンターとかで買ったものはデザイン性などについて我慢していたが、やはり気に入らなかったので徐々に無印良品のものなどに変えていった。
ソファだけはカリモク60というやつがいいなと思ったので買った。今でも流行ってるかどうかしらないけど、来た人はいいねと言ってくれるしヤフオクでも高値で取引されているので安い買い物だったと思う。
あと本棚は木を買ってきて自分で作った。壁にぴったりサイズだからなんとなくおしゃれに見えた(気がする)木はホームセンターでカットしてくれるので工具なども別に要らない。
- 家電はネットで買うのが一番安い。サポートも問題ない。
- 家電はどうせたいした機能は使わないので一番安いのでいい。
- 家電・家具は結婚したらほとんど全部捨てることになることを覚えておく
- アイロンは1万円以下のものとそれ以上のものでは効率に3倍の差が出る(Panasonicの両側がとがってるのがいい)
- その他小物は全部無印良品で買う
- 2万円のソファを買うぐらいなら、6万円のソファを買って4万円で売るのがいい
- ソファが安いとすぐにヘタるので清潔感が損なわれ結婚が遠のく
- ソファは一人掛けより二人掛けにしたほうが結婚が早くなる
お金
どうせ貯金はできないので自動化する。自動積み立てはやっておいて良かったなと思う。ぜんぜんお金のない時期も「いざとなればあの○万円がある」と思うだけで心に余裕がもてた。
- 1万円+(余裕分)とかを自動で積み立てられる契約にしておく(定期ではなく単なる積み立て。)
- これを毎月1万円の貯金はできないが、毎月1万円少ない金額で生活するのはできるの法則という
- ついでにもう1万円をインデックスファンドなどに投資しておく。三菱東京UFJの場合だとこれでコンビニとかの引き出し手数料が無料になったりするし、経済のことも気になるようになる
炊事
これもいかに最初の出だしを面倒だと思わないかということに重点を置く。そういう意味でパスタゆで器、タジン鍋、冷凍のご飯、無洗米は神器といえる。
- 炊飯器は2万円台後半〜のものを買う。本当にまずいので注意。1万円以下のものは炊飯器と考えない
- 米は無洗米でいい。最近のは味もぜんぜん悪くない。手をぬらさずに1分で炊飯開始できるハードルの低さは自炊率UPに大いに貢献してくれる
- パスタゆで器は味はパスタ鍋に比べて20%減だが、自炊頻度が3倍になるので必須
- タジン鍋は基本材料を入れて5分チンするだけで料理ができるので必須(簡単なのと見た目がいいのがポイント)
- シリコン製などは見た目と匂いの点からおススメしない
- トングは混ぜる炒める盛るに大活躍。菜ばし不要になる。
- 重曹があれば焦げをはじめ、だいたいの汚れがとれる
- お米は冷凍すれば長く食べれる。保温しておいても粘り気がでるまで食べれる
[rakuten:profoods:10005813:image]
- オリーブオイルは少しいいものをたくさん使う
- 卵は生のまま20日ぐらいは余裕で食べれる(テレビで卵工場の人が言ってた)
- 味噌汁の作り方を覚えてから自炊の機会が増えた(冷蔵庫で4日ぐらいはOK)
掃除
これも基本方針はいかに簡単に続けるかということ。掃除機は出すのが面倒なので週1とかにして基本的にはクイックルワイパーでやれば1分で80%は終わるのでいいと思う。
洗濯
こればっかりは簡単にする方法を編み出せなかった。今でも面倒に思う。
浴室乾燥機があると雨の日でも干せるのでかなりうれしい。
- 下着とかを干すやつ(ピンチハンガー?)は高かったけど「NKグループ販売 長く長く使える 引っぱリンガー 44ピンチ NSA-37」ってやつが、片方に洗濯物がよっても斜めになりにくく、取り込みもひっぱるだけなので楽。耐久性も抜群らしいのでぼろぼろになりにくい。
- ハンガーは大量に購入し取り込んだらクローゼットに直接入れると楽
- 乾燥機は使ったみたが服の劣化が激しかったのでやめた(高い乾燥機なら違うのかも?)
- 洗濯物は洗い終わった瞬間から雑菌が繁殖し始める。すぐに干せ
- Tシャツとかが生乾きくさくなったら雑菌が原因なので(ゾンビ化と呼んでた)、3分なべで茹でる+ハイターでOK
あと思い出したら適当に追加したい
あたりまえだけどintを連続で宣言すれば連続したところにメモリ確保される
Objective-CをやるにあたりC言語を駆け足で復習中
普段LLしかやらないので、直接メモリを触ってる感じが楽しい。
例題でこういうのがあった
#include <stdio.h> int main(void) { int i1,i2,i3; printf("%p,%p,%p\n", &i1,&i2,&i3); return 0; }
ってやると
toyoshi@ant:~/c$ ./a.out 0x7ffff32ac88c,0x7ffff32ac888,0x7ffff32ac884 toyoshi@ant:~/c$ ./a.out 0x7fffe8ce7b8c,0x7fffe8ce7b88,0x7fffe8ce7b84 toyoshi@ant:~/c$ ./a.out 0x7fff75ed653c,0x7fff75ed6538,0x7fff75ed6534 toyoshi@ant:~/c$ ./a.out 0x7fff52fa6fbc,0x7fff52fa6fb8,0x7fff52fa6fb4 toyoshi@ant:~/c$ ./a.out 0x7fff3c8ad4cc,0x7fff3c8ad4c8,0x7fff3c8ad4c4 toyoshi@ant:~/c$ ./a.out 0x7fffd99efe1c,0x7fffd99efe18,0x7fffd99efe14 toyoshi@ant:~/c$ ./a.out 0x7fff4b4669cc,0x7fff4b4669c8,0x7fff4b4669c4 toyoshi@ant:~/c$ ./a.out 0x7fff364096dc,0x7fff364096d8,0x7fff364096d4 toyoshi@ant:~/c$ ./a.out 0x7fffde10205c,0x7fffde102058,0x7fffde102054 toyoshi@ant:~/c$ ./a.out 0x7fff2fc39e7c,0x7fff2fc39e78,0x7fff2fc39e74
という感じで
なぜ宣言とは逆順にメモリが確保されるのか
なぜi3は必ず下一桁が4から始まるのか
というのが楽しい!だれか教えて
あとi1,i2,i3がキレイに4バイトずつずれるのも楽しい!