aswww log

エンジニアの技術録。アプリとかウェブとか

Twitter Bootstrapのデザインカスタマイズお役立ちサイト

CSSフレームワークTwitter Bootstrapについて。
 Twitter Bootstrap(以下、Bootstrap)はあらかじめナビヘッダーやボタンなど多くのパーツがCSSで定義されているので、その定義されたclassを指定してあげるだけでフラットなデザインができたりする優れものだったりする。配色などは公式ダウンロードページでカスタマイズできるものの、トータルデザインを考慮しつつ配色カスタマイズを考えるはなかなか難しい。
 そこで、Bootstrapのカスタマイズに役立つ無料の便利サイトをいくつか紹介してみる。


○画像イメージから拡張テンプレートを自動生成してくれるサイト
 WEBに公開されている画像を参考に、イメージにあった配色のBootstrapカスタマイズテンプレートを提供してくれるのが以下のサイト。画像にサイトロゴなんかを設定して[Go Lavish]ボタンを押せばサイトロゴのデザインにあったテンプレートが出力される。完成品も修正できるので、完成度高い。今やっている案件ではこのテンプレートを採用している。

   Lavish, Bootstrap like a King


○カラーテーマ集
 そのまま様々なカラーのテーマテンプレートを無料で提供しているサイト。配色がキレイなものばかり。

   カラーテーマ一覧


○ボタンの色拡張CSS自動生成サイト
 テンプレートではないのだけど、Bootstrapのボタンの色を細かくグラフィカルに指定した拡張用CSSを出力してくれるサイト。ただし、色によってはhovar時の色が合わなくて自分で調整しないといけない自体になるところが難点。

   Beautiful Buttons for Twitter Bootstrappers



以上。これらのツール使った上でどうしても納得いかないところだけカスケードしたりして、いいかんじに仕上げてください。
参考:http://getbootstrap.com/css/

Autoloader::add_classesに追記するとoilでエラーになる件

FuelPHPの話。simpleauthを拡張した直後にoil実行したらerrorになった。

~/modules/admin$ php oil g controller history index

Fatal error: Class 'Error' not found in /home/account/modules/admin/fuel/core/bootstrap.php on line 79
Fatal error: Class 'Config' not found in /home/account/modules/admin/fuel/core/bootstrap.php on line 47

'Error'が無いといわれたのでrequire_onceでFuel\Core\Errorを読み込んでみたり、core内を色々(一時的に)書きこんでみたけどわからん。
そして最終的に以下のsimpleauthを拡張したtipsterauthに関する記述が原因だと気づいた

Autoloader::add_classes(array(
      'Auth\\Auth_Login_Tipsterauth' => BASEPATH.'packages/auth/classes/auth/login/tipsterauth.php',
      'Auth\\Auth_Acl_Tipsteracl' => BASEPATH.'packages/auth/classes/auth/acl/tipsteracl.php',
      'Auth\\Auth_Group_Tipstergroup' => BASEPATH.'packages/auth/classes/auth/group/tipstergroup.php',
));

#ちなみに BASEPATH=~/modules/admin/fuel/base
#このBASEPATH配下に実在するモジュールをAutLoaderに書きこんでいた。

ここで、Autoloaderに書き込むのはAPPPATH.以下でないと読み込めないのかと考え、以下のとおり記述を修正し、モジュールも配置し直した。

'Auth\\Auth_Login_Tipsterauth' => APPPATH.'classes/base/packages/auth/classes/auth/login/tipsterauth.php',
'Auth\\Auth_Acl_Tipsteracl' => APPPATH.'classes/base/packages/auth/classes/auth/acl/tipsteracl.php',
'Auth\\Auth_Group_Tipstergroup' => APPPATH.'classes/base/packages/auth/classes/auth/group/tipstergroup.php',

結果、エラーは解消された。
このことから、やはりエラーの原因はAPPPATH配下に置かなかったことだと考えた。しかし、この話を知人のSEにしたらAPPPATH配下でなくてもいけるとのことらしい。もしかしらたこれは邪道な解決方法なのか?取り急ぎはエラーが出なくなったからいいけど、時間ある時に別のやり方を検証してみようかと思う。

