【Java11】02 Javaの開発環境構築 バージョン管理編

2020年4月24日作成

備忘録として残しておきます。

1. Javaのバージョン確認

1.1 ターミナルにコマンド入力
まずMacに入っているJavaのバージョンを確認

入力
————————————————–
/usr/libexec/java_home -V
————————————————–

出力
————————————————–
Matching Java Virtual Machines (3):
13.0.2, x86_64: “Java SE 13.0.2” /Library/Java/JavaVirtualMachines/jdk-13.0.2.jdk/Contents/Home
11.0.7, x86_64: “Java SE 11.0.7” /Library/Java/JavaVirtualMachines/jdk-11.0.7.jdk/Contents/Home
1.8.0_251, x86_64: “Java SE 8” /Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home
————————————————–

11と13はオラクル社のサイトからインストーラをダウンロードして導入しました。
今は長期サポート版の11を使っています。

1.1.1 バージョンの切り替え方法
下記内容を.bash_profileに追記

————————————————–
export JAVA_HOME=”$(/usr/libexec/java_home -v 11.0.7)”
export PATH=”/usr/bin:${PATH}:${JAVA_HOME}”
————————————————–

1.1.2 切り替え後のバージョン確認

入力
————————————————–
java –version
————————————————–

出力
————————————————–
java 11.0.7 2020-04-14 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.7+8-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.7+8-LTS, mixed mode)
————————————————–

1.2 macのシステム環境設定でも確認可能
Java ー Javaコントロールパネル ー 一般 ー バージョン情報

※JDK(Java Development Kit)
オラクル社のOracle JDKとオープンソースのOpenJDKがあります。前者は2019年4月から商用では有償となりました。

【Java11】01 Javaの開発環境構築 プロローグ

2020年4月24日作成

JavaでもExcelファイルを扱ったり、スクレイピングをするため開発環境構築に取り組みました。

何度も壁にぶつかりながら、3日ほどでようやくApache POIを使ってExcelファイルの簡単な操作ができるようになりました。

最初は代表的な統合開発環境であるEclipseを導入しましたが、趣味レベルで遊ぶには大掛かりなのでVScode + プロジェクト管理ツールMavenの組み合わせで軽量な環境を作りました。

一度は導入を諦めてC++に走ろうとしたものの、Excelを扱うにはLibXL($199)という有料ライブラリが必要であることを知り、すぐJavaに出戻りました。

C++への挑戦はしばらく先になりそうです。

今回ばかりは本当に諦めかけましたが、落ち着いて少しづづ進めていきなんとかクリアしました。

Excelというソフトに対する思い入れの強さだけで押し切った感じです。

知識面ではLinuxやVBA、Pythonをかじっていなければ、早々に挫折していたでしょう。

モチベーションと最低限の知識が合わさっていないと学習が止まってしまいますね。

段階を踏んでこつこつ取り組むことの大切さを再認識しました。

これからはPythonコードからの移植などにぼちぼち取り組んでいきたいと思います。

[JavaScript] Python GUIアプリのElectronへの移植 その2 GUI作成までで中断

とりあえずガワだけ作成しました。

テンプレートさえ作ってしまえば、簡単なツールなら容易に作成できますね。PythonのtkinterやJavaのSwingとは比較にならないお手軽さです。

と、ここまでは絶賛でしたがボタンとアクションのリンクで難易度が格段に上がりました。教本にざっと目を通したものの要領を得ません。Bashコマンドを実行したいだけなのに、なぜややこしい通信をしなきゃいけないのか(根本的な問題。フロントエンドだから当たり前)。どうやら私がやりたいこととミスマッチを起こしているようです。

やっぱりSwingで書くことにしました。EclipseをM1 Macにインストールします。

何でもJavaScriptでやろうとしてユーザーは無理をしているのではないかと感じたのですが、思い過ごしでしょうか?

2021/11/24追記:ボタンとアクションのリンクが出来なくて中断するのは2回目です。他の言語ではぶつかったことのない壁があるようです。こちらの言い分としては言語としての進化の過程が場当たり的で体系化が不完全なのではないか、という見解です。正直プログラミング言語としての合理性をあまり感じないので修得意欲が湧かないんです。まあ私自身がJavaScriptに向いていない、ということにしておきます。

<html>
<head>
 <meta charset="UTF-8">
 <title>FILE REMOVER JS v0.0.1</title>
 <link rel="stylesheet" href="style.css">
</head>
<body>
    <script type="text/javascript" src="main.js"></script>
    <div class="container">
        <div class="container2">
            <text id="lbl1">PATH</text>
            <input id="txt1" type="TEXT"></input>
        </div>
        <button id="btn1" type="button">削除</button>

        <div class="container3">
            <input type="radio" name="q1" value="フォルダ">フォルダ
            <input type="radio" name="q1" value="ファイル">ファイル
        </div>
        <button id="btn2" type="button">クリア</button>
    </div>
