Apache のアクセス解析的なツール

Linuxメモ : GoAccessでリアルタイムにWebログ解析 – もた日記

yum でインストールできるApache のアクセス解析を探していたらベストマッチなツールを見つけたのでメモ。

yum で引っ張って

# yum install goaccess

apache のlogファイルのパスを指定。

# goaccess /usr/local/apache2/logs/access_log

logファイルの形式を選択、[Enter]キー押下。

ターミナルに動的アクセス解析を表示できました。

こんなのが欲しかったんですね。

https へのリダイレクト

httpプロトコルのアクセスをhttpsへのリダイレクトの方法はいくつかあるそうですが今回は、.htaccess で試してみました。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^stuffy.dip.jp/        ←(追記
RewriteRule ^(.*) https://stuffy.mydns.jp/$1 [R=301,L]  ←(追記
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</IfModule>

 

RewriteRule ^(.*)$ https:// の後の % を付けずに表示させたところ、{HTTP_HOST}エラーがでました。
正しく表記して正常に転送できるかどうかトライ。うん、良いですね。。

 

追記)旧サイトからアクセスしてくるリクエストをSSL化した新サイトへのリダイレクトを追加しました。

try-except (Python)

Python で受け取った入力値の型が間違っているときはエラー(この場合はValueError)がでますが、そんな例外を処理する予約語としてtry except 文が用意されています。以下のコードは西暦を干支に変換するコードですが、半角数字が入力されないときのエラーを例外処理しています。
try:
(処理)
except(ValueError):
(例外処理)

eto.py

eto = ["申","酉","戌","亥","子","丑","寅","卯","辰","巳","午","未"]
try:
    x = input("生まれた年を西暦で入力してください。: ")
    y = int(x)
    y = y % 12
    print("あなたの干支は {} です。".format(eto[y]))
except(ValueError):
    print("4桁の半角数字を入力してください。")

あらかじめエラーが予想される処理をtry 文に投げて、except(エラーの種類)文で例外処理をします。エラーの種類は、データ型のエラー(ValueError)のほかに、0で割り算をした時のZeroDivisionError などがあります。

サイトのSSL暗号化

Webサーバー間通信内容暗号化(Apache+mod_SSL+Certbot) でサイトのSSL暗号化しようとして失敗した点をメモ。

1.Apache はソースからビルドしたので/usr/local/apache2/conf.d/ssl.conf がなかった。→コピーして解決。

# cp /etc/httpd/conf.d/ssl.conf /usr/local/apache2/conf.d/ssl.conf

