スタッフの募集


HMDTでは、スタッフを募集します。今回は、主にDropTalkの開発を手伝ってくれる方、そしてDropTalkで使うキャンバスやシンボルを作ってくれる方です。

開発手伝いの方は、プログラミング仕事です。iOS、macOS、tvOS、Android、Windows (UWP)向けにプログラミングします。使う言語は、Swift、Java、C#です。

キャンバスやシンボル作成は、DropTalkで使うものを作っていただきます。デザインやイラストのスキルがあるといいです。障害児教育に興味のある方は、大歓迎です。

詳しくは、DropTalkのWebページを参照してください。

10周年のご挨拶


HMDTは、この4月2日で設立10周年を迎えました。よく10年もつ会社は6%程度とかいいますが、どうにか生き残ることはできました。

会社作ったのは10年前ですが、その前に個人事業主として独立しました。それが12年前かな。とにかくMacでプログラムを書く仕事がしたくて、それには独立しかなかったですよ、当時は。その2年後にiPhoneが登場してAppleを取り巻く状況がガラリと変わり、それからは怒涛の10年間でした。

IT系で独立した企業だと、ベンチャーとか、スタートアップとかと言われることがありますが、自分の10年間の軌跡を見ると、それらとは違うかなと思います。なんていうのがしっくりくるのかな。IT系零細企業かな?

まじめに考えると、エンジニアである私が、エンジニアとして生きていくために作った会社、でしょうか。最初に入った会社は大企業だったんで、エンジニアとしての能力、特にソフトウェアエンジニアとしての能力があまり要求されなかったですね。結構、欲求不満でした。自分で書きたいコードを書くには独立するしかないぜ、と思い込んで、29歳で辞めました。

独立してからは、必然的に経営や管理という仕事が発生してきます。そのあたりの知識や経験はまったくなかったので、体当たりで覚えていきました。でも自分がコードを書きたくて独立したので、どうしても経営にさく時間や熱量は低くなりがちでした。その辺り、うまく管理できなかったり、十分な給料が出せなかったりで、いままで働いてもらった人たちには不満があったと思います。振り返ると苦い思い出です。

そんな10年間の反省をふまえて、いま自分の気持ちを見直してみると、いちばんに出てくる思いは、やはりエンジニアとして生きたいな、ということです。コードを書くのが好きなんです。コードさえ書いていれば幸せなんです。じゃあ、どっかに就職すればいいんじゃないか、というとそうでもないことも分かってきました。

コードを書いていれば、もっとより良いコード、より良い設計、より良いインタフェースが浮かんできます。でもそれには、クラス構造を変えないといけないし、仕様を変更しないといけないし、ということはスケジュールも変えないといけないです。つまり、エンジニアリングサイドの要望に対してmake decisionを行う権限、つまり決定権が必要です。自由にコードを書くには、それを許容して責任を取れる権限が必要なんです。

そりゃこんなこと考えていれば、就職なんてできなくて独立してやるしかないですね。

というわけで、今日もたくさんコード書いています。コード書きと経営の比率は、8対2くらいでしょうか。1日に12時間コード書いて、ちょろっと経営の仕事するって感じです。

管理もどうにかできるようになってきました。重視しているのは、チームは少人数でいいことと、ゴールを共有することです。いま書いているアプリは、どういうものを目指しているのか。ユーザにどの機能を楽しんで使ってもらいたいのか。できあがったらどんな格好良い画面ができるのか。そんなことをこまめに話し合うようにしています。そうすると、書いているコードの方向性が揃ってくるんですよね。

ひとりのエンジニアとしても、成長できているかなと感じています。当方42歳ですが、ここだけの話ですが、コード書くのが上手くなってきました。一年前の自分より、半年前の自分より、ぜったい上手くなってるという実感があります。自分のコードを読み返して、うわダッサ、いまのおれの方が確実にうまいぜ、とブツブツ言いながら書き直してます。楽しいです。

