2021-05-19に更新

shogi-serverのコードを読もうぜ(^~^)

へびゃー(^~^) 公開下書き

20210124shogi2a2b1.png
「 👇 shogi-server のコードを読もうぜ?」

📖 https://shogi-server.osdn.jp/

kifuwarabe-futsu.png
「 AWSハンズオンは もう飽きたか」

ohkina-hiyoko-futsu.png
「 さっさと読みましょう」

ramen-tabero-futsu2.png
「 Linuxのtarボールに 📄pax_global_header というファイルが入ってるんだけど……」

kifuwarabe-futsu.png
「 無視しろだぜ」

20210517shogi59.png

ramen-tabero-futsu2.png
「 👆 LICENSE ファイルが入ってないな……、 README から開けてみるかだぜ」

ramen-tabero-futsu2.png
「 README には ライセンス書いてないな。
じゃあ ソースファイルの先頭に ライセンスの全文書いてるやつかだぜ?」

20210517shogi60.png

ramen-tabero-futsu2.png
「 👆 やっぱり。 で、 GPL 2 のようだぜ」

kifuwarabe-futsu.png
「 GPL2 は ソースの冒頭にそれを書く必要があるようだぜ」

ramen-tabero-futsu2.png
「 他人のソースを改造したときの Author の書き方って どうやるんだぜ?」

kifuwarabe-futsu.png
「 大樹の枝を改悪したお父んは 知っているのでは?」

📖 apery

ramen-tabero-futsu2.png
「 👆 調べてみるか……」

📖 あなた自身のソフトウェアにGNUライセンスを使う方法

ramen-tabero-futsu2.png
「 👆 分からん……、置くもんらしいぜ」

実行してみようぜ?

📖 exerb

ramen-tabero-futsu2.png
「 👆 exerb を使ってみようぜ?」

20210517shogi61.png

ramen-tabero-futsu2.png
「 👆 エラーが出たぜ」

kifuwarabe-futsu.png
「 じゃあ ソースからコンパイルしろだぜ。
Ruby 2.1 系統らしいぜ」

20210517shogi62.png

ramen-tabero-futsu2.png
「 👆 Ruby 2.4 の公式サポートが終了してるのに?」

ohkina-hiyoko-futsu.png
「 じゃあ Ruby 2.1 のコードを Ruby 3.0.1 にアップデートしましょう」

ramen-tabero-futsu2.png
「 3か月ぐらい 調査期間が欲しいぜ」

20210517shogi63.png

ramen-tabero-futsu2.png
「 👆 最新の Ruby を入れようとしたら 入らなかったぜ」

kifuwarabe-futsu.png
「 違いも分からんだろ。それでいけだぜ」

20210517shogi64.png

ramen-tabero-futsu2.png
「 👆 4000ポートにアクセスしてきたのだと思う」

kifuwarabe-futsu.png
「 で、どうすんだぜ?」

ohkina-hiyoko-futsu.png
「 サーバー立ってんなら 将棋所でアクセスしたらいいんじゃないの?」

20210517shogi65.png

ramen-tabero-futsu2.png
「 👆 4081ポートの方が良かったか?」

20210517shogi66.png

ramen-tabero-futsu2.png
「 👆 将棋所から接続できたみたいだな、対局は始まらないけど」

kifuwarabe-futsu.png
「 お父ん、説明読め」

20210517shogi67.png

ramen-tabero-futsu2.png
「 👆 テストは動かないぜ」

ohkina-hiyoko-futsu.png
「 Windowsに対応してないんじゃないの?」

kifuwarabe-futsu.png
「 Dockerfile 付いてるし、Dockerで動かしたらどうだぜ?」

cd c:\GitHub\shogi-server

docker build . -t muzudho/shogi-server

docker images

ramen-tabero-futsu2.png
「 👆 Dockerイメージは作れたぜ」

kifuwarabe-futsu.png
「 じゃあ走らせろだぜ」

docker run -p 4081:4081 -d muzudho/shogi-server

docker ps

ramen-tabero-futsu2.png
「 👆 走るみたいだから、将棋所で接続してみるかだぜ」

