主夫ときどきプログラマ

データベース、Webエンジニアリング、コミュニティ、etc

じぶん Release Notes (ver 0.38.8)

f:id:masayuki14:20200818081401j:plain

masayuki14(ver 0.38.8)がリリースされました。更新内容は下記のとおりです。

1月は環境になれたり仕事をこなすので結構たいへんだった。2つの案件を並行してやるのは大変だしどっちも慣れてないっていうストレスがある。成果も思ったように出せているか疑問っていうストレスもある。そこはしょうがないところもあるけど、自分なりには精一杯やったつもりだ。詳細は後述。

今月はというか今クールはいろいろ見たいアニメがあって、楽しみが多くて良い。進撃の巨人は最後どうなるんでしょうね。コミックとアニメでメディアミックスとかあるんだろうか。ほかはワールドトリガー約束のネバーランドゆるキャン、Re:ゼロ、呪術廻戦、転生したらスライムだった件、ってとこですかね。しらないだけでまだまだ面白いものあるんだろうなぁ。

コテンラジオを知って聞くようになった。すげー面白い。影響されやすいタイプなので最近は子供との図書館ついでに歴史系の本を借りている。ざっくりした日本史の本を読んでいて、気になるところを深めていくスタイルでいく。

某社からカジュアル面談のコンタクトがあったので応じた。業界の有名企業。いままで20回くらい?のカジュアル面談に応じてきたけど、一番ちゃんとしてたし、先方の布陣にも抜かりがなかった。この時点でちゃんとした企業だとわかるし、採用活動に真摯に取りくでいるのがわかる。良い時間だった。

仕事

新しくジョインしたチームにもだいぶ慣れてきた。コミュニケーションもだいぶ取りやすくなった。チームの半分が社員で残りが業務委託っていう編成で、社員さんたちとはコミュニケーション取りやすいのだけど、他のメンバーとはほぼ関わる機会がなくて、そこんところ大丈夫なんだろうか、という感じがしている。いまのところその必要はない状況ではあるが。
DBに関わるタスクをやるうえで、知らない暗黙知とか、自分に都合のいい認知の歪みとか、いろいろ気をつけないといかんかったなぁということがあった。そういう部分は改善していきたい。

Tech

  • Rails

    • Modelのリファクタで association の重複があってテストがとおらずハマった。
    • MigrationでIndexのupdateはできん。removeしてaddだ。
    • Rake Task のテストは invoke すると2回目はskipされるから、executeのほうが良さそう。
  • MySQL

    • MySQL Shell のビルドがうまくいかんかった。手が止まってるからやっておきたい。
    • オンラインDDLをしらべた。

登録セキスペ

中小企業の情報セキュリティマネジメント指導業務が終わった。結果的に先方にも満足してもらえたようで安心した。なかなか大変だった。まとめのエントリーを書いているのでそのうち公開する。
これまでの更新に伴う講習や今回の件で、情報セキュリティに対する考えが変わってきた。今後需要も増えるだろうしせっかくここまでやってきたので、今後も中長期的に取り組んでいこうという気持ちになった。

健康

運動、平日禁酒は続いている。いい感じに継続できている。今月は献血に行って血液検査もしてもらおう。

はんなりPythonの読書会のおかげもあって、創造する心を読了した。読みやすい文章なのに、内容はしっかりしている。全体の量もほどよい。教育について色々考えさせられる。子供の認知マップを広げられるように経験を積ませてあげたい。
次はソーシャル物理学が課題図書だけど、ふつうに内容がむずくてつらい。ディスカッションの時は聞いていることが多いけど、それはそれで勉強になるので、食らいついていこうとおもう。

創造する心 ―これからの教育に必要なこと

創造する心 ―これからの教育に必要なこと

  • 作者:Marvin Minsky
  • 発売日: 2020/04/25
  • メディア: 単行本(ソフトカバー)

Try and Result

Result

AtCoder

幅優先探索のエントリーを書いた。

masayuki14.hatenablog.com

ABCにも1回参加して少しだけスコアが上がった。D問題をコンスタントに解けるようにならないと、緑にはいけなさそう。

早く寝る

寝られていない気がする。っていうか寝られていない。記録つけないといけないですね、これは。

Try

  • AtCoder継続。これまでより多めにやる。
  • 早く寝る、がんばる
  • 情報セキュリティの本を物色する
  • KaggleのPythonコースすすめる
  • 2020の振り返りできてない!

ってところでしょうか。

幅優先探索をマスターした

f:id:masayuki14:20201122142454j:plain

最近はあまりAtCoderできてなかったけど、勉強会で幅優先探索をやった。勉強会やっておけば強制的に時間をつくれるので、ゆるく長く続けるにはオススメ。

