時には立ち止まってみるのもいいよ

仕事の合間の息抜き&備忘録。最近息抜きと仕事の区別がついていない。

WM_USERとWM_APPとRegisterWindowMessage

Windowsのアプリケーションで独自のウインドウメッセージを使う際、

  • WM_USER+?
  • WM_APP+?
  • RegisterWindowMessage

のどれを使うのか、正しい使い分けって知ってましたか?

私は今知りました!!

 

今まではなんとなく、「どうやらWM_USER+?はUSERコントロールが使ってるらしいから、アプリ開発では使わないほうがいい」とどこかで聞いた気がして、WM_APP+?を使っていたのですが。

 

MSDNの説明を読めばよく分かりました。

 RegisterWindowMessage 関数

 

複数のアプリケーションが共通のメッセージを処理する必要がある場合に限って、RegisterWindowMessage 関数を使ってください。1 つのウィンドウクラス内でプライベートメッセージを送信する場合、アプリケーションは WM_USER(0x0400)~0x7FFF の範囲の任意の整数を使うことができます。(この範囲内のメッセージは、アプリケーションではなくウィンドウクラスにとってプライベートです。たとえば、BUTTON、EDIT、LISTBOX、COMBOBOX のようなあらかじめ定義されたコントロールが、この範囲内の値を使うことがあります。)

 

つまり、そのメッセージの機能とその使用範囲で決めればいいわけです。

  1. 自前のWindowクラスで作ったウインドウ固有の機能なら
    そのWindowクラス毎に決めたWM_USER+?を使う
  2. ウインドウクラスに依存しない、アプリケーション固有の機能なら
    そのアプリケーションに決めたWM_APP+?を使う
  3.  複数のアプリケーションで使う機能(外部に機能を公開するような)なら
    RegisterWindowMessageを使う

 

RegisterWindowMessageの説明にある「複数のアプリケーション」というのはおそらく、複数のプロセスとかいう意味じゃなくて、見知らぬアプリケーションに対して自分のアプリケーションが持つ機能を公開する際に使用するのだと思います。

 

 

 

まぁ、結局WM_APPを使うことになるんだろうけど!! ← 

Windows10 のロック画面画像が変わらない件(解決)

知ってる人には今さら、かもしれませんが。

 

Windows10のログイン画面とかロック画面で、Microsoftのおすすめ画像がでる「Windowsスポットライト」というのがあるんですが、なんかのはずみで画像が切り替わらなくなってしまったのです。

Microsoft(JP)のフォーラムでも質問が出てますが何かイマイチな回答しか得られず。。

 

実害が無いので放っておきたかったんですが、どうにもそこの写真が気に入らなくて、いろいろ探したらわかりました。

 

ちょっと特殊なファイルを削除するので、いつものように自己責任でお願いいたします。m(_._)m

 

  1. スタートメニュー→設定(歯車アイコン)→「個人用設定」→「ロック画面」を表示
  2. 「背景」の設定を「画像」にかえる(スライドショーでもいいかも)
  3. C:\Users\poiuy56\AppData\Local\Packages\Microsoft.Windows.ContentDeliveryManager_XXXXXXXXXXX\Settings
    のフォルダを開いて、中にあるファイルを消す。
    ※ poiuy56のところは自分のユーザー名です
    ※ XXXXXXXXのところはランダムな英数字みたいです
  4. 「ロック画面」の設定で「背景」を「Windowsスポットライト」に戻す

 

まぁ想像するに、スポットライト画像を変更しないようにするロックファイルが保存されてて、そいつが何らかの原因で消すタイミングがなくなって、変更できないままになってるんじゃないかと。

 

元ネタはこちら↓

 

answers.microsoft.com

マストドン v1.4の悲劇 (CentOS7+非Docker)

流行ってんだか流行ってないんだかよくわからないマストドン

 

思うところあってインスタンスを立てようとしたらハマったのでメモ。

#Dockerな人たちはこういう問題は起こらないのかな?

 

まっしろ現象

ver1.4 にしたら↓こんなことになっちゃった人むけ。

画面真っ白。

f:id:poiuy56:20170619203934p:plain

 

原因

github.com

ここら辺の話が元で、要するに /home/mastodon/live/public を読めなくなるってことです。

パターンとしてはたぶん2つあって、

  1. nginxを使ってる → /etc/nginx/conf.d/mastodon.conf の設定 or /home/mastodonパーミッションの問題
  2. nginxを使ってない → これはどうしようもないけど RAILSの設定を変えれば回避可能

 

nginxを使ってる場合

v1.4になったあたり(たぶん)でproduction_guideの記述が変わってて、nginxの設定ファイルが以下のようになっています。

