2018年7月13日金曜日

Xcode9 で simctl コマンドが使えない場合の対処方法

概要

simctl コマンドはシミュレータを制御できるコマンドです
Xcode9 で使おうとしたら使えなかったので対処しました
なお、Xcode Command Line Tools はインストール済みになります

環境

  • macOS 10.13.5
  • Xcode 9.4.1 (9F2000)

対処方法

Preferences から Locations で「Command Line Tools」を設定するだけです
setting_simctl1.png

これを設定していないと

  • xcrun simctl
xcrun: error: unable to find utility "simctl", not a developer tool or in PATH

  • xcodebuild -version
xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance

とコマンドを実行してもエラーとなってしまいます

2018年7月12日木曜日

Ubuntu16.04 の MTU を設定する

概要

Ubuntu 16.04 で MTU の値を変更する方法を紹介します
MTU は一度に送信するパケットのサイズを指定するネットワークのオプションです
大抵はデフォルトの 1500 で問題ないのですが環境によっては 1500 だと大きすぎる場合があります

環境

  • Ubuntu 16.04

一時的に変更

  • ip link set enp0s8 mtu 1400

恒久的に変更

  • vim /etc/network/interfaces
auto enp0s8
iface enp0s8 inet static
address 172.28.128.4
netmask 255.255.255.0
mtu 9999
  • ifdown enp0s8
  • ifup enp0s8

dhcp の場合は DHCP サーバから mtu の値をもらっているケースがあります
その場合は mtu の値を記載しても DHCP からの情報を信頼するので値は変更されません
なので、mtu を /etc/network/interfaces で変更する場合は static にする必要があります

もしくは

DHCP で MTU を恒久的に変更したい場合はプロファイル機能などを使いましょう
.bash_profile.bash_rc などに MTU を変更するコマンド (ip link set enp0s8 mtu 1400) を記載しておけばログイン時に MTU を設定することができます

おまけ: MTU の最適値を発見する方法

  • ping -c 1 -M do -s 1472 192.168.100.100

192.168.100.100 というサーバに対して最適な MTU を見つけるコマンドです
-s で値を変更してパケットがロスしない最大値が MTU の最大値になります
ちなみに +28 を考慮しなければならないので最大は 1472 になります

参考サイト

2018年7月11日水曜日

pep8 改め pycodestyle を使おう

概要

pep8 は Python のコード規約に沿ったコーディングをしているかチェックできるツールです
コマンドが pep8 から pycodestyle に変わってので使ってみました

環境

  • macOS 10.13.5
  • Python 3.6.6

インストール

  • pip3 install pycodestyle

使う

  • pycodestyle test.py

規約に沿って書けてないところがあるとエラーなどが表示されます

pipenv で使う

  • pipenv install pycodestyle
  • pipenv run pycodestyle test.py

一旦エラーを無視したい

  • pycodestyle test.py --ignore="E501"

ディレクトリに対して実行したい

  • pycodestyle ./

これでカレントディレクトリ配下にある *.py を対象に pycodestyle を掛けられます

最後に

pep8 改め pycodestyle を使ってみました
ただのコマンドなどで簡単に使えます
CI にも簡単に組み込めると思います

参考サイト

2018年7月10日火曜日

Python3 で logging する

概要

Python3 標準の logging パッケージを使ったロギング方法を紹介します
いつも忘れるのでメモ

環境

  • macOS 10.13.5
  • Python 3.6.5

単純なロギング

logging だけを使っています
basicConfig という設定用のメソッドを使ってフォーマットなどを設定することができます

import logging

logging.basicConfig(
    level = logging.DEBUG,
    format = "[%(asctime)s] %(levelname)s [%(name)s.%(funcName)s:%(lineno)d] %(message)s"
)

logging.debug("debug")
logging.info("info")
logging.warn("warn")

ただこれだと pip でインストールしたパッケージのログなども表示されてしまいます