ramen-tabero-futsu2.png
「 対局待ち に進むからログインはできてるみたいなんだが、対局は始まらないぜ」

kifuwarabe-futsu.png
「 ログを見ろだぜ」

docker ps

docker logs <CONTAINER ID>

20210517shogi68.png

ramen-tabero-futsu2.png
「 👆 同じIDのユーザーでも作ってしまったかだぜ?
ログインし直すか」

20210517shogi69.png

ramen-tabero-futsu2.png
「 👆 ログインできるだけで、対局は始まらないぜ」

kifuwarabe-futsu.png
「 じゃあ対局は諦めて テストを走らせろだぜ」

docker ps

docker exec -it <CONTAINER ID> /bin/bash

cd test

ruby TC_ALL.rb

20210517shogi70.png

ramen-tabero-futsu2.png
「 👆 31個のエラーがあるぜ」

kifuwarabe-futsu.png
「 直してくれだぜ」

20210517shogi71.png

ramen-tabero-futsu2.png
「 👆 Jasmine系っぽいプログレス出してるけど。
hoge とか入れたのが悪かったのかだぜ?」

kifuwarabe-futsu.png
「 今回は hoge は入れてないぜ」

ohkina-hiyoko-futsu.png
「 players.yaml の中に gps_normal プレイヤーがいないんじゃないの?」

20210517shogi72.png

ramen-tabero-futsu2.png
「 👆 確かにいないが、テストに合わせてデータを合わせたら テストにならんだろ。
このファイルの書き方も分からんし」

20210517shogi73.png

ohkina-hiyoko-futsu.png
「 👆 Dockerコンテナの外の players.yaml の中には gps_normal 居るわよ?」

kifuwarabe-futsu.png
「 サーバーを起動する前にテストする必要があるのでは?」

ramen-tabero-futsu2.png
「 Dockerコンテナを起動したら サーバーは起動する」

kifuwarabe-futsu.png
「 めんどくせ、コピーしろだぜ」

ramen-tabero-futsu2.png
「 正しいテストの方法なのか分からん」

exit

docker ps

docker stop <CONTAINER ID>

docker run -p 4081:4081 -d muzudho/shogi-server

docker ps

docker exec -it <CONTAINER ID> /bin/bash

cd test

ramen-tabero-futsu2.png
「 👆 あれっ、 players.yml 無いぜ」

kifuwarabe-futsu.png
「 もうテストすれば」

ruby TC_ALL.rb

20210517shogi74.png

ramen-tabero-futsu2.png
「 👆 やっぱエラーが出るぜ」

ohkina-hiyoko-futsu.png
「 players.yaml の中に gps_normal を書いてしまいましょう」

apt-get update
apt-get install -y vim

vim players.yaml

ramen-tabero-futsu2.png
「 👆 コンテナの外から内へ コピー貼り付けが利かないぜ」

players:
  0:
    gps_normal+e293220e3f8a3e59f79f6b0efffaa931:
      name: gps_normal
      rate: -1752.0
      win: 3384.04877829976
      loss: 906.949084230512
      rating_group: 0
      last_modified: 2008-05-08 23:50:54.000000000 +09:00  

ohkina-hiyoko-futsu.png
「 打鍵で」

ramen-tabero-futsu2.png
「 ゼロなんこ?」

ohkina-hiyoko-futsu.png
「 きゅうこよ」

20210517shogi75.png

ramen-tabero-futsu2.png
「 👆 フェイラーは1個減ったが、エラーは1個増えたぜ」

kifuwarabe-futsu.png
「 あと1個も直そうぜ?」

20210517shogi76.png

ramen-tabero-futsu2.png
「 👆 これは 295件 プレイヤーデータを入れろというテストかだぜ?」

kifuwarabe-futsu.png
「 入れろだぜ」

20210517shogi77.png

ramen-tabero-futsu2.png
「 👆 2094 を 7 で割ると 14、63、63、 だいたい 299 かだぜ。 295 に近いな」