location ~ ^/(packs|system/media_attachments/files|system/accounts/avatars) {
    add_header Cache-Control "public, max-age=31536000, immutable";
    try_files $uri @proxy;
  }

v1.4で静的なファイルが public/asset から public/packs とかにかわってるので、それの対応です。

 

古いproduction_guideの記述だとここの記述がなかったりパスが違ってたりして、その場合はnginxがrailsに丸投げしてて、rails側で静的なファイルを出していたようです。

 

で、v1.4に変わったときにrailsが静的ファイルを出さなくなったもんで、エラー(404)になると。

上のlocationがあると、railsに渡す前に nginxが静的ファイルを配信してくれるので、うまいことやってくれます。

 

locationちゃんと書いたけど動かねーよ!!

という人は私でした。

普通にadduser mastodon してたので、/home/mastodon の権限が0700になってて nginxからは見えなかったという初心者オチでしたよ orz

 

nginx使ってない場合

IISとか、別のサーバーからプロキシしてるパターンですね。

結局現象としては上と同じで、railsが静的ファイルを配信してくれないのが原因です。

 

おそらくセキュリティ的な問題とかでわざと静的ファイルを出さないようにしてると思われますので、以下の解決方法は推奨されないと思います。自己責任にてお試しください。

 

で、件のissueに回答している人のコメントから得た答えがこちら。

RAILS_SERVE_STATIC_FILES=true 

 これを .env.production に1行加えればよろしい。

 

これで静的ファイルを配信してくれます。めでたしめでたし。

 

 

Raspberry Pi 3 の電源は本当に2.5A必要なのか?

 

前書き

結論から言ってしまうと、以下で書いているのは、RasPi3でもUSBには2.5Aも必要ないんじゃないか、という趣旨の記事です。が、当然使用環境などによって動作条件は変わってきますので、動作に問題がでたり故障したりしても補償できませんので自己責任でお願いします。

 

で、本題

Raspberry Pi 3が2月末に本国でリリースされてから、ようやく技適が通って日本国内でも販売が開始され、ボクのところにも先日実機が届きました。

 

で、本国リリース時からネット上で「電源容量は2.5Aを推奨」とか言っていたので、基本的にビビリな自分はあらかじめ

 

 

 こんなのを購入していたわけです。

 で実際に起動して測ってみると、

RasPi2もPi3も、消費電流は大して変わらんゾ?

という結果に。

具体的に言うと、有線LAN接続でBTも使わない状態で、

  • Raspbianを起動してGUIが立ち上がってる状態で5.1V/0.23~0.25Aくらい
  • ウインドウをグリグリ動かすと、Pi2で0.30~0.35, PI3でも最大0.40Aくらい
  • omxplayerでのFullHD H.264 MP4動画再生はどちらも0.30A以下。

てな感じでした。

これって、普通に1AのACでいけるんじゃないでしょうかね。。

 

ソースは?

2.5A必要!っていう話の元の記事ってたぶん↓これかなと。

www.raspberrypi.org

ここに書かれている文書を引用すると、

All of the connectors are in the same place and have the same functionality, and the board can still be run from a 5V micro-USB power adapter. This time round, we’re recommending a 2.5A adapter if you want to connect power-hungry USB devices to the Raspberry Pi.

の部分じゃないかと思うんですが、拙い英語力で理解した感じでは

USBに大消費電力のデバイスを差したい場合は2.5Aのアダプタを使うと良いよ

 

と言っているだけのような気が。

この記事のコメントで、Raspi公式のひと?(コメント欄にロゴが付いてる)の曰く、

There is only one recommended power adapter, the 2.5A Raspberry Pi power adapter. But the power consumption is based on 1A to the processor plus 0.3A to the WiFi plus 1.2A to the USB

These are peak values only but of course you can easily get close to those numbers playing software decoded video for example (youtube on chromium!)

だそうなので、まぁ確かに2.5Aを推奨はしていますが、普通に使う分には全然ヨユーじゃないのか、と思う次第です。

 

USBカメラでキャプチャしながらOpenCVで画像解析とか、そういうのだと影響あるかもしれませんね。

 

 

 

AndroidStudio 1.4 + JNI

AndroidStudio1.4でJNIをつかう方法の覚書。

1.3版を書いてる間に1.4がリリースされたのでその辺の記述も。

ってほとんど同じですけd。

 

元ネタはこちら→

Experimental Plugin User Guide - Android Tools Project Site

 

 

1. experimentalなプラグインが必要。

NDKをつかうためのプラグインはGradle2.5が必要なので、その辺も含めて設定をいろいろいじります。何かダウンロードしてインストールする、というわけではありません。