そんなわけで、エンジニアとして楽しくコードを書くためにがんばってきた10年間でした。次の10年間もコードを書きますよ。あと、チームをもう少しだけ大きくしたいかな。

ちなみに弊社で開発したアプリ、『中日・日中辞典』と『大辞泉』が、4/8まで新生活応援キャンペーンで値下げセール中です。新生活で辞書が必要な方、ぜひこの機会にお求めください。

では、次の10年生き残ることを祈りながら、よろしくお願いします。

DropTalkのApple Pay対応の話:審査編


先日の投稿に書いたように、DropTalkをApple Payに対応させました。その時の流れを書いておきますね。

そもそも対応させようと思い立ったのは、去年の10月25日、Apple Payが日本でスタートした日。ご多分にもれず、私もそそくさと手持ちのiPhone 7にSUICAを登録しまして、これでオサイフケータイみたいなことができるぜ、へっへー、と早速コンビニでお昼ご飯を買ったりしてました。それを食べながらiPhoneで関連ニュースを眺めていると、なにやらApple Payをアプリに組み込むことができるらしいと。このときに初めて認識しました。ふーん、でもうちの会社には関係ないかなー、と一瞬思ったけど、そういやTシャツ売ってたや! これをネタに、Apple Pay対応しよう!

早速事務所に戻って社員の人と話して、ひとしきり盛り上がりました。よし、じゃ対応することで決定ね。とりあえず契約周りは私がやるから、実装の方はよろしく〜。ま、そんなに手間かからないでしょ。。。と、この時点では思ってたのですが、実際はストア画面(商品紹介、カートなど)を新規に作らないといけないので、結構な時間がかかりました。

契約の方は、決済サービスプロバイダーとしてPAY.JPを選択して、手続き開始。開発者登録はすんなりできて、どうやら本番申請というものをやらないといけないらしい。うーむ、よく分からんけど実装が終わってから申請するか、と考えてそのまま保留。今から考えると、この本番申請を早めにやっておけばよかったんだと思う。

で、実装が終わったのが11/11。よーし、本番申請するぞ! どうやら申請の手順は、

  1. VISA、MasterCardの審査
  2. 追加のカード会社(JCB、American Express、Diners Club、Discover)の審査
  3. Apple Payの審査

という流れになるらしい。なんでクレジットカード会社の審査が2つに分かれているのかは不明。Apple Payの審査が、その後になっている理由も不明。そもそも、審査で何を審査しているのかもよく分からない。こちらから提供する情報は会社の基本情報くらいで、アプリの提出とかそういったものはなし。

審査申請した後は、特にやることなしで待つだけ。11/21に、VISAとMasterCardの審査を通過したと連絡あり。続いて12/5に、残りのカード会社の審査を通過。そして12/21に、待ちわびたApple Pay審査通過のお知らせが! 申請してから一ヶ月と10日でした。

よーし、早速アプリ公開するぜ! と、思ったものの、12/23からiTunes Connectはクリスマス休暇で審査停止。さらに12/28からは弊社冬休みで業務休止。トラブった時のことを考えると、これは年明けの審査提出かねぇ、ということで少し待機しました。明けて翌年、無事アプリの審査通過して、1/5に公開できました。

ほんとはApple Payブームに沸いている最中に公開できればよかったけど、様々な審査が必要だったので、まぁ、こんなものでしょうか。審査自体は、こちらに何の連絡もなくて、何をやっているのか本当に不明。でも無事通過したので、簡単に固定料金なしでクレジットカード決済をやりたい会社さんにはオススメです。

DropTalkをApple Payに対応


iOS版DropTalkの新しいバージョンを公開しました。バージョン番号は3.1.4。マイナーバージョンアップに見せかけて、大きい機能追加があります。Apple Payに対応しました。

指先一つで決済できるApple Payは、SUICAとして電車に乗れるだけでなく、アプリに組み込むこともできます。これで、アプリ内部で様々な物販が行えるんですね。