</body>
</html>
body {
    background-color: #70f15f;
    margin:0px 8px 8px 8px;
}
.container {
    display: grid;
    grid-template-columns: 250px 60px;
    position: relative;
	top: -10px;
}
.container2 {
    display: inline;
    margin:4px 2px 2px 2px;
}
.container3 {
    display: inline;
    margin:4px 2px 2px 2px;
}
#lbl1 {
    grid-row:1;
    grid-column:1;
}
#txt1 {
    grid-row:1;
    grid-column: 1;
    width:180px;
    margin:0px 0px 0px 2px;
}
#btn1 {
    grid-row:1;
    grid-column:2;
    width:60px;
    font-size:12px;
    margin:4px 4px 4px 4px;
}
#btn2 {
    grid-row:2;
    grid-column:2;
    width:60px;
    font-size:12px;
    margin:4px 4px 4px 4px;
}

[JavaScript] Python GUIアプリのElectronへの移植 その1

Pythonのtkinterを使って作ったGUIのファイル一括削除ツールをJavaScriptに移植することにしました。まあ簡単なツールなので移植というのはおおげさですが。

tkinterは書きやすいものの、たまに色がおかしくなってボタンの字が読めなくなったりします。またpyinstallerによるexe化が上手くいかないことが多いです。

JavaScriptのコードを書くのは3ヶ月ぶりなので、思い出しながらぼちぼち進めていきます。

[Python] AI 33 M1 Macでの環境構築 その2

Big Sur搭載のIntel Mac miniでCPUまたはGPUを使ったKeras(Fashion-MNIST)の学習モデル作成時間を測定しました。

今のところTensorflowをMac miniのGPUで効率的に機能させるのは、私の学習モデル作成条件では厳しいようです。

やはりAppleでの機械学習の開発リソースはCore MLなどに割かれていて、tensorflow-macosの開発はなおざりになっているように感じました。

機械学習開発における主言語はPythonであり、フレームワークはGoogleが開発しているTensorflowとFacebookのPyTorchが双璧を成している状況です。AppleのCore MLは人口が少ない言語であるSwiftでの利用ですから、かなり分が悪いでしょう。

GPUが実質使えずCPUが8コアから10コアに増えた位では、機械学習目的でM1 ProやM1 Maxを入手しても見返りが少なそうです。WindowsやLinux搭載のIntel – NVIDIA機が最善かと思います。

[Python] AI 32 M1 Macでの環境構築 MontereyのMiniforge仮想環境

GPUを動かすtensorflow-metalを使うためmacOS Montereyにアップグレードして、学習時間を測定しました。

期待に反してかなり時間が掛かってしまいました。コードの内容によって変わってくるのだと思います。

結局、最速はBig Surでした。何のためにアップグレードしたのか馬鹿らしくなりましたが、新機能を試したいのでこのままにします。

参考サイト

[Python] AI 31 M1 Macでの環境構築 Miniforge

[macOS Big Sur 11.6 (M1 Mac)]

色々検討を重ねた末、M1 Mac miniを購入しました。ネット情報だけではプログラミング開発環境構築の可否が分からなかったので、とりあえず最小限の投資で確認することにしました。

開発環境はAI関連はMiniforge、それ以外はpyenv-virtualenvに分けました。各々でpipの管理ができ、共存は可能のようです。

学習時間はIntel Mac miniの47秒に対し、M1 Mac miniは23秒で半分になりました。ただOpen CLのベンチマーク比較ではおよそ4倍の性能アップなので少し物足りません。次回以降でtensorflow-metalを入れて検証する予定です。

pyenv内にMiniforgeをインストールできますが、仮想環境を入れ子にするとcondaコマンドが使えませんでした。Miniforgeで仮想環境を作らないケースについては未確認です。

またpipからtensorflow-macos 2.6.0と2.5.0のインストールを始められるものの、依存関係云々でエラーになりました。これらはIntel Mac用かもしれません。

# Miniforgeのインストール
wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-arm64.sh

# yamlファイルのダウンロード(ネット公開されていたものを拝借しました)
wget -P ~/Downloads https://raw.githubusercontent.com/mwidjaja1/DSOnMacARM/main/environment.yml

# 仮想環境 ai_studyの作成
conda env create --file=environment.yml --name ai_study

# tensorflow-macosのインストール
pip install --upgrade --force --no-dependencies https://github.com/apple/tensorflow_macos/releases/download/v0.1alpha3/tensorflow_addons_macos-0.1a3-cp38-cp38-macosx_11_0_arm64.whl https://github.com/apple/tensorflow_macos/releases/download/v0.1alpha3/tensorflow_macos-0.1a3-cp38-cp38-macosx_11_0_arm64.whl

