Maclean1 - Mac clean install
2年前に購入した。Mac Book Pro Early 2011 - Mac OS X 10.6。
当時筋金入りの情弱(使ったことのあるOS:Windows Vista)の自分が購入して素の状態でそのまま使っていたが、最近なんか調子悪いのでクリーンインストールしてみた。
Macを手にしてから1年目くらいに、クリーンインストールしたい衝動にかられていたのでちょうど良かった。
- Pythonista志望、Vimmer見習いなので偏った設定になります。
- Mountain Lionにはしません。Snow Leopardです。
OS Install
付属のインストールDVD(Mac OS X Install DVD)よりインストールする。
今回は以前まで使っていたパーティションをすべてぶちこわして再構成する感じでいく。
- DVD入れる
- “c”または”option”を押しながら起動するとDVDからブートされる
- インストールウィザードが出てくるがスルーして、上部のステータスバーにあるディスクユーティリティーを起動
- 使用するディスクを選択して、パーティションタブを選択
- オプションで「GUID」を選択
- ボリュームの方式で「1パーティション」を選択
- フォーマットは「Mac OS 拡張(ジャーナリング)」を選択
- 「適用」で今までのパーティションとお別れ
- インストールウィザードに戻り、インストール(質問は簡単なので省略)
- 無事に起動
OS Update
DVDからインストールしたOSのバージョンは10.6.6と古いのでアップデートする。
右上のりんごから「ソフトウェアアップデート」
再起動をしてバージョンを確認すると、10.6.8になっている。
Application Install DVD
っていう名前の付属DVDを入れて、インストール。
iLifeアプリケーションが入りいます(iPhotoとかiMovieとか、Garagebandも入ってる)
Mac Setting
何となく自分のこだわり。
- トラックパッドの「タップでクリック」にチェック。
- 壁紙はこちら(http://tokuna.blog40.fc2.com/blog-entry-2068.html)
- Dockを画面の左 + サイズを最小
- 「ExposeとSpaces」のSpaces。Spacesを有効にして、操作スペースの切り替えをCommand+矢印キーにする。個人的に1行4列。
Neeeeed App
これを入れないと始まらないものたち。
Firefox
safariをゴミ箱に入れる前に、Firefoxと検索する。
むしろ、Safariを起動するのはFirefoxを検索するためだけにあるんじゃないか?
一緒にAdobe Flash Playerも入れるといい。
あと、safariは捨てません。すみませんでした。
Alfred
QuickSilverじゃないランチャー。ないと作業効率が著しく低下するので早い段階でインストール。
iTerm2
TerminalよりiTerm2。
Mozc
Google日本語入力(http://www.google.co.jp/ime/)
インストーラーからインストール。
システム環境設定の「言語とテキスト」でGoogle日本語入力にチェックが入っていることを確認、ことえりをOFFにする。
Xcode
Macにはデフォルトでgcc入ってない。めっちゃ不便。
DeveloperサイトからXcodeを入手できる(https://developer.apple.com/downloads/index.action#)
Snow Leopardでは多分「Xcode 3.2.6 and iOS SDK 4.3 for Snow Leopard」を選択すればいい。
4Gくらいあるのでダウンロードに時間がかかる。
rake
O’Reilly Japan - テスト駆動開発による組み込みプログラミング で紹介されているテストフレームワークUnityはrakeでビルドできるということなので使ってみよう。
Install for Cygwin
Windowsで作業するときはもっぱらCygwinなのでめんどくさいがCygwinに入れてみる。
デフォルトのCygwinにはgemが入っていないので
- wget gem & tar
- gemのインストール
- gemでrakeインストール
の流れでインストールする。
$ wget http://rubyforge.org/frs/download.php/76729/rubygems-1.8.25.tgz
$ cd rubygems-1.8.25
$ ruby --version
ruby 1.9.3p327 (2012-11-10 revision 37606) [i386-cygwin]
$ ruby setup.rb
RubyGems 1.8.25 installed
unable to convert U+0160 from UTF-8 to Windows-31J for History.txt, skipping
unable to convert U+0160 from UTF-8 to Windows-31J for History.txt, skipping
== 1.8.25/ 2013-01-24
* 6 bug fixes:
* Added 11627 to setup bin_file location to protect against errors. Fixes #328 by ConradIrwin
* Specification#ruby_code didn't handle Requirement with multiple
* Fix error on creating a Version object with a frozen string.
* Fix incremental index updates
* Fix missing load_yaml in YAML-related requirement.rb code.
* Manually backport encoding-aware YAML gemspec
------------------------------------------------------------------------------
RubyGems installed the following executables:
/usr/bin/gem
$ gem --version
1.8.25
$ gem install rake
Fetching: rake-10.0.4.gem (100%)
Successfully installed rake-10.0.4
1 gem installed
Installing ri documentation for rake-10.0.4...
Installing RDoc documentation for rake-10.0.4...
$ rake --version
rake, version 10.0.4
ok!
centos 5.3 使えるようにする
Vim, Zsh, Screen, Pythonの設定。
Vim
.vimrcはGist ->
使ってるプラグイン達
NeoBundle '/Shougo/neocomplcache.git'
NeoBundle '/Shougo/neosnippet.git'
NeoBundle '/Shougo/vimshell.git'
NeoBundle '/Shougo/vimproc.git'
NeoBundle '/Shougo/vimfiler.git'
NeoBundle '/Shougo/unite.vim.git'
NeoBundle '/thinca/vim-quickrun.git'
NeoBundle '/mattn/multi-vim.git'
NeoBundle '/mattn/zencoding-vim.git'
NeoBundle '/scrooloose/nerdcommenter.git'
NeoBundle '/scrooloose/nerdtree.git'
NeoBundle '/scrooloose/syntastic.git'
NeoBundle '/vim-scripts/YankRing.vim.git'
NeoBundle '/rstacruz/sparkup.git'
NeoBundle '/Lokaltog/vim-easymotion.git'
今後の増殖に期待。
今回導入したプラグインについてコメント。
Sparkup
zencodingバリにhtmlをさくっと書けるプラグイン。
使い方はREADME & ここ参照 -> Vim の Sparkup プラグインで HTML タグを Zen Coding 風に簡単入力 : Serendip - Webデザイン・プログラミング
NeoSnippet
ちょっと前にneocomをupdateした後に突然補間にめっちゃ時間が掛かる現象に遭遇して以来、分離前のネオコンを使っていたのだが今回使ってみる。
vimrcはそのまま使わせてもらってます。良い感じに動いているようだ。
修正, その他
1. popup color
Vim-users.jp - Hack #9: Insert mode補完 設定編
ネオコンのポップアップが何も見えなかったのでポップアップの色を変更。変える方法を初めて知る。
hi Pmenu ctermbg=8
hi PmenuSel ctermbg=4
hi PmenuSbar ctermbg=0
2. nerdtree
vim - nerdtree suddenly broke - Stack Overflow
?~V?みたいなのが表示されたときはvimrcに以下を設定。
let g:NERDTreeDirArrows=0
3. ctrl+v
ctrl + vで矩形選択モードになる。チョー使えそう!
何で知らなかったのorz
Zsh
zsh入門してみたら便利すぎて鼻息が抑えられない - はてブロ@ama-ch
Zshrcの設定ファイルは良い感じのをコピーして勝手に使っていただけなのでまじめに考えてみる。
その結果こうなった。
export LANG="ja_JP.UTF-8"
# The following lines were added by compinstall
zstyle ':completion:*' completer _expand _complete _ignored _correct _approximate
zstyle ':completion:*' list-colors ''
zstyle ':completion:*' list-prompt %SAt %p: Hit TAB for more, or the character to insert%s
zstyle ':completion:*' menu select=2
zstyle ':completion:*' select-prompt %SScrolling active: current selection at %p%s
zstyle ':completion:*' verbose true
autoload -Uz compinit
compinit
# End of lines added by compinstall
# Lines configured by zsh-newuser-install
HISTFILE=~/.zsh_history
HISTSIZE=5000
SAVEHIST=5000
setopt appendhistory extendedglob notify
setopt hist_ignore_dups # ignore duplication command history list
setopt share_history # share command history data
# history search Ctrl+s or Ctrl+S
autoload history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^P" history-beginning-search-backward-end
bindkey "^N" history-beginning-search-forward-end
# End of lines configured by zsh-newuser-install
autoload colors
colors
#Prompt
export PROMPT="[%F{magenta}%B%n%b%f%F{cyan}@%M%f]{%~}%# "
export RPROMPT="[%F{yellow}%*%f]"
alias ls='ls -G'
# PATH
PATH=/usr/local/bin:/usr/sbin:/bin:$PATH
# no beep
setopt nolistbeep
# useful functions
setopt auto_cd
setopt auto_pushd
setopt correct
setopt list_packed
# virtualenv setting
VIRTUALENVWRAPPER_PYTHON=/usr/bin/python26
export WORKON_HOME=$HOME/.pythonenvs
source /usr/bin/virtualenvwrapper.sh
注意したいのは先頭に追加したLANG変数の設定。
/etc/sysconfig/i18nに設定されているのにzshで読み込まれていなかったようだ。
このせいで文字化けに時間を取られてしまったのが残念。。。
nerdtreeの表示がおかしくなるのもこれが原因。
Python
Python Version Manage - memomemo
$ sudo pip install virtualenv virtualenvwrapper
pythonbrewも入れよう。
python3のvenvを使ってみようかと思ったりもするが、virtualenvがまだ便利なのでそのまま。
Other
特定のポートを開放したいときは/etc/sysconfig/iptablesを編集する。
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
80番ポートを開いている例。
centosはじめました
CentOS 5.3を使うことになったので自分好みのCentOSになるように設定してみた。
sakuraもデフォルトCentOSなのでそのまま同じ設定でいけるかも。
Install
下記の記事を参考にインストール。
※ net-install版ではない。
設定した項目は以下。
- ネットワーク : DHCP IPv4 IPv6 (デフォルト変更なし)
- 用途 : Server - GUI (Server用パッケージとGNOME)
- ファイアウォール : 有効、sshを許可
# ネットワーク
起動した段階でLANケーブルに繋がっていなかったりすると、eth0が停止状態になっているので下記の方法で起動する。
- システム -> 管理 -> ネットワーク
- ネットワーク管理画面でeth0が停止中になっている
- 起動ボタンをクリック
- 再起動を要求される場合があるので、必要に応じて再起動する
Packages Setting
何はともあれ下記のコマンドを始めに実行する。CentOS始めました感が出てくる。
$ yum update
yumとrpmがあるが基本的にはyumを使用する。
# すぐさま入れたいものリスト
- vim7.3
- hg(mercurial)
- git
- screen
- zsh
- python
- gcc
- g++
- make
- automake
1. gcc
# yum install gcc
...
# rpm -qa | grep gcc
3. mercurial
Logwatch for santa » CentOS 5.4 に mercurial をインストール
# yum install python-devel
# yum install python-setuptools
# easy_install mercurial
# hg --version
... 2.6-rc ...
versionが2.6.rc。最新は2.5.4とかじゃなかったっけ?
Mercurial-2.6-rcの並列になったupdateを試す - 放牧日記
まさかの最新版である。rc版について知らなかったので↓
4. zsh
# yum install zsh
# zsh --version
zsh 4.2.6
必要に応じてバージョンアップする。
5. zlib
自前でmakeするときなどなどで時々なくて失敗ということがあるので先に入れる。
# rpm -qa | grep zlib
なかったら
# yum install zlib
# rpm -qa | grep zlib-devel
なかったら
# yum install zlib-devel
6. make
# rpm -qa | grep make
なかったら
# yum install make
6. python
CentOS 5.7 に Python 2.6 を入れて pip で MoinMoin をインストール - キュウリのように落ち着いて
# python
Python 2.4.3...
...
>>>
古すぐる。
# easy_install pip
TrackBackの文字が。。。
# pip
失敗\(^o^)/オワタ
由々しき事態である。これはなんとしても回避する。(pipが使えない環境では呼吸ができないのと同然、生きていけない。。。)
そう、そして外部リポジトリに手を出すのである。EPELはfedoraのリポジトリ。
# wget http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/5/x86_64/epel-release-5-4.noarch.rpm
# rpm -ivh epel-release-5-4.noarch.rpm
# yum --enablerepos=epel search python26
# yum --enablerepos=epel install python26
# python26
Python 2.6.8...
...
>>>
次は2.6のeasy_installを使えるようにする。
# yum --enablerepos=epel install python26-distribute
# which easy_install-2.6
/usr/bin/easy_install-2.6
# easy_install-2.6 pip
# pip-2.6 --version
pip 1.3.1 .......
# pip --version
pip 1.3.1 .......(同じバージョンなのでpipのみでも2.6のpipコマンドが実行可能)
ok!
7. git
CentOS5.5にgitをインストールする(yumを使用) - hogehoge foobar Blog Style5
# yum install gitができない。easy_install mercurialでインストールできるhgは素晴らしい。
上記記事にはyum.repos.dにgit.reposを追加してhogehogeと書いてあるが、先ほどpythonでepelリポジトリを追加してしまったのでそこにgitがある。
# yum list | grep git
gitがあるのを確認
# yum install git
今はデフォルトで–enablerepo=epelになっているが、この状態はあまり良くないかもしれないのでデフォルトでは見つからないように設定する。
8. automake
RVMをさくらVPS(CentOS-5.6)にインストール - CMS専門 Web開発者ブログ
yumで入れられるautomakeはバージョンが古いらしくruby環境を構築する際にえらい面倒なことになるようなので自前makeした方がいい。
9. vim7.3
CentOS 5.5 にVim7.3をソースからインストール - ITコンサルタント成長録
2013/04現在の最新版は7.3.3。以下のコマンドを実行していけばインストール完了。
# yum install ncurses-devel -y
# wget http://ftp.vim.org/pub/vim/unix/vim-7.3.tar.bz2
# tar jxfv vim-7.3.tar.bz2
# mkdir vim73/patches
# cd vim73/patches
# seq -f http://ftp.vim.org/pub/vim/patches/7.3/7.3.%03g 3 | xargs wget
# cd ..
# cat patches/7.3.* | patch -p0
# ./configure --prefix=/usr --enable-multibyte --with-features=huge --disable-selinux
# make
# make install
# vim
vim 7.3.3
ok!
Security
wheelユーザー
CentOSではwheelユーザーはデフォルトでonになっていないので下記の設定を行う。
/etc/login.defsの末尾に以下の行を追加
# Login is whell only
#
SU_WHEEL_ONLY yes
/etc/pam.d/suを編集
# Uncomment the following line to require a user to be in the "wheel" group.
#auth required /lib/security/$ISA/pam_wheel.so use_uid
2行目のauth...のコメントアウトを外す。
/etc/groupでsuが使えるユーザーを設定。
# vim /etc/group
下記の行に
old : wheel:x:10:root
ユーザーhogeを追加
new : wheel:x:10:root,hoge
rootへのログイン
CentOSに限らずかもしれないが、/etc/ssh/sshd_configで
PermitRootLogin yes
となっているのはセキュリティ上問題がある。(Linuxに**必ず**存在するrootユーザーは格好の的になってしまう)
なので、rootはパスワード認証でログイン出来ないようにする。公開鍵認証はログイン可。
rootへの公開鍵認証を行いたいホスト(localhost)で鍵生成、鍵コピー。
(localhost)$ ssh-keygen
(localhost)$ ssh-copy-id root@XXX.XXX.XXX.XXX
パスワードを要求される(まだパスワード認証は出来る状態)
(localhost)$ ssh root@XXX.XXX.XXX.XXX
[root@xxxxx ~]#
ssh公開鍵認証でrootにログイン出来るのを確認
rootでログインして/etc/ssh/sshd_configを書き換える。
# PermitRootLoginを以下に書き換える
PermitRootLogin without-password
もはやsshではログインできなくするという少しワイルドな方法もある。
設定は簡単で、/etc/ssh/sshd_configのPermitRootLoginをnoにする
PermitRootLogin no
Tips
覚えておきたいシステムコマンド
- uname -a
- df -h
- who (“w” でも可)
- last
- free -tm
- ps aux | grep sshd
- pstree
- lsof -i:ssh (-i:hoge hogeはポート番号又はプロセス名)
/usrと/usr/local
CentOS –version
yumのオプション
-yオプションは(y/N)を聞かないですぐにインストールしちゃうようになるオプション。
困ったときはman先輩に聞こう。
# man yum
C言語 - Testing Frameworks
C言語で開発していく際にTDDまたはBDDを意識した開発を行っていこうと思う。
TDD : テスト駆動開発 - Wikipedia
BDD : ビヘイビア駆動開発 - Wikipedia
調査
C言語テストフレームワークについて扱っている日本人の記事
- C言語の単体テスト、いろいろ: ソフトウェアテストの勉強室
- ユニットテスト環境はどのようなものが存在するか | Rui Software
- C言語向けユニットテスティングフレームワーク CUT、CuTestについて - 千里霧中
よく紹介されていて情報もありそうな、以下のフレームワークを試してみる。
- CUnit
- CUT
- Cutter
- CuTest
- MinUnit
- (CMockery)
- CSpec(BDD)
- Unity
※ ほとんどのフレームワームが2006~2008あたりで開発がストップしている。
CUnit
有名なテストフレームワーク。
日本語のチュートリアルがあったので実践。
1. Install
SOURCEFORGEに圧縮ファイルがあるのでダウンロード。( C Unit Testing Framework | Free software downloads at SourceForge.net )
解凍コマンド( tarコマンドで解凍・圧縮するlinux一覧まとめ(tg、zgz、zipなど) )
$ tar -jxf CUnit-2.1-2-src.tar.bz2
$ cd CUnit-2.1-2
$ ./configure --enable-curses
$ make
$ make install
※例によって例のごとくCygwinではエラー
※Linux環境ではsudo make installする必要があるかもしれない
2. Usage
include <CUnit/CUnit.h>
#include <CUnit/Console.h>
int say_two()
{
return 2;
}
void test_say_two_01();
int main()
{
CU_pSuite sort_suite;
CU_initialize_registry();
sort_suite = CU_add_suite("Sort", NULL, NULL);
CU_add_test(sort_suite, "test_001", test_say_two_01);
CU_console_run_tests();
CU_cleanup_registry();
return(0);
}
void test_say_two_01()
{
int word = 0;
word = say_two();
CU_ASSERT(word == 3);
}
3. Usability
- 古めかしい。
- main分を自分で書かないとダメ。しかも結構多い。
- 色々とCUNIT用の設定を書かないといけないので、テスト書くの大変。
- makeしたりと導入コストが高い。しかもCygwinではmake失敗するとかいう環境によっては使えなかったりするのがかなり困る。
CUT 2.6
CUT 2.6 – 10th Anniversary Version!
Pythonを使っている 軽量 テストフレームワーク。
CUT, Cutterについてはこの記事を参考にしています。 C言語向けユニットテスティングフレームワーク CUT、CuTestについて - 千里霧中
1. Install
Linux環境では以下のコマンドでさくっとインストール
$ wget http://www.falvotech.com/content/cut/2.6/cut-2.6.tar.gz
$ tar -zxvf cut-2.6.tar.gz
$ cd cut-2.6
$ sudo make install PREFIX=/usr/local
cc -c -o cut.o cut.c
ar r libcut.a cut.o
ar: creating libcut.a
rm -rf ./build
mkdir -p ./build/bin
mkdir -p ./build/lib
mkdir -p ./build/include/cut/2.6
cp *.py ./build/bin
cp cutgen ./build/bin
chmod a+x ./build/bin/cutgen.py ./build/bin/cutgen
cp libcut.a ./build/lib
cp cut.h ./build/include/cut/2.6
mkdir -p /usr/local
cp -r ./build/* /usr/local
2. Usage
残念なことにドキュメントは見当たらない。しかし、使い方はとても簡単。
#include <cut/2.6/cut.h>
int hoge()
{
return 5;
}
void __CUT__Hoge(void)
{
ASSERT(2 == hoge(), "Assert Message!");
}
テスト関数は__CUT__を接頭語としてつける。
テスト関数を記載したファイルを読み込んだ後は、cutgenを実行する。
テスト用のmain関数が書かれたファイルが出力されるのでコンパイル->実行。
$ cutget hoge.c > main.c
$ gcc hoge.c main.c -L/usr/local/lib -lcut
$ ./a.out
cut.c:10:0: 2 == hoge(): error: Assert Message.
3. Usability
- 簡単に使える。make installしているがmakeなくてもいけるんじゃないかというくらい。
- 軽量。動作も軽快。
- テストフレームワークとして 必要最小限 の機能しかない。
- pythonが入っていないとcutgenコマンドが使えない。
CuTest
CuTest: The Cutest C Unit Testing Framework
CUTのshell script版。ヘッダとソースファイルさえあればいい。
ドキュメントはREADME.txtのみ!そのままやってみる。
1. Install
CuTest: C Unit Testing Framework | Free Development software downloads at SourceForge.net
上記のリンクにZIPファイルが落ちているので解凍するだけ。
2. Usage
カレントディレクトリに(/testとかディレクトリを作ってもいい)、CuTest.h, CuTest.c, make-tests.shを配置する。
# cutest_sample.c
#include <stdio.h>
#include "CuTest.h"
char* StrToUpper(char* str) {
return str;
}
void TestStrToUpper(CuTest *tc) {
char* input = strdup("hello world");
char* actual = StrToUpper(input);
char* expected = "HELLO WORLD";
CuAssertStrEquals(tc, expected, actual);
}
CuSuite* StrUtilGetSuite() {
CuSuite* suite = CuSuiteNew();
SUITE_ADD_TEST(suite, TestStrToUpper);
return suite;
}
もちろんアサートが出るコード。
注意
#include <stdio.h>しないと ‘NULL’ undeclared (first use in this function)のエラーメッセージが出るので注意。
(ここに書いてあった-> Snowy Code: C++のエラー:error C2065: ‘NULL’ : 定義されていない識別子です。:C,C++,PHP,XCODE )
テストコードを作成したら次にshell script(make_test.sh)を実行して、コンパイル。
$ sh make-tests.sh cutest_sample.c > main.c
$ gcc main.c CuTest.c cutest_sample.c
$ ./a.out
There was 1 failure:
1) TestStrToUpper: cutest_sample.c:12: expected <HELLO WORLD> but was <hello world>
!!!FAILURES!!!
Runs: 1 Passes: 0 Fails: 1
3. Usability
- CUTと同様に軽量で早い。
- ライブラリじゃないので、ヘッダとソースを読み込むだけの簡単導入。
- CUTよりテストフレームワークとして作りこまれている。(とりあえず、メッセージはCUTより丁寧)
- main書かなくていい。
- シェルスクリプトを実行するだけで簡単にテストが作れる。
- シェルスクリプトに不具合があるような気がする。出力ファイルの変な箇所に改行が入っていた。(自分で修正)
Cutter
C言語・C++言語用テスティングフレームワーク - Cutter
日本人が開発している。
なんとドキュメントが非常に充実している。が、逆に丁寧に書かれすぎて複雑な感じになっているorz
そんな不満を持ている人が他にもいた↓
簡単に使ってみよう。
1. Install
プラットフォーム毎のCutterのインストール方法 - Cutter
ドキュメントがえらく丁寧なので、上記サイトの手法を使えばインストールできる(丸投げ)
※ cygwinだとうまくコンパイルされない?!
自分の環境だとmake installして入れた。cutterだがコンパイルは通るものの、cutterで実行するとうまくいかない。 具体的には、テストが実行されない。空のテストが実行された事になってる。Ubuntuでは同じコードで正常に動作する。
Macにインストールする場合はportでもbrewでもインストールできる。
$ brew install cutter
$ sudo port install cutter
2. Usage
テストコード : cutter.c
#include <cutter.h>
int add(int a, int b);
int sub(int a, int b);
void test_add(void);
void test_sub(void);
int add(int a, int b){ return a+b; }
int sub(int a, int b){ return a-b; }
void test_add(void){
cut_assert_equal_int(3, add(1,2));
}
void test_sub(void){
cut_assert_equal_int(5, sub(9,4));
}
実行してみる。Ubuntuでインストールしたところusr/localではなくusr直下にインストールされていた。インストール時にパス指定しないとなのか。
$ gcc -shared cutter.c -o ./cutter/cutter.so -I/usr/include/cutter -L/usr/lib -lcutter
$ cutter cutter/
..
Finished in 0.006999 seconds (total: 0.000427 seconds)
2 test(s), 2 assertion(s), 0 failure(s), 0 error(s), 0 pending(s), 0 omission(s), 0 notification(s)
100% passed
.....(失敗するように編集)
$ cutter cutter/
F
===============================================================================
Failure: test_add
<4 == add(1,2)>
expected: <4>
actual: <3>
cutter.c:12: test_add(): cut_assert_equal_int(4, add(1,2), )
===============================================================================
.
Finished in 0.006359 seconds (total: 0.002195 seconds)
2 test(s), 1 assertion(s), 1 failure(s), 0 error(s), 0 pending(s), 0 omission(s), 0 notification(s)
50% passed
cutterは.soファイルを作成->実行でテストという流れになっている。
テストのためにわざわざmain書かなくていいのが調子いい。
3. Usability
- 情報が多い。日本人ユーザーも多い。
- Windowsに導入する方法がどこにも書かれていない。いい感じにdisってる。
- main書かなくていいので、本体のアプリケーションとの分離ができているのでテストの位置づけがわかりやすい。
- テストコードは完結に書けて良い感じ。
- 残念なことに、本家チュートリアルが鬼。automakeとかの勉強しないと。
- テストフレームワークとして機能が充実している。
- 本家ドキュメントが鬼なので簡単に使える方法を紹介している記事がいくつかある。
MinTest
JTN002 - MinUnit – a minimal unit testing framework for C
1. Install
インストール?そんなのはいらない!?以下の3行がMinTest。
/* file: minunit.h */
#define mu_assert(message, test) do { if (!(test)) return message; } while (0)
#define mu_run_test(test) do { char *message = test(); tests_run++; if (message) return message; } while (0)
extern int tests_run;
2. Usage
本家ドキュメントにあるコード。読めばすぐわかるくらい簡単!
#include <stdio.h>
#include "minunit.h"
int tests_run = 0;
int foo = 7;
int bar = 4;
static char * test_foo() {
mu_assert("error, foo != 7", foo == 7);
return 0;
}
static char * test_bar() {
mu_assert("error, bar != 5", bar == 5);
return 0;
}
static char * all_tests() {
mu_run_test(test_foo);
mu_run_test(test_bar);
return 0;
}
int main(int argc, char **argv) {
char *result = all_tests();
if (result != 0) {
printf("%s\n", result);
}
else {
printf("ALL TESTS PASSED\n");
}
printf("Tests run: %d\n", tests_run);
return result != 0;
}
3. Usability
- 軽量どころか3行wwww
- 導入コストがこれより低いフレームワークを探す方が難しい。
- そんなんなので話題性があり情報がたくさんある。
- MinTestをForkしてGithubにリポジトリ作った人がいる。中を見たが結構改良されている。 siu/minunit · GitHub
- とても簡単なのでカスタマイズし放題、下記はカスタムしてある記事
CMockery
google製軽量テストフレームワーク。
なにやら、一組の.cファイルと.hファイルからなるフレームワークらしい。
今回は、大人の事情で実際に使ってみたりはしないが、その名の通りMock機能(will_returnとか)等があり、他のフレームワークにはないような機能があるっぽい。
CSpec
CSpec : Behavior-driven development in C · arnaudbrejeon/cspec Wiki
その名の通りRSpecリスペクトなBDDフレームワーク。開発は2年前くらいで止まってる(2013/04現在)。
独自のDSLのようなものが実装してあって、C言語ではないかのように扱える。
1. Install
Githubにリポジトリがある。
$ git clone https://github.com/toshi-kawanishi/cspec.git
$ cd src
$ make
$ cp libcspec.a /usr/local/lib/
$ cp -r ../inc/ /usr/local/include/
本家のほうではなくtoshi-kawanishiさんのリポジトリからcloneした。
本家のリポジトリにあるsrcには、Makefile.amのみが置いてあって自分でautomakeしろということですね、わかります。いやautomakeわかりません。なので、Makefileを用意してくれているこの方のリポジトリを使用する。
2. Usage
#include <cspec.h>
#include <cspec_output_verbose.h>
int under_test_function( int a, int b )
{
return a + b;
}
DESCRIBE(xml_long, "under_test_function()")
{
IT( "return sum arguments." ) {
SHOULD_EQUAL( under_test_function( 1, 2 ), 3 );
} END_IT;
} END_DESCRIBE;
int main( int argc, char **argv )
{
CSpec_Run( DESCRIPTION(xml_long), CSpec_NewOutputVerbose() );
return 0;
}
DESCRIBE ~ END_DESCRIBEまではcspecのコード。
独自のDSLで書かれていて、Cのコードの中にあると違和感しかない。
実行は先程のライブラリをリンクさせればコンパイル出来る。
$ gcc cspec.c -I/usr/local/include/cspec -L/usr/local/lib -lcspec
$ ./a.out
Describe:under_test_function()
- it return sum arguments.
OK: (under_test_function( 1, 2 )) == (3)
ちなみに括弧とか;(セミコロン)とか付けなくてもちゃんと動作する。
DESCRIBE(xml_long, "under_test_function()")
IT( "return sum arguments." )
SHOULD_EQUAL( under_test_function( 1, 2 ), 3 )
END_IT
END_DESCRIBE
3. Usability
- 独自DSLとかかっこいい。
- 比較的導入が簡単。
- テストフレームワークと比較して簡単に書けそう。(BDDなので当たり前か。。。)
- main文でCSpec_Run呼ばないといけないのが残念。
- C言語でもBDDを使えるというのが素晴らしい。
- 仕様自体は小さいのですぐに使える。
- 参考になる記事が割と多い。 -> C言語向けBDDフレームワーク CSpecについて - 千里霧中
Unity
最近(2013/04)邦訳本が出た、この書籍で紹介されているUnityとCppUTestを取り上げてみる。
英語版の勉強会は盛んに行われていたようだ。
がしかし、情報が少ない。UnityにはUbuntuのGUI、ゲームエンジンと有名なプロダクトの情報ばかり出てくる。
1. Install
ThrowTheSwitch/Unity · GitHub <https://github.com/ThrowTheSwitch/Unity>_
2. Usage
未調査...
3. Usability
未調査...
Think about news site
自分はよくY CombinatorのHackerNewを眺めているが、
飲み会で@ITとかITproとか見たほうがいいよ的なことを聞いたので、まずどんなニュースサイトがあるのか調べてみる。
:open google it情報 サイト
- ITpro
- ITmedia
- ASCII.jp
- CNET Japan
- @IT
- IT Leaders
などなど。
他に自分が知ってるのは
- CodeZine
- Publickey
- GIGAZINE
ざっと調べた限り見つかったサイトの特徴を独断と偏見で感想を述べてみる。
CodeGine
CodeZine:プログラミングに役立つソースコードが満載な開発者のための実装系Webマガジン
ひとまずはてなに尋ねる。
- 実装系IT情報サイト
- 実装系の幅広なトピックを扱ってる
- 実装系なコードはフリーに使ってもいい
PublicKey
Publickey - Enterprise IT × Cloud Computing × Web Technology / Blog
- なんかおしゃれ
- Publickey Topicsというサイトも最近始まった( Publickey Topics )
- Junichi Niinoさんが記事を更新しています。
- というか、これはブログ?
- ブログでメシが食えるか? Publickeyの2012年 - Publickey 飯も食えてる。
Dive into Effective C++
C++やってますと言えるようになるために
Effective C++ 第3版 スコット・メイヤーズ著 小林健一郎訳
を読んでみる。
2008年くらいの書物なのでC++11対応はしていない。C++11についても色々知りたいが今はあまり背伸びしないで下記の記事で満足することにする。
C++11とは (シープラスプラスイレブンとは) [単語記事] - ニコニコ大百科
目次
Introduction
イントロダクションなんて適当に読もうと思ったところ、そういうわけにもいかないようだ。。。。
/* 宣言 */
extern int x;
std::size_t numDigits(int number);
class Widget;
template<typename T>
class GraphNode;
// extern宣言
// * 外部の変数にアクセスできるキーワード
// size_t
// * 何かを数えるときに使う「符号なし整数」をtypedefしたもの
/* 定義 */
std::size_t numDigits(int number)
{
std::size_t digitsSoFar = 1;
while ((number /= 10) != 0)
++digitsSoFar;
return digitsSoFar;
}
template<typename T>
class GraphNode
{
public:
GraphNode();
~GraphNode();
};
/* デフォルトコンストラクタ */
class A
{
public:
A(); // デフォルトコンストラクタ
};
class B
{
public:
explicit B(int x=0, bool b=true) // デフォルトコンストラクタ
{
}
};
class C
{
public:
explicit C(int x); // デフォルトコンストラクタではない
};
/* explicitキーワード */
void doSomething(B bObject)
{
std::cout << "B型のオブジェクトを引数に取る関数";
}
B bObj1;
B bObj2(28); // int値の28からB型のオブジェクトを生成
doSomething(28); // エラー!: intからB型オブジェクトへの暗黙の型変換はされない
doSomething(B(28)); // 問題ない: B型のオブジェクトを使ってintをBに変換している
// explicit
// * 暗黙的な型変換を禁止するキーワード
// * explicitを付けないコンストラクタだと予想外の型変換を起こす可能性がある
// * 下記のコードもexplicitを付けないと暗黙的に型変換をしてしまいエラーにならず通ってしまう
// * 特に理由がなければ、暗黙的な型変換をしないようにコンストラクタはexplicit付きで宣言する
/* コピーコンストラクタ */
class Widget
{
public:
Widget(); // デフォルトコンストラクタ
Widget(const Widget& rhs); // コピーコンストラクタ
Widget& operator=(const Widget& rhs); // コピー代入演算子
~Widget();
};
Widget w1; // デフォルトコンストラクタが使われる
Widget w2(w1); // コピーコンストラクタが使われる
w1 = w2; // コピー代入演算子が使われる
Widget w3=w2; // コピーコンストラクタが使われる! => Widget w2(w1)とWidget w2=w1は同じ動作
bool hasAcceptableQuery(Widget w);
Widget aWidget;
if (hasAcceptableQuery(Widget w)) // コピーコンストラクタが実行
{
// ユーザー定義型を値渡しするのは良くない。一般にはconst参照渡しが良い。
}
// コピーコンストラクタ
// * 同じ型の別のオブジェクトで初期化するときに使う
// コピー演算子
// * 同じ型の別のオブジェクトを代入するときに使う
/* 未定義な動作 */
int* p=0; // pがヌルポインタ
std::cout << *p; // ヌルポインタが示す場所を取り出そうとすると動作は未定義になる
char name[] = "Hoge"; // 要素数は6
char c = name[10]; // 無効な添字の要素にアクセスしようとすると動作は未定義になる
// undefined
// * C++ではこのような未定義な動作をかけてしまう(JavaやC#ではない)
// * C++では未定義な動作をするコードをできるだけ書かないようにする注意が必要
/* シグネチャ */
// * メソッドや関数の名前、戻り値、引数の型などの組み合わせのこと
/* インターフェース */
// * JavaやC#にあるInterface宣言とは違う使い方をしてます
// * 関数のシグネチャやクラスのアクセス可能な要素などを意味する
// * テンプレート型のパラメータを意味することもある
/* 命名法 */
// わかり易い名前を心がける
// * 略記について
const Rational operator*(const Rational& lhs, const Rational& rhs); // left-hand sideとright-hand sideのこと
Widget* pw; // ポインタ変数には接頭語に"p"をつける
class GameCharacter;
GameCharacter* pgc;
GameCharactor::move()
{
mf = "hoge"; // メンバ変数のことをmfと書くこともある
}
#1 C++を複数の言語の連合と見なそう
C++のサブセット
- c
- オブジェクト指向C++
- テンプレートC++
- STL
C++で効率よくプログラミングするためのルールは、C++のどの部分を使うかで変わってくる。
#2 #defineより、const, enum, inlineを使おう
「プリプロセッサよりコンパイラを使おう」
- プリプロセッサ
- コンパイル作業において、初期段階で#define, #includeなどの内容が処理される。 その処理を行う機能(ツールなど)をプリプロセッサという。 広い意味ではコンパイルに含まれるが、狭い意味のコンパイルよりも後に実行される。
/* constを使う1 マクロの欠点 */
// この使い方をするとコンパイラからはASPECT_RATIOは見えない
// 1.653という数字になってる
// デバックするときに困るかもしれない
#define ASPECT_RATIO 1.653
// マクロを定数に置き換えることで解決
const double AspectRatio = 1.653;
// 利点
// * マクロを使うと、ASPECT_RATIOが出てくるたびに機械的にそれを1.653に置き換える(コピーが大量発生)
// * 一方、AspectRatioは常に1つしか存在しない
/* constを使う2 定数ポインタ */
// char*を使った定数文字列
// constが2回必要(charとポインタの2回)
const char* const authorName = "Nanashino Gonbe";
// 一般にはchar*よりstringを使ったほうが良い
const std::string authorName("Nanashino Gonbe");
/* constを使う3 クラスの持つ定数 */
// クラスで使う変数のスコープを限定するために、その定数をクラスのメンバにすることがある
// #defineでは再現不可能
// その定数が実際に1つだけ存在するようにstaticにする必要がある
class GamePlayer
{
private:
static const int NumTurns = 5;
int scores[NumTurns];
};
// 問題
// * staticな整数型定数メンバであっても宣言時に初期化できない(昔のコンパイラを使っているならば)
class CostEstimate
{
private:
static const double FudgeFactor; // ヘッダーファイルに書かれる
};
const double CostEstimate::FudgeFactor = 1.35; // ソースダイルに書かれる
// 更に問題
// * GamePlayerのようにコンパイル時に「クラスの定数」が必要になった時、コンパイルエラーが出る。
/* enumハック */
// 上記の更に問題を解決する手法
class GamePlayer
{
private:
enum { NumTurns=5 }; // [enumハック] => NumTurnsを5として使える
// constよりdefineに近い
// enumハックは色々なところで利用されているので覚えておく価値有り!
int score[NumTurns]; // 問題なし
};
/* マクロの問題点 */
#define CALL_WITH_MAX(a,b) f((a) > (b) ? (a) : (b))
// このマクロの悲惨さ
// * 仮引数を括弧で囲う必要がある
// * int a=5, b=0;
// * CALL_WITH_MAX(++a, b); // aが2回インクリメント
// * CALL_WITH_MAX(++a, b+10); // aが1回インクリメント
// * 運悪く引数によって挙動が変わる事がある
//
// こんなマクロを作るくらいならインライン関数のテンプレートを作る!
template<typename T>
inline void callWithMax(const T& a, const T& b)
{
f(a > b ? a : b)
}
単純な定数には、#defineよりもconstかenumを使うようにする。
#defineで定義されているマクロよりも、インライン関数を使おう。
※インライン関数については#30を参考に。
Responsive Web Design 始めました
以前から名前は聞いたことがあった”レスポンシブデザイン”。
今作ってるアプリがモバイル対応しないと作った意味が無いので勉強する。
media queriesを使った実装
Media Queruesはcss3からの機能。
対応する端末の解像度に合わせて設定していく。
端末の解像度がどの程度か知る必要がある。
case:MobileDesign! – スマートフォンサイトの制作TIPS BLOG - » スマートフォン・タブレット画面解像度一覧
この辺りを見ると何となく基準がわかるのではないかと。
基準を模索するのが面倒なので、下記の記事を参考にしてみる。
Responsive Web Design: Layouts and Media Queries
@media screen and (max-width: 1200px) {
}
@media screen and (max-width: 980px) {
}
@media screen and (max-width: 750px) {
}
@media screen and (max-width: 540px) {
}
@media screen and (max-width: 380px) {
}
1200, 980, 750, 540, 380の画面MaxWidthで分けている。
これで実装してみたところ1200を超えると、デフォルトの表示に戻ってしまうがレスポンシブになった。
TwitterBootStrapを使う
ツールに頼るのはいいことだが、いまいち導入の方法がわからない。。。(簡単だと思うのだが。。。)
responsive用のcssがあって、きっとそれを使えばいい。
実装はMediaクエリを使ったもの。以下のサイズで分けられている。
- 1200px
- 980px
- 768px
- 767px
- 480px
TwitterBootStrap 入門
最近入門を果たした。簡単だった。とても簡単にかっこいいデザインを手に入れられた。
マジすごい。
どのように使えるようになったかというと、下記の記事を読んだだけである。
- Twitter Bootstrap使い方-コンポーネント-v2.0.4 <- ここが一番良い感じ
- Twitter Bootstrapの使い方
- Twitter Bootstrap使い方-javascript-v2.0.4
結局のところ本家のドキュメントを見るのがいいという話になる。
画像をレスポンシブにする
GNU Screen
tmuxでもbyobuでもないscreenを愛用する。
Why?
- スタンダードな感じがする
- 気分
- 簡単に入れれるよ
.sceenrc
# escape
escape ^Tt
escape
# 256 color
term xterm-256color
# No Visual Bell
vbell on
# AutoDetatch
autodetach on
# Shell
shell /usr/bin/zsh
# divide screen
altscreen on
# Startup Message Off
startup_message off
# For Vim
altscreen on
# HardStatus
#caption always “%{b RK} %y/%m/%d(%D)%c:%s %{bu dr} | %-w%{=bu CK}%n %t%{-}%+w”
hardstatus alwayslastline '%{=b .y}@%H %-w%{=bu cw}%n:%t%{-}%+w %= %{b .g}%Y/%m/%d %{=b.g}%c:%s'
基本的な設定しかない。自分はこれだけで生きていくには十分だ。
キーバインドもそのまま。
VimmerなのでCtrl+hogeのキーバインドに悩む心配もない。
もっとすごいscreenrcを参考にしたいときはgoogle:screenrcをすればいい。
Usage
よく使うコマンドをメモφ
起動
- # screen
- 普通に起動する
起動オプション
- # screen -ls
- 存在しているセッションの一覧を表示
- # screen -r
- 最後にデタッチしたセッションを起動する
- # screen -a XXX
- プロセス番号XXXを起動する
画面
Ctrl+a -> ^A とする、.screenrcでescape ^tTとか書いている人は^T
- ^A + c
- 新しい画面を作る
- ^A + n or p
- StatusBarに表示された画面間を移動する nが右へ、pが左へ
- ^A + k
- 現在の画面を破棄する y/nで聞かれる
- ^A + ^A
- 前回作業していた画面にジャンプ
- ^A + “
- WindowListの表示。方向キーで選択できる
こっから下はほとんど使ってない。
- ^A + ‘
- 画面の番号を聞かれるので、指定してEnterでジャンプ
- ^A + 数字
- 数字の画面にジャンプ
- ^A + ‘
- 画面の番号を聞かれるので、指定してEnterでジャンプ
分割画面
分割画面作成は、^A+S or ^A+|の後にその画面上で^A+cすると新しくセッションが作成されます。
^A+cをやらないとただの空っぽの画面。
- ^A + S
- 画面を縦分割
- ^A + |
- 画面を横分割します ~A + Vでもできるという説がある。^A + |でできないときはためしてみるといいかも。
- ^A + Tab
- 分割された画面間を移動
- ^A + X
- 分割された画面を破棄する
設定ファイル再読み込み
- :source $HOME:.screenrc
- ホームフォルダを示す” ~ “(チルダ)は使えないので注意。
ホームフォルダを示すその他
- ^A + ?
- ヘルプ
- ^A + [
- コピーモード
コピーモードはほとんど使ったことがないので便利なのかも分からない。今度使ってみよう。
GNU Screen for Mac
私の使っているMac OS X 10.6.8にはデフォルトでscreenが入っていた(と思う)。
しかしバージョンが4.0.3と古く、縦分割が出来い。。。
縦分割できないとtmuxに乗り換えてしまいそうなので、最新版をビルドすることに。
screenの最新版はgitリポジトリにある。
$ git clone git://git.savannah.gnu.org/screen.git
Macではパッチを当てないとダメっぽい。( 2013/03/29 最近の(僕の)GNU Screen 事情 | blog.remora.cx )
$ curl -LO https://raw.github.com/gist/626040/be6a04f0e64c56185ba5850415ac59dad4cd62a0/screen-utf8-nfd.patch
$ cd screen
$ patch -p1 < ../screen-utf8-nfd.patch
$ cd src
$ ./autogen.sh
$ ./configure --prefix=/usr/local --enable-pam --enable-locale --enable-telnet --enable-colors256 --enable-rxvt_osc
$ make && make install
残念ながらこのままでは、./autogen.shあたりでこける。autoconfとautomakeをbrewでインストール。
$ brew install autoconf
$ brew install automake
さらに残念なことにこのままではmakeでこける。
GNU Screen開発版(4.1.0)でビルド時にエラー - へにゃぺんて@日々勉強のまとめ
この記事を参考にanci.cを修正する。w_がないとかTypo。。。
再びmakeすると成功するのでmake installで4.1.0に更新完了。
Ctrl+a |で立て分割出来る。
参考記事
- これからの「GNU Screen」の話をしよう - Keep It Simple, Stupid
- この記事はかなりすごい。Screen使いこなしてる感がにじみ出ている。 ウィンドウをグループ化することも可能らしい。
- 最新版GNU Screenで縦分割(その1〜導入編〜) | blog.remora.cx
- ブログ自体がかっこいい。
- 最近の(僕の)GNU Screen 事情 | blog.remora.cx
- 上と同じ人の。
Pythonで順列作成
会社の若手でやっている勉強会でこんな問題をみんなで解いてみた。
問題文
5, 4, 3, 2, 1, 0の6つの整数の間(順番は不変)に
「+, -, *, /, =」の演算子を必ず一回ずつ使い(順番は任意)式が成立するような組み合わせを求めよ
開始10分くらいで、演算子の並びの順列を求めるという問題になり考え始める。
itertoolsを使う
itertoolsというモジュールにpermutationsという関数がある。
from itertools import permutations
[x for x in permutation([1, 2, 3])]
itertoolsに含まれる関数については以下の記事が詳しくていい。
itertoolsモジュールをひと通り眺めてみた - kk6のメモ帳
イテレーション処理に便利な関数が多数含まれている。
自作する
アルゴリズムとして作成するにはどうするのか考える。簡単な例から何かしらの法則性を見つけることにする。
---------------
[1, 2]
-> [1, 2]
-> [2, 1]
2! = 2通り
---------------
[1, 2, 3]
-> [1, 2, 3]
-> [3, 2]
-> [2, 1, 3]
-> [3, 1]
-> [3, 2, 1]
-> [1, 2]
3! = 6通り
---------------
[1, 2, 3, 4]
-> [1 ,2, 3, 4]
-> [4, 3]
-> [3, 2, 4]
-> [4, 2]
-> [4, 3, 2]
-> [2, 3]
-> [2, 1, 3, 4]
-> ...
4! = 24通り
頭から取り出していって、残り2つになったらくるっとする。
残り2つになったらくるっとするというより、くるっとし続けて出来なくなったら空っぽにして頭をひっくり返す。
def permutation(li):
if li == []:
return [[]]
else:
return [[h]+t for i,h in enumerate(li) for t in permutation(li[:i]+li[i+1:])]
残り2つを意識して作ると、なんか複雑になっていく。
ちょっと視点を変えるのがこんなに大変だとは。。。結構時間かかった。
模範解答
この記事にある問題。模範解答もある。
順列生成アルゴリズム - drecom_kiroynのブログ
int n, m[M], i, j;
for(i=0;i<M;i++) m[i]=i;
for(i=M;i>=1;i++) {
n=N % i;
printf("%d", m[n]);
for(j=n;j<i-1;j++) m[j]=m[j+1]; //こんなに短いのに辞書順
N=(int)(N/i);
}
printf("\n");
剰余とか使ってる。なんかかっこいい。
しかし、何かよくわからない。。。