TVの受信設備を持っていないのに、「皆様の(金が目当ての)押し付け・押し売り放送協会」が来て不快になるのが嫌なので、通常はインターフォンの電源を切って居るが、その副作用的なことがあった。押し売り放送は表面的には法を守る姿勢があるが、先日、法から外れた奴が来た。それで過去の不可解・不気味な現象の謎も解けた感じだ。

数日前の夕方、玄関のドアをノックする音がした。そういうのは ここに来てから概ね数か月ごとにあったが、今回は随分しつこく、ノックの仕方を変えながら数分間も続いた。

いつもそうなのだが、ノックの音が軽いうえに回数も少なく、名乗らず(配達などは名乗ることがある)、人を呼び出す意思が感じられないところが不気味だった。こちらが出て行かないので じきに終わるが、そのあとに紙も何も残されておらず(普通は、用があるなら残すではないか?)、何のために来たのか不明なのも不気味だった。

今回は長かったので、もしかしたら重要なことかも知れないし、そうでなくても鬱陶しくてイライラしているので、「何なんだよ!」と文句を言いたくなって出てみた。

すると、灰色っぽい作業服でマスクをした男(20代後半-30代?)が居て、聞き取りにくい話し方で(建物の)管理会社風の所属を名乗り(それで、この建物の管理会社と誤解した)、「ご挨拶を兼ねて」、「ご主人様の将来設計(だかなんだか)」とか言い出したので、その時点で怪しさが100%になった。

今までの経験で、電話でも訪問でも、大体そういうのは怪しいのは分かっている(他には「近くに来たので」)。そもそも、突然来た見ず知らずの作業服の奴に「将来設計」を相談するなんて あり得ない。

ただ、下の参照ページを見ると、営業を装ってスーツを着ている場合もあるとのことなので、外見で判断は できないようだ。

で、勧誘か訪問販売か聞いても はっきり答えず、この建物の管理会社か聞いたら違うと言うので追い返した。その時は詐欺、勧誘、物販、空き巣などを疑い、かなりムカついた。

あと、服装と言うことが合っていなかったので、勧誘や訪問販売をしているつもりの異常者かも知れないと思ったが、段々、下のように空き巣の気がして来た。

その後、(ムカつきはともかく、)そのまま放置するのは どうも嫌な感じがしたので、「空き巣 前兆」というような言葉で検索したら、不審なノックは「下見」の可能性が高いことが分かった。 (→ 参照1, 2)

下見は普通はインターフォンを鳴らすらしいが、電源を切っているのでノックしたのだろう。インターフォンはカメラに顔が写るが、ノックなら証拠が残らないから逆に好都合だ。あと、近頃はマスクが普通なので、インターフォンにしても顔がバレずに都合がいいようだ・・・

これが最初に書いた副作用的なことである。

それで、市や警察に連絡しようとしたが、市は子どもの防犯以外は警察に丸投げのようだった。こういう情報収集・公開の窓口でも ありそうだと思ったが・・・

で、警察は「通報」は電話だけなようで面倒なので止めた。「情報提供」はメールなどが可能だが、おそらく効果がない。かなり遅れている(しゃべれない方は どうするのだろう??)。そもそも、特に何も起こっていないから通報しても来る訳がないし、パトロールを頻繁にするでもない(し切れない)から、何も期待できない。

そこで、とりあえず、できる自衛をすることにした。詳しくは書かないが、主に以下である。

  • ドアスコープの遮蔽の強化
    • ただ、外から外されるとのことなので、心配がある。 → 接着したいが、賃貸なので さすがにできない。
  • 居る時はドアガード(昔のチェーン)もする。
  • インターフォンをonにした。
    • 顔が撮影されるのが分かるから少しは抑止力になるのだろうか? 相手はプロなので、マスクしてたりして関係ない?
    • ただし、押し売り放送など(例: 保険、新聞)に対応するのは嫌なので、通常は音は消して、気付かないようにしておく。
    • あとで、スイッチで素早く音のon/offができるようにしたい。
      • パナのインターフォンの使い勝手(UI)は ひどく、基本的なことが スパっとできない・・・

あと、以前から知っては居たけど高を括っていた、空き巣の「マーキング」がないかチェックしたところ、大丈夫だった。が、今は技術が進んでいるので、スマフォなどに電子的に記録しているかも知れないから、安心はできない。(ただ、手元に証拠が残るのを嫌って しないのかも知れない。)

証拠という点では、先日の作業服は手ぶらだったが、下見だけで実働は別なのだろうか? あるいは、少ない道具を服の中にでも巧妙に隠していたのか? まあ、そこがプロなんだろう・・・

今回で連中は懲りて「ノック」に来なくなるのか また来るのか気になるが、おそらく来る気がする。同じ人・団体じゃない可能性があるし、「今度こそは」とか思って再挑戦するかも知れない。

なぜ ここに来るのか分からないが、辺りの目ぼしいところ・狙いやすい雰囲気のところを巡回でもしているのだろうか?

 

という訳で、「この辺りは田舎だから都会に比べて治安はいいだろう」と油断していたら、そうでもなくて がっかりした。まあ、平均値としては低いだろうが安心はできない。

実際、TVにも出るような事件が結構起こっている。

 

PS. 謎のノックの原因として、僕の出す音などが周りに迷惑を掛けていて、それで、気にしている人がたまにブチ切れて来るのかとも思って居た。が、それならまずは管理会社に連絡するだろうけど、そういうのは なかったので違うと思って居た。あと、ブチ切れたなら、もっとキツくノックするはずだ。

今回、僕が原因でないことが はっきりしたのは、ある意味で収穫だ。

それにしても、ノックの音だけでも いろいろ分かるものだ・・・

PS2. あと、なぜ、ここに来る前は こういうこと(下見)がなかったのか考えると、実は あったのかも知れない。ただ、勤めていたので本当に居なかったり、インターフォンを使っていた時は怪しい・鬱陶しい場合は即座に切った(ただし、押し売り放送にそれをすると、また来て面倒なことになる)ので、気付かなかったのではないか?

いずれにしても、下見されても(なぜか)被害に遭わなかったのは幸いだ。

  •  0
  •  0

例によって調子は良くないものの、結構前から久し振りにドライブに行きたかった。台風のため しばらく天気が悪かったが、近頃は良くなったので「そろそろか?」と思いつつもダラダラと延期していた。昨日の朝も、太腿が張っていたし、冷房で冷えたのか鼻が詰まり気味かつ頭の調子が今一つだし、腰も少し痛かったので延期と思って居たのだが、ゴミを出した時の外の空気が随分清涼だったので、つい行きたくなって行った。

急に決めたので準備が長引き、出発は9時頃になった。行き先は いつもの上三依だ。飽きるほど行っている割には飽きないのと、まだ暑いので涼しそうだから決めた。道は余り混んでおらず、概ね気持ち良く走れた。ただ、フロントガラスのIRカットフィルムの劣化が進んだために増えた凸凹と目の飛蚊症のため、少し前が見にくかった。フィルムは来年の車検前に剥がしてもらう予定だったが、早目にしたくなった。あと、いつものことだが、暑かったり寒かったりで頻繁にエアコンの調整をしていた。

10時頃、中間辺りの道の駅 しおや に着いた。外の風は涼しくて、気持ち良かった。また、天気が すごく良くて青空だった。

ただ、近頃ありがちなテーマソングみたいな歌が うるさい。音量は大きくないが、繰り返されると嫌になる。どうして、ああいう安直かつ無意味なことを、わざわざお金を掛けてするのかと思う。まあ、あれが好きな人も居るのかも知れないが・・・

それから、途中で気付いたが、意外にも1lのペットボトルは僕の車には合わない。どこにも ぴたっと収まらず、収拾が悪かった。例えば、写真のように入れたら、キャップの部分がエアコンのスイッチに当たってoffになってしまった。500mlまでを想定しているようだ。出掛けに思い付いて、水道水を空の1lのペットボトルに入れて持って行って分かった。

道の駅から出る時にナビを見たら、あと44kmと、意外にまだあるので ちょっと疲れた。

11:30頃、植物園の代わりに良く行って居る上三依塩原温泉口駅に着いた。トイレに行きたかったので、まず寄った。既に疲労と空腹に襲われていた。

途中、遅く走っていたつもりはないのに、ずっとアクアが着いて来て鬱陶しかった。煽りと みなされるほど近くはないが離れても居ないので、圧迫感があって気分が悪かった。きっと、ずっと追い越したかったのだろう。こっちは、疲れていたのと 少し前まで前に宅配のトラックが居て(信号待ちのあとで追い付くかと思ったら、どこかに消えた)「スピードは諦めた」状態を継続して居たので、そのアクアには遅かったのかも知れない。

