放射状

勉強のメモ。

社内の開発環境を一新したわけですよ

忙殺されているうちに気が付けば北国の短い夏は終わっているわけです。


以上、一か月以上放置した言い訳です。(一行)
lispとかF#とか半分忘れかけてる…けど、もう少しでSICPの問題1.11の記事が書けるから待って!

開発環境

なんか最近、社内の開発環境がトレンディーじゃない気がする…なんかおいて行かれてる感がする…やだ…「まだsubversion|csv使ってるの?! プークスクス」なんて状態になるのが一番やだ…かっこわるい…。
だって余所の会社に「弊社はこんなに今時ですよ! 今時なかっこいい開発環境で効率的にやってますよ!」自慢したいですもんね。
具体的に言ってしまうと、同じ職業やってる弟や友人に自慢できる環境で常にありたい。(超私的要因)(モチベーション源なんてこんなものでいいんですよ)

改善前
  • タスク管理はTodoist for Businessでやっている。 でも見積時間と実作業時間を記録しておけるわけではないから、いまいちふりかえり(反省)に活かしにくい。あとバグ管理も何となくここにつっこんでるけど、なんか違うんじゃないかなあとは思う。
  • バージョン管理はローカルサーバ上のgit。しかし、ろくにルールを定めずに使い始めたため、みんなmasterにpushしやがる。他に何かのシステムと連動させているわけではないので、コードレビューが全くされていない。
  • 社内チャットはYammer。デスクトップアプリがただの通知アプリになってからはかなりカスい。
  • 技術共有はWiki。書き込みは牛歩だが、意外と閲覧はされている。
制約条件
  • 無料に勝るものはない
  • どうしても課金が必要だったらまあ話せない会社ではないけど正直めんどくさい
いろいろ試してみる
  • github → ああーいいなあー、プルリでコードレビューも捗るし、お金持ちの会社っぽくgithub enterpriseとか使えたらさぞかっこいいだろうなあー → 値段を見る → 見なかったことにする。 あとやっぱり、いくらprivateリポジトリでもソースコードを外部に出すのは会社の許可がおそらく出ない。
  • Slack → すばらし! 軽い! いろいろ連携できる! なんでYammerなんか使ってたんだろう! 無課金でも全然使い物になるし!
  • Trello → TodoistのSlack連携が残念すぎる(IFTTTを経由しないとできない)ので、代わりに使えないかな、と試してみる。が、今日のタスクをプロジェクト(ボード)をまたいで把握できない・繰り返しタスクが登録できない時点で論外。
  • Qiita → 情報共有にいいんだろうなあ…あっお高い無理
  • gitlab → これをローカルサーバにインストールして使うのが妥当な落としどころか。
改善後

gitlab(バージョン管理・情報共有・バグ管理・コードレビュー) + Slack(社内チャット) + Todoist for Business(タスク管理)という組み合わせになりました。gitlabがローカルサーバにある関係上、どうしてもツールの連携に問題があるけれど、まああとは運用でどうにかしてみる方針。

運用ルール例)

  • gitの運用ルールを徹底:gitlabのメンバの権限設定でmasterにpushやマージできる人員を制限できるので、ある程度そのあたりのルールを強制できる。あとはpushされるとSlackに通知がくる(ローカルのgitlabからでもwebhookでslackに通知できるんですな。べんり)ので、おかしなことをしてるとすぐにコラー! って怒れる。マージリクエストでコードレビューも捗る。はず。
  • Todoist:ほかのサービスとの連携がなあ…いまいちなんだよなあ…IFTTTの機能もしょぼいしなあ…。と、不満点は多々あれどGTDツールとしては最高なんですよね。このサービスのお蔭で紙の手帳を捨てられたし。見積と経過時間に関しては、タスクメモに書いておいてそれをAPIで引っ張ってこようかなあ、とかいろいろ考え中。Slackへはタスク追加のときだけIFTTT経由で通知するようにしています(しょぼい)。githubのissueとの連携はできるのに、gitlabとはできないのが結構痛い。やっぱりいつかgithab使いたいなあ…。
  • Slack:なんでもっと早くに出会わなかったんでしょうなあ…。IFTTTを弄ったり、HubotをHerokuに入れて遊んだりして、完全なるおもちゃ。

という感じです。まだ使い始めたばかりなので、不満点など洗い出せていませんが、結構快適なので元の環境に戻ることはないでしょうな。

夏バテしました(雑多なメモ)

タイトルの通り完全に夏バテしました。カロリーメイト2本で胃もたれします。アイスコーヒーを一気飲みすると胃もたれします。夕食後胃もたれで動けなくなります。午後はマシですが午前中はまるで使い物になりません。
困ったものです。

pingのソースで気になることメモ

if-while(0)ってなんやねん

pingのソースを読んでいてどうしてもわからないところ。

if (source.sin_addr.s_addr == 0) {
//エラー処理とか
} while (0);

ってどういう意味なんでしょうか。do-while(0)なら分かるんですが(こちらのサイトなど参考)。
うーん。K&Rが愛読書のC言語大好き人間に聞いてみましたが、「ねえよそんな構文」と一刀両断されました。だよなあ。うーん。単なる消し忘れでしょうか。

linuxについて知らなければいけないことがたくさんあるようだ

linxのソースコードを追っていると突然errnoとかいう変数が出てきて、どこにも宣言されていない。調べてみるとerrno.hあたりで宣言されている、エラー時にエラー番号が格納される便利なlinuxの変数の模様。
こういうごく基本的なお作法的なものも全く知らないので、いちいち躓くのめんどくさいなと思います。こういうの、コンパクトにまとまってる書籍とかあるのでしょうか。これとかかな。→
ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道

