ラベル 備忘録 の投稿を表示しています。 すべての投稿を表示
ラベル 備忘録 の投稿を表示しています。 すべての投稿を表示

2016年11月5日土曜日

またしてもたった一行が:Ancroid SDK Camera2で位置情報を写真に保存する #EXIF #Android

みなさまこんばんは。
今日はCamera2で位置情報保存するにはCaptureRequest.JPEG_GPS_LOCATIONしないとだめだよ、ってお話です。あるいは、リファレンスはちゃんと読め、というお話・・・。
週末ですねー。
週末といってもさっぱり休めてませんが、皆様いかがお過ごしでしょうか。

まあ休めていない理由の一つに、今月のABC 2016までに公開しようと目論んでるアプリの進捗が思わしくないことがあるんですけど。
あと二週間だよ。基本的な機能もまだ実装できてないよママン。

で、今日も空き時間を見つけてカリカリとコードを書いてました。
・・・やっぱCamera2難しいわ。
いや、「難しそう」と最初に先入観持ってしまったから、余計そう思うのかもしれませんが。

だってサンプル少ないんだもん。

カメラで撮影して、画像にOpenStreetMapの地図を合成して、ApacheのCommons Imagingを使ってEXIF情報をのっけたまではできたんですが。
肝心な位置情報がどうしても保存できない・・・。
GPSからはきちんと位置情報取れてるのになー。

・・・位置情報だけはExifInterface使わないとダメなのかな?
と思って、嫌々(理由はこちら)試してみるも、玉砕。

まあそんなわきゃねえか。

ここまでで既に一時間。コードを書いちゃ消し・・・はせずに「もったいないから」とコメントアウト。過ぎ去っていく時間に比例して増えていくコメント行。ああ。

でも、ふと、ぶれいくするーは訪れるもので。
「そもそも、位置情報を保存するようにカメラに言わなきゃだめなんじゃね?」

・・・あったあった。
「CaptureRequest」に、「JPEG_GPS_LOCATION」ってのがしっかりと・・・。

こんな感じで。前後ちょっとはしょりますが。

Location crrLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
...
final CaptureRequest.Builder captureBuilder =
     mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
...
captureBuilder.set(CaptureRequest.JPEG_GPS_LOCATION, crrLocation);

これだけ。この最後の一行だけ。
この一行追加しただけで、あっさりと位置情報保存してくれた。
一時間半経過して、ようやくガッツポーズ。周囲に人いなくてよかった。

・・・何もカメラに要求しないでも、GPSさえ有効にしておけば、カメラちゃんの方で勝手に位置情報をメタデータに保存してくれる、って私が思い込んでたんですよねー。

Camera2ではいちいちきちんと要求しないといけない、ということなのかしら。

まあ、Commons Imagingの使い方を疑ったりExifInterfaceに擦り寄ったり、そういう回り道したからこそ、CaptureRequestしないとダメなんでは?と着想したわけで、何つーの?急がば回れ、的な・・・

・・・いや、最初からドキュメント読んどきゃええねん・・・ orz

あともうちょっと。頑張ろう。



2016年10月31日月曜日

有線がなければ、無線でつなげればいいじゃない:外出先でAndroidの実機と、無線で接続してデバッグする #android #quiita #テザリング

こんばんは。今日はITネタですよー。

ところでみなさん、USBケーブルはいつも何本くらい持ち歩いていますか?
ワタクシ、USBケーブルとイヤフォンは、消耗品と考えております。

・・・だって、すぐに壊れて使えなくなるんだもの・・・。

今日も外出先で、(進捗遅れ気味な)Androidアプリの開発をしておりまして。
修正結果を確認しようと、手持ちのUSBケーブルで実機とMacbook Airをつなげましたが・・・

どれも繋がらねえ

・・・三本ですよ?三本ともぜーんぶ。
いやいやいや、さすがに一本くらいは大丈夫だろうと・・・ orz

でもここで諦めたらいかん。
有線がダメなら、無線でなんとか繋がらないもんだろうか。

と、思ってググったら、・・・あったあった。Qiitaさんすてき。
「AndroidStudioからワイヤレスで実機ビルド for Mac」
さらにこちらも参考になりましたよ。
「無線LANを使ってAndroidアプリの実機デバッグを行ってみる。」
ふむふむ、だいたいこんな流れですな。

  1. パス通してadbコマンドが使えるようにしておく
  2. 実機のIPアドレスを調べておく
  3. adbコマンドでポートの設定
  4. adbコマンドで、Android実機にIPアドレスを指定して接続
詳しい手順は、先にご紹介した、スマートでクレバーな記事を参照していただくとして。
ワタクシはいつもの通り、自分がハマったポイントをご紹介しましょう。

まず、パス通してadbが使えるところは、上のmomotas210さんの記事を参考にしてうまくいった。ふんふん。インターネッツ最高。
で、次はAndroid実機のIPアドレスを・・・あっ。

・・・今、外出先だった・・・。

先の記事では、「Android端末と開発マシンが同じネットワークに所属する必要がある。」とか書いてあるし・・・XperiaでテザリングしてMac繋げてるだけだし・・・
・・・ん?
テザリング?
Macと実機(Xperia)、同じネットワークじゃんね・・・。

すぐさまXperiaのIPアドレス調べた。
わたしがいつも使ってるのは「OS Monitor」。Androidの設定画面でも確認できるのかもしれないけど、いいじゃん、わかりやすいんだから。


わーい、出た出た出た。「MISC」タブにいらっしゃいました。
一応、pingで確認。・・・やたっ。ping応答、帰ってきた。よしよし。

