koudenpaのブログ

趣味のブログです。株式会社はてなでWebアプリケーションエンジニアをやっています。職業柄IT関連の記事が多いと思います。

閉じたアラートも取れるようになったMackerelのAPIで勤怠を得んと欲す

月末ですね。

Mackerelアドベントカレンダーが明日から始まりますが、この試行は月末に価値があるので自称0日目の記事として書きます。

さて、みなさん、勤怠の記録は毎日つけていますか? 自分はまぁ、言わぬが華です。

Google MapのLogで毎日何時頃にオフィスにIn/Outしているのかを月末にチェックしているような人もいるようです。面倒くさいですね。

さて、Mackerelユーザーの作業用端末には当然 mackarel-agent が入っています。であるならば、閉じたアラートも取れるようになったMackerelのAPIでその電源On/Off時間(デフォルトで構成される connectivity アラート!)を得ることができます。これは相当に正確な出退勤時間ではないでしょうか?

前置きが長いですね。試しました。

mkr コマンドと jq コマンドの合わせ技です。

$ HOSTID=YOURHOSTID
$ mkr alerts -w | jq -r ".[] | select((.type == \"connectivity\") and (.hostId == \"$HOSTID\")) | [(.openedAt|tonumber|.+32400|todate), (.closedAt|tonumber|.+32400|todate)] | @csv"
"2018-11-30T09:52:03Z","2018-11-30T09:55:26Z"
"2018-11-30T06:31:03Z","2018-11-30T09:45:50Z"
"2018-11-30T04:54:03Z","2018-11-30T06:25:14Z"
"2018-11-30T01:18:03Z","2018-11-30T04:48:36Z"
"2018-11-29T23:30:04Z","2018-11-30T01:12:17Z"
"2018-11-29T21:42:03Z","2018-11-29T23:24:23Z"
"2018-11-29T20:37:04Z","2018-11-29T21:36:23Z"
"2018-11-29T19:59:04Z","2018-11-29T20:31:22Z"
"2018-11-29T19:43:04Z","2018-11-29T19:43:23Z"
"2018-11-29T19:24:03Z","2018-11-29T19:26:35Z"
"2018-11-29T13:21:03Z","2018-11-29T13:28:52Z"
"2018-11-29T11:11:03Z","2018-11-29T11:13:08Z"
"2018-11-29T10:04:03Z","2018-11-29T10:09:36Z"
"2018-11-28T21:02:03Z","2018-11-29T09:46:59Z"
"2018-11-28T18:20:03Z","2018-11-28T19:01:07Z"

結果を見てみましょう。

