ELFとELFローダについて

ROPというハッキング手法がある。これを勉強していたら、共有ライブラリがメモリ上のどこに配置されるのか、それはどのタイミングなのか気になり始めた。そして、色々と文献を漁ってぼんやりとしたことは分かってきたが、知識が定着したとは言えないので、自分の理解をより深めるため、知識を定着させるため以下に、ELF周りの話を記す。

$uname -a
Linux VM 3.13.0-24-generic #47-Ubuntu SMP Fri May 2 23:30:00 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

$lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 14.04.5 LTS
Release:	14.04
Codename:	trusty

$ gcc --version
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4

// ASLR無効化
$ sudo sysctl -w kernel.randomize_va_space=0
kernel.randomize_va_space = 0

hello.c

#include <stdio.h>

int main(void)
{
    printf("Hello, World!\n");
    return 0;
}

ELF(Executable and Linking Format)

ELFとは、実行可能バイナリやオブジェクトファイルなどのフォーマットを規定したもの。ELFフォーマットのファイルは、ELFヘッダが先頭にあり、プログラムヘッダテーブル及びセクションテーブルがその後にあります。これらのヘッダ構造はelf.hに記述されている。

// http://lxr.free-electrons.com/source/tools/objtool/elf.h#L69
struct elf {
              Elf *elf;
              GElf_Ehdr ehdr;
              int fd;
              char *name;
              struct list_head sections;              
              DECLARE_HASHTABLE(rela_hash, 16);
      };

ELFヘッダ

ELFヘッダはELFファイルの先頭に必ず存在し、そのファイルがELFファイルであることを示す。

ELFヘッダはelf->ehdrのことで以下のように定義されている。

// http://lxr.free-electrons.com/source/include/uapi/linux/elf.h#L235

typedef struct elf64_hdr {
         unsigned char e_ident[EI_NIDENT];     /* ELF "magic number" */
         Elf64_Half e_type;
         Elf64_Half e_machine;
         Elf64_Word e_version;
         Elf64_Addr e_entry;           /* Entry point virtual address */
         Elf64_Off e_phoff;            /* Program header table file offset */
         Elf64_Off e_shoff;            /* Section header table file offset */
         Elf64_Word e_flags;
         Elf64_Half e_ehsize;
         Elf64_Half e_phentsize;
         Elf64_Half e_phnum;
         Elf64_Half e_shentsize;
         Elf64_Half e_shnum;
         Elf64_Half e_shstrndx;
         } Elf64_Ehdr;
$ readelf -h a.out 
ELF ヘッダ:
  マジック:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  クラス:                            ELF64
  データ:                            2 の補数、リトルエンディアン
  バージョン:                        1 (current)
  OS/ABI:                            UNIX - System V
  ABI バージョン:                    0
  型:                                EXEC (実行可能ファイル)
  マシン:                            Advanced Micro Devices X86-64
  バージョン:                        0x1
  エントリポイントアドレス:               0x400440
  プログラムの開始ヘッダ:          64 (バイト)
  セクションヘッダ始点:          4472 (バイト)
  フラグ:                            0x0
  このヘッダのサイズ:                64 (バイト)
  プログラムヘッダサイズ:            56 (バイト)
  プログラムヘッダ数:                9
  セクションヘッダ:                  64 (バイト)
  セクションヘッダサイズ:            30
  セクションヘッダ文字列表索引:      27

プログラムヘッダ

プログラムヘッダテーブルはELFヘッダのe_phoffで指定されるオフセットから始まり、e_phentsizeとe_phnumで決まる大きさのテーブルからなります。e_phentsizeがテーブルの中のプログラムヘッダのサイズを表し、e_phnumがそのテーブルの中にいくつセッションヘッダがあるか示しています。

$ readelf -l a.out 

Elf ファイルタイプは EXEC (実行可能ファイル) です
エントリポイント 0x400440
9 個のプログラムヘッダ、始点オフセット 64

