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

仕事の合間の息抜き。やってることは仕事と同じ。

いつも忘れるRHEL7+Docker+nvidia+vulkanの初期設定

RHEL7インストールとかその後docker入れてnvidiaを使うとか、の覚書。

 

最初に言っておきますが、RHEL7版Docker (docker-ceじゃないほう)だとnvidia-dockerがうまく動いてくれないです。。動かす方法があればだれかおしえて~

#どうせdeprecatedになるんだから要らんという話もありますが。。 

 

RHEL7インストール(GUIなし)後

yumを使うのにサブスクリプション登録が必要

# subscription-manager register
登録中: subscription.rhsm.redhat.com:443/subscription
ユーザー名: xxxxx
パスワード: xxxxxx
このシステムは、次の ID で登録されました: xxxxxxxxxxxxx
登録したシステム名: xxxxxx

 

# subscription-manager subscribe --auto
インストール済み製品の現在の状態:
製品名: Red Hat Enterprise Linux Server
状態: サブスクライブ済み

 

# subscription-manager respo --list でリストが出ればOK.

 

GUIありのときCAPS->CTRL

$ gsettings set org.gnome.desktop.input-sources xkb-options "['ctrl:nocaps']"

 emacs派なので。。

 

Docker(無印RHEL版。古い。)

RHEL7には、いわゆる無償版のdocker-ceではなくRHEL7用にforkしたdockerをつかうことができる。-ceはライセンスがやだ、って人達用。

 

今日からできるDocker on RHEL7 | Docker on Red Hat Enterprise Linux 7

ここら辺。

 

# subscription-manager repos --enable=rhel-7-server-extras-rpms
# yum install docker -y

リポジトリを有効化してyumでインストールする。

  

# systemctl start docker.service

でサービスを実行して、

# docker info

とか

# docker run centos:7 echo hello

とかで動作を確認。

 

Docker-CE

RHEL7のリポジトリにも入ってるみたいだけど、無印版と同じバージョンっぽくてめっちゃ古いらしい(確認してまへん)。

 

ので、本家 

Install Docker Engine on CentOS | Docker Documentation から。

 

# yum install -y yum-utils

# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

 

yum-utilsに含まれる yum-config-manager を使って repo ファイルをインストール。

からの、、

# yum install docker-ce docker-ce-cli containerd.io

 

 

 確認方法は無印と同じ。

# systemctl start docker.service

でサービスを実行して、

# docker info

とか

# docker run centos:7 echo hello

とかで動作を確認。

 

 nouveauドライバの停止とnvidiaドライバインストール

RHEL 7 で Nouveau ドライバーを無効にして Nvidia ドライバーをインストールする - Red Hat Customer Portal

 

要点は以下。

/etc/default/grubを編集

GRUB_CMDLINE_LINUX=" ...中略... rd.driver.blacklist=nouveau nouveau.modeset=0"

コマンド実行

BIOSの場合)

# grub2-mkconfig -o /boot/grub2/grub.cfg

UEFIの場合)

# grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg

で再起動

 

 NVIDIAドライバインストール

# sh NVIDIA-xxxxx.run

 

Nouveauドライバ削除 (これはやらなくてもいいかも?)

 1. initramfs更新

# mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r)-nouveau.img

# dracut /boot/initramfs-$(uname -r).img $(uname -r)

  2. ドライバ削除

# yum remove xorg-x11-drv-nouveau

 

Vulkanライブラリ

# subscription-manager repos --enable rhel-7-server-extras-rpms

# subscription-manager repos --enable rhel-7-server-optional-rpms

# yum install vulkan

 ※ extrasリポジトリはいらないかも?

 

Chromeインストールしようとしたらlibvulkanがないよって怒られたので。。

CentOSだとbaseリポジトリに入ってるのでyumだけでいける(というかchrome入れるときに依存関係で勝手に入るはず)

 

 

CUDA Toolkit

CUDA Toolkit 10.2 Download | NVIDIA Developer

ここら辺とか。wgetでパッケージとってきてスクリプト実行するだけ。

 

