Xamarin.Forms でドラッグを実装しよう(のうりん編)

今年は申年ということで、何故か正月から「のうりん」を読んでいます。申年は Xamarin に関係ありますが「のうりん」には関係ありません。いや、猿の回があったから少しは関係するかも。と、会社を辞/〆て数年経ちますが、フリーでITプログラム屋さんをやっていると月々の収入がえらい上下します。自営業とはいえ小売りや飲食店をやっている訳ではないので、数か月間収入がなかったり、どかっとまとめて入ってきたりします。最初の頃は、この上下が心理的に苦しくて(だからこそ、会社員や契約社員になったりするんですけど…というのは後で気づきました)あれこれ継続的な収入を考えていたのですが、いやいや「アワビ業者」と同じですねと考えてからあれこれすっきりしました。計画的なあれこれはさておき、1年のうちの数回しか収入がないものでそれを1年間で分配すればよいわけです。不確定な年棒制みたいなものですが、程よく貯金(金銭的なバッファ)があれば、多少の浮き沈みは問題ではありません。そんな訳で「のうりん」を読んでいるわけですが、先日のポスター騒ぎをさておき原作を読めば、「ああ、『もやしもん』と『おせん』が混ざっている」わけで、時には『夏子の酒』も入っていたりします。農業あれこれは、板橋区で畑の貸し出しを数年やっただけですが、先に手間をかける、そして収穫するという意味では、フリーのITプログラム屋さんも似たようなものです。農業の場合、農機具を借金して買うパターンになるので農協の話とか台風の話のほうが深刻ですが、自給自足(地産地消)できる分だけ、お金のやり取りが少なくなる分だけお農業のほうが良いかもと思ったり、さすがに午前4時起きで作業を続けるのはちょっと私には無理、と思ったりと読み進めるわけですが。ちなみに、5巻ぐらいになると「おっぱい」の割合が減ります。蘊蓄部分が多くなって、読むスピードが落ちるわけですが、そのあたりのバランスはラノベならではですね。漫画っぽい引きと挿絵の挿入は、他のラノベでもそうなのか分かりませんが、筒井康隆風でもあります。まあ、それ以前に、黄表紙とかタイポグラフィとかあるわけですが。

そんな訳で「のうりん」を読みながら、他人様の時間と自分の作業する時間とをあまり交差させないように、OpenCCPM の構想を立てているところです。OpenCCPM では、

  • タスクカード抽出
  • PERT図
  • ガントチャート

が、ひとつのタスクデータを共有します。いわば、タスクの三面図みたいなものを作るわけで、UML も同じ発想です。これにアジャイル的な変化を組み込む(実は CCPM のプロジェクトバッファは、アジャイル的な変化を畳みこむので考慮しない)ようにします。プロジェクトバッファは、タスクの遅延には強いのですが、タスクそのものの増減には関与しないんですよね。というわけで、IT 特有の時間経過によるタスクの変化(いわゆる状況/要件の変化)を織り込むのが OpenCCPM の目標です。ちなみに CCPM(クリティカルチェーン プロジェクトマネージメント)は、PMBOK に含まれています(発祥は TOC ですがね)。

タスク抽出をタブレットで実装したい

タスク抽出にはいろいろな方法があります。

  • トップダウン方式の WBS
  • ゴールから後戻りをする方式

PMBOK では WBS という作業単位を出していますが、いきなり WBS で出しててはダメです。あれこれ、トップダウン的にプロジェクトマネージメント的にマインドマップ的にあれこれ出しているものがありますが、全部ダメです。プロジェクトマネジメント関係は、以前 TOC を知ったころにあれこれやて考えた時があるのですが、政治的な話に踏み込んでしまうので途中で止めました。もっと技術的な職人的なことに労力を突っ込んだほうがいいだろう、と思ったわけです。その裏ではちょこちょことマネジメント的なテクニックを個人的に使ってはいましたが、外側で使うことはありませんでした。が…どうやら、この歳になって、あれこれとダメダメなマネージメントに引きずられるのが嫌になってきました。ダメダメなのはまあ、いいんですが、ダメダメなスケジュールと進行に自分の時間を浪費させられるのはちょっと嫌~な感じですね。というわけで、少しだけ好き勝手できるようにします。

