17歳からのプログラミング入門。

情報系の門の先で起きたことをたまにメモ。

保健室の先生とお話してきた。

表題の通りです。

なんとなく書き付けておきたかったので、話し始めだけ書き付けています。

お悩み相談の入り口でしかないので、メッセージ性があったりするわけでもないです。

 

続きを読む

プログラマの端は書き捨て。

kosen13s' Advent Calendar 2016 (http://www.adventar.org/calendars/1855) の 3 日目の記事です。

これは供養です!

先日、半年ほど使っていた Xubuntu 15.10 の仮想マシンに別れを告げ Xubuntu 16.10 に乗り換えたのですが、 前のディスクの tmp ディレクトリに大量のプログラムが書き捨てられていました。

f:id:Iruyan_Zak:20161203234928p:plain

人からの相談や、耳にした tips などを tmp に投げ入れているため、 もう用のないコードではありますが、もしかしたら誰かの知見になりうるかと思うので、公開します。

ただし、本当に意味のわからないコードもあるので、紹介するのは一部だけです。

/0523

C++ の deprecated を用いたコンパイル時型表示のプログラムです。

#include<bits/stdc++.h>
class H{};

template <class T>
[[deprecated]] void chk_type(T t){}

int main(){
    auto cache = new std::unordered_map<int, std::weak_ptr<const H>>;
    chk_type(cache);
}

これをコンパイルすると

a.cpp: In function ‘int main()’:
a.cpp:10:19: warning: ‘void chk_type(T) [with T = std::unordered_map<int, std::weak_ptr<const H> >*]’ is deprecated [-Wdeprecated-declarations]
     chk_type(cache);
                   ^
a.cpp:6:21: note: declared here
 [[deprecated]] void chk_type(T t){}
                     ^

このような警告が出て、 cache の型の推論結果が表示されます。 一節には、そこらの IDE では推論できない推論結果まで教えてくれるらしいです。

/0830

https://speakerdeck.com/greymd/mei-ri-kou-keru-sieruyun-wojue-eyou?slide=31 これで遊んでた時の残骸だと思う。シェル芸いいよ。 xaa ってこれわけわからずに split 打った出力だよなあ。

% ls 0830
fuga  hoge  holidays  xaa

あと、同時期に "man コマンドクイズ" ってのにもはまってました。

man vim を実行すると vim - Vi IMproved, プログラマのテキストエディタ と表示され、 vim はエディタであるとわかるのですが、 man emacs を実行すると emacs - GNU project Emacs と表示され、「EmacsEmacsだ」という強い意志を感じることができます。

/0904

C++ラムダ式は関数ポインタに突っ込めるんだなあ・・・。 これで最適化を封じて時間計測する、みたいな技があると聞いた気がする。

#include<iostream>
using namespace std;

int main(void){
    int (*hoge)(int) = [](int n){ return n*n; };
    cout << hoge(10) << endl;
}

/0921

mkfifo ってコマンドを使うと名前付きパイプっていう面白いファイルを作ることができます。 もしかしたら環境によってコマンド名は違うかも。

% ls 0921
echo hello  fifo|  hello@  p|  preprocess.c

何ができるかは説明すると長くなるんだけど、2つのプロセスからこのファイルへの書き出しと読み出しが両方行われた時に初めて、2つのプロセスに書き出しと読み出しを行わせる(それまではブロックする)っていう挙動をします。

何に使えるかわからん。

/1024

やさしい C のポインタのお話。 言いたいことはすべてコメントになってる。

#include<stdio.h>

int main(){
    char h[4];
    h[0] = 1;
    h[1] = 2;
    h[2] = 3;
    h[3] = 4;

    // ポインタなんて所詮整数だからビット演算にかけられたりするよ
    printf("%p, %zu\n", h, (size_t)h);
    printf("%d\n", *(char*)((size_t)(h+3) & (-4)));

    putchar('\n');

    // ポインタなんて所詮その変数が格納されている"先頭の"アドレスでしかないから、サイズの違う型のポインタにキャストしてやればもともとの変数の境界なんてうやむやにできるよ
    *((short*)h+1) = *(short*)h;
    for(int i=0; i<4; i++) printf("%d\n", h[i]);

    putchar('\n');

    // short はここでは 2 バイト整数型として、それらを 1 バイトずつ表示。リトルエンディアン方式により下位のバイトが先行するのが見える
    short a = 258;
    printf("%d, %d", *(char*)&a, *((char*)&a+1));
}

この話を後輩に面白く話せるようになれたらいいなあ。 このコードが欲しければ好きに持って行ってください。

/1119

split コマンドの挙動を調べたくなったので、 sudo apt-get source coreutils してソースを拾ってきました。

いろんなコマンドの実装が読めて楽しいです。