# 仮想環境を有効化する
conda activate ai_study

# 仮想環境を無効にする
conda deactivate

# 仮想環境 ai_studyの削除
conda remove -n ai_study --all

参考サイト

[Python] EX 03 ジェネレータを用いたフィボナッチ数生成関数

ジェネレータを用いたフィボナッチ数生成関数を走らせてみました。

処理速度は反復法に及びませんでしたが、なかなか面白い手法です。

import time,datetime

def generator(): # ジェネレータ
    a, b = 0, 1
    while True:
        yield b
        a, b = b, a + b

def fib_generator(n): # ジェネレータを用いた関数
    fib = generator()
    fib_list = [next(fib) for i in range(n-1)]
    return fib_list[-1]

def fib_iterate(n): # 反復法
    a, b = 0, 1
    if n == 1:
        return a
    elif n == 2:
        return b
    else:
        for i in range(n-2):
            a, b = b, a + b
        return b

def fib_recursion(n, memo={}): # メモ化再帰法
    if n == 1:
        return 0
    elif n == 2:
        return 1
    elif n in memo:
        return memo[n]
    else:
        memo[n] = fib_recursion(n-1, memo) + fib_recursion(n-2, memo)
        return memo[n]

if __name__ == '__main__':
    list_time = list()

    for function in [fib_generator,fib_iterate,fib_recursion]:
        start = time.time()

        print(function)
        print(function(41))

        # 処理時間算出
        process_time = time.time() - start
        td = datetime.timedelta(seconds = process_time)
        list_time.append(td.microseconds)

    print(list_time)
--------------------------------------------------

出力
--------------------------------------------------
<function fib_generator at 0x1074070d0>
102334155
<function fib_iterate at 0x107407160>
102334155
<function fib_recursion at 0x107407040>
102334155
[52, 10, 33]

[Python] EX 02 フィボナッチ数の生成関数

フィボナッチ数を生成する関数の計算速度を測定しました。メモ化再帰法が最速でした。

今の私の知識では反復法一択ですが、再帰的手法についてはこれから学んでいきます。

import time,datetime

def fib_A(n): # 反復法
    a, b = 0, 1
    if n == 1:
        return a
    elif n == 2:
        return b
    else:
        for i in range(n-2):
            a, b = b, a + b
        return b

def fib_B(n): # 再帰法
    if n == 1:
        return 0
    elif n == 2:
        return 1
    else:
        return fib_B(n-1) + fib_B(n-2)

def fib_C(n, memo={}): # メモ化再帰法
    if n == 1:
        return 0
    elif n == 2:
        return 1
    elif n in memo:
        return memo[n]
    else:
        memo[n] = fib_C(n-1, memo) + fib_C(n-2, memo)
        return memo[n]

if __name__ == '__main__':

    list_time = list()
    for function in [fib_A,fib_B,fib_C]:
        start = time.time()
        print(function)
        print(function(40))

        # 処理時間算出
        process_time = time.time() - start
        td = datetime.timedelta(seconds = process_time)

        list_time.append(td.microseconds)

    print(list_time)
--------------------------------------------------

出力
--------------------------------------------------
<function fib_A at 0x10743cf70>
63245986
<function fib_B at 0x107637040>
63245986
<function fib_C at 0x1076370d0>
63245986
[42, 549224, 35]

[Python] EX 01 イテレータ

matplotlibのソースコードを読んでデコレータの存在を知り、自分のスキルがまだまだであることを痛感しました。

Pythonのエキスパートを目指すべく、中級者向けの書籍である”エキスパートPythonプログラミング 改訂3版”を購入しました。

早速、書籍内でも高度な文法と位置付けられているイテレータの章を読んでみました。有限・無限の数値発生器として使えそうです。

最近プログラミング関連本はAmazonや大手ネット書店の電子書籍ではなく、出版社サイトなどからPDFで購入しています。コードのコピーや書き込みができるので学習用途ではこちらの方が便利です。

# 再利用できるイテレータ

from time import sleep

class CounterState:
    def __init__(self, step):
        self.step = step

    def __next__(self):
        # カウンタ値を1つずつ0まで減算する
        if self.step <= 0:
            raise StopIteration
        self.step -= 1
        return self.step

class CountDown:
    def __init__(self, steps):
        self.steps = steps

    def __iter__(self):
        return CounterState(self.steps)

if __name__ == "__main__":
    for element in CountDown(10):
        symbols = '*' * element
        print(symbols)
        sleep(0.2)
--------------------------------------------------

出力
--------------------------------------------------
*********
********
*******
******
*****
****
***
**
*