Yuki Nakata's Blog

One color just reflects another


nvidiaドライバのインストール
$sudo add-apt-repository ppa:graphics-drivers/ppa

$sudo apt-get update

$sudo apt install nvidia-375 nvidia-settings

$sudo apt install mesa-utils

再起動するとNVIDIA X Server Settingsがインストールされています。

$nvidia-smi
Fri Dec  9 10:08:43 2016      
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 375.20                 Driver Version: 375.20                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 950M    Off  | 0000:01:00.0     Off |                  N/A |
| N/A   40C    P0    N/A /  N/A |      0MiB /  2034MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                              
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+


$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2016 NVIDIA Corporation
Built on Sun_Sep__4_22:14:01_CDT_2016
Cuda compilation tools, release 8.0, V8.0.44

cuDNN install
cuDNN v5.1 Library for Linux

$ sudo cp -a cuda/lib64/* /usr/local/lib/
$ sudo cp -a cuda/include/* /usr/local/include/
$ sudo ldconfig


GTX-1080 など GeForce を Ubuntu 16.04 LTS で CUDA-8.0RC と共に使う 

GTX-1080でTensorFlow

Ubuntu 16.04にTensorFlow(GPU)をインストール

TensorFlow r0.9 (GPU版)を ubuntu16.04 にインストール

Ubuntu14.04にCUDA Toolkit or NVIDIAグラフィックスドライバを入れるとGUI環境でログインできなくなる問題について


 

product_img_mbk630
3カ月くらい前にマウスコンピュータでノートPCを買いました。

MB-K670XN-SH2というモデルです。

グラフィックスカードGeForce® GTX 950M(2GB)を搭載しています。

CUDAに対応していて、GPU版tensorFlowが利用できるということでやってみようとなったんですが、とてつもなく大変でした。

GPUのCUDAサポート CUDA | Supported GPUs | GeForce 

どハマリしたポイントを書いていきます。
 
まずlinuxを直接インストールしなければいけません。

virtualBoxのようなバーチャルではnvidiaのドライバがインストールできません。

MBRをイジリたくはないんだけれど、しょうがない。

参考サイト
Ubuntu16.04 + Windows10 のデュアルブート環境を構築する

Windows10とUbuntuのデュアルブートをやってみた話

この2つのサイトが役に立ちました。まずは正しい情報なのでやってみましょう。

私の場合はうまくいきませんでした。笑

ここから先はうまくいかなかった人向けです。

USBメモリーからubuntuをインストールできましたが、再起動するとlinuxが起動しません。

ディスプレイが真っ黒なまま停止します。

おかしいな、と思い一旦linuxの全領域を削除。

再インストールしようとしたのですが、今度はインストールができなくなりました。

ubuntuのロゴ表示で停止します。

途方に暮れていて見つけたのが次のサイト。

nVidiaのGPU搭載PCにUbuntuを入れようとしてハマった 

ここで原因が判明しました。

nVidiaのGPUを搭載しているとlinuxが起動しない、という問題があるようです。

解決方法はgrubでカーネルに渡すパロメータを変更します。

grubの画面で「e」を押し、編集モードに入り、

「quiet splash」を 「nomodeset」へ変更します。これで解決!。

オプションの意味は
nomodeset 起動時にいわゆるdmesgをディスプレイに表示。これが正解。

quiet splash dmesgを非表示にして、ubuntuのロゴを表示、見栄えを良くする。

良くわからんが、quiet splashにするとnvidiaのgpuに引っ掛かるようです。



インストールし終わったら、/etc/default/grubを直接編集します。

同じように「quiet splash」を 「nomodeset」へ変更し、

#sudo update-grub

でgrubを更新することができます。 

これで無事ubuntu16.04をインストールできるようになりました。 

o0600043711156773621
未来人2062年の予言 まさかの大外れ トランプ勝利!

2062年の未来人の予言が外れたので、ジョンタイターの予言を調べてみました。

いやあ、これが酷すぎた。

予言が外れることもあるそうですが、外しまくりです。

2005年 アメリカで内戦勃発

2011年 アメリカ解体

2015年 第三次世界大戦 

2017年 30億人の犠牲者を出し、ロシア勝利で第三次世界大戦終結

もうね無茶苦茶です。今は第三次世界大戦中ですってよ。

一つでも外した時点で考察するに値しないと思います。

今後起きる予言は何の参考にもなりません。

地震を予知するんでしたら、ピンポイントで時間と場所を当ててください。

未来人になぜそれが出来ないのか?

予言をするんだったら嘘でもいいから、未来に希望が持てるような予言にするべきだろうと思います。

世界中みんな金持ちになるとかを予言するべきで、人類絶滅だの核戦争だの勘弁です。

タイムマシンが完成したら未来から未来人がやってくるだろう、という理屈は理解できます。

まともな未来人さん、来てください。お願いしますよ。ホント。 

未来の本屋を勝手に考える 未来屋書店モンテメール芦屋
本屋さんの未来屋書店モンテメール芦屋が好きです。

私は各地の本屋や図書館を見てきましたが、ここは本当に素晴らしい本屋さんだと思います。

初めて訪れた時ビビッと来ました。

ここはお気に入りの本屋になる。私のための本屋だ!

未来屋書店がJR芦屋駅にオープン それでオープンした頃に書いたわけです。

ところが長く続かないのではないかと思っています。

私の分析では相当苦戦しているはずです。

その前に未来屋書店モンテメール芦屋の良いところを書いてみます。

よいところ1
内装がとにかくおしゃれ

百貨店内にあるためか、本屋さんなのに異様にゴージャスです。

個人書店では考えられないほどのゴージャスさです。

椅子やソファーにお金が掛かっています。チンケな椅子ではありませんよ。

どうみても椅子やソファー1脚の価格が10万円以上、数十万はかかっています。

しかも椅子だけで30脚はあります。

どんだけ椅子に金を使っているのか?w 本屋なのに。

よいところ2
本が読み放題。

ゴージャスな椅子に座って1日中無料で本を読むことができます。

本を売る気があるのでしょうか?w

よいところ3
本屋内にカフェがある。

カフェがあるのは近畿ではここモンテメール芦屋だけです。

お腹が空いたらカフェで食事ができます。

買っていない本も持ち込めます。本を読みながら食事ができます。

お分かりいただいたと思いますが、未来屋書店モンテメール芦屋は天国なのです。

本好きな人にとっては天国以外の何物でもありません。

次になぜ未来屋書店モンテメール芦屋は苦戦するのかを書いてみたいと思います。

苦戦する理由1
芦屋人は本を読まない。単純に芦屋の人口は10万人と少ないというのもあります。

芦屋というのは金持ちのジジイとババアの街なのです。

高齢者は本を読みません。そもそも老眼で本が読めないのです。

苦戦する理由2
すぐとなりに巨大なジュンク堂書店がある。

売り場面積5倍以上はあるでしょう。目当ての本を買おうと思ったら、巨大なジュンク堂書店に流れてしまいます。

苦戦する理由3
カフェのババアがうるさい。

本屋内のカフェでペチャクチャうるさいババアが陣取っています。

図書館であれば静かにするのがマナーですが、お金を払ったカフェの客ですからお構いなしです。

本を読まないなら他のカフェに行けよと思います。

苦戦する理由4
勉強している学生がウザい
椅子が提供されているので普通にノートを広げて勉強をしています。w

家に帰って勉強しろよと。図書館ではありませんよと。

他人の善意を理解できない人たちが多いのです。私の本屋に来るなと言いたい。

整理すると無料で本がいくらでも読める、隣に巨大なジュンク堂がある、内装にお金をかけすぎ。

これで本屋をやろうというのですから、相当太っ腹というかクレイジーだと思います。

いろいろ思うことがあるのですが一つに絞ると、入場料を取るべきだと思います。

芦屋価格で入場料800円です。1ドリンク付き。

800円程度なら私は喜んで払います。

ただ入場料を払うのではありませんよ。ここの本屋は1日中椅子やソファに座って本が読めてしまうのです。

ネットで「本屋 入場料」で検索すると賛否両論あるようですね。

素人お断りみたいな変わった本屋があっても良いと思います。

 

スーパーマリオブラザーズ 人工知能で世界最速を目指そう! の続きです。

前回、遺伝的アルゴリズムで50~60世代位でステージ1-1をクリアできるようになりました。

今回は世界最速を目指そう!できるかな?

 
世界最速動画です。つい最近、World Recordが更新されました。

で、よく見ると1-1ドラム管を使ってワープしているじゃないですか。いやあ面倒なことになりました。

つまり、下キーを使わなければドラム管ワープできません。前回は上キーと下キーは 入力しない設定にしていました。

ワープなしの最速を目指すということで逃げましょうか。

1-1のタイムを見ると29秒66です。約30秒。どこまで近づけるか?

とりあえず前回のプログラムを改良していきます。

クリアフラグを付けます。マリオがゴールポールにしがみつくと、メモリーアドレス 0x001Dが3になります。

ポールの下に着地するとメモリーアドレス 0x001Dが2になります。これを利用します。そのときのタイムを取得します。

タイムは0x07F8/A Digits of time (100 10 1)です。399から減っていきます。

とりあえずゴールしたらタイムボーナス。TIme * 100点追加。これで動かしてみます。

あとFceuxでLuaScriptを動かすとき、TurboModeで高速に動かしています。

Windowsだと早いのですが、ラズベリーパイだと遅い。ほとんどノーマルスピードと変わりありません。

やりました!コツがわかってきました。まずは結果画像を見てください。
smb-ga1
左から世代、平均評価値、クリアしたマリオの数です。

35世代でまずクリアするようになりました。

41世代、20人中14人がクリア!30分動かしてこの成果です。

評価値も結構安定するようになりました。

遺伝的アルゴリズムでやってみて、数字をちょこちょこ調整しています。

今の段階では
マリオは20体用意。
優秀なマリオを4体に絞る
一点交差、
突然変異は1%がベストです。

あとは下キー入力とベストタイムを表示させてみます。
2016/11/25

require("auxlib");
print ("Hello World!")


key = {}

key["up"] = false;
key["left"] = false;
key["down"] = false;
key["right"] = false;
key["A"] = false;
key["B"] = false;
key["start"] = false;
key["select"] = false;

math.randomseed(os.time())


marioCross = {} --マリオの十字キー
marioA = {} --マリオのAボタン
marioB = {} --マリオのBボタン

marioCross2 = {} --マリオの十字キー コピー用
marioA2 = {} --マリオのAボタン コピー用
marioB2 = {} --マリオのBボタン コピー用

marioGeneration = 1 --世代
marioPlayer = 1
marioMaxPlayer = 20 --マリオ20体用意する
marioValue1 = {} --評価値 右へ行くほど高くなる
marioValue2 = {} --評価値 降順ソート用
marioValue3 = {} --評価値 値が小さい程優秀なマリオ
totalValue = 0
averageValue = 0
averageValue2 = 0
marioClear = 0
clearFlag = 0
timeBonus = 0
deadBonus = 0
deadFlag = 0
  
marioDistance = 0 --マリオが進んだ距離
marioXPosition = 0 -- 0~最大値255までの値をとる
marioHPosition = 0 -- ステージ1-1は12分割される 0~12までの値をとる
totalInput = 100
frameCount = 1
p = 1
q = true
r = true
x = 1
y = 1
z = 1
tableLen = 0
select = false


function tableReset(t)
for k in pairs (t) do
t[k] = nil
end
for i = 1, marioMaxPlayer do
t[i]  = {}
end
end

--マリオを20体生成する
function marioGenerator()
for i = 1, marioMaxPlayer do
marioCross[i]  = {} 
marioA[i] = {}
marioB[i] = {}
end
for i = 1, marioMaxPlayer do
for j = 1, totalInput do
 marioCross[i][j] = math.random(13)
 marioA[i][j] = math.random(20)
 marioB[i][j] = math.random(10)
 --print(i, j, marioA[i][j])
end
end
end

--1から4までの数字を返す
--数字の小さい方が優秀なため、1と2を多く返したい
function onetoeight()
local i
local r
r = math.random(100)
if (r < 40) then
i = 1
elseif (40 <= r and r < 80) then
i = 2
elseif (80 <= r and r < 90) then
i = 3
elseif (90 <= r) then
i = 4
end
--print(i)
return i
end

--マリオを遺伝的アルゴリズムで再生成する
function marioReGenerator()
--table.sort(marioValue2)
--降順でソートする
table.sort(marioValue2, function (a,b) return a>b end)
--print(marioValue1)
--print(marioValue2)
totalValue = 0
averageValue = 0
for i = 1, marioMaxPlayer do
for j = 1, marioMaxPlayer do
 if(marioValue1[i] == marioValue2[j]) then
  marioValue3[i] = j
 end
end
totalValue = totalValue + marioValue1[i]
end
--print(marioValue3)
averageValue = totalValue / marioMaxPlayer
print(marioGeneration.." Generation  Value = "..averageValue.."  Clear = "..marioClear.." / 20")
marioClear = 0
tableReset(marioCross2)
tableReset(marioA2)
tableReset(marioB2)
--優秀なマリオ 1~8位までをコピーする
p = 1
for i = 1, marioMaxPlayer do
if( marioValue3[i] <= 8) then
marioCross2[p] = marioCross[i]
marioA2[p] = marioA[i]
marioB2[p] = marioB[i]
p = p + 1
end
end
tableReset(marioCross)
tableReset(marioA)
tableReset(marioB)
--いわゆる交叉 xとyが選ばれた親マリオの変数
for i = 1, marioMaxPlayer do
x = onetoeight()
y = onetoeight()
for j = 1, totalInput / 2 do
marioCross[i][j] = marioCross2[x][j]
marioA[i][j] = marioA2[x][j]
marioB[i][j] = marioB2[x][j]
end
for j = totalInput / 2, totalInput do
marioCross[i][j] = marioCross2[y][j]
marioA[i][j] = marioA2[y][j]
marioB[i][j] = marioB2[y][j]
end
end
--突然変異
for i = 1, marioMaxPlayer do
for j = 1, totalInput do
r = math.random(100)
if (r == 1) then
marioCross[i][j] = math.random(13)
end
r = math.random(100)
if (r == 1) then
 marioA[i][j] = math.random(20)
end
r = math.random(100)
if (r == 1) then
 marioB[i][j] = math.random(10)
end
end
end
--前世代より上回ったらキー入力を増やす
if(averageValue2 < averageValue ) then
totalInput = totalInput + 70
--print(totalInput)
tableLen =table.maxn(marioCross[1])
--print(tableLen)
for i = 1, marioMaxPlayer do
for j = tableLen + 1, totalInput do
 marioCross[i][j] = math.random(13)
 marioA[i][j] = math.random(20)
 marioB[i][j] = math.random(10)
 --print(i, j, marioA[i][j])
end
end
end
averageValue2 = averageValue
end

--評価値を計算する
function calculateValue()
marioXPosition = memory.readbyte(0x0086)
--0x006D mario Position max 12
  marioHPosition = memory.readbyte(0x006D)
  marioDistance = marioHPosition * 256 + marioXPosition
  marioValue1[marioPlayer] = marioDistance + timeBonus + deadBonus
  marioValue2[marioPlayer] = marioDistance + timeBonus + deadBonus
  --print(marioPlayer, marioValue1[marioPlayer])
end

--変数初期化 ソフトリセット
function resetFunction()
  marioHPosition = 0
  marioXPosition = 0
  marioDistance = 0
  timeBonus = 0
  clearFlag = 0
  deadBonus = 0
  deadFlag = 0
  
  --totalInput = totalInput + 10
  --marioGenerator()
  
  if(marioPlayer < marioMaxPlayer) then
  --print(marioPlayer)
  marioPlayer = marioPlayer + 1
  else
  --世代交代
 
  marioReGenerator()
  marioPlayer = 1
  marioGeneration = marioGeneration + 1
  end
  emu.softreset()
  frameCount = 1
end


function testiup()
function turboAction(self, a) 
emu.speedmode("maximum")
gui.text(10,10,"pressed me!");
end;
function normalAction(self, a) 
emu.speedmode("normal")
gui.text(10,10,"pressed me!");
end;
-- Create a button
turboButton = iup.button{title="Turbo Speed Button"};
-- Set the callback
turboButton.action = turboAction;
normalButton = iup.button{title="Normal Speed Button"};
normalButton.action = normalAction;
box = iup.vbox {turboButton,normalButton}
-- Create the dialog
dialogs = dialogs + 1;
handles[dialogs] = iup.dialog{ box, title="IupDialog Title"; };
-- Show the dialog (the colon notation is equal 
-- to calling handles[dialogs].show(handles[dialogs]); )
handles[dialogs]:show();

end

testiup();
marioGenerator()

while true do
--if (marioPlayer == 1) then
--print(marioGeneration.."generation")
--end
--print(marioPlayer)
local joy = joypad.read(1)
if (joy["select"]) then
if (select == true) then
emu.speedmode("nothrottle")
gui.text(10,10,"High Speed")
else
emu.speedmode("normal")
gui.text(10,10,"Normal Speed")
end
select = not select
end
--ゴールした場合
  if(memory.readbyte(0x001D) == 3 and clearFlag == 0) then
  local timeA, timeH, timeT, timeO
  clearFlag = 1
marioClear = marioClear + 1
timeH = memory.readbyte(0x07F8)
timeT = memory.readbyte(0x07F9)
timeO = memory.readbyte(0x07FA)
timeA = (100 * timeH) + (10 * timeT) + timeO
--print(timeA)
timeBonus = timeA * 10
  end
--死亡した場合
if(memory.readbyte(0x075A) == 1 and deadFlag == 0) then
  deadFlag = 1
deadBonus = -200
  end
  
--入力が無くなった場合と死亡した場合、評価値を算出しリセット
if(totalInput < frameCount or memory.readbyte(0x075A) == 1) then
memory.writebyte(0x075A, 8)
--print(marioPlayer, totalInput, frameCount, memory.readbyte(0x075A))
    calculateValue()
    resetFunction()
  end
  
  
  
key["up"] = false;
key["down"] = false;
if( marioCross[marioPlayer][frameCount] == 1) then
key["left"] = true;
key["right"] = false;
else
key["right"] = true;
key["left"] = false;
  end

  if(marioA[marioPlayer][frameCount] == 1) then
key["A"] = false;
else
key["A"] = true;
end

  if(marioB[marioPlayer][frameCount] == 1 ) then
key["B"] = false;
else 
key["B"] = true;
end

  -- Execute instructions for FCEUX
  joypad.set(1, key)

  
  

  --スタート画面に戻ったらスタートボタンを押す
  if(memory.readbyte(0x07F8) == 4 and memory.readbyte(0x07F9) == 0  and memory.readbyte(0x07FA) == 1) then
    joypad.set(1, {start = true})
    --print("reset")
    frameCount = 1
  end

  emu.frameadvance() -- This essentially tells FCEUX to keep running

  --print (memory.readbyte(0x0086));

  frameCount = frameCount + 1
end   

vps2


レンタルサーバー VPSはServersManだ!

ServersManのVPSレンタルサーバーを借りています。

もう3台目。格安のEntryを3台。3台借りても1カ月2000円以内に収まります。

気に入りすぎています。

お試しでさくらVPS借りましたが、ダメでした。私には難しすぎます。

私がやりたいことはphpをcronで常時動かしたい!!!

はっきり言ってこれだけなのです。面倒くさいサーバー設定は極力勘弁。

というような人にはServersManがうってつけだと思います。

本当に1時間で本格サーバーを立ち上げることができます。

レンタルサーバー比較ではServersManよりさくらVPSの方がパフォーマンスが上という記事が引っ掛かります。

そうなのでしょうが単純にそうとも言えません。

httpサーバーはデフォルトのApachではなく軽量サーバーのnginxを使います。

またphpはphp5ではなく、php7にするとパフォーマンスが3倍良くなります。

nginxとphp7を組み合わせるとServersmanで十分戦えるのです。

しかも見逃せないのはハードウェアも良くなっている点です。

CPUも以前と比較すると性能が良くなっています。

現在はコレ。Intel(R) Xeon(R) CPU E5-2430L 0 @ 2.00GHz

PHPもサクサクに動きます。

試してみる価値があると思いますよ。

Serversmanの環境
OS ubuntu14.04
httpサーバー nginx
php php7.0
ftpサーバー vsftp
sqlデータベース いらない

参考にしたサイト
以下のサイトをマネすると初心者でも設定できます。

ubuntu ユーザを追加して sudo 権限をつける ユーザーを追加してsudo権限をつける

Ubuntu 14.04 で add-apt-repository が無いと言われた add-apt-repositoryコマンドを追加

Ubuntu14.04にnginxとPHP7.0とMySQL5.7をインストールする nginxとphp7をインストール

Ubuntu 14.04 LTS : FTPサーバー : Vsftpd インストール : Server World vsftpdインストール

/etc/nginx/conf.d/default.conf
rootディレクトリだけ変更した
 
server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/log/host.access.log  main;

    
    location / {
        root   /usr/share/nginx/html;
        index  index.php;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}


    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        root           /usr/share/nginx/html;
        fastcgi_pass   unix:/var/run/php/php7.0-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
   

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}


/etc/vsftpd.conf

変更箇所
write_enable=YES
ascii_upload_enable=YES
ascii_download_enable=YES
ls_recurse_enable=YES


img_90ea5e7e5765f1b67af836fe96f123d5186938
アメリカの大統領選挙に注目していました。

2062年の未来人がトランプは大統領にならないと予言していたからです。

結果は大外れ。2分の1も当てられません。これで未来人とは。。

Q「トランプは大統領になるか」

2062年氏「ならない」


少しがっかりしましたよね。

2062年の未来人はそもそも地震を予知できたのでしょうか?

時系列で整理しました。

2010年11月14日 未来人登場 
自然災害に関しては、言う事が許されない。人口動態変化に繋がる事は言えないのだ。 
ただし、忠告しておく。yあ 間 N意 埜 b於 レ いわゆる山に登れ

2010年11月16日 未来人再登場
今回の任務が完了したら2016年4月15日へ行く。また会えたらいいな。

2011年3月11日 東日本大震災 

2016年4月14日~16日 熊本地震

まず2062年の未来人は地震予知をしていません。

山に登れと忠告したのと、2016年4月15日へ行くと言っただけです。

地震とも熊本とも書いていません。

それなのに2チャンネルでは地震予知が当たったと大騒ぎしました。

未来人は地震予知をしていません。アメリカ大統領選挙は予言しました。

大統領選挙ではトランプが勝利し、大外れです。 

残念ですが、やはりインチキでした。

ジョンタイターの予言が酷すぎる 

↑このページのトップヘ