プログラミング

2014年11月 6日 (木)

Swift でプログラミングを開始(3)

7月に Swift でプログラミングを開始してから4ヶ月が経ちました。ベータ版での開発となりますので、Xcode が不安定なことで色々と苦労しました。特に自分のプログラムが正しいと思われるのにコンパイルが通らない、上手く動作しないという状況も発生し、コンパイラや API の動作の確認に結構時間を費やした感じがします。

さて、その Xcode も swift 言語での OS X 用アプリの開発に対応した Xcode6.1 が正式にリリースされました(まだ多少不安定なようですが... )。Xcode6 が正式にリリースされましたので、4ヶ月前に制作を開始していた PDFドキュメントビューアのその後について書きたいと思います。

PDFBookcase

PDFファイルは Apple 純正の「プレビュー」を使って閲覧することができます。しかし、PDFファイルをいちいちオープンするのが面倒なので、Swift 言語とCocoa フレームワークの勉強の題材として、よく閲覧するPDFファイルを登録しておける PDFドキュメントビューアを作ってみようと思いました。アプリの名称は PDFBookcase にしました。

PDFBookcase の技術的な目標は下記の通りです。

  • Swift 言語で制作する。
  • データの保存は CoreData を用いる。
  • PDFの表示にはPDFView, PDFThumbnailView を使用する。
  • PDFファイルはNSOutlineViewで階層的に表示。
  • PDFファイルはドラッグ&ドロップで登録可能。

現在のバージョンは 0.3.0。幾つかの不具合は残っていますが、ほぼ予定していた機能の実装は完了し、使い始められる状態になりました。アプリの見た目はこんな感じです。

Image_141104_1

今回、PDFBookcase のソースコードも公開することにしました。

ダウンロード: PDFBookcase0.3.0.zip

一応、Swift で記述されたアプリケーションのサンプルとなります。ソースコードについて注意ですが、まだ私も Swift 言語や Cocoa フレームワークの勉強中ですので、このソースコードが最適な実装方法であるという保証はありません。もし、もっと良い実装方法があれば、是非教えてください。

2014年8月 3日 (日)

Swift でプログラミングを開始(2)

Objective-C で作成中だった OS X 用の PDFドキュメントビューアを Swift で書き直し始めてから約3週間が経ち、ようやく Objective-C で動作していたときと同等の状態まで動作するようになりました。始めに予想していたよりは手こずった感じです。

Objective-C のソースコードを Swift に移植してみて感じたことは、Objective-C よりシンプルにかけるということでしょうか。全体的にソースコードがスッキリとした印象を持っています。ヘッダーファイルが不要というのも良いですね。

今回、プログラムを移植するのに一番手間取ったのは、nil に対して厳しくなったことでしょうか。実際にはむしろ逆で、Objective-C が nil に対して寛容だったという方が正確かもしれません。Objective-C では、nil に対してメッセージを送っても無視してくれましたが、Swift ではエラーで止まってしまいます。今まで Cocoa フレームワークから nil が返されている場合があることに気づいていなかったところがあったのですが、今までは偶然うまく動作していました。今回 Swift に移植することで、このような隠れていた不具合が発見できました。

また Swift は Objective-C に比べますと、型変換が厳しいです。Objective-C(C言語)の型変換は最強(安全面から見ると最悪?)で、無茶な型変換もできましたが、Swift ではそうはいかないようです。型変換が厳しくなったことで、今までCocoaの仕様を勘違いしていた部分に気が付くことができましたし、以前より、少しは安全なコードになったのではないかと思います。

Objective-C からの移植は一区切りつきましたが、まだ Swift の機能を活かしたソースコードにはなっていないと思いますので、これを元に色々といじり回し、Swift らしいコーディング、自分のコーディングスタイルなどを模索したいと思います。

2014年7月18日 (金)

Swift でプログラミングを開始

今年6月に開催された WWDC で、新しいプログラミング言語 Swift が発表されました。これで OS X アプリの開発には従来の Objective-C と Swift の2種類の言語で開発できるようになりました。

既に Objective-C に慣れてきているので、このまま Objective-C を使い続けても良いようにも思うのですが、やはり新しい言語には興味がありますし、アップルのことですので、数年後に Objective-C を切ってしまうのではないかという心配もあります。

そこで Objective-C から Swift に乗り換えるべく、ネット上で Swift に関する記事を読みあさっていたのですが、やはりプログラミング言語は実際に使って見ないと良く理解できません。しかし、今 Swift を使うには、Xcode 6 beta版が必要ですが、Xcode6 beta 版は有償の Developer Program に加入しなければ手に入れることができませんでした(過去形)。

ところが先週、無償の Apple Developer 登録メンバーでも Xcode6 beta3 がダウンロードできるようになりました。そこで Xcode6 beta3 をダウンロードし、実際にコードを書き始めてみることにしました。

Swift でプログラムを書くなら、勉強用のサンプルプログラムを書くより、実際に使えるアプリケーションを作ってみる方が楽しいです。そこで、現在 Objective-C で作成中だった OS X用の PDFドキュメントビューアを Swift で書き直すことにしました。

