ラベル プログラミング の投稿を表示しています。 すべての投稿を表示
ラベル プログラミング の投稿を表示しています。 すべての投稿を表示

2011年6月28日火曜日

[Rails]: Generate Ajax remote link for Rails 3 + will_paginate 3.0.pre2

The will_paginate 3.0.pre2 Gem does not support remote tag (like :remote => true).
You need to create custom renderer but currently available posts do not work well.


I have solved this problem.

2011年2月3日木曜日

[Rails]: Rails3のActiveRecordで複雑なOR文生成

Rails 3のActiveRecordはArelというDSLを使ってクエリを生成するのだが,単純なクエリであればともかく,複雑なクエリを実行しようと思うと色々と四苦八苦しないといけなくなる.
# この辺はどのORMでも同じだけど 今回,複雑なSQL文を作る必要が出たのでその方法をまとめておく.

2011年2月1日火曜日

[Rails]: Deviseで二段階パスワード認証

RailsのDeviseはメールアドレス認証などの便利機能が付いていて非常に便利なのだが,オールインワン過ぎてちょっと挙動を弄ろうとするとどこから手をつけていいのか分からなくなる.
例えば,Amazonなんかでやられているような二段階のパスワード認証をやろうとしたのだが,イマイチ事例が見つからなかったので色々とやってみた.

2010年8月6日金曜日

[Qt]: Qt Creatorを使ったオブジェクト指向プログラミング授業資料

今更だが,去年にQtを使った授業資料を作成したことを思い出した.せっかくなのでここでURLを晒してみる.

オブジェクト指向プログラミング

当時1.0系が出た直後のQt Creatorを使ってやってみたのだが,かなり難航したのを覚えている.
僕は教育体験という形で授業資料を作ったのだが,Javaとは違い人によって動いたり動かなかったりしたのが大変だったなあ.
# なぜかARMの開発環境をインストールしている学生がいて,GCCがconflictしてたりなんてこともあった

そんなわけで,もう1年も経って情報は古いけど,見てみたい人はどうぞ.サポートはしません.
内容としては,初めてオブジェクト指向プログラミングをやる人のための授業なので,詳しい人は見る価値はあまり無いです.

2010年8月5日木曜日

[Mac]: 17インチMacBook Proでのノマドワーキング

17インチMacBook Pro Mid 2010を買ってからそれまでのコーディングライフが大きく変わった.
これまで自宅や仕事先など,大画面ディスプレイがないとがっつりコーディングするつもりになれなかったのが,このマシンのおかげでどこでも作業できるようになった.

いわゆる最近流行りのノマドワーキングへの一歩を踏み出して2ヶ月ほど経ったので,僕なりに考えた利点や使っているツールなどを書いていこうと思う.ツールなどはWebアプリケーション向けだが,ノマドワーキングの利点などは他の分野でも同じだと思う.

2010年7月25日日曜日

[PHP][Symfony][Doctrine]: DoctrineでIDをキーにレコードを取り出す

いくつかの案件でSymfony 1.4+Doctrineを使ってみて大体勝手が分かってきたので,メモ.

Doctrineで以下のテーブルがあったとする.

BlogPost:
columns:
title:
type: string(255)
body:
type: string()
この場合,自動的にidというフィールドが追加され,作られるテーブルは以下の通りになる(MySQL使用時).

mysql> show fields from blog_post;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| title | varchar(255) | YES | | NULL | |
| body | text | YES | | NULL | |
+-------+--------------+------+-----+---------+----------------+
ここで,IDを指定して1レコードだけ引っ張ってくる方法にはいくつかある.


$q = Doctrine_Query::create()
->from('BlogPost bp')
->where('bp.id = ?', $id);
$records = $q->execute();
if(count($records) > 0){
$record = $records[0];
}


$q = Doctrine_Query::create()
->from('BlogPost bp')
->where('bp.id = ?', $id);
$record = $q->fetchOne();


$record = Doctrine::getTable('BlogPost')->find($id);

最初の方法ではlimit文が付かないので,その分遅くなる.後の二つは発行されるSQLも同じ.
最後の方法は非常に手軽なので,覚えておくと楽.

