2014/12/30

[Android]テキストをクリップボードにコピーする

wada811/Android-Material-Design-Colorsサンプルアプリを作ったら
カラーコードをコピーしたいという要望があったので実装しました。

Honeycomb 未満と以上で方法が変わっていました。
クラス名は同じでパッケージが異なるだけだったので長ったらしくてちょっとアレです。

@SuppressWarnings("deprecation")
public void copyText(Context context, String text){
    if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB){
        android.text.ClipboardManager clipboard = (android.text.ClipboardManager)context.getSystemService(Context.CLIPBOARD_SERVICE);
        clipboard.setText(text);
    }else{
        android.content.ClipboardManager clipboard = (android.content.ClipboardManager)context.getSystemService(Context.CLIPBOARD_SERVICE);
        ClipData clip = ClipData.newPlainText("Copied Text", text);
        clipboard.setPrimaryClip(clip);
    }
}
Android: Copy to clipboard selected text from a TextView - Stack Overflow

[Android]タブレット対応 〜 Master / Detail パターンを実装する

みなさん、タブレット対応してますか?
僕はまだあんまりなので
とりあえず一番有名な Master / Detail パターンを実装してみることにしました。
Android Studio の Wizard に Master Detail パターンがあるので
コイツを見ておきたいと思います。

ということで Android Studio の Wizard で Master Detail パターンを生成してみると
結構わかりにくいことをしていて、
values-sw600dp/refs.xml で @layout/activity_item_list を参照すると
タブレットでは @layout/activity_item_twopane を参照されるように設定しています。
<item type="layout" name="activity_item_list">@layout/activity_item_twopane</item>
しかも、スマートフォンとタブレットの判別の仕方が微妙で
ItemListActivity.java で setContentView(R.layout.activity_item_list) すると
タブレットでは R.layout.activity_item_twopane が読み込まれて
そのレイアウトの中に R.id.item_detail_container な View があるかで
スマートフォンとタブレットのレイアウトを振り分けています。
setContentView(R.layout.activity_item_list);

if(findViewById(R.id.item_detail_container) != null){
    mTwoPane = true;
}

タブレットかどうかの判定と View の実装は分離しておきたいので
タブレットかどうかのフラグをリソースに定義することにします。
Yukiの枝折: Android:タブレットorスマートフォンのフラグをリソースに定義する
<resources>
    <bool name="isTablet">false</bool>
</resources>
<resources>
    <bool name="isTablet">true</bool>
</resources>

ItemListActivity.java ではこのフラグを参照して処理をわけます。
レイアウトもこのフラグで振り分けます。

public class ItemListActivity extends ActionBarActivity implements ItemListFragment.Callbacks{

    private boolean isTablet;

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        isTablet = getResources().getBoolean(R.bool.isTablet);
        setContentView(isTablet ? R.layout.activity_item_twopane : R.layout.activity_item_list);

        if(isTablet){
            getSupportActionBar().setDisplayShowHomeEnabled(false);
            getSupportActionBar().setDisplayUseLogoEnabled(false);

            ItemListFragment itemListFragment = (ItemListFragment)getSupportFragmentManager().findFragmentById(R.id.item_list);
            itemListFragment.setActivateOnItemClick(true);
            onItemSelected(0);
        }
    }

    @Override
    public void onItemSelected(int position){
        if(isTablet){
            Bundle arguments = new Bundle();
            arguments.putInt(ItemDetailFragment.ARG_ITEM_ID, position);
            ItemDetailFragment fragment = new ItemDetailFragment();
            fragment.setArguments(arguments);
            getSupportFragmentManager().beginTransaction()
                .replace(R.id.item_detail_container, fragment)
                .commit();
        }else{
            Intent detailIntent = new Intent(this, ItemDetailActivity.class);
            detailIntent.putExtra(ItemDetailFragment.ARG_ITEM_ID, position);
            startActivity(detailIntent);
        }
    }
}
wada811/Android-Material-Design-Colorsサンプルアプリ
Android Studio の Wizard の Master Detail パターンを元に
上記の変更を加えたアプリになっているので参考になるかもしれません。
ソースコードはこちら↓
Android-Material-Design-Colors/sample at master · wada811/Android-Material-Design-Colors

