2012年2月6日月曜日

GithubをXcodeのリモートリポジトリにする方法(コマンド使わずに)

Xcode4から標準インストールされているGit。
Githubをコマンドを使わずにリモートリポジトリとして指定する手順を説明している
良いページが見つからなかったので書いてみる。

前提

Xcodeプロジェクトが既にローカルGitリポジトリで管理されていること。
Githubにコマンドラインから接続可能なこと。
Version:4.2.1

主に以下の手順となる。
  • 1.Github上でリポジトリ作成
  • 2.Xcode上でリモートリポジトリ指定
  • 3.Xcode上でpush

1.Github上でリポジトリ作成

通常の手順でGithub上でリポジトリを作成する。

2.Xcode上でリポジトリ指定

ここからローカル作業。
Xcode上で下記の要領で"Repositories Organizer"を開く。

そして、自分のプロジェクトの"Remotes"を選択して、"Add Remote"を押下。
下記の要領で入力する。
  • Remote Name:Organizer上の表示名程度だと思ってる。詳しい方、教えてください。
  • Location: GithubのURI。git@github.com:ユーザ名/リポジトリ名.git
Locationは"https://..."でも行けるとどこかのサイトに書いてあったけど、試していない。


"Create"ボタンを押すと、以下の画面になる。何もせずに静かにOrganizerを閉じる。
最初、画面の下のパスワード等の入力フォームを入力しないといけないと思ってしまい
いろいろと入力してみるも何の反応も無く、Locationをいじったりして勝手にはまった。
しかし、パスワード等を入れなくても、以下の手順でpushまで出来た。

3.Xcode上でpush

下記のように"push..."を押す。

すると、下記のダイアログ登場。
そして、意外とこの画面で待つ。自分の場合、10秒くらい待った。
ここで待たされたせいで、設定が間違っていると勘違いして手戻った。

待ってると、下記の画面登場。さくっと"push"して完了。

全体的に、独りで勘違いして時間かかった。
Repositories Organizerはまだ安定しなくて、結構しょっちゅうCrashする。
今後の改善に期待。

NSNumberクラスとプリミティブ型との変換


元々はこの記事を書こうと思ってたんだった。
脱線してObjective-Cの整数と32bit64bitの記事が一個forkした。
まあ、この記事も元々はCoredataのNSManagedObjectのプロパティの型ではまったことによるforkです。

Objective-Cのコレクションクラス(NSArrayやNSDictionary)ではid型(オブジェクト型)しか扱えないため
NSIneger等のプリミティブ型を扱う際にはNSNumber型に変換する必要がある。
そこで、下記の相互変換についてメモとしてまとめておくことにした。
  • NSInteger
  • int
  • NSNumber

以下、基本的にMac-OS-X 64bit向け。
iOS環境では、NSIntegerの取る型が異なるため、NSLogのString Format Specifiersが異なる。
値が代入されていないと、%@でNSIntegerはエラーにならないが
値が代入されていると、"EXC_BAD_ACCESS"となって実行時エラーとなる。


初期値について


初期化していない状態での初期値は、NSNumberはオブジェクト型なので「nil」、intは「0」となる。
NSIntegerはオブジェクト型として評価すると「nil」、整数として評価すると「0」となる。


int <-> NSInteger


NSInteger -> int はキャストすれば良い。
キャストしないと警告が出るのは"Objective-Cの整数と32bit64bit"で書いた通り。

一方で、int -> NSIntegerはキャストは不要。
理由はざっくりな説明だと、NSIntegerがintをくるんでいるため
下位概念のものを上位概念のものに入れることになるから、かと。


NSInteger <-> NSNumber


NSInteger -> NSNumberについては、NSNumberクラスのメソッドを使用する。
クラスメソッドを使用するパターンとalloc initするパターンがある。

NSNumber -> NSIntegerについてもintegerValueメソッドでOK。


int <-> NSNumber


このパターンについては、NSInteger <-> NSNumberとメソッドが微妙に変わるだけ。



整数以外のfloatやdoubleも基本的には同じなので割愛。

