サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
今年の「#文学」
kazzz.hatenablog.com
例えば時間計算でよくあるケースとしてエポックから現在時までの経過秒数(GMT)を取得する処理だが、Objective-C/Cocoaでは以下のように簡単に書ける。 NSDate* now = [NSDate date]; long result = (long)([now timeIntervalSince1970] * 1000); //秒数なので1000を乗じる NSDateクラスのtimeIntervalSince1970メソッドの戻り値はNSTimeIntervalつまりdoubleだが、その後の計算がしやすいようにlongで受けている。 long型は64bitアーキテクチャでのサイズは64bitでありdouble型を格納するには十分のはずだ。 しかし上記コードをコンパイルして実行するとiOSデバイス上では桁あふれを起こしてしまう。実際にはlong long型が必要なのだ。 Mac
インストール時に勝手にスクリーンのサイズを検出して1600*1200とか、サーバOSではあり得ない大きさになろうとする。 うざいので調べてみると、以下の設定を仮想マシン構成ファイル(.vmx)に追記すれば良いことが判った。 svga.autodetect = "FALSE" svga.maxWidth = "1024" svga.maxHeight = "768" これで検出されたモニタに関わらず1024x768で起動する。※ 昔のVMWareの設定だが、まだ有効のようだ。 ※最初、800x600と書いたのだがGNOMEでボタンが押させなくなる等明らかに問題が出たので1024x768に変えた。
cvtcolor : その他の画像変換 ― opencv 2.2 documentation HSV色空間 OpenCVで取り得る値の範囲 H (Channel1) 0〜180の範囲。Hueは本来0〜360だがOpenCVではH/2の値を示す。181〜255の範囲は0からの循環に回される S (Channel2) 0〜255の範囲。255がS=1.0に相当。 V (Channel3) 0〜255の範囲。255がV=1.0に相当。 RGBの色空間がそれぞれ0〜255の値を取るのに対して、OpenCVのHSVは8Bitに収めるためにHは0〜180(181以降は循環)、SとVは0〜255の範囲が有効値になっている。 これが判らずにBGR2HSVで変換したMatに対して0〜255の値をcv::thresholdに渡して嵌っていたが、漸く理解した。
ld: file not found: /Users/kazz/Library/Developer/Xcode/DerivedData/プロダクト名-eiottghqglskmzegzcmbbdbkgyhh/Build/Products/Debug-iphonesimulator/プロダクト名.app/プロダクト名 clang: error: linker command failed with exit code 1 (use -v to see invocation)古いプロジェクトを引っ張りだして来てOCUnitテストをしようとしたらビルドが通らない。 こんな時はプロジェクトのアプリケーションターゲットとテストプロジェクトで矛盾が起きていることが多い。 具体的には、テストターゲットのBuild Setting中のBundle Loaderパラメタの値がアプリケーションターゲットのPr
Androidの無名クラス、WindowsPhoneのラムダ(デリゲート)に慣れているプログラマはiOSに転向すると最初はそのような抽象がなくて絶望し、その後iOS4以降はBlocksが使えることに歓喜する。 Blockは基本的にはファンクションへのポインタ型で実装されており(Delphiを思い出すな)一時変数やパラメタとして使うのが普通だが、ならばプロパティとしても使えるだろうと以下のように定義する。 BBButtonProxy.h @interface BBButtonProxy : NSObject @property (strong, nonatomic) NSString *label; @property (strong, nonatomic) void (^action)(); //※1 〜 〜 { //OKボタンが押下された場合の処理 BBButtonProxy* yesI
!= 先日AirPrint対応のプリンタをandroidから制御してみようというエントリを起こしたのだが、これは困難なのかもしれないと思いはじめている。 無知な私はAirPrintはBonjourに対応した印字機能を持つプリンタのことを指すのではないかと勝手に思い込んでいたのだが、そうではなく、AirPrintはあくまでApple独自の特定の機器のドライバを必要といないゼロ・コンフィグレーション技術を用いたプロトコルであり、Bonjourの基礎的な技術は使用していると思われるが、AirPrint対応のプリンタがBonjourを使って全て制御できるわけではないということぽい。 ネットの情報を総合するとAirPrintで解っていることは AirPrintは印字制御にインタネット印刷プロトコル(IPP)を使用する AirPrintはプリンタの探索にマルチキャストDNS (mDNS)を使用する A
MacBook Proのメモリを増設するに当たって、ブート可能なイメージでSSDの内容(100GB強)を完コピでバックアップを取りたかったのだが、Timemachineを初期実行すると「残り5日」とかトンでもない見積もりを出しやがるので(実際に3日やっても終わらない)、いい加減愛想がつきた。 Macで他にフルバックアップを取る方法はいくつかあるのだが、評判の良いツールを使ってみることにした。 Mac Backup Software - Carbon Copy Cloner CCCはインストールも簡単(ZIPファイルを解凍してAppフォルダにコピーするだけ※)だが、バックアップも簡単だ。 コピー元のボリウム(内臓SSD)、コピー先のボリウム(外付けHDD)を指定して、クローンを選択するだけ。簡単といってもフォルダ、ファイルをコピー対象から外すことは勿論のこと、コピー先にしかないフォルダ、ファ
android.net.nsdパッケージが現状バグで使えなさげだが、Bonjourを扱うには元々実績のあるJavaのライブラリィが提供されており、有り難いことにandroidからでも使えるのだ。 JmDNS JmDNSはmDNS(Multicast DNS)とDNS-SD(DNS based Service Discovery)をサポートし、Bonjourとの完全な互換を歌うオープンソースのライブラリィであり、Apache License, Version 2.0ライセンス下で使用することができる。 Javaを使ったサービス探索〜解決のためのコード static JmDNS jmdns; jmdns = JmDNS.create(); jmdns.addServiceListener("_ipp._tcp.local.", new ServiceListener(){ @Override
久しぶりにAndroidでカスタムViewを書いている。内容はiOSで作ったUIViewからの移植であり、画像の加工前のプレビューを表示するものだ。技術的には別に難しくは無いのだが、画像をassetからロードするとエミュレータでは発生しなかった例外が出る。 サンプルコード //アセットに配置したイメージをロードする try { InputStream is = context.getResources().getAssets().open("sample.png"); this.setImageBitmap(BitmapFactory.decodeStream(is)); } catch (IOException e) { e.printStackTrace(); } 発生した例外 11-26 13:51:28.825: W/OpenGLRenderer(9048): Bitmap too
そろそろandroid側のOpenCVも覗いておこうと思い、インストールしてみた。 version2.2以降、Java APIが整備されてきたおかげで、基本的にJava APIでアプリケーションを書けるはずだが、OpenCVの提供するサンプルアプリケーションを動かすためにはNDKを使ったビルドが必要なので、前提としてNDKとEclipse用のプラグインをインストールして、NDKのロケーションをEclipseに教えておくおく必要がある。 OpenCV for androidをインストールする といっても、以下のリンクからアーカイブをダウンロードして適当な位置に展開するだけだ。 OpenCV for android 2.4.3 中身は既にEclipseで使えるように構成されており、sampleアプリケーションもそのままEclipseのプロジェクトとして読み込むことができる。 OpenCVのプロ
iOSデバイスも他のモバイルデバイスと同様、カメラで撮影した又はギャラリから選択した画像をアプリケーションで扱うことができる。(というか、iOSデバイスのが) カメラ又はライブラリから画像を取込むための典型的なコード UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { [imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera]; } else { [imagePicker setSourceType:UIImagePicke
以前に「OpenCVのコードを書く時にはC++で統一する」と宣言した。 OpenCVのコードをC++にすることによって OOPになって画像やマトリクスを一貫してcv::Matクラスで扱えるようになった テンプレートやコレクションクラスが使えるようになった (最初は気味が悪かったが)コンストラクタが自動 参照カウントによりインスタンスの明示的な解放が不要 等、便利でかつシンプルなコードを書けるようになったのだが、困ったことも起きていた。 これはOpenCVを使ったC++コードの中にXcodeでブレークポイントを張って実行、ブレークした状態だが、全く見当違いな行で停止している。変数の監視も効かない。 どうしてこうなるのか。 色々と調べたが良く分からない。しかしこういう場合はコンパイル時の最適化が原因であることが多いと経験則で判っていたので、少し調べてみた。 Xcode(LLVM)コンパイルオプ
同ビューのフォントサイズは視認性を優先してかなり大きめのフォントサイズが使われている。しかし年月日等を他のボタン等と一緒に表示しようと思うと少しフォントサイズを小さくしたいと思うことも多い。 なので変更しようと思ったのだが、対象となるUINavigationController.navigationItemにはUINavigationItem型であり、FontsizeプロパティもFontプロパティも公開されていないため、このままではどうしようも無い。 調べた所タイトルのフォントを変更するにはUINavigationItem.titleViewプロパティでView(UILabel)を置き換えるしかないようだ。 UINavigationItem.titleViewを別なラベルで置き換える(UINavigationController viewDidLoad) UILabel* label =
バージョン情報で表示されているJavaのランタイムはどこを指しているのだ?? 答えは /Library/Java/javaVirtualMachines/だった。 バージョン違いのランタイムもここにインストールされるようだ。 従ってJava7インストール直後のJAVA_HOME環境変数を設定するのならば以下になる。※ /Library/Java/JavaVirtualMachines/jdk1.7.0_11.jdk/Contents/Home と思ったのだが、コメントで頂いたようにこのパスへリンクしている /usr/libexec/java_homeを使うのが正解のようだ。(バージョン毎にリンク先が自動的に変えられるのだろう) そこでとJava7をインストールするに辺り、Java6を完全にアンインストールしてやろうと以下のディレクトリをばっさり消したら、インストールしてあるはずのJava7
昨日までの件に関して、もう一度困っている事とやりたい事とを整理しておこう。 困っている事 findContourとapproxPolyDPで抽出した輪郭の頂点座標の出現順が一定しない。 座標原点の右上から出現したり、左下から出現したりするため、他の座標系(例:UIView)に変換することができない やりたい事 findContourとapproxPolyDPで抽出した輪郭の頂点座標の列挙に一貫性を持たせ、他の座標系への変換を容易にする。 昨日までの私の足りない考えでの単純な方法では失敗したが、昨日コメントでアドバイス頂いたように、色々調べてみるとこのアルゴリズムは計算幾何学で言う所の"凸包"を算出する事に等しいのではないかということが判った。 凸包とは? 「点の集合があったとき、その点を全て含んで且つ凹んでいる部分が無い(凸)多角形を形成する点の集合。」 とでも言えば良いだろうか。詳しくは
android androidの場合、オーバライドされたonDrawメソッドのコンテキスト中でCanvasクラスのインスタンスの参照を得ることができるので、そのCanvasのメソッドを使って直接文字列を描画できる。 @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); final Paint p = new Paint(Paint.ANTI_ALIAS_FLAG); p.setStyle(Paint.Style.STROKE); //色設定 p.setColor(0x66FFFFFF); //文字の大きさ p.setTextSize(40); //描画位置微調整のためにフォントメトリクスを取得 FontMetrics fm = p.getFontMetrics(); //テキスト描画 canvas.drawT
Eclipseを使えば簡単だと思っていたんだが、そうでも無かった。 ビルドツールもコマンドも使わず、EclipseのExportメニューでプロジェクトソースのjavadocを生成しようとすると、以下のエラーが出て途中で止まってしまう。 java.lang.ClassCastException: com.sun.tools.javadoc.ClassDocImpl cannot be cast to com.sun.javadoc.AnnotationTypeDoc at com.sun.tools.javadoc.AnnotationDescImpl.annotationType(AnnotationDescImpl.java:46) at com.sun.tools.doclets.internal.toolkit.util.ClassUseMapper.mapAnnotations(C
UITableViewを使用したプロトタイプをInterfaceBuilderで作っていたが、いくつかはViewController側にコードを書く必要があった。 参考にさせて頂いたサイトを紹介して、その点を備忘録としておく。 行を選択状態にしない 本来は属性"Show selection on touch"をチェックしないことで事足りるはずなのだが、何故かそうはならないので、tableView:cellForRowAtIndexPath:indexPathメソッドをオーバライドする。 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [super tableView:tableVie
UINavigationControllerをベースにしたビューの遷移は、ビューがプッシュされる度にナビゲーションバー(UINavigationBar)と呼ばれるツールバーが上端に配置される。※ナビゲーションバーには遷移を逆に辿るために「戻る」ナビゲーション用ボタンが自動的に配置されるが、その他にもUIBarButtonItem(ボタン)を追加することができる。 ただしこのUIBarButtonItem(ボタン)はInterfaceBuilderから追加するには制限があり、(左端にボタンを配置してしまうと遷移を遡るナビゲーションボタンが消えてしまうため)実質右端に一つしかボタンを配置することができないのである。 このような仕様なので使えないなと思っていたのだが、このUIBarButtonItemのカスタマイズはコードから行うことで上述した制限はなくなる。(ただしiOS5以降しか使えない)
UINavigationControllerにはナビゲーションバーの他に、下端にツールバー(UIToolBar)を配置することができる。 UIViewControllerのプロパティはインタフェースビルダのアトリビュートインスペクタで確認、変更することができる。ツールバーに関してもこれで設定すれば良いように思うのだが、 実際にはツールバーは表示されない。 なのでviewDidLoadメソッド等で以下の一行を追加すると //ツールバーの初期化 self.navigationController.toolbarHidden = NO; このように今度は表示される。(ひょっとしたら他に方法があるのかもしれないが、私には分からなかった) UIToolBarはUINavigationBar同様にボタン(UIBarButtonItem)を配置することができるので、前回同様にコードから追加してみた。 U
OpenCV for androidのインストールが終わったので、実際にアプリケーションを書いてみよう。 OpenCVといえば、まずすることは2値化ということでImageViewに表示する前に画像をOpenCVで2値化するコードを書いてみた。 MainActivity.java private void doBinarize() { Bitmap bm = ((BitmapDrawable)this.cropCanvas.getDrawable()).getBitmap(); Mat src = new Mat(); Utils.bitmapToMat(bm, src); Mat bined = OpenCVUtil.binarize(src, 0); Imgproc.cvtColor(bined, bined, Imgproc.COLOR_GRAY2RGBA, 4); Bitmap ds
昨日のエントリで書いたcvFindContoursのmodeパラメタだが、解説するよりも実際に動かした結果を見たほうが分かりやすい。なので実際に試してみた。 方法としては今まで紹介してきたようにcvCvtColorでグレイスケール化→cvThresholdを使って二値化した画像を元にcvFindContoursで抽出した輪郭をcvDrawContours関数で別なIplImageに描画している。(コードは長いので割愛する)なお、同ファンクションのmethodパラメタはCV_CHAIN_APPROX_NONEつまり全ての座標を使うに固定している。 以下は全てXcode 4.5, iPhone 5.0 シミュレータで実行した結果。 素材 矩形と文字を両方含むものが面白いだろうと思ってこんなのを用意してみた。 CV_RETR_EXTERNAL 最外周の輪郭のみ抽出する CV_RETR_LIST
Mac+PHA-1+Audirvanaで高級なオーディオにも負けない音が聴けることが判ったのだが、ならばWindowsPCではダメなのか? そんな事は無い。 WindowsPCでもお金をかけずともオーディオ的に良い音が聴ける。 といっても付属のWindows Media Playerでは期待は出来ないので、やはりオープンソースを使わせて頂くことになる。 foobar2000 foobar2000 foobar2000は他のプレイヤー同様にPHA-1を直接の出力先に設定できる。しかし、同プレイヤーの魅力は豊富なコンポーネント(プラグイン)にある。 デフォルトでインストールされているコンポーネントも含めて、以下のコンポーネントを導入することで音質の向上を期待できる。 WASAPI output support foobar2000: Components Repository - WASAPI
朝持ち出して通勤時間にiPod経由して聴いて、仕事場では早朝の誰もいない時間にMacに接続して聴いて、帰宅時にはまたiPodに接続して聴いて、自宅ではPCに接続して聴くという獅子奮迅の活躍を見せているSONY PHA-1だが、風の噂でiTunesよりもずっと音が良いプレイヤーが、それもMac OS用で提供されているということらしいので早速試して見た。 Audirvana audirvana - OSX Audiophile player - Google Project Hosting Audirvana(オーディルバナかな?)は高音質を歌ったMac OS用の音楽プレイヤーだ。 その特徴は FLAC、WAV、AIFF、ALAC、MP3のネイティブ再生(iTunesではFLACはサポートしていない) サンプリング周波数の自動切替えが可能 ソフトウェアレベルでのオーバーサンプリングに対応。 オ
Objective-Cを使ったiOSアプリケーション開発を初めてから半年以上経ち多少は慣れてきた。その中で他のプラットホームと比べてiOS上でのプログラミングで注意すべき点を幾つか上げていこう。 EXC_BAD_ACCESS 恐らくiOSプログラミングを初めて最初に遭遇するクリティカルなエラーはEXC_BAD_ACCESSだろう。 このエラーの原因の殆どは既に解放されたメモリ領域(大抵はオブジェクトを指していたポインタ変数)にアクセスすることだ。 Xcode環境ではコンパイル時のオプションで解放済みの変数に対してNSZombieオブジェクトをセットすることでデバッグを容易にする仕組みがあり、そのためにこのエラーを「ゾンビオブジェクトの発生」等とも呼んだりする。(解放済みのオブジェクトをアンデッドに例えるのは面白いと思う) objective-Cでは変数は生成されて所有権を設定(retain
Objective-Cによるプログラミング - developer.apple.com 公開された。 内容としてはObjectinve-Cを使うオブジェクト指向プログラミングの紹介と、Cocoa Foundationのコレクションなどの主要なイディオムを構成する基本的なクラスを紹介している導入的な資料であり、特に「クラスの定義」「オブジェクト操作」「カプセル化」、「プロトコル」などのオブジェクト指向プログラミングの基本とObjective-Cを関連づけて説明している部分は初心者向けに丁度良い内容だろう。 なお、いわゆる"Modern Objective-C"であるリテラルによる配列、辞書、数値オブジェクトの生成やブロックについても触れており最新の内容も網羅している。
何時からだろうか、職業プログラマとして生業を全うしたいと思いながら仕事をしていたのだが、今の職場ではもうそれを許してはくれなさそうだ。 許してくれないというよりは正確には「認めて貰えない」と言った方が良いだろうか。 仕事で経験を積む、企業で歳を重ねる、そうすると自分の相対的な原価って奴が上がる。 この原価ってのがやっかいで、自分が企業の中でどれだけをコストを発生させているかを見る物差しとなるのだ。コストは簡単に言えば人件費、つまり給料だ。※ 以降、この原価という物差しが自分の仕事全てについて回るようになった。 あなたがプログラムを書くのではコストに合わない。もっとコストに見合った仕事をしないと評価できないと言われるようになる。 頑張って経験を重ねて良い仕事が出来るようになったのに、あんたに仕事させると会社が損をするということなのだ。 この時世だ。別に高い給料をくれとは言わない。普通に暮らせ
KFC、いやKVC(キー値コーディング)とはNSKeyValueCoding非形式プロトコルによる、間接的なオブジェクトのプロパティへのアクセスとバリデーションのためのフレームワークを指す。 NSKeyValueCoding Protocol Reference - Mac OS X Developer Library NSKeyValueCoding非形式プロトコルなので、Javaのインタフェースのように実装が強制されるものではなく、クラスエクステンションとして実装されるためNSObjectから使える便利なものだ。 ではどうやって実装を縛るのか? いや、縛る必要は無いがある程度規約に準じた※クラスの実装が必要になる。 KVCに準拠する KVCに準拠するためにはKVCがキー値でアクセスできるように名付けされたアクセッサメソッドを用意しておく必要がある。 一番簡単なのは@proerty〜@s
久しぶりにMacBook Airにて「ゴミ箱を空にする」を実行した所、普段は殆ど音を発さないファンが全速で回りっぱなしになり、CPUが100%を超える(147%とかになってる!※)状態が続いた。 ゴミ箱を空をするだけでこれはおかしいと思ってアクティビティモニタを見ると、"Locum"というプロセスが起動されており、これがCPUを酷使していることが判った。 調べてみるとこの問題既知であり、冒頭のスクリーンショットのように「確実にゴミ箱を空にする」をチェックすると通常のファイル削除に、更にそのスペースに難読化の為のデータを埋める操作を追加するようで、これがLocumプロセスであり、高負荷の原因のようだ。 What is "Locum" in root user, and why...: Apple Support Communities 解決策としては「確実にゴミ箱を空にする」のチェックを外す
次のページ
このページを最初にブックマークしてみませんか?
『KazzzのJとNのはざまで』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く