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

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

httpd.confにおけるリダイレクト設定

いままで、設定済みのファイルをなんとなくその場しのぎで設定してきたため、 いざってときにさっと設定できなかったので、改めてまとめてみようと思う。

実現方法

いくつか実現方法があります。メリットが大きいため、基本的には、Webサーバーでのリダイレクトを行うと思います。

htmlのmetaタグでリダイレクト

  • タグの埋め込みのみで実現できるため、簡単
  • SEO的には、Googleの評価が低くなるため、サーバー側でのリダイレクトができない場合に選択すべき

JavaScriptでのリダイレクト

いくつか書き方がある。

window.location = "http://abc.com";
window.location.href = "http://abc.com";
window.location.assign("http://abc.com");
window.location.replace("http://abc.com"); 
  • 簡単に実装できるかつ、GoogleクローラーJavaScriptを実行できるため SEO的にも良い。
  • JavaScriptの実行をOFFにしているユーザーは、転送されない。
  • パラメータの引き続きを意識的に設定しないと、パラメータなしで転送してしまう。

HTTPでのリダイレクト(Apache)

こちらの方法が一番オススメ。

  • SEO的に一番良い。301リダイレクトをすることでGoogleに評価を引き継いでもらえる。
  • HTTPステータスコードで、301(恒久的な転送)、302(一時的な転送)など意図を伝えらえる。
  • URLに対して正規表現を用いることでURLの書き換えや転送先の指定を柔軟に行える。

こちらに関しては、設定方法を以下で詳しくみていく。

HTTPリダイレクト設定方法(Apache)

.htaccess、または、httpd.confへ設定を追記することで実現する。
httpd.confが親の設定ファイルで、.htaccesshttpd.confの設定を上書きする形で反映される。

今回は、httpd.confに記載する前提とする。

mod_rewriteが使用可能かを確認

/etc/httpd/conf/httpd.conf内の以下の行が存在し、コメントアウトされていないことを確認。

LoadModule rewrite_module modules/mod_rewrite.so

もし設定を修正した場合は以下のコマンドで、確認・反映

apachectl configtest
/etc/init.d/httpd graceful

gracefulはリクエスト処理を中断しないで反映する。
httpd reloadでも反映可能。こちらは、リクエスト処理を中断して、反映する。

リダイレクト設定の書き方

同一ドメイン同一ディレクトリ内でのリダイレクト

DocumentRoot /var/www/html

RewriteEngine On
RewriteRule ^/main/index¥.html$ /main/index2.html [R, L]

<Directory "/var/www/html">
AllowOverride All
</Directory>
  • RewriteEngineでURL書き換え処理をONとして、RewriteRuleでリダイレクトの設定を行う
  • RewriteRule 【ドメイン以下のリダイレクト元パス(先頭/付き)の正規表現】【リダイレクト先パス】

ドメイン切り替え

・・・
RewriteEngine on
RewriteCond %{HTTP_HOST} ^abc.com$
RewriteRule (.*) http:/www.abc.com/$1 [R=301, L]
・・・
  • RewriteRule リダイレクト元を正規表現の()で囲むことで、遷移先のURLで 後方参照($1)として利用可能となる。
  • 後方参照することで、()内のドメイン以下のリダイレクト元パスを別ドメインに切り替え可能
  • RewriteRuleの前にRewriteCondで条件を設定すると、条件マッチした場合のみRewriteRuleによる リダイレクト処理が実行される

その他、よくある書き方

RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /404.html [R=404,L]
  • ファイルがない、またはディレクトリがない場合は、404を返却する
ErrorDocument 404 /404.html
  • リクエストステータスが404のときに表示させるページを指定したい場合は、 上記のように設定する。

RewriteとRedirectの違い

RewriteとRedirectってどう違うのって最初疑問に思ったので書いておく。

Rewriteは、Rオプションをつけない場合、リクエストURLを書き換えない。 RedirectはリクエストURLを常に書き換え、元URLはわからなくなる。

Redirect

例) Redirect [status] /main/ http://www.abc.com/index.html
Redirect 301 /main/ http://www.abc.com/index.html
Redirect permanent /main/ http://www.abc.com/index.html

status:301(恒久的に移動の意味。permanentと301の別名キーワードを書いてもいい)

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のものがある。
homebrewでインストールしたものは消した方がよいだろうか。。ちょっと怖い。。
消したら、pipの方もpython3.7をみてくれるのかな。。
とりあえず、そのままにしときます。

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

# 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