サンプルプロジェクトを以下のGithubで公開。
https://github.com/k-ori/objc-nsnumber-primitive-convert-samples

xcodeからのGithub連携でいいサイトが無かったので、それも後で書く。

■参照ページ
https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html
https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSNumber_Class/Reference/Reference.html

http://peterszwach.blogspot.com/2011/03/github-xcode-4.html

Objective-Cの整数と32bit64bit


NSIneger等のスカラ型とNSNumber型の変換についてまとめようとしたんだけど
調べてるうちにObjective-Cのint型とNSInteger型、32bitと64bitの関係について
気づいたら調べていたのでまずはそこからまとめておく。

以下、特に注意書きしていない限りは、Mac-OS-X 64bit向けにビルドした結果。

まずは、NSInteger型をint型にキャストせずに代入すると以下の警告が出る。
Implicit conversion loses integer precision: 'NSInteger'(aka 'long') to 'int'

警告の理由は、NSIntegerの持ちうる値が32bitか64bitかは処理系依存だから。
int型変数に値を代入する時はプログラマが明示的にint(32bit)と宣言する必要がある。
そして、NSIntegerはlong型 "または" int型をtypedefしたもの。
(この"または"が処理系に依存する部分)

Foundation Data Types Reference

NSInteger

Used to describe an integer.

Discussion

When building 32-bit applications, NSInteger is a 32-bit integer. A 64-bit application treats NSInteger as a 64-bit integer.

Availability

Available in Mac OS X v10.5 and later.

Declared In

QTKitDefines.h

long型、int型といったプリミティブな型をNSIntegerにラップしてくれている。
NSInteger型を使用することで、32bit環境のコードを64bit環境に移植する時にコードを変更する必要がなくなる。

ちなみに、現時点のiOSデバイスのARM processorは(現時点で)32bit onlyだそうなのでNSIntegerでは64bit整数は扱えないそうです(@see iOS: 32bit or 64 bit? - DesignersTalk)。
OSX Lionだと64bit整数を扱える。

OSX 64bit用にビルドして下記のコードを動かすと、int型以外は正しく表示される。

NSLogに渡す際のformatter文字列を%ldにしないと正しく表示されないので注意。
int型は現在4バイト32ビットで、-2147483648〜2147483647 (約マイナス20億からプラス20億) の整数値を表すことができる。

2147483647を超えると、-2147483648に戻る。
よって、以下の通り2147483647を超えて1周半くらいして1410065408になる。
1410065408=10000000000-(2147483648*4)

ちなみに、上記と同じコードをiOS向けにビルドすると、結果が変わる。

32bit整数しか扱えないので、OSXでは正しく扱えていた値がオーバーフローしてしまっている。
ただ、コンパイラの優しいところは、ちゃんと明示的に大きな値を入れているときは警告を出してくれる。
warning: implicit conversion from 'long long' to 'NSInteger' (aka 'int') changes value from 10000000000 to 1410065408 [-Wconstant-conversion,3]
まあバグが発生する時は、だいたい巨大な値が外部リソースから実行時に入ってくる時なんだけど。



コンパイラ様の言う通りに「long long」型にしたら、iOSシミュレータ用でもちゃんと動いた。
NSLogのformatter文字列を%lldにしないとやっぱり正しく表示されないけど。
long修飾子をつけるとより多くのメモリ領域を確保する模様。

しかし、結局のところint型の取りうる範囲もコンパイラ依存な訳で
Apple様以外の環境なりコンパイラなりでいろいろと結果が変わるのだろうなあ。

■主な参照ページ
https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_DataTypes/Reference/reference.html
http://stackoverflow.com/questions/8813799/warning-implicit-conversion-loses-integer-precision
http://www16.ocn.ne.jp/~maccocoa/objective_c/keyword/keyword1.html
http://www.designerstalk.com/forums/mobile/59128-ios-32bit-64-bit.html

2012年1月30日月曜日

マイdot.emacsを調査してみた


