水面下の夢

競プロやイラストに興味があります.メインブログがここ.同人サークル「かのらぶ」のページはこっち( https://yumechi0525.amebaownd.com ).ブログアイコンはYaQ(@8_9_00)さんから.

単純な文字列置換ならsedで事足りた

Pythonで記事を書こうと思ったけど、はい。

あるファイルに含まれる文字列httpをhttpsに変えようと思った。結論はsedを使えばいい。ただ、私が考えたフロートしては、

  1. pyhtonでファイル開いて文字列を置き換えて保存すればいいか
  2. でもわざわざpython書かなくても、vimで開いて文字列置換で良くない?文字列も長いわけじゃないし
  3. vimで開くのもめんどくさいし、コマンドラインからvimでゴニョゴニョすればいいのでは
  4. sedってコマンドあるわ…これだわ…

と長い過程を踏んでしまった。つまり、

sed -i -e 's/http/https/g' source.txt

を最終的には書いて、中身を確認した。

この話、何が言いたいかといえば、効率よく目的を達成するためのツールは知っておくと得をするということ。

おそらく今回の場合ではsedで書くよりも短くなるパターンは無いだろうけど、1、2の段階では特に何か短くする方法を考えないといけない。 が、普段から1つの方法ばかりやっている人だと、見えてこないかもしれない(私もココで思考停止してしまう場合もある)

今回はたまたま「そういえばこんなのがあったような…」と思い出せたから良かったが、もし1の方法を取っていたらデバッグ含めて結構時間がかかったと思う(ぱぱっと書くけど、バグらせないとは言い切れない)

というわけで、いつも意識していることだけれども、自分がよく使う道具は使い込んでおくことが大事である。

言語であればライブラリとかフレームワークの存在を知っておくとか、標準の書き方をよく知っておくとか。

普段から勉強することは大切ですねえ(白目

学びについて考えたい

よく頭がないので。

私の中の結論

その物事について自分自身で問題解決が行なえ、意見や疑問点を明確に挙げることが出来て初めて学んだと言える。(活用できてなんぼというあれ)

自分がダメだった所

(うだうだ書いてたらわからなくなったので消した)

今年は勉強会によく参加する1年になりました。その中で最初の方の勉強会の参加方法は良くなかったなと反省しています。

何が良くなかったのか? 最近、原因がはっきりしてきたように思える。

話をまとめられない

考えを体系的にまとめることを前提に話を聞けていないのが問題でした。

正直、勉強会のいいところは体系的に学べるところと暗黙的に学べるところを短時間でいいとこ取りできることや、その分野の詳しい人に直接聞くことが出来る機会だと思います。

ですが、それを自分の中だけで閉じておくと、何を学んだのかが曖昧になり、やがて忘れてしまいます。(現にもう覚えてない公演がいくつかある)

ブログで必ずしも公開する必要はないですが、必ずメモだけではなく後から見返した時にまとめておくことが重要であると感じました。

質問ができない

まとめられないに関連して、講師に質問ができないことが多かったなと思います。

最近は気になるところや省略されているところで詳細に聞きたいところなどを聞けるようになりました。 質問をするためには、それなりに話の内容を理解する必要があります。場合によっては予習して参加するくらいでもいいかなと思います。

とにかく話を有意義に聞くための努力をすれば、詳細に聞きたいことが溢れてくるので質問が自然とできる… というのが正しいフローのように思えてきました。

勉強会以外のところで頑張れていない

2パートあるので、ココだけは分けます。

勉強会に行くことで勉強しているつもりになっていた

よく言われるなんとかループです。勉強会とちょっとやった独学で折れるやつ。これ若干勉強会行き始めたときは陥りやすいよねと思う。

勉強会に行って理解できることは氷山の一角です。氷山の大きさを知るためには自分自身で潜っていく必要があります。(もちろん、場合によってはこの分野は合わないと思って捨てるのも正しい、なぜなら人生は有限で優先順位は人によって異なるから)

特にエンジニア勉強会の場合は実践できてなんぼだと思います。冒頭の結論にも書いたとおりですが、自分自身で実践できなければ意味がないので。学んだからには価値を出さないといけないよなあ… ということを最近は意識しています。

勉強会以外の人を繋げるイベントでの努力不足

特に懇親会とか、交流会のことを指しています。ここって実は有用なことを気軽に聞く最大のチャンスなんですよね。

私はお酒が苦手なことを理由にこれまで遠慮しがちでしたが、少し攻めていい情報を得たり、互いの共通点を見つけて盛り上がって仲良くなったり(今後につながる)、といい事だらけだなと思いました。

社会に出て大事なのは会社で仲のいい人の数もそうですが、会社以外で仲のいい人をどれだけ見つけるか、というところも鍵になってくるんじゃないだろうか、と最近は思います。

理由は明確で、 - 客観的な視点で自分を見つめられる - 会社に所属している人とは全く違うタイプの人と出会うことがある(価値観が広がる) - 勉強会の講師も壇上では立派に振る舞っているけど、実は人間味溢れる人と感じること(憧れではなく、等身大の人である、偶像ではない、と感じること。壁を感じない)

とか、そんなものがあります。今回が本番だという極端な人もいますが正論だと感じることもあります。(勉強会に価値がなかった、という意味ではありません)

まとめ

良くも悪くもアウトプットするためのインプット、インプットするためのアウトプットを意識できるようになり、より多くの情報を取り扱ったり、深く1つのことを調べる能力が磨かれたように、今年1年は感じました。(去年もったいなかったなあ)

最初の結論に戻りますが、学ぶことで(インプット)、自分自身で問題解決が行なえ(アウトプット)、意見や疑問点を挙げられる(更なるインプット、アウトプットへの道)、ということを身につけられたのかなあと思います。

まだまだ荒削りな部分はありますが、これからも実践ベースで学んでいきたいですね。勉強会だけではなく、自主的な勉強も欠かさないようにして。

進捗ないですマークの回答(Python3)

回答期限を過ぎましたので、公開いたします。

このシリーズ、毎回手慣らしで解いてる気がする。

進捗ないですマーク

問題の要約

入力値nが奇数のとき、Nを描くような出力をすること。偶数の場合は無理ですといえば良い。

回答方針

Nを書く際に塗りつぶされるマスは両端と、各入力項目についてi番目となるものになるため、i行目について、array[i][0], array[i][i], array[i][n-1] がそれぞれnとなれば良い。

割りときれいに書ける。Pythonは文字列をインデックスアクセスして置き換えることが出来ないため、ilstで持つ必要がある点に注意。つまり、ansの初期化で、["." * n for _ in range(n)] はNGで、[["." for _ in range(n)] for _ in range(n)] はOKとなる。

def solve():
    n = int(input())
    if n % 2 == 0:
        print("invalid")
        return
    ans = [["." for _ in range(n)] for _ in range(n)]
    for i in range(n):
        ans[i][0] = ans[i][-1] = ans[i][i] = "n"
    for e in ans:
        print("".join(e))


if __name__ == "__main__":
    solve()

感想

これ初心者向けにちょうどいいかもなーと思い始めたので、まず競技プログラミングに興味持ってくれた人とか、コーディングスキル試験対策したい人とかにおすすめするべきでは?と思い始めた。あとPythonばっかり書いてないで、Rubyで解いたりしようかな。

余談

ついでに解いた文字列のパースの問題が若干辛かった。 興味がある方は、ソースコードからコメントを抽出しよう やってみてください。