田舎の技術者が奮闘中

php ruby node.js javascript などのスクリプト言語とサーバー(Chef、Vagrant)に関して書きます。

phantomjsのスナップショットを日本語化対応する。

今回はさざなみフォントを導入してみます。
文字化けは日本語フォントが入っていないため起こってしまいます。
ですので、ubuntu自体にフォントをインストールします。

フォント設定ツールのインストール

sudo aptitude install fontconfig

現在のインストールされているフォントを確認する。

fc-list

さざなみフォントのインストール

sudo aptitude -y install ttf-sazanami-gothic ttf-sazanami-mincho

再度確認

fc-list
Sazanami Mincho,さざなみ明朝:style=Mincho-Regular,Regular
Sazanami Gothic,さざなみゴシック:style=Gothic-Regular,Regular
......

こんな感じで入っていればOK

ubuntuにphantomjsを入れてみる。

ubuntuにphantomjsを入れてみました。
ただCUIでスナップショットを取ってみようとソレだけです。
macでのローカル環境でも良かったのですが、せっかくですのでWEBAPIっぽいやつを作ってみます。
今回は導入編です。

PhantomJS: Build Instructions

ここに書いていることをやるだけです。
非常に簡単です。
macでしたらhomebrewで一発インストール出来ます。

sudo apt-get install build-essential chrpath git-core libssl-dev libfontconfig1-dev
git clone git://github.com/ariya/phantomjs.git
cd phantomjs
git checkout 1.8
./build.sh

ビルドが長すぎる・・・

あとは、パスを通します。
ホームディレクトリにgit cloneしたので~/phantomjs/binにパスがなりました。
適当に.baschrcとかにパスを追加します。

PATH=~/phantomjs/bin:$PATH
export PATH

あとはちゃんとパスが通っているか確認します。

phantomjs -v
1.8.2

これでOKです。(タブンネ)
あとは日本語化とかの対応をしないと行けないけど、それは後日やってみます。

herokuのxeroundを導入した。すごくハマった・・・

最近herokuにどっぷりです。
昔からmysqlを入れていたので、herokuでmysqlを使いたいと思い「xeround」っていうアドオンを導入してみました。

導入自体は簡単だったのですが、文字化けががが・・・
何やっても直らない、導入自体は以下のURLを参考に
ヵェの部屋♪-BLOG- : herokuのアドオンでmysqlを利用する。もち無料。

で、何が悪いのか全くわからず、色々と挑戦していたらAdapterが「mysql2」ではなく「mysql」になってました。
しかし、それだけで文字化けになるとは・・・しかもなんで、「mysql」なんだよっと思いながら修正をかましてやりました。(元々はmysql2を入れたのですが、うまく動作せずにmysqlにしたら素直に動いたので、「あ、動いているじゃん」と勘違いしてしまいました。)

まず、Gemfileに追記

gem 'mysql2'
gem 'activerecord-mysql-adapter'
# activerecord-mysql-adapterはちょっといるのかわからないけど、入れろよって言われたのでつけてます。

ここからが面倒くさいです。
まず「heroku config」で設定周りの確認をします。

DATABASE_URL:                       mysql://*******************
XEROUND_DATABASE_ADAPTER:           mysql
XEROUND_DATABASE_FAILOVER_ADAPTER:  mysql
XEROUND_DATABASE_FAILOVER_HOST:    **********.db.xeround.com.
XEROUND_DATABASE_FAILOVER_NAME:    **********
XEROUND_DATABASE_FAILOVER_PASSWORD:********
XEROUND_DATABASE_FAILOVER_PORT:     5990
XEROUND_DATABASE_FAILOVER_URL:      mysql://******************
XEROUND_DATABASE_FAILOVER_USERNAME: ***********
XEROUND_DATABASE_HOST:              *************.db.xeround.com.
XEROUND_DATABASE_INTERNAL_ADAPTER:  mysql
XEROUND_DATABASE_INTERNAL_HOST:     ***********
XEROUND_DATABASE_INTERNAL_NAME:     ***********
XEROUND_DATABASE_INTERNAL_PASSWORD: ***********
XEROUND_DATABASE_INTERNAL_PORT:     5990
XEROUND_DATABASE_INTERNAL_URL:      mysql://***********
XEROUND_DATABASE_INTERNAL_USERNAME: ***********
XEROUND_DATABASE_NAME:              ***********
XEROUND_DATABASE_PASSWORD:          ***********
XEROUND_DATABASE_PORT:              5990
XEROUND_DATABASE_URL:               mysql://***********
XEROUND_DATABASE_USERNAME:          ***********