参考:
Class not found fuelphp oil http://stackoverflow.com/questions/16865795/class-not-found-fuelphp-oil
[FuelPHP]独自オリジナル認証ドライバをsimpleauthを参考に実装する1 http://to-developer.com/blog/?p=155

負のスパイラル突入中

更新頻度が低くて管理人不在に思われちゃうとアレなので現状報告を。

ここ一ヶ月作り→手戻り→作り→追加要件による手戻り→作りみたな感じで、かなり生産性無い具合に忙しい感じです。
こういう時だからこそ書きたいネタが沢山なのですが、更新する時間も惜しんじゃう現状。
技術ネタはそこまで鮮度重視じゃないのでとりあえず下書き保存して後々公開することにしましょう。

直近の課題としてモチベーション管理です。会社勤めの時は残業のだらけでも残業代が出るっていうかなり大きいモチベーションアップ要素があったのですが、フリーの場合だと時間かけるだけ自分が損なのでそれは使えませんね。

うーん、、、難しいですね。。。

oilによるViewとController生成

FuelPHPのoilコマンドでController・Viewの枠組みがだけ生成する方法。

php oil g controller Controller名 [メソッド名1] [メソッド名2]...

これをするとControllerとそのメソッドに紐づくviewファイルを生成してくれる。
例えばこんな感じ。

php oil g controller login index
	Creating view: /[APPPATH]/views/login/index.php
	Creating controller: /[APPPATH]/classes/controller/login.php

地味にめんどくさいクラス追加作業が一行で終わっちゃう。
不精さんにオススメ。

ちなみに他にViewModelとかも一緒に生成してくれるコマンドもあるけど、今回はModel・View・Controllerしか使わない予定なのでこれで十分なり。

phpでhtmlをparseする方法まとめ

スクレイピングバッチにかかせないのがhtmlのparse。いくつか方法をためしたのでまとめて見る。

1)PDOMDocumentとかを駆使して連想配列化する方法
 取得するHTMLによれば、おそらく最も手間がかからない方法。 手順は以下のとおり。

・file_get_contents()でHTML取得
・DOMDocumentのloadHTML()を使用してHTMLをXMLへ整形
・simplexml_load_string()でSimpleXMLElementオブジェクトへ変換
・json_encode()でJSON化。更にjson_decode()してArray化。

ただ、loadHTML()時に一番上にXMLタグが無いだけで怒られるし、file_get_contents()の時点で文字コード変換したのに何か文字化け(?)で怒られたりして使用を断念。

参考:PHPでHTMLをパースして解析する簡単な方法

※ちなみにDOMDoccumentが使えるかどうか調べるためのソースは以下のとおり。

<?php
print_r(get_loaded_extensions());
print_r (get_extension_funcs ("DOM"));

参考
PHPでDOM のモジュールが使えません!

2)Simple HTML DOM Parserを使用する方法
 結構有名なライブラリ。HTML取得からオブジェクト化までをfile_get_html()でやってくれるスグレモノ。導入方法と使い方を以下のとおり。

・zipファイルをダウンロードし、"simple_html_dom.php"のみを任意のディレクトリにコピーする。
phpファイルにてrequire(任意のディレクトリ/simple_html_dom.php)する。
・file_get_html()を使用してHTMLがParseされたオブジェクトを取得する。
 ※simple_html_dom.phpは関数集なので直接関数を呼んでしまって良い。

あとは取得したオブジェクトに$html->find('a')とか$html->find('img', 0)->srcとかして情報を取得する。(jQueryチックな操作感)やや柔軟だが、やはりタグが閉じられてなかったりするとお手上げ。あと重い。でも人気。解説サイトもたくさんある。

参考
PHP Simple HTML DOM Parser Manual(本家?)
PHP Simple HTML DOM Parser
誰でもスクレイピング!DOM要素を引っこ抜くSimple HTML Dom

3)preg系関数で正規表現とかを用いて頑張ってParseする方法
 これが一番めんどくさくいけど一番柔軟で一番確実な方法。1)2)で紹介した方法を用いた場合でも最終的にはこれを併用することになるのではないかな。よっぽど整形されたHTML相手でなければ。やり方はHTMLソースとにらめっこしてほしい情報をpreg_split()やらpreg_replace()を用いて一個一個取得する感じです。

