Linuxの自動実行

自動起動設定

概要

 Ubuntuの起動時に自動でプログラムを実行したいので、設定ファイルの直接編集で、どうやったらいいのか調べた。

環境

OS バージョン 備考
Basix 12.04 Ubuntu派生

設定

 自動起動時の設定は、各段階に於いて設定ができる。
 他にも色々あるとは思うが、今回はOS起動時、ログイン時、シェル起動時の3つ。

OS起動時

 OS起動時には、rc.local ファイルが実行される。このファイルは2つ存在して以下の順で呼ばれる。
 正確には、init.d直下のrc.localが、etc直下のrc.localを呼んでいる。

  1. /etc/init.d/rc.loocal
  2. /etc/rc.local

 また、etc直下のrc.localは、/etc/rc.local.d/ 直下のファイル群を呼んでいる。

 よって、結論としては、単体のスクリプトを/etc/rc.local.d/ の直下におけば良い。

ログイン時

 ログイン時には、/etc/profile ファイルが呼ばれる。このprofileファイル内で、/etc/profile.d/ 直下のファイル群を呼んでいる。

 よって、結論としては、単体のスクリプトを/etc/profile.d/ 直下におけば良い。

シェル起動時

 シェル起動時には、ユーザのホーム直下(~/)の.bashrcファイルが呼ばれる。
 このファイルに記述しておけば、シェルの起動時に毎回実行される。毎回実行されるので、2回実行するとまずいコマンドとかは、ここには記述しないようにしよう。

予定

 USBが挿入されたタイミングで設定が適用される様にしたいので、そこら辺を調査する予定。

干支の逆引きについて

概要

 干支(かんし/えと)にちなんだ地名や歴史的事件名などが結構あるが、そこから逆算して年代を推測できると便利なのでは?と思ったので考察してみた。
 ちなみに干支は、「えと」としてお馴染みの子、丑、寅・・・ではなく、甲子、戊辰、辛亥・・・の方をいうので注意。

干支の逆引き

十干と十二支の一覧

十干

番号 十干 音読み 訓読み
0 こう きのえ
1 おつ きのと
2 へい ひのえ
3 てい ひのと
4 つちのえ
5 つちのと
6 こう かのえ
7 しん かのと
8 じん みずのえ
9 みずのと

十二支

番号 十二支 音読み 訓読み
0
1 ちゅう うし
2 いん とら
3 ぼう
4 しん たつ
5
6 うま
7 ひつじ
8 しん さる
9 ゆう とり
10 じゅつ いぬ
11 がい

逆算方法

逆算式

 逆算式は以下の通り、十干と十二支の番号をそれぞれ当てはめると算出できる

 10の位 = (十干 - 十二支) mod 12 / 2
 1の位 = 十干
 干支番号 = 上で算出した数に1を足す

  • 甲子園でお馴染みの「甲子」
     10の位 = (0 - 0) mod 12 / 2 = 0
     1の位 = 0
     干支番号 = 0 + 1 = 1
     よって、干支番号は1

  • 辛亥革命でお馴染みの「辛亥」
     10の位 = (7 - 11) mod 12 / 2 = 8 / 2 = 4
     1の位 = 7
     干支番号 = 47 + 1 = 48
     よって干支番号は48

  • 甲午農民戦争でお馴染みの「甲午」
     10の位 = (0 - 6) mod 12 / 2 = 6 / 2 = 3
     1の位 = 0
     干支番号 = 30 + 1 = 31
     よって干支番号は31

modについて

 modは簡単に言うと割った時のあまりのことである。ただし、マイナスの場合にも定義されることに注意。
 例えば、以下のような感じになる。
 25 mod 12 = 1
 -4 mod 12 = 8

順方向

干支番号から干支の算出

 一応順方向についても記述しておく。
 干支番号から干支の算出は簡単で以下の通り

 干支番号から1を引いたものについて考える。
 十干  = 1の位から算出
 十二支 = (10の位 + 1の位)から算出
 久しぶりに見直したら明らかにおかしかったので修正。(2019/03/10)
 十干  = 干支番号 mod 10
 十二支 = 干支番号 mod 12

  • 「辛亥」
     干支番号は上記の通り48なので、47を元に計算する。
     十干  = 7 = 辛
     十二支 = 4 + 7 = 11 = 亥
     十干  = 47 mod 10 = 7 = 辛
     十二支 = 47 mod 12 = 11 = 亥
     修正(2019/03/10)

  • 「丙午」
     干支番号は43なので、42を元に計算する。
     干支  = 2 = 丙
     十二支 = 4 + 2 = 6 = 午
     干支  = 42 mod 10 = 2 = 丙
     十二支 = 42 mod 12 = 6 = 午
     修正(2019/03/10)
    なぜ偶々成功する例を2つ引いてしまったのだろうか・・・