ohkina-hiyoko-futsu.png
「 そのファイルを Dockerコンテナの中に入れたらいいんじゃない?」

20210517shogi78.png

ramen-tabero-futsu2.png
「 👆 .dockerignore ファイルに .yaml はコピーしないように書いてるぜ」

kifuwarabe-futsu.png
「 .dockerignore ファイルを無効にしようぜ?」

docker build . -t muzudho/shogi-server

ramen-tabero-futsu2.png
「 👆 イメージを作り直して再挑戦」

20210517shogi79.png

ramen-tabero-futsu2.png
「 👆 変わりなさげ」

20210517shogi80.png

ramen-tabero-futsu2.png
「 👆 UTF-8 が嫌いかだぜ?」

ohkina-hiyoko-futsu.png
「 ctime って ファイル作成日付じゃないの? しかも9時間ずれてるって日本と米国よ」

kifuwarabe-futsu.png
「 Ruby 2.1 と 2.7 の間で ctime の仕様が異なるのかだぜ?」

ramen-tabero-futsu2.png
「 それか タイムゾーンが違うか」

20210517shogi81a1.png

kifuwarabe-futsu.png
「 👆 まず UTF-8 を直してくれだぜ」

ramen-tabero-futsu2.png
「 UTF-8 が使えないと わたしが大変だぜ」

20210518shogi82.png

ramen-tabero-futsu2.png
「 👆 9時間ずれてるの直せば、 UTF-8 かどうかは関係ないんじゃないか?」

kifuwarabe-futsu.png
「 じゃあアメリカ人になってくれだぜ」

ohkina-hiyoko-futsu.png
「 タイムゾーンってどうやって調べんの?」

📖 Dockerコンテナのタイムゾーン変更方法

ramen-tabero-futsu2.png
「 👆 起動時のオプションを使うぐらいかだぜ」

# ここに置いておくとするぜ(^~^)
cd c:\GitHub\shogi-server

docker build . -t muzudho/shogi-server

docker images

docker run -p 4081:4081 -e TZ=Asia/Tokyo -d muzudho/shogi-server

docker ps

# テストをするために Dockerコンテナに入れだぜ(^~^)
docker exec -it <CONTAINER ID> /bin/bash

cd test

ruby TC_ALL.rb

20210518shogi83.png

ramen-tabero-futsu2.png
「 👆 タイムゾーン付けたらフェイラーは 0 になった。エラーは 31」

kifuwarabe-futsu.png
「 エラーを0にしてくれだぜ」

Error: test_toryo(TestChallenge): Errno::EADDRNOTAVAIL: Cannot assign requested address - connect(2) for "localhost" port 4000

ramen-tabero-futsu2.png
「 👆 テストは ポート 4000 でするのか?」

ramen-tabero-futsu2.png
「 関係なかった。 Docker を使ったんで、 localhost が Dockerコンテナを指しているのが問題か?」

apt-get update
apt-get install -y curl

ohkina-hiyoko-futsu.png
「 Webサーバーじゃないんだから、 Curl 入れても意味なくない?」

curl localhost:4081
curl localhost:4000

ramen-tabero-futsu2.png
「 👆 TCP も つながるっちゃ つながる」

ENV EVENT local
# Test
ENV PORT 4000
ENV MAX_IDENTIFIER 32

ramen-tabero-futsu2.png
「 👆 Dockerfile の中でポート番号指定してたんで、ここを変えてみるぜ」

20210518shogi84.png

ramen-tabero-futsu2.png
「 👆 エラーが0になってフェイラーが2になったぜ」

kifuwarabe-futsu.png
「 その 2 は players.yml と タイムゾーンだろ」

CMD ./shogi-server --daemon /logs --max-identifier $MAX_IDENTIFIER $EVENT $PORT -e TZ=Asia/Tokyo & tail -F /logs/shogi-server.log

ramen-tabero-futsu2.png
「 👆 Dockerfile にタイムゾーンを足してみるぜ」

ramen-tabero-futsu2.png
「 フェイラー0、エラー31だぜ」

kifuwarabe-futsu.png
「 おかしいな……」

