ページ

2015年12月24日木曜日

Google Testを使う


Google Testとは?
C++用のテストフレームワーク
あんましC++用のテストフレームワークはないけど、その中でも一番メジャーと思う
Google Test

   セットアップ


手順としては、git cloneしてビルド&必要なヘッダやライブラリをコピーします
  • まずはリポジトリからクローンしてきます。
$ git clone https://github.com/google/googletest.git
  • そしてビルドしていきます
$ make build
$ cd build
$ cmake ..
$ make
build配下に色々できてると思いますが、
この中で必要なlibgtest.alibgtest_main.aをコピーします
$ sudo cp ./googlemock/gtest/lib*.a /usr/local/lib
※ ↑Macで動作させる場合
また、ヘッダファイルもコピーしときます。
 $ sudo cp -r ../googletest/include/gtest /usr/local/include/

   テストのテスト


環境はできたので、早速動かしてみたいと思います。
まずはテスト対象のソースを書いていきます。
#include <gtest/gtest.h>

int add(int x, int y) {
  return x + y;
}

TEST(AddTest, Test1) {
  ASSERT_EQ(2, add(1, 1));
}
今回はcmakeを使用していきます。 早速CMakeLists.txtを作成。
FIND_PACKAGE (GTest REQUIRED)

include_directories(
    ${GTEST_INCLUDE_DIRS}
)

