思うだけで学ばない日記 2.0

思うだけで学ばない日記から移転しました☆!よろしくお願いします。

問題提起するわ

問題提起するわ

xxx.....■■........._.■■■■■■■
                                                                                        xxxx■x■xx■
                                                                                        ■■■■


■ ■■■■
xxx.....■■■■■........._.■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■x■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

■■■■■■■■■■■■■■■■■■■■■■


■ 問題提起
[既存のコンピュータ将棋]
(特徴)
1. 優れたプレイヤー同士の棋譜を学習サンプルとする。
2. 学習サンプルで評価関数を調整する。
3. 2で調整した評価関数をそのまま対戦時の局面評価にも使う。

(問題点)
1. 「優れたプレイヤー同士の棋譜」が必須である割に、「優れたプレイヤー同士の棋譜」とは何であるかがシステムの中で十分には規定されていない。
   このため学習サンプル集めに人間(システムの外の存在)の関与が必要
2. ボナンザメソッドの結果を見てパラメータ数をスケールさせるのも人間(PPT、KKP + KPP、KPPP、KPPT、KKPT...人間がこれらを進化させている。
3. 異なる棋風(最善手(必勝手)が複数ある局面での選択の好み)のn駒間の関係ベースでのグローバルな合算が現実の調整手段で常に最良の結果をもたらすのか、確定的な結論は出ていなさげ


■ 提案する方法
[xxx.....■■■■■........._.■]
(特徴)
1. 全力で戦って負けたケースの棋譜を学習サンプルとする。
2. 学習サンプルから局面の場合分けを学習し、評価関数の調整は場合毎に行う。
3. 対戦時の局面評価には軽量な評価関数を使う(1つの場合の中の形勢だけ説明できれば良い

(既存手法の問題点を解決する手段)
1. 「全力で戦って負けたことを学習サンプルの条件とする」という明確な基準がシステム内にあることから、
   学習サンプル集めが真に全自動化される。(「優れたプレイヤー同士の棋譜」が何であるかについて悩む必要が無い
2. 学習サンプルの数が増えるにつれ局面の場合分けが勝手に細分化することで、パラメータ数のスケール相当の作業も全自動で進行
3. 対戦時の評価関数は1つの場合の中の形勢だけ説明すれば良いので、個々の場合の中で異なる棋風の交絡は起き難い。

なお、学習サンプル集めは特徴1さえ満たせばオンライン学習でもバッチでも可能


■ 局面の自然な場合分け
終盤の局面から場合分けを学ぶ。次の通り、終盤の局面は考えやすい。

1) 終盤の局面は、玉に睨みを利かせている駒(必要な駒)と、そうでない駒(不要な駒)からなる。
   必要な駒の集合をキーにして分類すればまず間違い無い分類になる
    - 必要な駒は取られては困るので高い得点とし、不要な駒は捕られてもかまわないので低い得点とすれば、
      勝利という目的に局面評価を自然に整合させられる。

2) 終盤より前の局面においては駒の要/不要がはっきりせず、うまい分類キーを見出せそうにない。
   これは当方の終盤力が継続的に上昇し、「終盤の局面」の範囲が拡大し続ける ・・・(仮定1)
   という仮定の下で、考えないこととする。


■ 終盤局面内の「必要な駒」の抽出
局面をbag of KPPsとみなしてベイジアンフィルタを適用する。
このときの勝利/敗北の教授信号(局面に対する勝利/敗北のラベル付け)は、
「局面別の勝敗推定」で述べる手段で推定して与える。

■■■■■■■■■.■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■.■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■.■■■■■■■■■

■■■■■■■■■■■■■■■■■■■x■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

■■■■.■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■...(.(■■■■■..■■■■■(.,.,.))/.(■■■■■..■■■■■(.,.,.)))■
(■■■■, ■■)■■■■■■■■■■■■■■■■(■■■■, ■■)■■■■■■■■■■■■■■■■■■■■■

■ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

なお、仮に教授信号が当方の敗北ばかり(勝利が0件)で連続した場合に備え、次の仮定をおく。
    当方が全力で戦って負けたのであれば、相手の指し回しから学習すれば(同じ負け方が回避されることにより)強くなれる ・・・(仮定2)
この仮定の下では、相手の指し回しは勝利の学習サンプルとみなせる。


■ 局面の場合分け
局面ごとの勝利/敗北の教授信号が与えられる前提で(その手段は「局面別の勝敗推定」で述べる
    局面(盤面)を適当な固定長ベクトルに変換
すれば、いかような手段でも教授信号に従い局面を分類できる。

分類器はここでは線形分離×決定木を使う。

盤面の適当な固定長ベクトルへの変換については…
前回は
  玉に睨みを利かせている駒を知りたいのだから駒の座標に注目すべきである
  → 任意の座標変換を表現し得るベクトル表現にしよう(座標の差や平均が勝手に特徴になるハズだ
と考えて変に複雑化してた;
(置駒・持駒・上手/下手毎の駒の個数が変動するから、
 盤全体の駒の座標は形勢判断にとって意味のある形ではたいへん固定長ベクトルにし難い

■■■■{■■■■}■{■■}■■■■■xx■■■■■■■■■
■■■■■■■(■■■■, ■■)■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■


■ 局面別の勝敗推定
当方が全力で戦って負けたとして、投了付近では
    1. +の評価値の期間が連続
    2. -の評価値の期間が連続
    3. 投了
という経過を辿るはずである。(頓死等、2の期間の長さが0手のケースもある。)

1の期間の当方手番局面は、当方が形勢判断を誤った局面と考えられる。
ただし、相手が優勢だったとする確証は乏しい。
(∵当方の形勢判断能力不足で相手が助かった可能性がある。

2の期間は、当方が全力で戦って評価値を覆せなかったのだから、相手が優勢だったのだとかなり確信を持って言える。
少なくとも仮定2の下では、相手手番を勝利の学習サンプルとみなして問題無い。

よって、2に属する局面の当方手番を「敗北」、相手手番を「勝利」とラベル付けして学習サンプルとする。


■ 評価関数の調整
上記1の期間に属する当方手番局面を分類器で場合分けし、その場合に対応する評価関数の評価値を下げる調整を行う。
(ボナンザメソッド風にパラメータを振って探索し、評価値が下がるポイントを探す


■ その他
Futility purningやnull move purningのしきい値を自動調整するしくみを備えています。
(一定回数ごとにpurnせずに探索し、結果を蓄積→ヒストグラムの上側x %点をしきい値にする。


■ F.A.Q.
Q1. 最適化の行き届いた探索部を有するソフトに勝てますか(・∀・)?
A1. 機械が全自動で行う局面の場合分けのたゆまぬ細分化とpurningしきい値の自動調整によりそのうち勝てる日も来るのではないでしょうか。
  (対戦相手が開発に飽きるまで続ければ。)

Q2. 評価関数はどういうものですか。
A2. 駒の移動の可能性は探索でもって確かめるとして、評価関数では
        駒がそこに居る価値
        駒の攻撃可能性
    だけを評価します。
    具体的には次の通り。
///     - 相手玉への利き
///     - 相手玉の退路への利き  (退路=相手玉の利きの中の空白マス)
///     - 相手玉の守りへの利き  (守り=相手玉の利きの中にいる相手の駒)
///     - 相手玉の突破口への利き(突破口=相手玉の利きの中にいる当方の駒)
///     - 相手玉に近い段への利き
///     - 相手駒への利き
///     - 自駒への利き
///     - 相手からの利きに対する反撃可能性
///     - 相手からの利きに対する当方利きの優越

Q3. 最適化の行き届いた探索部を有するソフトにいつ勝てますか(・∀・)??
A3. わかりません。


以上

問題提起いじょ。

【速報】826aska クリスマスコンサート2017

福井キタ━━━━━━(゚∀゚)━━━━━━!!!!(いや漏れが、

あしあとを記す。
漏れの記憶が正しければ曲目は下記のとおりじゃった([新]は初お披露目*1

チョー感動すた、

なお今回初めて行って初めて知ったことには、826askaのライブは、グッズを2000円以上買い求めると826aska当人と2ショット写真が撮れて握手もできるというしきたりである模様
あとペンライトはあったほうが断然良い
座席は逃げないので、入場したらすみやかにグッズ売り場に並んで買えばよかったorz

あと今日は今年の1/3から数えて40回目の公開ライブ演奏だったそうな(テレビとラジオ含む

来年からはきっと826askaのライブのスタイルはがらりと変わるであろう、
というわけで今日のライブに参加したことで漏れは歴史の証言者になった、

■ 826aska クリスマスコンサート2017曲目
1. スターウォーズメドレー
2. ドクターXメドレー
トーク
3. パイレーツ・オブ・カリビアン メドレー
4. 銀河鉄道999(TV版OP+ゴダイゴの劇場版OP)
5. ルパン?世のテーマ'79
トーク
6. 定番のクリスマスソング(short) [新]
7. 天使のくれた奇跡(USJで冬かかるやつ)[新]
(パパ登場、トーク
(826askaサンタコスで登場、トーク、プレゼント企画、会場内記念撮影)
<RYO登場、以下RYOのドラムとコラボ>
8. 007メドレー
9. TRUTH
トーク: RYO×826askaとのユニット名、「アルコバレーノ」公表
-- イタリア語で「虹」、 告知無しで現れたり消えたりする意味とのこと)
10. 千本桜

<以下826aska独奏に戻る>
11. 糸(中島みゆき)[ライブ新?]
12. Canon Rock
トーク「糸」について/会場内後悔なし確認(自身のtwitterでの「絶対後悔させない」宣言を受けて))
(全ての人に感謝の気持ちをこめて、最後の曲)
13. 威風堂々
(826aska退場)

(会場内アスカコール)
(826aska再登場 衣装3: 金ラメ入り白ドレス、以下アンコール)
14. 君の瞳に恋してる
(RYO再登場「アルコバレーノ」としてラスト曲)
15. (曲名不明)[新?]
(カーテンコール)


■ 2017-12-29T19:03追記
15曲目がわかった!
公式キマシタワー
【黒い炎 Get It On】by Arcobaleno (826aska兄妹ユニット) エレクトーン&ドラム演奏

ていうかふとオモタがなんで16曲でないんや…
上のリストはなんか1曲ぐらい抜かしてるかもしれん…

*1:15番目の曲はわからんかったがそのうち誰かがtwitterでつぶやいてくれるであろう

チケットktkr、

つついにチケットのコンサートをゲットすた!(興奮

『826aska クリスマスコンサート2017』!(バーン!!11!!1

826askaはこんな人↓↓↓
https://www.youtube.com/watch?v=w73F0m0dOnU(2年前の動画
この4月からJKになりました!
あとwikiとか公式とか、

定番のやつ↓
https://www.youtube.com/watch?v=Yp5HpjhKHKs

別Ver.
https://www.youtube.com/watch?v=mkej9bJjCYg

ひたすらカコイイ
https://www.youtube.com/watch?v=RZRGSVy8I5w

呼ばれればどこにでも赴いて、弾く弾くとにかく弾く!
https://www.youtube.com/watch?v=wZEsNV7_h2g
https://www.youtube.com/watch?v=r-TgTDZL7Wk
https://www.youtube.com/watch?v=1dRRpmb0GP4
https://www.youtube.com/watch?v=IlyHGksRAh0
全てこの4月以降に起きたことである…*1

あとアンコールにも余裕で応えたり
https://www.youtube.com/watch?v=g7kTv35EmCs

なんかもう活動の質と量とサービス精神と軸のブレなさがもはや偉人レヴェル;;

個人的には『(リベラ)彼方の光』『未来のトビラ』は音だけでも安心して聞ける
*2

*1:しかも他にもまだまだ動画がある…

*2:いや音楽のことは一切わからないので知らんけど…個人の感想です!!

凄すぎるYouTube動画

この業界は全くのにかわなので約1時間前まで知らなかったのだが今知ったので感動のあまり貼る、

■ダニエル・バレンボイムがピアノ協奏曲第5番をフルオーケストラを指揮しながら弾ききる(40分暗譜!(!)

ダニエル・バレンボイムはこんな人↓↓↓
http://www.tomotrp.com/entry/dirigend
このページをスクロ─────ルしていくと出てくる、
あとwikiとか

大勢居るオーケストラメンバー(上のページの通り「一人一人がとんでもない競争を勝ち抜いてきた人たち」)を率いて完璧な演奏に持ち込むだけでも極めつけの難事業だと思うが*1、指揮と同時に行うピアノ演奏がこれまた超絶技巧で手の動きにマジ目が釘付け\(^O^;)/

1時間前までは人間の奏者とか居なくっても打ち込みで完璧な演奏ぐらいできるもんねフフーン とか思ってたが今はあまり自信が無い…

まったく人間ってのは

どん
だけ、、

*1:メンバーに舐められたらそこでハイ終了である。卓越した音楽的センスと政治的駆け引きの才能を併せ持っていなければ勤まらない。

CUDA×Chainer(or TensorFlow)でDeep Learningするための環境構築レシピ

土用丑の日には「う」の付くものを食すとよいという古来からの慣習に従いUbuntuを食す、

ついでに今世紀最大(決定済)のパズワード「Deep Learning」のお勉強用環境を3時間で作る、

実現する環境

この記事のねらい

  • CUDA×Chainer(or TensorFlow)な環境が緊急に欲しかったのでついカッとなってやった
  • こういう流行の技術の具体的環境構築方法の情報は新参の参入障壁を高めるために通常は奥ゆかしく出し惜しみすべきだが、今やSoftware Designの最新号で具体的なCUDA導入ステップが示され公知となってしまったからもはや隠す理由はない。
  • とはいえ、上記記事のやり方では(実は)RDPでのGUIログインと両立しない問題がある。
  • Ubuntuはいつも端境期にあり、情報がトピック別にひどく散在している。(ていうか古い情報ばっかりひっかかって調査を妨害される。

以上の理由により、ここにまとまった情報として包括的な環境構築レシピを示すもの也、
当記事を読めば、筆者のようなパソコン初心者が思い描くリッチGUIベースなUNIX環境がなんとタダで手に入る…!

使用機材

筆者が使用した環境を一応再現性担保のために記す、

キーボードはWindowsキーがあるやつ推奨。

  • [補助PC]
    • Windows 7 PC
      SSHやRDPによる接続テストに使用する。
  • [DVD-R]
    • 2枚

導入ステップ

Ubuntuの選定

本家を参照すると2017/8/13時点でだいたい次の選択肢がある。

  1. Ubuntu 16.04.3 LTS Desktop
  2. Ubuntu 17.04 Desktop
  3. Ubuntu 16.04.3 LTS Server
  4. Ubuntu 17.04 Server

筆者は最終的に2番(17.04 Desktop)を選んだ。
選定理由はこれ

インストールメディア作成

選定したUbuntuのisoファイル“ubuntu-17.04-desktop-amd64.iso”をダウンロードしてDVDに焼く。
今日日はISOファイルを焼くソフトもタダで手に入る。筆者はISO Workshopを使った。
これを起動して*2、「Burn Image」ボタンを押すと焼ける。

インストールメディアは別にUSBメモリでも良いらしいが試していない。

Windows 10とのデュアルブートのための準備

Ubuntuのインストール先HDD領域を確保する。
ターゲットPCはWindowsプリインストールPCであり、初期状態では下記パーティション構成であった。

ディスク 項番 容量 内容
0 1. 100 MB EFIシステム パーティション
2. 1.86 TB Windows (C:)
3. 891 MB 回復パーティション

Ubuntuをインストールする隙間が無いので、項番2「Windows (C:)」の縮小で空き領域を確保する*3

手順は基本的に下記の記事に従う。当該記事にはWindowsのインストールディスクが要る、みたいなことが書いてあるが、ここではすでにWindowsが入っているHDDを使うので不要。また、縮小対象パーティションの使用状況にもよるかもしれないが、「Revo Uninstaller」も導入することなく、Windows 10の機能とUbuntuの上記インストールDVDだけで何とかなった。

Windows 7Ubuntuが仲良く共存できるデュアルブート環境の作り方
https://www.lifehacker.jp/2009/11/windows_7ubuntu.html

コンピュータのC:ドライブ上にどの程度の空き容量があるのかを確認し、
スタートメニューの検索ボックスに"disk management"と入力し、エンターキーを押します。
Windows 7はハードドライブ上に2つのパーテェションを作成します。
そのうちの一つは100MBほどの大きさでシステム復元に必要なデータを格納しているので、
これには触らないでください。大きいほうのパーティションを右クリックし、
パーティションを縮小」を選択。

この「パーティションを縮小」操作を行う前に、WindowsパーティションWindowsによる占有領域を極力縮小しておくほうが当然良い。
筆者はデフラグをかけた後、(上記リンク先から参照している)下記サイトの手順に従い、最終的に300 GBの空きを捻出した。

■ How to Get Around Windows’ “Shrink Volume” Inadequacy Problems
https://www.howtogeek.com/howto/windows-vista/working-around-windows-vistas-shrink-volume-inadequacy-problems/

1. Run the Disk Cleanup Wizard, making sure to remove the hibernation file and all restore points.
2. Disable System Restore
3. Disable the pagefile ( Open up System in Control Panel, then Advanced System Settings?\ Advanced \ Performance \ Advanced \ Change \ No Paging File.
4. In the same Advanced Settings, go to Startup and Recovery \ Settings and then change the Write debugging information drop-down to “None” to disable the kernel memory dump.
5. Disable Hibernation mode in your power options \ advanced power options screen.
6. Reboot the machine, and then delete your c:\pagefile.sys file, following these instructions if you are having issues.

■ How to Disable System Restore in Windows 7, 8, or 10
https://www.howtogeek.com/howto/windows-vista/disable-system-restore-in-windows-vista/

■ How to Delete a System File in Windows 7 or Vista
https://www.howtogeek.com/howto/windows-vista/how-to-delete-a-system-file-in-windows-vista/

takeown /f C:\Windows\System32\en-US\winload.exe.mui
cacls C:\Windows\System32\en-US\winload.exe.mui /G geek:F

Windows 10だからかメモリが潤沢に積んであるからか知らないが、実際にはステップ6は“c:\pagefile.sys”が存在しなかったため不要だった。(というわけで最後の引用のtakeownコマンドやcalsコマンドでのACL属性変更とかは実際にはやらずに済んだ。)環境依存かもしれないので、一応情報は提示しておく。

以上の操作を行った後「パーティションを縮小」操作を行うと600 GBぐらい縮小できると出たので、今回は300 GB縮小することとし*4、次のパーティション構成となった。

ディスク 項番 容量 内容
0 1. 100 MB EFIシステム パーティション
2. 1.86 TB Windows (C:)
3. 307.6 GB 未使用領域 ← New!
4. 891 MB 回復パーティション

Ubuntuのインストール

インストール

上で焼いたインストールDVDを光学ドライブに挿入し、DVDから起動する。

具体的操作はPCによるが、今回のターゲットPCでは次の通り。

インストールDVDを電源投入後すかさず光学ドライブに挿入し、ただちにキーボードの[F2]押下→[F8]押下。BOOTメニューが出るので、ここで光学ドライブを選択して[ENTER]でUbuntuインストーラが起動する。

(TODO: 画像追加)

Live CD BootかInstall Ubuntuか聞かれるので、「Install Ubuntu」を選択し、[ENTER]

(TODO: 画像追加)

言語を訊かれるので、「日本語」を選ぶ。*5

「Prepare disc space」画面に移るので、「Specify partitions manually(パーティションを手動で指定)」(上から3番目の項目)を選択する。

(TODO: 画像追加)

「インストールの種類」画面にディスク0のパーティション一覧が現れ、その中に先ほど捻出した300 GBがあるはずだ。これをマウスで選択して右クリックしするとこんな画面が現れるので、下記設定で「/boot」パーティションを作る。

[OK]をクリックするとしばらくHDDに書き込みが行われた後「インストールの種類」画面に戻る。

作成された「/boot」パーティションの後ろに300 GBの空き領域があるはずだ。これを右クリックし、下記設定で「/」パーティションを作る。

[OK]をクリックするとしばらくHDDに書き込みが行われた後「インストールの種類」画面に戻る。

次に、「インストールの種類」下部の「ブートローダをインストールするデバイス」として、さきほど作成した「/boot」パーティションのデバイスを指定し(重要)、「インストール」ボタンをクリックする。以上

パーティションは「/boot」と「/」の2つを作成するだけでUbuntuは動く(らしい)。

以降は基本的に画面の指示に従い「次へ」を連打する。途中で管理者の名前、マシン名、管理者のアカウント名、管理者のパスワードを聞かれるので適当に入力する*6

そのうちめでたくGUIログイン画面が表示されるはずだ。

インストール後最初にやるべきこと

vimぐらいは入れておこう。デスクトップを右クリック→「端末を開く」クリックすると端末が出る*7ので、

$ sudo apt install vim

を実行する。以下粛々と進める。

Ubuntuでホームディレクトリの中身を英語にする
http://qiita.com/taiko19xx/items/d1a001bfc25245b91354

$ LANG=C xdg-user-dirs-gtk-update

Ubuntu Server 16.04 コンソールでの文字化け対策
http://qiita.com/ihyomo/items/a66660f11cfa9f9668b4
“~/.bashrc”に下記を追加。場所はファイル末尾で良い。

case $TERM in
    linux) LANG=C ;;
    *) LANG=ja_JP.UTF-8 ;;
esac

SSHサーバ導入

$ sudo apt install ssh
RTCのタイムゾーン解釈の変更

WindowsUbuntuデュアルブート構成特有の問題として、OSを切り替えたら時計が9時間ずれるというのがある。

下記ページに従い対策する。
Ubuntu 16.04で9時間ズレる
https://ameblo.jp/miyou55mane/entry-12178518055.html
ただし上記ページの「従来の手法」はNG。あくまで16.04以降のための次の方法でやる。

$ sudo timedatectl set-local-rtc 1

この設定はRTCの時刻をローカルタイムとして解釈させるという意味で、実は問題が無きにしも非ずらしいが、反対にWinodowsのRTC解釈をUTCに変更するとWindowsの自動時刻合わせが失敗するようになる(らしい)。
ここはWindows優先で、Ubuntuに曲げてもらう。

知っておくべき操作
  • 日本語入力モードのON/OFFは[Windows]+[スペース]
  • [Ctrl]+[Alt]+[t]で端末が出る。
  • 画面左端に並んでいるアイコンの上から2番目がファイラー(Explorerみたいなもの)
  • 隠しファイルや隠しディレクトリを見るには端末から「ls -la」
  • [Ctrl]+[Alt]+[F1]でTTY1が開く(CUIベースのログイン画面に切り替わる)
    以下同様に、[Ctrl]+[Alt]+([F2]〜[F6])でTTY2〜TTY6がそれぞれ開く。
  • [Ctrl]+[Alt]+[F7]でGUI画面に戻る。
  • GUI画面からのログオフは右上の歯車アイコンをクリックして行う。
  • [Ctrl]+[F1]でショートカットのヘルプが出る。
  • GUIのサービスの停止はTTYでログインして「sudo service lightdm stop」

※ [Ctrl]+[Alt]+[ファンクションキー]はRDP接続時は無視されるっぽい?

WindwsのパーティションWindows (C:)」(NTFS)のUbuntuからのアクセス

これはもう単純にUbuntuから「/Windows」でアクセスできる。

SSHによるリモートログインのテスト

補助PCで秘密鍵と公開鍵のペアを作成する。

Git使いならPuttygenが入っているはずなので、下記ページに従いまずSECSH形式の公開鍵ファイル(*.pub)を作成する。

SSH接続を設定したい(Windows)
http://www.backlog.jp/git-guide/reference/ssh.html

次に、作成した公開鍵ファイルを(USBメモリか何かで)ターゲットPCの適当な場所(ホームディレクトリ「~」とか)にコピーする。

ターゲットPCのホームディレクトリの下に「.ssh」フォルダを作る。

$ mkdir ~/.ssh

下記ページに従い「.ssh/authorized_key」に公開鍵を記録

■ 公開鍵の形式を変更する
http://qiita.com/marcie001/items/47a23cfeed00db783d39

ssh-keygen -i -f id_rsa.pub >> ~/.ssh/authorized_keys

補助PCにTeraTermをインストールする。

TeraTermを開き、下記ページに従い接続テストを行う。

SSH 接続
https://ttssh2.osdn.jp/manual/ja/usage/ssh.html

elcome to Ubuntu 17.04 (GNU/Linux 4.10.0-32-generic x86_64)
...

と出てコマンドプロンプトまで出たらOK。

Ubuntuの復元ポイントを作成

ここからは脳外科手術同然の複雑で精密なオペレーションが必要とされる。患者が死んでしまったときの用心のため(マテ、
復活の呪文を用意しておく。

何やらネット上にはUbuntuにシステム復元ポイントはないのかと取り乱していらっしゃる方も散見されるが、これは簡単な話で、上でUbuntuをインストールしたパーティション(「/」)のディスクイメージを保存(バックアップ)しておけば宜しいい。

ディスクイメージ保存には、Ext4が扱えるやつなら何でも良いがここではClonezillaを使う。
細かいことは次の神解説を読めばワカル。

■ (Linux) ext4パーティションのバックアップをClonezillaで行う
http://netlog.jpn.org/r271-635/2014/09/linux_ext4_clonezilla.html

筆者は最新版ということで、“clonezilla-live-2.5.2-17-amd64.iso”をダウンロードしてDVDに焼いてバックアップを遂行した。
イメージファイルの保存先はUSBの外付けハードディスクとする。保存先ディレクトリを指定できるので、保存先HDDにもともとあったデータをそのまま保持可能。
インストール直後のUbuntuの状態なら、イメージファイルのベリファイ込みで5分でバックアップが終わる。

リモートデスクトップ(RDP)接続

Ubuntu 16.04を選んでしまって地獄めぐりをさせられた(しかも結局不成功に終わった)RDP接続だが、17.04だとマジ簡単。
次のページに従えば万事OK。

■ XRDP – How to install XRDP on Ubuntu 17.04 – Easy Way
http://c-nergy.be/blog/?p=10448

$ sudo apt-get install xrdp

これでWindowsGUIで繋がって日本語入力できて相互にコピー&ペーストもできる上に、ログインしたままRDP接続を一時切断もできる(再接続したらもとの画面が開く)。

上記ページを読めばだいたいワカルはずだが、接続手順にはややクセがある。下記に注意。

  • 「Session」は「Xorg」を選ぶ。
  • ユーザー名とパスワードはターゲットPCのアカウント名とパスワードを入力する。
  • GUIセッションは同時には1つだけが可能。ターゲットPC上で誰かがGUIログインしている間はRDP接続できない。
    (TTYログインやSSHでのリモートログインとの併用は実験する限りOKのようである。)
  • ログイン済み状態での再接続で無い限り、接続に成功すると真っ黒な画面になる*8
    マウスで右クリック→コンテキストメニューが出て、「端末を開く」を選ぶと端末が表示されるので、次のコマンドを入力してGUIをアクティブにする。
$ exec unity
  • 「端末を開く」を選んでも真っ黒な画面のままのときは、右クリックで出るコンテキストメニューの「配置を維持する」のチェックを外してから改めて「端末を開く」を選ぶ。

UEFIの設定

CUDAドライバを読み込ませるために、まず*9UEFIと戦わねばならない。なぜなら、UEFIは署名無しのドライバの読み込みを拒否し、CUDAドライバは署名を持たないから(らしい)。

下記ページに従い、野良ドライバも読み込めるようにする。

■ How to Disable or Enable Secure Boot on Your Computer via ASUS UEFI BIOS Utility
https://www.technorms.com/45538/disable-enable-secure-boot-asus-motherboard-uefi-bios-utility
概要としては、UEFIのPK、KEK、DB、DBXの4種類のキーをUSBメモリに保存した上で、PKキーを削除する。
何を言っているのかわかんねーと思うが、筆者にもわからん…
しかしDeep Learningが支配するこれからの世の中においては、操作と効果の相関さえ見出せれば十分である。とにかく意味など考えずに上記ページの手順に従うと良い。


CUDAのインストール

Software Designの8月号に行き届いた説明があるが、その手順に従ってしまうとRDPで接続できなくなるという罠がある。*10

解決策は、下記ページのインストール手順に従うと良い(と思うが今現在トライ中。)

■ Ubuntu14.04にNVIDIAドライバーをインストールしたらGUIログインできなくなったときの話
http://qiita.com/tanakatsu1080/items/c97c4ea3b1d349e2f718
https://devtalk.nvidia.com/default/topic/878117/-solved-titan-x-for-cuda-7-5-login-loop-error-ubuntu-14-04-/

sudo apt-get update
sudo apt-get install -y build-essential wget

# /etc/modprobe.d/blacklist-nouveau.conf を作成する
## 内容は以下
## blacklist nouveau
## options nouveau modeset=0

sudo update-initramfs -u

# 再起動する
sudo reboot

# CUI(Ctrl+Alt+F1)でログイン

# NVIDIAのドライバとCUDAをサイトからダウンロード
wget http://us.download.nvidia.com/XFree86/Linux-x86_64/367.57/NVIDIA-Linux-x86_64-367.57.run
wget http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda_7.5.18_linux.run

chmod a+x NVIDIA-Linux-x86_64-367.57.run
chmod a+x cuda_7.5.18_linux.run

# X Serverを停止
sudo service lightdm stop

# openglなしでNVIDIAドライバをインストール
sudo ./NVIDIA-Linux-x86_64-367.44.run --no-opengl-files

# CUDAをドライバインストールなしでインストール
sudo ./cuda_7.5.18_linux.run --silent --no-opengl-libs --toolkit

# 環境変数追加
echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_ PATH' >> ~/.bashrc
echo 'export CUDA_PATH=/usr/local/cuda' >> ~/.bashrc
source ~/.bashrc

セキュリティー対策

CUDAインストールまで万事うまくいったら、Clonezillaでバックアップでも取った後に下記セキュリティー対策をやっておくべき

Ubuntu 最低限抑えておきたい初期設定
http://qiita.com/kotarella1110/items/f638822d64a43824dfa4

あくまで自己責任で!

補足

Ubuntu 17.04 Desktopを選定した理由

(バージョンの選択)
最初16.04.3 LTS Serverを選んだが、GUIでの日本語入力IMEの設定にちょっと手間取ったのと、RDPが最後まで動いてくれなかったため放棄。

16.04におけるRDP事情についてはここ参照…スゲーややこしい。17.04にしたらすっきりする。17.04 Desktopにしたら両方すんなり動いて給与が上がって彼女もできました!

(ServerかDesktopか)
リモートログインして使役したいだけでメールサーバにもWebサーバにもするつもりはない、というつつましい利用目的の場合はServerを選ぶ理由は全く無い模様
ServerはSSHサーバが最初から入っているが、Desktopには入っていない。筆者が触った範囲ではこれぐらいの違いしか表面化しなかった。SSHサーバのインストールは本文中に述べるように「sudo apt install ssh」で後から簡単にできる。

(その他の選択肢)
ubuntulinux.jpという所が日本語Remixを配布しているようだが後から気づいたので試していない。

仮想環境ではダメなのか、

一言で言って現状ダメである。下記の通り、Hyper-VでもCUDAアクセスができない。筆者は実は最初Hyper-VのゲストOSとしてUbuntuを動かしたが、PCI-Eに挿したグラフィックボードが見つかりすらしねえ!

UbuntuGPGPU+TensorFlowを実行
http://msyksphinz.hatenablog.com/entry/2016/03/20/020000

■ Windows10を導入した
http://msyksphinz.hatenablog.com/entry/2016/03/14/020000

Hyper-V上のUbuntuにTensorFlowのインストール
http://msyksphinz.hatenablog.com/entry/2016/03/16/024623

Hyper-V経由でGPGPUを利用することは無理?
http://msyksphinz.hatenablog.com/entry/2016/03/17/020000

VMware vSphere ESXiを試す + GPGPUの認識に挑戦
http://msyksphinz.hatenablog.com/entry/2016/03/19/025533

UbuntuGPGPU+TensorFlowを実行
http://msyksphinz.hatenablog.com/entry/2016/03/20/020000

UbuntuGUI

17.04はUnityだが、次のリリースからはGNOME2ベースのものになる(戻る?)らしい…
やっとうまくいったRDP周りの話がひっくり返りそう?


(参考)
■ お勧めのLinuxデスクトップ環境6選--「KDE」から「LXDE」まで
https://japan.zdnet.com/article/35051532/

ひょっとしたらGUIベースの接続はRDPとかでなくてX Window Systemプロトコルでやるのが万古不易で安牌なのかもしれないが、日本語入力とかセキュリティーとかどうなのか全くわからないのでパス。今回は調査していない。

何しろパソコン初心者やし…

*1:ディスクイメージ保存にこの記事ではClonezillaを使うが、これの扱えるフォーマットなら何でも良いはず。

*2:Windows 10では管理者権限での起動が必要。

*3:ターゲットPCはロープロファイルのケースだったなのでケース内にHDD増設スペースとか無かったorz

*4:表示された容量をそのまま縮小しようとすると「ディスク領域が足りません」とか言われて縮小できなかった。

*5:試していないが「English」のままだと後で日本語入力とかLANG=ja_JP.UTF-8が必要なシチュエーションとかで苦労が追加されると思う。

*6:動作の再現性確保のため、余計なダウンロードを開始しかねない余計なチェックは一切入れないこと。

*7:もしくは、キーボードで[Ctrl]+[Alt]+[t]でも出る。

*8:青緑色の画面のままのときは失敗。しばらく待つとメッセージが出る。

*9:実際は筆者はドライバインストール後に気づいたので順序はドライバインストール後でも良い感じだが、

*10:OpenGLのライブラリインストールが悪さするらしい。

Q.未使用引数の注意文出力を回避するには

なんかスゲー混乱したQ&Aを見たのですが、
ttp://okwave.jp/qa/q2713705.html
こんなん引数をvoidにキャストしたら終わりやん…?
つまり

#define UNREFERENCED_PARAMETER(a) ((void)(a))

void foo(int a, int b, char* c, double d) {
  UNREFERENCED_PARAMETER(a);
  UNREFERENCED_PARAMETER(b);
  UNREFERENCED_PARAMETER(c);
  UNREFERENCED_PARAMETER(d);
  /*NOP*/
}

とか、もっと簡潔に

void foo(int a, int b, char* c, double d) {
  (void)(a, b, c, d);
  /*NOP*/
}

とかのが移植性的に正しい!

これでVCで/W4とかしたときのウゼーwarinigとも永遠におさらば

ちな再発明してしまった後にVS2015のスケルトンを見たらやっぱそういうのを見た

置換表は煩雑です!

直前のエントリのはシンプルなネタだが、いざ実際に実装しようとするとカナーリ面倒なことに気がつく、
いや複雑な作り込みを要するという意味ではなくて、慎重に考えねば意図したものとは全然違った確率の計算になってしまう危険性が多きいすぐる、
ぶっちゃけ結論を言えば、ここでの正しい考え方はつぎのようなものだる。

  1. u_iやc_iの計算は、局面sが生成され、sに基づきハッシュ関数が計算され、置換表が参照された、というケース全てに渡り行う。よって、項番号iは、make moveされ、かつ、その結果として生成された局面sに基づき置換表の参照が行われたときインクリメントする。*1
  2. エントリの確保が起きた回数は、探索ルーチンから置換表を更新して抜ける際(βカットまたは全ての子ノードの探索を完了した時)に、更新直前の置換表の最新内容に基づき、エントリの新規確保にあたるか否か改めて判定の上で更新する。*2

手順としては次のような感じになる。

  1. Make moveカウンタmove_cntと、エントリの新規確保カウンタused_cntを設ける。
    置換表クリアタイミングでいずれも0に初期化。
    move_cntがu_i、c_iの項番号iにあたる。
  2. 探索ルーチンに入った直後、何もしない。
  3. 置換表を参照することなく抜ける場合(千日手、王手千日手、%KACHI宣言条件成立時)も何もしない。
  4. 探索ルーチンの通常の手順に従い置換表が参照される際、++move_cnt。
  5. 置換表エントリteが記憶する評価値上下限でcut-offする場合は、集計処理を行ってから抜ける。
    (teが新規確保では有り得ないので、このときused_cntは変化しない。)
  6. 上記以外で抜ける場合(βカットか全ての子ノードを探索完了時)も集計処理を行ってから抜ける。

ここで、集計処理とは、次の処理である。

  エントリteが新規確保にあたるか否かを
  最新の置換表内容に基づき改めて判定し、
  判定結果に基づき、本クラスの目的のために必要なヒストグラムを更新後、
  新規確保である場合のみ++used_cnt

詳細は下記の通り。
Happy Checking!

 *	(基本的想定)
 *	置換表のエントリ数をN、最新局面をs、sに対してハッシュ関数が返したハッシュ値をhとして、
 *	h%Nでsのエントリが特定されるとする。
 *	また、個々のエントリは、下記を記憶する。
 *		1. 空か否かのフラグ
 *		2. 最後に書き込まれたときのh
 *		3. 局面の各種情報を集約したチェックコードchkc
 *		4. 評価値の上下限
 *	エントリteが特定されたとき、ヒットしたと見做す条件は、
 *		teが空でなく、かつteが記憶するhとchkcがsから計算された値と一致したとき
 *	である。
 *	ハッシュ関数の出来の確認は、局面sの生起毎にエントリの新規確保が
 *	行われたか否かの観察に基づいて行う。(詳細の説明はここでは省略する。)
 *	sの分布には仮定を置かない方式のため、sの重複は気にせず、
 *	make move 1回でsの生起が1回起きたとする。
 *	故に、本クラスは、make move毎にインクリメントされるカウンタmove_cntと、
 *	新規エントリ確保毎にインクリメントされるカウンタused_cntを有する。
 *
 *	(エントリ特定時の場合分け)
 *	sの生起毎に特定されるエントリteは、次のどれかである。
 *		(1) 空
 *		(2) 空でなく、かつhが不一致
 *		(3) 空でなく、かつhが一致し、chkcは不一致
 *		(4) 空でなく、かつhが一致し、chkcも一致(ヒット!)
 *	また、探索ルーチンの構造から、エントリ特定後に次の処理が行われる。
 *		A. (1)〜(3)成立時は、探索すべき子ノードがある場合に必ず
 *		   「子ノードについて探索ルーチンが再帰呼び出しされ、戻ってきた後、」
 *		   teが上書きされる。
 *		B. (4)成立時は、探索の評価窓と、teが記憶する評価値の上下限の関係次第で
 *		   teを上書きせずにcut-offし得る。Cut-offしなかった場合はAと同じ。
 *
 *	(本クラスの処理)
 *		1. 探索ルーチンに入ったときは何もしない。
 *		2. 置換表を参照することなく抜ける場合(千日手、王手千日手、%KACHI宣言条件成立時)も何もしない。
 *		3. 探索ルーチンの通常の手順に従い置換表が参照される際、++move_cnt。
 *		4. 置換表エントリteが記憶する評価値上下限でcut-offする場合は、集計処理を行ってから抜ける。
 *		   (teが新規確保では有り得ないので、このときused_cntは変化しない。)
 *		5. 上記以外で抜ける場合(βカットか全ての子ノードを探索完了時)も集計処理を行ってから抜ける。
 *	ここで、集計処理とは、次の処理である。
 *	   エントリteが場合(1)〜(4)のどれにあたるかを
 *	   最新の置換表内容に基づき改めて判定し、
 *	   判定結果に基づき、本クラスの目的のために必要なヒストグラムを更新後、
 *	   (1)だった場合のみ++used_cnt
 *	ステップ3で集計処理を行わないのは、処理A、Bの通り、
 *	子ノードについての探索ルーチンの再帰呼び出しがte上書き前に行われるためである。。
 *	ステップ3でteが(1)と判定されたからといって++used_cntとすると、
 *	子ノードの探索中にたまたま同じteが特定された場合も++used_cntが行われ、
 *	使用エントリ数が実態より多くカウントされてしまう。

*1:Make moveされた、というだけでインクリメントすると探索ルーチン冒頭で行う千日手、王手千日手、%KACHI条件判定にかかって抜ける場合に誤カウントとなるから、置換表の参照が行われてからのインクリメントが必要。

*2:現局面sに基づき特定されたばかりの置換表エントリteは、子ノードについて再帰的に探索する過程でもたまたま再特定されるかもしれない。よって、te特定直後に新規エントリだからとカウンタを+1する論理にすると、子ノードでも重複インクリメントになってしまい実態より大目にカウントしてしまうから、teが新規エントリ確保なのか否かは子ノードの探索が全部終わってから判定する必要がある。