ArchBang Install

Install

ArchBang
http://blog.hatena.ne.jp/yymm6/yymm6.hatenablog.com/edit

live usbの作成

i686のイメージファイルをダウンロードし、USBにフォーマットする。

自分はMacBookProなのでdiskutilを使う。
まずUSBディスクをunmount

diskutil unmountDisk /dev/disk1

bs=8192でddする。インストールするのは2012-11-19。

dd if=archbang-2012.11.19-i686.iso of=/dev/disk1 bs=8192

取り出し。

diskutil eject /dev/disk1

USBから起動

使用するマシンはAmazon.comで180ドルくらいだったこれ。
ASUS x101ch black
HDD 320
RAM 1G

BIOSを起動する前に。WindowsでLinuxパーティションにする予定のDドライブのある領域を空にしておく。
何か適当にインストールしてパーティションを設定したが忘れた。

F2でBIOSを起動。

USBが認識されていればEXITからUSBを起動できるので選択。

簡単にrootでUSBからArchBangが起動する。
右クリックメニューの"Install"を選択。

時間をセット

Asia->Tokyo

パーティション

cfdiskのメニューに従い以下のように設定。

/dev/sda1 Windows 100G (本から入っていたWindows7 Starter)
/dev/sda2 /Boot ext2 100M
/dev/sda3 swap 4G
/dev/sda4 /root ext4 残り(200Gくらい)

swapにそんなにいらない気もするがいいとする。
/root と /homeは分けないことにした。

Config

rootのパスワード設定
userの作成

  1. config
    1. locale.genでja_JP UTF-8のコメントアウトを外す
    2. mirrorlistをJapan以外のものをコメントアウトする
Bootloader

GREBをインストール。
特に設定はしない。

終了

再起動するとGREBのメニューからArchBangを起動できる。

Setting

ここからが本番。

ネット環境

WiMaxルータでWPAおk

OpenBoxのエラーメッセージ

ルートはうまくいっているが、一般ユーザーでApplicationを開く時にエラーが出る。
なにやらパスがおかしい的なエラーが出来るので、エラーメッセージに指定された場所にあるファイルを
application.xmlを指定できるように書き換える。

Pacman

$ pacman -Syu
$ pacman -Syyu

とするとパッケージが更新される。

$ pacman -Ss package-name

で検索できる。

$ pacman -S package-name
$ pacman -Sy package-name
でインストール。
$ pacman -R package-name
で削除。

コマンドオプション詳細はこちら
pacman (日本語) - ArchWiki

ABS / AUR

ルートでやるとじゃないかと思う。(su/sudo使っても良いけど)
$ pacman -S base-devel
$ pacman -S abs
$ pacman -S pacman-color
$ pacman -S yaourt

/etc/pacman.conf
に以下の行を追加する。(リポジトリのURL)

[archlinuxfr]
Server = http://repo.archlinux.fr/i686

AURのパッケージ、pacmanで拾えるパッケージは-Ssで検索も出来るけど
AUR (en) - Home
本家ホームページから検索してもいい。

yaourtのコマンド詳細についてはこちら
Yaourt - ArchWiki

インストール方法の参考はこちら
Tick Stick Linux : Yaourt のインストール ArchLinux

日本語環境

scim-anthyを使うことに。
いずれmozcに乗り換える可能性もあるがひとまず。
ibusでもよかったが、批判的な意見を聞いてしまい却下に、人間は他の人に流されやすいものだ。

SCIMとは?
SCIM - Wikipedia

本家インストールガイド
Smart Common Input Method platform (日本語) - ArchWiki
本家じゃないけど関連記事
ArchLinuxで日本語入力とか (scim + anthy) - opamp_sandoの日記 ...でいいよね

$ pacman -S scim-anthy

/etc/profileに以下を書き込む。

export XMODIFIERS=@im=SCIM
export GTK_IM_MODULE="scim"
export QT_IM_MODULE="scim"

日本語のフォントがサイテーなのでさくっとIPAフォントを入れよう。

yaourt -S otf-ipafont

Fonts - ArchWiki

開発環境

$ pacman -S openssh
$ pacman -S git
$ pacman -S mercurial
$ pacman -S vim
$ yaourt -S byobu

zsh

デフォルトのシェルをzshに変更する。

$ which zsh
$ chsh

あとは、起動と同時にbyobuを開始したい。

Python

デフォルトのPythonは2.7.3。
$ python2
で起動する。

pythonbrewをインストールする。
utahta/pythonbrew · GitHub
基本的にGithubのReadmeの通りにやれば出来る。

ただし、PYTHONBREW_ROOTは絶対パスで指定しなければならない。
$HOME/.pythonbrew
/home/username/.pythonbrew

pythonbrew自体のアンインストール

pythonのインストールを途中で止めてしまったら(ネットワーク接続が急に切れた。。。)
そのバージョンをインストールできなくなってしまい。やむなくアンインストールすることに。
とりあえず、インストール時にできたフォルダを全部消去する。
これだけでは何か再インストールできなかった。
PYTHONBREW_ROOTを空に戻すと無事再インストールできた。

2.6.3と3.2.3をインストール。
3.2.3はsetuptoolsでエラーが。何故?(python3系は使う予定がないのでしばらく保留)
下に記事があったがパスの問題?らしい。
python 3.2.3 の インストール時のエラー - KRAKENBEAL RECORDS




今後やること

  • Pythonの環境を整える。

-pythonbrewを入れてみる。なんとAURリポジトリにあった。

  • ibusに乗り換えようか?
  • 他のフォントを入れようか?

-

Arch Linuxの時間を合わせよう

