2016年2月1日月曜日

なんとかしちゃえばいいのよ。:EXIFの日付が「2002/12/08 12:00:00」になってしまう件

こんばんわー。
「あーだめだこりゃ絶対!」と思ったことでも、意外なところにブレイクスルーがあるもんですね。

というわけで、今日の投稿はどちらかというと自分のための備忘録。ごめんちゃい。

・・・実は、仕事で公開しているAndroidのカメラアプリ「CALBAN Pro」で、撮影した写真のEXIFデータが「2002/12/08 12:00:00」となってしまう、という不具合があったんです。

やー、別に日付のところは何もいじってないしなー、おかしいなー・・・と思って色々調べてたら、どうもAndroidのライブラリに不具合あったらしく・・・。
えええー。そんなんどうしようもないよー。
でも何とかせんと、ユーザーさん困るしなー・・・。

ま、何なら自分でEXIFタグに現在時刻を設定しちゃえばいいのよ。うふふ。
ということで、直してみました。
こんな感じで時刻を作成して・・・

Date date = new Date();
SimpleDateFormat format_exif = new SimpleDateFormat(getString("yyyy:MM:dd HH:mm:ss"), Locale.JAPAN);
String datetime_original = (format_exif.format(date));
TiffOutputDirectoryに日付をセット。
destDirectory.removeField(ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL);
destDirectory.add(ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL, datetime_original);
destDirectory.removeField(ExifTagConstants.EXIF_TAG_DATE_TIME_DIGITIZED);
destDirectory.add(ExifTagConstants.EXIF_TAG_DATE_TIME_DIGITIZED, datetime_original);
で、ExifRewriter()を使ってメタデータを書き換え。
ExifRewriter().updateExifMetadataLossy(file, BufferedOutputStream, TiffOutputSet);
・・・最初は「updateExifMetadataLossy」ではなくて、「updateExifMetadataLossless」を使っていたのですが、それだとエラーでうまくいかなかったです。ちょっとした違いなのになー。

ま、うまくいったからいいや。






2016年1月28日木曜日

すべりこみセーフ:サービス終了のcodebreakからBitbucketへかんたん移行

いやいやいや、あけましておめでとうございます。
お久しぶりでございます。本年もよろしくです。

長らく放置していたこのブログ。
飽きたわけじゃありません。嫌になったわけでもありません。忘れたわけでもありません。
技術的なことを書く余裕ネタがなかっただけのことでございます。

・・・前置き長いよね。すんません。

さて、去年の暮れでしたか、バージョン管理サービスのcodebreakから、「サービス終了するぜおい」というメールを頂きました。
「サービス終了のお知らせ」

えー。困るー。日本製サービスで割と便利に使ってたのにー。(バックアップ代わりに)

でもまあ、ご丁寧に移行先のサービスも紹介してくれてることだし、まあ慌てることもないか・・・と、その時は思っていたのでございます。
ま、とりあえず、Bitbucketにアカウントだけ作っておいて・・・データのダウンロードはサービス終了間際にまとめてやればいっかー☆とか思ってたのですが。

先ほど、ふとカレンダーを見ましたら。
・・・あれ?今日ってもう1月28日・・・?
codebreakのデータ削除って、確か・・・1月31日・・・

も う 終 了 間 際 じ ゃ ん

慌ててBitbucketのサイトにアクセス。
ほっ、良かった。アカウント作ってあった。生きてる。

じゃ、あとはcodebreakからBitbucketにリポジトリをコピーするだけ・・・。
gitのコマンド打たにゃならんのかなー?とか思ってましたが、割とすんなりと行きました。ちょー簡単。

まずはcodebreakにログインして、コピーしたいリポジトリを選択。
例のごとく、ページの右上にリポジトリのURLが表示されてますので、こいつをピッとコピー。「HTTP clone URL」ってところですね。

したらば、次はBitbucketにログイン。
画面上の「リポジトリ」から、「リポジトリのインポート」を選ぶのです。

