漆黒な技術メモ

管理人が必要に応じて自分のメモを好き勝手に投下するたまり場的ブログ

【ちょっと技術的なことAdventCalender】サーバのHDDをSSDに変えるのに苦労した話

この記事はちょっと技術的なことAdventCalenderの11日目です。

つい先日、研究室内のとあるサーバのHDDをSSDにして高速化しよう!というお話が上がり、サバ管を兼ねている自分が、その交換を行うことになりました。
研究室にはディスクの中身をハードウェア的にコピーするための機械があったので、適当にHDDとSSDをガチョンガチョン挿して動かせば終るだろうと思っていたのですが…大間違いでした。
ちなみに対象のサーバはRAIDが組んであるため、コピーするディスクは2枚になります。 そして購入の都合上、TrancendとSAMSUNGSSDを1枚ずつ購入したのですが、何故か同じ方法でできない…
ということで、自分の格闘記録を今後のために残しておきます。

共通

始めにGpartedをインストール

$ sudo apt-get install gparted

Trancend SSD

UbuntuSSDを接続し、Gpartedで1つパーティションを作成
File systemはcleardにする

その後、コピー用スタンドにHDDとSSDを接続し、コピーボタンを押す。

SAMSUNG SSD

UbuntuSSDとHDDを接続する。
SSDに何かパーティションができている場合は、Gpartedでパーティションを削除 その後、ddコマンドを用いて全てコピー

# /dev/sdbがコピー元、/dev/sdcがコピー先とする
$ sudo dd if=/dev/sdb of=/dev/sdc bs=512

進捗状況を見る場合、別のターミナルより以下を打ち込む

# nは進捗を表示する間隔(秒)
sudo watch -n 60 "pkill -USR1 dd"

ここまでこれば、SSDを接続し起動して、fdiscやcat /proc/mdstatなどでRAIDの状態を確認すれば完了です。
今日はここまで

【ちょっと技術的なことAdventCalender】ラズパイで接続先のwi-fiを切り替えるスクリプトを作った

この記事はちょっと技術的なことAdventCalenderの9日目です。
また多少遅刻してますがご愛嬌という事で

今日は、半年前ぐらいに研究で必要になったちょっとしたスクリプトをここに紹介しようと思います。
毎日テーマとなる題材がブレブレだけど、それがこのブログの趣旨なので…

他の方がそういうシチュエーションに遭遇するかわからないけど、自分が「接続するwi-fi親機を定期的に切り替える」という処理をラズパイに実装しなければならなかったので、
同じような人がいらっしゃれば手助けになれば、と思います。
結構突貫工事で作ったので、動作保証(特にラズパイ以外のLinux)はできないですが、参考程度にお使いください。

#/!bin/sh
#/!sbin/

ssid=$1
pass=$2

rm wpabuf.conf
for line in `wpa_passphrase ${ssid} ${pass}` 
do
    echo "$line" >> wpabuf.conf
done

sed -i -e "1i ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev" wpabuf.conf
sed -i -e "2i update_config=1" wpabuf.conf
sed -i -e "7i key_mgmt=WPA-PSK" wpabuf.conf
sed -i -e "8i proto=WPA2" wpabuf.conf
sed -i -e "9i pairwise=CCMP" wpabuf.conf
sed -i -e "10i group=CCMP" wpabuf.conf
sed -i -e "11i priority=2" wpabuf.conf

mv wpabuf.conf /etc/wpa_supplicant/wpa_supplicant.conf
/etc/init.d/networking reload
iwconfig wlan0

それでは

【ちょっと技術的なことAdventCalender】 Chainer Playgroundを少しだけ触ってみた

この記事はちょっと技術的なことAdventCalenderの7日目です。
7日目といいつつ書くのが遅くなってしまい日付を跨いじゃってますが、そこは大目に見てください…

