jinja2 備忘録

jinja2 の簡単な使いかたについての備忘録

jinja2 について調べてみたのはいいが、使えなくならないために備忘録として残す。

いきなりサンプル

Code
ファイル名: jinja2_sample.py

# coding: utf-8
from jinja2 import Template, Environment, FileSystemLoader

env = Environment(loader=FileSystemLoader('.'))
template = env.get_template('sample.tpl')

data = {'name': 'Kuro', 'lang': 'Python'}
disp = template.render(data)
print(disp)

Template file
ファイル名: sample.tpl

My name is {{ name }}. I like {{ lang }}.
{% set text=name %}
{{ text }}
{{ text }}
{{ text }}
{{ text }}
{{ text }}

2つのファイルを作ったので実行してみる

データは辞書にして渡す必要がるようです。
テンプレートファイルに set を入れるとテンプレートファイル内で変数として扱えるようです。便利。

実行結果

$ python3 jinja2_sample.py
My name is Kuro. I like Python.

Kuro
Kuro
Kuro
Kuro
Kuro

今のところ、テンプレートファイルのファイル名をコードに埋め込んでいるので、外だししたほうが良さそう。

まぁ、手順書を作るんならこの辺を使えればだいたいいい気がする。

以上

How to use argparse module on Python3

Learning using argparse module on Python3

Make an argparse.py file

At first, make a file that name is argparse.py file by any text editor.

Open the official document on your browser

Aliases
Japanese

Argparse チュートリアル — Python 3.6.5 ドキュメント

English

Argparse Tutorial — Python 3.6.5 documentation

Make the most simple script

Code is bellow.

# coding: utf-8
import argparse
parser = argparse.ArgumentParser()
parser.parse_args()

Show help.

$ python3 argparse.py -h
usage: argparse.py [-h]

optional arguments:
  -h, --help  show this help message and exit
$

Add positional arguments

Make positional arguments.
Code

# coding: utf-8
import argparse
parser = argparse.ArgumentParser()
# Positional arguments.
parser.add_argument("echo")
args = parser.parse_args()
print(args)

Show help message.

$ python3 argparse.py -h
usage: argparse.py [-h] echo

positional arguments:
  echo

optional arguments:
  -h, --help  show this help message and exit

$

Run the script with foo in positional arguments.

$ python3 argparse.py foo
Namespace(echo='foo')
$

Check what functions in ArgumentParser()

Check in interpreter mode.

$ ipython
Python 3.6.4 (default, Jan  6 2018, 11:51:15) 
Type 'copyright', 'credits' or 'license' for more information
IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import argparse

In [2]: parser = argparse.ArgumentParser()

In [3]: dir(parser)
Out[3]: 
['__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 '_action_groups',
 '_actions',
 '_add_action',
 '_add_container_actions',
 '_check_conflict',
 '_check_value',
 '_defaults',
 '_get_args',
 '_get_formatter',
 '_get_handler',
 '_get_kwargs',
 '_get_nargs_pattern',
 '_get_option_tuples',
 '_get_optional_actions',
 '_get_optional_kwargs',
 '_get_positional_actions',
 '_get_positional_kwargs',
 '_get_value',
 '_get_values',
 '_handle_conflict_error',
 '_handle_conflict_resolve',
 '_has_negative_number_optionals',
 '_match_argument',
 '_match_arguments_partial',
 '_mutually_exclusive_groups',
 '_negative_number_matcher',
 '_option_string_actions',
 '_optionals',
 '_parse_known_args',
 '_parse_optional',
 '_pop_action_class',
 '_positionals',
 '_print_message',
 '_read_args_from_files',
 '_registries',
 '_registry_get',
 '_remove_action',
 '_subparsers',
 'add_argument',
 'add_argument_group',
 'add_help',
 'add_mutually_exclusive_group',
 'add_subparsers',
 'allow_abbrev',
 'argument_default',
 'conflict_handler',
 'convert_arg_line_to_args',
 'description',
 'epilog',
 'error',
 'exit',
 'format_help',
 'format_usage',
 'formatter_class',
 'fromfile_prefix_chars',
 'get_default',
 'parse_args',
 'parse_known_args',
 'prefix_chars',
 'print_help',
 'print_usage',
 'prog',
 'register',
 'set_defaults',
 'usage']

In [4]: 

We can see a lot of functions.
And there is add_argument function.
There is add_argument() method document.

