Month: March 2014

obj.C:MesaClipソースコードのアップ

MesaClipソースコードとメソッド構成図を先程アップしました。

目次の▶︎ソースコードに入れてあります。格納先のprojectから直接buildして動作確認をしてあります。コメントを入れてあるので、メソッド構成図があれば何とか読めるのではないかと期待しています。

追加・挿入した行をselectRowIndexesを使って選択するようにしました。こうしておけば、insert afterで次々にファイルを追加できます。

なお、testボタンは、現在、接続されていません。

スクリーンショット 2014-03-31 01.40.12きのうは花起こしの雨が一日中降りました。笹山公園の桜は毎年咲かないのですが、ことしはもうすぐ満開です。

obj.C:MesaClip著作権の取り扱い

面倒なことに巻き込まれるといけませんので、ソースコードに著作権について明記しました。

各ソースコードには次の記載がしてあります。

 MesaClip

Created by HK’s iMac on 2014/01/22.
Copyright (C)2012-2014 raizan2ame @ Mesa Network Japan. All Rights Reserved.
 https://raizan2ame.wordpress.com/
ソースコードを利用する場合、AppDelegate.hに記載されている「著作権について」を了承されたものとみなします。

 

AppDelegate.hには、著作権についてさらに明記してあります。

著作権について
(1)著作権の帰属
このプログラム及び付属する関連ドキュメント並びにそれらを改変した二次的著作物(以下これらを総称して単に本著作物と呼ぶ)の知的所有権は、次の通り著作権者に帰属します。
Copyright (C)2012-2014 raizan2ame @ Mesa Network Japan. All Rights Reserved.
https://raizan2ame.wordpress.com/
(2)免責事項
本著作物を使用したことによって発生した損害は、一切補償しません。
本著作物に瑕疵があっても、著作権者はそれを訂正する義務を負いません。
(3)転載及び配布
本著作物の転載・配布はいっさいできません。
ただし、
1)個人の学習目的で本著作物の改変を行うことができます。
2)改変の有無に関わらず、本著作物からこの「著作権について」の記述やコピーライト表示のすべてもしくは一部を削除したり、修正することはできません。
3)本著作物をほかのプログラムやドキュメントと組み合わせて使う場合も、前項の1及び2の条件通りです。
4)個人の学習目的で教材として本著作物をコピー/配布したりすることもできません。
(5)記載がない事項に関しては個別にご相談下さい。

obj.C:MesaClipの概要

MesaClipの概要説明書を作りました。簡単なメモ書きになります。

ちゃんとできれば、何が便利になるかというと、次のような点です。そう、完成できればいいですね。

特徴:

  • webサイトのクリップができます。
  • 画像を削除したり、文字列を削除して、自分に必要な情報だけを抽出できます。
  • 自分のメモもその中に入れられます。
  • フォルダで分類できます。
  • ファイルのタイトルは、webサイトのhtmlの中から自動抽出します。
  • 画像の切り貼りができます(未実装)。
  • クリップしたwebサイトに、後日、また飛んで行けます。
  • クリップしたファイルのhtmlの最新版を順次見ることができます(未実装)
  • 本文中のhtmlは有効です。
  • htmlをクリックすると、新たなクリップを取り出すことができます(未実装)。
  • 縮小・拡大が1クリックでできます(未実装)。

UIの概要説明:

スクリーンショット 2014-03-30 20.26.16

obj.C:MesaClipメソッド構成

メソッド構成図を作成しました。

IBActionなどCocoaからkickされるメソッドを先頭に持ってきて、まとめました。以前書いたように、削除の実装が思ったよりも複雑でむずかしいでした。

