Git SDK for Windows

参考

メモ

pacmanをgit bash上で使いたいと思ったのだが、git-sdkはいまいち。

共有

Docker on VMWare

参考

メモ

Hyper-VでなくVMwareでDocker for Windows を使う に習った。

Docker環境

手元の環境は Windows + VMWare だったので、Vagrant + VMWareで環境を構築し、その中にDockerをインストールすることにした。

Get Docker Engine - Community for Ubuntu を参考に、dockerをインストールするようにした。 参考までに、Vagrantfileは以下のような感じである。 ubuntu18系をベースとしつつ、プロビジョニングの際にDockerをインストールする。

ただし、以下のVagrantfileのプロビジョニングでは、DockerサービスにTCPで接続することを許可するようにしている。 これはセキュリティ上問題があるため、注意して取り扱うこと。(あくまで動作確認程度に留めるのがよさそう)

Vagrantfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Vagrant.configure("2") do |config|
config.vm.define "docker-01" do |config|
config.vm.box = "bento/ubuntu-18.04"
config.vm.network :private_network, ip: "172.16.19.220"
config.vm.hostname = "docker-01"
end

config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
apt-key fingerprint 0EBFCD88
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io
sed -i "s;fd://;tcp://0.0.0.0:2375;g" /lib/systemd/system/docker.service
SHELL

end

WSLなどから以下のようにすることで、VM内のDockerにアクセスできる。

1
$ sudo docker --host tcp://172.16.19.220:2375 run hello-world

環境変数として、DOCKER_HOSTを設定しておいても良いだろう。

共有

Kafka cluster information

参考

メモ

kafka.clusterパッケージ以下には、Kafkaクラスタの情報を格納するためのクラス群が存在している。 具体的には以下の通り。

  • Broker
  • BrokerEndPoint
  • Cluster
  • EndPoint
  • Partition.scala
  • Replica

例としてBroker

例えば Broker クラスについて。

case classである。

usageを確認すると、例えば以下のように KafkaServer#createBrokerInfo メソッド内で用いられている。

kafka/server/KafkaServer.scala:430

1
BrokerInfo(Broker(config.brokerId, updatedEndpoints, config.rack), config.interBrokerProtocolVersion, jmxPort)

その他

わかりやすい例だと、PartitionやReplicaなどが挙げられる。

共有

Kafka Admin Commands

参考

メモ

意外とまとまった説明は Kafka公式ドキュメントConfluentドキュメント にはない。 Getting startedや運用面のドキュメントに一部含まれている。

丁寧なのは、 Clouderaのドキュメント(Kafka Administration Using Command Line Tools) である。

Confluentドキュメント

ConfluentドキュメントのAdminister章 には、ツールとしてのまとまりではなく、 Admin作業単位で説明があり、その中にいくつかツールの説明が含まれている。

実装

kafka.admin パッケージ以下にAminコマンドの実装が含まれている。 またそれらのクラスは、 bin以下に含まれている。

例えば、 kafka-log-dirs コマンドでは、kafka.admin.LogDirsCommand クラスが使われている、など。

共有

KafkaのJavaバージョン

参考

メモ

6.4 Java Version の通り、JDK1.8の最新リリースバージョンを使うように、とされている。 2019/11/03時点の公式ドキュメントでは、LinkedInでは1.8u5を使っているとされているが…。

このあたりの記述が最も最近でいつ編集されたか、というと、 以下の通り2018/5/21あたり。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
commit e70a191d3038e00790aa95fbd1e16e78c32b79a4
Author: Ismael Juma <ismael@juma.me.uk>
Date: Mon May 21 23:17:42 2018 -0700

