おふとんガレージ

技術的なことの忘備録とか

C++はじめました

ある講義で諸々あって早急にC++を使えないといけない状態になったので

続きを読む

Bash on Windowsで遊んでみた

Thinkpad X240に今更ながらWindows 10 Anniversary Updateを適用した。
とりあえずの第一印象はスタートメニューが若干変わったなーくらい。

あと大きな変更点と言えばBash on Ubuntu on WindowsがInsider Programに参加してなくても使えるようになった点。
個人的に惹かれてはいたもののいかんせん面倒くさくて放置してたので今更ながらうちで使ってる環境の紹介と感想をば。

やったこと
下準備

  • ConEmuインストール
  • Xmingインストール
  • Windows10 開発者モードへの変更

Bash on Windows導入

  • 機能追加
  • zsh, git導入
  • oh-my-zsh導入 テーマ変更
  • もろもろ


ConEmuインストール
流石に素のcmd.exeだと色々と味気ないので評価が高いコンソールエミュレータとしてConEmu導入
oh-my-zshのテーマの一つであるagnosterすきすきマンなのでPowerLineフォントを入れる必要があったのだが、いかんせんcmd.exeにしろPowerShellにしろフォントの変更が面倒だったので導入。
PowerLineフォント入れなくても文字化けしないのとタブが使えるのはもっそい便利。
最初お世話になってるterminatorを入れようとしたけど文字化けの対処にコケたのは内緒
bash.exeを起動してると矢印キーが効かない不具合があるので以下の呪文をSettings-Startup-Tasksに追加しておくと捗る

C:\windows\system32\bash.exe -l -i -cur_console:p1 -new_console:p:n 

あとはこれを適当な名前としてタスクとして保存、これでタブを追加する時に矢印キーが正常に使える状態でbash.exeを起動するオプションが追加される。あとはカラースキームをいつものsolarizedにしたりした。

Xming X Server for Windowsインストール
ググれば一発で出てくるので省略、ちゃんとフォントも入れたけど日本語文字化け問題は解消せず。

Windows10 開発者モードへの変更
スタート-設定-更新とセキュリティ-開発者向け

開発者向け機能を使うから開発者モードをオンに
とりあえず下準備は終了。やりました。

機能の追加
コントロールパネル-Windowsの機能の有効化または無効化
Windows Subsystem on Linux (beta)のチェックをonに

とりあえずcmd.exeを起動しbashと入力、色々出てくるので画面に従って進めればおk。

その他
この先は個人の好みなのであっさりと

oh-my-zshのインストールスクリプトを走らせるためにはgitが必要なので導入
同時にGUIも一応使えるようにx11-appsも、あとは肝心のzsh

sudo apt-get install git zsh x11-apps

sudoするといちいちうるさいので/etc/hostsを若干追記
最初の行を

127.0.0.1 localhost (マシン名)

に変更すれば鬱陶しいunable to resolve hostなんちゃらってエラーは消える。

oh-my-zshをインストール

cd
sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

~/.zshrcを編集

変更前
ZSH_THEME="robbyrussell"
変更後
ZSH_THEME="agnoster"

デフォルトシェルの変更が出来ないので~/.profileの適当なとこに一行zshと追加、多分もっと良いやり方があるはず。


その他メモ

  • Çドライブ、Dドライブ等は/mnt以下にマウントされる
  • 起動時のディレクトリは/mnt/(Windowsのインストールドライブ)/Users/[UserName]

ここに.zshrcなり.vimrcなり置いても無意味なので、一回cdコマンドで/home/[UserName]に移動する癖をつけた方がいいかも?

  • だいたいのものはapt-getでなんとかなる、フォントに目を瞑ればGUIも使える

日本語表記が時々乱れるとかもあるけど、なんだかんだで実用性もあるしこれから積極的に使っていきたいところ。
vagrantみたいに見れるディレクトリに制限が無いのはありがたい。ミスったら全部吹っ飛ぶ危険はあるけど。

全くの初心者が遺伝的アルゴリズムについて考えてみた

色々あって勉強する機会があったので忘備録代わりに


そもそも遺伝的アルゴリズムとは

解の候補となる個体を複数用意し、それらを組み合わせ、適合度が高いものを残しながら解を探索するアルゴリズム


今回は巡回セールスマン問題(TSP)を解くことが目的であったため、交叉方法に部分一致交叉、変異には2点の位置をランダムで交換した。
親世代の中で巡回路長が短いもの上位10%をエリートとし、変異や交叉を行わずに次世代へ受け継がせた。