プログラムヘッダ:
  タイプ        オフセット          仮想Addr           物理Addr
                 ファイルサイズ        メモリサイズ         フラグ 整列
  PHDR           0x0000000000000040 0x0000000000400040 0x0000000000400040
                 0x00000000000001f8 0x00000000000001f8  R E    8
  INTERP         0x0000000000000238 0x0000000000400238 0x0000000000400238
                 0x000000000000001c 0x000000000000001c  R      1
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
  LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000
                 0x000000000000070c 0x000000000000070c  R E    200000
  LOAD           0x0000000000000e10 0x0000000000600e10 0x0000000000600e10
                 0x0000000000000230 0x0000000000000238  RW     200000
  DYNAMIC        0x0000000000000e28 0x0000000000600e28 0x0000000000600e28
                 0x00000000000001d0 0x00000000000001d0  RW     8
  NOTE           0x0000000000000254 0x0000000000400254 0x0000000000400254
                 0x0000000000000044 0x0000000000000044  R      4
  GNU_EH_FRAME   0x00000000000005e4 0x00000000004005e4 0x00000000004005e4
                 0x0000000000000034 0x0000000000000034  R      4
  GNU_STACK      0x0000000000000000 0x0000000000000000 0x0000000000000000
                 0x0000000000000000 0x0000000000000000  RW     10
  GNU_RELRO      0x0000000000000e10 0x0000000000600e10 0x0000000000600e10
                 0x00000000000001f0 0x00000000000001f0  R      1


 セグメントマッピングへのセクション:
  セグメントセクション...
   00     
   01     .interp 
   02     .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame 
   03     .init_array .fini_array .jcr .dynamic .got .got.plt .data .bss 
   04     .dynamic 
   05     .note.ABI-tag .note.gnu.build-id 
   06     .eh_frame_hdr 
   07     
   08     .init_array .fini_array .jcr .dynamic .got 

ここでなぜ0x0000000000400000にELFファイルが配置されているか知りたい場合は
ELF実行ファイルのメモリ配置はどのように決まるのか - ももいろテクノロジー
を参照すると良い。
INTERPとは動的リンクを実際に処理するインタプリタ(リンカ)のことである。
http://lxr.free-electrons.com/source/fs/binfmt_elf.c?v=3.2#L559にELFファイルをメモリにロードする部分がある(多分)。
そこを読み解く前に、linux_binprm 型という、構造体の説明。これは、ユーザー空間にある引数をカーネル側で保持・加工する為のデータ構造らしい。

// http://lxr.free-electrons.com/source/include/linux/binfmts.h?v=3.2#L28

/*  
  * This structure is used to hold the arguments that are used when loading binaries.
  */
  struct linux_binprm {
          char buf[BINPRM_BUF_SIZE];
  #ifdef CONFIG_MMU
          struct vm_area_struct *vma;
          unsigned long vma_pages;
  #else
  # define MAX_ARG_PAGES  32
          struct page *page[MAX_ARG_PAGES];
  #endif
          struct mm_struct *mm;
          unsigned long p; /* current top of mem */
          unsigned int
                  cred_prepared:1,/* true if creds already prepared (multiple
                                   * preps happen for interpreters) */
                  cap_effective:1;/* true if has elevated effective capabilities,
                                   * false if not; except for init which inherits
                                   * its parent's caps anyway */
  #ifdef __alpha__
          unsigned int taso:1;
  #endif
          unsigned int recursion_depth;
          struct file * file;
          struct cred *cred;      /* new credentials * /
          int unsafe;             /* how unsafe this exec is (mask of LSM_UNSAFE_*) */
          unsigned int per_clear; /* bits to clear in current->personality */
          int argc, envc;
          const char * filename;  /* Name of binary as seen by procps */
          const char * interp;    /* Name of the binary really executed. Most
                                     of the time same as filename, but could be
                                     different for binfmt_{misc,script} */
          unsigned interp_flags;
          unsigned interp_data;
          unsigned long loader, exec;
  };

はじめに、ELFヘッダのサイズ分をmallocして、ELFヘッダを読み込み、各要素をチェックする。次に、全てのプログラムヘッダのサイズ分をmallocして、全てプログラムヘッダを読み込む。そして、それを順にチェックしていき、p_type(セグメンタイプ)がINTERPの場合、その内容を読み取る。つまり、elf_interpreter="/lib64/ld-linux-x86-64.so.2"。ここでは、open_exec()した後、interpreterのBINPRM_BUF_SIZE分(128byte)をloc->interp_elf_exに代入。つまりはinterpreterの情報。

