19 May 2013, 03:58

CentOSインストール後の設定メモ(minimal)

前回、minimalモードでCentOSをインストールしましたので、今回はそのあとの設定についてまとめました。

CentOSを最小構成(minimal)でVMware Playerにインストールした | Futurismo

ネットワーク設定

minimalだと、デフォルトではネットワークが使えないので、ネットワークの設定をします。

まずは、ネットワークサービス停止

# /etc/rc.d/init.d/network stop

次に設定ファイルを開いて修正します。/etc/sysconfig/network-scripts/ifcfg-eth0

vi /etc/sysconfig/network-scripts/ifcfg-eth0

なんとviしか入っていない!emacsしか使えない自分にとってはいきなり大ピンチだった。以下の部分を修正する。

# NICの有効化

ONBOOT=”yes”

# DHCPサーバとして起動

BOOTPROTO=”dhcp”

このへんは、このページを参考にした。

◇ネットワークの詳細設定(CentOS5)◇初心者のためのLinuxサーバー構築講座(CentOS 自宅サーバー対応)☆お便利サーバー.com☆

修正が終わったら、ネットワークをスタート。

# /etc/rc.d/init.d/network start

ツールのアップデート

kernelを含め、ツール類を全てアップデートする。-yは全て質問にYesするおまじない。

# yum -y update

ユーザの追加

作業用のユーザを作成する。rootだとなんでもできてしまうため。

# useradd hogehog

# passwd hogehoge

# chmod 701 /home/hogehoge

作成したユーザにはsudoを実行できるようにする。

echo ‘hogehoge ALL=(ALL) ALL’ >> /etc/sudoers

一般ユーザでもroot権限が必要なコマンドを実行できるようにする 窶錀 sudo | Linuxで自宅サーバ構築

telnetできるようにする

telnetもデフォルトでは使えません。設定方法は別記事にまとめました。

CentOSでtelnetできるようにするまでの手順(クライアント・サーバ) | Futurismo

とりあえず、最小限サーバなのでこんなところか?必要に応じてまた追記する。

参考

19 May 2013, 03:29

CentOSでtelnetできるようにするまでの手順(クライアント・サーバ)

CentOSでtelnetを実施するための手順を調べてみたのではメモします。

telnetクライアントの設定

コマンド一つで入る。これはラクチン。

# yum -y install telnet

telnetサーバの設定

telnetサーバインストール

まずはサーバをインストール。

# yum -y install telnet-server

IP設定

emacs -nw /etc/host.allowに

同一のネットワーク内のクライアントを許可する場合は、以下を追記。

in.telnetd: 192.168.XXX

telnetサーバ有効化

インストール直後では、Telnet-Serverは無効になっています。以下の変更を加える事で有効にできます。

# vi /etc/xinetd.d/telnet

# default: on

# description: The telnet server serves telnet sessions; it uses

# unencrypted username/password pairs for authentication.

service telnet

{

flags = REUSE-

socket_type = stream

wait = no

user = root

server = /usr/sbin/in.log_on_failure += USERID

disable = no # ここをyesからnoに変更

}

サーバを起動

# /etc/init.d/xinetd start

telnet実験

まずは、ローカルホストに入れるのかテスト。

# telnet localhost

次に、Windowsからtelnetしてみるができない。。。(´・ω・`)

ファイアウォール設定

ファイアウォールの設定が必要。telnetはポート23で通信するが、デフォルトではポート23は閉じているので、開ける必要がある。以下のコマンドで、23が空いているか確認。

# less /etc/sysconfig/iptables

23という数字が見当たらなければ設定が必要。/etc/sysconfig/iptablesに以下の行を追記する。見にくいのだが、–stateと–dportの- は – が 2つ連続。

-A INPUT -m state --state NEW -m tcp -p tcp --dport 23-j ACCEPT

iptablesを再起動して設定を適用すれば、telnetできるようになる。

# service iptables restart

参考

CentOSでtelnetを実施するための手順を調べてみたのではメモします。

telnetクライアントの設定

コマンド一つで入る。これはラクチン。

# yum -y install telnet

telnetサーバの設定

telnetサーバインストール

まずはサーバをインストール。

# yum -y install telnet-server

IP設定

emacs -nw /etc/host.allowに
同一のネットワーク内のクライアントを許可する場合は、以下を追記。

in.telnetd: 192.168.XXX

telnetサーバ有効化

インストール直後では、Telnet-Serverは無効になっています。以下の変更を加える事で有効にできます。

# vi /etc/xinetd.d/telnet
# default: on
# description: The telnet server serves telnet sessions; it uses \
# unencrypted username/password pairs for authentication.
service telnet
{
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
disable = no # ここをyesからnoに変更
}

サーバを起動

# /etc/init.d/xinetd start

telnet実験

まずは、ローカルホストに入れるのかテスト。

# telnet localhost

次に、Windowsからtelnetしてみるができない。。。(´・ω・`)

