macの最近のブログ記事

2010年12月15日

bind()してlisten()してaccept()してNSStreamしてみたらえんやこら

NSStreamのメソッドでさらに足りないなーと思っていたのがCFStreamCreatePairWithSocketっていうAPI。...いやもっとぶっちゃけて言えばbind()してlisten()してaccept()するサーバソケットをNSStreamで使いたいなー、という。

で、結論から言ってしまうとこれでNSInputStream/NSOutputStreamが取れるのはいいんだが、closeするときがめんどくさい。お行儀悪くてもいいって言うなら止めはしないが。めんどくさいというのは、inputもoutputも共々closeしてもソケットそのものをcloseしないとpeerにFINを送ってくれないようなのです。

まあCocoaで組むサーバアプリなんてそうそうないんで普通は気にしないもんだけど(というかだからこそNSStreamでは手薄なんだが)、だからといって全く使わないこともないわけでねえ。DCC(IRC)とか、FTPとかね。

というわけでいろいろ試してみたけど、closeするまでちゃんとソケットのディスクリプタそのものをちゃんと管理しておけってところのようだ。まあせっかくなのでCFSocketまで使え、っていうソリューションもあるけどどっちにしろ多少の追加実装が必要そうなことには変わりなさげ。

2010年12月14日

NSHostでv6→v4フォールバックが起こらない

v6/v4両アドレスを併用しているホストで、v4アドレスでのみlisten()しているサーバプロセスに対してMacから接続しようとする際、しくじるというパターンがあった。具体的に言うとtiarraがv6アドレスでlisten()してくれなかったんですがね。

Intermezzoの中で+[NSHost getStreamsToHost:port:inputStream:outputStream:]を使っていたのが、これがうまくなかったらしい。v6アドレスでconnect()しに行って蹴られてそこでくじけて終了してた。telnetだとv6失敗→v4の順でフォールバックしてくれるのに、Intermezzoの手製コードだとそれが起こらなかったの。

実はこの+[NSHost getStreamsToHost:port:inputStream:outputStream:]メソッドはiOS SDKでは使えないため、以下のような置き換え用のコードが存在している。これに切り替えて動作させたらv6→v4の順にconnect()してくれて問題を回避できた。1番目の引数にホスト名を表す文字列(NSString)を要求するので、-[NSHost name]を使って渡すようにした。

http://developer.apple.com/library/ios/#qa/qa2009/qa1652.html
Technical Q&A QA1652: Using NSStreams For A TCP Connection Without NSHost

というわけで、NSHostで名前解決を先にしてしまうとv6→v4フォールバックが起こらなかったよ、という結果報告でござった。

2009年11月19日

BazaarをMacOSXにインストールしようとしたらXcodeがふっとびかけてひどい目にあったでござるの巻

昨今隆盛を見せつつあるGitとかBazaarとかMercurialとかな新型のVCSをうちのMacにもひとつ入れてみるべえかとちょっと色気を出してみたのがまあ、運のつきというか何と言うか。

まあ、まずBazaarのMacOSX用バイナリを持って来て入れる。これはとりあえず何事も無くOK。

