Works by

Works by

プログラミング等IT技術関連でメモする

【python】QRコードを生成する

メモ。

qrcode モジュールを使えば、pythonで簡単にQRコードの作成ができます。

Usage

import qrcode

# QRコードに埋め込みたいテキストを引数に渡す
# PIL.Imageオブジェクトが返戻される
image = qrcode.make('hoge')
# 保存
img.save('./qrcode.png')

Result

f:id:rennnosukesann:20180816175239p:plain

参考

pypi.org

【Java】log4j2

log4j2

log4j2はJavaのロギングユーティリティであるlog4jの後継です。
厳密にはv1のlog4jがv2担っただけのものですが、プロパティファイルの命名やプロパティの設定方法などが一部新しくなっています。

Log4j – Apache Log4j 2 - Apache Log4j 2

Usage

Mavendependencyを追加する場合は以下。

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.11.1</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.11.1</version>
</dependency>

Source

LogManagerでロガーを取得できます。
Loggerオブジェクトは名称によって異なるインスタンスを扱い、ログも別々に出力されます。 Loggerによって、ファイルやコンソールなどの出力先や、ログのアーカイブの設定なども、後述するプロパティファイルの設定で別々に行うことができます。

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

... 

// Loggerオブジェクトの取得
Logger logger = LogManager.getLogger(Hoge.class);
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

// 簡単なLoggerのラッパークラス
public class LoggerWrapper {

    private Logger logger;

    private LoggerWrapper(String name) {
        logger = LogManager.getLogger(name);
    }

    public static LoggerWrapper getLogger(String name) {
        return new LoggerWrapper(name);
    }

    public void trace(Object message) {
        logger.trace(message);
    }

    public void debug(Object message) {
        logger.debug(message);
    }

    public void info(Object message) {
        logger.info(message);
    }

    public void warn(Object message) {
        logger.warn(message);
    }

    public void error(Object message) {
        logger.error(message);
    }

    public void fatal(Object message) {
        logger.fatal(message);
    }

        public void begin(String message){
                this.info("BEGIN : " + message);
        }

        public void end(String message){
                this.info("END : " + message);
        }
}

log4j2のプロパティファイル

log4j2の設定は以下のファイルをクラスパス配下に置くことで可能になります。

  • log4j2.properties
  • log4j2.yml
  • log4j2.json
  • log4j2.xml

設定ファイルはproperties > yaml > json > xml の優先度で適用されます。
詳細な設定方法は以下。

Log4j – Configuring Log4j 2 - Apache Log4j 2

参考

Log4j – Apache Log4j 2 - Apache Log4j 2

【CloudFoundly】CloudFoundlyアプリケーションに対してssh接続を行う

メモ。

CloudFoundly上で立ち上がっているアプリケーションのホストにSSH通信したいとき、cf コマンドを利用できます。

cf

こちらのページからインストーラをダウンロードし、インストールして完了。

github.com

brew/yum/apt-getでもインストール可能です。

github.com

$ brew install cloudfoundry/tap/cf-cli

Usage

cf sshssh接続できます。

# アプリ一覧
$ cf apps
hoge@fuga.com として組織 Hoge / スペース dev 内のアプリを取得しています...
OK

名前                     要求された状態   インスタンス   メモリー   ディスク   URL
test1    started          1/1            2G         2G                         test1.mybluemix.net
test2    started          1/1            2G         2G                         test2.mybluemix.net

# ssh接続
$ cf ssh test1
hoge@XXXXXXXXXXXXXXXXXXXX:~

参考

Accessing Apps with SSH | Cloud Foundry Docs

【shell】任意拡張子を持つファイルの総行数をカウントする

メモ。

ある拡張子(複数可)を持つファイルすべての行数をカウントするコマンドは以下のようになります。

$ find . -type f | grep -E ".*\.java|.*\.css|.*\.html|.*\.js|.*\.php|.*\.py" | xargs cat | wc -l 

適当にフィルタを掛けたい場合はパイプしてgrep -vに渡します。

$ find . -type f | grep -E ".*\.java|.*\.css|.*\.html|.*\.js|.*\.php|.*\.py" | grep -v "filtered" | xargs cat | wc -l 

以上。

【Mac】rootlessとcsrutil

rootless

MacではOS X 10.11(El Capitan)より、/userや/binなどのディレクトリへの書き込みがroot権限でも不可能となりました。

$ sudo mkdir /usr/hoge
Password:
mkdir: /usr/hoge: Operation not permitted