いや、ちょっと待て。アプリの決済の仕組みって、In App Purchaseもあるよね? どう違う? これはAppleによれば、アプリ内で使うゲームのアイテムみたいなものや、機能制限の解除などは、In App Purchaseを使え。それに対して、物理的な何かを販売するときはApple Payを使え。と、いう住み分けだそうです。

DropTalkでは、今までWebサイトの方で、製本したマニュアルや、Tシャツなんかを販売していたんです。これらをApple Payで買えるようにしました。

新しく追加した、「ストア」タブから買えますよ。リンゴマークの「Pay」ボタンが眩しい。

アプリに組み込む場合は、Apple Payプログラミングに加えて、決済業者さんと契約をする必要があります。いくつかあるんですが、今回はPAY.JPさんにお願いしました。理由は、固定料金がかからないことと、ダッシュボート画面が綺麗だったから。開通までに時間はかかりましたが、特に大きなトラブルもなく開始できました。

Apple Payアプリだと、ネットでの買い物の手間が劇的に減りますね。確かにこれは革命的かもしれない。これで売り上げが少しでも伸びてくれるといいんだけど。

2017年仕事始め


あけましておめでとうございます。

2017年の仕事始めをやっております。去年は、DropTalkに始まりDropTalkに終わりましたが、今年もそんな感じの年になりそうです。

現在DropTalkはベラボーに対応プラットフォームを増やしていまして、リリース済みのiOSとAndroidに加えて、Windows 10、macOS、tvOSを開発中です。プログラム言語も、朝はSwift、昼はJava、夜はC#というように切り替えながら使っています。マルチリンガルな気分です。

なかなかこちらのブログの更新時間がとれないですが、弊社スタッフ三人でやいのやいのと楽しくやっております。では、今年もよろしくお願いします。

DropTalk 3をリリースしたので、プログラマ的に自慢してみる


HMDTでコツコツと開発を続けているVOCAアプリ、DropTalkの最新版であるDropTalk 3が公開されました! 今日のところはまずはDropTalkをリリース。DropTalk HDとDropTalk HD Freeはもう少しお待ちください。現在審査中です。DropTalk 3の詳しい情報は、こちらのDropTalkのページを参照してください。

DropTalk 3は、前のバージョンから大幅な機能アップをしました。すんごい大幅なんです。もちろんユーザにとって便利な機能を実装していったわけなんですが、結果的にプログラマとして大きいチャレンジになるものがいくつかあって、それらをガシガシと実現していきました。これが楽しかったんですよ。

ということで! HMDTのサイトでは、DropTalk 3におけるプログラマ的に注目してほしいポイントを紹介していきます。単なる自慢ですね、これは。

Finderライクなファイル管理

DropTalkではキャンバスと呼ばれるファイルを作るんですが、以前のバージョンではフラットにしか管理できなかったんです。当然、キャンバスの数が多くなると管理が困難になります。ユーザの方に聞くと、数十とか100とか平気で作ってしまうらしいんですよ。これはもう、フォルダを導入して階層管理にするしかないでしょう。

iOSでフォルダを利用した階層管理を実現しようとすると、問題になるのがユーザインタフェースです。UITableViewでチマチマやるのも格好悪いし。よーし、これを作ったれ! ということで、気合を入れてファイル管理ユーザインタフェースを作りました。

基本的な操作はドラッグアンドドロップです。ドラッグして、項目の並び替え、フォルダに入れる、といった操作ができます。上の階層に戻すときは、ナビゲーションバーにドラッグするようにしました。あと、メニューを使って、カット/コピー/ペーストもできるようにしました。Finderですな、こりゃ。

 

UICollectionViewの編集

UICollectionViewが大好きです。最近は、ほとんどのアプリのユーザインタフェースは、これで組んじゃいます。でも、使い込んでいくうちに欲しくなるのは、編集機能。UITableViewみたいに、行や列の追加や削除ができたり、並べ替えができたらいいのになー、と思ってました。