次にGUIがあればと探してみるとBazaar Explorerという代物があるらしいのでそれを持ってくる。QBzrが必要らしいので持ってくる。こんどはQBzrにはPyQtが無きゃダメってダダこねるのでそいつも引っ張ってくる。そしてPyQtはQtとSIPが要るつってんのがわかんねえのかボケとか張り倒されて(´・ω・`)となりながらQtのインストールを始める。

したら持って来たQtのインストールがどうにもうまくいかない。最初、Qt/SDK for Macを入れてしまったらやたら色々と要らないサブパッケージがどんどこ詰め込まれる上に全然PyQtのビルドが出来なくて俺涙目。エラーメッセージの詳細を忘れてしまったけど、どうもQtが32bit専用で64bitバイナリが無いのにPyQtを64bitでビルドしようとしているらしい。今時んなことあるかいと思って確かめてみると、ほんとにそうだった。こいつはびっくりだ。そしてやり直すためにアンインストールしようとしたら、今度はそれ用のスクリプト(uninstall-qt.py,uninstall-qtsdk.py)が動かない。

http://bugreports.qt.nokia.com/browse/QTBUG-4910
[#QTBUG-4910] I'm unable to install the Cocoa version of qt4.5 on Snow Leopard - Qt Bug Tracker

http://bugreports.qt.nokia.com/browse/QTBUG-5829
[#QTBUG-5829] sudo ./uninstall-qt.py fails to uninstall various files on - Qt Bug Tracker

64bit版がないとかいう不安なライブラリをシステムの中に残しておきたくないので根こそぎ削ろうと思い、Time Machineを使ってHDD内の/Developer配下のディレクトリツリーをインストール前の状態にごっそり戻してやろうと考えた。しかしこれからが本当の地獄だ。

まあ基本的には私のうっかりさんテヘ☆が原因なのだが、/Developer配下を戻す時にXcodeが立ち上がったままになっていて、「"Xcode.app"のファイル置き換えが出来ません」というようなエラーダイアログが出てファイルの書き戻しがエラーになり、そこで処理が止まってしまったのだ。Time Machineといってもただの過去データからのファイルコピーということである。

おかげで処理前段で/Developer配下は一度削除されてしまっていた(自動でね)ので、/Developerの中身がApplicationsフォルダの一部以外全て壊滅するという惨状に陥った。何だこの大量破壊兵器。PyQtのビルドが出来ないなんつって涙目になってたのが一気に吹き飛んだ。人間どうしようもなくなったときは泣くか笑うかしかない、とかいう書き出しから始まったのは誰の何と言う漫画で見たんだったか。という微妙なネタ出しがもしエロ漫画だったらどうしようかなどと要らん自己問答しながらもう一度コピーし直して/Developerの復旧。あーもう。

さて、Xcodeが元に戻った所で、もういちどQtのインストール。SDKなんか要らん単にライブラリが欲しいだけなんじゃーわしゃ自由になりたいんじゃーと意味不明の雄叫びをあげたかどうかは定かではないが、もういちどQtのDownloadsページを見に逝く。

http://qt.nokia.com/downloads/mac-os-cpp
Qt for Open Source C++ development on Mac OS X (Carbon 32-bit) -- Qt - A cross-platform application and UI framework

おいおいDownloadsページからのリンクで"Download Qt libraries 4.5 for Mac (132 MB)"って出しといて今時Carbon 32bitを優先、しかもそんなもん勝手に自動でダウンロードさせるとは一体どうなってるんだ。TrolltechだかNokiaだか手抜き過ぎだろいい加減にしろ。

と一通り憤慨してみせたあとに、上記のページ上にある"Mac binary package using Cocoa for Mac OS X 10.5 (32-bit and 64-bit)"の項目を見つけ、よしよしこれだなとクリックしてダウンロード、dmgを開いてインストール開始。しかしまたもダメ。インストーラが「パッケージを検証中...」から先に動かない。あーもー。あーもー。

09/11/19 2:51:07	installd[208]	PackageKit: ----- Begin install -----
09/11/19 2:51:10	com.apple.launchd[1]	(com.apple.installd[208]) Job appears to have crashed: Segmentation fault
09/11/19 2:51:10	com.apple.ReportCrash.Root[209]	2009-11-19 02:51:10.310 ReportCrash[209:2703] Saved crash report for installd[208] version ??? (???) to /Library/Logs/DiagnosticReports/installd_2009-11-19-025110_localhost.crash
09/11/19 2:51:30	/System/Library/CoreServices/Menu Extras/TextInput.menu/Contents/SharedSupport/TISwitcher.app/Contents/MacOS/TISwitcher[115]	CPSGetCurrentProcess(): This call is deprecated and should not be called anymore.
09/11/19 2:56:09	Installer[166]	Lost connection to installd (connection timeout: did not receive reply)
09/11/19 2:56:10	Installer[166]	Install failed: エラーによってインストールに失敗しました。ソフトウェアの製造元に問い合わせてください。
09/11/19 2:56:10	Installer[166]	IFDInstallController 17D36460 state = 7
09/11/19 2:56:10	Installer[166]	Displaying 'Install Failed' UI.
09/11/19 2:56:10	Installer[166]	'Install Failed' UI displayed message:'エラーによってインストールに失敗しました。ソフトウェアの製造元に問い合わせてください。'.
09/11/19 2:56:10	Installer[166]	エラーによってインストールに失敗しました。ソフトウェアの製造元に問い合わせてください。

http://twitter.com/H_Holon/status/5830288494
Twitter / H_Holon: Qtは基本source build。Winでもbin ...

結局 @H_Holon さんのおすすめにならっておらもソースからビルドだコンチクショウ(´・ω・`)。