で、さっきコピーしたURLを、「古いリポジトリ」の「URL」に貼り付ける。ぺたし。
あとはテキトーに、ユーザー名とパスワードや、新規リポジトリの名前を設定して、「リポジトリのインポート」を押せばOK。
アレヨアレヨと言う間に、わたしのコードは居心地のいい場所へと移住して行きましたw
ああ良かった。
これやらなきゃーやらなきゃーって、ずっとストレスだったのですよねー。

いやー、何事も放置しちゃいけませんなあ。


2015年10月17日土曜日

そんな・・・どっちかなんて選べない!:名刺管理、EightとCamCard

おはようございまーす。
なんか早く目が覚めちゃった。

さて唐突ですがみなさん、名刺ってどう管理してますか?
ワタシは名刺を頂いたらとりあえず写真を撮って、Evernoteに突っ込んでました。
まあそれでいいや、と思ってたんですが。

昨日シェアスペース「Dexi」さんで仕事をしてましたら、なんか面白そうなものが置いてあるじゃないですか。


ほう、名刺管理アプリ「Eight」のスキャナーですか。しかも無料で使える、と。
さっそく試してみました。
・・・うん、いいですね。名刺の画像スキャン自体はスキャナでさくさくと進む。
名刺のテキスト情報の入力はEight側で人力で行うみたいですね。OCRと違って時間はかかりますが、まあ正確です。
人力!・・・Dr.Walletもそうですが、最近こういうサービス、増えてないですかね。

名刺の登録が終わると、Eightに登録済みの人とは自動的に「つながり」ができたりして。
おー、便利!・・・しかも、「最近の仕事は?」みたいな、なんかタイムラインみたいな機能もあるし。
こりゃ、名刺を軸にしたSNSですねー。データ化されるのが楽しみだ。

で、ほくほくと名刺がテキストデータになるのを自宅で待っていましたら。
友人が「私はCamCardってのを使ってるよ」と。

・・・。そんなこと言われたら、試すしかないじゃないですか!
こちらも、まずはアプリをダウンロードして、会員登録。
名刺画像は・・・スマホに保存してあった画像を使いました。
こちらのサービスは人力じゃなくてOCR(光学文字認識)による情報入力。
文字を認識した後に手直しが必要ですが、・・・まあ、あまり必要ないですね。
手直しが不要な分、Eightの方が少し楽です。

ただ、CamCardにあって、Eightにはない重要な機能が・・・。
それは、連絡先との連携機能。

Eightで登録した名刺を他の用途で活用するには、有償サービスに登録して、CSV書き出しをするしかないみたいです。一応、Webサイトでも名刺は確認できるんですが、一件一件コピペってのも・・・ねえ。

CamCardは、ご親切にも、名刺をGmailの連絡先と同期する機能がありました。
しかも端末に保存されているアカウントから、同期先のアカウントを都度選べる!
もちろんデフォルトで同期するアカウントを設定しておくこともできる。
・・・こりゃ便利だ。便利すぎる。どうしよう。

・・・どうしよう。
EightとCamCard、どっちのサービス使っていこうかしら。

散々悩んだ挙句(10分くらい)、両方使っていくことに決めました。
どうせ、今までも頂いた名刺はスマホで写真に撮っていたわけですし、EightでもCamCardでもスマホの写真を入力ソースにすることはできますし。

・とりあえず名刺をもらったら、その場でスマホのカメラで撮影
・スキャナがあるとき:まとめて名刺をEightにつっこむ
・連絡先に追加したい人の場合は、CamCardに名刺の写真を登録する
・そうでもないひと、つながりを持ちたい人はEightにも写真を登録する

それぞれ良いところがあるので、悩むくらいなら両方使っちゃえば良いじゃない!
みんな仲良くね!

(さて、問題はいつまで続くかだ)


2015年10月15日木曜日

ハードな罠:iPhoneのボリュームボタンで写真を撮ると上下逆になるかも

こーんばーんはー。
昨日はObjective-C、一昨日はJava、そして今日はPHPいじってて、もうなんでも来い!な気分です。はー。

ちょっと今日は個人的に「うへえ」と思ったことがあったので書いてみます。

iOS用のカメラアプリをApp Storeで公開しているのですが。
カメラで撮影して、ちょっとしたメモを合成してから写真を保存する、というアプリなんですね。
これに、カメラからの入力画像だけじゃなく、カメラロールから選択した画像にも、メモを合成できるようにしたんですよ。

