*

mongodbのMac OS X へのインストールで躓く

$ sudo port install mongodb
.
.
.
Error: mongodb 2.0.7 requires boost 1.49.0 or older but you have boost 1.50.0.
Error: To downgrade boost, see https://trac.macports.org/wiki/howto/InstallingOlderPort
Error: or more specifically https://trac.macports.org/ticket/35118#comment:12
Error: After installing boost 1.49.0, install mongodb without upgrading dependencies, i.e.:
Error: sudo port -n install mongodb
Error: org.macports.configure for port mongodb returned: boost 1.50.0 is too new

このエラーなんか、こうして、

$ sudo port uninstall boost @1.50.0_0+no_single+no_static

こうして、

$ svn co -r 93341 http://svn.macports.org/repository/macports/trunk/dports/devel/boost/

こうだ!

$ cd boost/
$ sudo port install

ところがぎっちょん。

$ sudo port -n install mongodb

Error: org.macports.build for port mongodb returned: command execution failed
Please see the log file for port mongodb for details:
/opt/local/var/macports/logs/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_databases_mongodb/mongodb/main.log
To report a bug, follow the instructions in the guide:
http://guide.macports.org/#project.tickets
Error: Processing of port mongodb failed
TP11-105:boost kuwabara_hiroki$ vi /opt/local/var/macports/logs/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_databases_mongodb/mongodb/main.log

違うエラー。ログを見やがれと。
ログの中身については正確に覚えていないけど、
(正しくインストール出来た瞬間にログが削除された、そんなんログやないやん。)
下記行があったので、それでググった形跡はある。

info
build clang: error: unable to execute command: Segmentation fault: 11

ぐぐってみるとこのページがヒット。

http://comments.gmane.org/gmane.comp.db.mongodb.user/50653

Mathieu Poumeyrolってにーちゃんの言うとおり、下記オプションを付けて実行した所・・・

$ sudo port install mongodb configure.cc=/usr/bin/gcc configure.cpp=/usr/bin/cpp configure.cxx=/usr/bin/g++

      • > Computing dependencies for mongodb
      • > Building mongodb
      • > Staging mongodb into destroot
      • > Creating launchd control script

###########################################################
# A startup item has been generated that will aid in
# starting mongodb with launchd. It is disabled
# by default. Execute the following command to start it,
# and to cause it to launch at startup:
#
# sudo port load mongodb
###########################################################

      • > Installing mongodb @2.2.0_0
      • > Activating mongodb @2.2.0_0
      • > Cleaning mongodb
      • > Updating database of binaries: 100.0%
      • > Scanning binaries for linking errors: 100.0%
      • > No broken files found.

入った!

PHP5.3 軽いおさらい

大分前に、ちょっとだけ触って満足した5.3。
今日は軽くおさらいしてみた。

主にnamespaceとクロージャ


method = $method;
$this->methods[0] = $method;
$this->methods[1] = $this->method;
}
}

class Test
{
public $property = 'property';

public static $static = 'static';

public function __construct()
{
Test::printBr('making instance of Test');
}

public function execute()
{
$outerLocal = 'outerLocal';

$function = function($arg)
{
$Sandbox = new Sandbox();

$local = 'local';

Test::printBr($local); // o
Test::printBr($outerLocal); // x
Test::printBr(Test::$static); // o
Test::printBr($arg); // o

//$Sandbox->method('called method from instance'); // x

$Sandbox->methods[0]('called array key 0 from instance'); // o
$Sandbox->methods[1]('called array key 1 from instance'); // o
};

$function('arg');
}

public static function printBr($str)
{
echo $str.'<br />';
}
}

$Test = new Test();

$Test->execute();


namespace Test\Secondary;

class Test
{

public function execute()
{
\Test\Primary\Test::printBr('called from another namespace');

$Class = '\\Test\\Primary\\Test';

$primaryTest = new $Class();
}
}

$Test = new Test();

$Test->execute();

出力結果


making instance of Test
called at __construct()
local

static
arg
called array key 0 from instance
called array key 1 from instance
called from another namespace
making instance of Test

ごめん、ブラウザで出力してるから改行はbrなんだ・・・。

メソッド内のローカル変数は、そのメソッド内で作ったクロージャ内に引き継げない。
jsの感覚で書いていると痛い目を見るかも。
名前空間を跨いだクラスの指定は(勿論)出来たが、可変でも出来たのはありがたい。

又、プロパティに対してクロージャを割り当てると、現存の記法と競合する為に正しくコール出来ない。
次のバージョン以降、ここがどうなるのか見ものである。
但し配列に割り当てた場合はコールできるので、一応現状でも使いようはある。

クロージャは一応オブジェクトとしてダンプされるものの、プロパティの設定等は出来ない。