さて、最近IT業界ではディープラーニングだのAIだの、機械学習系の話題がものすごく流行っていると思います。
筆者の所属する大学の研究室でも、機械学習を積極的にやっており、その分野で論文を書いている人もいます。(自分は機械学習とは異なる分野で研究しているのですが…)
で、そんな流行りものである機械学習ではそれを行うためのフレームワークなども出てきております。
そのような流れの中で、ひとつ気になるニュースがあったので今日はそれをピックアップしようと思います。
深層学習をウェブブラウザ上で学習できる「Chainer Playground」の無償公開について

そもそもChainerとは

先ほどお話しした、機械学習フレームワークの一つです。このフレームワークは日本の会社であるPreferred Networks(通称 PFN)が作成したフレームワークです。
Chainerの特徴はこんな感じらしいです。

In contrast, Chainer adopts a “Define-by-Run” scheme, i.e., the network is defined on-the-fly via the actual forward computation. More precisely, Chainer stores the history of computation instead of programming logic. This strategy enables to fully leverage the power of programming logic in Python. For example, Chainer does not need any magic to introduce conditionals and loops into the network definitions. The Define-by-Run scheme is the core concept of Chainer. We will show in this tutorial how to define networks dynamically.

http://docs.chainer.org/en/stable/tutorial/basic.htmlより引用

まあ英語で専門的なこと言われても何言っているかわかりませんね(読める人は読んでください)。
PFNの中の人のブログやSlideShareを見ると、要するにほかのフレームワークは"Define-and-Run"形式で、「ディープラーニングで使うネットワーク構造の構築」と「実際に構築した構造にデータを流して処理する」部分が別々の実装として書かなければならないのに対し、Chainerは"Define-by-Run"形式で構築と処理を一度に書けてしまうため、比較的簡単にニューラルネットワークの構造をかける点が特徴だそうです。(間違っていたらすいません)
ちなみに他に有名なライブラリとしてはGoogleのTensorFlowやカリフォルニア大学バークレー校の研究チームが開発したCaffeなどがあるようです。

Chainer Playgroundとは

Chainer Playgroundでは深層学習とChainerの基礎を実際のプログラミングを通しながら学べます。Chainer Playgroundを利用するにあたって必要なのはウェブブラウザのみで、PythonやChainerのインストールも必要ありません。ブラウザでChainer Playgroundに接続するだけですぐに学習を始められます。

深層学習をウェブブラウザ上で学習できる「Chainer Playground」の無償公開についてより引用

次は日本語でよかったです。まあ上に書いてある説明でだいたいは終わっていて、Chainerを使った機械学習の基礎をwebブラウザ上で簡単に学べるサイトになっています。Ubuntuを用意して環境構築してやっと…とかしいなくても機械学習を体感的に学ぶことができるみたいです。
ただしまだベータ版なので内容は完全版ではないみたいです。

少しだけ触ってみた

画面はこんな感じみたいです。 f:id:igbt3116redtrain:20161208030919p:plain
左側に説明、右側にエディタと実行結果が表示され、テキストを読みながら実行することができます。

早速管理人もやってみました。
最初は機械学習でいう「学習対象のモデル」とは何ぞやというところから入るわけですが…まあ数学チックな話がガンガン出てきます…結構本気で読む必要があり、理解するのにもなかなかの時間がかかります。そりゃあこんだけ難しいことをこなすデータサイエンティストは引く手あまたなわけだ…
ちなみに僕のような数学よくわかってない、プログラムガッツリやっていましたという人はおそらく「次元」って言葉で一気に混乱すると思います(実際しました)。100次元とかそういう字句がたくさん出てきますが、これは100次元「配列」のことではなく、100次元「ベクトル」のことですね。数学的なベクトルです。(x,y,z)みたいなアレです。そこを間違えるとコードを見ても???ってなるので気をつけてください。
そのあとは目的関数を定義して最適化することで、機械学習の基礎を学ぶみたいですが、この先は管理人も勉強中です…

機械学習にちょっと興味があるよって方、ぜひ試してみてはいかがでしょうか…!!