この措置はrootlessと呼ばれるシステム整合性保護で、root権限をダッシュされたときのリスクを減らします。rootlessは下記のディレクトリを保護します。

  • /システム
  • /usr
  • /bin
  • /sbin

加えて、OS X にあらかじめインストールされているアプリも変更することができなくなります。

しかしながら、これらのディレクトリへの書き込みを実行する一部のアプリケーションインストールなどが正常に動作しなくなる可能性もあります。

csrutil

rootlessを無効にするには、csrutilを使います。

$ csrutil status
System Integrity Protection status: enabled.

csrutil statusでrootlessが有効かどうかをチェックすることができます。

csrtoolによるrootless設定の変更は、起動中のOSシェル上では利用できず、リカバリーモードでしか動作しません。 したがってリカバリーモードに移行する必要があります。リカバリーモードに移行するには、Mac起動中にCtrl+Rを長押しします。

f:id:rennnosukesann:20180801172405p:plain

すると上記のようなウィンドウが表示されるので、左上の「ユーティリティ」->「ターミナル」を選択します。

rootless無効化/有効化のコマンドは下記のとおりです。 (変更に関する責任は負いかねます)

# 無効化
$ csrutil disable

# 有効化
$ csrutil enable

rootlessは一旦無効化しても、直ぐに有効化することを推奨します。

参考

support.apple.com

【python】google-image-downloadでGoogle上の画像を一括取得する

google-image-download

コマンドライン上で動作する画像収集用ツールです。

github.com

Usage

pipでインストールします。

$ pip install google_images_download

これですぐ利用可能になります。
shell上で以下のコマンドを実行すると、実行ディレクトリ配下にdownloadsフォルダが作成され、指定した検索キーワードに関連する100枚の画像のダウンロードが開始されます。

$ googleimagesdownload --keywords "雷門 雷神"

Item no.: 1 --> Item name = 雷門 雷神
Evaluating...
Starting Download...
Completed Image ====> 1. c4657c3b20ead6bd7eda55b72056e0fc.png
...

f:id:rennnosukesann:20180728185259p:plain

機械学習用の画像を手短に収集するのに便利です。

参考

github.com

【AWS】AWSでGPUコンピューティング① 環境セットアップ

Usage

アカウント登録

まずはAWSのアカウント登録を行います。
下記ページを参考に、AWSのアカウントを作成してください。 aws.amazon.com

インスタンスの作成

GPUインスタンスの作成を行います。 AWSトップページの左上「サービス」プルダウンをクリックし、コンピューティング->EC2 を選択。

f:id:rennnosukesann:20180723090045p:plain

f:id:rennnosukesann:20180723090049p:plain

するとEC2ダッシュボード画面に遷移するので、「インスタンスを作成」ボタンをクリック。

f:id:rennnosukesann:20180728003342p:plain

インスタンス一覧に「Deep Learning AMI (Ubuntu) Version 12.0」があるので「選択」をクリック。

f:id:rennnosukesann:20180728003514p:plain

今回はGPUを使用したいので、「GPUインスタンス」である「p2.xlarge」を選択し、「確認と作成」ボタンをクリックします。

f:id:rennnosukesann:20180728003710p:plain

※有料です。料金は下記記載
2018/07/28時点では 0.900 USD/h( 米国東部 (バージニア北部) および米国西部 (オレゴン) の価格)

aws.amazon.com

有料との脅しが入りますが、課金の心意気をもって作成をクリック。

f:id:rennnosukesann:20180728004034p:plain

インスタンス作成にあたり、キーペアを作成します。
キー名を入力し「キーペアのダウンロード」ボタンを押します。
今後インスタンスへのSSHログイン等に使用するので、厳重に保管してください。再取得はできないので、紛失時は新たな鍵を生成する必要があります。

キーペアが作成できたら、「インスタンスの作成」をクリック。

f:id:rennnosukesann:20180728004400p:plain

するとインスタンスの作成が開始されます。

初回の作成ではインスタンスの作成に失敗するので、http://aws.amazon.com/contact-us/ec2-request/にアクセスし、インスタンス上限を増やしてもらいましょう。「申請理由の説明」欄には、DeepLearningを検証したい旨を書きます。 申請を送信してからおよそ30分くらいで申請が受理されるはずなので、再度インスタンスの作成を行ってみてください。

f:id:rennnosukesann:20180728004801p:plain

f:id:rennnosukesann:20180728005230p:plain

インスタンス作成ステータス画面が表示され、「インスタンスを表示」ボタンを押した先のページでインスタンスが表示されていればインスタンス作成成功です。

f:id:rennnosukesann:20180728005811j:plain

