それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

三井住友VISAの利用明細を郵送に切り替えても追加料金無しだった話。

三井住友VisaカードのWEB明細がクソすぎる。

WEBでの明細というのは、どうしてめんどくせええんだろう。疑問に思います。

明細は、郵送であればパパッと見られるのに、WEBで閲覧しようとしたら、途端にめんどくさくなるのはなんでなんでしょう?

WEBで閲覧する利用明細が面倒なので郵送にすることにした。

登録解除画面で、脅された

郵送にすることにして、WEBから郵送をに切り替えようとしたら、次のように、脅された

f:id:takuya_1st:20180607181721p:plain

割引なくなるよ!!!って脅してくるの。

でもまって、Amazonのカードは年会費無料じゃん?

年会費無料のカードで年会費がかかるって訳がわからない。

問い合わせた。

年会費無料のカードに、年会費がかかるってどういうことなんでしょうか?
年会費は発生していて、割引が適用されているってことなんでしょうか?
であれば、年会費無料の表示は不当表示ですよね。実質無料と書くべきでしょ?

ちなみに、電話料金はこっち持ちですよ。

回答をもらった。

個人情報の確認などで、待たされること10分程度、回答を頂くことができた。

お客様のAmazon カードは、年会費無料のカードであるために、郵送に切り替えても優遇がなくなるわけではありません
郵送に切り替えることで料金は発生しません。

驚いた。

表示されていた文言をもう一度見てみよう

f:id:takuya_1st:20180607182705p:plain

僕は何に同意すればいいのでしょうか

本当にアホらしい。

解除した。

WEB明細の利用を停止し、郵送にすることにし、WEBから所定の手続きで申し込みました。

完了画面で驚愕した!

申込みの完了の画面の表示を見て飛び上がった。

解除後もWEB明細はご利用いただけます。

f:id:takuya_1st:20180607182204p:plain

は?なにこれ?

警告画面は何だったんだ。

実際には、追加料金はかからない(誤認)さらに封書で利用明細書を配達を受けても、WEBは継続して利用できる。

会社の都合が全面に出てきててマジ参った。

三井住友Visaはどうなってんの

WEB明細をほぼデフォルトで強制してくるのは完全に向こうの都合じゃん。

ログインがだるすぎていらないんですよ。WEB明細。

絵合わせ認証がだるい

ブラウザからクッキーが消えると絵合わせ認証になる。すごく不便。

f:id:takuya_1st:20180607181129p:plain:w300

職業柄ブラウザのCookieを消去とかわりと気軽にやっちゃうので、ブラウザの永続Cookieで認証されるのはうざいの一言です。

絵合わせ認証は認証ですらないし、ボット避けなら別の方法があるし、ブルートフォースやリバースブルートフォースを警戒するなら、別の手段もあると思うんですね。

愚痴

リスクベース認証というのであれば、「設定変更」(Write)と「閲覧」(Read)をベースをにリスクを分けるのが筋ってもんでしょ。

  • 絵合わせ認証とかいう謎認証
  • ブラウザのクッキーを消せない問題。
  • スクレーパーがめんどくさくなった。

ログインがめんどくさくなりすぎて本当にアホらしい。スクレーパーもめんどくさくなりすぎ。明細系のアプリでも初期設定がめんどくさい。

「紙見たら済む話」を「わざわざ見に行って」取得するというのがわからん。

パスワードを入れてるなら、メールで暗号化PDFを送ってきて、そのPDFのパスワードを取得するためのログインならまだわかるって話だよ。

今回解除したカード

以上2枚のカードのWEB明細を解除して郵送にすることができました。

クレカの明細を郵送にしてもネットで見れるので皆さんも試してみては?

 関連URL

これが今回の問題のページです。

phpstormでSCSSを自動的にトランスパイルする。

css を作成するのに、scss をコンパイル

gulp のタスクとか、python の filewatcherとかでやってたんだけど、いい加減に限界だし、codekit も買ってみたんだけど、なんかめんどくさい。

ふと、Jetbrains の製品ならできるだろうと思ったけど、調べるのがめんどくさいので、やってなかった。

ざっくりやったので、あとで見直すためにメモをとる。

設定方法

プロジェクトの設定( phpstorm にはプロジェクトごとの設定がないので、設定を開くとプロジェクトごとの部分はプロジェクト毎になる。)

設定画面から、file watcher を探してscssのWatcherを追加

f:id:takuya_1st:20180606213122p:plain

設定に項目が追加されたら、ファイル名を指定する。

わたしの場合、assets/style.scss でインポートするように書いているので、 assets/style.scssstyle.css style.css.map に展開するように設定を書いた。

