落書き以上、技術メモ以下

気になったことをまとめておきます。

GeeknoteでEvernoteをコマンドラインから操作する

GeeknoteはEvernoteコマンドラインクライアントです。

Geeknote - Evernote console client for Linux, FreeBSD, OS X

Geeknoteを使用すれば慣れ親しんだVimEmacsEvernoteのドキュメントを操作することが出来ます。

また,Markdownによって記述できるようにもなります。

インストール

以下の要領でgithubから取得し,Pythonスクリプトとしてインストールします。

インストール後,Evernoteのアカウントでログインします。

$ git clone git://github.com/VitaliyRodnenko/geeknote.git
$ cd geeknote
$ [sudo] python setup.py install
$ geeknote login
Login:                      
Password:
Two-Factor Authentication Code:        
You have successfully logged in. 

エディタの設定

使用したいエディタを設定します。

--editoの後に何も入力しないと現在設定されているエディタを確認できます。

$ geeknote settings --editor vim
Changes have been saved.               
$ geeknote settings --editor
Current editor is: vim

ノートスタックの表示

全てのノートスタックを表示します。

$ geeknote notebook-list

タグの表示

全てのタグを表示します。

$ geeknote tag-list 

ノートの作成

新規にノートを作成します。

タイトル,内容は必須ですとなります。 オプションでタグ,ノートスタックを指定できます。

$ geeknote create --title <title>
                              --content <content>
                             [--tags <list of tags>]
                             [--notebook <notebook where to save>]

ノートの編集

{key}をタイトルに含むノートを表示し,番号を指定して編集します。

$ geeknote edit “{key}"

ノートの検索

保存されているノートを検索します。

$ geeknote find --search <text to find>
                [--tags <list of tags that notes should have>]
                [--notebooks <list on notebooks where to make search >]
                [--date <data ro data range>]
                [--count <how many results to show>]
                [--exact-entry]
                [--content-search]
                [--url-only]

markdownでの編集例

markdownで編集した時にどのような出力になるか確認してみます。

geeknoteを使用して以下のように編集します。

#  h1

##  h2

###  h3

####  h4

#####  h5

  * 1
  * 2
  * 3
    * 1
    * 2
    * 3
  * a
  * b
  * c

* * *

