PHP gettext

gettextで多言語対応サイトを作る場合
コード・.po・.moファイルの作成は
http://el.jibun.atmarkit.co.jp/kaigaiengineer/2010/08/i18ngettextphp-.html
を参考にしつつできたが、サーバ側の設定でハマった。

以下、ubuntu + nginxで日中英対応の場合にやったことです。

% cat /usr/share/i18n/SUPPORTED |grep -i "zh_CN" > /var/lib/locales/supported.d/zh
.
.
.
使用するlocaleを追加していく

% dpkg-reconfigure locales

% locale -a
-> 使用するlocaleがあるか確認

// ここ重要
// .moファイルをキャッシュしているらしい
% sudo service php5-fpm restart

Geographic Data

Getting Started With GEO, CouchDB, and Node.js

Getting Started With GEO, CouchDB, and Node.js

"Getting Started with GEO, CouchDB and Node.js"を読んでいて、homebrewでGDALをインストールしようとすると失敗したので手動での準備のためのメモ。

GDAL Complete

http://www.kyngchaos.com/software:frameworks
からGDAL Completeをダウンロード>インストール。


~/.zsh_rc等にパスを通す

export PATH=/Library/Frameworks/GDAL.framework/Programs:$PATH
% source ~/.zshrc

// サンプルデータ
% git clone https://github.com/dthompson/example_shapefile_to_geojson.git

% cd example_shapefile_to_geojson/110m_lakes/
110m_lakes.dbf 110m_lakes.prj 110m_lakes.shp 110m_lakes.shx
% ogrinfo 110m_lakes.shp
INFO: Open of `110m_lakes.shp'
      using driver `ESRI Shapefile' successful.
1: 110m_lakes (Polygon)

% ogrinfo -so 110m_lakes.shp 110m_lakes 
INFO: Open of `110m_lakes.shp'
      using driver `ESRI Shapefile' successful.

Layer name: 110m_lakes
Geometry: Polygon
Feature Count: 26
Extent: (-124.953634, -16.536406) - (109.929807, 66.969298)
Layer SRS WKT:
GEOGCS["GCS_WGS_1984",
    DATUM["WGS_1984",
        SPHEROID["WGS_1984",6378137.0,298.257223563]],
    PRIMEM["Greenwich",0.0],
    UNIT["Degree",0.0174532925199433]]
ScaleRank: Integer (10.0)
FeatureCla: String (32.0)
Name1: String (254.0)
Name2: String (254.0)

