主夫ときどきプログラマ

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

深さ優先探索をマスターした。

蟻本の序盤で出てくる深さ優先探索を練習すべくこの問題をやっていた。

atcoder.jp

最終的にこんな感じに落ち着いて、まぁ解説通りだろっていう感じです。

ENV[Z='RUBY_THREAD_VM_STACK_SIZE']||exec({Z=>'100000000'},'ruby',$0)
(N, M) = gets.chomp.split.map(&:to_i)
@a = readlines.map{|l| l.chomp.chars}
def search(x, y)
  return false unless x >= 0 && x < ::N && y >= 0 && y < ::M
  return false if @a[x][y] == '#'

  return true if @a[x][y] == 'g'

  @a[x][y] = '#'

  return true if search(x+1, y)
  return true if search(x, y+1)
  return true if search(x-1, y)
  return true if search(x, y-1)
  false
end

result = false

(0...N).each do |x|
  (0...M).each do |y|
    if @a[x][y] == 's'
      result = search(x, y)
    end
  end
end

puts result ? 'Yes' : 'No'

RUBY_THREAD_VM_STACK_SIZE を変更しないといけない

ただ、ここに至るにはいくつかの問題があって結構苦労した。 コード自体はわりとすぐ書けたんだけど、どうにもRuntimeErrorがでている。 しかも提出結果がREになるだけで、具体的にどんなエラーが出ているかわからない。 どうしようもないので、Rubyの正解コードを見ていると共通点があった。

RUBY_THREAD_VM_STACK_SIZE 環境変数を指定している。これは以下の通り。

RUBY_THREAD_VM_STACK_SIZE: スレッドを作る時に作成する VM スタックサイズ(デフォルト: 128KB (32bit CPU) or 256KB (64bit CPU)) https://magazine.rubyist.net/articles/0041/0041-200Special-note.html

どうやら再帰呼びだしのスタックが溢れちゃってRuntimeErrorがでるので、そのサイズを大きくしてエラーがでないようにしよう、ということ。 しかしRUBY_THREAD_VM_STACK_SIZE はプログラム実行中には変更できない仕様なので、

exec({'RUBY_THREAD_VM_STACK_SIZE'=>'100000000'}, 'ruby', $0)

としてスクリプトを再実行する必要がある。
らしい。
これは知らなかったらわからない案件ですね。

再帰関数内で変数使わないほうがいい

RUBY_THREAD_VM_STACK_SIZEの対処がわかって、これでイケるだろうと思ったけど今度はメモリ不足。
その時のコードはこんな感じ

def reach_goal?(x, y)
  dx = [ 0, 1, -1, 0]
  dy = [-1, 0,  0, 1]

  (0..3).each do |i|
    nx = x + dx[i]
    ny = y + dy[i]

    next unless nx >= 0 && nx < ::N && ny >= 0 && ny < ::M
    return true if @a[nx][ny] == 'g'
    next if @a[nx][ny] == '#'
    next if @reached[nx][ny]
    @reached[nx][ny] = true
    return true if reach_goal?(nx, ny)
  end

  return false
end

メソッドのコールスタックに配列とかループとかそのへんのデータを乗せる必要になるから、たぶんそういうことだろう。 それで、関数内の変数とかループとかをなくして、コールスタックに積むデータをなるべく減らすようにコードを改善したらクリアできた。めでたしめでたし。

わからない時は答えをみればよい

わからない時は正解のコードを見ればよい。アルゴリズム自体には問題はなかったけど、実装方法に問題があった、って感じだ。 わからない時は答えみればいいし、それで理解できたらいいのだ。
幸いAtCoderには解説のPDFとYouTube動画があるし、正解のコードもいろいろ見れるので、学ぶには良い環境だ。

こぼれ話は、原因がわからないときにRustでやってみようと思って試したけど、最初の迷路データをSTDINから取得する部分で詰んだ。Rustむずい。っていう話。

Ruby教材を Version 0.4.0 にアップデートしました

公開中のRuby学習用の教材のバージョンが 0.4.0 となりました。

Release Note

4章が追加されております。

4章 コマンドライン設計
    - 4-1 オプションによる挙動の制御
    - 4-2 optparse標準ライブラリを使う
    - 4-3 オプションの実装

4章はOptrionParserクラスを使って、コマンドオプションの実装を行っております。これは標準ライブラリなので、Gemのインストールは不要です。OptionPerserの使い方を解説し、スクレイピングコマンドにオプションの挙動を追加しています。

www.techpit.jp

なお、動画は作成済ですが、教材にはまだ反映されておりません。随時アップデートする予定です。

youtu.be

youtu.be

じぶん Release Notes (ver 0.37.9)

じぶんリリースノートなるものを知ったので、今月から月末にやってみようと思った。

makicamel.hatenablog.com

自分リリースノートについてはいろいろ記事があるっぽいのでそちらを御覧ください。自分が読んだのはこのあたり。

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

仕事

  • Rubyの学習教材をリリース
    • 0章から3章が執筆されています。
  • MENTAに登録し個人メンターを開始
  • スプーキーズアンバサダーの来期の活動方針をまとめる
  • 令和元年の確定申告をeTaxで提出
    • 記念すべき10回目!!

