CentOSにSubversionをインストールする

■インストール

yumでサクッとインストールだ!

yum install subversion

■リポジトリの作成

以下のようにするとhogeディレクトリが生成される。

mkdir -p /home/svn/repos/
cd /home/svn/repos/
mkdir hoge
svnadmin create hoge

adminユーザでコミットするなら以下のようにしておく。。。

chown -R admin:admin hoge
chmod -R 0700 hoge

複数ユーザがコミットするときはグループとかで管理しないとなー

androidでActivityを複数使う

ActivityはAndroidManifest.xmlに登録しないと使えない。

<activity android:name=".PrimeNumberActivity"
          android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<activity android:name=".PrimeNumberListActivity"
          android:label="@string/app_name_list">
</activity>

androidアプリケーションを配布する

android marketでアプリケーションを配布するには署名などの作業が必要となる。

■自己署名の証明書作成

以下のようにkeytoolを使用する。

C:\Program Files\Java\jdk[version]\bin>keytool -genkey -keystore hoge.keystore -
alias hoge -validity 1000

以下のように任意のパスワードの入力を求められる。

キーストアのパスワードを入力してください:
新規パスワードを再入力してください:

正しく自分の名前を入力しよう。

姓名を入力してください。
  [Unknown]:  Taro Hoge

組織単位名の入力だ。

組織単位名を入力してください。
  [Unknown]:  personal

組織名の入力だ。

組織名を入力してください。
  [Unknown]:  personal

都市名の入力だ。

都市名または地域名を入力してください。
  [Unknown]:  Kawasaki

県名の入力だ。

州名または地方名を入力してください。
  [Unknown]:  Kanagawa

国名の入力だ。

この単位に該当する 2 文字の国番号を入力してください。
  [Unknown]:  jp

最後に確認。

CN=Taro Hoge, OU=personal, O=personal, L=Kawasaki, ST=Kanagawa, C=jp で
よろしいですか?
  [no]:  yes

以上で証明書が作成される。

■アプリケーションパッケージへの署名

以下のようにjarsignerを使用する。

cd C:\Program Files\Java\jdk[version]\bin
jarsigner -verbose -keystore hoge.keystore C:\[eclipse-work-space-path]\workspace\PrimeNumber\bin\PrimeNumber.apk hoge

■apkファイルの最適化

以下のコマンドでapkファイルを最適化できる。

cd C:\android-sdk-windows\tools\
zipalign -v 4 C:\[eclipse-work-space-path]\workspace\PrimeNumber\bin\PrimeNumber.apk C:\[eclipse-work-space-path]\workspace\PrimeNumber\bin\output.apk

アップロードするのは新しく生成されたoutput.apkである。

■アップロード

以下から行う。ユーザアカウントの開設は有料($25)である。

http://market.android.com/publish/Home

contentEditableをJavaScriptで変更する際に気をつける事

■結論

以下のように書けばブラウザに関係なく変更が可能である。

document.getElementById('editor').contentEditable = true;//firefox, chrome, opera, safari, IE...OK

jQueryだと以下のようになる。

$('div#editor').attr('contentEditable', true);//firefox, chrome, opera, safari, IE...OK

■失敗例

以下のように書くとIEでは動作しなくなる。

$('div#editor').attr('contenteditable', true);//firefox, chrome, opera, safari...OK

Androidを久々に開発してみる

■エラー

以下の様なエラーが出る。

Error generating final archive: Debug certificate expired on 10/01/01 01:23! [application]  不明 Android Packaging Problem

デバッグ用の署名に使うkeystoreの期限切れらしい。めんどい。

■対策

以下のコマンドをコマンドプロンプトから入力。

C:\Program Files\Java\jdk[version]\bin\keytool -genkey -alias androiddebugkey -keystore debug.keystore -storepass android -keypass android -dname "CN=Android Debug, O=Android,C=US"
  1. 同ディレクトリにdebug.keystoreが生成されたので、それを「(vista)C:\Users\[user]\.android」「(xp)C:\Documents and Settings\[user]\.android」に移動。
  2. eclipse>プロジェクト>クリーン

以上。

Pythonでクラスを定義する

Pythonでclassを定義するには以下のように記述する。

class Dog:
    name = ''
    def __init__(self, name):
        self.name = name
    def cry(self):
        print(self.name)

dog = Dog('pochi')
dog.cry()#pochi

■継承

Pythonでclassを継承するには以下のように記述する。

class Animal:
    name = ''
    def __init__(self, name):
        self.name = name

class Dog(Animal):
    talk = 'bow!'
    def cry(self):
        print('this is ' + self.name + '! ' + self.talk)

class Cat(Animal):
    talk = 'mew!'
    def cry(self):
        print('this is ' + self.name + '! ' + self.talk)

dog = Dog('pochi')
dog.cry()#this is pochi! bow!
cat = Cat('doraemon')
cat.cry()#this is doraemon! mew!

■多重継承

Pythonは多重継承をサポートした言語である。自分の中では初めての多重継承((o(^-^)o))。以下のような記述になる。

class Robot:
    color = ''
    def __init__(self, color):
        self.color = color

class Cat:
    name = ''
    def __init__(self, name):
        self.name = name
    def cry(self):
        print('mew!')

class Doraemon(Robot, Cat):
    name = 'Doraemon'
    def intro(self):
        print('My name is ' + self.name + '(' + self.color + ')!')

