| @技術/プログラミング

昨夜寝る前にダメ元でスクリプト動かして寝たところ、朝起きてTerminalを覗くと

INSTALL COMPLETE

の文字が。

そういうわけでAmazon乞食エイトできるようになりました。

が、XMLRPC経由で投稿できなくなった。これは地味に困る。 :-!

とりあえず以下が僕が使ったシェルスクリプトです。どうしても入んなかったのはいくつかコメントアウトしてあります。DreamHostへのPHPインストールで困っている方、良かったら参考になさってください。

更新

XML-RPC経由で投稿できました。良かった良かった。

Continue reading...

| @技術/プログラミング

1113_DreamHost.png

もうここ1ヶ月以上、休みになる度にインストールスクリプトを動かしてるんだけど、DreamHostにPHPをカスタムインストールできない。

DreamHostには結構新しめのPHPがインストールされてるが、SOAPライブラリがインストールされてない。このためISBN変換プラグインが動かない。RESTで作り直そうかと思ったけどもうまくいかず。

一応プラグインの改修版を配布しているので引き続きメンテしなきゃいけないと思うし、3ヶ月に一回くらいの割合でお小遣いがもらえるので(ありがとうございます!)なんとかSOAPライブラリをインストールしてISBN変換プラグインを動かせるようにしておきたい。

