読者です 読者をやめる 読者になる 読者になる

プログラミング好きな脳の引き出し

某高専ロボコニストの溢れた知識の掃き溜め。機械学習とか画像処理とか電子工作とか、技術的なことからちょっとしたことまで。プログラミングの関するものは大体好きです

ふるいVerilogはつらい

FPGA HDL C Verilog

 学校の研究でVerilog-2001を使用していますが、これがなかなかに仕様が難しい…

 言語仕様としてサポートされているRealや多くのシステムタスクを当てに設計していたら、それらは私が開発をしているIDEでは扱えないという…それらはまだ、実行速度の高速化を目的として、後々独自実装のものに置き換える予定だったのでまだ良いのですが、一番つらいのが多次元配列をまともに扱えない所ですね。多くの配列を扱うシステムを開発しているのでこれが本当に辛い。何とか多次元配列がサポートされているSystemVerilogを使わせてもらえるようにはならないかなぁ…そんな事を思いながら、普段、現代的な言語を使っての開発がどれだけ恵まれているかということに思いを馳せたり。

 いつも何も考えずにあって当然と思っていた多くの算術関数はここには無いし、ちょっと難しい事をやろうと思ってライブラリを探してみても、他の言語でなら見つかるようなものも、この言語ではそういったライブラリは見つからない。全て自分で作らなければいけない厳しさ、経験値の高まりを感じます。ちなみに現在は、元々システムタスクを使って実装しようとしていた算術関数をLUTを用いて実装するためのプログラムを書いています。大量の浮動小数点で表された計算結果をVerilogで扱えるように固定小数点に変換して手で入力していくのは現実味がないので。しかし、未だに作りたい物の一部のモジュールを書くためのプログラムを書いている段階、実際にモジュールを自らの手で揃えて作りたい物を作れるようになるまで果たしてどれだけかかるか、考えただけでヒヤヒヤしますね、とりあえず期限を守って頑張りましょうか。

競プロはじめました

最近、自分で作りたいなーと思うアイデアも特に浮かばず、以前からこんなの作りたいな~と温めていたアイデアも、テストやらロボコンやら文化祭やら、学校のイベントが忙しくて長いこと放置気味にしていたら冷めてしまい、プログラミングをする機会が殆ど失われてしまった。このままじゃ腕が鈍ってまずいなーと感じたので、AtCoderをはじめました。ロボットの制御とか、アプリ製作とか、それなりに実用的な物ばかりを制作してきた自分に、パズル的要素の強い競技プログラミングが合うかどうか…しかし、やらないよりはずっと力になると思うので頑張ろうかなと思います。とは言ってももう一週間後にはテストが控えているし、このやる気が持つ事を保証できないのがつらいところです。

VisualStudioCode+Evernote+MarkDownで無料高機能メモ環境

VisualStudioCode Evernote MarkDown

はじめに

 私は普段、Evernoteでメモを纏めています。ふとしたアプリ開発のアイデアなど、とりとめのないことを適当に書き殴るのにEvernoteほど最適なサービスは無いと考えています。しかしプレーンテキストそのままではやはり醜い...ということでMarkDownを使ってメモを見やすくしようと思い、Marxicoを導入しました。非常に使いやすく、これは素晴らしいアプリだなーと感じましたが、使用してから、このアプリが無料で使えるのは10日間限定だと知り落胆しました。素晴らしいアプリには是非お金を払うべきなんでしょうが、何分貧乏学生故にお金がないので...ということで、エディタに普段使ってるVisualStudioCode(以下VSCode)を使用し、MarkDownで楽しく見やすくサクサクメモが取れ、すぐさまEvernoteにアップロード出来る、そんな環境を整えていこうと思います。

環境

-OS - Windows8.1 x64 - エディタ - VSCode 1.5.2 - Evernote 6.2.4.3244 - Node.js 6.6.0 x64