ファイアウォール設定

ファイアウォールの設定が必要。telnetはポート23で通信するが、デフォルトではポート23は閉じているので、開ける必要がある。以下のコマンドで、23が空いているか確認。

# less /etc/sysconfig/iptables

23という数字が見当たらなければ設定が必要。/etc/sysconfig/iptablesに以下の行を追記する。

-A INPUT -m state –state NEW -m tcp -p tcp –dport 23-j ACCEPT

iptablesを再起動して設定を適用すれば、telnetできるようになる。

# service iptables restart

参考

19 May 2013, 02:40

『よいコードを書く技術』とよいクラス名のつけ方について

『良いコードを書く技術』を読んだので、読書メモです。

 

この本の内容は題名の通りですね。以下のサイトの連載が書籍かされたようで、同じ内容をサイトからも読むことができます。

良いコ-ドへの道―普通のプログラマのためのステップアップガイド:連載|gihyo.jp … 技術評論社

 

以前リーダブルコードを読んでいたのだが、内容的にはまあまあ同じ。良いコードを書く技術は共通しているのだ。この本の後半の方になると、メタプログラミングやフレームワークといった内容についてもページが割かれていた。。普段聞き慣れない概念なので、新鮮だった。

初心者プログラマ、中級プログラマ、熟練プログラマの三人の対話形式で話がすすんでいく。コミカルなところもあり、読んでいて楽しめる。リーダブルコードよりもやさしめに書かれている印象を受ける。

また、実例を通して解説していくところが多い。言語はJava。WebやGUIを題材にしたものが多い。組み込みな自分にとっては若干とっつきにくかった。

いろいろとためになったのだが、一つ特筆すると『習熟度別よく利用されるクラス名』というピラミッド。これは、作者オリジナルらしい。図は、以下のリンクから確認。

第2回 名前付け重要。または,良いコードは良い名前から生まれるんです。―その4 良いクラス名:良いコ-ドへの道―普通のプログラマのためのステップアップガイド|gihyo.jp … 技術評論社

いろいろとわからない意味があるが、気になった時に調べてみようと思う。ここから検索するのがよさそう。

索引「あ」 – コンピューター用語 – Weblio英和和英

習熟度別よく利用されるクラス名のまとめ

レベル1 業務Webアプリ開発

  • Action
  • Controller
  • Dto
  • Logic
  • Service
  • Util
  • DBのテーブル名と一対一のEntity
  • Helper
  • Support
  • Dao
  • Manager
  • Bean
  • Form
  • Exception
  • Validator
  • Test
  • impl

レベル2 GUI/フレームワーク拡張

  • Listener
  • Handler
  • Runnner
  • Commmand
  • Observer
  • Node
  • Adapter
  • Proxy
  • Holder
  • Context
  • Monnitor
  • State
  • Builder
  • Factory
  • Viisitor
  • Decorator
  • Strategy

レベル3 フレームワーク/ライブラリ開発

  • Scope
  • Looader
  • Engine
  • Provider
  • Conversion
  • Beeehaviour
  • Descriptor
  • Cache
  • Resolver
  • Processor

19 May 2013, 01:04

会社でつかえそう?!ローカル管理・ Evernoteライクなメモ管理ツール NixNoteを試してみた

Evernoteを会社で使いたいのだけれども、セキュリティの問題でそういうツールは利用を禁止されている。(´・ω・`)

Evernoteをローカルだけで使う方法もたしかにあるが、アカウント同期のためにネット上に情報をださなければならない。チキンでマックでチキンクリスプマフィンばかり食べている自分にはそんなことは滅相もない。(´・ω・`)