あとは、「adb tcpip」コマンドで繋げるポートを設定して、「adb connect」で実機のIPアドレスを指定して接続・・・と。

・・・あれ?(2回目)
「USBケーブルでマシンとAndroid端末をつないだ状態で以下のコマンドを」ってかいてある・・・

だめじゃーん!
そもそも、ケーブルで繋げられないから、無線試してるんじゃーん!
自分のアホさ加減に泣きそう・・・ orz

でもアホは諦めないのだ。
「なんとかならねぇかなー?」と、未練がましくケーブルをつないだり外したり、ケーブルをグリグリやっていましたら・・・

あっ。
繋がった

大急ぎで「adb tcpip」を実行。
「restarting in TCP mode port: 5555」・・・成功。
手が震える。

また接続切れないうちに、「adb connect 192.168.x.1」実行。
・・・「connected to 192.168.x.1」
・・・やたっ!繋がった!

(繋がった直後にまた接続切れてやんの・・・orz)

あとはフツーに、Android Studioのプロジェクトから、「Run」を実行。
無事、「Connected Device」に実機が表示されました。
わーい。やっと無線で接続してAndroidにアプリを展開できました。

ふー、これにて一件落着。
これまでは、まともに繋がるケーブルをあちこち探し回ったり、短いケーブルで無理して実機検証してたり、割と情けない理由で作業が滞りがちでしたが・・・

これで快適にデバッグできるってもんです。やたー。

・・・何か大事なことを忘れているような気がするけど、まあいいや。寝よ寝よ。

2016年10月28日金曜日

不変じゃあかんやん:Android SDK Camera2で撮影した画像にテキストを合成する #android #java

んはーあ。
眠い。
みーなさーん、元気ですーかー。

・・・今日は備忘録です。100%備忘録です。Androidです。アプリです。
(ブログの構成も何もあったもんじゃない書き方・・・)

いやね、せっかく来月末にABC 2016 Autumnに行くんなら、自作のアプリの一つや二つ、引っさげてったらカッコイイかなー、なんて思い立ちまして。
半ば放置してたカメラアプリをちょこちょこいじってたわけですが。

相変わらず、Camera2、難しいわ・・・。
何日も試行錯誤して、先日、やっと写真が保存できるようになりましたさ。

で、今日は、撮影した画像に文字列を埋め込んでみようかと。

撮影した画像に文字列を合成すること自体は、以前開発したアプリで経験済み。
でも、あの時は「android.hardware.Camera」使ってた。

さて、「android.hardware.camera2」使ったらどうすればいいんだべか。
ヾ(。>﹏<。)ノ


どっかでカメラから取得した画像をBitmapにして、
それをCanvasに描画して、
drawText使ってやればいいのは、同じだと思うけど・・・。

で、四苦八苦してなんとかできたのがこちら。

ImageReader.OnImageAvailableListener readerListener = new ImageReader.OnImageAvailableListener() {
                @Override
                public void onImageAvailable(ImageReader reader) {
                    Image image = null;
                    try {
                        image = reader.acquireLatestImage();
                        ByteBuffer buffer = image.getPlanes()[0].getBuffer();
                        byte[] bytes = new byte[buffer.capacity()];
                        buffer.get(bytes);

                        BitmapFactory.Options bitmapFactoryOptions = new BitmapFactory.Options();
                        bitmapFactoryOptions.inMutable = true;
                        Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, bitmapFactoryOptions);
                        Paint paint_text = new Paint();
                        paint.setColor(Color.argb(100, 125,0, 34));
                        paint_text.setColor(Color.argb(255, 0, 0, 0));
                        paint_text.setTextSize(50);
                        Canvas bitmapCanvas = new Canvas(bmp);
                        bitmapCanvas.drawText("Text string", 500, 500, paint_text);
                        bitmapCanvas.save();

                        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                        bmp.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
                        byte[] bytes_toSave = byteArrayOutputStream.toByteArray();
                        saveImage(bytes_toSave);

                    } catch (FileNotFoundException e){
                        e.printStackTrace();
                    } catch (IOException e){
                        e.printStackTrace();
                    } finally {
                        if(image != null){
                            image.close();
                        }
                    }
                }
                private void saveImage(byte[] bytes) throws IOException {
                    OutputStream outputStream = null;
                    try {
                        outputStream = new FileOutputStream(mFile);
                        outputStream.write(bytes);
                    } finally {
                        if(outputStream != null){
                            outputStream.close();
                        }
                    }
                }
            };

bitmapを作る時に、不変にしてなかったところで、しばらく蹴つまずいておりました。
このへんですね。


BitmapFactory.Options bitmapFactoryOptions = new BitmapFactory.Options();
bitmapFactoryOptions.inMutable = true;
Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, bitmapFactoryOptions);

上の一行目で、BitmapFactoryに渡すオプションの箱を用意。
二行目、「.inMutable」で、ビットマップを変更可能にするオプションを定義。
で、BitmapFactoryでBitmap作るときに、定義したオプション、「bitmapFactoryOptions」を渡してあげましたさ。

ほいっとな。

んー。適当だけど、とーりあえず、写真に文字列のっかりました。

こんだけのことだけど、久しぶりにソースいじったら苦労したー。
しかも、手持ちのUSBケーブルがどれもこれも断線してて、Macと実機を接続できるケーブルを探すのがこれまた一苦労。

最近、いらん苦労ばかりしてる気がする・・・


位置とか書式とかは、また明日にしよう。
もう寝るー。


2016年9月13日火曜日

情弱情弱情弱ゥゥウゥ!!:docomo iPhone 5sにu-mobileのSIMを挿入して使う