手順

  1. 適当な場所にEvernoteフォルダを作り、さらにEvernoteフォルダ内にVSCodeを使用してMarkDownを編集するワークスペースフォルダと実際にEvernoteにアップロードするファイルを配置するフォルダを作成します。名前は後でわかりやすいように、前者は保存予定のノートブック名+VSWorkSpace,後者は保存予定のノートブック名と名付けるのが良いでしょう。説明の都合上、以下では前者をWorkSpace,後者をSyncSpaceとして説明します。
  2. npmを使い、gulpとgulp-markdownをインストールします
    npm install -g gulp gulp-markdown path
  3. npm modulesへのパスを通します。環境変数NODE_PATHを作り、ユーザーフォルダ以下にある、npmフォルダを探し、その中にあるnode_modulesフォルダのパスを値とします。
  4. 先程作成したWorkSpaceをVSCodeで開き、適当なMarkDownファイルを書きます。
  5. WorkSpace内にgulpfile.jsを作成し、以下の内容を入力し保存します。

     var gulp = require('gulp');
     var markdown = require('gulp-markdown');
     var path = require('path');
    
     gulp.task('markdown', function() {
         return gulp.src(path.basename(fileName))//更新のあったMarkDownファイルのみ    
             .pipe(markdown())
             .pipe(gulp.dest(function(f) {
                 return '../SyncSpaceのフォルダ名/';
                 //WorkSpaceとは別に用意したSyncSpaceに出力する事で、
                 //MarkDownファイル等余分なファイルを転送してしまう事を防ぐ。
             }));
     });
    
     gulp.task('default', function() {
         var watcher = gulp.watch('**/*.md', ['markdown']);
          watcher.on('change', function(evt) {
           fileName = evt.path;
       });
     });
    
  6. .vscodeディレクトリにあるtasks.jsonに以下を記述

     {
         "version": "0.1.0",
         "command": "gulp",
         "isShellCommand": true,
         "tasks": [
             {
                 "taskName": "default",
                 "isBuildCommand": true,
                 "showOutput": "always",
                 "isWatching": true
             }
         ]
     }
    
  7. 後はCtrl+Shift+Bを入力してビルドタスクを実行した後、MarkDownファイルを編集してCtrl+Sを押して保存した時、正しくビルドタスクが走り、SyncSpaceに目的のhtmlフォルダができていれば成功です。

  8. Evernote公式クライアントのツールバーからツール→インポートフォルダを選択
  9. 追加ボタンをクリックして、SyncSpaceを指定、任意のノートブックを設定してOKを押す(念のためソースは保持しておくことをおすすめします)
  10. これで先程作成したhtmlがEvernoteにアップロードされます。 以上で手順は終了です。お疲れ様でした。

終わりに

 ググってみると、VSCodeでMarkDownファイルからhtmlを生成する前例があったり、Evernoteにはフォルダをノートブックにアップロードする機能があるという事を知ったりで、これらの機能を組み合わせるだけで結構簡単に行けると思ったんですよね...実際には前者はgulpfileで定義されている動作がそのままだと全てのMarkDownを変換するので、毎回複数のMarkDownがアップロードされたり、Evernoteも特定ファイルを除外してアップロードする機能がなかったりとで、結構苦戦しました。特にgulpfileについては今まで一切触ったことのない技術だったので、変更のあった特定のMarkDownファイルだけからhtmlを生成するという目的にあった動作をさせるのがなかなか大変でした。ともかく、VSCodeを使って楽に見やすいメモを生成出来る環境づくりはこれで成功しました。VSCodeの軽快さも相まって、メモ取りがかなり捗りそうです。課題としては、guilfile内にパスをべた書きするのがなんだか気持ち悪いとかありますが、それ以上に更新する度に新しいファイルとして、既存のものを上書きせずに追加されるのがとても気持ち悪い...ポジティブに見れば過去のバージョンが残って良いのでは?とか思いますけど、やはり同名ファイルでノートブックが埋め尽くされるのは不便極まりない...やはり、お金があれば使いやすくてそういう問題のないMarxico使うべきなんだろうなぁ...この際、Marxicoをオマージュした拡張機能を作ってみるのも良いかもしれない...
