Go言語使いにくいけど頑張る

Go言語とやらを会社で薦められたので使っているが、私のようなコードを書かない一介のインフラエンジニアには使いづらいので、ストレス解消にどこが使いづらいのか、書いておく。慣れれば多分大丈夫なんだろうけど

  • 型の場所が補完ないとわかんなくなる。var aaa stringか?stringか?[]stringか?:=か?みたいになる(今も
  • テキストファイルを開く処理を書くだけでなんか長い。
  • VSCodeでとりあえず書いてるけど、関数書くと初心者つまずき系のエラーめっちゃ出る
  • 何だかんだClassがほしい。ポインタ書くの不安だなーって思う。C言語のトラウマかな
  • これは本当にWeb用なのかと思ってしまった。とは言え低レベルのはRustのイメージ

並列処理?を書くと楽しい言語なんだろうけど、それにしてもその他のことがやりにくい気がしている。
インフラやってると何だかんだ言語のパフォーマンスなんてAWSのオートスケールとかマネージドななんかでカバーしてやるわいって気分になるんスよね。
TypescriptかKotlinの方がよい気がするが、インフラはGo使うことになったのでこれで書くか。
なんかFor文IF文IF文FOR文みたいなコード書いてると罪悪感がすごい。
コードの上手い下手置いといて、テクニカルなことしてるだけで安心感あったんだなって
なんか巷のとりあえずPHPとかRubyのアプリをGo言語に書き直す系の案件とか、ホント無駄なことやってんなって思っちゃうんですよね。
塩漬け出来るメリットを強調するならJavaかKotlinでいい気もする。
短いAWS Lambdaのブループリントに毛が生えた程度のコードばっかりで見ててつまんないなー

なんかPythonJavaとJSでええやん感がパない。俺もオッサンなんかなー。

Go言語使いにくいけど頑張る

Go言語とやらを会社で薦められたので使っているが、私のようなコードを書かない一介のインフラエンジニアには使いづらいので、ストレス解消にどこが使いづらいのか、書いておく。慣れれば多分大丈夫なんだろうけど

  • 型の場所が補完ないとわかんなくなる。var aaa stringか?stringか?[]stringか?:=か?みたいになる(今も
  • テキストファイルを開く処理を書くだけでなんか長い。
  • VSCodeでとりあえず書いてるけど、関数書くと初心者つまずき系のエラーめっちゃ出る
  • 何だかんだClassがほしい。ポインタ書くの不安だなーって思う。C言語のトラウマかな
  • これは本当にWeb用なのかと思ってしまった。とは言え低レベルのはRustのイメージ

TypescriptかKotlinの方がよい気がするが、インフラはGo使うことになったのでこれで書くか。
けど、短くてつまんないAWS Lambdaのブループリントに毛が生えた程度のコードばっかりで見ててつまんないなー

俺のmacでpipがこんなに動かないワケがない

自宅のOSXにansibleを入れようとしてpython2系のpipを叩いた時、
必ずコケていたのだが、調査していなかった。

通常python3で事足りるが、ansibleはpython2が必要なため導入を試みる。
早速、コマンドを実行しよう。

# pip install ansible
OSError: [Errno 1] Operation not permitted: '/tmp/pip-Es6ZOZ-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six-1.4.1-py2.7.egg-info'

なんてこった。やっぱりpipがコケた。
windowsから切り替えれば乗りきれると思ってたpip地獄。
しかし、下記のブログを参照し

www.starlod.net

OS X EI Capitanで導入されたファイルロックであることを知る。

ならどうするか?

misos.hatenablog.com

pipに限った話なので今回は上記の方法を取ることに。よって

# pip install ansible -U --ignore-installed six

を実施すると、うまく行きました。

しかし、これって他のboto3, s3cmdとかpipではいるんですかね?

ためしてみるとbotoは入ったが、s3cmdは入らず。エラーの内容は特定のディレクトリ配下にshareフォルダを作れなかったから。
#ルートになってから、手動で試してもpermissionがないと言われたのでお手上げ侍。
下記コマンドを入力して気づいたが、python2をbrewでもシステムネイティブでもないものをいつの間にやら入れていた様子。

# brew doctor
Warning: Python is installed at /Library/Frameworks/Python.framework

Homebrew only supports building against the System-provided Python or a
brewed Python. In particular, Pythons installed to /Library can interfere
with other software installs.

それならいっそ消すかvirtualenvですかね。消すのは忍びないのですが。。
一旦必要な物は揃いましたのでこの辺で

やべぇ、社会人ナメてた

オペレータという職業柄か毎日がせわしない。
研究をしていた時と比べると自分の時間がほぼないという環境は新鮮だ。(嫌というわけでもない。慣れた)
問題を新たにひねり出すよりも、いかにミスなく不測の事態を乗り切るのかという問題に突き当たることが多い。
ただ、業務方法について問題提起する姿勢は持っている。
このブログの存在を忘れるほどに、サーバエンジニアライフを満喫していた。
今の僕は、物理サーバの組み立てからミドルウェアのインストールまでささっとできるようにはなったけど、
どうにも数学やその他SPIで問われるような能力は著しく低下しているようだ。
ともあれ、スキルアップを加速させていきたい次第。
今の仕事も人間関係良好で楽しいのだけれども、もっともっと向学したいね。
転職を視野にいれて動いてます。

サーバエンジニア(Webオペレータ)やってます

会社に入って色々と切磋琢磨する日々。
なにかブログの記事にできるようなものがあればと思い、
現在再開予定っす。
今後は、サーバ関連の記事になります。
まぁ、Qiitaググったら出てくるような内容なんですが、
変わった内容についても随時触れていくことができればいいなと思っております。

内包表記の表現力

  • リスト内包表記でできること

よく、pythonのリスト内包表記っていうと用例としては、

[x ** 2 for x in range(10) if x % 2 == 0]

のようなワンライナーが引っかかります。通常のfor文のように複数の処理を書くことって出来ないと思ってやってました。たとえば、

c = C()
for i in range(10):
    c.method()
    print(i)

 こんな感じのどこにでもある処理を内包表記で書けないかなっと。ただ、そうすることの意味ってあんまりないように思えるし、内包表記の中はインデントが整ってなくてもいいので、そもそもインデントが整ってるfor文の形式の方がpythonの禅にかなってるのかなとは思ってるんですが。思いついたのがこちら

>>> c = C()
>>> [[c.method(), print(i)] for i in range(3)]
0
1
2
[[Object, None], [Object, None], [Object, None]]

ああ、そうかたったこれだけで済んだんだ。けどこういう書き方見かけないなぁ。(レベルの低いこと言ってたらすいません)とりあえず、メソッドや組み込み関数が返す値がリストに入る。

>>> c = C()
>>> [[c.method(), print(i)][0] for i in range(10)]
0
1
2
[Object, Object, Object]

いらない値は抜き取ることも容易です。

 二つの場合でランダムウォークするシミュレーションを書いてみる。

import random

Lx = 100
Ly = 100
N = 5
T = 2

class Agent:
    
    def __init__(self):
        self.pos = dict(x=random.randint(1,Lx),
                        y=random.randint(1,Ly))
        self.min = dict(dx=Lx,dy=Ly)

    def __str__(self):
        #return str(vars(self))
        return "x: {} y: {}".format(self.pos["x"], self.pos["y"])

    def random_walk(a):
        rr = random.random()
        if rr < 1/4:
            a.pos["x"] += 1
        elif rr < 1/2:
            a.pos["x"] -= 1
        elif rr < 3/4:
            a.pos["y"] += 1
        elif rr < 1:
            a.pos["y"] -= 1
        return a

if __name__ == "__main__":
    c = Agent()
    cs = [Agent() for i in range(N)]
    #いつもの書き方
    for j in range(T):
        print("timer: {}".format(j))
        for i in range(N):
            print(cs[i])
            cs[i].random_walk()

    #インデントぐちゃぐちゃ    
    [[[print("timer: {}".format(j))],
            [[print(cs[i]),
              cs[i].random_walk()]
             for i in range(N)]]
     for j in range(T)]

インデントから逃げたら括弧の嵐になっちゃったね。