レタスのかわをぜんぶむく

ぜんぶむきます

grepでやらかした話

既存のプログラムのチェックだったり、ログの確認で効果を発揮するgrep
CUIベースでの操作をし始めた人がやりそうな、というか僕がやったミスを紹介。

1. 操作対象のファイルがあるディレクトリに入る。
2. grep -r なコマンドで特定文字列を調べてみる。
3. 多いので一旦一時ファイルに吐き出して確認しようとする。
4. grep -r を実行しているディレクトリ内でログを出力する。
5. 結果が帰ってこない。あなたのディスクは死ぬ。

コマンドにすると以下。

$ cd ./Project
$ grep -r hogefunction . > ./greplog.txt
$ ... (なんか頑張ってて結果が帰ってこない

要は自分で更新している、見つけたリストを自分で再発見して
あった!みて!ここにもあったよ!ねぇ!ママ!
と繰り返してる状態。

アホか。

さっき流した時は全然瞬殺だったのになんでだろーと思って
一旦止めたて確認したら、それまでほのぼのしていたdfコマンドの結果が
ディスク使用率95%超えで殺伐とした感じに!!!

とりあえずは下記にして回避。
多分もっと一般的なやり方あるはず。
定石教えてプロい人!

$ cd ./Project
$ grep -r hogefunction . > ../greplog.txt

クレバーな読者諸兄はハハッワロスwとなってるはず…
でもこれローカルでやって良かったホント。

うん、本番だったら死んでた。

Cool liver. (きもがひえた

.vimrc晒す

そういえば

MacVimのインストールとかもろもろしておきながら
全然設定晒していなかったので、公開。

githubとかにあげれば良いんだろうけど、
ちょっと思いついてることあるので一旦そのまま。

入れてるもの

・NeoBundles
・NERDTree
・minibufexpl

前職での師匠の教え+NeoBundles+他という感じ。
師匠元気ですか、僕は元気でやってます。

.vimrc

"NeoBundle Scripts-----------------------------
if has('vim_starting')
  if &compatible
    set nocompatible               " Be iMproved
  endif

  " Required:
  set runtimepath+=/Users/<username>/.vim/bundle/neobundle.vim/
endif

" Required:
call neobundle#begin(expand('/Users/<username>/.vim/bundle'))

" Let NeoBundle manage NeoBundle
" Required:
NeoBundleFetch 'Shougo/neobundle.vim'

" Add or remove your Bundles here:
NeoBundle 'Shougo/neosnippet.vim'
NeoBundle 'Shougo/neosnippet-snippets'
NeoBundle 'tpope/vim-fugitive'
NeoBundle 'ctrlpvim/ctrlp.vim'
NeoBundle 'flazz/vim-colorschemes'
NeoBundle 'fholgado/minibufexpl.vim'
NeoBundle 'scrooloose/nerdtree'

" You can specify revision/branch/tag.
NeoBundle 'Shougo/vimshell', { 'rev' : '3787e5' }

" Required:
call neobundle#end()

" Required:
filetype plugin indent on

" If there are uninstalled bundles found on startup,
" this will conveniently prompt you to install them.
NeoBundleCheck
"End NeoBundle Scripts-------------------------


"""""""""""""""""""""""""""""""""""""""""""""""""""
""	MacVim 共通の設定
"""""""""""""""""""""""""""""""""""""""""""""""""""
" vi互換モードをOFF
set nocompatible
" バッファをクリップボードと共有します
set clipboard+=unnamed
" 折り返しをオフに
set nowrap
" 行番号を表示する
set number
" 閉じ括弧が入力されたとき、対応する括弧を表示する
set showmatch
" 検索時に大文字を含んでいたら大/小を区別
set smartcase
" 検索をインクリメンタルに行う
set incsearch
" 検索パターンのマッチ箇所の強調表示
set hlsearch
" 新しい行を作ったときに高度な自動インデントを行う
set smartindent
" 行頭の余白内で Tab を打ち込むと、'shiftwidth' の数だけインデントする。
set smarttab
" ファイル内の <Tab> が対応する空白の数
set tabstop=4
set shiftwidth=4
" タブをスペースに自動で変換する
set expandtab
" カーソルを行頭、行末で止まらないようにする
set whichwrap=b,s,h,l,<,>,[,]
" コマンドをステータス行に表示
set showcmd
" タイトルを表示
" set notitle
set title
" 現在のモードの表示
set showmode
" 自動的にインデントする (noautoindent:インデントしない)
set autoindent
" バックスペースでインデントや改行を削除できるようにする
set backspace=2
" 検索時にファイルの最後まで行ったら最初に戻る (wrapscan:有効 nowrapscan:無効)
set wrapscan
" 括弧入力時に対応する括弧を表示 (noshowmatch:表示しない)
set showmatch
" コマンドライン補完するときに強化されたものを使う(参照 :help wildmenu)
set wildmenu
" テキスト挿入中の自動折り返しを日本語に対応させる
set formatoptions=q
" 行頭の余白内でTabを打ち込むと、'shiftwidth'の数だけインデントする
set smarttab
" Ctrl+aで8進数の計算をさせない
set nrformats-=octal
" inset mode での <Backspace>の挙動
set backspace=eol,indent,start
" <Leader>を"¥"に変更
let mapleader="¥"
" モードライン
set modeline
" モードライン挿入
inoremap <Leader>modeline <C-R>\/* vim:set foldmethod=marker commentstring=\ /*%s*/: */
" カラースキーム
colorscheme darkblue
" 選択箇所の色変更!!:
highlight Cursor guibg=yellow guifg=black
"""""""""""""""""""""""""""""""""""""""""""""""""""
"" 日付挿入
"""""""""""""""""""""""""""""""""""""""""""""""""""
inoremap <Leader>date <C-R>=strftime('%Y/%m/%d (%a)')<CR>
inoremap <Leader>time <C-R>=strftime('%H:%M')<CR>
inoremap <Leader>w3cd <C-R>=strftime('%Y-%m-%dT%H:%M:%S+09:00')<CR>

"""""""""""""""""""""""""""""""""""""""""""""""""""
"" ファイル操作に関する設定:
"""""""""""""""""""""""""""""""""""""""""""""""""""
" バックアップファイルを作成しない
set nobackup
set noswapfile

"""""""""""""""""""""""""""""""""""""""""""""""""""
"" NERDTREE
"""""""""""""""""""""""""""""""""""""""""""""""""""
"" 隠しファイルを表示する
let NERDTreeShowHidden = 1
"
"" 引数なしで実行したとき、NERDTreeを実行する
let file_name = expand("%:p")
if has('vim_starting') &&  file_name == ""
    autocmd VimEnter * execute 'NERDTree ./'
endif
" 分割ウィンドウ時に移動を行う設定
noremap <C-H> <C-W>h
noremap <C-J> <C-W>j
noremap <C-K> <C-W>k
noremap <C-L> <C-W>l

"""""""""""""""""""""""""""""""""""""""""""""""""""
"" MiniBufExplorer
"""""""""""""""""""""""""""""""""""""""""""""""""""
let g:miniBufExplorerMoreThanOne = 0  "無条件でバッファ一覧が開く
let g:miniBufExplMapWindowNavVim = 1  "hjklで移動
let g:miniBufExplMapWindowNavArrows = 1
let g:miniBufExplMapCTabSwitchBuffs = 1

の部分は、NeoBundleのインストール走らせて
生成されるその環境にあったものを使ってね。

.gvimrc

colorscheme darkblue

if has("gui_running")
   au GUIEnter * winpos 0 0
   set lines=160 columns=280
   set transparency=10
   set antialias
endif


会社変わってもVim道を進むのじゃ!(うろ覚え)
って言われて、もちろんです老師!って返したけど
実際にはそれからUnityどっぷりで4年くらいブランクあるなぁ

自力で色々使いやすくしていかないと。

接続元IPアドレスでアクセスを弾く

何故か家から繋がらんのだが?

家からssh接続してサーバ内見るかーとか思ったら、
オフィスからつないだ時と違う挙動。あれれ。

その時はVPNでオフィスを踏み台にする方法で
事なきを得たけども、後々設定変更が必要になって
自分で許可IPを追加する必要が出たので調査した。

1. /etc/hosts.allowファイルを使う

まずサーバ内で確認したのが/etc配下にある

/etc/hosts.allow
/etc/hosts.deny

このファイルで出来るのは
特定サービス、特定IPアドレスからのアクセスを許可(または拒否)

動きとしては、
1. allowで許可するリストに含まれていれば許可
2. denyで拒否するリストに含まれていれば拒否
3. どちらにも設定されていないものは許可
なので、この仕組みを使う場合は/etc/hosts.denyの最終行に
全てのアクセスを弾くような設定を入れていた。

詳しくは下記のリンクが分かりやすかった。
トリガを元にメール飛ばしたり、色々出来るようなので割と柔軟っぽい。

止められないUNIXサーバのセキュリティ対策(3):サービスをセキュアにするための利用制限〜TCP Wrapperによるサービスのアクセス制限〜 (1/3) - @IT

ただ、今回の件は/etc/hosts系ファイルを使っていなかった。

2. iptablesでパケットフィルタリングをする

他の方法よりもっと込み入った設定ができるやつ。
たしか、前職ではサーバセンターの中でごにょごにょしてる人が使ってた気がする。

今のオフィス規模と用途では使わないので、全然良くわかってない。

www.unix-power.net

確認したけど、残念ながらそもそも何も設定されていなかった。

3. .htaccessでアクセスを弾く

名前を".htaccess"として
一行目が拒否、許可の優先度設定
二行目以降で、一行目が許可なら拒否リストを
一行目が拒否なら許可リスト記載したテキストファイルを作成。

ディレクトリ内に配置をすれば、そのディレクトリ配下は
.htaccessで指定されたアクセス設定になる。

普通、指定したアクセス元のみ受け入れる設定なら下記のような感じ。

order deny,allow
deny from all
allow from 123.45.67.89


あるにはあったけどほぼデフォルトみたいな感じ。
ここに書いてね!みたいな。うーむ。

4. ソースコード内からアクセス元IPを評価して弾く

結局コレだった。
アプリケーション側のスクリプト内で直接アクセス元のIPをチェックして
リストに入っていなければ返却するデータを空にするという仕組み。

以下チェックする必要があるかなーと思ってたリスト

5. DBのデータを元にアプリケーションコードで弾く

6. AWS他、クラウドプラットフォームの機能で弾く

正直6の可能性高いだろうなーと思ってた。
あんまりクラウド明るくないから分からないけどどうなんざんしょ。
普通にありそうよね。

1, 3は場合によっては使いそう。
とりあえずは勉強になった!

Vimでctagsを使う、またはMacPortsを入れる

ctags導入

せっかくNERDTreeやminibufexplを導入しても
タグジャンプがなければただの窓付きエディタなので
その弱点を補うためのツール導入。

ctagsでタグファイル作ればタグジャンプ出来るだろと
思ったけど、Macにデフォルトで入っているctagsは使えな
やりたいことが出来ないようなので、ちゃんとしたctagsを入れる。

Exuberant Ctagsを入れると色々捗るらしいのでそれを入れる。
と思って実施したらportコマンド通ってない、ないやんけ…
ということでMacPorts導入。

MacPorts

MacPorts/HomeBrew二大巨塔だと勝手に思っているけど
yumとかapt-getみたいなCUIベースのパッケージマネージャ。
個人的にMacPortsが好きなのでそれを使う。

https://www.macports.org/install.php

事前にXCodeと関連ツール入れてねと言われるので素直に従う。
XCode入れたあとは、MacPorts.pkgを使ってインストール。
お手軽。

多分問題ないけど、MacPorts自体のアップデートも確認する

sudo port selfupdate

ctags

以下のコマンドを実行。パスワードを求められたら入れる。

sudo port install ctags

試しに

$ ctags --version
Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
  Compiled: Nov 22 2014, 13:15:05
  Addresses: <dhiebert@users.sourceforge.net>, http://ctags.sourceforge.net
  Optional compiled features: +wildcards, +regex

うむ、入っている。

実食

このままだとctags入れるだけマンになるので試そう。
試しにチェックするのはこちら。

github.com

いつの間にか3.0になってたCakePHP
お仕事で使ってた頃は2.x系だった気がする。いや1.xか?
ギッハブの右側からzipでDLしてきて、そのままDownloads内で展開。

ターミナルツールでそのディレクトリまで入っていって

$ctags -R --languages=PHP --langmap=PHP:.php.inc --php-types=c+f+d+v

終わり。
それぞれのパラメータの意味は

-R : ディレクトリ内を再帰的にチェック
--languages=PHP : 言語設定をPHPに
--langmap=PHP:.php.inc : PHPとして認識するファイルの拡張子として .php, .inc を設定
--php-types=c+f+d+v : タグ付けの設定を詳細に設定 (c : クラス, f : メソッド, d : 定数, v : 変数)

このディレクトリでvimを開く。

$ alias mvim="/Applications/MacVim.app/Contents/MacOS/Vim -g"
$ mvim

うまくいけばこうなっているはず。
f:id:uskey:20150814032658p:plain

適当なファイルを開いて(多分今回はbootstrap.php)
エディタ上からCtrl+]で定義元にジャンプ。
戻るときはCtrl+tで元に戻る。

IDEでは当たり前の機能だけど、エディタから利用出来ると
軽さもあいまって使いやすさもひとしお。
これでだいぶ使いやすくなったかな。

MacにVimをトゥギャザーする方法 (2015年8月版)

今の職場に移った時に、
「若いのに一つの技術に固執してんじゃねえしゃーんなろー」
とCTOに言われて、前職で使いはじめたVimを捨てて早4年。

Unityで開発するにはMonoDevelopが楽で良い感じだけど
時代の流れに求められてPHPer(ぺちぱー)としての立ち回りも
要求されつつあるので、久々にVim等の開発環境の確認を。

MacVim

まずはVimが無いとはじまらないので、MacVimの調達。
Windows Vimググると一番上に出てくる香り屋さんでは
Mac版が無いので、Githubに上がっている同様のものを取得。

https://github.com/splhack/macvim-kaoriya

入れてみたはいいけど、手元に.vimrcやら.vimやらが既にあって
若干気持ち悪いのでバックアップ取ってから再インストール。
前の設定とかとぶつかると原因切り分け難しくなるしね。
ちょうどいいのでクリーンインストール

NeoBundles

色々試した結果、Windows版で使ってたpathogenという
Vim用のプラグイン管理プラグインがうまいこと動かないので
よりナウい別のNeoBundlesというプラグインに変更。

https://github.com/Shougo/neobundle.vim

加えて、vimに引きこもった状態で作業をする効率を上げる
下記の2プラグインを導入。

NERDTree

Vimに引きこもった状態でディレクトリを表示して
別ファイルを開いたりしやすくする。

minibufexpl

Vimでは開いたファイルをバッファというもので管理している。
そのバッファをタブブラウザのタブみたいな感じで管理する。

まず、NeoBundlesを導入。その後Vim起動で自動で両方とも入る。
具体的にはNeoBundlesのinstall.sh実行後に出てくる.vimrc内の
プラグイン追加する行に下記を追加。

"NeoBundle Scripts-----------------------------
if has('vim_starting')
  if &compatible
    set nocompatible               " Be iMproved
  endif

  " Required:
  set runtimepath+=/Users/user_name/.vim/bundle/neobundle.vim/
endif

" Required:
call neobundle#begin(expand('/Users/user_name/.vim/bundle'))

" Let NeoBundle manage NeoBundle
" Required:
NeoBundleFetch 'Shougo/neobundle.vim'

" Add or remove your Bundles here:
NeoBundle 'Shougo/neosnippet.vim'
NeoBundle 'Shougo/neosnippet-snippets'
NeoBundle 'tpope/vim-fugitive'
NeoBundle 'ctrlpvim/ctrlp.vim'
NeoBundle 'flazz/vim-colorschemes'
NeoBundle 'fholgado/minibufexpl.vim' "←追加
NeoBundle 'scrooloose/nerdtree' " ←追加

" You can specify revision/branch/tag.
NeoBundle 'Shougo/vimshell', { 'rev' : '3787e5' }

" Required:
call neobundle#end()

" Required:
filetype plugin indent on

" If there are uninstalled bundles found on startup,
" this will conveniently prompt you to install them.
NeoBundleCheck
"End NeoBundle Scripts-------------------------

起動したらバッチリ、やったねめでたしめでたしと思ったけど
カラースキームの設定がなんか違うので.gvimrcに下記追加。
※user_nameの部分は人によって違うと思うので環境に合わせて

colorscheme darkblue

全然関係ないけど

シンタックスハイライトでvimがあるのはとてもよい