気軽に楽しくプログラムと遊ぶ

自分が興味があってためになるかもって思う情報を提供しています。

redis-cliの基本コマンド

ローカル環境でRedisを使う際に使った基本コマンドをメモしておきます。

一回一回、redis-cliをコマンドの前につけて実行してもよいですが、
接続してコマンド叩いた方良いかな。

$ redis-cli -h 【host_name】

ホスト名指定しないとローカルにアクセスします。

基本コマンド

コマンド 説明
keys "*" 本番環境では使ってはいけない。ロックがかかる。登録しているすべてのKeyの一覧を表示
get【key】 【key】に紐づくstringで登録された値を表示
set【key】【value 【key】に対して【value】文字列を保存する
flushdb 選択しているDBの全データをクリア。気を付けて使う
expire 【key】【second】 【key】に紐づくキャッシュの有効期限のsecond秒に設定する
TTL 【key】 【key】に紐づくキャッシュの有効期限のsecond秒を返却する

上記記載は以下から拾ってきました。
redis コマンドリファレンス

keys "*"は、ロックがかかり、パフォーマンス低下させる可能性があるため、デバッグのみで使用。
代わりにSCANを使うべき。
KEYS

インストールは以下などを参照

[Redis]RedisをWindowsにインストールしてみる

pythonのコード解析プラグインを検討する

pythonのパッケージ管理に引き続き、 開発環境設定を進めてみる。

pythonのコード規約がわかっていないので、 規約を覚える意味でもプラグイン導入してみる。
導入は必須に近いツールな気がするが。。

以下を導入してみます。

  • コード解析ツール(flake8, flake8-vim)
  • コード解析関連ツール(autopep8, vim-autopep8, ale)

コード解析ツール(flake8, flake8-vim)

pythonパッケージ

$ pip3 install flake8

vimパッケージ

.vimrcのNeoBundleのプラグイン記載部分に追記
設定は以下ブログの設定を頂きました。

Vimメモ : flake8でPythonのコードをチェックする - もた日記

" python 構文エラーの検出
NeoBundle 'andviro/flake8-vim'

"-------------------------
" [python] vim-flake8
"------------------------
autocmd BufWritePost *.py call Flake8() " 保存時にチェックする
let g:flake8_quickfix_location="topleft" " Quickfixの位置
let g:flake8_quickfix_height=7 " Quickfixの高さ
let g:flake8_show_in_gutter=1  " 左端にシンボルを表示
let g:flake8_show_in_file=1  " ファイル内にマークを表示

コード解析によるエラーコード参考URL

Introduction — pycodestyle 2.4.0 documentation

Error / Violation Codes — flake8 3.5.0 documentation

コード解析関連ツール(autopep8, vim-autopep8, ale)

コード解析エラーを一部自動修正するプラグイン(tell-k/vim-autopep8)と コード解析結果をコード修正中にも非同期に反映させてくれる(w0rp/ale) も導入する。使って見てまた、変えるかもしれないけど。

pythonパッケージ

$ pip3 install autopep8

vimパッケージ

.vimrcのNeoBundleのパッケージ記載部分にに以下を追記

NeoBundle 'tell-k/vim-autopep8'
NeoBundle 'w0rp/ale'

非同期チェックの方は、Lintツールが正しく設定してあれば、 インストールのみでうまく動作するみたい。

プラグイン導入までに試したこと

Flake8-vimをインストールしてみる

Flake8-vimというflake8-vimと同じようなプラグイン(作者は同じ)
をいれてみたが、vimを開いた時点で以下のエラーが出力されてしまい、
うまく動作せず。

error: PyFlake.vim required vim compiled with +python

vimではpython3を使いたいのにpython2を使ってね。
と言われて、詰んだ。

githubをみたら、Flake8-vimは2013年で更新が止まっているっぽい。
flake8-vimは問題なく動いたので、Flake8-vimは~/.vim/bundleから手動で削除した。

synstasticにpythonの設定を追記して試してみる

以下を設定を.vimrcに設定して、動作確認してみたりした。

let g:syntastic_python_checkers = ["flake8"]

動作違和感はなかったけど、
vim-flake8はflake8専用だし、手軽かもってどっかのブログに書いてたので、
思い直してこちらを使うのはやめた。rubyの方がsynstasticを使っている。

Pythonパッケージ管理は、venvを使うことにした

最近、個人的にpythonselenium動かしていろいろ情報収集するツールを
作って遊んでいます。パッケージ管理がいけてなかったので、見直しました。

pyenvを元々使っていたが、プロジェクトごとの
パッケージ管理をやりたいと思い、python3に入っているvenvを使用することにした。
https://docs.python.org/ja/3/library/venv.html#module-venv

自分の開発環境を確認してみる

% where python
/usr/local/bin/python
/usr/bin/python

% where python3
/usr/local/bin/python3

% python -V
Python 2.7.15

% python3 -V
Python 3.7.0

% where pip
/usr/local/bin/pip

% where pip3
/usr/local/bin/pip3

% pip -V
pip 18.0 from /usr/local/lib/python2.7/site-packages/pip (python 2.7)

% pip3 -V
pip 18.0 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)

pythonはhomebrewでいれたものとsystemのものがあります。

仮装環境を作成し、適用する

# myenvという名前で仮想環境を構築する
# Python 3.6以降
% python3 -m venv myenv

# 仮装環境を適用
% . myenv/bin/activate

