以前、railsでちょっとした日記みたいな物を作った事があるがこの時に'active_record'や'active_support'が非常に便利だと分かった。
なのでrails以外でちょっとしたWebアプリを作るときなんかもこれが使えると便利だなあ・・と思っていたんだが。
なかなか思うようにはいかなかった。具体的にはrbxやrhtmlのファイルの中で
require "rubygems" require "active_record"
こうすると"Internal Server Error"になってしまうのだ。
その後あーしたりこーしたりいろいろとやってみたのだが、結局うまくいかず自分の中では出来ないものとなっていたんだが、Webを調べていくうちに解決方法が分かった。
最近は動画をいじったりする事も少なくなってきたが以前はいろんな動画変換ソフトを試していた。
'iSquint'というソフトが画質と速度のバランスがとれててよく使ってたと思う。
他にも'ffmpeg'をエンジンに使っている'携帯動画変換ちゃん'とか'MPEG Exporter TNG'、'MoviesForMyPod'なんてのも使ってた。
データをひとまとめにして扱いたい時、配列やハッシュというデータ型を使う事が出来る。
配列は0から始まる数値で値を管理するため狙った値にアクセスするにはどんな順序で並んでいるかを把握していなければならない。
ハッシュはキーと呼ばれる(主に文字列)もので値を管理するため必ずしもその値の場所を覚えておく必要がない。というよりは逆に順番では覚えられない。
いわばデータにラベルが付いてるような物だ。
例えばaというハッシュがあれば
PHPには多次元配列をフラットにする関数は用意されていないようだ。
だが、例えばYahoo等で"array_flatten"と検索するといろんなページが引っかかってくる。
Rubyで配列をフラットにするメソッドがflattenで、PHPでは配列に対する関数の多くにarray_という接頭辞が付くのでそんな関数あるかなと思って適当に考えただけなのに。
とはいえ、すでにいたる所で"array_flatten"という名前でその目的の関数が定義されてた。
PHPのマニュアルページにもある。
久々に会社で使っているMacProを初期化してみた。
まずはOS10.5のクリーンインストール。
その後ソフトウェアアップデートをかけ、終わったらAppleのサイトからxcodeのイメージファイルをダウンロードしてインストール。
そしてmacportsのサイトからLeopard用のイメージファイルをダウンロードしてインストールする。
ここまではそれほど時間はかからないがこっからがちょっと長い。
プログラムを書いてるとき実験用のデータとして人物名が何人分か欲しいとする。
こういった事は結構あるだろう。
この場合一人一人それらしい名前を考えるのも意外と面倒だったりする。
ましてや数十人分欲しいとなると名前を考えるだけで一苦労だ。
こんなとき、例えば3人分の名字、3人分の名前をすべて組み合わせて9人分の架空人物名を作る事が出来る。
Perlの配列は以下のように宣言できる
my @Animals = qw/Dog Rat Rabbit Horse Cat Elephant/;
その後
my @a = @Animals;
とすれば変数@aには全く同じ値が格納されている。
ではこうしたらどうなるだろう?
PHPには可変関数というものがあるが、これは変数に格納された文字列を関数名として展開してくれる機能だ。
これを使用すれば、後から文字列を使って関数を呼び出せる事になる。
例えば
Pythonにも当然関数を定義したり定義した関数を呼び出したりする機能がある。
簡単な関数定義は以下のような感じだ
PerlやPHPでは文字列を連結する時と数値を足す時では演算子が違うので例えば
$num1 = 10; $num2 = 20; print $num1 . $num2."\n"; print $num1 + $num2."\n";
上の例ではそれぞれ
1020 30
と出力される。
では数値と文字列に対してそれぞれの演算子を適用してみる。
いろいろなプログラム言語があるがたいていどの言語もファイルを開いて読み書きする操作(関数やメソッド)が用意されている。
openと付く関数名が多いようだ。例えばPerlの場合は
配列の内容を処理していく時だが、交互に処理内容を変えたいときがある。
例えば要素をリストタグで囲って表示するのに背景色を交互に変えたいといった時だ。
PHPではこの作業は多分頻繁に発生するだろう。
$names = array("Tatsunori", "Koji", "Greisinger", "Hisanori", "Nomaguchi");
上のような配列があったとして
<li class="foo">Tatsunori</li> <li class="bar">Koji</li> <li class="foo">Greisinger</li> <li class="bar">Hisanori</li> <li class="foo">Nomaguchi</li>
こんな出力を得たいといった時だ。
これを実現するのはそれほど難しくない。
前回のエントリーではPythonを使い、辞書の値でソートする方法について書いたが同様の事を他の言語でやりたい時はどうすればいいか?
例によって名前と年齢のハッシュがあったとする。例えばPerlの場合、
my %smap = ('nakai' => 36, 'kimura' => 35, 'katori' => 31, 'kusanagi' => 34, 'inagaki' => 34);
こんなデータがあり、これを年齢でソートしてみる。
ざっとこんな感じだ。
Pyhonでリストをソートしたい時はリストのsortメソッドか組み込みのsorted()関数がある。
どちらも特に難しくない。例えば
Pythonの名前空間はちょっとした曲者だ。
モジュールのトップレベルでだけでプログラミングしているだけなら気にする事は無いが関数を定義してたりすると注意が必要だ。
Pythonで関数定義をした場合新たに関数内だけのスコープが作られる。いわゆるローカルスコープだ。
ただし、変数を参照するだけならばグローバルな変数にもアクセスできる。
例えば
Pythonのデータに辞書という型があるが、これは他の言語でいうハッシュや連想配列と思って大丈夫だろう。
言語によって違いはあるが普通に
uniform_number = { 'Hisanori': 21, 'Tatsunori': 88, 'Greisinger': 29, 'Takuya': 0 }
などとして
print uniform_number['Hisanori']
とすれば
21
と出力される。
最近のjavascriptの開発環境は"Firebug"等のおかげでずいぶんやりやすくなってきた。
safariにも開発メニューが標準で表示されるようになりここから"Webインスペクタを表示"を選ぶとウインドウが開く、このウインドウの"Console"ってとこを選択すると、いろんなコマンドライン(javascriptの式)を記述する事でちょっとした値の確認等が出来るようになっている。
同様にOperaもツールメニューから詳細ツール→開発者用ツールを選択するとそれらしきものが出てきてそれらしきことが出来る。
Javascriptライブラリ「prototype.js」のinsertメソッドの簡単なテスト。
以下のような単純なファイルがあったとしてその中のid"div1"に対してそれぞれ値を変えながらinsertを呼び出してみる。
Rubyを使って簡単なクラスを定義してみる。
class Person attr_reader :name def initialize(name) @name = name end end
2年ほど前だがWebページの制作をしている時cssファイルを動的に書き出せないものかと考えた事があった。
書き出すというよりはcssファイル自体をPHPファイルとして記述してHTMLのヘッダ部分で
以前のエントリーでも似たような事を書いたが、Pythonのリスト用のメソッドでsortやreverseがあるが、これらは自身を書き換えてしまういわゆる破壊的なメソッドだ。
そして意味のある値は返さないのでforループなどでは使えない。
前回のエントリーでmap関数(mapメソッド,map演算子)について書いているが、書いているうちにいろいろと気づく事があった。
たとえばRubyのコード
#!/usr/bin/env ruby Dir.chdir File.dirname(ENV["_"]) Dir.open(".") do |dir| fileAndSize = dir.select {|i| i =~ /^[^.]/}.map {|i| [i, FileTest.size(i)]} fileAndSize.each {|l| puts "#{l[0]} => #{l[1]}byte"} end
では、まずEnumerableモジュールのselectメソッドを呼び出しリストの内容をふるいにかけた後mapメソッドで変換の作業をしている。
次の部分だ。
リスト(配列等)の内容を元に別の内容に変換したリストが欲しい時map関数(メソッド)が使える。
まずは簡単なサンプルを