f:id:takuya_1st:20180606213607p:plain

ファイル名やパスが解らない場合は

コンソールに常に出力するようにし、STDOUTをアウトプットするようにした。とりあえず設定中はチェックオンにした。

f:id:takuya_1st:20180606213758p:plain

正常に出力できたら

設定のチェックをを外した。 auto save (自動保存)で File Watcher のジョブをキックするかは迷ったけど、とりあえずオンで。

f:id:takuya_1st:20180606214013p:plain

あ、これ便利。

設定してみて思ったんだけど、これ便利だわ。外部のgulpタスクをいつも内蔵ターミナルで起動してた手間がなくなった。

ほかに、babel ができたり、任意のコマンドに対応しているので、ファイルが更新されたら即時 rsync 起動とかできて便利になるかもしれない。

ちなみに、Vscode でもできそう

visual studio codeにもtask があって同じようなことができそう。

https://code.visualstudio.com/docs/editor/tasks

参考資料

http://www.webopixel.net/develop/860.html

Macのコマンドでスクリーンセーバー・画面ロック・画面オフ

2019-05-08 追記

macOS Sierra からのロック画面のキーボードショートカットは次の通り。

Command - Ctrl - Q
Command - Shift - EJECT
Command - Shift - Power

これだけ。Windowsみたいに離席する前にCommand-Ctrl-Q

Macで画面オフのショートカットが欲しい。

Windowsと違って、Macで困るのは、 Win-L のキーボードショートカットが無い所

ちょっと離席するときにMacを弄くられてデスクトップの背景をアニメ絵に変えられたり、妙なTweetを投稿されないようにしたい。

本当はTouchID があればいいんだけどね。

Macをロックする方法

画面をロック(ログイン画面にする)方法は大きくわけて3つ在る。

  1. 画面オフ・スクリーンセーバー起動時に画面ロック設定を環境設定でチェックする
  2. ユーザー切替を使ってログインスクリーンを表示
  3. Keychains.app を使って画面をロックする

手軽なのは1でしょうかね。ただプレゼン中にスクリーンセーバーになって画面ロックされるのは割と面倒くさいので、わたしは2/3の方法を取りたいと思ってた。

どの方法を選んでも画面ロックをしてパスワード入力が必要にすることが出来るので、これらを起動するコマンドをしっておけば、あとはキーボードショートカットを割当てたりロックコマンドを作ったりAppをつくってSpotlightから呼び出せるよね。

これらのそれぞれの方法を見ていきましょう。

1. 画面オフ・スクリーンセーバーを使った画面オフ

画面オフ・スクリーンセーバーが起動したら、ロックを掛ける。

f:id:takuya_1st:20180518093643p:plain:w200

この設定を行った上で、コマンドラインから、スクリーンセーバーを起動するか、画面をオフにする。

1.1 スクリーンセーバーを起動する

コマンドラインでターミナルから、スクリーンセーバーを起動するには、 ScreenSaver のフレームワークの中にあるバイナリを実行する。

/System/Library/Frameworks/ScreenSaver.framework/Resources/ScreenSaverEngine.app/Contents/MacOS/ScreenSaverEngine

または  open で  ScreenSaverEngine.app を起動する。

open  /System/Library/Frameworks/ScreenSaver.framework/Resources/ScreenSaverEngine.app

1.2 画面をオフにする

ディスプレイの電源OFFを起動する方法は、次の通り pmset は power management settgins の略だと思う。

pmset displaysleepnow

またはFinderにスリープを実行させる。

osascript -e 'tell application "Finder" to sleep'

 2. ユーザー切替を使ってログインスクリーンを表示

ユーザーの切替を使う方法。

メニューバーの右上にある、「ログインウィンドウ」を使って、ロックをする。 この場合のデメリットは、ユーザー名を再度入力が必要になる点だ。

f:id:takuya_1st:20180606103835p:plain:w300

コマンドラインからは次のようにする。

/System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -suspend

長いので alias でもしとけばいいかと。

環境設定 と併せて使う必要がある(スクリーンセーバー・画面オフ)

これらスクリーンセーバーと画面オフと使った場合、画面ロックを使うには環境設定で設定が必要

f:id:takuya_1st:20180518093643p:plain:w200

スクリーンセーバーの解除時に画面ロックをするのオプションを使わないといけないのが少しめんどくさい。 冒頭にも書きましたが、ログイン関連でロックするには、環境設定が必要になる。

3. Keychains.app を使って画面をロックする