【ちょっと技術的なことAdventCalender】OpenCV3の環境構築について整理してみた

この記事はちょっと技術的なことAdventCalenderの5日目です

こんばんは。
しばらく書いてなかったのでAdventCalendarをきっかけに久々に更新を頑張ろうと思ってます。はい
でも一人で24日連続はさすがに無理なのでQiita側で記事を書いている友人と共同で頑張って埋めようと思ってます。
友人はあらゆる言語について少しずつ触っていくことをやるみたいです。僕は今まで書こうと思ったけどここに書いてなかったことをジャンル関係なしにブッ込もうと思います。
というわけで、ちょっと技術的なことAdventCalender見てやってください。

そんなこんなで今日の内容にいってみたいと思います。

OpenCVの環境構築で毎度死ぬ話

画像処理エンジンとしてこの上なく有名なOpenCVだが、新しいPCを買ったなどの理由で環境構築をしようとすると毎度躓く。
こいつめ…特にC++の場合はソースコンパイルして突っ込むしかないから本当に厄介だ。

そんなわけで、今回は自分へのメモを兼ねて(いつもそうなのだが)、OpenCV3の環境構築をおさらいしようと思う。
ちなみに今回の環境はUbuntu14.04 LTS (64bit)である。

環境構築 (Python編)

Pythonはフィーリングプログラミング言語と研究室内で勝手に呼んでいるだけあって、結構あらゆることが簡単にできるようになっている。
C++ではクソみたいに苦労したOpenCV3のインストールも、Pythonの仮想環境(Conda)上で動かせるようにするだけならだいぶ簡単だ。

anacondaのインストールと仮想環境のセットアップ

https://www.continuum.io/downloadsからanaconda本体をダウンロードしてくる。
ダウンロードが終わればシェルを実行して

# if you use python 3.5
bash Anaconda3-4.2.0-Linux-x86_64.sh 
# if you use python 2.7
bash Anaconda2-4.2.0-Linux-x86_64.sh

で完了だ。

続いて仮想環境を構築する。ENV_NAMEは仮想環境の名前だ

$ conda create -n ENV_NAME python=2.7 anaconda
# enter virtual environment
$ source activate ENV_NAME
$ python -m pip install --upgrade pip

OpenCVインストール

$ conda install -c anaconda numpy=1.11.1
$ conda install -c menpo opencv3=3.1.0

一瞬である。

構築の確認

import numpy as np
import cv2
cv2.__version__

これの結果が3.1.0と出てきたら成功だ。

環境構築 (C++編)

どちらかというと本番はこっち、C++Pythonほど便利な環境やツールが残念ながらそろっていない(まあかなり低レベルな言語だし)

鬼のインストールシェル

というわけで頑張ってwgetでソースを落としコンパイルするということになる。
インストール先ディレクトリは、標準の/usr/local/libである。

$ cd /usr/local/lib/
$ ls
$ mkdir opencv
$ cd opencv/
$ wget http://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/3.1.0/opencv-3.1.0.zip
$ unzip opencv-3.1.0.zip
$ sudo apt-get update
$ sudo apt-get install build-essential libgtk2.0-dev libjpeg-dev libtiff4-dev libjasper-dev libopenexr-dev cmake python-dev python-numpy python-tk libtbb-dev libeigen3-dev yasm libfaac-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev libx264-dev libqt4-dev libqt4-opengl-dev sphinx-common texlive-latex-extra libv4l-dev libdc1394-22-dev libavcodec-dev libavformat-dev libswscale-dev default-jdk ant libvtk5-qt4-dev checkinstall
$ ls
$ cd opencv-3.1.0/
$ mkdir build
$ cd build/
$ #インストール先にディレクトリを変更する場合はCMAKE_INSTALL_PREFIXの値を変更する
$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON -D WITH_FFMPEG=OFF -D WITH_CUDA=OFF -D BUILD_opencv_python2=ON 
$ #/usr/local下以外にインストールするときは以下のパスを通す
$ # PKG_CONFIG_PATH=$HOME/local/opencvlibrary/lib/pkgconfig:$PKG_CONFIG_PATH
$ # export PKG_CONFIG_PATH
$ # LD_LIBRARY_PATH=$HOME/local/opencvlibrary/lib:$LD_LIBRARY_PATH
$ # export LD_LIBRARY_PATH
$ #
$ ~/.profile
$ vi ~/.profile
$ #-jは並行オプションなので数字はコア数に合わせる
$ make -j4
$ sudo make install
$ source ~/.profile
$  sudo checkinstall
$ #ディレクトリは適宜変更する
$  sudo sh -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'
$  sudo ldconfig
$  sudo cp 3rdparty/ippicv/unpack/ippicv_lnx/lib/intel64/libippicv.a /usr/local/lib
$  sudo cp ../3rdparty/ippicv/unpack/ippicv_lnx/lib/intel64/libippicv.a /usr/local/lib

