自分のための備忘録的なブログです。

Ubuntu14.04LTS を使って、ディープラーニングの勉強をしています。
記載されているコードは、他の OS には互換性がない可能性があります。


DNN:
マシン性能別 学習速度の比較, TFチュートリアルをmodifyする
python3:
オブジェクト指向プログラミングとは, システムコマンド(os), ファイル・フォルダ名取得, 画像の前処理,
R lang:
R基本コマンド, Rデータ形式, RStudio文字化け(os), RStudio背景黒,
Ubuntu14 の初期設定:
Ubuntu14初期設定, 初期設定-2, cudaなども, 初期設定-3

tensorboard を開く。

bash

tensorboard --logdir=/tmp/tensorflow_log


 をタイプする。

コンソールに返信があれば

 

ブラウザで

http://localhost:0.0.0.0.6006

とタイプ。

localhost://0.0.0.0:6006 云々は、コンソールに返信があるので覚えておかなくて大丈夫。

 

tensorboard の終了は Ctrl + C。必ず終了すること!!

同時に2つの tensorboard は立ちあげられないみたい。なので、前の tensorboard を終了してないと、次に学習しても tensorboard が立ち上がらない。

 

いろいろ可視化するには、コードに仕込んでおかないといけないみたい。まだそこまではできていない。

CNNディープラーニング前処理 画像をDL用に処理する。

主に Python 3 で、画像の前処理に関わるコードを集めたものです。

 

いわゆる「data augmentation」のコードが多いです。

なお、data augmentation については、ディープラーニングで使用するフレームワークに入ったコードを利用した方が簡便です。

ただしやりたいことが実装されていない場言いもあり、不足分を自分で補うのがオススメです。

 

フォルダ内のすべてのファイル取得(python

import glob
glob.glob('*')

 

for FILENAME in glob.glob('*'):
    print(FILENAME)

 イマイチ違いがわかってない。

 2.は for loop を回してるので遅いのかな?

 

Bash

for dir in $(ls .);do echo $dir; done

 

再帰的にディレクトリ構造を得る

# -*- coding:utf-8 -*-

import os

def get_abspath_recursive(directory):

    for root, dirs, files in os.walk(directory):

        yield root

        for file in files:

            yield os.path.join(root, file)

 

for file in get_abspath_recursive('.'):

    print(file)

参考: http://qiita.com/suin/items/cdef17e447ceeff6e79d

 

 

画像の表示, python3

# -*- coding:utf-8 -*-

from PIL import Image

import matplotlib.pyplot as plt

im = Image.open("xxx.jpg")

plt.imshow(im)

plt.show() 

 

 

画像のリサイズ, python3

# -*- coding:utf-8 -*-

from PIL import Image

im = Image.open("xxx.jpg").resize(  (100.100) )

im.save("NEWFILENAME.jpg")

  ※トリミングではないので、画像が変形する。

 

 

 

あるフォルダ内のすべての ,jpg ファイルを、短辺で正方形に crop する。

 

 Cropされたファイルはカレントディレクトリに入る。(python3)

 

 

# -*- coding: utf-8 -*-

'''フォルダ内にある .jpg を短辺で正方形に crop
'''

import os
import cv2


def main():
    for file_name in os..listdir('.'):
        root, ext = os.path.splitext(file_name)

 

        if ext == '.jpg':
            img = cv2.imread(file_name)
            height, width, channels = img.shape

            if height == width:
                cv2.imwrite("cropped_" + file_name, img)
            elif height > width:
                Start = (height - width) // 2
                End   = Start + width
                clp     = img[Start:End, :]
                cv2.imwrite("cropped_" + file_name ,clp)
            else:
                Start = (width - height) // 2
                End   = Start + height
                clp    = img[:, Start:End]
                cv2.imwrite("cropped_" + file_name ,clp)

        else:

            pass

 
if __name__ == '__main__':
    main()

 参考: http://qiita.com/satoshicano/items/bba9594a1203e24e2a31

 

 

あるフォルダ内のすべての .jpg ファイルを、長辺で正方形に crop? する。

 Cropされたファイルはカレントディレクトリに入る。(python3)

 

# -*- coding: utf-8 -*-


'''フォルダ内にある .jpg を長辺で正方形に crop'''

 

import os
import cv2
import numpy as np

 

def main():

    for file_name in os.listdir('.'):

        root, ext = os.path.splitext(file_name)

        if ext == '.jpg':

            img = cv2.imread(file_name)

            height, width, channels = img.shape

            tmp = img[:, :] 

 

            if height > width:

                size = height

                limit = width
            else:

                size = width

                limit = height

 

            start = int( (size - limit) / 2)

            fin = int( (size + limit) / 2)

 

            new_img = cv2.resize(np.zeros( (1, 1, 3), np.uint8), (size, size) )

            if size == height:

                new_img[:, start:fin] = tmp

                cv2.imwrite("squared_" + file_name ,new_img)

            else:

                new_img[start:fin, :] = tmp

                cv2.imwrite("squared_" + file_name ,new_img)

        else:

            pass

 

if __name__ == '__main__':

    main()

 

カレントディレクトリの、すべての .jpg ファイルを rotate させるスクリプト(python3)

# -*- coding: utf-8 -*-
'''
フォルダ内にある .png, .jpeg, .jpg を rotate して保存する。
'''

import os

from PIL import Image

 

def main():

    for file_name in os.listdir('.'):

        root, ext = os.path.splitext(file_name)

 

        if ext == '.jpg':

            img = Image.open(file_name)

            for Degree in (-15, -12, -8, -4, -2, 0, 2, 4, 8, 12, 15):

# for Degree in (この中に、保存したい角度を入れる。)

                Rotate = img.rotate(Degree)

                Rotate.save("rot_" + str(Degree) + file_name)

 

 

        else:

            pass 

 

if __name__ == '__main__':

    main()

 

 カレントディレクトリのすべての .jpg ファイルを左右 flip するスクリプト

 

 # -*- coding: utf-8 -*-
'''
フォルダ内にある .jpg を flip して保存する。
'''

import os

from PIL import Image

 

def main():

    for file_name in os.listdir('.'):

        root, ext = os.path.splitext(file_name)

 

        if ext == u'.jpg':
            img = Image.open(file_name)
            tmp = img.transpose(Image.FLIP_LEFT_RIGHT)
            tmp.save("flipped_" + file_name)

        else:

            pass

 

if __name__ == '__main__':

    main()

 

カレントディレクトリの全ての .jpg ファイルで、画像の彩度・明度・コントラストを変更して画像枚数を増やす。

# -*- coding: utf-8 -*-
'''カレントディレクトリの .jpg の彩度、明度、コントラストを変更する'''

import os
from PIL import Image
from PIL import ImageEnhance

def main():

#彩度:saturation を変更して保存する。

    for file_name in os.listdir('.'):
        root, ext = os.path.splitext(file_name)

        if ext == u'.jpg':

            img = ImageEnhance.Color(Image.open(file_name))

            for i in (0.5, 1.5):

                tmp = img.enhance(i)

                j = str(i)

                tmp.save("_Sat_" + j + file_name)

            else:

                pass

 

#明度: brightness を変更して保存する

    for file_name in os.listdir('.'):

        root, ext = os.path.splitext(file_name)

        if ext == u'.jpg':

            img = ImageEnhance.Brightness(Image.open(file_name))

            for i in (0.5, 1.2):

                tmp = img.enhance(i)

                j = str(i)

                tmp.save("_Brt_" + j + file_name)

        else:

            pass

 

#コントラスト: contrast を変更して保存する

    for file_name in os.listdir('.'):

        root, ext = os.path.splitext(file_name)

        if ext == u'.jpg':

            img = ImageEnhance.Contrast(Image.open(file_name))

            for i in (0.5, 1.2):

                tmp = img.enhance(i)

                j = str(i)

                tmp.save("_Cnt_" + j + file_name)

        else:

            pass

 

if __name__ == '__main__':
    main()

 

#参考: https://kazutoyo.jp/archives/74

 

 

Kindle を Ubuntu14 インストールできず、ついでに Ubuntu を破壊してしまった。

また しないようにメモ。

 

ディープラーニングを勉強するのに、Kindle 本を Ubuntu14 で読めると便利。

ググると、Wine というソフトを使うと、Kindleが使えるらしい。

 

MS OfficeScanSnap が使えるならば、Ubuntu に完全移行できるので、結構期待大)

 

