twitter bootstrapの吹き出し

参考:http://getbootstrap.com/2.3.2/javascript.html#popovers

静的に吹き出しを使いたい場合は、下記のような感じでやります。

経費の分け方

交際接待費とか色々ありますので、確認します。今日中にまとめないといけないので。

・旅費交通費ー事業に伴う旅費や交通費。
・接待交際費ー取引先との接待費、贈り物の費用。
・荷造運賃ー商品などを発送する時にかかる費用。
・水道光熱費
・通信費
・広告宣伝費
・修繕費
・消耗品費
・地代家賃
・新聞図書費
・雑費

こんな感じ?

旅費交通費(出張・タクシー・電車)や、接待交際費(飲み食い)、水道光熱費(水道、電機、ガス)、通信費(携帯、ネット)、消耗品費(文房具、コピー機、カメラ)、地代家賃(家)、新聞図書費(本・雑誌)といった感じだろうか。簡単だな。
月と費目で分けて出すようにということなので、そうしよう。

カメラ – 露出・絞り・シャッタースピード

カメラにはisoとかFとかがあります。isoというのは露出のことらしい。isoが高いと明るくなって低いと暗くなります。
Fはしぼりで、この数値をあげるとしぼられて光が入ってこなくなる。
あとしぼると焦点があたるところが深くなるので、ぼけにくくなります。しぼりを浅くすると焦点が当たっているところ以外はぼけやすくなります。
望遠レンズを使うとよりボケ効果が得られます。
また、シャッタースピードというのもあります。シャッタースピードをあげるとぶれずに撮れますが、遅い方が光が沢山はいってきます。
なので、isoを低くして、絞りを高くして、シャッタースピードを遅くすると、真っ暗の写真になります。

大体あってるけどちょっと間違ってるかも。

cakePHP2.3 Jsonレスポンス

shops/hoge.jsonをpostで呼出して、結果をjsonで貰おうとするようなことは結構やってるんだけど、忘れてたのでメモ。

(1)ルーターphpに、Router::parseExtensions(‘json’);を追記する。これによって、json拡張子に対応するようになる。
(2)shopsコントローラーのコンポーネントにRequestHandlerをセットする。
(3)しっかりアクションにjson拡張子をつけて呼出す
(4)shops/hogeアクションで普通に処理した後、下記のようにやる。

これで、json形式にしたものを返してくれる。

git

subversionのような省略ワードはエイリアス設定すれば自分でつくれるようだ。

エイリアス設定
git config –global alias.st status
※–globalは個別リポジトリに限定しない全体的な設定
※configの場所は、.git/configにある。テキストファイル。

リポジトリつくる
git init

リポジトリにファイルを追加する
※addしてもaddしたときの内容がインデックスに反映されるだけらしい。
※add後に修正したらもう一回addしないといけない。
git add file

状態みる
git status

作業者の設定
git config –global user.name ‘名前’
git config –global user.email ‘Eメール’

コミット
git commit -m ‘コメント’ –author=’doraemon
※addもあわせて行う場合は、git commit -aとやる。こうすると作業ディレクトリの内容をインデックスに反映してからコミットするらしい。Untrakingファイルは-aとやっても勝ってに追加はされない。

エディターを設定する
export GIT_EDITOR=vim ※bashの場合

コミットログをみる
git log

コミットをみる
git show コミットID ※IDなしの場合は最新を表示

コミットの差分をみる
git diff コミットID コミットID

ファイルの削除
git rm ファイル名 ※システムからファイルが消える

ファイル名変更
git mv ファイル名 ファイル名 ※システムのフィアル名も変わる

リポジトリのコピーをつくる
git clone パス パス

コミットのグラフを表示する
gitk
※なんとWishとかいうGUIな画面が表示された。

二分探索で悪いコミットを探す
git bisect

ファイルの各行の最後にコミットした人とコミットIDを得る
git blame ファイル

ブランチをつくる
git branch ブランチ名 ベースのコミット
※ベースのコミットIDがない場合は、カレントブランチの最新コミットを使う
※コミットの代わりにブランチ名でもよい

ブランチの一覧を表示する
git branch

ブランチの詳細表示
git show-branch

ブランチを切り替える
git checkout ブランチ
※インデックスにコミット前の変更がある状態で、ブランチを切り替えても競合しなければエラーなく切り替わり、インデックスの変更内容は引き継がれる。

ブランチをつくって、その場で切り替える
git checkout -b ブランチ名 ベースのコミット

ブランチを削除する
git branch -d ブランチ名
※カレントブランチは削除できない
※カレントブランチにマージしていないブランチを削除はできない(削除するには-dではなく-Dにする)

