Perl - AnyEventとかのメモ

AnyEventとかのイベント駆動のメモ

AnyEvent::Mac::Pasteboard

AnyEvent

  • 裏でイベントループが回り、コード上からループを隠蔽できる
  • ファイルの変更などのタイミングで駆動できる
  • LWP::UserAgentはブロッキングIO
  • AnyEventはhttp_getという非同期で呼び出す
    • JSみたいなコールバック地獄が生じる

リーダブルコード

Amazon CAPTCHA

今更ながら、買って一読した。余すとこなく良書という印象を受けた。

小さいコードを扱っているときや、自分だけがコミットするコードでは、リーダブルコードの内容は当たり前と思って問題に気づかないかもしれない。しかし、自分が詳しく知らない大規模なコードを触る際に、本書に書かれた内容を自分が本当に実践できるかが顕著に現れてくると思う。 自分の実体験を言うと、プロダクトコードを触る中でこの本に書かれた内容が実践されていないことが、有識者の方からのレビューで明らかになっており悲惨な気持ちになっている。

また、巻末の須藤さんによる解説に以下のようなコメントがあった。

「あなたがこれからプログラマとして信頼してもらえるコードを書くかどうかは本書に書いてあることを身につけるかどうかにかかっていると言ってもいい。もし身につけていないなら、少なくとも私は信頼しない。」

厳しい意見だが、こう言い切れるほどプログラマに必須な事項が書かれていると思う。

すぐわかるオブジェクト指向Perl

https://www.amazon.co.jp/dp/4774135046

Perl5のOOPがよくわかってない人向け。OOP自体を知ってても知らなくても、Perlの簡単なコードを見たことある人なら読める構成。

具体的には リファレンス, @INC, @ISA, Exporter, bless, use strict 'vars'; に引用符が必要な理由... などがよく分かってない人にはお薦め。

古い本(2008年4月末日)なので、最後に「お待ちかねのCGI」の説明があったが、今はPSGI(Plack)を使うことからそこだけ飛ばした。ただ、Perl後方互換性が強みの言語なので、10年前の本だから悪いということはないと思う。

Punycodeとは

Punycode(ピュニコード) とは、2003 年に定められた RFC3492 で国際化ドメイン名(IDN)の表現のためのエンコーディングルール

日本語ドメイン => xn--eckwd4c7c5976acvb2w6i

https://www.punycoder.com/

日本語JPドメイン名のPunycode変換・逆変換 - 日本語.jp

grepで該当行の前後を見る

-n で行数表示 -数字 で前後の表示行数指定 -A 数字 で該当行と下方向に行数指定 -B 数字 で該当行と上方向に行数指定

grep <string> -n -10
grep <string> -n -A 10
grep <string> -n -B 10

参考 grepで該当する行の前後も一緒に表示するには

protobuf で ./tests.sh cpp を動かす

v.3.5.1でテストを動かす。

リリース済みのもので2018/5/4現在で最新のタグを引っ張ってくる。以下の手順で ./test.sh cpp を回す。

brew upgrade gcc
brew upgrade gawk
./tests.sh cpp

gccgawkbrew upgradeが必要だった。Macgccは標準でclangだが、恐らくprotobufが見ているパスが異なるため、ちゃんと入れた。gawkは以下の記事と同じエラーが出たため記事の指示通りに対処した。

dyld: Library not loaded: /usr/local/opt/mpfr/lib/libmpfr.4.dylib Referenced from: /usr/local/bin/awk Reason: image not found - Qiita

commit id: 92898e9e (2018/5/4現在のmaster) で動かす。

上の操作を行ったあと、masterブランチでも ./test.sh cpp を試す。