そんなこんなで、3年くらい暮らしていたのだが、今日はふとネットサーフィンをしていたら、Evernoteライクなメモ管理ツールを発見!(^O^)

早速試してみた。

NixNoteでローカルメモ管理

NixNote(旧NeverNote)は、Evernote用のオープンソースなクライアントソフト。

Nevernote – An Open Source Evernote Clone

なので、Evernoteと機能は全く同じ!EvernoteはLinuxに対するクライアントソフトを用意していないようで、LinuxからEvernoteを利用するには、このツールが決定版の必須らしい。Windowsユーザは Evernote for Windowsがあるので、このようなソフトとは無縁。

ダウンロードは以下から最新版を落とす。Windowsの場合は、インストーラが用意されているので、それを落とす。もちろん、Macでもインストールできる。

インストールはインストーラを実行するだけ。どや!

SnapCrab_NixNote_2013-5-19_9-47-28_No-00.png

 

完璧にEvernoteだ。そして、ログインせずともなんでも自由に操作できる。PDFのインライン表示だってできる。

ただ、軽く使ってみたところ、PDFの文字列検索が引っかからなくて、検索が重い気が。。まあいいや。もう少し遊んでみよう。

19 May 2013, 00:06

Cygiwnでの操作ログをevernoteにライフログする方法

ライフログ大流行の昨今、やっぱりコンソールの履歴もライフログしたいです。

ブログを書くときとか、操作したことを自動的に記録出来ればいいとおもった。さらには、Evernoteに自動転送してログできればいいなと思ったので、方法を調べてみた。

Evernoteに自動転送する方法

Evernoteに自動転送するには、インポートフォルダの設定をすればよい。

  1. 任意の場所にログを保存するフォルダを作成。
  2. Evernoteにログを保存したフォルダを作成。
  3. Evernoteのツールバーから、ツール -> インポートフォルダを選択。
  4. 追加を選択して、作成したWindows上のフォルダを指定する。
  5. 「ノートブック」欄を選択して、Evernoteフォルダを選択する。

evernote_mintty

Cygwin上でログを記録をする

起動と終了をシェルでまとめました。

ログ開始

ログを取るには、scriptコマンドを利用します。script  -a で追記モードで起動。ついでに、起動したときの日付をファイル名にします。

#!/bin/bash

LOG_TEMP_DIR=$HOME/log/evernote/temp
DATE=`date +%y%m%d`

script -af $LOG_TEMP_DIR/$DATE.txt

ログ終了

Evernoteへはログ終了時に転送します。まずはコマンドラインからscriptを終了させることが前提。

制御文字をcolコマンドで削除します。Evernoteの文字コードがShift-Jisなため、Shift-JISでなければ、変換が必要。nkfコマンドで変換します。なお、拡張子はtxt形式にしないと、evernote上で開けない。

#!/bin/bash
LOG_DIR=$HOME/log/evernote
LOG_TEMP_DIR=$HOME/log/evernote/temp
DATE=`date +%y%m%d`

# 制御文字削除
col -bx < $LOG_TEMP_DIR/$DATE.txt > $LOG_TEMP_DIR/$DATE.col.txt

# 文字コード変換 Shift-JIS
nkf -s $LOG_TEMP_DIR/$DATE.col.txt > $LOG_TEMP_DIR/$DATE.sjis.txt

# Evernoteへ移動
mv $LOG_TEMP_DIR/$DATE.sjis.txt $LOG_DIR/$DATE.txt

# 一時ファイル削除
rm $LOG_TEMP_DIR/$DATE.col.txt

画面制御文字は妥協した

ちなみに、画面制御文字はどうしても取り除けなかかった。33m~や0;など。これは、minttyを色なしで表示すればいいが、それはやりたくないので妥協。

Cygtermを使う

シェルでガンパラなくても、Cygtermのログ機能を使えば、画面制御文字も取り除ける。

minttyでの出力結果をcygtermからtail -f で表示させるとか。まあ、いろいろと方法を探したけれども、Cygtermを利用するのが一番簡単そうだ。minttyを捨てて、Cygtermにするかどうか、悩むところだ。。。

ツールバーの設定 -> その他の設定 -> ログを選択。

標準ログファイル名で、strftimeフォーマットに従った名前を書く。ここでは、%y%m%d.txtとした。これで今日の日付が入る。