こんばんは。
ちょーっとお仕事忙しくなりそうなので飲めるうちに飲んじゃえ、ということで「ふじのくに限定 静岡麦酒」飲んでます。まろやかで旨い(てきとう)

さて、今日は格安SIMのお話。

ことの始まりは先週の水曜日。
お仕事いただいている会社の方と、毎週「カレーの会」をしているのですが。
その席で、ふとdocomoのiPhone 5sがSIMロック解除できないことを愚痴りましたら。

「docomo系の格安SIMなら、SIMロック解除しなくても使えるよ?
そんなことも知らないのか、この情弱!」

Σ( ̄ロ ̄lll)



ちなみに私が使っているのはU-mobile。
もちろんdocomo系というのは知ってましたが、まさかSIMカードそのまま使えるなんて・・・。
あまりにびっくりして、しばらく口がきけませんでした。それはそれとしてカレーは旨かった。
・・・情弱呼ばわりされて、何もせずにはおられません。
早速、検索してみると・・・あったあった。
「ご存知ですか? NTTドコモのiPhoneなら SIMを差し替えればU-mobileとして使えるんです!」
・・・そのまんまやがな。しかもでかでかと書いてあるしー。やっぱオレ情弱やわ・・・

ただ、これまでXperiaに刺して使ってたのはmicroSIM。
iPhone 5sはnanoSIM。
さっそく、nanoSIMに変更手続きをしました。

届いた。・・・SIMカード、ちっさ!封筒、でっか!

挿入。どこからSIMカード挿入するのか、軽く迷う。前に一度やってるのに(泣)

SIMカードの認識自体はあっさりと終了。

あとはアクセスポイントの設定ー。
こちらのページに、接続プロファイルを使用した設定方法が詳しく書いてありました。ふんふんふん。
ただ、このページで紹介しているのって、iPhone 6用の接続プロファイルなんですよねー。
iPhone 5sはどうすればいいかなー。
まあこんなもんはアレですよ、URLをちょちょいといじってしまえばいいんですよ(てきとう)
で、iPhoneのブラウザから、以下のアドレスにアクセスしました。
http://umobile.jp/i5s

・・・きたっ。

あ、最初Chromeで試したけどうまくいかなかったです。
Safariを使ったら、問題なく行けました。

あとはインストールすれば、はいおしまい。
いやー・・・思ったよりずっと簡単でしたよ。こりゃびっくり。

これでiPhoneの分の回線料金も浮いたし、情弱呼ばわりも返上できるし、よかったよかった。
(でもまた違うことで情弱!って言われる気がする)


2016年7月15日金曜日

痒いところに手が届かないGoogle:Gmailに連絡先をcsvで追加する

…こんばんは。

疲れた。でと備忘録で書いておく。

今日は地域のコミュニティの連絡網を、Gmailの連絡先に登録しておりました。

数十人ものデータを手入力なんて絶対にイヤだ。
データをもらって、csvにして、一気に処理したい。
…。
連絡先リストをエクセルで貰ったまでは良かったのですが、そこから先が難儀した。
Gmailにcsvをインポートするときに、所定のヘッダをつけてやらないと、上手く読み込んでくれなかったです。
エクセルにcsvを読み込むときみたいに、ヘッダのフィールドをマップする機能なんてない。ああ。

以下の手順でやったらなんとか成功。
1: 一旦、既存のGmail連絡先をcsvにエクスポート。
一件のみ選択すると、後が楽でーす。
2: csvをエクセルで開く。
きちんと区切り文字を指定しましょう。
3: 既存の内容を削除。
4: 追加したい連絡先を貼り付ける。
5: csvに保存。
6: Gmailの連絡先にcsvをインポート。

今後のために、csvファイルはテンプレにして保存、使いまわそう…。

…。おやすみなさーい。

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.
・・・せっかく覚えたのに・・・。
ちょっとね、なんだかなあ、ってオチですみません。
うん、寝よう。


2015年8月2日日曜日

サンプルはあくまでサンプルである:Mapbox iOS SDKを使ってOpenStreetMapを表示する

やー、まいにちマイニチ蒸し暑くていやになっちゃいますねー、こんばんは。
というわけで今夜もファミレスに逃げてきましたよ。

今日はMapboxを試してました。
自分を自分好みにカスタマイズして公開できるという、素敵なウェブサービスです。

OpenSreetMapがベースだし、iOSやAndroidのSDKもあるし、ずっと試してみたかったんですよねー。
モバイルアプリを作るからには、地図は使いたい!
でもAPI制限のことを考えるとGoogle Mapはどうも気軽に使いにくいというかー。

途中、ちょこちょことつまづきましたが・・・Mapboxのサンプルを見ながら、なんとかiPhoneアプリまで作成。
といっても地図をiPhoneに表示させるだけですけど。

一つ、はまった点があったので、備忘録としてメモメモ。

サンプル通りにコード書いて、実機で確認しようとビルドすると「RMFoundation.h」が無いと怒られました。
もちろん、ファイルがあるのは確認済み。あっれー?おっかしーいーなー。

色々検索したところ・・・一つ前のバージョンのSDKにすればいいみたい。
ここを参考に、バージョン1.6.0に戻しました。
「'RMFoundation.h' file not found in 1.6.1 #631」

以下のようにpodfileに書いて、pod installを実行。
無事バージョン1.6.0に戻り、ビルドも通りましたとさ。
pod 'Mapbox-iOS-SDK', '1.6.0'
で、とりあえず作ったのがコレ。地図のスタイルはすっごくシンプルにしてみた。

地図のデザインは、Mapbox側で色々といじれるみたいなので、これから楽しみ!




