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

ぜんぶむきます

期間指定でやらかし(かけ)た話

既に走ってるサービスだとログとか取り続けていて
いざ何か問題が起きた時にその調査をログベースで対応したりする。


そんでやって参りましたログ調査。
特定の種類のユーザーについて7,8月のユーザー数を見たい。

SELECT count(*)
  FROM users
    WHERE last_login 
      BETWEEN '2015-07-01' AND '2015-07-31';

よし、7月だからこれで良いよね。
単一テーブルだから楽勝楽勝。

と思うじゃないですか。

若干思ってたより少ないなーと思って

SELECT id, last_login
  FROM users
    WHERE last_login 
      BETWEEN '2015-07-01' AND '2015-07-31'
        ORDER BY last_login DESC
          LIMIT 10;

こんな感じでとったら

+---------+---------------------+
| id      | last_login          |
+---------+---------------------+
| userid1 | 2015-07-30 23:59:47 |
| userid2 | 2015-07-30 23:59:35 |
| userid3 | 2015-07-30 23:57:46 |
+---------+---------------------+

ものの見事に31日のログが抜けてる!
なるほどそっちか!

パッと見上手くいきそうなのがすごくあかん。
ということで正しくは下記。

SELECT id, last_login
  FROM users
    WHERE last_login 
      BETWEEN '2015-07-01 00:00:00' AND '2015-07-31 23:59:59'
        ORDER BY last_login DESC
          LIMIT 10;

これで期待した結果になった!
ちゃんと時間まで指定しましょう!

Cornerstoneを捨てて、UTF-8-MACと戦った話

おしごとでGithubを使いはじめて数年。
案件な関係でSubversionと相見えることに。

Cornerstoneの様子がおかしい

www.zennaware.com

前に使っていたCornerstoneというSubversionクライアントを使って作業開始。
しばらく使ってると不思議な挙動に気づく。
自分の担当箇所をいじってコミットしようとすると
全然いじってないファイルが編集済みにマークされている…


無視してコミット出来るっちゃ出来るけど相当に気持ち悪い。
その上、すんげークライアントの動きがまったりしている。


プロジェクトの規模感(ブランチ単位で20GB)もあるから仕方ないけど
作業できなければ、オフィスの二酸化炭素濃度上げてるだけなので
とりあえず作業進めるために、ガワ無い分おそらく速いだろうと思われる
CUI直叩きで作業をすることに決めた。(やったこと無いしどうせなら勉強)

CUI用のSubversionのインストール

Cornerstone自体がSVNクライアントを内包しているようで
外からうまく叩く事が出来なかった。なんと。
これまで使っていたSubversionはCornerstoneと一緒にさよなら。


さくっとMacPortsで入れてみる。

$ sudo port install subversion
--->  Fetching archive for subversion
--->  Attempting to fetch subversion-1.9.0_0.darwin_14.x86_64.tbz2 from http://packages.macports.org/subversion
--->  Attempting to fetch subversion-1.9.0_0.darwin_14.x86_64.tbz2.rmd160 from http://packages.macports.org/subversion
--->  Installing subversion @1.9.0_0

1.9.0系入ってきた!なんか知ってるやつより新しい!
絶対早くなるパターンだ!コレで勝つる!
さっきまで触ってたプロジェクト直下に行って

$ svn info
svn: E155036: Please see the 'svn upgrade' command
svn: E155036: The working copy at '/Projects/project'
is too old (format 29) to work with client version '1.9.0 (r1692801)' (expects format 31). You need to upgrade the working copy first.

歴史のあるプロジェクトだもんで、リポジトリのバージョンも古い。
調べてみる限りだと、ワーキングコピーだけバージョン上げられるっぽいけど、
他の影響考えたり、検証の手間を避け一旦は現行バージョンまで落とす事に。


まぁ早い話、チキッた
良いの!お仕事だから安全第一。
自分プロジェクトだと、えいやってやるけどね。

複数バージョンをインストール出来るらしい

古いバージョンのSubversionを入れようと思って調べていると
どうやら、古いバージョンのPortFileを直接使えばいいらしい。


MacPortsリポジトリブラウザを開いて
( dports in trunk – MacPorts )
ツリーを開いてSubversionのPortFileを探すとこんなページに行くので
( Portfile in trunk/dports/devel/subversion – MacPorts )
ここから前後へ移動で、インストールしたいバージョンのものを検索。
Subversionについては、前のバージョンに合わせて1.7.xを入れることに。


