Category Archives: Programing

プログラム

JavaやAndroidの総合開発パッケージを準備する

android-logo-white

何だかんだで変なエラーでEclipseを入れ直したりすることが多いのでまとめておく(´・ω・`)
(Javaのインストールは省きます)

1.Android SDK のダウンロード

Android SDK Download
android_sdk

2.Eclips 日本語プラグインのダウンロード

Android SDK パッケージの Eclips は英語版なので、Pleiadesを導入して日本語化する
Pleiades は Java アプリケーションを日本語化するためのツール

Pleiades – Eclipse プラグイン日本語化プラグイン
2013年9月現在の最新版 1.4.x

3.Pleiades の導入

導入にあたっては pleiades\readme\readme_pleiades.txt を参照する。
pleiades_x.x.x.zip を解凍し、plugins、features ディレクトリーを eclips の ホームディレクトリーにコピー。

# eclipse.exe -clean.cmd も eclipse.exe と同じ階層にコピーしておく
# Pleiades を更新したり、他のプラグインを追加・更新した場合は必ず上記の起動オプションコマンドから起動する

eclipse.ini の最終行に以下の記述を追加。

-javaagent:plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar

(Windows 以外の場合は Eclipse 起動オプションを参照)

4.Eclipse の設定

初回起動時にワークスペースを設定する。
USBメモリ等で持ち歩く環境にする場合は、相対パスで指定する。
# 絶対パスの例: D:\workspace
# 相対パスの例: ..\..\workspace

文字コードをUTF-8に変更
ウィンドウ > 設定 > 一般 > ワークスペース > テキストファイルのエンコード > その他 > UTF-8 を選択

その他の設定

・エミュレーターの設定
– 「PANIC: Could not open: XXX」なエラーがでるときの対処
– camera の設定は enabled にしないとダメとか色々

・SDKマネージャーから必要なファイルをダウンロード
– Google USB Driver(実機検証用)
– Google APIs(GoogleMaps等のGoogleサービスを呼び出すときに必要)
– Samples for SDK(参考になるサンプルコードがてんこ盛り)
– SDK Platform(Android2系や最新版など検証する環境に応じて入れる)

・エディタをカスタマイズ
– Sublime Text風にするとか

上記の内容は何かに躓いたらまとめるかもしれない。

PHPの文字列比較コピペ

php

PHP「”0x0A” == “10”はTRUEですがよろしいですか」
ぼく「えっ」
PHP「”0x0A” == “10”はTRUEになりますが」
ぼく「いえFALSEです」
PHP「えっ」
ぼく「えっ」
PHP「まだ比較したことがないということでしょうか」
ぼく「えっ」
PHP「えっ」
ぼく「変化するってことですか」
PHP「なにがですか」
ぼく「型が」
PHP「ああ文字列でも整数っぽい文字列なら自動で型変換されますよ」
ぼく「そうなんだすごい」
PHP「では比較いたしましょうかTRUEですよ」
ぼく「でも”0x0A”は明示的にキャストしたら0になりますよね」
PHP「えっ」
ぼく「えっ」
PHP「ああ16進数のことなら比較の場合のみ10進数に自動で変換してから比較するんですよ」
ぼく「なにそれこわい」
PHP「”0x0A” == “+000010.0000000000000001″の場合もTRUEになります」
ぼく「なにそれもこわい」
PHP「えっ」
ぼく「えっ」

解決法
・暗黙の型変換の癖を知って注意して使う
・もしくは文字列比較には === 演算子を使う

でも === 演算子を使うって動的型付けの言語として敗北じゃないのか?と思ったりしてしまう。
そういう意味で僕はPHPよりPythonが好きなのだけど。

参考リンク
[続] PHPで文字列比較を行う場合の注意と、一応数値も抑えておいたほうが・・・
PHPの文字列比較で気をつけるべきこと – 暗黙の型変換
プログラミングを勉強したい。まず何をすればいいの?

Android端末でスクリーンショットを撮る方法(Android4.0以降)

android-logo-white

Android 4.0(Ice Cream Sandwich)以降の場合、スクリーンショット機能がデフォルトで搭載されている。
やり方は「音量を下げるボタンと電源ボタンを同時長押し」で撮影。

参考リンク
OSバージョン別! Android携帯でスクリーンショットを撮影する方法

ユーザー定義関数の記述箇所

php

ユーザー定義関数の定義と利用を同じファイル内に記述する場合、
順番が関係あるのか?ないのか?(・ω・)

答えは「記述場所は関係ない。」みたいだ。

以下、さんぷるぷる。
A、Bどちらの例でも問題ない(・ω・)b

A.前に定義を書く

// 関数の定義
function sampleFunc() {

}

// 関数の利用
sampleFunc();

B.後に定義を書く

// 関数の利用
sampleFunc();

// 関数の定義
function sampleFunc() {

}

後に定義を個別にまとめて置きたいので、それができるのは助かる~ヾ(・ω・)ノ
PythonとかJavaとかだとできない時があったような気がする。
やっぱりクラス別にファイルにしてインポートするのが普通なんだろうなぁ。

参考リンク
PHPのお勉強 : ユーザー定義関数 | 悩んデルタール人の部屋

私がPython3でUnicodeEncodeErrorなのはどう考えてもデフォルト文字コードが悪い!

python_logo

とまぁわかりにくいタイトルですね。
要は「よーしパパ、Python3でCGIやっちゃうぞー」って意気込んだは良いけど
出力するソースに日本語を含んだ途端に
UnicodeEncodeError: ‘ascii’ codec can’t encode characters
なんて文字列に阻まれたりするんですよーってことです(´・ω・`)
(それ以前のパーミッション設定とか注意は サーバーでPythonを使うときに注意すること を参考に)

