おれさまラボ

実際に手を動かして理解を深めるブログ。

魔方陣に関するお話。

YouTubeを眺めていたら面白い動画(https://youtu.be/1_pfASO7eWA)があったので、忘れないように内容アウトプットしとく。

 

方陣とは、例えば正方形の3 × 3のマスがあったとしてそのマス数ひとつひとつにユニークな数字をそれぞれ入れた(3 × 3なら9個ということ)結果、タテ・ヨコ・斜めの数字を足すと、どこを足してと同じ数になるマスのことです。3 × 3のマスであれば三次魔方陣、4 × 4のマスであれば四次魔方陣と呼ばれます。


方陣の解が何通りあるかは証明されていています。なお、場合の数を調べる時は、回転や裏返しは同じとみなして考えます。


二次魔方陣    解なし

三次魔方陣    1通り

四次魔方陣    880通り

五次魔方陣    275,305,224通り

六次魔方陣    不明(約1,800京通りと推定)


今回は、三次魔方陣について1通りしかない事を証明します。


便宜上、三次魔方陣のマスを以下のアルファベットで表記します。

A  B  C

D  E  F

G  H  I


まずは、中央が5であることを示す。


三次魔方陣は、タテ・ヨコ・ナナメいずれの場合も和が15となることから、E = 5 の等式を成り立たせたい。

そのためにはEを通るナナメ2つとタテ1つの和から、E以外のマスを打ち消すよう等式を作れば導ける。


よって、

(A+E+I)+(C+E+G)+(B+E+H)-(A+ B+ C)-(G-H-I)

= 3E

となる。


三次魔方陣の性質から、3E = 15 なので

E = 5 である。


A  B  C

D  5  F

G  H  I


次に、角のマスには1が入らないことを示す。

回転や裏返しは同じものとみなすので、Aについてだけ考えればよい。


三次魔方陣の性質から A+5+I = 15 なので

A = 1 と仮定すると、I = 9 である。


1  B  C

D  5  F

G  H  9


この時、マスに入る最大値は8であることから、以下が成り立つ。

15 = 1+B+C ≦ 1+8+C

よって、C ≧ 6 ・・・①


また、マスに入る最小値は2であることから、以下が成り立つ。

15 = C+F+9 ≧ C+2+9

よって、C ≦ 4・・・②


①、②を同時に満たすことはできないため、矛盾。

従って、角のマスには1が入らないと言える。


ここまでの結果から、 B、D 、F、Hのいずれかに1が入ると言える。回転や裏返しは同じものとみなすので Bについてだけ考えればよい。


A  1  C

D  5  F

G  H  I


B = 1 であることから、

H = 15 -(1+5)= 9


A  1  C

D  5  F

G  9  I


残った数は 2,3,4,6,7,8 の6つ。


一行目について、A+C = 15 となるのは以下の2通りだが、回転や裏返しは同じものとみなすので どちらか一方のみ考えれば良い。


A = 8、C = 6・・・③

A = 6、C = 8・・・④


ここでは、③を使って考える。

8  1  6

D  5  F

G  9  I


残りの数は自明であり、

G = 4、I = 2、D = 3、F = 7 となる。


8  1  6

3  5  7

4  9  2


以上から、三次魔方陣は上記の1通りしかないと言える。

インターネット監視ツールの ThousandEyes を構築する

■ はじめに
 
ThousandEyes は、WAN監視ソリューション製品のひとつで、HTTPリクエスト、DNS クエリなどの Availability、Response、Jitter などを計測できます。例えば、世界中にあるエージェントからの情報を使うことで、O365 で障害が起きていないかなどを特定できます。今回は、15日間の Free Trial が利用できるので、試してみました。今回は、インストール手順の紹介です。
 
■ 環境
 
今回は、ESXi 上に OVA 形式の VM を展開しました。
ESXi は Version 6.5 を利用しています。
 
ThousandEyes の Enterprise Agent は、以下の通り、様々な環境へのインストールが可能です。
 
 
■ アカウント登録
 
https://www.thousandeyes.com/ja/signup へアクセスし、必要な情報を入力します。
 

f:id:naoto408:20190321203430p:image

 
ダッシュボードへのアクセス
 
登録完了後、メールが届くので、ブラウザでアクセスし、ログインします。ログインすると、ダッシュボードが表示されます。この時点では、エージェントが登録されていないので、何も表示されません。

f:id:naoto408:20190321203404p:image

 
■ Enterprise Agent の構築
 
ダッシュボードから、Setting > Agents > Enterprise Agents を押下します。

f:id:naoto408:20190321203604p:image

 
画面中央の「Add New Enterprise Agent」を押下します。

f:id:naoto408:20190321203439p:image

 
「Download - OVA」を押下すると、仮想マシンイメージ(OVA形式のファイル)のダウンロードが始まります。
私の環境では、以下のファイルでした。
 
名前: thousandeyes-va-0.146.ova
サイズ: 1034816512バイト (986 MiB)
SHA256: 61EE8DF2C084648DE3761C730D13BCD1F8654018E08C0ECDDAA47BE41439F29F
 

f:id:naoto408:20190321203419p:image

 
ちなみに、上記画面「Download - OVA」の下に「Instration Guide」があるので、そこを参照すると公式マニュアルを確認できます。
 
ESXi にブラウザコンソールからアクセスして、「仮想マシンの作成/登録」を押下します。

f:id:naoto408:20190321203600p:image

 
「作成タイプの選択」画面となるので、「OVF ファイルまたは OVA ファイルから仮想マシンをデプロイ」を選択し、「次へ」を押下します。

f:id:naoto408:20190321203457p:image

 
仮想マシン名を入力して、ダウンロードした OVA ファイルをアップロードします。

f:id:naoto408:20190321203353p:image

 
仮想マシンを構成するストレージを選択します。

f:id:naoto408:20190321203528p:image

 
ネットワーク等のオプションを選択します。「自動的にパワーオン」にチェックを入れておきます。

f:id:naoto408:20190321203545p:image

 
設定に問題がないことを確認し、「完了」を押下するとマシンのデプロイが開始します。

f:id:naoto408:20190321203504p:image

 
デプロイが完了するまでしばらく待ちます。

f:id:naoto408:20190321203519p:image

 
デプロイが完了し、正常に起動したことを確認します。

f:id:naoto408:20190321203523p:image

 
ブラウザコンソールで確認すると、アクセス先のIPアドレスが表示されるので、そこへアクセスします。
(今回だと、http://192.168.1.3/ へアクセスします)

f:id:naoto408:20190321203554p:image

 
■ Enterprise Agent へのログイン
 
今回だと、http://192.168.1.3/ へアクセスすると、Virtual Applience へのログイン画面が表示されます。
ログイン情報の初期値は、Username: admin、Password: welcome です。

f:id:naoto408:20190321203449p:image

 
パスワード変更を求められるので変更します。

f:id:naoto408:20190321203612p:image

 
ちなみにパスワードは意外と条件厳しいので注意しましょう。

f:id:naoto408:20190321203550p:image

 
■ Enterprise Agent の登録
 
ダッシュボードから、Setting > Agents > Enterprise Agents を押下して、Applience 選択画面を表示します。

f:id:naoto408:20190321203413p:image

 
「Show Account Group Token for Instration」を押下すると、Token が表示されるのでコピーします。このトークンID とエージェントを紐付けることになります。

f:id:naoto408:20190321203358p:image

 
ESXi 上に構築した Agent に戻り、「Agent」を選択、「Acount Group Token」にコピーしたトークンID をペーストします。

f:id:naoto408:20190321203425p:image

 
「Review」タブを押下し、ステータスがオールグリーンであることを確認します。

f:id:naoto408:20190321203534p:image

 
ダッシュボードに戻ると、構築した Agent が見えるようになっています。

f:id:naoto408:20190321203510p:image

 
インストール作業は以上です。
 
 

Speechy というアプリで音声から文字起こしするのが楽チン過ぎた話

今日は、Speechyというアプリを紹介したいと思います。このアプリは音声を文字に変換してくれるアプリなんですけど、非常に精度が高くて面白いかったです。この記事もSpeechyを使って文字起こしをしています(さすがに誤変換やえーとかあーとか読点句読点とかは編集済み)。誤解の無いように主張しておきますが、編集なしでは文章として成立しません。めちゃくちゃ滑舌良ければ別かもしれませんが。

f:id:naoto408:20190312074859j:image

 

使い方ですが、録音ボタンを押すと喋った内容を勝手に文字起こししてくれるんですけど、1回録音を止めてあげると、キーボードが出てきて、文字の修正って言うのを都度行うことができます。また有料版を買うと文字修正した後にもう一回録音ボタンを押すことができて、そのまま追記をすることができます。

f:id:naoto408:20190312075148j:image

あと設定メニューの中に語彙っていうのがあって、ここに自分の知ってるローカルの用語とか、例えば仕事でしか使わない言葉であったり、流行語であったり、そういった特殊な言葉も追加することができるので、どんどんどんどん自分好みに精度を上げてあげることができるみたいです。
個人的にいいんじゃないかなと思った使い方としては、プレゼンの練習とかに結構使えるんじゃないかなと思いました。何故かと言うとプレゼンで自分がしゃべった内容って正直全部は覚えてないじゃないですか。一般人は。それをこういう風に文字起こししておいてくれれば、後から自分が何しゃべったのかなあとか、あー、ここ指摘されたけど確かに分かりにくかったなぁ、とかっていうのをちゃんと腑に落ちるというか、その時自分がしゃべった内容をその場で確認できるっていうのはもすごいいい使い方なんじゃないかなと思いました。
また、ブログの執筆って、結構文字入力しているの時間かかったり、あと意外とPC立ち上げてー、ブログ開いてー、とかちょっと億劫になったりすることもあるんですけど、このSpeechy でアプリをパッと起動してしゃべるだけで文章ができあがるので、すごく楽チンだと思いました。

あとは、相手が機械であることを利用して、英語の発音練習にも使えるのでは?と思いました。


有料版は720円だったかな。結構高いんですけど、その分の精度はほんとに保証できるのでお勧めします。気になった方はぜひ購入してみてください。無料版も用意されているので、まずは試してみたらいいと思います。


ちなみに自分の声だけじゃなくて、録音したファイルからの入力だったり、複数人喋っている音声だったりしてもきちんと読み取ってくれるみたいです。まだその辺りの機能は私は試してないんですけど、今度またやってみたいと思います。もしかしたら仕事の議事録なんて一瞬で終わっちゃうかもしれないですね。

Squid が ipv6 しか LISTEN しない

■ 事象
8080ポートをリッスンするよう configを指定したが、ipv6 しか LISTEN していない。
[root@proxy1 ~]# ss -tln
State      Recv-Q Send-Q     Local Address:Port                    Peer Address:Port
LISTEN     0      128                    *:22                                 *:*
LISTEN     0      100            127.0.0.1:25                                 *:*
LISTEN     0      128                   :::8080                              :::*
LISTEN     0      128                   :::22                                :::*
LISTEN     0      100                  ::1:25                                :::*
 
■ 解決策
コンフィグ修正で直りました。
修正前
http_port 8080
 
修正後
http_port 0.0.0.0:8080
 
確認
[root@proxy1 ~]# ss -tln
State      Recv-Q Send-Q     Local Address:Port                    Peer Address:Port
LISTEN     0      128                    *:8080                               *:*
LISTEN     0      128                    *:22                                 *:*
LISTEN     0      100            127.0.0.1:25                                 *:*
LISTEN     0      128                   :::22                                :::*
LISTEN     0      100                  ::1:25                                :::*
 

td-agent で /var/log/messages の情報を読み込めない

■ 事象
→ td-agent の source に /var/log/messages を記入して td-agent を起動したところ、指定した path にログが生成されなかった。
 
■ 解決策
→ td-agentサービス を root ユーザーで起動する。
 
td-agent のログを確認すると、`Permission denied` というメッセージが毎秒出力されている事がわかり、実行ユーザーの権限に問題があるのではないかという仮説が立てられます。
[root@fluentd1 td-agent]# tail -f /var/log/td-agent/td-agent.log
2019-03-07 17:29:15 +0900 [error]: Permission denied @ rb_sysopen - /var/log/messages
  2019-03-07 17:29:15 +0900 [error]: suppressed same stacktrace
2019-03-07 17:29:16 +0900 [error]: Permission denied @ rb_sysopen - /var/log/messages
  2019-03-07 17:29:16 +0900 [error]: suppressed same stacktrace
2019-03-07 17:29:17 +0900 [error]: Permission denied @ rb_sysopen - /var/log/messages
  2019-03-07 17:29:17 +0900 [error]: suppressed same stacktrace
 
初期状態では、td-agentサービス は td-agent ユーザーで実行されるようです。
[root@fluentd1 td-agent]# ps aux | grep [t]d-agent
td-agent 15912  0.0  1.2 218032 24316 ?        Sl   17:26   0:00 /opt/td-agent/embedded/bin/ruby /opt/td-agent/embedded/bin/fluentd --log /var/log/td-agent/td-agent.log --daemon /var/run/td-agent/td-agent.pid
td-agent 15915  4.1  2.3 256836 43416 ?        Sl   17:26   0:00 /opt/td-agent/embedded/bin/ruby /opt/td-agent/embedded/bin/fluentd --log /var/log/td-agent/td-agent.log --daemon /var/run/td-agent/td-agent.pid
 
/var/log/messages は root ユーザーが所有するファイルなので、td-agent ユーザーで実行された td-agentサービス からは /var/log/messages を読み取ることができません。
[root@fluentd1 ~]# ls -l /var/log/messages
-rw-------. 1 root root 326287  3月  7 17:49 /var/log/messages
 
そのため、td-agentサービス を rootユーザーで実行すれば、本事象は解決するはずです。
td-agentサービスは、systemctl によって管理されるので、rootユーザーで実行するためには、systemd のユニットファイルの設定値で、起動ユーザー/グループを変更します。
[root@fluentd1 td-agent]# cp -ip /lib/systemd/system/td-agent.service /lib/systemd/system/td-agent.service.20190307.bef
[root@fluentd1 td-agent]# vi /lib/systemd/system/td-agent.service
[root@fluentd1 td-agent]# diff /lib/systemd/system/td-agent.service /lib/systemd/system/td-agent.service.20190307.bef
8,9c8,9
< User=root
< Group=root
---
> User=td-agent
> Group=td-agent
[root@fluentd1 td-agent]# systemctl daemon-reload
[root@fluentd1 td-agent]# systemctl restart td-agent
[root@fluentd1 td-agent]# systemctl status td-agent
● td-agent.service - td-agent: Fluentd based data collector for Treasure Data
   Loaded: loaded (/usr/lib/systemd/system/td-agent.service; disabled; vendor preset: disabled)
   Active: active (running) since 木 2019-03-07 17:29:27 JST; 7s ago
  Process: 15957 ExecStop=/bin/kill -TERM ${MAINPID} (code=exited, status=233/RUNTIME_DIRECTORY)
  Process: 15966 ExecStart=/opt/td-agent/embedded/bin/fluentd --log /var/log/td-agent/td-agent.log --daemon /var/run/td-agent/td-agent.pid $TD_AGENT_OPTIONS (code=exited, status=0/SUCCESS)
Main PID: 15972 (fluentd)
   CGroup: /system.slice/td-agent.service
           tq15972 /opt/td-agent/embedded/bin/ruby /opt/td-agent/embedded/bin/fluentd --log /var/...
           mq15975 /opt/td-agent/embedded/bin/ruby /opt/td-agent/embedded/bin/fluentd --log /var/...
 
 
3月 07 17:29:26 fluentd1.oresamalabo.local systemd[1]: Stopped td-agent: Fluentd based data c...a.
3月 07 17:29:26 fluentd1.oresamalabo.local systemd[1]: Unit td-agent.service entered failed state.
3月 07 17:29:26 fluentd1.oresamalabo.local systemd[1]: td-agent.service failed.
3月 07 17:29:26 fluentd1.oresamalabo.local systemd[1]: Starting td-agent: Fluentd based data .....
3月 07 17:29:27 fluentd1.oresamalabo.local systemd[1]: Started td-agent: Fluentd based data c...a.
Hint: Some lines were ellipsized, use -l to show in full.
 
td-agent のログを確認すると、エラーが解消していることがわかります。
[root@fluentd1 td-agent]# tail -f /var/log/td-agent/td-agent.log
  </source>
  <match msg>
    @type file
    path /var/log/td-agent/messages-td
    buffer_path /var/log/td-agent/messages-td.*
  </match>
</ROOT>
2019-03-07 17:29:27 +0900 [info]: listening fluent socket on 0.0.0.0:24224
2019-03-07 17:29:27 +0900 [info]: listening dRuby uri="druby://127.0.0.1:24230" object="Engine"
2019-03-07 17:29:27 +0900 [info]: following tail of /var/log/messages
^C
 
動作確認のために、logger コマンドを使って /var/log/message にログを書き込むと、/etc/td-agent/td-agent.conf で指定した path に JSON データが生成されます。
[root@fluentd1 td-agent]# cat /var/log/td-agent/messages-td.20190307.b5837cea121f0d1ab
2019-03-07T17:30:08+09:00       msg     {"message":"Mar  7 17:30:08 fluentd1 root: test"}
 
以上です。

td-agent の source で 514ポートを指定したところ、td-agent がクラッシュしてしまう

■ 事象
td-agent の設定ファイルで514ポートをバインドしたところ、一瞬立ち上がった後にクラッシュする。
 
設定内容はこちら。
<source>
  @type syslog
  port 514
  bind 0.0.0.0
  tag msg
</source>
 
 
<match msg>
  @type file
  path /var/log/td-agent/squid-td
</match>
 
一瞬問題なく立ち上がるが、
[root@fluentd1 ~]# systemctl status td-agent
● td-agent.service - td-agent: Fluentd based data collector for Treasure Data
   Loaded: loaded (/usr/lib/systemd/system/td-agent.service; disabled; vendor preset: disabled)
   Active: active (running) since 木 2019-03-07 20:00:46 JST; 1s ago
  Process: 18067 ExecStop=/bin/kill -TERM ${MAINPID} (code=exited, status=1/FAILURE)
  Process: 18070 ExecStart=/opt/td-agent/embedded/bin/fluentd --log /var/log/td-agent/td-agent.log --daemon /var/run/td-agent/td-agent.pid $TD_AGENT_OPTIONS (code=exited, status=0/SUCCESS)
Main PID: 18075 (fluentd)
   CGroup: /system.slice/td-agent.service
           tq18075 /opt/td-agent/embedded/bin/ruby /opt/td-agent/embedded/bin/fluentd --log /var/...
           mq18094 /opt/td-agent/embedded/bin/ruby /opt/td-agent/embedded/bin/fluentd --log /var/...
 
 
3月 07 20:00:45 fluentd1.oresamalabo.local systemd[1]: td-agent.service holdoff time over, sc...t.
3月 07 20:00:45 fluentd1.oresamalabo.local systemd[1]: Stopped td-agent: Fluentd based data c...a.
3月 07 20:00:45 fluentd1.oresamalabo.local systemd[1]: Starting td-agent: Fluentd based data .....
3月 07 20:00:46 fluentd1.oresamalabo.local systemd[1]: Started td-agent: Fluentd based data c...a.
Hint: Some lines were ellipsized, use -l to show in full.
 
数秒後にクラッシュしてしまう。
[root@fluentd1 ~]# systemctl status td-agent
● td-agent.service - td-agent: Fluentd based data collector for Treasure Data
   Loaded: loaded (/usr/lib/systemd/system/td-agent.service; disabled; vendor preset: disabled)
   Active: activating (start) since 木 2019-03-07 20:00:50 JST; 653ms ago
  Process: 18150 ExecStop=/bin/kill -TERM ${MAINPID} (code=exited, status=1/FAILURE)
Main PID: 18117 (code=exited, status=0/SUCCESS);         : 18152 (fluentd)
   CGroup: /system.slice/td-agent.service
           tq18152 /opt/td-agent/embedded/bin/ruby /opt/td-agent/embedded/bin/fluentd --log /var/...
           tq18157 /opt/td-agent/embedded/bin/ruby /opt/td-agent/embedded/bin/fluentd --log /var/...
           mq18160 /opt/td-agent/embedded/bin/ruby /opt/td-agent/embedded/bin/fluentd --log /var/...
 
 
 
 
3月 07 20:00:50 fluentd1.oresamalabo.local systemd[1]: td-agent.service holdoff time over, sc...t.
3月 07 20:00:50 fluentd1.oresamalabo.local systemd[1]: Stopped td-agent: Fluentd based data c...a.
3月 07 20:00:50 fluentd1.oresamalabo.local systemd[1]: Starting td-agent: Fluentd based data .....
Hint: Some lines were ellipsized, use -l to show in full.
 
■ 解決策
同じく514番ポートを利用している rsyslogサービスを停止/disableする。
[root@fluentd1 ~]# systemctl stop rsyslog
[root@fluentd1 ~]# systemctl disable rsyslog
Removed symlink /etc/systemd/system/multi-user.target.wants/rsyslog.service.
[root@fluentd1 ~]# systemctl status rsyslog
● rsyslog.service - System Logging Service
   Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:rsyslogd(8)
           http://www.rsyslog.com/doc/
 
 
3月 09 10:45:32 fluentd1.oresamalabo.local systemd[1]: Starting System Logging Service...
3月 09 10:45:32 fluentd1.oresamalabo.local rsyslogd[5683]:  [origin software="rsyslogd" swVers...t
3月 09 10:45:32 fluentd1.oresamalabo.local systemd[1]: Started System Logging Service.
3月 09 11:07:35 fluentd1.oresamalabo.local systemd[1]: Stopping System Logging Service...
3月 09 11:07:35 fluentd1.oresamalabo.local rsyslogd[5683]:  [origin software="rsyslogd" swVers....
3月 09 11:07:35 fluentd1.oresamalabo.local systemd[1]: Stopped System Logging Service.
Hint: Some lines were ellipsized, use -l to show in full.
 
ログを確認して、514でバインドされていればOK。
[root@fluentd1 ~]# tail -f /var/log/td-agent/td-agent.log
  </source>
  <match local0.**>
    @type file
    path /var/log/td-agent/squid-td
    buffer_path /var/log/td-agent/squid-td.*
  </match>
</ROOT>
2019-03-09 11:34:57 +0900 [info]: listening fluent socket on 0.0.0.0:24224
2019-03-09 11:34:57 +0900 [info]: listening dRuby uri="druby://127.0.0.1:24230" object="Engine"
2019-03-09 11:34:57 +0900 [info]: listening syslog socket on 0.0.0.0:514 with udp