遂にGoogle App Engineに挑戦

昨夜は、プログラミング勉強会でした。

残り20日を切りラストスパートをしているのかと思いきや、当初名乗りを上げていたメンバーは半減し、参加者はわずか3名となりました。プログラミングの壁はやはり厚し。

さて昨夜自分は、システムの構成図を先生であるid:kasahiさんに確認してもらいながら完成させようと思っていただけなので、持っていったものはノートとシャープペンシルのみ。

自分がシステム構成図を書いている合間に、yasutoさんはrailsで作っていたサイトがほぼ完成に近づいていたので、それをレンタルサーバーにアップしようと試みていました。しかし、3時間格闘したものの、サーバーで動かすところまで至らず。こんなにサーバー周りで苦戦するものなのかと、他人事ながら眺めていました。

というわけで、pythonを学習している自分も、とりあえずサーバーで動かないことには話にならんっていうことに気付いたので、予定を変更して今日からGoogle App Engineをいじってみることにします。

Google App Engine SDK for Pythonのダウンロード:http://code.google.com/intl/ja/appengine/downloads.html

Windowsバージョンをインストール。英語表記ですが「Next」を選択し続けると、インストールが実行されます。若干フリーズしたのではという感じで5分くらい待ちましたが、じっと我慢して待っていたら、無事にインストールが完了しました。

これで晴れて、ローカルマシン上で開発サーバーが利用でるはずが・・・。開発サーバー起動せずorz どうすりゃいいんだこれは?!?!?!

pythonのバージョンを下げたり、いろいろ考えられる手は打ったものの解決せず。イライラは募るばかりです・・・。

Pythonで画像処理(Python Imaging Library)

brightkiteというサービスを最近実験的に使ってみてます。 http://brightkite.com/

twitterが、"What are you doing?"なサービスに対して、brightkiteは、"What's Happening?"というサービスで、チェックイン機能、ひとことメモ機能、写真&メモ投稿機能、コメント投稿機能、メッセージ機能が詰め込まれた簡易投稿サービスです。

そこで、この3カ月の学習を締めくくる今回のプログラミングの成果物として、brightkiteを模倣したひとこと写真投稿サービスを作ることにしました。birightkiteでいうところの写真&メモ投稿機能の部分です。(出来ればコメント投稿も)
ギリギリ"What's Happening?"と問いかけることができる最小限の機能でのリリースを目指します。残り期間があと20日になりましたが、残りの期間で一気に作り上げていきたいと思います。

さて、写真を使うっていうことで、今日はWebプログラミングでは不可欠ともいえる画像加工のスクリプトを学んでいくことにします。オリジナルサイズで投稿された写真を、特定のサイズ内で収まるよう、写真を縮小する必要があるので。

Pythonの場合、「PIL(Python Imaging Library)」というツールを使っていくことになります。これを使うと、かなり便利です。

【PILのダウンロード】こちらより⇒http://www.pythonware.com/products/pil/
英語でゾッとしますが、青字のDownloadsの下にあるPython Imaging Library 1.1.6 for Python 2.6 (Windows only)というテキストリンクをクリックしてPythonディレクトリにインストールしてください。インストール終了後は、Pythonシェルで確認してください。

>>> import PIL.Image
>>>

Import文の次の行に何も表示されていなければOKです。(入力待ちの状態ってこと)


PILは、約20種類のモジュールで構成されてます。今回の自分の成果物は、取り込んだ画像に加工を施すためImageモジュールを利用します。

画像サイズの変換には、2種類の関数が準備されており、resizeメソッドとthumbnaildメソッドがあるようですが、縦横比を維持するということでthumbnaildメソッドを使うことにします。

def save_thumbnail(infile, outfile):
	img = Image.open(infile)
	img = thumbnail((160,90))
	img.save(outfile, "JPEG")
	return img

黄金比といわれている16:9のサイズにとりあえず指定。thumbnaildメソッドは縦横比を維持してくれるので、160:90という枠の中に縦横の比率を変えずに収まってくれます。

また、きっとこれはさらに上級者の試みることだと思いますが、サムネイル写真をキレイに見せるためのconvertメソッドというのもあるようです。深入りしすぎるとずっとこだわっていそうなので、今回はカラーの写真を、白黒の写真にする程度にとどめておきます。

def sirokuro(infile, outfile):
	img = Image.open(infile)
	sirokuro_img = img.convert("L")
	sirokuro_img.save(outfile, "JPEG")
	return sirokuro_img

def sirokuro_show():
	infile = 'test.jpg'
	outfile = 'test_mod.jpg'
	sirokuro(infile, outfile).show()