Linux Distributions

ASUSEeePCを買ってしまったのでLinuxを入れるしかないんだと思い
どのディストリビューションがいいのか考えてみる。

Linuxディストリビューション - Wikipedia
これからLinuxを使い始めたい人向けディストリビューション紹介 - NAVER まとめ

興味のあるディストリビューション

Fedora/Debianは有名だけどもっと軽量じゃないと。
でもRedHat系(FedoraとかCentOSとか)とDebian系(DebianとかUbuntuとか)は触っておいた方がいい気がする。
Linuxの話(13:軽量ディストリビューション編):sinkobaのブログ:So-net blog

Ubuntuも1GのRAMを必要としている時点でギリギリ。。。もっとリッチなスペックのPCに。
UbuntuベースのecolinuxとかMintとかもあるがなんとなく却下。

GentooVirtualBoxに入れてみたが、一時の気の迷いだったと反省している。
Linux ディストリビューションの欠点比較 - 旧生駒日記・シアトル日記・豪徳寺日記・西東京日記

Gentooでデスクトップ環境を構築したいのであればSavayonがある。
Live USB Creation = Frustration | Sabayon | Home
もずくのSabayon Linux: USBで起動できた!

というわけで軽量なものを。
軽量Linuxディストリビューション - Wikipedia

あと、EeePCはUSBブートしかできないので。
USBフラッシュメモリ用Linuxディストリビューションの比較 - SourceForge.JP Magazine : オープンソースの話題満載
USBメモリにFedoraをインストール at technote

Arch Linux

注目したのがArch Linux
Arch Linux - Wikipedia
軽量志向。

公式(日本語版もあるよ)
ArchWiki
Main Page (日本語) - ArchWiki

GUIインストーラーは存在していない。
Arch linuxインストール記(とりあえずインストール編)
Arch Linux インストール - Catastrophenom

ArchのディストリビューションのBangがいい感じらしい。
http://www.lifehacker.jp/2011/11/111114archbangarch.html:tile

USBのインストールイメージの作成
USB Installation Media (日本語) - ArchWiki

同じようにGentooとかで迷っている人発見(この人はMintに行った)
Winux/Lindows Gentoo→Archbang→LinuxMint

Impressions

自分の家は有線WAN環境が無いので、WPAパスワードが必要だったりする環境を整えたいがLinuxでは大変なことが多い。
ArchBangのようなオールインワンなディストリビューションが便利だった。
が、メジャーなディストリビューションも使ってみた方が良いと思う。

Rethink Vim

gVimは使わない。

Vimmerになりまだ半年たっていないがWindowsのgVimにイライラ来ていたので自分のVim環境について考え直してみる。

WindowsからはCygwinで、MacからはiTremで使うことによりどこでも大体同じ環境でコーディングできるようにする。(MacVimは卒業する。)

.vimrcはHg管理下に置く。
ついでに.vimperatorrcも管理したいのでWindowsではシンボリックリンクを作成しておくことにする。(Macでは同じ場所にあるので大丈夫)

>> mklink /d "作成場所パス" "参照先パス"

でおk。(ただし、管理者権限でcmdを起動しないとダメだった)
Win7:シンボリックリンクについての詳細は
Windows7(vista)の便利機能シンボリックリンクでデータをDドライブへ逃がす - consbiol のエコ日記

Mac OS X 10.6.8 : シンボリックリンク
UNIX や Linux でシンボリックリンクを作成・削除するコマンド。 | btmup Blog
UNIXの部屋 コマンド検索:ln (*BSD/Linux)

zshは必須。
CygwinではByobu、iTermではtmuxを使うことにする。

フォントはゆたぽんです。見やすいしなごみます。
font ゆたぽん(コーディング) フォント

基本的な設定

マウスのドラッグで選択すると行番号が入ってしまうので
クリップボードへコピーがうまくいかない。
行番号の表示をマッピングしてさくっと切り替えてコピーすることに。

"viとの互換を取らない
set nocompatible
"行番号の表示
set number
"タイトルをウィンドウ枠に表示
set title
"ルーラーを表示(ステータスバーにカーソル位置を表示)
set ruler
"入力中のコマンドをステータスに表示する
set showcmd
"括弧対応表示
set showmatch
"ステータスラインを常に表示
set laststatus=2
"バックスペースに関する設定
"indent : 行頭の空白削除
"eol    : 改行の削除
"start  : 挿入モードでの削除
set backspace=indent,eol,start
"タブの幅
set ts=4 sw=4 sts=0
"新しい行を直前の行と同じインデントにする
set autoindent
"tabを空白に置き換えない
set noexpandtab
"オートインデントを有効にする
set cindent
"バックアップファイルを作成しない
set nobackup
"スワップファイルを作成しない
set noswapfile
"Syntax HighLight
syntax on
"見づらい色を変更する(背景が黒の場合見づらいので)
hi Comment ctermfg=cyan
hi Directory ctermfg=cyan
hi SpecialKey ctermfg=cyan
hi Constant ctermfg=red
hi WarningMsg ctermfg=red