Japanese

16.4. argparse — コマンドラインオプション、引数、サブコマンドのパーサー — Python 3.6.5 ドキュメント

Engelish

16.4. argparse — Parser for command-line options, arguments and sub-commands — Python 3.6.5 documentation

Add help detail message.

Code changes...

# coding: utf-8
import argparse
parser = argparse.ArgumentParser()
# Positional arguments.
parser.add_argument("echo", help="echo the string you use here")
args = parser.parse_args()
print(args)

Only add help= option.

Run this.

$ python3 argparse.py -h
usage: argparse.py [-h] echo

positional arguments:
  echo        echo the string you use here

optional arguments:
  -h, --help  show this help message and exit
$

Added echo argument message. OK, we can add posisional argument message!

Add argument type in positional argument.

Code is bellow.

# coding: utf-8
import argparse
parser = argparse.ArgumentParser()
# Positional arguments.
parser.add_argument("echo_num", help="echo the number you use here", type=int)
args = parser.parse_args()
print(args)

Run this help.

$ python3 argparse.py -h
usage: argparse.py [-h] echo_num

positional arguments:
  echo_num    echo the number you use here

optional arguments:
  -h, --help  show this help message and exit
$

OK, it seems good.

Run the script with 2 that is positional argument.

$ python3 argparse.py 2
Namespace(echo_num=2)

$

OK, next. I will give test string to this script.

$ python3 argparse.py test
argparse.py: error: argument echo_num: invalid int value: 'test'

shell returned 2

$

I got an error with helpfull message. It's good behavior.

Use optional arguments.

Make optional argument sample.

# coding: utf-8
import argparse
parser = argparse.ArgumentParser()
# Optional arguments
parser.add_argument("--verbose", help="increase output verbosity")
args = parser.parse_args()
if args.verbose:
    print("verbosity turned on")

parser.add_argument() is same.
It is EASY!

Run the script.

$ python3 argparse.py -h
usage: argparse.py [-h] [--verbose VERBOSE]

optional arguments:
  -h, --help         show this help message and exit
  --verbose VERBOSE  increase output verbosity

Run the script with optional argument.

$ python3 argparse.py --verbose 1
verbosity turned on

args.verbose becomes True, run the print function.
It seems good!

Customize!

Change to get True or False on --verbose option. Now, --verbose opiton is able to get integer values.
Code bellow.

# coding: utf-8
import argparse
parser = argparse.ArgumentParser()
# Optional arguments
parser.add_argument("--verbose", help="increase output verbosity", action="store_true")
args = parser.parse_args()
if args.verbose:
    print("verbosity turned on")

Run the script with -h.

$ python3 argparse.py -h
usage: argparse.py [-h] [--verbose]

optional arguments:
  -h, --help  show this help message and exit
  --verbose   increase output verbosity

Help text has changed.

Short options

Easy

# coding: utf-8
import argparse
parser = argparse.ArgumentParser()
# Optional arguments
parser.add_argument("-v", "--verbose", help="increase output verbosity", action="store_true")
args = parser.parse_args()
if args.verbose:
    print("verbosity turned on")

Only add "-v" option. It's so easy!

Run the script with -h option.

$ python3 argparse.py -h
usage: argparse.py [-h] [-v]

optional arguments:
  -h, --help     show this help message and exit
  -v, --verbose  increase output verbosity

Help message has changed!

Thank you!

Python3 で Requests モジュール使い方の備忘録

Requests モジュールの備忘録

備忘録を書くことで、自分自身が使い方を忘れた時にそれを思い出す手助けとする。

Requests とは

Web アクセスののための Python モジュール?だと思います。
そもそも作られた理由が、urllib2 という Python 付属のモジュールがややこしすぎたからだとか。

Requests の公式ページにかかれているのは以下の通り。

Requests is an elegant and simple HTTP library for Python, built for human beings.

私の拙い訳ですと、

Requests は Python のためのエレガントでシンプルな HTTP ライブラリで、人間のために作られました。

うーん。変ですね。
translate.google.co.jp さんに翻訳していただきましょう。

Requestsは、人間のために構築された、Python用のエレガントでシンプルなHTTPライブラリです。

わかりやすい!

半端な翻訳よりよっぽどいいですね!テクノロジー。すごいです。

公式ページは以下からたどれます。
英語版

Requests: HTTP for Humans — Requests 2.18.4 documentation