おそらく、写真の画像のリサイズとサムネイルの作成などは、この部分だけを押さえておけばなんとかなるはず。というわけで、今回はここまで。
次回は、データベースを作成していくことにします。

Google App Engineで画像アップロードしたり、Flickr APIを叩いてみる

kasahiです。


ちょこちょこGoogle App Engineをいじっているのですが、
画像アップロードとAPI(今回はとりあえずFlickr)を使ってみたかったので、
サンプルコードを参考に作ってみました。


参考: Webコピペ屋::Google App Engineで画像アップローダ



参考: AppEngineでFlickr APIを使ってみよう « foot mark



基本的には参考リンク先のエントリを参考にさせていただいたのですが、
確かに色々簡単にできるなぁと実感しました。


ただ、画像アップロードに関しては、いわゆるディレクトリにそのままアップロードするのではなく、写真データをストアする感じになるのですね。
(※参照:すぐに忘れる脳みそのためのメモ: Google App Engine で画像を扱うには


こういった、GAE独自な部分を把握しなければと思いました。

Google App Engineを使ってみました。

kasahiです。
まだまだpythonを勉強中の身ではあるのですが、
とりあえず自分的に1ヶ月という区切りもあるので使ってみたかったGoogle App Engineを使ってみました。


こちらから。


Google App Engineを利用すると、Google のインフラ上で作ったWebアプリを実行できます。
オフィシャルな環境は今のところJavaランタイム環境かPythonランタイム環境です。


使うときは、上記サイトのスタートガイドに従うだけ。

SDKははじめwindwosのものを落としてきて試そうと思いましたが、
なんとなくpythonを落としてきたり環境変数を設定したりがめんどくさそうでしたので、
結局macの環境で試しました。


とりあえずチュートリアル通りに試したものがこちら。

簡単なゲストブックみたいなものです。


チュートリアルもはじめのhelloworldから、ログインしてアカウント名を取得するところ、データをストアするところなど
ステップに従って試すだけで結構簡単にできました。
googleさすがですねぇ。


自分のローカルな開発環境から、実際に外部からもアクセス可能な本番環境へのデプロイもかなり簡単にできたので
このあたりは素晴らしいなと思いました。


しかし、簡単な反面、ちょっと凝ったことをするのにどうしていいのか分からない部分が多々あるので、
ちょっと色んなサンプルを試して実験してみようと思います。


※しかしまた時間がないです、、!やばい!今月はドラクエやりすぎました、、

素人がプログラミングで挫折する8つのポイント

世の中には、"プログラミングができる人"と"プログラミングができない人"、この2パターンの人間がいることは紛れもない事実です。

2ヶ月前に「素人だけどプログラミングとかやってみたい。」というプロジェクトを発足させてしまったことは自分の中でも青天の霹靂であり、それはいつもの「プログラミングとかやってみたいんだけど、一緒にどう?」とかいう"適当な発言"に、思いのほか賛同者が食いついてきたために引くに引けない状態になってしまったことが事の発端でした。

まさか自分が、"プログラミング"をやることになるとは思ってもいなかったものの、いざプロジェクトでやると決めた以上はキチンと成果を出したいものです。しかし、いまこうしてパソコンの前でブログを書いているということは、とどのつまりがいまプログラミングはしていないということになります。

プログラミング学習からの現実逃避。世の中にはたくさんの楽しいことが溢れている中、いまこの瞬間に"プログラミング学習"を選択しなければならないという葛藤。

素人が、プログラミングを学習する過程で気づいたことは、最初の計画や思惑通りに物事が進むケースがほとんどないということでした。たいていが何かしらの壁に突き当たります。ちょっとした"想定外"が連発します。プログラマーの熟練者ならどうってことないことだと思うのですが、教科書通りのことしか知らない素人が、ひとりで問題を解決するのにはどうしても時間がかかります。解決のためのアプローチが思い浮かばず、フリーズすること多し…。そして、それが結果として書籍の誤植などといった本人には非がないものだったとしても、プログラミングを学習することを諦めるに十分な出来事だったりするのです。

そこで今回は、素人がプログラミングを学習するにあたって挫折するポイントを列挙し、それをどのように解決していったらいいかを自分なりにまとめて書いていこうと思います。

素人がプログラミングで挫折する8つのポイント

その1:何を作るのかが決まっていない

プログラミング学習で陥りやすいこととして、プログラミングを学習することが"主"の目的になってしまうことです。あくまでも、プログラミングを利用して"何"を作るのかが重要で、最終的に何を作りたいのか目標を明確にすることが大切です。裏を返すと、何も作る予定がない場合は、いまプログラミングを学習しなくても良いのだと思います。

その2:プログラミング言語は難解であるという思い込み

書店に行くと、多くの種類のプログラミング言語の本が並んでいます。また、そのそれぞれの本の分厚さが半端ない。これらが要因で「プログラミング学習は難解である」という思い込みが生まれている傾向があります。しかし、日本語や英語といった自然言語の学習に比べると、人工言語であるプログラミング言語はいたってシンプルな法則により成り立っています。つまり、英語の文法を学ぶよりは、プログラミング言語の文法のほうが学びやすいのです。また、C言語PerlRubyといった様々な言語がありますが、東北弁と大阪弁と博多弁のような違いくらいに最初は考えておいていいと思います。コンピューターに指示を伝えるときの言い回しが違うだけです。

その3:すべての基礎の上に応用があるという誤解

「はじめての○○言語」や「○○言語入門」といった分厚い書籍を最初のページから順番に学習していく必要はありません。作りたいと思っているものにとって、必要な箇所を必要なだけ学んでいくというスタンスで書籍と向き合うことが大切です。短期間で、効率的な学習を追求していくと、遅延評価勉強法に行き着くことになります。もちろん、この学習法には学習過程で試行錯誤することによるレベルアップができないという欠点もありますが、素人にとって試行錯誤ほど苦痛はないでしょう。試行錯誤して自身のレベルを上げていくのは、次のフェーズ、ある程度プログラミングにハマってからでいいと思います。

その4:プログラミング作業は孤独である

プログラミングを記述する作業はハッキリいって孤独です。しかし、独学で黙々と学習するよりも、途中段階の作品でも披露できる場所を作ったほうがプログラミング学習の過程を楽しめます。学んでいる内容、動き始めたばかりのプログラミングなど、自分が学習してきたことを公開して、まわりの人の反応を見ることは学習を進めるにあたり重要な要素だと思います。ぜひ巻き込める仲間がいたら、一緒に学んでくれる人、教えてくれる人を巻き込んでみてください。

その5:仕事ではないので締め切りがない

いつまでに何をするのかを明確にしない取り組みは、どうしてもダラダラと学習を進めがちになります。それでもまだプログラミング学習が進んでいればマシですが、自然にプログラミング学習からフェードアウトしていくこともしばしば。素人プログラマーなので、1ヶ月先にどんなことをするのかの予定を組むのも厳しいとは思いますが、週初めに今週はどこまで学習するかということを大雑把に決定し、それを受けて今日はどこまで進めるかの目標設定をすると効率があがります。

その6:"Hello,World"を出力しても、特になにも喜べない

プログラミングの入門書によくある最初の学習内容"Hello,world"を見ても何も感動しません。普段、様々なWebサイトを閲覧している現在だからこそ、なおさらこの学習内容から得られる成果には幻滅です。ほとんどの書籍が、いまだに"Hello,World"から始まっているのは、編集者の怠慢…、もしくは編集者自身がプログラミングを知らないからではないかと想像します。初心者だからこそ、簡単なプログラミングで、まずは嬉しくなるような成果が必要なのではないでしょうか?というわけで、まずはプログラミングに慣れる意味合いで、Javascriptでちょっとしたゲームを作ることオススメします。おそらく初日(2時間くらい)で、ちょっとしたゲームが作れるハズなので。成果が見える形でプログラミング学習を進めていくにこしたことはありません。
参照:初心者のためのJavaScript講座  JavaScript入門&サンプル集

その7:記載されている情報が必ずしも正しいものとは限らない

プログラミングの厄介なところは、たった一文字の記述ミスでも動作しないことです。外国人が"てにをは"を間違って日本語で話しかけてきても、前後の文脈で理解することができますが、コンピューターは前後の文脈で理解してくれる柔軟性を持ち合わせていません。初心者にとって特に厄介なのは、サンプルソース通りにプログラミングを記述しても動かない場合。何度も何度もチェックして、記述を訂正していくという作業は大変な時間を要します。また、書籍は書籍で誤植が多いので、サンプルを正しく打ち込んでも動作しないことがしばしば。まずはプログラミングを動作させることよりも、プログラミングの概念を理解することに重きを置いて、先に先に進めたほうが初期の学習段階ではいいような気がします。

その8:世の中は楽しい誘惑に溢れている

世の中は楽しい誘惑に溢れているということは、これはもう紛れもない事実です。これらの誘惑とどう向き合っていくか、あらかじめスタンスを決めておかないことには、都度都度の対応でいずれ誘惑に負けてしまうことになりかねません。ちなみに自分の場合はドラクエⅨがそうでした。プログラミング学習が習慣化していたものの、一旦ドラクエⅨで休暇に入ったために、ドラクエⅨをクリア後もなかなか元の学習生活に戻れていない状態が続いています。今となって思うことは、下記の3本柱を心に刻んでおくべきでした。

・明確なゴールを設定する
・スケジュールを立て習慣化する
・一度できた習慣はゴールに到達するまで崩さない

習慣化させるにはやる気も根気も必要ですが、崩れるのは一瞬です。また、一度崩れた習慣を元に戻すには再度心を奮い立たせないといけません。それでも新たな誘惑に襲われそうになったときには、下記を判断基準に加えたらいいかと思います。

・少し先の"自分"にとって、有益であるほうを選択する

というわけで、一通りまとめ上げてみましたが、これから先は自分でやっていくしかありません。プログラミングを身につけるには一朝一夕ではいきませんが、上記のことを今一度心にとどめて、再出発しようと思います。それでは、頑張ります!

iPhoneのスクリーンショットを撮る方法

こんばんは、krrです。

実は僕は最近(というのは作るものの案が何度か変わっているからなのですが)、マップの画像を撮って、手書きで書き込めるアプリを作ろうと考えていたのですが、ちょっとググったらiPhoneのスクリーンショットを撮る方法が出てきました(感謝)。知らなかった。。

一言で言えばスリープボタンとホームボタンの同時押しでスクリーンショットが撮れるわけですが、そうすると問題が出てきます。この機能を利用するアプリを使う場面をイメージしてみると

  1. アプリをたちあげる
  2. スクリーンショットを撮る
  3. その画像に手書きする操作に移る
ということになりますが、さて、このアプリは何を扱うべきなのでしょうか。スクリーンショットはマップに限らず何でも撮れるわけですから、いっそのこと、このアプリも扱えるものは限られない方が使い勝手は良いはず→ではスクリーンショットは普通に撮るとして、撮った画像に手書きできるアプリを作れば良いのでは?→写真に手書きできるアプリなんて既に立派なものがありますよね。

というわけで、スクリーンショットという大活躍しそうな機能(常識?)を知ると同時に、案がポシャりました。これはプログラミング以前の問題ですね、企画が甘かった。大急ぎで、立案し直さなければなりません。以前考えていたものに手を加えたら、今回の案より魅力的にならないかな。。

二つ目のデータテーブル作成。少しrailsになれてきた。

こんばんわ。yasutoです。
また間があいちゃいました。

前回、コンテンツの一覧表示、詳細表示、新規登録ができたので次は下記にチャレンジ。

  • ユーザーのデータテーブルをつくる
  • ログイン機能をつくる
  • ユーザーと投稿コンテンツを関係づける

「ユーザー登録して、コンテンツを投稿する」という形をつくりたいのです。

まずユーザーのデータテーブルですが、すでにコンテンツを作った後なのでさくさくいけました。
自分で忘れないように手順を書いておきます。

まずは

$ ruby script/generate model user 

でユーザーのモデルファイル一式を作ります。ここではまだ中身は空。
上記実行によって、db/migrate/以下に「002_create_users.rb」というファイルができたので、
その中にユーザー情報に必要なテーブルを記述してきます。
※002になってますが、その前にコンテンツのデータテーブルを作ったのでそっちが001になってます。

create_table :users do |t|
      t.column :name, :string,         #ユーザー名
        :null => false
      t.column :sex, :integer          #性別(0:男、1:女)
      t.column :age, :integer          #年齢
     #〜略〜

といった感じ。そしたらmigration実行

$ rake db:migrate

今回はじめて使いましたが、

$ rake db:migrate VERSION=1

みたいに後ろにくっつけて実行するとテーブルを指定したバージョンに戻せます。
この例だと「001_create_なんたら」の状態に戻ります。なんて便利。

次にサンプルデータを入れるために「db/fixtures/development」に「users.yml」を作成。

Taro:
 id: 1
 name: 太郎
 sex: 0
 age: 31
 introduce: 福岡出身。会社員。テストテスト

こんな感じのを何人か分yml内に記述。

次にデータベースにこのymlを読み込みます。
「lib/tasks」以下に「load.rake」をつくって

task :load => :environment do
  require 'active_record/fixtures'
  ActiveRecord::Base.establish_connection(:development)
  Fixtures.create_fixtures('C:\\rails\\rightway\db\fixtures\development', 'users')
end
$ rake load

で実行。

このあたりはもう本読まないでもできるようになったかも。
サンプルデータ作成&読み込みはもっと効率のよい方法があるみたいなのですがとりあえず先に進むことを優先してこのままいきます。

下記参考にさせてもらいました。
http://d.hatena.ne.jp/hatabo04/20090315/1237100858

ログイン機能とリレーションもうまくいったのですがまた後日ブログに書きます。
それではおやすみなさい。

※2009/07/29追記:すいません、ファイル名に間違いがありました。load.rb ではなく、load.rake でした。