あと、反対車線の車で、センターラインにすごく寄って走って時々フラフラ はみ出すプリウスなどが結構居て怖かった。左側に自信がないのか、高齢でハンドルが覚束ないのか、フラフラしている自覚がないのか。

駅には花は ほとんど咲いてなくコスモス程度だった。銀杏(実と紅葉)は あと少しという感じで、実が ちらほら落ちていた。

駅舎の脇に、いかにも昭和な「ポイ捨ては やめよう」の看板があった。今回初めて気付いたが、「藤原町」は今はないので、結構前からあるのだろうか。

いくらなんでも、今は さすがに人の居るところでオープンカーから缶(良く見ると昔のプルタブのようだ)を投げ捨てるような人は居ないので、やっぱり昭和時代のものなのか。

いつものように駅だけでも満足したし、植物園を歩いたら かなり疲れる気がしたが、しばらく行ってないので行ってみることにした。

駅からは近く、11:50頃着いた。駐車場は空いていた。ビフに似た変なオッサン(停めてから気付いた)のデロリアルトの横に停めた。日差しが強く、暑そうだった。駐車場から すぐの橋の欄干に赤トンボが居た。全般的に赤トンボや蝶が多かった。9月頃からオフシーズンのようで、料金は300円と安かった。

1万円札を出したら(近頃はキャッシュレスがメインなので、小銭や千円札が ほとんど増えない)、以前と同様にオーバーなリアクションで困られた。面倒だったが、財布を良く探したら あった。老眼で良く見えないうえに指が ちょっと突っ張るので、コインをつまむのも結構な手間なのだ。

さすがにオフシーズンで花は少ないが、空いて居るし、手短かに回れそうだから良かった。ホウセンカを随分久し振りに見た。子どもの頃以来かも知れない。確か、種のサヤ(?)を触ると はぜるのではなかったか。空が随分青く、空気が綺麗だった。

13時頃 周り終わった。帰る前に休んで居たら、出入口の手前で しびれを切らして待っていたらしいバアさんが、遅れて来たジイさんに「早くしろ」、「何も咲いてないじゃない」などと文句を言ってた。そんな歳になっても そういう口を利く人が居るとは・・・ そのジイさんが可哀想だったが、きっと長年のことで慣れているのだろう。※ でも、良く我慢できるよ。感心する。

※実際、そんなに言われても更にトイレに行っていた。

かなり疲れて すぐにでも食事したかったが、辺りに手頃な店は なさそうだった(例: 入ると休み、混む、狭い、馴染みの客が多くて浮く・うるさい、不味い、煙草)。いろいろ考えて、道の駅 湯西川に行くことにした。

13:20頃出て13:40頃着いた。意外に近くて正解だった。食堂は空いており、ダムカレーと迷ったが、久し振りに鴨せいろ蕎麦にした。千円。 → 残念ながら、今ひとつだった。蕎麦自体は悪くないが、具が寂しい。肉は1枚、あとは湯葉とキザミねぎ(輪切りでは なくて、ラーメンに入れるようなやつ)。つゆは随分しょっぱかった。

道の駅の建物の周囲には怪しい露店がいくつかあり、妙に安い"SEIKO"(本当に そう書いてあった)の腕時計(「限定2000円」とあった)のようなものがあった。その他の店もそうだが、一体、そういう怪しいものを買う人が居るのだろうか?※ 足湯があったが、面倒なのでパスした。

※今はAma.のC国の店に怪しいものが多いが、昔は こういう露店だったのだろうか?

疲れを増やさないため、帰りは今市から日光宇都宮道路を使った。ただ、今市IC(経路の西端、「日光」の左の角)までが結構遠いうえに、旧今市市街は信号で停まってばかりでイマイチだった。

帰路も馬鹿が多かった気がする(例: IC出口のゲートまで速く走って来てETCの通路で後ろから急かす奴、追い越してすぐ出口に入る奴)。更に、意外にも覆面に捕まって居る人が居た(日光宇都宮道路)。秋の交通安全週間には早い気がするが、ノルマとかか。ゆっくり目に走って良かった。

17時頃 無事に帰宅した。走ったのは約164kmだが、休憩が多かったとか帰りにスーパーに寄ったりしたせいか、8時間も経っていた。70枚くらい写真を撮った。部屋に入ったら妙に香水臭く感じたのだが、外に咲いている金木犀の匂いだろうか?

 

車は概ね調子良い。上述のフィルムの凸凹と、サス(ショックアブソーバー)が硬くて路面の凸凹で揺れが多目な程度か。エンジンは その気になればいくらでも回るような感じだ。当たりの個体なのかも知れない。かと言って、ゆっくり走っても気持ちいいからいい。

  •  0
  •  1

昨日、約一か月ぶりに通院した。前回は随分空いていて、これなら楽勝だと思ったが、今回は かなり混んでいた。どうやら、前回はお盆だったからのようだ。そのせいか、駐車場に入る時も出る時も変(僕にすれば迷惑)な車が居たが、まあ仕方ない。

診察の前に血液検査をしたが、今回も毎度のことながらCKが高い程度だった。

診察室に入ると、「動作が俊敏になった?」(「前回より良くなったかも?」の意味)と言われたが、自分ではその印象はない。少し遠いところに座って居た時に呼ばれて、急ぎ気味に行ったためだろうか。

前回は生検は しないことにしたのだが、その後、何だか分からない状態(悪ければ将来は車椅子かも)を続けるのが苦しくなって、とりあえず病名を確定させて、先のことを考えたり準備したくなり、生検を頼んだ。一種の脚の手術なので※1泊の入院が要るようだ。

※調べると、生検(大腿の筋生検)は筋肉を切る(筋肉には麻酔は掛けないようだ)ので いかにも怖いし痛そうだ。いくつか体験談もあり、ふくらはぎの方は全然痛くなかったと書かれているものの、大腿の方はすごく痛かったとのことなので、まあ痛そうだw

例によって病院のスケジュールは詰まって居るため、結構先になりそうだ。想像では11月頃かと思っていたが、来月に再度MRIを撮ってから決定するので、更に先の12月とか来年になるかも知れない。まあ、進行は速くないし、1泊でも入院は面倒なので、先でも構わない。

生検すれば病名が分かるか聞いたら「分かる」とは言って居たが、何となく、分からない場合も ありそうな雰囲気だった(空気の感じとか直感)。が、それでも何かしら分かるのではないかと思う。

今回の一番の収穫は、この症状・状態は運動不足によるものではないことが分かったことだ。その可能性を聞いたら、「まずない」※とのことだったので。 どうして そうなのかは分からないが、確かに、いくら運動不足でも、脚や手が張ったり動きにくい・力が出ない状態が何か月も続くことはなさそうだ。

※そういえば、最初に行った整形外科の療法士も そのように言っていたので、かなり確かそうだ。

それから、仮にCKが高いことと この症状が関係しているなら、約10年以上前(仕事をしていた頃)からCKは今と同じくらい高かった*ので、(現在の)運動不足は関係ないことになる。

*それ以前はCKは測っていなかったので、いつから高いかは不明。また、途中に測定していない期間があるので、当時の原因と今の原因が同じでない可能性はある。

 

通院とは別に、時々握力を測っているが、余り変わらない。近頃は力が入りやすい握り方が分かったが、それでも右: 15, 左: 11 kgf程度だ。「正しい」握り方では右: 9, 左: 8 kgf程度と、8月からほとんど変わっていない。

なお、55-59歳の男性の握力の平均は44.9 kgfとのことで、良く出ると思う。

だから、良くはなっていないが、悪くもなっていないのだろう。

あと、脚のトレーニングのために定期的にスクワットをしようと思って居たが、1回やっただけでひどく疲れたので おっくうになって、以後は していない。ペットボトルでの握力のトレーニングも、いつの間にか しなくなってしまった。そういうのを続けるのは昔から苦手だ。

 

PS. この病院は診察の前に自分で血圧を測るのだが、それが いつも(上は)150以上と高い。印字された紙を見た看護師さんが(驚いて?)「いつも」の値を聞くので、それに「133/90くらいです」と答える。が、いつも・どの方も「130くらいですね」と1の位を丸めてしまうので、微妙に もやもやするw まあ、血圧に期待される精度は そのくらい(5-10mmHg単位?)なのか。

ただ、そもそも、外で いつもそんなに高いのは大丈夫なのかという疑問があるが、医師も含めてどの方も そこには目を向けないという間抜けさも感じる。 (9/29 5:55)

  •  2
  •  0