幅優先探索はQueueを使う

幅優先探索にはQueueを使う。Rubyでは配列を使えばよい。Queueに入れるときは push() で出すときは shift() を使う。

irb(main):001:0> q = []
=> []
irb(main):002:0> q.push(1)
=> [1]
irb(main):003:0> q.push(2)
=> [1, 2]
irb(main):004:0> q.shift()
=> 1
irb(main):005:0> q
=> [2]
irb(main):006:0> q.push(3)
=> [2, 3]
irb(main):007:0>

っていう感じ。

ABC 088 D - Grid Repainting

今回は AtCoder Beginner Contest 088 D - Grid Repainting の問題に取り組んだ。解けるまで60分位かかったので、実際のコンテストで出たら解けるかどうか・・・ギリギリのところだろう。

解のポイントとしては、迷路のスタートからゴールまでの最短距離を求めてやれば、あとは白マスの数から引き算すればいいよね、っていう問題。書いたコードはこちら。Queueには次に探索するマスをどんどん突っ込んで、順に進んでいくように実装する。

(H, W) = gets.chomp.split.map(&:to_i)
maze = readlines.map{ |l| l.chomp.split('') }

gx = H - 1
gy = W - 1

cost = Array.new(H) { Array.new(W) { nil } } # そのマスまでの距離
cost[0][0] = 1

q = [[0, 0]] # スタート座標

while q.length > 0 do
  (x, y) = q.shift

  # 次に進むマス
  [[x+1,y], [x-1,y], [x,y+1], [x,y-1]].each do |n|
    (nx, ny) = n
    # goalについた
    if nx == gx && ny == gy && cost[nx][ny].nil?
      cost[nx][ny] = cost[x][y] + 1
      break
    end

    # 次のマスが移動可能で、まだ行ってないなら進む
    if nx >= 0 && nx < H && ny >= 0 && ny < W && maze.[](nx)&.[](ny) == '.' && cost[nx][ny].nil?
      cost[nx][ny] = cost[x][y] + 1
      q.push([nx, ny])
    end
  end
end

if cost[gx][gy].nil?
  puts -1
else
  white = maze.flatten.reject{|m| m == '#'}.length
  puts white - cost[gx][gy]
end

はじめに書いたコードは、Queueに一度訪れた座標も突っ込んでしまっていたので、大きい迷路だとTLE(実行時間制限超過)になってしまっていた。このあたりもシュッと解けるようになりたいものですね。

優先度付きキュー : Priority Queue

キューの種類で優先度付きキューなるものがある。これはキューから取り出すとき、一番大きい(小さい)値から順に取り出してくれるもの。残念ながらRubyには組み込みでこれがないので、必要なときは自分で実装しないといけない。
いずれやってみたいところ。

さて、次回のはんなりプロコンAtCoder部はAtCoder Beginner Contest 180に取り組む企画となっております。ふるってご参加ください。

hannari-python.connpass.com

じぶん Release Notes (ver 0.38.7)

masayuki14(ver 0.38.7)がリリースされました。更新内容は下記のとおりです。

12月中旬から新しいチームにジョインしました。仕事が再開しました。引き続きRailsでの開発です。 登録セキスペも中小企業の情報セキュリティマネジメント指導業務で中小企業に指導に行くことになりました。終了期限がきまっているので、通常のスケジュールより余裕がない状況です。がんばります。 なんていうか、どちらの変化も12月後半に同時に起こってしまったので、なかなか大変な2週間でした。つまり前半の2週間のことがほぼ記憶にありません。なんてこった。まぁ大したことはしてなかったつーことか。

Tech

  • Rails
    • チームにジョインしたばかりなので、慣れることがメインな感じだった
    • 開発でコンテナが10個くらい使ってる。すごい。
    • ElasticSearchが使われたシステムなので、そのへんは知見をいただきたい感じ。
    • RubyのErrorとRegex周りの言語仕様に少し詳しくなった。 $! とか。

あんまりテック的なことはやってないけど、仕事を始めたのでまぁ良かったんじゃないか。

登録セキスペ

件の中小企業の情報セキュリティマネジメント指導業務をすることになった。年内に第1回の指導を実施する流れだった。
事前のオンライン講習を受けているものの、実際に指導業務をやるには事前の準備が大事なので、しっかり準備した。指導要領や事業内容の資料をあれやこれやと読みながら内容を理解するのは結構たいへんだった。

本番の指導1回目の前に事前の打ち合わせもさせてもらったし、すべての指導をオンラインでやることになったのでいろいろ対策も考えた。とはいえ1回目は指導要領とか指導用のツールが用意されているので、比較的スムーズに終えられた。おれは頑張った。次男だけど耐えられた。