2010年7月21日水曜日

[プログラミング]: 開発現場における怖い話



こんなのを教えてもらった.

自分は幸いこういったどうしようもない開発環境で働かされたことはないが,実際にこういう環境で働いている人と話したことはある.
チーム開発ではある程度全体の規約に従ったコーディングをしないといけないのは分かるけど,どう見ても非効率な規約があったりするのも事実.

エディタとかまで制限されるときついよね.

2010年7月19日月曜日

[PHP]: mb_convert_kana()がうまく動かないとき

PHPにはmb_convert_kana()という英数時,スペースの半角文字と全角文字を変換する関数がある.
この関数は日本語を処理するときに非常に便利な関数なのだが,どうもうまく動かない時があるようだ.

そんな時は
mb_convert_kana($str, 'as');
としていたのを
mb_convert_kana($str, 'as', 'utf-8');
としてやると上手くいくことがある.もちろん第三引数の文字コードは環境に応じて変える必要がある.

恐らく,PHPの文字コードauto_detectが上手く動いていないのだと思うが,自分が開発している中では結構この不具合の発生率は高い気がする.

mb_convert_kana()周りで不具合があったときは確認してみるといいと思う.

2009年4月14日火曜日

[Mac OS X]: Qt SDK 4.5とQt Creatorをインストールする

ひょんなことからQtを使ってアプリを書くことになったのでそれに関するメモなど.
まずは何よりインストールから.

まず,Mac OS XでQtを動作させる場合,X Code Toolsをインストールしておく必要がある.恐らく無くてもNativeなQtアプリを作るのには問題無いと思うのだが,標準ライブラリすらincludeできなかったりするので入れておいた方が良い.

X Code ToolsはMacを買ったときに付いてくるInstall Discか,ADC(Apple Developer Connection)に無料会員登録してダウンロードすることで入手することができる.
ただ,ADCからダウンロードするとDVDの1GBくらいあるDMGイメージをダウンロードすることになるので,回線が細い場合はおとなしくインストールディスクから入れた方が無難だと思う.

X Code Toolsのインストールが終われば,Qt公式サイトのダウンロードページからSDK(Standard Development Kit)をダウンロードする.
この時,よく見ると「Commercial Downloads」と「LGPL / Free Downloads」からライセンスを選択してダウンロードするのに気をつける.通常はLGPL版のSDKで良いだろう.



後は普通にダウンロードしてきたイメージをインストールすれば良い.

次に,Qt開発環境であるQt Creatorをインストールする.

Qt CreatorはQt開発に特化した統合開発環境で,Javaで言えばEclipse,Windows開発で言えばVisual Studioに相当する.
実は,最初はEclipse/CDTというEclipseのC++開発にQt Eclipse Integrationを入れて使おうと思ったのだが,なんとMac OS XだけPluginが提供されていない.
というわけで,仕方ないのでQt Creatorを使うことにした.

Qt Creatorは先ほどのダウンロードページ左下に「Qt Creator IDE」という項目があるので,そこからダウンロード/インストールできる.
Qt Creatorを起動すると,最近のIDEらしくWelcome画面が表示される.



試しにHelloWorldを書いてみる.
FileメニューからNewを選択し「Qt Console Application」を選択.適当な名前でプロジェクトを作成して後はデフォルトのまま次へボタンを押していく.
すると,Editモードに切り替わるので,main.cppの内容を以下のように編集する.

#include <QtCore/QCoreApplication>
#include <QDebug>

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug() << "Hello, World.\n";
return a.exec();
}


qDebug()はC++標準関数で言うcoutの代替として使えるQt関数である.
あとはQt Creator左下にある再生ボタンを押すか,Buildメニューから「Run」を実行すれば,以下のような形でHelloWorldが表示される.



とりあえず今日はここまで.

2009年1月29日木曜日

[UNIX]: シェルスクリプトで指定回数の繰り返し処理

普段プログラミングしていて,指定回数繰り返す処理といったら

for(int i = 0; i < n;i++){
.....;
}