マージする
git merge ブランチ名

競合を調査する1
git diff
※競合している箇所を表示する

競合を調査する2
git log –merge -left-right -p

mergeのリセット
git reset –hard HEAD ※mergeのコミット前に実施

bareリポジトリをクローンする
git clone –bare hoge hoge.git

originリモートを追加する
git remote add origin 場所

リモートを削除する
git remote rm リモート

pushする
git push origin

pullする
git pull

アップデートする
git remote update

おまけ(よさげなエイリアスを考えてみる)
status -> st
commit -> ci
commit -a -> ca
diff -> df
branch -> br
merge -> mg
checkout ->chk
とかかなー?

cakePHP2.3 TwitterKit Plugin

https://github.com/elstc/twitter_kit/tree/2.0

database.phpにコンシューマキーなどの設定を書く

twitter_usersテーブルを作成する

コントローラの$componentsに、’TwitterKit.Twitter’を追加する

コントローラーにログイン、ログアウトメソッドをつくる

コントローラーでJsヘルパーと、Twitterヘルパーを読み込む

ビュー(users/login.ctp)をつくる

cakePHP2.3 Schema

参考:CakePHP2.0のコンソールを使ってラクラク自動生成しよう【1/2】

データベースの状態をschemaに保存したり、schemaの内容をもとにテーブルをつくったりできる。

コンソールでapp/Console/cake schemaとやって使う。

schema generate

現在のデータベースの状態をapp/Config/Schema/schema.phpに作成する。
schema.phpが既に存在する場合は、overwirteかsnapshotかやめるかを聞かれる。snapshotはschema_1.phpといった感じで、上書きせずに新規作成する。データベースをいじったら作っておくと便利かもしれん。
–modelとか-mでモデルも指定できる。-m Userとかやると、Userモデルのテーブルだけつくられる。

schema create

schema.phpを基に、データベースにテーブルを作成する。作成するテーブルを選んだりすることはできないようだ。
オプションは下記のようになっているので、もとになるschemaファイルの場所とか名前とかスナップショットナンバーとかを指定できるようだ。

schema dump

schemaファイルをもとにsqlを作成する。
schema dump –write schema.sqlといった感じで使う。–writeオプションがないと、そのままコンソールにsqlが表示される。
上記オプションと似ていて、もとにするschemaファイルを指定できる。

cakePHP Routing

http://book.cakephp.org/2.0/en/development/routing.html

下記のような感じでルーティングができる。:hogeとやると、名前がつけられる。第一引数にURLのパターン、第二引数にアクション先を指定する。第二引数は、controller、action以外に、パラメタも指定できる。第三引数は$this->request->params[‘pass’]を設定できるし、それに:hogeとかでつけた名前も使えるし、その:hogeの条件も正規表現で指定できる。といったなんとなくの理解しかできていないが、便利である。

これは、http://hoge.com/tokyoとか、http://hoge.com/tokyo/とかにアクセスすると、baseコントローラのarea_topアクションに、passとしてtokyoをもってアクセスする。

これは、http://hoge.com/s/tokyo/shop97とかにアクセスすると、shopsコントローラの、viewアクションに、$this->request->params[‘mode’] = ‘s’と、$this->request->params[‘pass’][0] = ’97’をもってアクセスする。

pagineteを使うときに、次のページとかがrouting設定を維持しない場合は、下記のような感じでオプションに設定する。

ちなみに、上記URLの/s/というのはスマホ用URLにつくやつでありまして、スマホ対応をcakePHPだけで対応するつもりで下記をつくってみた。
user_agentチェックはテストしてないし、いい感じかまだ分からない。サイトで調べてcakePHPにしてみた。

cakePHP Androidでセッションが使えない

Androidでセッションがつかえないよー。しくしく。

Cookieはつかえるよー。

http://cakephp.jp/modules/newbb/viewtopic.php?topic_id=2370&forum=3に書いてある、
Configure::write(‘Security.level’, ‘low’);をcore.phpに追加してみたけど解決できない。cakePHPバージョン1だとこれによって色々な設定が自動で変わったらしいが、2系だとあんまり変わらないらしい。と本に書いてあった。

core.phpにセッションクッキー名を登録したらとりあえずできた。

cakePHP こわいRecursive

http://book.cakephp.org/2.0/ja/models/model-attributes.html

