スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

GIMP2のユーザーマニュアルを読む

昨日今日と、画像編集ソフトGIMP2のユーザーマニュアルを読んだ。

やりたいのはロゴを作ることなのだが、ちゃんと基礎を押さえておこうと思い、
I. 最初からII. GIMPの達人になるには をざっくり読んだ。

テキストをパスに転換して、パスの境界線をグラデーションとかで描画すれば自分のやりたいものはできるかな。やってみないとわからないな。

GIMP2には、ロゴを作成してくれるスクリプトが標準でいくつか用意されている。(29種類のロゴ一覧)
このスクリプトを読めばロゴ作成のテクニックが身につきそうだ。
スクリプトの場所は環境設定ダイアログ(編集→環境設定)の フォルダ→スクリプト でわかる。
スクリプト記述言語は Scheme だが、Script-Fu作成演習に書かれていることを理解すれば、スクリプトを読めるぐらいにはなりそうだ。
スクリプトで使用されている関数は、ヘルプ→プロシージャブラウザ で調べれば何をやっているかがわかる。

でもスクリプトを読むかどうかは保留だな。とりあえずパスでロゴ作ってみよう。
あと写真編集もしてみたい。
スポンサーサイト

Google App Engine の cronジョブ スケジュールフォーマットでちょっとハマる

先日GAE/Pでリリースした計算特訓ページに、ログアウトしたユーザーや期限切れの回答データを削除するcronジョブを追加した。

時間指定で毎日動くようにスケジューリングしようと思い、設定方法を調べた。
公式ドキュメントに書かれていたスケジュールフォーマットは
  ("every"|ordinal) (days) "of" (monthspec) (time)