KAFKA-4423: Drop support for Java 7 (KIP-118) and update deps (#5046)

(snip)

diff --git a/docs/ops.html b/docs/ops.html
index 450a268a2..95b9a9601 100644
--- a/docs/ops.html
+++ b/docs/ops.html
@@ -639,9 +639,7 @@

From a security perspective, we recommend you use the latest released version of JDK 1.8 as older freely available versions have disclosed security vulnerabilities.

- LinkedIn is currently running JDK 1.8 u5 (looking to upgrade to a newer version) with the G1 collector. If you decide to use the G1 collector (the current default) and you are still on JDK 1.7, make sure you are on u51 or newer. LinkedIn tried out u21 in testing, but they had a number of problems with the GC implementation in that version.
-
- LinkedIn's tuning looks like this:
+ LinkedIn is currently running JDK 1.8 u5 (looking to upgrade to a newer version) with the G1 collector. LinkedIn's tuning looks like this:
<pre class="brush: text;">
-Xmx6g -Xms6g -XX:MetaspaceSize=96m -XX:+UseG1GC
-XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:G1HeapRegionSize=16M

関連しそうなIssue、メーリングリストのエントリ

あまり活発な議論はない。公式ドキュメントを参照せよ、というコメントのみ。 Jay Kepsによると2013年くらいはLinkedInでは1.6を使っていた、ということらしい。 順当に更新されている。

  • https://issues.apache.org/jira/browse/KAFKA-7328
  • https://sematext.com/opensee/m/Kafka/uyzND19j3Ec5wqz42?subj=Re+kafka+0+9+0+java+version
  • https://sematext.com/opensee/m/Kafka/uyzND138NFX1w26SP1?subj=Re+java+version+for+kafka+clients
共有

OpenMLを軽く確認してみる

参考

メモ

概要

OpenML公式ドキュメント によると、以下の定義。

An open, collaborative, frictionless, automated machine learning environment.

OpenML公式ウェブサイト によると、

  • Dataset
  • Task
    • データセットと機械学習としての達成すべきこと
  • Flow
    • 各種フレームワークに則った処理パイプライン
  • Run
    • あるFlowについてハイパーパラメータを指定し、あるTaskに対して実行したもの

のレポジトリが提供されている。 これらはウェブサイトから探索可能。

Dataset

Datasetが登録されると機械的にアノテーションされたり、分析されたりする。 パット見でデータの品質がわかるようになっている。

Task

データセットに対する目標(と言ってよいのか。つまり識別、回帰など)、学習用、テスト用のデータのスプリット、 どのカラムを目的変数とするか、などが セットになったコンテナである。

機械的に読めるようになっている。

Flow

処理パイプラインはFlowとして登録され、再利用可能になる。 特定のTaskに紐づく処理として定義される。

フレームワークにひもづく。

Run

OpenML APIを用いて実行ごとに自動登録される。

scikit-learnで試す

Pythonガイド を参考に試してみる。 一通り、Pandas、scikit-learn、openml、pylzmaをインストールする。 なお、あらかじめliblzma-devをインストールしておくこと。 詳しくは以下の「lzmaがインポートできない」節を参照。

実行に用いたpipenvの環境ファイル に用いたライブラリが載っている。

Pythonガイド を眺めながら進めようと思ったが、 https://openml.github.io/openml-python/develop/examples/introduction_tutorial.html のリンクが切れていた。 何となく見るとgithub.ioだったので探索してみたら、 github.ioのPythonガイド が見つかった。

こっちを参考にしてみる。

FlowとRunのチュートリアル を元に、チュートリアルを実施。 また特に、 公式Examples あたりを参考にした。 詳しくは、 dobachi openml_sklearn_example 内のnotebookを参照。

トラブルシュート

lzmaがインポートできない

以下の内容のエラーが生じた。

1
2
/home/dobachi/.local/share/virtualenvs/openml_sklearn_example-YW762zpK/lib/python3.7/site-packages/pandas/compat/__init__.py:85: UserWarning: Could not import the lzma module. Your installed Python is incomplete. Attempting to use lzma compression will result in a RuntimeError.
warnings.warn(msg)

lzma関連のlibをインストールしておいてから、Python環境を構築すること。 つまりpyenvとpipenvで環境構築する前にliblzma-devをインストールしておく。

1
$ sudo apt install liblzma-dev

参考: lzmaライブラリをインポートできません。

所感

歴史があり、情報が集まっている。 ドキュメントが中途半端なせいで、初見ではとっつきづらいかもしれないが、ライブラリひとつでデータ発掘・共有に始まり、処理パイプラインの機械化まで対応しているのは有益。

共有

pyenv を使う

参考

メモ

インストール手順

WSL / WSL2にインストールするには、 pyenvのGitHub の通り、以下のようにインストールする。

1
2
3
4
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bashrc

トラブルシューティング

Common-build-problems に載っているが、前提となるパッケージのインストールが必要なことに注意。

古い内容のバックアップ

環境構築 - pipenv で Python 環境の構築方法 (2018年11月版) ではpipenvを使う前に、pyenvを使ってPython3最新環境を導入している。

自動インストール に自動インストール手順が記載されている。

共有

pipenvを試す

参考

メモ

上記の参考情報を見て試した。

WSL上でのpipenv

まずOS標準のPython環境を汚さないため、pyenvを導入した。 導入手段は、 pyenvのインストール手順 を参照。

導入した後、pyenvを使ってPython3.7.5を導入する。

1
2
3
$ pyenv install 3.7.5
$ pyenv global 3.7.5
$ pip install pipenv

さて、ここでpipenvを使おうとしたらエラーが生じた。 以下の参考に、 libffi-devを導入してPythonを再インストールしたらうまくいった。

https://stackoverflow.com/questions/27022373/python3-importerror-no-module-named-ctypes-when-using-value-from-module-mul

Pipenvことはじめ に大まかな使い方が載っている。

共有

Automagicaを試してみる

参考

メモ

総合的感想

用途ごとに個別に開発されているライブラリを統合して使えるのは便利。エントリポイントが統一化され、 from automagica import * ですべての機能が使えるのは画期的である。 しかし以下の点は少し課題を感じた。

  • ユーザ目線で似たもの同士に感じる機能に関し、APIが異なる
    • 具体的にはWord、Excel操作
    • ただし内部的に用いられるライブラリが別々のものなので致し方ない。(うまくすれば、APIレベルでも統合可能かもしれない)
  • 内部的に用いられているライブラリのAPIを直接利用したいケースがあるが少しわかりづらい
    • Automagicaが提供しているAPIよりも、内部的に用いられている元ネタのライブラリのAPIの方が機能豊富(少なくとも docx ライブラリはそうだと思う)
    • ということから、まずはAutomagicaのAPIを基本として使用しつつ、必要に応じて内部で用いられているライブラリのAPIを直接利用するのが良さそう。 実際に OpenWordDocument メソッドの戻り値は docx.Document クラスのインスタンス。 しかし1個目の課題と関連するが、その使い方を想起させるドキュメントやAPI仕様に見えない。 Word activities以外ではどうなのか、は、細かくは未確認。
  • ドキュメントにバグがちらほら見られるのと、ドキュメント化されていない機能がある。
    • これは改善されるだろう

Getting startedを試す

環境構築

AutomagicaのGetting started を参考にしつつ、動かしてみる。 Anacondaにはパッケージが含まれていなかった(conda-forge含む)のでpipenvを使って環境づくり。

1
2
3
> pipenv.exe --python 3.7
> pipenv.exe install jupyter
> pipenv.exe install https://github.com/OakwoodAI/automagica/tarball/master

なお、Python3.8系では依存関係上の問題が生じたので、いったん切り分けも兼ねて3.7で環境構築している。 AutomagicaのGetting started では、Tesseract4のインストールもオプションとして示されていたが、いったん保留とする。

Example 1の実行

Example 1 に載っていた例を動かそうとしたが、一部エラーが生じたので手直しして実行した。

エラー生じた箇所1:

ドキュメント上は、以下のとおり。

1
lookup_terms.append(ExcelReadCell(excel_path, 2, col))

しかし、行と列の番号で指定するAPIは、 ExcelReadRowCol である。 また、例に示されていたエクセルでは1行目に検索対象文字列が含まれているため、第2引数は 2 ではなく、 1 である。 したがって、

1
lookup_terms.append(ExcelReadRowCol(excel_path, 1, col))

とした。 なお、ExcelReadCellメソッド、ExcelReadRowColメソッドの実装は以下の通り。(2019/10/24現在)

automagica/activities.py:639

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def ExcelReadCell(path, cell="A1", sheet=None):
'''
Read a cell from an Excel file and return its value.
Make sure you enter a valid path e.g. "C:\\Users\\Bob\\Desktop\\RPA Examples\\data.xlsx".
The cell you want to read needs to be defined by a cell name e.g. "A2". The third variable
is a string with the name of the sheet that needs to be read. If omitted, the
function reads the entered cell of the active sheet.
'''
workbook = load_workbook(path)
if sheet:
worksheet = workbook.get_sheet_by_name(sheet)
else:
worksheet = workbook.active

return worksheet[cell].value

automagica/activities.py:656

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def ExcelReadRowCol(path, r=1, c=1, sheet=None):
'''
Read a Cell from an Excel file and return its value.
Make sure you enter a valid path e.g. "C:\\Users\\Bob\\Desktop\\RPA Examples\\data.xlsx".
The cell you want to read needs to be row and a column. E.g. r = 2 and c = 3 refers to cell C3.
The third variable needs to be a string with the name of the sheet that needs to be read.
If omitted, the function reads the entered cell of the active sheet. First row is defined
row number 1 and first column is defined column number 1.
'''
workbook = load_workbook(path)
if sheet:
worksheet = workbook.get_sheet_by_name(sheet)
else:
worksheet = workbook.active

return worksheet.cell(row=r, column=c).value

エラーが生じた箇所2:

ドキュメント上では、読み込んだ文字列のリストをそのまま使っているが、 そのままではリスト後半に None が混ざることがある。 そこで、リストをフィルタするようにした。

1
lookup_terms = list(filter(lambda x: x is not None, lookup_terms))

エラーが生じた箇所3:

ドキュメント上では、以下の通り。

1
ExcelWriteCell(excel_path, row=i+2, col=j+2, write_value=url)

これも読み込みの場合と同様にAPIが異なる。合わせて引数名が異なる。そこで、

1
ExcelWriteRowCol(excel_path, r=i+2, c=j+2, write_value=url)

とした。

共有

Seleniumを試してみる

参考

メモ

日常生活の簡単化のために使用。 【超便利】PythonとSeleniumでブラウザを自動操作する方法まとめ を試す。

環境構築

Condaを使って環境を作り、seleniumをインストールした。 WebDriverは自分の環境に合わせて、Chrome77向けのものを使用したかっただが、 WSLでChromeを使おうとすると、--no-sandboxをつけないと行けないようだ。 詳しくは、 ブラウザのヘッドレスモードでスクショ 及び 【WSL】にFirefox&Google-Chromeをインストールする方法! を参照。

geckodriver を使うことにした。

また、当初は 【超便利】PythonとSeleniumでブラウザを自動操作する方法まとめ を参考にしようとしたが、 途中から PythonからSeleniumを使ってFirefoxを操作してみる を参考にした。

動作確認ログは、 selenium_getting_started を参照。

便利な情報源

Selenium関連

おまけ

共有