例えば、ここでお目当てのバージョンが1.7.10だとすれば
リビジョンは106653になるので下記のようなコマンドを実行。

$ mkdir tmpsvn
$ cd tmpsvn
$ svn co -r 106653 http://svn.macports.org/repository/macports/trunk/dports/devel/subversion
$ cd ./subversion
$ sudo port install
 ....
$port installed subversion
The following ports are currently installed:
  subversion @1.7.10_1 (active)
  subversion @1.9.0_0

うむ。入っているしちゃんと動く。少し動作も早くなった感ある。


ただし、日本語ファイルがアレなのはさっきと一緒(アー
どうやらSubversionが古いことが原因ではない模様。

UTF-8-MAC

色々調べているとこんな記事を見つけた。

svnで日本語ファイル名を使ってるとMAC-UTF8では違うファイル名ってことになるのでcheckoutしてきただけで変更扱いになる。

http://docs.komagata.org/4962

まさにコレ。バージョンはあってたけど、
ビルド時のフラグ必要だったっぽい。
仕方ないので、現状の1.7.10は消しちゃう。

先にactiveなバージョンを退避させてアンインストール。
(なんか巻き込み事故あったら怖い

退避
$ sudo port activate subversion @1.9.0_0
--->  The following versions of subversion are currently installed:
--->      subversion @1.7.10_1
--->      subversion @1.9.0_0 (active)
アンインストール
$ sudo port uninstall subversion @1.7.10_1
--->  Uninstalling subversion@1.7.10_1
--->  Cleaning subversion

どうやら、MacPortsではソースからビルドする時と
同じようにオプジョンをつけられるらしい。

オプションの確認
$ port variants
subversion has the variants:
   disable_keychain: Disables support for the Mac OS X Keychain
   mac_os_x_server_mod_dav_svn: Unsupported - attempt to build the subversion apache module with apple supplied apache2
   mod_dav_svn: Install the subversion apache module (mod_dav_svn)
   no_bdb: Build without support for BerkeleyDB repositories
   tools: Install some optional extra subversion tools
   unicode_path: Installs a hack to workaround Mac OS X unicode path issues
   universal: Build for multiple architectures

unicode_path: Installs a hack to workaround Mac OS X unicode path issues

こいつか

オプションつけて再インストール
$ sudo port install +unicode_path
 ....
$ port installed subversion
subversion @1.7.10_1+unicode_path (active)

試してみると、無事日本語問題解決してた。

Macでzcatが上手くいかない件について

サーバ管理をしていると、tar.gzで固められたファイルから
特定の情報を探したりとかする必要がしばしば出てくる。

前はWindowsだったけど今はMacだからローカルで作業余裕
ルンルン(裏声)とか思って、scpで落として来て作業開始したら

知ってるコマンドが通用しねぇ…

やりたかった事としては、圧縮されたログファイルの中身を読むこと。

$ zcat log20150810.tar.gz
zcat: log20150810.tar.gz.Z: No such file or directory

いやいや、tar.gzで良いんだって!別に.Zとか探してないよ!
サーバ上だとちゃんと動く。うーん、と思って調べたら
なんとMacではgz圧縮されたファイルはzcatでは読めない!

んだよ一々解凍してチェックしないといけないのか
と思ったらgzcatというコマンドがあるらしい。

もともと

どうやらzcatというのはcompressというツールで圧縮した際の
.Zファイルと呼ばれる、今ではほとんど見ないエンシェント形式に
対応したcatということで、gzcatはそのgzip版。うーん、闇。

サーバに入ってるCentOSとかだと、zcatで読めるようになっているのは
多分便利だったから短い方のコマンドが採用されたんだろう(適当

同じ名前したパッケージだけど実はパッチ当たってないと特定機能が
無いとか、オプション必要だったとかはとてもよくある話なので
サーバで同じ事するときは事前に確認するの大切だなーと再確認。

オチ

結局集計作業としてやりたかったことはzgrepで普通に出来たので
zcatで先に見ようとしてなければそもそも、こんな問題起きてなかった
というかそこはgzgrepではないのか…

みんなもgzcat使ってみてくれよな!

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年くらいブランクあるなぁ

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