Shin x blog
心に残る6個の言葉
- 2010-03-02 (火)
- 雑記
自分の心にある道標というか心に響いた言葉を書き出してみました。
自分なりの解釈を書いていますので、実際に発言された方の本意からずれている可能性もあります。その方にご迷惑がかかるといけないので、ここではお名前は書いていません。
中には同じような言葉を何人もの人に言われてるのもありますし、言った人も何かから引用しているかもしれません。
「あーそれオレ言った!」という人は間違い無いです。あなたに教えて貰った言葉です。
※「それ消して!」「それオレの言葉だから名前書いといて」という方はご一報下さいm(_ _)m
1. 良い人 > 悪い人 > [超えられない壁] > 知らない人
良い評価も悪い評価もとりあえず知られないことには始まらない。
まずは知って貰うことが大事。
この言葉は、何かを始めようする時や初めての人に会う(勉強会等も含む)時に思い出して、自分に発破をかけるようにしています。
2. ネットのネガティブなコメントは、ほとんどが嫉妬
自分のblogやサービスへネガティブなコメントが付いたときの心の対処法。
blogやTwitter、はてブ等々でコメント貰えるは基本とっても嬉しいですが、中には批判や非難があります。間違いの指摘や「自分はこう思う」というコメントはとっても勉強になるので大歓迎なのですが、根拠無く非難されると良い気はしません。正直腹も立ちます。
そんなときにはこの言葉で「あーそういうもんかなー」と思って、むしゃくしゃした思いを捨てています。
反対に自分が他の人の何かを見て、なぜかイライラするときは、これを思い出して「オレ嫉妬してる?」と自問自答します。
1. の考えでいけば、悪い評価が付くというのは少なくとも知って貰えているので、まあ良しというのもありますけどね。
3. なにより大事なのは心の平穏
これもネットとの付き合い方で大事なこと。
ネットにある何かでイライラ、ムカムカした時は、PC閉じて外に出てしまいます。
たいていのことはネットにさえ繋がなければ追いかけてきません。落ち着いたらまた戻れば良いのです。
4. 今やっておけば二度とやらなくて良い
これは仕事上で出会った言葉。
打ち合わせなんかでよくありがちな「結論が何も決まらずにだらーと終わる」パターンです。そんな時にある方からこの言葉を聞きました。
仕事と対峙する上でとても大事なことだと思います。
時間は有限ですが、やるべきこと、やりたいことはどんどんと増えていきます。今取り組んでいる事柄は決まった時間で決着を付けて、次へ次へと進んでいく必要があります。
あと一歩、あと半歩やってしまえば終わるのに、どうしても面倒になって先延ばしにしてしまう。
そんな時にこの言葉を思い返して、同じことを何度もやらないように、やらないで済むように一定の決着が付くまでやり遂げるようにしています。
5. 環境は与えられるものではなく、自分で作るもの
学校や職場で環境について愚痴っていた時に諭された言葉。
以前は環境や状況のせいにしてぐちぐちと文句を言っていました。環境は与えられるもの、誰かが用意して当たり前のものという甘えがずっとありました。
そんな時に言われたこの言葉にはガツンとやられました。何もやらずに文句だけ言ってても何も変わらないな、と。
今でもともすれば忘れがちなことなので、時折反芻するようにしています。
6. 何をすべきかではなく、どうなりたいか
何かを判断するときの羅針盤に。
日常はやらないといけないことに捕らわれがちなので、これはどうなるためのことなのか、どうあることが目的(目標)なのかを考えて迷子にならないようにしています。
目的からの逆算で行くと実は目の前のタスクは意味を成していなくて、別の解決策が見つかったりすることもあります。
自己啓発系の本では人生の歩み方やキャリアを積み重ねる方法として良く紹介されていますが、そんな大げさなところじゃなくてもごく身近なところでも使えます。
主体性を持つ
大事なことは周りに流されすぎずに主体性を持つことですね。
人の声は気になりますし、もちろん聞くことは大切なのですが、あくまでも核となるのは自分で、自分が考えた結果の行動でなければいけないということです。
何かのせいにするのは簡単です。「誰それが言ったから」「環境が無いから」。。。
全てが理想的に揃う状況などまずあり得なくて、何かしら足りない、問題があることがほとんどだと思います。そんな中で自らがどのように考え、行動するかが大事だということを忘れないにしたいものです。
- コメント (Close): 0
- トラックバック: 1
Twitter キーワードがつぶやかれた数をリアルタイムで比べる方法
- 2010-02-23 (火)
Twitterであるキーワードがどの程度つぶやかれているかをお手軽に見る方法です。
キーワード
今日まさに旬な「R1」「ドラマ」「オリンピック」が、Twitter上でどれくらいつぶやかれているかを調べます。
方法はいたって簡単。
Twitter公式検索(search.twitter.com)で調べたいキーワードを検索するだけです。
複数のキーワードを調べる時はブラウザのタブを追加して、検索します。
検索した直後のタブは以下のようになります。各タブには検索したキーワードが表示されていますね。
これをしばらくそのまま放置しておくと、その間にキーワードにマッチするつぶやきの件数が表示されます。
さらに放置すると件数が増えていきます。
Twitterドラマのおかげか「ドラマ」が伸びていますね。
URL
次は、あるサイトのURLがどれくらいつぶやかれているかを見てみます。
キーワードと同じようにsearch.twitter.comで検索しても良いのですが、なぜか取りこぼしが多いようなので、別サイトのbacktweets.comというサービスを利用します。
最近はやっている○○ったージェネレータサイトの「ツイットメーカー」と「なんでもメーカー」を見てみましょう。
ブラウザでタブを2枚開いておいて、各々のタブでbacktweets.comへURLを入力します。どちらのサービスもサイトへのURLが書かれているのですが、ドメイン部分などサービス内で共通の部分を入力します。
ツイットメーカーなら
なんでもメーカーなら
これを検索した状態です。お互いのURLがタブに表示されています。
これもしばらく放置しておくと、その間にURLがtweetされた数がタブに表示されます。
例えばこんな使い方
いろいろと使い方は考えられると思いますが、例えばこんな使い方。
- はやりのキーワードを比べる
- はやりのサイトを比べる
- 同時期に開催しているイベントのハッシュタグを比べる
などなど。
仕掛けておくとドンドン数字が増えていくので眺めていると面白いですね。気になるキーワードがある方はお試しを:D
- コメント (Close): 0
- トラックバック: 0
約半月で 4,000,000PV を華麗にさばく Google App Engine
- 2010-02-17 (水)
- Google App Engine(GAE) | Webサービス
「なんでも判定ツクール」へ多数のアクセスありがとうございますm(_ _)m
1月末にリリースした当初は僅かのアクセスだったのですが、Twitterで火が付いてからは一気にアクセスが集まり、気が付けば2月1日〜2月16日で4,000,000PVを超えました。
自分では絶対に考えつかないであろうユニークな判定がたくさんできて、私自身もとても楽しんでいます:-D(面白い発想をする人は世の中にたくさんいるものです)
このサイトはGoogle App Engine(GAE)+Pythonで構築しているのですが、このアクセス数ならではのGAE上で体験できたことをざざっと書いていきます。
無料?課金?
まずはじめに大事なこと。
「なんでも判定ツクール」ではGAEを課金状態にしています。無料のQuotaではとてもではないですが、このアクセスは捌けません:D
GAE公式サイトには
月間約 500 万ページ ビューに対応できる十分な CPU と帯域幅を、すべてのアプリケーションで完全に無料で利用できます。
Google App Engine について – Google App Engine – Google Code
といった記載があるのですが、少なくともDataStoreを使うような動的サイトでは5,000,000PV/月を無料Quotaで捌くのはかなり難しいと思います。
秒間200リクエスト
アクセスは日によって時間によってバラツキがあるのですが、瞬間最大風速では200超req/s(GAE DashboardのChart上)を記録しました。
この200req/sを記録したのは 2010/02/15 夜だったのですが、ブラウザでサイトにアクセスする分にはそれほど重さは感じませんでした。ですが、実は裏では結構なアクセスをさばいてくれています。
これはGAEの真骨頂とも言える「チャージ金額上限まで自動でリソースを割り当ててくれる」サービスのおかげですね。まさにクラウドです。チャージ上限金額までは負荷に合わせて勝手にリソースを確保していってくれるので、アクセスどんと来いという気持ちになります(比例して財布は少し寂しくなりますが><)
もちろん、これにはアプリケーションの設計も大きく関連します。いくらプラットホームであるGAEがスケールしていっても、アプリケーションがそれを想定していた作りになっていなければアプリケーション側がボトルネックとなります。「なんとか判定ツクール」は業務システムに比べると単純な作りになっているので、このあたりもGAEのスケーリングの恩恵が受けやすいということはあるでしょうね。
1日680,000PV
1日単位で見ると 2010/02/09 に 680,000PV を記録したのが最高値でした。
数値はGoogle Analyticsに記録されたものです。これはPC版の数字なので携帯版を加えるともう少し上乗せされます。
この日は秒間リクエストのピークは160くらいだったのですが、ピーク時以外もアクセスが続いたのでPVが伸びました。PVが伸びた分、課金額も一番です。
この数値を元に単純計算すると 680,000 * 30 = 20,400,000PV/月 はこなせそうです。
DataStoreの総エンティティ数が3,000,000
DataStoreのエンティティ数(RDBMSのレコード数のようなもの)の合計が3,000,000を超えました。
DataStoreにはいくつかのkind(テーブルのようなもの)があるのですが、これは全ての合計です。
中でも一番多いのが判定結果を表すエンティティで、1,500,000くらいです。つまりこれは延べ1,500,000回の判定(!)が行われたということです。(実際は、1,600,000エンティテイあるのですが、初期アプリケーションのゴミデータが含まれるので実質は1,500,000程度。)
これだけのデータがあってもキーを使った読み込みならとても高速に動作します。(これくらいのデータ量ならインデックスが効けばRDBMSでも早いですけどね。)
DataStoreエラー
負荷が上がった際、サイト自体は概ね動いているのですが、実はDataStore周りでいくつかエラーが発生しています。
例えば、平常時は瞬時に返答がある Model.get_by_key_name() でデータを取得するという単純な処理でも高負荷時は DeadlineExceededError が発生する場合があります。
これは避けがたい現象のようなので、クライアント側でリトライ処理を実装するなどして上手く付き合うしかないようです。
bit.ly
当初、判定結果をTwitterに報告する際にURLを短縮する方法としてbit.lyのAPIを利用していました。
これはとても上手く動いていたのですが、アクセス数が伸びるのに従って、bit.ly APIでエラーが発生するようになりました。一度この状態になるとエラーレスポンスが返ってくるばかりで短縮URLへの変換を行ってくれません。数十分経過すると復活するのですが、また負荷がかかると停止してしまいます。
bit.ly API のドキュメントでは1IPあたり同時アクセス数5未満とされているので、制限を超えるアクセスで止められるのは当然だと思います。なのでこれに関しては利用させて頂いてありがとうございますと、ごめんなさいという感じです。
いくらGAE自体がスケールしても、外部サービスに引っ張られて処理できないと元も子もないので、結局短縮URL機能を自作しました。
これには @kis さんとのTwitterでのやりとりが大いに参考になりました。ありがとうございました!
サイボウズさんキャンペーン
サイボウズさんのキャンペーンにて「なんでも判定ツクール」を利用して頂きました。
=>サイボウズコミュニティ – 特集 – 【終了しました】サイボウズ謹製ツバメノートプレゼント!
サイボウズさんにまつわる判定をやって、Twitterで報告するとノベルティが貰えるというキャンペーンだったのですが、多くの方が参加されて盛り上がったようです。
こういったキャンペーンに使えるという視点は当初は持っていなかったので面白かったです。
今後も絶賛募集中ですので、キャンペーンに使ってみたい、という方はご一報頂ければ嬉しいです:D
Google App Engineは使える!
「なんとか判定ツクール」を運営している感覚では、今更ながらですが、やはりGAEは十分に使えるなという印象を持ちました。
なんといってもチャージさえしておけば自動的にスケールしてくれる感覚は素晴らしいですね。これまで突発的な負荷に悩まされた経験がある方なら有難みが特に分かると思います。
もちろんGAEならではの制約(処理時間やDataStore仕様等々)があるので全てのアプリケーションをGAE上で動かすべきとは思わないですが、特性にマッチするアプリケーションであれば検討してみる価値がありますよ。
え、PHPしか書けない?PHP書けたらPython書けます。大丈夫:-D
- コメント (Close): 6
- トラックバック: 3
Google App EngineのUser-Agent
- 2010-02-16 (火)
- Google App Engine(GAE) | Python
Google App Engine(GAE)からHTTPアクセスするときのUser-Agentについて。
GAE上のアプリケーションがHTTPアクセスする際にどのようなUser-Agentになるかを調べてみました。環境は、Python2.5.4 + Google App Engine SDK 1.3.1 です。
GAE+PythonからHTTPアクセスするには幾つかの方法があるのですが、urllib2を使う方法とGAEのモジュールであるurlfetchモジュールを使う方法について見ています。
urllib2
urllib2でアクセスした場合のUser-Agentです。
特徴的なのは「AppEngine-Google」が付いているのとアプリケーションIDである「appid: XXXX」が付加されていることですね。アプリケーションIDはGAE上の各アプリケーションに割り振るIDで一意となります。
もしGAE上のあるアプリケーションからのアクセスを制御(許可、拒否等)したい場合は、このアプリケーションIDを見れば可能です。
"Python-urllib/2.5 AppEngine-Google; (+http://code.google.com/appengine; appid: XXXX),gzip(gfe)"
urlfetch
urlfetchでアクセスした場合です。
urllib2と比較すると「Python-urllib/2.5」が無い他は同じですね。
"AppEngine-Google; (+http://code.google.com/appengine; appid: XXXXX),gzip(gfe)"
User-Agentを変更した場合
urllib2でもurlfetchでもUser-Agentを変更することができるので、変更してアクセスしてみました。
# -*- coding: utf-8 -*- url = "http://www.exaple.com/" # urllib2 import urllib2 opener = urllib2.build_opener() opener.addheaders = [('User-agent', 'PHP5.3.2')] try: opener.open(url) except: pass # urlfetch from google.appengine.api import urlfetch urlfetch.fetch(url, headers={'User-Agent': 'CakePHP1.2.6'})
結果はどちらも変更したUset-Agentにはなっているのですが、AppEngine-Google以降の文字列が付加されています。もちろんappid:も付いているので、User-Agentを変更していてもアプリケーションIDによるアクセス制御は可能です。
urllib2
"PHP5.3.2 AppEngine-Google; (+http://code.google.com/appengine; appid: XXXXX),gzip(gfe)"
urlfetch
"CakePHP1.2.6 AppEngine-Google; (+http://code.google.com/appengine; appid: XXXXX),gzip(gfe)"
urllib2でUser-Agentを変更しない場合に「Python-urllib/2.5」が付くのは内部的にUser-Agentを設定しているだけの話です。
アクセス制御はアプリケーションIDで
GAEではサーバ環境を全ユーザで共有するので、IPアドレスでの制限はできません。(GAE全体からのアクセスを制限することはできるかもしれませんが。)
ただアプリケーションIDであればアプリケーション固有に付いている値なので、これを使えば特定のアプリケーションに対してだけ制御が可能です。User-AgentへのアプリケーションID付与(appid:)はGAE自体が行うので今のところ信頼して問題無いと思います。
時間が経つ毎に進化していくGAEですが、こういったところも気が利いていますね。
[参考] Apacheでアクセス制限 mod_access – Apache HTTP サーバ
- コメント (Close): 0
- トラックバック: 2
携帯版Twitterサイトへのステータス付きリンク
- 2010-02-15 (月)
携帯版Twitterサイトにステータス付きリンクを貼る方法です。
Webサービスやblogによくある「Twitterで報告する」といったリンクですね。
クリックするとTwitterページに遷移して、ステータス(つぶやき)を入れるテキストエリアにすでにメッセージが入っています。あとは「UPDATE」をクリックするだけで、つぶやくことができます。
PCだと「http://twitter.com/home?status=AAA」がおなじみなのですが、この方法だと携帯版(twtr.jp)ではステータスがうまく引き継げずにstatus=AAAの内容がテキストボックスに入りません。
携帯版ではリンクの記載方法を変えることにより、同じ動作が可能です。
携帯版ステータス付きリンク
これはリンク先とパラメータが変わるだけです。
http://twtr.jp/status/create/?text=XXX
XXXがテキストボックスにセットしたい内容です。
ただtwtr.jpではキャリアによって文字エンコーディングが異なるのでXXXの部分のエンコーディングをキャリアに合わせて記述してやる必要があります。
キャリア別文字エンコーディング
キャリアに合わせて以下の文字エンコーディングで記述します。
DoCoMo | au | SoftBank |
---|---|---|
utf-8 | CP932 | utf-8 |
DoCoMoはcookie対応機が手元に無かったので試していません。誰かもし持っていれば「なんでも判定ツクール」で試して頂ければ嬉しいです:-D
追記:DoCoMoですがutf-8で問題無いそうです。@H_O_0221さん、テストありがとうございました!
なんでも判定ツクールでは、基本UTF-8で記述しておいて、auだけCP932に変換しています。
URLエンコーディングを忘れずに
どの文字エンコーディングに変換してもXXXの部分はURLエンコード(PHPならurlencode())する必要がありますので、お忘れなく。
- コメント (Close): 0
- トラックバック: 1
PHP基礎文法最速マスター
- 2010-01-27 (水)
- PHP
PerlとRubyの文法一覧がとても良くまとまっていたので、便乗してPHPでもやってみました。
他の言語をある程度知っている人はこれを読めばPHPの文法を何となく理解できると思います。
間違い、不足等々あれば教えて下さいm(_ _)m
バージョン
PHP5.3系がリリースされていますが、ここではPHP5.2系を対象としています。
1.基礎
コードブロック
PHPコードは「<?php」という開始タグから始まります。終了タグは「?>」です。HTMLにPHPコードを埋める際は終了タグを使いますが、ライブラリのようにPHPコードのみを記述する際は終了タグを省くことが慣例となっています。
終了タグを省く理由について id:Kiske さんに解説頂いています。ありがとうございます。
PHP基礎文法最速マスターの補足 – Absolute Playing!
<?php hoge(); ?> <?php $i = 1; hoge($i); ?>
<?php hoge(); [/php] <h4>print文</h4> <p>print/echoを使います。</p> <?php print "Hello World!"; echo "Hello World!"; [/php] <p>デバッグにはvar_dump()をよく使います。var_dump()では変数の内容が出力されます。</p> <?php $array = array(1,2,3); var_dump($array); array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) }
コメント
一行コメント
// コメント # コメント
複数行コメント
/* コメント コメント */
変数の宣言
変数の宣言です。
$a = 'string'; $i = 1;
スクリプトの実行
コマンドラインでPHPファイルを実行します。
$ php hoge.php
PHPコードを直接記述することもできます。<?php ?>は不要です。
$ php -r "var_dump('a');"
出力結果をファイルに書き出すにはリダイレクトを使います。
$ php hoge.php > out
スクリプトの文法チェック
phpコマンドで文法がチェックできます。
$ php -l hoge.php
2. 数値
数値の表現
数値には整数、浮動小数点があります。
<?php $int = 100; $float = 100.123; [/php] <h4>四則演算</h4> <?php $i = 1 + 1; $i = 1 - 1; $i = 1 * 1; $i = 1 / 2; [/php] <p>余りと商。商を求めるには普通の除算を行った後にintval関数で整数部を取り出します。</p> <?php $div = intval(3 / 2); // 商 $mod = 3 % 2; // 余り [/php] <h4>インクリメントとデクリメント</h4> <?php $i++; // インクリメント $i--; // デクリメント [/php] <h3>3. 文字列</h3> <h4>文字列表現</h4> <p>文字列はシングルクォートかダブルクォートで囲みます。ダブルクォートの中では\t(タブ)や\n(改行)などの特殊文字を利用することができます。またダブルクォートで囲まれた文字列の中では変数展開することができます。</p> <?php $str1 = "abc\tcde"; // abc cde(\tがタブ[0x09]) $str2 = 'abc\tcde'; // abc\tcde(\tが文字列) $str3 = "$str1 100" // abc cde 100 //$str1が展開される $str4 = "{$str1}100" // 変数名に文字列が繋がる時は{}で囲む [/php] <h4>文字列操作</h4> <?php // 結合 $join1 = 'aaa' . 'bbb'; $join2 = implode(',', array('aaa', 'bbb', 'ccc')); // 分割 $split = explode(',', 'aaa,bbb,ccc'); // 長さ $length = strlen('abcdef'); // 長さ(マルチバイト) // 内部エンコーディングの設定が必要 // mb_internal_encoding('UTF-8'); $mb_length = mb_strlen('あいうえお'); // 切り出し $substr = substr('abcd', 0, 2); // ab // 検索 $index = strpos('abcd', 'bc'); // 見つかったらその位置(先頭が0)、見つからなかったらfalseが返る [/php] <h3>4. 配列、連想配列</h3> <p>PHPには連想配列しかありません。配列はキーが数値の連想配列として表現されます。また順序を持っています。</p> <?php $array1 = array(1, 2, 3); // 配列(キーが0から始まる連想配列) $array2 = array('a' => 1, 'b' => 2, 'c' => 3); // 連想配列 $array3 = array(1, 'a' => 1, 2); // 混在もok
要素の参照と代入
<?php $i = $array1[0]; $s = $array2['a']; [/php] [php] <?php $array1[3] = 1; $array2['z'] = 'zzz'; [/php] <p>要素の個数</p> <?php $len = count($array1); [/php] <h4>配列の操作</h4> <?php $array = array(1, 2, 3); // 先頭を取り出す $first = array_shift($array); // $first = 1 / $arrayは、(2, 3) // 先頭に追加 array_unshift($array, 5); // $arrayは、(5, 2, 3) // 末尾を取り出す $last = array_pop($array); // $last = 3 / $arrayは、(5, 2) // 末尾に追加 array_push($array, 9); // $arrayは、(5, 2, 9) [/php] <h4>連想配列に関する関数</h4> <?php // キーの取得 $keys = array_keys($array); // 値の取得 $values = array_values($array); // キーの存在確認 $boolean = array_key_exists('key', $array); // キーの削除 unset($array['key']); [/php] <h3>6. 制御文</h3> <h4>if文</h4> <?php if (条件) { } [/php] <p>HTML内で記載する際は以下のような記法も用いられます。</p> <?php if (条件): ?> <span>hoge</span> <?php endif; ?>
if 〜 else文
<?php if (条件) { } else { } [/php] <p>HTML内で記載する際は以下のような記法も用いられます。</p> <?php if (条件): ?> <span>hoge</span> <?php else: ?> <span>foo</span> <?php endif; ?>
if 〜 else if 文
elseif or else ifが可。
<?php if (条件) { } else if { } [/php] <p>HTML内で記載する際は以下のような記法も用いられます。</p> <?php if (条件): ?> <span>hoge</span> <?php elseif (条件): ?> <span>foo</span> <?php endif; ?>
while文
<?php $i = 0; while ($i < 5) { // 処理 $i++; } [/php] <p>HTML内で記載する際は以下のような記法も用いられます。</p> <?php while ($i < 5): ?> <span><?php echo htmlspecialchars($i); ?></span> <?php $i++; ?> <?php endwhile; ?>
for文
<?php for ($i = 0 ; $i < 5 ;$i++) { } [/php] <p>HTML内で記載する際は以下のような記法も用いられます。</p> <?php for ($i = 0 ; $i < 5 ; $i++): ?> <span><?php echo htmlspecialchars($i); ?></span> <?php endfor; ?>
foreach文
連想配列の各要素を処理できます。
<?php foreach ($array as $v) { // $v が要素の値 } foreach ($array as $k => $v) { // $k が要素のキー、$v が要素の値 }
HTML内で記載する際は以下のような記法も用いられます。
<?php foreach ($array as $v): ?> <span><?php echo htmlspecialchars($v); ?></span> <?php endforeach; ?>
7. サブルーチン(関数)
PHPには関数があります。戻り値を返却するにはreturnを使用します。
<?php function sum($v1, $v2) { return $v1 + $v2; } $total = sum(1, 2); // $total = 3 // 配列で多値を返すこともできます function get_multi($v1, $v2) { $v1 += 100; $v2 += 200; return array($v1, $v2); } list($ret1, $ret2) = get_multi(1, 2); // $ret1 = 101 / $ret2 = 202 [/php] <h3>8. ファイル入出力</h3> <p>ファイル入出力にはいくつかの方法があります。</p> <h4>fopen関数</h4> <p>ファイルポインタを使ってファイルの入出力を行います。</p> <?php // 読み込み $fp = fopen("/path/to/file", "r"); if (!is_resource($fp)) { die("can't open file"); } while (!feof($fp)) { $line = fgets($fp, 4096); // 何か処理 } fclose($fp); // 書き込み $fp = fopen("/path/to/file", "w"); if (!is_resource($fp)) { die("can't open file"); } fputs($fp, $buff); fclose($fp); [/php] <h4>file関数</h4> <p>ファイル全体を読み込んで配列に格納します。</p> <?php $list = file("/path/to/file"); // ファイルの各行を連想配列で取得 [/php] <h4>file_get_contents関数 / file_put_contents関数</h4> <p>file_get_contents関数はファイル全体を読み込んで文字列として格納します。file_put_contents関数は変数の値を全てファイルに書き込みます。</p> <?php // 読み込み $contents = file_get_contents("/path/to/file"); // ファイルの内容を取得 // 書き込み file_put_contents("/path/to/file", $buff); // ファイルに $buff の内容を書き込み [/php] <h3>知っておいた方が良い文法</h3> <h4>真偽値</h4> <p>PHPでは以下の場合、偽と判断されます。</p> <ul> <li>boolean の FALSE</li> <li>integer の 0 (ゼロ)</li> <li>float の 0.0 (ゼロ)</li> <li>空の文字列、 および文字列の "0"</li> <li>要素の数がゼロである 配列</li> <li>メンバ変数の数がゼロである オブジェクト (PHP 4のみ)</li> <li>特別な値 NULL (値がセットされていない変数を含む)</li> <li>空のタグから作成された SimpleXML オブジェクト</li> </ul> <h4>==と===</h4> <p>==/!=といった比較演算子では、数値・文字列の自動変換が行われます。よって意図しない結果をもたらす場合があります。</p> <?php var_dump(1 == 1); // true var_dump(1 == '1'); // true var_dump(0 == 'a'); // true var_dump(100 == '100a'); // true var_dump('+1' == '1.0'); // true [/php] <p>こういった場合、===/!==を使うと変数の型も厳密に比較することができます。</p> <?php var_dump(1 === 1); // true var_dump(1 === '1'); // false var_dump(0 === '0'); // false var_dump(100 === '100a'); // false var_dump('+1' === '1.0'); // false [/php] <h4>変数が定義されているかどうか</h4> <p>変数が定義されているかどうかを調べるにはisset関数を使用します。定義されている場合はtrueが返ります。ただしisset関数では変数の値がNULLの場合もfalseが返ります。</p> <?php isset($a); [/php] <h4>コマンドライン引数</h4> <p>コマンドライン引数を受け取るには$argv変数を使用します。</p> <?php var_dump($argv); [/php] <h4>array_map</h4> <p>array_map関数を使うと、連想配列の各要素に処理をして新たな連想配列として受け取ることができます。</p> <?php $array = array(1,2,3); $mapped = array_map(create_function('$v', 'return $v *= 10;'), $array); [/php] <h4>array_filter</h4> <p>array_filter関数を使うと、条件に一致した要素のみを新たな連想配列として受け取ることができます。</p> <?php $array = array(1,2,3,4); $filtered = array_filter($array, create_function('$v', 'return ($v > 2);');
複数の変数への代入
<?php list($v1, $v2, $v3) = array(1, 2, 3); [/php] <h4>php.ini</h4> <p>PHPには設定ファイルがあります。設定に応じて挙動が変わるので注意が必要です。この設定はphp.iniという設定ファイルの他に、httpd.conf、.htaccess、そしてソースコードにて設定が可能です。</p> <p>設定方法は、項目に応じて変わりますが、ソースコードで設定を行う際はini_set()を使うことが多いです。</p> <?php ini_set('include_path', '.:/path/to/libs'); // include_pathに'.:/path/to/libs'を設定する [/php] <p>現在の設定は、phpinfo関数もしくはphpコマンドで確認できます。</p> <?php phpinfo(); [/php] <pre class="code"> # 全ての設定値を出力 $ php -i # grep で絞る $ php -i | grep include_path </pre> <h4>クラス定義</h4> <p>classでクラスを定義できます。</p> class User { protected $name = null; public function __construct($name) { $this->name = $name; } public function hello() { printf("%s: Hello!\n", $this->name); } } $user = new User('Mike'); $user->hello();
継承もできます。単一継承のみ可能です。
class MyUser extends User { }
例外
throwで例外を投げることができます。try/catchで例外をキャッチします。他の言語にあるfinallyに相当するものはありません。
function foo() { throw new Exception(); } try { foo(); } catch (Exception $e) { echo $e->getTraceAsString(); }
PHP参考資料
公式マニュアル
PHPに関する書籍は多く出版されていますが、やはり一番参考になるのは公式マニュアルです。
公式マニュアルを使う際にちょっとしたTIpsを。
ブラウザで公式マニュアルを開く際は、http://php.net/の後ろに調べた関数名を入力すると直接そのページが開きます。合致するものがなければ類似するキーワードが一番表示され、候補の中から選択することもできます。
http://php.net/array
コーディング規約
コーディング規約にはいくつか流派があるのですが、Zend Frameworkのコーディング規約が参考になるでしょう。
Zend Framework PHP 標準コーディング規約 – Zend Framework Manual
モダンPHP
PHPにはオブジェクト指向言語としても機能があります。以下の資料が参考になります。
モダンPHP勉強会を開催しました & 資料 – 肉とご飯と甘いもの @ sotarok
フレームワーク
PHPを使ったWebシステム開発ではフレームワークを用いることがメジャーになりつつあります。
多くのオープンソースフレームワークがありますが、主要なものは以下です。
- コメント (Close): 2
- トラックバック: 32
appengine ja night #4とPython Hack-a-thon #3に参加してきました&LT資料
- 2010-01-24 (日)
- event | Google App Engine(GAE) | Python
週末にappengine ja night #4とPython Hack-a-thon #3 に参加してきました。
2010年、初勉強会です。
どちらもこれまで参加することの無かったイベントなのですが、こうした場所に参加したくなるのも Google App Engine(GAE)をやり出して興味が広がった効果ですね。
appengine ja night #4ではBT(Beer Talk)もやってきました。
他の方の発表も参加される方の雰囲気も事前には良く分からない状況だったのですが、ほぼ全員の方がはじめましての状況だったので自己紹介も兼ねて話してきました。
いざやってみると、とても良い雰囲気で、突っ込みあり、笑いありですごく話しやすかったです。ありがとうございました。
資料を見てもあまり役に立たない気もしますが、いちおうアップしました。
以下、雑感を。
appengine ja night #4
- 会場はリクルートメディアテクノロジーラボさん。会場もキレイだし、スクリーンマルチだし、無線LANもあるしで、至れり尽くせり:-D
=> ありがとうございました。 - 発表を聞くだけでなく、適時突っ込みを入れるスタイル。
=> 議論が深まって面白かったです。発表者は大変だと思いますけど:-D
- 運営のみなさん、ありがとうございました。
- 次回は来月開催だそうです。みんなやさしい人達だから、興味ある人は参加すると良いですよ。
Python Hack-a-thon #3
- 会場はオラクルさん。マルチスクリーン、電源あり、無線LANあり、飲み物無料、キレイと、こちらも至れり尽くせり。
=> ありがとうございました。 - 両日共にこんなに素晴らしい会場を無料で提供頂けるのは本当にありがたいことです。
- hackathon初参加。
- ワークショップはGAE+Facebookにちらっと参加して、あとはもくもく作ってました。
- GAE+Facebookは連携して、友人一覧が出せたのでとりあえず満足:-D
- その後はTwitterのOAuthを使った検証と新しいサービスの下調べを。
- hackathonの時間はあっという間に終わっちゃいました。
- PHPでも同じようなイベントをやっても良いかも。(関西でやろうかな。)
- お昼やワークショップ、発表を通じて、普段あまり接することのない分野に触れられて刺激的でした。
- 自主性をかなり求められるイベントなので、少し参加する人を選ぶイベントかも。オラクルさんの環境で作業したいがために参加する手もありますけどね:-D
- 運営のみなさん、ありがとうございました。
興味が広がると
冒頭でも書きましたが、どちらも初参加のイベントだったので、初めてお会いする人ばかりでした。両イベントとも著名な方も多く参加されていたので、ミーハー気分な楽しみもありました:-D
新しいことをやりだすとRPGで新たな地図を手にしたように、これまで行けなかったところに行ける楽しみがあります。
また勉強会をやりたくなってきました。GAEの勉強会を関西でやってみましょうか。
- コメント (Close): 0
- トラックバック: 0
自分がいなくなった後も動き続けるWeb
- 2010-01-21 (木)
- Google App Engine(GAE) | 雑記
自分が死んだ後、Webには何が残るのだろう。
30代半ばになると、いやでも死というものを考える瞬間がある。日頃から常に考えているわけではないけれど、ふとした瞬間に考える。
ある日、何気なく考えた。
「もし、自分が死んだら、Webにある自分はどうなるんだろ。」
blog
まず、このblog。
サーバはレンタルなので、その期限がくれば停止して見られなくなる。
また、1×1.jpドメインも1年経って何も手続きをしなければ失効される。
おそらく死後1年数ヶ月で見ることはできなくなるだろう。
自作のWebサービス
follow okやfindTwitter、hot.hatebuといった自分で運営しているサービスたち。
レンタルサーバに置いているものは、blogと同じく契約が切れれば停止するだろう。
hot.hatebuは GAE(Google App Engine)に置いているので、Googleの気分が変わらなければ残り続ける可能性は高い。最近GAEを熱心にやっているのは、こういう理由もあったりする(別に死後を考えているわけではないけど)。
ただやっぱりドメインが切れると接続できなくなる。
残すことだけを考えるなら、独自ドメインではなく、「*.appspot.com」で公開した方が良い。
Twitter/Wassr/usream等のWebサービス
これはサービスさえ残れば、そのまま残り続けるだろう。
Twitterには思いついたことをすぐにpostしているから、結構生々しいというか、生きている感じがする。
以前、Twitter上で有名な方が亡くなられた。2007年頃からTwitterをやっている人なら知っている人も多いと思う。
最近、何かの拍子にその方を思い出し、その方のTwitterを見てみると、アカウントがそのまま残っていた。
残されたtweetは、ごく自然に発せられたもので、日付が2007年ということを除けば、まるで生きているようだった。
その方はustream配信もされていたので、録画したものがそのまま残されていた。
私はそれほど接点があったわけではないが、何となく気になる人だった。(当時はまだ日本のTwitterユーザ数も少なくて、わりとみんな仲良しな空気もあった。)
彼ほどの影響力は無いにせよ、サービスが残っている間は、何かしらの想いがWebに残り続ける。
問題はドメイン
blogとかは大手の無料サービスを使う、自分が作るサービスはGAEを使う、としておけば、しばらくは動き続ける。
問題はやっぱりドメインで、自動更新の仕組みが欲しいところ。こだわりを捨てられるのであれば、割り当てられたドメインで運営すれば良い。
何かを残したい
生きてきた何かを残したい、という想いにWebは向いている。誰でも発信できるし、多くはサービスが無くならない限りコンテンツが残る。
GAEで最初に作ったアプリケーションは、家族の誕生日にメッセージを送るというシンプルなものだった。
少しでもWeb開発をかじった人なら誰でも簡単に作れるものだし、公開するつもりも無いので操作画面も無い。
ただGAEなら数年単位の未来までは動き続けるだろうから、もし明日いなくなっても、しばらくは送り続けてくれるだろう。(無料で利用できるGAEには「何があっても動き続ける」という利点もある。)
いつも考えているわけではないけど、たまには。
- コメント (Close): 2
- トラックバック: 2
はてブホットエントリーを見るWebサービス「hot.hatebu」を作りました
- 2010-01-19 (火)
- Google App Engine(GAE) | Python | Webサービス
はてブホットエントリーを集計して見るWebサービス「hot.hatebu」を作りました。
はてブのホットエントリーを集計して一覧で見るサービスです。機能をざっくり挙げると以下です。
- 「エントリ」「時間」「タグ」「ユーザ」の集計データを表示
- 日付範囲を指定して、合算した集計データを表示
- パネル機能
詳細については説明ページがありますので、こちらをどうぞ。
hot.hatebu | 説明ページ
ここでは作った経緯や使い方のポイントなどを。
週間はてブホットエントリーを見たい
そもそものきっかけは週間ホットエントリーを見たいというものでした。イベントやネットラジオなどで話す時のネタにホットエントリーを使うのですが、公式サイトでは一日単位で見る方法しかありません。
例えば、先週のホットエントリーをまとめて見る場合は1ページづつページを辿るしかありません。
そこで複数日のホットエントリーを合算して見られるサイトが欲しいと思いました。
あとちょうどGAEを試していたので、何か作ってみたいというのも理由の1つです。
平日は12時台、休日は23時台がピーク
実際にやってみて面白かったのが時間別のブックマーク数です。
平日と休日ではっきりと推移が異なります。
・平日(2009/12/07〜2009/12/11)
hot.hatebu | 2009/12/07〜2009/12/11の時間別
・休日(2009/12/12〜2009/12/13)
hot.hatebu | 2009/12/12〜2009/12/13の時間別
平日はオフィスで昼休みにRSS ReaderやTwitterからブックマーク、休日は家に帰って寝る前にWebを眺めてブックマーク、という使い方が多いのかもしれませんね。
パネル機能
あったら面白いなと思っておまけで付けた機能です。
勉強会やネットラジオをやる時、何となく話すネタが欲しい時ありませんか?そんな時にプロジェクタでこの画面を映して、表示されたエントリーについて話ができれば考えています。
イメージとしてはテレビのバラエティで見るパネルですね。
データは2009/12/01〜
データはまだ2009/12/01以降のものだけです。今後のデータは随時、追加していきます。
DataStoreで悩む
GAE+Pythonで作りました。
悩んだのはDataStore周りの実装ですね。どうしてもRDBMS感覚で作ってしまうので、パフォーマンスが出なかったり、30秒制限にひっかかったりで試行錯誤を繰り返しました。
TaskQueueを使う方法が分かってからは何とか形になりました。色々な制限があるGAEでは、TaskQueueをどう上手く使うかがキーですね。
無料のQuotaを超えて課金をはじめると分かりやすく「リソース浪費=コスト(金銭)の浪費」に繋がります。例えば、ロジックの組み方が悪くてCPUを無駄に使えばその分費用がかかります。これまで以上にチューニングや処理の分散化(ブラウザでできることはブラウザにやらせる)といったアプローチが重要になりそうです。
ホッテントリーは面白い
ホットエントリー、はてなブックマークのデータは題材として面白いですね。自分で作ってみても色々な見方ができて楽しいです。
ホッテエントリーのチェックに、話のネタ探しに、ブックマークの分析に使って頂ければ嬉しいです。
- コメント (Close): 0
- トラックバック: 0
Google App Engineで独自ドメインを使う
- 2010-01-18 (月)
- Google App Engine(GAE)
Google App Engine(GAE)で独自ドメインを使う方法です。
GAEに設置したアプリケーションはデフォルトでは、[アプリケーションID + .appspot.com]というドメインでアクセスすることができます。
また、これとは別に独自ドメインをアプリケーションに割り当てることもできます。
独自ドメインを割り当てる方法は知っていないと嵌りやすいので手順を書いておきます。
仕組みと手順
まずは仕組みから。
GAEでの独自ドメイン割り当ては、独自ドメインのCNAMEでGAEサーバを指すことで実現します。よって独自ドメインのDNSが設定できる必要があります。
私はドメイン管理にムームードメインを使っているのですが、ムームードメインではコントロールパネル(Web管理画面)にてDNSの設定ができます。
次に手順。
前提として独自ドメインは既に取得済みとします。
- Google Appsを申し込む
- Google Appsでドメイン設定
- Google App Engineでドメインを割り当てる
1. / 2. ではGoogle Appsにて独自ドメインの設定を行います。Google App Engineではなく、Google Appsなのでご注意を。
1. Google Appsを申し込む
Google Appsにて申込みを行います。
Google Appsには幾つかエディションがあるのですが、ここでは無料で利用できる「Standard Edition」を申し込みます。
画面右メニューから「Standard Edition」を選択します。
次の画面の右メニューから「開始方法」を選択します。
設定するドメインを入力します。既にドメインは取得済みなので、「既存のドメイン名を使用する」タブにドメイン名を入力します。
次に申込者(アカウント管理者)情報入力と管理者アカウント登録を行います。
これでGoogle Appsの申込みは完了です。
Google Appsの管理画面(ダッシュボード)に遷移します。)
2. Google Appsでドメイン設定
Google Appsにてドメインが利用できるように設定します。
Google Appsを申し込んだ直後はまだドメインは利用できるようにはなっていません。(申込みだけで使えるようになってたら問題:-D)ドメインの所有権をGoogleが確認することにより利用が可能になります。
ドメイン所有権の確認を行うには、ダッシュボード画面上部にある「ドメインの所有権を確認」リンクに進みます。
ドメイン所有権の確認には「HTMLファイルをアップロード」する方法と「CNAMEレコードを変更」方法があります。今回、ドメインを取得したムームードメインでは管理画面からDNS設定ができるので、今回はプルダウンで「CNAMEレコードを変更」を選択します。
プルダウンを選択すると、所有権確認用のDNS設定が表示されます。この画面の説明どおりにDNSを設定して、「確認」をクリックすると所有権の確認をGoogleが行います。
たとえばムームードメインなら以下な感じです。
DNSでCNAMEを割り当てると、ブラウザでhttp://googlexxxxxxx.example.com/にアクセスするとgoogle.comが表示されるはずです。
所有権の確認を依頼するとダッシュボードに確認中を示すメッセージが表示されます。「48時間程度」と書いてありますが、私が試した時は数分で確認が完了しました。
3. Google App Engineでドメインを割り当てる
いよいよGAEで独自ドメインを割り当てます。
まずGAEの管理画面にアクセスします。左メニューにある「Application Settings」をクリックして、画面中央の「Domain Setup」にある「Add Domain…」ボタンをクリックします。
Add Domain画面にて割り当てるドメインを入力します。
次の画面の中央にある「新しいURLを追加」リンクをクリックします。
GAEアプリケーションに割り当てるホスト名を入力します。なおホスト名無しのドメイン(Naked Domain)は以前は設定できたようですが、現在は設定できないようです。
最後に入力したホスト名についてDNSの設定を行います。手順はドメイン所有権の確認で行ったのと同じようにホスト名のCNAMEに指示された内容を設定します。
ムームードメインでの設定例です。
最後に画面下の「指定された手順を完了しました」をクリックして設定は完了です。
ちょっと手間。。。
はじめて設定したときは行程に目がくらっとしたのですが、慣れると結構トントン拍子で設定できます。
この方法でドメイン設定を行うとGoogle Appsが独自ドメインで使えるのでそれはそれでメリットになります。例えば設定したドメインのメールアドレスをGoogle Apps上で作成することができます。(要設定)
GAEで独自ドメインを使う時はご参考にどうぞ。
- コメント (Close): 0
- トラックバック: 4
- 検索
- フィード
- メタ情報