キーチェーンには、画面ロックするメニューが用意されているので、コレを使えばロックを掛けることが出来る。

f:id:takuya_1st:20180518095034p:plain

このメニューバーのメニューを起動してあげればいい。 起動する方法はいくつか在るが、Foundation を使ってパパっとPerformSelectorを実行すればいい。

キーチェーンを使う方法。

キーチェーンの機能を使うと、ダイレクトに画面ロックを起動できるから便利。

キーチェインでロックすることができる。キーチェインのボタンを押せば良いんだから、 キーチェーンの参照を取ってきて、performSelector して押すだけ。

キーチェインに該当メニューがないときは、keychains.appの設定でメニューバーに表示するように設定しておけばいい。

事前設定

f:id:takuya_1st:20180518095838p:plain:w200

performSelector する場合

lockscreen のコマンドをつくった

lockscreen を起動する。

lockscreen-macos/main.m at master · takuya/lockscreen-macos · GitHub

#import <Foundation/Foundation.h>

int main() {
  @autoreleasepool {

    NSBundle *bnd = [NSBundle bundleWithPath:@"/Applications/Utilities/Keychain Access.app/Contents/Resources/Keychain.menu"];

    Class pc = [bnd principalClass];
    id k = [[pc alloc]init];

    [k performSelector:@selector(_lockScreenMenuHit:) withObject:NULL];
  }
  return 0;
}

lockscreen-macos/main.m at master · takuya/lockscreen-macos · GitHub

コンパイルしておけばSpotLightから呼び出せる。

作ってコンパイルした実行ファイルを適当なところに置いてSpotlightで起動すれば、手軽に画面のロックが出来るので楽。本当に楽。これで捗る

この方法が不便なのは事前に、キーチェーン設定でメニューバーに表示しておく必要が在る点だけ。

f:id:takuya_1st:20180518095727p:plain

f:id:takuya_1st:20180518095727p:plain:w200

組み合わせて離席用に

画面ロックとディスプレイをオフを組み合わせてコマンドにしてもいいよね。

画面をスリープさせるだけのコマンド sleep display をコマンドにして

#!/bin/sh

exec pmset displaysleepnow

画面ロックするだけのコマンド lock screeenとを組み合わせておけば、使い分けも簡単。SpotLightでできる。

#!/usr/bin/env bash


sleep_display_power_off
lockscreen

f:id:takuya_1st:20180812123048p:plain:w240

まとめ

  • スクリーンセーバー
  • 画面オフ      - 事前設定が必要      - プレゼン中や作業中に画面オフになったりすると面倒くさい。
  • ユーザーの切替
    • 環境設定が必要
    • 再ログイン時にユーザー名入力(選択)からになるのが面倒くさい。
  • キーチェーン
    • キーチェーンをメニューバーに表示する必要がある。

スクリーンセーバーと画面オフの使用頻度にも依るのですが、いくつか選択肢があって好きな方法を選べるのが嬉しい。

あとはどの方法でも好きなものをキーボードショートカットに割り当ててしまえばWin-Lのような使い方が出来る

画面オフは「パワーボタン押す」なので、強い意味のパワーオフでCtrl-Shift-パワーとかでしょうかね。

次に調べること

ユーザー切替のログインスクリーンを表示するをCLIで起動する方法。 pmset はオモシロそうなので全部のコマンドを試したい。

2018-08-12追加

lockscreen で検索にマッチしなかったのでキーワード追加。最近のGoogleはほんとに。。。

参考資料

https://apple.stackexchange.com/questions/80058/lock-screen-command-one-liner

ゴミ箱を空にするのをコマンドから呼び出す。

Mac の「ゴミ箱を空にする」をコマンドからやる

ゴミ箱を空にするをコマンドからやろうと思って、AppleのDeveloperサイト読んでたけど、それっぽいのはないので、シェル経由でこのコマンドで解決。

find ~/.Trash -mindepth 1 -delete 

単純に ~/.Trash の中身を削除すればいいみたい。

確実にゴミ箱を消す srm

srm と組み合わせて、確実にゴミ箱から消すを選ぶこともできるけど、SSD搭載のMacBookだとほぼ意味がない。

find ~/.Trash -mindepth 1 -exec srm {}\;

srm コマンドあったの忘れてたわ。

brew cask install で vscodeが見つからない。

vscode 入れようとしたらNot Found

takuya@$ brew cask search vscode
No Cask found for "vscode".

ありゃ・・・?macbrew cask って VSCODE がないんかな?

とおもったら、名前が違っただけだった。 visual-studio-code でいれるんですね