で、『「days」には曜日をカンマ区切りのリストで指定します(「"mon","tuesday"」など。』と書かれていたので、
毎日午前3時だと "every of 03:00" かなと思ったがエラーになる。

いろいろやってもエラーになるので、検索して調べたら正解は "every day 03:00"。
of は必須じゃないの? day なんてキーワードどこにも書いてないんだけど。と思ったのだが、
公式ドキュメント英語版を見たらスケジュールフォーマットは
  ("every"|ordinal) (days) ["of" (monthspec)] (time)
で、『 "every day" is equivalent to "every mon,tue,wed,thu,fri,sat,sun" 』と書かれていた。

ちゃんと英語版をチェックしなきゃいけないのか。Task Queueの記述が無かったり、日本語ドキュメントは古いなと思っていたのだが。
せめて英語版と同期が取れていないページは「この訳は最新版ではありません」の注意書きを表示して欲しいな。
Googleの技術力を持ってすればさほどコストをかけずにできると思うのだが。

[Google App Engine for Python] webappフレームワーク使い方まとめ

GAE のwebappフレームワークについて、使い方を忘れないうちにまとめる。

1. リクエストのマッピング
URLから.pyファイルにマッピングするのはapp.yamlだが、.pyファイル内のクラスにマッピングするのはWSGIApplicationクラス。
WSGIApplicationはリクエストを受け取ると、RequestHandlerクラスのインスタンスを生成し、リクエストのHTTPアクションに応じたメソッドを実行する。
WSGIApplicationクラスの使用方法は、アプリケーションの実行を参照。


2. リクエストデータの取得
詳細は Requestクラス を参照。

・GET/POSTパラメータの取得
getval = self.request.get('パラメータ名')
パラメータが存在しない場合は、空文字列('')を返す。

・Cookie値の取得
self.request.cookies から取得する。
cookieID = 'cid' # Cookie名
# Cookie名が存在しない場合は空文字列を取得
cookieval = self.request.cookies.get(cookieID, '')
self.request.cookiesにはマップ型の操作が可能。

・リモートユーザーのIPアドレスの取得
getip = self.request.remote_addr


3. レスポンスの作成
詳細はResponseクラスを参照。

・レスポンスの記述
self.response.out.write('出力HTML')

・テンプレートを使用してレスポンスを記述
Djangoテンプレートを使用可能。使い方はテンプレートの使用を参照。
Djangoテンプレートの構文などはDjangoテンプレート言語を参照。(webappフレームワークのDjangoはバージョン0.96なので注意)
<2011/2/17 追記>
Django1.2も標準で含まれており、デフォルトのバージョンも0.96から変わる予定。
Djangoのバージョン指定方法は webappでDjango1.2のテンプレートを使う を参照。
<追記ここまで>
テンプレートの継承機能を使うと、共通部分をまとめて記述/修正できて便利。

・レスポンスのHTTPヘッダー
self.response.headers に設定する。
これはwsgiref.headers.Headersクラスのインスタンス。
ajaxのレスポンスでは以下のようにヘッダーを変更する。
self.response.headers['Content-Type'] = 'text/xml ;charset=UTF-8'
HTTPヘッダーの制限事項は、許可されないHTTPレスポンスヘッダーを参照。

・Cookieの書き込み、削除
レスポンスのHTTPヘッダーに直接書き込む。
# Cookieに書き込む
cookieID = 'cid' # Cookie名
cookieval = 'valueforCookie' # Cookieにセットする値
# Cookieの有効期限に約1年後を設定
expirdt = (datetime.datetime.utcnow() + datetime.timedelta(365))
expirdtstr = expirdt.strftime('%a, %d-%b-%Y %H:%M:%S UTC')
self.response.headers.add_header('Set-Cookie', '%s=%s; expires=%s' %
(cookieID, cookieval, expirdtstr))

# Cookieから削除する
cookieID = 'cid' # Cookie名
cookieval = 'valueforCookie' # Cookieにセットする値
# Cookieの有効期限を昨日の日付にする
expirdt = (datetime.datetime.utcnow() - datetime.timedelta(1))
expirdtstr = expirdt.strftime('%a, %d-%b-%Y %H:%M:%S UTC')
self.response.headers.add_header('Set-Cookie', '%s=%s; expires=%s' %
(cookieID, cookieval, expirdtstr))

・リダイレクト、ステータスコードの設定
リダイレクト、ヘッダー、ステータス コードを参照。
self.error(code) は、それ以前に記述したレスポンスを消去するので注意。
消去しない場合は、self.response.set_status(code) で設定。

4. その他
セッション機能は公式にサポートしていない。
Googleアカウント前提の場合、@login_required が便利。ただしGETリクエスト専用。

以上。
公式ドキュメントは大した分量ではないので、時間がある方はひと通り目を通したほうがいいと思います。

Google App Engine で計算特訓ページを作った

11月から始めたGoogle App Engine。
途中で脱線してHTML5 Canvasでゲームを作ったりしたが、やっとGoogle App Engine上で動くプログラムを公開することができた。

公開したのはこれ → けいさんマスター にがてをなくそう
11月に作った掛け算九九の特訓ページをベースにしている。

このブログを始めた頃は「PHPでサーバーサイドのプログラミングをしたい」と思っていた。
無料でPHPを動かせる@PAGESにアカウントを作っのだが、一部のページ以外ではhttpヘッダを修正できないためAjaxが使えない。

そのためPythonを勉強してGoogle App Engineを使うことになり、やっと公開することができた。
今までも@PAGESでプログラムを公開してきたのだが、データベースにデータを格納するプログラムは今回が初めてだ。

データを削除する機能をまだ作っていないので、cron ジョブとして動かすデータ削除プログラムを作ろう。

今まで@PAGESに公開したプログラムも、少しづつGoogle App Engineに移行するかな。

最低限のWebデザインをする

前回の記事の続き。
相変わらず、計算特訓プログラムのGoogle App Engineへの移行作業をしている。
作り始めてからもう10日も経ったのか。

昨日と今日は、画面デザインと言うか、見た目をいじっていた。
デザインしようにも、何から手を付けたらいいかわからないので、
「左上にロゴ、右上にログイン状態、両サイドとヘッダーの下にテーマカラーの線」
という最低限のレイアウトでお茶をにごす。

ロゴはGIMP2で作成した。単に縁取りしただけだが。
去年の10月にGIMP2を使ってメッセージ画像を書いたのだが、使い方を綺麗サッパリ忘れていた。
文字に縁をつける gimp2 文字装飾 に従ってロゴを作成。
説明動画が無かったらできなかった。

レイアウトを決めるのも苦労したが、ロゴやテキストに使う色を決めるのも苦労した。
ウェブ配色ツール Ver2.0Webデザイン用のプチツール なども使って色合いやバランスを考えてみたが、センスが無いのでどうにもならない。

妥協に妥協を重ねて、「とりあえずこれでいこう」という見た目がなんとかできた。
何年前のだよって感じのデザインだけどしょうがない。

説明文の追加など、まだ画面表示関連の残作業が残っている。
それからテストだから、公開はなんとか今週中って感じかな。

計算特訓プログラム作成中(多分8日目)

前回の記事の続き
こちらで公開している、小学生低学年向けの簡単な計算特訓プログラムのGoogle App Engineへの移行作業を続けている。

Googleアカウントを持たない(あるいは使いたくない)ユーザーに対して、セッションIDのようなものを付与して仮ログインする機能を追加した。
Google App Engine公式セッション機能が無さそうなので、おそらく衝突しないであろうIDを自前で生成した。
IDはデータストアに格納するが、ID取得はMemcacheで行うようにした。Memcacheに無い場合はデータストアにアクセスする。

これで「回答データを登録して苦手な問題を抽出する」ひと通りの機能ができた
残りの作業は
・最低限の画面デザインと説明文追加
・テスト
どちらも1日以上かかりそうだ。とりあえずはショボいデザインで公開するか

計算特訓プログラム作成中(多分5日目)

前回の記事の続き
こちらで公開している、小学生低学年向けの簡単な計算特訓プログラムをGoogle App Engineへ移行して、機能追加しようとしている。

回答データを登録して、苦手な問題を抽出するところまでできた。
ユーザー認証は Google App Engine 任せなので、Googleアカウントのみ対応。
苦手な問題は、正解率と平均回答時間から判定して抽出。
出題される問題の順序はランダムだが、回答数の少ないものを優先して出題するようにした。

基本的な機能はこれでいいかな。
公開までにやることは
・getやpostでサーバーに渡されるデータの厳密なチェック(不正なデータをきちんと弾く)
・最低限の性能対策。問題データなどはMemcacheから取得
・最低限の画面デザイン

あとは、ログインしてないユーザーに提供する機能を検討しなきゃいけない。
セッションIDみたいな一時的なユーザーIDを付与して暫定的にデータ登録可能にするとか。

公開できるのはいつになることやら。

計算特訓プログラムを Google App Engine へ移行中

こちらで公開している計算特訓プログラムを Google App Engine へ移して、回答データ登録などの機能を追加しようと考えている。

とりあえずJavaScript部分を先に動かそうと、問題表示、回答、回答結果表示がPython 開発用サーバーで動くようにした。
また、サーバーとのデータ送受信のAjax部分も動くようにした。

これからサーバーサイドのプログラミングに入るが、機能設計とデータ設計からやらなきゃいけない。
「登録された回答データから苦手な問題を探す」をメインの機能にしようと考えているのだが、さてどう実装するか。
ある程度は動かしながら考えた方がいいだろう。

ちなみに、仕様はメモ程度の内容をテキストエディタで書いている。
機能が少ないのと、一人で開発しているからこれで何とかなってるんだろう。

Webデザインの基礎を学ぼうとする

今年はちょっとサイトの見た目にも気を使おうと、
Webデザインやプログラミングなどの勉強に良さそうな国内のブログ記事やWebサイトいろいろ - かちびと.net
の「デザインの基礎を分かりやすく解説」の項で紹介されているページをひと通り読んだ。

ここで紹介されている中で、最も基本的なことが書かれていたのが以下のページ
Webデザイン超基本のお作法50選 - MdN Design Interactive
読むには会員登録が必要。無料だけど、必須入力項目が多すぎ。
2007年2月の記事なので、古いなと思うところも結構ある。
「レイアウトのお作法」がちょっと参考になった。

結局、Webデザインの基礎について自分が期待していた情報は得られなかった。
WEBデザインの見本帳 などから自分のイメージに合っているサイトを探して、それを参考にデザインしてみるかな。

JsUnitを使ったテストコードをちょっと書いてみる

あけましておめでとうございます。
相変わらず無職なので、個人的にはめでたいかどうかは微妙です。

今年のプログラミングは、前回の記事の続きとしてJsUnitでのテストから始めることにした。
とりあえずこの前作った戦車ゲームの地形クラスのテストコードを書いてみたのだが、「どこまできっちりテストするか」の判断が難しい。

地形クラスでは、地形マップ文字列を配列に変換してプロパティに登録している。
「プロパティの配列の値が、地形マップ文字列に等しいか」の判定テストコードを書きながら、「これって地形クラスがやってることを別の方法で実装してるよなぁ」と思った。
実際、マップ宣言部分を除けば、テスト対象の地形クラスよりもテストコードの方がステップ数が多い。
厳密さを犠牲にしてサンプリングチェックにすればテストコード作成にかける時間は短くなるのだが、バグを見逃し易くなる。
なかなか悩ましいところであるが、テスト対象の重要度の応じてケースバイケースで考えようか。

JsUnitに慣れるまで、もうちょっとテストコードを作ってみよう。

次はサーバーサイドのプログラミングをしたい。
こちらで公開している計算特訓プログラムをGoogle App Engineに移して、ユーザーの成績を登録できるようにしようと考えている。
プロフィール

himax64

Author: 南西
30代後半の無職です。
就活もせずダラダラ生きてます。
作ったもの

最新記事
人気記事
検索フォーム
カテゴリ
月別アーカイブ
最新コメント
最新トラックバック
RSSリンクの表示
QRコード
QRコード
カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。