2014年に @wada811 が読んだ技術書まとめ

2014年も終わりに近づいているので@wada811が読んだ技術書を振り返ってみようかと思います。
2013年はこちら→2013年に @wada811 が読んだ技術書まとめ | DevAchieve(11冊)
2012年はこちら→2012年に @wada811 が読んだ技術書まとめ | DevAchieve(約40冊)

2014/05/07 [書評]ノンデザイナーズ・デザインブック | DevAchieve

色々な所で読んでおくべきデザイン本として紹介されている本です。
4つの基本原則も良いけど、個人的にはジョシュア・ツリーの悟りの話が好きです。
一度名前を呼ぶことができれば、
あなたはそれを意識し、それを支配し、それを所有し、
それをコントロールできるようになる。
名前大事ですね。

1年で書籍1冊の書評を書いた!

全然読んでないけど大丈夫か、という感じだ…。
Linuxエンジニア養成読本は職場にあったので読んだけど
【改訂新版】Linuxエンジニア養成読本が出ていた。
他の事に時間使っていて本読んでない…。

2014年に @wada811 が積んだ技術書まとめ

増補改訂版Java言語で学ぶデザインパターン入門
増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編
JUnit実践入門 体系的に学ぶユニットテストの技法
レガシーコード改善ガイド
Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築

重い本ばっかり積んでる…。
手を動かしつつ、ちゃんと本も読んでいきたい。
2014/12/09

Scala + sbt + Sublime Text で 始める Play2

インストール

Homebrew で scala, sbt, play をインストール

$ brew install scala
$ brew install sbt
$ brew install play

$ scala -version
Scala code runner version 2.11.1 -- Copyright 2002-2013, LAMP/EPFL
$ sbt --version
sbt launcher version 0.13.5
$ play
[info] Loading global plugins from /Users/ssl001/.sbt/0.13/plugins
[info] Loading project definition from /Users/ssl001/Documents/workspace_play/hello-play/project
[info] Set current project to hello-play (in build file:/Users/ssl001/Documents/workspace_play/hello-play/)
           _
     _ __ | | __ _ _  _
    | '_ \| |/ _' | || |
    |  __/|_|\____|\__ /
    |_|            |__/

play 2.2.3 built with Scala 2.10.3 (running Java 1.6.0_65), http://www.playframework.com

Sublime Text 3 で sublimescala/sublime-ensime をインストール

Cmd+Shift+P -> Package Control: Install Package

Ensime

ENSIME Server (ensime/ensime-src)をインストール

Download releases

