2008年11月アーカイブ

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

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

http://www.nikkansports.com/soccer/news/p-sc-tp0-20081126-433528.html
鹿島監督連覇へ「折れ線グラフ」でゲキ - サッカーニュース : nikkansports.com

鹿島オリベイラ監督が連覇に向けて「折れ線グラフ」を使い、選手のヤル気を増幅させた。25日、ミーティングを行い、大型連勝から遠ざかっている状況を説明した。グラフは縦軸に勝敗の貯金数、横軸は試合数で、勝てば青、引き分けは黄色、負けると赤のマグネットを線で結び、今季のチームの波が一目瞭然(りょうぜん)だった。

イメージ図↓

D21HWを買ったよ

| コメント(0) | トラックバック(0)

d21hw-1.jpg

先日まではD11LCユーザだったんですが、USBコネクタ部分の厚ぼったさがMacBook Airの筐体と干渉して嫌だったんですよ。こういうのを手配してどうにかやってはみたもののどうにもおさまり悪さ感が炸裂していたところに、D21HWの発売を聞きつけたので買ってみた。店頭(コジマ電機某店)で干渉せずに刺さるかどうかを確認させてもらったところばっちりだったので、買い替えで1台所望。イーモバイルは機種変更を扱ってないらしいのがちょっとどうかなとは思うけど、まあ電話番号引き継ぐ必要もないし、いっか。

d21hw-2.jpg

こんなふうに、ノッチに合わせて固定可能な角度で干渉せずに付けることができ、外形も見事にAirに調和しています。やたー。

最近某会長がやたら騒がしくしているJリーグの秋春制構想、最初はまあそんなんもありかなあくらいに考えていた。いや、俺の愛するアルビレックスの置かれる状況を忘れてはいないけれども、冬期の降雪・寒冷対策が十分にケアされるのであれば(冬休み置くとかね)まあ考えてみるのもアリはアリなんじゃね?くらいに思っていた。

しかし一点、近年とみに重大な意味を持ちつつあるファクタを忘れていたのに気がついた。これを考えたら、秋春制など到底受け入れられないという結論に至った。

それは他でもない、ACL・アジアチャンピオンズリーグの存在である。

2009年から拡大されるフォーマットにおいても、ACLは暦年制を通す。おそらく何もなければ2010年以降もそうなるだろう。もしAFCが秋春制に移行する計画があるとか、そのようにJFAから働きかけるといった方向性もないうちに(つか各FAがyesて言うかあ?)日本だけその枠組みから外れて、うまくやっていける保証がどこにあるというのか?

http://images.the-afc.com/Documents/common/cms/afc/AFC_Calendar_Comps_2009.pdf
AFC Calendar of Competitions 2009

もしJだけ秋春になったら、このカレンダーで言うところの、ちょうどACLクォーターファイナル直前に移籍市場を迎えることになる。ACLに出るような強豪チームほど選手を積極的に入れ替えたり補強したりするだろうから、そこから新たにチーム作りをしていかなければならない大事な時期に、ACLのノックアウトステージに入ってしまう。チーム作りもままならない選手間の連携もまだ固まらない時期にこんな大事な試合迎えて、勝ち抜けるわけがないだろう。せっかくJリーグからの参戦態勢も整ってきて、安定した実績を積めるようになり、注目度も俄然上がってきたこの大会なのに、みすみす棒に振るおつもりですか犬飼さん。あなたのせいで、あなたの愛する浦和レッズの選手たちがもう一度クリスティアーノ・ロナウドやカシージャスらに立ち向かう機会を、未来永劫失うことになるかもしれませんよ?

まあ、鬼武チェアマンとのいざこざなどを見るにつけ、協会内で誰がこのおっさん=犬飼氏に鈴をつけるのか、というババの押し付け合いになってる状況が透けて見えるようなこの状況、当初自分が考えていたような「まあやってみりゃいいじゃん」的な軽々しさでは決してないということが、上の観点から見て強く浮き彫りになってきた。それに気付いた今は、まあ、何でもいいからとにかくやめとけと強く思う。

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

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

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

$ vim -b hogehoge.txt

これでok。

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

MacOSX上でネットワークを扱うプログラムを書く場合、やり方はいくつかある。

  • ソケット
  • NSStream
  • NSURLConnection
  • 分散オブジェクト環境

あと、CarbonベースでもよC言語向けのが欲しければCFNetwork、あとBSDソケットとほぼ同等だけどCFSocketという手もある。まだ他にもあるかななな。

http://www.geekpage.jp/programming/macosX-network/
Geekなぺーじ : Mac OS Xネットワークプログラミング

まあ、NSURLConnectionなんかはURLベースなので「ネットワーク」というには大分限定的・局所的だし、分散オブジェクト環境に至ってはCocoaアプリケーション同士でないとほとんど使いこなせない。汎用性ではソケットに勝るものは無いでしょう。ただ、状況に応じていろんな選択肢があること、これを常に心に留めておくことはとっても重要。

あと、Cocoaではソケット・ファイルディスクリプタをwrapすることのできるNSFileHandleもあるので、ぜひこれらをフル活用していきたい。通知(NSNotification)やデリゲートの仕組みを元に、メインループからの非同期的読み込みの機構も実装されているので、これを使った方がCocoa GUIアプリケーションとしてより自然な挙動を実現することができる。

確かにソケットでよく使うFIONBIOやselect()/poll()などはそのまま適用可能だけど、UNIX系由来のコードを出来るだけそのまま動かすといった明確な意図に基づいて扱う場合以外は、それが有効に効力を発揮する局面はあんまり無いように思う。(≒GUIを持たない、純粋にC言語でmain()からがりがり書くようなケースも含む。ただそれでも、結果的にCocoa/Carbonに乗っておいた方が楽になれることも結構ある)

まあ、NSStreamとNSFileHandleさえあればわりとごはん3杯くらいいけます。はい。

http://developer.apple.com/documentation/Cocoa/Conceptual/Streams/Streams.html
Stream Programming Guide for Cocoa: Introduction to Stream Programming Guide for Cocoa

http://developer.apple.com/documentation/Cocoa/Conceptual/LowLevelFileMgmt/LowLevelFileMgmt.html
Low-Level File Management Programming Topics: Introduction to Low-Level File Management Programming Topics

風邪をひきました

| コメント(0) | トラックバック(0)

せっかくの三連休なのに風邪をひいたようです。げふんげふん。おとなしくてます。たぶん。