日本語版

Requests: 人間のためのHTTP — requests-docs-ja 1.0.4 documentation

日本語版は、リリースバージョンが v1.0.4 と少し古い? 英語版だと v2.18.4 ですのでやはり古く感じてしまいますね。

更新履歴があるところを見つけました。良かったです。

Community Updates — Requests 2.18.4 documentation

インストール

$ pip install requests

で入るはずです。
入らなければ、公式を見ましょう。

Installation of Requests — Requests 2.18.4 documentation

Getting Started

ここにも書いてあるので、それでもいいと思います。

http://docs.python-requests.org/en/master/user/quickstart/#quickstart

やり方はそれぞれだと思いますが、やはり、インタプリタで試してからテキストファイルに落とすほうが確実だと思います。
今回はインタプリタで実行していきます。  

>>> import requests
>>> target_url = "https://github.com"
>>> r = requests.get(target_url)
>>> r.status_code
200

とりあえず、アクセスが出来ました。
この時拾ってきたレスポンスボディを表示させてみましょう。

>>> r.text
'\n\n\n\n\n\n<!DOCTYPE html>\n<html lang="en">\n  <head>\n    <meta charset="utf-8">\n  <link rel="dns-prefetch" href="https://assets-cdn.github.com">\n  <link rel="dns-prefetch" href="https://avatars0.githubusercontent.com">\n  <link rel="dns-prefetch" href="https://avatars1.githubusercontent.com">\n  <link rel="dns-prefetch" href="https://avatars2.githubusercontent.com">\n  <link rel="dns-prefetch" href="https://avatars3.githubusercontent.com">\n  <link rel="dns-prefetch" href="https://github-cloud.s3.amazonaws.com">\n  <link rel="dns-prefetch" href="https://user-images.githubusercontent.com/">\n\n\n\n 
...

ちゃんと取ってこれているようです。整形されていないので、見づらいですね。
そういう問のために、BeautifulSoup4 という素敵なものもあるんですが、それはまた別途使ってみようと思います。

ちなみにこの時の r が持つメソッド一覧

>>> [print(x) for x in dir(r)]
__attrs__
__bool__
__class__
__delattr__
__dict__
__dir__
__doc__
__enter__
__eq__
__exit__
__format__
__ge__
__getattribute__
__getstate__
__gt__
__hash__
__init__
__init_subclass__
__iter__
__le__
__lt__
__module__
__ne__
__new__
__nonzero__
__reduce__
__reduce_ex__
__repr__
__setattr__
__setstate__
__sizeof__
__str__
__subclasshook__
__weakref__
_content
_content_consumed
_next
apparent_encoding
close
connection
content
cookies
elapsed
encoding
headers
history
is_permanent_redirect
is_redirect
iter_content
iter_lines
json
links
next
ok
raise_for_status
raw
reason
request
status_code
text
url
[None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None]
>>> 

この辺の詳しいことは、以下の リンク にも書いてあります。

Developer Interface — Requests 2.18.4 documentation

どんな値を拾ってデバッグしたいかによって、使いたいメソッド?が変わると思いますので、適宜ドキュメントを活用しましょう。
たとえば、ヘッダー情報を見てみたいときは、headers だったり、 request.headers を使えばわかります。

Requests は色々できて、ログインしてセッション維持して次のページへ遷移するとか、フォームに値を入れるとか、ユーザーエージェント情報を偽装?するとか。

そのあたりも順次追記していきたいと思います。


とりあえず、今日はここまで。(内容薄いな)
また、このページに追記します。

hbstudy#82 に遅刻参加してきました

hbstudy#82 とは

詳しくは下記リンクより。

hbstudy.connpass.com

このエントリについて

正直短くなります。
途中参加だったこともあり、全てを聞け無かったこと。各種技術について知らないことも多かったので、まずは備忘録まで。

k8s, Rancher の話について

私が聞けたのは最後のこの発表だけだった。開発に至る経緯からモニタリングまでのお話を聞くことが出来た。

Ranche 導入のきっかけ

Docker を導入したら、あまりにもコンテナが乱立した > 統合管理環境が欲しかった > Rancher 導入へ

Docker on Docker について

Docker on Docker を導入しているとのこと。
メリット * コンソールやSSHなどが分離されている。アプリケーションの動いているコンテナがお亡くなりなってもコンソールはとれる デメリット * 特に言及は無かった