% ogr2ogr -f "GeoJSON" 110m_lakes.json 110m_lakes.shp
% cat 110m_lakes.json 
{
"type": "FeatureCollection",
"features": [ .....

C++入門

最近、OpenframeworksやCinderでグラフィックやアニメーションを趣味でやり始めたものの、C++に関する基礎体力が皆無なので、0から勉強することにしました。

教科書

ロベールのC++入門講座

ロベールのC++入門講座

目標

紙とペンの代わりに、やりたいことをコードに落とせる程度にはC++を書けるようになる。

大体の流れ(目次から)

まずは使い方
Hello World~簡単な計算
C++の基本
変数、関数、スコープ、条件分岐、ループ
ほんの少し深く
型とキャスト、参照、文字列、数学関数
ポインタ天国
ポインタ、配列とポインタ、const
クラスの前に
多次元配列、構造体、列挙体、分割コンパイル
クラスの基礎
基本、メンバ関数、コンストラクタ、private、デストラクタ
クラスの本領
継承、オーバライド、仮想関数
ファイルとストリーム
ファイル操作、ファイルポインタ、名前空間
テンプレート
関数テンプレート、クラステンプレート、vector
エラー処理と例外
goto、例外
もっと高く
静的メンバ変数、メンバ定数、テンポラリオブジェクト
もっともっと高く
ビット操作、インライン関数、シノニム、マクロ、モードチェンジ
もっと深く
多重継承、仮想継承、インタフェース、関数ポインタ
もっともっと深く
ショートサーキット、#if、mainの戻り値、コマンドライン引数
データ構造
単方向・双方向リスト、イテレータ、スタック・キュー、再帰関数、ツリー、2分探索木、ハッシュ
C++の落ち穂拾い
共用体、無名構造体、ビットフィールド、可変長配列メンバ

Backbone.js アプリのモジュール化

Organizing your application using Modules (require.js)


require.jsでBackboneのView,Model,Routerやらを分けたい場合
underscore.js v1.2.1を使っていると動かないので
若干変えてみました。

https://github.com/daigo3/Backbone-Skelton

openFrameworks 入門#01 install ~ Hello World

openFrameworks http://www.openframeworks.cc/

openFrameworks is an open source C++ toolkit for creative coding.

2. 準備

以下、v0.062 + Mac OSX 10.6 + Xcode4環境です。

プロジェクトテンプレートをインストール

Xcodeが起動している場合には、終了しxcode templates/Project Templates/openFrameworksを
Library/Application\ Support/Developer/Shared/Xcode/Project\ Templates/ に配置します。

% mv xcode\ templates/Project\ Templates/openFrameworks/ ~/Library/Application\ Support/Developer/Shared/Xcode/Project\ Templates/.

Xcodeを起動すると新規プロジェクト作成時にテンプレートを選べるようになるらしいですが
Xcode4ではテンプレートフォーマットが異なるので使えないぽい。


ので、結局 "apps/examples/emptyExample"をコピーして使うことにします。

Xcodeでプロジェクトをつくる
% pwd
PATH/TO/of_preRelease_v0062_osxSL_FAT/apps/examples
% cp -R emptyExample/ ./helloWorld


Xcodeでプロジェクトを開き、Project Nameとファイル名、ソース内の"testApp"となっているところを修正します。


プロジェクトをクリーンして問題なければ、とりあえず実行してみると
1024px * 768pxのウィンドウが表示されます。(ESCキーで終了)

3.Hello World!

文字列を描画するにはdrawStringという関数を使うらしいので、apps/examples/fontsExampleを参考にhelloWorld.h/helloWorld.cpp/main.cppを編集


helloWorld.h

#ifndef _HELLO_WORLD
#define _HELLO_WORLD

#include "ofMain.h"

class helloWorld : public ofBaseApp{

public:
  void setup();
  void update();
  void draw();

  void keyPressed  (int key);
  void keyReleased(int key);
  void mouseMoved(int x, int y );
  void mouseDragged(int x, int y, int button);
  void mousePressed(int x, int y, int button);
  void mouseReleased(int x, int y, int button);
  void windowResized(int w, int h);

  ofTrueTypeFont myriad;
};

#endif


helloWorld.cpp

void helloWorld::setup(){
  myriad.loadFont("MyriadWebPro.ttf", 32);
  ofBackground(255, 255, 255);
}

void helloWorld::draw(){
  ofSetColor(0, 0, 0);
  myriad.drawString("Hello World!", 130, 155);
}


main.cpp

#include "ofMain.h"
#include "helloWorld.h"
#include "ofAppGlutWindow.h"

//========================================================================
int main( ){
 
  ofAppGlutWindow window;
     ofSetupOpenGL(&window, 500,310, OF_WINDOW); // <-------- setup the GL context
 
     // this kicks off the running of my app
     // can be OF_WINDOW or OF_FULLSCREEN
     // pass in width and height too:
     ofRunApp( new helloWorld());
 
}


使用するフォントをhelloWorld/bin/data以下にコピー

% cp /Library/Fonts/MyriadWebPro.ttf ./helloWorld/bin/data/.

実行すると以下の様なウィンドウが表示されます。

Hello World!をいじってみる

キー入力によって文字色を変える

r = 赤、g = 緑、b = 青のように文字色を変えてみる。初期文字色は白

helloWorld.cpp

#ifndef _HELLO_WORLD
#define _HELLO_WORLD

#include "ofMain.h"

class helloWorld : public ofBaseApp{

public:
  void setup();
  void update();
  void draw();

  void keyPressed  (int key);
  void keyReleased(int key);
  void mouseMoved(int x, int y );
  void mouseDragged(int x, int y, int button);
  void mousePressed(int x, int y, int button);
  void mouseReleased(int x, int y, int button);
  void windowResized(int w, int h);

  ofTrueTypeFont myriad;
  int color;
};

#endif

helloWorld.h

void helloWorld::setup(){
  myriad.loadFont("MyriadWebPro.ttf", 32);
  ofBackground(255, 255, 255);
  color = 0xffffff;
}

void helloWorld::draw(){
  ofSetColor(color);
  myriad.drawString("Hello World!", 130, 155);
}

void helloWorld::keyPressed(int key){
  if(key == 'r') {
      color = 0xff0000;
  } else if(key == 'g') {
      color = 0x00ff00;
  } else if(key == 'b') {
      color = 0x0000ff;
  }
}
ドラッグで動かす

emptyExampleからコピーすると、.cppファイルに予めイベントハンドラが定義されているのであっさり作れる(雑ですが)

helloWorld.h

#ifndef _HELLO_WORLD
#define _HELLO_WORLD

#include "ofMain.h"

class helloWorld : public ofBaseApp{

public:
  void setup();
  void update();
  void draw();

  void keyPressed  (int key);
  void keyReleased(int key);
  void mouseMoved(int x, int y );
  void mouseDragged(int x, int y, int button);
  void mousePressed(int x, int y, int button);
  void mouseReleased(int x, int y, int button);
  void windowResized(int w, int h);

  ofTrueTypeFont myriad;
  int posX;
  int posY;
};

#endif

helloWorld.cpp

void helloWorld::setup(){
  myriad.loadFont("MyriadWebPro.ttf", 32);
  ofBackground(255, 255, 255);
  posX = 130;
  posY = 155;
}

void helloWorld::draw(){
  ofSetColor(0x000000);
  myriad.drawString("Hello World!", posX, posY);
}

void helloWorld::mouseDragged(int x, int y, int button){
  posX = x - 110;
  posY = y;
}