ないものは作ってしまえー、ということで作りました。UICollectionViewに編集モードを追加して、行や列を自在に編集しています。

これは特に難しいことをしているわけではなくて、ほぼ用意されているメソッドだけで作りました。insertItemsIndexPaths:とdeleteItemsAtIndexPaths:を駆使しています。難しくはないけど、泣きそうになるほどめんどくさかったです。

SVGレンダラの作成

DropTalkは、可愛らしいシンボルが魅力です。これはできるだけ綺麗に描きたいところ。が、年を追うごとにiPadの画面がどんどんでかくなってきて、リソースとして保持しているPNGファイルじゃ解像度が足りなくなってきました。iPad Proの画面サイズなんてどうすりゃいいのよ。もっと大きいPNGファイル作る? それだとアプリサイズがどんどんでかくなってしまいます。

これを解決するには、ベクタファイルに対応するしかないね! ということで、シンボル画像をSVGファイルに変換して、それを表示するためにSVGレンダリングエンジンを作りました。これなら、どれだけ画面が大きくなっても大丈夫です。iPad Proでもこの美しさです!

svg_renderer

 

 

こんな感じで、プログラマ的に面白いことを色々とやってみました。やりたいと思ったことに、チャレンジできる時間と技術の余裕があったのが嬉しかったですね。

WWDC最終日:一年間のやる気をもらいに


終わったー! WWDC全日程終了しました。参加された方々、お疲れ様でした。

楽しかった? と、訊かれれば、そりゃもう、最高に楽しかったよ! WWDCはさ、新しいMacが発表されるとかどうでもいいんです。参加するだけでいいの。

初めて参加した弊社のスタッフが、「Swiftの新しい文法で表記が短くなっただけで、歓声があがるのがすごく楽しい」って言ってました。そうなんだよね。周りに座っている世界中から集まってきたたくさんの人たちが、自分が毎日一生懸命やっていることに対して同じ気持ちを持っているんです。

Swiftが新しくなったよ! イエー! 関数の名前も全部変えたよ。 ブー! でも自動コンバートしてくれるんだ! イエーイ! ところでXcodeのFix Issueボタンって何もフィックスしてくれないよね。 ハハハハハ!

小さい会社で細々とコードを書いていると、「どうぜプログラマの言うことなんて誰も理解してくれねーよ」とひねた気持ちになっちゃいます。それがWWDCに来ると、「みんな同じ気持ちだったんだ! そんなことに気を病むよりも、もっとぶっとんだ未来に突っ走っていこう!」と無駄に煽られるんです。

私は常々、WWDCには一年間のやる気をもらいに行く、と言っているんですが、今回もたっぷりもらってきました。帰ったらコード書きまくるぞー! テストコードも書くぞー。デザインもやるぞー。本も書くぞー。あとは、SiriKitチェックして、Messagesフレームワークチェックして、tvOSもアップデートして、Accelerateフレームワークのニューラルネットもチェックして、、、とにかく、やりたいことでいっぱいだー!

おまけ。最終日はお約束のカニでした。頭がおかしくなるくらい美味しい。

IMG_4404

 

PPQ Dungeness Island

WWDC四日目:英語のセッションを聴くということ


WWDCも四日目になりました。疲れてきたー。体は時差ぼけがとれてきて調子いいんだけど、頭の方が。ずーっと座学で勉強している感じだからね。大学一年のときみたいだ。

WWDCのセッションはもちろん全部英語なのですが、唐突ですが、私は英語が苦手です! 自信を持って言えますが、苦手です。エンジニアは英語力がないとやっていけないので、学生のときからコツコツと、社会人になってからもジリジリと勉強し続けていますが、何年やっても苦手なものは苦手です。

