プログラマメモ2 - programmer no memo2

目次

[雑記]iPhone,ipod touchの開発をしたい 2008/10/29

アップルのiPhone Developer Programの申し込みの仕方がようやくすんだのはいいのだが、まだどう開発するのか、よくわかってない状態です....
申し込みは別にあとでもよかったのかも....
99ドルだしなぁ.

開発のためにMac OSXもレパードにようやくあげたし、SDKもダウンロードしたけど、さあ、どうしよう。

先日、ふとiPhoneアプリってユーザを惹き付ける要素って、見た目が8割って話をしていて、で、iPhoneの開発ってなかなかチャレンジングだと思うしだい。

僕みたいな人多いかも、いきおいあまって、iPhone Developer Program申し込んだけど、開発できず一年たっちゃうとか。
そうならないようにがんばろう o_o!

参考
プログラマの道具箱: iPhone Developer Program - はじめの一歩

[java][jni][windows]プロセス同期だミューテックス 2008/10/28

Javaです。Windowsです。ミューテックスです。
相互排他の処理でミューテックスです。


注意点、CloseHandleは重要かも。存在チェックのためにCreateMutex使ってもCloseHandleしたほうがよい!?

Javaから呼び出して、ミューテックスを作ったJavaがexitするとミューテックスをリリースしてくれているようなので、まず存在チェックして、なければCreateMutexする流れでよいと思う。
もちろんアプリケーションの起動シーケンス、環境、がシビアでない場合だけど。。。

JNIで、GetStringUTFCharsしたら、ReleaseStringUTFCharsを忘れないこと、繰り返し実行で、メモリリークよくわかる。Orz....

かっこわるいですがとりあえず、JNIコード(Cベース)

JNIEXPORT jboolean JNICALL Java_WindowsMutex_existMutex
(JNIEnv *env, jobject obj, jstring name)
{

const char *sname = (*env)->GetStringUTFChars(env, name, NULL);

HANDLE hMutex = CreateMutex(NULL, FALSE, sname);

if(hMutex == NULL){
(*env)->ReleaseStringUTFChars(env, name, sname);
return FALSE;
}

//既に存在している。
if(GetLastError() == ERROR_ALREADY_EXISTS){
CloseHandle(hMutex);
(*env)->ReleaseStringUTFChars(env, name, sname);
return TRUE;
}

CloseHandle(hMutex);
(*env)->ReleaseStringUTFChars(env, name, sname);
return FALSE;
}

[java][windows]共有メモリ - ファイルマッピング 2008/10/27

Javaです。windowsです。JNIで共有メモリです。
ファイルマッピングを使ってです。


ソースコード参考(まんまですが....)


動作させていません。(>_<)!
static {
System.loadLibrary("WindowsSharedMemory");
};

public native int CreateFileMapping();

public native int MapViewOfFile(int handle);

public native int ReadMemory(int addr);

public native int WriteMemory(int addr, int data);

public native boolean CloseMemory(int handle, int addr);



JNIのコード
#include <windows.h>
#include "jni.h"

JNIEXPORT jint JNICALL Java_WindowsSharedMemory_CreateFileMapping(JNIEnv *env, jobject obj) {
return((jint)CreateFileMapping((HANDLE)0xFFFFFFFF, NULL,
PAGE_READWRITE, 0, 0x100, "SharedMemory"));
};

JNIEXPORT jint JNICALL Java_WindowsSharedMemory_MapViewOfFile(JNIEnv *env, jobject obj, jint handle) {
return((jint)MapViewOfFile((HANDLE)handle, FILE_MAP_ALL_ACCESS, 0, 0, 0));
};

JNIEXPORT jint JNICALL Java_WindowsSharedMemory_ReadMemory(JNIEnv *env, jobject obj, jint addr) {
return((jint)(*(unsigned char *)addr));
};

JNIEXPORT jint JNICALL Java_WindowsSharedMemory_WriteMemory(JNIEnv *env, jobject obj, jint addr, jbyte data) {
return(*((unsigned char *)addr) = data);
};

JNIEXPORT jboolean JNICALL Java_WindowsSharedMemory_CloseMemory(JNIEnv *env, jobject obj, jint handle, jint addr) {
UnmapViewOfFile((void *)addr);
return((jboolean)CloseHandle((HANDLE)handle));
};

formでsubmitして、UnicodeDecodeErrorがでてデータストアできなかった。- google app engineで。 2008/10/26



GAE(google app engine)です。
フォームでサブミットしたら、 UnicodeDecodeErrorがでて、データストアできない状態。

いろいろごちゃごちゃ調べていて、HTTPリクエストから値をとるとこで、アウチ。

a.n = request.POST['n']

ここを下記のようにしたらオッケーだった。
a.n = request.POST['n'].decode('utf-8')