f:id:rennnosukesann:20180728005631p:plain

SSHログイン

次は立ち上げたインスタンス内の環境にログインします。

$ ssh -i [key_pair_path] [user_name]@[パブリック DNS or IPv4 パブリック IP]

The authenticity of host '[パブリックDNS(IPv4 パブリック IP)]' can't be established.
ECDSA key fingerprint is SHA256:[SHA256ハッシュ値]
Are you sure you want to continue connecting (yes/no)? yes

[key_pair_path]には先程ダウンロードした鍵ファイルへのパスを、
[user_name]には今回ログインするユーザ(ubuntu)を、
[パブリック DNS or IPv4 パブリック IP]にはインスタンスのパブリックDNS、またはIPv4アドレスを入力してください。

ちなみにDNSドメインIPv4アドレスはインスタンス一覧のページに載っています。

f:id:rennnosukesann:20180728010702j:plain

ログインに成功すると↓のような出力がなされます。

=============================================================================
       __|  __|_  )
       _|  (     /   Deep Learning AMI (Ubuntu) Version 12.0
      ___|\___|___|
=============================================================================

Welcome to Ubuntu 16.04.4 LTS (GNU/Linux 4.4.0-1062-aws x86_64v)...

tensorflow環境をセットアップ

今回使用するインスタンスにはすでに様々な仮想環境が用意されています。

Please use one of the following commands to start the required environment with the framework of your choice:
for MXNet(+Keras2) with Python3 (CUDA 9.0 and Intel MKL-DNN) _______________________________ source activate mxnet_p36
for MXNet(+Keras2) with Python2 (CUDA 9.0 and Intel MKL-DNN) _______________________________ source activate mxnet_p27
for TensorFlow(+Keras2) with Python3 (CUDA 9.0 and Intel MKL-DNN) _____________________ source activate tensorflow_p36
for TensorFlow(+Keras2) with Python2 (CUDA 9.0 and Intel MKL-DNN) _____________________ source activate tensorflow_p27
for Theano(+Keras2) with Python3 (CUDA 9.0) _______________________________________________ source activate theano_p36
for Theano(+Keras2) with Python2 (CUDA 9.0) _______________________________________________ source activate theano_p27
for PyTorch with Python3 (CUDA 9.0 and Intel MKL) ________________________________________ source activate pytorch_p36
for PyTorch with Python2 (CUDA 9.0 and Intel MKL) ________________________________________ source activate pytorch_p27
for CNTK(+Keras2) with Python3 (CUDA 9.0 and Intel MKL-DNN) _________________________________ source activate cntk_p36
for CNTK(+Keras2) with Python2 (CUDA 9.0 and Intel MKL-DNN) _________________________________ source activate cntk_p27
for Caffe2 with Python2 (CUDA 9.0) ________________________________________________________ source activate caffe2_p27
for Caffe with Python2 (CUDA 8.0) __________________________________________________________ source activate caffe_p27
for Caffe with Python3 (CUDA 8.0) __________________________________________________________ source activate caffe_p35
for Chainer with Python2 (CUDA 9.0 and Intel iDeep) ______________________________________ source activate chainer_p27
for Chainer with Python3 (CUDA 9.0 and Intel iDeep) ______________________________________ source activate chainer_p36
for base Python2 (CUDA 9.0) __________________________________________________________________ source activate python2
for base Python3 (CUDA 9.0) __________________________________________________________________ source activate python3

Tensorflow(GPU)用仮想環境もあるので、ぜひ使わせてもらいましょう。
下記コマンドを打つと仮想環境に入ります。

$ source activate tensorflow_p36

pythonを起動してtensorflow上でGPUが使用できるか確認してみましょう。

$ python
Python 3.6.6 |Anaconda, Inc.| (default, Jun 28 2018, 17:14:51) 
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow
/home/ubuntu/anaconda3/envs/tensorflow_p36/lib/python3.6/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
  from ._conv import register_converters as _register_converters
>>> from tensorflow.python.client import device_lib
>>> device_lib.list_local_devices()
[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 7836901512070260373
, name: "/device:GPU:0"
device_type: "GPU"
memory_limit: 11285538407
locality {
  bus_id: 1
  links {
  }
}
incarnation: 3647875569071979833
physical_device_desc: "device: 0, name: Tesla K80, pci bus id: 0000:00:1e.0, compute capability: 3.7"
]
>>> 

ちゃんとTensorflowにGPUが認識されていることが確認できました!

参考

aws.amazon.com

qiita.com

thr3a.hatenablog.com