サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
体力トレーニング
nitsuji.hatenadiary.org
普段Perl使ってて、sprintf()ってよく使うんだけど、Perlの場合、引数の部分に配列を指定して、たとえば以下のように書ける。 my @list = ('foo', 'bar'); my $str = sprintf('%s, %s', @list); これは、 my $str = sprintf('%s, %s', @list); が my $str = sprintf('%s, %s', 'foo', 'bar'); と同じだから、引数の数が書式指定と一致しておkになります。 これ、配列に値を入れといてあとで使えるから便利なんだけど、これってPHPとかRubyとか他の言語だとできないんですね。配列が、Perlでいうところの配列リファレンスなので、sprintf('%s, %s', list);とかやると引数がすくないよ!っていわれるわけです。もちろんPerlでもsprintf(
DBIx::Class::Validation - Validate all data before submitting to your database. - metacpan.org モデル層でValidationするモジュールなんだけど、単純にCatalystで使ってみたらイマイチだったのでメモ。 イマイチというのはコントローラが思いのほか汚くなってしまうということと、確認画面があるようなフォームだとモデル層に行く前(insert/updateする前、確認用アクション)でValidationすることになるので単純に使えないということです。また、特にtxn_doとか使うとevalばっかになって嫌な感じです。 sub create_save : Path('create/save') { my ($self, $c) = @_; if ($c->session->{entry}) {
まあ、今更ですが。 GAEの一番すばらしいところは、ソース等を変更したあとの「動作確認&本番へのデプロイが超簡単」というところだと思います。 さっき、http://nakanohito.jp/stage/ugokuhito/というサービスが始まったことを知ったので、タグを埋め込むだけだから今やっちゃおうってことでテンプレートを変更しました。そのときにやったことは以下の作業だけです。 $ vi chin-ma-ya/templates/mobile/base.html $ dev_appserver.py chin-ma-ya $ appcfg.py update chin-ma-yachin-ma-yaというのがアプリケーション名。 dev_appserver.pyでテストサーバーを起動して動作確認。appcfg.pyで本番環境にデプロイします。 すごい簡単。ひさしぶりにGAEを使ったけど
はまったので、他に困ってる人がいるかもしれないと思い書いておく。手短に。 HP ML110 G5でCentOS 5.2 x86_64をインストール。 # hdparm -tT /dev/hda /dev/hda: Timing cached reads: 16412 MB in 1.99 seconds = 8247.41 MB/sec Timing buffered disk reads: 10 MB in 3.24 seconds = 3.08 MB/secおそい! # hdparm -v /dev/hda /dev/hda: multcount = 16 (on) IO_support = 0 (default 16-bit) unmaskirq = 0 (off) using_dma = 0 (off) keepsettings = 0 (off) readonly = 0 (of
ふと、飲んだビールの量をカウントするだけのサービスが欲しいと思ったのでGoogleApp Engineを使ってibeerというのを作ってみました。 http://ibeer.appspot.com/ とりあえず作ってみましたが、これからどうしようとかいうのは特に決めていません。思いつきベースで飽きるまでテキトーにやってく予定です。こんな機能あったらいいよねー、とかも(一応)募集してみます。 あと今はまったくスタイルシートを適用していない素のHTMLなので、カッコいいデザインとかロゴとかも絶賛募集中です! Twitterを参考にCSS書きました。 ちなみになぜビールの量をカウントしたいかというと、生活費の中で食費の占める割合が高く、たぶん食費の中ではビール代が占める割合が最も高いので、そのビールの量を数えてみたい!という単なる思いつき(好奇心)です。だって居酒屋で生大(800ml)を5回頼ん
Linuxなどで実行中のプロセスを表示させるコマンドにpsというのがあります。 これまでこのコマンドをかなり適当に使ってきていて、オプションとかよくわかってなかったのでmanをちゃんと読んでいろいろやってみました。 psコマンドはprocpsというパッケージに含まれるコマンドです。 procpsには他にtop, vmstat, w, kill, free, slabtop, skillといったコマンドが含まれているようです。 ここではFedora Core 6で以下のバージョンを使っています。 $ ps --version procps version 3.2.7 オプションの指定方法 オプションの指定方法にいくつかの方法があるので把握しておきます。 UNIX オプション。まとめることが可能で、前にはダッシュを置かなければならない。 BSD オプション。まとめることが可能で、ダッシュを使っ
最近「Perlは記号だらけでよくわからん」という話をよく聞くなーと思っていたのでちょっと考えてみた。 まずはよく見かけそうな記号変数(正式な呼称なんだっけ?)を思いつくかぎり列挙してみる。 $_ $! $@ $? @_ <>(これは変数じゃないか) このくらいかな。 で、「記号だからググれない」ということも聞きますが、これは直接Perlのドキュメント(perldoc)を参照するのが手っ取り早いです。 これはperlvarというドキュメントに載ってるので「perldoc perlvar」でググります。そうすると http://perldoc.perl.org/perlvar.html http://perldoc.jp/docs/perl/5.6.1/perlvar.pod とかが出てくるので、あとはブラウザ上で検索すればおkではないかと思います。 また、ブラウザよりもシェルが身近にある人は
YAPC::Asia 2008は気になるセッションがたくさんあって困っていたんだけど、実際にはセッションを見ることはほとんどできなかったので今チェックしています。実はスライドはほとんどWeb上にあるし、動画もアップされるし、内容をチェックするだけなら会場に行かなくてもそれほど不自由はしないんですね。 それでも会場に行くメリットは、「実感できる」ということだと思いました。会場である(今回は)東工大の環境の素晴らしさとか、どれだけたくさんの人が参加しているのかとか、みんなとても楽しそうにしていることとか、日本語だけじゃなくて英語が普通に飛び交ってたりとか。さらにスタッフとして参加して、イベントを作り上げるためにどれだけの人ががんばっているかとか、最近は当たり前のように見ているストリーミング中継が実際にみんなの努力によって行われていることとか、そういうことを「実感できて」よかった。すごく楽しかっ
レプリケーション環境で、更新系クエリはマスター、参照系クエリはスレーブに振り分けるというのはよくあることだと思います。 PerlのO/RマッパーであるDBIx::ClassにはDBIx::Class::Storage::DBI::Replicationというのがあって、これを使うと利用側で接続先を意識することなくクエリを振り分けることができそうです。しかし、どうやら参照系は必ずスレーブへ振り分けてしまうようなので、トランザクションの中ではマスターを参照したいといった場合に対応できないんじゃないかと思いました。 そこで、明示的にスレーブの接続を取得する方法がないかなーと思ったんですが見当たらなかったので書いてみました。 実装するにあたり以下のClass::DBI用に書かれたコードを参考にしてみました。 http://d.hatena.ne.jp/tokuhirom/20060713/1152
前回はてきとーなモジュールをShipwrightに突っ込んでインストールしてみる、というところまでやってみたけど実用的なことは何一つやってませんでした。というわけでCatalystおよびcatalyst.pl MyAppしてできたスケルトンをパッケージングしてテストサーバーを起動するとこまでやってみたよ。 パッケージはここにあります。 http://svn.onot.in/public/shipwright/catalyst-myapp/ インストール Shipwrightパッケージはデフォルトでは/tmpの下にインストールされますが、これを/opt以下に変更します(よくわかってないけど気持ちの問題?)。Shipwrightのパッケージは/usrとか/usr/localとかの下にインストールするようなものではなく、このパッケージだけが存在するような状態にインストールするのが正しいようです。
まだ理解が中途半端なんだけど一度まとめておく。 WSGIのためのコンポーネント群とWSGIに沿った開発をサポートするツール群の集まりがpaste. WSGIはウェブサーバとウェブアプリケーションの間のインターフェース。PEP333で規定されている。 pasteはフレームワークのためのフレームワークみたいなもので、この上にフレームワークを実装してそれを使う。たとえばPylonsとかはそういうフレームワーク。 これのメリットは基礎部分はpasteが提供してくれるのでコードが小さくなること、WSGIに準拠した部分(たとえばWSGIミドルウェア)はフレームワークが変わっても再利用可能なこと。フレームワークが変わっても覚えることが少なくなること。 paste script プロジェクトテンプレートの作成 コマンドラインツール pasteベースのフレームワークで共通に使うツールの共有を促す paste
ShipwrightはPerlのモジュールです。CPANで公開されています。 Shipwright - Best Practical Builder - metacpan.org Shipwrightはアプリケーションのためのパッケージングツールです。依存しているソフトウェアおよびバージョンをリポジトリで管理します。たいていのPerlで書かれたアプリケーションはCPANモジュールに依存しているので、何らかの方法でそれをインストールする必要があります。思いつく方法としては以下のような方法があります。 CPANコマンドで地道にインストール アプリケーションのMakefile.PLでModule::Installを使って依存モジュールを自動インストールする rpmなどで自力でパッケージングする(やりかたしらないけど) 専用のPerlパッケージ(perl本体含んだ)を作成する この中でお手軽なのは
衝動買いしてしまったCatalyst本がようやくやってきた。 12/10にPacktで注文して1/2に発送したよーってメールが来て今日(1/15)届いた。 20% Pre-Order Discountというので買ったから39.99ドルのところを31.99ドルで買えた。支払いはVISAで換算レートが1ドル113.319円(換算日12/12)で3625円だった。送料は無料。日本の場合はシンガポールから発送するらしい。で、アマゾンを見ると6614円で売っててどんだけーって感じですね。3000円も高い!まだ全然読んでないけど6000円以上出すのはどうかなーとか思った。見た目は200ページ弱で結構薄いなーという印象。 ちなみに今Packtで買うと35.99ドルなんだけど12/15現在に限定すると1ドル107円とかなので4000円以下で買えるのかな。でもまあ発送は遅いんだろうけど。アマゾンなら翌日とか
redhat系のperl5.8.8にあてられているパッチのせいで動作が遅いという件に対応したのでメモ。 ずっとスルーしてたんだけどDBIx::Class::Cursor::Cachedを入れたら新しいDBIx::ClassがインストールされてしまいCatalystのテストサーバーを起動するたびに警告メッセージが出るようになったのでこの機会に対応することにしたという経緯。 でも実はrpmコマンドとかもよくわからず、「なんかrpmをインストールしたり、インストール済みのrpmを調べたりできるらしい」くらいしか知らなかった。そんな具合なので「該当のpatchをコメントアウトしてrpmをbuildする」と言われても具体的なやり方がわからないのでこの機会にrpmのキホンも学んだ。ついでにcpioというコマンドも学んだ。 で、いろいろとググったページを参考にしながら以下のようにしました。 $ sudo
daemontools daemontools howto daemontoolsのインストール、サービスの作成については上の2つを参考にする。 作ったのは以下のようなサービスディレクトリ。/service以下からここにシンボリックリンクを張って使用する。 http://trac.onot.in/public/browser/Meguro/trunk/service
TheSchwartzについては以下がわかりやすい。 TheSchwartzは非同期かつ分散した環境で各種ジョブを処理させるという枠組みを再実装して利用しやすくしたもので,MySQL(SQLiteもサポート)上のデータベースにジョブを格納し,各ワーカープールで処理を行って結果を返す,という単純なフレームワークです。 第11回 OSCON 2007レポート みんなが注目している技術は?:サンフランシスコで昼食を|gihyo.jp … 技術評論社 あとは以下のスライドでもっと詳しく知ることができる(71ページから) http://www.danga.com/words/2007_04_linuxfest_nw/linuxfest.pdf gearmanというジョブキューとTheSchwartzとの違いは以下のエントリがわかりやすい。 http://d.hatena.ne.jp/tokuhiro
・・・がよくわかんなかったんだけどそれなりにできてしまって、このやり方に全く自信がないという話です。 - 地域と店舗があって多対1の関係とします。「地域 has many 店舗」です。 テーブルのカラムにdeleted_atというDateTime型のカラムを持たせてこれに値が入っていたら削除されたレコードだと見なします。 これを「論理削除」ということにします。 この場合、削除されてなかったらNULLになるので、削除されていないレコードをすべて取得したいときは以下のようなSQLを使います。 SELECT * FROM shops WHERE deleted_at IS NULL 一方で本当に削除する場合は「物理削除」ということにします。 - さて。 DjangoのAdminサイトでは物理削除が行われるので、この挙動を変更したいです。 これは以下のようにモデルクラスでdelete()メソッドを
JavaScriptからローカルのファイルを読んだり書いたりしたい。 ぜんぜんまとまってないし理解もしてないけど調べたものをメモ。 ローカルでJSと言えばTiddlyWikiが思い浮かぶのでソースチェック。 ieLoad/SaveFileとかmozillaLoad/SaveFileとかのところ。ieXXXの方はWSHを使用。mozillaXXXの方はよくわからないのでもっと調べる。 // Returns null if it can't do it, false if there's an error, true if it saved OK function mozillaSaveFile(filePath, content) { if(window.Components) try { netscape.security.PrivilegeManager.enablePrivilege(
例えばカテゴリを削除するアクションを実行した結果を表示したい。 flashを使って例えばこんな感じにする。 if ($c->form_submitted) { if (my $name = $c->forward('do_delete')) { $c->flash->{notice} = sprintf('カテゴリ「%s」を削除しました', $name); $c->res->redirect($c->uri_for('/admin/category/list')); } else { $c->flash->{notice} = 'カテゴリを削除できませんでした'; $c->res->redirect($c->uri_for('/admin/category/list')); } } でもこういうメッセージ類がコントローラの中にあるとあとでなにかと面倒です。 そこでCatalyst::Plu
Catalyst::Plugin::FormValidator::Simple::AutoでマルチカラムのUNIQUEチェックをする場合 - libnitsuji.soの続き。 いろいろ考えてるうちに問題はYAMLの書き方じゃなくてほかのところにある気がしてきました。 つまりハッシュをキーにするという考えがまずおかしいのではないかと。 そこでFormValidator::Simpleのprofileについて追ってみました。 Catalyst::Plugin::FormValidator::Simple::AutoのprofileのYAMLは、 # profiles.yml action1: param1: - NOT_BLANK - ASCII - [ 'LENGTH', 4, 10 ] param2: - NOT_BLANK のように、アクションとパラメータ名がハッシュのキーになって、各
Catalystをちゃんと勉強しはじめてからずっと頭の片隅にあるけどまだ解決せず。 俺以外にも悩む人はぜったいいるはずだと思っていたけどMLを検索する方法がよくわかんなかったのでいまいち網羅できず。ひとまず、 Catalyst MVCの覚え書き - libnitsuji.so こんな感じだったのだが、今日、 http://www.mail-archive.com/catalyst@lists.rawmode.org/ を見つけたので「logic」で検索! 興味深いスレッドとして、 [Catalyst] Program the logic [Catalyst] ways to do stuff and why の二つがあったので読んでみた。 実装までは踏み込んでいないのでそれ以前の話だけど。俺の頭の中もまだ実装前なので具体的にどう実装するかはひとまず置いておく。 俺の疑問点とか考えとかを書い
昨日に引き続き今日もまた躓いています。 FormValidator::Simple::Plugin::DBIC::Uniqueでマルチカラムのユニークチェックをしたい。 たとえば「このID(自分自身)以外で名前が重複するカラムがあるか?」みたいなチェックをするためには SELECT COUNT(*) FROM table WHERE id != ? AND name = ? みたいなSQLが必要で、それをやるためには、 # check multiple columns including '!=' check # set "!" as prefix for key-name FormValidator::Simple->check( $q => [ { unique => [qw/id name email/] } => [ [qw/DBIC_UNIQUE Table !id name m
FormValidator::Simple::Plugin::DBIC::Unique - unique check for DBIC - metacpan.orgを見ると、Catalystの場合は # you also can pass resultset object. # in catalyst application, FormValidator::Simple->check( $q => [ name => [ ['DBIC_UNIQUE', $c->model('Schema::User'), 'username' ] ], ] ); と書いてある。 でもCatalyst::Plugin::FormValidator::Simple::Autoを使ってprofiles.ymlにバリデーションのルールを書く場合は$c->modelとか書けない。 admin/category/do
テキトーに訳す。 DBIx::Class::Manual::Intro - Introduction to DBIx::Class - metacpan.org INTRODUCTION SQLを書くのに飽きてPerlネイティブのDB I/Fが欲しい人。 Class::DBIより優れた方法を探してる人。 そういう人向け。 THE DBIx::Class WAY DBIx::Classのやり方を身につけるのに役立つことを紹介。 Tables become ResultSources DBIx::Classはテーブル構造を知る必要がある。 それはDBIx::Class::ResultSourceを定義することで可能になる。 それぞれのテーブルはカラムや関連を定義したResultSourceを1つ持つ。 大事なこと。 A ResultSource == Table (たいていの場合) It's
Catalyst::Manual::Cookbook - Cooking with Catalyst - metacpan.org Basics Catalystを使う人が知っておいた方がいいこと。 Delivering a Custom Error Page アプリケーションでエラーが発生したときはCatalystは独自のエラーページを表示する。-Debugモードのときはエラーメッセージとコンテキストオブジェクト($c)のData::Dumpの出力を表示する。-Debugモードじゃないときは"Please come back later"が表示される。 エラーページを変更するにはendメソッドにエラー処理を書けばいい。例を示す。 sub end : Private { my ( $self, $c ) = @_; if ( scalar @{ $c->error } ) { $c->st
Catalyst::Manual::Actions - Catalyst Reusable Actions - metacpan.org DESCRIPTION 再利用可能なアクションについて。どう動くか。既存のアクションとあなたが書くアクションについて。アクションはメソッドの属性でメソッドコールの前後に機能する。共通に使用するアクションを記述する。 USING ACTIONS 簡単。よく使ってるディスパッチ用のアクション(LocalとかPrivateとか)と同じ感じだ。 sub Hello :Local :ActionClass('SayBefore') { $c->res->output( 'Hello '.$c->stash->{what} ); }この例ではHelloを実行する前にSayBeforeていうアクションを実行する。次のセクションで実装方法を示す。Catalyst::Ac
Cookbook長いので分割。 デプロイについてのレシピ。Webサーバーエンジンとアプリケーションの効率化も含む。 http://search.cpan.org/~jrockway/Catalyst-Manual-5.700701/lib/Catalyst/Manual/Cookbook.pod#Deployment mod_perl Deployment mod_perlは多くのアプリケーションに対しての最適解だけど利点と欠点を述べる。他の方法としてはFastCGIがある。 Pros Speed mod_perlはとても高速で、それぞれのApacheプロセスのメモリにアプリケーションをロードすることによって恩恵を受けられる。 Shared memory for multiple apps 同じサーバーで複数のCatalystアプリケーションをする必要がある場合、mo_perlは共通のモジ
さらに分割。 テストについては外部からリクエストを送って、みたいな方法しかない?ようなので、内部のモジュール、特にモデル部分のテストをどうやってやるかが問題。 そこは普通のPerlモジュールと同じ方法でできるのかね。 http://search.cpan.org/~jrockway/Catalyst-Manual-5.700701/lib/Catalyst/Manual/Cookbook.pod#Testing テストはWebアプリケーションの開発プロセスに不可欠な要素だ。テストは複数人での開発とコードの変更を容易にする。 Testing Catalystは開発中のテストと本番環境にデプロイする前のテストをやりやすくする。 Catalyst::Testは同じテストをローカル(外部のデーモンを除く)とリモートのHTTPサーバに対して行えるようにする。 Tests スケルトンアプリケーションの
vimのsnippetsEmuがすばらしい - otsune's SnakeOil - subtech を見て入れてみようと思ったんだけどプラグインなんて使ったことなくて30分くらい苦戦したのでメモ。 Linuxでvim7使ってます。 $ mkdir -p ~/.vim/after/ftplugin $ cd ~/temp $ wget http://www.vim.org/scripts/download_script.php?src_id=6951 $ vim snippetsemu1_1.vba :UseVimballそうすると~/.vimの下にいろいろとファイルができる。 プラグインにはグローバルプラグインとファイルタイププラグインの2種類があって、snippetsEmuは後者らしいので、 :filetype plugin onってやらないと有効にならないっぽい。~/.vimrcに
次のページ
このページを最初にブックマークしてみませんか?
『libnitsuji.so』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く