本当は作りたい物があったんだけど、自分のemacsにjavascriptモードが無かったためそれを追加した。でもあれ、そもそもemacs-lispっていつもサンプルから拾うだけであんまり中身知らないなあと思って調べてみた。

初めてemacsに出会ったのは大学1回生時の授業であるけど
emacs-lispに興味を持ったことは今までついぞ無かったのであった。

まず、自分の構成は以下
~/.emacs.d/
   init.el
   /site-lisp

ホームディレクトリ直下の".emacs.d"配下に設定を集めています。
こうすると、設定がディレクトリごとコピーできるのでポータブルになるとWEB+DB vol.58に書いてありました。site-lisp配下には外から取ってきたemacs-lispをぽいぽい入れていきます。
# あ、そういえばこれ買いました。神本。


内容ですが、長いので3部に分けます予定です(いつまでに書ききれるか分からんけど)。
  • 第1部:イントロダクション、load-path設定等
  • 第2部:メジャーモード等設定
  • 第3部:文字コードとか見た目の設定とかこまいとこ

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; load-path

まずはload-pathに関する設定から。たぶんここの設定はみんな似たり寄ったりだと思う。
S式のままだと関数と変数をぱっと見分けられないので、javascript風に変換してみる。


↓↓


完全に見た目の分かりやすさだけのために変換します。
(dynamic scopeとlexical scopeの)変数スコープの違い等の言語的特質は無視で。
スコープの話はこの機会に少し勉強したので、また別途まとめたい。

1行目:let句でローカル変数"default-directory"に値を束縛する。束縛する値は、expand-file-name関数の戻り値。expand-file-name関数は、文字列が表すパスを絶対パスに置き換えます。let句の構成は以下になり、最初のvarlist-to-bindで、変数に値を束縛します。"(hoge 1)":hogeという変数に1を設定します!みたいな感じで。そして、その後にその"hoge"を使用した処理を書くスタイルになるかと思います。
(let varlist-to-bind body...)
今回のvarlist-to-bind(束縛変数リスト)はこの"default-directory"だけ。今回のケースだと2行目以降がbody(実行文)にあたる。

2行目:add-to-list関数でリストに値をいれてるんだけど、この関数は値の重複を許さないので、動きとしてはSetに値をぶっこんでいることに近い。"load-path"という変数に、さきほど束縛したdefault-directoryを挿入しています。"load-path"というのは、Emacs が*.el や*.elc(emacs-lispをバイトコンパイルしたもの)を探す順を指定するための変数です。シェル変数の$PATHのイメージ。load-path、いっぱい入ってます。
("/Users/hoge/.emacs.d/site-lisp" "/usr/share/emacs/22.1/site-lisp" "/usr/share/emacs/site-lisp" "/usr/share/emac\
s/22.1/lisp" "/usr/share/emacs/22.1/lisp/url" "/usr/share/emacs/22.1/lisp/textmodes" "/usr/share/emacs/22.1/lisp/\
progmodes" "/usr/share/emacs/22.1/lisp/play" "/usr/share/emacs/22.1/lisp/obsolete" "/usr/share/emacs/22.1/lisp/ne\
t" "/usr/share/emacs/22.1/lisp/mh-e" "/usr/share/emacs/22.1/lisp/mail" ...)

3,4行目:normal-top-level-add-subdirs-to-load-pathという(長い!)関数が存在するかを確認して、存在したら呼び出す。この関数は、ディレクトリを再帰的に探索し、見つかったディレクトリを load-path に追加します。

これで、"~/.emacs.d/site-lisp"配下に追加した*.elやら*.elcやらが読み込まれるようになるということですね。何気ない顔してコピペ、というのはいい加減卒業しないとなあという今日この頃。

続きは、(あるかもしれない)第二部で。

.emacs.d、Githubに置いてみました。
https://github.com/k-ori/emacs.d

# syntax-highlight、amazonのiframeのバナー張ると動かないのか!
# http://blog.heartofsword.net/archives/794

2012年1月8日日曜日

githubとの遭遇


// k-ori@github

下記を参考にしながら、Github初めて触ってみました(アカウントは前から持ってたけど)。
ナウなヤングのためのgithub入門講座 -基本機能からdotfiles管理まで-

