だるろぐ

だるいぶろぐです

近況 ややつらい

2桁年perlだけ書いてたが異動してjavaとkotlinを書くようになってしばらく。

異動前にくだらないことがあって長い間、多分1年くらい?分からん。仕事になってなかった。ほぼ開発者として頭を使ってなかった状態に思う。

それを言い訳とするわけじゃないがjavaとkotlinがむずい。というかspring bootがつらい。
configという名前空間の役割が設定値の参照からbean作成になったり、vimとターミナルとブラウザで全てが済んでいたのが Intellij IDEA が必要になったり、開発はリモートで全てが済んでいたのがローカルで bootRun することになってmacbookが熱くなったりとかそういうのに躓きつつ進んでいるが歩みが非常に遅い。頭を使ってなかった期間でほぼ使い物にならなくなった。
リモートワークでは椅子や机を揃えても集中できないのは個人差もあるので置いとく。
perlでは処理を追うときは呼び出し元を追ってモジュールを見る、ときには適当にダンプを挟むというのを繰り返す、ログを見ればどこで何が起きたか簡潔に分かる、というのだったが、javaは処理を追おうとするとinterfaceの宣言に辿り着いてこのbeanどこで作ってんだよとかブレークポイント挟んでデバッガしても起動まで1〜3分かかったりするしマシンは熱いし変数に代入してない箇所の結果は見方分からんしログはスタックトレースが長文だし、もうつらい。
みたいなことをしつつもそれなりに慣れてきたところで、悪くなった頭が悪いのか元々性能が低かったのかどっちなのか分からないがとにかく今現在も悪いし低い。
一例として。
[1-9]の間の値を取りうるDBの値がありそれがElasticsearchにインポートされててアプリからはesを引いていて、任意の検索結果において 3 を先頭にするようなソートの実装が必要になり。
(1,4,7,5,5,3,4,9) みたいなのが来たら (3,1,4,7,5,5,4,9) にするような。
さてどうしよう、 Stream.filter.sortでできんの?それともesのscript sort?mysqlのcase when的なのできんのかなと悩んでいた。
が相談した結果、esで別フィールド用意して例の値が3なら10、それ以外なら0とかの重みを付けて単純にそれでソートしたらええやんと。
そんな簡単な発想が出てこなかった。
正直に言うとブランクがあろうがこれは厳しい。かなり厳しい。無理。
重みを別カラムに用意してそれでソートなんてやったことあるのに。



元の頭がよくないのに加えてperlしかやってなかったのが響く。
とはいえ同僚たちはここまで酷いことにならず皆javaに慣れている。
perlがどうこうではなく単に今までは何を実装するにも頭の中で必要なパッケージと処理の流れを組み立てて書くだけだった。それでできていた。
javaはうまく言語化して説明できないが設計が実に大事。これが苦手。今でも慣れたとは言えない。
perlはメソッドに渡ってくる引数や、変数に何が入っているか分からない」というのをよく聞く。自分にはそれが分からない。処理を追えば分かるだろうと。何が分からないのか分からない。全ては書いてあるだろうと。
片や、javaなら引数やメソッドに型があるから追わなくても分かるよと。うーん・・・それはそうだが、javaは処理のスタックが異様に深い気がする。追っていくうちに脳のメモリが溢れる。そして型が書いてある利点は感じない。あって悪いとは言わないが特によかった覚えも今のところ無い。


みたいな感じで開発者として行き詰まっている。
年齢は関係ない。自分より年上の同僚たちは皆何も問題なくやっている。というか同僚が基本的に優秀なので比べることに意味がないが。年下の同僚たちも自分より能力が高いので。
開発の経験を活かして企画職へ、というよく聞くやつも多分自分の能力的に厳しい。
ゲームとかでステータスが 力・素早さ・魔力・体力・知力 とかのパラメータがあって任意に振り分けるみたいなのがある。
力に全振りしてパワー系統、魔力に特化して魔術系とか。
同僚は全パラメータ初期値が5で開発に多めに振って10で他パラメータも平均より高いとかだが、自分は全パラメータ初期値が1で開発に全振りしてようやく開発が5、他が0みたいな有様。振っちゃいけないパラメータ(コミュニケーション能力とか)まで開発に振ってようやく人並み。