見ただけで死にたくなるようなシェルの量である…こんなん覚えるのムリ…って感じである。
ちなみに、cmakeの部分で"WITH_CUDA=OFF"オプションを付けているが、これはCUDA側のバージョンが古いと(具体的な数字は失念してしまった…)CUDA側のバグでインストールできなくなってしまうので、CUDAを使う予定のない方は、なるべく切っておくことをお勧めする。使う方はCUDAを最新版にアップデートしてからインストールした方がよい。

構築確認

以下のソースをコンパイル、実行する

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>

using namespace cv;
using namespace std;

int main( int argc, char** argv )
{
  cout << "OpenCV version : " << CV_VERSION << endl;
  cout << "Major version : " << CV_MAJOR_VERSION << endl;
  cout << "Minor version : " << CV_MINOR_VERSION << endl;
  cout << "Subminor version : " << CV_SUBMINOR_VERSION << endl;
}
$  g++ -ggdb `pkg-config --cflags opencv` -o `basename testcv.cpp .cpp` testcv.cpp `pkg-config --libs opencv`
$ ./testcv

今日はこんなところでおしまい…!

たくさんデバイスを一気に管理したいときに -SuperPutty-

どうも、お久しぶりすぎますね。
生きてました。
何を思ったか巷で噂のAdvent Calenderを勝手にやってみようと思いまして、なんとなーく書いています。

SSHwindowsでやる話

皆さんサーバなり何なりの操作でSSHを使うことがありますよね?
Macの場合普通にターミナルからSSHコマンドを叩くことになると思いますが…
でもwindowsの場合、なかなか直接コマンドプロンプトを叩くことはせずに
* TeraTerm
* Putty
のどちらかのソフトを使って叩いていることが多いですよね?
でも、それらのソフトはUIなんて二の次どころの騒ぎで収まっていないので、複数の端末を同時に触りたいとか、そういうことあってもシームレスに切り替えられない現状があります…

f:id:igbt3116redtrain:20161202231735p:plain

そこで登場SuperPutty

f:id:igbt3116redtrain:20161202235604p:plain はい、素晴らしい
たくさんのターミナルを自由に複数配置できます。
右側のサイドバーによく使う端末の設定を保存したり、従来のPuttyの設定のインポートができたりするのでとても重宝します。
僕みたいに研究で一気にターミナル6台開かなきゃいけない…とかそういう人にはマジでおすすめです!!
こちらからダウンロードできますので、ぜひ皆様活用を…! https://github.com/jimradford/superputty/releases/tag/1.4.0.8

eclipseからAndroid Studioに乗り換えて戸惑った時のためのメモ

久しぶりの投稿になってしまった。三日坊主癖が治らない…

実は管理人、前にpahoとかの話をしておきながら長いこと(数年くらい?)Androidプログラミングから離れてたのである。
その間にAndroidでよく使われているバージョンは2.xから4.xや5.xになっていたり、メイン開発手法はeclipse+ADTからandroid studioになっていたりで浦島太郎状態というのが本音である。