1.ソフトウェアセンターから Wine インストー

 Kindle for PC インストールできない。

 ググる、Wine の設定を変更してみることに。

2.Wine XP → 8

 デフォルトで設定が「Win XPエミュ」みたいになっていたので、「8」に買えてみる。

 インストールできない。

3.Wine にはいくつかのバージョンがあるらしい。

 Wine 1.7, 1.8 など、異なるバージョンをインストールしてみる。「Win エミュレーター」の部分も 「7」「8」「8.1」「2008」「10」など試してみる。

  やはり Kindle for PC はインストールできない。

 

4.sudo apt-get --purge remove で Wine をアンインストー

 おっ、なんかいろんなアプリケーションがアンインストールされたな。

 良いのかな・・・こんなにアンインストールして。

 メインのシステムでは使わない方がいいのかも。

 

 『なんか「autoremove」を使うと、関連のなくなったアプリを削除できる』みたいな記載があるなぁ。やってみるか。 ← (やっちゃだめ)

 

5.sudo apt-get autoremove

 いろんなアプリが削除された! 使ってない LibreOffice ソフトとか!

 確かに普段使わないけど、なにげに困るぞ!

 ヤバいことになってきたので、復旧のために ~/Download を外付け HDD に backup しておこう。

 

6.再起動・・・起動しない!!

 Ubuntu が起動して、ログインのためのパスワード入力画面になる。

 パスワードを入力してもログインできない。

 正しいパスワードを入力しても、またパスワード入力画面になってしまう。

 

 壊れてしまった・・・

 

7.再インストール!!

 「ディスクをフォーマットしない」でインストールしたら、起動に必要なパッケージをインストールしてくれたらしく、無事起動するようになる。

 サルベージ仕切れなかったファイルを回収。

 

8.フォーマット付きで再インストー

 Ubuntu 14.04.5 EN バージョンだけど、インストールの作業する言語を「日本語」にすると、日本語入力ソフト(Anthy)もインストールしてくれる。Fcitx + Mozc に買えるけど。

 ~/ のフォルダ名も日本語になってしまうので、修正しないといけない。

 

今回勉強したこと:

 sudo apt-get autoremove :使わない方がよさそう。

 sudo apt-get --purge remove [アプリ名] :

予想外にたくさんのアプリに影響する。

 

そういえば、以前 Python 2.7 をアンインストールしたときに、パソコンが起動しなくなったことを思い出しました。

 

Python3 モジュールのインポート, パスを通す

 

前書き

ディープラーニングで欠かせない「モジュールのインポート」

 

import tensorflow as tf 

 

import numpy as np

import chainer

import chainer.functions as F

import chainer.links as L

from chainer import Variable,optimizers,Chain 

 

みたいなやつ。

分からなかったので勉強した。

 

 

モジュールとは

ざっくり言うと

関数やクラスを含んでいる「.py」ファイル 

 

または、

 

関数やクラスを含んだ「.py」ファイルのある、ディレクトリー

のこと

 

モジュールのインポートとは

 

ざっくり言うと

インポート元に含まれる、

  関数

  クラス

を取り込んで、使えるようにする

 こと。

 

試してみる。

すべてのクラスと関数をインポートする。

import chainer

のような

関数を呼び出す際、

chainer.(関数の名前)

のように、前に「モジュール名.」をくっつける。

 

別名によるインポート

import tensorflow as tf

のような。

 

関数を呼び出す際、

tf.(関数の名前)

で良い。

 

tensorflow.(関数の名前)

と長く書く必要がなく、タイピングの手間が省ける。

ただし、自分でオリジナルの省略形を使い始めてしまうと、収拾がつかなくなる(再利用しにくくなる)。広く使われている省略形のみにとどめるのが無難。

 

一部の関数やクラスだけをインポートする

from chainer import Variable,optimizers,Chain

のようなの。

 

この方法だと、それぞれの関数の前に

chainer.

をつけなくても Variable, optimizers, Chain 

が使えるようになるので、コードが書きやすくなる。

 

クラス/関数の名前の衝突(同じ名前を使ってしまったため、一部のクラス・関数が使えなくなる)に気をつける必要がある。

 

パッケージを使う

from chainer import Variable,optimizers,Chain

みたいな。

(このコードは、一部のクラス・関数のインポートであり、かつパッケージの利用でもある?)

 

実際には

chainer

 

フォルダーの下に、

Variable.py

optimizers.py

Chain.py

__init__.py

などが位置する 形、らしい。間違ってたらすみません。勉強中でして。

 

パッケージを利用する際には、

__init__.py

ファイルが必要とのこと(中身は空で良い)。

 

optimizers.setup()

optimizersMomentumSGD()

みたいに、ドットをつけて関数・クラスを引用する。

 

なぜパッケージを使うのか

複数のモジュールで、名前の衝突を防ぐことができる。

たとえば 2つのモジュール内に同じ関数が含まれていたとしても、関数の前にモジュールの名前がつくので(optimizers.setup()のように)、別の関数として認識できる。

 

 