ruby TC_functional.rb

ramen-tabero-futsu2.png
「 👆 テストはいくつかのファイルに分かれているようだな」

20210518shogi85.png

ramen-tabero-futsu2.png
「 👆 localhost と書かれているのは4か所だぜ」

ohkina-hiyoko-futsu.png
「 Ruby にグローバル変数はないの?」

$localhost = "localhost"

ramen-tabero-futsu2.png
「 👆 これだけでいいと思うが、何を設定するんだぜ?」

kifuwarabe-futsu.png
「 Debian で hostname と打てだぜ」

20210518shogi86.png

ramen-tabero-futsu2.png
「 👆 何だぜ これ?」

kifuwarabe-futsu.png
「 それが localhost で指してほしかったホスト名だぜ」

20210518shogi87a1.png

ramen-tabero-futsu2.png
「 👆 接続先ではないのでは……」

ohkina-hiyoko-futsu.png
「 どこなら つながるのよ?」

kifuwarabe-futsu.png
「 ip a コマンドならどうだぜ?」

apt-get install -y iproute2

ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/sit 0.0.0.0 brd 0.0.0.0
26: eth0@if27: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

ramen-tabero-futsu2.png
「 👆 なんの情報もないぜ」

ohkina-hiyoko-futsu.png
「 将棋サーバーがまだ立ってないから テストできないということは?」

ramen-tabero-futsu2.png
「 ありえるぜ」

ruby shogi-server hoge 4000 &

jobs
[1]+  Running                 ruby shogi-server hoge 4000 &

cd test
ruby TC_ALL.rb

20210518shogi88.png

ramen-tabero-futsu2.png
「 👆 はい成功」

ohkina-hiyoko-futsu.png
「 でもなんで 将棋サーバー 立ってなかったの? Dockerfile の中で立てたんじゃないの?」

ramen-tabero-futsu2.png
「 調べたろ」

20210518shogi89.png

ramen-tabero-futsu2.png
「 👆 サーバーが立ってるときの curl はこんな感じ」

20210518shogi90.png

ramen-tabero-futsu2.png
「 👆 並べてみるか」

20210518shogi91.png

ramen-tabero-futsu2.png
「 👆 サーバーが立ってないときの curl はこんな感じ」

ohkina-hiyoko-futsu.png
「 じゃあ docker run してもサーバー立ってないのよ」

ramen-tabero-futsu2.png
「 Dockerfile 書き直すか……」

/
  shogi-server/
    shogi_server/
    shogi-server

ramen-tabero-futsu2.png
「 👆 shogi-server ディレクトリーの中に shogi_server ディレクトリがあったり、
shogi-server ディレクトリーの中に shogi-server ファイルが置いてないかだぜ?」

kifuwarabe-futsu.png
「 今までも、これからも そうだぜ」

20210518shogi93.png

ramen-tabero-futsu2.png
「 👆 logs ディレクトリー はどこに置いてある想定で、 shogi-server.log の中身は最初どのような内容を想定しているんだぜ?」

kifuwarabe-futsu.png
「 トップ階層に logs ディレクトリーがあって、その中に 内容が空っぽの shogi-server.log ファイルがある想定だろ」

2021-05-18T23:23:03 [INFO] WEBrick 1.3.1
2021-05-18T23:23:03 [INFO] ruby 2.3.3 (2016-11-21) [x86_64-linux-gnu]
2021-05-18T23:23:03 [INFO] server started [Revision: 20201206]
2021-05-18T23:23:03 [INFO] WEBrick::GenericServer#start: pid=13 port=4000

ramen-tabero-futsu2.png
「 👆 最初から4行入っているんだが」

ohkina-hiyoko-futsu.png
「 ファイルが無くて作ったというメッセージの直後にサーバーが起動して、その4行が書き込まれてるんじゃない?」

touch /logs/shogi-server.log

ramen-tabero-futsu2.png
「 👆 ファイルが無いと思われる前に、空ファイルを作ってしまうかだぜ?」