Image_140715_1

このPDFドキュメントビューアはサイズも大きくなく、基本的な機能は動いている状態となっており、ちょっとリファクタリングしてみようかと思っていたところでしたので、ちょうど良い題材となりそうです。

Swift でのプログラミングは色々とハマるところもあり、牛歩のような進捗ですが、新しい言語を使ってみる事は楽しいですね。またハマったところなどを書いてみたいと思います。

2010年5月 3日 (月)

Mac OS X 用メモ帳ソフトの作成に挑戦(6)

メニューでメモ用紙を他の箱に移動できるようにするためには、2つの事を解決しなければなりません。

まずメニューにメモ箱の一覧を表示するために、メニューの内容を動的に作成しなければなりません。これには、NSMenuDelegate の numberOfItemsInMenu: メソッドでメモ箱の数を返すと、menu:updateItem:atIndex:shouldCancel: メソッドがその個数分呼び出されるので、この中でNSMenuItemを設定するという方法が簡単そうです。メモ箱のArrayは、NSArrayController の arrangedObjects: メソッドで取り出せるので、この情報を使ってメニューを設定します。

つぎに、ニューで選択したメモ箱に、メモを移動させる処理の実装が必要です。これはエンティティPaper の関連であるbox に、移動先のメモ箱のid を設定してやるだけで良いようです。これだけでテーブルは更新され、UNDOもできるようです。

Image_100503_2

ついでにコンテキストメニューでもメモの追加、削除、移動ができるようにしました。これはInterfaceBuilder だけで作業が完了です。上記のメインメニュー用の処理がそのまま使えますので、新たなコーディングは必要ありません。

Image_100503_3

メニューでメモの移動できるようになりましたので、テーブルにメモ箱の欄が要らなくなりました。

Image_100503_1

2010年4月24日 (土)

Mac OS X 用メモ帳ソフトの作成に挑戦(5)

前回から1ヶ月近くたってしまいました。最近仕事の方が忙しくて、プログラミングは進んでいません。

今回はメニューの内容を整理しました。ここでメニューで気になっていた「ツールバーを表示」メニューの内容を、ツールバーが表示状態の場合は「ツールバーを隠す」に切り替わるようにすることにしました。

Image_100424_1

Image_100424_2

ツールバーの表示状態を調べて、メニュー表示前にメニューアイテムのタイトルを切り替えれば良いかと思い、色々と調べてみた。結果、メニューアイテムのタイトルを空白にしておけば、自動でツールバーの表示状態に合わせて切り替わる事が分かりました。なんだ、何もしなくても良いのか... 。

次は、メニューでメモ用紙を他の箱に移動できるようにする事に挑戦。

2010年3月28日 (日)

Mac OS X 用メモ帳ソフトの作成に挑戦(4)

Core Data を使っていると、Table View の表示順序が起動するたびに変わってしまいます。どうやらCore Data では、データの順序が保存されないようです。

仕方が無いので、メモ箱はソートして表示するようにしていましたが、やっぱり自分の好きな順序に並べたい。ネットで調べてみると、Core Data の属性に順序を示す数値を保存しておいて、その属性を使ってDrag & Drop で並び替える方法が見つかりました。

Image_100328_1まず、Xcode のデータモデリングツールでエンティティBox に順序を保存するための属性order を追加します。そして、NSTableView のカラムを1つ増やし、Cocoa Binding でorder の内容が反映されるようにします。このorder のカラムは、Hidden をオンにして表示されないようにしておきます。

次にサンプルコードを参考にしながら、メモ箱を追加したときにorder に番号を追加するコードと、Drag & Drop のコードを追加。処理の中身は良く分からないところもありますが、なんとか自分の好きな順に並び替える事が可能になりました。良い感じです。

しかしUNDO を行うと、order 属性は元の状態に戻りますが、Table View の表示内容が変わりません。要するに、order の順序と、実際に表示されてる順序が異なるという状態になってしまいます。どうしたものか... 。

追記(2010/4/25)

Interface Builder で、NSArrayController のオプションである「Auto Rearrange Content」にチェックを入れれば、UNDO時にTable View の表示が更新されることが分かりました。

2010年3月27日 (土)

Mac OS X 用メモ帳ソフトの作成に挑戦(3)

前回でユーザインターフェースを作りましたが、メモ箱の一覧を見るためにドローワをオープンするのは面倒だと感じましたので、メモ箱のリストをメインウィンドウに移動し、メールソフトのような3ペインのインターフェースに変える事にしました。

また、自分しか使わないので、日本語リソースを追加して、ユーザインターフェースを日本語にしました。ひとまず英語リソースはプロジェクトから外します。

Image_100327_1

ツールバーのアイコンがカッコ良くないけど、取りあえず先に進めます。

ここまではプログラムを1行も書かずに、そこそこ動くところまで出来ていますが、このままでは使いやすいアプリケーションにはなりません。ここからはプログラミングが必要です。まずは下記の3つの機能を実装しました。

  • ウインドウを閉じるとアプリケーションが終了するようにする。
  • 箱、メモ用紙を削除する前に警告のシートを表示し、確認できる。
  • 環境設定ウインドウで上記のシートの表示を行うかを設定できる。