以前作った換気扇の自動制御システムは、改良したいことを挙げればキリがないものの、ちゃんと使えている。: 通常時は間欠的に(今はon: 26分, off: 14分, on率: 65%)換気扇が回り、ガスコンロを使ったり作業をしたりしてCO2濃度が高くなった場合は低くなるまで連続で回る。

その後、ちょっと思い付いて、以下のように 動的(言ってみれば適応的)に換気扇の動作モードを変更する機能を追加してみた。

基本機能: 定常的にCO2濃度が高目の場合は換気扇のon率(回している時間)を増してCO2濃度の上昇を抑え、低目の場合は逆にon率を下げて余計な換気を抑えるようにする。

当初は「余計な換気を抑える」必要は ない気がしていたものの、外からの臭いを取り込む可能性をなるべく減らすためと、仕組み的に可能なので(= おもしろそうだから)入れてみた。 (こういう余計な思いつきが面倒を増やすのだ!www) だが、近頃、部屋の冷暖房効率の改善に繋げられそうなことに気付いた。

この機能は、今まで僕が手でやっていたこと(CO2濃度が普通でない場合、PCのリモコンアプリで換気扇のモードを切り替える)で、それを自動化する。

処理: 難しいものではなく、以下のようにした。

  1. CO2濃度の取得・チェック処理をする時に、以下を実行する。
  2. CO2濃度の長時間移動平均(→ LTMA_CO2)を求める。
    • 今は換気扇の間欠運転周期(今は全部40分)の2倍の時間(→ 80分)分を求めている。
      • この値は換気扇の運転周期の整数倍であることが望ましいので、その時に設定されている周期から計算している。
  3. LTMA_CO2に従って換気扇の動作モード(→ on率)を切り替える。
    • ただし、CO2濃度が高くて換気扇を連続で回している場合を除く。
    • LTMA_CO2のしきい値と動作モードの対応表を使っている。: 今は以下の設定にしている。
      • LTMA_CO2: on率, ()内は動作モード
      • <= 670ppm: 50% (LL)
      • <= 710ppm: 55% (L)
      • <= 750ppm: 65% (M)
      • > 750ppm: 70% (H)

現状の制限として、PCで制御しているため、外出時や寝る時などにPCを停めると その時点の設定で固定されるので、不要に高いon率が続くことや、低いon率が続いて就寝中にCO2濃度が高まってしまう可能性がある。そのため、余り大胆なon率は設定できない。

これについては、PCを停める(スリープ、停止)前に通常のon率のモード(上の"M")に戻すとか、ラズベリーパイのようなマイコンに移植して常時制御すれば対応できるが、まあ、そこまでこだわることではないので、このままで良しとしている。

ちゃんと動いているものの、「換気が最適化されているなあ」などという体感は ないし、グラフを見ても特段の変化は見えない(効果が ない訳では ないだろうが・・・)。なお、グラフが右肩下がりなのは、近頃は なぜかCO2濃度が低目になっている※ためだろう。

※原因は分からないが、暑い時は身体の代謝が増えて排出するCO2濃度が増えていたのが涼しくなって減ったためか、外気の濃度変化のためかと想像している(そういうことがあるか不明 ← 少し調べたところでは(下を参照)、逆のようだ・・・)。

身体の代謝は主に体温維持のためだそうで、夏に減り冬に増えるようだ。 (→ 参照)

ただ、個人的な経験からの想像だが、身体に(特に夏の熱い)日ざしや外からの輻射熱が当たって暑くなると、身体の活度のようなものが増して代謝が増すのではないかと思う。その証拠に汗をかく。それは作業で汗をかく時と同様で、代謝が増しているのではないか?

また、外気のCO2濃度については、概ね、光合成の活発化する夏に減り、冬に増えるようだ。 (→ 参照) ただ、参照ページを良く読むと(例: 図3)、堂平山では2-7月に高く、9月頃に最小になっているのには合っていそうだ。

もし代謝も外気も関係ないとすると、センサの温度補正が うまく行っていないことが考えられるが、今、天気が良くて室温が高い(約28℃)にも関わらずCO2濃度は低い(約670ppm)ので、温度補正は大丈夫そうだ。

あとは、付近の道路の通行量(あるいは渋滞頻度)が減ったとか、工事が下火になった関係だろうか?

近頃の部屋のCO2濃度(緑): 日, 週, 月, 年 (左上→右下), 水色は室温に比例した値; 9/1(week 35)頃から動的に換気扇の動作モードを変えている。

ただ、この機能でon率が低くなっていることがあるにも関わらず、特段 通常時のCO2濃度が高目になっていないのは、CO2濃度が高目になった時にon率を上げているため(→ うまく行っている)だと推測する。また、動作モードを見ていると(グラフがあれば分かりやすそうだが ない)、近頃はon率の低いLになることが多いので、長期(季節?)的なCO2濃度の変化に追従できていることも推測できる。

それで、今後更にCO2濃度が低くなるかも知れないので(期待して)、今朝 LLのモードを追加した。

  •  1
  •  0

先日ちょっと書いた、ブログにボットが良く来る件でアクセスログを見ていたら、不正ログイン試行や悪質なアクセス※が結構多くて気になってしまった。

※例: シェルのコマンドを実行しようとするもの、大量のバイナリデータを送って来るもの。

以前にも何度か、目に付いた時に そのアクセス元近辺のIPアドレスをブロックするように設定したのだが、設定するスクリプトを変更するのは面倒だし失敗する可能性があるので、ブラックリストのファイルにIPアドレスを書いて、適宜追加できるようにしてみた。動作確認した時は うまく動いたのだが、たまたま翌日にカーネルの更新で再起動になった あとは繋がらなくなってしまった・・・

それでサーバ(VPS)のコンソールで調べたら、起動はしているもののNWが全然使えない状態になっていた。: ホスト名の検索(DNS)は駄目だし、プロバイダのDNSサーバにすらpingが通らなかった。

ログを調べると、networkd-dispatcherが"Unknown state for interface NetworkctlListState"という訳の分からないエラーを出していた。更新されたカーネルの問題・相性を疑っていたのだが、検索しても ほとんど出て来ないので、僕の環境の問題だと思った。

結局、(上のエラーの前に出ていたのだが、)systemd-networkdが起動しなくなっていたためにNWが使えなくなっていた。その原因は、上に書いたブラックリストのために追加した処理にバグがあり、必須のNWアクセスも遮断するようになっていたためだった。

そのバグというのが しょうもなくて、たった一個の余計な空白(下の $var のあと)が原因だった。シェルスクリプトに

if [ -n "$var " ]; then

のように書いてしまったのを気付かなかった(近眼+老眼+白内障(進行中)のコンボに加え、そもそも眼が不調だ)。$varが空の場合に以降を実行するのに、これでは 全く実行されない。その処理が重要で、実行されないとNWが全部遮断されてしまうのだ。。。

そもそも、空かどうか調べるのに"$var"のように " で挟んで書くのが良くなく(しかも面倒)、もっと間違い にくい書き方がある気はするが、今まで見たことがない。少し考えたい。

そこを直してサーバは回復し、ファイルに入れたブラックリストも ちゃんと動いた。

 

