脇の甘い日常

プログラミング関係のお仕事ネタや、チャリ、マラソン、トレランなどの趣味ネタを書き綴っていこうと思います

二の補数

昔、学生の時に習った補数表現。
今まで何度かお仕事で使う機会があったのだが、その仕事が終わるとすぐに忘れてしまうので、備忘録的にまとめておく。

 

二の補数はマイナスの表現方法だ。
計算方法としては全ビットを反転させて、+1する。ただそれだけ。


例えば8bitの-1の二の補数は
 1) 元データ: 0000 0001
 2) ビット反転: 1111 1110
 3) プラス1: 1111 1111

十六進数だと0xFFとなる


もうひとつ、-128だと

 1) 元データ: 1000 0000
 2) ビット反転: 0111 1111
 3) プラス1: 1000 000

十六進数だと0x80となる

 

単純に最上位ビットを符号判定に使うほうが人間的には分かりやすいと思うのだが、コンピュータ的にはマイナスを二の補数にすることで全て「加算」で処理できるという大きなメリットがあるので、こちらが使われているようだ。


例えば5-3を考えると3の二の補数表現は111 1101なので

   0000 0101
+ 1111 1101
------------------
1 0000 0010

となる、先頭の桁あふれ部分は捨てられるので2が得られる。


多分、もう忘れないはず。。。

 

AI的思考な息子

下の息子が前回の中間テストでファンキーな点を取ってきて以来、毎晩30分ほど勉強を教えている。

 

何回か教えている中で、息子には計算や単語力とかそれ以前の問題として、驚くほど読解力が無いことに気づいた。
そもそも、まともに文章を読もうという気が無いのか、自分が知っているパターンを片っ端から当てはめている感じなのだ。
なので、ひとつの問題が解けたからといっても全く油断できない。似たような問題を出してもトンチンカンな答えをしたりする。
本当に理解して解けたのか、たまたま彼の持ってるパターンに一致して正解したのかを見極める必要がある。

 

そんな感じで四苦八苦してる時に、「ロボットは東大に入れるか」というプロジェクト(東ロボ)が東大合格を断念したというニュースを耳にした。

bylines.news.yahoo.co.jp

 

なかなか興味深い記事だった。

実はAIも文章の意味を理解できていないのだ。基本的には問題を検索と確率だけで解いている。
動詞や接続詞などを拾うことで選択の精度を高めることはできるが、「理解」はできていない。
さらにこの記事では、実は子供たちもAIと同じようにキーワードとパターンで解いている子が意外に多いと指摘している。
AIと同じことをしてたらAIに駆逐されますよというのが、この記事のテーマのようだ。

 

うーん、うちの子も駆逐されちゃうよ、、、
どうやったら読解力を鍛えることができるのか。
頭を抱える日々が続いている。

GoogleAnalyticsにビビらされる

GoogleAnalyticsには、ほんとお世話になっている。

今、リリースしているアプリに仕込んでいるのだが、やばい不具合があるアップデートをしてしまった時など、アクティブユーザ数が素早く減るので、早めの対策がうてる。

 

先々週にようやく一連の不具合を解消したアップデートをだしてから、ユーザ数が順調に伸びてきて、毎日、GoogleAnalyticsをチェックするのが楽しみだったのだが、昨日、いきなり1日のアクティブユーザ数が激減し、前の日の1割程度になってしまった。

 

前のアップデートからかなりの日数が経過しているし、月末とかではないので時間的な要素がからむ可能性も考えにくい。ユーザの評価をチェックしても変化は無い。リアルタイムのユーザ数をチェックしてみても、むしろ増えてるように見える。全くこうなった理由が見当たらなかった。

f:id:miyaw:20161028094154p:plain

こうなるとGoogleAnalyticsの障害かなとGoogleのサービスステータスをチェックしてみても障害情報は見当たらない。

しばらく様子見にすることにして、もやもやした気持ちのまま一夜が経ち、今日ふたたびチェックしてみると、よかった、回復している。相変わらずサービスステータスには不具合情報は出ていないけど、こういうこともあるんだなー。

 

 

基本なことだけど品質は超重要

またまた更新をさぼっていた。

自分ではそう感じてなかったけど、案外、余裕が無い日々を送っていたのかもしれない。

 

日々の作業時間としては、そんな多くは無いと思っていたのだが、数年前にキチガイなプロジェクトに参加して、定時はPM10:00みたいな環境に長く身を置いてしまったせいか、感覚がズレてペース配分がうまくいかなくなっている。

 

今、思えば深夜まで働いたといっても、多くは無駄な会議とか、あまり意味の無い割に量だけは多いレポートを作成するとか、大して頭を使ってない。全労働時間に対して本質的な設計やコーディングにかける時間の割合はかなり低かった。

 

対して、今は会議時間ゼロ、形式的な文章作成は無し、ほとんどの時間を本質的な設計とコーディングにかけて頭を酷使しているので、時間が少なくても疲労度がデカイのは当然だ。

時間だけで頑張った度を計るのはよろしくないと再認識した。

 

で、余裕が無かったのは請負でやっているお仕事と平行して、リリースしたアプリのアップデートやら不具合対策に追われたからだ。