果たして、こうしないといけないのか、それともどこかにおまじないするだけですむのかよくわかってない....
まあ、なんとか日本語をストアできたので、よかったよかった...

なんだろう、やはりこういところで時間をとられたくないんだけど....

参考

djangoでテンプレート 2008/10/25

Djangoです。google app engineです。
Djangoのテンプレートを使ってみます。

すでにAppEngineにアプリケーションを作成して、Django ヘルパーを導入してあるところから。

まずapp(Djangoのmanage.pyの)ディレクトリを作成。

python manage.py startapp aaa


つぎに、urls.pyの編集。
urlpatterns = patterns('',
(r'^aaa/', 'aaa.views.hello'),
)

このパターンは、aaa/ではじまるものはaaaにあるviews.pyのhello関数を実行という意味。

つぎに、settings.pyにあるTEMPLATE_DIRS。
デフォルトで、
ROOT_PATH = os.path.dirname(__file__)
TEMPLATE_DIRS = (
os.path.join(ROOT_PATH, 'templates')
)


つぎに、テンプレートファイルを作成して、templatesにおいておきます。

つぎに、viewでテンプレートを読み込みます。

# -*- coding: utf-8 -*-
from django.http import HttpResponse
from django.template import Context, loader

def hello(request):
t = loader.get_template('a.html')
c = Context()
return HttpResponse(t.render(c))


まとめると、
まずテンプレートの場所をsettings.pyに記述。
viewsでテンプレートを読むためのモジュールをインポートして、
loaderでテンプレートを読み込み、コンテクストを渡して最後にrenderって流れです。

うーん、便利そうな感じです。あとモデルを使ってみて、どうデータを適用させるあたりで、よさげな予感がします。

Djangoではテンプレートエンジンは好きなのを使えるようです。
好きなモジュールを使ってテンプレートを読みこんで、レンダーって流れ(httpレスポンスに書き込む)ですればなんでもいいということなかな。

参考

sqlplusでVIEWの定義をみたい。 2008/10/24

Oracleです。sqlplusです。
定義されたVIEWをみたいです。
set longがミソのようです。


SQL> set long 20000
SQL> set head off
SQL> select TEXT from DBA_VIEWS where VIEW_NAME='ビュー';

instanceofであわせてnullチェック 2008/10/24

Javaです。
下記の結果は、どうなるか。

String s = null;
if(s instanceof String){
System.out.println("***"+s);
}

System.out.println("Hi o_o!");


instanceofってあわせてnullチェックぽく使えます。

[java1.4]URLConnectionのタイムアウト 2008/10/22

Javaです。
うーん、java1.5からURLConnectionに、setConnectTimeoutが追加されています。
ですが、1.4にはないです。
何かいろいろ解決策がありそうですが、面倒なので一律、システムプロパティで対応しようと思います。

そのときのプロパティは、下記のものでよさそうです。

sun.net.client.defaultConnectTimeout (デフォルト: -1)
sun.net.client.defaultReadTimeout (デフォルト: -1)


[python]djangoのviewで日本語 2008/10/21

pythonです。
non-asciiがほにゃららとおこられて、日本語が無理なのかと一瞬あせりましたが、ファイルの先頭に次の壱行でオッケーでした。

# -*- coding: utf-8 -*-


# -*- coding: utf-8 -*-
from django.http import HttpResponse

def init(request):
return HttpResponse("はい, Django!")


参考

web.xmlで、指定されたサーブレット名 2008/10/21

web.xmlで、指定されたサーブレット名はサーブレット上で、getServletConfig().getServletName()を使って取得できます。

クライアントが指定したURLはrequest.getRequestURL()で取得できます。

[jquery]アコーディオン - 開いて再度クリックして閉じたい場合 2008/10/20

jqueryです。
アコーディオンで開いて再度クリックして閉じたい場合には、

alwaysOpen: false

とします。

コードは、
$(document).ready(function(){
$("#example").accordion({
alwaysOpen: false
});
});


この alwaysOpenはデフォルトではtrueのようです。

[css] vertical-align:top 2008/10/12

tableでtdのvalign=topをCSSで表現する場合は、

td {
vertical-align:top;
}


ブラウザによってちょっと違うようなので、一律設定。
tableタグはもう使わないよ!っていわれそうだけど....

[php] サーバー変数やPOST,GETの値たんに表示。 2008/10/09

PHPです。サーバー変数やPOST,GETの値たんに表示したい。
ただそれだけ。



var_dump($_SERVER, $_GET, $_POST);


次に連想配列だからforeachでぐるぐるまわす。

foreach( $_GET as $key => $value ) {
echo htmlspecialchars($key) . "=" . htmlspecialchars($value) . "
";
}


ということ。

ちなみにhtmlspecialcharsは、「特殊文字を HTML エンティティに変換」です。HTML のマークアップ用文字を取り除くときに使えます。