であるが,たまにシェルスクリプトを書いているときに同じように書こうとしても,for文を使うとなかなかうまくいかない.
というわけで,シェルスクリプトで繰り返しを書くときは,while文を使って次のように書いている.

loop=10;#繰り返し回数
i=0;
while true
  do
  ...;
  i=`expr $i + 1`
  if `expr $i \>= $loop`
    then
    break;
  fi
done
要はexprコマンドを使って数値の計算と比較を行う.ちなみに,break文が入っているif文の条件を
if [ $i > $loop ]

とすると多分うまくいかない.
というのは,man testすると<, >の記号は文字列としてASCIIコード順での順位で比較すると書いているためで,もし数値比較したいのであれば-gt, -ltを使うように書いてある.

そんなわけで,シェルスクリプトで数値比較をするときにはexprを使うと覚えておけばとりあえず間違いは無いということだろう.

2009年1月23日金曜日

[PHP][Symfony]: SymfonyのドキュメントルートのURLを取得する

Symfonyは基本的に専用のバーチャルドメインを立てて,web/index.phpがドキュメントルートにあることを前提としている(例えば,http://example.com/index.php).

しかし,ドキュメントルートには静的なコンテンツを置きたいとか,一つのバーチャルドメイン上で複数のSymfonyアプリケーションを動かしたいという時には,ドキュメントルート直下で無い所にindex.phpが置かれる.例えば,http://example.com/SF_APP/index.phpなどである.

この様にSymfonyのアプリケーションディレクトリがドキュメントルート直下にあることが保証されない場合,他のファイルのURLをどのように取得すればよいかが困る.
例えば,web/contents/hogehoge.dataといったデータを置いている場合,上記の場合で言えば「/SF_APP/」というサイト内絶対パスを取得する方法が必要になる.

これがスタイルシートやJavaScriptなら,stylesheet_path()やjavascript_path()といった関数がテンプレート内で使えるが,これらの関数は勝手に拡張子を補完したり,cssやjsディレクトリの補完を勝手にやってしまうため,その一つ上位のディレクトリであるwebディレクトリにアクセスすることはできない.

で,色々と検索してみたのだが,それっぽい関数は見つからなかったので,結局以下の方法に落ち着いた.
テンプレート内で,
dirname($sf_request->getScriptName());
これで,Symfonyのwebディレクトリに当たるディレクトリのサイト内絶対パスを取得することができる.
具体的には,

<a href="<?=dirname($sf_request->getScriptName())?>/contents/hogehoge.data">
の様な形式になる.

・・・でもこういった処理は何か関数がありそうなんだけどなぁ・・・

2009年1月22日木曜日

プログラミングに英語は必要か〜検索の有利と不利〜

前回は英語のエラーメッセージが目に入らないという話をした.

プログラミングに英語は必要か〜視界に入らないエラーメッセージ〜

残念ながら僕が会ったことのあるプログラマ(プロ・アマを問わず)は,多くの場合英語が苦手な人が多い気がする.

しかし,得意にならないまでもプログラミングのスキルアップを目指す上で,最低限の英語の能力は必須と言っていい.
それは,検索におけるヒット率に大きく関係する.

プログラミングがそこそこ分かってくると,プログラミングというのは多くの場合0から1を自分自身の力で生み出すというよりは,あちこちにある部品を拾ってきてコピペし,さらに自分なりの修正を加えることが早く正確なプログラムを書くコツだと言うことが分かる.
# もちろんコピペ元のコードの品質をチェックする技量は必要
また,エラーに遭遇したり困ったときには自力解決するよりも,先人達に同じ経験をした人がいないかを調べるのが普通である.

そして,その部品を探すときに使うのが検索エンジンなのだが,ここで日本語しか使えないのと英語も使えるというのでは,天と地ほどの差がある.

以前の記事でも書いた様に,プログラミングの世界の標準言語は英語である.エラーメッセージも普通は英語であるし,世の中に出回っているソフトウェアのドキュメントにしても,日本語版がないことはあっても英語版がないことは少ない.
また,もし日本語のサポートサイトがあっても,作者が英語圏の人だった場合,ドキュメントにしてもサポートにしても,日本語のサポートが受けられることは少ない.

こうした状況の中で日本語の文書しか読めない場合,非常に不利である.
例えば,英語のエラーメッセージでGoogle検索に書けた場合「日本語のページを検索」と「Web全体から検索」ではヒットする件数が圧倒的に違う.
試しに「"Segmentation Fault"」で検索してみたところ,日本語は75,000件程度,Web全体では1,500,000件程度ヒットした.
単純に20倍ほど違うのである.

これは,英語が読める人が英語を読めない人に比べて20倍の情報を参照できると言うことを意味している.
当然これらの中にはただの質問を投げただけのページや,中国語やドイツ語などの英語以外のページも含まれるが,それを考慮しても圧倒的な差になる.
そして,日本語で見つからなかった情報も英語なら手に入る可能性もある.

英語から逃げ続けているプログラマは,自分がすごく損をしていることを自覚した方が良いだろう.

[PHP][Symfony]: 特定のスタイルシートを読み込まないようにする

# テスト環境はSymfony v1.2.0

Symfonyを使っていると,apps/APP_NAME/config/view.ymlに書いたデフォルトのスタイルシートは常に勝手に読み込まれることに気付く.
これは親切なのだが,デフォルトのapps/APP_NAME/templates/layout.phpを使わずに全て手動でHTMLを出力させたい時などには不便である.

例えば,apps/APP_NAME/templates/null.phpとして,以下のようなファイルを作る.

<?php echo $sf_content ?>

このレイアウトは,デフォルトのlayout.phpと違い,HTMLタグやHEADタグなどを含んでいないため,CSVを出力したり,HTML以外の任意のデータを出力する時に使う.
使い方は,Actionの中で

$this->setLayout('null');
とすればよい.

さて,このレイアウトテンプレートはCSSやXMLなどの非HTMLを出力する場合は問題なく機能する.
しかし,HTMLを出力しようとした際に問題が発生する.
というのは,アクションのテンプレートにHTMLを普段通り記述しただけでは,SymfonyがHEADタグを自動検出して,デフォルトのスタイルシートを読み込んでしまうのだ.

例えば,以下のテンプレートの場合,赤字の部分にデフォルトのスタイルシートが読み込まれる.

<html>
<head>
<meta ... />
<meta ... />
<!--ここに読み込まれる-->
</head>
<body>
</body>
</html>


デフォルトのスタイルシートを読み込みたくない場合,この動作はお節介なので,読み込まないように設定したい.
で,SymfonyのAPIドキュメントによると,Responseクラスを継承したsfWebResponseクラスにremoveStylesheet()というメソッドがあるので,これを使ってみるのだが,うまくいかないことが分かる.

public function executeHoge(sfWebRequest $request){
$response = $this->getResponse();
$response->removeStylesheet('stylesheet_to_remove');
return sfView::SUCCESS;
}

どうみても問題なさそうなのだが,やはりデフォルトのスタイルシートが挿入されてしまう.

で,お行儀が悪いが,テンプレートの方でこのメソッドを呼んでみる.

<?php
$sf_response->removeStylesheet('stylesheet_to_remove');
?>
<html>
<head>
<meta ... />
<meta ... />
</head>
<body>
</body>
</html>

すると,無事にスタイルシートが読み込まれなくなった.

どうやら,デフォルトのスタイルシートを挿入する処理は個別のActionのテンプレート処理の後に行うらしい.多分Filterか何かがやっているのだと思う.
この処理の順番を知らなかったのでかなりハマった.同じような経験をした人はいるのかな?

2009年1月17日土曜日

プログラミングに英語は必要か〜視界に入らないエラーメッセージ〜

以前プログラミングに数学の知識は必要かというトピックを書いたが,今回は英語について.プログラミングに英語の能力は必要かという話について取り上げる.

以前「数学ができないからプログラミングに苦手意識を持つ人が多い」という話を書いたが,では数学が(少なからず)できる人たちはというと「英語ができないことが多い」というケースに遭遇する.
これは僕の大学がいわゆる数学受験や英語受験といった入試方法があることも関係しているのかも知れないが,割合一般に言えることだと思う.

ちなみに,ここでいう「できる」「できない」の基準はかなり低いレベルで,例えば英語が「できる」というのは高校レベルの読み書きができるレベルで「できない」というのは全く読めないか,そもそも読もうとしないレベルである.
数学についても「できる」というのは高校で理系コースを取っていればがんばって勉強していなくても十分なレベルで「できない」というのは算数レベルはともかく,数学レベルの論理立てた証明などが理解できないという人たちである.

# ちなみに僕は昔は数学が「できて」英語が「できない」グループに属していた

さて,こうした数学ができて英語ができないグループの人たちがプログラミングでつまずくのはどこかというと,コンパイルエラーなどのエラーメッセージなのである.
最近は日本語のエラーメッセージを出力するプログラムも多いが,基本的にはコンパイラのエラーメッセージなどは英語が標準である(日本語のエラーメッセージについては書きたいこともあるのだが,それはまた別の機会に).
なので,プログラムを書いていると意外と英語に触れる機会は多い.

そして,こうした(自称)英語できないグループの人たちの傾向として「英語のエラーメッセージを読もうとしない」ことがある.それがたとえどんなに平易な文章だったとしても,である.
例えば,「Command not found.(コマンドが見つからない)」や「File does not exist.(ファイルが存在しない)」などは単語の意味さえ分かれば呼んでも良さそうなものなのだが「動きません」と言われて見に行くと,割とこういった単純なメッセージを読まずに投げ出していることが多い.

なぜ自分でメッセージを読まないのかを昔の僕を思い出しつつ考えてみると,理由が分かった.
英語できないグループの人というのは,英語のメッセージを文章として見るのではなくただの「記号」としてしか見ておらず,そもそも眼中に入っていないのである.これは英語が読めないからとか,苦手だからとかそういう話ではなく,単純に視界に入っていないのだ.

これは,例えば普段PCを使っていて何度も見るエラーメッセージの処理をするときに似ている.
昔のWindows 9x系では「このプログラムは不正な処理を行ったため強制終了されます」といってプログラムがクラッシュすることが多かったのだが,このエラーメッセージをいちいち読んでいる人はいなかっただろう.単にエラーのウィンドウが出たら「ああ,またかよ」と思いながらウィンドウを閉じていたように思う.

ちょっと話が脱線したが結局どういう事なのかというと,こういった人たちに大切なのは,まずこうしたエラーメッセージの存在に気づかせてあげることと,意外と読める部分もあるのだということを理解してもらうことだと思う.
実際,僕がプログラミングを教えるときも,読める部分だけでも良いのでエラーメッセージを読んでもらい,それがどういう意味なのかを考えてもらうようにしている.
そして,エラーメッセージを元に問題を解決するという手順を何回か繰り返していく内に,自然とエラーメッセージを無視しなくなっていくのである.

もちろん,知らない単語や分からない文章の場合は質問するように伝えてあるのだが,ほとんどの場合自力解決してしまう.これは(自称)英語ができないグループの人たちも同様で,実は今までは読もうとしなかっただけで,読もうと思えばちゃんと読める人たちだったわけである.

そんなわけで,英語ができないとエラーメッセージを無視している人や,そういった人たちにプログラミングを教えている人は,まずはエラーメッセージを視界に入れて,読むための努力をしてみるのが良いのではないだろうか.

2009年1月6日火曜日

[PHP]: Mac OS X 10.5.6におけるPHPのデフォルトconfigureオプション

ふと気になったのでMac OS X 10.5.6(現行最新)環境でのPHPのconfigureオプションを調べてみた.
'--prefix=/usr'
'--mandir=/usr/share/man'
'--infodir=/usr/share/info'
'--disable-dependency-tracking'
'--with-apxs2=/usr/sbin/apxs'
'--with-ldap=/usr'
'--with-kerberos=/usr'
'--enable-cli'
'--with-zlib-dir=/usr'
'--enable-trans-sid'
'--with-xml'
'--enable-exif'
'--enable-ftp'
'--enable-mbstring'
'--enable-mbregex'
'--enable-dbx'
'--enable-sockets'
'--with-iodbc=/usr'
'--with-curl=/usr'
'--with-config-file-path=/etc'
'--sysconfdir=/private/etc'
'--with-mysql-sock=/var/mysql'
'--with-mysqli=/usr/bin/mysql_config'
'--with-mysql=/usr'
'--with-openssl'
'--with-xmlrpc'
'--with-xsl=/usr'
'--without-pear'
--with-xmlと--with-xslが標準で付いているのはSymfony使いの自分としてはありがたい.
--enable-socketsも付いているので,Perlの代わりにPHPを使う僕のようなPHPスクリプターにとっては助かる.
でも--without-pearなのは何でだろう?Apple側で管理できないパッケージは入れたくないということだろうか.まあ必要なら自分でライブラリを丸ごと持ってきた方が互換性問題に悩まされずに済むのでこれはこれでいいか.でもやっぱり不便.

ちなみにPHPのバージョンは5.2.6だった.
$ php -v
PHP 5.2.6 (cli) (built: Jul 17 2008 23:04:49)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies

2008年12月25日木曜日

[PHP]: ディレクトリ内の任意のファイルの文字コードを一括変換

手元のLaTeXファイルの文字コードをまとめてEUC-JPからShift-JISに変換する事があったのでささっと書いてみた.
  • srcDir: 文字コード変換するファイルが入っているディレクトリ
  • dstDir: 文字コード変換したファイルを保存する先のディレクトリ
  • fromEncoding: 変換元の文字コード
  • toEncoding: 変換先の文字コード
  • pattern: $srcDir内で変換対象となるファイルのPerl正規表現パターン
$srcDir = "./hogehoge";
$dstDir = "./hogehoge_sjis";
$fromEncoding = "shift_jis";
$toEncoding = "euc-jp";
$pattern = "/tex$/";

$directory = dir($srcDir);
while(
$filename = $directory->read()){
if(!
preg_match($pattern, $filename))
continue;
$fp = fopen($srcDir."/".$filename, 'r');
$wfp = fopen($dstDir."/".$filename, 'w');
while((
$buff = fgets($fp, 2048)) != false){
fputs($wfp, mb_convert_encoding($buff, $fromEncoding, $toEncoding));
}
}
memoということで.

2008年12月22日月曜日

プログラミングに数学の知識は必要か?

立場上、これまでプログラミングとは何の縁も無かった人にプログラミングを教える機会があるのだけれど、こうした人たちにはいわゆる文系の人たちも多くて、まだ勉強してもいないプログラミングというものに対して苦手意識を持っていることが多かったりします。

で、そういう人たちに何でそんなに苦手意識を持つのか聞いてみると「数学が苦手だから」という答えが返って来ることが多いです。

これは大きな誤解です。プログラミングを学ぶ前提として数学の知識はほとんど必要ありません。
もちろん、発展した内容(最適化とかパフォーマンス計測)では数学の知識を必要とすることはありますが、それでも初心者が初めてプログラムを書き始める時点ではまず必要ありません。

これに似た例としては、例えば絵を描くことが挙げられます。僕らは紙と鉛筆があれば、別に何を習わずとも絵を描くことができます。ただ、鉛筆以外の様々な画材を使ったり、既に確立されている絵画のノウハウを学ぶことで、より良い絵が描けるようになるでしょう。
プログラミングにおいては、ここで言う画材やノウハウが数学であり、各種コンピュータ関連の知識なわけです。

また、絵画と同じで、いくら知識を詰め込んでもそれだけでプログラミングがうまくなるということはありません。人によって個人差はありますが、練習によってプログラミング技術は確実に向上します。
プログラミングをしていて「最近上達速度が鈍ったな」と思ったら、その時は情報数学やコンピュータ関連の書籍を訪ねてみましょう。そこでまた大きくレベルアップすることができます。

そんなわけで、これからプログラミングを始めるという人は新しい絵の描き方を学ぶんだ、といった気持ちで望むといいと思います。