<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7766276970422268568</id><updated>2026-01-03T14:17:42.705+09:00</updated><category term="Android"/><category term="画像"/><category term="Bitmap"/><category term="Color Simpler"/><category term="WebApp"/><category term="AdMob"/><category term="AngularJS"/><category term="Camera"/><category term="Exif"/><category term="GitHub"/><category term="Google Play"/><category term="Homebrew"/><category term="Mac"/><category term="Twitter Bootstrap"/><category term="Yeoman"/><category term="アップデート"/><category term="拡大縮小"/><category term="開発"/><title type='text'>Starrow Devlog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.starrow.net/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7766276970422268568/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://blog.starrow.net/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>starrow</name><uri>http://www.blogger.com/profile/10261032427125713364</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>9</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7766276970422268568.post-5592788639748281446</id><published>2014-09-22T19:34:00.000+09:00</published><updated>2014-09-22T19:34:52.982+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="GitHub"/><category scheme="http://www.blogger.com/atom/ns#" term="拡大縮小"/><category scheme="http://www.blogger.com/atom/ns#" term="画像"/><title type='text'>[Android] 画像の拡大縮小サンプルをGitHubへコミットしました</title><content type='html'>少し前になりますが、GitHubへAndroidのサンプルコードをコミットしました。&lt;br /&gt;
&lt;br /&gt;
ScaleAnimationImageView&lt;br /&gt;
&lt;a href=&quot;https://github.com/starrow/ScaleAnimationImageView&quot;&gt;https://github.com/starrow/ScaleAnimationImageView&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
ImageViewを拡張していて、ピンチによる画像の拡大・縮小や&lt;br /&gt;
ダブルタップでオリジナルサイズ/画面フィットサイズの&lt;br /&gt;
アニメーションでの切り替えを実装しています。&lt;br /&gt;
&lt;br /&gt;
特徴はピンチによる拡大率が指定した範囲を超えると&lt;br /&gt;
拡大・縮小の反応が鈍くなり、指を離すと範囲内まで&lt;br /&gt;
アニメーションして戻るという点です。&lt;br /&gt;
&lt;br /&gt;
この動き自体はよく見かけるのですが、実装のサンプルとなると&lt;br /&gt;
意外と見つからなかったので、GitHubに上げることにしました。&lt;br /&gt;
&lt;br /&gt;
実装方法としては、ざっくりこんな感じです。&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;ImageViewに対してsetScaleType(ScaleType.MATRIX)&lt;/li&gt;
&lt;li&gt;GestureDetector, ScaleGestureDetectorを用いて&lt;br /&gt;スクロール・ダブルタップ・ピンチのイベントを取得し、&lt;br /&gt;matrixを計算してセット&lt;/li&gt;
&lt;li&gt;アニメーション時はonDrawの中で目標値と経過時間をもとに&lt;br /&gt;matrixを計算してセット&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
ソース全体は下記のリンクから見られます。&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://github.com/starrow/ScaleAnimationImageView/blob/master/src/net/starrow/scaleanimation/ScaleAnimationImageView.java&quot;&gt;https://github.com/starrow/ScaleAnimationImageView/blob/master/src/net/starrow/scaleanimation/ScaleAnimationImageView.java&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
350行くらいで非常にシンプルなので、さらなるカスタマイズも容易だと思います。&lt;br /&gt;
もしよければ使ってみてください。&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.starrow.net/feeds/5592788639748281446/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://blog.starrow.net/2014/09/android-github.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7766276970422268568/posts/default/5592788639748281446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7766276970422268568/posts/default/5592788639748281446'/><link rel='alternate' type='text/html' href='http://blog.starrow.net/2014/09/android-github.html' title='[Android] 画像の拡大縮小サンプルをGitHubへコミットしました'/><author><name>starrow</name><uri>http://www.blogger.com/profile/10261032427125713364</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7766276970422268568.post-3148377379546075932</id><published>2013-09-25T23:38:00.001+09:00</published><updated>2013-09-26T00:35:39.223+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AngularJS"/><category scheme="http://www.blogger.com/atom/ns#" term="Twitter Bootstrap"/><category scheme="http://www.blogger.com/atom/ns#" term="WebApp"/><title type='text'>[WebApp][AngularJS] Twitter BootstrapをAngularJS上でdirectiveとして使うライブラリ</title><content type='html'>Angular JS上で使えるUIライブラリとしてAngular UIというプロジェクトがあるのですが、その中にTwitter Bootstrapの一部ををAngularJSのdirectiveとして使えるようにしたものがあり、便利そうだったので導入してみました。&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://angular-ui.github.io/bootstrap/&quot; target=&quot;_blank&quot;&gt;Angular directives for Twitter&#39;s Bootstrap&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
自分はYeomanを用いて環境を構築していたので、Bowerでインストールしました。&lt;br /&gt;
その際の手順を以下に記しておきます。&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;
bower.jsonのdependenciesに&quot;angular-bootstrap&quot;: &quot;*&quot;を追加
&lt;pre class=&quot;brush: java&quot;&gt;&quot;dependencies&quot;: {
&amp;nbsp; &amp;nbsp; &quot;angular&quot;: &quot;~1.0.7&quot;,
&amp;nbsp; &amp;nbsp; &quot;..,
&amp;nbsp; &amp;nbsp; &quot;angular-bootstrap&quot;: &quot;*&quot;
&amp;nbsp; },&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;bower installを実行&lt;/li&gt;
&lt;pre class=&quot;commandline&quot;&gt;$ bower install
&lt;/pre&gt;
&lt;li&gt;index.htmlでjavascriptファイルを読み込む&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;&amp;lt;script src=&quot;bower_components/angular-bootstrap/ui-bootstrap-tpls.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&#39;ui.bootstrap&#39;モジュールをインポート&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;angular.module(&#39;HogeApp&#39;, [&#39;ui.bootstrap&#39;])&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
タブやプログレスバーといったよく使うUIパーツがdirectiveとして利用できるので、素早くUIを構築する際には重宝しそうですね。</content><link rel='replies' type='application/atom+xml' href='http://blog.starrow.net/feeds/3148377379546075932/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://blog.starrow.net/2013/09/webapp-bowerangular-bootstrap.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7766276970422268568/posts/default/3148377379546075932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7766276970422268568/posts/default/3148377379546075932'/><link rel='alternate' type='text/html' href='http://blog.starrow.net/2013/09/webapp-bowerangular-bootstrap.html' title='[WebApp][AngularJS] Twitter BootstrapをAngularJS上でdirectiveとして使うライブラリ'/><author><name>starrow</name><uri>http://www.blogger.com/profile/10261032427125713364</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7766276970422268568.post-4383609317038555678</id><published>2013-08-13T02:52:00.000+09:00</published><updated>2013-10-12T15:00:14.330+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AdMob"/><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="アップデート"/><title type='text'>[Android] AdMobライブラリをアップデートしたらClassNotFoundException</title><content type='html'>少し前にAndroid4.3が発表され、開発環境も新しくなっているだろうと思い久しぶりにAndroid SDK Managerを立ち上げて最新の状態にしたところ、アプリが起動直後にエラーで落ちるようになってしまいました。&lt;br /&gt;
&lt;br /&gt;
LogCatを見てみるとこんなログが(パッケージ名などは伏せてあります)。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;commandline&quot;&gt;java.lang.ClassNotFoundException: Didn&#39;t find class &quot;aaa.bbb.ccc.XyzActivity&quot; on path: DexPathList[[zip file &quot;/data/app/aaa.bbb.ccc-1.apk&quot;],nativeLibraryDirectories=[/data/app-lib/aaa.bbb.ccc-1, /vendor/lib, /system/lib]]&lt;/pre&gt;
&lt;br /&gt;
調べてみると、どうやらこれはSDKと一緒にアップデートしたAdMobのライブラリが関係していることがわかりました。&lt;br /&gt;
&lt;br /&gt;
実はこれ、以前にもはまったことがあり、自分への備忘録として解決方法を書いておきます。&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
AdMobライブラリのアップデート手順&lt;/h3&gt;
&lt;br /&gt;
AdMobのライブラリはバージョンが上がる度にjarのファイル名も変更されるため、その都度Java Build Pathも変更しなくてはなりません。&lt;br /&gt;
&lt;br /&gt;
1. Eclipse上でProject - Properties - Java Build PathでLibrariesのタブを選択&lt;br /&gt;
2. 古いjarをRemove, そしてAdd External jars...で新しいjarを指定&lt;br /&gt;
&lt;br /&gt;
これでビルドは通るようになるのですが、このままだと上記のエラーが発生してしまいます。&lt;br /&gt;
&lt;br /&gt;
1, 2の手順に加えて、&lt;br /&gt;
&lt;br /&gt;
3. Librariesの隣のOrder and Exportタブを選択&lt;br /&gt;
4. 2.で追加したjarのチェックボックスをON&lt;br /&gt;
&lt;br /&gt;
を行うことでエラーが解決しました。&lt;br /&gt;
&lt;br /&gt;
理由はよくわかっていないのですが、AdMobに限らずjarを追加する際は同様の現象が起こると思われますので、次回以降は気をつけようと思います。&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.starrow.net/feeds/4383609317038555678/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://blog.starrow.net/2013/08/android-admobclassnotfoundexception.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7766276970422268568/posts/default/4383609317038555678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7766276970422268568/posts/default/4383609317038555678'/><link rel='alternate' type='text/html' href='http://blog.starrow.net/2013/08/android-admobclassnotfoundexception.html' title='[Android] AdMobライブラリをアップデートしたらClassNotFoundException'/><author><name>starrow</name><uri>http://www.blogger.com/profile/10261032427125713364</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7766276970422268568.post-1839256104454445475</id><published>2013-08-10T22:18:00.000+09:00</published><updated>2013-08-16T16:25:28.872+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Homebrew"/><category scheme="http://www.blogger.com/atom/ns#" term="Mac"/><category scheme="http://www.blogger.com/atom/ns#" term="WebApp"/><category scheme="http://www.blogger.com/atom/ns#" term="Yeoman"/><title type='text'>[Mac][WebApp] HomebrewからのYeoman環境構築</title><content type='html'>前回の更新からかなり間が空いてしまいましたが、最近WebAppに興味を持ち始めていて、備忘録の意味も込めて環境構築について書いてみようと思います。&lt;br /&gt;
&lt;br /&gt;
WebAppを開発するにあたっては、ライブラリ・フレームワークの導入や雛形の作成など面倒なことが多々あるのですが、それらを自動化してくれるYeomanというツールがあると知りました。(&lt;a href=&quot;http://yeoman.io/&quot; target=&quot;_blank&quot;&gt;公式サイト&lt;/a&gt;によると、ツールではなくワークフローなんだそうです)&lt;br /&gt;
&lt;br /&gt;
このYeomanを導入するためにはrubyやnodeなどいくつかのソフトウェアが必要で、自分のMacBook Airには導入されていなかったりバージョンが古かったりしたので、最初にHomebrewを用いて必要なソフトウェアの導入から始めました。&lt;br /&gt;
&lt;br /&gt;
その際の手順やはまりポイントなどを以下に書いていこうと思います。&lt;br /&gt;
ちなみにOSのバージョンはMountain Lion(10.8.2)です。&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
Homebrewの導入&lt;/h4&gt;
&lt;br /&gt;
HomebrewとはUbuntuにおけるaptみたいなもので、様々なオープンソースソフトウェアのインストール/アンインストールを管理してくれます。&lt;br /&gt;
&lt;br /&gt;
Macでは同様のツールとしてMacPortsというものがあり、自分の環境にも入っていたのですが、最近はHomebrewが流行ってきているらしいので乗り換えてみました。&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
MacPortsのアンインストール&lt;/h3&gt;
&lt;br /&gt;
&lt;a href=&quot;http://abeerforyou.com/?p=334&quot; target=&quot;_blank&quot;&gt;こちらのページ&lt;/a&gt;を参考にさせていただきました。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;commandline&quot;&gt;$ sudo port -f uninstall installed
$ sudo rm -rf \
  /opt/local \
  /Applications/DarwinPorts \
  /Applications/MacPorts \
  /Library/LaunchDaemons/org.macports.* \
  /Library/Receipts/DarwinPorts*.pkg \
  /Library/Receipts/MacPorts*.pkg \
  /Library/StartupItems/DarwinPortsStartup \
  /Library/Tcl/darwinports1.0 \
  /Library/Tcl/macports1.0 \
  ~/.macports&lt;/pre&gt;
&lt;br /&gt;
&lt;h3&gt;
Homebrewのインストール&lt;/h3&gt;
&lt;br /&gt;
&lt;a href=&quot;http://brew.sh/&quot; target=&quot;_blank&quot;&gt;公式ページ&lt;/a&gt;には最初にいくつかの手順がありましたが、僕の環境ではいきなり下記のコマンドでいけました。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;commandline&quot;&gt;$ ruby -e &quot;$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)&quot;
&lt;/pre&gt;
&lt;br /&gt;
Homebrewでは/usr/local/binの下に実行ファイルがインストールされるので、.bashrcに下記を追加してPATHを通します。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;commandline&quot;&gt;export PATH=/usr/local/bin:$PATH
&lt;/pre&gt;
&lt;br /&gt;
&lt;h4&gt;
Yeomanの導入&lt;/h4&gt;
&lt;div&gt;
&lt;br /&gt;
Yeomanを導入する準備として、Nodeのパッケージ管理システムであるnpm、CSSフレームワークのCompassが必要となります。&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;h3&gt;
Ruby, Nodeのインストール&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;
先ほど導入したHomebrewを用いてインストールします。&lt;/div&gt;
&lt;div&gt;
rubyは元々入っていましたが、Homebrewで最新のバージョンにしました。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre class=&quot;commandline&quot;&gt;$ brew install ruby
$ brew install node
&lt;/pre&gt;
&lt;br /&gt;
&lt;h3&gt;
Compassのインストール&lt;/h3&gt;
&lt;br /&gt;
&lt;a href=&quot;http://m.designbits.jp/13032511/&quot; target=&quot;_blank&quot;&gt;こちらのページ&lt;/a&gt;を参考にさせていただきました。&lt;br /&gt;
Rubyのパッケージ管理システムであるRubyGemsを利用します。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;commandline&quot;&gt;$ sudo gem update --system
$ sudo gem install sass
$ sudo gem install compass
&lt;/pre&gt;
&lt;br /&gt;
&lt;h3&gt;
Yeoman環境構築&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;a href=&quot;http://qiita.com/sys1yagi/items/4d8c2994580c274fd3fa&quot; target=&quot;_blank&quot;&gt;こちらのページ&lt;/a&gt;を参考にさせていただきました。&lt;/div&gt;
&lt;div&gt;
npmを用いて3つのパッケージをインストールします。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;commandline&quot;&gt;$ sudo npm install -g yo grunt-cli bower&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Yeomanにはテンプレートがいくつもあるのですが、今回はAngularJSのテンプレを導入しました。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;commandline&quot;&gt;$ sudo npm install -g generator-angular&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
そして適当なディレクトリを作成し、プロジェクトの雛形を作成します。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre class=&quot;commandline&quot;&gt;$ mkdir &amp;lt;dir&amp;gt;
$ cd &amp;lt;dir&amp;gt;
$ yo angular&lt;/pre&gt;
&lt;br /&gt;
&lt;div&gt;
いくつか質問されますが、とりあえずどう答えても構いません。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;
実行してみる&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;
さて、環境が整ったので、試しにアプリを起動してみます。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;commandline&quot;&gt;$ grunt server&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
しかし、下記のようなWarningが出て失敗してしまいました。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;commandline&quot;&gt;Warning: You need to have Ruby and Compass installed and in your system PATH for this task to work. More info: https://github.com/gruntjs/grunt-contrib-compass Use --force to continue.&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
調べてみたら、どうやらcompassにパスが通っていないということがわかりました。&lt;/div&gt;
&lt;div&gt;
gemでインストールされるコマンドのパスは下記のようにして調べられました。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;commandline&quot;&gt;$ gem env&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
この結果の&quot;EXECUTABLE DIRECTORY&quot;にcompassが存在していたので、パスを通して再び grunt server を実行してみると、無事に起動しました。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
YeomanはLiveReloadやファイルの圧縮など、便利な機能がたくさんありそうなので、これから色々と試してみようと思います。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://blog.starrow.net/feeds/1839256104454445475/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://blog.starrow.net/2013/08/macwebapp-homebrewyeoman.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7766276970422268568/posts/default/1839256104454445475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7766276970422268568/posts/default/1839256104454445475'/><link rel='alternate' type='text/html' href='http://blog.starrow.net/2013/08/macwebapp-homebrewyeoman.html' title='[Mac][WebApp] HomebrewからのYeoman環境構築'/><author><name>starrow</name><uri>http://www.blogger.com/profile/10261032427125713364</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7766276970422268568.post-1904153525220818053</id><published>2012-06-19T19:08:00.000+09:00</published><updated>2013-08-16T16:24:14.381+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="Color Simpler"/><category scheme="http://www.blogger.com/atom/ns#" term="開発"/><title type='text'>[Android] 多様な機種に対応することの難しさ</title><content type='html'>前回の記事で&lt;a href=&quot;https://play.google.com/store/apps/details?id=net.starrow.colorsimpler&quot; target=&quot;_blank&quot;&gt;Color Simperアプリ&lt;/a&gt;をリリースしたと書いたのですが、公開後に特定の機種での不具合が発覚し、再度リリースすることになりました。&lt;br /&gt;
&lt;br /&gt;
今回はたまたま知り合いにインストールして試してもらった際にわかったのですぐに修正することができたのですが、危うく放置してしまうところでした…&lt;br /&gt;
&lt;br /&gt;
実際Google Play上でいろんなアプリのレビューを見ていると自分の機種では動かなかったという内容の書き込みをたまに見かけます。&lt;br /&gt;
&lt;br /&gt;
Androidの機種数の多さについてこんな記事がありました。&lt;br /&gt;
&lt;br /&gt;
WIRED.jp&lt;br /&gt;
&lt;a href=&quot;http://wired.jp/2012/05/29/android-fragmentation-one-developer-encounters-3997-devices/&quot; target=&quot;_blank&quot;&gt;機種数3,997：「断片化」を続けるAndroid&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
以前から言われ続けていることではありますが、Androidはオープンなプラットフォームなので各メーカーがユーザーのニーズに応じて多彩な機種を開発できるというメリットがある一方、機種ごとの差が開きすぎるとアプリ開発者の動作検証の負担が増大し、ユーザーの端末上での不具合発生率も高くなるというデメリットがあります。&lt;br /&gt;
&lt;br /&gt;
特に個人で開発を行う場合はテストできる端末が限られてしまうため機種依存の不具合の発見は難しい問題となるのですが、そういう背景もあってかテストに関する議論が盛り上がっているようですね。&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://sites.google.com/site/androidtestclub/atecfes&quot; target=&quot;_blank&quot;&gt;Androidテスト祭り&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Androidで開発をしていく以上この問題は避けて通れないので、僕としてもまだこれといった方法は浮かんでいないのですが試行錯誤しながら対策を考えていこうと思います。&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.starrow.net/feeds/1904153525220818053/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://blog.starrow.net/2012/06/android.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7766276970422268568/posts/default/1904153525220818053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7766276970422268568/posts/default/1904153525220818053'/><link rel='alternate' type='text/html' href='http://blog.starrow.net/2012/06/android.html' title='[Android] 多様な機種に対応することの難しさ'/><author><name>starrow</name><uri>http://www.blogger.com/profile/10261032427125713364</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7766276970422268568.post-764094792876967880</id><published>2012-06-13T03:45:00.000+09:00</published><updated>2013-08-16T16:23:26.526+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="Color Simpler"/><category scheme="http://www.blogger.com/atom/ns#" term="Google Play"/><title type='text'>[Android] Color SimplerアプリをGoogle Playへリリースしました</title><content type='html'>先日、Color Simplerという画像処理アプリをGoogle Playに登録しました。&lt;br /&gt;
&lt;br /&gt;
リンクはこちらになります。&lt;br /&gt;
&lt;a href=&quot;https://play.google.com/store/apps/details?id=net.starrow.colorsimpler&quot;&gt;https://play.google.com/store/apps/details?id=net.starrow.colorsimpler&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
このアプリは画像から特定の色だけ残して他をグレーアウトするという、いわゆるパートカラーを実現するためのもので、「プレミアムモルツ画像が簡単につくれる」をコンセプトに開発しました。&lt;br /&gt;
&lt;br /&gt;
できる限り手順を簡単にしたつもりなので、気軽に使ってみてください。&lt;br /&gt;
&lt;br /&gt;
開発中なかなか時間が取れなかったりメモリの問題ではまったりして思いの外時間がかかってしまい、ブログの更新が滞ってしまったので、はまったポイントなどを今後書いていこうと思っています。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ところで、今回アプリを登録するためにGoogle Playへ開発者登録をしたのですが、その際にちょっとしたトラブルがありました。&lt;br /&gt;
&lt;br /&gt;
はじめ「Google Play への登録はまだ処理中です。」の画面が消えず、結局2日後くらいにキャンセルされてしまったのです。&lt;br /&gt;
&lt;br /&gt;
このままではアプリを公開できないので、クレジットカード情報を再度記入して登録したところ2回目は1日くらいで受理されました。&lt;br /&gt;
&lt;br /&gt;
詳しいことはわからないのですが、1回目はカード情報を間違えていたのかもしれません。 &lt;br /&gt;
何はともあれ、無事アプリをリリースすることができてよかったです。&lt;br /&gt;
&lt;br /&gt;
これからアップデートや別のアプリの開発も続けていこうと思いますのでよろしくお願いします。</content><link rel='replies' type='application/atom+xml' href='http://blog.starrow.net/feeds/764094792876967880/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://blog.starrow.net/2012/06/android-color-simpler.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7766276970422268568/posts/default/764094792876967880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7766276970422268568/posts/default/764094792876967880'/><link rel='alternate' type='text/html' href='http://blog.starrow.net/2012/06/android-color-simpler.html' title='[Android] Color SimplerアプリをGoogle Playへリリースしました'/><author><name>starrow</name><uri>http://www.blogger.com/profile/10261032427125713364</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7766276970422268568.post-5358205437743172346</id><published>2012-03-24T01:28:00.001+09:00</published><updated>2014-09-22T19:35:19.441+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="Bitmap"/><category scheme="http://www.blogger.com/atom/ns#" term="Camera"/><category scheme="http://www.blogger.com/atom/ns#" term="画像"/><title type='text'>[Android] intentでカメラアプリを呼び出し画像を取得する</title><content type='html'>前回は端末内の画像を読み込む処理について書きましたが、今回はカメラアプリを起動して撮影した画像を取得する処理についてです。&lt;br /&gt;
&lt;br /&gt;
まずはカメラを起動するところから。 &lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(intent, 0);
&lt;/pre&gt;
&lt;br /&gt;
これでカメラアプリが立ち上がり、撮影すると呼び出し元のアプリへ戻りonActivityResultが呼ばれます。&lt;br /&gt;
&lt;br /&gt;
カメラアプリが複数登録されている場合はどれを起動するか選択できるのですが、ここからは標準のカメラアプリを起動した場合について扱っていきます。&lt;br /&gt;
&lt;br /&gt;
カメラを起動するということは画像を取得したい場合がほとんどだと思うのですが、標準のカメラアプリではintentのExtraDataにMediaStore.EXTRA_OUTPUTを指定したかどうかによって画像の取得の仕方が変わります。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;&lt;b&gt;MediaStore.EXTRA_OUTPUTなしの場合&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
こちらは簡単で、下記のようにすれば取得できます。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == Activity.RESULT_OK) {
            Bitmap bitmap = (Bitmap)data.getExtras().get(&quot;data&quot;);
        }
    }