しかし、2回目以降はだいぶ指導要領の想定と変わってきそうなので、非常にまずい。やばい。どうして良いかわからん。っていう感じだ。でもなんとか答えというか方針を出して指導しないといけない。しかも1月20日までに指導を終えないといけないという過密スケジュールなのでそれもつらい。初めてのことをやるのはストレスだし緊張するけど、なんとか乗り切って美味しいお酒を飲もう。

健康

運動

ジョギングを続けている。12月になってぐっと寒くなったので、昼に走るようになった。日差しが暖かい。午前中の仕事を終えたら30分ほど走って、ご飯たべて、午後の仕事再開、という流れになった。天気が悪かったり、疲労感があるときは長めのストレッチをするようにしたので、週3〜4日走っている。

登録セキスペの準備中はそれどころじゃなかったので1週間ほどおやすみしたら、再開時はけっこう辛かったし、体も固くなったので、やはり継続した運動は大事だ。

ネックウォーマーと手袋を新調した。昔ながらのジャージタイプのウインドブレーカー上下で走ってたので、ランニングウェアがほしいなぁと思い物色してみたら、コンプレッションタイツ、短パン、ウインドブレーカーというスタイルがほとんどだったので、とりあえず自前の登山ウェアで代用したら快適だった。色味が少し派手だがそれで走っている。快適。GoreTexバンザイ。

お酒の代用品

お酒の代わりに炭酸水を飲んでいたけど飽きた。自家製の生姜シロップで割ると辛いジンジャエールになってうまかったけど、作るのがちょっと手間なので、果物シロップでも作ってみようかと思い調べてみた。
角砂糖と好みの果物で簡単に作れそうだったので、手始めにリンゴ酢を作ってみた。結構美味しい。でもすっぱい。なくなったら次はキウイあたりで試してみる。

Try and Result

Result

AtCoderは継続。学んだことのアウトプットとしてブログを書きたい。

ブログは書いた。

masayuki14.hatenablog.com

ABCも一回参加した。ついに茶帯になった。少しでも進歩してるっていう結果がでるのは嬉しい。

atcoder.jp

情報セキュリティ10大脅威 2020:IPA 独立行政法人 情報処理推進機構を読んでまとめる。んで勉強会で話す。

12月のはんなりPythonでLTするように資料を作って用意してたんだけど、発表の時間が遅くなってしまったのでキャンセルした。 なので1月のはんなりPythonでLTする。タイトルは「情報セキュリティ10大脅威を年内におさらいしておこう

早く寝る。

あまりできてない。でも早く寝ると翌朝の目覚めがいいし、その日も良い一日になるのでもっと増やしたい。しかし謎の「早く寝たらもったいない病」にかかってしまっているのでなんとかならんかね。

Try

  • AtCoderは継続
  • 早く寝る。もう一度。

今月はあまり余裕がなさそうなので、こんな感じでお願いします。

Kaggleを始めたので1年後にはコンペに出れるようにぼちぼちやっていこう

この記事ははんなりPython Advent Calendar 2020 - Qiitaの23日目の記事です。

qiita.com

Kaggleをはじめました

はんなりPythonにKaggle部が発足したので、いっちょやってみようかっていう感じです。

hannari-python.connpass.com

初回のScrapBoxはこちら

scrapbox.io

毎月1回くらいの頻度で勉強会が開催される予定です。

思えばはんなりPythonが発足して3年が経ちますが、いっこうにPythonをやっていません。始めの頃はこれを機にPython勉強しようかな、と取り組んでいましたが長続きしませんでした。しかし今回はKaggleということで、Pythonっていうよりは機械学習的な、データサイエンス的な、よくわかりませんが、そんな感じです。何の目的もなくPython勉強しよう、ではなくてKaggleで問題解いていこうという目的があるので、なんとか続けられると思います。

Kaggleってなんなの?

Kaggleはいろんな機能があるぽいです。とりあえずコンペに参加すると、ある現象のデータと結果が与えられます。そこからその現象のモデルを作って、与えられるテストデータをぶっこんで、得られた結果を提出すると、OK/NGみたいな判定を貰えるようです。プロコンにも似ている。

ただ、モデルを作るためには機会学習やその他もろもろの知識が必要そうなのでそこは勉強しないといけない。できるんだろうか。

とりあえず「Courses」というメニューがあって様々な学習ができるので、とりあえずPythonから始めます。ふりだしに戻った感じですが、まぁやっていきます。1年後もPythonの勉強しているかもしれないし、Kaggleにハマってデータサイエンスやってるかもしれない。未来のことはわかりませんが、がんばります。

このあたりの本がおすすめらしいので年末年始に勉強してみようかなぁ。

