サイトの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) 関数の) が足りない転記ミスを修正しました。

enumerate関数(Python)

前回のエントリーでは複数のリストを辞書として登録するzip関数の使い方を学びました。今回はfor ループでリストのインデックスを扱う、enumerate関数の使い方をめも。

Titles =[
       "Bittersweet - Radio Edit",
        "Anchor",
        "Get There",
        "Set Me Free",
        "Untouchable",
]
Artists = [
        "Dyro",
        "Tritonal",
        "Paris Blohm",
        "Dyro",
        "Tritonal",
]

例えば、タイトルとアーティストの2つのリストをインデックス変数を含めて処理したいときに、for ループの変数に< , > を付けて併記したいとします。ループで取り出した要素がリストの何番目かをPythonが自動的にインデックス値として用意してくれるのがenumerate関数というわけですね。

for i, (Titles, Artists) in enumerate(zip(Titles, Artists)):
    print(i, Titles,"/", Artists)

前回の応用でenumerate関数の引数に2つのリストをzip関数でまとめて渡せばOK。インデックスと2つのリストの処理をいろいろやってくれるスゴイやつです。良いですね。

0 Bittersweet - Radio Edit / Dyro
1 Anchor / Tritonal
2 Get There / Paris Blohm
3 Set Me Free / Dyro
4 Untouchable / Tritonal

zip関数(Python)

Python で順序と数の一致した2つのリストをキーとバリューとする1対の辞書を作りたいときに便利なzip関数の使い方を検索したのでメモ。

Pythonで辞書の初期値をまとめて登録する方法 | Nana-Korobi

zip_function.py

Titles = [
        "Kuaga(Lost Time)(Radio Edit)",
        "Hands",
        "Dreams Lost Kings Remix",
        "We The Fire",
        "NANIMONO(feat.米津玄師)",
        "DREAM ILLUMINATION",
]
Artists = [
        "Pierce Fultion",
        "Gareth Emery",
        "Life of Dillon",
        "赤西仁",
        "中田ヤスタカ",
        "CTS",
]

music = dict(zip(Titles, Artists))
for title in music.items():
    print(title)

新しい空の辞書music をdict で定義するときに引数に2つのリストをzip関数にまとめて渡すとキーとバリューをまとめて登録できるという優れもの。良いですね。

('Kuaga(Lost Time)(Radio Edit)', 'Pierce Fultion')
('Hands', 'Gareth Emery')
('Dreams Lost Kings Remix', 'Life of Dillon')
('We The Fire', '赤西仁')
('NANIMONO(feat.米津玄師)', '中田ヤスタカ')
('DREAM ILLUMINATION', 'CTS')

 

通信障害とドメイン変更

先月から504(Gateway Time Out)エラーを出していた当サーバーの通信障害の原因が判明したのでお知らせします。

DDNS(ダイナミックDNS)にIPアドレスを通知するデーモンDice がビジー(CPU使用率100%)でネットワークが落ちていたようです。ローカルではレスポンスを確認。

top からDiceデーモンのプロセスをkill 、再起動したところ外部から接続できるようになりました。

今までご迷惑をおかけして申し訳ありませんでした。お詫び申し上げます。

またこれを機会にDDNSのホストをieServer からMyDNS へと変更しましたので宜しくお願い申し上げます。アドレスは、https://stuffy.mydns.jp です。

突然ですが、Python 入門

Python には、インタプリタ(対話形式)とスクリプトの2つの方法があります。

python とだけコマンドを打つと対話型のプロンプトで実行可能になります。

$ python
>>>

プロンプトを抜けるには[Ctrl]+[D]です。
一方、テキストファイルに拡張子.py としてプログラムしたスクリプトを実行するにはpython test.py です。

$ vi test.py    # スクリプトを編集
↓ を保存。
print("Hello World!")

$ python test.py    # スクリプトを実行
Hello World!

python 入門

>>> 1+2  # 算術計算
3
>>> 6/5  # 割り算の結果はfloat型に
1.2
>>> 3*4
12
>>> type(1.4)  # データ型の問い合わせ
<class 'float'>
>>> type("hello")
<class 'str'>
>>> x=20  # 変数
>>> print(x)
20
>>> y=15  # 変数同士の演算
>>> print(x+y)
35
>>> a=[1,2,3,4,5]  # リスト
>>> print(a)
[1, 2, 3, 4, 5]
>>> len(a)  # リストの長さを取得
5
>>> a[1]  # リストの要素にアクセス
2
>>> a[4]=99  # リストに値を代入
>>> print(a)
[1, 2, 3, 4, 99]
>>> a[0:2]  # インデックスの0番から2番まで取得
[1, 2]
>>> a[1:]  # インデックスの1番から最後まで取得
[2, 3, 4, 99]
>>> a[:3]  # インデックスの最初から3番まで取得
[1, 2, 3]
>>> a[:-1]  # インデックスの最初から最後のひとつ前まで取得
[1, 2, 3, 4]
>>> a[:-2]  # インデックスの最初から最後の2つ前まで取得
[1, 2, 3]
>>> me={"height":180}  # ディクショナリを作成
>>> me["height"]  # 要素にアクセス
180
>>> me["weight"]=80  # 新しい要素を追加
>>> print(me)
{'height': 180, 'weight': 80}

ブーリアン とif for

&>>> hungry=True    # お腹すいてる?
>>> sleepy=False    # 眠い?
>>> type(hungry)    # 型取得
<class 'bool'>
>>> not hungry    # ブーリアン演算
False
>>> hungry and sleepy    # 空腹 かつ 眠い
False
>>> hungry or sleepy    # 空腹 または 眠い
True

>>> hungry=True    # if 文
>>> if hungry:
...     print("I'm hungry")    # if の中身は行頭空白4つ分インデントを空ける
......
I'm hungry
>>> hungry=False
>>> if hungry:
...     print("I'm hungry")
... else:             # else の中身も行頭空白4つ分のインデントを空ける
...     print("I'm not hungry")
...     print("I'm sleepy")
...
I'm not hungry
I'm sleepy

>>> for i in [1,2,3]:    # for 文(繰り返し)i を print
...     print(i)
...
1
2
3
>>> for i in range(1,11):    # range で指定
...     print(i)
...
1
2
3
4
5
6
7
8
9
10

>>> def hello():    # 関数を定義
...     print("Hello World!")
...
>>> hello()
Hello World!

>>> def Hello(object):    # 引数付きの関数を定義
...     print("Hello "+object+"!")
...
>>> Hello("cat")
Hello cat!
>>>

Drawboard PDF

Surface Pro などペンタブレットの強い味方、Drawboard PDF を使ってみました。Microsoft Store からダウンロード。

Surface ペンでお好みのツール設定をパレットから選んで、右のツールバーに[+] ボタンから登録すると使いやすい。

消しゴム、テキストの挿入など日本語版は今のところ用意されていませんが、こう云うものは直感的なインターフェイスを試行錯誤しながら使いこなすのでしょう。

早速、トライ。

アンダーライン、ハイライトが引けませんでした。保存したPDF ファイルを開いてテキスト選択すればいいんでしょうか。いまいち分かりませんでした。

Surface ペンがフリーズしても電池交換できるように予備の単6電池をAmazon.co.jp でストックしておくと吉。

Amazonベーシック 乾電池 アルカリ 単6形 4個パック