保存先ディレクトリでevernoteと連携しているフォルダを指定。

自動的にログ採取を開始するにチェックをいれると、Cygterm起動時にログが開始される。

SnapCrab_Tera Term その他の設定_2013-5-19_15-5-22_No-00

その他

これを、ログインシェルとログアウトシェルに書いて自動的にログするかは検討中。そんなにログは必要かな?

18 May 2013, 21:41

Cygwinにnkfをインストールして文字化け攻略する!

Cygwin上でファイルを開くとたまに文字化けしてて、ほぞを噛む思いをすることがある。こんなときは、Linuxならばnkfコマンドでサクッと変換するのだが、どうやらCygwinにはnkfコマンドが入っていない。apt-cygしても、そのようなパッケージが見つからない。

というわけで、自力でnkfコマンドをインストールしてみました。

Cygiwn上でのnkfインストール方法

Cygwin上でnkfコマンドを利用するには、ソースコードからコンパイルするしかない。まずは、nkfをSourceForgeから取得します。

取得したら解凍してインストール。

$ tar xvfz nkf-2.1.2.tar.gz
$ cd nkf-2.1.2
$ make
$ make install

コレでインストール完了です。

$ which nkf

/usr/local/bin/nkf

nkfの使い方は以下を参照。

Linuxコマンド集 – 【 nkf 】 文字コードを変換する:ITpro

16 May 2013, 23:13

CentOSを最小構成(minimal)でVMware Playerにインストールした

以前、Windows上のVmwareにUbuntuを入れてみました。

WindowsでVMware Player上のUbuntuを動かしてみたメモ | Futurismo

UbuntuなどのDebian系Linuxもいいけれども、Linuxハッカーを目指すあたくしとしては、RedHat系もゴニョゴニョいじりたいわけでして。

そうはいっても、容量が貧弱なMyパソコンに2つ目のVMイメージはデカイ。なので、最小構成で、CentOSを入れてみて、容量がどんなもんか調べてみました。

環境

  • Windows 7 64bit
  • vmware player 5.0.1 build-894247
  • CentOS 6.4 32bit

64biit minimal CentOS のISOをダウンロード

ここが、CentOSの公式サイトです。

https://www.centos.org/

ミラーサイトからイメージファイルをダウンロードします。
Downloads -> Mirror List ->South American, Asian, Oceania, Middle Eastern, African and Other Regional Mirrorsを選択。

さらに、Japanっぽいところから落としてきます。ここでは、JAISTからHTTPを選択。

ISOファイルは/pub/linux/centos/6.4/isos/配下にあります。x86_64が64bitでi386が32bit。ここでは、32bit版を選択。

64bitなのに、32bitをする理由は64bitでインストールしようとするとエラーしたので。

centos5.png

これは、BIOSの設定を変更すればOKらしい。BIOSがIntel-VT(AMDの場合はAMD-V)をサポートしていればいい。BIOS設定でVTをEnabledにするとつかえるらしい。詳しくはココ

64bit OS を VMWare上にゲストOSとしてインストールする (ハギー@blog.弐)

また、自分のpcに64bitOSが入るかどうかもチェックツールを使えば可能。

CentOSを最小構成でインストールするためには、minimalのisoを選びます。

通常が4.1GBなのに対して、minimalは342MB!小さいですね!!

vmwareにCentOSをインストールする

次に、CentOSをvmwareにインストールします。CUI操作の勉強も兼ねているので、ここではCUIオンリーなインストールをして、さらに省エネ化を図ります。

基本は、Ubuntuの時と同じで。なので、vmwareのインストールはここでは省略。

vmware Playerの設定

VMware Playerを起動して、[新規仮想マシンの作成]を選択。

ちなみに、「ISOイメージファイル」から簡易インストールを利用してインストールしようとしたが、minimalはうまくインストールでききなかった。コマンドがないよといわれて、そこで動かなくなった。

ゲストOSでLinuxを選択。バージョンで CentOS を選択。

SnapCrab_新しい仮想マシン ウィザード_2013-5-15_9-45-9_No-00.png

仮想マシン名と場所はデフォルトのままで。

SnapCrab_新しい仮想マシン ウィザード_2013-5-15_9-45-31_No-00.png

