2014/09/22

[zsh]peco で git をもっと便利にする

peco を導入しました。すごく便利です。
導入についてはコチラ↓
peco を導入した | DevAchieve

peco で色々フィルタリングして選択できるのは
ファイル、ハッシュ、ブランチを選択する事が多い Git と相性が良さそうです。

peco script を色々作るとエイリアスとか大変っぽいので
zsh のグローバルエイリアスを使ってみました。

編集されたファイルをフィルタリングする

function peco-git-changed-files(){
    git status --short | peco | awk '{print $2}'
}
alias -g F='$(peco-git-changed-files)'

使い方

git add F
Ctrl + Space で複数ファイル選択して add も可能です。

コミットのハッシュをフィルタリングする

function peco-git-hash(){
    # git log --oneline --branches | peco | awk '{print $1}'
    git lg | peco | sed -e "s/^[\*\|][ |\\\/\*]*//g" | awk '{ print $1 }'
}
alias -g F='$(peco-git-hash)'
[alias]
 lg = log --all --graph --decorate --oneline
git lg (log graph) は僕の git log を置き換えるコマンドです。
以下のようにコミットが確認できるので履歴確認、ブランチ確認、マージする際に便利なコマンドです。

peco ではこの色付けがなくなってしまうので残念です。頑張って保持して欲しいところ。

使い方

git diff F とか git cherry-pick F とか。
おおよそコミットのハッシュを指定するところ全てで使えるんじゃないですかね?
git diff で複数選択とか便利です。

ブランチをフィルタリングする

function peco-git-branch(){
    git branch | peco | sed -e "s/^\*[ ]*//g"
}
alias -g B='$(peco-git-branch)'

使い方

git checkout B とか
git merge B とか
git diff B など。

参考

pecoでgit向けの汎用的なフィルターを2つ作成してみた - Qiita
私のpeco活用事例 - k0kubun's blog

[zsh]cdr: 開いたディレクトリの履歴からディレクトリを開く

peco を導入した | DevAchieve で実は cdr を導入していました。
zsh に組み込まれているコマンドに cdr という
開いたディレクトリの履歴からディレクトリを開くコマンドがあります。
~/.zshrc で cdr を有効にしてあげれば使えるようになります。

$HOME/.cache/shell/ は用意しないといけないので
mkdir -p $HOME/.cache/shell/ しておいて下さい。
# cdr, add-zsh-hook を有効にする
autoload -Uz chpwd_recent_dirs cdr add-zsh-hook
add-zsh-hook chpwd chpwd_recent_dirs

# cdr の設定
zstyle ':completion:*' recent-dirs-insert both
zstyle ':chpwd:*' recent-dirs-max 500
zstyle ':chpwd:*' recent-dirs-default true
zstyle ':chpwd:*' recent-dirs-file "$HOME/.cache/shell/chpwd-recent-dirs"
zstyle ':chpwd:*' recent-dirs-pushd true
設定については以下を参考にして下さい。
zsh: 26. User Contributions
zshでcdの履歴管理に標準添付のcdrを使う - @znz blog

使い方

確認
cdr -l
1 ~/.zsh
2 ~/.zsh/peco-scripts
3 ~/Documents/workspace
4 ~/dotfiles

開く
cdr 3

こんな感じですね。
これだけじゃイチイチ開く前に確認しないといけないので peco で選択したいですね。

function peco-cdr() {
    local selected_dir=$(cdr -l | awk '{ print $2 }' | peco)
    if [ -n "$selected_dir" ]; then
        BUFFER="cd ${selected_dir}"
        zle accept-line
    fi
    zle clear-screen
}
zle -N peco-cdr
2行目で何をしているか。
cdr -l
1 ~/.zsh
2 ~/.zsh/peco-scripts
3 ~/Documents/workspace
4 ~/dotfiles
↑を awk でディレクトリ名だけ抜き出して
cdr -l | awk '{ print $2 }'
~/.zsh
~/.zsh/peco-scripts
~/Documents/workspace
~/dotfiles
peco で選択して cd する。
シンプルなコマンドの組み合わせで凄く便利に!
これなら自分でも何か作れそうでワクワクします。

peco を導入した

