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

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


DNN:
マシン性能別 学習速度の比較, TFチュートリアルをmodifyする

python3:
オブジェクト指向プログラミングとは, モジュールとインポート、パスを通す, システムコマンド(os), ファイル・フォルダ名取得, 画像の前処理,

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

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チップセット何でも良いがwifi付き

  ざっくり 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の商品も多いので注意。

日記 いろいろ一段落

 と言うわけで どういうわけか ブログしばらく非公開にしていましたが、気が向いて再び公開設定にしました。

 

 この間に DL用 コンピューターが届き、セットアップ。いろいろ気になったので部品交換をしたりして、思った以上にコストがかかってしまいました。

 いろいろパーツを組み替えて、

  i3-7100, 1070

  i3-7100, 1080ti

  i5-7600K, 1070

  i5-7600K, 1080ti

 で CNN-MNIST を試してみましたので、近いうちにデータをまとめます。

 

 結論から言えば、言われているとおり

  GPU が重要

  CPU は速度に影響なし

 でした。

 

 この速度は、値段におおむね比例する結果でしたが、消費電力(1070:150W、1080ti:250W)考えたら、1080tiの方が効率良いですね。1080ti の方が 2倍以上早かったので。

 1080ti は Founders なので、なんというか「poor fan」モデルです。CNN を学習させると、80度くらいまで温度上がってしまいます。しかしケース内に排熱しないのは良い点です。ケース外に排熱しますので、ケース内に熱がこもりません。消費電力はおおむね 180-250W あたりをうろうろするので、熱のために頭打ちにはならず、性能は出てるんだろうと思いますが。こんなで高温で、何日も動かして大丈夫か不安です。

 一方で、廃熱のために「わざと」高熱にしてるのかもしれずよく分かりません。

 熱を放出するには、当然、周囲との温度差が大きい方が、一定時間に大量に熱を捨てることができますから。「高熱で壊れるか心配」と書きましたが、「通常利用で壊れるようなものを売らないよね」とも考えられます。

 

 1070 はオリファンのヒートパイプモデルで、60度台までしか上がりません。「ヒートパイプってすごいなー」と思います(小学生並みの感想)。しかし廃熱はケース内なので、廃熱が良いケースでないとケース全体が熱を持ってしまいます。ま、べつにいいっちゃ良いんですけど。

 1080ti は 2台目を買おうと思いますが、ケースがかっこいい Founders にするか、冷却が効率的なオリファンにするかで悩んでおります。

 

 アメリカ Amazon をよく見ます・・・パソコン部品は日本より多いし、何より安いので。

 

 1080tiの値段は目間ぐるしく動きますね。

 アメリカでは、ゲーミング系の部品メーカーではEVGAが一番人気。ASUSが二番、MSIが三番人気のようで、同じ Founders の 1080ti でも、EVGAが最も上段に来ています。EVGAが最上段というのは、オリファンモデルが最も早くに出た こともあると思いますが(Amazon.com内で、オリファンモデルを一番最初に発売したのはEVGA:私の観測範囲内ですが。また、オリファンと Founders をひとまとめにしているのもうまい売り方です。Founders とオリファンモデルの売り上げが加算されて順位が上がり、順位が高いからこそよく売れる好循環という印象)。

 Foundersの値段は699ドルで横並びですが、面白いのはEVGAでオリファンモデルが出てきた当初、オリファンの方がFoundersより安い時期が一瞬ありました。EVGAのSC2という、銀色の2枚fanモデルです。今から思えば、これは「買い」でしたね。

 また、ZOTACと言うメーカーのFoundersは、なんと679ドル! 他はみんな699ドルなのに、一歩安くなっています! Amazonアルゴリズムで価格を自動操作していると言われますが、Zotacのはよっぽど売れていないのでしょうか・・・

 一番上の EVGA は、先日まで Founders が 699 ドルでしたが、今では700ドル超えています。人気が上がってきたのかな。

 なかなか興味が尽きません。

 

 アメリカ Amazon にはいろいろ面白い製品が売っています。例えば、GPU 用の後付けの ヒートパイプ付きオリファン(ARCTIC Accelero Xtreme III)。6000円程度。

 (日本の Amazonではめっちゃ高かったと思います。覚えてないですが)

 

 GPU の各社のモデル、ネット記事によると「オリジナルファン」「オリファン」とか言うのですよね。てっきり「fan」が重要なのだと思っていましたが。ファンも大事ですが、むしろ、ヒートパイプを用いたクーラー部分が冷却には重要みたいですね。上述の Arctic Accelero Xtreme III は後付けの  GPU クーラーで、ヒートパイプを使っています。

 各社の GPU オリファンモデルも、皆ヒートパイプを使っていますもんね。

 

 「GPUなんて2-3年持てば良い」と言って founders を買うのも良いと思うし、「冷えた方が性能が出るはず」と言ってオリファンを買うのもアリだし、悩ましいものです。

 簡易水冷モデル、あるいは本格水冷でも良いのですが、「複雑になるほど故障するパーツが増える」と思っているので、2の足を踏んでいます。水冷のモデルって、高くて重いですしね!

 

 さて、1ヶ月ほど前は「1080tiが出そう!!」だったか、「1080tiが出たけど買えない!!」的な状況でした。2週間ほど前は「1008ti Founders 売ってるけど高すぎる!! オリファン出てない!!」状況だったのが、最近はオリファンモデルも各社出そろい、水冷キットも出てきましたね。

 

 こうなると機能が乏しく感じられる TITAN X に対して、NVIDIA は TITAN Xp という、より強化したモデルを発表してきました。また、ローエンドとして GTX 1030 がもうすぐ発表されるとかいう噂もあります。

 TITAN Xp は性能的には魅力ですが、コスパ的には、自分的には「ない」ですね。多分、TITAN X (Pascal) よりお高いのでしょうから、15-20万円ほどでしょうか? それなら 1080ti 2本買って、SLI した方が性能が出るでしょうし。

 

 来月にサンフランシスコかどこかで開かれるイベントで、Nvidia の次期アーキテクチャ、Volta (GeForce GTX 20x シリーズと噂される)が発表されるそうです。行ってみたいけど、参加費(講演など聴けるようにすると)だけで10万円超え。

 残念ですが、行けないですね。ITmedia とかの、ネット記事待ちです。

 

 こういう値段を見ると「日本ってヤバいな」と思うのですが。だって日本のカンファレンスって、3-4日のものでも参加費1-2万円とかざらですからね。欧米では、1週間のカンファレンスなら普通10万くらい行きますよね。

 10万円のカンファレンスに行ったからって、知識が急につくとは思いませんが。でもそういうところで得られる最新情報に普段から触れているか・触れていないかって、大きいと思いますよ。

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