ディスク最大サイズを20GBから10GBにします。Windowsのほうが枯渇気味なので。ディスク最大サイズはあとから変更は可能。 さらに、仮想ディスクを単一ファイルとして格納にチェック。これは管理を簡単にすることが目的。

centos3.png

最後に、設定を確認して完了を選択。

次に、作成した仮想マシンを選択します。[ CD/DVD ] を選択して、右の[ ISOイメージファイルを利用する ] を選択し、先ほどダウンロードした CentOS用イメージファイルを選択します。これで準備完了。

CentOSのインストール

CentOSのインストール仮想マシンの再生を選択し、CentOSを起動。
[Install or upgrade an existing system] を選択。

SnapCrab_CentOS - VMware Player (非営利目的の使用のみ)_2013-5-15_9-49-13_No-00.png

 

テストみたいなものが現れるので、とりええず実行して次へ。

SnapCrab_CentOS - VMware Player (非営利目的の使用のみ)_2013-5-15_9-51-14_No-00.png

 

めでたく、ロゴが現れました。( ゚∀゚ノノ゙パチパチパチ次へ。

SnapCrab_CentOS - VMware Player (非営利目的の使用のみ)_2013-5-15_9-58-0_No-00.png

パーティション未定義なため警告が出る。[ どのようなデータであっても破棄してください] を選んで次へ。

SnapCrab_CentOS - VMware Player (非営利目的の使用のみ)_2013-5-15_10-0-19_No-00.png

ホスト名の設定で、適切なホスト名を入れる。ネットワーク設定はインストール完了後に実施するため、ここではスキップ。

rootのパスワード、言語設定と、インストール方法を選択。ここは、インストール方法は仮想なので 『 すべての領域を利用する』 を選択。

これで、インストールが開始される。minimalだからさぞかしなにもインストールしないとおもいきや、けっこういろいろなパッケージをインストールするのに驚く。Cygwinよりもずっとリッチじゃないか!

インストールが終わったら再起動。真っ黒なCUI画面が現れる。さすがminimal構成!

SnapCrab_CentOS - VMware Player (非営利目的の使用のみ)_2013-5-15_10-18-52_No-00.png

minimal構成の容量を確認

1.8GBでした。ちなみに、前回インストールしたUbuntuの標準インストールは5.16GB。minimalなので、軽いです。これならあまり容量を圧迫せずに使える(^O^)。

参考

13 May 2013, 15:19

Linuxで任意のディレクトリにRubyをインストールする方法メモ

Linuxだと、管理者しかツールをインストールできないとおもってたけど、それはオバカな勘違いだった。管理者でない一般ユーザだって、好きなディレクトリに配置して使うことがデキる。

本題。会社のサーバにRubyがはいってないけど、Rubyでいろいろスクリプトを書きたいので、Rubyを任意のディレクトリにインストールする方法を調べてみた。

環境

  • Ubuntu
  • Ruby 2.0.0

Rubyをローカルディレクトリにインストールする手順

Rubyソースの取得

まずは、ソースを取得します。Rubyソースは、ここからダウンロードできます。ここでは現時点での最新版、2.0.0-p0をダウンロードする。

Rubyのインストール

解凍して、とりあえずどこでもいいので置く。

$ tar zxvf ruby-2.0.0-p0.tar.gz
$ruby-2.0.0-p0

次に、./configを実行してMakefileを作るときに、オプションでインストールしたいディレクトリを指定。ここがミソ。ここでは、$HOME/local配下にインストールする。

$ ./configure –prefix=$HOME/local

Tipsとしては、RDocのインストールしないように指定したほうがよいかも。容量を節約。

–disable-install-doc

あとは、いつもどおりコンパイルして、インストールするだけ。

$ make
$ make install

インストールできたかどうか確認する。

ls
bin  include  lib  share

/home/tsu-nera/local/bin/ruby -v
ruby 2.0.0p0 (2013-02-24 revision 39474) [i686-linux]

ここは、絶対パスを入力する必要がある。

Rubyスクリプトとして実行する

スクリプトとして実行するには、スクリプトの第一行目に、パスを書きます。

#!/home/tsu-nera/local/bin/ruby

num = 1

puts  num

実行パスを追加する

インストールしたディレクトリにパスを通すことで、ruby hogehoge.rbで、rubyを実行することができる。ログインシェルの設定ファイルで以下を追加します。例えば、.bashrcは、

PATH=$PATH:$HOME/local/bin

参考記事

12 May 2013, 13:11

cmockで指定したディレクトリ配下のインクルードファイルからモックファイルを自動生成する

はじめに

cmockネタの続きです。指定されたディレクトリに含まれる全てのヘッダファイルに対するモックファイルを自動作成してみようと思います。

恐るべきレガシーコードの救世主になるか?!ドロドロ依存なモジュールたちを『CMock』ですっ裸にする | Futurismo

事前準備

サンプルは前回と同じ。

git clone git://github.com/ThrowTheSwitch/CMockExample.git

cmockからlib/ config/をプロジェクトにコピーしてきます。

今回のシェルスクリプト

やりたいこと

  1. mocksディレクトリがなければ作成
  2. 指定されたディレクトリ配下のhogehoge.hからMockhogehog.cを生成。

結果

いい感じに、mocks配下にMockhogehogeが生成されました。

tsu-nera@TSUNEMICHI-VAIO ~/temp/CMockExample
$ ./generate_mocks.sh src
mocks directory is not exist, make directory.
Creating mock for Gpio…
Creating mock for LedControl…
Creating mock for main…
Creating mock for System…

tsu-nera@TSUNEMICHI-VAIO ~/temp/CMockExample
$ ls mocks/
MockGpio.c  MockGpio.h  MockLedControl.c  MockLedControl.h  Mockmain.c  Mockmain.h  MockSystem.c  MockSystem.h

今後の展望

気づいた。モックファイルを生成しても、これをコンパイルするためには、Makefileをかかなければいけない。(´・ω・`)

というわけで、今度はMakefile自動生成をするための方法を調査してみる。うーん、圧倒的なスキル不足だ。スクリプト言語を身につけたい。

12 May 2013, 11:58

自分のプログラミング開発環境の歴史を記録する!githubで設定ファイル(dotfiles)をクラウド管理する方法

はじめに

最近は、bashやらemacsをいじることがおおい。設定ファイルを自宅のPCとノートPCの間で同期するようなよい方法はないものかと思った。また、会社でも自宅の設定がふとみたくなったとき、涙をのんでほぞを噛みつつ定時退社の夢を見ている。

そんななか、githubに設定ファイルをバックアップ&同期する方法を見つけたので、やってみた。

なお、元ネタはこの本です。最近、熱中して読んでいる。チョーオススメ!!

 

githubにバックアップする方法

dotfilesディレクトリに設定ファイルを移動

設定ファイルを一箇所にあつめて、そこでgitリポジトリを作成します。

$ mkdir dotfiles
$ cd dotfiles/
$ mv ~/.emacs.d/  .
$ mv ~/.bashrc .

シンボリックリンク作成

次に、dotfilesディレクトリからホームディレクトリに対して

シンボリックリンクを作成

します。これが、githubで設定ファイルを管理するためのキモです。シンボリック作成は以下のコマンドで行けます。

$ ln -s ~/dotfiles/.emacs.d ~/

$ ln -s ~/dotfiles/.bashrc ~/

ただし、量が多くなると大変なので、シェルスクリプトを書きました。

 

git リポジトリ作成&github連携

gitリポジトリを作成して、githubと連携します。githubとの連携はいつもの方法です。過去記事もどうぞ。

githubに新しいリポジトリを作成してローカルのリポジトリをアップロードする | Futurismo

あらかじめ.gitignoreを作成しておきます。とりあえず、こう書いとく。多分、変える。

# All Ignore
*


# Except
# Emacs
!/.emacs.d/init.el
!/.emacs.d/conf
!/.emacs.d/elisp
!/.emacs.d/public_repos

!/.bashrc
!/.gitconfig
!/.gitignore
!/.screenrc
!/.minttyrc
.

いつもの手順でgithub連携。

$ git init
$ git add .
$ git ci -m"first commit"
$ git remote add origin https://github.com/tsu-nera/dotfiles.git
$ git push -u origin master

https://github.com/tsu-nera/dotfiles.git

おわりに

githubを使うことで、自分の開発環境に対するカスタマイズの歴史を、もっといってしまえば自分のプログラミングに対する歴史を記録することができる。そんなところがとても気に入った。

この開発環境の歴史を、5年後、10年後に見直したら、きっと楽しいだろう。これは、自分のプログラミングのライフログだ。