# 仮装環境から抜ける
% deactivate

仮装環境にパッケージをインストールする

# 一つ一つ入れる場合
% pip3 install flask

# まとめて入れる場合は、freezeで出力したrequirements.txtを読み込む
% pip3 install -r requirements.txt

環境設定って経緯とかやり方とかすぐに忘れてしまうので、残して置かないとね。

MacのTime machineによるバックアップに最適なHDDを調査

今日は、プログラムのお話ではなく、PCバックアップについてです。 重要なファイルのみのバックアップしかしておらず、 危うく他のデータを吹っ飛ばすところだったので、 ちゃんとバックアップしとかなきゃと調べました。。

まずTime machineとは?

Mac標準のバックアップアプリ

  • バックアップ単位は、1時間ごと、日次、週次と選択可能。初回以外は差分バックアップ
  • 外付けHDDまたは、Time Capsule(Mac純正)にバックアップ
  • フォーマットは「Mac OS拡張」(HFS+)、FAT32などでは使用不可

バックアップに必要な容量

最低バックアップと同じ容量。 余裕を持って2倍ぐらいの容量があると望ましい。 コスパを考えて、バックアップ以外のデータも保存する場合は、3,4倍あると良い。

512GBなら、2倍で1TB、3倍で1.5TB

バックアップ範囲

デフォルトで全体バックアップだが、 バックアップ範囲から除外する設定も可能。

Mac Time Machineのバックアップから除外するフォルダを指定する方法
http://inforati.jp/apple/mac-tips-techniques/system-hints/how-to-exclude-a-folder-from-macos-time-machine-back-up.html

最適なHDDを選ぶ 2018/07/26時点

私は、SSDが256GBなので、バックアップには500GBほど使用。 パーティション分けして、1TBに写真の保存用とするため、 1.5TBのHDDを選びました。

価格が1万以下で、ある程度持ち運びが楽な重さ。 かつよく物を落とす方なので、衝撃耐性の高い製品を選択。

WD HDD ポータブルハードディスク 1.5TB

→231gで軽め、フォーマットはMac用でないので再フォーマットが必要。。USB3.0で高速転送、安心の2年保証に惹かれました。

以下のサイトが非常に参考になりました。
HDD比較サイト_1
HDD比較サイト_2

[補足]再フォーマット、パーティション分け

HDDをMacに接続し、ディスクユーティリティで購入したHDDを選択。
マック内臓のSSDを初期化しないようによくよく注意して作業してください。
パーティションタブで、パーティションを分け、自分が想定する容量とフォーマット形式を選択。
適用し、パーティションテーブルはそのままで、OKと進める。

詳細はこちらを参考にしてください。

Macのハードディスクをフォーマット(初期化)する方法 / Inforati

AWSのS3基本コマンド

基本コマンド

良く使う基本のコマンドを表にして見ました。

操作 コマンド 備考
バケット参照 aws s3 ls
バケット内参照 aws s3 ls s3://バケット
バケット作成 aws s3 mb s3://バケット
バケット削除 aws s3 rb s3://バケット バケット内が空でないと消せません
オブジェクトコピー aws s3 cp オブジェクト名 s3://バケット ローカル→S3、S3→ローカル、S3→S3でのコピー可
オブジェクト削除 aws s3 rm s3://バケット名/オブジェクト名 --recursive オプションでディレクトリを再帰的に削除
移動 aws s3 mv s3://バケットA/オブジェクトA s3://バケットB/(オブジェクトB) ローカル→S3、S3→ローカル、S3→S3での移動可
同期 aws s3 sync ディレクトリ s3://バケット名/ディレクト ローカルのディレクトリを同期

正規表現で複数ファイルをコピーする

aws s3 cp *.txt s3://[バケット名]/

上記のように指定したくなるが、エラーになる。aws s3ではファイル指定に「*」が使えないです。

上記を実現したい場合は、excludeとincludeを用いて以下のように指定します。

aws s3 cp test s3://[バケット名]/ --recursive --exclude "*" --include "*.txt"

testディレクトリ以下の拡張子がtxtのファイルのみをコピーするコマンドになります。

excludeを省略したくなりますが、省略すると全ファイルがコピー対象になるのでご注意を。
excludeのみの指定は可能です。

一括削除の際は確認コマンドを使う

--dryrun オプションを付けるとどのように削除されるか確認できる
$ aws s3 rm s3://hogebk --recursive --dryrun
(dryrun) delete: s3://hogebk/hoge/test1.txt
(dryrun) delete: s3://hogebk/hoge/test2.txt

Bash 処理経過時間を計測する

計測用テストシェル

#!/bin/bash

startTime=`date +%s%3N`

# 計測処理
for ((i=0; i < 10000; i++)); do
    echo $i
done

endTime=`date +%s%3N`
elapsedTime=`echo $(($endTime - $startTime))`
echo "elapsedTime: $elapsedTime msec"

出力結果

1
2
・・・
9999
elapsedTime: 330 msec

MySQL Indexの作成、参照、変更、効果確認コマンド

Indexの作成

-- 通常インデックス
create index idx_name on table_name (name);

-- 複合インデックス
create index idx_group_id_name on table_name (group_id, name);

Indexの参照

作成したIndexを確認する

show index from table_name;

Indexの削除

誤って作成したIndexを削除する

alter table table_name drop index idx_group_id_name;

Indexの効果の確認

EXPLAIN select * from table_name where name = 'test';