次にp_typeがPT_GNU_STACKセクションの場合、ELFヘッダのp_flagsをチェックしてスタック上でのコード実行の可否を決める。(ここはDEPと関わってくる)。
次に、INTERPの妥当性(マジックナンバーと、アーキテクチャの適合性)をチェック。

flush_old_exec()で現在のprogramの情報を消し、新しいprogramのための情報にcurrentの情報をいれかえていく。current は、カーネル中で現在実行中のプロセスの task_struct 構造体 を保持する変数。(プロセス、リンク、task_struct構造体)
SET_PERSONALITY()で親のpersonalityを継承する。その後、currentの情報を更新していく。(ここはlinuxのプロセス管理のお話なので、いつか勉強したい)

次はELFをmmapingする。p_typeがPT_LOADの場合にp_flagsを調べ、パーミッションを設定する。ヒープセクションがbssセクションより下位アドレスにあった場合、対象領域をクリアする?
その後、 MAP_PRIVATEとe_typeがET_EXECであった場合ET_MAP_FIXEDをelf_flagsに設定。(https://linuxjm.osdn.jp/html/LDP_man-pages/man2/mmap.2.html/)
共有オブジェクトならランダムフラグを見てアドレス計算。
オフセットとか計算したら、elf_map(おそらく中身はmmap()、セマフォとかしてるし、後々解析する予定)する。
mmap()した先のアドレス、セクションのサイズ等をチェックする。
その後、ヒープセクション、bssセクションの調整?(よくわかっていない)

load_elf_interp()でinterpreterを読み込む。読み込もうとしているinterpreterのe_typeがET_EXECかET_DYN(共有ライブラリ)なのか、アーキテクチャは合っているか、interpreterのfile operation等をチェック。e_phentsizeとe_phnumでサイズチェック。
interpreterのサイズ分のメモリを確保して、kernel_read()する。その後、elf_map()で共有ライブラリをmappingする。
その後、読み込んだアドレス等をチェック。そして、current情報を更新。

453                         map_addr = elf_map(interpreter, load_addr + vaddr,
454                                         eppnt, elf_prot, elf_type, total_size);

462                         if (!load_addr_set &&
463                             interp_elf_ex->e_type == ET_DYN) {
464                                 load_addr = map_addr - ELF_PAGESTART(vaddr);
465                                 load_addr_set = 1;
466                         }

523         error = load_addr;

528         return error;

そして、start_thread(regs, elf_entry, bprm->p)で先ほどのerrorがeipに設定される。
この呼び出し元に戻ると、どうやらeipから実行するらしく、すなわち共有ライブラリが実行されることになる。

感想

OSのメモリマッピングの知識が欠けていたので、mmap()周辺が正しく解析できていない。よって、共有ライブラリの読み込み先アドレス等の計算が未だに分かっていないため、目的は達成できていない(参考文献読んだら理解できた)。メモリマッピングの勉強をしたら、また読んでみよう。
linux kernelのソースコードを初めて読んだ。面白くて仕方なかった。しかし、特有のデータ構造や頻繁に使われる関数等を一々追っていたため、記事の内容もまとまらず、知識も断片的なものとなった。これから他のところを読んだ時に、今回の知識は役に立つのであろうか?
もしそうでない場合は、また色々と追っているうちに闇に吸い込まれていくわけであるが、いつかは塵も積もり山となるであろう。

2016年を振り返る

今年は「Hard Work」をテーマとして掲げていた。それは概ね達成できたと思う。
そしてその副産物として、色々得ることができた。
また、初めて経験することが多く、これからの人生で過去を振り返る時にもターミングポイントになるだろうものがあった。
そこで、今年の振り返りと題して、それらを少々まとめることにする。(だいたい時系列)

Interconnect

ラスベガスで行われたIBM Interconnectに参加した。初めての海外だったので、それだけでも充分に目新しいことが多かった。しかし、このイベントではそれ以上に得るものが多かった。
国際的なイベントの規模の大きさ!新しい技術!自分の知らない文化!
刺激が多かった。吸収仕切れない。
あの時の興奮は、今でも頭の中に強く残っている。
IBM InterConnect2016に参加してきました - blue9's 外壁


表彰式

これまで表彰式と無縁の人生を送ってきたため、たいそう嬉しいことだった。
ランチに食べた、いいホテルの高いコース料理は、庶民の舌には美味しいのかよく分からなかった。
1日に3件も取材を受けるなんて、一生に一回あるかないか。いい経験になった。
WIREDは好きなメディアなので、取材されたのは嬉しかったな。
千葉裕也 | メインフレームは「世界への扉を開く鍵」その存在を知って、すべてが始まった « INNOVATION INSIGHTS

北陸旅

金沢は素晴らしい。文化が洗礼されていた。
新潟も良かった。
夏に旅に出られなかったため、無理してでも行って良かった。
f:id:blue_9:20161230223150j:plain
f:id:blue_9:20161230223251j:plain

世界大会

日本代表として、2016 IBM Master the Mainframe World Chimpionshipに参加した。
偶然にも大学の授業が休講だったため、2週間ほど誰にも会わず、じっくり取り組んだ。
問題を与えられたら解きたくなる性分だし、分からないことに頭を悩ますのが大好きなので、幸せな2週間だった。
メインフレーム・コンテストで、正しく理解できてなかったなとか振り返る機会にもなったので良かった。
f:id:blue_9:20161230223826p:plain

インターン

K社とF社でインターンをしてきた。
プログラマをしていたけれど、経営者の方々と近いところで仕事をしていたため、そこから影響を強く受けた。
K社社長のNさん、F社PEのSさんと尊敬すべき方に出会えたことは良かった。
インターンの経験は素晴らしく、自分の進路選択に強い影響を与えた。

ミニマリズム

10月から生活にミニマリズムを取り入れた。
前から気になってはいたけれど、本格的に取り入れるに踏み切ったのは、重大な判断をする機会が増えたからである。

試練は年齢と共に高まる
ゲーテ

重大な判断に迫られる中で、一つ一つの小さな判断が邪魔に思えてきた。
人生の分岐点で右に行くか左に行くか判断しなければならない時に、「今日はどの服を着ようか」なんて判断はどうでもいい。
完全に(そもそも完全とは?)ミニマリズムを取り入れられたわけではないので、これからも試行錯誤する必要がある。
現在のところ、良い感じである。

ヘッセ

夏以降、気分が上がらず、会う人会う人に「元気ないですね」と言われ続けた。
気分が上がらなかっただけで、凹んでいたわけではない。ただ、色々考えていたのである。
そんな時、かつて恩師に勧められたヘルマン・ヘッセの「シッダールタ」を読んだ。
ヘッセには昔から興味はあったが、ここまで共感・感服したのは、この本が一番だ。
それから1920年代のヘッセのエッセイ、詩を読み漁った。
彼は素晴らしい思想を持っていた。僕は傾倒してしまった。
しかし、彼は
「どんな本のどんな1ページも、君に智慧は与えることはできない」
と言う。
シッダルタ (岩波文庫)

2017

人間の記憶は当今の出来事、思想を色濃く反映してしまう。
よって、2016年を現在振り返るのと、未来に振り返るのでは、異なった見え方になるのであろう。
本当はここに私情をもっと記しておきたいが、....やめておこう。

12月に同い年のとても面白い奴に出会った。
「新しい知識を得るためにはリスクが必要だよ」
彼は言った。
ハッとさせられた。
これまで、リスクがないように選択し、重大なことから逃げてきたことを。
そして、選択においてリスクを取る必要が迫っていることに気づきながら、無視していたことを。
その場で、来年のテーマは「リスクを犯せ」にしようと決めた。

昨年は「動」、今年は「Hard Work」、来年は「リスクを犯せ」。

来年も面白い一年になるに違いない。

プログラマとデザイナ

親友

親友に美大でデザインを専攻している者がいる。彼とは古くから親しく、この世界で唯一、自分が考えていること全て話せる存在だ。
少し前に彼から興味深いことを言われた。「君は漫画もカードもゲームも好きではないし、全く趣味は合わない。でも、人生に対する考えが好きだから一緒に遊ぶのだと思う。」
全くその通りである。そんなことは僕もずっと思っていた。でも、一つだけ疑問があった。
彼はデザイナであり、僕はプログラマである。彼は絵が上手で、僕は絵が下手だ。彼はクリエィティブだし、僕はクリエィティブではない。
趣味も違うし、よりパーソナルに近い部分でも違う。しかし、彼と馬が合うのなら、何か共通することがあるのではないか。

デザイナ

最近、様々な業種の方々と仕事をすることがあった。初対面の席でお互い、自分の職業と仕事を選んだ理由、仕事で何を得たいのか自己紹介した。
そこで、二人ほどとても興味深いことを話す方がいた。思考手順が面白かったのだ。彼女らはデザイナだった。その時は職業というより、二人の個人としての魅力が興味を誘っているのだと思った。
そういえば、二人はクールな腕時計を身に着けていた。

消費

その後、デザインを学んでいる友人と遊ぶ機会があった。彼とは高校の時からの関係で、卒業後も定期的に会う仲であるが、基本的には話が合わない。
遊んでいる途中、彼が「この時計買った」と左手首に巻いた腕時計を見せてくれた。Paul Smithのロゴが入っていた。聞くところによると、3万5千円ほどらしい。
「でも、他にも欲しい時計があって、イッセイ・ミヤケのやつなんだ。でも、4万以上するんだよね」彼は楽しそうに話していた。そして、他にも欲しい物がたくさんあるらしい。
別にブランドを身に着けるのは悪いとは思っていない。しかし、次から次へと物欲に燃えている彼は消費そのものであった。それを見て、直感的に彼はデザイナではないなと思った。

アート

僕はその仕事でプログラムを書いていた。でも、これまでとは違う。良い設計を考えて、エレガントなコードを書くことは求められていなかったのだ。求められていたことは、ただただ設計書通りに狂いなくコードを書くこと。
そこに創造はいらなかったのだ。それは退屈であったし、ショックであった。しかし、現実の仕事とはそういうものらしい*1。そこで僕は、自分がプログラムを創造することに愉しみを見出していたことに気づいた。
僕にとって、プログラミングは第一級のアートだったのだ。

創造

件の仕事の最後に、まとめのミーティングがあった。そこでもやはり興味深いことを話す方々がいた。彼らはデザイナであった。
退社後、彼らと飲みに行った。その席で「いい時計してるね」と言われた。僕がつけていたのは、スウェーデンのメーカの1万円くらいの腕時計だった。
声をかけてくれた彼女は白と黒のスタイリッシュな素敵な腕時計をしていたので、「それもいいね」と僕は返した。
「でしょ?これ2500円の20%割引で買えたの!」彼女は答えた。隣のデザイナが光沢のある青の文字盤に金色の時刻点がある美しい時計をしていたのも気になっていたので、「それは?」と聞いてみた。
「これはね1200円だったの」彼女は答えた。安価な物であったが、素晴らしいデザインで、彼女らにとてもお似合いだった。そして個性が光っていた。
そこで、自分に似合う腕時計を身に着けることは創造だと気づいた。

共通点

僕は絵を描いたり、何かをデザインしたいと考えたことはない。非クリエィティブな人間だ。だから、デザイナという職業とはかけ離れていると思っていた。
しかし、振り返ってみると、僕がプログラミングにこれほど熱狂できるのは、「どうすれば良い設計になるだろう?どう書けば、もっとエレガントになるのだろう?」と考え続けることができたからであると思う。
そこにhackしがいがあったのだ。創造があったのだ。
これで彼と共通することが分かった。対象は違っていても、お互い何かを創造することを楽しむ心を持っていたのだ。
そして、創造するための思考手順に似たものをお互い感じ取っていたのだ。

いつか彼にこのことを話してみようと思う。きっと、創造に富んだ返答をしてくれるだろう。

*1:もちろん会社によって違う。僕がいたところはウォーターフォールモデルで開発が進められていた。設計書に逆らってはいけないのだ

IBM InterConnect2016に参加してきました

2月21日から24日の間、IBM InterConnect2016に参加してきた。
そのまとめ。

1日目

General Session Day 1: Digital Business Transformation

InterConnect2016最初のSession!
とりあえず、会場が広くて規模の大きさに圧倒された。
ITイベントは初めてだったため、どのように聴けば良いか分からなったが、Appleのトークは印象的だった。
f:id:blue_9:20160228234514j:plain
スライドの見易さ、トークの間の置き方は他とは違った。
IBMのイベントにも関わらず、内容はSwiftのことばかりw。
しかしSwiftを触りたくなったし、自分達のプロダクトを押し通せるのはさすがだなと思った。

Thought Leadership Session 1 : Getting Closer to the Customer - at the InterSection of Cloud, Mobile and Analyticsf:id:blue_9:20160229000622j:plain

この5つのLessonsはビジネスだけでなく、研究でも使えそうな気がする。

Lunch

f:id:blue_9:20160229000902j:plain
国籍・文化の違う人達が集まってご飯を食べることは初めてだったので、
料理もそうだし、食事マナーとか面白いなと思った。

Cognitive Service Management for Hybrid Cloud
Thought Leadership Session 2 : Cognitive IoT - The New Leadership Agenda
Solution EXPO Reception

様々な企業やIBMの技術のブースが出展。
ビールも飲み放題!
いろいろと回って、Tシャツやステッカーを手に入れた。(めちゃくちゃ嬉しい!)
f:id:blue_9:20160307153535j:plain

2日目

HSBC's Transformation to a Centralized, Worldwide Operations Center
General Session Day 2 : IT Transformation

f:id:blue_9:20160229004141j:plain
watsonの話があったり。
f:id:blue_9:20160229004247j:plain
ホテル予約アプリをAPIを連帯させて作成するデモをしたり。それにしても便利だなー。

Thought Leadership Session 3 : Security at the Speed of Cloud

f:id:blue_9:20160229005952j:plain
セキュリティの話。クレジットカードの暗証番号を盗まれた人が結構いて驚いた。
アメリカでもセキュリティー技術者が足りないらしい。
Watsonに技術者のスキルを教えこませたらねっていう話は面白かった。

Rise of the Machines : IBM Watson and Robotics

Robotf:id:blue_9:20160229012422j:plain
Robotのお話。
講演者のhacker感が印象的だった。

Thought Leadership Session 4 : API economy

f:id:blue_9:20160229012930j:plain
「破壊するより破壊される者になれ」

3日目

Thought Leadership Session 5 : DevOps & Open Technologies - Innovate Like a Startup, Scale for the Enterprise

f:id:blue_9:20160229014206j:plain
良い言葉。

General Session Day 3 : Personal Transformation

f:id:blue_9:20160229020313j:plain
RunkeeperのCEOが登場。
「情熱を持つことが大事」
「学生が未来、テクノロジーを作りデータサイエンティストになることを期待する」

f:id:blue_9:20160229020812j:plain
「IoTは意味あるものに」
「データを如何にアクションにするか」
「what if → 何か意味あるものにできないか。」

f:id:blue_9:20160229021442j:plain
見た目がすごいおじいちゃん登場!変人に違いないw
でも、言ってることはすごい。
「情熱を失わないために、仕事に遊びを入れる」
「遊び仲間を見つけろ」
「難しければ難しいほど遊ぶ」
「経験をコミュニティに還元するのが工学学士のやり方」

楽しそうに熱く語っている姿がかっこよかった。

EXPO

午後はEXPOの見学ツアー。
知らない技術がたくさんあった。
IoTや人工知能の発展は本当にすごいし、未来がそこにあった。
f:id:blue_9:20160229031109j:plain
世界に2台しかない、透明のZ13も見せてもらった。

Elton John LIVE

f:id:blue_9:20160229031422j:plain
夜はElton Johnのライブ!
最高、本当に最高!
素敵な夜でした。

4日目

Demonstrating How the Insurance Industry Transformation Can Leverage the IBM Watson IoT Platform

f:id:blue_9:20160229031755j:plain

頭に端末を装着すると、その人がどのような動きをとったか判断するみたい。
人間のそれそれの動きにも特徴点みたいなのがあるのか?

EXPO

最後にもう一度EXPOを見て回った。watsonのAPIのデモを見せてもらったり、Oculus RiftでVRを体験してみたり、楽しかったー!知ってる単語並べて話しただけだったけど、皆さん優しく接してくれて有り難かった。

感想

普段、技術トレンドはネットの記事で情報を得るが、実用例を聞いたり、デモを見たりする方がよっぽど良い。
デモを見るとAPIの使い方が分かって、自分でもやってみたくなる。それに、実用例を聞くと大学の研究と企業の製品との間の橋渡しのところについて考えたくなる。
そして、プレゼン。圧倒された。観衆を壇上に惹きつける能力たるや。
内容と同じくらい見せ方も大事なのだなと思った。
特にJohn Cohnが楽しそうに熱く話している姿にはとても感銘を受けた。
コンピュータ・サイエンスを極めている人はかっこいい。

海外もイベントも初めてだったが、それゆえ触れるものすべてが刺激的だった。
共に参加した人は初対面の方だったが、とても興味深い人で、たくさん話をして色々と教えていただいた。
彼との出会いは僕の人生観に影響を与えるであろう。
このイベントを通して、新しい技術の開発とその技術を世の中に導入するところに興味を持った。前者は研究、後者は論文から実用の間のところ。
これからの研究に活かしていきたい。

本当に良い経験になった。また来年も参加したい。

「30日でできる! OS自作入門」 開発環境構築 for mac

ふとしたことがきっかけでOSを勉強してみようと思った。
もう少しパソコンの内側を知りたい。
コードがコンパイルされてからの先をもう少し知りたい。
それならOSを作りながら学べば良いのではと思った次第である。

大学の講義でOSは学んだことはあるが、コードは一切出てこないし理論だけだったので面白くなかった。
だからコードを書きながらOSを学べる本が良かったので、この本を図書館で借りてきた。

30日でできる! OS自作入門

30日でできる! OS自作入門

さて勉強しようと思ったが、この本はwindows向け。最近、macを手に入れwindowsを手放した矢先のことであった。
しかし!なんと!macでも勉強できるようにしてくれている人がいた!
github.com

だが、ここに書いてあるようにやってもできなかったので少しメモ。

まずは、僕みたいに図書館で借りてきたのでCD-ROMがないという人!
30日でできる! OS自作入門
ここにあります。"HariboteOS.iso"ってやつです。

次に2.シェルスクリプト実行の項。

curl https://raw.github.com/sandai/30nichideosjisaku/master/bin/install.sh | sh 

をターミナルで実行せよとあるが、これをやっても上手くいかない。
そこで、このページのgitリポジトリをダウンロードし、その中のbin/install/install.shを実行する。
そして、次のように表示されれば成功。
f:id:blue_9:20160108192607p:plain
その後は3.確認の項にあるようにすれば同じように動くはず。



参考文献
OS自作入門 その5 - 勉強覚え書き

IBMメインフレーム・コンテスト2015

2015年12月10日をもって、メインフレーム・コンテスト2015が終了した。
www-06.ibm.com

10月に大学の後期が始まり、掲示板を確認しに行ったときに張り紙を見て知った。
それから申し込みをして、約2か月取り組んだ。

コンテスト通して思ったことをまとめようと思う。

メインフレーム

メインフレーム」。アーキテクチャ系の講義の「コンピュータの歴史」で聴いたことがあるような・・・。
張り紙を見た時に「プログラミングにチャレンジ!」と書いてあったから、参加してみただけで、正直メインフレームが何か良く分からなかった。
学生向けのコンテストであるが、現在の学生はコンピュータ=パソコン世代なので、知っている方が珍しいに違いない。そして、学生でそれを触ったことがある人なぞ、さぞいないだろう。
というわけで、このコンテストでは初めにメインフレームについてのpdfが配られる。
しかし、そこには少しの説明しかないし、コンテストを終えてみても少し分かったような・・・。
メインフレーム - Wikipedia
詳しくはwikipediaを見るのがいい。
ざっと述べると、企業や銀行などで使われるシステムを動かすための基盤のコンピュータ。高額でハイスペックなコンピュータ。

メインフレームコンテスト?

IBMが主催するメインフレーム・コンテストは世界中40ヵ国で開催されている。日本での開催は初めてとのこと。
そういうわけで、問題文が全て英語。これを知ったときは、ビビった。だって、「プログラミングにチャレンジ!」って日本語で書いてあったじゃん。
しかし、そこは仕方ないと割り切り問題を解くことにした。
このコンテストはPart1、Part2(17問)、Part3(16問)から成り立っている。Part1はコンテストの説明くらいで、問題を解くのはPart2から。
問題を解くといっても、このコンテストは一問一問解きながらメインフレームを理解しよう!というスタンスらしく、各問題には、メインフレームに使われている技術や歴史の説明と課題文があり、参加者は説明を基にしながら課題を解くといった具合だ。
Part2よりもPart3の方が難しいとあるが、難易度は変わらない。簡単なのもあれば、難しいのもある。
では実際にどんな問題がでるかというと、これが幅広い。C・C++JavaCobol・Assemblerなどの言語から、SQLJSON・MongoDBなどのDBに関するものから、JCL・Linuxコマンド・Z/OSコマンドから、いろいろと出題される。
CobolやDBなんて、学生は使ったことない。ほとんどの技術が授業で少しやったことがある程度で、やんわりとしか分からない。
このような感じで正直なところ、「コンピュータスキル・コンテスト」という方が正しい気がする。
そして、最後にこれらの知識の集大成として、JavaSQLを使ってプログラムを作成する。

感想

このコンテストは、よく分からない技術について英語の説明文を読んで、問題を解く。客観的に見てすごいと思うし、自分自身よくできたと思う。
大学3年の後期で何か成せねばなと考えていたときだったので、張り紙を見た時に、これで上位に入賞しようと思ったのがきっかけだった。
根気よく初めてみたものの、この問題を解いても意味があるのだろうか?コンテストで入賞して意味あるの?随時そんなことを考えていた。そして、Part2を解き終わってPart3に進むときやめようと思った。しかし、それから10日ほど経ってからPart3を解くことに決めた。中途半端にしたくないなという気持ちと純粋に問題を解くことが楽しかったから。それからは諦めることなく問題を解き進めた。
コンテストを終えて思う事は、良く頑張れたなということ。英語も得意な方ではないが、調べながらでも書いてあることが理解できたし、初めて知る技術についても、経験則を利用してすぐに身に付けることができた。そして、問題の大半がこれまで大学で勉強してきたことで、自分にも力が付いたのだなと実感することができた。これは尊い経験となった。
コンテストの解答には自信があるし、上位入賞は狙っている。アメリカにも行く気でいる。しかし、それ以上にコンテストで得られたものが大きかった。
自分も力が付いてきているし、社会で戦えることが分かった。自分は何者でもないし、力が欲しいと思って、大学で通っているわけだから、力が付いたことが分かったのはとても自信になる。大学からコンピュータについて学び始めたことは遅いことだと思っていた。しかし、それでもたくさん勉強したことで、コンテストでも戦えるくらいになれたし、やってきたことは間違いではなかったようだ。
IBMメインフレーム・コンテスト2015。参加して良かったと思う。



P.S.
このコンテストは普段は触れることがないような技術に触れることができる素晴らしい機会だと思う。社会の基盤となっているものこそ、学生が接する機会が少ない。だからIBMさんにはとても感謝している。これを機に、他のところでもこのようなコンテストや勉強会などを開催して、学生が経験できないような技術に触れることができる機会を設けていただきたい。

Rails ルーティング設定

Ruby on Railsのメモ。

Ruby on Railsを使うことになり、Rubyの勉強から始めた。そして、Rubyについて分かったきたので、下記のサイトでRailsの勉強を始めた。

www.rubylife.jp

一つ問題。コントローラとアクションの作成とルーティングの設定 - Ruby on Rails入門の「ルーティングの設定」でroutes.rbに

Books::Application.routes.draw do

  match 'hello' => 'booklist#hello'
  match 'bye' => 'booklist#bye'

end

と記載するとあるが、この通りにすると、
f:id:blue_9:20151212011103p:plain
と表示される。よく分からないが、"match"ではなくて"get"を使えとのこと。ということで変更する。

Books::Application.routes.draw do

  get 'hello' => 'booklist#hello'
  get 'bye' => 'booklist#bye'

end

f:id:blue_9:20151212011917p:plain
希望通りに表示された。


なんとか解決したが、routes.rbにおける、matchとgetの違いが分からない・・・。分かり次第、追加記載しようと思う。