Gradle2.5 + NDK r10e + SDK Build Tools 19.0.0以上が必要です。

  • {PROJDIR}/gradle/wrapper/gradle-wrapper.propertiesファイルを編集して、distributionUrlをgradle-2.5に変更する
    変更後)
      distributionUrl=https\://services.gradle.org/distributions/gradle-2.5-bin.zip
  • {PROJDIR}/build.gradleのクラスパスを変更する
    変更後)
      classpath 'com.android.tools.build:gradle-experimental:0.2.0'
  • {PROJDIR}/.idea/gradle.xmlにgradleHomeオプションがあれば、消す。
    変更前)
    <option name="gradleHome" value="C:\Program Files\Android\Android Studio\gradle\gradle-2.4" />
    ※これに気が付くのにえらい時間がかかった。。
2. Gradle Scripts の変更

元ネタサイトのまとめを適当に日本語化すると、こんな感じ。

  • プラグイン名を"com.android.model.application"に変更する
  • 設定は model {} で囲む
  • ほとんどのプロパティは = で記述する(以前はスペースのみ)
  • Collectionへの追加は += で記述する(proguardんとこの話)

が、いくつか限定条件があって、

  • buildTypes, productFlavors, signingConfigs は android{} ブロックの外に出す
  • android {}ブロックの中にネストされている項目には with キーワードをつける
  • プロパティ値として設定できるのは direct types のみ。
    ※ minSdkVersionとかproGuardFilesの話だと思います。
  • buildTypeやproductFlavorを作成するには create メソッドを使う必要がある。
    ただしrelease buildTypeのような既存のものは名前を指定するだけで使える。
  • dependencyのtestCompileコマンドは使えないようだ。
    ※ AndroidStudio1.4でやるとdependenciesにtestCompileが追加されますが、エラーで通りませんでした。よくわからんのでコメントアウト(^^; いいのか?

 

で、デフォルトのプロジェクトを書き換えたbuild.gradleがこちら。

apply plugin: 'com.android.model.application'

model {
    android {
        compileSdkVersion = 23
        buildToolsVersion = "23.0.0"

        defaultConfig.with {
            applicationId = "jp.poiuy56.project"
            minSdkVersion.apiLevel = 19
            targetSdkVersion.apiLevel = 23
            versionCode = 1
            versionName = "1.0"
        }
    }
    android.buildTypes {
        release {
            minifyEnabled = false
            proguardFiles += file('proguard-rules.pro')
        }
    }

}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    //testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile 'com.android.support:design:23.0.1'
}

 

ここらで一度Gradleを同期してみて、ビルドが通るか確認します。

Gradle-2.5 が読まれていれば、 {PROJDIR}/.gradle/2.5 が出来上がってファイルが配置されてるはずです。

 

3. Gradle Scripts (NDK用の追加設定)
  • {PROJDIR}/local.propertiesにndk.dirを追加。
    SDKLocationで設定すると追加されます。
    ndk.dir=C\:\\android-ndk-r10e
    sdk.dir=C\:\\android-sdk-windows
  • {PROJDIR}/app/build.gradle に android.ndk ブロックを追加
    android.ndk {
    moduleName = "jni-sample"
    CFlags += "-UNDEBUG"
    ldLibs += ["android","log"]
    stl = "stlport_static"
    }
4. JNIソースを追加する
  • appから右クリックで new -> Folder -> JNI Folder でjniフォルダを作成
  • jniフォルダに .c とかを置けばOK

後は普通にJNIですね。nativeメソッドを含むjavaクラスを作って、javahでヘッダ生成、んで中身を実装してjniフォルダに配置すれば、うまくやってくれます←

 

JNIのモジュールを複数に分けたりフォルダを分けたりする方法がよくわからんので今後の課題です。

 

 

 

ソフト屋さんがblueninjaをさわってみてます

前回の続きです。

 

 

TOSHIBAのBSPが入手できました。

思ったよりは早かったですが、署名を送り返す(メールで)作業が面倒ですねぇ。。

わざとかもしれませんが。

 

さて、無事BSPを入手できるようにはなりましたので早速環境を整えましょう。

AppLite | 東芝 セミコンダクター&ストレージ社

ここからTZ1000のBSPを入手します。アカウント登録後ライセンス許諾に署名して送り返すと、BSPがダウンロードできるようになります。

が、

f:id:poiuy56:20150826085934p:plain

なぜかChromeでは1回目のサインインがはじかれます。パスワードはお忘れではないです。

もいっかいやると入れるんですけど。

 

で、ライセンス許諾云々が完了していると、BSPやドキュメント類のダウンロードページが開くようになります。

 