追記:
Evernoteと連携するから悪いんだ。DropBoxと連携すればEvernoteと同じようにどこからでも見られるし…ただ、やはりEvernoteをつかいたさが…Dropboxで快適にメモを共有する方向からのアプローチを検討しますか…

参考

code.visualstudio.com

tasogare66.blogspot.jp

stackoverflow.com

help.evernote.com

インターンシップ終了

二週間インターンシップに行ってきました。僕のあまり触れたことのない方面の企業だったのでとても新鮮でした。大変でしたは新たに得た技術もたくさんあり、非常に充実していました。しばらくは、インターンシップで得た技術を少しずつこのブログにアウトプットしていこうと思います。

仮想マシン上にCaffeをインストール

備忘録 機械学習

 元々私のPCにはCaffeやTensorFlow等の機械学習ライブラリの学習用にWindows8.1とは別にUbuntuもインストールされており、デュアルブート出来たのですがUbuntuを起動していると勿論Winodwsのソフトは使えず、それが原因で機械学習の勉強から足が遠のいていました。そこで、今回はWindows上の仮想マシンに勉強用の環境を整えようと思います。内容的には同じ環境をデュアルブートされている方のUbuntu上に整える時のための備忘録になるため、真新しい話などはありません。ほぼ参考元と同一になります。

環境

ホストOS:Windows8.1

ゲストOS:Ubuntu 16.04 LTS(VMware Player)

仮想マシンのセットアップは既に済んでいるとします

Caffeの導入

0.構成の予定

今回は仮想マシン上なのでGPUは使えない、導入しておいたほうがCaffe以外にも役に立ってとても便利ということで、

・CPUモード

・Anaconda使用

という構成でビルドします。なお、Anaconda周りの環境構築はここに書くと長くなってしまうので参考元を参照してください。この記事ではpyenvを使用し、anaconda2-4.1.0を導入した場合で進めていきます。

1.お約束

各種ソフトウェアのインストール前に

sudo apt-get update

sudo apt-get upgrade

はしておきましょう

2.CUDAのインストール

sudo apt-get install nvidia-cuda-toolkit

3.BLASのインストール

sudo apt-get install libatlas-base-dev

4.その他の依存関係のインストール

sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev


sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler

5.Caffeのダウンロード

sudo apt-get install git
git clone https://github.com/BVLC/caffe.git

6.Makefile.configの設定

Makefile.config.exampleをコピーしてMakefile.configを作成

 

・CUDA_DIR := /usr/local/cuda → コメントアウト

・# CUDA_DIR := /usr → アンコメント

・# CPU_ONLY := 1 → アンコメント 

PYTHON_INCLUDE := /usr/include/python2.7 → コメントアウト

PYTHON_LIB := /usr/lib  →コメントアウト

・ANACONDA_HOME :=~~~

 → ANACONDA_HOME := $(PYENV_ROOT)/versions/anaconda2-4.0.0

PYTHON_INCLUDE := $(ANACONDA_HOME)~~~

 →PYTHON_INCLUDE := $(ANACONDA_HOME)/include \
  $(ANACONDA_HOME)/include/python2.7 \
  $(ANACONDA_HOME)/lib/python2.7/site-packages/numpy/core/include

・INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/includeの行に

 /usr/include/hdf5/serialのパスを追加

・LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/libの行に

 /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/hdf5/serialのパスを追加

・#WITH_PYTHON_LAYER := 1 → アンコメント

 

このようにMakefile.configを編集する

7.エラー解決のコマンド

このままインストールするとエラーが発生するので