モジュール検索パス

import sys

for _path_ in sys.path: 

    print(_path_)

 

モジュールを検索してくる場所が表示される。

よくある

パスを通す

っていうやつ。

sys.path

をエディターとかで書き直すと、変更できるらしい。

 

一番最初に「空の行」がでるのは、('.') すなわち current directory を示している。

 

一番最初に「ビルトインモジュール」を探すらしい。

見つからなかった場合、上からディレクトリーを検索して .py ファイル(やフォルダー)を探していき、もしモジュール(.py ファイルや、フォルダー)が見つかった場合、以降の ディレクトリは検索されない。

例えば、カレントディレクトリに「tensorflow」というモジュールを、自分で作って置いて置くとする。そこで tensorflow をインポートすると、自分の作った「tensorflow」モジュールがインポートされ、本来の tensorflow はインポートされない。

モジュールの名付けに注意が必要。

 

シンボリックリンクを含むディレクトリはモジュール検索パスに追加されない。

らしいので注意。

 

モジュールのある場所

モジュール置き場は自分で決めておけば良いと思うのだけど、

Anaconda on Windows の場合、

C:\Users\[User name]\Anaconda3\Lib\site-pakages\

に入っているみたい。

 

Ubuntu14.04 では 仮想環境を使っていて。

~\anaconda3\envs\py27\lib\python2.7\site-packages\
~\anaconda3\envs\py35\lib\python3.5\site-packages\
~\anaconda3\envs\py36\lib\python3.6\site-packages\

に入っていた。

 

 

ソース

 6. モジュール (module) — Python 3.6.1 ドキュメント

 初心者が悩む

if __name__ = "__main__":

 についても書いてある。

 

TensorFlow tutorial をちょこちょこ modify する。

Under construction です。

 

 

 

チュートリアルのダウンロード

git をインストール

sudo apt-get install git

git を使って、チュートリアルをクローン(画像認識系のみ)

git clone https://github.com/tensorflow/models/tutorials/image

カレントディレクトリに、「image」ディレクトリが作成され、その中にチュートリアルが入る。

 

せっかくなので、チュートリアルだけでなく、モデル一般も一気にダウンロードしたいところ。

git clone https://github.com/tensorflow/models/

カレントディレクトリに、「models」ディレクトリが作成される。チュートリアルは、models/tutorials/image 内に入る。

 

 

Modify

VRAM使用量の制限

下記コードを適当なところ(多分 import より下、ほんちゃんの Session よりも前。一番下に入れると、メモリー全部確保されてしまった!)に入れておく。

config = tf.ConfigProto(
gpu_options=tf.GPUOptions(
per_process_gpu_memory_fraction=0.5 # 最大値の50%まで
)
)
sess = sess = tf.Session(config=config)

 引用元

qiita.com

ソース

Using GPUs  |  TensorFlow

 

CPUonly で eval.py を実行する。

TensorFlow の CIFAR-10 のチュートリアルでは、training でも evaluation でも GPU を使用する。このため、GPU のメモリーがいっぱいだと、cifar10_eval.py が走らない。

このため、cifar10_eval.py は cpu only で実行したい。cpu only なら VRAM (GPU のメモリー) の使用量にかかわらず、走ってくれる。

qiita.com

CUDA_VISIBLE_DEVICE=-1 python cifar10_eval.py

# CUDA_VISIBLE_DEVICE=-1 とすると、GPU を使わずにコードを実行してくれる。その後に、普通に "python cifar10_eval.py" と続ければOK

参考

 

 

Python3 で ファイル・フォルダー名を列挙する。

環境は Win10, Python 3.5.2

 

普通に表示する。

import os

os.listdir('.')

 

# 最近の python 3.6 なら、

# 明示的に os.listdir('.')

# と書かなくて

# os.listdir()

# で OK !

 

これだと

'.bashrc.swp', '.swp', 'Anaconda3', 'AppData', 'Application Data', 'Contacts', 'Cookies', 'Desktop', 'Documents', 'Downloads', 'Dropbox', 'Evernote', 'Favorites', 'Links', 'Local Settings', 'MNIST_data', 'Music', 'My Documents', 'OneDrive', 'Pictures', 'Recent', 'Roaming', 'Saved Games', 'Searches', 'SendTo', 'Start Menu', 'Videos'

 

のように、横に並んでしまう。

 

面倒ですが

files = os.listdir('.')

for x in files:

    print(x)

のようにすると、

.

.bashrc.swp

.swp

Anaconda3

AppData

pplication Data

Contacts

 

のように改行してくれる。

file か dir かも表記するには(bash における ls -p)

file = os.listdir('.')

for x in files:

    if os.path.isdir(x):

        print('dir:', x)

    else:

        print('file:', x)

 

file: .bashrc.swp

file: .swp

dir: Anaconda3

dir: AppData

dir: pplication Data

dir: Contacts

 

参考:

maku77.github.io

 

 

 

 

ついでに・・・


システムコマンド

$ Bash

>>> Python3

 

 

$ pwd

>>>import os
>>>os.path.abspath('.')

 

 

$ cd, ls

>>>import os
>>>os.chdir('Dropbox')
>>>os.listdir('.')

 

 

$ ls

>>>import os
>>>os.listdir('/Dropbox')

 

 

$ mv (move)

?

 

 

$ mv (rename)

>>>import os
>>>os.rename('foo.txt', 'bar.txt')

 

 

$ cp

>>>import shutil
>>>shutil.copy('foo.txt', 'bar.txt')

 

 

$ rm

>>>import os
>>>os.remove('foo.txt')

 

 

$ mkdir

>>>import os
>>>os.mkdir('folder')

 

 

$ rmdir

>>>import os
>>>os.rmdir('folder')

ディープラーニング向けパソコン自作(マザーボード編)

 

ディープラーニング向け自作には、いくつか押さえるべきポイントがあろうかと。

 

 マザーボードmini-ITXATX が良くて、 

 結論から言えば、

 

将来追加投資する気があるなら

 ATX:SLI対応 Z270マザーボード

  20万円コース!! (将来の投資10-15万円を想定)

 

追加投資はしたくないなら
 mini-ITX

  ざっくり 10万円コース

 

(お大尽されるのでしたら、X99チップセットで 4-way SLI 対応のマザーボード!!)

   どーんと30万円コース!!

 

  マザーボードは、例えば ASRock の SuperCarrier !!

pc.watch.impress.co.jp

 

 で、まずマザーボードを決めるわけです。

 上に結論書いてるけど、ここからめっちゃ長い。

 

 マザーボードの大きさにはいろいろあるので、まずそれを決めないと先に進めない。マザーボードのサイズには、他にも micro-ATX とか extended-ATX とかる。