takuya@$brew  cask install visual-studio-code
==> Satisfying dependencies
==> Downloading https://az764295.vo.msecnd.net/stable/d0182c3417d225529c6d5ad24b7572815d0de9ac/VSCode-darwin-stable.zip
######################################################################## 100.0%
==> Verifying checksum for Cask visual-studio-code
==> Installing Cask visual-studio-code
==> Purging files for version 1.23.1,d0182c3417d225529c6d5ad24b7572815d0de9ac of Cask visual-studio-code
Error: It seems there is already an App at '/Applications/Visual Studio Code.app'.

参考資料

https://github.com/Microsoft/vscode/issues/40066

unarが Uncaught exception NO Character Conversion Exception

unar をシェルコマンド経由で自動実行してたらエラーになった

unar: Uncaught exception NO Character Conversion Exception
Unar Can't get cString from Unicode string

などとエラーになる。

調べてみたら LANGが無いことが原因だった。 LANG=c の状態でzipファイルの中に日本語ファイルがあると変換できないっぽいね

LANG=ja_JP.UTF-8 unar -o /tmp sample.zip

のように、LANG環境変数をつけたらわりとすんなり動くので嬉しい。

手早くランダムな文字列を作成する

簡単に衝突しないような文字列をつくってファイルを保存するようなことをしたい。

OpenSSLを使えば割と楽

require 'openssl'
str =  [OpenSSL::Random.random_bytes(12)].pack("m*").delete("\n")
puts str

ワンライナー

ruby -r openssl -e 'print [OpenSSL::Random.random_bytes(12)].pack("m*")'

パスワードに使えるのか?

ある程度はランダムな数字の配列をBase64にしているので、Base640-9,a-z,A-Z,+/なので + / がパスワードとして嫌われそうで面倒くさい。 (とうぜん使えるべきなんですがね)

Base64化のアルファベットのした文字出現頻度に偏りがなければ大丈夫なのですが、単なる符号化だしほぼランダムだと思う。

記号を置換すれば、使いやすくなるかも?

takuya@untitled$ ruby -r openssl -e 'print [OpenSSL::Random.random_bytes(12)].pack("m*").tr("+/","-_")'

ループして作ってみる

takuya@untitled$ for i in {1..3};
do
  ruby -r openssl -e 'print [OpenSSL::Random.random_bytes(12)].pack("m*").tr("+/","-_")' 
done
NTJ0XFAlWCcwZsiG
5M5UGQQikFE0TVNh
i9mq-nbxfI7mS3pJ

まぁこの手法は require "securerandom" が内部やってる処理とほとんど同じなんだけどね・・・

dockerでターミナルが変な折り返しで辛い現象を何とか解決する

docker でターミナルの折返しがキツイ

Dockerでbash などの ttyで接続すると、横幅サイズがおかしくなるとの、折返し時に、妙なイチに折り返すのでキツイ。

github のissue スレ見てるとエラーの原因は docker exec -it を実行したときに、 /exec/${EXEC-ID}/resize" が実行されないことにあるらしい

折り返しがおかしくなる例

f:id:takuya_1st:20180524170711p:plain

幅がおかしくなる例

f:id:takuya_1st:20180524170546p:plain

折り返すのがおかしくなるのは、linesが合わないことに依るもので、幅がおかしくなるのはcolsが合わないことによる。

そのうち解決されるんだろうけど

いずれバブフィックスで治りそうだけど、いま辛い。

とりあえず治す方法

docker exec -e COLUMNS=$(tput cols) -e LINES=$(tput lines) -it CONTAINER_ID bash

MySQL などのコマンドも同じく

docker exec -e COLUMNS=$(tput cols) -e LINES=$(tput lines) -it CONTAINER_ID mysql -p -u MYSQL_USER DATABASE

docker側の問題で利用者の私達に環境が原因ということでもなく、 bash を割当てている tty に設定が届かないことによるので、環境変数で明示的に設定してまえば、何とか回避することが出来る。

dockerfile の環境変数bash起動時になにか実行することで解決もできそうだけど、dockerfile や環境変数をすべてのインスタンスに書くのは現実的じゃないので、exec 実行時にフィッティングするのが妥協点っぽい

解決した

とりあえず解決する。

f:id:takuya_1st:20180524172308p:plain

これでしばらくは戦える。

サイズは sttyかtput で確認ができる。

stty をつかうか、 tput を使うことで、現在開いているターミナルのサイズをしって、ソレを使うことが出来る。

takuya@sakura:~$ tput  lines
52
takuya@sakura:~$ stty size
52 180
takuya@sakura:~$ tput cols
180
takuya@sakura:~$ tput lines
52