参考
PHP マニュアル


他にも触ってないけどphpQueryというライブラリが気になった。名前のとおりjQueryライクな感じで要素へアクセスできるらしい。時間あるときに試したい。

参考
スクレイピング応用編-phpQuery
スクレイピング用おすすめライブラリ『phpQuery』の基本的な使い方

PHP正規表現でエスケープがうまくいかなったらバックスラッシュを使おう

とあるサイトのスクレイピングバッチを作成している最中、正規表現で思わぬとこでハマったのでメモ。

○事象
文字列"$(initLive);"を空文字に置換(つまり削除)したかった。以下のとおり実装。

preg_replace("#[\$]\(initLive\);#", '', $contents)))));

デリミタは一般に"/"(スラッシュ)がよく使われるけど、今回はテキストHTML相手なのでエスケープもめんどくさいし、"#"(ナンバー記号)を使用。"$"(ダラー)と"("(前括弧)と")"(後括弧)は文字列として判定してほしいので"\"(円マーク)でエスケープする。
しかしこれで実行してもエラーが出てしまった。

どう考えても構文は間違っていない...そこでひとつ気になったことが。以前の仕事でCentOS上で正規表現使った時、"\"(バックスラッシュ)でエスケープしたような。
試しに"\"(円マーク)を"\"(バックスラッシュ)で打ちなおしてみる。

preg_replace("#[\$]\(initLive\);#", '', $contents)))));

見かけ全然変わらないけど、再度実行したらいけました。
外見は同じでも内部では文字コードで判別してるのね。そうだよね、見かけに騙されちゃダメだよね。
でも以前Windowsで実装してた時は\(円マーク)でいけた気がするんだけどな?UbuntuLinux仕様なのか?

レンタルサーバでfuelPHPでoil実行するときの注意点

注意点というか実はとても簡単で当然のことかもしれないけど、私自身簡単なこととか当然のことができなくてドハマリするタイプなので書いときます。ちなみにこの問題で私は3日間費やしました。はぁ。

ちなみにレンタルサーバのスペックは

・PHP5.1〜PHP5.5まで対応
・コマンドラインからのphp実行OK(引数も渡せる)

PHPのバージョンは管理画面で変更する仕様になっているものの、いざコマンドでphp -vしても常にPHP5.1が表示されてしまうため、whereis phpで取得した絶対パスを指定して使用することにしました。

oilと同じディレクトリに移動して以下を実行。

/usr/bin/php5.4 oil r robots

すると以下のエラーが出力された。

The use of oil is not supported when running php-cgi. Oil needs php-cli to function!

このエラーメッセージをそのままググってもわからず。2日間試行錯誤した後、3日目に知り合いのスーパーSEにヘルプを投げかけたところ
phpがcgi版でコンパイルされているから使えない。cli版のphpを使えカス。」
といった具合のありがたいアドバイスをいただいた。
そこで再度whereis phpをしてみると。。。あった!もうひとつ/opt/php5.4/bin/phpってやつがあった!こっちがcli版ってやつか!これで実行してみよう!

/opt/php5.4/bin/php oil r robots

					"KILL ALL HUMANS!"
			          _____     /
			         /_____\
			    ____[\*---*/]____
			   /\ #\ \_____/ /# /\
			  /  \# \_.---._/ #/  \
			 /   /|\  |   |  /|\   \
			/___/ | | |   | | | \___\
			|  |  | | |---| | |  |  |
			|__|  \_| |_#_| |_/  |__|
			//\\  <\ _//^\\_ />  //\\
			\||/  |\//// \\\\/|  \||/
			      |   |   |   |
			      |---|   |---|
			      |---|   |---|
			      |   |   |   |
			      |___|   |___|
			      /   \   /   \
			     |_____| |_____|
			     |HHHHH| |HHHHH|

できた!ありがとうスーパーSE!

レンタルサーバ使うときは想定外のモジュールがインストールされていることがあるってわかったし、気を付けよ!