"2018-11-30T09:52:03Z","2018-11-30T09:55:26Z" <- 身に覚えがない
"2018-11-30T06:31:03Z","2018-11-30T09:45:50Z" <- Close=出勤時間
"2018-11-30T04:54:03Z","2018-11-30T06:25:14Z" <- なにこれ
"2018-11-30T01:18:03Z","2018-11-30T04:48:36Z" <- なにこれ
"2018-11-29T23:30:04Z","2018-11-30T01:12:17Z" <- なにこれ
"2018-11-29T21:42:03Z","2018-11-29T23:24:23Z" <- なにこれ
"2018-11-29T20:37:04Z","2018-11-29T21:36:23Z" <- Open=退勤時間(社内で懇親会していたので少し遅い
"2018-11-29T19:59:04Z","2018-11-29T20:31:22Z" <- 階移動時のWi-Fi切れ
"2018-11-29T19:43:04Z","2018-11-29T19:43:23Z" <- 接続切れすぎ
"2018-11-29T19:24:03Z","2018-11-29T19:26:35Z" <- 接続切れすぎ
"2018-11-29T13:21:03Z","2018-11-29T13:28:52Z" <- 覚えてない
"2018-11-29T11:11:03Z","2018-11-29T11:13:08Z" <- 覚えてない
"2018-11-29T10:04:03Z","2018-11-29T10:09:36Z" <- 覚えてない
"2018-11-28T21:02:03Z","2018-11-29T09:46:59Z" <- 綺麗に勉強会終了〜出勤時刻が出てる!
"2018-11-28T18:20:03Z","2018-11-28T19:01:07Z" <- Open=退勤、Close=勉強会場でWi-Fi接続、この日にエージェント入れた

うーむ。微妙。思った以上にノイズが多かったです。

とはいえ、自分にとってはとても参考になる確実なデータを得られました。

今後活用する機会がありそうです。

それでは皆さん、Mackerelと一緒によい社会生活を!

Node-RED UG勉強会 2018 年末LTパーティ

node-red.connpass.com

でLTをしてきた。

LT本数が10本と多く、かつ内容のバリエーションも豊富で非常に良いエネルギーを得られる勉強会だった。

自分のLTスライドはこちら。

www.slideshare.net

以前UGの勉強会に参加した際に発表内容が応用に寄っていた感じを受けたので、Node-REDをより活用するための入り口になればいいなぁ、といった動機でテーマを選んだ。

するとどうだろう? 同じようなことを考えたのかどうかは別として、同様なテーマのLTをする方がいらっしゃった。 「大事なことなので2LTで取り上げました」「参照URLまで同じ」などなかなか得がたいオモシロ体験だった。 (懇親会でも笑いながらそのLTをされた方と話させてもらった)

とはいえ、切り口はだいぶ違ったのでNode作成への入門としてはむしろ良かったのではないかと思う。

「参考になった」「Nodeを作ってみたくなった」と言った感想ももらえてとても嬉しかった。

なお「カスタムNode」という言葉は自分の造語だった様子。 どこかで見かけた気がしたのだけれど、そんなことはなかった。 困ったもんだ。

いろんな笑いと知見を得られたLT会だった。


同様テーマだった方のLTスライド。

www.slideshare.net

クソワロタ。


12-03追記:

主催の一人である 1ft_seabass さんがトゥギャってくださっている。当日の空気感はそちらで確認できる。

Entity Framework Core 2.0 でASP.NET Core起動時にマイグレーションする

こんな感じの Program.cs にすることでとりあえず実現できた。

ただ、この手法はシングルインスタンスのアプリケーションでの適用に限定しておいた方が良さそうだ。

 class Program
{
    public static void Main(string[] args)
    {
        var host = BuildWebHost(args);

        // 起動時にDBマイグレーションを当てる
        UpdateDatabase(host);

        host.Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseApplicationInsights()
            .UseStartup<Startup>()
            .Build();

    private static void UpdateDatabase(IWebHost host)
    {
        // https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.1#call-services-from-main
        using (var serviceScope = host.Services.CreateScope())
        {
            var services = serviceScope.ServiceProvider;
            var logger = services.GetRequiredService<ILogger<Program>>();
            try
            {
                var dbContext = services.GetService<ApplicationDbContext>();
                dbContext.Database.OpenConnection();

                logger.LogInformation("Start database migration.");
                // https://docs.microsoft.com/ja-jp/ef/core/managing-schemas/migrations/#apply-migrations-at-runtime
                // Webアプリケーションではあまり推奨されていない様子。
                // 明確なマイグレーションタスクをデプロイパイプラインに含めるのが良いようだ。
                dbContext.Database.Migrate();
                logger.LogInformation("End database migration.");

            }
            catch (Exception ex)
            {
                logger.LogError(ex, "An error occurred.");
            }
        }
    }
}
続きを読む

Entity Framework Core 2.0 で CreatedAt UpdatedAt

自分はORMではS2JDBCの洗礼を浴びていて、静的な型がついているEntityをRDBにMappingしてくれるORMが好きだ。

最近ではEntity Framework Coreが良くて、ちょっと前から使っているシステムがある。

唐突にそれでやっている工夫を書きたくなったので書く。

タイトルの通りあるEntityの生成時刻と更新時刻をアプリケーションプログラムで付与するものだ。

確認してみたらバージョンは 2.0.x だった。2つほどマイナーバージョンを置いて行かれている。大分変っているのだろうなぁ。

続きを読む

WindowsでマウスユーザーのMacBook入門

仕事の便宜上11月からMacBook Pro(2017年のタッチバー無しモデル)を使い始めた。

20年以上WindowsPCを使ってきて、初めてのMacだ。

正直、ChromeコマンドラインコンソールとVSCodeがあればどうにでもなるだろう。と考えてのことだったが、実際大まかなところではそんな感じだった。

Linux系のコマンドラインを操作できて、Windowsにしかないアプリケーションに普段依存していないようなら、それほど違和感なく作業できると思う。

とは言え、いくつか戸惑いもあったのでそれを書いておく。

続きを読む

IDにはアイコンがついているなぁとしみじみ思った

社内でGoogleフォームに入力して、結果のスプレッドシートを見たら自分の行にアイコンがついていた。

すげぇ、と思ってどういう風に作ってあるのか見てみたら image="https://imageserver/" + IDの列 + "/icon" の様な簡素な作りだった。 (あいまいな記憶なので事実とは違うと思うが、そう大きくも間違っていないはず)

とても手軽にアイコン表示が実現されていて感心してしまった。

そういえば昨今はメールアドレスを使ってユーザー登録しても Gravatar - グローバルに認識されるアバター (Globally Recognized Avatars) なんかを使っていれば勝手にアイコンを表示してくれたりする。

↓GravatarのアイコンURL

https://s.gravatar.com/avatar/a7f648f6c3151fd5fe0b5e855ea45c62?s=80

そんな感じでIDにはアイコンがついているなぁとしみじみ思った秋? の夜長だった。

『草を生やすボタン』を作ろうと思っていた

先日SORACOM LTE-M Buttonの使い道を検討する記事を書いているほどには同ボタンが届くのを楽しみにしていた。

草を生やすボタン』を作りたい。

こんなことも言っている。

だが待ってほしい。既に先駆者がいる!

blog.sushi.money

丸かぶりである。

遊びでLambdaを使うときだいたい1リクエスト送って終わりくらいなのでスキルの上達が感じられないけど、あまり複雑なことをしても困るので、遊びでやってるんだからこんなんでいいんだという気持ちになってきている。仕事でやってるみなさんは頑張ってください。

似たような所感である。

あろうことか昨日入社した会社の先輩でもある。

一体全体どうなってるのだ。

まぁ、別に他人が同じものを作っていたから自分は作らん訳ではないのだけれど、非常に状況が面白かったので勢いで記事を書いた。