マザーボード - Wikipedia

 

 マザーボードの大きさが小さい方から

 

 mini-ITX < micro-ATX < ATX < extended-ATX

 

 DL 向け自作なら mITX か ATX のどっちかになると思われ。

(mATXも良いとは思うけど問題もあり)

 

 ポイントは、グラボを2枚以上挿したいかどうか。

 あと、パソコンのサイズ。

 

 

 パーツ的には

mini-ITX: RAM上限 32GB, グラボ最大1枚差し

micro-ATX: RAM上限 64GB, グラボ最大2枚差し

ATX: RAM上限128GB, グラボ最大4枚差し*1

extended-ATX: RAM上限128GB?, グラボ最大4枚差し

 

 ただしこれらは理論上。

 上記よりも限界が低い製品も多い。

 

 例えば私が購入した、ASUS TUF Z270 マザーボードATXサイズですが、RAMの上限は64GB、グラボ最大2枚差しです。

 

 

 DL の学習速度を決めるのは、グラボの性能。当然2枚以上挿した方が性能は良くなる(いろいろ制限あり)。しかし、グラボは高いし、実際に2枚(以上)挿すか分からない。

 ATX はグラボを2枚(以上)させる訳なので、拡張性は ATX のがいい。mITXは1枚しかさせないけど、なにしろパソコンをコンパクトに作れるのでありがたい。

 

 で、さておき迷ったら、ちっさい ITX 買うのが良いです。なにしろ「小さい」と「安い」は正義です。将来ATXに移行したくなったら買い換えないと行けないですが、マザボとケースは買い換えて3万円くらいでしょうか?

 確かに3万円は高いですが、グラボ2枚差し仕様と思ったら10万円とか飛んでいったりするので、それと比べれば安い。まぁ比べないか。

 

 で、パソコンのサイズ。Amazonなんかで「ITX ケース」 「ATX ケース」などで検索すると、いろいろ出てくる、出てくる。

 

 で、自分としてどのくらいの大きさを許容できるかが問題なわけです。

 

 また、パソコンのサイズと関係してくるのが「形」。

 パソコンの形にもいろいろあるんですが、

 

 

  キューブとか

kakaku.com

 

 

  タワーとか。

kakaku.com

 

 

 

 初心者はタワーが良いです。キューブ型は高さと奥行きは小さくても、厚みがあって圧迫感が出るし。中には制作・パーツ交換がめんどいのもある。あ、上で提示したキューブは、おしゃれで、パーツ交換も楽なやつです。念のため。

 タワーは部品へのアクセス良好で、幅も狭いので圧迫感も少ない。

 

 ぶっちゃけ上級者もタワーが良いんではと思いますが。まぁいいや。

 

 mITXのタワーというと

kakaku.com

 こんなの。

 これは結構評価高いみたいです。

 

 ケースいくつか買ってみて分かったのは、「安いのは塗装が悪い、板もまっすぐしてなくてねじれてる」と言うこと。ま、ケースとしては使えますけど。

 高いケースと安いケース比べて(と言っても10000円のケースと、4000円のケースの違いですが)、高いがしっかりしてました。実際組んでみて。

 4000円のはゆがんでるし、塗装はげるし。

 

 まぁ高い方が良いものですよね。

 じゃないと

 

kakaku.com

 こんな ITX のくせに3万円近くするケースが売れるわけない(これかっこいい!!欲しい!!! けど買えない。かっこいいなぁ)。

 

 まぁいいや。

 

 とにかく、mITXか、ATXか決めて、ケースを買う。

 

 micro-ATX をオススメしないのは、なぜか、ですが。

 「mITXに勝る利点が少なく、ケースサイズは結局ATXと同じくらいになる」からです。

 micro-ATX を買うなら、より拡張性に優れている(場合が多い)ATXのを買った方が良い。

 

 micro-ATX が mITX に勝っているのは、

  1.メモリーの最大搭載量が64GB(mITXは32GB)

  2.グラボ2枚差しが可能

 と言う点です。多分多くの場合は メモリー32GBで足りるでしょうから、メモリーはメリットが少ない印象。グラボ2枚差しはメリットなのですが、これがトラップでして、「マザーボードは2枚差しできるのが多いのに」「グラボ2枚差しに対応していないmATXケースが多い」からです。

 

 例えばおされなこのケース、私購入して、そして返品したんですけど(手数料自腹で払って)

kakaku.com

 良いケースなんです。質感も良いし。デザインも凝ってる。おしゃれ。

 しかし、背面の拡張スロットが4つしかありません。

 体積32760cm3

 

 一般にグラボはスロット2つ消費します。4つあれば、グラボ2枚分の4スロット? 十分? と思いきや。

 グラボ2枚差しに対応しているマザーボードを見てみると、大体、グラボ2枚の間に1スロット開けているデザインが多い。

 

 例えばこのボード

ASTRIX Z270 GAMING

 

 間に1スロットあるので、拡張スロットが5つないと、グラボ2枚差しできないです。で、拡張スロット5つとなると、PCケースもでかくなる。

 

kakaku.com

 

 例えばこれは、拡張スロットが5つある、 microATX 対応のケースです。拡張性が高く、水冷や簡易水冷、大きなCPUクーラーもつけられ、6面のうち2面がクリアなデザイン。デザイン性も良いです。

 HDD/SSD搭載数も多いしすばらしい。このケースの良いところは、上下左右につなげて、2つのケースを1つのケースみたいに設置できること、みたいです。たとえばしっかり水冷を組む場合、2つのケースに1つの水冷ユニットを組んで、それでCPU/GPUを全部冷やしちゃうとか、できそうです。

 電源を大きいの1つで、2台を同時に動かすとかもね。

 

 ただ、サイズ的には結構でかい。ケース1個で幅が32cmもあります。体積は 45500cm3。

 さっき例に挙げた、ATXのタワー型ですと、42500cm3

kakaku.com

 

 まぁ、このケースはタワー型の中でも、5インチベイをなくすことで小型化したモデルなので、小さめなのですけどね。

 でも、micro-ATX よりも大きな ATX ケースの方が、体積が小さいという、逆転現象になっています。

 

 5インチベイがあるケースですと

kakaku.com

 50300cm3。

 これだと、先ほどの micro-ATX ケースよりも大きいです。

 

 さておきさておき。

 

 ATX ケースでもタワー型は幅が狭くて取り回しが良く、圧迫感は少ないです。ケースを選べば体積の小さなものもありますしね。

 しかし、その小さなケースでも、拡張スロットは7本あります。組み合わせるマザーボードにもよりますが、マザーボードによってはグラボ3枚差しまで可能です。 ケースサイズはほぼ同じでも、拡張性は高いわけです。

 

 いずれにせよ、microATX はなかなか中途半端となってしまいます。

 mini ITX でしたら、先ほど上げたのが