そしたら、
「カメラロールから、ボリュームボタンで撮影した画像を選択してメモを付けようとすると、画像が上下逆さまになる」
とご指摘いただきました。
・・・へ?
そんな状況、見たことないな・・・。
でも、一応検索してみましたら、あったあった。

『iPhoneで撮った写真が逆さまになる理由』

こんな感じ?・・・ちょーっと分かりにくいかなー?


写真を撮るときに、ボリュームボタンを上にしてしまうと、カメラの向きが逆になってしまう、ということらしいです。
正しい向きは「ボリュームボタンが下、ホームボタンが右」なんだそうで。

・・・。
いやね、私自身は普段ボリュームボタンで写真撮らないんで、困らないんですが・・・。
ヒトコト、言わせてもらうわ。
「これは酷い仕様」

だってさ、普通のコンデジとかデジカメのシャッターボタンって、右上じゃん?
ボリュームボタンで写真が撮れると分かったら、そりゃ、ボタンが右上になるように構えるよ・・・。
端末の向きが「ホームボタン左」になったら撮影した画像の上下を補正するとか、そういう風に標準カメラアプリ作れなかったのかね・・・アップルちゃん・・・。

さーて、対応どうしようかなー・・・。

2015年10月9日金曜日

起動せぬなら 殺してしまおう setupAVCapture:カメラアプリのレイアウトをシミュレータで確認する

どうも。へへへ。おはようございます。
只今絶賛不具合修正中ですが、個人的にちょっと衝撃的だったので、備忘録として投稿ー。

iOSのカメラアプリを開発しているのですが、ワタクシ、実機はiPhone 5sしかもってません。えへへ。だってお金ないもん。
でもXcodeのSimulatorでは、カメラが扱えない。
カメラアプリを起動すると、最初のスプラッシュスクリーンが表示されて、そこで止まってしまうんですね。カメラからの入力画像が表示されない。
だからカメラアプリの開発には、どうしても実機が必要になるのですが・・・。

ここで問題が。
iPadでシャッターボタンなどが表示されないよ、とアップル様からご指摘を受けました。
でも自分は実機持ってない。
・・・どうしよう。試せない。試せないと修正できない。うわー。

で、10分くらい悩んだ結果、はたと思いついた。
「カメラ機能を一時的に使えなくすれば、Simulatorでも動くんじゃね?」

やってみました。
いつもはこうしてるのを、
[self setupAVCapture];
こうしてみた。iPhoneの時だけsetupAVCapture動かしたるw
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {        [self setupAVCapture];    }

・・・動いた。SimulatorのiPadで。ほんとかよ。
まあ、もちろんカメラからの撮影機能とかは試せませんし、リリースする前に元に戻さなきゃならんのですが。
少なくとも、これでレイアウト崩れは再現と修正ができそうです。

やれやれ。