現在(2015/8/26)BlueNinja開発環境として必要なBSPのファイルは、

  • TZ1000 BSP non OS Version for MDK-ARM

ですが、東芝サイトでは最新版が更新されていますので、一つ古いバージョンを取得する必要があります。

f:id:poiuy56:20150826090741p:plain

 

余談ですが、最初「新しいほうがいいじゃね?」と思ってLatestVersionをダウンロードしたら、関数のI/Fが変わっててビルドが通りませんでしたorz 人間の業ですね(ちがう

 

ダウンロードしたZIPファイルの中にある、「TOSHIBA.TZ10xx_DFP.1.31.1.pack」を、Cerevoのスターターガイドにあるように配置してインストールスクリプト(.BAT)を実行すると、おおむね準備完了です。

f:id:poiuy56:20150826091710p:plain

インストールしたらC:\Cerevo\CDP-TZ01B\に一式ファイルがコピーされます。

 

start.shell.batを起動すると、必要な環境変数を設定してコマンドプロンプトが開きますが、このBATファイルは

  • MinGW / MSYS のPATHはすでに通っている
  • GitはC:\Program Files (x86)にインストールされている

のが前提になっていますので、必要に応じてstart_shell.batファイルを書き換えましょう。#って、こんな記事を読んでる人は気づくと思いますけど。。

 

ようやく、環境がでけたので、とりあえずはサンプルをビルドしてみます。

 

start_shell.batを起動後、gitからソースを入手→makeします。

C:\Cerevo\CDP-TZ01B> cd \

C:\> mkdir work

C:\work> git clone https://github.com/cerevo/BlueNinja_BLE_EXAMPLE

Cloning into 'BlueNinja_BLE_EXAMPLE'...
remote: Counting objects: 125, done.
remote: Total 125 (delta 0), reused 0 (delta 0), pack-reused 125 Receiving object
Receiving objects: 100% (125/125), 132.63 KiB | 0 bytes/s, done.
Resolving deltas: 100% (48/48), done.
Checking connectivity... done.

 

C:\work> cd BlueNinja_BLE_EXAMPLE

C:\work\BlueNinja_BLE_EXAMPLE> make

  なんかいっぱい出る

C:\Cerevo\CDP-TZ01B\tools\bin\arm-none-eabi-objcopy -O binary blueninja_ble_example.elf blueninja_ble_example.bin

C:\work\BlueNinja_BLE_EXAMPLE>

うまくいけば、blueninja_ble_example.elfと.binができあがりです。

 

 

 

 

ソフト屋さんがblueninjaをさわってみた

IoTブームの流れで、CEREVOさんから出たblueninjaってーのが気になったので買ってみました。紆余曲折あってちょっと届くのが遅れたけどまぁよくあること。

 

ニュース記事はここらへんとか。

pc.watch.impress.co.jp

 

で、開発環境の資料が見たかったんだけど、現物しか入ってないんです。しくしく。

  • Blueninja本体
  • ブレイクアウトボード
  • バッテリ(初回?限定オマケらしい)
  • ネジ
  • 保証書

保証書に「詳細な情報はオンラインドキュメントを参照」とのことで。

BlueNinja ドキュメント - Cerevo

 

うん。わからん。

ソフト屋さんにはよくわからん用語がいっぱい。

 

実はこのドキュメントはもうちょっと後で必要な話で、開発環境については「スターターガイド」ってのを見ないといけなかったのでした。

BlueNinja スターターガイド - Cerevo

 

ここに、開発環境のつくり方が丁寧に書いてあるので、それにしたがって実行します。

おおざっぱに段取りだけならべると、以下のような感じです。

  • USBで接続する
  • mbedドライバをインストール :USBシリアルで見えるようになる
  • MinGW(msys)をインストール :コンパイルに必要
  • Git for Windowsをインストール :ソースなどの入手に必要
  • BitbucketからBlueNinja BSP (Board Support Package)を入手
  • KeilからARM.CMSIS.3.20.4.packを入手
  • 東芝からTZ1000のBSP(TOSHIBA.TZ10xx_DFP.1.31.1.pack)を入手
  • インストール用BATを実行

 

が、しかし、、

 

東芝からのBSP入手がまだできていません。。

(8/25追記:入手できました)

スターターガイドには、ログインしたら自分でダウンロードできるような感じで書いてあるのですが、2015/08/21現在では東芝のサポート宛てにメールを投げて、ライセンス確認&サインが必要なんだそうです。

 

とりあえず、仕方がないのでメールを投げたところで、今日はここまで。。。

#きっと週末は返事が来ないだろうから、続きは来週かなぁ。。

 

→ つづきはこちら