14年前の2tchのソースコードをコンパイルできるか?
iOSDC2021で14年前にObjective-Cで書かれた2tch(にたち)のコードがコンパイル,実行できるか?というチャレンジをアンカンファレンスとして発表しました.Zoomで開催し,最大100人が参加する事態となり,色々なことが話題になりました.
1.Subversionって知ってますか.
2._synthesizeってなんだよ.
3.あぁ・・・id型で全部よかったんだ・・・・・.
4.Trueじゃなくて,YESね
5.releaseとautorelease
6.ARC?なにそれ,型あんの?
7.Perlって知ってる?
全部,答えられたら,あなたも古参です.また,高校時代に2tchを使ってくれていた@freddiさん が登場し,感涙するなど・・・・.まさにAAなしでは語りきれない盛り上がりになりました(ってか高校時代・・・・・?14年前だと当時高校生でも今30歳だもんね・・・・・).
このアンカンファレンスのため,バックアップしていたふるーーーーいSubversionのコードを掘り起こし,さらに中身が簡単にみられないため,svnのリポジトリをgitに無理やり変更するgit-svnによる変換を試みました.
余談ですが,最近のmacOSには,Perlが入っておらず,さらにgit-svnは,Perlで書かれているため,まず,Perlを導入するところから始めないといけません.Perlとか,まじで10年以上コードも見てないぞ・・・・・という状態でPerlのセットアップをスタート・・・・残念ながら,git-svnを最新のmacOSで動かすところまでは,辿り着けず,AWSに急遽Ubuntuを作り,そこでパッケージマネージャを使って,svn-gitをセットアップ,svnの巨大なソースコードを転送し,gitに変換し,さらに,ローカルにもう一回転送するという作業を行なったのでした・・・・.改めて書くと,マジでなにやってんだろ,俺.
んで,このリポジトリ,最も古いコミットは,2007/10/14でした.今から,14年前です.Mac OS X v10.5 (Leopard) が発売されたときのようです.ちなみに,この年の6月にiPhoneのファーストモデルが発売されていますね.さて,その掘り起こされたコードは,以下のリポジトリに公開しております.
参加者のうちで, @kateinoigakukun さんは,仮想環境で,Xcode4を準備してくれる力の入れよう.画面が・・・・懐かしい・・・・アイコンがテカテカしている・・・・.
最初の課題は,iPhone SDK1.0で書かれたHello worldアプリケーションの起動.ちなみにソースコードは,こちら.一部抜粋はこちら.うーん,懐かしい.id型・・・.え?UIHardwareクラス?何それって感じですね.ちなみに,iPhone SDKであって,iOS SDKではありません.当時,まだiOSはありません.さらに,iPhone SDK1.0は正式には存在せず,これは,有志の手で作られたいわゆる野良SDKでありました.アプリケーションの配布も有志の手で作られた野良リポジトリで行われていました.
#import "MyApp.h"
@implementation MyApp
- (void) applicationDidFinishLaunching: (id) unused {
// Get screen rect
CGRect screenRect;
screenRect = [UIHardware fullScreenApplicationContentRect];
// Create window
UIWindow* window;
window = [[UIWindow alloc] initWithContentRect:screenRect];
// Create text view
UITextView* textView = [[UITextView alloc] initWithFrame:[window bounds]];
[textView setText:@"Hello World?"];
// Set content view
[window setContentView:textView];
// Show window
[window orderFront:self];
[window makeKey:self];
[window _setHidden:NO];
}
@end
さっそく,@kateinoigakukun がコンパイルに成功(鬼かお前は).しかし・・・・・・・.起動ができないのである.なんとか,iPhone simulatorのApplicationフォルダに無理やりインストールして,SpringBoardにアプリを表示させることには成功したものの・・・残念ながら起動させることはできませんでした.ここのコードは,色々,プライベートになる前のクラスなんかが観察できて,なかなかにおもしろいものがいくつかあります.眺めてみてはいかがでしょうか.
EGLContext eglContext
= eglCreateContext(eglDisplay, eglConfig, EGL_NO_CONTEXT, 0);
if (eglContext == EGL_NO_CONTEXT)
printf("failed to allocate context =(¥n");
CoreSurfaceBufferRef screenSurface
= CreateSurface(frame.size.width, frame.size.height);
CoreSurfaceBufferLock(screenSurface, 3);
LKLayer* screenLayer = [[LKLayer layer] retain];
[screenLayer setFrame: CGRectMake(0, 0, frame.size.width, frame.size.height)];
[screenLayer setContents: screenSurface];
[screenLayer setOpaque: YES];
[_layer addSublayer: screenLayer];
CoreSurfaceBufferUnlock(screenSurface);
EGLSurface eglSurface
= eglCreatePixmapSurface(eglDisplay, eglConfig, screenSurface, 0);
if (eglSurface == EGL_NO_SURFACE)
printf("failed to create surface =(, %04x¥n", eglGetError());
mEGLDisplay = eglDisplay;
mEGLContext = eglContext;
mEGLSurface = eglSurface;
mScreenSurface = screenSurface;
if (!eglMakeCurrent(mEGLDisplay, mEGLSurface, mEGLSurface, mEGLContext))
printf("make current error: %04x¥n", eglGetError());
ついに2tchに挑戦
そして,メインディッシュ,2tchのソースコードです.今夜,我々がコンパイルするのは・・・・こちら.2tch ver3.1時代のコードです.まず,引っかかったのは,InterfaceBuilderのファイル,xibファイルのバージョンでした.次は,Info.plistのshort versionがないというエラー.ここまでを直すと・・・・なんと,コンパイルが通ってしまったのです.
ついに,実行です.シミュレータが立ち上がり,iOS14のインタフェース上で,古めかしい2tchのインタフェースが起動し・・・ブックマークを開こうとすると・・・エラーが・・・・.ログを見ると,あるべきツールバーがないとのエラー.
-[UINavigationController toolbar] is returning an object that is not a kind of UIToolbar'
terminating with uncaught exception of type NSException
神の一手
そんな中,@niwさんが.「これは,UINavigationControllerの初期化のタイミングが変わったことが原因じゃないか・・・?UINavigationControllerのtoolbarのアクセサを消去すれば,うまくいくはず」と神のコメント(細部間違ってたらごめん).言われるがままに,@synthesize toolbar = toolbar_をコメントアウトすると・・・・動いた!!!
なんかちょっとおかしいけど起動したブックマークビュー
次に@freddiさんが書き込みたい,アスキーアートがみたいと言い出し・・・・たのですが,残念ながら,2ch.netはドメインも変わり,データにアクセスするAPIも変わってしまったので,どうしようもない・・・という事態に.しかし,そこでまたも神の一手が.「2ch.scなら?いけるのでは?」知らない人は,知らないですが,2ch.netは,管理人が喧嘩して,5ch.netと,2ch.scに枝分かれしてしまったのです.確か,現在も係争中だったはず.そこで,Xcodeで,2ch.netのドメインを2ch.scに変えたところ・・・・.タイトル一覧が動き・・・・・スレッドが見えて・・・・・動いた!!!!なんと!!!!書き込めた!!!!!ここでアンカンファレンス終了!!!!
まさに奇跡
エンド数分で,@kateinoigakukunくんが,書き込みを成功させるという,メイクミラクルで幕を閉じたiOSDC2021 アンカンファレンス「14年前の2tchのソースコードをコンパイルできるか?」だったのでした.
なんと言ってもすごいのは,@kateinoigakukunさんの瞬発力なのですが,コンパイルが通って起動した瞬間は,14年も前のコードがほぼ書き換えず,そのまま動くUIKitの完成度の高さです.あのときのAPI設計が神がかっていたとしていえません.私の環境は,iOS14だったので,古いアプリがモダンなUIで動く気持ち悪さがありましたが,動いてしまうのがすごいと言わざるを得ません.
うーん,共有したい臨場感がうまく書けない.アンカンファレンス開始当時は,グダグダでトークして終わってしまうのではないか・・・と心配してのですが,それをよそに大盛り上がりでよかったです.アンカンファレンスの様子はもしかすると,YouTubeで公開されるかもしれないので,そちらをご覧ください.