2015年7月10日金曜日

日本語でおk!?:iOSでEXIFのUserCommentに日本語を設定しようとすると、途中で切れる

こんにちは。ぷんぷん。怒っています。

今日は朝からXcodeくんと戯れていました。
カメラアプリです。
撮影した写真に、メタ情報を埋め込もうとしていたのです。ええ、EXIFのUserCommentですね。

AndroidではCommons Imagingを使って、さくっと行きましたので、まあiOSでも問題ないだろうと。
こんな感じで。
UserComment = @"そんなこといったって、だめだもんはだめだで、しゃーがないべさ。ほだら。だば、あきらめてしごとしてくんろ。ほりほり。わーったか?ほーり。";
[EXIFDictionary setObject:UserComment forKey:(__bridge NSString *) kCGImagePropertyExifUserComment];

で、ビルドして、実機でテスト。
アプリで撮った写真をMacに転送し、コマンドラインからexiftoolを実行して、UserCommentを確認しましたら・・・。
User Comment: そんなこといったって、だめだもんはだめだで、しゃーがないべさ。ほだ
途中できれとるがな
なんでやねん。
EXIFのUserCommentに文字数制限なんかあったか?・・・まああるかもしらへんけど、そんな長い文字列とは思えへんしー。
ネットで検索したら、日本語と英語が混じってる時は、途中で切れることもあるとか書いてあるけど、・・・今回、全部日本語やしー。
ううう。

ちなみに、全部英語だったら、長い文字列でもいいのかなー?
というわけで、以下の文章でテスト。

NSString *UserComment = @"Can I set Exif UserComment String in such a way? I cannot understand why apple doesn't pass Japanese Characters. Are they jerous about Japanese Food? Sushi? Tenpura!?";
・・・きれてなーい。きれてないよー?

もうね、これ、日本語があかん、というやつなのかなー・・・。
まあ引き続き調査はしますが、あまりに腹がたったので記事にしました。ぷんすか。

(オチなし)

2015年7月9日木曜日

たかが一行、されど一行:ClamAV + Amavis-new + Postfixでウイルス対策

はー。死ぬかと思った。こんばんわ。
今日はメールサーバーのお話です。ていうか懺悔。

実は先日、一年ほど前に立てたメールサーバーでちょっとやらかしちゃいまして。
bad_headerが理由で、メールが配信されずに削除されちゃって、ユーザーさんにご迷惑をおかけしてしまいました。
せっかくだから、もう一度サーバの設定を見直そうと思ったわけです。


例によってグーグルせんせーに教えを請いまして。
メールヘッダがぶっ壊れてるメールへの対処は「/etc/amavisd/amavisd.conf」の、$final_bad_header_destinyですればいいんだな、ふんふん、なるほど。
「$final_bad_header_destiny = D_PASS;」ってやっとけばヘッダが壊れてようが華麗にスルーか、なるほどなるほど、ああ現代人にはスルー力が足りないよな、とか、のん気に構えていました(まだこの時点では)。

$final_virus_destiny・・・へー・・・これ、ウイルスメールを華麗にスルーするかどうかって設定か・・・。
ほんとうはウイルスはがっちりサーバーで削除するのがいいんだけど・・・。
誤検出とかあったら、またこっぴどく怒られるしな・・・
いやいやでもでも、ウイルスメールをユーザーに華麗にスルーそのまま配信するってどうなの・・・?やっぱり削除しといて、隔離するべきじゃない?
どうしようかな・・・。

ま、結局「$final_virus_destiny = D_DISCARD;」にして、削除+隔離することにしました。
あとは隔離する先のディレクトリを設定。
「$QUARANTINEDIR = "/var/virusmails";」、これでよし。
amavisdと念のためpostfixも再起動して。
まあ念のためにテスト用ウイルスメールで、隔離動作を確認しときましょうか。

テスト用ウイルスはここからダウンロードできるみたいですね。
でも、もっと簡単な方法が。
この記事「必ずスパムと判定されるメールと、ウィルスの作り方」を参考にさせていただきました。
以下の文字列を貼るだけ。わー便利!ちょーかんたん!
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
ほくほくほく。やっぱ簡単なのがいいよねー。
別のパソコンからメーラー起動してー。メール本文にさっきのウイルス文字列(w)コピペしてー。宛先を自分にしてー。送信ッ!ひゃっはー。
そそくさと「tail -f /var/log/maillog」を実行して、ログを監視。
でっきるっかな でっきるっかな♪

Jul  8 12:46:34 myserver amavis[25298]: (25298-01) Passed CLEAN {RelayedInbound}, [xxx.xx.xx.xx]:35856 [xxx.xx.xx.xx] <admin@mydomain.com> -> <user@mydomain.com>, Message-ID: ...

・・・。え?ぱす?クリーン?きれい?
ウイルスにひっかかったら「Blocked INFECTED (Eicar-Test-Signature)」ってでるんじゃないの?えええええ!?
あわてて、ウイルスメールの隔離先として設定した「/var/virusmails」を確認・・・予想通り、なーんもない。からっぽ。

さてここから苦悩の時間がはじまりました。
なになになに?えっウイルスとして認識されてないってこと?ウイルス定義が古いのか?いやいや毎日更新するスクリプト作ったし!もしかしてLocalSocketあたりが違う?あばばばそもそもこのテスト用ウイルスって信用できるのー?いやいやそれじゃテストの意味ないしそもそもこういうの信用しないと本当にウイルスメールなんか用意できるわけないしおあおうぇいとぉえwそいいえちwsっを!!!

