リストと辞書と繰り返し

○回繰り返す >>> for i in range(0, 5): ... print u"%d回目" % (i + 1), ... 1回目 2回目 3回目 4回目 5回目 >>> >>> for i in xrange(0, 5): ... print u"%d回目" % (i + 1), ... 1回目 2回目 3回目 4回目 5回目 range() はリストを作って繰り返します。xr…

cursesサンプル

cursesというのは端末操作用のライブラリです。キーボードから入力を受け取ったり、画面に文字を表示したり、サブウィンドウを作ったり、カーソルを自由に移動させたりできます。もしかしたら vim っぽいものも作れるかもしれません。僕には vim は無理っぽ…

オブジェクトの要素を一つずつ取り出す

反復可能なオブジェクト for i in x: print i l = [n for n in x if n % 2] x は要素を一つずつ取り出せる反復可能なオブジェクトです。反復可能なオブジェクトは __iter__() でイテレータオブジェクトを返す必要があります。 class Test: def __iter__(self…

クラスについて

クラス定義とインスタンスの作成 class Test: pass 何もしないクラスを定義しています。 クラス名を関数のように呼び出して、インスタンスを作ります。 t = Test() print t #=> <__main__.Test instance at 0x009AD3A0> インスタンスメソッド class Test: def __init__(self, x=0, y=0): self.x = x</__main__.test>…

リスト内包表記

数値のリストから偶数だけを取り出して新しいリストを作ります。 nums = range(1,10) list1 = [] for n in nums: if not n % 2: list1.append(n * n) print list1 #=> [4, 16, 36, 64] 同じことをリスト内包表記を使って書くと、以下のようになります。 list…

これはひどい、と思う記事を見つけたら

とりあえずブクマをチェックします。そして「これはひどい」というタグがたくさん付けられていたら、ホッとしてしまいます。自分は普通なんだ。自分は多数派なんだ。そう思って安心してしまいます。はてブの利用者なんて社会全体から見れば少数派であるにも…

引数の受け取り方

仮引数にデフォルト値を設定する def test1(a, b, c=3): print a * b * c test(1, 2, 6) #=> 12 test(1, 2) #=> 6 a と b は必須、c はデフォルト値が設定されているので省略可能です。 デフォルト値が設定されるのは1回目の関数呼び出しの時だけです。つま…

引数の渡し方

def test(a, b, c=0, d=0, e=0): print "a=%d" % a, print "b=%d" % b, print "c=%d" % c, print "d=%d" % d print "e=%d" % e という関数があるとします。a、b は必須の引数、c、d、e はデフォルト値の設定されたオプションの引数です。 値だけを渡す test(…

lxmlでXMLをパースする

lxml を使ってItemSearchの結果をパースしてみます。 etree でXMLをパースする from lxml import etree root = etree.parse(sorce, parser=etree.XMLParser()) print root #=> <lxml.etree._ElementTree object at 0x01292850> source に指定できるのは、Fileオブジェクト、Fileオブジェクトと同じ read() </lxml.etree._elementtree>…

日本語を使う

str1 = "ほげ" str2 = r"ほげ" これらは文字列ですが、正確に言うと、指定された文字コードで変換されたバイト列というものです。 文字単位ではなくバイト単位で処理されるので、日本語のように1文字を2バイト以上で表すものを正しく扱うことができません。 …

文字列

文字列の扱いが Perl と少し違っていて戸惑ったのでメモ。 print は改行される print "hoge" print "hoge" hoge hoge 改行させたくない場合は、最後にカンマを置きます。 print "hoge", print "hoge hoge hoge ダブルクォートとシングルクォートの区別はない…

urllib2でWebからデータを取ってくる

急にPythonをいじってみたくなったのでインストールしました。とりあえずECS 4.0からデータを取ってくるスクリプトを書いてみます。 #!python # vim: fileencoding=utf-8 1行目はPerlと同じです。2行目はソースコードの文字コードを指定しています。必要なの…

スタイルシートでボックス要素のセンター寄せ

#body { margin:0 auto; width:600px; } IEの場合はドキュメント宣言が必要。

ECS 4.0とCGI::ApplicationでWebアプリを作る #05

UTF8フラグが付いていると、テンプレートに渡したときに文字化けするので、UTF8フラグを落とす。 sub get_browse_node { my ($self, $browse_node_id) = @_; my $browse_node_file = File::Spec->catfile( $self->param("browse_node_dir"), "$browse_node_i…

ECS 4.0 + CGI::ApplicationでWebアプリを作る #04

とりあえずトップページを表示するところまで完成。が、行き当たりばったりなもので、明日には少しばかり中身が変わっているかもしれない。 # トップレベルのブラウズノードとその子ノードを表示 sub do_index { my $self = shift; # テンプレートに渡すデー…

ECS 4.0 + CGI::ApplicationでWebアプリを作る #03

設定ファイルを使うのを止めて、トップレベルのブラウズノードだけ別ファイルから読み込むことにする。 sub cgiapp_init { my $self = shift; # トップレベルのノードのリストを読み込む eval { $self->{__TOP_LEVEL_NODE_LIST} = YAML::Syck::LoadFile("top…

ECS 4.0 + CGI::ApplicationでWebアプリを作る #02

変数は直接記述せずに、設定ファイルから読み込むことにする。 # 設定ファイルにYAMLファイルを使用するためのプラグイン use CGI::Application::Plugin::Config::YAML; # インスタンス作成時に呼び出されるメソッド sub cgiapp_init { my $self = shift; # …

ECS 4.0 + CGI::AppplicationでWebアプリを作る #01

CGI::ApplicationはWebアプリを作るためのフレームワーク。やることは大きく分けて三つ。 何種類のページを作るかを決める 各ページに対応するメソッドを、CGI::Applicationのサブクラスで定義する。 2のクラスのインスタンスを作成し、runメソッドを呼び出…

utf-8でプルダウンメニューに日本語を使うとWin IEで文字化けする件

スタイルシートで font-family: sans-serif を指定すると文字化けしなくなった。 <select style="font-family: sans-serif;"> <option value="hoge">hoge</option> <option value="j-hoge">ほげ</option> </select>

GetOpt::Longでコマンドラインオプションを処理する

引数を取らないオプション use Getopt::Long; my $flag = 0; my $count = 0; GetOptions( "flag" => \$flag, # --flagで$flagを1にする "flag!" => \$flag, # --noflagで$flagを0にする(反転オプション) "count+" => \$count # --countの数だけ$countを増…

バッファリング

バッファとはデータを一時的に保存しておく場所。バッファリングとはデータをバッファに保存すること。print関数はバッファリングを行い、データがある程度溜まってから、まとめて出力するようになっている。 ファイルに出力する場合は一定のバイト数を超え…

正論は 言うものではなく 言わせるもの

正しいことだとわかっているのにできないことがある。 わかっているのになんでできないんだ、と言われる。 できないということは、本当はわかっていないのかもしれない。 わかっているつもりなのに、できていないことを指摘されると痛い。 痛いから無視する…

配列の各要素を組み合わせて二次元配列を作る

#!/usr/bin/perl use strict; use warnings; use Data::Dump qw(dump); my @al = qw(1 2 3); my @bl = qw(a b c); my @list; for my $a (@al) { for $b (@bl) { push @list, [$a, $b] } } print dump(@list); ( [1, "a"], [1, "b"], [1, "c"], [2, "a"], [2,…

CGIでセッションを使用する

#!/usr/bin/perl use strict; use warnings; use CGI; use CGI::Cookie; use CGI::Session; my $q = CGI->new; # セッションIDを取得 my $sid = $q->param("CGISESSID") || undef; # セッションIDからCGI::Sessionオブジェクトを作成 my $session = CGI::Ses…

Amazonからデータを取得して、ハッシュに変換する

というモジュールを作ってみた。XML::SimpleやXML::LibXML::Simpleを使った方が楽なんだけど、 $xml->{BrowseNodeResponse}->{BrowseNodes}->{BrowseNode}; というふうに書くのが面倒なので、XML::LibXMLを使って任意のハッシュデータを作るようにしてみた。…

アダルト商品の判別

ResponseGroupにItemAttributesを指定して、ItemAttributes/IsAdultProductが1ならアダルト商品。

バッチリクエストでResponseGroupを指定すると、内部サーバーエラーになる

#!/usr/bin/perl use strict; use warnings; use URI; use LWP::UserAgent; my $uri = URI->new("http://webservices.amazon.co.jp/onca/xml"); $uri->query_form( Service => "AWSECommerceService", Version => "2008-04-07", AWSAccessKeyId => $access_k…

型グロブとシンボリックリファレンスで動的にメソッドを追加する

#!/usr/bin/perl use strict; use warnings; package Hoge; sub new { my $class = shift; return bless {}, $class; } sub mk_accessor { my ($self, $accessor) = @_; my $class = ref $self || $self; my $code = sub { my $self = shift; $self->{$acces…

型グロブ

型グロブは識別子の前に*を付けて表し、別名を付ける時などに使う。 *bar = *foo; これで、fooという識別子でアクセスできる変数やサブルーチンに、barという識別子でもアクセスできるようになる。 $foo = "hoge"; @foo = (1, 2, 3); %foo = (a => 1, b => 2…

シンボリックリファレンス

例えば、$strの値が"hoge"だとして、 print $$str; # $hogeの値を表示 push @$str, 1; # @hogeに要素を追加 $str->{a} = 1; # $hoge{a}に代入 &$str(); # &hoge()を呼び出す というようなことができるのが、シンボリックリファレンス。使い方は普通のリファ…