タイマー処理等、イベント系処理でお世話になるこの無名関数だけど、そもそもPHPではそういう使い方は出来ない。
(出来ないし、サーバサイドなんだから別プロセスでやらせろよ的な)
実際にどのような場面で使う事が多くなるのか、少し興味深い。

iPhoneアプリ barButtonItemがうまく設置されない時

左上のボタンを設置したつもりが、うまく表示されない。

ソースは下記、コレ自体は問題ない。


UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:title style:UIBarButtonItemStyleBordered target:self action:action];
[self.navigationItem setLeftBarButtonItem:item];
[item release];

ただ、これを実行する場所がミソの様で、

今までViewDidLoadで実行させていたものを、ViewWillAppearで実行させるようにしたらちゃんと表示されるようになった。

メソッド名を見て直感的にうまく行かない理由が分からない。

cocoaってのは好きになれない。。。

Thunderbird 最近アップデートしたら

最近アップデートしたら、添付ファイル付きのメール送信が出来なくなってしまった。

具体的には、メール送信のプログレスバーが途中で止まってしまう状態。


解決策としては、設定をいじらなくてはならない。

メニューの「ツール」 > 「オプション」 > 「詳細」> 「一般」タブ > 「設定エディタ」

「設定エディタ」ボタンを押すと、「動作保証対象外になります!」というアラートが出るが、

既に動作してねーよksg、という憤りとともに「最新の注意を払って使用する」ボタンを押す。

表示された設定一覧の中で「network.tcp.sendbuffer」という項目があるので、その値を小さくする。

(色々ググったら、16384って値にしている所が多かった。)

こうした所、無事に添付ファイル付きのメールが送信されるようになった。

iPhoneアプリ プロジェクトを異なる環境でビルド

簡単に言うと開発環境で作ったものを、プロジェクトファイルごと納品してクライアントの環境で見たい。

これに小一時間ハマり、半刻程寝て、また小一時間悩む。

例の如く、出来てしまえば何の事は無い。

結果から言うと、必要なのは下記二点だった。

・AppIdの書き換え
・署名IDの書き換え

AppIdは、各プロジェクト作成時に自動的に生成される"[プロジェクト名]-Info.plist"というファイルに設定されている。

当該ファイル内の"Bundle Identifier"がそれなので、クライアント側で設定したものに変更する。


署名ID、これはXCodeの「グループとファイル」に表示されているプロジェクトファイル(青いアイコン)の、
「情報を見る」から変更出来る。

「ビルド」タブを選択すると「コード署名ID」という項目があるので、そこをキーチェーンアクセスに登録されている名前に変える。

キーチェーンアクセスの証明書の「情報を見る」で表示される「通称」の値だ。

同じように「グループとファイル」欄から「ターゲット > [プロジェクト名]」の「情報を見る」を選択して、「ビルド」タブの同じ値を変更する。


iOS provisioning portalで設定する事項の多さに惑わされがちだが、

プロジェクトをビルドする際の食い違いがなくなれば良いだけなのだ。


しかしまぁ、アップルの厳格な手続きはめんどうだ。

勿論、良い点もあるんだけどね。

iPhoneアプリexpected specifier qualifier list before 'foo'

expected specifier qualifier list before 'foo'

こんなエラーが出たが、importし忘れとか、そんな分かり易い失敗ではない場合。

しかも不思議な事に、該当箇所の宣言をコメントアウトして、

一旦無理矢理ビルドさせて、コメントを外してからビルドするとうまく動いたりする。

めんどくさいし、XCode仕事サボんなと思いながら適当にあしらってきた訳だが、

そろそろめんどくさくなってきたので、ちょっと調べてみた。


結論からいうと、相互でインポートしているファイルとかは、出来れば@classで宣言しといた方がいいよとのこと。

こんなかんじ。

Before:


#import "Menu.h"

@interface Main : UIViewController
{
...
}

After:


@class Menu;

@interface Main : UIViewController
{
...
}


基本のキの字も知らずにいきなり応用からやってるもんだから、こういう事が起きる。

ま、基本なんて誰にでも出来る事をしててもしょうがないし、仕事にもならん。

iPhoneアプリ NSDate timeIntervalSince1970のロケール

NSDate timeIntervalSince1970

これって、GMTでの秒数だけなのね。


0時ぴったりの日付を取得しようとしても、NSDateFormatter使うのがめんどい。

何か手っ取り早い方法が無いかと思って下記のような事をしてみた。


+(NSDate *)makeMidDate:(NSDate *)date
{
NSTimeInterval interval = [date timeIntervalSince1970];

int pastSeconds = ( (int)interval % (60 * 60 * 24) );

NSDate *newDate = [date dateByAddingTimeInterval:(0 - pastSeconds)];

return newDate;
}

これだと確かに格段に早くなる。

だけど、GMTなので日本の場合は-9時間されたNSDateが作られる。


むぅ。