AWTEventListenerを使って、テキストコンポーネント上にマウスカーソルを移動させると、枠線を変えるというコードです。 2008/10/09

Toolkit.getDefaultToolkit().addAWTEventListener使うと画面のイベントを根こそぎ取得できるので、それを使って、テキストコンポーネント上にマウスカーソルを移動させると、枠線を変えるというコードです。

static {
Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
class TempBorder extends LineBorder{
public TempBorder(Color color, Border original) {
super(color, 5);
this.original = original;
}
private static final long serialVersionUID = 1L;
Border original;
}
public void eventDispatched(AWTEvent awtevent) {
// System.out.println(awtevent);
if (awtevent instanceof MouseEvent) {
MouseEvent m = (MouseEvent) awtevent;
if (m.getID() == MouseEvent.MOUSE_ENTERED) {
// System.out.println(awtevent);
if (m.getSource() instanceof JTextComponent) {
JTextComponent textComponent = (JTextComponent) m
.getSource();
TempBorder tempBorder = new TempBorder(Color.RED, textComponent.getBorder());
textComponent
.setBorder(tempBorder);
System.out.println("textcomponent:[" + textComponent + "]");
}
}
if (m.getID() == MouseEvent.MOUSE_EXITED) {
if (m.getSource() instanceof JTextComponent) {
JTextComponent textComponent = (JTextComponent) m
.getSource();
Border border = textComponent.getBorder();
if(border instanceof TempBorder){
TempBorder tempBorder = (TempBorder)border;
textComponent.setBorder(tempBorder.original);
}
}
}
}
}
}, 0xffffffff);
}

[jquery]Validation,Impromptu,Formのプラグイン 2008/10/08

シナリオ
「フォームの内容を送信します。フォームの内容はバリデーションします。バリデーションしたあとに確認ダイアログをだして、OKだった場合、AJAXして、結果ダイアログをだします。」

使うのはjQueryプラグイン3種類。



Validationはsubmitすると勝手にvalidateしてくれます。
Impromptuはプロンプト、ダイアログをだすに使えます。
Formプラグインは、フォームの中身をajaxして通信してくれるみたい。


僕が注意した要点だけかいつまんで。
まずフォームのsubmitの処理を変更。

$('#f').submit(function(){ return true; });


ValidationのruleでsubmitHandlerをコールバック関数を定義。
フォームの内容がOKの場合呼ばれるようにします。

バリデーションのルールを定義。
例)
var rules = {
submitHandler: function() { prompt(); },
rules:{
fullname_kanji:{ my_check:'お名前(漢字)' }
// そのルールを記述
}
};


バリデーションのルールの渡し方は、
$("#f").validate(rules);

次にsubmitHandlerで呼ばれる関数を定義します。
この中でダイアログをだします。
やっていることは確認ダイアログだしてOKなら通信してsuccessならまたダイアログをだす。
※ここのコードはおおざっぱ。
function prompt(){
$.prompt(msg, { buttons: { Ok: true, Cancel: false }, focus: 1,
callback:function(v, m){
if(v){  // OKの場合
var options = {
url: '通信先.php',
type: 'post',
success: function() {
//処理が成功のときのダイアログ
$.prompt('送信しました。',{
buttons: { 'トップページに移動': 'トップページに移動', Bye: 'Good Bye' }
});
}
};// options end
$('#f').ajaxSubmit( options );
}// if end
}
});
}


jQueryのプラグインのコードをいろいろみて、寄せ集め的に作成したので、参考にならないけど....

[jquery]Validationに独自ばりデータの追加。 2008/10/05

独自バリデーターの追加です。


バリデーションのプラグインを追加して独自のバリデーターを追加してみます。

参考コードは、ダウンロードしたパッケージの中に、additional-methods.jsがありました。

jQuery.validator.addMethod("my_check", function(value, element, param) {
//トリムして判断
var s = jQuery(value).text().replace(/^\s+|\s+$/g, '');
return (0 == s.length);
}, jQuery.format("▼「{0}」の項目は必ず入力してください。"));


つぎに、HTMLコードには手を入れずスクリプト側からの設定します。
フォームのオブジェクトにnameが設定されていることを前提にしてます。

$("input[@name=fullname_kanji]").attr("my_check", 'お名前(漢字)');

[jquery]jQuery plugin: Validationでエラーメッセージの色を変えたいんだけども。 2008/10/05
2008/10/05



エラーのメッセージの色を赤にしたくて試行錯誤の上下記のCSSを追加でいい感じ。
メッセージの日本語化は、jQueryでフォームの入力チェックする、jquery.validate.js とエラーの日本語化:Goodpicを参考に。

<style type="text/css">
form.cmxform label.error, label.error {
color: red;
}
</style>


[perl]配列をランダムに並べ替えます。 2008/10/03