[ evernote ](https://evernote.com/intl/jp/)

    #include <stdio.h>

    int main (void){
        printf("hello world\n");

        return 0;
    }



これはテストです。

** bold **

> この文章は引用です。

Evernoteで見ると以下のようになります。

f:id:boysenberrypi:20150112155717p:plain

Node.jsをMacにインストール

Node.jsを始めてみようと思って,Macにインストールしたのでメモ。

参考サイト

インストール方法

  1. http://nodejs.jp/nodejs.org_ja/からインストールを押してファイルのダウンロード
  2. ダウンロードしたインストーラを実行してインストール

動作確認

  1. ターミナルを開く
  2. node -v を実行してバージョンの確認
$ node -v
v0.11.11

対話モードで実行

  1. ターミナルからnodeコマンドを実行
  2. 終了する時はCtrl+Cを2回続けて押す
$ node
> 1+2
3
> 100/3
33.333333333333336
> Math.sqrt(2);
1.4142135623730951
> Math.sqrt(2)
1.4142135623730951
> 
(^C again to quit)
> 

コンソールにHello Worldを表示

  • 以下の様な”helloworld.js”ファイルを作成する
console.log("hello world!”)
  • nodeで”helloworld.js”を実行
$ node helloworld.js 
hello world!     

シンプルなWebサーバのサンプルを動かす

Node.jsのトップページにある,シンプルなWebサーバのサンプルを動かしてみる。

  • 以下の様な”example.js”を作成する
var http = require('http');     
http.createServer(function (req, res) {
   res.writeHead(200, {'Content-Type': 'text/plain'});
   res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');
  • nodeで実行する
$ node example.js 
Server running at http://127.0.0.1:1337/

MPDの再生モードについて

MPDのモードで少し引っかかったのでメモ。

MPDを操作する時はMPCを使用するが,少なくとも以下の4つのモードを操作できるようだ。

  • repeat
  • random
  • single
  • consume

repeatとrandomはその通り"リピート再生""ランダム再生"なので問題無いと思います。

singleは1曲のみ再生するモードです。repeatがOFFなら再生を停止し,ONならその1曲のみをリピート再生します。

consumeは再生し終わった曲を再生リスト(play-queue)から取り除くモードです。私はconsumeモードを知らずにONにしていたため,play-queueから再生した曲が消えてテンパりました。

RPiをMPDサーバ化 : 概要

Raspberry PiをMPDサーバにして,快適な音楽環境を構築出来ました。

ここでは使用したものや,大雑把な構築法について記述します。

時間があれば詳細についても書いていきます。

使用した機器

以下が使用した機器のリストです。

RPiのSDカード,ケースは書いていません。

  • Raspberry Pi Type B

    Raspberry Pi Type B 512MB

  • USB無線LANアダプタ : BUFFALO WLI-UC-GNM

    BUFFALO 無線LAN子機 コンパクトモデル 11n技術・11g/b対応 WLI-UC-GNM

  • セルフバスパワーUSBハブ : ELECOM U2H-EG4SBK

    ELECOM USBハブ USB2.0対応 ACアダプタ付 セルフ・バスパワー両対応 4ポート ブラック U2H-EG4SBK

  • スピーカー(USB-DAC内蔵) : JBL PEBBLES

    【国内正規品】 JBL USB DAC内蔵バスパワードスピーカー JBL PEBBLES ブラック

大雑把な手順

大雑把な手順を示します。

今後詳細を書く予定です。

  1. SDカードにNOOBSを入れ,RPiの初期設定を済ませる
  2. 無線LANの設定を行う
  3. RPiに固定IPを振る
  4. MPDをインストールし,設定を行う
  5. MPCをインストールし,設定を行う
  6. MPDを起動する
  7. 楽曲格納用のNAS周りの設定を行う(必要であれば)
  8. USB-DAC出力の設定を行う

だいたいこれで出来たと思います。

今回はこれぐらいにして,詳細は次から書いていきます。

Raspberry PiのMACアドレスはROMから読んでいない件

Raspberry PiのMACアドレスはEEPROMなどから読み込んではいないようです。

xinu/docs/arm/rpi/SMSC-LAN9512.rst at master · xinu-os/xinu · GitHub には次のように書いています。

To have a predetermined MAC address, a given SMSC LAN9512 must be attached to an EEPROM that contains the MAC address. But on the Raspberry Pi Model B, this EEPROM is not present; therefore, this driver must assign a MAC address itself. We do this by generating a MAC address from the board's serial number. This guarantees that a given Raspberry Pi will always have the same MAC address and that two Raspberry Pis are extremely unlikely to be assigned the same MAC address.

上にも書いているようにOS上で重複が生まれないようにMACアドレスを割り振っています。

Raspberry Pi Asterisk - VOIP-Info.jp Wiki にRaspberry PiではベンダーIDがB8:27:EBに割り当てられていると書いています。

確認してみるとRaspberry Piで標準的に使用されるraspbianやArch LinuxなどのOSではMACアドレスをベンダーID + CPUのシリアル番号で割り当てているようです。

実際に確認してみます。

$ ifconfig 
eth0      Link encap:Ethernet  HWaddr b8:27:eb:e9:4a:75  
          inet addr:192.168.0.100  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:41340 errors:0 dropped:26 overruns:0 frame:0
          TX packets:13580 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:51048209 (48.6 MiB)  TX bytes:1228582 (1.1 MiB)

MACアドレスb8:27:eb:e9:4a:75のようです。

確かにベンダーIDがB8:27:EBになっています。

次に/proc/cpuinfoでCPUのシリアル番号を確認します。

$ cat /proc/cpuinfo 
processor   : 0
model name  : ARMv6-compatible processor rev 7 (v6l)
BogoMIPS    : 2.00
Features    : swp half thumb fastmult vfp edsp java tls 
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part    : 0xb76
CPU revision    : 7

Hardware    : BCM2708
Revision    : 000d
Serial      : 000000002de94a75

Serialの下6桁がMACアドレスとして使用されているようです。

以上のように設定するため,基本的にMACアドレスが被るということはないとは思いますが,念の為に使用するOSのMACアドレスを確認してから使用したほうがよさそうです。

汎用的に使えそうなMakefileを書いてみた

Makefileを書いたのでここにメモしておきます。

参考にしたのはこちらのサイトです。

シンプルで応用の効くmakefileとその解説 - URIN HACK

[Bash] ファイルやディレクトリの存在をチェックする方法

Makeでヘッダファイルの依存関係に対応する - wagavulinの日記

GNU make 日本語訳(Coop編) - テキスト変形関数

作成したMakefile

CC      = g++
CFLAGS  = -g -MMD -MP
LDFLAGS = 
LIBS    = 
INCLUDE = -I ./include
SRC_DIR = ./src
OBJ_DIR = ./build
SOURCES = $(shell ls $(SRC_DIR)/*.cpp) 
OBJS    = $(subst $(SRC_DIR),$(OBJ_DIR), $(SOURCES:.cpp=.o))
TARGET  = target_name
DEPENDS = $(OBJS:.o=.d)

all: $(TARGET)

$(TARGET): $(OBJS) $(LIBS)
  $(CC) -o $@ $(OBJS) $(LDFLAGS)

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp 
   @if [ ! -d $(OBJ_DIR) ]; \
      then echo "mkdir -p $(OBJ_DIR)"; mkdir -p $(OBJ_DIR); \
      fi
  $(CC) $(CFLAGS) $(INCLUDE) -o $@ -c $< 

clean:
  $(RM) $(OBJS) $(TARGET) $(DEPENDS)

-include $(DEPENDS)

.PHONY: all clean

Makefileの解説

コンパイラの宣言

CC      = g++

使用するコンパイラをCCに宣言します。 ここではC++のプログラムを考えているのでg++を宣言しています。

コンパイラオプションの宣言

CFLAGS  = -g -MMD -MP

使用するコンパイラオプションを宣言します。 ここで使用しているのは次の3つです

  • -g

デバッグ情報を生成

ソースファイルがインクルードするヘッダファイルを調べて,オブジェクトファイルの依存関係としてとして*.dファイルに出力する。システムヘッダディレクトリにあるものは除外される。

  • -MP

ソースファイルがインクルードするヘッダファイルが依存するものがないとして依存関係を出力する。

すなわち,ソースファイルがfoo.hというヘッダファイルをインクルードしている場合に

foo.h:

という依存関係を出力する

-MMDと-MPのオプションを使用しているのは,ヘッダファイルが更新された時にmakeが行われるようにするためである。詳しくは後述する。

ライブラリに関する宣言

LDFLAGS =  

リンク対象に含めるライブラリを指定します。例えば,数学ライブラリを使用するときには-lmを追加します。

LIBS    = 

使用する静的ライブラリ(.a)や,動的ライブラリ(.so)を宣言します。

ヘッダファイルのディレクトリを宣言

INCLUDE = -I ./include

使用するヘッダファイルが置かれたディレクトリを宣言します。 ここではMakefileが置かれたディレクトリの下に作成したincludeディレクトリにヘッダファイルが置かれたとしています。 -Iオプションはヘッダファイルを探索するディレクトリを追加するのに使用します。

ソースファイルのディレクトリを宣言

SRC_DIR = ./src

ソースファイルが置かれたディレクトリを宣言します。 ここではMakefileが置かれたディレクトリの下に作成したsrcディレクトリにソースファイルが置かれたとしています。

中間ファイルなどを置くディレクトリを宣言

OBJ_DIR = ./build

オブジェクトファイル(.o)や,ソースファイルの依存関係を示す中間ファイル(.d)を置くディレクトリを宣言します。 ここではMakefileが置かれたディレクトリの下に作成したbuildディレクトリに置くとしています。

ソースファイルの宣言

SOURCES = $(shell ls $(SRC_DIR)/*.cpp) 

実際に使用するソースファイルを宣言しています。

ここではSRC_DIRで宣言したディレクトリにある全ての.cppファイルを使用することを想定しています。

そうでない場合は,shellのコマンドを上手く使って使用しないものは除けばいいと思います。

オブジェクトファイルの宣言

OBJS    = $(subst $(SRC_DIR),$(OBJ_DIR), $(SOURCES:.cpp=.o))

ターゲットである実行ファイルが依存するオブジェクトファイルを指定しています。

SOURCESで指定したソースファイルから作成されたオブジェクトを全て使用することを想定しています。

substを使用して,SRC_DIRからOBJ_DIRに変換し,拡張子も.cppから.oにするようにしています。

ターゲットネームの宣言

TARGET  = target_name

ターゲットとなる実行ファイルの名前を宣言してください。

依存関係を示す中間ファイルの宣言

DEPENDS = $(OBJS:.o=.d)

依存関係を示す中間ファイル(*.d)を宣言します。

OBJSで宣言したものを.oから.dに変換するだけです。

allターゲット

all: $(TARGET)

先頭にあるので,普通にmakeするとTARGETがmakeされることになります。

TARGET依存関係

$(TARGET): $(OBJS) $(LIBS)
  $(CC) -o $@ $(OBJS) $(LDFLAGS)

ターゲットとなる実行ファイルの依存関係です。

オブジェクトの依存関係

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp 
   @if [ ! -d $(OBJ_DIR) ]; \
      then echo "mkdir -p $(OBJ_DIR)"; mkdir -p $(OBJ_DIR); \
      fi
  $(CC) $(CFLAGS) $(INCLUDE) -o $@ -c $< 

オブジェクトの依存関係です。

OBJ_DIRディレクトリが存在しない場合にディレクトリを作成し,オブジェクトを生成します。

clean

clean:
  $(RM) $(OBJS) $(TARGET) $(DEPENDS)

cleanを実行するとOBJS,TARGET,DEPENDSを全て削除します。

DEPENDSのインクルード

-include $(DEPENDS)

ソースファイルの依存関係が明記された.dファイルをインクルードします。

これによって,ヘッダファイルのみが更新された場合でもmakeが実行される事になります。

.PHONYターゲット
.PHONY: all clean

ファイルを生成しないターゲットを明記します。

はてなブログでTexの数式を表示

Texの数式が表示できたらなー,とか思ってググったら出来ました。 参考にしたページはこちらです。

はてなブログにLaTeXで数式を書く (Markdown記法用) - 余白の書きなぐり

はてなブログで MathJax を利用して、MathML で数式を表示する - ksmakotoのhatenadiary

webページの書き方(数式 MathJax)

以下やりかた。

設定

はてなブログのデザインで,サイドバーに以下を追加します。

<script type="text/javascript"
  src="https://c328740.ssl.cf1.rackcdn.com/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>

<script type="text/x-mathjax-config">
MathJax.Hub.Config({
  TeX: { equationNumbers: { autoNumber: "AMS" } }
});
</script>

始めに読み込んでいるのはMathJaxというTexで記述された数式をブラウザで表示してくれるJavaScriptです。 その次のものが数式番号を自動で割りつけてくれる設定になります。

使用方法

Markdown記述を使用している際は,以下のようにTexの数式を記述したいものを\\(\\)\\[\\]$$で囲みます(ただし,$$は推奨されていないとかどうとか)。

Markdownを使用していない場合は\(\)のように\を一つ減らします。

\\(
\newcommand{\rot}[1]{\nabla\times #1}
\newcommand{\pdfrac}[2]{\frac{\partial #1}{\partial #2}}
\begin{align}
  \mathbf{D} &= 0 \\\
  \mathbf{B} &= 0 \\\
  \rot{\mathbf{E}} &= - \pdfrac{\mathbf{B}}{t} \\\
  \rot{\mathbf{H}} &= \pdfrac{\mathbf{D}}{t}
\end{align}
\\)

それで,表示されるのが以下となります。

別行立ての数式を表示する際には,alignを使用します。

alignの後ろに*を付けると数式番号が書かれなくなるはずなんですが上手く行きませんでした。

またマクロがMathJaxでも使えることが分かります。

マクロもサイドバーに組み込んだら便利なのかもしれません。

\( \newcommand{\rot}[1]{\nabla\times #1} \newcommand{\pdfrac}[2]{\frac{\partial #1}{\partial #2}} \begin{align} \mathbf{D} &= 0 \label{eq:maxwel_1} \\ \mathbf{B} &= 0 \label{eq:maxwel_2 }\\ \rot{\mathbf{E}} &= - \pdfrac{\mathbf{B}}{t} \label{eq:maxwel_3} \\ \rot{\mathbf{H}} &= \pdfrac{\mathbf{D}}{t} \label{eq:maxwel_4} \end{align} \)

数式番号の参照も出来ます。 例えば

式\eqref{eq:maxwel_1}〜式\eqref{eq:maxwel_4}に真空中のマクスウェル方程式を示した

と書けば,

式\eqref{eq:maxwel_1}〜式\eqref{eq:maxwel_4}に真空中のマクスウェル方程式を示した

のように表示される。

これだけ自由に書けたらいろいろできそうです。