$ cd ~/Library/Application Support/Sublime Text 3/Packages/Ensime
$ mkdir Server
$ mv ~/Downloads/ensime_2.10.0-0.9.8.9/* Server

sbt に Ensime プラグイン(ensime/ensime-sbt-cmd)を追加

~/.sbt/0.13/plugins/plugin.sbt に以下を追加(ファイルがなければ作成)

addSbtPlugin("org.ensime" % "ensime-sbt-cmd" % "0.1.2")

sbtコマンドによる.ensimeファイルの作成

$ play new hello-play
$ cd hello-play
$ sbt
> ensime generate

以降、Sublime Text で Cmd+Shift+P -> Ensime: startup で補完が効くようになる


Sublime Text 3 で guillaumebort/play2-sublimetext2 をインストール

Cmd+Shift+P -> Package Control: Install Package

Play 2.0


Sublime Text 3 で jarhart/SublimeSBT をインストール

Cmd+Shift+P -> Package Control: Install Package

SublimeSBT


実行

Cmd+Shift+P -> SBT: Run


参考

最強!?Ensimeを利用したSublime Text3のScala開発環境(playでもliftでも) - Qiita
PANAXIOM — Sublime Text 2 with SBT and Play 2


感想

sublime-ensime と SublimeSBT の開発が止まっていてな…
快適とは言い難いので他の IDE を使った方が良いと思うんだ。

Ruby on Rails 開発環境構築 in Mac OS X Mavericks

久しぶりに Ruby on Rails で開発することになり、開発環境を再構築しました。
関連: Mac OSX10.8でrbenvを使ってRuby1.9とRails4.0をインストールする

HomeBrew を使用するので MacPorts の人は読み替えてください。
また、僕は zsh を使っているので bash の人も読み替えてください。
HomeBrew や zsh をインストールしようという人は以下の事が参考になるかと思います。
Homebrew + Homebrew-caskで Mac の開発環境を構築する | DevAchieve
MacにHomeBrewとzshを導入してみた | DevAchieve

rbenv と ruby-build のインストール

brew install rbenv
brew install ruby-build
# rbenv の初期化
eval "$(rbenv init -)"
source .zshrc
eval "$(rbenv init -)" で rbenv へのパスを通すのとコマンドの補完や引数の処理、rehash をしています。
echo "$(rbenv init -)" で処理内容を確認できます。

rehashとは、
rbenv -h で確認すると以下のように書かれています。
rehash: Rehash rbenv shims (run this after installing binaries)
gem とか入れたらやれってことでいいのだと思います。
gem を入れまくると重くなる?のか rehash が重くなることがあるらしいです。
猫好きモバイルアプリケーション開発者記録 rbenv init が重い問題に対する対処法
gem を(アン)インストールしたら自動で rehash してくれる gem があるのでこれを入れておくと良いかも。
ryansouza/rbenv-rehash - github

依存パッケージのインストール

brew install readline
brew link readline
brew install openssl
brew link openssl

Ruby をインストールする

CONFIGURE_OPTS="--with-readline-dir=/usr/local --with-openssl-dir=/usr/local" rbenv install 2.1.5
CONFIGURE_OPTS="--with-readline-dir=/usr/local --with-openssl-dir=/usr/local" rbenv install まで
入力して Tab で補完すればバージョンを指定できます。

rehash して使用するバージョンを指定する

rbenv rehash
rbenv global 2.1.5

バージョンを確認する

rbenv version
2.1.5 (set by /Users/wada/.rbenv/version)
ruby -v
ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-darwin13.0]

gem 管理システム bundler のインストール

Ruby のライブラリである gem をパッケージ管理できる Bundler をインストールします。
gem install bundler
基本的にシステムにgemをインストールせず、
bundler でプロジェクトごとに gem をインストールするのが環境をクリーンに保てて良いとされています。
Rails も bundler でインストールしたいと思います。

Rails をインストールする

% mkdir project
% cd project
% bundle init
Writing new Gemfile to /path/to/project/Gemfile
Rails プロジェクト作成する際にbundle initして Gemfile を作成します。
# A sample Gemfile
source "https://rubygems.org"

# gem "rails"
4行目のコメントアウトを外して以下のコマンドを実行すれば rails をインストールできます。
bundle install --path vendor/bundle
他の gem を追加するときも上のコマンドでプロジェクト内にインストールします。

bundle exec rails new .
bundler でインストールした gem は
プロジェクトのディレクトリで bundle exec を付けてコマンドを実行する必要があります。

参考
Ruby - システムのgemにrailsをインストールせずrails newする - Qiita

libiconv is missing. で gem install nokogiri が失敗する場合

Homebrew で libiconv とその依存パッケージをインストールします。
### For nokogiri
brew tap homebrew/dupes
brew install libiconv
brew install libxml2
brew install libxslt
brew link --force libxml2
brew link --force libxslt

nokogiri をインストールします。
gem install nokogiri -- --use-system-libraries
Bundler を使用している場合は以下のコマンドを実行します。
bundle config build.nokogiri --use-system-libraries
bundle install

参考
Ruby - bundle install でnokogiriをインストールしろと言われる - Qiita
OSX - Mac OS X Mavericksで”gem i nokogiri”失敗の解決方法 - Qiita
2014/12/05

Homebrew + Homebrew-caskで Mac の開発環境を構築する

Brewfile + Homebrew + Homebrew-caskで Mac の環境構築をするの更新版です。

パッケージ管理システム「Homebrew」とその拡張版「Homebrew Cask」を使って
Mac の開発環境を構築します。
Brewfile と brew bundle コマンドはサポートされなくなったので
brew-update コマンドを作成して、brew-update でインストール/アップデートを行うようにします。

Homebrew を導入する

Command Line Tools for Xcode をインストールする

Xcode をインストールする
まずは AppStore から Xcode をインストールして下さい。
Command Line Tools for Xcode をインストールする
[ Xcode > Open Developer Tool > More Developer Tools... ] をクリックすると
Downloads for Apple Developer ページが開くので
Command Line Tools for Xcode をダウンロードしてインストールします。
参考: MavericksでCommand Line Tools for Xcodeをインストールする - Qiita

Homebrew をインストールする

Terminal で以下のコマンドを実行します。
ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
参考: Homebrew — The missing package manager for OS X
Homebrew が正常にインストールできたか確認する
以下のコマンドを実行してエラーがあれば対処、再度実行します。
brew doctor

Homebrew-cask を導入する

Homebrew-cask をフォーミュラに追加する

Formula(フォーミュラ)は Homebrew で管理されているパッケージのことです。
Homebrew-cask は Homebrew では管理されていないので自分で追加する必要があります。
以下のコマンドで Homebrew-cask を Formula に追加することができます。
brew tap caskroom/cask
参考: これは便利!Homebrewに追加されたtapコマンドはリポジトリを追加して簡単にフォーミュラを増やせる | Macとかの雑記帳

Homebrew-cask をインストールする

Homebrew-cask を追加したら Homebrew の以下のコマンドでインストールします。
brew install brew-cask

おまけ: Homebrew-cask の使い方

アプリケーションを検索する
brew cask search chrome
google-chrome
アプリケーションをインストールする
brew cask install google-chrome
アプリケーションの実体は /opt/homebrew-cask/Caskroom に入り、
~/Applications にシンボリックリンクが作成されます。
それぞれのパスは以下のコマンドオプションで変更することができます。
--caskroom=/my/path, --appdir=/my/path
参考: homebrew-caskが良さそうなので導入してみた - About Digital
アプリケーションをアンインストールする
brew cask uninstall google-chrome
アプリケーションを更新する
brew cask update
古いアプリケーションを削除する
brew cask cleanup
その他の使い方
homebrew-cask/USAGE.md at master · caskroom/homebrew-cask

brew-update コマンドを作成して Homebrew パッケージを管理する

Brewfile を作成する

以下のようなファイルを作成します。
Install Packages と Install Applications の欄は自由にインストールしたいものを記述して下さい。
#!

# Update Homebrew
brew update

# Upgrade Formulas
brew upgrade

# Install HomebrewCask
brew tap caskroom/cask
brew install brew-cask

####################
# Install Packages #
####################

brew install zsh

########################
# Install Applications #
########################

brew cask install google-chrome

# Remove outdated versions
brew cleanup
brew cask cleanup
参考までに僕の brew-update にリンクをはっておきます。
dotfiles/brew-update at master · wada811/dotfiles

brew-update でインストール/アップデートする

パスの通った場所に brew-update を置いて、実行します。
brew bundle

さいごに

これで brew-update コマンドで Homebrew パッケージをインストール/アップデートできるようになりました。

タグ(RSS)