このエラーを理解するには、Python2.x系と違って
Unicodeとはなんぞやー?とかbyte列とはなんぞやー?とか色々知る必要があるらしい。
あと、Pythonはデフォルト設定をよく読みに行くらしいという特性も知らないと躓きそうです;
正直、僕みたいな文系プログラマーにはわかりにくかったです(ノд`)+゜。

で、結局注意点は
・Pythonのソースコードは基本的にUTF-8で書こうぜ
・一応2行目に # -*- coding: utf-8 -*- みたいにソースのエンコードを指定しようね
・ファイルやフォームからの入出力の際は、必ずエンコード指定しろよー
・レンタルサーバとかにUPしたら、デフォルトエンコードを参考にしちまうみたいだから
 必要に応じて書き換えようぜー

って感じらしい(・ω・)

調べれば調べるほど訳のわからないことをして遠回りしたけど、
結局はこんな感じでデフォルトエンコーディングを書き換えることで日本語表示できましたー

import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

ちなみにサーバのデフォルトエンコーディングが何かを調べるには

import sys
print(sys.stdout.encoding) # ANSI_X3.4-1968 等を出力

のようにして調べると良いらしい。

とにかく文字コードだけで分厚い本になるぐらい難しい分野だと言われてることだけは
改めてよーくわかりました!(ノ∀`)
でもPythonプログラムを続けるためには、「わからないなりにでも前に進んでる実感がある!」
っていうのが大事だと思うんだ。それは文系プログラマーの大切なモチベーションだからね!

参考サイト
UnicodeEncodeError: に悩まされない。Python2.x から Python3.x への乗り換え
Dive Into Python 3 – 第4章.文字列

文字列の書式指定を使ってHTMLに変数を埋め込む

python_logo

HTMLの中に変数を入れ込むというCGIで良くやるやつです。
ソースはpython3.3を想定して書いてます。

結論から言えば、str.format() を使うだけです。

例えばPHPとかだと

$hello = 'こんにちは!';
print "<p>$hello</p>";
<p>こんにちは!</p>

となる。

これをPythonでやってみる。

hello = 'こんにちは!'
print('<p>' + hello + '</p>')
<p>こんにちは!</p>

んで、そのうちコメント(ヒアドキュメント)とprintf的な書き方を使ったりし始めてー

title = '挨拶は元気よく'
hello = 'こんにちは!'
print('''
<div>
    <h1>%s</h1>
    <p>%s</p>
</div>
''' % title, hello)
<div>
    <h1>挨拶は元気よく</h1>
    <p>こんにちは!</p>
</div>

とまぁここまでなら特に問題ないと思うけど、この書き方だと

1.変数を表示したい順番に並べなければいけない(% title, hello の部分)
2.埋め込まれた箇所を見てどの変数が入っているかわからない(どこを見ても%sだらけに)
 →何番目の変数か数えなきゃいけない!(>’A`)>

やりたいことは
・変数名でそのまま埋め込んで展開したい
・変数名をキーにした辞書(ディクショナリ)で管理したい

ということで解決策は「str.format() メソッドを使う」こと(・ω・)b
一目瞭然ソースを見てみる

greeting = {
    'goodmorning' : 'おはよう!',
    'hello' : 'こんにちは!',
    'goodevening' : 'こんばんは!'    
}
print('''
<p>
    {goodmorning}<br />
    {hello}<br />
    {goodevening}
</p>
'''.format(**greeting))
<p>
    おはよう!<br />
    こんにちは!<br />
    こんばんは!
</p>

辞書を別ファイルにしてインポートする形にすると
色々管理しやすくて良いですね(*´-`)

PythonでCGIを学ぶ

python_logo

