App::RunCron , fatpack して一枚のスクリプトで扱う

songmu さんが作った App::RunCron - making wrapper script for crontab - metacpan.org をどうやって使うか考えて、ひとまず

#!/usr/bin/env perl

use strict;
use warnings;
use App::RunCron;
use Getopt::Long;

# for handling double dash of @ARGV
GetOptions();

App::RunCron->new(
    command => [@ARGV],
    error_reporter => sub {
        my $runner = shift;

        # stdout
        print STDOUT $runner->report;

        # post to irc
        ...

    },
)->run;

こんな感じのスクリプトを fatpack して一枚で扱えるようにして使ってみることにした。設定 yaml のこととかは全く考えずに cronlog とおなじ感覚で + stdout に吐く以外の事を足して使います。

あと --- のハンドリングを getopt::long に任せました。

perl のプログラムを go に移植してみて

気が向いたので fujiwara さんが以前作った Urume のクライアントである mezasi という perl で書かれたものを go に移植してみた。

https://github.com/soh335/go-mezasi

以下感想

  • サブコマンドの仕組みは github.com/gonuts/commander と github.com/gonuts/flag を使った。
  • useragent とかを固定化したいとなると下みたいに http.Client の簡単なラッパーを書くのが良い?
package main

import (
    "io"
    "net"
    "net/http"
    "net/url"
    "time"
)

type Client struct {
    UserAgent string
    client    *http.Client
    EndPoint  *url.URL
}

func NewClient(endpoint *url.URL) *Client {
    return &Client{
        UserAgent: "Mezasi/0.1",
        client: &http.Client{
            Transport: &http.Transport{
                Dial: func(netw, addr string) (net.Conn, error) {
                    return net.DialTimeout(netw, addr, time.Duration(time.Second*300))
                },
            },
        },
        EndPoint: endpoint,
    }
}

func (c *Client) Do(req *http.Request) (*http.Response, error) {
    return c.client.Do(req)
}

func (c *Client) NewRequest(method string, pathStr string, body io.Reader) (*http.Request, error) {
    urlPath, err := url.Parse(pathStr)
    if err != nil {
        return nil, err
    }
    u := c.EndPoint.ResolveReference(urlPath)
    req, err := http.NewRequest(method, u.String(), body)
    if err != nil {
        return nil, err
    }
    req.Header.Add("User-Agent", c.UserAgent)
    return req, nil
}

こんな感じでタイムアウトの処理と、request object を作るメソッド、実行するメソッドを用意した。 request object を作るときに endpoint をもとに url を作ったり、 user-agent の追加をしたりした。

  • 起動が早い

beyond two souls

beyond

面白かった。今までやったゲームで一番綺麗で、ハラハラしながら進められた。戦争の描写とかもあるのでそこはちょっと辛い感じだった。

アクションが下手なので簡単なモードのほうで進めた。

グロスホッパー

ホームレスっつっても、ホープレスじゃねえだろ

「本当に大事なことは、小声でも届くものだ、とな」

「そういうものですか?」

「大声で怒鳴る政治家の言うことを、人が聞くか?」

「政治家の言うことは、誰も耳を貸さないんですよ」

「本当に困っている人間は、大声を出せない。だろ」

人間の知恵だとか科学は、人間のためにしか役に立たねえんだよ。分かってんのか? 人間がいてくれて良かった、なんて誰も思ってねえよ、人間以外はな

ghh という github repository hook を操作するのを書いた

昔に github の irc hook で issue も hook してもらう - @soh335 memo というのを書いた。

songmu さんにはわかりづらかったらしい

気が向いたので golanghttps://github.com/soh335/ghh というのを書いた。 cui で操作して、create/edit の際は editor を立ち上げる。 editor の内容は toml で書かれた設定ファイルになっていて、反映されていない設定はコメントアウトされているので、必用があればコメントアウトを解除すると反映される。

( github とのやりとりは json で行われるが、コメントアウトで制御したかったのでエディタ上では toml を使ってみることにした)