読者です 読者をやめる 読者になる 読者になる

(今年も司会者として)Vim Conf 2015に参加した

はじめに

記事を書くの遅くなりました. Vim Confに参加し,強いVim熱にさらされ,体調を崩していました.

去年に引き続き@KuniwakさんのPA能力はすばらしかったし,@yoshiko_pgさんの作成したサイトもすばらしかった. 去年と同じような感じになるけど,みんなすごくて関心するばかりで.

文章がうまくないのでとくに印象にのこっていることをすこしだけ.

repl

@ujmさんの「replをつかうんじゃなくて,QuickRunを使えばいいじゃない.」は深くこころにのこっている. というのもreplを使う機会が多く,vimで編集しながらreplを使うことに苦労してきた. (VimShellつかってたりしてた.)

QuickRunつかってたけど,replを置きかえるものという,発想がなかった.

日本語

なんにんかの人にvimでの日本語環境のことを聞いた.

vimで日本語を使うのは長年のテーマなので,みんながどうやって解決しているのか気になった.

vim-kaoriyaを使っているという人ばかりだった. やっぱりそうか,しかし,skkに染まってしまった私にはむつかしい選択だ.

vimの使い方

@kamichiduさんみたいにvimの寿命が非常に短命であるひとがいることを知った. vimは起動しっぱなしで,backgroundとforegroundをきりかえながら長い時間つかっている私みないな人もいる. vimの使い方についても非常に多様性があり,それができるvimは偉大だな.

所感

今年もvim弱者として司会をしてしまった.

来年はvimにcontributeしたいな.

gtest & gmock

はじめに

C++練習の一環でUnit testツールのgtestとgmockを使って簡単な例を書いてみた.

インストール

google/googletest · GitHub

gtest

~/Downloads ❯❯❯ ./googletest
~/D/gtest-1.7.0 ❯❯❯ mkdir build
~/D/gtest-1.7.0 ❯❯❯ ./build
~/D/g/build ❯❯❯ cmake ..
~/D/g/build ❯❯❯ make
~/D/g/build ❯❯❯ sudo cp -r ../include/gtest /usr/local/include/
~/D/g/build ❯❯❯ sudo cp lib*.a /usr/local/lib

gmock

~/Downloads ❯❯❯ ./googlemock
~/D/gmock-1.7.0 ❯❯❯ mkdir build
~/D/gmock-1.7.0 ❯❯❯ ./build
~/D/g/build ❯❯❯ cmake ..
~/D/g/build ❯❯❯ make
~/D/g/build ❯❯❯ sudo cp -r ../include/gmock /usr/local/include/
~/D/g/build ❯❯❯ sudo cp lib*.a /usr/local/lib

サンプル

#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include <vector>

int add(int x, int y) {
        return x + y;
}

TEST(AddTest, Test1) {
        ASSERT_EQ(2, add(1, 1));
        std::vector<int> a{1, 2, 3};
        std::vector<int> b{1, 2, 3};
        ASSERT_THAT(a, ::testing::ContainerEq(b));
}

コンパイルでオプションを指定すればmain関数は要らない. 最初にソースファイルを指定しないといけない.

~/D/temp ❯❯❯ clang++  gtest_test.cpp -std=c++11 -lgtest -lgtest_main -lgmock  

awkスゴイ!

はじめに

連休も終わりに近付き寝られなくなったので

正規分布

C++11っぽく書いてみた.

#include <iostream>
#include <random>
using namespace std;

class Random_normal {
        public:
                Random_normal(double mu, double sigma) : dist {mu, sigma} {}
                double operator()() {return dist(re);}
        private:
                default_random_engine re;
                normal_distribution<> dist;
};

int main(int argc, char const* argv[])
{
        Random_normal rnd {0.0, 2.0};

        for (int i = 0; i < 10000; i++) {
                cout << rnd() << endl;
        }

        return 0;
}

結果をdata.txtにはく.

awk

すごい,ワンライナーでこんなことができるとは!