コマンドラインの行選択ツール peco を導入しました。
peco - Simplistic Interactive Filtering Tool
どんなものかわからないと思うので上のリンクから Demo の gif 画像を見て下さい。
なんとなく便利そうな雰囲気がしますよね?

インストール

それではインストールしてみましょう。Mac では Homebrew で以下の通り。
brew tap peco/peco
brew install peco
それ以外の場合は上のリンクからインストール方法を確認して下さい。
Go で作られているのでインストールが簡単らしいです。

peco のカスタマイズ

peco はパイプでコマンドの出力を行選択して、パイプで次のコマンドに渡すコマンドラインツールなわけだけど
ある程度頻繁に使いそうなものについてはスクリプトファイルを書いておいたほうが便利ですね。
こういうものはどんどん拡張したくなるのでスクリプトファイルの保存場所を決めておきます。
~/.zshrc
~/.zsh/peco-scripts/ の読み込みやキーバインドの設定
~/.zsh/peco-scripts/
peco のスクリプトファイルの保存場所

# load peco scripts (require cdr)
for f (~/.zsh/peco-scripts/*) source "${f}"
% tree peco-scripts
peco-scripts
├── peco-cdr.zsh
└── peco-select-history.zsh

peco-cdr.zsh: 開いたディレクトリの履歴からディレクトリを選択する

[zsh]cdr: 開いたディレクトリの履歴からディレクトリを開く | DevAchieve
function peco-cdr() {
    local selected_dir=$(cdr -l | awk '{ print $2 }' | peco)
    if [ -n "$selected_dir" ]; then
        BUFFER="cd ${selected_dir}"
        zle accept-line
    fi
    zle clear-screen
}
zle -N peco-cdr
# 履歴から cd
bindkey '^@' peco-cdr

peco-select-history.zsh: コマンドの履歴からコマンドを選択する

function peco-select-history() {
    local tac
    if which tac > /dev/null; then
        tac="tac"
    else
        tac="tail -r"
    fi
    BUFFER=$(history -n 1 | eval $tac | peco --query "$LBUFFER")
    CURSOR=$#BUFFER
    # zle clear-screen
}
zle -N peco-select-history
# 履歴からコマンド選択
bindkey '^r' peco-select-history

追記: 2014/12/10
コマンド履歴の重複を削除して peco で選択できるようにしました。
[peco]peco-select-history.zsh で表示されるコマンド履歴の重複を削除する - Qiita

まとめ

使ってみるとわかりますが、すごく便利です!

参考: pecoを使い始めた - $shibayu36->blog;
2014/09/21

iTerm2 を導入した

Mac をようやく Marvericks にアップデートできたので
ついでに便利そうなツール類を入れまくる活動の第一弾です。
Mac の Terminal より便利で色々設定できる iTerm2 というものを入れてみました。

iTerm2 って何よ?どう便利なんよ?

って言われると僕も困ってしまう。↓この辺を読むと便利そうって思うかもしれない。
iTerm2の使い方まとめてみた - uittie::blog
事故らないために普段守っているターミナルの運用ポリシ(Mac + iTerm2) | TechRacho

僕は色々設定できてカラースキーマも設定できればそれで良いかもしれない。

カラースキーマ

iTerm 2 で使えるカラースキーム、Japanesque を作った - Sexual Knowing
最強カラースキームと言えば Solarized だよね! | blog.remora.cx
このあたりが人気っぽい。

Iterm Themes - Color Schemes and Themes for Iterm2
あとはコレとか。
僕は Monokai が好きなのでコレで設定した。

設定を GitHub の dotfiles リポジトリで複数端末一括管理したい

ハイライト部分がキモ。初回実行時はインストールされてないからエラーでそう。その時考える。
#! /bin/bash
ln -s ~/dotfiles/Brewfile ~/Brewfile
ln -s ~/dotfiles/Settings.terminal ~/Settings.terminal
ln -s ~/dotfiles/.gitconfig ~/.gitconfig
ln -s ~/dotfiles/.gitignore ~/.gitignore
ln -s ~/dotfiles/.sqliterc ~/.sqliterc
ln -s ~/dotfiles/.vim/ ~/.vim
ln -s ~/dotfiles/.vimrc ~/.vimrc
ln -s ~/dotfiles/.zsh/ ~/.zsh
ln -s ~/dotfiles/.zshrc ~/.zshrc
rm ~/Library/Preferences/com.googlecode.iterm2.plist
ln -s ~/dotfiles/.iterm2/com.googlecode.iterm2.plist ~/Library/Preferences/com.googlecode.iterm2.plist
ln -s ~/dotfiles/.iterm2/ ~/.iterm2
Mac のソフトウェアの設定はキャッシュされているので設定を変えたら iTerm2 を再起動しないと設定ファイルには反映されないので注意。

おまけ

vim,iTerm2で★とか■とか※とかがずれるのでなんとかした - Qiita
"tmux-powerlineのステータスバーがおかしくなる"とかなんとか。
tmux も便利そうなので入れたいが、 iTerm2 に統合されているという話もあり良くわからない。
その件についてはまた今度。
2014/09/20

Mac を Marvericks にアップデートした時にやったこと

App Store から Marvericks にアップデート


一時停止になったままアップデートされない。
LaunchPad から一時停止しているやつを削除する。
バージョンアップできた。

Marvericks で問題が起きてないかチェック

Terminal を開いたらすぐに閉じてしまうので設定をいじったら以下の問題が…。
Homebrew-Cask がもしかしたら状態が良くなさそうだけど確認できないので一旦放置。

おわり

Nexus7(2013) を KitKat にバージョンアップするための長い道のり

Android 4.4 KitKat が2013年の10月くらいに発表されてな…
Android 4.4 | Platforms | Android Developers

11月の初めに @tao_gaku さんが外部記憶領域とパーミッションまわりの変更について記事を書いてくれてな…


Android 4.3 と Android 4.4 の挙動の変化を見るための
サンプルプロジェクトを作って記事を書こうと決意してな…

手持ちの Nexus7(2013) の一台しかないから Android 4.3 の挙動を確認したら
Android 4.4 にバージョンアップして挙動を確認して比較する(ただしダウングレードはできない)という
めんどくさそうな感じで放置してな…(今は焼き方を覚えたのでできる)

そんな感じで放置していたら会社で Nexus7(2013) を手に入れられたので
手持ちの Nexus7(2013) を Android 4.3 で維持しておいて
会社の Nexus7(2013) を Android 4.4 にすることができてな…

そんなこんなしてたら Android Studio がリリースされてな…
Android Studio で Gradle に productFlavor という便利なものがあってな…
プロジェクト再開して wada811/Android-StorageReadWriteChecker ができてな…

↓この記事を先日やっと書いてな…
[Android]KitKatと外部記憶領域とREAD_EXTERNAL_STORAGEとWRITE_EXTERNAL_STRAGEとmaxSdkVersion | DevAchieve

ようやく Nexus7(2013) をアップデートじゃぁああああああああああ!!!!!!!!!!!

[Android]Google Play アカウント所有者を変更する

Google Play アカウント所有者が個人Gmailアカウントに紐付いていて
ユーザーに開発用Gmailアカウントを追加していたのですが、
Google Play アカウント所有者じゃないとできないことがあったので
Google Play アカウント所有者を開発用Gmailアカウントに切り替える手続きをしました。

移行できれば普段使っている開発用Gmailアカウントで
Google Play Developer Publishing API などを使えるようになるので嬉しいです。


アカウント所有者 と ユーザー の違い

アカウント ユーザーの追加と権限の管理 - Android デベロッパー ヘルプ

タイプアクセス
アカウント所有者
デベロッパー コンソールにフルアクセスできる
新しいユーザーの招待、ユーザーのデベロッパー コンソールへのアクセスの取り消し、各ユーザーの権限の設定を行うことができる
有料アプリを販売するため、関連付けられた Google ウォレット Merchant アカウントを所有できる(アカウント所有者のみ)
ユーザー
デベロッパー コンソールにさまざまなレベルでアクセスできる
すべてまたは指定のアプリにアクセスできる
新しいユーザーの招待やユーザーの権限の編集はできない

Google Play アカウント所有者を変更する

手順は以下のとおり。

  • Google サポートチームに連絡し、アプリを別のアカウントに移行します。
  • アプリの移行の確認に返信し、既存のアカウントを閉鎖します。

アカウント情報の変更または更新 - Android デベロッパー ヘルプ


Google Play アカウントを移行する

普通だったら以下の対応だけでOK!

  • 新しい Google Play アカウントを登録する
  • 新しい Google Wallet アカウントを登録して紐付ける
  • アプリ移行リクエストを送る

アプリを移行する - Android デベロッパー ヘルプ
アプリ移行リクエスト - Android デベロッパー ヘルプ

アプリの収益を受け取るための Google Wallet のお支払い設定を忘れないようにしましょう!


デベロッパー アカウントの解約

2,3営業日待てば移行もされるし、
Google Wallet のデポジットも振り込まれてお支払い設定完了できるだろうから
すべてが終わったら移行元の Google Play アカウントを解約しましょう!

登録料の25ドルが返ってくるらしいです。
アカウント情報の変更または更新 - Android デベロッパー ヘルプ

2014/09/19

[Android]KitKatと外部記憶領域とREAD_EXTERNAL_STORAGEとWRITE_EXTERNAL_STRAGEとmaxSdkVersion

KitKat で外部記憶領域の読み書きに関するパーミッションに変更がありました。
また、READ_EXTERNAL_STORAGE パーミッションも正式対応となりました。

この変更についてまとめたいと思います。
まずは言葉の説明から。

外部記憶領域(primary external storage)

以前は外部記憶領域といえば SD カード(外部ストレージ、外部SDなどと呼ばれる)のことを指しましたが、
最近はストレージ内部の仮想的な記憶領域(内部ストレージ、内部SDなどと呼ばれる)のことを主に指します。
そのため、内部ストレージと呼ばれるのに外部記憶領域であり、
READ_EXTERNAL_STORAGE や WRITE_EXTERNAL_STRAGE が必要となるという少々混乱する状況でした。
(Environment#getExternalStorageDirectory()が内部SDを返すようになったり)
primary external storage などについては以下のサイトを読んでください。
External Storage Technical Information | Android Developers

KitKat での変更

KitKat からは EXTERNAL_STORAGE パーミッションの対象ディレクトリが変更となり、
外部記憶領域上のアプリケーションデータ領域はパーミッションが不要となりました。
アプリケーションデータ領域の外部については EXTERNAL_STORAGE パーミッションが必要となっています。

アプリケーションデータ領域

本体メモリのアプリケーションデータ領域(アプリ内領域などと呼ばれる)
/data/data/<パッケージ名>/
外部記憶領域上のアプリケーションデータ領域
/<外部記憶領域>/Android/data/<パッケージ名>

本題

READ_EXTERNAL_STORAGE と WRITE_EXTERNAL_STRAGE が必要なのは
どのディレクトリなのか、どのメソッドなのか調べました。

wada811/Android-StorageReadWriteChecker
BuildVariants と パーミッションREAD_EXTERNAL_STORAGEWRITE_EXTERNAL_STRAGE
PreKitKat
PreKitKatRead
PreKitKatWrite
PreKitKatReadWrite
KitKat
KitKatRead
KitKatWrite
KitKatReadWrite
KitKatWriteCompat○(maxSdkVersion="18")
KitKatReadWriteCompat○(maxSdkVersion="18")
データ:Android - KitKatと外部記憶領域とREAD_EXTERNAL_STORAGEとWRITE_EXTERNAL_STRAGEとmaxSdkVersion - Qiita

結果

PreKitKatKitKat の結果から
getExternalCacheDir と getExternalFilesDir で取得できる外部記憶領域上のアプリケーションデータ領域は
KitKat からパーミッションなしでも読み書き可能であることが確認できます。

READ_EXTERNAL_STORAGE が正式対応となったため
KitKat 以降で READ_EXTERNAL_STORAGE なしでは
Environment.getExternalStorageDirectory で取得できる外部記憶領域は
読み込みできないことが確認できます。(PreKitKatKitKat)
KitKatRead から READ_EXTERNAL_STORAGE があれば
外部記憶領域の読み込みができることが確認できますね。

本題の本題

さて、getExternal~Dir で取得できる外部記憶領域上のアプリケーションデータ領域は
KitKat からパーミッションなしでも読み書き可能ということが確認できましたが、
PreKitKat ではパーミッションが必要です。
KitKat では必要でないパーミッションを PreKitKat のために宣言すると
KitKat ユーザーに対して不要なパーミッションを取得することになります。
結局パーミッションは減らせないのかとなりそうですが、
KitKat で追加された Uses-Permission の maxSdkVersion 属性によって対応が可能です。

以下のように記述することで PreKitKat では WRITE_EXTERNAL_STORAGE を宣言し、KitKat ではパーミッションを宣言しないことができます。
<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="18" />
アプリ情報画面のパーミッションの欄を見ると PreKitKat では WRITE_EXTERNAL_STORAGE があり、
KitKat では WRITE_EXTERNAL_STORAGE はないことがわかります。
KitKatWriteCompat KitKatReadWriteCompat
PreKitKat
KitKat

結論

  • Environment への書き込みがあるなら WRITE_EXTERNAL_STORAGE が必要
  • getExternal~Dir への書き込みだけなら WRITE_EXTERNAL_STORAGE に maxSdkVersion="18" を付けておく
  • 外部記憶領域への読み込みがあるなら READ_EXTERNAL_STORAGE が必要

参考

External storage access | Android 4.4 APIs | Android Developers
Android:KitkatのREAD_EXTERNAL_STORAGEと外部記憶領域 | Taosoftware
WRITE_EXTERNAL_STRAGEと下位互換のためのmaxSdkVersion | Taosoftware
2014/09/12

[Android]ライブラリプロジェクト(aar)をMavenリポジトリとしてGitHubで配布する

Androider の皆さんこんにちは。
もう Eclipse から Android Studio への移行は済みましたか?
僕はまだ途中です。
俺々ライブラリが移行できないと Android Studio に移行できないので
今回はそのための手順をご紹介したいと思います。

環境

OS
Mac OS X 10.8.5
Android Studio
0.8.9

ライブラリプロジェクト(aar)とは

Android Studio 、というより Android Studio で導入された Gradle というビルドシステムでの
ライブラリプロジェクトの配布用バイナリ形式を aar (Android archive) と呼ぶらしいです。
.aar の拡張子を持つ ZIP ファイルで、以下が入っています。
  • /AndroidManifest.xml (必須)
  • /classes.jar (必須)
  • /res/ (必須)
  • /R.txt (必須)
  • /assets/ (オプション)
  • /libs/*.jar (オプション)
  • /jni//*.so (オプション)
  • /proguard.txt (オプション)
  • /lint.jar (オプション)
参考: AAR Format - Android Tools Project Site

配布編

まずは Android Studio でライブラリプロジェクトを作成します。詳しい方法については割愛。

試しに aar を作成するためリリースビルドするため、
上の画像の Terminal で ./gradlew assembleRelease を実行します。
以下のコマンドで aar が作成されているか確認します。
find . -name '*.aar'
./library/build/outputs/aar/library.aar

問題ないので build.gradle に Maven プラグインを使用して aar やら何やらを生成するタスクを追記します。
以下のハイライト部分です。
(余談だけど build.gradle って説明された時に初めは root の build.gradle なのか
Modules の build.gradle なのかわからなくて戸惑いました。だいたい Modules の方らしい。)
apply plugin: 'com.android.library'

android {
    compileSdkVersion 19
    buildToolsVersion "20.0.0"

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 19
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:20.0.0'
}

def repo = new File(rootDir, "repository")

apply plugin: 'maven'

uploadArchives {
    repositories {
        mavenDeployer {
            repository url: "file://${repo.absolutePath}"
            pom.version = '1.0.0'
            pom.groupId = 'at.wada811'
            pom.artifactId = 'android-dialog-fragments'
        }
    }
}
pom.version がライブラリのバージョン、
pom.groupIdが自分用の識別子(Java の package 名の最初の部分で良さそう)、
pom.artifactIdがライブラリの識別子、みたいです。
詳しくは 第52章 Mavenプラグイン を読んで下さい。

追記したら Android Studio の Terminal で ./gradlew uploadArchivesすると
repository ディレクトリに aar が生成されます。
tree repository
repository
└── at
    └── wada811
        └── android-dialog-fragments
            ├── 1.0.0
            │   ├── android-dialog-fragments-1.0.0.aar
            │   ├── android-dialog-fragments-1.0.0.aar.md5
            │   ├── android-dialog-fragments-1.0.0.aar.sha1
            │   ├── android-dialog-fragments-1.0.0.pom
            │   ├── android-dialog-fragments-1.0.0.pom.md5
            │   └── android-dialog-fragments-1.0.0.pom.sha1
            ├── maven-metadata.xml
            ├── maven-metadata.xml.md5
            └── maven-metadata.xml.sha1
この repository を GitHub に Push すれば配布側の手順としては完了です。

利用編

GitHub で配布されているライブラリプロジェクト(aar) を参照することで利用することができます。
プロジェクトは準備出来ているとして、app などの build.gradle に以下を記述します。
repositories {
    maven { url 'http://raw.github.com/wada811/Android-DialogFragments/master/repository/' }
}

dependencies {
    compile 'at.wada811:android-dialog-fragments:1.0.0'
}
全体は HelloGradle/build.gradle at master · wada811/HelloGradle を見て下さい。
読み込めると以下のように app/build/intermidiates/exported-aar/ 以下に追加されます。


これで Public な俺々ライブラリが手軽に配布、参照できて便利ですね!

参考

u1aryzの備忘録とか: githubをMavenリポジトリとしてAndroidライブラリプロジェクト(aar)をデプロイして使用する
2014/09/10

Android Studio で support library のソースコードをアタッチする

Android Studio でサポートライブラリのソースコードが読めなくて困ったので調べると
サポートライブラリのソースコードを別途ダウンロードして設定が必要でした。

参考
Android Studio - Attach Source - web系な備忘録

cd $ANDROID_SDK_HOME/extras/android
git clone https://android.googlesource.com/platform/frameworks/support/ support-src

FragmentActivity などを command + B で開いて
右上の Attach Source... をクリックして
$ANDROID_SDK_HOME/extras/android/support-src を指定してあげれば
サポートライブラリのソースコードを読めるようになります。
2014/09/05

Mac で Command + M のウィンドウ最小化を無効化する

基本的にウィンドウの最小化って使わないです。
なのにCommand + mという
Command + nCommand + , のミスを
待ち構える配置になっているので微妙にストレスがたまります。
トグルだったらまだ良かったのですが最小化したっきり戻ってこないので
メニューバーのウィンドウから前面に表示させるしかありません。
そこが一番のストレスポイントですね。

ということでCommand + mを無効化したいと思います。

システム環境設定 > キーボード > キーボードショートカット

アプリケーションの「+」ボタンを押すと以下のような表示が出ます。
ここで全アプリケーションに対して
メニュータイトル「しまう」、「最小化」、「Minimize」のキーボードショートカットを設定しましょう。

とりあえずCommand + Ctrl + mに変更しました。


アプリケーションを開き直すと適用されるとか、開き直さなくても適用されるとか。
これで操作ミスでウィンドウが最小化されることもなくなるかと思います。

参考
How to Create a Keyboard Shortcut for Menu Items Everywhere - Tuts+ Computer Skills Tutorial
2014/09/04

Mac でウィンドウを切り替えるキーボードショートカット

Mac で作業しているとアプリケーションもそのウィンドウもどんどん開いてしまいます。
アプリケーションなら Command + Tab で切り替えできるので良いのですが
ウィンドウの切り替えに困っていました。
これが長らくの課題でしたが、参考サイトのおかげで
キーボードショートカットの「次のウィンドウを操作対象にする」を設定すると
ウィンドウの切り替えできました。

システム環境設定 > キーボード > キーボードショートカット

キーボードと文字入力の「次のウィンドウを操作対象にする」の
キーボードショートカットを好きなものに変えましょう。
僕は Command + Option + Tab に変えました。


FInder とかついつい開きすぎて切り替えが面倒だったのでコレで便利になります!やったぁ!

参考サイト

橋本商会 » Macの「次のウィンドウを操作対象にする」をなぜ設定しないのか

タグ(RSS)