先ごろリリースされたiOS7だが、Flashでスマフォアプリを制作していた筆者にも影響が出た。
自動回転機能、横向きができない。

横向きに制作していたアプリが、横向きに強制フィットされて小っちゃく表示されていた。
痛い。


Flash CS5.5ではどうあがいても治らなかったので、CCの体験版を導入。
プロジェクトを再パブリッシュするときちんと横向きに表示された。

開発プラットフォームに対してあまり変更を加えたくないと思っている古めかしい技術者なんだが、そろそろ我儘はできなくなってきそうだ。

もし同じような環境で最新のiOSアプリが作れなくなったら、今後はまずプラットフォームのバージョンを挙げてみよう。

http://www.apple.com/jp/
http://www.adobe.com/jp/products/catalog.html
http://www.google.co.jp/mobile/android/







でもさでもさ、下位互換性も大切だと思うんだ。。。(惜)
前回のときよりツール政策を続けていると、物足りなくなったので機能追加。

自分で使うときは動作確認しながら、状況にあったものを使っています。
むつかしいことを考えずに作れるのが一番いいので、パラメーターも基本は省略できるようにつけましょう。

  • isWaitComplete
    ReadyStateがCompleteになるまで待機させる場合はtrue。
    使用可能状態(Interactive)で待機を終了する場合はfalseに指定する。

    スクライピング中に画像が多いページを通過するとき、Completeになるまで予想以上に時間がかかったため追加。
    InteractiveはHtmlDocumentが使用可能な状態になれば呼び出されるが、全ソースを読み込まなくてもフラグが立つので注意。

  • waitID
    HtmlDocument内でid指定されているアイテムのロード確認ができるまで待機する。
    Interactiveで待機終了するようになると、必要な情報がロード前というタイミングが発生したため、その回避機能。

  • timeout
    ミリ秒
    みんな大好きタイムアウト指定。説明は省きます。

/// 指定Webbrowserオブジェクトの通信終了を待機する。
private void waitWebbrowserLoading(
WebBrowser web,
Boolean isWaitCompete = true,
String waitID = "",
long timeout = 10000)
{
Application.DoEvents();

try
{
if (isWaitCompete == true)
{
while (
web.IsBusy ||
web.ReadyState != WebBrowserReadyState.Complete ||
web.Document == null)
{
System.Threading.Thread.Sleep(100);
Application.DoEvents();
}
}
else
{
while (
web.IsBusy ||
!(web.ReadyState == WebBrowserReadyState.Complete ||
web.ReadyState == WebBrowserReadyState.Interactive) ||
web.Document == null)
{
System.Threading.Thread.Sleep(100);
Application.DoEvents();
}
}

if (waitID != "")
{
DateTime start = DateTime.Now;
while (
web.Document.GetElementById(waitID) == null &&
DateTime.Now.Ticks - start.Ticks < timeout*10000 )
{
System.Threading.Thread.Sleep(100);
Application.DoEvents();
}
}

}
catch (Exception)
{
}
Application.DoEvents();
}
安直にWeb巡回用のツールを作っていれば、簡単にぶち当たるWebbrowserの読み込み終了待機。
私はIsBusyとReadyStateと、ついでにDocument.Bodyの有無も見てしまっている。


/// 指定Webbrowserオブジェクトの通信終了を待機する。
private void waitWebbrowserLoading(WebBrowser web)
{
Application.DoEvents();
try
{
while (
web.IsBusy ||
web.ReadyState != WebBrowserReadyState.Complete ||
web.Document.Body.InnerHtml == null)
{
System.Threading.Thread.Sleep(250);
Application.DoEvents();
}
}
catch (Exception)
{
}
Application.DoEvents();
}


最近はBody読み込み後にjavascript(jQuery)等で後から読み込まれる内容も有るため、その都度待機が必要になる。
その場合はDocument内のエレメントが取得できるかどうかで判断して、やはり待機ループを廻す。

朝9時30分。
今日も事務所の窓際のスペースに敷いた薄い布団で目覚める。



chiYuさんは来客用のソファーで寝ている。
最近事務所にお客を呼んでいないから、chiYuさんの毛布は置きっぱなし。
アプリの件での電話をするときは私も気が気じゃない。
結局、気がつけばあまり集中できていない。
ご飯を食べて少し休憩しよう。
その後気分転換に、近所の喫茶店で作業しよう。そのほうがはかどるだろう。

レトルトのビーフシチューを温めて、食パンを浸けて食べた。
何故か福神漬が欲しくなった。
今度カレーを作るときには福神漬を買ってこよう。
お腹が膨れたので少し横になる。

chiYuさんは別の取引先と電話をしている。
私も参加してほしい案件が有るらしいことが聞こえてきた。
どうしよう。
電話が終わったのを見計らって話しかける。
「chiYuさん、俺このあと〇〇◯(喫茶店の名前)行って作業しようと思ってたんですけど、外からでも会議参加大丈夫ですか?」
「あ、起きてた?w 確認してみる。少し待ってて」

横になったまま、製作中のツールと、例のアプリについて少し打ち合わせ。
会議について相手先に確認してもらっている間、私は事務所を少し掃除する。
ちょろっと掃いて、ゴミを出してくる。
「大丈夫だってさ。向こうのリーダーとの調整ついてないらしい。また今度だね。」

許可が出たので喫茶店に移動。
うわーはかどる。
30分ほどで、半日手がつかなかった処理が出来上がった。
組み上げて動作を確認すると、上手く動いていない。
通信処理は成功し、情報取得完了のフラグが立っているのに、予想した結果のデータが存在しない。
処理実行のタイミングが悪いのか? フラグが立った後に3秒待機させる。
動いた。
・・・取得情報が全て1つずつカブっている。まぁこれは追加時に排他処理すればいい。
問題は3秒待機。ある程度待機が必要なのは分かったが、3秒が確実というわけでもないはず。どうしたものか。
そこで便意。

集中していたためか結構時間が経っていた。
カフェオレを一気に飲んでトイレに駆け込み、そのまま事務所戻る。
戻るつもりだったが、途中でネットが使える施設があるので一旦そこでパソコンを広げる。
やはりさっきの待機処理が気になる。
待機を別の場所に移したり、情報取得完了フラグの立て方を変更したり、思いつきをいくつか試すがうまくいかない。
ふと思いついて、一番最初にエラーになった場所に、結果のデータの有無でループさせる待機処理を組み込んだ。
軽快に動く。
・・・今後はこの待機方式は増える気がする。今はイレギュラーな待機処理だが、一応関数化しておく。

気が晴れたので事務所に戻る。
「煙草ある?」
chiYuさんが満面の笑みで迎えてくれた。煙草?
私は煙草を吸わないので持っているはずがない。なんでだろう?
「買ってきます?」
「あ・・・いいや(´・ω・`)」
chiYuさんの煙草は切れてはいないが、少なくなっているようだ。
私はさっきの待機処理の関数化が中途半端だったので、仕上げたくてしょうがない。
そのまま席について、作業を再開。

アプリの外注について打ち合わせを行い、外注先の技術者と会議。
明日、一部分の引き継ぎを行える事になった。13時以降に決定。
私の容姿が変わったことに驚かれた。少し太ったかな。

chiYuさんが帰宅。
私はツール制作を一段落つくまで行う。今日は少しつかれた気がする。


今日はやんばるさんの動画を連続再生。
今日も事務所の窓際のスペースに敷いた薄い布団で寝る。