参考資料

https://github.com/moby/moby/issues/35407

GitLabのIssueで作業時間の記録がとても楽だった

gitlab のコメントに spend と書けばいい。

/spend 1h

とか書くと、次のように、作業時間が記録される。 /estimate だと見積もり時間も併せて保存できる

実際に作業時間を記録した例。

f:id:takuya_1st:20180516005640p:plain

仕事に掛けた時間がわかる。

タイムトラッキングを使うことで、課題管理を中心にしてどれくらいの時間をコードに費やしたか解るようになってて便利。

GitLabの課題管理は最強では

コミット後に時間を記録

コミットを中心としたワークフローが割と便利なのです。gitlab がタスク管理として最適になってた。

  • まずイシュー挙げて
  • そこから作業開始して何処までやったをメモする。
  • 作業内容をコミットし
  • コミット・メッセージにIssue番号を紐付ける。
  • 最後にissueに時間を書く

シンプルで、割と導入に負荷もかけず、簡単にタイムマネジメントとタイムボックスで仕事ができる。

完了報告メールなども特に必要なく、関係者がissueをサブスクライブしておけば、購読者にメールが行くので、「○○ができました」とか無駄なメールを作成する時間が無くなるし、自動メールと通知で済むので、「メールの江戸しぐさ」も気にしなくていい。

これは便利なんじゃないのか。

参考資料

brew で php のインストール(homebrew/php/喪失以降)とモジュール(xdebug)のインストール

phpbrew で入れようとしたら、エラー

Homebrew/php (deprecated)

です。

f:id:takuya_1st:20180513170025p:plain:w300

世の中の brew install で書かれた意識高いPHP'erのゴミ記事が役に立たなくなりました。

どうするのか?

php はtapから本家に戻りました。なので、以下の通りで十分です。

brew install php 
brew install php71

extensionどうするのか?

PECL 使います。

プレビルド版はなくなりました。php利用者層を考えるとバッドな感じはあるけど、仕方ないですね。

brew install php 
hash -r 
pecl install xdebug

beta 版の利用などは、suffix を付けて対応します。

pecl install gmagick # stable が無いのでエラー
pecl install gmagick-beta

pecl なんて懐かしいな。長いこと使ってないや。

pecl install は

php.ini を直接書き換えてしまうようなので注意が必要

pecl でいれた モジュールの有効化には、conf.d を使いたいのですが、なぜか php.iniを書き換えくれるので、

vim /usr/local/etc/php/7.2/php.ini # pecl が書き換えた extension を削除

extensionsを conf.d に記述

conf.d にモジュールのロード記述を描くといい。

/usr/local/etc/php/7.2/conf.d/ext-gmagick.ini
/usr/local/etc/php/7.2/conf.d/ext-xdebug.ini

brew で入れたphpの場合にエクステンションのパスを記述するとき、 バージョンの枝番(7.2.9 の場合 9 ) を入れてしまうと、頻繁なアップデートで最小バージョンが合わなくなってファイルの読み込みに苦労する。

そこで次のように記述する

[xdebug]
zend_extension="/usr/local/lib/php/pecl/20170718/xdebug.so"

よく無い記述の例

[gmagick]
zend_extension="/usr/local/Cellar/php/7.2.5/pecl/20170718/gmagick.so" # 7.2.5 → 7.2.6になるだけでエラー

好ましい書き方の例

こう書くのがベター

[gmagick]
zend_extension="/usr/local/lib/php/pecl/20170718/gmagick.so"

zend apiバージョンは半年くらい変わらないので brew upgrade で 7.2.7 → 7.2.8 とかにマイナーバージョンの更新があった時でも特に問題なく設定が維持される。

iniファイルの書き換えをやらないとエラー

このように、同じエラーが2回出てきているときは、extensionの記述が2回あるということです。