部分一致交叉

  1. 親となる巡回路を2つランダムに選択する
  2. ランダムで交叉開始箇所と終了箇所を選択する
  3. 交叉範囲内にて親の同位置の遺伝子をペアとする
  4. 同一個体内のペアとなってる遺伝子の位置を交換する

巡回路の評価方法は単純に巡回路長を用いた。

選択・淘汰はトーナメント選択を適用。
ランダムに集団から4個体選出し、最も巡回路長が短い物を選択する。

これを個体数分繰り返し、子世代の比率はエリート10%、交叉、淘汰を行ったもの90%としてみた。

値の決め方は基本適当。

結果
案の定うまく行きませんでした。知ってた。
交叉する範囲が広い場合、部分一致交叉を用い、点の排他性を保とうと試みると親の遺伝子情報が大きく破壊され、ランダム探索に近いものとなってしまう。

サブツアー交叉を用いることができればなんとかなったのかもしれないけど実装力がない。つらい。

アルゴリズム自体は比較的単純なのに実装力がなさすぎてしんだ。
現状だと精度は最近傍法で初期順回路を生成して、2-opt、or-opt改善を用いた方が速度的にもはやい。

勿論、遺伝的アルゴリズム自体がダメってわけでなくて、純粋にわたしのコーディング力が無い現実に直面させられた。

つらい。

github.com

node.jsのtwitモジュールを使ってTLをUserStreamで取得してみる

環境

  • Raspberry Pi2 + Raspbian
  • Node v6.3.0 + npm v3.10.3 導入済
  • Consumer Key と Access Token 取得済

twitモジュールのインストール

$ nam install twit

UserStreamを取得させてみる

Consumer Key と Access Token は取得したものをコピペしてください。

userstream.js

var twit = require('twit');

var twitter = new twit({
        consumer_key            : 'consumer_key',
        consumer_secret         : 'consumer_secret',
        access_token            : 'access_token',
        access_token_secret     : 'access_token_secret'
});

var stream = twitter.stream('user');

stream.on('tweet', function(tw){
        var text = tw.text;
        var screen_name = tw.user.screen_name;
        var user_name = tw.user.name;
        var time = tw.created_at;
        console.log(user_name +' ( @' + screen_name + ' ) ' + time + '\n' 
                                + text +'\n');
});

想像よりはるかに簡単でびびった(KONAMI


おまけ

nyan.js

var twit = require('twit');

const MY_TWITTER_ID == user_id;  
var twitter = new twit({
        consumer_key            : 'consumer_key',
        consumer_secret         : 'consumer_secret',
        access_token            : 'access_token',
        access_token_secret     : 'access_token_secret'
});

var stream = twitter.stream('user');


stream.on('tweet', function(tw){
	var text = tw.text;
	var screen_name = tw.user.screen_name;
	var user_name = tw.user.name;
	var time = tw.created_at;

        var isRetweet = tw.retweeted;
        var isRetweet2 = (new RegExp(/(R|Q)T @[^\s ]+/g)).test(text);
        
        if(user_id == MY_TWITTER_ID){ return;}
        if(isRetweet || isRetweet2){ return; }


	if(text.match(/にゃ/)){
		var tweet = '@' + screen_name + ' にゃーんっ'; 
		twitter.post('statuses/update', { status: tweet }, function(err, data, response){
		
			if(!err) {
				console.log('Posted : ' + data.user.screen_name + ' > ' + data.text + ' (' + data.created_at + ')');
			}	
		});
	}	
	//console.log(user_name +' ( @' + screen_name + ' ) ' + time + '\n' + text +'\n');
});

TLにねこさんがいたら鳴き声を返すよ。
RTと自分のツイートに反応しないように書き足したよ
 

centosにruby2.3.1を入れた時のおはなし

rbenvでruby2.3.1を入れた時になかなかバージョンが切り替わらなくて四苦八苦したのでメモ代わりに

 

環境

CentOS 6.8

 

 

手順

1.rbenvをダウンロード、PATH追加

> git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

 

#.zshrc

以下追加

export PATH="$HOME/.rbenv/shims:$HOME/.rbenv/bin:$PATH"

 

$HOME/.rbenv/shimsが一番優先されるように一番前に追加する

 

本来なら eval "$(rbenv init -)"と.zshrcに追加すれば動くはず。

うまく動いてくれなかったので対処療法として~/.rbenv/shimsにPATHを通しておく。

ちゃんと原因調べる気力?ないです(小声)

 

とりあえずrbenvが上手く導入できてるか確認

> source .zshrc

> rbenv --version

rbenv 1.0.0-21-g9fdce5d

 

よさげ

 

2.rbenvを使ってrubyをインストールする

 

> rbenv install -l

(略)

2.3.0
2.3.1
2.4.0-dev
2.4.0-preview1

(略)

 

2.3.1がぱっと見て新しそうだから入れてみる。

> rbenv install 2.3.1

待ってればインストールできる。結構かかるのでだらだら待ちます。

 

> ruby -v

ruby 1.8.7 (2013-06-27 patchlevel 374) [x86_64-linux]

 

> rbenv global 2.3.1

> ruby -v

ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]

 