この後Qtのインストールが無事終わり、SIPもインストールしてPyQtのビルドも今度は通り、続くQBzrのビルドで途中gettextのインストールが求められたんだったかな。gettextもgettext-runtimeとgettext-toolsと2つのサブパッケージに分かれてたけど今回runtimeしか要らないのでそちらだけインストール。あとはQBzr、Bazaar Explorer共に平穏にインストールできた。

というわけで何とか助かったでござるよ。

2009年6月22日

iPhoneでVPN接続するとDNSがおかしくなるっぽい件

iPhoneでVPNを繋げるように設定してみて、 VPN認証がとおるまでもっていったんだけど、Safariでページを開こうとしてうまくいかない。あれ。どしたの。

IMG_0019.PNG
↑VPN前

IMG_0020.PNG
↑VPN後

IP直打ちだと接続できるのは確認できたので、DNSが言う事聞いてくれてない模様。上はDevInfoで撮ったその証拠?写真。

http://www.apptism.com/apps/devinfo
iPhone Apps - DevInfo | Apptism

うーん。

2009年3月18日

iPhone OS/SDK 3.0 betaが出たそうな

http://developer.apple.com/iphone/program/sdk.html
Get Ready for iPhone OS 3.0 - iPhone Developer Program

まだあんまり中身見通してないのでアレですけども。とりあえず個人的に欲しい機能がまだ来ないっぽいのが(´・ω・`)です。はい。

あとはかつて使ってたiPod Touch(16GB)を手放さずにとっとけばよかったな、とも。

2008年11月27日

Attributed Stringで(リサイズした)画像を出したい。

NSTextAttachmentを使ってNSAttributedStringに画像をはめ込むことが出来るのは知ってたんだけど、最近ふと思いついて初めてちゃんと使ってみた。

	NSFileWrapper* filewrapper = [[[NSFileWrapper alloc] initWithPath:@"..."] autorelease];	
	NSTextAttachment* attachment = [[[NSTextAttachment alloc] initWithFileWrapper:filewrapper] autorelease];

	id text = [NSAttributedString attributedStringWithAttachment:attachment];

こんな風に。だけど、適当に拾ってきた画像だと縦横サイズが不定なので、やたらどでかいファイル持ってこようものなら、際限なく広がってしまってちょっと始末が悪い。最大サイズを指定してそれ以上になったらリサイズするようにしてみたくなった。

pict01.png

つまりこれが、

pict02.png

こうなっちゃったりすると、いやよね奥さんそう思いませんおほほ?という。

でこれが、あれやこれやと試してみてなかなかうまく行かなかった。NSTextAttachmentCellがNSTextAttachmentによって自動的に生成されるに任せていると、元のファイルのサイズでそのまま出てしまう。-[NSTextAttachment attachmentCell]で得られるのはid<NSTextAttachmentCell>で、内部で生成されたNSImageインスタンスを参照するメソッド等は用意されていない。むりくりNSTextAttachmentCell*型にキャストするわけにもいかないので、どうしようかという話になった。

まあ、思いつけばな〜んだの部類すけど、縮小したNSImageを自前で生成してそれを同じく自前で作ったNSTextAttachmentCellに渡してNSTextAttachmentにつなげる、という手はずに乗せたらうまくいったとよ。


NSSize
_size_proportionally(NSSize origSize, NSSize maxSize)
{
	CGFloat zoom = (origSize.width > origSize.height ? maxSize.width / origSize.width : maxSize.height / origSize.height);

	return NSMakeSize(origSize.width * zoom, origSize.height * zoom);
}

- (IBAction)doAction:(id)sender
{
	NSURL *url = [NSURL URLWithString:@"http://icanhascheezburger.files.wordpress.com/2008/11/funny-pictures-always-hold-hands-with-your-kitten.jpg"];
	NSImage *image = [[[NSImage alloc] initWithContentsOfURL:url] autorelease];

	[image setSize:_size_proportionally([image size], NSMakeSize(200, 200))];
    NSTextAttachment* attachment = [[[NSTextAttachment alloc] init] autorelease];
	NSTextAttachmentCell* attachmentCell = [[[NSTextAttachmentCell alloc] initImageCell:image] autorelease];
	
	[attachment setAttachmentCell:attachmentCell];
	
	id text = [NSMutableAttributedString attributedStringWithAttachment:attachment];
	[text addAttribute:NSLinkAttributeName value:url range:NSMakeRange(0, [text length])];
	
	[[textView textStorage] appendAttributedString:text];
}

pict03.png

こうなった。よーしよし。

2008年11月20日

BOM付きUTF-8テキストからBOMをとる

手元のテキストファイルでUTF-8のがあって、適当なスクリプトやアプリケーションに渡してテキスト処理を行っていたのがどうもうまくいかないことがあったので、よく見てみたら先頭にBOMがついていたときの話。

nkfのマニュアルを見たところ、-wと-w8とでBOMの有無を区別してくれるので、こいつに通せばよしなに変換してくれるかと思ったけども、どうやら入力ではBOMを判別してはくれないらしい。変化はなかった。ちなみにバージョンは2.0.7。

ここで変換によるBOM取りをあきらめてエディタで削除する方針に変更。何もしないとvimはBOM付きでもちゃんと認識して表示を隠してくれるので、隠さず見せるようにバイナリモードで読む必要があり。

$ vim -b hogehoge.txt

これでok。

<feff>hoge
このようにして見せてくれるので、<feff>を消せばよい。

2008年10月21日

欲しいのは欲しいんだが

http://www.apple.com/jp/news/2008/oct/15macbook.html
新しいMacBookファミリー、ノートブックのデザインを再定義

筐体がアルミでありながらLEDディスプレイの周りが黒ブチになったのは自分としてはものすごく嬉しい。ディスプレイの周辺を黒色で締めてほしいってのはずっと思ってたし、これは大変よろこばしい。うちのTVもこれがあって今のをつかってるようなもの。

http://www.toshiba.co.jp/product/tv/ctv/25zb22.htm
東芝4:3フラットテレビ 25ZB22/25ZS12(生産終了製品)

こっち↑はまだまだ現役っすよ。

ま、Nehalem(っていうかCore i7)が出ればすぐにマイチェンするんだし、そんときでいっかなーと思いはするものの、そそられる物欲がいいかんじです。

とはいえ現状の環境(MacPro+MacBookAir)で不満が無いので、しばらくは眺めてることにします。

2008年9月 3日

サイボウズのスケジュールをiPhoneで見たい

http://kidachi.kazuhi.to/blog/archives/002423.html
覚え書き@kazuhi.to: サイボウズ6とiCalの連携

サイボウズ6のスケジュールデータをiPhoneで受けたいと思って一通り調べてみたんだが、cyboze2icalを使ってフォーマット変換→iCalでインポートして.Mac/MobileMeに流し込み、という図以上のものはないらしい。Web APIあたりでpostする方法はないかしらん、と思ってはみたけどそれだと「Macで全てが完結する」世界を崩すことになるし、Appleはやりたがらんだろな。とはいえ常に電源が入ってるとは限らないデスクトップを使って常駐プロセス回すのもあんまりいい話じゃないので、ちょっとなあ。

どーしましょね。

2008年4月 5日

MacBookを手放そうかと

まあ、こちらを奮発したのにはわけがあって、この半年自宅作業になった影響でノートPCをほとんど使わなくなってしまったことに気がついた、というのもある。Mac機はすでにMac Proがあるし、Win機を1台用意する方がはるかに利用度が高いっつーか。

とはいえまったく使うシチュエイションがなくなったかっていうとそうでもなく、適度に悩ましいんだなこれが。どうしましょうね。