特にオチはない。

yum reinstall

今まで yum でパッケージ管理してるソフトウェアの設定ファイルを書き換えまくりすぎて、元に戻したいけどバックアップ取ってねぇーってときは削除して入れ直してたけど、ふと man とか見たら reinstall というサブコマンドがあることを今更知った。
削除しようとすると依存解決でとんでもないもの削除しようとするので(postfix削除しようとするとcrontabまで道連れにしようとするとか)今度からこれでいいや。

Net::Google::Analytics::OAuth2 で google analytics api を叩こうとしたら refresh token が取得できなかった

google analytics には api*1 がある。
認証・認可には oauth2 を使う。authsub というのもあるみたいだけどどうやらこれから使うなら oauth2 使っとく方がいいらしい。


api を叩くための各種ライブラリ*2もある。
おいおい perl 無いじゃねーか、と思うと、載ってないだけで cpan にある*3
認証部分は Net::Google::Analytics::OAuth2 を使う。


よしこれを使おう、まずは pod に従い interactive メソッドで access_token / refresh_token を入手しよう、とすると中途半端に失敗するはず。access_token しか取れない。
実は最近 google 側の仕様変更があった*4ようで、 refresh token を受け取るにはパラメータを追加する必要がある。それにモジュールが追随してない。


というわけで。

--- a/lib/Net/Google/Analytics/OAuth2.pm
+++ b/lib/Net/Google/Analytics/OAuth2.pm
@@ -70,8 +70,9 @@ sub refresh_access_token {

 sub interactive {
     my $self = shift;
+    my $extra_params = @_ == 1 ? $_[0] : { @_ };

-    my $url = $self->authorize_url;
+    my $url = $self->authorize_url($extra_params);

とでもしてやって、

$oauth->interactive(
    approval_prompt => "force",
    access_type     => "offline",
);

とすると refresh token も取れる。
このモジュールは最近までメンテナンスされてるし github にあるので誰か pull req 送ったら世界が平和になる気がする。

叩く

たとえば

  • /you/want/page/path という uri に前方一致する
  • 2013/01/01-31 間の
  • pvの累計

が欲しいと思ったら

my $req = $analytics->new_request(
    ids         => "ga:$profile_id",
    dimensions  => "ga:pagePath",
    metrics     => "ga:Pageviews",
    filters     => "ga:pagePath=~/you/want/page/path",
    sort        => "-ga:Pageviews",
    start_date  => "2013-01-01",
    end_date    => "2013-01-31",
);

my $res = $analytics->retrieve($req);
$res->is_success or do {
    warn json->decode($res->content)->{error}->{message};
    exit;
};

my $pv = 0;
for my $row ( @{$res->rows} ) {
    $pv += $row->get_pageviews;
}
say $pv;

とかすると取れる。

python 2.4 の環境で autojump を使う

autojump は python 2.6 を要求するが入れたくないので 2.4 で動く古いバージョンを使っている。
配布元 に書いてある。

If you are unable to update Python to a supported version, older versions of autojump can be downloaded and installed manually.

 Python v2.4 is supported by release v12.


最新版とどのくらい違うかは知らないけどこれで十分。

Term::ANSIColorでターミナルに色付きで出力する

色々できるけど単純に color と colored だけ使って不便は無い。

use strict;
use warnings;
use Term::ANSIColor qw/colored/;

for my $c (qw/black red green yellow blue magenta cyan white/) {
    print colored(["$c"], "$c\t");
    print colored(["bright_$c"], "bright_$c\t");
    print colored(["on_$c"], "on_$c\t");
    print "\t" if length $c < 5;
    print colored(["on_bright_$c"], "on_bright_$c\t");
    print "\n";
}

for my $i (0..15) {
    print colored(["ansi$i"], "ansi$i\t");
    print colored(["grey$i"], "grey$i\t");
    print colored(["on_ansi$i"], "on_ansi$i\t");
    print colored(["on_grey$i"], "on_grey$i\t");
    print "\n";
}