kakaku.com

 

 34000cm3 ですし、もっと小さなケース

 

 

kakaku.com

 11500cm3 もあります。

 これなんかちっさくて、さっきの ATX ケースの1/4以下です!

 とはいえ、このちっさいケースですと、パーツ交換が大変・内部で電源ケーブルできつきつになってしまって、冷却も悪いはず。

 

 やはりタワー型か、せめて

kakaku.com

 

 18600cm3 一回り大きいやつ、こちらは風の通りは、上のよりは良いはず。しかし、Volumeも2倍くらいになってますけどね・・・

 

 

 

 で、マザーボード

 

 mITX 買うなら、wifi 付きが良いです! ケーブルと比べたら遅いけど、なんせ便利だから。大体デスクトップパソコン使おうとすると、ケーブルだらけでぐるぐるになってしまいます。一本でも少ない方が楽!

 

 で、ATXのボードを買うなら、「SLI」対応のがオススメ。SLIはグラボ2枚(以上)を同期させて、速度を2倍近く(以上)に引き上げるやつです。 2枚挿すのを 2-way SLIとか呼びます。

 SLIしなくても、グラフィックメモリーが増えるという利点はあり、SLIしなくても良いのですが。しかしせっかく2枚挿すなら SLI した方が。

 

 さて、タワー型のケースを買うにはいろいろ考える必要あります。ケース、いろいろありますからね。

 個人的には「静音型」のケースがオススメです、っていうか、「静音型」にすれば良かった、と後悔しています。意外とファンの音がうるさかったので。

 (これについては後で、CPUクーラーについて書きたいと)

 

 静音型とは、例えばさっき上げた

kakaku.com

 

 こういうのは、開口部が狭く・少なくなっている他、ケース内部に凹凸をつけて、音を吸収するようになっているそうです。

 

 あと、PCケースで恐ろしいのがムシ、特にG様の侵入。

 

 こういう記事もありました。

gigazine.net

 

 虫が侵入すると何より不潔だし、ショートなどで故障の心配もありますので。

 これを防ぐにはどうするのか分かりませんが、周囲にホウ酸団子とか置いとくとか、ですかね?

 

 あと、G様は明るい場所がお苦手でいらっしゃるので、クリアパネル式の

kakaku.com

 (これは先ほど上げた、やや小さめのATXタワー)

 

 なんかも良いかもしれません。

 

 話が前後しますが、マザーボードには「チップセット」とか言う、パソコンの部品が組み込まれてまして。これは、あまり悩む必要なく、

 

 「SLIするならZ270、しないならなんでもいい」

 

 なので基本的には、

 

 ATX:SLI対応の Z270 のマザーボード

 mini-ITXチップセットは何でも良いけど、wifi付き

 

 のが良いと思います。私は。

 

 高性能を目指すなら、ATXかeATXのボードで、X99チップセット、4-way SLI 対応のものになるのですが、グラボ(1080ti)4枚も買ったら、それだけで40万円ですしね。グラボ買うとしても、一般人は2枚まででしょう。

 ということで、ATX の 2-way SLI で良かろうと、思います(micro ATX でも良いんですけど、ケースがね・・・自分が良いと思うのがなかったので。ATX で良いんじゃないかと思います)。

 

 

 

 で、オススメはしないけど「面白い」のとして、NUC + 外付けGPUと言うのもアリ。

 

 NUCいうのはこういうやつです。

kakaku.com

 

 ざっくり言うと、めちゃ小さいパソコン。中にグラボが入らないので、グラボは Thunderbolt 3 で外付け。

 外付けグラボはまだ一般的ではないので、ケースだけでもめっちゃ高いんですけど

AKiTiO Node | Thunderbolt™ 3 eGXF expansion chassis for eGPUs | AKiTiO

 

 こういうのがあります。

 

 まぁ値段的にはメリットはないけど、とにかくコンパクトに作れる、と言うことだけメリットですかね。なんなら持ち運ぶ気にもなる。

 さすがにタワー型デスクトップとか持ち運ぶ気にはならない、SFFでも厳しい。でもNUCならアリかも。

 

 ないか。

 

 ないね。

 

 

 今後、Thunderbolt 3 付きのノートパソコン買って、買い換えの時が来たら、外付けグラボをくっつけて DL 用マシンにしても良いですが。

 その頃には事態も変わって、グラボでDLしてないかもしれないし。FPGAだっけ? Tensor Processing Unit だっけ? なんかそう言うのでやってるかもしれませんしね。

*1:チップセットの制限で、RAM上限64GBの商品も多いので注意。

オブジェクト指向プログラミング(OOP)とは

 

 

 