それでも苦手なりに少しは上達するもので、仕事に絡むもの、たとえばAppleの技術文書を読むくらいなら、どうにかこなせるようになりました。その代わり日常会話はダメね。新聞や小説も訳わかんねぇ。技術のドキュメントなら読めるのは、典型的な文章に慣れてきたこと、語られていることの背景を理解していること、通常使われない特殊な単語(implementsとかinferenceとか)を覚えてきたこと、が理由として挙げられるでしょう。新聞とかは、その辺りが全然別物なのです。

リーディングならどうにかなるんですが、ヒアリングとなるとこれまた別の話で。WWDCに来てセッション聴いてても、何言っているか全然わかんねー。周りが笑ってても、なんで笑ってるかわかんねー。

まぁ、後ろにKeynoteのスライド出てるから、何についての話かはわかるんですよね。どうせビデオも公開されるし、後で見返せばいいか。そうかそうか、じゃこの場は軽く流してTwitterでもチェックしながら、、、ってとこでハッと気づくんです。私、何しにここに来てるんだー?! 安くない金と貴重な時間をぶっこんでるのに、これじゃモトがとれねぇ。ビデオの見返しなんてやったことないし。

過去に参加したWWDCからこのような教訓を得た私は、今回はセッションを聴く時のスタイルを変えました。まず、メモは取らない。メモを取ると、その間に何言っているかわからなくなるから。後ろのスライドも気にしない。スライド読んでいると、その間に何言っているかわからなくなるから。ひたすらスピーカーの顔を凝視して、その言葉を理解することにすべての集中力を動員するんです。聴け! とにかく聴け! いま、まさにこの場で、理解をするんだ!

それくらいの気合いを入れて聴くと、喋っている言葉がどうにか頭に入ってくるようになりました。面白いもんで、音声として聴くとわからなくても、喋っている人の表情やジェスチャー、周りの雰囲気があるとわかってくるんですね。人が話を聴くときは、ノンバーバルな情報もフル活用しているんだと実感できます。

ただ、喋っていることがわかったとしても、理解できるかはまた別の話で。特に馴染みのない分野だと、これ日本語で聞いても理解できねぇよ、という内容だったりします。あぁー、またわかんなかったよー! と、頭を抱えながら、また次のセッションを求めてさすらうのでした。

おまけ。インド料理を食べました。カレーのビュッフェです。

IMG_4386

Amber India

WWDC三日目:あきらめの悪いApple


WWDC三日目も終わりました。セッション三昧の日々です。SiriKitやMessagesフレームワークなど、基調講演で華々しく打ち上げられた新機能に関するものもありますし、従来の機能を地味にアップグレードした解説もあります。

そうそう、今日弊社のスタッフと話していたのですが、WWDCのセッションは3つくらいのパターンがあるよ、と。まず「Getting Started」。これは、その分野をこれから使おうとする人に向けた、チュートリアル的な内容のセッション。次に「What’s New」。その分野での新機能を紹介するもの。そして「Advanced」。その分野を使い込んでいる人に向けて、上級の使い方を説明するもの。

今回のSwift関連のセッションでいうと、「Getting Started with Swift」がGetting Started系。「What’s New in Swift」「What’s New in Foundation for Swift」がWhat’s New系。そして「Swift API Design Guidelines」「Understanding Swift Performance」なんかがAdvanced系だね。自分がその分野を得意かどうかで、どれを聞きに行くか決めるといいよ、なんてことを話していました。

で、私は興味のあるTestingやらMetalやらのセッションをウロウロしていたんですが、結構アレ? と思うことがありまして。そういった特定のプラットフォームにフォーカスしていないセッションでも、tvOSやwatchOSの話題が出てくるんですよね。たとえばTestingのセッションでは、クラッシュログの収集というテーマで話していたのですが、デモとして使われていたのはtvOSアプリでした。もっともこのデモは、tvOSシミュレータがなかなか立ち上がらなくて失敗してしまいましたが。

