Vim を使いはじめた
これまでメインのエディタは Sublime Text 3 だったのだけど、新しい MacBook Pro の設定をしているうちに Vim への乗り換えを決意した。
なぜいまさら?という感じもあるけど、自分の中の動機はこの辺。
- .vimrc を共有すれば、どこでも同じスタイルで開発できる
- 既に dotfiles の管理・運用ができているので、同じやり方で共有できるのが楽で良い
- 色々カスタマイズできて楽しそう
- カスタマイズ自体が大変そうな印象があったけど、NeoBundle の存在を知って敷居が下がった
- Golang を Vim で書きたい
Vim をインストール
Mac の場合は既に Vim が入っているが、こいつはクリップボードが使えないようだった。
使えるかどうかは vim --version
を叩いて +clipboard
と表示されるかどうかで確認できる。
$ vim --version | grep clipboard -clientserver -clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments -xterm_clipboard -xterm_save
仕方ないので Homebrew でインストールした vim にパスを通すようにした。
インストール後に再度確認すると、無事 +clipboard
が表示された。
$ vim --version | grep clipboard +clipboard +iconv +path_extra -toolbar +eval +mouse_dec +startuptime -xterm_clipboard
.vimrc の設定をいじる
色々なサイトを見ながら .vimrc を設定してみた。
間違ってるところがあればぜひ指摘してください><
"基本設定 "-------- set confirm " 保存されていないファイルがあるときは終了前に保存確認 set hidden " 保存されていないファイルがあるときでも別のファイルを開くことが出来る set autoread " 外部でファイルに変更がされた場合は読みなおす set nobackup " ファイル保存時にバックアップファイルを作らない set noswapfile " ファイル編集中にスワップファイルを作らない set mouse=a " マウスの入力を受け付ける set wildmenu wildmode=list:longest,full " コマンドラインモードでTABキーによるファイル名補完を有効にする set history=10000 " コマンドラインの履歴を10000件保存する set clipboard=unnamed,autoselect set nrformats-=octal " 0で始まる数値を、8進数として扱わないようにする "インデント設定 "-------------- set tabstop=2 " 画面上でタブ文字が占める幅 set autoindent " 改行時のオートインデントを有効にする set smartindent " 改行時に入力された行の末尾に合わせて次の行のインデントを増減する set expandtab " TABキーを押した際にタブ文字の代わりにスペースをいれる set shiftwidth=2 " オートインデント時にインデントする文字数 set softtabstop=2 " 連続した空白に対してタブキーやバックスペースキーでカーソルが動く幅 "表示関連 "-------- set number " 行番号を表示する set ruler " 画面右下のカーソル位置表示 set title " 編集中のファイル名を表示 set showmatch " 括弧入力時の対応する括弧を表示 set ambiwidth=double " 文脈によって解釈が異なる全角文字の幅を、2に固定する syntax on " コードの色分け set list " 空白文字の可視化 set listchars=tab:»-,trail:-,eol:↲,extends:»,precedes:«,nbsp:% set cursorcolumn " 列を強調表示 set laststatus=2 " 画面最下部のステータス行を常に表示 set cmdheight=2 " 画面最下部(ステータス行より下)のメッセージ表示欄の行数 set helpheight=999 " ヘルプを画面いっぱいに開く "検索関連 "-------- set hlsearch " 検索文字列をハイライトする set incsearch " インクリメンタルサーチを行う set ignorecase " 大文字と小文字を区別しない set smartcase " 大文字と小文字が混在した言葉で検索を行った場合に限り、大文字と小文字を区別する set wrapscan " 最後尾まで検索を終えたら次の検索で先頭に移る set gdefault " 置換の時 g オプションをデフォルトで有効にする "移動関連 "-------- set virtualedit=block " 文字のないところにカーソル移動できるようにする set backspace=indent,eol,start " Backspaceキーの影響範囲に制限を設けない set whichwrap=b,s,h,l,<,>,[,] " 行頭行末の左右移動で行をまたぐ set scrolloff=8 " 上下8行の視界を確保 set sidescrolloff=16 " 左右スクロール時の視界を確保 set sidescroll=1 " 左右スクロールは一文字づつ行う "エンコーディング関連 "-------------------- set encoding=utf-8 " Vimの内部文字コードがUTF-8に設定 set fileencodings=utf-8,cp932 " ファイル読み込み時の文字コード set fileencoding=utf-8 " ファイル書き込み時の文字コード
.vimrc を管理
自分の場合は、BitBucket に dotfiles を作って管理しているので、そこに .vimrc をぶち込めば終わり。
esa.io を触ってみた感想 (\( ⁰⊖⁰)/)
最近ドキュメント管理・共有サービスの esa.io を触ってみたので感想を。
前提
- 一人で一週間ほど利用してみた
- 本格導入する場合、10人前後の小さなチームでの利用を想定
- 業務として、自社サービスの開発や社外とのSIプロジェクトがある
Pros
- Google アカウントによる認証が可能
- UI がモダンでかわいい
- 機能がシンプルにまとまっており、学習コストが低い
- Markdown が標準でサポートされており、入力アシストも気持ち良い
- 入力項目が少なく、入力の手間が極力減らされている
Cons
- 記事の表示領域が狭い
- カテゴリの並び順が記事の登録件数?並びが安定せず気持ち悪い
- 要望送った。カテゴリのツリーがコントロール出来ないので結構困る。
- Markdown だけでは表現が足りないことがある。HTML エディタも欲しい。
- Markdown に慣れていないメンバーがいる、という理由もある
- Confluence でいうスペースのような概念が欲しい
- コンセプトと違うかもしれないけど...Confluence に慣れてしまっていて...
- 個人スペース、プロジェクト別のスペースが欲しいなぁ
- カテゴリを選んだら README の本文が表示されて欲しい
色々書きましたが全体的に素晴らしく、何よりかわいいのでしばらく利用させていただきます (\( ⁰⊖⁰)/)
YAPC::Asia Tokyo 2015 2日目参加レポート
昨日に引き続き YAPC 2日目の参加レポート書く。朝早くてねむい。
どうしてこうなった? Node.jsとio.jsの分裂と統合の行方。これからどう進化していくのか?
- Mackerel のトークを聞こうと思ってたけど、立ち見だったのでこちらに来てみた
- でもこちらのトークも立ち見だった/(^o^)\
- Node.js の歴史、io.js との分裂・統合のお話
- Node.js、Long-term Support やるとのこと
あまり状況を理解していない中で、何となく Node.js 自体もコミュニティも未成熟な印象でいたけども、今後が期待できる体制に変わってきているみたいだ。
サーバーサイドエンジニア(特にPerl)のためのiOSアプリ開発入門
資料見つからなかった...><
デモ中心のトーク。Swift でならアプリ書けるかなぁ。
連続立ち見で腰がきつかったので途中で離脱しました。すいません...。
データ分析基盤を支える技術
www.slideshare.net
- これまでのデータ分析を支えてきた技術、現在のトレンドについてのトーク
- データ分析は収集→保存→処理→可視化の流れが基本 (ETL)
- 処理のタイミングを収集時または可視化のタイミングで行うような流れがある
- MapReduce からより高速な Tez に
- Norikra は分散しない、でもコード書かなくて良いのは魅力
- 自社でデータ分析基盤を作るのは運用が大変すぎるのでやめたほうが良い
名前だけ知ってるけど詳細知らないキーワードばかり/(^o^)\ そこまで大規模でなければ、BigQuery か Norikra を使うのが一番良さそうなのかな。
【特別企画】YAPCあるある(仮)
- 生 miyagawa さんだ!
- YAPC のこれまでの歴史振り返りトーク
皆さん安定のトーク力。初参加だったのでいろんな経緯が聞けて楽しかった。
HTTP2 時代の Web
- 生 Jxck さんだ!
- HTTP/2 は仕様が策定され、利用されていくフェーズに
- HTTP に関する様々な統計は http://httparchive.org/ で確認できる
- ブラウザキャッシュ領域は、75%の人が2日で使い切る
- キャッシュに載せても2日後には消えている可能性がある
- HTTP/2 はこれから。まずは情報を追いつつ自分で試してみよう
- HTTPS 化は今から進めていったほうが良い
非常に分かりやすいトークで、昨日のトークと合わせてより HTTP/2 への理解が深まりました。 動向を追いつつ、自社サービスで適用していくべきかどうかを見極める必要がありそうです。
LT
www.slideshare.net
- 皆さん面白すぎるw 誰かがインフレしていると言ってた理由がわかった。
- ネコトーストラボさんの扱いww
- 特に記憶に残っているのは、最初の MySQL 5.7 の罠の話と電話共有ロックのLTかな
時間になってしまったのでクロージング前に離脱。
今年で最後の YAPC ということで初めて参加してみましたが、刺激的なトークばかりで非常に良い経験になりました。
運営の皆様本当にお疲れ様でした!
YAPC::Asia Tokyo 2015 1日目参加レポート
今年が最後の YAPC ということで、初めて参加してきました。
その1日目で参加したトークに関するレポートです。
メリークリスマス!
本物だ!YAPC ってすごい!というミーハー気分に。
Effective ES6
- ES6 の概要と、主要な追加仕様に関するトーク
- 正式には ECMAScript 2015
- モダンなシンタックス追加、大規模開発向けの仕様追加、後方互換サポート
- 各環境の対応状況は ECMAScript 6 compatibility table
- Babel が現時点で最も ES6 の機能を実装している transpiler
- IE11 は ES6 をサポートしないらしい
- Babel 使っていきましょう、ということらしい
無性に ES6 書きたくなるトークでした。とりあえず Babel 触ろう。
HTTP/2時代のウェブサイト設計
www.slideshare.net
- HTTP/1.1 の問題点と、それに対する HTTP/2 の解決方法をわかりやすく解説
- H2O の特徴もちょいちょい解説、今のところ H2O 最強っぽい
- nginx のHTTP/2 サポートは秋頃?
- 現時点でまともな感じで実装しているブラウザは Firefox くらい
- 普及していくのは来年以降?
- CDN を利用している場合にどのように運用すべきかがイメージ湧かない...
正直ちゃんと理解できていない領域だったので非常に勉強になった。スライドをまた改めて見なおす。
Conway's Law of Distributed Work
- リモートワークにおけるベストプラクティス・テクニックについてのお話
- 最適なツールを選定しよう
- チャット (Slack、HipChat...)
- ChatOps (hubot)
- オーディオ/ヘッドフォン/カメラ (物理的なツール)
- スクリーンシェアリング (screenhero...)
- プロジェクト管理 (Pivotal Tracker、Trello、JIRAは嫌いらしいw)
- ファイルストレージ (Dropbox、Google Drive...)
- カレンダー (Google Calendar)
- テクニック
- 全員がリモートワークを体験してみる
- 定期的に会う
- すぐに話せない代わりに、アイディア等を書いて積極的に共有する
- 自分の個性を表現・共有する
- 共通で使うタイムゾーンを決める
これはリモートワークに限らず、チームビルディングに必要な知見では。 メンバー全員がタスクのこと・考えていること・アイディアとかあらゆる情報を積極的に共有する必要があるし、その必要性をメンバー自身が理解している必要があるということかな。それが難しいんだけど...。
Electron: Building desktop apps with web technologies
- Electron の話
- npm の資産が流用できるの素晴らしい
Electron、面白そうなんだけど作りたいものが無くて困ってる。デモ中心だったのでちょっと眠かった。
esa.io - 趣味から育てたWebサービスで生きていく
- (\( ⁰⊖⁰)/)
- スライドかわいい
- Bundle update の PR とても良い。真似たい。
- 無料プランのリクエストの意見が出てた
- 個人的には学生向けのプランは良いけど、一般には現状通りでも良いと思う
- 良いサービスには対価を支払うべき
esa.io、最近使い始めて気に入っているサービスなので話が聞けてよかった。
好きなものを作って、それが誰かの幸せになって、その対価で自分が食っていけるって理想ですね。サービス作りたくなるトークでした。
2014年を振り返る
年明けてしまいましたが、昨年を振り返ってみます。
去年は↓のようなことを書いてました。
サーバーサイドエンジニアへ復帰
前職ではサーバーもフロントも両方やってたのですが、 今の会社ではフロントエンジニアとして入社しました。
で、昨年末から新しいプロジェクトにジョインしてフロント周りをやってたのですが、
- サーバーサイドエンジニアが不足していた
- ブラウザ×ソシャゲのフロント周りの技術については、前プロジェクトで一通り触って一旦満足してた
- 今のプロジェクトのフロント周りは、技術的にレガシーなところや歴史的経緯によるコードが多く、モチベーションを保つのが難しかった
といった理由で、サーバーサイド側への復帰を希望してました。
会社として注力タイトルであったこと、リリース直後でリソースを寄せなければいけなかったこともあり、3月くらいからサーバーサイドエンジニアに復帰できました。
これまで経験したことのない規模の負荷であったり、ソシャゲならではのスピード感を求められる開発は色々勉強になってます。
社内チューニンガソンで1位になった
9月に社内チューニンガソンが開催されたのですが、中途メンバーの中で1位を取ることが出来ました。 まさか1位を取れるとは思ってなかったけど、1ヶ月くらい集中して勉強して入賞狙いにいってたので、これは素直に嬉しかった。
と同時に、小さい子供がいる中で勉強時間を確保するのは大変なことを実感...。
長男が1才になった
さらに可愛くなっている。ウンコは臭い。
勉強した技術
こんな感じ。
Spring MVC で複数データソースを扱った場合の挙動を調べてみた
Spring MVC で扱うデータソースが2つある時、片方だけトランザクションを張った場合にもう片方の更新が反映されない、という問題に直面したので色々試してみた。Spring 初心者すぎて辛い。
環境
Spring 3.2.4
元々のソース
例えば user と groupというテーブルがあり、それぞれに対して更新する処理を書いていた。
#!java
@Service
public class HogeService {
@Transactional
public void update() {
userService.update();
groupService.update();
}
}
ここで、user と group とでDBを分けることになり、DataSource と TransactionManager を複数に分けた際、デフォルトの user は更新されるが group の更新がされなくなった。この挙動自体はまぁ当然。
(1) groupService 側にも @Transactional を指定してみる
これで両方トランザクションが張られて正常に動作した。
#!java
@Service
public class GroupService {
@Transactional(“group")
public void update() {
// update...
}
}
(2) afterCommit を利用してみる
今回は group 側にトランザクションを張らなくても良いケースだったので、試しに TransactionSynchronizationAdapter#afterCommit を利用してみた。
#!java
@Service
public class HogeService {
@Transactional
public void update() {
userService.update();
TransactionSynchronizationManager.registerSynchronization(
new TransactionSynchronizationAdapter() {
@Override
public void afterCommit() {
groupService.update();
}
}
);
}
}
これでうまくいくかと思ったが、group への更新は反映されなかった。何かイメージと違う。afterCommit の後に何か処理が走っているのか。
(3) user、group への更新処理をメソッド毎分ける
StackOverflow とか Spring 関連の記事を見ていると、結局これに落ち着きそうな感じ。もちろん想定通りに動作する。
#!java
@Service
public class HogeService {
@Transactional
public void updateUser() {
userService.update();
}
@Transactional(“group")
public void updateGroup() {
groupService.update();
}
}
時間も無く、結局うまいやり方が見つからないので、(3) の実装で一旦落ち着いた。