CGIはPerlとかPHPが多いイメージだけど、そこをあえてPythonで覚えてみたい!ヾ(・ω・)ノ
そこで下記サイトを参考にさせてもらいながら、基本的なことをまとめてみる。
Python CGIプログラミング入門
Python 2.7ja1 documentation20.2. cgi — CGI (ゲートウェイインタフェース規格) のサポート

500エラーとか出る人は前回の記事 サーバーでPythonを使うときに注意すること をチェック
してみてください(・ω・)b

HTMLとして表示するときは print で最初にヘッダーを書きだして1行開けるのがお約束。

print "Content-Type: text/html"     # 以降のデータが HTML であることを示す行
print                               # ヘッダ部の終了を示す空行

Pythonの中にHTMLコードを書くときは printステートメントをつける。

## こう書いても良いけど…
print "<TITLE>CGI script output</TITLE>"
print "<H1>This is my first CGI script</H1>"
print "Hello, world!"

## 僕はこう書く方が楽で好き
print """
<TITLE>CGI script output</TITLE>
<H1>This is my first CGI script</H1>
Hello, world!
"""

cgiモジュールをインポートする前に、デバッグ用のおまじないを書いておこう。
エラーが発生した際にブラウザ上に詳細なレポートを出力してくれるぞー。

import cgitb
cgitb.enable()

入力されたフォームデータを取得するには、 FieldStorage クラスを使うのがBEST!(゚∇^d) グッ!!
値を取得するには FieldStorage クラスの getfirst メソッドを使う。

import cgi
fs = cgi.FieldStrage()
txt = fs.getfirst('text', '')

print """
    <article>
        <h2>テキストフィールドに入力された文字を表示</h2>
        <p>入力された文字は、<strong>%s</strong> です。</p>
        <form action="cgi_fieldstorage_txtfld.cgi" method="post">
          <input type="text" name="text" />
          <input type="submit" />
        </form>
    </article>
""" % cgi.escape(txt) ## 特殊文字がある場合はHTML上で表示できるようにする

上記のコードのDEMO

HTML5の新要素をIE8以前に対応させる

html5-logo

IE8以前にもHTML5の新要素を対応させるために、html5shiv.jsを読み込みます。
下記のような新しいタグに対応することができますが、Javascript API等を含め
すべての新機能に対応しているわけではないので注意が必要です。

section・・・汎用的セクションを表す
article・・・独立して配信可能な情報を表す
header・・・セクションのヘッダーを表す
footer・・・セクションのフッターを表す
aside・・・補助的な情報を表す
nav・・・主要なナビゲーションを表す
hgroup・・・h1~h6の見出し要素をまとめる
figure・・・文章中の図を表す

<head>
<!-- HTML5の新要素にIE8以前も対応させる -->
<!--[if lt IE 9]>
<script src="common/js/html5shiv.js"></script>
<![endif]-->
</head>

以前はGoogleCode内のソースコード(http://html5shiv.googlecode.com/svn/trunk/html5.js)を直に読み込む方法が一般的でしたが、
・ソースコードリポジトリへのリンクは行うべきではない
・最新のソースコードではないことがある
・3分しかキャッシュされない
という上記3点の理由からサーバーにhtml5shiv.jsを保存して利用する形が良いみたい(・ω・)

参考
html5shiv
HTML5導入前に覚えておきたいこと
IE対応でよく利用するhtml5shivの使用方法変更について

サーバーでPythonを使うときに注意すること

python_logo

ちょっとしたことだけど、初めて使うときには躓くよね(´・ω・`)

・拡張子を.pyから.cgiに変更
・パーミッションを755に設定
・改行コードをWindowsのCR+LFからLinuxのLFに変更
・ヘッダでcharsetを指定しない

調べてみると同様の問題についてRubyでの対処法が書いてあったので、
もしかしたらPythonも同じかなぁと思って試したら大丈夫だった(・ω・)b

ちなみにモジュールファイルは.pyで問題なく利用できます。
その際はファイルのパーミッションを600に設定するなどで、
ソースコードが外部から閲覧できないように設定して下さい。

test.cgi

#!/usr/local/bin/python
# -*- coding: utf-8 -*-
 
print "Content-Type: text/html\n"
print
print "Hello world!"

選択肢メニュー表示のNVLモードとADVモード切り替え

WikiLogo
ver 6.14.1

NVLモードで文中に選択肢を表示させるときは、その前段階で

    $ menu = nvl_menu

のように設定しますが、途中でADVモードに切り替えても選択肢メニューまでは切り替わりません(´・ω・`)
試しに

    ## 間違った例
    $ menu = adv_menu

としてもエラーになってしまいます。

解決策として、選択肢メニューはデフォルトではADVモードなので
以下のようにデフォルト設定を上書きすることで解決しました(・ω・)b

    $ menu = renpy.display_menu

NVLモードとADVモードの切り換えって、window show とかも意味合い変わったりするし
色々注意してないとだね(・ω・)