(最初からStoryboard使ってレイアウト作っとけばよかったな。次はそうしよう

2015年10月5日月曜日

iOS9のいじわるー。:iOS9でcanOpenURLを使ってみた

こんばんわ。お久しぶりです。
なんか寝つけないので、ブログでも更新してみんとす。

ついこの間リリースされた「iOS9」で、カスタムURLスキームを使って別のアプリを呼び出そうとしてたんですよ。
でも、iOS9には痛い目に遭っているので(詳しくはまたいずれ)、今度は事前によーく調べてからにしようかなーと、検索してみましたら、こちらの記事がヒット。

【追記】iOS9でcanOpenURLを有効にする方法

えっなになに・・・「iOS9でcanOpenURLが使えなくなった」・・・。
ダメじゃん。きー!とか思ってたら、対処方法も書いてあった。ふんふん。
「Info.plist」に「LSApplicationQueriesSchemes」のキーと、アプリで許可するカスタムURLスキーマを登録すればいいらしい。

ふんふん。
で、このinfo.plist、XcodeでProperty Listとして値を編集することもできるようですが(というかこっちがデフォルト)、最近Xcodeがすっごく重くなってまして。

一度Property List表示で編集しようとしたら、画面が乱れてしまいました・・・
(;_;)
仕方ないので、Open AsのSource Listでソースとして開いて編集。
これなら問題ないやね。
というか、ワタシはもともとSGMLやらXMLのヒトなので、こっちの方がやりやすかったりする。

で、端末にカスタムURLスキーマを設定した自社アプリがあればそっちを起動するし、なければApp Storeのダウンロードページを表示するようにしてみた。

んー。上手くいかない(笑)
・・・最初は「canOpenURL」で分岐させてたんだけど、上手くいかないー。
ちょっと悩んだけど、もっと単純に考えたらあっさりできました。
要はデバイスのアプリをまず開いてみて、失敗したらストアに飛ばしゃいいのよ。うん。

NSURL *url_store = [NSURL URLWithString:@"https://アプリストアのURL"];
NSURL *url_device = [NSURL URLWithString:@"CustomURLSchema://"];
if ([[UIApplication sharedApplication] openURL:url_device]) {
        NSLog(@"OK");
} else {
        [[UIApplication sharedApplication] openURL:url_store];

}

この、何でもめんどくさく考える癖、直さなきゃな。
ということで、おやすみなさーい。










2015年9月17日木曜日

滅びゆくものこそ美しけれ。:iOSのカメラロールに任意のアルバムを作成しようとしてハマった話

へいへいへい。みなさんこんばんは。おひさしぶりです。

今日はiOSのカメラアプリ開発で、ハマったことをメモ代わりにちょっとだけ。

ALAssetsLibraryを使って、デバイスのカメラロールにアプリの名前がついたアルバムを作成しようとしてたのです。

こちらの記事「iPhoneアプリ開発 芳名帳アプリ作成(6) -写真に保存-」を参考にさせて頂いたのですが・・・
うーん、説明は分かりやすいんだけど、まず、どうしてもアルバムが作れない。
なーんでーだろー?と思ってたら、

アルバム名にスペースが入ってた
・・・ソフト名「XXX Pro」をそのままアルバムの名前にしようと思ってたんですけど、・・・スペースの代わりにアンダースコア「_」にしたら、あっさり作成に成功。

ハマりポイントその1:アルバム名にスペースはいってた!

で、アルバムを作成できたのはいいんですが、今度はそこに写真を保存する方法がわからない。
それまでは、ALAssetsLibraryの「writeImageToSavedPhotosAlbum」でカメラロールに写真を保存してたわけですが・・・。
そもそもアセットとは何か、というのをロクに理解もせずに使っていたので、さて、アルバム指定するにはどうしたらよかんべ?となると、ちんぷんかんぷん。

アルバム名はわかってるんだから、「writeImageToSavedPhotosAlbum」にアルバム名を指定するオプションとかあるんじゃないのー?と勝手に考えてました。
ないない。そんなの。なかった。

結局は、
1. ALAssetsLibraryの「enumerateGroupsWithTypes:ALAssetsGroupAlbum」を使ってアルバムの一覧を取得
2. 目的のアルバムが見つかったところで、おもむろに「ALAssetsGroup」の「addAsset」を使って、「ALAssetsGroup」(アルバム)にAsset(写真)を追加
こんな流れで、ようやく指定したアルバムに写真を保存できました。

ハマりポイントその2:Assetってなんなのか良くわかってなかった

ま、ぐだぐだだったけど、なんとかできて良かった。
アルバムに写真を保存するところでは、「Quiita」さんのこの記事ios7,8でアルバム名を指定して画像を保存するが参考になったわけですが・・・
Swiftで書かれてて・・・ちょっと・・・難儀しましたねえ・・・
まあ、やってることは同じなんで、大変たすかりましたが・・・。
なんか、英語の資料を見ながらフランス語のレポートを作ってるような気分になりましたよ・・・。

・・・。
でも、今日配布がはじまったiOS9では、Asset Libraryはdeprecated(非推奨)となるそうな・・・。


The Assets Library framework is deprecated as of iOS 9.0. Instead, use the Photos framework instead, which in iOS 8.0 and later provides more features and better performance for working with a user’s photo library.
・・・せっかく覚えたのに・・・。
ちょっとね、なんだかなあ、ってオチですみません。
うん、寝よう。