"色の確認用コマンド
command! HighLightList so $VIMRUNTIME/syntax/hitest.vim
command! ColorList so $VIMRUNTIME/syntax/colortest.vim
"ビープ音を鳴らさない
set vb t_vb=
"ClipBoardの利用
set clipboard&
set clipboard+=unnamed
set clipboard+=autoselect
set clipboard=unnamed
" 検索のハイライト
set hlsearch
" <ESC>×2で検索の解除
nmap <ESC><ESC> :nohlsearch<CR><ESC>
"最後までサーチすると先頭に戻る
set wrapscan
"大文字小文字の区別をしない
set ignorecase
"検索文字列に大文字があった場合に反映
set incsearch
"分割画面切り替えキーバインド
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-h> <C-w>h
nnoremap <C-l> <C-w>l
"長い文章を折り返さない
set nowrap
"他で書き換えられたら自動で読み直す
set autoread
"保存しなくてもバッファを切り替えることができる
set hidden
"vimrcをいつでも簡単に(rce/rcs)
nmap rc [vimrc]
nnoremap <silent> [vimrc] :<C-u>e $MYVIMRC<CR>
nnoremap <silent> [vimrc]v :<C-u>vs $MYVIMRC<CR>
nnoremap <silent> [vimrc]s :<C-u>sp $MYVIMRC<CR>
nnoremap <silent> [vimrc]r :<C-u>source $MYVIMRC<CR>
"vimrcを自動更新
augroup vimrc
    autocmd!
    autocmd BufWritePost $MYVIMRC source $MYVIMRC
augroup END
" tabnewをいつでも簡単に
nnoremap <silent> tn :<C-u>tabnew<CR>
" KaoriyaのCdCurrent的なものを<Space> + cdで
command! -nargs=? -complete=dir -bang CD  call s:ChangeCurrentDir('<args>', '<bang>')
function! s:ChangeCurrentDir(directory, bang)
    if a:directory == ''
        lcd %:p:h
    else
        execute 'lcd' . a:directory
    endif
    if a:bang == ''
        pwd
    endif
endfunction
"Change current directory.
nnoremap <silent> <Space> cd :<C-u>CD<CR>
"行番号の表示/非表示をマッピング
"(クリップボードが使えないときのコピー用)
nnoremap <silent> non :<C-u>set nonumber<CR>
nnoremap <silent> setn :<C-u>set number<CR>
"helpで:help
nnoremap <silent> help :<C-u>help<CR>
"vimdiffにコマンド(Diff)を割り振る
"2ファイルをまとめて指定するときはデフォルトのvimdiff
command! -nargs=1 -complete=file Diff vertical diffsplit <args>

Python

Pythonを快適に編集できるようvimを設定する - 玉虫色に染まれ!
Hashnote - Vimを最強のPython IDEにする
を参考に。

augroup Python_Coding
    au FileType python call s:python_setting()
augroup END

function! s:python_setting()
    "インデント
    setl autoindent
    setl smartindent cinwords=if,elif,else,for,while,try,except,finally,def,cl
    setl expandtab tabstop=4 shiftwidth=4 softtabstop=4
    "PEP 8 長い行をハイライトする
    set textwidth=0
    if exists('&colorcolumn')
        set colorcolumn&
        set colorcolumn=+1
        setl textwidth=80
    endif
    setl textwidth=80
    setl colorcolumn=80
    "インデントでたためるようになる
    setl foldmethod=indent
    setl foldlevel=99
endfunction

Pythonのファイルの時だけ設定を変更したいのでsetl(setlocal)を使う。

PEP 8は80文字以上の行をハイライトする設定。以下を参考に作成。
Vim-users.jp - Hack #217: 横幅が長いコードをハイライトする

使ってないけど便利そうなもの

  • pysmell
    • pythonの補間をサポート。
    • easy-install or pipでpysmellを入れておかないと使えない。
  • pyflakes
    • gVimでないと使えない。

プラグイン

neobundle

プラグイン管理にはneobundleを使う。

filetype plugin indent off

if has('vim_starting')
    set runtimepath+=~/.vim/neobundle
    call neobundle#rc(expand('~/.vim/bundle'))
endif

NeoBundle 'https://github.com/Shougo/neocomplcache.git'
NeoBundle 'https://github.com/Shougo/vimshell.git'
NeoBundle 'https://github.com/Shougo/vimproc.git'
NeoBundle 'https://github.com/Shougo/vimfiler.git'
NeoBundle 'https://github.com/Shougo/unite.vim.git'
NeoBundle 'https://github.com/thinca/vim-quickrun.git'
NeoBundle 'https://github.com/scrooloose/nerdtree.git'
NeoBundle 'https://github.com/mattn/multi-vim.git'
NeoBundle 'https://github.com/mattn/zencoding-vim.git'
NeoBundle 'https://github.com/mattn/zencoding-vim.git'
NeoBundle 'https://github.com/scrooloose/nerdcommenter.git'
NeoBundle 'https://github.com/vim-scripts/YankRing.vim.git'
NeoBundle 'https://github.com/vim-scripts/Pydiction.git'

filetype plugin indent on

neocomplecache/neosnippet

あるVimmerのブログ: neocomplcache Ver.7の新機能とその設計思想について
neocom ver7から併用になった。

NeoBundle 'https://github.com/Shougo/neocomplcache.git'
NeoBundle 'https://github.com/Shougo/neosnippet.git'