あれな

このソースコードあんまりきれいじゃn…Code Complete 第2版 上 完全なプログラミングを目指して的な意味で。

関数型言語メモ

放射氏が関数プログラミング実践入門 ──簡潔で、正しいコードを書くために (WEB+DB PRESS plus)を読んでいると、飼い猫がこの本のにおいを嗅いではフレーメン顔するのが謎です。

F#とHaskelllisp

流石に3つ同時に進めるのつらいのでちょっと整理したい。おそらく一番最初にHaskellに慣れておいた方がいいのだと思うのだけれど、F#で課題を出されてしまっているからなあ。Haskellで解いたらだめですかね>某M氏 回り道してももう少しじっくりやりたいです。

夏バテしたから

学習環境を整えたいところ。PCのある2階に引きこもるの辛い。1FからMBAリモートデスクトップで2FのPCに繋げば多少快適になるか。MBAの13インチでいろいろするのはつらいのでディスプレイが一つ欲しいな。

ほかの課題メモ

  • プレゼン練習のネタを考える
  • 艦これはエアロバイク中にしかやらない
  • ソシャゲは同時に二つまでしか手を出さない
  • 夏バテの治し方を考える
  • 統計と機械学習について勉強する

SICP七日目 〜問題1.10

順番的に言えばコードリーディングの更新をするべきときですが深追いしすぎて戻ってこれていないので、先にSICPを更新してしまいます。ぷよクエでやらなければいけないイベントもありませんし、のんびり取り組めました。

問題1.10

実行してみないことには

問題を見る。アッカーマン関数と書いてあるからにはアッカーマン関数について調べてもバチは当たるまい。…とりあえず関数Aは自分自身を定義に含めずに定義できないことは把握した。
とりあえずプログラムを実行してみる。
これをこうして、

(use slib)
(require 'trace)

(define (A x y)
  (cond ((= y 0) 0)
        ((= x 0) (* 2 y))
        ((= y 1) 2)
        (else (A (- x 1)
                 (A x (- y 1))))))

(trace A)

こうじゃ。

gosh> (A 2 1)
CALL A 2 1
RETN A 2
2

(A 3 2)を実行すると、

gosh> (A 2 2)
CALL A 2 2
  CALL A 2 1
  RETN A 2
  CALL A 1 2
    CALL A 1 1
    RETN A 2
    CALL A 0 2
    RETN A 4
  RETN A 4
RETN A 4
4

こうじゃ。
(A 3 3)はな、

gosh>(A 2 3)
CALL A 2 3
  CALL A 2 2
    CALL A 2 1
    RETN A 2
    CALL A 1 2
      CALL A 1 1
      RETN A 2
      CALL A 0 2
      RETN A 4
    RETN A 4
  RETN A 4
  CALL A 1 4
    CALL A 1 3
      CALL A 1 2
        CALL A 1 1
        RETN A 2
        CALL A 0 2
        RETN A 4
      RETN A 4
      CALL A 0 4
      RETN A 8
    RETN A 8
    CALL A 0 8
    RETN A 16
  RETN A 16
RETN A 16
16

こうなるんじゃ。
それでA(2 4)は

(A 2 4)
CALL A 2 4
  CALL A 2 3
    CALL A 2 2
      CALL A 2 1
      RETN A 2
      CALL A 1 2
        CALL A 1 1
        RETN A 2
        CALL A 0 2
        RETN A 4
      RETN A 4
    RETN A 4
    CALL A 1 4
      CALL A 1 3
        CALL A 1 2
        RETN A 4
        CALL A 0 4
        RETN A 8
      RETN A 8
      CALL A 0 8
      RETN A 16
    RETN A 16
  RETN A 16
  CALL A 1 16
    CALL A 1 15
      CALL A 1 14
        CALL A 1 13
        RETN A 8192
        CALL A 0 8192
        RETN A 16384
      RETN A 16384
      CALL A 0 16384
      RETN A 32768
    RETN A 32768
    CALL A 0 32768
    RETN A 65536
  RETN A 65536
RETN A 65536
65536

A(2 1)→2、A(2 2)→4、A(2 3)→16、A(2 4)→65536です。計算過程を見てみるとA(2 n)はA(2 n-1)の計算過程を再帰的に呼び返しているので、まあそんな感じなんだなと。単にこの4つの数字だけを見てパズル的に法則性を解いてしまうと、A(2 1)は2、A(2 2)は(2^2)、A(2 3)は2^{2^2}、A(2 4)は2^{2^{2^2}}だよなーとなります。(今、texってここまで指数部書けるのかのすげえって思った) では、A(2 5)は2^{2^{2^{2^2}}}ですかね。

答え

(A 1 10)=1024
(A 2 4)=65536
(A 3 3)=65536
で、
(define (f n) (A 0 n))→ 2n これと↓は普通に実行して眺めて答えを出したんだけれど、よくないよなー。
(define (g n) (A 1 n))→ 2^n 
(define (h n) (A 2 n))→ 2^{2^{...^{2}}} ←n-1個分右上に指数部が並ぶ。「関数の簡潔な数学的定義を述べよ」だからこんな答えでいいでしょうか…。だめかもしらん。

しかしまあ

良問ですなあ。回答者を振り分けにかかってるのが分かる。この程度でしか答えられない自分の限界も分かる(鬱ましい)。でも考えていて楽しい問題ですね。こういう再帰もあるんですね。