2011/10/25 0 コメント

symfony2ブログ開設しました。

これからは、Symfony2に関してはSymfony2.GrAFRに書いてきます!
よろしくお願い致します。
2011/10/06 0 コメント

No input file specified.

Symfony2をさくらインターネットで動かそう!!とか思って phpのバージョンを 5.3.8 (CGI版) にした。
で、Symfony2 を動かした所、「No input file specified.」というエラーが。。。。

まぁ、エラーの内容はSymfony2とは関係ないんだけれど。。

これは、CGI版PHP環境でなんかのmoduleを使用する際に起こるらしい。
やっぱりVPSを契約してもらうべきだったか。。。と思ったけど、普通に解決できたので問題ないっぽい!!

ただ、php.iniに
cgi.fix_pathinfo = 1
を加えるだけでOKっぽいです。同時にタイムゾーンも指定しておきました。
date.timezone = Asia/Tokyo
2011/07/21 0 コメント

Cent OS (5.5) に MeCab をインストール

MeCab: Yet Another Part-of-Speech and Morphological Analyzer

MeCabで形態素解析!ってことで、CentOS (5.5) にさっそく MeCab0.98 を導入してみます。

① まず MeCabのインストール
[root@ ~]# wget 'http://downloads.sourceforge.net/project/mecab/mecab/0.98/mecab-0.98.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fmecab%2Ffiles%2F&ts=1283097111&use_mirror=jaist'
[root@ ~]# tar xvfz mecab-0.98.tar.gz
[root@ ~]# cd mecab-0.98
[root@ ~]# ./configure
[root@ ~]# make
[root@ ~]# make install

② IPA 辞書をダウンロード
IPA 辞書, Juman 辞書 があるが、前者が推奨されていたので、それをダウンロードします。また, configureの際に文字コードを指定します(UTF-8とします)。
違う文字コードでインストールしてしまった場合は、make uninstall してからやり直せばOK
[root@ ~]# wget 'http://downloads.sourceforge.net/project/mecab/mecab-ipadic/2.7.0-20070801/mecab-ipadic-2.7.0-20070801.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fmecab%2Ffiles%2F&ts=1283097195&use_mirror=jaist'
[root@ ~]# tar xvfz mecab-ipadic-2.7.0-20070801.tar.gz
[root@ ~]# cd mecab-ipadic-2.7.0-20070801
[root@ ~]# ./configure --with-charset=utf8
[root@ ~]# make
[root@ ~]# make install


※ これで終了。最後に何か文字列(明日は明日の風が吹く)を解析してみます。

[root@ ~]# mecab
明日は明日の風が吹く
明日 名詞,副詞可能,*,*,*,*,明日,アシタ,アシタ
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
明日 名詞,副詞可能,*,*,*,*,明日,アシタ,アシタ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
風 名詞,一般,*,*,*,*,風,カゼ,カゼ
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
吹く 動詞,自立,*,*,五段・カ行イ音便,基本形,吹く,フク,フク
EOS


※ おまけとして、PHPからアクセスするために MeCab extension をインストールします。
http://d.hatena.ne.jp/yoshi-ken/20110621 の記事を参考にさせていただきました!
pear channel-discover pecl.opendogs.org
pear install opendogs/mecab-beta
echo "extension=mecab.so" > /etc/php.d/mecab.ini
php -m | fgrep mecab #インストールに成功していたら「mecab」という行が表示されます

<?php
$target_str = "明日は明日の風が吹く";
$result = mecab_split($target_str);
print_r($result);
?>

これで Array ( [0] => 明日 [1] => は [2] => 明日 [3] => の [4] => 風 [5] => が [6] => 吹く ) となります。
2011/07/13 0 コメント

iPhone - json-framework

jsonのパースをしたかったので、ちょっと調べてみたら、json-frameworkというのがヨサゲ。
ってことで導入してみました。

json-frameworkは Google Code にあります。http://code.google.com/p/json-framework/

① GitHubからダウンロード! (v3.0.1),
② Classesの中身をプロジェクトにインポート!(自分は, JSONというグループを作成し、そこにインポートしました。)


③ 利用したいクラスの先頭で
#import "SBJson.h"
とすれば、OK。

④ あとは NSString として jsonデータを与えパースすれば、配列として返ってくるっぽい
NSArray jsonArray = [json_str JSONValue];


ってことで json-framework についての簡単なメモでした。
2011/07/12 0 コメント

iPhone - 開発入門② IBを使用しない場合

Interface Builder を使用しないでアプリケーションを作成する場合は, 最初に以下の手順を行い, IBを使用しない設定に変更する。

① Window-based Application でプロジェクトを作成する。(プロジェクト名はHogeとする)

② Resouces 内の xibファイルである「MainWindow.xib」を削除する。

③ Resouces 内の「Hoge-Info.plist」を開き, 一番下の「Main nib file base name」のプロパティを削除

④ Other Sources 内の「main.m」を開き、以下の様変更を加える。(通常は, xibファイルがDelegateクラスを呼び出していたが、それを削除しため指定してやる必要がある。)

< 変更前 >
int main(int argc, char *argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}

< 変更後 >
int main(int argc, char *argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, @"HogeAppDelegate");
    [pool release];
    return retVal;
}


⑤ Other Sources 内 のファイルで, @property や @ synthesize を削除してしまう。

_________________________________________________________

これで設定は完了です。あとは, HogeAppDelegateで自分でwindowの作成をし、viewをつくっていく感じ。

// HogeAppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    
    // windowを作成
    CGRect screenbounds = [[UIScreen mainScreen] bounds];
    window = [[UIWindow alloc] initWithFrame:screenbounds];

    /**
     * ここでwindow上にaddSubviewしていけば良い
     */

    [window makeKeyAndVisible];

    return YES;
}
0 コメント

iPhone - 開発入門① テンプレートの選択

※Xcodeのインストール等の環境構築の説明は行いません。

まず, Xcodeを起動して, テンプレートタイプを選ぶ。(以下の画面)



まず、どのテンプレートを使用すればいいかで困惑するはずです。
テンプレートは以下の物

  • Navigation-based Application
    リストの項目を選択したら、その項目について階層的に潜っていくような階層構造を持ったタイプ。
  • OpenGL ES Application
    3Dのグラフィックを使用したゲームなどのようなOpenGLを使用したタイプ
  • Split View-based Application
    iPadでSplit Viewを使うようなタイプ
  • Tab Bar Application
    下部にTabを生成しウィンドウを切り替えるタイプ
  • Utility Application
    iPhoneの天気アプリのような、フリップして裏画面で設定を行うようなタイプ
  • View-based Application
    ビューを1つだけ使用するタイプ
  • Window-based Application
    全ての基礎となるタイプ

しかし、音楽のための iPodアプリケーションのように、タブがあってナビゲーションもあるアプリを作りたい場合、どうすればよいか?という疑問が浮かぶはずです!

この場合は, Tab Bar Application の タブの1つとして Navigation-based のビューを生成すれば良い。


※ 基本的にInterface Builder(以下IB)を利用して画面を生成していくのですが、その方法だと裏側がどうなっているのかが理解できず、タブがあってナビゲーションもあるアプリのように複雑なものは理解しずらいのでは?と思います。そこで、IBを使用しないで作成する方法で記事を書いていきます。(個人的にIBはよくわからないっていうのが本音なんですけどね。笑) そのため、Window-based Application を使用していきます

次回は、その前提としてアプリケーションの画面の構成について自分なりにまとめてみます。
2011/05/30 0 コメント

Android - SQLiteでの複数レコード挿入

複数のレコードを追加するためのメソッドを作成しました。
conflictAlgorithm には, SQLiteDatabase.CONFLICT_NONE, SQLiteDatabase.CONFLICT_REPLACE などの, コンフリクトが発生した場合の処理を指定します。
また, transaction を true にした場合は, トランザクション処理を併用します。

/**
 * insert a lot of data
 *
 * @param nullColumnHack 
 * @param valueList 値のリスト
 * @param conflictAlgorithm コンフリクト発生時の処理
 * @param transaction トランザクション処理を併用するか否か
 * @return Boolean 成功 or 失敗
 */
public Boolean insertMany(SQLiteDatabase db , String table , String nullColumnHack, List<ContentValues> valueList, int conflictAlgorithm, Boolean transaction) {
    
    if(valueList != null && valueList.size() > 0){
        String[] CONFLICT_VALUES = new String[]{"", " OR ROLLBACK ", " OR ABORT ", " OR FAIL ", " OR IGNORE ", " OR REPLACE "};

        // At first, create sql statement
        ContentValues initialValues = valueList.get(0);
        
        // Measurements show most sql lengths <= 152
        StringBuilder sql_build = new StringBuilder(152);
        sql_build.append("INSERT");
        sql_build.append(CONFLICT_VALUES[conflictAlgorithm]);
        sql_build.append(" INTO ");
        sql_build.append(table);
        // Measurements show most values lengths < 40
        StringBuilder values = new StringBuilder(40);

        Set<Map.Entry<String, Object>> entrySet = null;
        
        if (initialValues != null && initialValues.size() > 0) {
            entrySet = initialValues.valueSet();
            Iterator<Map.Entry<String, Object>> entriesIter = entrySet.iterator();
            sql_build.append('(');

            boolean needSeparator = false;
            while (entriesIter.hasNext()) {
                if (needSeparator) {
                    sql_build.append(", ");
                    values.append(", ");
                }
                needSeparator = true;
                Map.Entry<String, Object> entry = entriesIter.next();
                sql_build.append(entry.getKey());
                values.append('?');
            }
            sql_build.append(')');
        } else {
            sql_build.append("(" + nullColumnHack + ") ");
            values.append("NULL");
        }

        sql_build.append(" VALUES(");
        sql_build.append(values);
        sql_build.append(");");
        String sql = sql_build.toString();
        
        SQLiteStatement statement = null;
        
        // if transaction id true, beginTransaction()
        if(transaction){
            db.beginTransaction();
        }
        try {
            for(int i=0,length=valueList.size(); i<length; i++){
                statement = db.compileStatement(sql);
                initialValues = valueList.get(i);
                entrySet = initialValues.valueSet();
                
                // Bind the values
                if (entrySet != null) {
                    int size = entrySet.size();
                    Iterator<Map.Entry<String, Object>> entriesIter = entrySet.iterator();
                    for (int j = 0; j < size; j++) {
                        Map.Entry<String, Object> entry = entriesIter.next();
                        DatabaseUtils.bindObjectToProgram(statement, j + 1, entry.getValue());
                    }
                }
                // Run the program and then cleanup
                statement.execute();
                statement.close();
            }
            
            // if transaction id true, setTransactionSuccessful()
            if(transaction){
                db.setTransactionSuccessful();
                db.endTransaction();
                transaction = false;
            }
            return true;
        } catch (SQLiteDatabaseCorruptException e) {
            throw e;
        } finally {
            if (statement != null) {
                statement.close();
            }
            // if transaction id true, endTransaction()
            if(transaction){
                db.endTransaction();
            }
        }
    }
    return false;
}
 
;