www.techpit.jp

Tech

  • AtCoderをはじめた
    • ビギナーコンテストに2回参加
    • D - Pairs に苦しんだがなんとか理解した。
  • MacBookAirにUbuntuをインストール
  • MySQL5.6日本語ドキュメントを読み始める

勉強会・イベント

読書

あそび

  • 建仁寺におでかけ
    • DA20-40mmLimitedを使いたかったがほとんど子供にカメラを奪われていた
    • 屏風絵も襖絵も天井絵もすばらしかった
    • 方丈の長い軒はどうやって建築されてるんだろう
  • イエモンのドーム公演
    • すばらしかった
  • King Gnu のアルバムをDL
    • 久しぶり音源を買った
    • すばらしかった

KPT

Keep

  • 今年は種蒔きする
  • TechPit執筆(5章、6章)
  • ビギナーコンテストに参加する

Problem

  • 集中力がない
  • やろうとしてることが多すぎな気がする

Try

じぶん Release Notes (ver 0.37.10) - 主夫ときどきプログラマ

2019年のふりかえり

f:id:masayuki14:20200228161312p:plain

2020年のオリンピックイヤーも2ヶ月が過ぎようとしていて、巷ではコロナウィルスで大騒ぎの今日このごろ、いかがお過ごしでしょうか。 私はやっと2019年を振り返る覚悟ができました。年々ふりかえりの時期が遅くなっている気がしますが、今回で5回目ということなので、今年もちゃんと振り返っていきたいと思います。

masayuki14.hatenablog.com

2019年にたてた目標

コミュニティ活動

OSS Gateは2018年には1回ワークショップを開催したのみで、他の活動はほとんどできていません。 2019年はより多くのワークショップを開催したいと思います。 はんなりPythonの会は運営メンバーも多く勉強会の定期開催もできています。先日のミートアップで2019年の方針がまとまったのですが、それをうまく推し進めていければ、OSS Gateの開催にも良い影響がでそうなので合わせて頑張っていきたいと思います。

2019年の目標 - 主夫ときどきプログラマ

OSS Gateのワークショップは1回開催しただけですが、規模感を考えると年1回というペースが良さそうです。
開催の記事はこちら。

OSS Gateワークショップ京都を開催しました - 主夫ときどきプログラマ

はんなりPythonはなかなか良い感じの一年だった。ただ個人的には開催を続けただけっていう、あまり実りのない感じだった。そのへんで感じたことを書いた記事はこちら。

Hanpy Dojo (はんぱいどうじょう)での雑感 - はんなりPythonの会月報

勉強会での発表

2018年は10回の発表を行いました。2019年はそれ以上が目標で、新しいコミュニティや勉強会でも発表していきます。

2019年の目標 - 主夫ときどきプログラマ

回数でいうと2019年は6回の発表だった。テーマはDockerとDBで新しいことに取り組んだ内容だったので、チャレンジできているというのは良かった。 ただ、前半の半年しか発表出来てなくて尻すぼみになったのがだめだ。

ブログなどのアウトプット

2019年は個人のブログの他にスプーキーズのちょっとTech。とはんなりPythonの会月報にも記事を書くことが増えそうなので、けっこう頑張らないといけなさそう。 月2くらいのペースで書ければと思っています。

2019年の目標 - 主夫ときどきプログラマ

これも月2ペースくらいというのは達成したんだけど、勉強会の発表と同様に前半の半年が活発で尻すぼみになったのがだめ。

Docker/Kubernetis

今年はKubernetesを使ってDockerコンテナをいい感じに使ってみます。

2019年の目標 - 主夫ときどきプログラマ

これはKubernetesもDockerも前年より使ったり学んだり出来たのでOK。Kubernetesは夏以降、仕事が忙しくなって何も出来なかったので今年も続けて頑張る。

仕事しすぎない

仕事以外のことをやるには意識して時間を作らないといけないことが2018年の1年間でわかったので、今年も仕事しすぎないでいきます

2019年の目標 - 主夫ときどきプログラマ

f:id:masayuki14:20200228153746p:plain

2018年と比べると88時間が減っている。前半はグラフから分かるように仕事以外の時間が結構あって、そのおかげでいろいろなインプットとアウトプットを出来ていたのがよく分かる。夏〜秋にかけて仕事が増えたので、そのせいもあって仕事外の活動が減った。そんで年末から仕事せずに、教材執筆ばかりやってたので、仕事ばっかしてるとあかん、ってのがよく分かる。

データベースを深める

DeveloperとしてSQLを使いこなしたり、DBAとしてデータベースの運用管理をしたり、今よりもデータベースエンジニアとしてワンランクアップを目指します。

2019年の目標 - 主夫ときどきプログラマ

けっこういろいろな本を読んだ。SQLの新しいテクニック的なものも覚えたし、MySQLPostgreSQLの両方でストアド・プロシージャやトリガーを使ったDB基盤の構築みたいなことが出来たので、全年よりいろいろできてよかった。発表や勉強会には参加できなかったので、今年はどうにかしたいところ。

チームビルディング/マネージメント的な何か