Making check in .
(CDPATH="${ZSH_VERSION+.}:" && cd . && /bin/sh /path/to/protobuf/missing autoheader)
rm -f stamp-h1
touch config.h.in
cd . && /bin/sh ./config.status config.h
config.status: creating config.h
/Applications/Xcode.app/Contents/Developer/usr/bin/make  check-local
Making lib/libgmock.a lib/libgmock_main.a in gmock
make[3]: *** No rule to make target `lib/libgtest.la'.  Stop.
make[2]: *** [check-local] Error 2
make[1]: *** [check-am] Error 2
make: *** [check-recursive] Error 1
++ cat src/test-suite.log
================================================
   Protocol Buffers 3.5.1: src/test-suite.log
================================================

# TOTAL: 7
# PASS:  7
# SKIP:  0
# XFAIL: 0
# FAIL:  0
# XPASS: 0
# ERROR: 0

.. contents:: :depth: 2

++ false

原因がわからず、ディレクトリを眺めたら、"autogen.sh" が存在していたので

./autogen.sh
./configure
./test.sh

の実行によって、テストが進行するようになったが、以下で落ちた。

no_warning_test.cc:2:10: fatal error: 'google/protobuf/stubs/atomic_sequence_num.h' file not found
#include <google/protobuf/stubs/atomic_sequence_num.h>
         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
mv -f google/protobuf/.deps/protobuf_lite_arena_test-arena_test_util.Tpo google/protobuf/.deps/protobuf_lite_arena_test-arena_test_util.Po
depbase=`echo google/protobuf/testing/zcgzip.o | sed 's|[^/]*$|.deps/&|;s|\.o$||'`;\
    g++ -std=c++11 -DHAVE_CONFIG_H -I. -I..    -Qunused-arguments -pthread -DHAVE_PTHREAD=1 -DHAVE_ZLIB=1 -Wall -Wno-sign-compare -O2 -g -DNDEBUG -MT google/protobuf/testing/zcgzip.o -MD -MP -MF $depbase.Tpo -c -o google/protobuf/testing/zcgzip.o google/protobuf/testing/zcgzip.cc &&\
    mv -f $depbase.Tpo $depbase.Po
depbase=`echo google/protobuf/testing/zcgunzip.o | sed 's|[^/]*$|.deps/&|;s|\.o$||'`;\
    g++ -std=c++11 -DHAVE_CONFIG_H -I. -I..    -Qunused-arguments -pthread -DHAVE_PTHREAD=1 -DHAVE_ZLIB=1 -Wall -Wno-sign-compare -O2 -g -DNDEBUG -MT google/protobuf/testing/zcgunzip.o -MD -MP -MF $depbase.Tpo -c -o google/protobuf/testing/zcgunzip.o google/protobuf/testing/zcgunzip.cc &&\
    mv -f $depbase.Tpo $depbase.Po
1 error generated.
make[2]: *** [no_warning_test-no_warning_test.o] Error 1
make[2]: *** Waiting for unfinished jobs....
make[1]: *** [check-am] Error 2
make: *** [check-recursive] Error 1
++ cat src/test-suite.log
================================================
   Protocol Buffers 3.5.1: src/test-suite.log
================================================

# TOTAL: 7
# PASS:  7
# SKIP:  0
# XFAIL: 0
# FAIL:  0
# XPASS: 0
# ERROR: 0

.. contents:: :depth: 2

++ false

何らかのヘッダがinstallされていない。以下を実行した後、再度試す。 master環境のヘッダがグローバルに入り込んでいいのかという問題はあるが、ひとまず置いておく。

make && make install

何もしない時間を削る

そうそう。世の中のライフハックとかって「効率を上げよう」とするんだけれども、僕の中で一番重要なのは「何にもしない時間を削ること」なんです。何もしない時間は生まれる原因には、腰が重いとか、別のところでストレスを受けてしまって心の治療に時間を使っているとかがあるわけです。そういう何もしない原因を解決して、何にもやってない時間を削ると、ライフハックなどで効率を1割2割改善しようと頑張らなくても結構なパフォーマンスが出る。

cite: カーネルハッカー・小崎資広の「コードを読む技術」 | サイボウズ式

何もしない時間が最近増えてきて気合いのせいかと思ってたが、精神状態の修復に時間食ってたのか。

精神を蝕む原因が自分にあるのなら、他人にあるよりはずっと容易に治しようがあるので元気を出すと良い。

一般に悩む人ほど学習してない・努力してないとか、半ば根性論的な話を受けるものだが、そういうのを真に受けると悪循環になるのもこういったところが理由。人に言われ慣れて自分で言うようになるのも辞めたほうが身のため。