年の予測

還暦について

 年の予測の前に還暦について説明する。60歳のお祝いで還暦というものがあるが、これはこの干支が一回りした際のお祝いとして行われる。
 十干(10)と十二支(12)の組み合わせは、全部で120通り存在するが、干支としてカウントされるのは半分だけである。この組み合わせが存在するパターンと存在しないパターンの違いは、組み合わせが偶数同士、奇数同士に限定される所にある。
 つまり、甲(0)、丙(2)、戊(4)、庚(6)、壬(8)は、子(0)、寅(2), 辰(4), 午(6), 申(8), 戌(10)との組み合わせは存在するが、丑(1), 卯(3), 巳(5), 未(7), 酉(9), 亥(11)との組み合わせは存在しないということである。乙(1)、丁(3)、己(5)、辛(7)、癸(9)の場合は、その逆となる。

予測

 60で一回りすることを応用して、ある程度の年代の予測が可能である、例えば、私の誕生年である1988年は戊辰であったので、戊辰戦争は、1988から60の倍数となるはずである。実際に、戊辰戦争の開戦は1868年なので、1988年のちょうど120年前である。
 地名とか、建物とかに干支が入っている場合、大体その年に作られたかなんかしたものだと思うので、ある程度の年を予測できるのではなかろうか。甲子園とか甲子温泉とか庚申塚、辛亥革命などなど・・・

十干の覚え方

 十二支はともかく、十干を覚えるのはきつい。甲乙丙丁まではいいとしても、それ以降は馴染みがなく覚えづらい。
 ベストな方法は知らないが、五行(木火土金水)と絡めて覚えるのが、一番いい気がする。
 甲(きのえ)は、木の兄で「きのえ」であり、乙(きのと)は、木の弟で「きのと」である。十干は兄弟(えと)の順で並んでいるので、五行の相生を木を起点として覚えればいい。
 正直なところ、この方法の場合、五行を新たに覚える必要があり、敷居は結構高い。私の場合は「デモンズゲート」というゲームで相剋関係を覚えていたので、この方法でなんとか順番を把握することができたという感じである。

参照

MFC事始め

MFC簡単まとめ

MFCとは?

 MicrosoftVC++用に開発した、Widnowsアプリケーション開発用フレームワーク
 WindowsAPIを直に呼び出すよりは多少マシぐらいで、新規で覚えるメリットは、ほとんど無い。
 WindowsXP以前は、よく使われたので、そのメンテナンスとか移植とか、そんな感じの仕事につくと使う羽目になる。個人でやるならば、素直に.Netを使おう。

環境

項目 情報
OS Windows 7
Visual Studio 2015

インストール

 VisualStudioをインストールするとデフォルトで入っている。特に自分でインストールする必要は無い。

プロジェクト作成

とりあえずダイアログベースプログラムを作成

  • 以下の流れで作成
    • ファイル
    • 新規作成
    • プロジェクト
    • プロジェクト作成ダイアログが開く
      • Visual C++MFCアプリケーションを選択
      • プロジェクト名を入力
    • MFCアプリケーションウィザードが開く

基本的な流れ

大体以下の流れで開発していく
(今回はプロジェクト名をMFCSamplesにしました)

  1. リソースビューからダイアログを開いて、視覚的に画面パーツを追加
  2. ダイアログのクラス(MFCSamplesDlg.cpp内)に、追加したパーツに対するイベントやDDX/DDVを記述
  3. パーツを拡張したり、別クラスに処理を分ける

ボタンなどの処理/イベントを細かく管理する場合は、基本クラスを拡張すると良い
拡張の流れは以下の通り

  1. パーツの基本クラスを継承してクラスを作成
  2. ダイアログクラスのメンバ変数を追加して、DDX/DDVとして作成したクラスのインスタンスを持つ
  3. こうすると拡張先のクラスにイベント処理を書いていけば良くなる

コーディングスタイルについて

 クラス名は必ずCを先頭につける必要がある。ファイル名にはつける必要が無いが、クラス名につける必要がある。

ファイル名 クラス名
MFCSamplesDlg.cpp CMFCSamplesDlg

 また、Mustではないが、MFCフレームワークの各クラスが、がっつりハンガリアンで書かれている。Mustではない思うが、周りに合わせる場合は使うべきなのかもしれない。
 他はC++の基本的なスタイルでコーディングしていけばいいのでは無いかと思う。

サンプル

とりあえず、GitHub上に公開しているので、見てもらえばいいと思う。
メインダイアログから、各パーツのサンプルダイアログへ飛べるようになっている(追加予定)。

中継器と有線LANで繋ぐ

概要

無線の中継器に有線で繋いだ際にIPアドレスが割り振られなかったので、どうにかした話。