チームを作る予定もマネジメントする予定もないけど、今年はこの辺をちゃんと学んでみよう。

2019年の目標 - 主夫ときどきプログラマ

知人に勧められて「エンジニアリング組織論への招待」を読んだ。けっこう堅い内容もあったけど、良い本だった。 認知の話で、まさに書籍にでてくるような良くない状態の人が周りにいたので、コミュニケーションて大事だなぁと。 そして、引き続き、組織に入る予定はまったくない。

クリエイティブな活動

iPadProを買ったのでApple Pencilでお絵かきをしたい。今のところ子供がめっちゃ書いててあんまり使えない。 あと技術書典にサークルで参加して本を出す。

2019年の目標 - 主夫ときどきプログラマ

絵はチョロチョロ書いてるけど、まぁそんなもんかって感じだった。 技術書展ように本を書いてみようと思ったけど、かけるような題材とかネタが無くてどうしたものか、となってたけど、 縁あってTechPitで教材を書くことになり、先日リリースまで持っていけた。これは想定外のことで自分でも驚きです。

www.techpit.jp

筋トレ

落ち着いた筋肉、頭いい筋肉になる。

2019年の目標 - 主夫ときどきプログラマ

2ヶ月くらいは続いた気がする。これからは本当に体が資本っていう世の中になっていくので、今年こそなんとかしないといけない。根本的な何かをかえないと。

落ち着いた筋肉、頭いい筋肉になりたい。

MacBookAir11 mid 2011にUbuntu18.04をいれてつかう: Vim設定

Ubuntuのインストールは完了したものの、日本語環境とVimの設定をしないと使い勝手がいまいちなのでそのあたりをいじって使えるようにする。 前回のインストール周りの話はこちら。

masayuki14.hatenablog.com

CapsLockキーをControlキーに変える

US配列なのでCapsLockキーをControlキーに変えたい。Macの時はこの2つのキーを入れ替えたけど、UbuntuではCapsLockをControlに変えるだけのほうが簡単そうだった。CapsLockキーが使えなくなるけど、困らないのでそれでよい。キーボードの設定が /etc/default/keyboard にあるのでそこに設定を追加すれば良い。

$ cat /etc/default/keyboard 
XKBLAYOUT=us
XKBVARIANT=mac
BACKSPACE=guess

ここに

XKBOPTIONS="ctrl:nocaps"

これを追加して、再起動すれば反映される。インストール時のキーボード選択を間違えた場合もここで設定が可能。

キーボードの入力のIMシステムをFcitxに変える

これは後述するVimの設定絡みで必要になるもので、デフォルトでは iBus らしいのだけど、それだと都合が悪いので Fcitxに変える。 日本語の変換にはMozcがデフォルトで入っているので Fcitx + Mozc という組み合わせで日本語入力環境が提供されることになる。

fcitxとfcitx-mozcをインストールして、不要になるibusを削除する

$ sudo apt install fcitx fcitx-mozc -y

$ sudo apt purge ibus -y

インストール後に、言語サポートの設定で日本語のインストールとIMシステムでFictxを選び、Fcitx設定で好みのキーバインドを設定すればOK

Ubuntu 19.10の日本語入力をfcitx-mozcにする – 二代目俺のメモ

Ubuntu Unity 18.04 その13 - Fcitx + Mozcをインストールするには・日本語入力環境の変更 - kledgeb

この2つの記事がとても参考になった。

VimでEscしたときに日本語入力を自動で英字入力に変える

ぼくはエディタにVimを使うんですが、これを使う上で インサートモードから抜けたら自動で英字入力になる っていう機能は必須なんですよね。 これはデフォルトの機能では用意されてなくて、何らかのツールを使って実現する必要がある。 Linuxだと先にインストールしたFcitxがIMシステムとして使われていれば、VimScriptを使って設定が出来るとのこと。

まずは、この記事で紹介されているVimScriptとPythonスクリプトをダウンロードして、プラグインとして設置する。

www.kaoriya.net

とりあえずコマンドでも設置できる。

$ cd ~/.vim/plugin

$ curl -o fcitx-py.vim 'https://raw.githubusercontent.com/koron/imcsc-vim/master/fcitx-python/plugin/fcitx-py.vim'

$ curl -o fcitx-py.py 'https://raw.githubusercontent.com/koron/imcsc-vim/master/fcitx-python/plugin/fcitx-py.py'

これらスクリプトVimプラグインとして利用出来るので、あとは .vimrc に以下のように設定すればインサートモードでEscした時に英字入力になってくれる。

inoremap <ESC> <ESC>:set iminsert=0<CR>

ただ、いまんとこターミナルから起動するVimだとちゃんと動くけど、GVimだと動かない。そのうちなんとかしよう。

最低限の設定が終わった。

あとは tmux git zsh あたりをインストールしたら大概のことはできそうな気がした。各種コミュニケーションツールとは断絶されているPCなので、執筆専用機として当分は使う予定。 執筆終えたらMySQL8.0のソースビルドとかデバッグビルドとかで動かしてみたいと思っているが、どうやったら出来るかは今んとこさっぱりわからないよね。