オブジェクト指向プログラミング(Object oriented proglaming, OOPとは

 プログラムの保守性や再利用性を向上させる技術。オブジェクト指向プログラミング言語は (OOP language: OOPL) と呼ぶべきだが、ここでは OOPL も含め OOP と記載する。

  エドガー・ダイクストラ氏による「構造化プログラミング」(1967,goto 文を廃止し、プログラムの進行を巡行・分岐・繰り返しの3つに限定すること)を発展させたものという見方もある。

 最初期の OOP は 1967 年の Simula67OOP 自体はゼロックスパロアルト研究所(PARC)のアラン・ケイ氏が提唱し Smalltalk (Smalltalk80, 1983年発売)に引き継がれた(Alan Kay:  GUI を発明、ダイナブック構想を提唱)。コードの修正や保守、再利用が簡単となった。

 当初、「『オブジェクト』が『メッセージ』をやりとりすることでコンピューティングを行う」ことを意味しており、コンピュータを動かすソフトウェア(OS)として開発されていた、らしい(そもそも Smalltalk は OS として開発された, Wikipedia 情報)。

 後にビャーネ・ストロヴストルップC++ (1983年)の開発を通じて「カプセル化 encapsulation、継承 inheritence、多態性 polymorphysm」の概念を追加した。現在では、この 3つが、「OOP の特徴」として言及されることが多い。

 OOP が出てきた結果、ソフトウェアの再利用部品群(クラスライブラリフレームワーク)が開発されることとなった。その有用性から、現在では多くのプログラミング言語に取り入れられている。

 

現在の多くの言語が OOP (やライブラリ)を取り入れている。

OOPL の例としてあげられるのは、

 Simula67, Smalltalk, C++, Perl, Python, Java, Ruby, C#...

など。

 

 「オブジェクト」「クラス」等の説明

クラスとは、オブジェクトの性質を表すもの。

一般にプログラミング言語では、「オブジェクト」という名前のクラスが設定されていて、それがすべてのクラスを含むスーパークラスなっている。その「Object」のクラスの下に「Number」「String」・・・などのクラス(サブクラスという)があり、「Number」のサブクラスに「Int」「float」・・・などがある、といった構造を取るらしい。

 

 

 

クラスは、データとメソッドから構成される。

 クラスに属するデータをインスタンスという。

 例えば「Cat」クラスのデータとして「タマ」「トラ」「ミケ」インスタンスが属する。

 メソッドとは、処理のこと。

 

メソッド(method)とは

 関数の一種であり、クラスに所属していて、インスタンスに対する処理を規定している。サブルーチンとかメンバー関数 (member function) と言われたりするらしい。

 

関数(function)とは

 複数の処理を一つにまとめたもの。ルーチン、プロシージャー(procedure)と呼ばれることも。

 プログラム全体のルーチンをメインルーチン、呼び出されるものをサブルーチンとも言う。

 複数の処理を何回も行い場合、一つの関数にまとめることで保守、管理を容易にし、プログラムの構造も簡素化される。

 

インスタンスメッセージをやりとりすることで動作する。

 メッセージとは、オブジェクト間のデータの送受信。

  メッセージは相手のクラスによって、異なって解釈される。これが多態性 Polymorphysm 

 

メッセージ自体は処理を定義していない。クラスに含まれるメソッドに処理が記載されている。このため、異なるクラスに同じメッセージを送った場合でも、異なる動作を行うことができる。これがポリモーフィズム。 

 

 

OOP の3つの特徴 として言われるのは、

 カプセル化 encapsulation クラスなどを利用して、インスタンスやメソッド、データ型などを見えなくすること。カプセル化により、プログラムの保守性が向上する。

 ポリモーフィズム polymorpism メッセージが多様に解釈されること。

 継承 inheritance クラスを、他のクラスへと引き継ぐこと。引き継ぎ元がスーパークラス、引き継ぎ先がサブクラスと呼ばれる。

 一つのオブジェクトが、複数のスーパークラスから情報を引き継ぐのが多重継承。便利な反面、プログラムが複雑化する原因ともなる。Ruby では多重継承を制限しており、複雑さを避けるため、 Mix-in と言う方法でしか多重継承できない。他の OOP, 例えば JavaPython は一般的な多重継承をサポートしている。

 

 

OOP の定義には含まれないが、OOPL に一般に含まれるもの

 パッケージ:複数のクラスをまとめたもの。これを導入することでプログラムが簡潔に記載できるようになる。パッケージを使うことで、関数やクラスの名前の衝突を防ぐこともできる。

 例外:エラーが発生した場合、処理を中断してエラーを返す仕組み。

 ガベージコレクション:不要になったメモリを(自動的に)解放する機能。

 

 

変数グローバル変数、ローカル関数、インスタンス変数

 それぞれアクセス可能範囲が異なっている。

 必要に応じて使い分けましょう。

 グローバル変数はプログラムのどこからでもアクセスできるため便利。一方で、意図しない場所で呼び出されてしまう危険もある。ローカル関数は逆に、意図しない場所で呼び出されたりすることは防げるが、プログラムの一部の場所でして美出せず不便である。

 

 

型付け:静的型付け、動的型付け

 型付けとは、そのプログラミング言語が型(class)をどのように扱っているかの指標。一般に「強い」「弱い」などと言われる。

 静的型づけコンパイル時に型のエラーを検出する:Java, C#

 動的型づけ:プログラムの実行時点でエラーを検出する:Ruby, Python

 

 

「強い型付け・弱い型付け」は「静的型付け」に対して使われる単語らしいが(型付けとは (カタヅケとは) [単語記事] - ニコニコ大百科)定義が曖昧なので(C#は強い型付けの言語?それとも弱い型付けの言語? - 猫とC#について書くmatarilloの雑記使うべきではない用語のようだ。

 

実際、「入門Python3(オライリー)」では、強い型づけ(Strong typing)

 「クラスがイミュータブル(変更不可能)であること」

と書いているなど、本によって書いてあることが違ったり。

 

 

 

プログラミング言語の歴史

機械語(machine code, machine language): 0, 1 によって書かれたプログラム。ヒトには理解しにくい。

アセンブリ言語(assembly laguage):1940年代から使用されてきた。簡単な単語によって書かれ、アセンブラコンパイラの一種)によって機械語に変換される。代表的な低級言語(low-level language)。マシンのリソースが限られている場合には、現代でも使われる場合がある。

高級言語(high-level language):人間が理解しやすい文法を持った言語。1957年のFORTRAN, 1960年のCOBOLが例としてあげられる。

構造化言語(structured programing):1967年オランダのエドガー・ダイクストラ氏によって提唱。プログラムを好きな順序で実行できる GOTO 文を廃止し、移動を「巡行」「分岐(if)」「繰り返し(for, while)」の3つに限定。構造化言語とされるプログラミング言語には ALGOL, Pascal, C などがある。 

 

プログラム実行方式

コンパイラ方式:機械の理解できる機械語に翻訳(コンパイル)してから実行する。コンパイル後のソフトウェア実行速度は速いが、コンパイルの手間がかかる。コンパイル後、他のOSに移植することはできない。C++

インタプリタ方式:実行時に機械語に変換。実行速度は遅いが、一般にOSに依存せず、共通の仕様を実現できる。Perl, Python, Ruby. これらは、同じ作業を実装するために必要なコード記載量が少ないという特徴もあり、マシンリソースが潤沢な環境では良い選択枝。マシンリソースが限られている場合には vice versa

中間コード方式:実行前にコンパイルするが、機械語ではない中間コードまでコンパイルする。両者のいいとこ取りでOSに依存しない、比較的早い。Java, C#

 

 

プログラムのメモリ利用

静的領域(static):プログラムの開始時に確保され、プログラムが終了するまで確保される領域。

シープ領域:プログラムの実行時に動的に確保するための領域。

スタック領域:スレッド制御のために使う領域。スタック、すなわちデータをどんどん積み重ねていく。

 

 

OOP に関連した再利用技術

 クラスライブラリ フレームワーク コンポーネント:これらは名前は違うが、ほぼ同じもの。

 クラスライブラリ:複数のクラスをまとめて提供するもの。ディープラーニングでよく出てくる TensorFlow は、トップに「An open-source software library for Machine Intelligence」と記載OOP ではプログラミング共通部分(言語仕様)はコンパクトにまとめ、必要な様々な機能はクラスライブラリとして提供するのが一般的。これによりプログラム本体の変更は最小限にとどめることができる。クラスライブラリは大幅に変更されることがあり、OOPを使いこなすには、クラスライブラリを使いこなす必要がある。フレームワークは複数の意味を持ちうる。クラスライブラリと同じ意味のこともあるが、開発・実行環境などを表す「Webアプリケーションフレームワーク」とか使われる場合もあり、クラスライブラリよりも広い概念のようである。日本発のディープラーニングフレームワークChainer: 「A Powerful, Flexible, and Intuitive Framework for Neural Networks」と記載。さて、ライブラリとフレームワークはどこが違うのか?同じなのか? コンポーネントVisual BasicJava で、商品として提供された再利用部品群らしい。

 

OOP以外のプログラミング言語のトレンド

関数型言語プログラミング言語の仕組み。OOPと対立する概念ではなく、OOPかつ関数型の言語もある(例:Python)。対立する概念は命令が多言語で、機械語を表す単語を組み合わせてプログラムを記述する。7つの特徴がある。関数型プログラミングの平行が異変として、命令的プログラミング(従来のプログラミング)や論理プログラミング(logic programming)がある。

 

関数型言語の特徴

関数でプログラムを作るOOPではクラスとメソッドを使う(引数を指定して関数を呼び出す)。関数型では関数:引数と戻り値を必ず持つ を使う(引数に関数を適用する)。

すべてが式。すべての式が値を返す:従来の命令的プログラミング(imperative programming)では命令(statement)を実行(execute)する手続き的プログラミング(procedural programming)と言われるところ、式(expression)を評価する(evaluate)ことでプログラムが進行する宣言型プログラミング(declarative programming)と言われる。関数や計算のみならず、データに対しても値を返す。必ず値を返すため、関数型言語で、式は return ステートメントがない(ことが一般的)。

関数を値として扱える:関数を引数や戻り値として扱うことができる(高階関数,higher order function)

関数と引数を組み合わせられる:「部分適用」二つ以上の引数を持つ関数において、一部の引数だけを適用して別の関数を作成する(これをカリー化と呼ぶ:Haskell Curry 氏の名前より)。「関数の合成」

副作用を起こさない:副作用とは、「引数から戻り値を求める以外の仕事」。副作用を認めない関数型言語純粋関数型言語。引数を一度設定したら変更できないため、変数に値や式を設定することを代入(substitution)と呼ばず、2度と変更できないことから束縛(binding)と呼ぶ。副作用がない場合、引数が同じなら戻り値も同じになる。これを参照透過性(referential transparency)とよぶ。

 遅延評価(lazy evaluation)は式を上から評価するのではなく、必要になった時点で個々の式を評価する仕組み。

場合分けと再起でループを記述する:for や while は関数型言語と相性が悪い。終了判定のための変数を制御できないらしい。一般にパターンマッチと再起でループ処理を行う。パターンマッチは引数の値に応じて場合分けし、関数を定義するしくみ。

コンパイラが型を推測する(型推論 type inference):型変数と呼ぶ仮の型をコンパイル時に指定。型変数を使って定義した型のことを多層型と呼ぶ。ポリモーフィズムとは違う仕組みである。

 

 

プログラミング言語リスト 

OOP以前の高水準言語

FORTRAN(1957年):史上初の高水準言語(ジョン・バッカスIBM)。「数式翻訳」を意味する英語「formula translation」に由来する。最新バージョンは2008(2010年)。現在でもスーパーコンピュータ向けの言語として、C/C++と共に提供される。

LISP(1958年)関数型プログラミング言語らしい(ジョン・マカーシー)。いろいろと先進的な部分があり、多くのプログラミング言語に影響を与えた、らしい。関数型言語 (functional language)は、「関数型プログラミングを基本スタイルとして推奨する機能を持つプログラミング言語」で、その例として他に Haskell(1990年)、Scala(2003年)、Julia (2012年)がある。

ALGOL(1958年):命令型プログラミング言語。「アルゴリズム言語」を意味する英語「algorithmic language」に由来。ヨーロッパの研究者が、世界共通のプログラミング言語として開発した。1958年にチューリッヒ工科大学で行われた国際会議で提案されたのが起源とされる。多くの言語に影響を及ぼし、ACMや教科書や学術論文などでアルゴリズム記述のデファクトスタンダードとして30年以上使われた。使われ「」。「使われた

COBOL(1959年):グレース・ホッパーその他。アメリカ合衆国の強い関与の元で作られた言語で、政府や公的機関を中心に採用されていた。Common Business Oriented Language

 

OOP以降

Simula67:1967年登場(オルヨハン・ダール、クリステン・ニガード:ノルウェー)。最初期の OOP と言われているシミュレーション目的に作成されたプログラミング言語。SIMUlation LAnguage の abbriviation で、ALGOL60を拡張する形で1960年代に開発が始められた。

C言語 :1972年 AT&Tベル研究所にて開発。OOPではない。あらゆるコンピューターで動く古い言語で汎用性が高く、動作も速い。実行にはコンパイルが必要。低級言語と高級言語の両方の特徴を持ち、習得が難しい。C++, Java, C# など、様々なプログラミングの基礎となっている。

MATLAB:1970年代にクリーブ・モラーによって開発。学生がFortranを学ぶことなくLINPACKやEISPACKにアクセスできるようにと設計した。これを販売するために Mathworks 社が設立され、現在では半年に1度のバージョンアップを繰り返している。

Smaltalk:1980年公開。世界初のオブジェクト指向プログラミングを謳った言語? ゼロックスパロアルト研究所(PARC)で1970年代に約10年かけ3世代(Smalltalk-72、76、80)を経て整備された。元々は dynabook 「Alto」 の OS として開発された。現在はシンコムより VisualWorks(ビジュアルワークス)という製品名で主要なオペレーティングシステム向けに販売されている。

C++:1983年登場(ビャーネ・ストロヴストルップ:デンマーク)。Cの拡張版で、当初の名前は C with class であったことから分かるとおり、OOPである。クラス、仮想関数、多重定義、多重継承、テンプレート、例外処理といった機能が追加されていった。

Objective-C:1983年(ブラッド・コックス:米)。ほぼ MacOS, iOS の開発専用言語だが、2014年に Swift が出たことで今後はどうなるか。

Perl:1987年(ラリー・ウォール:米)、 AWK、BASIC-PLUS、C、C++LISPPascalsed, シェルスクリプトなどに影響を受けて作成された、コンパイル不要な動的型付け言語。元々はOOPではなかったらしい。

Python:1991年(グイド・ヴァンロッサム:蘭)。Google 3大言語の一つ(C++, Java, Python)。元々はOOPではなかったということ。

Java:1995年登場(サンマイクロシステムズ, OOP)。Java Runtime Environment JRE を使う。Java とは 開発施設の近くにあった喫茶店の名前から、とか、いくつかの由来が言われている。元々は Oak と言う名前で開発されていたが。CやC++などから多くを引き継いでいる。C++になかったガベージコレクションが追加されている。コンパイル時に中間言語コンパイルされてJavaプラットフォーム(JVM)上で動作するため、特定のOSに依存しない。プログラミング言語人気ランキング1位の常連である。

JavaScript:1995年に登場(ネスケ/Mozilla)。スクリプト言語。主にブラウザ上で実行される。JavaJavaScriptは名前は似ているが、パンとパンダくらい、オーストリアとオーストラリアくらい違うらしい。

Ruby:1995年(Mats:日)。PerlSmalltalk、Eiffel、Ada、Lispの一部をブレンドして作成された、 関数型プログラミングと命令型プログラミングが絶妙に調和された新しい言語。

php:1995年登場(1995年はプログラミング言語特異点だ。ラスマス・ラードフ:加:オランダ系)。名称の PHP再帰的頭字語である "PHP: Hypertext Preprocessor" を意味し、「PHPはHTMLのプリプロセッサである」とPHP自身を再帰的に説明している。Webページを作成することに特化した言語らしいが、いろいろだめなところが多いため、定期的にネタにされる。それでも初心者が学びやすいらしく、プログラミング言語人気ランキングをすると大体10位までに入ってくる。

R言語:1996年登場(Ross Ihaka, Robert Clifford Gentleman:ニュージーランドオークランド大学)。動的型付け関数型・オブジェクト指向プログラミング言語。統計解析向けとして開発されたフリーソフトウェアだが多機能で、機械学習ディープラーニングにも使用されている。ニュージーランドオークランド大学のRoss IhakaとRobert Clifford Gentlemanにより作られた。

C#:2002年マイクロソフトが開発。Microsoft .NET Framework 上で動き、Linux上でも(互換ソフトにて)動く。C++, Delphi, Eiffel, Java, LISP に影響を受けた。

パソコンの稼働状況を確認する。

1.Win10:タスクマネージャー

 Win + X

 Win + T

にて起動。

 

 

2.Ubuntu:システムモニター

 Super," system monitor"

とタイプする。

 

 

3.UbuntuGPUの使用状況を確認する。

 NVIDIAなら

ターミナルから

nvidia-smi

にて表示。

 

経時的に観察する場合、

nvidia-smi -l 2

で2秒おきに取得するので、使用状況を grep する。例えば

nvidia-smi -l 2 | grep Default

にて使用状況のみが表示されるはず。

 

 

4.Ubuntu, Psensor 

 CPU の稼働状況、温度、GPU の温度を図示できて便利。

 ソフトウェアセンターからインストール可能。

 

 

5. Ubuntu, バッテリー残量表示

 upower -i /org/freedesktop/UPower/devices/battery_BAT0

 upower -i /org/freedesktop/UPower/devices/battery_BAT1

パソコン設定備忘録、デスクトップDNNマシン

1.Ubuntu 14をインストール

 パーティション自分で切っても良いが、「お任せ設定」でのインストールが方が楽だし失敗しない。

 

 

2.LANを認識しないので、インテルからファイルを落としてインストールする。

 

Download Intel® Network Adapter Driver for PCIe* Intel® Gigabit Ethernet Network Connections Under Linux*

 ダウンロード

tar/zipコマンドで解凍・圧縮一覧まとめ(gz、zip、tar.xzなど)

 解凍

tar zxvf filename

UbuntuでNICを認識しない場合の対処法 - Qiita

 解凍したフォルダー内の e1000e-3.3.4/src/ に移動し、

sudo make install
sudo modprobe -r e1000e
sudo modprobe e1000e

 

 ネット 繋がったら、お約束の

sudo apt-get update

sudo apt-get upgrade

 

 

ひゃーめんどくさい。別で買った mini-ITXwifi 付きボードではこんなことはなかった。簡単に wifi 繋がっちゃうし。やっぱ wifi は便利!

 

 

3.Ubuntu 14 インストール。

 日本語キーボードなら日本語Remix、英語キーボード使うなら英語版入れちゃう方が楽。

 

 

3.基本設定

 クローム、Team Viewerを入れる。

 Team Viewer 入れると、遠隔から GUI で操作できるので楽。

 Teamviewer はダブルクリック(パッケージマネージャー)でインストールできないので、

sudo dpkg -i filename

 でインストール。

ただし Ubuntu 14 ではエラーが出てインストールできない。

apt-get install -f

にて無理やりインストールできる。

  インストール後は、パスワードを複雑化しておくなど、セキュリティに気をつけること!

 なお、Teamviewer 経由で WOL できるみたい。未検証ですが。

 

 

4.基本設定

Ubuntu 14.04 LTSをインストールした直後に行う設定 & インストールするソフト

 

プロンプトの色変更

 nano ~/.bashrc

 

 # to change the prompt calor of the terminal
PS1='\[\e[1;36m\]\u@\h \W \[\e[0m\]$ '

 

 

 を追加する。

 

 

5.Anaconda

 Anaconda 4.2.0

ダウンロードしてインストール。

最新版はPythonがあたらしすぎて、ライブラリが対応していない場合がある。私の場合は、現状 Python3.5 を使用(Conda でバージョン管理するなら、黙って最新版を入れればOK)

 

 

 git

 OpenCV

sudo apt-get install git

conda install opencv

 

 

  

6.cuda/cudnn

  デスクトップパソコンを直接操作にて。

 

cuda

参考:

インストール方法はこちら。

www.nemotos.net

 

参考

MacBookPro + Ubuntu 14.04にCUDA-6.5をインストールしようとして7.5をインストールした話 – note at home lab

普通にダウンロードして、ダウンロードフォルダに移動。

 

今回 cuda 8.0 の Ubuntu バージョンをインストール。

sudo dpkg -i [filename]

sudo apt-get update

sudo apt-get install cuda 

で終了。

 

ターミナルに

nvidia-smi

と叩いて、エラーが出なければOK

 

 

 

 

cudnn

CUDA 8.0とcuDNN 5.1をUbuntu 16.04LTSにインストールする - Qiita

tar xzvf cudnn-8.0-linux-x64-v5.1.tgz
sudo cp -a cuda/lib64/* /usr/local/cuda-8.0/lib64/
sudo cp -a cuda/include/* /usr/local/cuda-8.0/include/
sudo ldconfig

 

tensorflow が立ち上がらない時のメモ。

stackoverflow.com

 

 

 

(今後の予定) 

 

7.WOL

 遠隔で電源を入れられるようにする。

 これができれば、あとは LAN につないで目立たないところに置いておけば宜し。