上記のmysqlってなっている奴を全て「mysql2」に書き直します。
(全部やる必要があるかどうかは判りませんが、とりあえずやります。)

DATABASE_URL:                       mysql2://*******************
XEROUND_DATABASE_ADAPTER:           mysql2
XEROUND_DATABASE_FAILOVER_ADAPTER:  mysql2
XEROUND_DATABASE_FAILOVER_HOST:    **********.db.xeround.com.
XEROUND_DATABASE_FAILOVER_NAME:    **********
XEROUND_DATABASE_FAILOVER_PASSWORD:********
XEROUND_DATABASE_FAILOVER_PORT:     5990
XEROUND_DATABASE_FAILOVER_URL:      mysql2://******************
XEROUND_DATABASE_FAILOVER_USERNAME: ***********
XEROUND_DATABASE_HOST:              *************.db.xeround.com.
XEROUND_DATABASE_INTERNAL_ADAPTER:  mysql2
XEROUND_DATABASE_INTERNAL_HOST:     ***********
XEROUND_DATABASE_INTERNAL_NAME:     ***********
XEROUND_DATABASE_INTERNAL_PASSWORD: ***********
XEROUND_DATABASE_INTERNAL_PORT:     5990
XEROUND_DATABASE_INTERNAL_URL:      mysql2://***********
XEROUND_DATABASE_INTERNAL_USERNAME: ***********
XEROUND_DATABASE_NAME:              ***********
XEROUND_DATABASE_PASSWORD:          ***********
XEROUND_DATABASE_PORT:              5990
XEROUND_DATABASE_URL:               mysql2://***********
XEROUND_DATABASE_USERNAME:          ***********

3時間ぐらいハマったよォォォ

参考URL:
mysql - Using Ruby and XEROUND on Heroku - Stack Overflow

webでsqlを整形するツールを作った。

WEBでSQLクエリをインデントするツールで使いやすいやつが無かったので、新しく作ってみました。
SQL indent | WEBでSQL崩し、整形サービス

機能自体はシンプルで、すべてのデータはlocalStorageに保存されます。

f:id:pikonori:20130123175818p:plain

最初の画面

f:id:pikonori:20130123175834p:plain

結果

f:id:pikonori:20130123175839p:plain

設定機能
インデント数と履歴を保存するか指定出来ます。

f:id:pikonori:20130123175851p:plain

履歴機能
設定機能で「履歴を保存する」にしたら、ボタンが表示されます。
リンクをクリックすると、SQLの履歴が表示されます。


簡単な説明ですが以上です。
フィードバック等が有りましたら、ご連絡下さい。

macで文字入力が死ぬほど便利過ぎて泣きそう

はい、タイトル通りの内容です。
文字入力時のショートカットが便利過ぎてブログに書きました。
多分調べれば、出てくると思いますが、自分で発見した時の喜びと言ったら、天にも昇る気持ちです。

ということで、発見したショートカットを公開します。

コマンド 項目 内容
control + f 移動 右へ
control + b 移動 左へ
control + p 移動 上へ
control + n 移動 下へ
control + a 移動 行の先頭へ
control + e 移動 行の最後尾へ
control + v 移動 テキストの最後へ
control + d 編集 右のほうを削除
control + h 編集 左のほうを削除
control + k 編集 一行切り取り(段落は切り取らない)
control + y 編集 control + kした文字をペーストできる
control + o 編集 改行を入れる

他にもありますが、これだけ覚えておけば良い感じです。
実はこれだけではありません・・・
変換中にもショートカットキーが使えます。