入れてみたが、"//"と入力すると長いことフリーズし"ユーザ定義補完 (^U^N^P) パターンは見つかりませんでした"とのメッセージが出て再びそこにカーソルを動かすと(ry

という現象が起こり、解決するにもneocomの中身はよくわからないのでペンディング。きっといつか解決されるだろう。

ver6.1に戻すことに。neocomローカルリポジトリにて。

git revert [ver 6.1のコミットハッシュコード]

READMEにあるものを大体そのまま使ってる。

" Disable AutoComplPop.
let g:acp_enableAtStartup = 0
" Use neocomplcache.
let g:neocomplcache_enable_at_startup = 1
" Use smartcase.
let g:neocomplcache_enable_smart_case = 1
" Use camel case completion.
let g:neocomplcache_enable_camel_case_completion = 1
" Use underbar completion.
let g:neocomplcache_enable_underbar_completion = 1
" Set minimum syntax keyword length.
let g:neocomplcache_min_syntax_length = 3
let g:neocomplcache_lock_buffer_name_pattern = '\*ku\*'

" Define dictionary.
let g:neocomplcache_dictionary_filetype_lists = {
    \ 'default' : '',
    \ 'vimshell' : $HOME.'/.vimshell/command_history',
    \ }

" Define keyword.
if !exists('g:neocomplcache_keyword_patterns')
  let g:neocomplcache_keyword_patterns = {}
endif
let g:neocomplcache_keyword_patterns['default'] = '\h\w*'

" Plugin key-mappings.
imap <C-k>     <Plug>(neocomplcache_snippets_expand)
smap <C-k>     <Plug>(neocomplcache_snippets_expand)
inoremap <expr><C-g>     neocomplcache#undo_completion()
inoremap <expr><C-l>     neocomplcache#complete_common_string()

" SuperTab like snippets behavior.
"imap <expr><TAB> neocomplcache#sources#snippets_complete#expandable() ? "\<Plug>(neocomplcache_snippets_expand)" : pumvisible() ? "\<C-n>" : "\<TAB>"

" Recommended key-mappings.
" <CR>: close popup and save indent.
inoremap <expr><CR>  neocomplcache#smart_close_popup() . "\<CR>"
" <TAB>: completion.
inoremap <expr><TAB>  pumvisible() ? "\<C-n>" : "\<TAB>"
" <C-h>, <BS>: close popup and delete backword char.
inoremap <expr><C-h> neocomplcache#smart_close_popup()."\<C-h>"
inoremap <expr><BS> neocomplcache#smart_close_popup()."\<C-h>"
inoremap <expr><C-y>  neocomplcache#close_popup()
inoremap <expr><C-e>  neocomplcache#cancel_popup()

" AutoComplPop like behavior.
"let g:neocomplcache_enable_auto_select = 1

" Shell like behavior(not recommended).
"set completeopt+=longest
"let g:neocomplcache_enable_auto_select = 1
"let g:neocomplcache_disable_auto_complete = 1
"inoremap <expr><TAB>  pumvisible() ? "\<Down>" : "\<TAB>"
"inoremap <expr><CR>  neocomplcache#smart_close_popup() . "\<CR>"

vimproc

vimfilerの項にあるリンクにコンパイル方法があるのでそこを参考に。
OSごとにmakefileが用意されているので、合っているものを選んでコンパイルして使う。
以下のプラグインはこれがないと動かないもの多数。

vimshell

シームレスな。

nnoremap <silent> vs :<C-u>VimShell<CR>
nnoremap <silent> vp :<C-u>VimShellPop<CR>

quickrun

\r。
これがないとVim使う意味がないくらい活躍している。

unite

Unite vim

"インサートモードで開始しない
let g:unite_enable_start_insert=0
"file_mruの高速化
let g:unite_source_file_mru_filename_format = ''
"キーマッピング
nmap f [unite]
nnoremap <silent> [unite]b :<C-u>Unite buffer<CR>
nnoremap <silent> [unite]f :<C-u>Unite file<CR>
nnoremap <silent> [unite]m :<C-u>Unite file_mru<CR>
nnoremap <silent> [unite]c :<C-u>Unite bookmark<CR>
nnoremap <silent> [unite]a :<C-u>UniteBookmarkAdd<CR>
nnoremap <silent> [unite]r :<C-u>Unite -buffer-name=register register<CR>

augroup MyUnite
    autocmd FileType unite call s:unite_setting()
augroup END

function! s:unite_setting()
    "<ESC>でuniteを終了(消えるのに1秒くらいかかる)
    nmap <buffer> <ESC> <Plug>(unite_exit)
    "分割して開く
    nnoremap <silent> <buffer> <expr> <C-s> unite#do_action('split')
    inoremap <silent> <buffer> <expr> <C-s> unite#do_action('split')
    nnoremap <silent> <buffer> <expr> <C-v> unite#do_action('vsplit')
    inoremap <silent> <buffer> <expr> <C-v> unite#do_action('vsplit')
endfunction

vimfiler

vimfilerとUniteでVimをファイラとして使用する方法 | karakaram-blog
uniteと連携することにより更なるパワーを引き出せるようなので。"fi"でIDE風に開く。q(QUIT) or Q(HIDE)で消える。
操作方法も上記のリンクに。

"vimデフォルトのエクスプローラをvimfilerで置き換える
let g:vimfiler_as_default_explorer = 1
"セーフモードを無効にした状態で起動する
let g:vimfiler_safe_mode_by_default = 0
"現在開いているバッファのディレクトリを開く
nnoremap <silent> fe :<C-u>VimFilerBufferDir -quit<CR>
"現在開いているバッファをIDE風に開く
nnoremap <silent> fi :<C-u>VimFilerBufferDir -split -simple -winwidth=35 -no-quit

"デフォルトのキーマッピングを変更
augroup vimrc
    autocmd FileType vimfiler call s:vimfiler_my_settings()
augroup END
function! s:vimfiler_my_settings()
    nmap <buffer> q <Plug>(vimfiler_exit)
    nmap <buffer> Q <Plug>(vimfiler_hide)
endfunction

nerdtree

Ctrl-eで開いたり、隠したりできるように。下のリンクを参考に。
Hunting Field: [vim] NERDTreeをもっと使いやすくするための設定

" vim実行時に引数なしなら、NERDTreeを実行する
let file_name = expand("%:p")
if has('vim_starting') &&  file_name == ""
    autocmd VimEnter * call ExecuteNERDTree()
endif

" カーソルが外れているときは自動的にnerdtreeを隠す
function! ExecuteNERDTree()
    "b:nerdstatus = 1 : NERDTree 表示中
    "b:nerdstatus = 2 : NERDTree 非表示中

    if !exists('g:nerdstatus')
        execute 'NERDTree ./'
        let g:windowWidth = winwidth(winnr())
        let g:nerdtreebuf = bufnr('')
        let g:nerdstatus = 1

    elseif g:nerdstatus == 1
        execute 'wincmd t'
        execute 'vertical resize' 0
        execute 'wincmd p'
        let g:nerdstatus = 2
    elseif g:nerdstatus == 2
        execute 'wincmd t'
        execute 'vertical resize' g:windowWidth
        let g:nerdstatus = 1

    endif
endfunction
noremap <c-e> :<c-u>:call ExecuteNERDTree()<cr>

使い方はNERDTree起動中に'?'を見れば全部書いてある。下のリンクにも書いてあるっぽい。
英語&英会話学習SNS開発記録 : vimプラグインのNERDTreeを自分好みにカスタマイズ。

multi-vim

Sublime Text2みたいなことができるネタ機能。

何かデモを見るとすごいことになっているように見える。

"Sublime Text2風な動きができるプラグイン
":Multi ^ で全テキストの前に文字を追加
":Multi $ で全テキストの後に文字を追加
":Multi hoge で指定文字hogeをまとめて編集
"2012/11現在非常にバグった動きをする
"・まとめて指定時削除の挙動がおかしい
"・neocomが割り込むと動作がバグる
"・実用性があるのか不明なので一応入れたがスル―
"・範囲指定ができない。。。

zencoding-vim

ZenCoding for Vim 導入方法(初心者さん向け) - sakurako_sの日記
タブインデントの設定だけする。

"タブインデントを使う
let g:user_zen_settings = { 'indentation':'    ' }

作成したmattnさんのページを参考に使い方を。全機能使えるわけではないので。
http://mattn.kaoriya.net/software/vim/20100306021632.htm

チートシートもあるので。
http://code.google.com/p/zen-coding/wiki/CheatSheets;title

実際に使ってみて参考にしたページ
Big Sky :: zen-coding for vim を pure vimscript だけで書いてみた。
Big Sky :: zen-codingの殆どの機能をzencoding.vimに取り込んだ。

NERD_commenter.vim

コメント処理をサポートしてくれる。
scrooloose/nerdcommenter · GitHub <- リポジトリ

使い方↓
VimのヤバすぎコメントプラグインNERD_comments.vim - ボクノス

独自のキーマッピングを使いたい。
http://nishikawasasaki.hatenablog.com/entry/20101226/1293374432

"デフォルトのキーバインドを無効に
let g:NERDCreateDefaultMappings = 0
"コメントアウトはCtrl+Cで
nmap <C-c> <Plug>NERDCommenterToggle
vmap <C-c> <Plug>NERDCommenterToggle

他にもいろいろできそうなのでDocumentを読んでみよう。

smooth_scroll.vim(リポジトリがないので拾ってくる)

これでプレゼンもバッチリ。

"<C-d>:半画面下にスクロール
"<C-u>:半画面上にスクロール
"<C-f>:全画面下にスクロール
"<C-b>:全画面上にスクロール

Vimで超スムーズスクロール - ナレッジエース
Vimでスムーズスクロール - ボクノス

pydiction

vim-scripts/Pydiction · GitHub <- github
http://www.vim.org/scripts/script.php?script_id=850 <- vim.org
とりあえず、デフォルトの辞書をneocomに登録。

" Define dictionary.
let g:neocomplcache_dictionary_filetype_lists = {
    \ 'default' : '',
    \ 'python' : $HOME.'/.vim/Pydiction/complete_dict',
    \ 'vimshell' : $HOME.'/.vimshell/command_history',
    \ }

Pydiction.pyというモジュールが入っていて、これからほしいライブラリの辞書を増やしていける。

Djangoには読み込めないモジュールがあるらしいので注意。詳細は下記のリンク。

Pythonの開発環境をvimに整える - やさしいデスマーチ

リポジトリ

Bitbuket - hg
Log in — Bitbucket

最近の情報はリポジトリへ。

gvim

使わないはずだが、gvimもvimperatorのエディタとして使ったりしたいので。簡単に。

" encording
set enc=utf-8
set fenc=utf-8
set fencs=iso-2022,utf-8,euc-jp,cp932
" Font
set guifont=ゆたぽん(コーディング):h16
" カラースキーマ
colorscheme desert
" ツールバーとかいらんな
set guioptions-=T
" About guioptions
" T : ツールバー表示
" m : メニュー表示
" ウィンドウの幅(フルスクリーンで)
set columns=9999
set lines=9999
winpos 0 0 
" フルスクリーンショートカットキー
nnoremap <silent> <C-f> :set fu<CR>
nnoremap <silent> <C-c> :set nofu<CR>

Tips

はてな記法はvimscriptまでハイライトできるとは

nnnoremap hoge hoge

.vimrcリロードには注意

Vim-users.jp - Hack #74: 簡単にvimrcを編集する
autocmd, += はリロード時に何度も追加されてしまうので以下のように記述する。

augroup MyAutoCmd
    autocmd!
augroup END
・・・・
autocmd MyAutoCmd FileType * set textwidth=0
autocmd MyAutoCmd FileType * set formatoptions-=ro
  1. =は以下のように。
set hoge_option&
set hoge_option+=piyo

function

function! s:hoge()
    "中身
endfunction

!はリロード可能な関数を表し、s:はローカル関数ということを表す。
Vim エディターのスクリプトの作成: 第 2 回 ユーザー定義関数

command

command! or mapを考えたところ':'を押さなくもいいmapをたくさん採用しているがcommandがイマイチわかってなかったのもある。
vimdiffが優秀なのでコマンドを割り当てる。

command! -nargs=1 -complete=file Diff vertical diffsplit <args>

commandの設定については以下を参考に。
Vim-users.jp - Hack #158: ユーザコマンドを定義する
Vimスクリプトの初心者がコマンドを定義してみた - 零客痩地

Color

Cygwinのデフォルトの背景では青文字は非常に見づらいので色を変更する。
(被害はコメント、NERDTree、SpecialKey)

Vimの色の設定は

:highlight

で見ることが可能。もっと見やすいのが良ければ

:source $VIMRUNTIME/syntax/hitest.vim

青になっているすべての設定を変更する。(darkredも変えた)

hi Comment ctermfg=cyan
hi Directory ctermfg=cyan
hi SpecialKey ctermfg=cyan
hi Constant ctermfg=red
hi WarningMsg ctermfg=red

vim/gvimの色設定について - fudist
vimカラーの微調整時のまとめ。 - connvoi_tyouの日記

すべての色が使えるわけではない

VimLで色指定する数値の一覧 | Inhale n' Exhale
上を参考にperlスクリプトを動かしてみて使える色をチェックしたが、一部しか使えない。

Vim上で使える色は

:so $VIMRUNTIME/syntax/colortest.vim

で確認することが可能。

とりあえずかぶってないcyanを使った(Identifierにdarkcyanが使われているが)

色が気になってきたのでvimrcに以下を追加する。

"色の確認用コマンド
command! HighLightList so $VIMRUNTIME/syntax/hitest.vim
command! ColorList so $VIMRUNTIME/syntax/colortest.vim

Folding

畳む。
vim-折り畳み操作

visual modeで選択し
zf
一段階であれば、畳み込んでいるところで
zc(close)
zo(open)

autoread

ファイルを切り替えたらautoloadが走るようにする。
Vim-users.jp - Hack #206: 外部で変更のあったファイルを自動的に読み直す

<>

vsplitの時、幅を変えられるようにした。

vimでvsplit(縦分割)の幅変更 - 綾小路龍之介の素人思考

Encoding

viで日本語の文字コードを自動判別 - 玉虫色に染まれ!
setlにすれば大丈夫?

setl encoding=utf-8
setl fileencodings=ucs-bom,iso-2022-jp-3,iso-2022-jp,eucjp-ms,euc-jisx0213,euc-jp,sjis,cp932,utf-8

zsh

リポジトリにはzshellの設定ファイルもあるので。
あまり深くzshの設定については知らないのでどこかにあった設定をそのまま使っている。

PATHはちゃんと設定しましょう($PATHがなかったorz)
http://d.hatena.ne.jp/tsaka/20060819/1162739565;title

Macはchshでログインシェルの変更ができる。
chsh -s /usr/bin/zsh
みたいな。
UNIXコマンド [chsh]
bash から zsh に乗り換えた【その仕事、蠍は留守です】

Redmine - No Ticket! No Commit!

Redmineによるタスクマネジメント実践技法」を軽く読んだ。
気になった項目を書いておく。

Amazon.co.jp: Redmineによるタスクマネジメント実践技法: 小川 明彦, 阪井 誠: 本
2010/10/13発売。

プロローグ

TiDD(チケット駆動開発)

  • チケットは作業指示書である。仕様書はバージョン管理する。
  • PLがチケットを常時保守する。
  • コミットログにチケットNoを書く。
  • チケットはバージョンでグループ化し、順次リリースしていく。

TiDD

No ticket, no commit

独りスクラムとTiDD

スクラム (ソフトウェア開発) - Wikipedia

実施しなければならないチケット達 - プロダクトバックログ
それぞれのチケット(マイルストーン付き) - スプリントバックログ

チームで実施すべきチケットは、作業する個人にとってはプロダクトバックログで
個人に割り当てられた作業は優先順位や作業順序を決めスプリントバックログが決定する。

TiDDでは、こなさなければならないバックログ(チケット)を日々一覧で確認し順に実施していく
大切なのは、優先付された作業の一覧があり、順に実施するという作業を繰り返していること。
もし、新しいチケットを割り当てられてコミットするならば、優先順位に従って実施できるチケットを再度決める。

チケットの粒度

1~5人日程度。(成果物の単位で作る。WBSから作る。)

ストーリーカード・タスクカード

チケットの親子関係で作る。
version 1.0以降からチケットの親子関係がサポートされている。(この本ではversion 0.8.7)

Redmineにおけるバージョンの概念

XP:イテレーション - 2週間くらい
Scrum: 4週間くらい

バージョンを作る

イテレーション開始

順序を決めつつ、チケットを順次作業

バージョンをリリース

XPについて日本語でサクッと知りたいならここ↓
- eXtreme Programmingの魅力を探る

開発サイクル

ロードマップ作成

バージョン作成(リリース計画・イテレーション計画)

チケット登録

チケット解決(TDD,リファクタリング)

リリース(継続的インテグレーション)

振り返り(KPT)

Redmineのプロジェクト規模

2つの視点から考える。意外と少なめな感じ。

タスク管理の観点から

メンバー5人が限界。(チケットが増えすぎてしまう。そのうち放置なんかも。)
もっと大人数でRedmineする場合はプロジェクトを分割する。

ブランチのサイクルから

プロジェクトにも親子関係を適用できるので、メジャーバージョンで本番リリースしたものはブランチとして子プロジェクトにするといい。

スクラム

2001年 Agile Software Development with Scrumで文章化された。
Sprintという単位で開発を進める。Sprintは短くて1週間長くて4週間程度。
詳細はEn.Wikipediaのほうがよさそう。
Scrum (development) - Wikipedia, the free encyclopedia

知らなかったワード

  • KTP
    • Keep/Problem/Tryのこと(良かったので続けること/悪かったのでやめること/試したいこと)

Tkinter

What's Tkinter?

TkinterモジュールはTcl/TkのTkインターフェース。
Python標準のライブラリ。
Python3.0以降ではtkinterに名前が変わっている。

日本語訳のドキュメント
24.1. Tkinter — Tcl/Tk への Python インタフェース — Python 2.6ja2 documentation
原文?
Tkinter 8.4 reference: a GUI for Python

GUIをさくっと作れて魅力的。
が、minor traditionって言われてる。

List of Python GUI Programming

Python GUIに関しては本家にリストがある。
GuiProgramming - PythonInfo Wiki

Try to Make

カレンダー作ってたので、Tkinter Calendar Widget
参考にしてなんか便利なアプリを作ろう。

ソースコードはBitbucketへ
Oops, you've found a dead link — Bitbucket
スペルが違うが気にしない。

Tkinter Functions

今回習ったこと。

ベースになるフレームクラス

Tk.Frameを継承したクラスを作ればいい。
Tkinter 入門: 11. Canvas を使って納涼しよう

Widget作成

配置方法(pack, grid, place)については以下のリンク。
Tkinter 入門: 2. Widget を配置しよう

grid配置の使い方(電卓の例)

Layout management in Tkinter

Django入門

Djangoチュートリアル(前編) (1/6):CodeZine
を参考にDjango入門してみる。SEMSに会員登録(無料)しないと全部見れない。


Django ドキュメント — Django v1.0 documentationが本家(訳版)

Everything you need to know about Django (and then some).

困ったときはここ。

Djangoについて

Django - Wikipedia

に重点を置いており、複雑であったり、データベース主体のWebアプリケーションの構築を簡単にするために作成された。

The Web framework for pefectionists with deadlines

ということである。
2012/9時点での最新版は1.4。

MTV

DjangoではMVC(Model View Controller)のControllerをView、ViewをTemplateと呼んでいます。
Model Template ViewでMTV。
Djangoでは

  • どう見せるか→Template
  • どのデータを見せるか→View

という意味で使っています。

Model

Djangoで用意されているO/Rマッパーを担当します。
データベースへのインターフェース。

Template

デザインとコンテンツ、Pythonコードの分離エンジン。

View

HTTPリクエストを引数にとり、HTTPレスポンスを返す。
どのデータを提示するかを決定するロジックを担当。

Controller

⇔URLディスパッチ機構
URLのパスとそれに割り当てられ呼び出されるViewのメソッドのマッピングを記述する。
正規表現が活用されているので、フレームワークの仕様に縛られないURL設計が可能。

Djangoにできる他のこと

キャッシュシステム

memcachedなどのキャッシュシステムと容易に連携が取れる。

国際化

多言語対応。

管理インターフェース

CRUD(Create Read Update Delete)画面が提供されている。
管理用バックエンド画面のテンプレートがすでにあるということ。

Djangoのインストール

Download | Django
上記リンクからせっかくなので最新版をダウンロードし、ローカルの適当なところに配置。

tar xzvf Django-1.4.1.tar.gz
cd Django-1.4.1
sudo python setup.py install

確認は以下のように行う。

Python 2.6.8 (unknown, Jun  9 2012, 11:30:32)
[GCC 4.5.3] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>> django.VERSION
(1, 4, 1, 'final', 0)

自分の環境はCygwin

何を作るのか

参考しているサイトにただただしたがって行くと、ECサイト(electronic commerce site)を作るようなので。
ECサイト - Wikipedia

Project作成

プロジェクトを作成するフォルダ(自分は~/works)で

django-admin.py startproject ecsite

とすると必要なファイルが生成される。

manage.py 管理コマンド用ユーティリティー
ecsite/__init__.py 空ファイル、Pythonパッケージ通知用
ecsite/setting.py 基本的なこと(DB接続定義、言語/タイムゾーン定義)の設定ファイル
ecsite/urls.py URL設計。正規表現使える。
ecsite/wsgi.py サーバとアプリケーション間のインターフェース

wsgi

Web Server Gateway Interface(通称:ウイスキー)
Pythonに多数のフレームワークがあるがゆえに生じた、サーバ選択の差異を埋めるために導入されたサーバ⇔アプリケーションのインターフェース。
これによりサーバ可搬性のあるアプリケーションの開発が可能になった。
Django、GAEなどで使われている。
PEP 333 -- Python Web Server Gateway Interface v1.0にて正式に発表。
日本語での詳細はWSGIことはじめ | スマートフォン要点だけブログ
話がDjangoからそれてしまうので理解&勉強する際は下記のリンクから。
WSGIとPythonでスマートなWebアプリケーション開発を|gihyo.jp … 技術評論社

サーバの起動

manage.py runserver

とすると、zsh: command not found: manage.py

python manage.py runserver

にすると、

Validating models...

0 errors found
Django version 1.4.1, using settings 'ecsite.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

起動成功。
ポート番号を変えたい場合は簡単に変えられる。

python manage.py runserver 8080

setting.pyの編集

Django1.4はsetting.pyのDB設定周りが若干異なるので以下を参考にする。
ちなみにDBはSQLite3を使う。
Django 1.4 で新しくプロジェクトを作成した際にしておくsettings.pyの設定 - kk6のメモ帳*
google:Django1.4 チュートリアル

DATABASES = {
     'default': {
         'ENGINE': 'django.db.backends.sqlite3', 
         'NAME': os.path.dirname(__file__) + os.sep + 'ecsite.sqlite',          
         'USER': '',                      
         'PASSWORD': '',                  
         'HOST': '',                      
         'PORT': '',                      
    }
}
TIME_ZONE = 'Asia/Tokyo'
LANGUAGE_CODE = 'ja'

DBはENGINEとNAMEを編集する。他はSQLiteの場合何も書かなくていい。
TIME_ZOMEとLANGUAGE_CODEは上記のように編集。

DBの同期

% python manage.py syncdb
Creating tables ...
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_user_permissions
Creating table auth_user_groups
Creating table auth_user
Creating table django_content_type
Creating table django_session
Creating table django_site

You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username : 
E-mail address:
Password:
Password (again):
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)

