2013年7月31日水曜日

【Android】ViewPagerで現在表示しているViewを取得する

ViewPagerの上にメニューレイアウトがあったりして
そのメニューレイアウトからViewPagerが表示しているコンテンツに操作を行いたいとき…

例を出すと
ViewPagerといえばギャラリーアプリ的なのを想起しやすいため
そのギャラリーアプリで考えると
メニューから拡大縮小,回転,グレースケール化などなどをする場合
なんてものが挙げられるが

ViewPagerの外からViewPager(実際はPagerAdapterだが)が
管理するコンテンツにアクセスしたいことがある.

各ページにメニューを配置しても実装はできるが…
それはさすがにスマートじゃない.


ViewPagerを使う場合はPagerAdapterのサブクラスを作ることが必須だが,
そのPagerAdapterにはsetPrimaryItemというメソッドがある.
読んで字の通り,アイテムを表示するときに呼ばれるメソッドである.
開発者が気にすることではないのだろうが
きっとViewPagerが呼んでいるのだろう.

instantiateItemメソッドなどと違い,
Abstract指定されていないので継承は必須ではないこのメソッド.
これを使えば表示されているViewの取得ができる.

今回はViewPager直下をRelativeLayoutと仮定する.

こんなかんじで作ってgetPrimaryViewを呼び出してやればいい.

もし,RelativeLayoutの更に下のViewがほしいのなら
もう少し手を加える必要がある.
レイアウトに欲しいViewをsetTagして,
呼び出すときにgetTagすればいい.

getChildAtでも子Viewを取得できるが
きちんと管理していればいいが
コード改修を考えると誰が出てくるか不明瞭なので怖くて使えない.
想定外動作を引き起こすことになる上,
下手したらキャスト失敗で死ぬことになるからね.

2013年7月23日火曜日

【Linux】lnでOperation not permitted

Linuxでライブラリを別のところからコピーしようとしたら
シンボリックリンクが蹴られた.

じゃあ手動でシンボリックリンクしてやろうと

# ln -s libjpeg.so.9.0.0 libjpeg.so.9

したら

ln: libjpeg.so.9: Operation not permitted

と言われた.

Operation not permitted?
ユーザ権限が不足してるのかと思い,
suしてみるもダメ,chmod/chownしてみるもダメ.

ふと気がついた.
今コピーしようとしている先は接続しているHDDであるということを.

# mount

を叩く.

/dev/sda1 on /mnt/test type vfat

HDDはVFATでした.
譲り受ける際にフォーマットはNTFSじゃなけりゃなんでもいいって言ってしまってたわ…
VFATなのでシンボリックリンク作れなくて当然.

はずかしい

2013年7月17日水曜日

【Android】ViewPagerについて

ViewPagerとはAndroidの標準ギャラリーのように
左右フリックでコンテンツを切り替えるViewである.

このViewPagerではコンテンツを表示する際に
自動的に前後のポジションのコンテンツを読み込みに行く.
例えばposition:3のコンテンツを表示させる場合,
同時にposition:2,4のコンテンツも取得する.

こんな便利なViewがあるなんて!と思ったのだが,
使い方を誤ると大変なことになりそうだと気づく.

同時に3つまでコンテンツを保持する関係上,
大きな画像を扱う場合はメモリ管理に注意しなければならない.

もしコンテンツがインターネッツ上にある場合やデコードが必要な場合等々,
処理に時間がかかる場合は処理を別スレッドに任せないといけない.

これは当然なのだが,ただ何も考えずに別スレッドにしただけでは
フリック操作をしまくることでスレッドがたまり,
きちんと排他処理をしなければ処理能力不足やソケットの取り合いになり,
排他処理をしても,スレッドがスタックされていく.

必要なスレッドとそうでないもはや古くなってしまったスレッドとの判断が必要.
だが,今表示されているポジションだけでなく,
その前後のポジションも読みに行くという仕様がここではネックになる.


そこで,以下のようなアルゴリズムを考えた.

