Bash on Ubuntu on Windows を使ってみたのと,環境構築
メモ書きに近い内容です.
Bash on Ubuntu on Windowsの使用感想と設定書き綴り
(以下,Linux初心者の発言)
はじめに
Bash on Ubuntu on Windows(BoW) という機能が今年の8月にWindows 10に実装されました.どうやらWindows上でLinuxのbashが実行できるようです.ということで今回これを少し触ってみました.
経緯
僕の通っている大学の授業でプログラムを書く場合は,基本的にLinux(CentOS)で行っています.大学には生徒が自由に使用できるCentOSの入ったマシンがあるのですが,自宅で大学と同環境を用意する場合,大学のサーバに接続する(重い)か,仮想マシンを構築するなどをしなくてはなりません.また,大学のアカウントはユーザに与えられる容量が非常に少ない(ブラウザのキャッシュなど含めて100Mb)です.以前はVirtual Boxを使っていたのですが,最近挙動が重くなってきたので,BoWを試してみることにしました.
ということで,大体以下の事をやってみました
- BoWの導入
- GUIの導入
- 日本語入力の対応
この記事ではbashを実行する際にコマンドプロンプトではなく,PowerShellを使用しています
参考にしたサイト
Bash on Ubuntu on Windowsをインストールしてみよう! - Qiita
Bash on Ubuntu on Windows + XmingによるGUI - Qiita
pc.casey.jp » Ubuntu で日本語が表示されない・文字化け
Bash on Ubuntu on Windows とX Windowの組み合わせで日本語表示と日本語入力: tonopぶらり
PowerShell で Profile を利用して スクリプトの自動読み込みをしてみよう - tech.guitarrapc.cóm
1.BoWの導入
まずはBoWを実行できるようにしないといけません. Windows10をアップデートしても,デフォルトではBashは使用できないようです.
[コントロールパネル]→[プログラム]→[プログラムと機能]→[Windowsの機能の有効化または無効化]で機能のチェックリストを開いて,"Windows Subsystem for Linux(Beta)"をチェックして,インストール,再起動
再起動後,ストアアプリの[設定]を開き,[更新とセキュリティ]→[開発者向け]から"開発者モード"にチェック.
あとは,PowerShellとかからbashと入力すると起動できます.初回時はユーザー名とパスワードの入力を要求されます.
2.GUIの導入
ここまでで,一応bashが動くようになったのですが,まだ問題があります.僕は現在,大学の実験で画像処理をしています.今のままでは画像処理を行うプログラムのコーディングと実行はできても,実行結果の画像を表示することができないのです.そこで,調べたところXmingを使用するとBoWからGUIが起動できると書いてありました.
Xmingの導入
ダウンロードファイル一覧 - Xming X Server for Windows - OSDN
↑公式サイトからXmingと,Xming-fontsをダウンロードしてきます.
Xmingを起動した後,bash上で以下のコマンドを実行します
$ export DISPLAY=localhost:0.0
これで,GUIを開く場合はXmingを通して実行できるようになりました.
ImageMagickもちゃんと開けます()
これGUIの導入ができたと思っていたのですが,実は問題点がありました.日本語表示ができませんでした.Sublime Textを開いて実験のソースコードを確認してみると,日本語コメントが全て文字化けではなく,文字コード(?)で表示されていました.FireFoxも開いてみましたが,同じように日本語の記事は全て読めませんでした.
日本語表示を可能にする
調べたところ,unifontをインストールすることで解決するみたいです.
bash上で以下のコマンドを実行すると日本語が表示できるようになりました.
↓僕のブログもちゃんと日本語で表示されています
実行時に自動でGUIを使用可能にする
さて,GUI環境は整ったわけですが,今のままではXmingの起動,bashの起動,DISPLAYのパス設定と,起動するたびに余計な作業を行う必要があります.bashコマンドでbashを開くと,すぐにGUIが使えるようにしたいので,そのあたりを自動化してみました.
バッチファイルの作成(Windows側)
まず,Xmingを起動する必要があるのですが,面倒です.シェルでbashと打つだけで,Xmingを起動しながらbashを実行するようにしたいです.というわけで,バッチファイルを作成しましょう.
[コントロールパネル]→[システムとセキュリティ]→[システム]→[システムの詳細設定]→[環境変数]→○○(ユーザー名)のユーザ環境変数の一覧から,"path"を選択→[編集]→[新規]で,バッチファイルを保存するディレクトリを登録します.これで,そのフォルダの中にある"○○.bat"と書かれたバッチファイルは全て"○○"と入力するだけで実行できるようになります.
次に,pathに指定したフォルダの中にXmingのショートカットを作成します.バッチファイルと同様にpath内に存在するショートカットファイルは"○○.lnk"と入力すると実行することができます.
次にバッチファイルを作ります.
pathで指定したフォルダ内に,"好きな名前(既存のコマンドと被っているものはダメ).bat"という名前のファイルを作成します.今回は仮にmybash.batとでもしておきました.
mybash.batを好きなエディタ(meryおすすめやで)で開いて以下の内容を記述します.
@echo off
start xming.lnk
taskkill /im Xming.exe /F
1行目:実行したコマンドを表示しないようにします
2行目:Xmingを起動します,.lnk以左は作成したショートカットの名前
3行目:bashの起動
4行目:bashが終了した時点で実行されます.Xmingを終了します.なぜか/Fで強制終了モードにしないと終了できなかった
これで,bashコマンドの代わりにmybashコマンドを入力すると,Xmingを同時に起動してくれるようになりました.
ですが,さっきも書いたようにbashコマンドでXmingを同時に実行したいのです.
ということで,次はプロファイルの設定をします
PowerShellでは,起動時に特定のコマンドを実行するプロファイルを設定できます.
C:\Users\(ユーザー名)\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
がプロファイルのファイルです.存在しない場合は作成しましょう.
そのファイルの中に,コマンドを入力すると,PowerShell起動時に自動的に実行されます.このファイルの中で,以下を記述して,起動時にbashコマンドをmybashコマンドにすり替えるようにしましょう
set-alias bash mybash
set-aliasはコマンドをコマンドを別の名前にしたエイリアスを作成します
エイリアスで作成したコマンドのほうが,bashコマンドなどよりも優先されるようなので,これでbashコマンドがXmingを起動しながらbashを起動するようになりました!(パチパチ
あとは,プロファイルを実行できるようにします.
Windows10はデフォルトではps1ファイルの自動実行が制限されているようです.一旦PowerShellを管理者権限で実行して,次のコマンドを入力し,実行権限を変更します.
set-executionpolicy -executionpolicy remotesigned
これで,次回からは起動時にprofileが自動で読み込まれ,bashコマンドがすり替えられます.
bash起動時の設定(bash側)
Xmingを通してGUIを開くまでの手順の中に,bash側で行う操作もありました.
$ export DISPLAY=localhost:0.0
です.
これをbash起動時に実行するようにしましょう.
bashから~/.bashrcを適当なエディタで開きます. 末尾あたりに先のコマンドをそのまま書き込みます.
これでbash起動時にexportコマンドが実行されるので,bash側でのコマンド入力も不要になります.
よって,PoweShellからbashコマンドを入力するだけで,GUIを開く準備ができた状態でbashを起動するようになりました(疲れた
3.日本語入力の対応
ここはまだできたとは言えない状態です.
どうも通常のshell,コマンドプロンプトからは日本語入力ができなかったので,ターミナルエミュレータを使用するのがよさそうでした.
Bash on Ubuntu on Windows とX Windowの組み合わせで日本語表示と日本語入力: tonopぶらり
まず,uim-fep,uim-anthyをインストールします
次に,xtermをインストールします(多分他のソフトでもいけるんじゃないですかね)
$ sudo apt-get install xterm
uimの設定をします.~/.uimを適当なエディタで開き,以下を記述
(define default-im-name 'anthy)
(define-key generic-on-key? '("<Control> " "`"))
(define-key generic-off-key? '("<Control> " "`"))
反映するために一旦bashを再起動します.
再起動後xtermを実行し,xterm上で
を実行,左下に"anthy[An- R]"みたいなのが出てきます.この状態で,Ctrl+Spaceを押すと,"anthy[AnあR]"と変わり,日本語入力モードになります.これでターミナル上での日本語入力が実現できました.vimとか使って日本語のレポートも書けますね
まだできていないのが,任意のGUIアプリケーション上で日本語を入力することなのですが,これはどうやったらいいんでしょう...?わかりませんでした.
終わりに
というわけで,BoWを使ってみたのと,自分が試してみた設定でした.
正直仮想マシンとほぼ同じ感覚で使用できるので,あとはGUI上で日本語入力ができればもう仮想はいらない(?)かもって感じです.僕がまだBoWの不具合とかあまり知らないのかもしれませんが.PowerShell,コマンドプロンプトからbash開いた時点では,日本語が存在するだけでカーソル位置とかがずれたりしますね.
あとここで書いたことは一応権限の変更とか色々インストールしてるので,念のため,自己責任でお願いします.
2017/2/10:追記
3.日本語入力の対応について
コマンドプロンプトなど,純正でWindowsから提供されている環境でbashを起動した場合,日本語入力ができません.
この記事ではそれの解決策として,xtermというLinux用の端末を起動して,その中でuim-anthyで日本語入力を可能にしています.
wsl-terminal(https://github.com/goreliu/wsl-terminal)というものを教えてもらい,こちらならWindowsから起動したそのままの状態で日本語入力ができるようです.
4次元空間でプレイするテトリスとそれを自動プレイするAIの話
前に作ったゲームの解説的なお話です.
↓過去の記事
↓プレイ動画
はじめに
丁度2か月ほど前に,時間が空いていて,更にサークルで成果物発表会があったので,それに合わせてゲームを1つ作りました.
それが上の頭おかしい「4次元テトリス Tetris Dim.4」です.
DLはこちら↓
https://bitbucket.org/WGGSH/tetrisdim4/downloads/TetrisDim4_Ver0.60.zip
この記事は,4次元テトリスのルール解説と,AIの実装方法についての解説記事です.
4次元テトリスのルール
一般的なテトリスは「10×20」のフィールドで,「7」種類のブロックを回転させて1列全て埋めてラインを消すことを目的とします.
4次元テトリスでは,上記ルールをそのまま次数を2つ上げただけです.
細かい数字まで言うと,
「5×5×5×10」のフィールドで,「7」種類のブロックを「6」つの回転軸で回転させて「5×5×5」の空間を埋めて消すことを目的とします.
次数と,移動方向・回転軸・ブロックの種類の対応表は以下の通りです.
『なんで3次元の方が4次元よりブロックの種類が多いんだ?』
って疑問が出ると思います.
各次数のブロックを描いてみました
2次元
3次元
4次元(少し強引な可視化)
2→3次元
まず,2次元から3次元でブロックが1つ増える点についてみて見ます
上の画像に描かれている3つのブロックは2次元空間では表現できない為,3つ増えます
ところが下の画像ではそれぞれ2次元で2種類だったブロックが3次元になることで1つに統一できます.これは回転軸が増えたためです.
3個の増加と,2この減少,結果的に1つ増えて8種類になります.
3→4次元
では,3次元から4次元ではどうなるのでしょうか.
3次元から4次元になっても,新しい形のブロックパターンが増えることはありません.何故なら,4次元でしか表現できないパターンを作るには,ある1マスから別々の4つの軸の方向へ隣接するブロックが存在する必要があります.2次元から3次元にした時は,これが存在しましたが,3次元から4次元では存在しません.そもそも1つのパターンを構成するブロックの数が4なので,4方向に伸ばすためには構成するブロックが最低5つ必要になります.
対して,3次元で存在していた2つのパターンが4次元で増えた回転によって,同一視できるようになります.
結果,3次元と比べて,1つパターンが減り,合計7種類になります.
回転
上の表では4次元の場合,回転軸が6つと書いていました.
任意の次元数 n次元空間において,2つの軸からなる平面で回転する回転軸は(n-2)!個です.
有名なアレ
数学の教科書にも出てくるアレです(2次元版)
4次元では↓の様になります.この中で,sin,cosを使用する軸を2つ選ぶのですが,その組み合わせが6通り存在します.
という訳で,ここまでで一応4次元の動きについて軽く説明が終わりました(疲れた
こっからAI
さて,ここからAIの実装についてです.
といっても,適当にネットから参考になりそうな記事を拾ってきて4次元テトリスに対応させた程度の事しかしていないのですが...
↓参考にした記事たち
GitHub - takuma7/tetris-ai-generator: This program is to seek strong tetris AI with the power of GA
AIの基本的な考え方
今回作成したAIは「評価関数」を用いています
計算手順は以下の感じです
- ブロックを置くことができる場所を全て探す
- 1で見つけた場所全てに対して,ブロックを置いた後の状態を複数の観点から評価する
- 最も評価の合計点が高い場所が,「置くべき場所」
まぁ凄く単純です.単純ですが4次元にしたことでいくつか問題が浮上しました.
1.ブロックを置くことができる場所を全て探す
コンピュータの計算速度を利用して,全てのパターンをシミュレートします.
そのためには何パターン置くことができるか調べなくてはいけません.
ブロックの置く場所は「移動量」「回転角度」で決定します.
移動量は非常にシンプルです.フィールドサイズが「5×5×5×10」で,10は落下にあたるので,それ以外の「5×5×5」=125通りが上限です.当然,ブロックの形によってこれより少なくなることもあります.
ところが回転は,回転軸が6つと書いたのですが,回転順序が関わってきます.
例として,6つの回転軸をA~Fとすると,Aで90°→Bで90°回した形と,Bで90°→Aで90°回した形は同じになるとは限りません.これは行列の積が順番を変えると結果が変わるのと同じですね.
全ての回転後の姿勢を求めるには,(書く回転軸の角度パターン)^(回転軸の個数)×(回転順序の組み合わせ総数)で求められます.
つまり, (4の6乗)×(6の階乗)=2,949,120通りです(絶望
これに移動量の上限125を掛けるので......1手ごとにシミュレートすべきパターン総数は
368,640,000 通り(最大)
になります。無理です.計算しきれませんでした()
という訳で,大幅な妥協をすることにしました.
移動を妥協したら特定のマスにブロック置けなくなるので,こっちはスルーで,回転パターンを大幅に制限しました.
「6つの回転軸を好きな順番で回す」→「ある決められた3つの回転軸を指定した順番で回す」へと変更しました.
4次元のパズルが活かせていないかもしれませんが...やむを得ずそうしました.
これで2,949,120通り存在した回転パターンは64通りまで減りました(少なっ
移動と合わせても合計で,最大8,000パターンです
2.1で見つけた場所全てに対して,ブロックを置いた後の状態を複数の観点から評価する
ここが「評価」にあたる部分です.1で8000種類置くべき場所を見つけたので,それら全てを以下の判断基準から評価していきます.
- 最もブロックで埋まっている段のブロックの数
- 消した段の数
- Z(落下)座標が上から4マス以内に存在するブロックの数
- ホールの数
- 落下位置のZ座標
- 最大高度
まあこのぐらいにしました.これらに対して,「重み」をつけることで,AIの性格を表現することができるようになります.
1つずつ説明していきます.
1.最もブロックで埋まっている段のブロックの数
4次元テトリスでは1段消すのに125個のブロックが必要です(2次元なら10個)
これを効率よく積んでいくために,最もブロックで埋まっている段を調べて,その数を評価値にします.ブロックを平らに積んで,消すスピードが向上すると考えられます.
2.消した段の数
言うまでもないですね.ブロックを消すことがこのゲームのメインなので.
ここを,4段消せるとき以外は評価を低めに設定したりすると,4段消し(テトリス)を決めやすいAIをつくったりすることができます.
3.Z(落下)座標が上かrあ4マス以内に存在するブロックの数
これは少しわかりづらいですが,ブロックを高く積みすぎると,移動可能な領域が減り,難易度が大幅に向上します.そのため,ある程度高く積むことに対して,負の重みをつけることで可能な限り回避します.
4.ホールの数
ブロックの下に空いているマスがあると,その段を消すためには上の段を消さなければいけません.2次元なら10個のブロックで消すことができますが,この4次元テトリスでは125個必要で,非常に負担がかかります.正直言うと一度ホールをつくったら,それを修復するのはほぼ不可能です.そこで,ホールを作ることに対して負の重みをつけて,回避します.
5.落下位置のZ座標
1と3があるのでこれは無くてもよかったかもしれません.より平らに積んでもらうために,低いところに置くと評価が高くなるようにしています.
6.最大高度
同じく,不要だったかもしれません.これも平らに積むための評価基準です.
これらの評価を用いて,「最も評価の高い移動場所」を決定します.
3.最も評価の合計点が高い場所が,「置くべき場所」
あとは簡単です.2で決めた場所に対してブロックを移動させるだけです.
おわり
以上,4次元テトリスのルールとAIの作成方法についてのメモ兼説明でした.
良かったらプレイしてみてくださいね
DLリンク↓
https://bitbucket.org/WGGSH/tetrisdim4/downloads/TetrisDim4_Ver0.60.zip
4次元空間でプレイするテトリス「TetrisDim.4」を作りました
ちょっとゲーム作ったので公開します
4次元空間でテトリスをプレイする「TetrisDim.4」というゲームです
Dxライブラリを使用して制作しました
まだ未完成ですが,公開します
ダウンロードはこちら↓
https://bitbucket.org/WGGSH/tetrisdim4/downloads/TetrisDim4_Ver0.60.zip
ルール
基本的にはテトリスと同じです
ですが,4次元にするにあたって一部改変されています
描画自体は3Dテトリスを複数並べる形式なので,あまり4次元らしさは出ていないかもしれませんが...
移動方向が8方向に
X,Y,Z,W4つの軸があり,そのそれぞれが+-に移動できます
十分に思考できるように,自動落下は存在しません
回転が6種類
4次元空間で回転を行う場合,二つの軸からなる平面での回転は全部で6種類存在するので,6種類(逆回転を含めると12)の回転が行えます
落下するブロックの種類が変更
4次元空間内で4つ繋がった形状のブロックが落下してきます
総数は7個と,従来の2次元テトリスと同一ですが,形状が変わっています
自動プレイモードもあります
恐らく初めてプレイする方は操作難易度が高く,まともにプレイできないと思いますので,自動プレイする人工知能を作成してみました
よければ積み込みの参考にしてみてください(参考にならないかも
注意事項
・Windows用です
・ゲームパッドはXInput形式のみ対応しています
・画面サイズ:1600×900 今後変更可能にする予定です
一応,ソースコードも公開しています(多分かなり汚い
https://bitbucket.org/WGGSH/tetrisdim4/src
よければ,プレイしてみてください!