zshの設定をしてみた
時間があったので.zshrcをゴリゴリ書いてみた。
もうちょい拡張していく予定だけどとりあえずこれでもそこそこ使える。
### 環境設定 export CC=gcc-4.2 export LANG=ja_JP.UTF-8 # Emacs style key binding bindkey -e ### プロンプト設定 # color autoload colors colors # PCRE 互換の正規表現を使う setopt re_match_pcre # プロンプトが表示されるたびにプロンプト文字列を評価、置換する # 色の指定を%{$fg[red]%}みたいに人に優しい指定の仕方が出来、コピペもしやすい。リセットするときは%{$reset_color%} setopt prompt_subst # rootとその他で分けておく case ${UID} in 0) PROMPT="%B%F{red}[%n@ %~] # %f%b" PROMPT2="%B%{${fg[red]} >> %b" SPROMPT="%B%{${fg[white]}%}Did you mean %{${fg[red]}%}%r%{${reset_color}%} ? [n,y,a,e]:%{${reset_color}%}%b " RPROMPT="%{$fg_bold[white]%}[%{$reset_color%}%{$fg[cyan]%}%~%{$reset_color%}%{$fg_bold[white]%}]%{$reset_color%}" ;; *) PROMPT="%B%F{green}[%n@] # %f%b" PROMPT2="%B%{${fg[yellow]} >> %b" SPROMPT="%B%{${fg[white]}%}Did you mean %{${fg[red]}%}%r%{${reset_color}%} ? [n,y,a,e]:%{${reset_color}%}%b " RPROMPT="%{$fg_bold[white]%}[%{$reset_color%}%{$fg[yellow]%}%~%{$reset_color%}%{$fg_bold[white]%}]%{$reset_color%}" ;; esac ### 補完 autoload -U compinit compinit # 補完の時に大文字小文字を区別しない zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' #### ヒストリの設定 HISTFILE=~/.zsh_history HISTSIZE=10000 SAVEHIST=10000 # 履歴ファイルに時刻を記録 setopt extended_history # 履歴をインクリメンタルに追加 setopt inc_append_history # スペースで始まるコマンド行はヒストリリストから削除 setopt hist_verify ### option # 先頭がスペースならヒストリーに追加しない setopt hist_ignore_space # 日本語ファイル名を表示可能にする setopt print_eight_bit # C-s, C-qを無効にする setopt no_flow_control # rm * を実行する前に確認する setopt rmstar_wait # 打ち間違い訂正 setopt correct_all #### set alias alias coteditor="open $1 -g -a CotEditor" # sublime text 2の設定 alias subl=" /Applications/Sublime\ Text\ 2.app/Contents/SharedSupport/bin/subl" alias la="ls -lhAF" # フォルダ、ファイルに色をつける case "${OSTYPE}" in freebsd*|darwin*) alias ls='ls -FGh' ;; linux*) alias ls='ls --color=auto' ;; esac # rbenvの設定 eval "$(rbenv init -)" ### 関数 # 解凍設定 function extract () { if [ -f $1 ] ; then case $1 in *.tar.bz2) tar xvjf $1 ;; *.tar.gz) tar xvzf $1 ;; *.tar.xz) tar xvJf $1 ;; *.bz2) bunzip2 $1 ;; *.rar) unrar x $1 ;; *.gz) gunzip $1 ;; *.tar) tar xvf $1 ;; *.tbz2) tar xvjf $1 ;; *.tgz) tar xvzf $1 ;; *.zip) unzip $1 ;; *.Z) uncompress $1 ;; *.7z) 7z x $1 ;; *.lzma) lzma -dv $1 ;; *.xz) xz -dv $1 ;; *) echo "don't know how to extract '$1'..." ;; esac else echo "'$1' is not a valid file!" fi } alias ex='extract' # cdした時に行うアクション function chpwd() {ls}
こんな感じ
3D convex hull
3次元凸包アルゴリズムを組んでみました。
こちらを参考に実装してみました。
一応メモ
ちなみにRubyなのでかなり遅いです。
ぶっちゃけ計算向きではないです。
入力は3次元の座標。
出力は凸包を形成する3点になります。
convexhull.rb
require './point3D' require './face' ## incremental convexhull # 3D convex hull # param: points the Point3D coord # return: a series of indices to create the faces of the hull def convexhull(points) if points.length < 3 then return nil end face = Face.new(points) face.vertices(0,1,2) # 最初に4面体を作り、計算をする。 # 頂点が4つ未満の場合、nullを返す v = centroid(points, 3, face) if face.isVisible(v) then face.flip end face0 = Face.new(points) face0.vertices(3, face.i0, face.i1) if face0.isVisible(v) then face0.flip end face1 = Face.new(points) face1.vertices(3, face.i1, face.i2) if face1.isVisible(v) then face1.flip end face2 = Face.new(points) face2.vertices(3, face.i2, face.i0) if face2.isVisible(v) then face2.flip end # 4面体を形成する valid_faces = [face,face0,face1,face2] visible_faces = [] tmp_faces = [] result = Hash::new # すべての頂点に処理を掛ける。最初の4つの点は省く (4..points.length-1).each{ |i| v = points[i] visible_faces = [] valid_faces.each{ |face| if face.isVisible(v) then visible_faces << face end } # 4面体の頂点の中にあるため、次の点で比較 if visible_faces.length == 0 then next end # 頂点が凸砲の外側にある場合、リストから表示されているすべての面を削除 visible_faces.each{ |face| delete_id = valid_faces.index(face) valid_faces.delete_at(delete_id) } # 片面だけの場合、3面で構成しても大丈夫なので3面で構成 if visible_faces.length == 1 then face = visible_faces[0] input_face = Face.new(points) input_face.vertices(i, face.i0, face.i1) valid_faces << input_face input_face = Face.new(points) input_face.vertices(i, face.i1, face.i2) valid_faces << input_face input_face = Face.new(points) input_face.vertices(i, face.i2, face.i0) valid_faces << input_face next end # すべての頂点が既存のものより外側にあった場合、すべての面から新しく作る tmp_faces = [] count = 0 # 新しいvisible_facesを作成する visible_faces.each{ |face| input_face = Face.new(points) input_face.vertices(i, face.i0, face.i1) tmp_faces << input_face input_face = Face.new(points) input_face.vertices(i, face.i1, face.i2) tmp_faces << input_face input_face = Face.new(points) input_face.vertices(i, face.i2, face.i0) tmp_faces << input_face count = count + 1 } tmp_faces.each{ |face| flag = true # 面の前に点がないかを検索する tmp_faces.each{ |other| if flag then if face != other then if face.isVisible(other.centroid) then face = nil break flag = false end end end } # 面の前に点が無い場合格納する if !face.nil? then valid_faces << face end } } h_count = 0 valid_faces.each{ |face| input_array = [face.i0, face.i1, face.i2] result[h_count] = input_array h_count = h_count + 1 } # 3D covex hullの結果を返す return result end def centroid(points, index, face) p = points[index] p0 = points[face.i0] p1 = points[face.i1] p2 = points[face.i2] return Point3D.new( (p.x + p0.x + p1.x + p2.x) / 4, (p.y + p0.y + p1.y + p2.y) / 4, (p.z + p0.z + p1.z + p2.z) / 4) end point = [] open("./input/test.txt",'r'){|strs| while line = strs.gets str = line.split(" ") coord = Point3D.new(str[0].to_f,str[1].to_f, str[2].to_f) point << coord end } puts point.size hull = convexhull(point) points = [] (0..10).each{|i| points << point[i] } p hull
point3D.rb
class Point3D def initialize(x,y,z) @x = x @y = y @z = z end # return Point3D def distance(p) dx = @x - p.x dy = @y - p.y dz = @z - p.z return Math::sqrt(dx ** 2 + dy ** 2 + dz ** 2) end # 外積 # return Point3D def cross(p) a = @y * p.z - @z * p.y b = @z * p.x - @x * p.z c = @x * p.y - @y * p.x return Point3D.new(a,b,c) end # 内積 # a*b = axbx + ayby + azbz # return Double def dot(p) return @x * p.x + @y * p.y + @z * p.z end # ベクトルの大きさ # return Double def vectorLength return Math::sqrt(@x ** 2 + @y ** 2 + @z ** 2) end # 正規化 : 単位ベクトルに正規化する # return Point3D def norm point = Point3D.new(@x,@y,@z) len = 1.0 / point.vectorLength @x = @x / len @y = @y / len @z = @z / len end def subtract(p) a = @x - p.x b = @y - p.y c = @z - p.z return Point3D.new(a,b,c) end # 右手法か判断 # 正規化した後、計算する # z軸を中心にする。 # z軸が正の時→x,yが正ならば1 # z軸が負の時→x,yが負ならば1 を返す def systemComparison r_value = 0 # if @x * @y == @z or # @y * @z == @x or # @z * @x == @y then r_value = 1 end if @z > 0 and @x > 0 and @y > 0 then return 0 end if @z < 0 and @x < 0 and @y < 0 then return 0 end # puts "#{@x} #{@y} #{@z} " return r_value end attr_reader :x, :y, :z end
face.rb
require './point3d' class Face def initialize(point) @points = point end def vertices(i0, i1, i2) @i0 = i0 @i1 = i1 @i2 = i2 computePanel end def computePanel p1 = @points[@i0] p2 = @points[@i1] p3 = @points[@i2] @a = p1.y * (p2.z - p3.z) + p2.y * (p3.z - p1.z) + p3.y * (p1.z - p2.z) @b = p1.z * (p2.x - p3.x) + p2.z * (p3.x - p1.x) + p3.z * (p1.x - p2.x) @c = p1.x * (p2.y - p3.y) + p2.x * (p3.y - p1.y) + p3.x * (p1.y - p2.y) @d = -(p1.x * (p2.y * p3.z - p3.y * p2.z) + p2.x * (p3.y * p1.z - p1.y * p3.z) + p3.x * (p1.y * p2.z - p2.y * p1.z)) end def isVisible(point) return (@a * point.x + @b * point.y + @c * point.z + @d) > 0 end def outputtest(point) puts "a::#{@a} b::#{@b} c::#{@c} d::#{@d}" puts "x::#{point.x} y::#{point.y} z::#{point.z}" return @a * point.x + @b * point.y + @c * point.z + @d end def centroid p0 = @points[@i0] p1 = @points[@i1] p2 = @points[@i2] return Point3D.new( (p0.x + p1.x + p2.x)/3.0, (p0.y + p1.y + p2.y)/3.0, (p0.z + p1.z + p2.z)/3.0) end def flip t = @i0 @i0 = @i1 @i1 = t computePanel end attr_reader :points, :i0, :i1, :i2 end
rbenv コマンドメモ
rbenvで使うコマンドのメモ。
rubyのインストール
以下のコマンドでインストールできるバージョン一覧を表示します。
$ rbenv install
rubyをインストールする。インストールしたらrehashして反映させる。
$ rbenv install 1.9.3-p194 $ rbenv rehash
rubyのバージョンの変更
以下がバージョンを変更するコマンド
$ rbenv global 1.9.3-p194
インストールしてあるrubyのバージョン一覧表示
$ rbenv versions
とりあえずこんな感じ。
rbenv + ruby_build の設定
rubyのパッケージ管理をrvmではなくrbenv + ruby_build で設定することにしてみた。
rvmのアンインストール
$ rvm implode
rvmが入ってたのでアンインストールしちゃいました。
rbenvとruby_buildのインストール
$ brew update $ brew install rbenv $ brew install ruby_build
Homebrewを使えば簡単にインストールできます。
インストールしたら、.zshrcに
eval "(rbenv init -)"
を追加する。
sourceコマンドで再読み込みします。
$ source .zshrc
rubyのインストール
$ rbenv install
を実行するとインストールできるruby一覧が出てくるので選択します。
今回は ruby 1.9.2-p320を選択します。
$ rbenv install 1.9.2-p320 ERROR: This package must be compiled with GCC, and we couldn't find a suitable `gcc' binary on your system. Please install GCC and try again. As of version 4.2, Xcode is LLVM-only and no longer includes GCC. You can install GCC with these binary packages on Mac OS X:
インストールしたらこんなエラーが出てきました。
Xcode 4.2 をインストールするとrubyがインストールできなくなるみたいです。
原因はgccではなくllvm gccを使っているからみたいです。
というわけでgccをインストール
kennethreitz/osx-gcc-installer · GitHub
ここにアクセスして囲ってある場所をクリックし、パッケージをダウンロードします。
これでgccをダウンロード、インストールすればok。
export CC=gcc-4.2
を.zshrcに書き込んでおく。
もう一度さっきのインストールを試すとインストールが成功した。
$ rbenv install 1.9.2-p320
あとはこいつを使うように設定する
$ rbenv grobal 1.9.2-p320 $ ruby -v ruby 1.9.2p320 (2012-04-20 revision 35421) [x86_64-darwin11.4.0]
これで設定は終了です。
teminalが動かなくなってしまいました
Homebrewを使ってzshをインストールして使っていたのですが、
ある日terminalを起動したらこんなメッセージが
dyld: Library not loaded: /usr/local/lib/libgdbm.4.dylib Referenced from: /usr/local/bin/zsh Reason: image not found [プロセスが完了しました]
teminalが起動しないとかどうすればいいんですか・・・
とりあえずlibgdbmを探してダウンロードしてみて様子を見て見ることに。
その前にterminalが起動しないとどうしようもないので、
ターミナル→環境設定→起動→開くシェル→コマンド(完全パス)
を
/bin/bash
に変更して再起動します。
これでterminalが起動するようになりました。
不足しているライブラリを追加するのにwgetが必要なので、homebrewを使ってインストール。
$ brew install wget
GDBMをダウンロードしてmakeします。
GDBM パッケージは GNU DBM ライブラリがあるそうです。
とりあえずダウンロードして解凍
$ wget ftp://ftp.gnu.org/pub/gnu/gdbm/gdbm-1.9.1.tar.gz $ tar zxfv gdbm-1.9.1.tar.gz
あとはmakeしてインストールするだけ
$ cd gdbm-1.9.1 $ ./configure --prefix=/usr/local $ make $ make install
これでlibgdbm.4.dylibが追加され、zshも無事起動するようになりました。
ということでとりあえずメモとしておいておきます。
macを買ってとりあえず入れたもの
お久しぶりです梅草です。
MacBook Airを買ったてからいろいろ入れてみたのでメモします。
初めてMacを使うのでいろいろテンパってますが・・・
とりあえずアプリケーションをインストールしました。
アプリケーション名 | 説明 |
---|---|
夜フクロウ | Twitterクライアント |
total terminal | terminalをショートカットキーで起動 |
google chrome | ブラウザ |
google IME | 日本語入力 |
Evernote | オンラインメモ |
Dropbox | オンラインストレージ |
VLC | 動画再生 |
ClamXav | アンチウイルス |
Xcode4.3.3 | 総合開発環境(IDE) |
Skitch | 画像のキャプチャ、編集 |
OnyX | メンテナンス |
Skype | 通話等 |
adobe reader | |
app cleaner | アンインストール |
The Unarchiver | zip解答 |
こんなところ入れてみました。
あとはターミナルの設定などいろいろやって行きたいです。
mysqldumpでバックアップ作成&復元
mysqlのバックアップをテキスト形式で簡単に取れる方法があるのでそれのメモ。
$ mysqldump -u root -x --all-databases > ファイル名.sql
このコマンドによって、簡単に全てのデータベースのバックアップが取れます。
復元方法は
$ mysqldump -u root -p < ファイル名.sql
これでおk。
データベースごとにバックアップを取る場合は、
$ mysqldump -u root -p データベース名 > ファイル名.sql
復元は
$mysqldump -u root -p データベース名 < ファイル名.sql
これで大丈夫だそうですね。