ここでrubyのバージョンがrbenvでインストールしたのに変わってれば成功

$HOME/.rbenv/shimsにPATHを通すとこまでで詰まってたのでメモ代わりに。

 

 

個人用小ネタとか(zsh補完関数の導入、vim <tab>の補完がうまくいかない時の対処法)

個人的忘備録なので詳しいことはgoogle先生

 

zsh補間関数の導入

 

使用環境

  • OSX El Captian
  • zsh 5.2 + oh-my-zsh
  • iTerm2 build 3.0.2

 

1.fpathが通ってるディレクトリの確認

 

> echo $fpath

~/.oh-my-zsh/plugins/git ~/.oh-my-zsh/functions ~/.oh-my-zsh/completions /usr/local/share/zsh/site-functions /usr/local/Cellar/zsh/5.2/share/zsh/functions

 

ぱっと見 ~/.oh-my-zsh/functions に放り込むのが一番手っ取り早そう

 

2.放り込む

> mkdir ~/.oh-my-zsh/functions

>cp _myfunction ~/.oh-my-zsh/functions/

> exec zsh

 

放り込むディレクトリはfpathが通ってるとこか、それか適当にディレクトリ作ってfpath通してあげればよさげ。

 

Vim <tab>でエラー吐く時の対処

 

1.症状

 > vim <tab>

_vim_files: function definition file not found

 

2.対処

.zcomdumpの確認

> ls -la ~ | grep .zcomdump

-rw-r--r--    1 user  staff    37K  9  8  2015 .zcompdump-MacBook-Pro(username)-5.1

-rw-r--r--    1 user  staff    38K  6 15 14:44 .zcompdump-*-5.1

-rw-r--r--    1 user  staff    38K  6 28 10:33 .zcompdump-*-5.2

 

削除

> rm .zcomdump*

> exec zsh

Fedoraとwin10とのデュアルブートに失敗した話

またやらかすことのないようにするために

 

インストール手順(失敗時)

 

  1. windowsのディスクの管理からパーティーション容量の縮小、60GB程度の空きを作る
  2. LiLi USB CreatorでFedora23のインストールメディア作成
  3. PCに挿して起動、GUIに従ってインストール

 

ここまでの手順で普通にfedoraは起動可能、gurbにwinの項目も存在した。

しかしここでwinを選ぶと起動しない。又表記がwin8であったのも気になった。

エラー番号0xc0000225、BCDエラーとある。

 

解決のため試したこと

インストールUSBを作成しUSBブート、コマンドプロンプトを起動

  • bootrec /fixmbr
  • bootrec /fixboot
  • bcdcoot c:\windows /l ja-JP
  • bootrec /rebuildbcd

これらの事を一通り試したが起動しない。

そこで、fedoraインストール時に作成されたパーティーションを全て削除した後に、再度MBR領域の修復をしようと試みた。

 

ubuntuをUSBブートしてGpartedから新規追加されたパーティーションを全削除の後再起動。ここでwin10のインストール用USBメモリを挿し忘れる。

結果としては無事に起動。ディスクの管理から未割当領域を既存のパーティーション拡張に使用。無事現状復帰。

 

ただ気になったのが、win10のシングルブート環境であったがなぜか起動時にOS選択画面が出現、入っていないはずのwin8が選択できる。システムの詳細設定の起動と回復からwin10を自動選択するようにして完全に戻った感じ。

 

今思えば、アップグレード時に残ってたwin8の情報だけがgurbに登録されてて、それで起動しない起動しないわめいていただけだった可能性。今となってはもう遅い。

 

結論:これからはおとなしく仮想環境使います まる