% ls 1119
coreutils-8.23/                  coreutils_8.23-4ubuntu2.dsc  hgoe   xaa  xac
coreutils_8.23-4ubuntu2.diff.gz  coreutils_8.23.orig.tar.gz   pipe/  xab  xad

あとがき

思ったより何書いてるかわからないものが多くて抜粋に苦労しました。 広く浅く、いろんな言語、いろんな分野をやっているので、 面白い tips をご存じの方はぜひ教えて下さい!

#mixi_git challenge に参加した話

ざっくり言うと

mixi さん主催の git イベントに、 同じ学校の人(以下ペアの人)に誘われて行ってみたら、 1位タイになってしまったお話

です。

続きを読む

コンマ以下に生きる人のためのかっこいい時計のご紹介

おはようございます。 朝です。気づいたら朝です。

今日でインターンシップに来てから3週間になりますが、今日ももれなくお仕事です。 職場で寝てしまっても優しく布団をかけてくれる社員さんがいることを願っています。


さて、今日は、時の流れを感じられる、おしゃれな時計のご紹介です。

f:id:Iruyan_Zak:20160909064732g:plain

良いですよね、良さを感じますよね、ね? デスクトップにおいておくだけでいつでも時間に追われる感覚を味わえます。

・・・え?そんなことはいいから早く作り方を教えろって?

わかりました。 以下がプログラムです。bash上で動作しています。

#! /bin/bash

while true
do
# sleep 0.32
echo -ne \\r$(date +%T.%N)
done

ね、簡単でしょ? 一応説明しておきます。

  • while true
    while は、後続のコマンドが 0 (真)を返し続ける限り、 dodone に囲まれた内容を実行します。
    true は、すぐに 0 を返すだけの何もしないコマンドです。
    よってこれは無限ループを表します。
  • echo -ne \\r
    echo は引数をすべて(オプションを除く)標準出力に吐き出します。
    -n のオプションは、出力後に改行を行いません。
    -e のオプションは、エスケープシーケンスの出力を有効にします。
    \\r 、すなわち '\r' は、キャリッジリターンと言って、カーソル位置を行頭に戻します。
    よって、ここまでで、「出力を同じ行の行頭から流すことで書き換えを実現」したことになります。
  • $(date +%T.%N)
    $(command args) は、 command args を実行した時の標準出力に置き換えられます。
    例えば、 echo $(echo hoge) は、
    $(echo hoge)echo hoge の標準出力 hoge に置き換えられ、
    結果として全体は echo hoge と等価になります。
    今回は $(date +%T.%N)date +%T.%N の標準出力に置き換えられます。
    date コマンドは、現在の時刻を表示したり設定したりできるコマンドです。
    + で始まるフォーマット指定文字列を引数に与えてあげると、現在の時刻の表示方法をカスタマイズすることができます。
    今回は +%T.%N なので、 HH:MM:SS.mmmμμμnnn という形式で時刻を表示してくれます。

つまり、無限に同じ行に時刻を吐き出し続けることでめまぐるしく変わるナノ秒単位の時計を実現している、ということなのです。(実際ナノ秒までの精度はないはず)

ところで、お察しの通りめちゃくちゃ重いです。無限ループ回してますからね。 ということで、コメントアウトしている sleep コマンドを挿入することで、処理回数を減らすことができます。 かっこよさは少し減りますが、CPU使用率は結構削れます。

それでは、良いシェルライフを!

Git入門したい!

先日の記事に不適切な表現が含まれていたので、書き直します。


7/8、 "Gitって何?見習いプログラマのためのGit入門会" というイベントに、メンターとして参加してきました。

続きを読む

WordCamp Kansai、ですって!

こっちは元気な話題です。

7/10、"WordCamp Kansai"に参加してきました。

会場の大阪大学には昔行ったことがあるので、地図を開くことなくたどり着くことが出来た辺りから気分が良いです。

僕が参加したハンズオンは2つあります。

続きを読む

高専カンファレンスlol ブース発表担当運営として感じたこと #kosenconf

高専カンファレンスlol(以下、lol)が終わって数日が経ちます。

いるやんです。おはようございます。

先に伝言です。

運営からこれから高専カンファを開く人に対して言っておきたいこと

  • Slack使うなら10000件制限すぐに来るので有料機能を使うか、ログをうまいことバックアップすることを推奨します
  • フルスクラッチで事務仕事(メール文案を考える)すると運営のコストが跳ね上がるので、他のカンファレンスの情報を出来るだけ流用しましょう
  • カンファ直前は見えなかったタスクが急に発生するのでそれまでに必要なことは終了させておきましょう(今回は緊急タスクが本当に発生した)

さて、僕は運営をしてたわけなんですが、取り急ぎ、『ブース発表』の話をしないといけないなと感じたので書き留めます。 高専カンファレンスの説明はこのブログで行うと冗長になるので、適宜 公式サイト を御覧ください。

続きを読む