&lt;/pre&gt;
&lt;br /&gt;
ただし、このやり方で取得できるBitmapは縮小されていて、ソースを読むと50 * 1024ピクセルまでに制限されています。（android-2.3.7_r1.0時点）&lt;br /&gt;
&lt;br /&gt;
これはAndroidの作法としてintentのExtraDataにはあまり大きなデータを入れるべきではないからだと思います。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;&lt;b&gt;MediaStore.EXTRA_OUTPUTありの場合&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
こちらの場合は、自分で指定したUriに画像を書き込ませることができます。&lt;br /&gt;
サイズはオリジナルのままです。 &lt;br /&gt;
&lt;br /&gt;
あらかじめ&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;        mSaveUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory() + &quot;/tmp.jpg&quot;));
        intent.putExtra(MediaStore.EXTRA_OUTPUT, mSaveUri);
&lt;/pre&gt;
&lt;br /&gt;
のように指定してカメラを立ち上げると、mSaveUriのパスにJPEG画像として保存してくれます。&lt;br /&gt;
mSaveUriは自分で定義したUriのオブジェクト変数です。 &lt;br /&gt;
&lt;br /&gt;
ちなみに、標準のカメラアプリは撮影した際の時刻をもとにファイル名をつけてsdcardに保存している（android-2.3.7_r1.0時点）のですが、これと同じディレクトリ、同じ命名ルールで保存させたい場合は下記のように指定してやるとできます。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;        final Date date = new Date(System.currentTimeMillis());
        final SimpleDateFormat dataFormat = new SimpleDateFormat(&quot;&#39;IMG&#39;_yyyyMMdd_HHmmss&quot;);
        final String filename = dataFormat.format(date) + &quot;.jpg&quot;;
        mSaveUri =
                Uri.fromFile(new File(Environment.getExternalStorageDirectory().toString()
                        + &quot;/DCIM/Camera&quot;, filename));
&lt;/pre&gt;
&lt;br /&gt;
注意点としては、mSaveUriはそのままではMediaStoreのDBに登録されないため、何もしないと撮った画像がギャラリーなどの画像閲覧アプリに表示されません。&lt;br /&gt;
&lt;br /&gt;
ここに関しては、下記のサイトが参考になると思います。&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://d.hatena.ne.jp/gabuchan/20101125/1290681748&quot; target=&quot;_blank&quot;&gt;インテントでカメラを呼び出す方法の補足&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
今回と前回の内容を合わせると、画像を読み込む際にギャラリーとカメラのどちらからでも読み込めるようになります。&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.starrow.net/feeds/5358205437743172346/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://blog.starrow.net/2012/03/android-intent.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7766276970422268568/posts/default/5358205437743172346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7766276970422268568/posts/default/5358205437743172346'/><link rel='alternate' type='text/html' href='http://blog.starrow.net/2012/03/android-intent.html' title='[Android] intentでカメラアプリを呼び出し画像を取得する'/><author><name>starrow</name><uri>http://www.blogger.com/profile/10261032427125713364</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7766276970422268568.post-7026521152602767902</id><published>2012-03-01T04:07:00.000+09:00</published><updated>2014-09-22T19:35:35.688+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="Bitmap"/><category scheme="http://www.blogger.com/atom/ns#" term="Exif"/><category scheme="http://www.blogger.com/atom/ns#" term="画像"/><title type='text'>[Android] 端末内の画像を読み込みViewに合わせて回転・縮小する</title><content type='html'>現在開発中のAndroidアプリで端末内の画像をBitmapとして読み込む際に、回転や縮小といった処理を実装したのでそのことについて書きたいと思います。&lt;br /&gt;
&lt;br /&gt;
今回のコードで行なっていることは以下の4つです。&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;端末内の画像のUriを取得&lt;/li&gt;
&lt;li&gt;Uriから画像データをBitmapとして読み込み&lt;/li&gt;
&lt;li&gt;Exifの回転情報を反映&lt;/li&gt;
&lt;li&gt;BitmapをセットするViewに合わせてサイズを縮小&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
まず端末内の画像を選択しそのUriを取得する部分ですが、これは以下の方法が非常に便利でした。&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.cozzbox.com/wordpress/archives/210&quot;&gt;【Android】Galleryを使ってSDカード内の画像をリスト表示する | cozzbox&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setType(&quot;image/*&quot;);
        startActivityForResult(intent, 0);&amp;nbsp;&lt;/pre&gt;
&lt;br /&gt;
こうするとonActivityResultのdataにUriが格納されて返ってきます。&lt;br /&gt;
画像を選択するGridView等を自前で実装しなくて済むので助かりますね。&lt;br /&gt;
&lt;br /&gt;
続いて得られたUriを用いてBitmapを作成し、回転・縮小する部分（上記の2.～4.の処理）のコードです。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;    private Bitmap loadBitmap(Uri uri, int viewWidth, int viewHeight) {
        // Uriから画像を読み込みBitmapを作成
        Bitmap originalBitmap = null;
        try {
            originalBitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // MediaStoreから回転情報を取得
        final int orientation;
        Cursor cursor = MediaStore.Images.Media.query(getContentResolver(), uri, new String[] {
            MediaStore.Images.ImageColumns.ORIENTATION
        });
        if (cursor != null) {
            cursor.moveToFirst();
            orientation = cursor.getInt(0);
        } else {
            orientation = 0;
        }

        final int originalWidth = originalBitmap.getWidth();
        final int originalHeight = originalBitmap.getHeight();

        // 縮小割合を計算
        final float scale;
        if (orientation == 90 || orientation == 270) {
            scale = Math.min((float)viewWidth / originalHeight, (float)viewHeight / originalWidth);
        } else {
            scale = Math.min((float)viewWidth / originalWidth, (float)viewHeight / originalHeight);
        }

        // 変換行列の作成
        final Matrix matrix = new Matrix();
        if (orientation != 0) {
            matrix.postRotate(orientation);
        }
        if (scale &amp;lt; 1.0f) {
            matrix.postScale(scale, scale);
        }

        // 行列によって変換されたBitmapを返す
        return Bitmap.createBitmap(originalBitmap, 0, 0, originalWidth, originalHeight, matrix,
                true);
    }
&lt;/pre&gt;
&lt;br /&gt;
回転情報の取得に関しては、下記の記事を参考にさせて頂きました。&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.google.co.jp/url?sa=t&amp;amp;rct=j&amp;amp;q=mediastore.images.imagecolumns.orientation&amp;amp;source=web&amp;amp;cd=1&amp;amp;ved=0CCYQFjAA&amp;amp;url=http%3A%2F%2Fyusukezzz.net%2Fblog%2Farchives%2F1984&amp;amp;ei=x2lOT6iwB-mWiQfYouBW&amp;amp;usg=AFQjCNEzxdKrnjHsXVBJ5p8sauCVgXE2JQ&amp;amp;sig2=TwDGPsnBQvkVCYhhhw1TNw&amp;amp;cad=rjt&quot;&gt;画像の向き(Orientation)を取得 | ゆーすけぶろぐ&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.google.co.jp/url?sa=t&amp;amp;rct=j&amp;amp;q=mediastore.images.imagecolumns.orientation&amp;amp;source=web&amp;amp;cd=3&amp;amp;ved=0CDUQFjAC&amp;amp;url=http%3A%2F%2Fcheebow.info%2Fchemt%2Farchives%2F2011%2F02%2Fandorid_thumbnail.html&amp;amp;ei=x2lOT6iwB-mWiQfYouBW&amp;amp;usg=AFQjCNEFJKbFvZOP_b29KFtkVbigKweGUQ&amp;amp;sig2=8urom9y7UK7_pGzA6mQQ-g&amp;amp;cad=rjt&quot;&gt;ヒビノアワ: andoridでサムネイル画像を正しい向きで表示する&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ここでのポイントは、回転方向によって縮小割合の計算の仕方が変わるという点です。&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;画像が90度, もしくは270度（横向き）の場合&lt;br /&gt;→Viewの幅と画像の高さ、Viewの高さと画像の幅の割合を計算&lt;/li&gt;
&lt;li&gt;上記以外（縦向き）の場合&lt;br /&gt;→Viewの幅と画像の幅、Viewの高さと画像の高さの割合を計算 &lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Bitmapの貼り付け先としてImageViewを用いず、自前でCanvasに描画する場合などに使えるかなと思いますので、もしよければ参考にしてみてください。&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.starrow.net/feeds/7026521152602767902/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://blog.starrow.net/2012/03/android-view.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7766276970422268568/posts/default/7026521152602767902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7766276970422268568/posts/default/7026521152602767902'/><link rel='alternate' type='text/html' href='http://blog.starrow.net/2012/03/android-view.html' title='[Android] 端末内の画像を読み込みViewに合わせて回転・縮小する'/><author><name>starrow</name><uri>http://www.blogger.com/profile/10261032427125713364</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7766276970422268568.post-3016232525102862314</id><published>2012-02-29T04:33:00.000+09:00</published><updated>2013-08-16T16:19:38.843+09:00</updated><title type='text'>ブログ開設しました</title><content type='html'>初めまして、当ブログ管理人のstarrowです。&lt;br /&gt;
&lt;br /&gt;
現在メーカーでソフトウェアエンジニアとして勤務しています。&lt;br /&gt;
&lt;br /&gt;
僕は文章を書くことがものすごく苦手で、ブログなんて絶対に無理と思っていたのですが、そんな自分を克服するため、また自分の知識を他人と共有するため一念発起してブログを開設することにしました。&lt;br /&gt;
&lt;br /&gt;
ところどころ言い回しがおかしいところがあるかと思いますが大目に見てやってくださいw&lt;br /&gt;
&lt;br /&gt;
内容としては、主にプログラミングやコンピュータ関係のことについて自分用の備忘録も兼ねて書いていきたいと思っています。&lt;br /&gt;
&lt;br /&gt;
さしあたっては現在Androidアプリを開発中ですので、Androidに関連した記事を書いていくつもりです。&lt;br /&gt;
&lt;br /&gt;
役に立つ記事を書いていくよう心掛けていきますので、よろしくお願いします！</content><link rel='replies' type='application/atom+xml' href='http://blog.starrow.net/feeds/3016232525102862314/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://blog.starrow.net/2012/02/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7766276970422268568/posts/default/3016232525102862314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7766276970422268568/posts/default/3016232525102862314'/><link rel='alternate' type='text/html' href='http://blog.starrow.net/2012/02/blog-post.html' title='ブログ開設しました'/><author><name>starrow</name><uri>http://www.blogger.com/profile/10261032427125713364</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>