find . -type f -exec sed -i -e 's^"hdf5.h"^"hdf5/serial/hdf5.h"^g' -e 's^"hdf5_hl.h"^"hdf5/serial/hdf5_hl.h"^g' '{}' \;
cd /usr/lib/x86_64-linux-gnu
sudo ln -s libhdf5_serial.so.8.0.2 libhdf5.so
sudo ln -s libhdf5_serial_hl.so.8.0.2 libhdf5_hl.so

を実行

 

caffe/pyrhonディレクトリで

for req in $(cat requirements.txt); do pip install $req; done

を実行

8.コンパイル

make -j8 all 

make -j8 test

make -j8 runtest

なお、この構成でやってみるとruntest時にerror127が発生し、testをpass出来ません。この問題はanaconda内のlibフォルダへのパスを通すことで解決しました。

pip install --upgrade pip

pip install -r ./python/requirements.txt

make -j8 pycaffe

make -j8 pytest

9.Python用の設定

PyCaffeのパスを追加します

echo "export PYTHONPATH=$PYTHONPATH:$HOME/caffe/python" >> ~/.bashrc
source ~/.bashrc

最後にimport caffeでエラーが出ないか確認します。でなければビルドは成功です。

python -c 'import caffe'

あとがき

 以前にcaffeを導入した時はCPUモードでのビルドではあまり悩まず、GPU周りでかなり困った覚えがありました。しかし、今回はその当時とは導入する方法が違っていてCPUモードでのビルドなのにかなり戸惑い、手間取りました。当時と同じノリでやったら全くうまく行かなかったので...とりあえずかなり時間はかかりましたがなんとか導入は成功したのでこれで良しとしておきましょう。次はTensorFlowかChainer辺りを導入しましょうか。調べてみるとChainerは自分が触ってみた当時よりもかなりコードが書きやすくなってるみたいなので楽しみです。

 

参考


github.com

ESP8266で赤外線リモコンサーバ(構想編)

ESP8266 Arduino

 家にESP8266が余っていたことを思い出したのでこれを利用して一体何番煎じになるかは分かりませんが、家の家電を外から弄れる赤外線リモコンサーバを作ることにしました。この暑い時期、帰宅したら予め付けておいたエアコンのお陰でキンキンに冷えてるお部屋があるだけでもQoLというのは上がるものですしね…つけっぱなしの方が電気代は節約できるとい話もありますが、さすがに長時間家にいない時もつけっぱなしのほうが良いというわけでもありませんし…というわけで、これから製作予定のESP8266の赤外線リモコンサーバの構想をまとめていきます。

・構成(ハード面)

f:id:ewvss:20160813212508p:plain

こんな感じに、通信、制御をESP8266でこなそうかと考えてます。学習機能を制御するために、追加でボタンが2つか3つくらい増えるかもしれませんが…そもそも自分の中で、学習機能を内蔵させる必要はあるのか?というところもまだ悩んでたりするので、学習機能周りについてはまだ曖昧ですね。

・構成(ソフト面)

f:id:ewvss:20160813222647p:plain

IFTTTのDo Buttonアプリを使って、Milkcocoaに命令をPOST、ESP8266がPOSTされた命令を受信して家電に送信、という感じになってます。参考元の通りだとまだMilkcocoaに直接POSTすることは出来ないみたいなのでその場合はHerokuを挟みます。この時、命令内容に1001111011…という赤外線の発光パターンを意味するテキストを含むこともできるので、わざわざESP8266側に学習機能を付けて命令を保存させる必要はないんじゃないかなーと思い、その機能の搭載ついては迷っているんですよね。赤外線受信機能だけ別で作っておいて、それの読み取ったパターン通りに別の端末から命令を送信してやるのが汎用性も増して良いんじゃないかなと言うことです。

 

わかってるように書いてますが、MilkcocoaやIFTTTについては知識が殆ど無いので、これから勉強しながらゆっくり作っていこうという感じですね。取り敢えず部品集めからでも始めなきゃ…

 

参考

blog.mlkcca.com

threadに参照を渡すときは(C++)

備忘録 C++

C++でthreadに参照を渡すときはstd::refを忘れないようにしよう。