とゆーわけで今回は、eclipse+ADTからAndroid Studioに乗り換えた管理人がハマったことをピックアップしておく

プロジェクト≠フォルダ構成

普通eclipseの場合はプロジェクトエクスプローラを開くとエクスプローラのフォルダ構成と概ね一致する。
しかしandroid studioの場合は
f:id:igbt3116redtrain:20150605030245p:plain
ちょっと異なるのだ。
"java"や"manifests"とかいう作った覚えのないフォルダにリソースが入るし、drawableは統一され、libsフォルダなどは見えなくなっている。
特にlibsとかをいじろうとしたときに管理人のようなandroid studio初心者は一瞬戸惑ってしまう。
そんなときの解決方法はこれだ。
f:id:igbt3116redtrain:20150605030716p:plain
左上のAndroidを「プロジェクト」に変更すると、eclipseのプロジェクトエクスプローラと概ね一緒になる。これで一安心だ。

今まで通りソースコード整形ができない

ソースコード整形のショートカットキーがIDEごとに異なるのはよくある話(eclipseとVSとか)だが、どうしてもeclipseから乗り換えた場合、癖でCtrl+Shift+Fを押してしまう。
android studioの場合はCtrl+Alt+Lが正しい。

見つからないアウトライン

eclipseで地味に管理人が助かっている機能が「アウトライン」だ。
f:id:igbt3116redtrain:20150605031734p:plain
永いソースコードを読むときの要点、まさにアウトラインを読むときには非常に重宝していた。
しかしそれがandroid studioでは見つからない…

android studioの場合はCtrl+F12で一時的に表示できるようだ
f:id:igbt3116redtrain:20150605032106p:plain
ただし今までのようにウィンドウに固定する方法はわかってない。管理人としてはすごく固定したいのだが…

右クリックで囲めない…!!

eclipseユーザなら大抵の人がお世話になっているであろう機能が、右クリックからの「囲む→try/catch」だろう。管理人も初めて使ったときは驚きを隠せなかった。
しかしandroid studioではこれを右クリックでは実現できない。
これを実行するにはCtrl+Alt+Tでできる。





以上、今まで戸惑って解決したところはこんなところである。
ちなみにまだ管理人が解決していない部分もある。

それは、android studioでは「インポートの自動編成」を思ったように使えない
eclipseでは気軽に使えて便利だったのに…
また調べてくる所存である。

MQTTbrokerを構築してMQTTを試してみる

前回こんな記事を書いた3116pitchdarktech.hatenadiary.jp
とゆーわけで、今回はMQTTのもう一つの要素、brokerを構築する。
今回は、MQTTでは非常に有名なbrokerであるmosquittoを利用する。

brokerの構築

でもこれはすごく簡単。ノープログラミングで行ける。
用意するのはUbuntu、ターミナルを起動して以下のコマンドを打てばいい

sudo apt-get install mosquitto
sudo service mosquitto start

以上。

非常に簡単である。

動かしてみる。

前回行ったMQTTクライアントプログラムを使って実験してみる。
f:id:igbt3116redtrain:20150516022926p:plain

  • clientID:名の通り、特別な設定をしなけれは特に認証などに使うわけではないので、適当に入れればよし
  • server:サーバーのURLまたはIPを突っ込む
  • port:ポート番号、MQTTのデフォルトは1883

これでconectすると次はこんなんになる。
f:id:igbt3116redtrain:20150516022940p:plain

  • Topic:トピック名の入力
  • Message:メッセージの内容を入力
  • QoS:3段階から入力
  • Retained:必要であればチェック

で、publishすると送信ができる。
同じようなことをやってsubscribeすると
f:id:igbt3116redtrain:20150516022907p:plain
管理人がまだあまり理解していないので滅茶苦茶な履歴になってしまったが、メッセージの受信は確認できた。

今日はここまで