勉強もかねてDreamHost Wikiの Installing PHP5 - DreamHostPHP 5 install script - DreamHost を参考に頑張ってるんだけど、opensslとかimapとかlibxsltとかでつまずいてインストールに失敗する。ユーザーごとにサーバー環境が微妙に異なるため、Wikiに書いてあるシェルスクリプトをそのままコピペしてもうまくいかないっぽい。(Dreamhost custom php 5.3, Imagick install script | fredtranfield.com

この前、職場の開いてるパソコンにCentOSをインストールしてLAN内で使うサーバーをセットアップしたんだけど、そのときの方が遙かに楽だった。PHPをソースからインストールするのがこんなに難しいとはおもわなんだ。

というわけでして、DreamHost、シェルでログインできるし安くて良いとは思うけどご利用は計画的に。というかなんでレンタルサーバーでこんなに苦労しなきゃならんのか。なんかアホらしくなってきた。借りる前によく下調べをしなかった自分がアホなんだけど。

| @技術/プログラミング

CakePHP、ちょこっと使ってみるだけのつもりだったんだけど、結構深くつきあってしまった。三つほどCakePHPでサイトつくりました。一つは社内用のウェブアプリケーションで、一つはまだ正式リリース前のものだけど、最後の一個はページビュー5000/日くらいあるサイトで実際に動いてます。ついこの前まで無職だったのに。スゲー。

PHPで素人がつくったサイトは危ないみたいな記事がこの前(というか定期的に)はてブでホッテントリに入ってた(る)けど、セキュリティのこととか分からない初心者こそCakePHPとかでサイトつくった方が楽だし安全だと思った。難しいことはフレームワークがやってくれるので。Bakeすればものの数分でウェブアプリケーションが出来てしまう。もちろんどんなフレームワークにも脆弱性がないわけじゃないだろうから100%安心というわけじゃないけど、少なくとも素人が自分でなんかやるよりも安全だと感じる。

とはいえ、フレームワークで万事オッケーなわけでもなかったりする。ちょこちょこっとカスタマイズするみたいのがフレームワークは難しい。特にCakePHPは規約がすごく重視されるから、データベースへのクエリでちょっと変わったことしようとすると結構難しくなる。というかはまる。サイト内検索をつくろうとして結構苦労した。土台が出来上がるまでは速いんだけど、そこからブラッシュアップさせていくときに結構停滞してしまう。それでも自分で一からつくるよりはかなり迅速に作れるんだけど、規約に縛られるのが窮屈に感じることもないではないですね。

で、タイトルの件なんだけど、真面目にエロサイトを作ってみた【プログラマ編】|ASTRODEO という記事がおもしろかった。はてブで1200以上ブックマークされますが1ゲットは僕です。すごいでしょ。いや僕は全然すごくないですね。書いてある内容がすごい。

確かにエロとかスクレイピングとかまぁきわどい内容ではありますが、僕はCakePHPでこんだけのことをやったということに素直に驚いた。

例えばCakePHPには hasAndBelongsToMany というのがある。ブログ記事があったとして、これが一つのカテゴリーを持つ場合は、 Post テーブルと Category テーブルを結びつけてやるだけでOKなんだけど( Post は一つの Category に所属し、 Category は複数の Post を持つ)、 Tag のような複数持てるし複数に所属する概念のモデルが存在する場合、 hasAndBelongsToMany じゃないとデータの整合性というか組み合わせをきちんと保つことが出来ない。

で、自分はこういうのの組み合わせは手が空いてる人に頼んで人力でやってもらったんだけど、このエロサイトの場合は、動画と動画の関連性の判定をプログラムにやらせてる。150件そこそこのデータの整合性を保つのも大変なのに、10000件とかそれ以上のデータを、しかも自動処理で関連づけるってまじすげーと思った次第です。

エロコンテンツなのに年齢確認がないとか著作権がらみの問題とかスクレイピングでよそのサイトに負荷かけるとかいろいろあるけど、僕は率直にこういうサイトをつくったのはスゲーなと思いました。こんなことまで出来るんだー、っていう素直な驚き。読んでて楽しかったしわくわくした。

今後もCakePHPを使い続ける分からんけど、自分もなんかおもしろいもんつくってみたいなーってすごく触発されました。

蛇足

はてブのコメント欄に「技術的には大したことない」みたいなコメント書いてる人が何人かいるけど、ほんとに大したことないんですかね。データベースを保存用と参照用で分けたり、スクレイピングしてきたデータの保存処理とか結構難しいと思うんだけど。これをすごいって感じるのはピヨピヨプログラマーだけなのかな?

| @技術/プログラミング

結局CakePHPを触ってます。Railsはサーバー側の準備するのが無理っぽかったのであきらめました。CakePHPはPHP 4だろうがPHP 5だろうが、普通にサーバーにPHPがインストールされていれば、とりあえずファイルを落としてきて自分の開発機でBake(あるいは開発)し、ちょこちょこ設定をしてサーバーにアップロードするだけで(DBの準備とかは別に必要だけど)CMSが出来上がるのですごく良いと思いました。MySQLでもSQLiteでもPostgreSQLでも、DBに何を使おうとも記述内容は変わらないところとかすごく良いと思います。

オブジェクト指向の醍醐味みたいのはアホなので僕にはあまり分かりません。CakePHPを始める前に『たのしいRuby』を途中まで読んでたんですけど、僕はそれまでPHPとC言語をほんの少しだけ触っていて、そのとき感じた「なんかこれまで触ってきた言語と全然発想が違うなー」という驚きのようなものは感じられなかったです。ただCakePHPのMVCの考え方はRailsそのまんまみたいなのでRailsを勉強する足がかりにはなるかなと思いました。

最初はCakePHPの公式ガイドみたいのをチラ読みしてたんですけど、こういうのは本で持ってた方が使いやすいので『CakePHP1.2ガイドブック』を買いました。まだChapter 7までしか読んでないんだけど、誤植や記述の間違いが多くて困る。わりと最初の、「とりあえずBakeしてみよう」みたいなところで間違いがあるので、根気強くない人は本に書いてあるとおりにBakeできないことに絶望してCakePHP使わなくなるんじゃないかな。僕は公式フォーラムを読んだので間違いに気づきましたけど。“CakePHP1.2でモデルのアソシエーションの設定がビューに反映されない” フォーラム - CakePHP Users in Japan

CakePHP1.2ガイドブック、悪い本じゃないと思うんだけど、1.3対応版とかでは単純な誤植とか記述場所の間違いとかで読者を混乱させないようにして欲しいです。

| @技術/プログラミング

静的サイトをCMSを導入して動的にする、という仕事を担当することになり、Ruby on RailsかCakePHPを使ってみようかな、と思っています。

現在の状況

僕は仕事を探し始めたときからウェブデザイナーっぽいのになりたいなー、と思っていました。でも実際仕事をしてみると、デザインというのはなかなかむずかしい。ネットが好きな素人においそれとできるものではありません。どうも僕はデザインより、コーディングの方が良いみたい。それもただHTML書くんじゃなくて、JavaScriptでサイトに動きをつけたり、PHPでちょっとしたプログラミングをする方が向いてるような気がする。もちろん20代後半でプログラミング始めたところで先は見えてるんですけど、経済学で言うところの比較優位が僕の場合はプログラミングにあるのではないか、と感じるのです。少なくともいま働いてるところでは僕はデザインやるよりプログラミングやってた方が生産性の向上に寄与できそうな感じ。

しかしながら僕が働いてるところは一日コードばっかり書いていられるようなところではないので、業務でプログラミングできる時間は一日1, 2時間くらいしかありません。それで高速に開発ができるという触れ込みのRuby on RailsとCakePHPに注目しました。

現時点での理解

Ruby on Railsはオブジェクト指向のフレームワークで、とにかく短時間で、初心者でも大規模なサイトをつくることができる、ということは分かりました。Model View Controllerとかもおぼろげながらに理解したつもり。HTMLとCSSでコンテンツと見栄えを分離させるみたいな感じのことをプログラミング言語でやろうとしているのがRailsだ、みたいなイメージをもってます。そしてそのRailsに大きな影響を受けて開発されたPHP版のオブジェクト指向フレームワークがCakePHPであるということも分かりました。

当初はRailsを身につけようと思っていたものの、PHPがある程度分かるためにCakePHPの方が素早く学べるかなー、という気もするし、CakePHPはルート権限のないサーバーでもファイルをFTPでアップロードするだけで使える、というのがなんだか良さそうです。

その一方で、PHPはすごくネットでたたかれるし、多くの人がたたくのはそれなりに理由があるはずで、PHPだけやってるとPHPのネガティブな側面がわかりにくい。だからできれば一度ほかの言語を本腰を入れて勉強してPHPを客観視してみたいとも思うのです。

これから先どういう風に飯食っていくか

コーダーとして生きていくのか、プログラマーになるのか、あるいはディレクターを目指すのかで、何をすべきか決まっていく気がします。HTMLコーディングの片手間でちょこちょこサーバーサイドのプログラミングをするんだったらPHPだけで十分な気がするし、本気でプログラマーを目指すんだったらRubyとかPerlにも手を伸ばした方がよさそう。ディレクターを目指すんだったらプログラミングはほどほどに、ディレクションを勉強すべきでしょうね。

病気とかいろいろあったとはいえ、20代半ばの人間としての方向性が固まる時期を無為に過ごしていたことが悔やまれます。RailsかCakeか、悩ましいなー。

| @技術/プログラミング

一個前のやつ、セルフ添削してみました。

if (imgWidth > imgHeight) のところで True でも False でも同じ処理になってて無意味だったし、i を初期化してなかったし全然ダメダメですね。userAgent っていう変数名も navigator のプロパティと同じだしダメ。以下のようにしてみました。

    // fit image for iPhone
    function imgReduction() {
        var i, uA, imgHeight, imgWidth, imgRatio;
        var newWidth = 440;
        uA = navigator.userAgent;
        if (uA.match(/iPhone/)) {
            for (i = 0; i < document.images.length; i++) {
                imgHeight = document.images[i].height;
                imgWidth = document.images[i].width;
                imgRatio = imgHeight / imgWidth;
                if (imgWidth > newWidth) {
                    document.images[i].width = newWidth;
                    document.images[i].height = newWidth * imgRatio;
                }
            }
        }
    }

これを <body onload="imgReduction();"> でロードします。

さてどうでしょう?

| @技術/プログラミング

Google Readerみたく、iPhoneでアクセスしたときにJavaScriptで画像を縮小表示させるようにしてみた。当然ながら自サーバーにあるものだけでなく、Flickrとかの画像も縮小表示する。そしてこれまた当然ながら画像をリサイズするわけじゃなくてあくまで小さく表示させるだけなので、ページの読み込み速度とかは短くなったりしない。

    // fit image for iPhone
    function iPhone() {
        var userAgent, imgHeight, imgWidth, imgRatio;
        var newWidth = 440;
        userAgent = navigator.userAgent;
        if (userAgent.match(/iPhone/)) {
            for (i = 0; i < document.images.length; i++) {
                imgHeight = document.images[i].height;
                imgWidth = document.images[i].width;
                imgRatio = imgHeight / imgWidth;
                if (imgWidth > newWidth) {
                    if (imgWidth > imgHeight) {
                        document.images[i].width = newWidth;
                        document.images[i].height = newWidth * imgRatio;
                    } else {
                        document.images[i].width = newWidth;
                        document.images[i].height = newWidth * imgRatio;
                    }
                }
            }
        }
    }

関数名がアホっぽいのはご愛敬。

職場のサーバーは自分でセッティングしないと何もモジュール入ってないのでクライアントサイドで遊べるJavaScriptを気合い入れて勉強しようかな。