2010年3月21日 (日)

Mac OS X 用メモ帳ソフトの作成に挑戦(2)

前回でXcode のデータモデリングツールでデータ構造(エンティティと呼ぶらしいです)を作成しました。次はユーザインターフェースを作ります。

ユーザインターフェースは、Interface Builder を使って作成します。Core Data では、エンティティから直接ユーザインターフェースを作る事ができるようです。作成したエンティティをInterface Builder の空のWindow にオプションを押しながらドロップすると、そのWindow 内にユーザインターフェースが生成されます。

ただ、このままでは見栄えと使い勝手が良くないので、自動生成されたユーザインターフェースを編集し、参考書を見ながらCocoa Binding で繋いでいきます。そして、Xcode でビルドして実行。

Image_100321_1

ここまでの作業だけで、下記の事ができるようです。

  • 箱の追加と削除。
  • メモ用紙の追加と削除。
  • 箱に含まれるメモリストの表示。
  • メモの編集。
  • 追加削除、編集内容のUNDO、REDO。
  • メモの自動読み込みと保存。
  • メモのタイトルの検索(絞り込み)。
  • Window分割位置の変更と記憶。
  • ドローワ表示のオン、オフ。
  • ツールバーの編集。
  • Windowの位置と大きさ等の記憶。
  • 表のソート、列の移動処理。

ほとんど出来ているようなものですね。ここまでで、まだプログラムは1行も書いていません。Core Data とCocoa Binding 凄いです。

2010年3月20日 (土)

Mac OS X 用メモ帳ソフトの作成に挑戦(1)

Mac OS X でのプログラミングに再挑戦を開始した訳ですが、まずはメモ帳ソフトを作ってみます。練習なので凝った仕様にはせずに、簡単なものを目指します。こんな感じでしょうか。

  • メモには表題と作成日時を記載できる
  • メモは箱ごとに分類できる
  • 箱を選ぶと、箱に含まれるメモの表題が表示される
  • 表題を選択すると、その内容が表示される
  • 起動時にメモを自動で読み込み、終了時に自動で保存

メモのデータはCore Data で扱います。Core Data を使えばデータの読み込みと保存は自動で行われるようです。 まずはXcode でCocoa Application のプロジェクトを作成します。このときに「Use Core Data for storage」にチェックを入れておきます。

次に参考書を見ながら、Xcode のデータモデリングツールでデータ構造を作成します。こんな感じとなりました。

Image_100320_1

メモ箱(Box)には箱の名前(name)があり、メモ用紙(Paper)と関連付けます。箱とメモ用紙は1対多の関係です。メモ用紙には作成日時(date)と表題(title)、メモの内容(text)があります。

これでデータ構造の定義は終わりです。

2010年3月14日 (日)

Mac OS X で Subversion を設定してみる

プログラミングを始めるのであれば、バージョン管理システムは要るだろうということで、Subversion を導入してみる事にしました。Subversion であれば、Mac OS X に標準で入っていますし、Xcode でもサポートされているみたいですので。

以下の手順で Subversion の設定ができました。(思い出しながら書いています。たぶん間違いないと思うが。)ここでは省略していますが、一般ユーザ権限でアクセスできない領域のファイルやディレクトリにアクセスしていますので、sudo で認証が必要となります。

Apache の設定

/etc/apache2/httpd.conf ファイルに下記の内容を追加します。

LoadModule dav_svn_module  libexec/apache2/mod_dav_svn.so

/etc/apache2/other/ ディレクトリに下記の内容で subversion.conf ファイルを作成します。このディレクトリに置かれたファイルは、httpd.conf にインクルードされるようになっています。

<Location /svn>
   DAV svn
   SVNParentPath /var/svn/repo
   SVNListParentPath on
   AuthType Basic
   AuthName "Subversion"
   AuthUserFile /var/svn/passwd
   Require valid-user
</Location>

Subversion用のディレクトリを作成

Subversion用のディレクトリを作成します。

mkdir /var/svn
mkdir /var/svn/repo

パスワードファイルの設定 passwd ファイルを使用して、全リポジトリにアクセス制限を行うようにします。

cd /var/svn
htpasswd -c passwd user-name
New password: ****
Re-type new password: ****
Adding password for user user-name

ディレクトリとパスワードファイルに適切な権限を設定します。

chown -R www:www /var/svn
chmod 600 /var/svn/passwd

リポジトリの作成

まず、テスト用にリポジトリを作成してみます。先ほど作成した /var/svn/repo/ ディレクトリ内にtestリポジトリを作成します。

mkdir /var/svn/repo/test
svnadmin create --fs-type fsfs /var/svn/repo/test
chown -R www:www /var/svn/repo/test

Apacheの起動

システム環境設定の「共有」で、Web共有をONにします。既にONになっている場合は、一度OFFにしてから再度ONにすれば、Subversionの設定が読み込まれます。これで、http://localhost/svn/test でリポジトリにアクセスできるはずです。

より以前の記事一覧

フォト

最近のトラックバック

無料ブログはココログ