技術的には、

  • textStorageへの読み込みにinsertTextではなくappendAttributedStringを使わないといけないと発見するまでとても長い時間がかかりました。
  • また、URLの読み込みは.rtfdをwork fileとして使うことにしましたが、本当にこれでいいのかどうかは良くわかっていません。
  • 最終的に、Table Viewの行削除のロジックを別クラスに出すとうまく行きませんでした。真剣に原因究明をしていませんが、5行くらいのロジックなのでgive upしました。
  • 配列の書き出しがうまくいかなかった原因はいずれ調査し、解決する必要があります。サンプルコードでもやってみたのですけどね。
  • ソースコードは、このあと並びを修正してからアップするようにします。夜中までには完了できるでしょう。
  • textDidChangeが漏れていましたので追加しました。あとでアップするExcelファイルの方は修正されています。

1. フォルダ名の生成

スクリーンショット 2014-03-30 16.04.13

 

2. ダブルクリック:ファイル表示切り替え
3. URL:ユーザが入力したURLの読み込み

スクリーンショット 2014-03-30 16.04.32

4.ファイル名: 表示画面のsave

スクリーンショット 2014-03-30 16.05.00

5. 削除: 保存したファイルやフォルダの削除

スクリーンショット 2014-03-30 16.05.24

 

obj.C:ソースコード公開に向けて準備中

まだ想定したすべての機能をインプリできていないのですが、コード量が1,300行を超えてきたので、ドキュメントを少し整理してからソースコードを公開しようとしています。

実のところ、ドキュメント作成にそんなに手間はかけられません。

しかし、モジュール構造だけは、出来映えがどうであれ、あった方が全体構成を把握しやすいので、作成中です(スクリーンショット参照)。これができ次第、ソースコードもアップする予定です。

いつかすべての機能が完成したら、操作手引書とか機能仕様書なども書きたいです。今はそこまでのエネルギーと時間がありません。

目次にソースコードのページを追加しました。ここに最低限必要な情報をアップする予定です。

また、そろそろ障害管理をしないと、何がなんだかわからなくなりそうなので、少しずつ書きはじめました。分類して、アイデア(思いつき)もメモっていきたいと思います。

共有フォルダはDropboxを使っています。容量不足になったらSkyDrive改めのOneDriveの利用も検討しなければなりません。書き込めるfile typeがiCloud同様に限定されているので、このブログの写真やイメージを移すことになります。そのうちにDropboxと同じになればいいのですけど。

ところで、「公開」と言ったところで、たいしたものではありません。Objective-Cを今から勉強しようとされる方には、もしかすると参考になる点があるかもしれない、という程度のものです。

6月末までは、Macでの開発(勉強)を続けるつもりです。

スクリーンショット 2014-03-30 09.42.16

 

obj.C:悲しくなってしまった identifier

ファイルやフォルダの削除機能を追加していました。想定よりもコード量が多く、ロジックがむずかしいでした。

フォルダを削除すると、該当する表のファイル情報も連携して削除する必要があります。また、削除後にどのファイルを表示するかの処理も入れないといけません。そんなこんなで、手間取っていました。

削除処理は正常に終わっているはずなのに、表の範囲外の行(row/column)をアクセスしているというエラーで落ちてしまうのです。どのように調べればいいか、全く見当がつかなかったので何回もロジックを見直したのですが、問題の箇所は見つかりません。

ようやく思いついたのは、本当に削除処理が正常終了しているか調べるログを入れることでした。それで、やってみると、全くOKです。

次に表のコントロールをしているところに片っ端からログを入れ、ようやく-(void)tableView:(NSTableCellView *)tableView //
setObjectValue:(id)object forTableColumn:(NSTableColumn *)column row:(NSInteger)rowで落ちていることがわかりました。

悲しかったことは、カラムのidentifierをsetするにはどうしたらいいか調べたときの残骸がここに残っていたことです。これはこれで調べないといけないのですが、残骸は実にまずいでした。

良かったことは、このエラーを調べているとき、表の行(row)の選択解除と選択の仕方がわかったことです。この選択が問題なのかなあと疑いを持って調べたのですが、そうではありませんでした。そんなはずはありませんよね。