まず各スレッドにユニークなIDをもたせる.これはスレッドIDでも構わない.
次にそのスレッドでユニークなIDの最新3件(表示ポジションと前後ポジション)を
記憶するためのリストをアクティビティに持たせる.
 →これはLinkedListでも配列でもArrayListでも自分が使いやすいやつでいいが,
  順番というものを意識するため今回は意図的にLinkedListにしている.
スレッドを生成したら即Synchronizedでロックをし,順番待ちしてもらう.

順番がまわってきたら最初にアクティビティが持ってる最新3件のリストに自分が入ってるかどうか確認する.
入っていなければそこで終了.
入っていれば重たい処理を行い,HandlerでUIに反映させる.

なお,ViewPagerはListViewなどと違ってViewが再利用されないので,
重たい処理を行わせた後で表示していいかどうかの判断を行う必要はない(と思う).


以下,上記日本語のコード化
View内のレイアウト配置等,今回不要かつ紛らわしいところは省いている.


本当の本当に終わり

2013年7月1日月曜日

【Windows8.1】PCの起動をカスタマイズ

Windows8以降,システムのセキュアー性を確保するために
セキュアブートといって無署名ドライバを起動させなかったり,
インストールさせなかったりするような仕組みがある.

無署名ドライバのインストール拒否で困るのがAndroid開発である.
GoogleがSDK内に用意してくれた,多くのAndroid端末で動く汎用ドライバ
Android composite adb interface
というものがあるのだが,
これがなんと未署名なのである.
つまり,Windows8以降ではAndroid開発への敷居が少し高くなってしまった.

さて,Windows8からWindows8.1 RPへアップデートした際に
インストール済みの未署名ドライバが一掃されたらしく,
再度インストールしなければならなくなった.
手持ちのAndroidタブレットが見えなくなったのである.

そこで,PCの起動をカスタマイズという起動の仕方がWindows8から追加されており,
未署名ドライバをインストールできる設定でWindowsを起動させることができる.
その状態に持っていく必要がある.


話は変わって,
Windows8では設定が
StoreStyleAppsのPC設定の変更という方法と
従来通りのコントロールパネルという方法とがある.
この2つにわかれていたのが不評だったのか,
PC設定の変更の方にもコントロールパネル要素が入ってきた.
コントロールパネルが消えたわけではない.
相変わらず2立したままなのだが,PC設定の変更が階層化され,複雑になってしまった.

先に述べたPCの起動をカスタマイズするにはPC設定の変更から行う必要があった.
PC設定の変更が大幅に変わってしまったため,どこにいったかわかりづらくなってしまった.
ということを踏まえて,PCの起動をカスタマイズするには,の手順を示す.

右端のチャームから設定チャームを開く

設定コントラクト最下部のPC設定の変更をクリック

するとStoreStyleAppsのPC設定が開くので,
最下部にある保守と管理をクリック

更に最下部の回復を選択し,
右画面の今すぐ再起動するをクリック.

これ以降はWindows8と同様である.

【Windows8.1】デスクトップ画面で起動

Windows8で追加された
Modern UIというスタート画面.

この画面ではStoreStyle Appsといわれる
iPhoneアプリやiOSアプリに近いようなアプリを実行することができる.

MicrosoftとしてはこのStoreStyleのストアを
Windowsという圧倒的なシェアに乗せて広めたかったんだろうが,
現状では今ひとつ評判がよろしくない.

Windows8ではPCの起動時にスタート画面を表示して
デスクトップもStoreStyleアプリの一つ
という風に魅せたかったようだが,
実際はそうではないし,
既存Windowsユーザには浸透しなかった.

それで敬遠されてWindows8が普及しなければ
ストアどころでなく,本末転倒である.

というふうにMicrosoftが思ったかどうかは分からないが,
時期WindowsOSであるWindows8.1には設定で
起動時の画面をデスクトップかスタート画面かを選択できる
設定項目が追加された.
デフォルト設定はスタート画面ではあるが.

そのスタート画面設定が入るということは事前にわかっていたことであるが,
いざ探してみてもなかなか見つからなかったのでここにまとめる.

タスクバー上で右クリックして
プロパティを選択.

ナビゲーションタブを選択し,
サインイン時にスタート画面ではなくデスクトップに移動するにチェックをつける.
これで次回サインイン時以降からデスクトップ画面から起動するはずである.