Perlです。
配列をランダムに並べ替えます。
もとネタはPerlクック本です。

sub shuffle {
my $array = shift;
my $i;
for ($i = @$array; --$i;) {
my $j = int rand ($i+1);
next if $i == $j;
@$array[$i, $j] = @$array[$j, $i];
}
}

@array = ("10001", "10002", "10003");
print "@array\n";
shuffle(\@array);
print "@array\n";


僕のもっているPerlクック本ではレシピ4.17です。

次に配列の中に配列がある場合に、中の配列の値をシャッフルしてひとつにしてみます。
この機能の関数名をどうつけてよいのやら....
sub shuffle {
my $array = shift;
for ($i = @$array; --$i;) {
my $j = int rand ($i+1);
next if $i == $j;
@$array[$i, $j] = @$array[$j, $i];
}
}

#
sub a {
my $array = shift;
my $i;
foreach $item (@$array){
if(ref($item) eq 'ARRAY'){
shuffle($item);
$item = @$item[0];
}
}

}

$array = [["10001", "10002", "10003"], "10004", "1005"];
print "@$array\n";
a($array);
print "@$array\n";

[java]正規表現の練習 - アルファベットと数字以外にマッチ 2008/10/02

Javaです。正規表現の練習です。

アルファベットと数字以外にマッチです。
文字列に「アルファベットと数字」以外が含まれているか調べます。
すなわち「アルファベットと数字」がでてくるまで調べるということだと理解しました。

悩んだあげく下記のようなコードにしてみました。

static boolean b(String s) {
return s.matches(".*[_\\W].*");
}
static boolean a(String s) {
return s.matches(".*[^\\p{Alnum}].*");
}


最初のメソッドは
\Wは、非単語文字:[^\w]なのですが単語構成文字:[a-zA-Z_0-9]にはアンダアスコアが含まれているのでそれを先に記述しています。

つぎのメソッドは\p{Alnum}ではないものをさがすというメソッドです。
\p{Alnum}は、英数字: [\p{Alpha}\p{Digit}]という意味です。

えーと
まとめると正規表現を書くうえで、「~なものを探す」、「~でないものを探す」というこのふたつアプローチがあるのかなぁというわけです。

[perl] foreach構文の特徴 エイリアシング 2008/10/01

Perlです。
foreach構文です。
繰り返し変数は値のコピーではなく、エイリアシングです。

これを知っているとすごく値の変更が簡単にできそうな予感です。

論よりコード

@array = (1, 2, 3);
foreach $item (@array) {
if($item == 2){
$item = "A";
}
}

print "@array\n";


結果
1 A 3


これ知っちゃうと他の書き方したくなくなりそうな気がしますがどうでしょうか。

[perl]配列の配列 その2 2008/09/30

Perlです。配列の配列です。
これはリファレンスを使うやり方なのだと思う。

配列リファレンスをでリファレンスするには、リファレンスの前に@をつける。

my $arr = [["0001", "0002", "0003"], "a", "b", "c", "d"];
print "content[@$arr]\n";
print "size[".@$arr."]\n";

#配列にアクセス
print @$arr[2]."\n";

#これはだめ
#print @$arr[0][2]."\n";

#エラーにはならないけど期待した結果ではない...
#print $arr[0][2]."\n";

#これはOK
print @$arr[0]->[2]."\n";

[perl]配列の配列 2008/09/30

Perlです。

配列の要素に配列を定義しようと思いました。

配列って丸括弧だったようなぁということで

my @arr = ("a", "b", "c", "d");

としました。

次に最初の要素を配列にしたいと思い下記のようにしました。
my @arr = (("0001", "0002", "0003"), "a", "b", "c", "d");

としました。

サイズを表示させてみると5を期待していたのですが、7と表示されてしまいました。

ちなみにPerlで配列の長さは@arrらしいのですが、これを下記のようにすると配列の中身が表示されます。
my @arr = (("0001", "0002", "0003"), "a", "b", "c", "d");
print "content[@arr]\n";
print "size[".@arr."]\n";


うーん、丸括弧に丸括弧だから配列に配列指定している感じがでてると思ったのですが....

次に、四角括弧(!?)を使ったらうまくいきました。
my @arr = (["0001", "0002", "0003"], "a", "b", "c", "d");
print "content[@arr]\n";
print "size[".@arr."]\n";


きっときちんとした理由があるはずです。

参考
配列の配列

配列の配列にアクセスするのは
my @arr = (["0001", "0002", "0003"], "a", "b", "c", "d");
print "content[@arr]\n";
print "size[".@arr."]\n";

#配列にアクセス
print @arr[2]."\n";

#これはだめ
#$print @arr[0][2]."\n";

#これはOK
print $arr[0][2]."\n";


@じゃないんだ...

レファレンスがよく理解できてないからなぁ
もうちょっと追求しよう...