StreamHandler を使ったロギング

getLogger + StreamHandler を使うと標準出力にスクリプト内のログのみを出力することができるようになります
フォーマットの設定は Formatter を使ってフォーマットを生成し StreamHandlersetFormatter を使って設定します

from logging import getLogger,DEBUG,StreamHandler,Formatter

logger = getLogger(__name__)
logger.setLevel(DEBUG)
formatter = Formatter("[%(asctime)s] %(levelname)s [%(name)s.%(funcName)s:%(lineno)d] %(message)s")
sh = StreamHandler()
sh.setFormatter(formatter)
logger.addHandler(sh)

logger.debug("debug")
logger.info("info")
logger.warn("warn")

こちらを使うほうが良いと思います

最後に

どちらも Python3 標準の logging パッケージを使っているのでそのまま使えます
少し長くて複雑ですが下を使うことをオススメします

2018年7月5日木曜日

docker で rsyslog を使ってみる

概要

docker で rsyslog コンテナを立ててログを受け付けてみました
あまり情報がなかった (そもそも需要がない?) ので試してみました

環境

  • macOS 10.13.5
  • docker 18.03.1-ce
  • Ubuntu 16.04
  • logger 2.27.1

rsyslog コンテナを立てる

  • docker run -d -p 514:514 -p 514:514/udp voxxit/rsyslog

TCP および UDP で LISTEN するのを忘れずに

logger コマンドで動作確認

macOS の logger コマンドはローカルにしか送信できないので適当に Ubuntu を立てて確認しました

  • logger -n 172.28.128.1 "test"

こんな感じでログを送信すると以下のように rsyslog コンテナ内の /var/log/messages にログが記載されます

  • docker exec -it epic_wozniak tail -f /var/log/messages
2018-07-05T07:58:26.417740+00:00 ubuntu-xenial vagrant test

priority を変えて送信してみます

  • logger -n 172.28.128.1 -p "local7.info" "local7 info test"

これで /var/log/boot.log にもログが出力されます
rsyslog コンテナの設定ファイルは /etc/rsyslog.conf にありデフォルトの設定値は https://github.com/voxxit/dockerfiles/blob/master/rsyslog/etc/rsyslog.conf になります

設定を変更したい場合は直接コンテナに設定ファイルをコピーするか Dockerfile を作成して独自のイメージを作成するなりしてください

最後に

docker で rsyslog サーバコンテナを立ててログの受信をしてみました
TCP/UDP の両方で LISTEN する必要があるのがポイントです

今回は logger コマンドを使ってログの送信確認を行いました
実際の運用ではアプリやミドルウェアから送信するケースがほとんどだと思います
例えば nginx であれば syslog:server などのディレクティブで定義することができます
http://nginx.org/en/docs/syslog.html

dockerhub で rsyslog を検索すると結構イメージが出てきます
今回は voxxit/rsyslog というイメージを使いましたが他にもいろいろとあります
Web で調べると自分で Dockerfile を書いて rsyslog イメージを作成している人もいます
とりあえず pull 数と Star が多いイメージを選択しましたが、今回のやり方にこだわる必要はないかなと思います

参考サイト

2018年7月2日月曜日

boto2.48 を使ってみた

概要

boto は AWS を操作するための Python ライブラリです
バージョンがだいぶ上がってから使っていなかったので久しぶりに試してみました

環境

  • macOS 10.13.5
  • Python 3.6.5
  • boto 2.48.0

インストール

  • pip3 install boto

バケット作成

from boto.s3.connection import S3Connection

conn = S3Connection(
    'xxxxxxxxxxxxxx',
    'xxxxxxxxxxxxxx',
    host = 'jp-east-2.os.cloud.nifty.com'
)
bucket = conn.create_bucket('mybucket')
print(bucket)

ファイルアップロード

  • touch test.txt
from boto.s3.connection import S3Connection
from boto.s3.key import Key

