友達同士でもくもく会した

要約

友達同士でもくもく会して、意外と捗って良かった

もくもく会とは?

自宅には誘惑がいっぱいあるので、プログラミングとかやろうと思ってもなかなか捗りませんよね。でも周りに人が居るとよく見られようという意識が高まって誘惑に負けずに作業に集中できる。という効果があります。カフェで勉強すると意外と捗ったりするのはそういう理由ですね。でも、カフェだとガヤガヤしてて集中できない。という人も居ると思います。そこで「もくもく会」です。もくもく会では、静かな場所で集中して作業したい人が集まることで、集中力を高めながら、作業を捗らせる。ということを目的としています。また、同じ同志が集まることで、問題解決をみんなで出来るという強みもあり、一人で作業するよりも何倍も効率が上がる!というもくろみがあります。

友達同士でもくもく会

とはいえ、そういう会に参加するのは、結構ハードルが高いものです。私もその一人でした。ですが偶然、友達が「もくもく会」に興味があり、それに賛同したことから、あれよあれよと「友達同士でのもくもく会」が開催されることが決定しました。もくもく会といっても、上で述べたような効率よく作業しよう!という感じではなく、ゆるく集まって作業できたらいいよね。ぐらいの気持ちでした。現に、「もくもく会」ではなく、「もぐもぐ会」という名前になってて、一部のメンバーはお菓子を食べながら雑談をしたりしてましたし(笑)

なんしか、「もくもく会」というものがどういうもので、どれだけ効果があるのか?友達とやっても効果があるのか?という実験的な会だったと思います。

「もぐもぐ会」感想

日曜の13時から始まって、18時に解散でした。はじめは「5時間もするのかー」という気持ちでしたが、意外と集中して作業していたということもあってかすぐに時間が過ぎたなーという感想です。

開始する前に、みんなで今日やることを言い合ってからもくもく会開始、終了の30分前に何をやったかを発表して終わりました。発表といっても大したことではなく、「○○を実装しようと思ったけど、ここまで作って時間切れでした~」ぐらいの軽い感じです。これぐらい軽いほうが参加しやすいかな。とも思いました。

合計8人の参加者がいて、そのうち3人は「もぐもぐ会」を実施、5人は「もくもく会」を実施しました。「もぐもぐ会」メンバーは結構気を使って会話のトーンを落としてしゃべってくれたってのもあって、良いBGM感という感じでした。集中が切れたら、私ももぐもぐ会に10分ほど参加したりして、それなりのリフレッシュも入れられましたし。差し入れもうまかった。

作業自体は集中できたと思います。完全にYoutube/Twitterをシャットアウトできましたし、最初にやることを明確にしていたということもあり、ここまではやりきるぞ!という気持ちで作業ができたので、いつも以上に集中できたと思います。

今後

今回の会場はマンションの一室を借りて実施しました。(借りたのは友達ですが) 作業スペースはきれいでよかったのですが、トイレが普通に1ルームのトイレだったので、音漏れが気になったので、もし次やるならそういうところも気にしないといけないかなーと思いました。

友達同士でやるもくもく会はストレスフリーにもくもく出来ることがわかったので、これからも定期的に実施していけたらなと思います。

それとは別に、外部のもくもく会にも参加していくことで自分のスキル向上もあるのかなと思っています。 とりあえず、まずは、ネット上でもくもく会が開催されているようなので、それに参加しようかなぁ。

mockmock.connpass.com

JWTを生成/解析するときのsecret keyの生成方法

JWTについて調べてる。golangでちょっと使いたい用途があったので。

golang には JWT生成/解析するライブラリが結構あって、jwt-goってのが有名みたい。

github.com

func createTokenString(data *User, secretkey string) (string,error) {
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, data)
    return token.SignedString([]byte(secretkey))
}

こんな感じでトークンが生成できるんだけど、secretkeyの部分に何を入れたらいいんだろう?ってなってた。

railsの例を見ると、configハッシュのsecret_key_baseキーに入っている値を渡してるみたい。 値はランダムな文字列のようだ。

blog.naoshihoshi.com

それはどうやって生成されてるかっていうと、rake secret みたいなコマンドを打つと生成できるようだ。でも、どういうアルゴリズムで生成されているかわからない。

とおもったら、以下に答えが。というかソースが。

til.hashrocket.com