記載されている年は基本的に登場年

強調されてるところとか見ると違和感があるかもしれないけど、私は DNN のために Python を学び初めた初心者。普通のプログラミング初心者が躓かないところで躓いてると思われ、そっとしておいてください。

 

 

 

オブジェクト指向プログラミング(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) とも言われる"

 

プロシージャー(procedure)とは

 プログラミング言語によって定義は異なるが、一般的には複数の処理を一つにまとめたもの。手続きと訳され、ルーチンまたは関数とも言う。プログラム全体のルーチンをメインルーチン、呼び出されるものをサブルーチンとも言う。保守、管理を容易にする手法。

 

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

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

 

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

 

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

・・・以上・・・

 

 

 

 

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

 カプセル化 encapsulation クラスなどを利用することで、インスタンスやメソッド、データ型などを見えなくすること。カプセル化により、プログラムの変更が容易になる。例えば色を扱うとき、RGBカラーを扱うプログラムを、CMYKへと変更するとき、より少ない手間で変更できる、みたいな。Javaでは、変数に private をつけることで、ローカル関数としてしかアクセスできなくする。Java には3つのアクセス修飾子public, protected, private) が存在し、この設定により、どこからアクセスできるかを決定する。

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

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

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

 

 

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

 パッケージ:複数のクラスをまとめたもの。これを導入することでプログラムが簡潔に記載できるようになる。パッケージは、名前が一致(衝突)しないように開発されている。

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

 ガベージコレクション:不要になったメモリを(自動的に)解放する機能。これがないプログラムでは、メモリの解放を明示的に指定しなければならず、プログラミングが大変になる。

 TensorFlow ではビデオメモリが不要になっても解放されないので、ほんと困る。複数の処理を立ち上げようとしても立ち上がらなかったり。

 

 

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

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

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

 グローバル変数はプログラムのどこからでもアクセスできるため便利だが、どこからでも変更される危険があるため仕様に注意が必要。ローカル関数などはその逆。

 

 