Pythonで動かして学ぶ! Kaggleデータ分析入門 (AI & TECHNOLOGY)

Pythonで動かして学ぶ! Kaggleデータ分析入門 (AI & TECHNOLOGY)

  • 作者:篠田 裕之
  • 発売日: 2020/10/22
  • メディア: 単行本(ソフトカバー)

2次元累積和をまなぶ

AtCoderの勉強でかねてより累積和の勉強をすすめていた。一段落したので記録しておく。

参考にした記事はこちらです。

qiita.com

1次元累積和はけっこう簡単で、この記事を読めばだいたい理解できる。コードも1次元の配列を使うだけなのでわりとすんなりかける。 書き方によって配列要素のインデックスを +1 するのか -1 するのか気をつける程度でなので、1つの問題を解くのにもあまり時間がかからない。 例題をいくつか解けば手に馴染んでくる。

しかし、2次元累積和になるとちょっと話が変わってくる。

ゼータ変換のほうがわかりやすい?

2次元累積和を素直に考えると、以下の図のように考えて、このような式で求めていく

s[x+1][y+1] = s[x][y+1] + s[x+1][y] − s[x][y] + a[x][y]

https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F182963%2Ff94d6f36-3a8d-7e3d-81de-e4d68acbb8fe.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&s=88b71d707226179b6795816cf5dab162

引用元: https://qiita.com/drken/items/56a6b68edef8fc605821

でもこの方法は、ちょっと頭を使わないといけなくてx y の動きとs[x+1][y+1] の結果がなんかしっくりこない。 視覚的に動きを見えるようにしたら理解できた。可視化は理解の手助けになる。コードはRubyで書いた。

H, W = 4, 5
A = [
  [1, 1, 1, 1, 1],
  [1, 1, 1, 1, 1],
  [1, 1, 1, 1, 1],
  [1, 1, 1, 1, 1]
]

s = Array.new(H+1){ Array.new(W+1) { 0 } }

print "\e[H\e[2J"
(0...H).each do |i|
  (0...W).each do |j|
    s[i+1][j+1] = A[i][j] + s[i+1][j] + s[i][j+1] - s[i][j]
    puts "(%s, %s)" % [i, j]
    pp s
    sleep 1
    print "\e[H\e[2J"
  end
end

pp s

# 累積和の配列 s
# => [
#  [0, 0, 0, 0, 0, 0],
#  [0, 1, 2, 3, 4, 5],
#  [0, 2, 4, 6, 8, 10],
#  [0, 3, 6, 9, 12, 15],
#  [0, 4, 8, 12, 16, 20]
# ]

一方ゼータ変換で累積和を求める方は直観的に理解しやすく、コードも書きやすかった。

ゼータ変換はこちらで詳しく解説されています。

qiita.com

コードはこんな感じ

H, W = 4, 5
A = [
  [1, 1, 1, 1, 1],
  [1, 1, 1, 1, 1],
  [1, 1, 1, 1, 1],
  [1, 1, 1, 1, 1]
]

s = Array.new(H){ Array.new(W) { 0 } }
(0...H).each do |i|
  (0...W).each do |j|
    if i == 0
      s[i][j] = A[i][j]
    else
      s[i][j] = s[i-1][j] + A[i][j]
    end
  end
end

(0...H).each do |i|
  (0...W).each do |j|
    if j == 0
      s[i][j] += 0
    else
      s[i][j] += s[i][j-1]
    end
  end
end

pp s

# 累積和の配列 s
# => [
#  [1, 2, 3, 4, 5],
#  [2, 4, 6, 8, 10],
#  [3, 6, 9, 12, 15],
#  [4, 8, 12, 16, 20]
# ]

さて、累積和の計算結果は同じになったものの、配列の構造は若干異なっている。 その結果、ゼータ変換で作成された配列を実際の計算で使う場合は、配列インデックスが -1 になる場合や、始点と終点が重なる場合の計算など、あとから気を使う場面が増えてしまった。

どちらの方法が良いのか。

例題をどちらの方法でも説いたけど、前者のほうがコードの量も短くてすんだし、速度も出た。いろいろ考えてコードを書いてみた結果、理解が深まったのでこれからも前者のやり方をすると思う。

例題はABC005のD - おいしいたこ焼きの焼き方という問題。処理時間も前者のほうが 100ms 速かった。もちろんゼータ変換でも、もっと良い書き方があるはずだけど。

atcoder.jp

蟻本の目次には累積和がなくて、最近は離れてしまっていたけど、また改めて進めていきたい。

プロコンやりたい人は

はんなりPythonの勉強会でAtCoderに取り組む会をやっているので興味のある人は参加してみてください。参加者も徐々に増えつつあります。

hannari-python.connpass.com

hannari-python.connpass.com