・・・。
ま、結論からいうと、
「/etc/amavisd/amavisd.conf」の「@bypass_virus_checks_maps = (1); 」がコメントアウトされてました・・・。
そっかー・・・そもそもウイルスチェック自体を華麗にスルーしてたのか俺は・・・。
「まさかそんな」って思い込みのせいで発見が遅れました・・・

で、この行をコメントして、amavisd再起動して・・・テストのウイルスメール送信したら・・・
さくっと・・・
Blocked INFECTED (Eicar-Test-Signature) {DiscardedInbound,Quarantined}
はい、ちゃーんと隔離もされてました・・・あわててGoogleで事例調べまくって振り回されたりせずに、設定ファイルを一つずつ冷静に吟味してたら、もっと早く復旧できたよなー・・・
反省。自戒の意味をこめて、今日はこのブログを書きました。

ま、そのあと「(!)ClamAV-clamd av-scanner FAILED: 」なんてエラーがでて、もうひと慌てしたんですが。
これは「/etc/clamd.conf」に、/var/配下をスキャンの除外フォルダとして指定してたためでした。
さすがにこれはすぐわかった。といっても一通りGoogleで検索して、わちゃわちゃしましたが(笑)
#ExcludePath ^/var/
ま、なんにせよ、日付が変わる前に致命的なところは解決してよかった。めでたしめでたし。






2015年3月3日火曜日

分離されたって、あーた。:Raspberry Piでファイルサーバを構築。sambapasswdが見つからかった件

こんばーんわー。
今日はふと思いついてディスクの空き容量が少なくなってきたので、ファイルサーバを新調することにしました。

数年前に使っていたHPのネットブックにCentOS載せて、外付けのハードディスクくっつけて運用してたんですが。
でも容量が250GBだし、ちょっと物足りないんですよね。
ちょうど先日購入したRaspberry Piもホコリをかぶっていることだし、電気屋さんで安いハードディスク買ってきて、ファイルサーバにしちまおう、と。

戦利品。2TBで一万円ちょっと。まあこんなもんじゃろ。

で、あとはRaspberry Piに外付けハードディスク接続してー。認識自体は無問題ー。
sambaの設定してー・・・。
おっと、そもそもsamba入れてなかった。うふふー。

さくっとインストール・・・しようと思ったらエラー。
どうもパッケージの情報が古かったみたい。コチラの記事を参考にして、「sudo apt-get update」を実行。
よっしゃ。今度は通った。
下の画面は、MacBook AirからVNC使ってRaspberry Piの画面を表示させてるところ。
でも考えてみれば、guiってほぼ使わないし、動作も遅いしで、これ以降はssh経由で作業してました。


で、今度は接続した外付けハードディスクをマウント。
お買い上げ状態ではNTFSフォーマットされてます。
でも、万一Raspberry Piがぶっ飛んだら、Windowsパソコンにでも接続して使えるようにしたい。
というわけで、Linuxのファイルシステムにはせず、NTFSのまま使うことにする。

今度はntfs-3gをapt-getでインストール。
「apt-get install ntfs-3g」でさくっと。いやー、便利だなー。

ここらへんはさくさく進む。webmin入れて〜。sambaの共有フォルダの設定して〜。
そーれWindows機から接続だー!わははははー、らくしょうじゃーん。

・・・。
・・・・・・。あれー・・・?

(じつは本記事のメインはここから。)
何度やっても共有フォルダにアクセスできない。MacBook Airからもダメ。
webminで何度もパスワードの設定をやりなおした。
すでに稼働しているファイルサーバの設定画面を横に並べて、まったく同じ設定にした。
それでも繋がらない。
ユーザ名が存在しないか、パスワードが違うよーって怒られる。
ああ、怒られるのは仕事だけでいいんです。最近怒られっぱなしだから、もういいんですよう。

・・・で、ググっているうちに、「smbpasswdでパスワード設定しないとダメよ?」みたいな情報を見つける。えー・・・。
・・・だってwebminでUnixユーザとSambaユーザを同期するように設定したもん。ちゃんとやったもん。
でもできてないのは確かなので、とりあえずsmbpasswdを実行・・・実行・・・じっ・・k
コマンドがみつかりません
えええええ!
だってさっき、「apt-get install samba」やったじゃん!
パスワード設定ツールくらい、一緒に入れてくれるんじゃないの!?

と思ったら違った。
http://lists.debian.or.jp/debian-users/201104/msg00010.html
「samba-common-binパッケージに分離されたようです。」

