tag:blogger.com,1999:blog-39437038609324111782024-03-05T20:48:55.355+09:00tsuyoshi's notesAnonymoushttp://www.blogger.com/profile/03507965371868379066noreply@blogger.comBlogger14125tag:blogger.com,1999:blog-3943703860932411178.post-41229564876995163002018-03-14T11:30:00.000+09:002018-03-14T11:30:26.897+09:00移転しましたBloggerだとMarkdownで書けなくて辛いのではてなブログに移転しました。<br />
移転先: <a href="http://tsuyosh.hatenablog.com/">http://tsuyosh.hatenablog.com/</a><br />
<br />
昔の記事はこのままにしておきます。Anonymoushttp://www.blogger.com/profile/03507965371868379066noreply@blogger.com0tag:blogger.com,1999:blog-3943703860932411178.post-22924803193022688572017-12-31T20:29:00.001+09:002017-12-31T22:09:07.627+09:002017年を雑に振り返ってみたTwitterのTLを見てて振り返りの記録を残そうと思い立ったので雑に書きました。来年はちゃんと記録を残そう...<br />
<br />
<h2>
お仕事面での1年間</h2>
<br />
<h3>
某デバイス向けAndroidアプリ開発</h3>
年頭から8月までやってました。<br />
モデルチェンジに伴う新機能の実装がメインでした。<br />
<br />
もう2015年からやってるアプリなのでそこまで炎上はしませんでしたがなんだかんだで500コミット位コードを書いてました。<br />
<br />
去年の開発では難航したためにDroidKaigi 2016の参加を諦めた辛い記憶があったので1,2月は猛烈に開発を進めて何とか参加できたのはいい思い出?かもしれません。<br />
<br />
この頃からAndroidアプリのアーキテクチャをちゃんと考えないとなぁということでMVPとかMVVMとかDDDとかについて調べだしました。<br />
<br />
<h3>
ソーシャルメディアの分析サービスっぽいの開発</h3>
6月〜11月ぐらいまで<br />
<br />
TwitterとかInstagramとかソーシャルメディアのツールですがお客さんの要望やイベント対応に合わせて新機能開発をやってました。サービス自体は去年位に始まってたんですが久々にLaravelを触りました。<br />
<br />
<h3>
某アプリのリニューアル開発</h3>
9月〜現在進行中<br />
<br />
2つの類似するサービス向け(flavorで分けてます)のアプリとそのタブレット対応の開発をしています。フルKotlin & MVVM & Android Clean Architectureの考え方を取り入れて少し今風になりました。(FluxとかAACとかはまだ<br />
<br />
現在スマホ版アプリ開発の佳境です。年内リリース目標だったんですが残念ながら年を越しそうです。DroidKaigi 2018までには終わってるといいけどなぁ...(´・ω・`)<br />
<br />
<h2>
発表</h2>
potatotips #41で"Android Font Updates"という題目で発表させていただきました。<br />
<a href="https://speakerdeck.com/tsuyosh/android-font-updates">https://speakerdeck.com/tsuyosh/android-font-updates</a><br />
<h2>
映画</h2>
34本くらい観てました。印象に残ったのは<br />
<br />
<ul>
<li>ザ・コンサルタント</li>
<li>ラ・ラ・ランド</li>
<li>3月のライオン 前編&後編</li>
<li>夜は短し歩けよ乙女</li>
<li>メアリと魔女の花</li>
<li>ジョン・ウィック:チャプター2</li>
<li>ダンケルク</li>
<li>アウトレイジ 最終章</li>
<li>ベイビー・ドライバー</li>
<li>アトミック・ブロンド</li>
<li>gifted</li>
<li>スター・ウォーズ VIII 最後のジェダイ</li>
</ul>
<br />
を挙げときます。時間あったらもっと色々観たかった(´・ω・`)<br />
<br />
<h2>
アニメ</h2>
ネットでほぼリアルタイムで見れるようになって便利になりましたよね。<br />
<br />
<ul>
<li>Little Witch Academia</li>
<li>ボールルームへようこそ</li>
</ul>
<div>
<br /></div>
<br />
<h2>
来年の目標</h2>
<br />
<ul>
<li>転職&移住</li>
<li>体重を落とす</li>
<li>DroidKaigiにCfPを出したい</li>
<li>ISUCONに参加したい</li>
</ul>
<br />
<br />
来年は今年以上に充実した年でありますように...<br />
<div>
<br /></div>
Anonymoushttp://www.blogger.com/profile/03507965371868379066noreply@blogger.com0tag:blogger.com,1999:blog-3943703860932411178.post-52660127906560683082012-10-28T03:32:00.002+09:002012-10-28T04:09:04.344+09:00Sony Smart Wireless Headset pro購入前機種の<a href="http://www.sonymobile.co.jp/product/accessories/mw600/" target="_blank">MW600</a>のバッテリーがへたってきたので新機種の<a href="http://www.sonymobile.co.jp/product/accessories/mw1/" target="_blank">MW1</a>を購入しました。<br />
<br />
<iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&nou=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=myblog0985-22&o=9&p=8&l=as4&m=amazon&f=ifr&ref=ss_til&asins=B008IBG3TA" style="height: 240px; width: 120px;"></iframe><br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhov4TBlkXUzEPDsNLq101BP2ykNsDPW8iAs_7R4a69YWhnMtMzSZ1dJknBlJ3imOnq5mxE3hSU8w0rb2QmHQN61OKnGmwbIOMSx-gI0FrUSqr_MdYId2LgxSm7V6Ntarepgc1of6mfUbls/s1600/2012-10-26+14.06.18.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhov4TBlkXUzEPDsNLq101BP2ykNsDPW8iAs_7R4a69YWhnMtMzSZ1dJknBlJ3imOnq5mxE3hSU8w0rb2QmHQN61OKnGmwbIOMSx-gI0FrUSqr_MdYId2LgxSm7V6Ntarepgc1of6mfUbls/s320/2012-10-26+14.06.18.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">左がMW1で右がMW600</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt3Uizo5QNId2yoMV80IjNaocaix5NYkc7DiXMKFBv1nAXabmW9Dlhfy_axL_cv9MmeBlUbA9aZ0pATE_F63jgPev4twx3oYdRptpf3-qLAKgQGnrjAUl6UaXoOHbGN60eO2941_mp7EC3/s1600/2012-10-26+17.21.06.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt3Uizo5QNId2yoMV80IjNaocaix5NYkc7DiXMKFBv1nAXabmW9Dlhfy_axL_cv9MmeBlUbA9aZ0pATE_F63jgPev4twx3oYdRptpf3-qLAKgQGnrjAUl6UaXoOHbGN60eO2941_mp7EC3/s320/2012-10-26+17.21.06.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">裏面。SONYロゴの部分がクリップになっている</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLpfLI2YnRZRJIIutN-bKfvUFKswMq-LCSDv2mfMYBBov5zpzAZAuWfQIVon0QGpj7jdE_UYuGA1Mq6tPqNsZ4OLnVISeQDzjwTQ2oignZ9NfgGLkzT3lmG0z5nzER97_c6MHvqFCyqgz5/s1600/2012-10-26+17.21.19.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLpfLI2YnRZRJIIutN-bKfvUFKswMq-LCSDv2mfMYBBov5zpzAZAuWfQIVon0QGpj7jdE_UYuGA1Mq6tPqNsZ4OLnVISeQDzjwTQ2oignZ9NfgGLkzT3lmG0z5nzER97_c6MHvqFCyqgz5/s320/2012-10-26+17.21.19.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">表面。右側のmicroSDは付属品(4GB)です。</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6_zhNkY0LRka103wAEnXH33jE7NonbMJB9OU3tvLb-M4v_JKg0QHBkch-TRVZr_n75uwbXM3tnScxkio1wcUqwMviMl9miflnp8NhM36GG9ASMmWH_nGjvUx6N_FeycsjA-ROwdSh9K0o/s1600/2012-10-26+17.21.42.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6_zhNkY0LRka103wAEnXH33jE7NonbMJB9OU3tvLb-M4v_JKg0QHBkch-TRVZr_n75uwbXM3tnScxkio1wcUqwMviMl9miflnp8NhM36GG9ASMmWH_nGjvUx6N_FeycsjA-ROwdSh9K0o/s320/2012-10-26+17.21.42.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">キャップを取るとmicroSDのスロットとmicroUSBがあります。<br />
キャップは紐みたいなのが付いていて失くさないように工夫されています</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVZmLNRbbLzjiulZx-NeZo2fA77MKeKp0RKjRpwW4plVg22I0DmfhO7CJUvyhuUKlx3QaYolmMo8jB72DRm-APRkvFkP6LkTjleX5dD3WTjpvcIxzbA_KmIpgFRTtxr6uzvHoU_AGtaMmb/s1600/2012-10-26+17.21.52.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVZmLNRbbLzjiulZx-NeZo2fA77MKeKp0RKjRpwW4plVg22I0DmfhO7CJUvyhuUKlx3QaYolmMo8jB72DRm-APRkvFkP6LkTjleX5dD3WTjpvcIxzbA_KmIpgFRTtxr6uzvHoU_AGtaMmb/s320/2012-10-26+17.21.52.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">側面から。左から順に先送り、再生・一時停止、逆送り、モード変換ボタン、最後にmicroUSB</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6MarG6lAPMOgibTdPPV4nnvD4pqPdLc7nLchAN34heSi2rbRc0enBRKF_K573vr0KeFktiYgrHUCbdcAZPXla16NJScJB8aYE1Jqao0rSdXSBGxGkPdTGKDGJjlq1x-7I361UGXHhTzSp/s1600/2012-10-26+17.22.09.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6MarG6lAPMOgibTdPPV4nnvD4pqPdLc7nLchAN34heSi2rbRc0enBRKF_K573vr0KeFktiYgrHUCbdcAZPXla16NJScJB8aYE1Jqao0rSdXSBGxGkPdTGKDGJjlq1x-7I361UGXHhTzSp/s320/2012-10-26+17.22.09.jpg" width="240" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">もう片方の側面。音量調節ボタンがあります</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEC8FMcjIvpNJYTpC5RgOQMtTzOq_rkaEMY5m45S4ICUSCkuAeNNB8X7nY8AGsmJziERn52oMDpur-mgmYDvq9mOLkmKqAbMFPJashjSpIseDEq9hHI4tbmMa0Zv9qX9uNiCxzgOL9bHHZ/s1600/2012-10-28+02.26.10.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEC8FMcjIvpNJYTpC5RgOQMtTzOq_rkaEMY5m45S4ICUSCkuAeNNB8X7nY8AGsmJziERn52oMDpur-mgmYDvq9mOLkmKqAbMFPJashjSpIseDEq9hHI4tbmMa0Zv9qX9uNiCxzgOL9bHHZ/s320/2012-10-28+02.26.10.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">microUSBケーブルで充電しながら音楽が聴けます</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmltrkUr1qTClKOPt6FN5eGqCRK7WyjlA2DkIpwrVROnpvqCK2Rqp_t-KBY3281EfJbAqS1OskA8YH8e-6PJhHijsC_MVHoj5jGvZQ-_fr3QbZnE8s29gwoibQLuEQ86h4aWA9FyKiYcFU/s1600/2012-10-28+02.28.11.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmltrkUr1qTClKOPt6FN5eGqCRK7WyjlA2DkIpwrVROnpvqCK2Rqp_t-KBY3281EfJbAqS1OskA8YH8e-6PJhHijsC_MVHoj5jGvZQ-_fr3QbZnE8s29gwoibQLuEQ86h4aWA9FyKiYcFU/s320/2012-10-28+02.28.11.jpg" width="240" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">クリップを上げるとSony Ericssonの名残が見られますw</td></tr>
</tbody></table>
<br />
<h3>
MW600と比べた使用感</h3>
<h4>
曲を聞きながら充電できる</h4>
個人的に一番大きいのがこれ。MW600はUSBケーブルをつなぐと問答無用でスリープしてしまっていたがMW1はケーブルをつないでもスリープしないので曲を聞きながら充電可能。<br />
<br />
<h4>
ボタンの種類が増えた</h4>
モードの切り替えがやりやすい。MW600だと再生ボタン長押しの後にタッチ式のバーでモードを変更して一定時間待つ必要があったがMW1の場合、モード切り替えボタンを押して、逆送り、先送りボタンでモードを変更して再生ボタンで決定と分かりやすい。<br />
<br />
あとMW600のタッチ式のバーは服や肌に触れただけで誤動作を起こす場合があったがMW1の場合はボタン式で感触も固くなっているので誤動作は少なくなった。<br />
<br />
ボタンが増えてシンプルじゃなくなったがこれはMW600と比べてより多機能化(Smart)になったので仕方ないのかもしれない。次の機種では第6世代iPod nanoのようにボタンを減らしてタッチパネル化したらより魅力的な製品になるんじゃないかと思うんだけどどうなんでしょ?<br />
<br />
<h4>
幅広で薄くなった</h4>
幅広になったおかげでディスプレーの情報量が多くなり、ディスプレーの横にある応答ボタンが大きくなったおかげで押しやすくなった。MW600は爪の先で押さないといけないぐらい小さかったがこれのおかげで電話を取る動作や切る動作がやりやすくなった。<br />
あと丸い棒状だったのが平面になったので安定感が増して持ちやすくなった。<br />
<br />
<h4>
Androidとの連携が強化</h4>
Google Playから<a href="https://play.google.com/store/apps/details?id=com.sonyericsson.extras.smartwirelessheadsetpro" target="_blank">公式アプリ</a>をインストールすると通話履歴、SMS、Gmailなどをディスプレーに表示するミニアプリが利用できる。ミニアプリは開発者が自由に作れるようになっている。<br />
<br />
<h4>
ファームウェアの更新が可能</h4>
<b>Smart</b>と銘打っているだけあってファームウェアの更新が可能。ファームウェアは前述の公式アプリ経由でアップデート可能なのでわざわざPCにケーブルをつなぐ必要はない。<br />
<br />
<h4>
単独で音楽再生が可能</h4>
microSDに音楽を入れて単独で音楽が聞けますが対応フォーマットがwavとmp3のみなので個人的に要らない機能。最低でもaacサポートが必要でしょ。ファームウェアで対応できないですかねぇ...<br />
あとAndroid端末内の音楽をmicroSDにワイヤレスで同期できたら最高なんだけど<br />
<br />Anonymoushttp://www.blogger.com/profile/03507965371868379066noreply@blogger.com0tag:blogger.com,1999:blog-3943703860932411178.post-88084971600451289242012-10-13T19:00:00.000+09:002012-10-13T19:00:03.807+09:00NEXUS 7でみちびき(QZSS)を捉えられるらしいTLを見ていたら<br />
<div>
</div>
<blockquote class="twitter-tweet" lang="ja">
Nexus7 の gps チップ qzss対応ではあるそうだけど、反映されているのかな? だれかNexus7もちで gpsソフトで193番(qzss みちびき)とれるか見てくれないかなあw <br />
— きみ_Licaさん (@kimi_lica) <a data-datetime="2012-10-10T07:43:17+00:00" href="https://twitter.com/kimi_lica/status/255936526586892288">10月 10, 2012</a></blockquote>
<script charset="utf-8" src="//platform.twitter.com/widgets.js"></script><br />
<div>
ということなので手元のNEXUS 7で捉えられるか確認してみました。</div>
<div>
GPS TestとGPS Essentialsというアプリで見ましたが両方とも01番の衛星として表示されました。スマホ(GALAXY NEXUS)でもやってみましたがこちらは01番の衛星は捉えられませんでした。<br />
<br />
計測場所: 渋谷某所<br />
<br />
NEXUS 7: 真ん中(天頂)付近に02番の衛星と重なる形で01番の衛星が見えます<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcKbXXyBb3cAQkKw42kP5btx3J4iHL371dOZH0CET4twuVGev-JVWvSgsp_SOrg33WMubeBi15IzOnruJkj-u-p-wHyDUKd3PBf-kjI88YX4z8STZ7Z8tm7M4LlV7UTTuc_V12SokfIgpn/s1600/Screenshot_2012-10-10-19-30-02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcKbXXyBb3cAQkKw42kP5btx3J4iHL371dOZH0CET4twuVGev-JVWvSgsp_SOrg33WMubeBi15IzOnruJkj-u-p-wHyDUKd3PBf-kjI88YX4z8STZ7Z8tm7M4LlV7UTTuc_V12SokfIgpn/s320/Screenshot_2012-10-10-19-30-02.png" width="200" /></a></div>
<br />
GALAXY NEXUS: 天頂付近には02番の衛星しか表示されていません<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipZXmiaQyz-5rjyHZbAZoCo9Z-JU_tkE4Gqm0tKic9FO9PbI2xW024Q3THiDXM_qTN7s_lJTbMu4CnJZbO2ZC2MsWPBehR-bddSiGN2WR2uwY78RZfZqFm_s-60nOaFK69fGnIkXBG3PQs/s1600/2012-10-10+19.29.57.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipZXmiaQyz-5rjyHZbAZoCo9Z-JU_tkE4Gqm0tKic9FO9PbI2xW024Q3THiDXM_qTN7s_lJTbMu4CnJZbO2ZC2MsWPBehR-bddSiGN2WR2uwY78RZfZqFm_s-60nOaFK69fGnIkXBG3PQs/s320/2012-10-10+19.29.57.png" width="180" /></a></div>
<br />
01番の衛星がGPSなのかQZSSなのか判別が付きませんがGPSの方は同時刻では日本上空を飛んでいないのでQZSSで確定となりました。<br />
<br /></div>
<br />
<blockquote class="twitter-tweet" lang="ja">
.@<a href="https://twitter.com/terakinizers">terakinizers</a> <a href="http://t.co/hkeXxl1l" title="http://bit.ly/RvKiqA">bit.ly/RvKiqA</a> <a href="http://t.co/BC6DTmB3" title="http://www.n2yo.com/satellite/?s=37753">n2yo.com/satellite/?s=3…</a> 本来PRN01があたる機体は今日本から見えませんし、位置も違いますのでその01がみちびきであっていそうですね。 ありがとうございます!<br />
— きみ_Licaさん (@kimi_lica) <a data-datetime="2012-10-10T09:17:15+00:00" href="https://twitter.com/kimi_lica/status/255960172088946688">10月 10, 2012</a></blockquote>
あと、NEXUS 7はGALAXY NEXUSと比べてもGPSの感度が高いことも確認できました。<br />
<br />Anonymoushttp://www.blogger.com/profile/03507965371868379066noreply@blogger.com0tag:blogger.com,1999:blog-3943703860932411178.post-33512752749938843962012-10-09T02:15:00.000+09:002012-10-09T02:15:00.932+09:00Rクラスを直接参照せずにリソースを取得するたまにRクラスを参照せずにリソース(drawable, layout等)を取得したい場合があります。<br />
<div>
<br />
<div>
今まではresource id(例: R.drawable.hogehoge)の値をリフレクションを使って取得するユーティリティーを作ってしのいでいたのですがそんな物を作らなくても<a href="http://developer.android.com/reference/android/content/res/Resources.html#getIdentifier(java.lang.String, java.lang.String, java.lang.String)" target="_blank"><b><i>Resources.getIdentifier(String, String, String)</i></b></a>というそのまんまのメソッドがありました。</div>
<div>
<br /></div>
<div>
ActivityやService内でこんな感じで使えます</div>
<div>
<br /></div>
<div>
int resId = getResources().getIdentifier("hogehoge", "drawable", getPackageName());</div>
<div>
<br /></div>
</div>
Anonymoushttp://www.blogger.com/profile/03507965371868379066noreply@blogger.com0tag:blogger.com,1999:blog-3943703860932411178.post-73708471368394364492012-06-20T04:00:00.000+09:002012-06-20T04:00:34.824+09:00AngularJSを使ってみた味見部さんでAngularJSを勉強したので簡単なサンプルを作ってみました。<br />
<br />
<br />
<div>
<script src="http://jsdo.it/blogparts/3RW3/js?view=design" type="text/javascript">
</script><br />
<div class="ttlBpJsdoit" style="font-size: 11px; margin: 0; text-align: right; width: 465px;">
<a href="http://jsdo.it/tsuyosh/3RW3" title="2012-06-19 1st">2012-06-19 1st - jsdo.it - share JavaScript, HTML5 and CSS</a></div>
</div>
<br />
スケジュール(名前と日時)を入力してリストに名前と残り時間(秒)を表示する簡単なものです。<br />
<br />
残り時間はsetInterval()で1000msごとにスケジュールをforEachで回して更新しています。<br />
AngularJSならbindしているView部分が自動的に更新されるはず、と期待していたのですが外れました。<br />
<br />
入力欄に何かタイプすると分かりますがUIへのイベントを契機にbindしているViewが更新されます。<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/03507965371868379066noreply@blogger.com0tag:blogger.com,1999:blog-3943703860932411178.post-20266297698133934702012-04-24T02:36:00.000+09:002012-11-16T17:05:07.318+09:00AIR for iOSでAPNsをサポートするためのTips<b><i>【追記】AIR 3.4から正式にAPNsによるPush Notificationがサポートされました。この記事で紹介しているやり方だと恐らく不具合が生じる可能性がありますので標準のAPIを使うようにしてください。詳しくは<a href="http://help.adobe.com/ja_JP/air/build/WSd6d4f896b3a8801b7be2f55d138e29d5e40-8000.html" target="_blank">プッシュ通知</a>の使用を見てください。</i></b><br />
<br />
AIRのアプリでAPNsをサポートする必要があったのでANEで実装してみました。<br />
既に実装した人はいるようなのですが(<a href="http://flashsimulations.com/2011/12/16/apple-push-notification-service-native-extension-for-adobe-air/" target="_blank">参考</a>)ソースがなかったので自作しました。<br />
<br />
iOSアプリでAPNsを使うには大雑把に以下の実装が必要です。<br />
<ul>
<li>UIApplicationのregisterForRemoteNotificationTypes:メソッドを呼び出す。端末をAPNsに登録します</li>
<li>AppDelegateに以下のメソッドを実装</li>
<ul>
<li>application:didRegisterForRemoteNotificationsWithDeviceToken: APNsの登録に成功した場合の処理</li>
<li>application:didFailToRegisterForRemoteNotificationsWithError: APNsの登録に失敗した場合の処理</li>
<li>application:didFinishLaunchingWithOptions: Remote通知に含まれる情報を読み取ります(アプリ起動時)</li>
<li>application:didReceiveRemoteNotification: Remote通知に含まれる情報を読み取ります(アプリ起動中)</li>
</ul>
</ul>
<br />
<br />
これをANEで実装する場合、いろいろ試して下のような形で実装できました。<br />
<br />
<h4>
UIApplicationのregisterForRemoteNotificationTypes: メソッドを呼び出す</h4>
<br />
普通にANEの関数内で呼び出します。UIApplicationのインスタンスは<code>[UIApplication sharedApplication]</code>で取れます。UIApplicationはSingletonのようです。<br />
<br />
<h4>
UIApplicationDelegateにPush関連のメソッドを実装</h4>
<br />
こいつが結構くせ者でしてAIRのRuntimeが既にDelegateを実装してしまっているのでむやみに取り替えられません。また、ソースもありません。<br />
<br />
いろいろ調べた結果以下のような方法を採りました。<br />
<ul>
<li>適当なクラスのload()メソッド内でNSNotificationCenterを利用して起動時のイベントを監視するObserverを登録します. このObserverの引数(NSNotification)からapplication:didFinishLaunchingWithOptions:で渡される起動時の引数を取得できます。(<a href="http://stackoverflow.com/questions/8525569/get-launch-options-without-overriding-didfinishlaunchingwithoptions" target="_blank">参考</a>)</li>
<li>APNs関連のメソッド3つについてはAIR Runtimeでは実装してないはずなので上のObserverの中でメソッドを丸ごとオレオレ実装の物にオーバーライドします(<a href="http://stackoverflow.com/a/9499502/1001338" target="_blank">参考</a>)。将来AIRでAPNsがサポートされたらおかしな事になるかもしれませんので注意してください。</li>
</ul>
AIR(Flash)もiOSも始めたばっかりで苦労しましたがいろいろ勉強になりました。Anonymoushttp://www.blogger.com/profile/03507965371868379066noreply@blogger.com0tag:blogger.com,1999:blog-3943703860932411178.post-4257736271785810882012-03-30T04:33:00.000+09:002012-03-30T04:33:52.136+09:00AIR for iOSのStageWebViewで画像の動的表示が出来ない件AIR for iOS環境でCameraUIやCameraRollingで取った画像をローカルストレージ上に保存してそれをStageWebViewで表示させようとしても表示されない<br />
<br />
AIRからStageWebView.loadUrlでJavaScriptを実行してDOMツリーにimgタグを追加したが表示されない。100ms後にsetTimeoutでimgのsrc属性に全く同じ値をあえて代入するようにするとなぜか表示される。<br />
<br />
Android版では不要でiOS版の場合だけ必要な処理<br />
<br />
TODO<br />
<br />
<ul>
<li>Safariでの動作も調べてみる</li>
<li>UIWebViewでの動作も調べてみる</li>
</ul>
<br />
<br />
<br />
後日コードも交えてまとめる予定<br />
<div>
<br /></div>Anonymoushttp://www.blogger.com/profile/03507965371868379066noreply@blogger.com0tag:blogger.com,1999:blog-3943703860932411178.post-10829400424080078932011-08-26T02:04:00.001+09:002012-03-30T04:34:22.672+09:00AndroidのBackup Data APIについて調べてみたどうやってどこにバックアップデータを保存しているのかソースから探してみた。 自分用のメモなので適当です。<br />
<br />
検索対象<br />
<br />
<ul>
<li><a href="http://www.google.com/codesearch#cZwlSNS7aEw/frameworks/base/core/java/android/app/backup/BackupManager.java&exact_package=android&q=BackupManager&type=cs">BackupManager</a></li>
<li><a href="http://www.google.com/codesearch#cZwlSNS7aEw/frameworks/base/services/java/com/android/server/BackupManagerService.java&exact_package=android&q=BackupManager&type=cs">BackupManagerService</a> </li>
</ul>
<br />
<br />
バックアップデータの転送路は<a href="http://www.google.com/codesearch#cZwlSNS7aEw/frameworks/base/core/java/com/android/internal/backup/IBackupTransport.aidl&exact_package=android&q=IBackupTransport&type=cs">IBackupTransport</a>でインターフェース化されていてその実装は確認できた限りで2種類ある。<br />
<br />
<ol>
<li><a href="http://www.google.com/codesearch#cZwlSNS7aEw/frameworks/base/core/java/com/android/internal/backup/LocalTransport.java&exact_package=android&q=file:(/%7C%5E)com/android/internal/backup/LocalTransport%5C.java$&type=cs&l=1">LocalTransport</a> : 文字通り端末のローカルファイルにバックアップする実装。 /cache/backup/(パッケージ名) 以下にバックアップする。 </li>
<li>com.google.android.backup/.BackupTransportService : <a href="http://code.google.com/intl/ja/android/backup/index.html">Android Backup Service</a>用の実装っぽい。ソースコードは当然ないのでこれ以上追えなかった..</li>
</ol>
<br />
<br />Anonymoushttp://www.blogger.com/profile/03507965371868379066noreply@blogger.com0tag:blogger.com,1999:blog-3943703860932411178.post-44717506541422313752010-11-07T02:01:00.000+09:002010-11-07T02:01:37.597+09:00Windowsのエクスプローラーがフリーズする現象ここ数ヶ月の間Windowsのエクスプローラーの調子がおかしかったのでぐぐって直した。<br />
<br />
症状<br />
<ul>
<li>アイコンをダブルクリックしてもエクスプローラーがハングアップする。数分待つと関連付けされたアプリが起動する。</li>
<li>アイコンを右クリックするとエクスプローラーがハングアップする。待つとメニューが出る。</li>
<li>普通にアプリにドラッグアンドドロップする分にはフリーズしない。</li>
</ul>
<br />
ググッたところ同様に悩んでいる方がいた。<br />
<a href="http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?forum=8&topic=21624">ファイルの起動が遅い</a><br />
<br />
レジストリに存在しないマシンへのファイル共有のリンクがあるとフリーズするらしい。<br />
大体の原因がわかったのでregeditでレジストリをエクスポートしてテキストエディタから「\\\\」(UNCの最初の\\を\でエスケープした文字列)で検索して片っ端からファイル共有へのリンクがないかチェックした。<br />
<br />
案の定4,5個ぐらい存在しないマシンの共有ファイルへリンクしていた。やった覚えはないんだけどなぁ。。<br />
<br />
当該箇所を削除したところ再起動なしでエクスプローラーがフリーズしなくなりました。<br />
再インストールも考えていたので助かりました。<br />Anonymoushttp://www.blogger.com/profile/03507965371868379066noreply@blogger.com0tag:blogger.com,1999:blog-3943703860932411178.post-10442451018138376402010-10-21T02:39:00.001+09:002010-10-21T02:42:03.730+09:00kickstartで最小限の構成でインストール<div>
最小限の手間でサーバーを配備できるようにしたいのでkickstartインストールをやってみました。</div>
<div>
とりあえずの目標としては以下の2点。</div>
<div>
<ul>
<li>最小構成でインストール。必要なdaemonはsshdだけ</li>
<li>DAGリポジトリからPuppetをインストール。これは次回以降の自動設定の布石</li>
</ul>
</div>
<div>
設定ファイルを作った手順は以下のような感じ</div>
<div>
<ol>
<li>実際に手動で最小限の構成でインストールしてみる</li>
<li>インストール後に/root/anaconda-ks.cfgを参考に編集。オプションの詳しい説明は<a href="http://docs.redhat.com/docs/ja-JP/Red_Hat_Enterprise_Linux/5/html/Installation_Guide/ch-kickstart2.html">RedHatのマニュアル</a>や<a href="http://labs.unoh.net/2007/12/linux_2.html">ウノウラボさんのblog</a>を参考にした。</li>
<li>編集した設定ファイル(ks.cfg)をhttpでアクセスできる場所にアップロード。自分はDropboxのPublic領域にコピー。これで自前のWebサーバーを準備する手間が省ける</li>
<li>VMWare Playerで実際にkickstartインストールできるか確認。思ったとおりにいってない箇所があれば2に戻る。</li>
</ol>
</div>
<div>
で、できた設定ファイルが以下のようになります。一部()で囲っている部分は適宜置き換えてください。</div>
<pre>install
url --url http://ftp.iij.ad.jp/pub/linux/centos/5.5/os/i386
lang ja_JP.UTF-8
keyboard jp106
timezone Asia/Tokyo
network --device eth0 --bootproto dhcp --hostname (ホスト名) --noipv6
firewall --enabled --port=22:tcp
rootpw --iscrypted (暗号化パスワード)
authconfig --enableshadow --enablemd5
selinux --permissive
bootloader --location=mbr --driveorder=sda
clearpart --all --initlabel --drives=sda
part /boot --fstype ext3 --size=100 --ondisk=sda
part pv.2 --size=0 --grow --ondisk=sda
volgroup VolGroup00 pv.2
logvol swap --fstype swap --name=swap --vgname=VolGroup00 --size=512
logvol /usr --fstype ext3 --name=usr --vgname=VolGroup00 --size=8000
logvol /home --fstype ext3 --name=home --vgname=VolGroup00 --size=5000
logvol /var --fstype ext3 --name=var --vgname=VolGroup00 --size=4000 --grow
logvol / --fstype ext3 --name=root --vgname=VolGroup00 --size=2000
## DAG RPM repository for installing Puppet
#repo --name=dag --baseurl=http://ftp.riken.jp/Linux/dag/redhat/el5/en/x86_64/dag
repo --name=dag --baseurl=http://ftp.riken.jp/Linux/dag/redhat/el5/en/i386/dag
## set startup services
services --disabled=gpm,haldaemon,ip6tables,mcstrans,messagebus,netfs,rawdevices,restorecond
## user add
user --name=(ユーザー名) --groups=users
%packages --nobase
@core
telnet
vim-enhanced
screen
puppet
%post
## sshd deny password authentication
sed -i 's/^PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
install -d -m 0700 -o tsuyosh -g users /home/(ユーザー名)/.ssh
cat > /home/(ユーザー名)/.ssh/authorized_keys <<KEY
(sshの公開鍵データ)
KEY
chown (ユーザー名):users /home/(ユーザー名)/.ssh/authorized_keys
</pre>
<div>
インストールCDからbootしてksオプション付きでlinuxを起動させます。自分の場合はnetinstall CDを使いました。</div>
<pre>linux ks=(設定ファイルのURL)</pre>
<div>
なお、httpでkickstartファイルを落としているのでDHCPでIPアドレスを自動取得できて設定ファイルをダウンロードできる環境にサーバーを置く必要があります。</div>Anonymoushttp://www.blogger.com/profile/03507965371868379066noreply@blogger.com1tag:blogger.com,1999:blog-3943703860932411178.post-67424702529667613942010-07-20T00:12:00.003+09:002010-10-23T14:41:15.534+09:00WD20EARSで超簡単なベンチを取ってみる2TBなのに9000円割れを起こしているWestern DigitalのWD20EARSだが物理セクターが4KiB(4096 byte)で論理セクターを512byteにエミュレートしている代物なのでパーティションの切り方に注意しないとパフォーマンスが低下する。<br />
<br />
詳しい内容については<a href="http://www.atmarkit.co.jp/flinux/rensai/watch2010/watch03a.html">Linux Kernel Watch</a>を参照。<br />
<br />
要はパーティションの開始位置が8の倍数(8は4096÷512の結果)であればいい。<br />
通常、fdiskなどでパーティションを切っていると以下のように第一パーティションが第63セクターから始まるのでこのケースだとパフォーマンスが落ちます。(63は8で割り切れないため)<br />
<pre>[root@enterprise ~]# parted /dev/sda
GNU Parted 1.8.1
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) unit s
(parted) p
Model: ATA WDC WD20EADS-22R (scsi)
Disk /dev/sda: 3907029167s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 63s 1953134504s 1953134442s primary raid
</pre>
<br />
今回は書き込み性能だけパフォーマンスの増減を確認した。<br />
<br />
<pre>time dd if=/dev/zero of=test1 bs=128k count=32768
32768+0 records in
32768+0 records out
4294967296 bytes (4.3 GB) copied, 78.149 seconds, 55.0 MB/s
real 1m18.721s
user 0m0.055s
sys 0m8.456s
time dd if=/dev/zero of=test2 bs=128k count=32768
32768+0 records in
32768+0 records out
4294967296 bytes (4.3 GB) copied, 133.031 seconds, 32.3 MB/s
real 2m19.676s
user 0m0.064s
sys 0m8.659s
time dd if=/dev/zero of=test3 bs=128k count=32768
32768+0 records in
32768+0 records out
4294967296 bytes (4.3 GB) copied, 103.591 seconds, 41.5 MB/s
real 1m49.534s
user 0m0.049s
sys 0m8.402s
time dd if=/dev/zero of=test4 bs=128k count=32768
32768+0 records in
32768+0 records out
4294967296 bytes (4.3 GB) copied, 92.4522 seconds, 46.5 MB/s
real 1m33.231s
user 0m0.044s
sys 0m8.058s
time dd if=/dev/zero of=test5 bs=128k count=32768
32768+0 records in
32768+0 records out
4294967296 bytes (4.3 GB) copied, 96.5241 seconds, 44.5 MB/s
real 1m42.806s
user 0m0.050s
sys 0m8.364s
● partedを使ってGPTでパーティション開始位置が8の倍数になるように設定した場合
[root@enterprise ~]# parted /dev/sdd
(parted) unit s
(parted) mkpart primary 40 1953125039
(parted) mkpart primary 1953125040 3906250039
(parted) p
Model: ATA WDC WD20EARS-00M (scsi)
Disk /dev/sdd: 3907029167s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
1 40s 1953125039s 1953125000s ext3 primary
2 1953125040s 3906250039s 1953125000s primary
(parted) unit GB
(parted) p
Model: ATA WDC WD20EARS-00M (scsi)
Disk /dev/sdd: 2000GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
1 0.00GB 1000GB 1000GB ext3 primary
2 1000GB 2000GB 1000GB primary
[root@enterprise ~]# time /sbin/mkfs.ext3 /dev/sdd1
real 4m4.347s
user 0m0.763s
sys 0m19.149s
先ほどと同様にddでwriteの速度を5回検証。先ほどよりも2倍ちょっと速い
[root@enterprise ~]# mount /dev/sdd1 /data3
time dd if=/dev/zero of=test1 bs=128k count=32768
4294967296 bytes (4.3 GB) copied, 39.2418 seconds, 109 MB/s
real 0m40.107s
user 0m0.053s
sys 0m8.217s
time dd if=/dev/zero of=test2 bs=128k count=32768
4294967296 bytes (4.3 GB) copied, 54.6037 seconds, 78.7 MB/s
real 0m55.010s
user 0m0.063s
sys 0m8.313s
time dd if=/dev/zero of=test3 bs=128k count=32768
4294967296 bytes (4.3 GB) copied, 47.1927 seconds, 91.0 MB/s
real 0m48.051s
user 0m0.048s
sys 0m8.491s
time dd if=/dev/zero of=test4 bs=128k count=32768
4294967296 bytes (4.3 GB) copied, 50.3923 seconds, 85.2 MB/s
real 0m51.414s
user 0m0.055s
sys 0m8.230s
time dd if=/dev/zero of=test5 bs=128k count=32768
4294967296 bytes (4.3 GB) copied, 55.192 seconds, 77.8 MB/s
real 0m56.192s
user 0m0.064s
sys 0m8.125s
</pre>Anonymoushttp://www.blogger.com/profile/03507965371868379066noreply@blogger.com0tag:blogger.com,1999:blog-3943703860932411178.post-79432400787502576342010-07-18T07:24:00.011+09:002012-02-15T06:39:45.595+09:00LinuxのHDDを増設してみた2TBのHDDがお手軽に買えるようになってきたのでLinuxサーバーのHDDを交換・増設してみた。<br />
<br />
変更前の状態は以下の通り<br />
sda: WD10EADS<br />
sdb: WD20EADS sdb1,sdb2にそれぞれ1000GBずつ割り当て<br />
sdc: WD20EADS sdc1,sdc2にそれぞれ1000GBずつ割り当て<br />
<br />
今回はsdaを取り外してWD20EARSを2台増設する。<br />
あとRAID化されていない領域をRAID-5化する。<br />
総容量は4TBから6TBになる<br />
<br />
WD20EARSは普通のHDDと違って物理セクターサイズが4KiBなのでパーティションを適切に切らないとWriteのパフォーマンスは半減する。この辺は簡単なベンチマークをしたので後述。<br />
<br />
結局通常のMBRでなくGPTでパーティションを以下のように切りました<br />
<br />
<pre>GNU Parted 1.8.1
Using /dev/sdd
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) unit s
(parted) p
Model: ATA WDC WD20EARS-00M (scsi)
Disk /dev/sdd: 3907029167s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
1 40s 1953134487s 1953134448s ext3 primary raid
2 1953134488s 3906268935s 1953134448s primary raid
</pre>
<div>
<br /></div>
<div>
パーティションはこんな感じで作りました。</div>
<div>
mkpart 40 1953134487</div>
<div>
mkpart 1953134488 3906268935</div>
<div>
set 1 raid on</div>
<div>
set 2 raid on</div>
<div>
<br /></div>
<div>
さてパーティションの準備ができたのでsdaをraid arrayから切り離してsdd1を追加する。<br />
<br />
<pre>[root@enterprise ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md1 : active raid5 sdc1[2] sdb1[1] sda1[0]
1953134208 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]
(md1が稼動中。sda1,sdb1,sdc1でarrayを構築)
[root@enterprise ~]# mdadm --manage /dev/md1 --fail /dev/sda1
mdadm: set /dev/sda1 faulty in /dev/md1
(sda1が壊れたフラグを立てる。もちろん壊れてはいないが)
[root@enterprise ~]# mdadm --manage /dev/md1 --remove /dev/sda1
mdadm: hot removed /dev/sda1
(sda1をarrayから切り離す)
[root@enterprise ~]# mdadm --misc --zero-superblock /dev/sda1
[root@enterprise ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md1 : active raid5 sdc1[2] sdb1[1]
1953134208 blocks level 5, 64k chunk, algorithm 2 [3/2] [_UU]
(sda1がなくなっているのがわかる)
[root@enterprise ~]# mdadm --manage /dev/md1 --add /dev/sdd1
mdadm: added /dev/sdd1
(sdd1をmd1 arrayに追加)
[root@enterprise ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md1 : active raid5 sdd1[3] sdc1[2] sdb1[1]
1953134208 blocks level 5, 64k chunk, algorithm 2 [3/2] [_UU]
[>....................] recovery = 0.2% (2126592/976567104) finish=271.5min speed=59814K/sec
(raid arrayのリビルド開始。終わるまで寝るー)
</pre>
<br />
<br />
起きたら完了していたので一回shutdownしてsdaを取り外してもう1台のHDDを増設する。こういう構成<br />
sda: WD20EADS sda1,sda2にそれぞれ1000GBずつ割り当て<br />
sdb: WD20EADS sdb1,sdb2にそれぞれ1000GBずつ割り当て<br />
sdc: WD20EARS sdc1,sdc2にそれぞれ1000GBずつ割り当て<br />
<div>
sdd: WD20EARS sdd1,sdd2にそれぞれ1000GBずつ割り当て</div>
<br />
sddをraid arrayに追加してraid devicesを増やして容量を拡張する。<br />
ちなみにmd1とFS(ext3)の間にLVMを挟んでいるのでオンラインで拡張可能。unmountは不要。<br />
<br />
<pre>[root@enterprise ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md1 : active raid5 sdc1[0] sdb1[2] sda1[1]
1953134208 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]
unused devices: <none>
[root@enterprise ~]# mdadm --manage /dev/md1 --add /dev/sdd1
(sdd1をmd1に追加)
[root@enterprise ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md1 : active raid5 sdd1[3](S) sdc1[0] sdb1[2] sda1[1]
1953134208 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]
unused devices: <none>
(この時点ではsdd1はスペアディスク扱い)
[root@enterprise ~]# mdadm -G /dev/md1 -n 4
mdadm: Need to backup 384K of critical section..
mdadm: ... critical section passed.
(RAID-5のデバイス数を3から4に拡大)
[root@enterprise ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md1 : active raid5 sdd1[3] sdc1[0] sdb1[2] sda1[1]
1953134208 blocks super 0.91 level 5, 64k chunk, algorithm 2 [4/4] [UUUU]
[>....................] reshape = 0.0% (35072/976567104) finish=1391.0min speed=11690K/sec
(arrayのリビルド開始)
</none></none></pre>
いまココ。まだ続く...<br />
<br />
1日経過してようやくreshape完了。。。<br />
ここからはLVMやFS(ext3)関係の操作。VG(Volume Group)を拡張、LV(Logical Volume)を拡張、FS(File System)を拡張する。<br />
全てオンラインで拡張できる。<br />
<pre>[root@enterprise ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md1 : active raid5 sdd1[3] sdc1[0] sdb1[2] sda1[1]
2929701312 blocks level 5, 64k chunk, algorithm 2 [4/4] [UUUU]
unused devices: <none>
(ほぼ1日がかりでようやくreshape完了。。)
[root@enterprise ~]# pvscan | grep md1
PV /dev/md1 VG VolGroup01 lvm2 [1.82 TB / 5.38 GB free]
(まだPVの容量は増えていない)
[root@enterprise ~]# pvresize /dev/md1
Physical volume "/dev/md1" changed
1 physical volume(s) resized / 0 physical volume(s) not resized
(pvresizeで実際の容量を認識してくれる)
[root@enterprise ~]# pvscan | grep md1
PV /dev/md1 VG VolGroup01 lvm2 [2.73 TB / 936.70 GB free]
(PVの容量が900GiB近く増えた)
[root@enterprise ~]# vgdisplay VolGroup01
--- Volume group ---
VG Name VolGroup01
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 24
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 7
Open LV 6
Max PV 0
Cur PV 1
Act PV 1
VG Size 2.73 TB
PE Size 4.00 MB
Total PE 715259
Alloc PE / Size 475463 / 1.81 TB
Free PE / Size 239796 / 936.70 GB
VG UUID VJYgfz-KEYE-bX7w-wyJw-1vSt-sTd8-czljOL
(VGのFree Sizeも増えてる)
[root@enterprise ~]# lvextend -L +900G /dev/VolGroup01/data1
Extending logical volume data1 to 2.55 TB
Logical volume data1 successfully resized
(LV(data1)の容量を900GiB拡張。意外とすぐに処理完了)
[root@enterprise ~]# resize2fs /dev/VolGroup01/data1
resize2fs 1.39 (29-May-2006)
Filesystem at /dev/VolGroup01/data1 is mounted on /data1; on-line resizing required
Performing an on-line resize of /dev/VolGroup01/data1 to 683482112 (4k) blocks.
(結構時間かかる19:26-)
[root@enterprise ~]# df | grep data1
/dev/mapper/VolGroup01-data1
2407942276 1541393540 744261696 68% /data1
[root@enterprise ~]# df | grep data1
/dev/mapper/VolGroup01-data1
2408974404 1541393540 745241408 68% /data1
[root@enterprise ~]# df | grep data1
/dev/mapper/VolGroup01-data1
2409877516 1541393540 746098656 68% /data1
[root@enterprise ~]# df | grep data1
/dev/mapper/VolGroup01-data1
2410780628 1541393540 746955904 68% /data1
(resize2fsの処理中の状況。徐々に容量が増えていく..)
</none></pre>
<br />
ちょうど40分でresize2fsの処理完了。これで増設したHDDの半分を割り当てたことになる。<br />
<br />
今度はsd[ab]2においてあるファイルを退避させないといけないので先にsd[cd]2を似非raid-5化してそれをVolGroup01に登録して再拡張してデータを退避させる。また時間かかりそうだ。。<br />
<br />
<pre>[root@enterprise ~]# mdadm --create /dev/md2 --level=5 --raid-devices=2 /dev/sd{c,d}2
mdadm: array /dev/md2 started.
(1本足りない状態だけど2TBのraid array(md2)を作成)
[root@enterprise ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md2 : active raid5 sdd2[2] sdc2[0]
976567104 blocks level 5, 64k chunk, algorithm 2 [2/1] [U_]
[>....................] recovery = 0.1% (1264640/976567104) finish=321.3min speed=50585K/sec
(なんかブロック数が足りない気がする。。)
</pre>
<br />
<br />
<br />
上で心配していたようにどうも2TBじゃなくて1TBのデバイスとして認識されているようだ。<br />
RAID5なのにRAID1のような感じになってる。増設したら変わってくるんだろうか。。<br />
<br />
<pre>[root@enterprise ~]# mdadm --detail /dev/md2
/dev/md2:
Version : 0.90
Creation Time : Mon Jul 19 21:05:16 2010
Raid Level : raid5
Array Size : 976567104 (931.33 GiB 1000.00 GB)
Used Dev Size : 976567104 (931.33 GiB 1000.00 GB)
Raid Devices : 2
Total Devices : 2
Preferred Minor : 2
Persistence : Superblock is persistent
Update Time : Tue Jul 20 23:55:51 2010
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 64K
UUID : 4f7b6a38:0dabaacc:8799f02a:c89f888f
Events : 0.2
Number Major Minor RaidDevice State
0 8 34 0 active sync /dev/sdc2
1 8 50 1 active sync /dev/sdd2
</pre>
<br />
とりあえず先に進む。このmd2もVolGroup01に追加する。今度はpvresizeの代わりにpvcreate,vgextendが必要。<br />
<pre>[root@enterprise ~]# pvcreate /dev/md2
[root@enterprise ~]# vgextend VolGroup01 /dev/md2
[root@enterprise ~]# lvextend -L +910G /dev/VolGroup01/data1
[root@enterprise ~]# resize2fs /dev/VolGroup01/data1
</pre>
<br />
この状態でsd[a,b]2においてあるファイルを全部data1に移転。同じディスク間の読み書きだからかなり時間がかかる。<br />
また寝るー<br />
<br />
<a name='more'></a><br />
(2010-08-27追記)<br />
もうずいぶん時間がたってしまったがこの後やったことを列挙しておきます。<br />
<br />
<ul>
<li>sd[ab]2を一回まっさらにする。lvremove,vgremove,pvremoveなど</li>
<li>/dev/sd[ab]2を/dev/md2に追加して再びリビルド</li>
<li>pvresize /dev/md2</li>
<li>lvextendとresize2fsでファイルシステムの容量を拡張</li>
<li>/dev/sd[ab]2のパーティションタイプをRAIDにする。<b>数日はまりましたがこれをしないとリブート失敗します。</b></li>
</ul>
</div>Anonymoushttp://www.blogger.com/profile/03507965371868379066noreply@blogger.com0tag:blogger.com,1999:blog-3943703860932411178.post-75725965184462335982010-07-01T00:00:00.000+09:002010-07-18T07:56:39.500+09:00blogを移転某所でMTでblogを構築していたが運営が面倒になったのでblogger.comに移転します。<br />
過去のblogも順次こちらに移転する予定です。<br />
<br />
blogの題名通りここはちょいと長めのつぶやきを載せていく予定です。<br />
活動のベースはtwitter(@uecchi)です。Anonymoushttp://www.blogger.com/profile/03507965371868379066noreply@blogger.com0