コマンド 項目 内容
control + j 変換 ひらがなに変換
control + k 変換 カタカナに変換
control + l 変換 全角英字に変換
control + ; 変換 半角英字に変換

/(^o^)\ナンテコッタイ
もう便利過ぎますね。

cakephpやRailsのMVCデザインパターンに関して

私は開発する際に、cakephpなどのフレームワークを必ずと言っていいほど使用しています。便利だし、クラスなどの役割が明確になるので、誰が触っても似たような感じになります。

フレームワークを使わない場合でも、いつもいつもMVCで開発するべきだと、会社の後輩にも口を酸っぱくしていっているが・・・私の考えているMVCは実はMVC2と呼ばれているものでした。

私の無知さを教えてくたのが、以下の記事である。

PHPerのMVCの一体どこが間違っていたのか - MugeSoの日記

この記事を読んだ時に、理解が出来ませんでした。
何故ModelからViewを参照しているか?CakephpにModelを監視するクラスやメソッドが無いし、そもそもModelクラス自体呼び出す事が出来ません。(例外はあるけど、標準ではない)

全然納得が出来ませんでした。

でも、このままでは間違った認識で、後輩たちに情報を発信してしまうと思い、独自ではあるが調べてみました。

まず、MVCとはデザインパターンの一種で(Wikiではソフトウェアアーキテクチャとなっている)
機能ごとの分離が明確になることによって、それぞれの独立性が確保されます。開発においては分業がしやすくなり、デザインとプログラムの並行作業が容易になります。また機能がわかれているので、テストケースなども書きやすくなります。というところでしょうか・・・他にもあるかもしれませんが。

Model モデルは、システムの中でビジネスロジックを担当する、いわばシステムの本体部分にあたります。
View 表示、入出力といった部分を担当します。
Controller ViewとModelを制御します。自分自身では表示を行ったり、ロジックの実行は行わず、Viewからの入力に応じて、必要なロジックの実行をModelに依頼し、その結果表示をViewに依頼します。

参考:Java Solution FAQ:MVCモデルという言葉をよく聞きますが何のことですか?

ここでも私の認識と違っていました。
Modelとはデータベースのデータを引っ張ってくる所、だけではなくビジネスロジックなども担当する部分です。例えば、データを取得するだけではなく、データの加工や変わらない処理(アプリケーション固有の処理やルールを記述)などは全てModelに書くべきだと思います。
Modelに処理を書くことでControllerの肥大化も防げます。またテストケースなども書きやすくなります。

ここで一番以外だったのが、ViewからModelを参照していいとのこと。
はい、えせMVC使いの私としては驚愕の事実ですね。
でも、実際に参照って何するのか全く分かりません。ここで一番ハマりました。
Observerパターンがそれに当たると思いますが、WEBの特性上毎回HTTPリクエストを経由する必要があり、Observerパターンなんて使えるわけがありません。
ですので、CakephpにしろRailsにしろView→Modelという流れが全くなくなっています。
(webSocketなどで似たような処理をできるかもしれませんが・・・)

参考:MVC と MVC2 について改めて考えてみる - スタジオ・アルカナ技術ブログ

もうこの時点でMVCデザインパターンではないのです。

以下の記事もえせMVCをdisってます。

参考:やはりお前らのMVCは間違っている
参考:Life is beautiful: Ruby on Railsの「えせMVC」の弊害
参考:「えせMVC論争」についてこそこそと一言言っておくか - uehaj's blog

では、何なの?という話ですが、MVCではなく、MVC2という定義をしています。
MVC2とはObserverパターンが欠損したMVCになります。

ですので、これからCakephpRails使いの方が気をつけることは・・・

  1. MVCではなくMVC2が正しいということ。
  2. Modelにはビジネスロジックを書く部分。
  3. Controllerの肥大化を防ぐ(Modelに処理を書く)

といったところでしょうか
cakephprailsMVCとか言ってしまうと小馬鹿にされちゃいますんで、「MVC2だよねぇ」とかで濁しておけばOKだと思います。

その他参考:CakePHPを使ったMVC設計のベストプラクティス - Sooey
その他参考:Web アプリの MVC 設計まとめ - もやし日記