型付け,型チェック:静的型付け、動的型付け

 静的型づけコンパイル時に型のエラーを検出する: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年(奇しくも SIMULA67 が世に出たのとと同じ年?)にオランダのエドガー・ダイクストラ氏によって提唱。プログラムを好きな順序で実行できる GOTO 文を廃止し、移動を「巡行」「分岐(if)」「繰り返し(for, while)」の3つに限定。構造化言語とされるプログラミング言語には ALGOL, Pascal, C などがある。

 巡行は、BASICで10, 20, 30, とプログラムを書いていたところに、後から 4行目に 15 と2番目の行を追記するやつ ができなくなるのかな?

 

 

プログラム実行方式

コンパイラ方式:機械の理解できる機械語に翻訳(コンパイル)してから実行する。コンパイル後のソフトウェア実行速度は速いが、コンパイルの手間がかかる。コンパイル後、他の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 の応用

デザインパターン(design patterns):優れたライブラリ設計のアイデアを後から再利用できるように名前をつけて文書化したもの。クラスライブラリなどから抽出され、そしてクラスライブラリなどを作るために再利用される。1995年、GoFの著書、「Design Pattern」によって広く世に知られるようになった。

 

オブジェクト指向を利用したシステム開発では、データをまとめたり、メソッド(クラス内に存在するサブルーチン)にクラスを応用することで、開発を簡略化できた。どのようなデータをどのように処理するかなど、何をどうプログラミングするかなど全体のデザインを決める上流工程でも、下流工程、実際の開発や製造すなわちプログラミングなど で OOP をどう生かすかを考える様になった。

 

UML, Unified Modeling Language:ソフトウェアの機能や内部構造を2次元の図に表現する形式を定めた世界標準。以前は多数の表記法が、様々なメソドロジストによって提唱されていた。3人のメソドロジストが1990年代中盤にまとめ、OMG(Object Management Group)が採択したことで広まった。

UMLの使い方

OOPを表現する:クラス図(クラス間の関係、継承などを表記)、シーケンス図(時系列的な動作)、コミュニケーション図(動作時のオブジェクト間のやりとり、すなわちメッセージ)

OOPをどう利用するか:ユースケース図(どのようにプログラムを使うか)、アクティビティ図(時系列的な業務の流れ。シーケンス図に似ている)、ステートマシンズ(状態遷移図と同一。業務フローチャート的な)

 

どのように開発するのかを決めるにはUMLを使ったモデリング、すなわち、図示することで理解が深まるため、システム開発を円滑にすることが期待される。

 

アジャイルAgile)ソフトウェア開発