ramen-tabero-futsu2.png
「 意味なかった。
サーバーの shogi-server.log ファイルと、テストの shogi-server.log は別物にしないといけないということはないかだぜ?」

kifuwarabe-futsu.png
「 普通に考えて、そうだろ」

/logs    # テスト用のlogsフォルダは第一階層固定
/shogi-server/logs    # サーバー用のlogsフォルダはどこでもいいので仮にここにする

ramen-tabero-futsu2.png
「 👆 これでもダメなようだなあ」

# 間違い?
cd /shogi-server
ruby shogi-server 以下略

# こうする?
ruby /shogi-server/shogi-server 以下略

ramen-tabero-futsu2.png
「 👆 これも意味ない」

20210518shogi94a1.png

ohkina-hiyoko-futsu.png
「 テスト用のログ・ディレクトリーは、 TC_functional.rb ファイルの1階層上にあるんじゃない?」

/logs/shogi-server-docker.log    # tail -f で流してるログは、ここにする
/shogi-server/logs    # デーモンのlogsフォルダはどこでもいいので仮にここにする。テストはここのlogsフォルダを見る?

ramen-tabero-futsu2.png
「 👆 tail -f で流してるログが邪魔してるんじゃないかだぜ? こう分けたろ」

tail -f /dev/null

ramen-tabero-futsu2.png
「 👆 意図は、こうなのかだぜ?」

ramen-tabero-futsu2.png
「 ログ・ディレクトリーって 年、月、日 の3階層で出てくるのかだぜ?」

20210518shogi95a1.png

ramen-tabero-futsu2.png
「 👆 これ、 logs ディレクトリーのテストではないのでは」

kifuwarabe-futsu.png
「 気づいたか」

ramen-tabero-futsu2.png
「 多分 コマンドを呼び出すときの カレント・ディレクトリをどこかで1階層ずらしてしまってるんだぜ。 Docker使い慣れてないしな」

kifuwarabe-futsu.png
「 直せだぜ」

ramen-tabero-futsu2.png
「 違うぜ。カレント・ディレクトリに さまざまなファイルが出力されるんだぜ。
だから カレント・ディレクトリは logs ディレクトリに合わせておかなければいけないんだぜ」

kifuwarabe-futsu.png
「 じゃあ そうしろだぜ」

ruby shogi-server --daemon /logs 以下略

ramen-tabero-futsu2.png
「 👆 上記のように デーモンのディレクトリを logs にすると、いろんなものがそこに書き出されるぜ。
テストをするときは このコマンドを打鍵してはいけないのでは」

ruby shogi-server test 4000 --daemon . 以下略

ramen-tabero-futsu2.png
「 👆 ダメだ動かね。何かしらないがフリーズするぜ」

kifuwarabe-futsu.png
「 --daemon のところに . ではダメなのでは?」

20210518shogi96.png

ramen-tabero-futsu2.png
「 👆 テスト中に 起こったり 起こらなかったりする Reader thread interrupted も何か分かんね」

tail -f /shogi-server/shogi-server.log

ramen-tabero-futsu2.png
「 👆 こうしてみよ」

20210518shogi98.png

ramen-tabero-futsu2.png
「 👆 ログインはできるが、対局は始まらないのな」

kifuwarabe-futsu.png
「 フラッドゲートって 何時0分とか 何時30分に始まるのでは?」

ramen-tabero-futsu2.png
「 👆 じゃあ待つか」

20210519shogi99.png

ramen-tabero-futsu2.png
「 👆 ポート変えたらすぐ動いた。 無印のサーバー対局はポート 4081、フラッドゲートのサーバーと、テストのときは ポート 4000 かな」

次の記事:shogi-serverのソースを読んでいこうぜ(^~^)

何度でもクリック!→

むずでょ

光速のアカウント凍結されちゃったんで……。ゲームプログラムを独習中なんだぜ☆電王戦IIに出た棋士もコンピューターもみんな好きだぜ☆▲(パソコン将棋)WCSC29一次予選36位、SDT5予選42位▲(パソコン囲碁)AI竜星戦予選16位

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!

ボードとは?

むずでょ の最近の記事