んで、secure random golang とかで検索すると、まんまの答えがqiitaに上がってた。

qiita.com

ということで、これを使わせてもらって、めでたくセキュアにJWTのデータを生成・解析できるようになりました。

めでたし、めでたし。

heroku の golang で http から https へリダイレクト

お名前.comで取得した カスタムドメインを使ってhttps化しようと思ったけど、なんか難しかったので、カスタムドメインはあきらめた。んで、herokuapp.com のサブドメインSSL化してhttps化完了とす。

でも、httpのほうもアクセスできちゃうので、そっちをどうにか閉じたい。herokuの機能としてhttpからhttpsへのリダイレクトはサポートされていないようなので、自前でリダイレクトしてあげないといけないっぽい。

Can Heroku force an application to use SSL/TLS? - Heroku Help

でも、↑のサンプルには go のサンプルがない... つらたん...

なので、色んなサイトを参考に以下のように作成。

func main() {
    var err error
    proto := os.Getenv("PROTO")
    if proto == "" {
        proto = "https"
    }

    engine := gin.New()
    engine.Use(func(c *gin.Context) {
        if proto != "https" {
            return
        }

        header := c.Request.Header
        isssl := false
        if params, ok := header["X-Forwarded-Proto"]; ok {
            if len(params) != 0 && params[0] == "https" {
                isssl = true
            }
        }
        if !isssl {
            req := c.Request
            loc := "https://" + req.Host + req.URL.Path
            if len(req.URL.RawQuery) > 0 {
                loc += "?" + req.URL.RawQuery
            }
            c.Redirect(http.StatusMovedPermanently, loc)
        }
    })

    engine.Run(":" + port)
}

抜粋なので、これだけではちゃんと動かない。 全体は こちら

ローカルでは http で動かしたかったので、環境変数PROTOがあるかどうかで判別している。 herokuでは、httpsの場合だと、X-Forwarded-Protohttpsが入ってくるらしいので、それをチェックして httpsじゃない場合はリダイレクトしている。  

govendor と heroku

govendor は goパッケージをバージョン管理できるツール

プロジェクトのvendor以下をローカルパッケージとして管理できるgoの機能を拡張することで機能する。

github.com

govendor fetch <package name>

とすると、vendor/vendor.json の下に管理用のjsonファイルが作成される。

herokuもこのツールを対応している。

注意点としては、goのパッケージロードで、vendorディレクトリにパッケージがなければ、$GOPATH以下を読みに行くので、ローカルではvendorディレクトリにパッケージがなく、$GOPATHにはあってビルドが通るけど、heroku上ではどちらにもなくてビルドがこける。ということがあるので、ちゃんと必要なパッケージはvendor.jsonに記述しておく必要がある。

OPC UA の ライブラリが githubに公開されていたので使ってみた

github.com

OPC UA Foundation が OPC UA のライブラリをgithubに公開していました。

OPC UA というのは、IoTのような組み込み系の分野でデータをやり取りすることを主な目的としたプロトコルです。WebSocketなんかが近いのかもしれませんが、もうちょっと分野に特化したプロトコルになっています。私も勉強中なので、詳しくはおいおいって感じです。

 

ここの回答にもあるように、SDKのドキュメントはさほど充実していません。サンプルプログラムや参照実装がいくつかあるので、それを元に手探りで作成していくのが基本スタイルのようです。

github.com

 

基本的にはgithubからクローンしてきて、Visual Studio でビルドすればサンプルは動きます。ただ、自分で作成したプログラムに組み込むとなると、どう動いているのかが理解できないと使えません。一番シンプルそうなサンプルがNetCoreConsoleClientそうだったので、これを動かしてみましょう。とはいえ、単純にREADMEに記載されている内容を動かすだけですが。

 

github.com

 

クライアントを動かすためには、サーバーが必要です。サーバーは適当なサンプルを動かしておきましょう。SampleApplications\Workshop\Reference\Server にあるサンプルプロジェクトが適当でいいと思います。ビルドして、動かしておきましょう。

 

サーバーが起動できたら、コンソールから dotnet run <サーバーのURL> を入力し、実行。サーバーの時刻がサブスクライブされて定期的に表示されます。

 

 

vimをwindows上で自前でビルド

色々調べてみたけど、結局はvimリポジトリの説明が一番充実してるし最新かな?と思う。

 