Docker on Docker と言う使い方を考えたことも無かったので新しい刺激になってうれしかった。

管理系(サービスとして表に出ているサーバを管理するサーバ)について

これに使われているサービスも Docker を使っている。と言う事は、Rancher も使っている。とのこと。

Docker & Rancher すごい!

オンプレミスの強み

Blue, Green デプロイや Immutable Infrastructure なんかを実施するとき、1世代前のコンテナを時期リリースまでおなかの中で抱えておく事が出来る。その為のリソースはちゃんと確保している。その為切り戻しが一瞬で出来るようになっている。
AWSなどで実施しようとするといくら請求が来るか恐ろしい。

ShellScript 乱立

数えた結果100以上のShellScriptが出来上がったらしい。その辺をそのままにしておくと秘伝のたれになりかねないので、envsubstを使って共通化を謀ったらしい。

通化はいいことですね。

データについて

結局データの永続化は外部に出していた。

今はまだそうならざるを得ないのだなと感じた。Docker でデータの永続化が出来る時代はもう少し先???

DevOps な話について

出てきた。具体的な話は忘れたが、開発者も運用に入るようにしていた様だ。

SRE について

話が出てこなかったように思う。
個人的には SRE 大全 とあったのでもう少しシステムから離れた話が聞けるのではと思っていた。

会社内で Vision を定義して、それに沿って SREDevOps を定義していく必要がある。と個人的に解釈した。

Vision 大事!

サービスが大きくなりすぎて結局運用部隊を分けたくならないかについて

その為のマイクロサービスです。

なるほど。

一つの公開しているサービスを持っているチームがあって、それがスケールするとサービス内のマイクロサービスが大きくなってしまい、結局運用分離が発生するのでは無いかについては聞くことが出来無かった。

総じて

サービスのシステムや技術の話はすごく面白かった。ただ、個人的には SRE の SLI やエラーバジェットとってるとかその辺の事をもう少し突っ込んで聞きたかった。

以上。

NetOpsCoding#5 Mini Report

NetOpsCoding Report

I went to NetOpsCoding#5 in Japan at 10th of October in 2017.

スポンサー

Food: Cisco Drink: CTC America

自動化と監視の推進奮闘記

Presented by 安藤格也(ヤフー株式会社)

自動化

自動化はどこでも課題になっているようだ
古い機器も扱っているのでAPIが無いなど問題もある

マルチベンダーを利用している > 抽象化 > 自動化 で取り組んだ

Python からNW_Library があり、それを利用

NETCONF でとれるデータ != 構造化されたデータ

CLI で抽象化を試すことに

OSSを利用することで、コマンドでのOSの意識を消す事も抽象化により可能になった

CLI の結果を解析するライブラリ
google/textfsm 便利らしい

今回は、設定の自動化は fabric(python) でオペレーションを関数化したようだ

結果として、抽象化はうまく出来た用でした

Q & A

  1. CLI ベースで抽象化しているので、OSのバージョンアップにどう対応しているのか?
  2. ユニットテストをしっかり作ったので、OSのバージョンアップに追従出来るようになっている

  3. Ansible ではないのはなぜ?

  4. 用件を定義する中で、Ansible は駄目だと出てきた。(詳しい話は忘れた) (CLIベースで抽象化すると決まったのに、API経由しか無かったりなど)

  5. 誰がメンテするんですか問題

  6. 勉強会とドキュメント

監視

  • Prometheus

prometheus.io

  • Alertmanager

github.com

  • Grafana

github.com

Prometheus は集約できる
拠点ごとに置いた Prometheus を中央の Prometheus に集約するなど

Ansible x NAPALM x NSO 解説・比較パネルディスカッション

運用自動化ツールが続々リリース
これは!
ネットワーク運用変革時代!!!

横地 晃(株式会社エーピーコミュニケーションズ)

  • NAPALM は Python のライブラリ
  • Ansible 構成管理ツール

Ansible

モジュールの対応状況がベンダーやOSによってまちまち

簡単な Ansible でのネットワーク設定などの紹介

Ansible 2.4 新モジュールから抽象化するような機能が出てきた
- net_* モジュール

NAPALM

多機能で暑い抽象化 Python ライブラリ

github.com

情報取得メソッドはよく見ておこう。バージョンが上がるときに変わることが多々ある

NAPALM は show コマンドの結果を parse してくれる