そして更にもう一個、隠れた問題が見付かった。Linuxの仕様なのか、NW-IFを有効にする前のスクリプト(/etc/network/if-pre-up.d/*)が何度も実行されるのだ。僕は そこに上述の悪質アドレスのブロックを設定するスクリプトを入れたのだが、今回初めて、それが何度(4回)も実行されていることに気付いた。

内訳は、実際のNW-IFに対するIPv4, IPv6が各1回、全体に対するもの?(IFACE="--all")、loopback(IFACE="lo")だった。

もちろん使う前に調べれば分かる・調べるべきことだが、余りにも おかしな・杜撰な仕様だ。今まで問題なかったので、スクリプトは何度実行されても問題ないようだが、念のため、一度だけ実行されるように修正した。

スクリプトに渡される環境変数のMETHODが"none", IFACEが"--all"の時だけ実行するようにした。ただ、これはどういう契機なのか分からず、将来は なくなるかも知れないので、実行されなかったら警告が出るようにした。

 

起きてから延々と作業して午後遅くまで掛かったが、そもそも、こんなIPアドレスのブラックリストなんて意味ないことに気付いた。

まず、不正・悪質なアクセスをするサイト(のIPアドレス)は無限にある。※ 良いブラックリストを手軽に入手できないかと検索したら、山のようにブラックリストが出て来たが、それらの いくつかと僕のブラックリストに共通のアドレスはなかった。

※今はまだIPv4がメインだが、v6なら本当に無限だ。それに、v6のアドレスは(プライバシー処理のため)基本的に「日替わり」だから、アクセス時のアドレスに永続性・再現性はない・・・

仮に 良いブラックリストを合わせて使うにしても、無限に多くのアドレスでフィルタリングできる訳はなく、段々重くなり、最後は破綻するだろう。

そして、悪質サイトはブラックリストに載ったらアドレスを変えるだろう。載らなくても随時変えるのではないか?※ 実際、以前アクセスして来たアドレスは、(ログを見る限り、)何度か失敗したあとはアクセスして来ない。それに対応するために余分な幅(例: v4なら256-65536個?、v6なら264個??)を持たせてブロックするとしたら、そのプロバイダの他の人までアクセスできなくなる。

※日本ではそうだが、固定IPアドレスの人が少ないこともありそうだ。そもそも固定にする意味がない。更に、上述のようにv6は基本的に固定でない。

そうやっているうちに、誰もアクセスできなくなりそうだ。

だから、IPアドレスでブロックする仕組みを作りは したし、定期的に不正・悪質なアクセスを調べようと思っては いるが、無意味だと思う。どこかで見たが、リアルタイムに挙動で判定するのが良さそうだ。それがWAFなのだろう。

手軽に使えるものがあるか、気になるところだ。

(23:30) 少し探したら、手軽(無料・簡単)なWAFは なさそうだが、無料のものは いくつか見付かった(例: NAXSI, ModSecurity)。

が、インストールや設定は容易では なさそうなので今後の課題とし、まずは現状の脆弱性などの問題をチェックしようとした。: Nikto2というツールとオンラインのスキャナ(例: InnuniWeb, Mozilla Observatory (HTTP), SSLTrust Free Website Safety & Security Check, WordPress Security Scan)を使った。その結果、軽微な問題は見付かったものの、概ね大丈夫そうだった。

ただ、脆弱性に関して余りチェックをしないもの(HTTPヘッダ辺りが中心の感じ → クライアントに被害を及ぼさないかがメイン?)が多かったので、もっとサーバにキツそうなもの(例: w3af, OWASPのいろいろなツール)でチェックする必要がある。

とりあえず、チェックで見付かったHTTPヘッダ周りの問題を修正した(できないものもあった)。

  • WebサーバとWPのセキュリティプラグインAll In One WP Securityが同じヘッダ(X-Frame-Options: SAMEORIGIN)を出していたため、設定値がおかしい(重複している)という警告が出たので、プラグイン側(Misc. → Frames → Enable iFrame Protection)を解除した。
    • 最初は どうして重複するのか分からず、苦労した。
  • (サーバ・OS依存のようだが、)ETagはリスクがあるとのことなので削除した。
  • httpsでのgzip圧縮にはリスクがある(BREACH攻撃)とのことだが、問題の起こらないタイプだけに制限しているので問題ない。
  • 一番の問題は、Content Security Policy(CSP)に対応していないことだ。: ページの修正が要りそうなので、容易には対応できない。

その他に、TLSの問題・互換性をチェックするものもあったので(例: Observatory (TLS), TLS Checklist inspector)、チェックして修正した。

  • 今はTLS 1.3に移行しつつあるようなので、(obsoleteらしい)1.1を止めて1.2と1.3に対応させた。
    • AEADというものに対応していなかったので、対応させた。
    • 1.3に対応させる時、Mozillaの、サーバの設定例を作るページが役に立った。
      • が、その設定と他のチェックが競合・矛盾する場合があって、(細かい問題ではあるが、)どうするか悩ましい。

あと、SQLインジェクションについても いくつかツールが見付かった(例: sqlmap, jSQL Injection)ものの、そもそもSQLインジェクションを良く理解していないので、正しくチェックできる方法を考える必要がある。

良く考えると、(考えなくても、)SQLインジェクションどころか、サーバのセキュリティ向上は2年以上前からTODOに入っており、今回も少ししたら忘れた振りをして放置する気がする・・・

 

PS. 全くの脇道だが、HTTPヘッダ関連を修正している時、Mozillaの設定サンプルにHTTP/2の設定もあって、調べたらサーバは対応しているので(もちろん、パフォーマンスが劇的に向上するなんて期待は しておらず、興味本位で)ちょっと試したくなった。

が、この「ちょっと」が いつもトラブルを招くのだ・・・w (9/24 8:31)

(9/24 14:39) やっぱり、ちょっとHTTP/2にしてみたw 今度は大きな問題は起こらず、webサーバの設定にHTTP/2を追加しただけで すんなり動いた。ただ、予想どおり、HTTP/2にしても速くならないどころか、わずかに遅くなった(例: このブログは約3%(約11ms)遅くなった)。ページの生成は並列に できないので、基本的には仕方ない。とりあえず試したかったのと、世の中の流れに追従するのが目的なので、まあいい。

このサーバをHTTP/2に対応させた。: Vivaldiの開発者ツールでプロトコル(中央辺りの"Protocol")がHTTP/2を示す"h2"と出ている(最後の"http/1.1"は外部サーバのもの)。

HTTP/2にしても速くない(遅い)原因を考えてみたら、当たり前の気がする。: そもそもHTTP/1.1では複数の接続で同時に転送していたのを、わざわざ1本(想像)にまとめて その中で多重化しているのだから、スケジューリング・多重化・非多重化処理が増えて遅くなりこそすれ速くなる訳がない。

HTTP/1.1の複数の接続では両端の機器や経路へのリソース的な負荷が重くなるが、それが問題なければ、1本にまとめるより ずっと効率が良いと思う。

あと、ヘッダをバイナリにするとデータ量は減るだろうが、元々ものすごく大きいものではないし、エンコード・デコードの処理が増えるから やっぱり少し遅くなるだろうし、ボディ(本体)は もともとバイナリ可なので、何も変わらない。

結局、接続を減らして処理が多くなるのに速くなるという理屈が不思議だ。HTTP/2はリソース面でエコだとは思うが、速度は期待できない。

不思議なのは、JoplinのデスクトップアプリがHTTP/2を使わない(なぜかモバイルアプリは使う)ことで、最新版に更新しても同じだった。良く分からないが、Joplinには構わないことにしているので良い。

他のアプリでは、PC(Linux)ではEvolutionは1.1だったが、意外にもSeamonkeyは2だった。Thuderbirdの新しいコードを取り込んでいるのか。スマフォ(Android)ではDAVx5は2だった。

作業に付随して起こった ちょっとした問題(これで疲れた)は、CLI版を更新したら なぜか起動しなくなり(以前もそうだったので、頭に来て更新しないことにした気がする)、ちょっと調べたらnodeのモジュール@aws-sdk/middleware-endpoint※が不足していたので、自分でダウンロードして追加したら動いた。

※パス: ~/.joplin-bin/lib/node_modules/joplin/node_modules/@aws-sdk/middleware-endpoint

構成ファイルが駄目なのか、nodeのバージョンの関係か。誰も指摘しないのが不思議だが、Joplinには構わないことにしているので、ここまでとした。

(9/24 18:12) 下のPS2にも書いたが、正直言ってHTTP/2はイマイチなので(実際、すぐにHTTP/3が出た)、対応したばかりだが止めた。処理が複雑な割に効果がないし、余計な機能はバグなどを生んでセキュリティ上のリスクになるから、ないほうがいい。

PS2. ようやくHTTP/2に追い付いたと思ったら、HTTP/3が出て居た。開発者ツールでGoogleのサイトを見ていたら"h3"というのがあって気付いた。今度はQUIC/UDPベースだそうで、応答は速そうだ。となると、結局HTTP/2はイマイチだったようだwww でも、HTTP/3も目論見ほど いいのか疑問はある。 (9/24 17:31)

  •  0
  •  0

先月くらいから左眼が少し調子悪くなった。外に出たりして明るい光を受けたあとに、左下に もやつくような違和感が出る。あと、暗いところで時々白い光が見える。後者は網膜剥離になった時の症状なので、再発したかと心配になったのだが、いつもの眼科の医師は(以前にも書いたように)ひどいので、だらだら延ばして居たものの、背に腹は かえられず、行った。

以前と全く同じ ひどい態度だった。

一通り診たあと、「前回より少し白内障が進んでいる」、「いいです」(= 診察終わり。出ていけ)だけだった。前回と同じ態度だった。※ もやもやの原因や どうすればいいかなどは何も説明してくれなかった。白内障のために もやもやするのか、それ以外なのか全く分からない。

※前回は混んでいたせいで説明などを省いたのかと思ったが、今回は空いていたので、とにかく常に患者対応が嫌いとか面倒なのだろう。

さすがにそれでは何も分からないので、特に問題ないということか聞いたら、「視力は それほど落ちてないから、まだ手術は要らない」とか言った。全然回答になってない。本人としては、白内障のために もやもやすると言ったつもりだったのだろうか?

網膜剥離が再発していないかも不安だが、さすがにそういう兆候があれば放置しないだろうけど、散瞳せず軽く診ただけなので見落としがあるかも知れないと、不安にさせる。

だから、以前は、白内障の手術をするなら近いほうがいいから あそこかと思って居たが、絶対に嫌になった。腕はともかく、その前後に碌なケアをされないことが分かり切っているからだ。検診も もう嫌だ。

とりあえずは様子を見るが、悪化したり心配が昂じるなら、遠いし多少不満はあるけど あそこよりは まともな眼科(これも以前書いた)に行きたい。

 

それにしても、病院・医院は こういう医師ばかりで嫌になる。※ 思い出すだけで、この眼科、手脚の不調で行った整形外科、そのあとの神経内科(それほど ひどくない)、歯科(近頃不満が出て来た)、皮膚科(2院。一つは腕も悪い)、嫌になって行くのを止めた内科と数多い。

※一方、看護師や技師や受付などのスタッフの方で ここまで酷い人は ほとんど見たことがないから、感心するし助かる面はある。が、その落差が結構痛いことも多い。例えば、診察前に看護師さんに仔細に症状を話しても医師には伝わらないとか・・・

↑ 伝わらないのは医師が悪いことがほとんどだが、たまに伝えないスタッフなどが居てムカつく。

なぜ そんなに多くのところで嫌になるか考えてみたら、普通の店などと違い、こっちは病気かも知れず不安で行くのに、ちゃんと説明なりケアしてくれなかったら、不安が解消されるどころか増大するからだ。

それを考えると、既にあるのか ないのか分からないが、医学部ではコミュニケーションの授業にも力を入れて欲しいものだ。国家試験にも、そういう力を測る面接を導入して欲しい。全く重要だ。

とは言え、最初は能力不足が原因かと思ったものの、怠慢とか面倒とか馴れとか疲れでテキトーな対応しかしない輩も居るだろうから、口コミとかで指摘したり、それを参考にするしかないのか。 (かといって、口コミや点数は どこもひどくて、参考にならないことも多い。)

  •  0
  •  0

先日書いたが、このブログで使っているセキュリティプラグインAll In One WP Security(以下、All-in-one)の更新に伴う不具合らしきもののために管理画面にログインできなくなって、慌てた。その後調べたら、似たような問題が起こっている方が結構居て(→ )、やっぱりAll-in-oneに問題がある可能性が高く、別の もっといい(まともな)ものに換えたくなって居た。

必要な機能をリストアップしたものの、探したり試すのが面倒で放置して居た。が、昨日、ちょっとやる気が出たので試してみたら、元のものより良いものは ないうえに、プラグインには関係のない問題(REST APIが動かない)も見付かり(最後に書く)、そこでも苦労して いつものように「骨折り損の くたびれ儲け」となり、疲れた。

結局、(僕には だろうが、)All-in-oneが一番良かった。確かに どうしようもない問題が起こって信頼度や安心感は落ちたが、バージョンが大きく上がって、(人も替わって?)「たまたま」充分な動作確認ができないまま出しちゃったんだろうと想像・期待する。

まあ、某 窓に比べれば可愛いものかも知れないねw

でも、もしまた同じようなことがあったら使い続けるかは分からない。とは言え、今回の比較で、現状では いいものがないことが分かった(そもそも、All-in-oneにした時も そうだった!)ので、どうしようもないが・・・

それに、もしログインできないとかの誤動作が起こっても、緊急的にプラグインを解除して復旧させる方法が分かったので、それくらいなら大丈夫だw

 

以下、条件、候補・試したものと評価・感想を書く。

要求条件 (ALl-in-oneで使っている主な機能を重要な順に)

  • ログインページURLの変更
  • XML-RPCのブロック
    • 忘れて居たが、webサーバでブロックしているので実際には なくても良かった。
  • 非ログイン状態でのREST APIのブロック
  • 連続スパムでIPアドレスをブロック
  • ユーザーリストの禁止
  • 繰り返しのログイン失敗でIPアドレスをブロック
  • 特定ユーザー名(adminなど)でのログイン試行でIPアドレスをブロック

試さなかったもの (予選落ち)

  • Jetpack – WP Security, Backup, Speed, & Growth: 高速化がメインのようだし、関係ないものが詰め込まれているので止めた。
    • 以前、高速化で試したが、うまく動かなかったこともある。

試したもの (概ね試した順に)

  • SiteGround Security
    • 使用データの収集を許可しないと、それを促すメッセージが出続けるので止めた。
    • また、REST APIが動いて居ないというエラーも出続けた。 → あとでWP自体(またはサーバ設定)に問題があることが分かり、対処した。
  • Security & Malware scan by CleanTalk
    • 使うにはAPIキーが要る(自動的に取得できる)。
    • しばらく使うまで気付かなかったが、そのキーは有料サービス(クラウドの「ダッシュボード」, 確かUSD 6/年)の試用用(2週間しか有効でない)で、そのあともプラグイン自体は使えるが、機能としては今一つになること(例: ログが最新のものしか見られなくなる)や、最初に有料サービスであることが明示されなかったので騙された気分がしたので止めた。
    • ただ、クラウドも含めた機能としては悪くなかった。
  • iThemes Security
    • 多くのレビューのとおりで、設定画面が変(デモ版みたいな感じで、細かい設定がない)で、ちゃんと動く気がしなかったので止めた。
      • これを ちゃんと使える人は居るのだろうか??
  • Wordfence Security
    • ログインページのURLが変えられないので止めた。
      • 確かに、インストール前に見た説明にも書いてなかった。
      • 随分有名なようだが、こういう基本的なことができないのは不思議だ。
  • Hide My WP Ghost
    • ログインページのURLを変えるにはwebサーバの設定変更が要るようなことが表示されたので、止めた。
      • あと、変更先のURLが変えられない感じだった。
  • Anti-Malware Security and Brute-Force Firewall
    • 有料版でないと機能が貧弱なので止めた。
  • WPS Hide Login
    • 名前のとおり、単体ではログインページのURLを変えるだけしかできないので、面倒で止めた。
  • Defender Security
    • XML-RPCとREST APIのブロック機能がないので止めた。
    • 他の機能的は悪くなかったものの、無料版はいろいろ惜しい一方で、有料版は かなり高い(USD 7.5/月)。
    • アメコミ的な絵(スーパーマンとかMr. インクレディブル風)は好みが分かれるw、というか要らない。

最後に残った候補 (決断する ちょっと前に良さそうだと思った順に)

  1. Security & Malware scan by CleanTalk
  2. All In One WP Security
  3. Defender Security

ひとまずCleanTalkを試すことにしたのだが、良く考えてみると、機能面ではCleanTalkが断然いいということはなく、総合的にはAll-in-oneのほうが良さそうだと気付き、(耐え難いものを耐えて)All-in-oneに戻った。

そして、最後の判断材料とした2つの比較を示す。

  • All-in-one
    • 長所
      • 必要な一通りの機能が揃っている。
        • 実際には ものすごく多くの機能がある。
      • 設定が細かくできる。
      • スパムコメントのブロックもできる。
      • 本当に無料で使える。
        • 有料版も あるはずだが、無料版で物足りないと思ったことがない。
    • 短所
      • WebサーバがApacheでないと使えない機能が結構ある。
      • マルウェアのスキャンは ない。
      • 近頃の信頼性(主に開発体制的なもの)に不安がある。
  • CleanTalk
    • 長所
      • ファイアウォールにSQLインジェクションのチェック機能がある。
        • これだけは欲しい。別のもので できないかと思う。
      • マルウェアのスキャンが ある。(ただ、インストールされたあと(= 既に実行されたかもしれない)にスキャンするので、ほとんど意味がない。)
      • ボットのブロックができる。(本当に悪意のあるボットは正直にUAを出す訳がないから、あまり意味がない。単なる気休め。)※
        • あとで気付いたが、この機能はAll-in-oneにもある。
    • 短所
      • 「無料詐欺」的。
      • いろいろな通知メールが鬱陶しい。(設定が なくて停められない)

※興味があって、先月の このサーバへのアクセス中のボットかららしきもの(要求ヘッダに"bot"か"crawl"が入っているもの)を調べたら、2割未満だった。少なくはないが、中には悪性でない(とされる)もの(例: Google)も多いだろうから、ムキになってブロックするほどでもないと感じた。

 

最後に、頭に少し書いたREST APIの問題について。

SiteGroundでREST APIがエラーになったのが気になって調べた。: セキュリティプラグインのREST APIのブロックを解除してもエラーになった。最初はwebサーバの設定が悪いのかと思って試行錯誤したが、そうではなく、WordPressの既知の問題のようだった。

どういうことかというと、WordPressは ある時勝手にREST APIを追加したが(そもそも、これが何のためかも分からないし、普通に動かしているとセキュリティ上の問題になるのがおかしい)、普通の設定だと使えないことが多いのだ。

そのため、ちゃんと動かないので、特別ブロック・対処していないサイトでも 瓢箪から駒的に安全になっている・・・

そういう点ではWPは大変良くない感じで脱却したい気はするが、プラグインどころの騒ぎじゃないし、いろいろ手を加えて便利に使って居るので簡単ではない。

動かないのはセキュリティ面でいいものの、意図せず(何かの問題で)動かないのは気に入らないので、調べて動くようにした。結局、以下のいずれかをすればいいようだったが、このサーバでは最後のものしかうまく行かなかった。

  • WPのパーマリンク設定をpost nameにする。 (→ 参照)
  • REST APIのURL: /wp-json/*を/index.php/wp-json/*に換える。 (→ 参照)
    • /index.php?wp-json/* という情報もあった。
    • Webサーバなどの設定で行う。
  • REST APIのURL: /wp-json/*を/?rest_route=/*に換える。 (→ 参照1 → 参照2)
    • Webサーバなどの設定で行う。

それで、Webサーバの設定を変えるのは大ごと(いつも苦労している)なので、手軽に、WPのURL書き換えプラグインRewrite※にルールを追加して対処した。以下のようにした。

最後に追加:

    • Pattern(元): wp-json(/.*)$
    • Match(書き換え後): rest_route=$matches[1]
    • 動作: 元のURLの"wp-json"以降("/"も含む)を"rest_route="のあとに付ける。
      • 上のページでは、書き換え後には/?が先頭にあるが、なくても動作した。おそらく、ここに来る前に付いている(相当な)のだろう。

※このRewriteは便利なのだが、WPの元々のルールに場当たり的に追加して来ているので、なくてもいいものや良くない動きをしているものがありそうだし、何かあったら回復できないので、なかなか爆弾的なものだ。

まあ、そもそも「これ、何に使ってんの?」、「何か いいこと あるん??」って聞きたいくらいだから、直しても何もいいことはないが、(いつものように)気分の問題で直した。

 

まあ、これで一個でもTODOが消化できたのは良かった。しかも、気付いていなかった問題も直せた。

終わってみると、全部、(ちょっと我慢すれば)やらなくても良かったことのような気がしないでもないが・・・w

 

PS. 全く関係ない話。ブラームスを茶化したツイートがあった。: もし彼が今生きていてSNSでメッセージを送ったら、受け取った相手が「あなただけ なんでそんなに長いのよ」と嘆く場面で笑った。彼は何か 言い訳してた気がするが覚えてない。: ブラームス(の曲)は好きじゃないが、僕も同じ類だwww

  •  0
  •  0

(他にも書きたいことはあるが、眠いので軽く。)

近頃、ちょっとしたことが いつの間にか良くなっていた、あるいは、わずかな手間で良くなった。

一番はVivaldi(Linux版)+日本語入力(Fcitx+Mozc)とツイッターの相性問題で、以前は日本語が まともに入らなかった※のが、ちゃんと入れられるようになった。ただ、元々他のサイトでは起こっていなかったので、ツイッター側の問題だったのかも知れない。

※入れている途中で消えたり、文字が抜けたり、消した文字が残って居たり・・・

少し前は、DM(チャット)は まだ今一つな感じもしたが、今は大丈夫かも知れない。

何だか分からないが、とりあえず直って良かった。

次もVivaldiとツイッターだが、ツイート中のビデオの再生開始直後と終わってから少しの間、ブラウザが動かなくなっていたのが解消できた。これは何かが直った訳でなくVivaldiの設定の問題だった(Tabs→"Mute Tab Audio"を"Prioritize Active Tab"から"All Tabs"にした)。本当は元の設定が いいが、無理なものは仕方ない。

最後は、このブログで使っているWordPressが、いつの間にか画像のlazy loading(遅延読み込み)をサポートしていたことだ。僕は、結構前にそのためのプラグイン(Lazy Load - Optimize Images)を入れていたのだが、挙動が ちょっと気に入らなかった(画像の出方が もったいぶっている、それで遅く感じる)ので、早速無効にした。

WPのlazy loadingは そうなっているのが全然分からないので、本当に働いているのか疑って開発者ツールで調べたら、ちゃんとページのスクロールに合わせて画像のアクセスが起こって居たからOKだ。 (→ 画像: 上半分あるいは下の右半分の右側にポツポツとある点のところで、画像を遅延読み込みしている。) きっと、画像が表示される直前に読むのだろう。賢い。某プラグインのように、画像が出てから変に凝ってフェードさせて出すなんて愚の骨頂だ。

WPのlazy loadingでのネットワークアクセス (Vivaldiの開発者ツール)

  •  0
  •  1

最初に断ると、正確には「(Linuxなどの)疑似乱数生成器(PRNG)の一様性の問題」だ。乱数自体の話は いろいろあるだろうけど、それではない。

前の稿に書いたように、乱数で画像の表示順序をランダムにしようとしたら、全然一様でなくて、偏りが大きくて  ばっさり棄てた。頻度の最多と最少の比が2以上もあるのでは、全く使えない。 (実験結果を最後に書く)

単に試行回数が少ないせいなのかと思ったが、階級(分類)数約30に対して1000回実施しても偏りは解消しなかった(約1.8)ので、永久に解消しないように思う。

ある掲示板で見たのだが、僕と類似の質問に対して、統計あるいは数学のプロらしき人が、「そんな試行回数じゃ全然足りない。文句を言う前に統計を勉強しろ」みたいな偉そうなことを書いていた。そういう連中は10万回とかが最低レベルで、基本は「無限の回数」なのだろうが、そんな前提では全く実用にならない!

そもそも、一様な乱数なら、なぜ試行開始から しばらく または ずっと 偏りが生ずるのだろうか? 階級数は少ない(= 狭い)ので偏る理由がない。確かに確率論的には ばらつくこともあり得るが、階級の数より充分大きい(例: 30倍)回数でも依然として偏ったままなのはおかしい。確率論での「充分大きい」は1000倍とか1万倍なのだろうか?

不思議なのは、それを使っているであろう多くのアプリケーションが問題ないことだ。僕の使い方が悪いのか、偶然問題が起こらないのか、そういうものなのか、実際には問題があるけど隠れているのかのどれかは分からない。

 

以下、細かい話である。

上に書いた、乱数のバラつき(階級数29の場合、最多と最少頻度の比が大きい)が気になったので、Linux、特にPHPで使える乱数機能を いろいろ試してみた。

なお、試行回数は階級数(29)の20倍の580回とした。また、頻度の集計には、Stack overflowの"How to generate a random number from a uniform distribution in php?"の回答1に書かれていたものを使った。

以下に、試した方法ごとの最多と最少頻度の比を示す。なお、実行するたびに比は変動するので、2回実施した。

1回目

  • PHP: rand: 5.6※
  • PHP: mt_rand:2.7※
  • PHP: random_int: 2.4
  • PHP: statsパッケージのstats_rand_gen_iuniform: 2.8
  • /dev/urandom (4バイト読み出し): 4.7 (処理に誤りがあったので取り消し。やり直した値はPSを参照のこと。)
  • opensslコマンド(openssl rand 4)*: 3.0 (処理に誤りがあったので取り消し。やり直した値はPSを参照のこと。)
  • shufコマンド(shuf -rn 1 -i 0-MAX): 2.5
  • Python: numpy.random.uniform*: 6.7
  • rand+僕の改良案2@: 2.3

2回目

  • PHP: rand: 2.6
  • PHP: mt_rand: 2.6
  • PHP: random_int: 2.7
  • PHP: statsパッケージのstats_rand_gen_iuniform: 2.8
  • /dev/urandom: 3.1 (処理に誤りがあったので取り消し。やり直した値はPSを参照のこと。)
  • opensslコマンド: rand: 2.8 (処理に誤りがあったので取り消し。やり直した値はPSを参照のこと。)
  • shufコマンド: 2.6
  • Python: numpy.random.uniform: 4
  • rand+僕の改良案2: 4.1

メモ

  • ※ ドキュメントではrandとmt_randは同じものなので、差が出るのはおかしい。mt_randをrandのあとに実行した関係があるのだろうか。実際、2回目はrandとmt_randの比は近かった。
  • * Pythonのnumpy.random.uniformは/dev/randomを使っているのか、随分時間が掛かった。opensslのrandも遅かった。
  • @ randの出す値の密度や間隔と実際の値域のそれが異なることが悪いのかと思い、階級数より充分大きな範囲の乱数から縮小するようにしてみた。要するに、浮動小数点の乱数(0〜1)を任意の範囲の整数にする手順にしてみた。また、結果の整数の乱数を出すのに、以下の2とおりを試した。
    • 案1: mod(剰余)
    • 案2: 除算

 

結局、比較的少ない試行回数ではPHPのrandom_intとshufコマンドが一番一様そう(2.6付近)で、その次はstats_rand_gen_iuniform(2.8)となった。stats_rand_gen_iuniformは安定しているところが良さそうだ。

randやmt_randは悪くないが、変動が大きそうだ。opensslのrandは良くはないが、比較的安定している。なお、Pythonのnumpy.random.uniformや/dev/urandomは今一つだった(後者は使い方が悪いのかも知れない → opensslとともに整数化の処理に誤りがあったので値を取り消した。: 9/15 10:26)。

(9/15 9:03) numpy.random.uniformについては、参考にしたページにある分布のグラフは ほぼ平坦で、これなら許せる(と期待して試した)。その試行回数は10000回(個)なので、階級数(そこでは10)の1000倍くらい試行しないと一様にならないのかも知れない。この、どれだけ繰り返せば充分かというのは、どうすれば分かるのだろうか? また、本質的に そうできない用途では どうするのだろうか?

(9/15 9:12) と書いたあとにグラフを良く見たら、上の例で生成している乱数(グラフの横軸)は整数でなく浮動小数点数だった! 僕は整数に丸めて評価したので、その辺りに問題があるのかも知れない。丸めについては僕も気になっていて、上述の改善案で試行錯誤したけどうまく行かなかった。

グラフを目で見た時と同様に、積分して整数にすればうまく行くだろうか? 面倒なことだ・・・ ← 丸めるのは積分(個数を求める場合)でなく単なる整数化(例: 四捨五入)で良いから、問題なかったはず。

いずれにしても、僕にはまったく許容できない偏りである。

そういう問題または仕様あるいは注意事項があるなら、ドキュメントに書くべきだと思うが、まったく見たことがない。せいぜい"cryptographically secure"かどうかだけだ。

僕に言わせれば、こんなに偏るものがsecureとは思えない。まあ、見るところが違うのだろうけど。

 

(9/16 13:59) 元々の用途(このブログの「時替わりギャラリー」)に対する うまい対処方法(workaround)を思い付いた。: 画像を替えるのに乱数(PHPのrand)を使うが、それで次に表示する画像の番号を直接決めるのでなく、乱数と現在の画像の番号を加えたもの(と画像数の剰余(mod))を次の画像の番号にするのだ。現在の画像番号をn、全画像数をNとすると、次の画像番号n'は以下の式で得られる。

n'= (n + rand(1, N-2)) % N

rand: 整数の乱数: 引数: 最小値, 最大値
%: 剰余

これなら、仮に乱数に出やすい値xがあっても、今の画像からx枚目の画像が出やすくなるだけで、いつも同じ数種類の値(しかも、それらが画像数と「いい関係」にある)が出るのでない限り、特定の画像が出やすくなることは起こりにくいと考えられる。

が、実は そうでもないというオチはないか?: 少なくともrandは今の画像の番号は分からないので、特定の画像が出やすくなるような値は出せないはずだ。あるとすれば、周期的に同じような値が出ること(上の「いい関係」)だろうか? 考えると難しい(面倒だ)。

(9/17 16:28) ところが、そうは問屋が卸さなかった。表示される画像をチェックしていたら、やっぱり良く出るものがあった。想像だが、上のように乱数に何かを加えたものも元の乱数と同じ性質であり、その元の乱数に良く出る値があるなら良く出るスキップ数となり、そのスキップ数と全画像数の関係(割り切れるか)にも よるだろうが、結局同じ画像が良く出るのではないだろうか。

結局、ギャラリー内の画像の順序のとおりに表示するように戻した。

(9/18 12:22) その後、擬似的な乱数としてページのアクセス時刻(正確には この処理を開始する時の時刻, μs単位)を使ってみたが、不思議なことに やっぱり一様でなく、良く出る値(→ 良く出る画像)と全然出ない値が生じた。

例えば、(回数は多くないが、)71回(約4時間分)のアクセスでは、最高に出た値の頻度は最小(1回)の5倍だった。出ない値は2個で、全体の平均は2.6回だった。

アクセス時刻(の階級数での剰余)がある時刻に集中するとは考えられないので この原因も謎だが、出ない3個(各1回と想像)が出やすいところに回って、平均の2.6+2 → 5回になったのかも知れない。

画像数(= 階級数)が29個と、10の倍数でないなのが関係していることも疑った。: アクセスはランダムな時刻に来るが、その時刻を階級(各画像)に振り分ける時に偏りが生ずるのではないか? ただ、時刻は100μs単位(0-99)のように区切っては いないので、剰余が偏りを生むとは思えない。

が、頻度分布を見ると、後半の12から25までの頻度が比較的多いのが気になる。その幅は13で、100と29の剰余に合う。また、頻度の高い区間が始まる12は13-1だ。単なる偶然とは思うが不思議だ。

だから、これは たまたまアクセス時刻が偏ったためで、回数を多くすれ(長時間、数日?見れ)ば均等になるのだろう。が、僕には、起動後数時間経っても偏りが直らないのは許容できないので、この方法もボツにした。

 

PS. Pythonのページに関する追記から、試行回数を増やして一様性を比較してみたら、どうやら、階級数x500回以上試行すれば、僕が満足できる一様性(最多/最少が概ね1.2 → ばらつき20%以内)に できそうなことが分かった。 (9/15 10:37)

試行回数と各方式での最多と最少頻度の比を示す。

29階級x20回= 580回: 2.5辺り (Pythonは3辺り、opensslは5辺り)

  • PHP: rand: 2.38
  • PHP: random_int: 2.64
  • /dev/urandom: 2.42
  • shuf: 2.31
  • openssl rand: 4.5
  • Python numpy.random.uniform: 4.83 2.9

29階級x500回= 14500回: 1.3辺り (random_intとshufとPythonは1.2辺り)

  • PHP: rand: 1.26
  • PHP: random_int: 1.19
  • /dev/urandom: 1.26
  • shuf: 1.21
  • openssl rand: 1.31
  • Python numpy.random.uniform: 2.07 1.2

29階級x1000回= 29000回: 1.1辺り (random_intとshufは1.15辺り、Pythonは1.2辺り)

  • PHP: rand: 1.11
  • PHP: random_int: 1.15
  • /dev/urandom: 1.11
  • shuf: 1.24
  • openssl rand: 1.11
  • Python: numpy.random.uniform: 2.26 1.19

本文で懸念したように、/dev/urandomとopenssl randの使い方(整数化の方法)に誤りがあったので修正した。

また、Pythonの一様性が悪いのは、使い方が良くないせいかも知れない。 ← (9/15 13:42) Pythonのnumpy.random.uniformの出力に想定外の問題があった。: 生成する乱数の最小, 最大値での頻度が他のものの半分くらいになっていた(乱数を表示する時の丸めの問題かも知れない)。 → 仮対処として、生成する範囲を広く取って数を多目に生成して範囲内のものだけを使うようにしたら、一様性は改善された。 → 上を更新した。

それから、Pythonの1回の実行でその系統全部の乱数を生成するようにしたら、実行速度は速くなった。

結局、試行(繰り返し)回数を随分増やせば一様になることが確認できた。実際に使う時にはそうできないことがあるが、その場合は「シャフル」のように あらかじめ一様な分布を作っておくとか、分布が一様になるように調整(取捨選択)するのだろうか?

あと、この問題は「システムの起動後しばらくは(乱数が今一つなので)安全でない」ということには ならないのだろうか? (この辺りは全くの素人なので、単なる思いつきである。)

 

(9/15 10:37 若干修正, 10:37 PSを追加, 16:22 題を明確化; 9/16 13:59 対処方法を追記, 22:42 題を変更; 9/17 16:28, 9/18 12:22 乱数を諦めた件とその後の試行を追記)

  •  1
  •  0

前々回のPSに書いた、このブログのロゴ画像を「時替わり」で いろいろ出すのが意外に気に入ったので(+そこでも書いたように、ERNIE-ViLG Demoで描いた画像が気に入ったのも大きい)、それを改良した。

例によって やることは難しくないのだが、実装には結構手こずった。欲張るせいもあるが、老化で頭が回らなくなっているのだろうか?

以下のようにしたかった。

  • ロゴとして特別に選んだ・作った画像でなく、ブログの投稿に使った画像全体(あるいは新規も)から、気に入ったものを随時選んで出し、あるいは「引っ込め」たい。
    • → 表示する画像を特別なディレクトリにアップロードするとか、それ用の名前にするとか、注釈(キャプション)を特別なファイルに入れるとかせず、WPの仕組みだけで実現して操作を楽にしたい。
    • かといって、前に書いたように、複数画像の対象への一括設定/解除やキャプションの一括更新ができないとかの馬鹿らしい・面倒なこともしたくない。

一方、表示候補の画像を検索するために対象に「マーク」を付けたいのだが、標準のWPだと画像にはタグなどが付けられないという問題がある。

それらが付けられるのは、投稿などだけ。

WPのカスタムフィールドを使えば実装できそうだが、使い勝手が良くない。そこで、プラグインで何とかできないか探したところ、Media Library Assistant(以下、MLA)というものが見付かった。※ 本来は、WPのギャラリー(複数画像をまとめて出す部品: この投稿の一番下にあるもの)を高機能にするものだが、上記のような、画像など(attachment)にタグなどを付ける機能を持っている。

※これは ものすごく高機能で、僕の用途には もったいないくらいで、とても使いこなせない。今回も、本来の用法でないために却って苦労したw

なお、単にランダムに画像を出すだけなら いろいろあるのだが、特に、タグなどで出す候補を指定できるものは なかった。

次のような処理にした。

  • ギャラリーに表示する候補画像(画像以外、動画なども可能なはず)一覧を抽出できるように、MLAのattachment tag(Att. tag(画像: 右端の列))にギャラリー名(今回は"my_gallery"とした)を設定する。
    • こうすることで、ギャラリーに登録された画像を一覧することができる。
  • 画像のキャプションはWPのTitle(画像: サムネイルの右の列)に設定する。
    • カスタムフィールドなどでも可能だが、使い勝手(特に一括更新)を考慮して そうした。
  • ページの表示時は以下の処理を行う。 (注: 変更あり。最後に書く。: 9/14 8:42)
    1. 表示する画像情報がキャッシュされているか調べる。
    2. キャッシュされている場合、
      1. キャッシュから取得した画像情報からURLとキャプションを取得する。
    3. キャッシュされていない場合、
      1. ギャラリーの全画像数を取得する。
      2. 乱数で その中の1枚を選ぶ。
      3. 選んだ画像のURLとキャプションを取得する。
      4. そのURLとキャプションをキャッシュに格納する(今回は生存時間(TTL)は20分とした)。
    4. 画像のURLとキャプションをページの右上に表示する。

なお、前の版では、表示する画像をページ表示部とは別のプログラムで検索・選択していたが、今回はページ表示部だけで完結している。一長一短だが、こちらのほうが保守性は良い。

それから、やはり前に書いたが、表示する画像をページを表示するたびに検索するのは重そうなので、画像の生存時間(TTL)分キャッシュしておいて、その間は検索しないようにした。

キャッシュにはPHPのAPCuを使った。最初はファイルを使ったが、排他制御が厄介なのでAPCuにした。APCuにはTTL経過後にエントリがなくなる機能があるので、生存時間の実装がとても容易だった。

が、APCuにも排他制御の問題(複数のプロセスが同時にキャッシュを更新する場合)はあって、(この用途では必要ではないが、)一応実装した。apcu_entry()という関数を使った。

複数プロセスで同時に※キャッシュに書き込もうとした場合は、(当然ながら)先の情報を採用し、後から書き込むプロセスは、それまでに選んだものを破棄して先に書き込まれた情報を使う(すげ替える)ようにした。破棄した分の処理が無駄になって効率が悪いが、正しい方法は すぐには分からないので、とりあえず こうした。

※実際には同時でなく、どちらかが先になる。マルチプロセッサ/コアの場合は難しいが、OSが ちゃんと処理しているのだろう。

いろいろ苦労して(また疲れて)、動くようになった。結果は このページの右上のとおり(見るたびに変わっているはず)。

と、一言で終わってしまうが、いくら苦労したって、ちゃんと動けば それで終わりだw

 

(9/13 20:31, 9/14 8:42) 表示する画像の選択方法について

上述のように、当初は乱数で選ぶようにしていたが、様子を見ていたら、(PSにも書いたように、)ばらつき・偏りが大きいことが分かった。具体的には、頻繁に出る画像と なかなか出ないものがあった。気になって調べてみたら、最高/最低頻度の比が10前後と随分大きかった。

乱数の作り方・使い方に問題があるかと思って改良してみたが、余り改善できなかった。それから、通常の生成関数方法(PHPのrand())以外に いろいろ試したら※頻度比は2-3程度になったが、全く気に入らなかった。

僕としては全部の画像を平等に出したいので、特定のものが頻繁に出るのは全く許容できない。もし、特別気に入っているものを頻繁に出したいなら、そういう処理にする。

そういう用途では、音楽プレーヤーのような「シャフル」がいいのだろう。(処理が複雑になるのを別とすれば、)画像数が少なければ問題ないが、多くなった場合には一覧を作るのに時間が掛かりそうだ。

※試した内容や結果などの詳細は別の稿に書きたい。(→ 書いた) ただ、どの方法も「元」は同じ処理のようなのか、(下にも書いたが、)何万回も試行(実行)しないとだめなのか、頻度比に大きな違いはなかった。= 「効果なし」だった。

どうやら試行(実行)回数が少ないとばらつきが出るようだが、1000回以上でも頻度比が2では使い物にならないと感じた。

それで、実際の使い方に立ち戻って考えてみた。: ページを見る方にとっては、ページの変わる順番がどうであろうと、(一定時間経過後に)見るたびに変わればいいので、ライブラリ(ギャラリー)に格納された順番に表示するようにした。 → 最初はギャラリーの最初の画像を、切り替わりの時間になったら次に、最後まで行ったら最初に戻るようにした。

切り替わり時間(20分)ごとにリロードして表示されている画像の内容またはURLを記録するのを数十回も続けるのを2周以上※するような奇特熱心な読者にはバレるが、さすがにそういう方は居ないので大丈夫だ。

※計算したら、一周で約10時間掛かる・・・ → 実際にやるなら、スクリプトなどが良さそうだw

なんて余計なことを書かなければ いいのに、技術者なので つい書くw

変更後の処理は以下である。

  1. 現在表示されている画像の情報がキャッシュされているか調べる。
  2. キャッシュされている場合、
    1. キャッシュに格納した時刻から、現在表示されている画像の表示(経過)時間を求める。
    2. 画像の表示時間が切り替え時間(今回は20分)を超えている場合、
      1. キャッシュから取得した画像情報から現在表示されている画像の番号を取得する。
      2. 取得した番号+1の画像を選択する。
        • ただし、ギャラリー中の画像数以上になったら0(最初)にする。
    3. そうでない場合は、以降は実行しないで終わる。
  3. キャッシュされていない場合、
    1. ギャラリー中の最初の画像(番号= 0)を選択する。
  4. 選択した画像のURLとキャプションを取得する。
    • 画像の番号を指定してギャラリーから取り出す。
  5. そのURLとキャプションと画像番号をキャッシュに格納する(生存時間(TTL)は無限)。
  6. 画像のURLとキャプションをページの右上に表示する。

この変更のため、最後に表示した(現在表示されている)画像の番号も画像情報のキャッシュに保存するようにした。また、最後に表示した画像が分からなくなっては困るので、そのキャッシュの生存時間(TTL)を無限にし、画像を切り替えるタイミングは自分で計算するようにした。

この場合も複数プロセスでのキャッシュに対する同時アクセスは起こるが、どのプロセスの次の画像も同じ番号になるはずなので、構わず上書きするようにした。

 

PS. 本題には関係ないが、前の版もそうだったが、乱数が一様でないような感じがする。前の版は中央辺りに頻度の高いものがあり、その隣は頻度が他の1/2くらいと低かった。

今回は、まだサンプル数が少ないものの、全く出ない値(≒ 画像)がある。特に、最小と最大が出ていないのは、プログラムに誤りがあるのかも知れない。。。

(9/14 9:05) その後、やっぱり我慢ならないので、本文に追記したとおり、乱数は止めた。

  •  0
  •  0