事象

  • eth0が無くなって、p2p1とかになっていた
  • 多分、コマンドでネットワーク関連を変更した事があったので、それが原因かも
  • ifconfigしてみると、IPv4のアドレスが附与されていなかった

原因

よくわからない

解決

原因はよく割らなかったが、udev(/etc/udev/rules.d/70-persistent-net.rules)にeth0の設定を追記したらIPアドレスが振られる様になった
参考 : [ihttp://kreisel.fam.cx/webmaster/clog/2011-01-20-1.html]

SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="有線LANのMACアドレス", NAME="eth0"

dev_idとtypeは省略して問題ないようである

byobu-screenのエスケープシーケンス変更

概要

byobu-screenのエスケープシーケンスを変えたいが、config(F1/F9)が効かない

原因

pythonの特定のモジュールがないことが原因のようである。
以下のパスのファイルを起動してconfig画面を出力している

/usr/lib/byobu/include/config.py

これを直に叩いて見ると、以下のメッセージが出力された。

ERROR: Could not import the python snack module

未解決版

snackモジュールをダイレクトにインストールしてみる
1) easy_installを利用するためにsetuptoolsをインストールする

sudo apt-get install python-setuptools

2) snackにcythonが必要なのでインストール

sudo apt-get install cython

3) Blasが必要と言われるので、LAPACKをインストールする

sudo apt-get install liblapack-dev

4) snackインストール

sudo easy_install snack

ここまでやって再度実行すると、以下のエラーが出る。 悲しいかなぁ

Traceback (most recent call last):
  File "/usr/lib/byobu/include/config.py", line 69, in <module>
    snack.hotkeys[ESC] = ord(ESC)
AttributeError: 'module' object has no attribute 'hotkeys'

とりあえずここでギブアップ

解決版

configだけなら以下のコマンドでOKらしい

byobu-config

ここで、エスケープシーケンスを変えればOK

C-]をエスケープシーケンスにする

残念ながら上記の方法では、C-]をエスケープシーケンスに設定しようとすると、何故かNGを喰らう。 仕方ないので、設定ファイルを直にいじることにする。
設定ファイルは、以下のパスのものをいじればいいらしい

~/.config/byobu/keybindings

追記内容は以下の通り

escape ^]]

]が2回書いてあるのは、1回だけだと何故かうまく反応しなかったから。

久しぶりにHaskellをやる

概要

 Haskellの環境構築をするにあたって、パッケージ管理にcabalを使うが、バージョン合わせとか何やらで非常に面倒。common lispのroswellやclojureのleiningenなどと似たような感じでビルドとかパッケージ管理とかやってくれるStackというものがあるので導入してみる。

Stack導入

  1. インストール
  2. 使い方
# 1. プロジェクト(sample-project)を作成
stack new sample-project
# 2. プロジェクトに移動
cd sample-project
# 3. セットアップ(最初に1回)
stack setup
# 4. ビルド
stack build
# 5. 実行
stack exec sample-project-exe

vim

 取り敢えずプロジェクトのルートフォルダにいる前提で、ビルド等のコマンドが実行できる様にvimの設定を書いてみた。

nnoremap [Exec] <Nop>
"; 始動キーは<C-t>
nmap <C-t> [Exec]
"; 通常のghc
"; <C-t> e
map <silent> [Exec]e :!ghc -e main %<CR>
"; --------------------
"; stackを利用する設定
"; --------------------
"; セットアップ : <C-t> s
map <silent> [Exec]s :!stack setup <CR>
"; ビルド : <C-t> b
map <silent> [Exec]b :!stack build <CR>
"; 実行 : <C-t> p
";   (注意) プロジェクトのルートからファイルを編集している想定
";          ルートにあるcabalファイルがプロジェクト名になっているので、それを探しに行くことで対応
map <silent> [Exec]p :execute('!stack exec ' . fnamemodify(expand(";**/*.cabal";), ";:r";)) . '-exe' <CR>

参考

vim初期インストール時の対応

概要

新規でvimをインストールする際に出たエラーに関する対応のメモ。

エラー

vimpythonが追加されない

sudo apt-get install python-dev
  • 原因2
    • pythonのconfigフォルダを指定してあげる必要がある
# 今回実行したコマンドは下記
./configure --with-features=huge --enable-multibyte --enable-pythoninterp --enable-gpm --enable-cscope --enable-fontset --with-python-config-dir=/usr/lib/python2.7/config-x86_64-linux-gnu
  • メモ
    • 追加されているかどうかは、「vim --version」で確認できる

起動時にエラーが発生

  • 概要
  • エラー内容
    • 以下の様なメッセージが大量に出る
E10: \ の後は / か ? か & でなければなりません
  • 原因
    • vi互換を切る必要があるらしい
" (1) .vimrcに、以下の記述を入れる
set nocompatible
" (2) 'set compatible'の記述が無い事を確認する