JavaScript Patterns 2章ではevalの代替としてFunctionコンストラクタを使う方法が紹介されています。Functionコンストラクタは、普通にJavaScriptを書いている分にはなかなか使うことがないので、馴染みがない人も多いだろうと思います。そこで関数式との比較を中心に簡単にまとめておきます。 Functionコンストラクタは、関数オブジェクト(つまりJavaScriptにおける関数)を作るためのコンストラクタです。文字列をJavaScriptコードとして扱えるという点ではevalにも似ていますが、戻り値は普通の関数なので、その他の方法で作った関数と全く同じ使い方ができます。 var funcObj = new Function(’x', ‘y’, ‘console.log(x + y);’); //普通に呼び出す funcObj(1,2); // 3 //コンストラクタとして使ってみる funcObj.prototype.hello = function(){ console.log(’World’); }; (new funcObj(4,5)).hello(); // ‘World’ ちなみにコンストラクタではなく関数として呼び出した場合は、コンストラクタとして呼び出した場合と同じ結果になります(仕様上そう規定されています)。よって以下の2つは同じ意味になります。 var funcObj1 = Function(’x', ‘y’, ‘console.log(x + y);’), funcObj2 = new Function(’x', ‘y’, ‘console.log(x + y);’); この形、関数式にnew演算子を適用した場合と見た目が似ていますが、全く意味が違うということに注意してください。 // 関数式で関数を作る var funcObj = function(){} // [...]
『基礎からのiOS SDK』の感想と、その後のiPhoneアプリ開発学習法
『基礎からのiOS SDK』を読み終わったので、全体を通しての感想と、その後の学習方針についてまとめておきたい。 この本は、私にとってはiPhoneアプリ開発を始めるための”1冊目”として絶妙な本だったが、誰にでもオススメできるわけではない。次のような点を理解しておく必要がある: C言語とオブジェクト指向がある程度わかっている人向けである これは前書きに書いてある通り。C言語やオブジェクト指向についての基礎的な説明は一切ないので、そうした知識がない人は先に他の本を読むべき。一方で、知識がある人にとってはさっさと本題に入ってくれるのでとてもありがたい。Objective-C特有の概念を説明する部分は分かりやすいので、他言語の経験があれば全く無理なく理解できると思う。 ソフトウェア開発というのがどういう行為か分かっている人向けである XcodeやInterface Builderといったツールの使い方については、本文に沿った最低限の操作しか説明されていない。実際にプログラミングをしていく上では、例えばNSLogでコンソールに出力しながら段階的に実装していくとか、必要に応じてブレークポイントを入れてデバッグするとか、気になることがあったらリファレンスを引くとか、そういうお約束をいろいろ知っている必要があるわけだが、その辺りの説明は一切ない。これまた分かっている人にはありがたいが、「今プログラミングの勉強中です」という人にはたぶん辛いと思う。 この本だけで実用的なアプリを作るのは(残念ながら)まず無理 iPhoneアプリを作る上で最も重要なView Controllerについての説明が一切なく、必然的にTable View ControllerやNavigation View Controller等についての説明もないので、「よくある画面」を作る方法が全く分からない。また他の書籍にせよネットにせよ、中級者向け以上の情報は普通View Controllerの使用を前提としているので、そうしたコードを読むこともできない。よってさらに先に進むためには、何とかしてこのギャップを埋める必要がある。 この点、日本語の書籍では『iPhone アプリケーションプログラミング』が比較的詳しかった。『基礎からのiOS SDK』を読み終えた後の2冊目としてちょうど良い内容だと思う。ちょっと日本語がわかりにくいところがあるのが難点だが……。 その後は実際に手を動かしながら、Appleが提供している各種ガイドを読んでいくのを強くオススメする。初学者が「こうしたい」と思う程度のことはたいていやり方が載っている。実際のところ、ネット上にはこのガイドの内容すら踏まえていないような情報が散見されるので、注意が必要である。 View Controller Programming Guide for iOS Table View Programming Guide for iOS The Objective-C Programming Language 総じて『基礎からのiOS SDK』は、他言語での開発経験が十分にある人に向けて、iOS SDKおよびObjective-Cの機能を幅広く、ショーケース的に紹介する本だと感じられた。 最後に7章までの範囲で気になった点をまとめておく。8章以降は今のところ興味がない題材なので、ここまで詳しく読むことはしない。
InnoDBの意外な制約: Got error 139 from storage engine
環境: MySQL 5.0 (追記) 某CMSにて、1つのテーブルにTEXT型のフィールドをたくさん(10前後)作ったところ、次のようなエラーが出てデータを保存できなくなった。 Got error 139 from storage engine このエラーメッセージで検索すればいろいろと情報が出てくるが、こういうことらしい: InnoDBの行サイズの上限はページサイズの約半分で、デフォルトでは約8000バイト 可変長カラム(VARBINARY, VARCHAR, BLOB, TEXT)のデータは行の外部に保存されるが、先頭の768バイトだけは行の内部に保存される よって例えば一つのテーブルに11個のTEXT型フィールドを作り、それぞれに768バイト以上のデータを入れようとすると、768*11=8448 > 8000 なので保存できない ページサイズは8〜64KBまで設定できるが、変更するためにはMySQL本体をコンパイルし直した上でテーブルスペースとログファイルを再作成する必要があるらしく、運用途中での変更は難しい。よってどうしてもInnoDBでなければならない場合は、テーブルを分割するなどして対処するしかない。 件のCMSの場合は特にInnoDBでなくても良かったので、テーブルをMyISAMに変換することで回避できた。 ALTER TABLE TABLE_NAME ENGINE=MyISAM; MyISAMの場合、行サイズの上限は64KBで、かつTEXTやBLOBの保存に要するのは9〜12バイトなので、同じ問題はまず起こらない。最近は特に何も考えずにInnoDBを使っていたので、ヒヤリとさせられた。 参考にしたサイト: 13.2.11.2. File Space Management – MySQL 5.0 Reference Manual 10.5. Data Type Storage Requirements – MySQL 5.0 Reference Manual 限界までMySQLを使い尽くす!! – 漢(オトコ)のコンピュータ道 Nix::WebLab : Got error [...]
『基礎からのiOS SDK』6章・レビュー/正誤情報
『基礎からのiOS SDK』の続き。6章は内容が多岐にわたるためか、ちょっと気になる点…というより間違っている点とかコードのバグとかが多い。本文は前と変わらず分かりやすいだけに、かなり残念。特に後半は厳しい。 正誤表が欲しいところなのだが、今のところ公式サイトには存在しない。そこで私も職業プログラマの端くれとして、勉強も兼ねてできるかぎり正確な情報を調べてみた。かなり長くなったので「続き」からどうぞ。
Google AJAX Feed APIを使って複数のフィードをまとめて表示するjQueryプラグイン
Google AJAX Feed APIを使うとJavaScriptだけでRSS/ATOMフィードを読み込むことができますが、標準の機能では「複数のフィードをまとめて」「日付順に(新しい順に)」表示することができないので、jQueryプラグインを作りました。 jquery.googleMultiFeed.js (github) タイマーを使って逐次処理を行っているので、全フィードの読み込みを待つことなく、読み込まれたものから順に表示されていきます。Google AJAX Feed APIの(というよりJSONPの)制約でフィードを並列的に読み込むことはできないのですが、Google側でキャッシュ&タイムアウト処理が行われているため、多数のフィードを読み込んでもさほどストレスなく表示されるはずです。 jQuery 1.4以上が必要です。jqueryの.jsファイルはscriptタグを使って静的に読み込んでください。どうしても google.load を使う必要がある場合は setOnLoadCallback の中で initGoogleMultiFeed() を呼ぶ必要があります。 <script type="text/javascript" src="http://www.google.com/jsapi?key=API_KEY"></script> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script> <script type="text/javascript" src="jquery.googleMultiFeed.js"></script> <script type="text/javascript"> //google.load(‘jquery’, ’1.4′); google.setOnLoadCallback(function(){ //jqueryをgoole.loadで読み込む場合のみ必要 //initGoogleMultiFeed(); $(‘#feed’).googleMultiFeed({ urls: ['http://example.com/rss', 'http://example.net/feed'], numEntries: 5 }); }); </script> … <div id="feed"></div> urls パラメータは必須で、読み込みたいフィードのURLを配列として指定します。 numEntries パラメータはオプションで、フィード一つあたりの件数です。 上の例を実行すると http://example.com/rss と [...]
CakePHPで特定のコントローラに対するBasic認証をApache側でかけようとしたが無理だった
2010-11-17: 記事のタイトル・内容を修正しました。最終的に、Cakeの特定のコントローラにApache側で認証をかけることは不可能という結論に至りましたので、「なぜ不可能なのか」を説明する内容に差し替えました。コメント欄にて重要な指摘をくださったshin1x1さんに感謝します。 CakePHP 1.2/1.3 CakePHPで特定のコントローラ(URL)に対して、Apacheの機能を使ってBasic認証をかけようとして、実際にその方法を見つけたとして記事を公開したのですが、無理だということに気がつきました。 Cakeは最終的に $_GET['url'] しか見ていないので、一つでも認証無しでアクセス可能なコントローラ/アクションが存在すれば、 /controller/action?url=/protected というパラメータを使うことで任意のURL(上では /protected)に対して認証無しでアクセスできてしまいます。 以下に私が使おうとしていた .htaccess のコードを示しておきます。これは同じようなアイデアを思いついた人に対して、このような方法では無理だということを示すためのものなので、決して使用しないでください。 # Basic認証の設定 AuthType Basic AuthName “Members only” AuthUserFile /path/to/.htpasswd Require valid-user # 認証対象となるURLの指定 SetEnvIf Request_URI “.*” allowed SetEnvIf Request_URI “^/members” !allowed # !INSERTED! /index.php に直接アクセスするのを許可しない SetEnvIf Request_URI “^/index\.php” !allowed # 認証をバイパスさせるための設定 Order Deny,Allow Deny from all Allow from env=allowed Satisfy Any [...]
『基礎からのiOS SDK』5章・レビュー/正誤情報
引続き『基礎からのiOS SDK』を読み進めている。今回は5章まで。メモリ管理→setterの素朴な実装とそれが駄目な理由→正しいsetterの実装→@propertyの利用、という説明の流れは見事で、とても分かりやすかった。 しかしやっぱり気になるところがいろいろあったので、またまとめてみた。 privateなメソッドについて 4章のサンプル同様、5章のサンプルでもprivate扱いのメソッドの宣言はない。これはミスではなく、著者の方針と考えた方が良さそうだ。確かにメソッドの順序にさえ気をつけていれば何も問題はないのだが、個人的には気持ちが悪いのでやはりクラス拡張を使って.mファイルで宣言しておくことにする。 @interface ClockAppDelegate() – (void)updateClock:(NSTimer*)theTimer; – (void)setupTimeAnnounce; – (void)playAnnounce:(NSTimer*)theTimer; @end p.165 日付の表示に和暦を選択できないと書いてあるが、iOS 4.1ではシステム設定の「カレンダー」で「和暦」を選択できる。いつから選択できるようになったのかは分からない。 p.202〜 init と initWithTimeZone Clockクラスの init と initWithTimeZone のコードは悪い例。全く同じ形のコードを2回繰り返している。こういうときは、必要な初期化処理がもれなく実行されることを保証するためにも、 initWithTimeZone を使って init を実装すべき。 – (id)init { return [self initWithTimeZone: [NSTimeZone systemTimeZone]]; } この場合 initWithTimeZone がClockクラスの「指示付き初期化子(Designated Initializer)」ということになる。この辺のガイドラインについてはApple提供『The Objective-C Programming Language』の『Allocating and Initializing Objects』の節に詳しく載っている。 5章のサンプル全体に対して 4章のサンプルと同じく、動かしてみて違和感があった部分について改善案を提案してみる。 p.162 updateClock 時計の表示を更新する updateClock [...]
『基礎からのiOS SDK』レビュー4章まで
『基礎からのiOS SDK』を買ってiPhoneアプリ開発を始めた。 私はObjective-Cによるプログラミングはもとより、IDEによるGUIアプリ開発自体が初めて。数あるiOS関連書籍をざっと立ち読みした限りでは、この本が一番わかりやすそうだった。操作手順を一つ一つ追いながらも、概念的な説明が要所要所で入っていて、常に頭の中がクリアな状態で読み進められる。さすが帯でバイブルと謳っているだけのことはある。もちろんObjective-C言語の本当に細かい話までは入っていないのだが、そこはAppleが無償で公開しているドキュメントを併読すればいいだろう。 とりあえず4章まで読み終えたので、その中で気になった点をまとめてみた。 p.118〜 アプリケーション起動直後の処理を行うメソッドとして applicationDidFinishLaunching: を使うとあるが、リファレンスによればiOS 3.0以降は application:didFinishLaunchingWithOptions: を使うことが推奨されている。テンプレートを使ってプロジェクトを開始したときに自動的に作成されるのもこちらなので、混乱しないように注意が必要。 p.127 UIViewを透明にするための手順として『[View > Opaque]のチェックを外すことで背景を透明にすることができます』とあるが、それだけでは不十分。[Background] で [Clear Color] を選ばないと透明にはならない。デフォルトでは [White] が選択されているので、白く表示されてしまうはず。 p.131〜 updateWebBrowser メソッドのメソッド宣言(プロトタイプ宣言)が書かれていない。ダウンロードできるサンプルコードにも書かれてないので、本文で説明を省いたわけではなく、書き忘れたのだろうか。 Objective-Cでメソッド宣言を書かなかった場合、C言語同様、ファイル内で後ろに位置するメソッドを参照するとコンパイル時に問題になる。updateWebBrowser メソッドを webViewDidStartLoad: の後に書いたりすると、次のような警告が出るはずである: warning: ‘WebAppDelegate’ may not respond to ‘-updateWebBrowser’ 単に .h ファイル内の @interface ブロックに宣言を追加しても良いのだが、 updateWebBrowser メソッドような”プライベートな”メソッドについては、クラス拡張を使って .m ファイル内で宣言するのが行儀良いらしい。 #import "WebAppDelegate.h" @interface WebAppDelegate() – (void) updateWebBrowser; @end [...]
Topsyのotter APIを使ってtwitter検索
Topsyが提供しているOtter APIを使ってTwitter検索。 特定のURLに対するツイート一覧を得る 特定のURLに対するツイートは trackbacks というリソースで取得できる。 例: http://wp.serpere.info/に対するツイートを10件までテキストフォーマットで得る パラメータはtrackbackリソース固有のものと、共通のリスト用のものが使用できる。orderパラメータでレスポンスの順序を指定できるとあるのだが、現時点(2010-11-01)では正しく機能せず、何を指定しても常に新しい順で返ってくるようだ。 レスポンスの形式は拡張子で指定できる。デバッグ時はテキスト形式(.txt)が便利。実際にプログラムから使用する場合はJSON形式(.json)またはJSONP(.js)を使う。JSONの構造については今のところ実際に動かしてみて確認するしかない。 例: http://wp.serpere.info/に対する最新のツイート10件をjQueryによるJSONPで取得・表示する otter API trackback resource – jsdo.it – share JavaScript, HTML5 and CSS サイト全体に対するツイート一覧を得る サイト全体(特定のドメイン以下のページ)に対するツイートは search リソースで site: クエリを使うことで得られる。 例: このサイト全体に対する言及ツイートを、過去1ヶ月分10件まで取得 使用できるパラメータはsearchリソースに対するものと共通のリスト用オプション。windowオプションでは対象となるツイートの期間を指定する。d10で10日、w2で2週間、aで全期間など。 このsearchリソースの仕様には色々と謎が多い。 新しい順にソートして取得するためのsearchdateリソースを使った場合と、取得できる内容が大きく異なる。searchdateの方が反映が遅い? 効かないはずのorderオプションが効いている? order=date に設定すると searchdate を使った場合と結果が同じになる? 例: このサイトに対する過去1か月の言及ツイートを20件、jQueryによるJSONPで取得し、自分(tkykmw)以外のものを表示 otter API search/searchdate resource – jsdo.it – share JavaScript, HTML5 and CSS
CentOS 5にNginxをインストールする
CentOS 5.5にNginxをセットアップした記録。 EPELリポジトリにrpmパッケージもあるようだが、かなりバージョンが古かったので(0.6.39)ソースからインストールすることにした。現時点での最新版(stable)は0.8.53。 まず下準備。nginxユーザの追加とビルドに必要なパッケージのインストール。 sudo useradd -s /sbin/nologin -d /usr/local/nginx -M nginx sudo yum install gcc openssl-devel pcre-devel zlib-devel 続いてソースをダウンロードしてコンパイルする。Nginxはコンパイル時にしか拡張モジュールの組み込みができないので、ビルドの過程はシェルスクリプトの形で残しておいた方が良い。コンパイルオプションについてはWikiを参照のこと。一番下のExample 5(RedHat向け)を参考に調整を行った。 #!/bin/sh NGINX=nginx-0.8.53 # インストール先は /usr/local/nginx になる cd $NGINX \ && make clean \ && ./configure \ –conf-path=/etc/nginx/nginx.conf \ –error-log-path=/var/log/nginx/error.log \ –pid-path=/var/run/nginx/nginx.pid \ –lock-path=/var/lock/nginx.lock \ –user=nginx \ –group=nginx \ –with-http_stub_status_module \ –with-http_ssl_module \ [...]