watch機能とやらが使えるらしく、下記を検索してさがして、とりあえずwatchしてみる。書かれている通りに!
GitHub人気レポジトリランキング Best50 全解説

followもofficialチュートリアル通りにやってみる。書かれている通りに。マニュアル人間です。
「お前このページに来るとは、さては初心者だなー」とか「お前は、なんでこんなクールガイをfollowしないんだい?」とか言われながら(ニュアンスは妄想です)。
Help.GitHub - Be Social

あと、gitのpushまでのコマンドを忘れたとき用に、addからpushまでのコマンドをシェルにしてpush。
自分で自分をpushするシェルがfirst pushです。
addからpushまで一気になんて・・・とか細かいことはいいんです。自分で自分をpushしてみたかっただけなんです。

fizz-buzz challenge


以下の記事を読んでいて、初めて見る単語「fizzbuzz問題」。
Scala的な考え方 - Scalaがとっつきにくいと思っている人へ
こういうものらしい。

http://ja.wikipedia.org/wiki/Fizz_Buzz
プレイヤーは円状に座る。最初のプレイヤーは「1」と数字を発言する。次のプレイヤーは直前のプレイヤーの次の数字を発言していく。ただし、3で割り切れる場合は 「Fizz」(Bizz Buzz の場合は 「Bizz」)、5で割り切れる場合は 「Buzz」、両者で割り切れる場合は 「Fizz Buzz」 (Bizz Buzz の場合は 「Bizz Buzz」)を数の代わりに発言しなければならない。発言を間違えた者や、ためらった者は脱落となる。
このゲームをコンピュータ画面に表示させるプログラムとして作成させることで、コードがかけないプログラマ志願者を見分ける手法を Jeff Atwood が FizzBuzz問題 (FizzBuzz Question)として提唱した。その提唱はインターネットの様々な場所で議論の対象になっている。
また、実際に「制限時間2分以内」「剰余(%記号等)を用いない」「1行でできる限り短く(ワンライナー)」等の縛りでゲーム条件を満たすコード記述の腕試しをする者が続出した。

その場で、自分で書いてみたコードは以下。
工夫点は、「3で割り切れる」というロジックと「5で割り切れる」というロジックが重複するので、その結果をキャッシュしたというだけヽ(`Д´#)ノ

調べてみたら、"FizzBuzz" = "Fizz" + "Buzz"であることを利用して短くまとめている回答もメジャーのよう。javaだとこんな感じ。


しかし、圧巻はPerl。短いなあ。$_で直前に評価した値が参照できる点が効いてるのか。



以下のページがよくまとまってて、引用させていただいた。
Fizz Buzz Test

しかし、中にはスタックトレースでFizzBuggする変態さんもいるようでw


Javaでちゃんと数字も表示されるFizzBuzz書いた

Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at javaapplication1.FizzBuzzNewClass.main(FizzBuzzNewClass.java:18)
Caused by: java.lang.StackOverflowError

at 8911.fizzbuzz(FizzBuzzNewClass.java:80)
at 8910.number(FizzBuzzNewClass.java:32)
at 8909.number(FizzBuzzNewClass.java:40)
at 8908.fizz(FizzBuzzNewClass.java:58)
at 8907.number(FizzBuzzNewClass.java:34)
at 8906.buzz(FizzBuzzNewClass.java:75)
at 8905.fizz(FizzBuzzNewClass.java:56)
at 8904.number(FizzBuzzNewClass.java:34)

ちなみに、この記事Hacker Schoolには、FizzBuzzCodeを応募時に貼付けさせている。

このボリューム、間違いなく3日坊...

2012年1月7日土曜日

syntaxHighlighter so cool

また、blogを作ってみた。何個目だろう。 今回は、syntaxHighlighterを使ってみたくて、作ってみた。



シンタックスハイライト、かわいいな! あとは、3日坊主にならないようにモチベーションを維持するだけです。

メモ
http://alexgorbatchev.com/SyntaxHighlighter/manual/brushes/