他にもセッションの最後に、この技術をサポートするプラットフォームを明示するようになってました。「iOS、macOS、tvOS、watchOS」って感じでね。これが意外に、tvOSをサポートする技術が多いんですね。watchOSはさすがにいろいろな制約があるので、難しいものが多いみたいですが。

初日の基調講演を思い出してみると、確かに4つのプラットフォームでやっていくよ、って宣言してました。でも正直、そんな真面目に受け取っていなかったですよ、私は。今回参加した人たちも、tvOSとwatchOSにはそんなに期待していなかったんじゃないかな。そりゃ、Apple Watchが登場した2014、Apple TVがプラットフォーム化した2015は、興味津々でしたよ。でも市場での盛り上がりがそれほどでもなく、アプリを作ろうと思っても制約が強くて思い通りのものが作れなくて、熱が引いていきました。このままフェードアウトしていくのかなぁ、っていう気分でした。

それがなんか、Appleはやる気満々なんですよ。tvOSもwatchOSも特別なものではなく、4つのプラットフォームを同列のものとして扱っているんですよ。戦略として、これらの平準化を推し進めているという印象を受けます。iOSやmacOSの機能を、積極的にtvOSやwatchOSに移しているんですね。環境を整えることで、アプリの移植をプッシュしようということです。

私は常々思うんですが、Appleって意外とあきらめが悪いんですよ。Apple WatchやApple TVにしても、ヒットしたとは言い難いですよね。Siriだって登場した時はボロクソに言われていました。でもそういった製品や技術を地味にアップグレードし続けて、気がつくと標準になってしまっているんです。プラットフォーマーとしての矜持というか、意地というか。

だからセッションを聴いていると、tvOSではこういう機能にしようか、watchOSではこう展開しようか、って自然に考えちゃいます。こっちに来る前は、そんなこと全然考えていなかったのに。WWDCマジックですね。

おまけ。メキシカンを食べてきました。ロティサリーチキンです。

IMG_4384

green chile kitchen

WWDC二日目:バイバイNEXTSTEP(うわべだけ)


WWDC二日目です。会場をMosconeに移して、セッションやラボが山盛りに開催されています。やっぱり、Mosconeに来るとしっくりきますね。ホーム感があるわぁ。

IMG_4367

セッションは、一回の時間が短くなったんですね。40分くらい。それが一時間おきに組まれます。このくらいの方が、集中力が保たれていいかな。途中で眠くなる前に終わる感じです。

初日は新機能を中心に回ってみましたが、やっぱり気になるのはSwift 3でしょうか。Xcode 8をダウンロードして、試しに手持ちのコードをビルドしたら、出るわ出るわエラーの嵐。Cocoaの関数名や定数名を全部変えてきています。いったいどうなってんねん、とセッションを聞きに行ったら開口一番「Grand Renaming」。そうすか、またすか。

SwiftのAPIデザインガイドラインなるものを制定して、CocoaのAPIをすべてSwiftyにしたとのこと。たしかに今までObjective-Cそのままだったから、新しい名前の方がとても馴染むのは分かるけど、それを本気でぶっこんでくるか。でも、古いソフトウェアをそのままほったらかしにせず、常に手を入れて最新のトレンドに合わせていくのは、とても大切なことです。オーバーホールですな。

そんな流れで、いくつかのクラスから「NS」の接頭子が外れました。NSDataではなくてData、NSCalendarではなくてCalendarになります。NSは、もう知らない人の方が多いでしょうが、NEXTSTEPの意味です。そうか、ついにNSの名前も消えちゃうのか、と思ったらそうではないらしい。新しいDataやCalendarは値型でより軽量にアクセスするための構造体で、背後ではNSDataやNSCalendarが作られています。これらはCopy on Writeになるので、暗黙的なmutationが利用できるようになります。

目に付かなくなったけど、まだまだ背後で活躍するNSのクラス群。ジョブズの遺産は、Swift時代になってもその姿を変えながら、連綿と残り続けます。

おまけ。お昼は飲茶でした。

IMG_4368

 

Yank Sing