表の行選択解除の仕方
表記:- (void)deselectRow:(NSInteger)rowIndex
用例:
IBOutlet NSTableView *tableView;
NSInteger row = [tableView clickedRow];
[tableView deselectRow:row];

表の行選択の仕方
表記:- (void)selectRowIndexes:(NSIndexSet *)indexes byExtendingSelection:(BOOL)extend
用例:
IBOutlet NSTableView *tableView;
NSInteger mcRow = 2;
[tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:mcRow] byExtendingSelection:NO];

メモ:

  • いまひとつ調べないといけないことは、表の行削除をメイン側に実装しないとNGだったことです。
    ➡これは勘違いです。NSInteger row = [tableView selectedRow]; を削除して、メイン側と同じアルゴリズムにしたら、OKになりました。
  • NSInteger row = [tableView selectedRow]; については、文字通り、現在選択されている行をgetするというもので、必ずしも行削除に紐づいているものではありませんでした。サンプルプログラムでは、選択行を削除する実装になっていたというに過ぎません。
  • ソースコードはsaveとcopyを作りながら更新しています。しかし、手順をまちがってしまい、その修復もやっていました。ちょっとしたことですが、基本的なことがきちんとできないと、余計な後戻りが発生してしまいます。100%は無理でも、90%は・・・。
  • もしかすると少し重要。フォルダを削除すると、当然、その中に入っているファイルも削除されます。そして、これらに対応する表中のフォルダ情報、ファイル情報も削除しないといけません。最初、表の上側から削除していたのですが、行数([tableView count]が削除の度に変わってしまうので、どうもうまくありません。
    それで、表の最後から同じフォルダの中のファイルの行だけを探して、上側にフォルダの行位置まで消していくようにしました。

IMG_3221

 

 

obj.C:姑息な手段? 絵文字

アイコンの設定がうまく行かなかったので、pull down buttonと絵文字を使って先に進めています。

アップル絵文字の「多様性」拡充を求めてUnicode標準化団体と協議中というニュースが出ていましたね。だからという訳ではないですが、アイコンの代わりに絵文字で逃げる方法もありました。

形に囚われて、肝心の中身ができないのは問題なのですが、そうは言っても見栄えはだいじですので、絵文字はいいアイデアだと思いました。ウッ?だいじなだけに、やっぱりpull down menuでは体裁が悪いので、勉強が進んだ暁には、もっとMacらしくしないといけませんね。

ちなみに、絵文字の入力の仕方は、「command」 「control」 「スペース」キーを同時に押すでした。

スクリーンショット 2014-03-27 23.23.42

obj.C:カラムにボタンを設定

アイコンの表示の仕方がわからず、これ以上調べても埒(らち)があかないので、push buttonならどうか、方針変更してみました。

ところがサンプルコードを実装してみても、うまくpush bottunが入らなかったり、あるいは古過ぎて没になったメソッドだったりで、そう甘くありません。

それで、以前、.xib(IB: Interface Builder)でpush buttonをセルに入れたことを思い出し、もう一度やってみました。コードを書かなくても、ボタンは表に表示されるようになりました。

スクリーンショット 2014-03-27 09.22.50イベントは、カラムをダブルクリックしたときと同じイベントに飛んで来るようなので、あとでpull down buttonに対応した処理を付け加えます。それとも、たとえば、pull down buttonの削除に対応したIBActionでうまく処理できるなら、その方が単純でわかりやすいですね。まず、こちらの方から試してみます。

しかし、それでもまだ問題は残っています。ボタンの表示名をフォルダかファイルか切り替えるようにしたいのですが、setTitleでカラム毎に設定できるかどうか?

なお、ボタンを入れると、カラムに設定した文字列は上書きされてしまうようです。また、NSMenuItemCellはなくなり、NSMenuItemに一本化されたのでしょうか?