conn = S3Connection(
    'xxxxxxxxxxxxxx',
    'xxxxxxxxxxxxxx',
    host = 'jp-east-2.os.cloud.nifty.com'
)

b = conn.get_bucket('mybucket')
k = Key(b)
k.key = 'test'
ret = k.set_contents_from_filename('./test.txt')
print(ret)

k.key はオブジェクトストレージに保存される名前です
ret はアップロードできたファイルの内容のバイト数になります

KVS 的に使う

from boto.s3.connection import S3Connection
from boto.s3.key import Key

conn = S3Connection(
    'xxxxxxxxxxxxxx',
    'xxxxxxxxxxxxxx',
    host = 'jp-east-2.os.cloud.nifty.com'
)

b = conn.get_bucket('mybucket')
k = Key(b)
k.key = 'key'
k.set_contents_from_string('value')
ret = k.get_contents_as_string()
print(ret)

「value」という文字列が表示されます
型は byte なので必要に応じて str などに変換してください

オブジェクト一覧を取得

from boto.s3.connection import S3Connection
from boto.s3.key import Key

conn = S3Connection(
    'xxxxxxxxxxxxxx',
    'xxxxxxxxxxxxxx',
    host = 'jp-east-2.os.cloud.nifty.com'
)

b = conn.get_bucket('mybucket')
for obj in b.list():
    print(obj.key)

objboto.s3.key.Key というクラスなので必要に応じてアクセスしてください

オブジェクト削除

from boto.s3.connection import S3Connection
from boto.s3.key import Key

conn = S3Connection(
    'xxxxxxxxxxxxxx',
    'xxxxxxxxxxxxxx',
    host = 'jp-east-2.os.cloud.nifty.com'
)

b = conn.get_bucket('mybucket')
k = Key(conn)
for obj in b.list():
    obj.delete
    k.key = obj.key
    b.delete_key(k)

ちょっとややこしいのですが Key のオブジェクトを作成して、その Key を元にバケットに対して delete_key する感じです

バケット削除

from boto.s3.connection import S3Connection
from boto.s3.key import Key

conn = S3Connection(
    'xxxxxxxxxxxxxx',
    'xxxxxxxxxxxxxx',
    host = 'jp-east-2.os.cloud.nifty.com'
)

b = conn.get_bucket('mybucket')
b.delete()

バケットの一覧

from boto.s3.connection import S3Connection
from boto.s3.key import Key

conn = S3Connection(
    'xxxxxxxxxxxxxx',
    'xxxxxxxxxxxxxx',
    host = 'jp-east-2.os.cloud.nifty.com'
)

bs = conn.get_all_buckets()
print(bs)

最後に

boto2.48 を使ってみました
現在は v3 の開発も進んでいるようです

基本は公式ドキュメントが良いと思いますが検索が微妙なので見つからない場合は素直にググって良いと思います
boto はかなり情報が豊富なのでハマる点はほとんどないと思います

参考サイト

2018年7月1日日曜日

Python3 で CIDR から使用可能な IP の範囲を取得する

概要

netaddr というパッケージを使うことでできるようになります
今回は使い方を紹介します

環境

  • macOS 10.13.5
  • Python 3.6.5
  • netaddr 0.7.9

インストール

  • pip3 install netaddr

CIDR から IP の配列を取得

from netaddr import IPNetwork

for ip in IPNetwork('192.168.0.0/16'):
    print(ip)

半分より上位の IP を使う

from netaddr import IPNetwork

ips = IPNetwork('192.168.0.0/16')
half = ips[:int(len(ips)/2)]
for ip in half:
    print(ip)

半分から上位の IP の 11 個目を確認する

from netaddr import IPNetwork

ips = IPNetwork('192.168.0.0/16')
half = ips[:int(len(ips)/2)]
print(list(half)[10])

slice で返ってくる型が generator になっているので再度 list に変換してあげます

最後に

netaddr を Python3 で使ってみました