recursiveは恐ろしい。怖い人はAppModelに、public $recursive = -1;と書いておけばデフォルトで-1になるようだ。
これをしない場合、デフォルト値は1になる。

  • recursive -1 は、JOINしない。自分だけとってくる。
  • recursive 0 は、自分と自分がbelongsToしているモデルだけとってくる。
  • recursive 1 は、自分とbelongsToとHasManyをとってくる。
  • recursive 2 は、自分とbelongsToとHasManyと、BelongsToとHasMany先が関連しているモデルを一階層分とってくる。

みたいな感じになっているようだ。0は自分だけという意味ではないってことである。それにしても0と1と2はいまいち明確な違いが分からない。

ブログみたいなシステムを考えて、UserがPostを投稿し、PostにCommentがつき、PostにはTagも設定できるようにしてみる。この場合、UserはPostをHasManyしていて、PostはUserにbelongsToしている。PostはCommentをHasManyしていて、CommentはPostにbelongsToしている。また、CommentはUserにもbelongsToしている。また、PostとTagはHABTMになっている(PostはPostsTagをHasManyしている)。

Postをrecursive0でfindすると、PostとUserが得られる。Commentは得られない。なのでやはりbelongsToは得られるが、HasManyは得られないのだ。

Postをrecursive1でfindすると、PostとUserとCommentとTagが得られる。Tagの中にPostsTagが入っている。こういうことを自動的にやってくれているらしい。確かに1の場合はHasManyもとってくるのだ。ただし、HABTMの場合は、中間テーブルを取ってくるのではなく気を利かせてHABTM先のモデルを取ってきてくれるらしい。

recursive2でfindすると、Userの中にPostが入っている。Commentの中にはUserとPostが入っている。なので下手にrecursiveをあげるとすごいことになる。

recursive -1 , 0 までは1クエリで、recursive1で、3クエリ。でもrecursive2で、32クエリ。3で、113クエリ。4で、309クエリ。5で865クエリ。6で2228クエリ。recursive2以上を使う場合は、bindModel()とunbindModel()を使って都度アソシエーションを限定的にする必要がある。

http://d.hatena.ne.jp/takuya15/20071219/1198035692 これは、都度動的にアソシエーションを設定することを簡単にする方法が書いてある。これは結構いいかもと思った。

こうやって動的にunbindModelを使うと、Commentした人の名前だけ4クエリで取得できるからrecursive2以上を使うときはこういうことをしないといけない。

全部モデルにアソシエーションは書いておいて、AppModelでrecursiveのデフォルト値を-1に設定しておいて、基本recursiveを使わないようにしつつ、どうしても必要なときだけ、unbindModelを使うっていう感じでいいかのう。

と思ったらなんかおかしい。commentの件数分、個別にUserをクエリで取得しているようだ。なんだこれは。100件コメントがあったら100クエリするつもりのようだ。CommentにUserをJoinすればいいだけの気がするが。

http://d.hatena.ne.jp/hetima/20070225/1172409266にも同じようなことが書いてある。でもこれは、そもそもrecursive0でよかったのに2にしていただけともいえると思った。
それにしてもやっぱりこわい。HasManyされているやつが、何かにbelongsToしていて、その何かがrecursive2以上に該当する場合は注意が必要だということであります。

まあ要するに効率的にやろうとすると、cakePHPも都度色々コードをしっかり書かないといけないってことかのう。

MySQLのインデックス

参考:
MySQLパフォーマンスチューニングのためのインデックスの基礎知識
大きめのテーブルにカラムやインデックスを追加する際の注意

インデックスの追加
ALTER TABLE phone_book ADD INDEX (last_name)

部分的インデックスの追加
ALTER TABLE phone_book ADD INDEX (last_name(4))

復号インデックス
ALTER TABLE phone_book ADD INDEX (last_name, first_name)

HTML5 File API デスクトップからブラウザにファイルをドロップしてアップロード

デスクトップからブラウザにファイルをドロップできるようにしたい。

参考
Reading files in JavaScript using the File APIs
Drag and DropとFile APIを試す
はまちーのにっき。

File APIと、FormDataというのを使った。ちょっとごちゃごちゃしてるけど、dorpクラスにdorpされたファイルを、順番にupload関数に渡してアップロードしている。cakePHPで受け取ってFileBinderで保存しましたが、FormData使ってファイルを渡すと、$this->request->params[‘form’]に入っていた。dropされたらウインドウの下のに、ボックスが現れて、アップロード中のファイル名が表示されて、アップロード成功したら青くなって、失敗したら赤くなって、完了したらフェードアウトしてる様。$.Deferred()は、終わるまで次の処理を待たせたりできるやつらしいので、使ってみた。全てをしっかり理解していないので、効率的じゃなさそうだけど、とりあえずこれで出来た。