takuya@conf.d$ php =v
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/Cellar/php/7.2.5/pecl/20170718/gmagick.so' (tried: 
/usr/local/Cellar/php/7.2.5/pecl/20170718/gmagick.so (dlopen(/usr/local/Cellar/php/7.2.5/pecl/20170718/gmagick.so, 9): image not found), 
/usr/local/Cellar/php/7.2.9_1/lib/php/20170718//usr/local/Cellar/php/7.2.5/pecl/20170718/gmagick.so.so 
(dlopen(/usr/local/Cellar/php/7.2.9_1/lib/php/20170718//usr/local/Cellar/php/7.2.5/pecl/20170718/gmagick.so.so, 9): image not found))
in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library '/usr/local/Cellar/php/7.2.5/pecl/20170718/gmagick.so' (tried: 
/usr/local/Cellar/php/7.2.5/pecl/20170718/gmagick.so (dlopen(/usr/local/Cellar/php/7.2.5/pecl/20170718/gmagick.so, 9): image not found), 
/usr/local/Cellar/php/7.2.9_1/lib/php/20170718//usr/local/Cellar/php/7.2.5/pecl/20170718/gmagick.so.so 
(dlopen(/usr/local/Cellar/php/7.2.9_1/lib/php/20170718//usr/local/Cellar/php/7.2.5/pecl/20170718/gmagick.so.so, 9): image not found)) 
in Unknown on line 0

困る人は

phpenv の利用を考えたほうが良いのではないでしょうか。

参考資料

https://github.com/Homebrew/homebrew-php

異世界枕:草枕の現代版

冒頭

コードをビルドしながら、こう考えた。

 智に働けば角が立つ、情に棹させば流される。意地を通せば窮屈だ、とかく人の世は住みにくい。

 働きにくさが高じると、ホワイトへ転職したくなる、どこへ転職しても、働きにくいと悟った時、異世界転生が産まれ、二次画像が出来る。

 

 会社を作ったのは、国でも無ければ親でもない、やはり向こう三部屋怒鳴りちらす、ただの社長である。ただの人が作った会社が住みにくいからとて、転職する会社はあるまい。あれば人手なしの会社に行くばかりだ、人手無しの会社は、人の世よりもなお働きにくかろう。

 

 転職することのならぬ会社が住みにくければ、住みにくいところを、どれほどかくつろげ、つかの間の命を、束の間のでも働きやすくせねばならん、ここにラノベ作家という職が出来て、絵師という使命が下る。あらゆる2次元は社会人を心穏やかにし、通勤を豊かにするゆえに尊い

 

 生きづらい世から、生きづらい煩いを引き抜きて、ありえない世界を目の当たりに映すのが異世界転生である。異世界マンガである。あるいはアニメとフィギュアである。細かに言えば読まないでも良い。ただ目を閉じるかスマホを開けば、ツイートも産まれ、二郎系も映る。妄想を"なろう"に投稿せずとも、中二の心は躍る。液タブに向かわずとも、色彩豊かに妄想できる。ただ、われが住む世界を、視覚というカメラにおさめて脳裏に刻めば良い。インスタに溢れる虚飾、FBに溢れる馴れ合い、そこに名作はなく名作を生み出す必要もない。SNSリア充どもは苦悩をしてるくせにカッコつける。そんなことから一切離れて、自分の妄想ハーレム世界に蕩けることは、インスタ女子やユーチューバーよりもずっと幸せだ。

異世界も絵師も

そうなんだよ。草枕漱石が言ってたことなんだ。100年たっても人の世は住みやすくなったんだろうか。

元ネタ

草枕:序

https://www.aozora.gr.jp/cards/000148/files/776_14941.html

Google Chrome / Apple Safari は 301 リダイレクトやHSTSをずっと保存する!?

301/302 のどっちが良いか調べてて気になった。

HTTS ステータスコード 301 でリダイレクトしたら、その転送結果がキャッシュされて、リダイレクト後に戻ってこれない。

301 のリダイレクトがずっと残るので気になってた。

https://stackoverflow.com/questions/9130422/how-long-do-browsers-cache-http-301s

At least two browsers - Chrome and Firefox - will cache a 301 redirect with no expiry date
FirefoxとChromeの2つに限れば、リダイレクト情報保存に期限はない。
Chrome caches the 301 redirect infinitely, or until you open your DevTools, check Disable cache (while DevTools is open), and reload the page.

などと書いてあって、ステータスコード301はリダイレクトで乱用すると、キャッシュで面倒なことになりそう。

いちおう、キャッシュさせないように Cache-control でも制御できるみたい。 まぁ301を使うことは、サイト移転以外にあまりないと思うんけど、知って損にはならなさそう。

HSTSはどうなのか

HSTS もリダイレクトがキャッシュされて、開発中にSSLでトラブったり切替え時にアレコレすると、わりと面倒なことになる。

コッチも調べてみたら、有効期限を秒数で指定できるようでした。

Strict-Transport-Security:max-age=$int;includeSubDomains

nginx で サイトを認証を手軽にログインフォーム認証にする。(Basic認証の代わり)

nginx で サイトを認証する。

Basic認証だと不便なので、フォーム認証をする。

巷に「nginxでbasic認証してみた」の記事が溢れているけど。どう考えてもbasic認証(digest認証)よりHTTP認証(フォーム)のほうがいいと思うんですよね。nginxだけで片付くのになんでやらないんだろう。

nginx の auth_request を使う。

auth_requestで、認証が出来る。

  • 認証済みの場合は、指定したURLをそのまま見せる
  • 未認証の場合は、認証用のページに飛ばす。
  • 認証ページが、401/403 を返せば未認証に
  • 認証ページが、200(20x)を返せば認証済みに。

要は、認証ページを指定して403 / 200 を返す。

簡単!!!!

それだけ。超簡単。

ログインフォームに転送するには nginx で 401 エラーページを指定する

もしかしたらBasic/Digest認証を設定するよりもっと簡単で使いやすいのでは。

設定はこれだけ

auth_request /auth_checker.php;
error_page 401 =301  https://$host/form.php?orig=$uri&$query_string;
auth_request  セッションチェックURL

上記のこれで、ユーザの認証状況を確認する。

error_page 401 =302  ログインフォームURL

上記のこれで、401が来たら、302 でリダイレクトに変換して、認証ページへ飛ばしてる。

認証取得ページで、認証完了後に元のURLへ再度リダイレクトをするために、LOGIN_URL?orig=$uri&$query_string で認証ページに元のリクエストページを保存している。

認証チェックの例

認証チェックは、セッションなどを見て、200 / 402 をチェックすればいい 使い方によっては、IPアドレスでチェックしたり、Oauthなどもできそうですよね。

例 auth_checker.php

<?php
if ( empty($_COOKIE) ){
     //do something for cookie
}
session_start();
if ( !empty($_SESSION['is_login']) ) {
  http_response_code(200);
  return ;
}else{
  http_response_code(401);
  return ;
}

特定のディレクトリにだけ認証をかけたい場合

location /path/to/秘密 {

    auth_request /auth_checker.php;
    error_page 401 =302  https://$host/form.php?orig=$uri&$query_string;
}

未認証のときは、単に見せない(ログイン者だけ画像が見えるなど)であれば、 error_pageのリダイレクトは無くても良い。

個人的には歓喜した。

Apacheディレクトリの一覧に保護を掛けるのが楽。 Basic認証だとiOSがパスワードを学習しないので不便なのでした。

認証を作るのが面倒くさいので、割とコレで自分ファイルにロックを掛けるだけなら、手軽でいいなとおもいます。

ファイルの共有程度に、NextCloudいれたりGoogleDrive契約するのも面倒くさい話だし。

参考資料

http://nginx.org/en/docs/http/ngx_http_auth_request_module.html

2018-05-09 更新

リダイレクトには、301 より 302 の方が良さそう。Chromeが301 リダイレクトを学習してキャッシュしてしまう。

phpで指定した日付の範囲を作り月末にも対応させる

php の日付範囲を求めるにはDatePeriodを使うと便利

DatePeriod にスタートと、終了、そして間隔を追加すると日付範囲のオブジェクトが出来る。

<?php
#(PHP 5 >= 5.3.0, PHP 7)
DatePeriod implements Traversable {

DatePeriodは Traversable なので、foreach などに入る配列オブジェクトとして扱える。

日付範囲を扱う

<?php

function date_range($start='yesterday', $days='+31 days') {

    $begin = new DateTime( $start );
    $end = new DateTime( $days );

    $interval = new DateInterval('P1D');
    $date_range = new DatePeriod($begin, $interval ,$end);
    return $date_range;
}

ループで回せるように range の変わる date_range を試しに作ってみた。

実例

<?php

$sday = date('Y-m-01', strtotime('this month '));  // 05-01 
$eday = date('Y-m-01', strtotime('next month '));   // 06-01 

foreach( date_range($sday, $eday) as $day ){
  echo $day->format('Y-m-d')."\n";
}

出力例

2018-05-01
2018-05-02
2018-05-03
(略
2018-05-29
2018-05-30
2018-05-31

ポイント

ループで回すときに、最終日の1日先を指定するのがポイント

DatePeriod は指定した終了時刻未満を配列に返すので、注意が必要。

参考資料

aptで入れたcertbot にhttpd 壊されたので注意のために記事書いた

証明書の管理をcertbot にまかせていました。

lets encrypt が一般化し、ChromeHTTPSを標準化してHSTSを覚えるようになってきて、HTTPS化の流れは避けられない。

さらにあれから2年がたつ、以前はcertbot が手軽に使えるので、証明書の管理に使ってた。

certbot のインストールと証明書の取得。

インストール

sudo  apt install certbot

取得

sudo certbot  certonly  -d takuya.example.com

nginx と apache2 がダウンする事態が発生。

こうやって運用を初めて2ヶ月たった、ある日、apacheが死んでることが発覚。すぐに再起動して事なきを得た。 しかし、数時間後に再びダウンする。エラーログを調べてもわからない。

nginxに切替えてみた。しかし再び毎日ダウンする自体になり頭を抱えていた。

apt で入れたcertbot はサービスを伴う。

攻撃でも食らってるのかとDoSを疑ったり、アクセスログやサーバーのログを調べているうちに気付いた。

これ certbot が自動更新で落ちてる。。。。

disableをして事なきを得た

takuya@:~$ sudo systemctl  disable   certbot.service
takuya@:~$ sudo systemctl  disable  certbot.timer

systemd に登録された certbot のサービス

certbot を apt で入れた場合に、次の自動更新のサービスが展開される。

そう、certbotのせいだった。

この自動更新の動作が、apache/nginxを停止し、証明書の更新用に起動して失敗して放置し、そのままnginx/ apache が停止したままになるのだ。

それも数時間おきに。

takuya@:~$ sudo systemctl  status  certbot.timer
● certbot.timer - Run certbot twice daily
   Loaded: loaded (/lib/systemd/system/certbot.timer; disabled; vendor preset: enabled)
   Active: active (waiting) since Tue 2018-05-01 13:17:46 JST; 2 days ago
takuya@:~$ sudo systemctl  status  certbot.service
● certbot.service - Certbot
   Loaded: loaded (/lib/systemd/system/certbot.service; static; vendor preset: enabled)
   Active: inactive (dead) since Thu 2018-05-03 12:19:42 JST; 6h ago
     Docs: file:///usr/share/doc/python-certbot-doc/html/index.html
           https://letsencrypt.readthedocs.io/en/latest/
  Process: 30575 ExecStart=/usr/bin/certbot -q renew (code=exited, status=0/SUCCESS)
 Main PID: 30575 (code=exited, status=0/SUCCESS)
      CPU: 545ms

 5月 03 12:19:41 myhost systemd[1]: Starting Certbot...
 5月 03 12:19:42 myhost systemd[1]: Started Certbot.

しかし、certbotは80/443 に直接アクセスが出来ない。

私はiptables でポートを変えててマッピングしてたり、リバースプロキシを挟んでいるので、certbot の自動更新は動作しない。

そのために、毎月手作業で更新していたのだが、それすらめんどくさくなってCDNHTTPSを利用している。つまりcertbot はインストールしたまま放置してたのだ。

そして、事件は起きてしまった。

certbot が証明書を自動更新しようとしてapache/nginxの設定を書き換えて死んでいく。

そのためにHTTPのアクセスはHTTPSにリダイレクトされるようにされているしもうめちゃくちゃ。。

apt の certbot は怖い。

  • http → httpsのリダイレクトを書き加えられる
  • certbot の sytemd タイマーが定期的に動作してくる
  • certbothttpd のプロセスを利用して更新を試み失敗したまま放置

割と面倒くさい。

自動更新が動作しない環境であれば、certbot を apt で入れるべきではないのかもしれない。

2018-07-23 追加

https のサービスをいったん止めて再起動させればいい感じかもしれない

/lib/systemd/system/certbot.timer  にタイマーの記述

takuya@:~$ cat  /lib/systemd/system/certbot.timer
[Unit]
Description=Run certbot twice daily

[Timer]
OnCalendar=*-*-* 00,12:00:00
RandomizedDelaySec=3600
Persistent=true

[Install]
WantedBy=timers.target

/lib/systemd/system/certbot.service にコマンドの記述

takuya@:~$ cat  /lib/systemd/system/certbot.service
[Unit]
Description=Certbot
Documentation=file:///usr/share/doc/python-certbot-doc/html/index.html
Documentation=https://letsencrypt.readthedocs.io/en/latest/
[Service]
Type=oneshot
#ExecStart=/usr/bin/certbot -q renew
ExecStart=certbot renew --pre-hook "service nginx stop" --post-hook "service nginx start"
PrivateTmp=true

systemdを再設定 .

sudo systemctl daemon-reload
sudo systemctl  status  certbot.service
sudo systemctl  status  certbot.timer

sudo systemctl  start certbot.service

sudo systemctl  status  certbot.service
sudo systemctl  status  certbot.timer

しばらく様子を見る

2018-08-07

crontab にした

* */12 * * * bash -c ' { systemctl stop apache2 nginx ; certbot -q renew; systemctl start apache2 nginx; }'

2018-08-07 systemd の記述を修正

reload の順番がおかしかったので修正