アプリの反響が良くて、ユーザさんからいろんなリクエストをもらって、調子にのってガンガンアップデートしてたら、結構な不具合を埋め込んでしまっていた。テストが不十分だったのだ。

 

大きな不具合があるとアプリの評価はてきめん下がり、ユーザ数の伸びもピタっと止まる。

魅力的な機能を素早く投入するより、不具合の無い品質の高いものを提供することのほうが重要だと身をもって知った。

あらためて、高い評価を得ている競合アプリをGooglePlayでチェックしてみると不具合的なレビューはとても少ない。やっぱり基本はおろそかにはできないなぁと反省するのでした。

 

WebViewのソフトキーボードにはまった

 

いま開発してるAndroidアプリでWebViewのテキストBOXをタップするとキーボードがでるんだけど、文字を確定させて「実行」とやってもキーボードが消えない問題があった。いちいちBACKボタンで消す必要がある。

これは不便なので、「実行」ボタンのタップを検知してJava側のコードでキーボードを消そうとしてハマったので、その記録を書いておく。

 

当初はWebViewにsetOnKeyListenerというメソッドがあるので、これを使えば楽勝! と思っていたが、ハンドラが呼ばれない。ではWebViewを拡張してonKeyDownをoverride! とやったがこれもダメ。

WebView.onKeyDownのリファレンスを注意深く読むとソフトウェアキーボードには効かないよと書いてあった(涙)。

 

StackOverflowなどを徘徊してdispatchKeyEventを実装する方法などを試してみたが、キー検知はできるものの日本語が入力できなかったりとうまくいかない。

結局、その他の試行錯誤もことごとく失敗し、半日程度を費やして失意のうちに帰宅。

 

翌日、InputConnectionWrapperを使えばうまくいけそうという情報をつかんでトライし、ようやく実現できた。

InputConnectionWrapperはキー入力のプロキシ的に動作するラッパクラスで以下のように使う。

 

まずはWebViewのラッパを作り、利用側で「実行」キーがタップされた時のコールバックを用意してそれを登録するという流れ。

 

 

わかれば簡単なのだけど、はまると時間喰うなぁ。。。

 

英会話、役に立つ

最近はコワーキングスペースでお仕事をすることが多い。

 

ここには私のようなコンピュータ系のお仕事をしている人もいるが、営業さんやデザイナさん、受験生など色々な人が居る。その中でiPhoneなどのスマホの修理を生業にされている方がいる。お客さんは直接、壊れたスマホを持ち込んで彼に修理を依頼しに来るのだが、今日は外人さんが訪ねてきた。

 

なんでも以前に修理した画面の接着が不完全で剥がれかけているので直してほしいということらしい。

画面を再び剥がすのに時間がかかるのだが、彼は明日に本国に帰らなければならないようだ。という内容をスマホの自動翻訳でお互いにやりとりしていたのだが、スマホが笑えるほどトンチンカンな訳をしゃべるので話が全然噛み合ってない。

しばらく聞いていたのだが、見かねて通訳を申し出たら意外と喋れてしまった。

後になってこう表現すればよかったと反省点はあるものの、おおむねOK。

 

セルビアの美人お姉さんとの英会話レッスンが効果を上げてきた気がするw

アプリをリリースして3週間。ASO対策を頑張ってみた結果

アプリをリリースして3週間ほど経過した。

 

当初はGooglePlayのカテゴリ内に掲載すらされなくて、非常に焦ったのだが、いろいろな施策を打った効果がようやく出てきた。これまでの施策を効果があった順にまとめてみた。

 

アプリ名見直し

これは超重要。一番重要。ASO対策の本を読んで分かってる気になっていたが、まだまだ甘かった。実際に試して分かったこともあった。

GooglePlayの仕様が分からないので確かなことは言えないが、以下に自分の仮説を書いてみる。

一番効いたと思われるのは重要なキーワードを識別できる状態にすること。

例えば電卓のアプリ名をつけるとき、「超速電卓」とすると「電卓」という一番重要なキーワードをGooglePlayのシステムが単語として認識できないようだ。

「超速な電卓」とすると「超速」と「電卓」を別々の単語とみなせる。もしくは超速というあまり一般的でない単語だとマズイのかも。「実用電卓」など一般的でメジャーな単語との組み合わせだとうまくいくのかもしれない。

 

広告出稿

これも効いた。非常に少ない投資でダウンロード数が伸びてきている。

一日の予算を1000円としてるのだが、まだ使い切ったことがない。

現在はコンバージョン単価を50円からスタートして一定期間ごとに倍にして、費用対効果を測定しているところ。

 

SNS拡散

 これはやらないよりはマシといった程度。お友達数もそこまで多くなく、リリースしたアプリがAndroidオンリーで、周りにはiPhoneユーザが多いのであまり効果がなかった。プライベートなSNSにお仕事の話を持ち込むのはためらいもあり、別にやらなくてもよかったと若干の後悔。

 

レビュー依頼

 Androidアプリを扱っている5つのサイトにレビュー依頼を送ってみたが、今のところ掲載はない。今後に期待?

 

といったことろで、まだまだダウンロード数は伸びてないが、上昇傾向にあるのは気分が良いので頑張っていこうと思う。