途中Usernameなどは適宜入力。この時の情報は管理画面にログインするときに聞かれるので忘れずに。
これでDBが初期化される。
Cygwinには多分SQLiteは入っていると思うが一応チェック。

% sqlite3
SQLite version 3.7.12.1 2012-05-22 02:45:53
Enter ".help" for instructions
Enter SQL statements terminated with a ";"

manage.pyのあるフォルダで

sqlite3 ecsite.sqlite

or

python manage.py dbshell

でSQLite3を立ち上げることができる。ダンプ(.dump)して確認終了。

Application作成

商品表示用のページを作成する。

python manage.py startapp itempage

itempageフォルダが作成され、
中身には
__init__.py, models.py tests.py views.py
が含まれる。
Djangoに追加を認識させるために、setting.pyのINCLUDE_APPSにecsite.itempageを追加する。

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'ecsite.itempage',
    # Uncomment the next line to enable the admin:
    # 'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
)

About Model

モデルはDBの1テーブルに対応し、フィールドは各カラムに対応します。
コードは以下の通り。

# -*- coding: utf-8 -*-
from django.db import models

# Create your models here.
class Item(models.Model):
    item_code = models.CharField(u'商品コード',max_length=256,unique=True)
    item_name = models.CharField(u'商品名',max_length=256)
    price = models.PositiveIntegerField(u'価格')
    start_date = models.DateField(u'掲載開始日',null=True);

    def __unicode__(self):
        return self.item_code

    class Meta:
        db_table = 'item'