add_executable(gtest gtest.cpp)
target_link_libraries(gtest_example
    pthread
     ${GTEST_BOTH_LIBRARIES}
)
コンパイルして実行してみる
$ mkdir build
$ cd build
$ cmake ..
$ make # => gtestができればOK
$ ./gtest
Running main() from gtest_main.cc
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from AddTest
[ RUN      ] AddTest.Test1
[       OK ] AddTest.Test1 (0 ms)
[----------] 1 test from AddTest (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (1 ms total)
[  PASSED  ] 1 test.
上のようにOKが出ればテスト成功です。

2015年12月20日日曜日

ブルーレイレコーダー 全自動ディーガ DMR-BRX2000 購入


6年前に購入したレコーダーの起動が遅すぎて、レコーダーを買い替えました。
今回購入したのは、PanasonicのDMR-BRX2000です。

一番の特徴は最大6チャンネルを16日間自動録画!!です。
面倒くさがりな自分としては良さそうなので購入してみました。

近くの家電量販店で購入してきました。約7万くらいでした。



前面に4Kの文字がありますが、DMR-BRX2000は4Kアップコンバート、
4K撮影動画保存、再生の機能があります。しかし我が家は非4Kなので
この機能は使う事はなさそうです・・・

早速開封


本体とリモコン、ケーブル、電源、説明書などが入ってました。
ただHDMIケーブルは入ってないので、使用する場合は別途購入が必要です。

・本体前面


本体のサイズはAmazonなんかで見た時は大きいかな〜と思ってましたが、
実物は想像よりもコンパクトでした。

・本体背面


・リモコン、電源など


B-CASカードが2枚入っており、前面のパネルを開いた所に挿入します。


このB-CASカード2枚というのが、1枚目は通常の4チャンネル録画分
2枚目が追加2チャンネル分です。

この追加2チャンネルですが、ブルーレイ再生中やネットコンテンツ(youtubeやhulu)
を見ようとすると追加2チャンネルに設定していた自動録画が一時停止となります。
なのであまり見ないチャンネルを設定した方がいいかも。

・SDカードスロットも搭載されており、SDカードにも保存ができます。




・ホーム画面


自分がよく使うのは新着番組です。ジャンル毎に新着を確認できます。
またネットコンテンツはYouTube、hulu、NETFLIXはプリインストールされてます。



まだ、使いこなせてない感じですが、全自動はやっぱり便利だなと。
番組表を見ながら、その番組をすぐ見れる感覚は慣れたらもう戻れないです^^;

2015年12月17日木曜日

IRKitで遊ぶ1

前回ちょこっと触れてみましたが、 今回からじっくり遊んでみたいと思います。

   IPアドレス検索


公式ページを参考にBonjourを使ってIRKitのIPアドレスを検索してみます。
$ dns-sd -B _irkit._tcp
DATE: ---Sun 13 Dec 2015---
13:34:59.796  ...STARTING...
Timestamp     A/R    Flags  if Domain               Service Type         Instance Name
13:35:00.955  Add        2   4 local.               _irkit._tcp.         IRKitXXXX
名前(IRKitXXXX)がわかった所で、そのIPアドレスを取得します。
$ dns-sd -G v4 IRKitXXXX.local
DATE: ---Sun 13 Dec 2015---
14:35:05.507  ...STARTING...
Timestamp     A/R Flags if Hostname                               Address                                      14:35:06.874  Add     2  4 irkitxxxx.local.                       192.168.XXX.XXX

   信号の取得


公式ページの通りにcurlを使って最新の赤外線信号を取得。
$ curl -i "http://192.168.XXX.XXX/messages" -H "X-Requested-With: curl"
HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Server: IRKit/X.X.X.X.XXXXXXXX
Content-Type: text/plain

{"format":"raw","freq":38,"data":[4713,1150,2368,1150,1150,1150,2368,1150,1150,1150,2368,1150,1150,1150,1150,1150,2368,1150,1150,1150,1150,1150,1150,1150,1150,50610,4713,1150,2368,1150,1150,1150,2368,1150,1150,1150,2368,1150,1150,1150,1150,1150,2368,1150,1150,1150,1150,1150,1150,1150,1150,50610,4713,1150,2368,1150,1150,1150,2368,1150,1150,1150,2368,1150,1150,1150,1150,1150,2368,1150,1150,1150,1150,1150,1150,1150,1150,50610,4713,1150,2368,1150,1150,1150,2368,1150,1150,1150,2368,1150,1150,1150,1150,1150,2368,1150,1150,1150,1150,1150,1150,1150,1150,50610,4713,1150,2368,1150,1150,1150,2368,1150,1150,1150,2368,1150,1150,1150,1150,1150,2368,1150,1150,1150,1150,1150,1150,1150,1150]}
ちなみに↑は我が家のテレビの電源ボタン押下時の赤外線信号ですw。
リモコンの赤外線信号はNEC/家製協/SONYフォーマットの3種類あるみたいです。
我が家のテレビはSONYなので、SONYフォーマット?

次は逆にIRKitに↑の赤外線信号を送信してみます。
$curl -i "http://192.168.XXX.XXX/messages" -H "X-Requested-With: curl" -d '{"format":"raw","freq":38,"data":[4713,1150,2368,1150,1150,1150,2368,1150,1150,1150,2368,1150,1150,1150,1150,1150,2368,1150,1150,1150,1150,1150,1150,1150,1150,50610,4713,1150,2368,1150,1150,1150,2368,1150,1150,1150,2368,1150,1150,1150,1150,1150,2368,1150,1150,1150,1150,1150,1150,1150,1150,50610,4713,1150,2368,1150,1150,1150,2368,1150,1150,1150,2368,1150,1150,1150,1150,1150,2368,1150,1150,1150,1150,1150,1150,1150,1150,50610,4713,1150,2368,1150,1150,1150,2368,1150,1150,1150,2368,1150,1150,1150,1150,1150,2368,1150,1150,1150,1150,1150,1150,1150,1150,50610,4713,1150,2368,1150,1150,1150,2368,1150,1150,1150,2368,1150,1150,1150,1150,1150,2368,1150,1150,1150,1150,1150,1150,1150,1150]}'
HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Server: IRKit/X.X.X.X.XXXXXXXX
Content-Type: text/plain
いや〜、ターミナルから家電の操作ができるって不思議な感じがします^^;

   一連の動作をスクリプト化


通常リモコン使う場合は、一連の動作をする場合があるかと思います。
例えば、「テレビの電源付ける」→「番組表を開く」
などなど。
この一連の動作をスクリプトで書いて一気に実行してみたいと思います。
スクリプトは分かりやすいrubyを使って書いていこうと思います。
  • Http Client
net/httpを使わず、扱いやすいREST Clientを使う。
早速gemをインストール
$ bundle init
$ vi Gemfile # gem "rest-client" を追加
$ bundle install --path vendor/bundle
以下のようなmain.rbを作成(送信データに関しては環境に合わせて修正)
#!/usr/bin/env ruby
require 'rest-client'

data1 = [4713,1150,2368,1150,1150,1150,2368,1150,1150,1150,2368,1150,1150,1150,1150,1150,2368,1150,1150,1150,1150,1150,1150,1150,1150,50610,4713,1150,2368,1150,1150,1150,2368,1150,1150,1150,2368,1150,1150,1150,1150,1150,2368,1150,1150,1150,1150,1150,1150,1150,1150,50610,4713,1150,2368,1150,1150,1150,2368,1150,1150,1150,2368,1150,1150,1150,1150,1150,2368,1150,1150,1150,1150,1150,1150,1150,1150,50610,4713,1150,2368,1150,1150,1150,2368,1150,1150,1150,2368,1150,1150,1150,1150,1150,2368,1150,1150,1150,1150,1150,1150,1150,1150,50610,4713,1150,2368,1150,1150,1150,2368,1150,1150,1150,2368,1150,1150,1150,1150,1150,2368,1150,1150,1150,1150,1150,1150,1150,1150]

data2 = [4713,1319,2288,1275,2288,1275,1150,1275,2288,1190,2288,1190,1190,1190,2288,1190,1073,1190,1073,1190,2211,1275,1150,1150,1150,1275,2288,1275,1150,1150,2288,38433,4713,1275,2288,1275,2288,1275,1073,1275,2288,1275,2288,1275,1037,1319,2288,1275,1111,1111,1111,1111,2288,1275,1111,1275,1275,1275,2288,1190,1190,1190,2288,38433,4713,1190,2288,1190,2288,1190,1190,1190,2288,1190,2288,1190,1190,1190,2288,1190,1190,1190,1190,1190,2288,1190,1190,1190,1190,1190,2288,1190,1190,1190,2288]

# POST request with modified headers
RestClient.post 'http://192.168.0.21/messages', {'format' => 'raw', 'freq' => '38', 'data' => data1}.to_json, {'X-Requested-With' => 'ruby'}

sleep(10) # 我が家のテレビの反応が悪いので10秒待ってますorz

RestClient.post 'http://192.168.0.21/messages', {'format' => 'raw', 'freq' => '38', 'data' => data2}.to_json, {'X-Requested-With' => 'ruby'}
実行してみます
$ bundle exec ruby main.rb
我が家の環境では実行して、テレビの電源が付いて番組表が表示されました^^。

2015年12月12日土曜日

IRKit 購入


以前からIRKit面白そうだな〜と思ってたんですが、
rebuild.fmで紹介されていた事もあり、勢いに任せてポチりました^^;

購入して2日で到着しました。



中身は本体と簡単な説明書とMacアドレスWi-Fiパスワードが載った紙が入っていました。


早速アプリをダウンロードしてリモコンを学習させてみます♪。


IRKitシンプルリモコン
カテゴリ: ユーティリティ, 仕事効率化





アプリを起動すると早速電源〜とあるので、MicroUSBをIRKitに接続し、
セットアップを行います。

家のWi-Fi環境を設定してやるんですが、IRKitは
802.11b/g/n にしか対応してないので、802.11a(5GHz)を設定すると使えません。
自分もいつもの癖で802.11a(5GHz)を設定してました(笑)




セットアップが完了すると、以下のように青く光ります。


試しにテレビの電源入り切りを学習させてみます。


画面に従ってIRKitに向けてテレビの電源ボタンを押します。
成功するとボタンが追加されます。


ボタンを押してみると・・・おおおっテレビが付く!!(当たり前^^;)
これは楽しいw

他にもIRKit iOS-SDKを使ってのiOSアプリの作成や、
IRKit自体にHTTPサーバがあるので、色んな事が出来そうですw。
しかもIRKitはArduinoIDEで使ってプログラムの書き込みができるという事で
これから色々触っていきたいと思います。

2015年12月9日水曜日

道の駅を巡ってみる 7 - 佐賀 -

今回は前回行った所から南下した位置にある
「伊万里ふるさと村」と「厳木」です。


1. 道の駅「伊万里ふるさと村」




外からは分かりませんでしたが、塀の中は広々していました。



お土産や農産物だけでなく、精肉店や洋服など色々なお店があります。
精肉店の前には「伊万里牛」が^^


また、入ってすぐのところに落花生?を炒っている様子を見れるスペースもありました。


・公式サイト




2. 道の駅「厳木」



ここは一番最初に目につくのが「佐用姫像」です。


かなり大きいです^^;。佐用姫像に関する伝説?もあるようです。


・公式サイト

2015年12月6日日曜日

CocoaPodsを使ってみる



CocoaPodsとは
OSXのアプリやiOSアプリでのライブラリ管理ツール

   インストール


gemで提供されているので、rvmで専用のgemsetを作成する
$ rvm gemset create pod
CocoaPodsインストール
$ gem install cocoapods

$ which pod
/Users/XXXXXXX/.rvm/gems/ruby-2.1.0@pod/bin/pod
セットアップ
$ pod setup
Setting up CocoaPods master repo
Setup completed
とりあえずセットアップまではこれで完了

   実際に使う


使いたいプロジェクトへ移動 
※今回はiOSアプリ開発プロジェクトとして新規作成したTestSwiftプロジェクトを使用
$ cd TestSwift
Podfileをプロジェクト直下に作成し、以下内容に編集
platform :ios, "6.0"
pod 'AFNetworking', '~> 2.0'
↑例としてAFNetworkingライブラリをiOS開発プロジェクトに取り込む
ライブラリ取り込む前のファイル一覧
$ ls
Podfile             TestSwift           TestSwift.xcodeproj TestSwiftTests
ライブラリ取り込み
$ pod install
Updating local specs repositories
Analyzing dependencies
Downloading dependencies
Installing AFNetworking (2.5.4)
Generating Pods project
Integrating client project

[!] Please close any current Xcode sessions and use `TestSwift.xcworkspace` for this project from now on.
Sending stats
Pod installation complete! There is 1 dependency from the Podfile and 1 total pod
installed.
↓インストール後のファイル
$ ls
Podfile               Pods                  TestSwift.xcodeproj   TestSwiftTests
Podfile.lock          TestSwift             TestSwift.xcworkspace
作成されたTestSwift.xcworkspaceを開いて開発を行う
  • Xcodeを開いた様子
依存ライブラリ用のPodsアーカイブが作成されている
また、今回はSwiftからObjective-Cのライブラリを使用する為、 ブリッジ用のヘッダを作成する
#ifndef _AFTest_Bridging_Header_h
#define _AFTest_Bridging_Header_h

#import <AFNetworking/AFNetworking.h>

#endif /* _AFTest_Bridging_Header_h */
これをプロジェクトに追加しSwift Compiler - Code GenerationObjective-C Bridging Headerに設定してやる

これでAFNetworkingライブラリが使用可能になればOK

2015年12月3日木曜日

Gradleをちゃんと使ってみる 2

今回は以前Eclipseで作成したAndroidの自作ライブラリを
gradleでビルドできるようにしたいと思います。

   Android用のテンプレートbuild.gradleを作成


Androidの公式ガイドページに必要最低限の Androidアプリをビルドする
build.gradleが乗っていたのでそいつを使います。
buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:1.3.1'
    }
}

