自作OS入門の環境をOS Xで整える
動機
「30日でできる!OS自作入門」を読み実装しようと思ったところ、環境がwindows。おまけにアセンブラやビルド環境がWindows故、そのまま流用できませんでした。
そこで少し色々調べた結果、http://bttb.s1.valueserver.jp/wordpress/blog/2017/11/14/make-os1/ この方のブログが大変シンプルに纏まっており参考にさせていただくことにしました。 このブログの環境はLinuxなので大体は流用することができます。
1日、2日目の内容はアセンブラオンリーなので特に問題はなかったのですが3日目以降はC言語とアセンブラをリンクしてビルドする必要がでてきます。 この際、OS Xだと少々一筋縄ではいかない問題がでてきます。
それがgccとldリンカです。OS Xに標準で入っているのは恐らくXcode-command-line-toolsを入れた時に一緒に入るgccです。
gccは別にいいのですがldはGNU ldではないため、リンカスクリプトを指定する-T
オプションがありません。
そこで、本はi386をターゲットにビルドしているのでi386のクロスコンパイル環境を構築することにしました。
以下にその際の手順を示します。
QEMU
brew install qemu
nasm
brew install nasm
i386-elf-gcc, gnu ld
ここからが少し長いです。 基本的に同じコマンドを実行すれば大丈夫なはずです(2018-5現在)
brew install gcc6 export CC=/usr/local/Cellar/gcc@6/6.4.0_2/bin/gcc-6 # ↑の手順でinstallしたGCCのパス export LD=/usr/local/bin/gcc@6/6.4.0_2/bin/gcc-6 export PREFIX="/usr/local/i386elfgcc" export TARGET=i386-elf export PATH="$PREFIX/bin:$PATH" # binutilsのインストール mkdir /tmp/src cd /tmp/src curl -O http://ftp.gnu.org/gnu/binutils/binutils-2.28.tar.gz tar xf binutils-2.28.tar.gz mkdir binutils-build cd binutils-build ../binutils-2.28/configure --target=$TARGET --enable-interwork --enable-multilib --disable-nls --disable-werror --prefix=$PREFIX 2>&1 | tee configure.log sudo make all install 2>&1 | tee make.log # libiconv最新版をインストールする cd /tmp/src curl -O https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.15.tar.gz tar xf libiconv-1.15.tar.g cd libiconv-1.15 ./configure -prefix=/usr/local make make install # クロスコンパイラなGCCをビルド cd /tmp/src curl -O https://ftp.gnu.org/gnu/gcc/gcc-6.4.0/gcc-6.4.0.tar.gz tar xf gcc-6.4.0.tar.gz mkdir gcc-build cd gcc-build ../gcc-6.4.0/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --disable-libssp --enable-languages=c --without-headers --with-gmp=/usr/local --with-mpfr=/usr/local --with-mpfr=/usr/local --with-libiconv-prefix=/usr/local make all-gcc make all-target-libgcc sudo make install-gcc sudo make install-target-libgcc
最終的な環境
- 開発環境: OS X HighSierra
- エミュ: QEMU emulator version 2.11.0 Copyright (c) 2003-2017 Fabrice Bellard and the QEMU Project developers
- アセンブラ: nasm
- Cコンパイラ: gcc - i386-elf-gcc (base gcc ver6)
- リンカ: ld - gnu ld
テスト
以上の環境構築が終了した場合、
の day4/harib01j
内で make run
をするとそれっぽいosの画面がqemuで開くはずです。
brew updateしたらなんかvimが動かなくなった
ある日 brew update
したらvimが
dyld: Library not loaded: /usr/local/opt/lua/lib/liblua.5.2.dylib Referenced from: /usr/local/bin/./vim Reason: image not found
/usr/local/opt/lua/lib/liblua.5.2.dylib がないと言われた。実際にパスに移動するとなかった。
ということで
bilibili-mac-client/liblua.5.2.dylib at master · typcn/bilibili-mac-client · GitHub からファイルをダウンロードして /usr/local/opt/lua/lib
にmvしたら動いた。
Contikiにおけるファイル分割してコンパイルの仕方とPROCESSによる並列実行
卒業研究で使ってるWSN用のOS、というより超巨大ライブラリのContikiというものについてメモしておきます。
Why
そもそも日本語のドキュメントは勿論、英語でのドキュメントもサンプルを動かしただけとかばっかで深いところに突っ込むにはソースコード読むしかないという現状だったのでもし他にこの分野に手を付ける人がいたらその助けになればいいなという思いと、自分で忘れないようにするために書いておきます。
Contikiとは
WSN用のOSです。マルチスレッドを標準でサポートしています。何を当たり前のことをと思うかもしれませんが無線センサネットワークとかの界隈ではリソースの都合上結構すごいことだったりする。
このOSで動くプログラムはC言語で書けます。これまた「今時C〜?古くない〜?」と言われそうですが、結構有名なWSN用のOS、TinyOSとかはnesCとかいうドキュメントは英語の本一冊のみという魔の言語で書かなきゃいけなかったりするので恵まれている方です。
あとCoojaというGUIシミュレータが付属しているので基本的には書いたプログラムをこのシミュレータでデバッグしながら開発することができます。 とりあえずContikiで動かすことができるもっとも簡単なプログラムを示します。
#include "contiki.h" #include "stdio.h" /*---------------------------------------------------------------------------*/ PROCESS(hello_world_process, "Hello world process"); AUTOSTART_PROCESSE(&hello_world_process); /*---------------------------------------------------------------------------*/ PROCESS_THREAD(hello_world_process, ev, data) { PROCESS_BEGIN(); printf("Hello, Cooja\n"); PROCESS_END(); } /*---------------------------------------------------------------------------*/
お決まりのHello world!ですがこれだけでも結構なことをしています。 一行ずつ説明していきます。
PROCESS(プロセス名, プロセス呼び出し時に出力する文字列)
これは
hello_world_process
という名前のプロセス構造体を定義しています。第二引数は呼び出し時に標準出力に出力する文字列です。AUTOSTART_PROCESS(プロセス構造体のアドレス)
センサー起動時にこのプロセスを自動的に起動します。これがないとセンサを起動しても何も起きません。 プロセスをコード上で任意に起動することもできますがそれは後述します。
PROCESS_THREAD(プロセス構造体, イベント, データ) { ... }
プロセスの実際の処理を記述する関数です。このPROCESS_THREADは他のPROCESS_THREADとは並列に処理されます。 イベントはセンサ本体のボタンなどが押されたときのシグナルを判定する時に使用します。 データはコード上でプロセスを起動した時に任意のデータポインタを渡すことができます。
PROCESS_BEGIN() ... PROCESS_END()
この間に書かれた処理が実行されます。 PROCESS_END()が実行されても完全にプログラムの実行が終わったわけではなく, バックグラウンドではセンサ毎に定義されているOSプログラムが存在して, 低電力モードなどへの移行を行っています。あくまでここに定義されたプロセスをベースとなるOS上で実行しているイメージです。
コンパイルの仕様
センサで動かすプログラムをContikiがコンパイルする際には全てMakefileでセンサーごとに独自のバイナリにコンパイルしていきます。
例えば、上の hello_world.c
をコンパイルする際にはMakefileはこのようになります。
CONTIKI_PROJECT = hello-world all: $(CONTIKI_PROJECT) CONTIKI = ../.. include $(CONTIKI)/Makefile.include
makeする際には make TARGET=...
でTARGETに動かしたいセンサを指定します。
あとはhello-world.cにガリガリ書いていけばいいのですがある程度コードの規模が大きくなると1ファイルで管理するのは非常に面倒でした。 そこで他のヘッダファイルに定義した関数を別のcファイルで実装し、それを呼び出す場合は
Makefileに PROJECT_SOURCEFILES += hoge.c fuga.c
と定義します。
この時のディレクトリ構成はこんな感じです。
. ├── Makefile ├── README.md ├── fuga.c ├── fuga.h ├── hello-world.c ├── hoge.c ├── hoge.h ├── symbols.c └── symbols.h
この時, fuga.c hoge.c
を別階層のディレクトに配置すると, コンパイルしたファイルを参照できなくなりエラーが起こります。
別プロセスの呼び出し
では試しに hoge.h
にhoge_processを定義し, hoge.c
に実装し, hello-world.c
でボタンが押された時に hoge_process
を呼び出す処理を書いてみます
hoge.h
#ifndef _HOGE_H_ #define _HOGE_H_ void start_hoge_process(); #endif
hoge.c
#include "contiki.h" #include "stdio.h" PROCESS(hoge_process, "hoge process"); PROCESS_THREAD(hoge_process, ev, data) { PROCESS_BEGIN(); printf("hoge %d\n", data); PROCESS_END(); } void start_hoge_process(void) { process_start(&hoge_process, (void *)100); }
hello-world.c
#include "contiki.h" #include "dev/button-sensor.h" #include "dev/leds.h" #include <stdio.h> /* For printf() */ /*---------------------------------------------------------------------------*/ PROCESS(hello_world_process, "Hello world process"); AUTOSTART_PROCESSES(&hello_world_process); /*---------------------------------------------------------------------------*/ PROCESS_THREAD(hello_world_process, ev, data) { PROCESS_BEGIN(); SENSORS_ACTIVATE(button_sensor); printf("Hello, Cooja\n"); while(1) { PROCESS_WAIT_EVENT_UNTIL(ev == sensors_event && data == &button_sensor); start_hoge_process(); } PROCESS_END(); }
これによって hello-word.c
をコンパイルしてcoojaシミュレータで起動(センサーの種別は問いません)し、
センサのボタンをクリックするとログに hoge 100
と出力されるはずです。
ContikiのMakefileには独自のフラグが多くあるのでまた自分が何か見つけたらメモしておこうと思います。 私のContikiで開発中のリポジトリはこちらです。興味があったらContikiでプログラミングしてみてください。 そして私に知見をください。
contiki本体のリポジトリはこちらになります
wikiも一応あるにはありますが大体動かしつつソース読むのが手っ取り早いです。
それにしてもWSNの具体的なユースケースや規模がググっても全然出てこないので評価の仕様策定に苦戦中です。 辛い
HighSierraにアプデしたらvimが起動できなかった
macをHigh Sierraにアプデしたんですが、コンソールでvimを起動したらこんなメッセージが
dyld: Library not loaded: /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/libruby.2.0.0.dylib Referenced from: /usr/local/bin/vim Reason: image not found
ググると先人さまの知恵がありました。
とりあえず色々アプデする必要がある模様。
まずpythonをアプデしようとしたら
$ brew upgrade python Updating Homebrew... xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun ==> Auto-updated Homebrew! Updated 2 taps (homebrew/core, caskroom/cask). ==> New Formulae avimetaedit bedtools cling clingo docker-ls envconsul mrboom raylib sceptre ==> Updated Formulae little-cms2 ✔ checkstyle fail2ban gitlab-runner kontena libuv nghttp2 pyvim shfmt uncrustify sbt ✔ clhep firebase-cli gmime kotlin libwps nmh q sile urh abcm2ps cmake fish gradle-completion kubernetes-cli lldpd node-build qca sip vcdimager angular-cli conan fluent-bit grails kvazaar mapnik nuget qscintilla2 skinny wireguard-tools arangodb conjure-up fn gx ldc mediaconch ocamlbuild qt sslyze xonsh armadillo consul fonttools gx-go libatomic_ops mgba opencbm rancher-cli stormlib xxhash aspcud convmv freetds hana libcddb micro overmind rebar@3 swi-prolog youtube-dl aurora-cli cppad fwup hivemind libcdio midnight-commander paket remake swiftformat zanata-client awscli docker gauge huexpress libcouchbase minio pandoc rocksdb termius zimg azure-cli@1 docker-completion gdnsd ibex libdivecomputer miniupnpc parallel roswell terragrunt bacula-fd efl gegl iso-codes libgosu mockserver passenger rust tgui blink1 ejabberd geoserver jhipster libhttpseverywhere mono-libgdiplus pegtl scalariform thefuck bmake erlang geth knot libmaxminddb mpd percona-toolkit sdl2_mixer tidy-html5 bwfmetaedit etsh ghc kobalt librealsense multimarkdown plzip sfk tippecanoe bzt exim git-annex kompose libsass nativefier pyqt shairport-sync traefik ==> Deleted Formulae clasp gringo ==> Upgrading 1 outdated package, with result: python 2.7.14 ==> Upgrading python Error: The following formula: python cannot be installed as a binary package and must be built from source. Install the Command Line Tools: xcode-select --install
なんかこけた
xcodeコマンドラインツールないよって言われたので xcode-select --install
実行
そしたらポップアップでウィンドウが出てきたのでそのままインストール
もう一回実行してちゃんとインストールされたか確認
$ xcode-select --install xcode-select: error: command line tools are already installed, use "Software Update" to install updates
されてますね。
~ brew upgrade python Updating Homebrew... ==> Auto-updated Homebrew! Updated 1 tap (caskroom/cask). No changes to formulae. ==> Upgrading 1 outdated package, with result: python 2.7.14 ==> Upgrading python ==> Installing dependencies for python: sqlite, openssl ==> Installing python dependency: sqlite ==> Downloading https://homebrew.bintray.com/bottles/sqlite-3.21.0.high_sierra.bottle.tar.gz ######################################################################## 100.0% ==> Pouring sqlite-3.21.0.high_sierra.bottle.tar.gz ==> Caveats This formula is keg-only, which means it was not symlinked into /usr/local, because macOS provides an older sqlite3. If you need to have this software first in your PATH run: echo 'export PATH="/usr/local/opt/sqlite/bin:$PATH"' >> ~/.bash_profile For compilers to find this software you may need to set: LDFLAGS: -L/usr/local/opt/sqlite/lib CPPFLAGS: -I/usr/local/opt/sqlite/include For pkg-config to find this software you may need to set: PKG_CONFIG_PATH: /usr/local/opt/sqlite/lib/pkgconfig ==> Summary 🍺 /usr/local/Cellar/sqlite/3.21.0: 11 files, 3.0MB ==> Installing python dependency: openssl ==> Downloading https://homebrew.bintray.com/bottles/openssl-1.0.2m.high_sierra.bottle.tar.gz ######################################################################## 100.0% ==> Pouring openssl-1.0.2m.high_sierra.bottle.tar.gz ==> Caveats A CA file has been bootstrapped using certificates from the SystemRoots keychain. To add additional certificates (e.g. the certificates added in the System keychain), place .pem files in /usr/local/etc/openssl/certs and run /usr/local/opt/openssl/bin/c_rehash This formula is keg-only, which means it was not symlinked into /usr/local, because Apple has deprecated use of OpenSSL in favor of its own TLS and crypto libraries. If you need to have this software first in your PATH run: echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.bash_profile For compilers to find this software you may need to set: LDFLAGS: -L/usr/local/opt/openssl/lib CPPFLAGS: -I/usr/local/opt/openssl/include For pkg-config to find this software you may need to set: PKG_CONFIG_PATH: /usr/local/opt/openssl/lib/pkgconfig ==> Summary 🍺 /usr/local/Cellar/openssl/1.0.2m: 1,792 files, 12.3MB ==> Installing python ==> Downloading https://homebrew.bintray.com/bottles/python-2.7.14.high_sierra.bottle.tar.gz ######################################################################## 100.0% ==> Pouring python-2.7.14.high_sierra.bottle.tar.gz ==> /usr/local/Cellar/python/2.7.14/bin/python2 -s setup.py --no-user-cfg install --force --verbose --single-version-externally-managed --record=installed.txt --install-scripts=/usr/local/Cellar/pytho ==> /usr/local/Cellar/python/2.7.14/bin/python2 -s setup.py --no-user-cfg install --force --verbose --single-version-externally-managed --record=installed.txt --install-scripts=/usr/local/Cellar/pytho ==> /usr/local/Cellar/python/2.7.14/bin/python2 -s setup.py --no-user-cfg install --force --verbose --single-version-externally-managed --record=installed.txt --install-scripts=/usr/local/Cellar/pytho ==> Caveats This formula installs a python2 executable to /usr/local/bin. If you wish to have this formula's python executable in your PATH then add the following to ~/.bash_profile: export PATH="/usr/local/opt/python/libexec/bin:$PATH" Pip and setuptools have been installed. To update them pip2 install --upgrade pip setuptools You can install Python packages with pip2 install <package> They will install into the site-package directory /usr/local/lib/python2.7/site-packages See: https://docs.brew.sh/Homebrew-and-Python.html ==> Summary 🍺 /usr/local/Cellar/python/2.7.14: 3,325 files, 45.5MB
成功しました。
続いてvimのアップグレード
~ brew upgrade vim ==> Upgrading 1 outdated package, with result: vim 8.0.1300 ==> Upgrading vim --with-override-system-vi --with-python3 --with-lua ==> Installing dependencies for vim: python3 ==> Installing vim dependency: python3 ==> Downloading https://homebrew.bintray.com/bottles/python3-3.6.3.high_sierra.bottle.tar.gz ######################################################################## 100.0% ==> Pouring python3-3.6.3.high_sierra.bottle.tar.gz ==> /usr/local/Cellar/python3/3.6.3/bin/python3 -s setup.py --no-user-cfg install --force --verbose --install-scripts=/usr/local/Cellar/python3/3.6.3/bin --install-lib=/usr/local/lib/python3.6/site-pa ==> /usr/local/Cellar/python3/3.6.3/bin/python3 -s setup.py --no-user-cfg install --force --verbose --install-scripts=/usr/local/Cellar/python3/3.6.3/bin --install-lib=/usr/local/lib/python3.6/site-pa ==> /usr/local/Cellar/python3/3.6.3/bin/python3 -s setup.py --no-user-cfg install --force --verbose --install-scripts=/usr/local/Cellar/python3/3.6.3/bin --install-lib=/usr/local/lib/python3.6/site-pa ==> Caveats Pip, setuptools, and wheel have been installed. To update them pip3 install --upgrade pip setuptools wheel You can install Python packages with pip3 install <package> They will install into the site-package directory /usr/local/lib/python3.6/site-packages See: https://docs.brew.sh/Homebrew-and-Python.html ==> Summary 🍺 /usr/local/Cellar/python3/3.6.3: 3,359 files, 53MB ==> Installing vim --with-override-system-vi --with-python3 --with-lua ==> Downloading https://github.com/vim/vim/archive/v8.0.1300.tar.gz ==> Downloading from https://codeload.github.com/vim/vim/tar.gz/v8.0.1300 ######################################################################## 100.0% ==> ./configure --prefix=/usr/local --mandir=/usr/local/Cellar/vim/8.0.1300/share/man --enable-multibyte --with-tlib=ncurses --enable-cscope --enable-terminal --with-compiledby=Homebrew --enable-luain ==> make ==> make install prefix=/usr/local/Cellar/vim/8.0.1300 STRIP=/usr/bin/true 🍺 /usr/local/Cellar/vim/8.0.1300: 1,424 files, 22.8MB, built in 1 minute 36 seconds
ちゃんと8.xでアップグレードされていますね。 しかし、依存関係で取ってきているのはpython3.6・・・ もしかしてpythonのアップグレード関係なかった・・・?
まぁとりあえず動いているので良しとしましょう。
VimConf2017に参ってきました
VimConf2017とは
Vimとは
言わずと知れたテキストエディタ
ちなみに僕の研究室でvim使ってるのは10人中2人とかでvimconf行くんだーって言ったら 「こわっ」「vim使いって怖いイメージある」「atom使えばいいじゃん」 と散々でした。解せぬ
セッションに対する感想
スライドとかは他の方達がブログでまとめてるので省きます。
Vim, Me and Community - haya14busa
vimに関わってきた5年間について
5年間でvimのプラグインや本体にコミットしまくって某会社で働いているの本当にすごいなと思いました。 EasyMotionの紹介や開発の裏話を聞きましたが今まで使ったことなかったので導入してみようと思います。
goのバイナリをvimscriptで呼び出してjsonとかでやりとりすることでプラグインを作れるっていうのはvimscript触ったことない人にも良さそうだなと思って僕もなんか作ってみようかなとモチベが上がりました。
あとvimscriptにlambdaが導入されたということですがちょっと調べてみるとスクリプト言語としては普通に書けそうなのでこれもチャレンジしてみたい
The Past and Future of Vim-go - fatih
普段からGoを使って開発してるので本当に足を向けて寝られないレベルの神様みたいな人と思ってます。 vim-goがない開発環境を考えたくない。。。
内容はvim-goの今までと将来について
vim-goがパワフルな理由は上記のようにjob_startとかsystemでvimscriptでやるのは難しいところをgoで書いたツールを呼び出してるからというのがあるそうです。
vifコマンドとvafコマンドという関数の部分を選択するコマンドが今まで知らなかったし結構便利そうだったのでこれから使ってみようと思います。 donationのお話では「donationをもらうのは躊躇すべきではない。だって僕たちは自分の自由な時間を費やして価値を創造しているのだから」という言葉がとても印象的でした。日本の企業とかではソフトウェアに対する考え方が未だに軽いのでこういう姿勢は重要なのかなと思いました。
これからはデバッグAPIとか作って後方互換性とかも重視していきたいとのことでした
Talk Show - mattn_jp k_takata kaoriya
super viman god 3人による鼎談 この時にmattnさんを初めて見て
mattnさんて概念だと思ってた #vimconf2017
— rm ~/.kawaberc (@KKawabe108) 2017年11月4日
というツイートをしたら結構有名な人にリツイートやらお気に入りされて肝が冷えました。
印象に残ったvimのパッチやこれからどんな機能を作っていきたいかのお話でした。 その中でlspというワードがあったのですがこれがどんなものか僕は知らなくて調べてみたんですがいまいちよくわからなかったです。 どなたか噛み砕いて教えていただける方募集してます。
Creating your lovely color scheme - Cocopon
スライドの構成もさることながら「人生の33%はカラースキームを眺める時間で構成されている」というのに思わず納得させられてしまいました。 お話を聞いてると確かに自作のカラースキームを作るのはそこまでハードルが高そうではありませんでしたがラブリーなものにするのはセンスが問われるなーと思いました。
自分は普段molokaiを使っていますがこの綺麗なスキームを作るのに一体どれほどの時間をかけていただいたのでしょうか・・・ これからは色んなカラースキームを試してみながらコーディングしてみようかなと考えさせられた発表でした。
vim-mode-plus: The most ambitious vim emulator in the world - t9md
atomにおけるvimのエミュレータパッケージの開発についてでした。 普段自分たちが使っているコマンドをatom上で再現するのがすごく面倒臭いってことがわかりました。 というか発表の内容がすごすぎてこんな感想ぐらいしか書けませんでしたすいません。
Vim and Compatibility - senopen
POSIX主義のお話でした。 なんというか発表する方の衣装もあってかなんか怖かったです。 でも発表内容は色々なところで動くものを作ること、後方互換性というものの重要さを改めて考えた発表でした。
後方互換性は色々なソフトウェアを使っていると「あって当然だろ!なんでないんだよ」と思うことがありましたが作ってる側からするとすごく大変なことだというのもわかっています。これとどう付き合って行くかはソフトウェアを開発してく上で非常に重要でしょう
neosnippet.vim + deoppet.nvim - ShougoMatsu
暗黒美無王ことShougoさんの発表でした。
こちらも普段から色んなプラグイン、僕の場合は主にdein.vimでお世話になってる方です。 内容はsnippetプラグインについてでした。
neosnippetは普段あまり使わないのですがneocompleteの方が開発を打ち切り、deocompleteでvim8などに対応していくということでこれからはdeocompleteに自分も移行しようと思います。やっぱり補完系はあるとコーディング速度とかtypoが減りますからね
How ordinary Vim user contributed to Vim - dice_zu
vimにどうやってコントリビュートするかのお話でした。 「vimは毎日ビルドするもの」 「大抵は運用でなんとかする」 「コントリビュートに必要なのは熱い情熱」
などなど様々な名言が生み出された個人的に一番面白かった発表でした。 やっぱりOSSにコントリビュートするならそのリポジトリのissueやpullreqをみてバグフィックスやtypoなどの修正から手をつけるのがいいとのことでした。
そう言われると自分にもできそうという気になってきたので好きなライブラリとかのissueとかを眺めてる最中です
The new syntax highlighter for Vim - p_ck_
あのお寿司がステータスバーに流れるプラグインを書いた人の発表でした。
vimのシンタックスハイライトは言語とかによると複雑な構文や一文が長い場合上手にハイライトされない場合がある。 なので独自のプラグインで完璧にハイライトしよというものでした。 ただ数万行のファイルを開くとvimが固まる模様。ただ、そもそも1ファイルに何万行も書くべきではないと思うのでそれは別にいいのではないかと思いました・・・
You've been Super Viman. After this talk, you could say you are Super Viman 2 -- Life with gina.vim - lambdalisue
なれる!Super Viman!ということでgina.vimというvim上でgitのコマンドを便利に使えるようにしたプラグインのお話でした。 なんでも結果を非同期でとってきているのでgit logとかを全部待つ必要がなくて高速に表示できるとかの工夫してるらしいです。すごい でも個人的にgitはSource Treeや生のgitで満足しているのでわざわざ使うかと言われると微妙なラインなのですよね・・・
まとめ
全部が全部内容が濃くて被ってないしすごく面白いカンファレンスでした。 僕はまだvimを使い始めて2年とかですがこれからもvimを使って開発しようというモチベが爆上がりの良いカンファレンスでした。 お金を払うのも普段ただでvimやそれに付随する沢山のプラグインを使わせてもらってるのでこれぐらい安いものだと思います。
これを機に自分もなにかvimに恩返しができたらなと思える素敵なカンファレンスでした。 開催していただいたスタッフの方達への感謝をここに述べたいと思います。本当にありがとうございました。また来年も楽しみにしています。
開発におけるdockerの利点とかその他諸々
インターン先での開発時はdockerを使って環境を構築することが多いです。
でも最近までdockerがなんたるかをwebで読んでもちんぷんかんぷんだったにも関わらず使ってると便利だなーって思えるようになりました。
でも環境構築するまでは結構苦労がありました。今回はdockerについて溜まった知見をメモしていこうと思います。
docker 概要
そもそもdockerとはなにものなのか。
一言で言えば 軽量なコンテナ型の仮想化環境
うーんわからない。
というわけで自分なりに解釈、要約してみます。
仮想化環境
仮想化技術で一番使ってるのが多いと思われるのはホスト型の仮想化技術。 これはよくある、「Linux上でWindows動かせるよ」とか、「Windows上でLinux動かせるよ」みたいなやつです。
こいつらはGUI上で他のOSのGUIでいじりたい時とかOS丸ごと動かしたい時は重宝するやつですね。
これに対して、Dockerのコンテナ型っていうのは、
一つのプロセスが独自の名前空間やリソースを持ってその中でアプリケーションを実行させる という感じだと思ってます。
例えば仮想化したWindowsのGUI上でゲームしたい場合はゲーム以外にもWindowsっていうOS自体やそのOSの中でたくさんのプロセスが走ってます。Dockerの一つのコンテナはこのプロセス一つ一つに焦点を当てたもの。だから軽量でコンテナ型という文言があるのですね。
用途
なんでDockerが流行っているのか、何が便利なのか。自分なりにまとめてみます。
例えば以下のようなアーキテクチャのシステムを構築するとします。
ではこのWebサーバーでなんかWebアプリが動いてる、RailsでもDjangoでもなんでもいいです。 RedisやMySQLは別サーバーで稼働中。
ではこのWebアプリを開発するとして環境はどうすべきか。当然自分のPCにMySQLを入れて、Redisも入れて、ユーザー設定して。。。 とやっても全然いいです。
しかし、もし複数人で共同で開発する場合そういう風に環境を構築すると思わぬ齟齬が生まれる場合があります。 例えばポート番号が違うとか、ユーザーのパスワードが違うとか、ホスト名が違うとか。
開発環境を統一したい。新しい人が入って来てもこちらがわざわざ指示せずに開発環境をパッケージ化しておきたい。 そういう時にDockerは便利です。
Dockerは上記の図のWebサーバー、DB, inMemoryDBそれぞれをコンテナとして動かすことができます。
実際に構成がどのようになるかと言えば
- 自分のPCのマシン 192.168.2.70
- Gateway 172.0.0.1
- Webサーバー 172.10.0.2
- DBサーバー 172.10.0.3
- Redisとか 172.10.0.4
Dockerはこれらを単一で走らせることもできますが、Docker-composeというものがあってこの構成をひとまとめに一括で起動することもできます。ネットワークの構成も自動でやってくれる優れものです。
簡単な環境構築の流れとしては
- プロジェクト直下に Dockerfile docker-compose.ymlを作成
- Dockerfileにはアプリのビルドプロセスを、docker-compose.ymlには各種サービスの起動手順を (詳しくはグーグル先生へ)
docker-compose build
でイメージを作成docker-compose up
で起動
これが上手くいけば、他の人のPCでもプロジェクトのディレクトリをgitか何かで共有して docker-compose build
docker-compose up
みたいにするとすぐに開発環境が立ち上がります。DockerコンテナのIPアドレスは指定しないかぎり毎回ランダムですが自分のlocalhostポートと紐つけることができるので不便になることはありません。
図のようにAWSのサービスとかを利用する場合も環境変数等をファイルに記述し、鍵を読み込ませることもできます。環境変数ファイルはgitignoreとかで隠します。
ホスト名等もDockerでサポートしているサービスであれば基本的に面倒な設定いらずに統一できます。 Dockerfileを個別に作る必要もありません。
例: Mysql ==> ホスト名: mysql Redis ==> ホスト名: redis
docker-composeはプロジェクトのディレクトリ直下にdocker-compose.ymlを作成してdocker-compose upすると コンテナ群が起動します。
docker 便利です。
コンテナ内での作業
例えばMySQLへの書き込みをアプリでしていて実際に書き込まれているか見たい、なんて時もコンテナのシェルをすぐにいじることができます。
docker-compose exec -it sample_container_mysql_1 bash
と叩くとシェルに入れます sample_container_mysql_1 はコンテナ名みたいなやつで docker-compose ps
で確認できます
Webサーバーだけ再起動して動作確認したい。
docker-compose up
でコンテナ群を起動して docker-compose down
で落とします。
これらは全てのコンテナを操作するので多少時間がかかりますがWebサーバーのソース更新したからそこだけ、MySQLだけとかを再起動させる場合は
docker-compose restart web
みたいにサービス名を入力すると単一的に再起動させることができます。最初知らなくて一々全部起動して、終了して、起動してを繰り返してました。
面倒くさいこと
マイクロサービスアーキテクチャが主流のなかでDockerは便利です。 しかし、この環境を作ること自体は結構面倒くさかったりします。docker-compose.ymlを何回も書き直してbuildしてイメージが増えすぎて消すのが結構面倒くさかったこともあります。
ある程度ネットワークや構築するシステムのアーキテクチャを知っている必要はあるのかなーって思いました。 あと自分でちょろーっと簡単なアプリ開発!なんていう時は必要ないかもしれません。AzureやGAEやHeroku使った方が早いと思います。
大きなシステムとしてその内部の一部を開発する時とかの環境構築として便利だと私は思ってます。
何事もケースバイケースですね。まだまだdockerは勉強中なのでこれからも使うかと思います。
またなんかあったら纏めてみようかな・・・
大学生活+αの振り返り
こんにちは。最近書くネタがなくてどうしようかと思い、でも月一更新はなんとか続けないと今後も続かないと思い、 「そういえば最近1年生や2年生の子にいつからプログラミングやってたかよく聞かれるなー」ってなって自分でもいつからこっち方面に進もうと思ったか曖昧だったので改めて思い返してみました。書くことが大事(戒め)
小学3年生
今思えばこの時に初めてパソコンに触った。目的は「ドラクエ5のブオーンの攻略方法を知るため」。父親が買ったMacBook(相当古いですが今でも家にあります)と「これみてひらがな打ちなさい」と言われ渡されたローマ字表片手にずっとGoogle先生と遊んでました。
小学4年生
確かこの頃近所に住む友達に面白フラッシュ倉庫を勧められてめちゃくちゃハマった気がします。Flash全盛期ってやつだったかと・・・ まだプログラミングとかには手を出してません。あと夏休みにポケモン大好きクラブにも登録して友達と一緒にミニゲームやってたりもしました。
小学5年生
特に進歩せずひたすらGoogle先生にゲームの攻略方法聞いてました。確かこの年はテイルズオブジアビスとドラクエ8あたりだった気がする・・・
小学6年生
引っ越して環境が変わってなんかすごく辛かった年だった思い出です。確かここら辺でなんの映画か忘れましたがハッカーがターミナル画面をカタカタしてるシーンがあってそういうのにすぐ影響される僕は「あれ、どうやってやるの!?」って父に聞いた覚えがあるようなないような。この頃Windowsでコマンドプロンプトを覚えてひたすら意味のない文字をガタガタ打ち込んでました。それでハッカーになった気でいたのです。
中1
なんか部活と塾で手一杯であんまりパソコンに触れた覚えがありません。この頃から受験という言葉に悩まされるようにになってた気がします。
中2
多感な時期です。この年か前の年かわかりませんがBloodyMondayというドラマが放映されました。ある意味これが僕の今後の人生を決定づけたといっても過言ではないぐらい大きい作品でした。
あらすじとしては天才ハッカーがテロリストから国を守るために戦うというもの、もうその主人公がかっこよすぎて一時期壁紙とかも真似したりしてました。 そして、そのドラマに使われている技術についてついにネットで調べるようになりました。主人公が使っていたのはUbuntuというOSだった。使用言語はPython(この頃プログラミング言語の種類なんて一つも知りません)という情報を頼りに、Ubuntuとは?Pythonとは?と必死に調べました。
その後ついにUbuntuをOSだと理解し、ディスクにイメージを焼いて起動し、Pythonをインストールして使うことができました。この時はかなり感動しました。
ただ、もっとかっこよくUbuntuを起動したいと思ってUSBからイメージを起動しようとしてPC(父の)のBIOS設定をいじっていたら元のOSが立ち上がらなくなってめちゃくちゃ怒られたのは少しトラウマです。
はてさて、この男はプログラミングを初めて経験したのですがなんとそこで満足、というか挫折しました。BloodyMondayの主人公がしていたようなプログラミングはどうやってするのだ!と一人途方に暮れていました。当然ですね。この頃はTCP/IPやサーバーという単語すら知らなかったのですからそもそも調べようがない。ですが、もうごく自然に僕の頭の中では将来こういう方面の仕事をしよう。他の仕事はありえないという考えになっていました。
中3
受験です。もうこの年はひたすら受験勉強です。といっても塾に通って勉強した気になっていただけなので学力は大したことなかったです。 まぁそれでも身の程を知らずに東工大の附属に推薦と一般受験どちらも受けて玉砕という哀れな結果になりました。それでも理工学系に強い学校に行くつもりはあって芝浦工大柏に受かりそちらに通うことになりました。ちなみに僕が一番得意なのは国語でした。 プログラミングの勉強はあれから「VisualStudio2005 で学ぶC++」みたいな本を買って貰ったのですがクラスの概念が理解できず挫折。早いですねー2回目の挫折w
高1
中学と同様に部活には入ったのですが大学受験する気は1ミリもありませんでした。「だって推薦で芝浦工大の情報工いければいいやん」という発想のもとテスト勉強もせず部活とゲーセン通いの日々でした。うーん思い返すと清々しいほどのクズですね。 この頃から今は廃刊になってしまいましたが白夜書房から発売されていた「ハッカージャパン」という本を買うようになりました。これ結構すごい雑誌でサンプルアプリをクラックしてみよう!とかゲームのバイナリを解析してチートコードを書こう!みたいなことが書いてあったんですよ。この頃CTFの存在を知りました(知っただけで参加するのは数年後)
高2
一番楽しい時期だと言われていますね。部活とゲーセンしか記憶がありません。楽しかったのでいいんですが。 プログラミングの方はこの頃すっかり頭から抜け落ちてました。ひたすら音楽ゲームの譜面を脳内でリピートしてた気がします。
高3
みんなが受験勉強してる中一人でのほほんとゲーセン通いを続けてのほほんと推薦に必要な最低限の勉強をしてました。 そんで推薦が決まってよーし大学に入った時のために勉強しておくかーと思ってネットで色々調べてもどれから手をつけていいかわからずすぐやめてゲームしてました。うーんクry
ここまで見るとろくに勉強してませんね。ぼんやりとした将来像しかなかった気がします。結局本格的にプログラミングを始めたのは大学からですし。逆にこんなのでも割となんとかなるってことですかね。
大学に入ってからは特に言うこともなく真面目に勉強するようになりました。自分がやりたいことだったし、自分でどうやって学べばいいかわからないところを「ああ!こういうキーワードで調べてこういうので勉強すればいいのか!」ってモヤモヤが晴れてすごく楽しかったですね。あとは知り合いの影響も大きかったと思います。大学1年の時は適当なサークルに入ってたんですけどその中で同じ学科の人から「こういうプログラミングしてるサークルあるんだけど入らない?」と誘われてそこに居た人たちに凄く良い刺激を貰いました。
ITの世界はすぐに新しいものが出てきて隆盛が特に激しい分野だと思っています。それでも僕はパソコンを触るのが好きだしプログラミングするのも好き。ロジックを考えて実装できた時なんかは一人で小躍りしますし、人にレビューを貰って一喜一憂することもあります。
このPCから繋がる全ての世界が僕は好きなのだと最近改めて実感するようになりました。と、いい感じに締めておきます。
途中からなんの話かわからなくなりましたがまあ良しとしておきます。文字数も稼げましたし。 にしても、改めて振り返ると初めて触れた言語Pythonだったんですね・・・(他人事)なんか今でもそれをガッツリ書いていると思うと多少は進歩が見られて嬉しいです。
では今回はこのあたりで筆を置かせていただきます。次の更新は6月中になんとか・・・