ActionScript の Array は dynamic オブジェクトな件

Java を書いてから、ActionScript 3 に戻ると、改めてプロトタイプベースであることを感じることがあります。 今日も Array に関してそんなネタがあったのでメモ。 var array:Array = new Array(); array[“sss”] = 20; array[-1] = “Aaa”; 上記はいずれも通ります。ちなみに負の添え字でセットしても length は 0 のままです。 var array:Array = new Array(); trace(array[10]); 上記は RangeError にならず、undefined が返ります。Vector だと RangeError になります。 var array:Array = new Array(); array[100] = “item”; trace(array[“100”]); 上記のように添え字を文字列しても、ちゃんと item が返ります。length は 101 となり、0〜99までの要素は undefined になります。 var array:Array = new Array(); array[100] = “item”; trace(0 in array); // false; trace(100 in array); // true; ...

2010年8月19日 · Toshimitsu Takahashi

S2JDBC から Amazon RDS の MySQL を UTF-8 で扱うには

Amazon RDS を初めて使って、文字化けからなかなか解放されなかったので、メモしておく。 DB Parameter Group の作成 まず、Amazon RDS には DB Parameter Group という設定グループがある。my.cnf に定義するような設定はこのグループに対して適用する。 DB Parameter Group に Character 関係の設定を UTF-8 にしたものを作っておき、DBインスタンスに適用する。 S2JDBC これはS2JDBCというより、JDBC URLの設定だが characterEncoding=UTF-8 を付加する。 テーブル作成時に文字コード](http://d.hatena.ne.jp/keyword/%CA%B8%BB%FA%A5%B3%A1%BC%A5%C9)を指定 CREATE TABLE に DEFAULT CHARSET=utf8 を指定する。 ※ちなみに MySQL のテーブル名は普通に使うと大文字小文字の区別がいるため、Entity クラスに @Table(name=小文字) のアノテーションを定義しておく。

2010年8月13日 · Toshimitsu Takahashi

Tomcat で静的ファイル群のあるディレクトリにパスを通したい

ディストリビュート環境は Apache + Tomcat なんだけどローカル環境では Tomcat のみというとき、 /var/www/html みたいなディレクトリをローカルに用意したいときがある。 そんなときの設定メモ。 TOMCAT_HOME\conf\Catalina\localhost に下記のファイルを置く。 html.XML 1 2 3 <Context path="/html" reloadable="false" docBase="C:\\var\\www\\html"> <Logger className="org.apache.catalina.logger.SystemOutLogger" verbosity="4" timestamp="true"/> </Context>

2010年8月12日 · Toshimitsu Takahashi

Twitter 計画的メンテナンス中のスクリーンショット

計画的なメンテナンス中の Twitter 。せっかくなんでスクリーンショットを撮っておいた。 クジラじゃないですよ。

2010年8月1日 · Toshimitsu Takahashi

ActionScript 3 で Vector クラスの配列を動的に生成するには

オブジェクトのシリアライズに関する実装をする上で、Vector クラスのリフレクションはできるのか調べてみた。 Vectorクラス名を取得 var classInfo:Object = ObjectUtil.getClassInfo(Vector.); trace(classInfo.name); とすると出力は下記のようになった。 __AS3__.vec::Vector.com.tilfin.sample::Entity こんどは、getDefinitionByName を使って生成してみると var cls:Class = getDefinitionByName("__AS3__.vec::Vector.com.tilfin.sample::Entity") as Class var vector:Vector. = new cls(); もちゃんと上手くいった。ということで色々できそうです。 Vectorユーティリティクラス サンプルとして試しに書いてみた。 package { import flash.utils.getDefinitionByName; import flash.utils.getQualifiedClassName; public class VectorUtil { /** * 指定されたオブジェクトをエレメントとするVectorクラスの配列を返します。 * * @param args 1つ以上のオブジェクトもしくは配列 * @return Vectorインスタンス * / public static function toVector(…args): { var item:; var items:Array; if (args.length == 1) { item = args[0]; if (item is Array) { items = item as Array; } else { items = [ item ]; } } else { items = args as Array; } if (!items || items.length == 0) { throw new ArgumentError(“requires at least one argument.”); } item = items.shift(); var vectorClass:Class = getVectorClass(item); var vector: = new vectorClass(); vector.push(item); for each (var i:* in items) { vector.push(i); } return vector; } /** * 指定されたオブジェクトクラスを格納するVectorクラスオブジェクトを返します。 * * @param value 完全修飾クラス名が必要なオブジェクト * @return Vectorクラスオブジェクト * / public static function getVectorClass(value:):Class { var className:String; if (value is String) { className = value; } else { className = getQualifiedClassName(value); } return getDefinitionByName("__AS3__.vec::Vector.<" + className + “>”) as Class; } } } ...

2010年7月24日 · Toshimitsu Takahashi

ActionScript 3 らしく書いてみたシングルトンのサンプル

Java ライクなシングルトンのサンプルが多いので自分なりに ActionScript らしく書いてみました。 AIR 2 の flash.filesystem.StorageVolumeInfo - Adobe® Flex® 4.1 リファレンスガイド クラスのシングルトン実装が良さそうなのでこれを参考にしてみました。 StorageVolumeInfo は静的な storageVolumeInfo プロパティでシングルトンインスタンスを提供している。 new StorageVolumeInfo() すると、ArgumentError #2012 例外が投げられるようになって-いる。 package { import flash.utils.getQualifiedClassName; /** * シングルトンのサンプル / public class SingletonSample { private static var _instance:SingletonSample = new SingletonSample(); /* * シングルトン提供プロパティ名をクラス名のLowerCamelにする */ public static function get singletonSample():SingletonSample { return _instance; } public function SingletonSample() { if (_instance) { throw new ArgumentError(getQualifiedClassName(this) + " クラスをインスタンス化することはできません。"); } // 初期化処理 _name = “sample name”; } private var _name:String; public function get name():String { return _name; } } } ...

2010年7月22日 · Toshimitsu Takahashi

Bash でスクリプト実行時に必ずそのファイルの場所に移動させたい

そんなときは下記を仕込んでおく。 #!/bin/bash BASEDIR=${0%/*} cd $BASEDIR

2010年6月29日 · Toshimitsu Takahashi

UIViewController の init の中で self.view を参照しない方がいい

Xibファイルを使わずコードで書いてビューの生成を生成したいとき、ViewController の init メソッドの中で子ビューの初期化を下記の場所でしたくなるが、この時点ではベースとなる View 自体が生成されていないので、self.view を参照した時点でこの ViewController が実装する loadView, viewDidLoad が呼ばれてしまう。 - (id)init { if (self = [super init]) { // ここで子ビューの初期化 // self.view を参照してはいけない } } たとえば、下記のようなコードだと(1),(2),(3)の順に実行されてしまう。 - (id)init { if (self = [super init]) { CGRect rect = self.view.bounds; //(1) UIView *subview = [[UIView alloc] initWithFrame:rect]; //(3) … } } - (void)loadView { //(2) } 子ビューの生成は loadView で全て行うか、init では alloc, init にとどめ、位置、サイズかかわる設定は loadView 以降で行うこと。 サイズなどを決めうちで実装していて、上記の動作には気がついていなかった。 ということで初 iPhone SDK がらみのエントリーでした。

2010年6月27日 · Toshimitsu Takahashi

Java で整数値を基数 62 の文字列に変換するには

Integer.toString だと基数 36 (0-9a-z) までしか対応していなかったので自前で作った。 自然数を 62進数表記(0-9a-zA-Z)に変換する。 public static String toBase62String(final long value) { long val = value; StringBuilder sb = new StringBuilder(7); while (val > 0) { int mod = (int)(val % 62); if (mod < 10) { // 数字 sb.append(mod); } else if (mod < 36) { // 英小文字 a = 97 // mod = mod - 10 + 97 mod += 87; sb.append((char)mod); } else { // 英大文字 A = 65 // mod = mod - 36 + 65 mod += 29; sb.append((char)mod); } val = val / 62; } return new String(sb.reverse()); }

2010年6月22日 · Toshimitsu Takahashi

CentOS 5.5 にアップグレードしたら lighttpd が起動しなくなったので対処

先日、CentOS 5.5 が出たため、yum upgrade をしたところ openssl のバージョンアップによって、lighttpd の起動時に network.c でエラーが出るようになってしまいました。 SSL: error:00000000:lib(0):func(0):reason(0). RPMForgeの最新の lighttpd 1.4.22 ではダメで、lighttpd 1.4.26-2 に上げるため別途 rpm を落としてきました。 Redhat 5 系の RPM パッケージでよさそうなのが下記にありました。 ftp://ftp.univie.ac.at/systems/linux/fedora/epel/5/i386/ 上記サイトから下記のパッケージを順にインストールします。 lua-5.1.2-1.el5.i386.rpm spawn-fcgi-1.6.2-1.el5.1.i386.rpm lighttpd-1.4.26-2.el5.i386.rpm lighttpd-fastcgi-1.4.26-2.el5.i386.rpm /etc/lighttpd/ を予め tar などしてバックアップしておきます。 yum remove で RPMForge から落として入れていた lighttpd, lighttpd-fastcgi を削除します。 上記のパッケージを rpm -ivh 〜 コマンドでインストール。 /etc/lighttpd/lighttpd.conf を lighttpd.conf.rpmsave から復帰させて無事起動するようになりました。

2010年5月25日 · Toshimitsu Takahashi