apply plugin: 'android-library' # [1]

android {
    compileSdkVersion 23
    buildToolsVersion "23.1.0" #[2]
}
[1] com.android.applicationとなっていたものを今回ライブラリを作成するので
android-libraryに修正しています。
[2] に関しては自分の環境に合わせてください。
ここで、AndroidSDKの場所をどこかに設定しとかないといけません。
環境変数ANDROID_HOMEに設定するか、build.gradleと同じ階層にlocal.propertiesを作成し以下のように設定します
sdk.dir={AndroidSDKのパス}
この時点でgradle tasksを実行し成功すれば準備はOKです

   gradle wrapperの作成


gradleには別の使う人がgradleを別途インストールしなくても, 自動で特定のgradleのバージョンをインストールし、配布した人と同じgradleのバージョンでビルドできるgradle wrapperという機能があります。
以下のタスクを実施
$ gradle wrapper
すると
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
が追加されたと思います。配布された人はgradlew.bat(Windows用)。gradlew(その他OS用)
を実行する事でgradleコマンドと同じように使えます

   build.gradle作成例


プロジェクト毎に記述が異なると思いますが、↓の例はこちらで公開している
プロジェクトのbuild.gradleになります。
buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:1.3.1'
    }
}

apply plugin: 'android-library'

repositories {
    flatDir {
        dirs 'libs'
    }
}

dependencies {
    compile 'com.android.support:support-v4:XX.X.X'
}

android {
    compileSdkVersion XX
    buildToolsVersion "XX.X.X"
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['res']
        }
    }
}
特別な事はしてないですが、サポートライブラリの読み込みやAndroidManifest.xml
指定などを追加しています。
gradle clean build
├── build
│   ├── outputs
│   │   ├── aar
│   │   │   ├── Monaka-debug.aar
│   │   │   └── Monaka-release.aar
が作成されていれば成功です。