2./usr/local/apache2/conf.d/ssl.confをApacheが起動しても読み込んでくれなかった。→httpd.conf 内に Include conf.d/*.conf を追記して解決。

# Secure (SSL/TLS) connections
#Include conf/extra/httpd-ssl.conf
#
# Note: The following must must be present to support
#       starting without SSL on platforms with no /dev/random equivalent
#       but a statically compiled-in mod_ssl.
#
Include conf.d/*.conf  ←(追記

3.httpd.conf のヴァーチャルホスト設定はssl.conf が設定してあると2重になる。→httpd.conf の<VirtualHost *:443>~</VirtualHost>を削除して解決。

以上、3点でした。ルーターの443 を開放してApache を再起動したらホームページをhttps:// ~で表示できることを確認。

searchreplacedb2.php でデータベースのhttp:// の部分をhttps:// にreplace してサイトのSSL化、・・・完了です。

openメソッド(Python)

外部の.txt ファイルを読み込むopen メソッドについて調べたのでメモ。

pythonでlistをファイルに保存し、読み込む方法(numpyも同様!)

Titles.txt

Stand Still - Wave Racer Remix
Slumber Party
Milky Way Stars (feat. TR)
At The End Of The Night

上記のような素のテキストファイルをリストに読み込みたいとして。

open(‘ファイルパス’, ‘モード’, <option>[encoding=’utf-8′])

ファイルパス ‘filepath/filename’ スクリプトからの相対参照
モード r 読み込み用
w 書き込み用
a 追加書き込み
r+ 読み込みと書き込み
w+ 読み込みと書き込み
a+ 読み込みと書き込み
b バイナリモード
option encoding utf-8, cp932(SJIS)など

open_file.py

Titles = []
f = open('Titles.txt', 'r')  
for x in f: 
    Titles.append(x.rstrip("\n")) 
for title in Titles: 
    print(title) 
f.close()

Titles.txt を読み込みモード’r’ でファイルオープンして、リストに一行づつ追加していきます。
for ループを2回廻すのがスマートではないですがリストの内容をプリントアウトしています。

f = open('Titles.txt', 'r') 
・ 
・ 
・ 
f.close()

とするところを、close忘れを防ぐ意味もあってwith ~asと記述するとファイルをオブジェクトf として扱えます。

Titles = []
with open('Titles.txt', 'r') as f:  
    for x in f: 
        Titles.append(x.rstrip("\n")) 
        print(x.rstrip("\n"))

1行づつファイルを読み込む上記コードもreadメソッドを使えばまとめてリストにできますね。改行コードも関係ないのかな。これ、もう分かんねえなぁ。

Titles = []
with open('Titles.txt', 'r') as f:
    Titles.append(f.read())
for x in Titles:
    print(x)

追記)Windows10 のVisual Studio Code のデバッグ機能を使って外部ファイルの読み込みをしていましたが一向に出力してくれないので、CentOS のbash を使ったところ正常に読み込んでくれました。

訂正)まとめてreadメソッドで読み込むコードのforループの参照オブジェクトに誤りがありましたので修正しました。

UEFI アップデート

この辺にIntel の第8世代Core のMeltdown, Spectre 脆弱性対策の UEFIアップデート、来てるらしいっすよ?

ということで早速、Asrock ホームページからInstant Flash をダウンロード。

日付は、2019/4/9 バージョンは4.00 (2019/5/7現在最新)のものをダウンロードして解凍。

エクスプローラからUSBドライブにコピーしようとしたところ、権限エラーがでました。

ドライブアイコンを右クリックの[プロパティ] からアクセス権を[フルアクセス] にしても拒否されます。

そういえば以前、グループポリシーエディタから[リムーバルディスク] の書き込み、実行を拒否設定していたことを思い出しました。設定を解除してPCを再起動、再びトライしてみると上手くコピーできました。

フラッシュROM をコピーしたUSBドライブを差してシステム再起動。

[F2] でUEFI に入りフラッシュROM を読み込むと、2回ほど自動で再起動しました。

再起動後、再び[F2] からUEFIに入りバージョンチェック。Z370 Pro4 P4.00 にアップデートされていることを確認。

作業終了。最後までお読みいただき、ありがとうございました。

continue と break (Python)

突然ですが、Python でループの途中に処理を飛ばしたいときやループを中止したいときに用意されている予約語、continue と break を使ったスクリプトの例を作ってみました。

continue はループの途中でif 文で条件分岐を挟むとそれ以降のコードが実行されずに飛ばされます。

break はやはりif 文で条件分岐を挟んでループ処理そのものを中止します。

Titles = [
	"Discopolis 2.0 - Fehrplay Remix",
        "Never Alone - J-Kraken Remix",
        "Golden",
        "Steal Your Heart",
        "I Want You To Know",

]

Artists = [
        "Lifelike, Kris Menace, Fehrplay",
        "Chachi, Natascha Bessez",
        "Thomas Hayes, Kyler England",
        "BRKLYN, Lenachka",
        "ゼッド, セレーナ・ゴメス",
        
]

i = 0
for i, new in enumerate(zip(Titles,Artists)):
    new = Artists[i]
    x = input("{} {} / {} | アーティスト名を修正してください。:".format(i, Titles[i], Artists[i]))
    if x == "":
        continue
    elif x == "q":
        break
    new = x
    Artists[i] = new
    print(i, Titles[i], "/", Artists[i])

ループで読み込まれたアーティスト名をリストの最後まで修正し続けるコードですが[Enter]が押されたときはcontinue でスキップ、[q] を入力したときにbreak でループ処理を終了します。

結果

0 Discopolis 2.0 - Fehrplay Remix / Lifelike, Kris Menace, Fehrplay | アーティスト名を修正してください。:[Enter]
1 Never Alone - J-Kraken Remix / Chachi, Natascha Bessez | アーティスト名を修正してください。:[Enter]
2 Golden / Thomas Hayes, Kyler England | アーティスト名を修正してください。:[Enter]
3 Steal Your Heart / BRKLYN, Lenachka | アーティスト名を修正してください。:[Enter]
4 I Want You To Know / ゼッド, セレーナ・ゴメス | アーティスト名を修正してください。:Zedd, Selena Gomez
4 I Want You To Know / Zedd, Selena Gomez

import (Python)

組み込み関数の入ったモジュールや長いプログラム、データファイルを外部から読み込むときの記法としてimport がPythonで用意されています。

書き方として、import print_module as pm としておけば、main.py で外部関数をpm.Hello として読めるということです。

print_module.py

def Hello(name):
	print("Hello {}!".format(name))

main.py

import print_module as pm
 
pm.Hello("World")

結果

Hello World!

事前に辞書ファイルを外部に用意して必要に応じて呼び出すようにすることも出来ますね。

music_list.py

Titles = [
        "Atmosphere",
        "I Need Your Love",
        "Enigma",
        "Addicted To A Memory",
]
Artists = [
        "Husman",
        "First State",
        "Seth Hills",
        "ゼッド",
]
music = dict(zip(Titles, Artists))

query.py

import music_list as mu

title = input("タイトルを入力してください。:")
if title in mu.music:
        print(mu.music[title])
else:
        print("見当たりません。")

結果

タイトルを入力してください。:Addicted To A Memory
ゼッド

※ 訂正)Hello(name) 関数の) が足りない転記ミスを修正しました。