nvidia-docker

nvidia-docker/README.md at master · NVIDIA/nvidia-docker · GitHub

ここら辺。

$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo | sudo tee /etc/yum.repos.d/nvidia-docker.repo

$ sudo yum install -y nvidia-container-toolkit

 

RHELの無印Dockerだと、nvidia-container-toolkitを入れた時点でコンテナが起動できなくなります。。。

 

Docker-CEだと動く。

# docker run --rm --gpus all nvidia/cuda:10.0-base nvidia-smi

 

とか。

 

git2

RHEL7のgitは1.8なので古い。

VSCodeリモートとかでver2を要求される場合がある。

IUSリポジトリからインストールする。

# rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

# yum install https://repo.ius.io/ius-release-el7.rpm

yum remove git git-\*

yum install git224

1行目:EPEL-RELEASEをインストール

2行目:IUSをインストール

3行目:古いgitを削除

4行目:IUSからgit-2.2.4をインストール

IUSのURLやパッケージ名は変わっている場合があるので注意。

 

接話型マイク

仕事で定期的に、Skype (for business)を使って遠距離の客先と電話会議するんだけど、その時に使ってたのがマイクと片耳イヤホンが一体化したやつ。

f:id:poiuy56:20170913200846j:plain←これ。

 

カナル型じゃないので耳が小さい自分にはかなり苦痛で、マイクも何故かノイズが乗りまくってました。

 

 

で、文句たらたら言ってたら上司がアタラシイの買っていいよっていうから、

アタラシイの買っていいよっていうから、

(大事なので2回言った)

 

f:id:poiuy56:20170913193645j:plain←アタラシイの!!

 

ひゃっほい! なんかヘッドホンぽいのついてるけどただの固定具!!

マイクのみ。

audio-technicaのAT810Fです。

 

で、これが接話型

Wikipedia「マイクロフォン」によると

接話型マイク:

口元に極近いところで利用することを前提に指向特性、周波数特性、感度を調整し、目的の声以外の音を拾いにくくしたマイク

 だそうで、社内で通話するとどうしても外の音とか他の人の会話を拾ってしまうので、これなら!と思った次第。

 

f:id:poiuy56:20170913202711j:plain

まぁ結論から言うと、周りの声は拾います。多少。

そりゃそーだわな。

でも

  • ノイズは明らかにかなり小さくなった。なくなったとは言わない。
  • 外の車の音とかエアコンの音なんかはかなり軽減されてる。と思う。
  • 自分の声がクリアに聞こえる。前のは結構くぐもった感じだった。

なかなか良い感じですよ!

 

動画作ったりする人ならマイクアンプ通してレベル上げたりした方がいいかもだけど、Skypeくらいなら十分なり。

 

あと、ヘッドホンみたいに見える固定具は、たぶん頭の後ろに回して使う感じ。

それだと頭にがっちり固定されて、マイクの位置がビシっと決まる。

オーテクの製品ページには

ハンズフリーでアクション自由。激しい動きに強い機動性と高感度。

って書いてて、確かに少々動いてもずれ無さそう。

でもね。5mのケーブルぶら下げてアクション自由もないだろ、とツッコミを入れた人は多いはず!

 

さて、そんなガッチリをアピっておきながら何ですが、頭がデカイ自分はその使い方だと左右のパッドがちょうどコメカミあたりで、しかも締め付けが結構きつかった。

そうすると、首かけするのが良い感じなんだけど、それだと逆に全く締め付けないので「アクション自由」ってわけにはいかない。動くとすぐマイクがずれる。

あ、会議用だから動かないし良いのか。良いな別に。首かけで。

 

さあ次の会議もがんばるぞー(棒

 

ということで、良い買い物をしました(買ってもらった)って話でした。

 

この手の説話型のちゃんとしたマイクの付いたヘッドセットが売ってたら、売れると思うんだけどなぁ。

 アフィリものっけときますのでよろしければ。こっちのマイクアンプもお勧めです。

 

 

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のモジュールを複数に分けたりフォルダを分けたりする方法がよくわからんので今後の課題です。