NAPALM は Validate 機能がある
たとえば、YAML で Traceroute の path を定義しておいて、その通りになるかどうかテストできる

岩本 彰 (Cisco Systems)

TAC です。値段聞かれても答えれませんw

Network Service Orchestrator
略して、NSO
全てのコンフィグはモデルベース

果たして、古い IOS でも NSO は対応しているのだろうか

NSO は、CDB に設定情報を突っ込んでいる。それを、Yang ベースにNEDがデバイス用の設定をつくって、実機に反映させる流れ。その為、設定情報がすでにCDBに存在していればデバイスに対して何もしない

ディスカッション

記事から削除

最後に

公開が遅れてしまったこと、大変後悔している。個人的な重いとしては勉強会なりセミナーなりが終わった次の日にはアップしていたいのだが、今回は出来なかった。今更ながらでは在るが、個人的備忘録として公開させて頂く。

Python3 で正規表現を使ったときのメモ

目的

Python3 で正規表現を使うときの備忘録とする

環境

  • Jupyter Notebook
  • Python3.6

参考

Python3.6 の公式ドキュメント
6.2. re — 正規表現操作 — Python 3.6.3 ドキュメント

ciscoconfparse

github.com

続きを読む

my vimrc

my vimrc

I want to recording my vimrc here.
I don't want to add comments.

I would like to update my vimrc!

" Configuration file for vim
set modelines=0     " CVE-2007-2438

" Normally we use vim-extensions. If you want true vi-compatibility
" remove change the following statements
set nocompatible    " Use Vim defaults instead of 100% vi compatibility
set backspace=2     " more powerful backspacing

" Don't write backup file if vim is being called by "crontab -e"
au BufWrite /private/tmp/crontab.* set nowritebackup nobackup
" Don't write backup file if vim is being called by "chpass"
au BufWrite /private/etc/pw.* set nowritebackup nobackup

" Basic settings

" タイトルをバッファ名に変更しない
set notitle
set shortmess+=I

" Too fast connect to the tarminal
set ttyfast

" Use 256 colors at the tarminal
set t_Co=256

if has ("viminfo")
  " フォールド設定(未使用)
  " set foldmethod=indent
  set foldmethod=manual
  " set foldopen=all
  " set foldclose=all
endif

" 複数ファイルの編集を可能にする
set hidden

" 内容が変更されたら自動的に再読み込み
set autoread

" Swapを作るまでの時間ms
set updatetime=0

" Unicodeで行末が変になる問題を解決
set ambiwidth=double

" カーソルを常に画面の中央に。
set scrolloff=1000

" C-vの矩形選択で行末より後ろもカーソルを置ける
set virtualedit=block

" コマンド、検索パターンを50まで保存
set history=100

" ------ SEARCH -------
" インクリメンタルサーチを有効に
set incsearch

" 大文字小文字を区別しない
set ignorecase

" 大文字で検索されたら対象を大文字限定にする
set smartcase

" 行末まで検索したら行頭に戻る
set wrapscan

" ----- Format -----
" 自動インデントを有効に
set smartindent
set autoindent

" フォーマット揃えをコメント以外有効にする
set formatoptions-=c

" 括弧の対応をハイライト
set showmatch

" ターミナルの上から貼り付けを許可
" set paste

set shiftwidth=4
set softtabstop=4
set expandtab
set autoindent
set smartindent

augroup fileTypeIndent
  autocmd!
  autocmd BufNewFile,BufRead *.py setlocal tabstop=4 softtabstop=4 shiftwidth=4
  autocmd BufNewFile,BufRead *.html setlocal tabstop=4 softtabstop=4 shiftwidth=4
  autocmd BufNewFile,BufRead *.rb setlocal tabstop=2 softtabstop=2 shiftwidth=2
  autocmd BufNewFile,BufRead *.erb setlocal tabstop=2 softtabstop=2 shiftwidth=2
augroup END

" ----- Look&Feel -----
" TAB可視化
set list
set listchars=tab:>_,trail:-,eol:$
" extends:>>,precedes:<<,nb:%,

" 検索結果をハイライト
set hlsearch

" ルーラー、番号
set ruler
set number

" コマンドラインの高さ
set cmdheight=2

" カーソルラインを表示する
"set cursorline

" ウインドウタイトルを設定する
set title

"自動文字数カウント
augroup WordCount
    autocmd!
    autocmd BufWinEnter,InsertLeave,CursorHold * call WordCount('char')