。゚(゚´Д`゚)゚。
ぶ、ぶんり・・・って・・・。
半信半疑のまま、「apt-get install samba-common-bin」を実行。
smbpasswd userでパスワードを設定。
う、Windows機からログイン・・・。
・・・。
嘘みたいにあっさり繋がった

えっ、ええー・・・。
前はこんな苦労したことなかったのにな・・・。

教訓:「人間はしばらくやってないことはあっさりと忘れる」

おまけ:
ついでにこんなのも買っちゃった。Raspberry PiはUSBケーブルで給電だし、便利かなって。
最近、この類の製品ふえてますよねー


2015年2月18日水曜日

【連載第二回】ど素人がWebサービスを立ち上げるまで何日かかる?:お名前.comでドメインをとるのじゃ

はーいこんばんわ。
「明日は何やろっかなー?」とか、ほざいときながら、昨日はサボってしまいました。
だって風邪ひいてたんだもの。ごほげほがほ。

まあ昨晩早めに床にはいって、ぐっすり眠ったら大分良くなりまして。
めでたく今日、連載を再開できる運びとなりました。
・・・別に毎日やんなくてもいいんだけど、うん。

で、前回はConoHaさんでサーバ立てたので、今日はドメインを取得してみました。
でもでもまだ実働じゃないしー。お金ないから安くすませたいしー。
というわけでお名前.comさんを利用することにします。安いから。
だって年間99円からとか、広告ばんばん出てるんだもの。

さっそくトップページにアクセス。
・・・「まずは、ドメイン名を検索してみよう!」はいはい。
くーまーさーんーのーいーうーとーおーりー。

わーい、いっぱいでてきたー・・・。

ど・れ・に・し・よ・う・か・な?
でも、99円のドメインは、「.pw」とか「.red」とか・・・。うーん、いくら「とりあえず」といっても、pwってなんかイメージしにくいなー。
と思ったら、「.link」ってあるじゃないですか。
かっこいい。これにしよう。ポチッとな。
(すでに紙パックワインをしこたま飲んでいるので気が大きくなってる)

年間180円。うん。安いよね。Whois情報公開代行もおねがいしますよっと。

支払いは、コンビニ払いにしました。しかし、コンビニ手数料と登録料がほぼ同じ、っつーのもなんだけど、まあ酔っ払ってるからいいや。あはははは。

さて、今日はここまで。
次回は(明日とは言わないw)、サーバでドメインの設定をしようかな。

2015年2月14日土曜日

きたきたきたー。:GitHubからAndroid Studioにプロジェクトをチェックアウトしてみた

みなさんこんにちは!
今日は日本Androidの会浜松支部の定例会にきています!

今日のお題は、「Android Studio」。
そろそろ開発環境もAndroid Studioにシフトしないとまずいよねー、ということで、勉強会に参加です。

勉強会そのものはAndroid Studioのインストールなど環境構築から始まったのですが、私は前回すでに環境構築すませてたので、らくちんらくちん(遅刻もこれでとりもどした)。

で、HelloWorldもなんなく実機で動作しました。
ケーブルでMacBook Airにさして、そのままRunするだけ。
・・・なんか、Windows 8であれだけ苦労したのが嘘のよう。

で、お次は・・・。支部長さんがOpenStreetMapを表示するサンプルアプリを作ってきて頂いたので、それをAndroid Studioにインポートして動かしてみよう、と。
ソースコード自体はGitHubにあるらしい・・・。

まずは既存のプロジェクトを全部閉じて、「Checkout project from Version Control」を選択します。

で、「GitHub」を選択。

GitHubへのログインが必要になりますよー。
ログインできたら、「Vcs Repository URL:」にプロジェクトのURLを入力、「Clone」をクリック。

・・・えええええ!?の、No files are ...?

あ、開いてないだけだった。画面左から適当に開けばオッケー。

・・・わーい。
これで幸せになりましたー。
Macbook Airで開発ってのもらくちんでいいですねー。



2015年2月7日土曜日

開発環境をシフトしてくよ。:Macbook AirでAndroid Studioのプロジェクトをcodebreakで管理しよう

ううう、眠いよう・・・。最近ハードワーク気味です、こんにちは。

今日は用事で外出しましたが、ちょっと時間が空いたので、お仕事を突っ込みます。
最近開発仕事によく使ってるMacbook Airを持って、デニーズへGO。
いいですねMacbook Air。軽いし。薄いし。ターミナルを開けばそこはもうUNIXライクな世界。うふふふーふ。

・・・もう、開発業務はこっちにシフトしようかしら・・・と先日のブログ記事でつぶやいてたんですが、まあ時間的にちょうどいいので実行しちゃおうと。
で、まあ、結果的には成功したんですが、なにぶん疲れ果てていたので、一体なにをどうやったか、ロクに覚えていない・・・。

でもまあ、自分の備忘録的に、メモを残しておくことにします。

前提

  • codebreakにアカウント、リポジトリを作成済み
  • Android Studioはインストール済み
  • Androidプロジェクトはcodebreakから取得し、Android Studioに新規プロジェクトとしてインポート済み
  • gitクライアントにはSourceTreeを使用

・・・なにやったっけ。

ええと、すでにAndroid Studioにプロジェクトとしてコードは取り込んであるんで、これをcodebreakのリポジトリに紐付ければええんじゃないか・・・と思って・・・。

そうそう、codebreakのリポジトリをブラウザで開いて、Clone URLをコピーしたんだっけ。下の画像の右上の部分。

えーとー。次はー・・・。
あ、SourceTreeを起動してー。「新規リポジトリ」から「既存のローカルリポジトリを追加」ってクリックしたんだった。これで、Android Studioのワーキングディレクトリを選択してー・・・。


あと・・・はー。そうそう、確か、SourceTreeで、追加したローカルリポジトリを開いて、っと。
で「リポジトリ」メニューから「リポジトリ設定」を選択・・・したはず・・・。


ここで「リモートの名称」は適当に。「URL / パス」で、先ほどコピーした、codebreakのURLをペタっと貼り付け。

これでオッケー。だったはず。
・・・あ。違った。
Android Studioでコードを変更して、いきなりコミット、プッシュしようとしたら、拒否されたんだっけ。競合がある、とかで。

こちらの記事を参考にさせていただいて。
まずSourceTreeでcodebreakのリモートリポジトリからプルしてから、コミット、プッシュしたら、無事に成功。

・・・。あかん。疲れとる。ぐだぐだや。
でもまあ、結果よければ全てオーライ。これで外出先でも仕事ができるね。わーい!・・・わー・・・い・・・。










2015年2月4日水曜日

TIFFか!TIFFか!TIFFなのか!!:iOSのカメラアプリでメーカー名などを写真のEXIFに埋め込む



えーと。こんばんは。

今日一日苦しんでた不具合がやっと解消されそうなので、愚痴を吐きます。げえーっ。

つい先日、Apple様のApp StoreにiPhoneアプリを公開した訳ですが。

ボスからまた連絡が。「このアプリ使えんの?」
いやー、使えますよ、やだなあえへへへ、と答えようとしたら、
「EXIF情報ないんだけど」

( ̄△ ̄;)

そ、そんなはずは・・・。
EXIF情報は、Android版を作ったときに散々やったしなー・・・
Commons Imagingちゃん口説き落とした: Exif情報のコピー

まあでも、そんなこと言ってても仕方ない。できてないもんはできてない。
で、確認してみましたら、

・・・。うん、確かに無いね。
いや、大事な情報の、「DateTimeOriginal」と「DateTimeDigitized」はきちんと保存されてる・・・されてるけど・・・
他の情報がほとんどない
・・・えええええ・・・。

NSDictionary作るときに、きちんとCGImageSourceCopyPropertiesAtIndexでコピーしたんだけどなー・・・。と思いつつ、コードをもいっぺん見てみると
NSMutableDictionary *EXIFDictionary = [[NSMutableDictionary alloc] init];
コピーしてねぇじゃん orz オイ俺!しっかりせえ!1
あかんわー。初期化して、箱だけ作って満足してるじゃんー。
慌てて修正。こんな感じに。
NSMutableDictionary *EXIFDictionary = [[metadataAsMutable objectForKey:(NSString *)kCGImagePropertyExifDictionary]mutableCopy];
これで安心。ふー。
と思ったけど、・・・んー。なんか、メーカー名(「Apple」とか)、モデル名とか、あとは作成日付とか、そこら辺の情報がまだ保存されてないのよねー。
リファレンス(こちら)見て、関係ありそうなのはセットしてるんだけどなー。

メーカー名とモデル名は、特に変更しないから、最初にmutableCopyで持ってきたもの使えばいいし。
変更したいのは撮影日時とデータ化日時だから、それはsetObjectしてるし・・・
[EXIFDictionary setObject:originalDateTime forKey:(__bridge NSString *) kCGImagePropertyExifDateTimeOriginal];
[EXIFDictionary setObject:originalDateTime forKey:(__bridge NSString *) kCGImagePropertyExifDateTimeDigitized];

EXIFのDictionaryに、他に関係してるエントリはないしなー・・・と思いつつ、ふと「TIFF Dictionary Keys」の方も覗いてみましたら。
const CFStringRef kCGImagePropertyTIFFMake;
const CFStringRef kCGImagePropertyTIFFModel;
const CFStringRef kCGImagePropertyTIFFDateTime;
あるやん あるある あるやんかー・・・
( ̄△ ̄;)

で、TIFFのディクショナリー追加して、
 NSMutableDictionary *TIFFDictionary = [[metadataAsMutable objectForKey:(NSString *)kCGImagePropertyTIFFDictionary]mutableCopy];
このエントリたちをsetObjectして・・・。
[EXIFDictionary setObject:originalDateTime forKey:(__bridge NSString *) kCGImagePropertyTIFFDateTime]; 
[TIFFDictionary setObject:Make forKey:(__bridge NSString *) kCGImagePropertyTIFFMake]; 
[TIFFDictionary setObject:Model forKey:(__bridge NSString *) kCGImagePropertyTIFFModel]; 
[TIFFDictionary setObject:Software forKey:(__bridge NSString *) kCGImagePropertyTIFFSoftware];
ビルドしてみたら。
ほい。
半日以上悩んでたのが、あっという間に解決しましたよ。
( ̄∇ ̄;)

ま、できたから良いとすっか・・・。


あと関係ないけど、kCGImagePropertyMakerAppleDictionaryって何に使うんだろな・・・。最初これが無いせいかと思って追加したけど、なーんも変わらなかった。しくしく。


2014年10月28日火曜日

口説き落としたぜー!: 【解決】Windows 8.1に署名の無いドライバをインストールする

こんにちは。お外はとても良い天気ですが、今日も真面目に仕事してますよ。

以前このブログで、Windows 8.1に署名の無いドライバを追加しようとして挫折した記事を書きました。

Windows 8.1ちゃん身持ちが固すぎるの巻(セキュアブート無効化したいのよう)

要は、
  • Windows 8.1のチャームから「PCの起動をカスタマイズする」を選択し、再起動
  • 「オプションの選択」って画面が出るはず ⇨ 出やしねえ
  • 再起動するまえに、「LogonUI.exe」ってのがランタイムエラー吐く ⇨ あー、こりゃだめだ

・・・てところで止まってたんですが・・・お仕事でどうしても実機をつながなけりゃならなくなりまして、泣く泣く調べました。


と、以下のような結果が。

「PCの起動をカスタマイズする」のエラー

ほうほうほう。Bluetoothのドライバとな。・・・こんなんで解決するかは怪しいけど、とりあえずやってみよう。

Windowsのコンパネを見ると、確かに「CSR Harmony Wireless Software Stack Bluetooth」ってのがありました。
Bluetoothマウスで使ってたのですが、すぐに調子悪くなって、接続できなくなったんで、どうせ使ってない。

さくっと削除。

で、以前参考にさせて頂いたTAKAさんの記事を参考に操作してみると・・・


あっさり表示されたがな・・・。
なんなん。なんなんコレ・・・散々なやんだあの時間(3時間)はなんだったんや・・・。

ま、あとはTAKAさんのブログ記事を参考にして、設定を変更してー。ドライバ入れてー。無事、Xperia Aでもデバッグができるようになりました。ふー。

・・・ふふ・・・ふふふ・・・毎日お仕事楽しいなー(棒



2014年10月23日木曜日

禍福は糾える縄の如し。: Postfixでメール送信できないのはamavisdが起動していなかったのが原因

こんばんわー。・・・こんばん、わー・・・。

いやあ今日は色々ありました。

お仕事が急にキャンセルになって落ち込んでた ⇒ 知人が起業したという良いニュース ⇒

自社のVPNに急きょ接続できなくて青色吐息 ⇒ 無事復旧でヤフー ⇒

iOSでのカメラアプリ実装について四苦八苦しながら調査 ⇒ キャンセルになったと案件やっぱり受注できてやほーい ⇒

酒あおって、さて大人の時間だムフフと思ったらメールサーバでメール送受信ができてない
↑イマココ


やー・・・。このタイミングでないわー。一日台無しだわー・・・とかブツブツ言いながらググったら、さくっと解決方法見つかりました。

私の大人の時間を守ってくださったブログ記事はこちら↓
http://flagsystem.co.jp/news/archives/57

こんなログがでてたのですが。
(略) status=deferred (delivery temporarily suspended: connect to 127.0.0.1[127.0.0.1]:10024: Connection refused)

実は午前中、停電があってメールサーバが再起動したのです。
で、Postfixは自動的に起動する設定にしてたんだけど、どういうわけかamavisdは自動起動の設定、してなかったみたい。もー、バカ!私のばかばかばか!

ということで、速攻自動起動するようせっていしました。

chkconfig amavisd on

ま、なんにせよ、復旧してよかった。
キューにたまってたメールも、無事送信されたみたいだし。

というわけで、おやすみなさーい。ぐびり(蕎麦焼酎お湯割り)。

2014年8月29日金曜日

こういうのは動かすまでが楽しい:Raspberry Piセットアップその3

やー皆さん、お元気ですかー。
ワタシは週末だというのにお疲れモードです。
朝からスパムと戦ったり、新しいお仕事の打ち合わせしたりしてました。あー働いた。

まあそれでも、Raspberry Piがワタシを待っていればと思えばこそ。うふふふふ。

昨日はOSをSDカードに焼いて、いざセットアップをしようとしたところで止まってました。
あろうことか、DVIポートとHDMIポートを間違えていたのです・・・。これじゃディスプレイ繋げられない・・・。
で、今日は外出したついでに、DVIとHDMI変換ケーブルを買ってきました。


お値段1280円。・・・安価なファイルサーバを構築するはずが、ちょこちょこと出費がかさんでいきます・・・。まあしかたない・・・。

このケーブルで既存のディスプレイとRaspberry Pi繋げて、マウスとキーボード、LANケーブルも他のPCから拝借して、と。
こんなかんじ。


あとは電源投入・・・どきどき。


!!起動した!起動したYO!

最低限必要な初期設定をしたあと、コチラのサイトを参考にして、リモートでGUI表示できるように設定しました。
だいたいの流れはこんな感じ。

  • 最初にディスプレイつなげたところで、初期設定をすませ、DHCPからリースされたIPアドレスをしらべる
  • rootパスワードを設定
  • ディスプレイ、マウス、キーボードを他のPCに返す
  • シャットダウンコマンド打って停止
  • LANケーブルだけ繋げて起動
  • MacBook Airのターミナルから、先ほど調べたIPアドレス指定して、ssh経由でログイン
  • apt-getでVNCサーバをインストール
  • VNCサーバ起動(?)「vncserver :1 -geometry 1280×800」
  • Finderから、「サーバへ接続」:「vnc://pi@(Pアドレス):5901」
  • やほーい (ノ゚Д゚)八(゚Д゚ )八(゚Д゚ )ノ
あ、あと、DHCPでリースが切れたときに苦しむのは嫌だったので、IPアドレスを固定にしました。
ココを参考にさせていただきました。

あー楽しかった。
さて、次の課題は・・・とりあえず、どうやって使うか考えることですかね。
ま、ここまででも十分楽しめたんで、単なるファイルサーバでもいいんですけどね。

2014年8月28日木曜日

やっべえDVIとHDMI間違えた。まいっか。:Raspberry Piセットアップその2

こんばんわこんばんわ。
お元気ですか?私はお元気じゃありません。夏風邪がいっこうに治りません。
死に物狂いでコードをガリガリ書き、夕餉をいただいて、今にいたります。
ほんとうなら、さっさと布団にダイブして、きちっと体調を整えるべきなんですが・・・

Raspberry Piが俺を待っている

そうそう。昨日はRaspberry Piを開梱して、によによと眺め回し、OSイメージをダウンロードしたところでお休みの時間になったのでした。
で、今日続きをやろうと。
いそいそと準備をします。LANケーブルとキーボード、マウスは別のPCから拝借。
あとはディスプレイも。貧乏だから仕方がないですね。流用流用。

と、ここでハタと気がつく。
あれ・・・。このディスプレイのケーブル、ポートおっきくね・・・?

・・・あー・・・。
DVIとHDMI間違えてたわオレ。

ディスプレイで使ってるのはDVIケーブル。Raspberry Piで必要なのはHDMI。

・・・。

まあ、調べてみると、ディスプレイなくてもネットワークからssh経由でVNCサーバ入れて、MacからVNC使ってつなげるって方法もあるみたいだし、そちらをためそうかな・・・。

それよりも、今使ってるMacBook Air、今度は「d」のキーが物理的におかしくなったみたいで、軽く凹んでます。
Apple製品が品質高いなんてウソウソ。大嘘。
ThinkPadの方が100倍ましじゃー。わーん。

<つづく>