無駄を省くために、ゴールからタスクを抽出する方法もありますが、実は時間が掛かりすぎます。なにも一から泥縄式にタスクを抽出することはありません。究極に無駄を省くこともできますが、何も最適値である必要はありません。準最適であるだけで十分だし、更に言えば、競争力としては「他の会社でやっているダメダメプロジェクト管理」よりもちょっとだけ良ければいいのです。

ある程度経験があれば、タスク抽出にはテンプレートや以前の経験が便利ということが分かります。逆に言えば、新人 PM には無理です。不可能です。以前やったことがある経験値としてのタスク抽出と、どこかのストーリーで読んだことがある(本を読むことは疑似体験として重要です)タスクを取り入れることは、最適ではなにせよ準最適になり得ます。

さらに、最初のタスク抽出に固辞する必要はなく、状況が変化するのであれば(プロジェクトを進める間に、新人 PM は、新人ではない PM に進化しますよね)、それに従ってタスク自体も組み替えていけばよいわけです。由緒正しいスクラムプロセスの場合は、2週間単位のスプリントで決めますが(最近のスクラムのそれになっている?)ほどよい人数になれば、コミュニケーションコストがかさむし、全体の統括が必要になってきます。「統括」自体は、マイルストーンという形でスケジュールを縛っていくのでプロジェクトのバッファの意味がなくなってきます。そういう欠点も含めて、状況に沿って動く「予測が可能なプロジェクト運営」を目的とします。

で、タスク抽出自体は付箋を使うのが一番よいのですが、手書きだけだと共有ができないし、たくさんのタスクになると検索性も悪くなります。また、タスクを PERT 図はガントチャートに自動的に直すことができません。このあたりも含めて、タブレットでタスク抽出ができるとよいわけです(天井にカメラを据えて、付箋の画面キャプチャ、OCR 認識も考慮したいですよね)。

Xamarin.Forms で Drag する

ふと、大型タブレットを探したのですが、13インチぐらいあるタブレットは、iPad か Windows タブレットになっていますね。何故か Android タブレットは 7 インチぐらいで止まっています。大型タブレットの需要が少ないのもあるのでしょうが、スマートフォーンではないタブレットという分野は閲覧を抜群に上げるために重要な分野です。バッテリー故に重たくなってしまうタブレットですが、液晶の電力を下げたり、薄い有機液晶も出てきているので、5年以内にはでそうです。というか、スマートフォンは無くなるんじゃないかなと思っています。

それはさておき、Java/Objective-C/Swift であれこれするよりは、C# で一括で作ったほうがよいだろうという発想と、MVVM の VM-M を共通化するために View を Xamarin.Forms に渡したほうがよいだろう、という労力的な問題があります。OpenCCPM のツール群は、VM-M のほうに注力するので、できるだけ View は省力化したいのです。マンパワー的に。ちなみに OpenCCPM の作成自体は OpenCCPM で行っています…ということにします。

Xamarin.Forms を使う時に不便なのは、タップしてドラッグ関係の機能がないことです。以前から何故ないんだろう、と思っているわけですが今でもありません。Xamarinでコントロールのドラッグに対応する で作ってみたのは、Windowsストア/Android/iOS の三種類です。これを、Xamarin.Formsでタッチイベントを処理するには?(iOS/Androidの各種ジェスチャー対応) にあるロングタップを参考にして、 OnLongPress をコントロールの Renderer を使って実装すればよいかと思っていたのですが、あれ? GestureDetector.SimpleOnGestureListener って、タップ位置を渡していないよ、なぜかタップの Down はあるけど Move/Up が消されちゃってるよ orz ってことで、どうやら自分で実装しないといけないようです。確かに、Android/iOS とドラッグのやり方は異なるので、実装をどちらに合わせるか悩むところなのですが。

でもって、調べる Android でもドラッグの方法がいくつかあるので、最終的な手順まで計画を立てます。

  1. Xamarin.Android 上で OnDragEvent を使って実装
  2. Xamarin.Android 上で Touch イベントを使って実装
  3. Xamarin.iOS 上で実装
  4. インターフェースを ManipulationDelta 風に変更する
  5. Renderer を使って、Xamarin.Forms にコールバックする

のように手順を踏まないと作れないっぽいです。

という訳で、このあたりからちまちまと。

Android Drag の参照先

カテゴリー: Xamarin パーマリンク