augroup END
let s:WordCountStr = ''
let s:WordCountDict = {'word': 2, 'char': 3, 'byte': 4}
function! WordCount(...)
    if a:0 == 0
        return s:WordCountStr
    endif
    let cidx = 3
    silent! let cidx = s:WordCountDict[a:1]
    let s:WordCountStr = ''
    let s:saved_status = v:statusmsg
    exec "silent normal! g\<c-g>"
    if v:statusmsg !~ '^--'
        let str = ''
        silent! let str = split(v:statusmsg, ';')[cidx]
        let cur = str2nr(matchstr(str, '\d\+'))
        let end = str2nr(matchstr(str, '\d\+\s*$'))
        if a:1 == 'char'
            " ここで(改行コード数*改行コードサイズ)を'g<C-g>'の文字数から引く
            let cr = &ff == 'dos' ? 2 : 1
            let cur -= cr * (line('.') - 1)
            let end -= cr * line('$')
        endif
        let s:WordCountStr = printf('%d/%d', cur, end)
    endif
    let v:statusmsg = s:saved_status
    return s:WordCountStr
endfunction


" ステータスラインにコマンドを表示
set showcmd
" ステータスラインを常に表示
set laststatus=2
" ファイルナンバー表示
set statusline=[%n]
" ホスト名表示
set statusline+=%{matchstr(hostname(),'__w__+')}@
" ファイル名表示
set statusline+=%<%F
" 変更チェックの表示
set statusline+=%m
" 読み込み専用かどうか表示
set statusline+=%r
" ヘルプページなら[HELP]と表示
set statusline+=%h
" プレビューウィンドウなら[Preview]と表示
set statusline+=%w
" ファイルフォーマット表示
set statusline+=[%{&fileformat}]
" 文字コード表示
set statusline+=[%{has('multi_byte')&&\&fileencoding!=''?&fileencoding:&encoding}]
" ファイルタイプ表示
set statusline+=%y
" ここからツールバー右側
set statusline+=%=
" skk.vimの状態
set statusline+=%{exists('*SkkGetModeStr')?SkkGetModeStr():''}
" 文字バイト数/カラム番号
set statusline+=[%{col('.')-1}=ASCII=%B,HEX=%c
" 現在文字列/全体列表示
set statusline+=[C=%c/%{col('$')-1}]
" 現在文字行/全体文字行
set statusline+=[L=%l/%L]
" 現在のファイルの文字数をカウント
set statusline+=[WC=%{exists('*WordCount')?WordCount():[]}]
" 現在行が全体行の何%目か表示
set statusline+=[%p%%]

"-------エンコード------
"エンコード設定
if has('unix')
    set fileformat=unix
    set fileformats=unix,dos,mac
    set fileencoding=utf-8
    set fileencodings=utf-8,iso-2022-jp,cp932,euc-jp
    set termencoding=
elseif has('win32')
    set fileformat=dos
    set fileformats=dos,unix,mac
    set fileencoding=utf-8
    set fileencodings=iso-2022-jp,utf-8,euc-jp,cp932
    set termencoding=
endif

"ファイルタイプに応じて挙動,色を変える
syntax on
filetype plugin on
filetype indent on

" ----- key setting -----
" nmap <UP> k
" nmap <DOWN> j
" vmap <UP> k
" vmap <DOWN> j

" ほかのvimにviminfoを送る
" http://nanasi.jp/articles/howto/editing/rviminfo.html
nmap ,vw :vw<CR>
nmap ,vr :vr<CR>

" 保存
" map jj :w<CR>

" ESC
inoremap jj <ESC>

" 括弧を補完
inoremap ( ()<left>
inoremap [ []<left>
inoremap { {}<left>
inoremap < <><left>

" 挿入モードでのカーソル移動
inoremap <C-j> <Down>
inoremap <C-k> <UP>
inoremap <C-h> <Left>
inoremap <C-l> <Right>

" シングルコーテーション補完
inoremap ' '' <left>

" yanktmpの設定
" vim to vim でコピペ出きるようになる。
" map <silent> sy :call YanktmpYank()<CR>
" map <silent> sp :call YanktmpPaste_p()<CR>
" map <silent> sP :call YanktmpPaste_P()<CR>
" if has("win32")
"       let g:yanktmp_file = TEMP. '/vimyanktmp'
" end