doraemon = Doraemon('blue')
doraemon.intro()#My name is Doraemon(blue)!
doraemon.cry()#mew!
doraemon.name#Draemon

ドラえもんクラスを作って考えてみることにした。まず、ドラえもんはロボットなので以下のようなRobotクラスを作る。

class Robot:
    color = ''
    def __init__(self, color):
        self.color = color

ドラえもんはネコ型なのでCatクラスも継承するはずなので、以下のように定義する。

class Cat:
    name = ''
    def __init__(self, name):
        self.name = name
    def cry(self):
        print('mew!')

以下のようにドラえもんは量産型なのでクラス化して、RobotクラスとCatクラスを継承する、

class Doraemon(Robot, Cat):
    name = 'Doraemon'
    def intro(self):
        print('My name is ' + self.name + '(' + self.color + ')!')

以下のように、Draemonクラスをインスタンス化して使ってみるする。

doraemon = Doraemon('blue')
doraemon.intro()#My name is Doraemon(blue)!
doraemon.cry()#mew
doraemon.name#Draemon

上述のDaraemonクラスにはコンストラクタが存在しない。このような場合の解決規則は、(継承を記述した部分で)左から右へ探索し解決される。多重継承は非常に注意して使わないと分かりにくくなる。従って多重継承をサポートしない言語が多いということがある。

■プライベート変数

name変数は外から変更できないほうが良い。従って以下のようにアンダースコアを2つ続けて書くことでプライベートにする。

class Dog:
    __name    = ''
    __counter = 0
    def __init__(self, name):
        self.__name = name
    def cry(self):
        print('This is ' + self.__name + '(' + str(self.__counter) + ')')
        self.__count()
    def __count(self):
        self.__counter = self.__counter + 1

dog = Dog('pochi')
dog.cry()#This is pochi(0)
dog.__name#error
dog.__count()#error
dog.cry()#This is pochi(1)

上述の通り、プライベートになり外からアクセスすることが出来なくなる。しかし、Pythonはプライベート変数に外から強引にアクセスすることもできる言語仕様だ。

class Dog:
    __name    = ''
    __counter = 0
    def __init__(self, name):
        self.__name = name
    def cry(self):
        print('This is ' + self.__name + '(' + str(self.__counter) + ')')
        self.__count()
    def __count(self):
        self.__counter = self.__counter + 1

dog = Dog('pochi')
dog.cry()#This is pochi(0)
dog._Dog__name#pochi
dog._Dog__count()
dog.cry()#This is pochi(2)

■クラスの入れ子

Javaと同じようにPythonではクラスを入れ子にすることができる。ちなみにPHPではできない。

class Hoge:
    class Hoge1:
        def __init__(self):
            print 'hoge1'
    class Hoge2:
        def __init__(self):
            print 'hoge2'

hoge  = Hoge()
hoge1 = hoge.Hoge1()# hoge1
hoge2 = hoge.Hoge2()#hoge2

最近心変わりがあって行末にセミコロンを打つのをやめた。(o→ܫ←o)

PHPとGDでテキスト量に合わせたサイズの画像を生成する

GDは意外にもやってくれる!

■ソースコード

以下のように、imagettfbbox関数によってテキストボックスのサイズが取得可能である。

<?php
$text     = 'Open the door!';// string
$fontSize = 30;
$font     = '/usr/share/fonts/bitstream-vera/ACaslonPro-Bold.otf';// path

$box    = imagettfbbox($fontSize, 0, $font, $text);
$img    = imagecreatetruecolor($box[2] - $box[6] + 10, $box[3] - $box[7] + 10);
$color  = imagecolorallocatealpha($img, 210, 0, 0, 255);
$backgroundColor = imagecolorallocatealpha($img, 255, 255, 255, 127);
imagealphablending($img, true);
imagesavealpha($img, true);

imagefill($img, 0, 0, $backgroundColor);
imagettftext($img, 30, 0, 0, $box[3] - $box[7], $color, $font, $text);

header('Content-type: image/png');
imagepng($img);
imagedestroy($img);
?>

■画像

こんな感じのができる!

font

PHPとImageMagickでテキスト量に合わせたサイズの画像を生成する

■ソースコード

以下のように記述する。

<?php
$text            = "にこにこぷん";//utf-8
$color           = 'black';
$backgroundColor = 'transparent';

$im    = new Imagick();
$idraw = new ImagickDraw();
$idraw->setFont('/usr/share/fonts/bitstream-vera/A-OTF-ShinMGoPro-DeBold.otf');// font
$idraw->setFontSize(30);// font size
$idraw->setGravity(Imagick::GRAVITY_CENTER);// gravity
$idraw->setFillColor($color);// 文字色塗り
$idraw->setStrokeColor($color);// 文字色輪郭
$idraw->annotation(0, 0, $text);
$metrics = $im->queryFontMetrics($idraw, $text);//get the size of string

$im->newImage($metrics['textWidth'], $metrics['textHeight'], $backgroundColor);
$im->drawImage($idraw);
$im->setImageFormat('png');
header('Content-Type: image/png');
echo $im;
$im->destroy();
$idraw->destroy();
?>

14行目でサイズを取得し、16行目でイメージのサイズとして使用する。

■画像

こんな感じのができる!