# 平均
~/D/t/awk ❯❯❯ awk '{avg+=$1;median[NR]=$1;mode[$1]++}END{asort(mode, keys);asort(median);max=keys[length(keys)];print "mean",avg/NR;}' data.txt
# -> mean -0.000279935

# 標準偏差
~/D/t/awk ❯❯❯ awk '{d[NR]=$1;avg+=$1}END{a=avg/NR;for(i in d)s+=(d[i]-a)^2;print "std",sqrt(s/(NR-1))}' data.txt
# ->std 1.98805

仮想関数!!!

はじめに

恥しながら,C++を仕事で使いつつ,仮想関数・純粋仮想関数をあいまいに使ってた. ただ,シルバーウィークに入る前,ボスにC++の再学習(文法とかじゃなくて,設計とか)を命じられたので「憂鬱な…」を読んでる.

www.amazon.co.jp

この本の6章で仮想関数に対する理解が爆発的に進んだのでメモしておきたい.

何か

仮想関数

一言でいうと,別のメンバ関数で使ってるけど,実装は一番派生側を使いたい,そのとき,virtualを付けて仮想関数にする.

純粋仮想関数

  • 基底クラス内のあるメンバ関数で別のメンバ関数を使いたい.
  • しかし,実装の詳細は派生クラスに任せたい.
  • このままだとコンパイルできない.
  • そんなときの純粋仮想関数!
  • 純粋仮想関数は派生クラスで絶対に実装する必要がある.

Shapeを基底クラス,Circleを派生クラスとする.

#include <iostream>

class Shape {
        public:
                virtual void refresh() {draw();};
                virtual void draw() = 0;
};

class Circle : public Shape {
        public:
                Circle(double radius);
                virtual void draw();
        private:
                double radius;
};

Circle::Circle(double radius) {
        this->radius = radius;
}

void Circle::draw() {
        std::cout << "Raidus is " << this->radius << std::endl;                    }

int main(int argc, char const* argv[])
{                                                                                          Circle c = Circle(1.0);
        c.draw();
        c.refresh();
        return 0;
}

実行すると,半径が二回表示される. つまり,Circleのdrawが使われる.

学び方

はじめに

今日、部長と月例面談をした。
仕事で思い悩んでてくよくよしてた。
部長には励ましてもらい、さらに良いアドバイスをもらった。
忘れないためにここに記す。
 

部長のアドバイス

konnyakmannanくんは、話を聞く限り、
 
  • 論理だったことが好きで
  • 粘り強く
  • 人のやらないことをやりたがり
  • 気持ちで仕事をする
という人と見ている。
だから、物事の表面を舐めるのではなく、バックグラウンドから学ぶタイプに見える。
 
このタイプの人は記憶の容量が少ないが、成り立つ過程、組み立てる過程を身につける少数派だ。
ただし、学習曲線は指数的で最初は苦労する。
 
たとえば、計算機のことを覚えるんじゃなくて計算機が出来るまでの歴史を学ぶのがいいと思う。
 

所感

まさにその通り。
 
方程式を覚えるんじゃなくて導く過程を楽しんで覚える、覚えが悪い。
 

これから

自分のタイプに気がつけたんだから、これに乗っかろう。
 
プログラミング言語について、文法をなぞるんじゃなくて、なぜそういう文法になったのか、時間と理論を考える。
 
ただ少数派なので人に流されないよう、気をつける必要がある。

3月と5月

I often confuse...

3月と5月をよく間違える、英語で。 MarchとMayってなんとなく、似ている。

昨日、英会話でインストラクターの人も間違えてた。 ネイティブでも間違えるんだ、と思って驚いた。

日本語だと

"おざなり"と"なおざり"みたいなものか。 いや、違うな。 日本語にない感じだ。

MarchとMayのあいだの混乱は何に起因するのだろう。

イメージだ

いつになっても3月のMarchと5月のMayの区別がつかず覚えられない理由

イメージがついてる。

  • Mayってなんか早春って印象
  • Marchはポカポカ

こんなイメージが染み付いているものだから混乱する。 染み付きすぎてイメージ変えられんわ。

ところで、うえのリンクでおもしろかったのが、「文字数がMayが3文字でMarchが5文字で...」という説。