django.db.models.Modelを継承して作られる。

  • フィールド(属性)
item_code 商品コード
item_name 商品名
price 価格
start_date 掲載開始日

書くフィールドは書いてあるようにインスタンス生成時に初期化される。
Metaインナークラスは、このモデルに対するテーブル名を指定している。
このインナークラスを書かない場合、テーブル名は"itempage_item"となりアプリケーション名の入ったものになってしまうので、明示的にテーブル名をつけることにする。

DBとの同期

% python manage.py syncdb # 同期
Creating tables ...
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)
% python manage.py dbshell
(ry
sqlite>.dump # 確認
(ry

モデルの操作

DBとの同期が終わったら、モデルを操作できるようになります。

% python manage.py shell

とするとインタプリタが出てくるのでデータを作成。

>>> from itempage.models import Item
>>> item = Item()
>>> item.item_name = 'item1'
>>> item.price = 1000
>>> item.save()

データの確認

% python manage.py dbshell
SQLite version 3.7.12.1 2012-05-22 02:45:53
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select * from item;
1||item1|1000|

ModelをHTMLに表示

URLディスパッチャ、テンプレート、Viewの関係図
http://codezine.jp/static/images/article/4065/fig04.gif

テンプレートの作成

setting.py

setting.py内のTEMPLATE_LOADERSにテンプレートを配置するルートフォルダを追加する。
自分の場合、~/works/ecsite/templates
追加するときはカンマ(,)を忘れずに。

templatesフォルダ

簡単な商品表示画面。item.htmlを以下のように作成。

<html>
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
   <title>{{ item.item_name }}</title>
<head>
<body>
<center>
商品コード:{{ item.item_code }}<br>
商品名:{{ item.item_name }}<br>
価格:{{ item.price }}円<br>
<br>
<input type="submit" value="買い物かごに入れる">
</center>
</body>
</html>

{{}}の部分は、Viewメソッドによりテンプレートが動的に変換される部分になっている。
ここでは、商品コード、商品名、値段。

URLディスパッチャの設定(urls.py)

urls.pyを編集する。

urlpatterns = patterns('',
    (r'^item/(?P<item_id>\d+)/$', 'ecsite.itempage.views.item_page_display'),
)

第一引数に正規表現パス、第二引数にViewメソッド。
r'^item/(?P\d+)/$' → item/数字/行末コード
数字の部分の(?P\d+)は、マッチした部分のをitem_idという引数でメソッドに渡すということを表します。

View Method

urls.pyにあったitem_page_displayを定義する。

from django.http import HttpResponse
from django.template import Context, loader
from models import Item

def item_page_display(request,item_id):
    # item_idに該当するオブジェクトを取得する
    item = Item.objects.get(id=item_id)
    # テンプレートを取得して、モデルの値とマージする
    t = loader.get_template('page/item.html')
    c = Context(
        {'item':item }
    )
    # HTTP Responseを返す。
    return HttpResponse(t.render(c))

実行

python manage.py runserver

として確認。