github.com

 

大体のことは https://github.com/vim/vim/blob/master/src/INSTALLpc.txt に記載されてるので、それ見ればいいと思う。

 

TERMINALオプション付きでビルド

13項にTERMINALについての記載がある。MSVCだとうまくビルドできなかった。mingw32 を使ってビルドするとうまくいく。例で挙げられているのはgvim.exe 版なので、vim版を作りたいときは、2項のMinGWのセクションを見ながら、やるといい、例にも記載があるが、`mingw32-make -f Make-ming.mak GUI=no vim.exe` で作れる。これにターミナルを追加したければ、`TERMINAL=yes` をオプションに追加するだけだ。

 

ターミナルを追加し、できたexeを起動して、おもむろに `:terminal` としてもターミナルは起動しない。なぜなら、Windows では winpty.dll を内部で使っており、これがないと起動できないからだ。なので、http://vim-jp.org/vimdoc-ja/terminal.html#E946 の MS-WIndows の項目にもあるように、winptyを公式リポジトリから取得してきて、所定のパスに入れなければならない。今回はmigw32で作成しているので、msvc2015のzipの中にあるia32のwinpty.dllを使わせていただく。所定のファイルをビルドしたvim.exe と同じフォルダに置き、wintpy32.dll と名前を変える。これでターミナルが起動できる。

LUA オプション付きでビルド

基本的には、9項 Building with Lua support に記載の通りでいける。

ちょっとはまったのは、前のobjファイルや、vim.exe を削除してなくて、ビルドでこけてた。objファイルはobji686フォルダ以下にできたりしてるので、自分の環境ごとに削除しておくこと。

LUAオプションに指定するディレクトリ名はmingwの場合、'/'を使うか、'\'をエスケープする必要があるようだ。'\'をエスケープせずに指定すると、その文字をエスケープだと認識して、正確にパス指定ができなくなり、ビルド中にヘッダーファイルが見つけられずにこけてしまう。

PERL オプション付きでビルド

`LUA オプション付きでビルド` に記載した内容に気を付けていれば詰まることなくビルドできる。ちなみに、私はActivePerl 5.24 をインストールした。

Perlのインストール先に perlxyy.dll (xはメインバージョン、yyはサブバージョン) があるので、そのファイルをvim.exe のあるディレクトリにコピーしておくこと。

RUBY オプション付きでビルド

これも 気を付けるべきところは `LUA オプション付きでビルド付きでビルド` と同じ。

後は、64bit版RubyInstaller を使っているとちゃんとビルドできないので、32bit版をインストールしておくこと。使用したバージョンは2.3.3

msvcrt-ruby230.dll が無いと使えないので、vim.exe と同じディレクトリにコピーしておこう。

PYTHON3 オプション付きでビルド

ビルドオプションでつまるところはない。ダウンロードモジュールは本家から32bit用のインストーラーを取得すること。

www.python.org

上記サイトの Download Windows x86 executable installer を選択

 

ビルドコマンド

私の環境では以下のコマンドでビルドできた (PYTHON3のオプションのパスはPYTHON3のインストールパスに置き換えること。ビルドコマンドそのままだと動かないので注意)

$ mingw32-make -f Make_ming.mak GUI=yes TERMINAL=yes IME=yes MBYTE=yes ICONV=yes CSCOPE=yes NETBEANS=yes STATIC_STDCPLUS=yes DEBUG=no LUA=d:\\src\\lua53 DYNAMIC_LUA=yes LUA_VER=53 PERL=C:\\Perl DYNAMIC_PERL=yes PERL_VER=524 RUBY=C:/Ruby23 DYNAMIC_RUBY=yes RUBY_VER=23 RUBY_API_VER_LONG=2.3.0 PYTHON3=$LOCALAPPDATA/Programs/Python/Python36-32 DYNAMIC_PYTHON3=yes PYTHON3_VER=36 PYTHON=c:/msys64/mingw32 DYNAMIC_PYTHON=yes PYTHON_VER=27 PYTHON_HOME=c:/msys64/mingw32 PYTHONINC=-Ic:/msys64/mingw32/include/python2.7 DYNAMIC_PYTHON_DLL=libpython2.7.dll gvim.exe

 

追記:

最近ではここも詳しく載ってますね。ありがたい。

vim-jp.org