従来のウォーターフォール型ソフトウェア開発(に対する言葉。小さなリリースを繰り返しながら段階的にソフトウェアを作り上げる。

ウォーターフォール型ソフトウェア開発とは、開発プロジェクトを時系列に、「要求定義」「設計」「プログラミング」「テスト」などの作業工程に分割し、前工程を完了してから次工程に進む開発手法。背景としてプログラミングが進行するにつれて前工程の変更コストが大きくなることがある。このため、変更を少なくし、開発の進捗を管理するのに有効な方法であった。

 将来の見通しが(一見)立てやすいメリットがあるが、プログラミングは実際には予定通りに進むことは少なく、時に「デスマーチ」に突入する。「みずほ銀行 システム開発」等の検索結果参照のこと。

 開発において、「要求定義」「設計」の成果物として大量の文書が発生するがこれは「プログラミング作成のコストよりも文書作成のコストの方がずっと低いこと」が背景にあった。

 問題点として、1.仕様変更(現場の仕様変更の希望に追従しにくい)、2.全体テストが最終段階にある(全体像に関わる問題が最終段階になるまで気付かれなくなり、変更コストが上昇する)ことがある。

アジャイル型ソフトウェア開発(初出, 2001年)反復型開発プロセスとも言う。開発対象の小さな機能に分割し、1つの反復 (イテレーション:1-4週間程度の期間)で1つずつ機能を開発し、それら中間リリースごとにユーザーからフィードバックをもらい適切なソフトを開発していく手法。反復を繰り返すことで開発を進めていく。要求定義、設計、実装、テスト、文書化といった全ての工程を、1つの反復内で行う。反復が終了するごとにプロジェクトにおける優先度を評価し直す。ウォーターフォール型と比べて見通した立ちにくいが、実態に合った開発手法である。

RUP, Rational Unified Process(ラショナル:理性的な統一プロセス):RUP は商用の開発プロセスであり、ラショナル・ソフトウェア社(UML標準化に大きな役割を果たした。2003年に IBM により買収)後に IBM 社により販売されている。

エクストリーム・プログラミング(extreme programming, XP, 初出1999年)は Agile開発の一種というか。Agileよりも先に出てきたもので、書籍で提案された概念?。その特徴は、テスト駆動、ペアプログラミングリファクタリング等、19の「プラクティス」と称される。従来は開発が進むにつれ変更コストは大きくなることから、変更が少なくてすむ(予定の)ウォーターフォール型の開発がなされてきた。XPでは様々な対策により、変更コストが大きくならないように工夫し、変更に対する柔軟性を実現する。ソースコードプログラマ中心のアプローチであり、それゆえ発注者・管理者側の忍耐が必要な開発手法である。「テストがうまくいったら鐘を鳴らして皆で喜べ」とか「お菓子を食べながらプログラミングせよ」などと書かれているらしい。

 

テスト駆動(Test Driven Development, TDD):まずテストコードを作成し、テストが失敗することを確認する。次に本体コードを作り、テストを通ることを確認。さらにリファクタリングする。不具合の早期発見、仕様変更への早期対応、モジュールの独立性維持などに役に立つ。

リファクタリング(refactoring):完成したプログラムの外部仕様を変えずに、内部構造を改善する。書籍「リファクタリング(1999年)」年に詳しく記載。従来は「動いているコードに触るな」が常識だったが、ソフトウェアを長期間にわたり、手を加えて使い続けるために有用なプラクティス。

継続的インテグレーション(Continuous Integration, CI):専用のマシン環境を用意し、数時間おきにテストを実行すること。モジュールの統合でトラブルが発生しないように、問題点を早期発見する。xUnit は様々な言語の単体テストフレームワークを総称する単語。JavaJUnit、.NETのNUnitRubyのRubyUnit、Pythonのunittestなどを総称。

ペアプログラミング:一人がコードを書く、もう一人がレビューをする(定期的に入れ替える)ことで、コードの質を改善するほか、コードの相互理解に繋がり、保守できる人を絶やさないようにする手法。

 

OOP後のトレンド

アスペクト指向プログラミングOOPを使っても、プログラムの様座な部分に分散してしまう共通な処理を分離して記述する仕組み(横断的関心と呼ぶ)。

エージェント指向プログラミング:能動的に活動する「エージェント(ユーザーの代理)」を設定。外部からのメッセージ受信により初めて仕事をする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