IT関連雑記帳

IT関連の話をつらつらと

技術書を読み終わりました

3月末にAndroidの技術書を買いました。

ta9mi3.hatenablog.com

ひと通り完了したのが5月末だったので、2ヶ月かかったということになります。


以前どこかで「副職の為にプログラムを習いたいという」プログラム未経験者の話を聞いたことがありますが、毎日1時間ぐらいじゃあ無理だろうなと思ったしだい。甘くは無いよね、やっぱり。


この本の感想はというと、基礎的なところは一通り書いてあると思うので良い本だと思います。ただ、ところどころ間違いだったり、分かりづらいところがありました。


「具体的にどこ?」と聞かれると……どこだったかな。付箋を付けて置けば良かった。


書籍に関するサイトを見たのですが、正誤表が1件も無かったので、そこだけは不満でした。でも、それを除けばこの本を選択して良かったと思います。Javaを少しでも知っていて、Androidのアプリを作ってみたいという人にはお勧めです。


というわけでして、今月の頭から実際に作りたかったアプリの開発に着手したのですが……。


やっぱり実践は違うものでして、クラスやらAPIをあまり知らないからGoogle先生に頼りっきりだし、せっかくだからとGitHubとの連携を試みたり、JavaだけじゃなくKotlinも少し調べる必要があったりと、なかなか進まないですよ。


作りたかったアプリの完成はいつの日だろう。

Echo Show 5でビデオ通話できるようにしました

買いました、Amazon Echo Show 5

f:id:ta9mi3:20200510214014j:plain:w640

自分用じゃなくて、実家の両親に使ってもらおうと思って買ったのです。

実は、以前に古くなったスマホGoogle Hangoutを利用してビデオ通話のシステムを構築したのですが、80代の両親には難しいらしく、ほぼ使うことが無かったんですよね。スマホも古すぎてHangoutが起動できなくなることも頻繁に発生していましたし。

なので、声で使用できるEcho Show 5ならどうかなーと思いまして。

f:id:ta9mi3:20200510214420j:plain:w640

実家にもっていく前に、まずは自宅でセットアップしました。環境は以下になります。

■自宅

■実家

■兄弟

ちなみに実家のiPad + Amazon Alexaですが、僕のiPadを使用しているため、実家ではなく僕の手元にあります。Amazon Alexaを使用するためにSMSによる認証が必要なのですが、iPadはSMSを受信できないので一度AndroidにSIMを入れて認証をさせるというひと手間が必要でした。

なお、この時に自宅用と実家用のSIMの電話番号を誤って入れ違えてしまうという問題が発生。ネットで検索するとAmazonのアカウントを作り直す必要があるとのこと。


え? アカウントを消さないといけないの。今までの買い物履歴とか、Kindleコンテンツを失うのは厳しいなぁ……


と思ったのですが、色々とがんばって何とか電話番号を入れ替えることに成功。手順をここに書こうと思っていたのですが、忘れました。ごめんなさい。

とまあ、なんだかんだあったのですが、Echo Show 5のセットアップが完了したので、テストのため兄弟とビデオ通話。マイクの位置が悪いのか、こちらの声が若干聞こえづらいようでしたが、まあ良し。


数日後、実家に戻り、居間のテレビの前にEcho Show 5を設置。簡単な操作方法を書いた紙を見せて、親に使ってもらいました。

父親は2年前の脳梗塞の後遺症があるため発声に難があるのですが、なんとか認識はしてくれるようで、無事に使用することに成功。遠方に住む子供たちとのビデオ通話に大はしゃぎしてました(笑)

ただ、高齢なのでやっぱり自分の行動を機械に合わせるのが難しいようで、Alexaの返信を待たずに話を初めてしまったり、同じ間違いを何度も繰り返したり。

もしかしたらAlexaの設定を変えてあげればもっと上手く使えるようになるのかもしれませんが、もうちょっと音声認識の幅を広げて欲しいなと思いました。高齢者が使用する状況はそんなに多くはないでしょうから、データもあまり蓄積できていないのかな……。

とまあ、Amazon Echo Show 5を設置した話でした。スマホぐらいの画面サイズだけど、なかなか使い勝手良かったです。僕も欲しいな、Echo Show。


今回は以上です。

バグダスというゲームで遊びました

Steamのあなたのディスカバリーキューを見ていたら、気になったゲームが表示されました。リリースは2019年の1月なので、何周遅れなんだと言われそうだけど記事にしておきます。


f:id:ta9mi3:20200430181557j:plain:w640


100円だったということもあって、即買いでした。
どんなゲームかというと、タイトルで分かっちゃうと思いますが、バグを見つけるゲームです。


f:id:ta9mi3:20200430181749j:plain:w640
全部で8問。


f:id:ta9mi3:20200430181943j:plain:w640
虫眼鏡を移動させて、おかしなところを見つける問題。


f:id:ta9mi3:20200430182111j:plain:w640
どこかで見たことのあるようなゲーム画面も登場。


ゲームがゲームなので「きっとこの辺だろうな」と思った通りの不具合が仕込まれていて、問題数が少ないという事もあり、あっという間にクリア。


f:id:ta9mi3:20200430182610j:plain:w640
Steamの実績は全部で12個あります


面白いかどうかといわれると仕事を思い出してしまうので「・・・・・・」という感じでしたが、こういうようにゲームを使ってテスターを教育をできないかなってヒントにはなりました。そういう意味では、100円以上の価値があったかもしれません。

自分が作るとしたらどうかな……

  • 不具合を書くパズルゲーム
  • ステージ制じゃなくて1本のRPGを作り、その中でわざと残したバグを見つけるゲーム
  • テストチームをマネジメントするゲーム
  • テスターと開発者がバトルする格闘ゲーム

ちっとも面白くなさそうだ(笑)

Androidの技術書を買いました

久しぶりに技術書を買いました。

TECHNICAL MASTER はじめてのAndroidアプリ開発 Android Studio3対応 第3版

f:id:ta9mi3:20200329212136p:plain
ちなみにアフィリエイトやってないんで、画像をクリックしても何もおきません。

「入門書かよ!」と思われるかもしれませんが、入門書です(笑)

Java言語自体の説明はほとんど無いので、完全な初心者向けというよりはJavaプログラマー向けの本という感じでしょうか。

ちなみに私、Javaを仕事で使ったことはほとんどありません。いちおう資格は持ってますが、Sun Microsystems時代のJava資格で、取得したのが2003年と、ひと昔どころの騒ぎではない骨董品です。


モバイル系の受け入れ検証業務を行っている関係なのか、定期的にAndroidアプリを作りたくなる病気にかかるんですよね。手元にあるAndroid開発に関する書籍はかなり古いものになっていたので、新しく買い直したしだいです。

久しぶりにサンプルコードを打ち込みながら書籍を読み進めていますが、面白いこと、面白いこと。まだ2章、全体の20%ぐらいしか進んでいないので簡単なアプリを作ってビルドするぐらいなのですが、それでもじゅうぶん楽しいですね。

ビルドエラーで表示される日本語が文字化けていて、探し回って見つけた修正方法を試しても直らず。

うーん……

と悩んだあげく、念のためAndroidStudioを再起動したらあっさり直る。そんなことすら楽しい。ゲームと同じようにレベルアップが目に見えて分かるという、入門書にはご褒美系の報酬がありますよね。

作りたいアプリに着手したら、きっと楽しいだけじゃ済まないとは思うんですが、しばらくは動かす楽しみに浸っていたいと思います。

「技術書を買いました」という話をしたら、「有名アプリを無料で使えるようになるアプリを作ってくれ」という注文がきたので、さっそく作りましたよ。見てやってください。

f:id:ta9mi3:20200329212549p:plain:h640

今回は以上です。

「ひとり情シス」虎の巻という本を見つけて、昔のことを思い出した話

仕事で「とある課題を解決するための対策案を出してください」という課題を与えられ、みんなしてうんうんとうなっています。

そのような状況下で、Books&Appsで以下の記事を読んでいたんですよね。

blog.tinect.jp

対策案というキーワードが頭に入った状態だったからか、以下の一文に興味を持ちました。

その中で今でも最も役に立っている教えの1つが、

コンサルタントは、絶対に提案しちゃいけない」との教えだ。

まあ、実際のところ私の方はコンサル業務では無いので何かしらの提案資料を持っていかないといけないのですが、先方は本当のところ何を欲しがっているのかというところまで気が向けられるようになったのは良かったと思います。

で、気になったワード、「コンサル」「提案しない」という2つのワードでGoogle先生にお問い合わせしたところ、「ひとり情シス」虎の巻という本を発見しました。

f:id:ta9mi3:20200219234505p:plain:h320

Google Booksで最初の方を読むことができたので、少し読んでみたんですが面白そうですね、この本。

仮想環境を作るとか、どことなく懐かしい感じ。

そういえば昔は自宅に余っているパソコンを使って、Linuxでサーバーを無駄に立ち上げたりしてたっけ。Samba入れてみたり、Apache + TomcatでWebサーバを構築してCGIの勉強したり。

最近はあまりそういうことやってないなぁ。

今は仕事でIoT絡みにも手を出しており、Eclipse Leshanに興味があるので久しぶりに遊んでみようかな。

そんなことを思い出したり想像したりしていました。

本の方は未購入なのですが、近々手に入れて読んでみたいと思います。本の感想はまたその時にでも。

はねぴょん健康ポイントアプリ

年末から、はねぴょん健康ポイントアプリというものを使い始めました。
毎日の歩数や生活習慣をポイントに換算してくれるもので、体を動かす事に対してちょっとだけモチベーションが上がるアプリです。

使った記事はこちらにアップしてありますのでご参照ください。

ta9mi3-diary.hatenablog.com

で、テストエンジニア的に若干気になる挙動がありまして、とりあえず3点ほど書いておきます。

地図を拡大縮小したときのスタンプのまとめ方がおかしい

はねぴょんのスタンプを集める機能があるのですが、地図に表示される数がおかしい箇所が複数地点で確認できました。
例えばこの地図上、六郷土手の駅の近くに6という数字が書かれたはねぴょんのアイコンがあると思うんですが、これは何かというと、その近くに6個のスタンプが存在するという意味です。地図を拡大表示するとアイコンが分散され、スタンプの正確な場所が分かります。

f:id:ta9mi3:20200112001642p:plain:w400

で、実際に拡大して、分散表示されたアイコンを赤枠で囲ってみると……

f:id:ta9mi3:20200112001954p:plain:w400

どう見ても7個あります。
再度縮小すると、赤枠で囲んだ一番上のアイコンが雑色駅の近くにある「9」という数字が書かれたアイコンに吸収されたので、そういうことなんでしょうね。
地図を拡大するときと縮小するときで対象となるアイコンが変わるのは、ユーザーの混乱を招くと思うのでよろしくない動作です。

キャラクター図鑑の画面レイアウトがおかしい

はねぴょんのスタンプ一覧ページがあります。
f:id:ta9mi3:20200112000049p:plain:w400

ここではねぴょんをタップすると拡大表示されるのですが、画面に収まっておらず、右側がはみ出ています。

f:id:ta9mi3:20200112003154p:plain:w400

画面を指でスライドさせると右側を確認できます。

f:id:ta9mi3:20200112003252p:plain:w400

ですが、後ろの画面を確認するとわかりますが、右側が白くなってしまっています。ここで「閉じる」をタップすると、以下の画面になります。

f:id:ta9mi3:20200112003715p:plain:w400

分かりますかね。先ほどの画面で暗くなっていた箇所がそのまま明るくなった状態であり、右側が白くなったままです。その影響で、今度は画面の左側が切れてしまっています。
この状態は左右フリックでページを切り替えてもそのままであるため、一度メイン画面に戻ってから再びキャラクター図鑑画面に戻らないと直りませんでした。

と、ブログ記事を書くにあたって動作を再確認していたのですが、キャラクター図鑑のページ、上下に動かす事ができました。画面サイズに合わせた表示ができないという不具合になるのかな、と思います。

スタンプの並び順に違和感を感じる

気が付きましたかね? スタンプの番号が1から始まっていないんですよ。
取得した順番に並んでいるのかなと思うのですが、一般的なアプリでは1から始まりませんか? ソート機能も無いですし。
これは不具合とは言い切れませんが、ユーザーに違和感を感じさせるという事で仕様担当者に問い合わせを行う事象です。というか、仕様を決める時に思いつかなかったのでしょうか?

という感じで3点ほど気になる点を記載しましたが、別にアプリにケチを付けようとしているわけではありません。もう1つのブログに書いたように、楽しく使わせて貰っていますので。

ああそうだ、明日のはねぴょんスタンプ回収計画立てないと(笑)

以上、単なるテストエンジニアの独り言でした。

mixiのイベントデータをGoogleフォームとスプレッドシートに移行した話

この年末を利用して、mixiのコミュニティ内のデータを移行させるということをやっていました。やりたいことは簡単な内容でしたが、経験不足という事もあっていろいろと躓いたこともありますので、顛末をブログにまとめておくことにします。

データ移行を行うことにした理由

mixiのランニング関連のコミュニティで、あるイベントを開催していました。

イベント内容は、コミュニティに参加しているメンバーが走った距離をイベントページに書き込んで合計し、全員の力を合わせてある目的地まで行こうというものです。最初のうちは全員のモチベーションが高かったのですが、mixiのアカウントやログインパスワードを忘れた、走行距離や累計の距離を計算するのがめんどくさいといった理由から、徐々に書き込みが減っていきました。最終的には私ともう1名ぐらいになってイベント自体が立ち行かなくなってしまったため、イベントの進め方を変える必要がありました。

移行先の選定

仕事でお問い合わせフォームを作るという経験があったので、同じようにGoogleフォーム + スプレッドシートを利用することにしました。

データの用意

mixiからのデータの抽出は、経験のあるnode + puppeteerを利用することにしました。
イベントページのHTMLの構成は分かりやすかったので、「これなら簡単に抽出できそうだな」と思っていたのですが、mixiへのログインで問題が発生しました。

f:id:ta9mi3:20200101200247p:plain

おそらく、以下の記事にあるように不正ログイン対策に引っかかっていると思われます。

sns.mixi.co.jp

User Agentをチェックしているのかなと思いましたが、変えてみても結果は変わらずでした。「さて、どうしたものか」と考え、「ログインできないならログインしなければいいじゃん」ということでイベントページそのものをPCに保存して、ローカルファイルを参照することにしました。手作業でmixiのイベントページにて全てのコメントを表示させ、イベントページを順番にPCに保存していきました。

データの抽出

ローカルファイルからPuppeteerでデータを取り出します。
コメント番号、投稿者、投稿日時、コメントの4点をcsvファイル化していきました。この作業はあまり難しくありませんでした。

for (var itemIdx = 0; itemIdx < itemList.length; itemIdx++ ){

	const NoAndName = await itemList[itemIdx].$$('a[class="COMMUNITY_EVENT_eventList__nameLink"]');

	const itemNo = await (await NoAndName[0].getProperty('textContent')).jsonValue();
	const userName = await (await NoAndName[1].getProperty('textContent')).jsonValue();
	const itemDate = await (await (await itemList[itemIdx].$('p[class="COMMUNITY_EVENT_eventList__date"]')).getProperty('textContent')).jsonValue();
	const itemText = await (await (await itemList[itemIdx].$('div[class="COMMUNITY_EVENT_eventList__textArea"]')).getProperty('textContent')).jsonValue();

	fs.appendFile('c:\\temp\\earth4.csv', itemNo + "," + itemDate + "," + userName + "," + "\"" + itemText.trim() + "\"\n", (err) => {
		if (err) throw err;
			console.log('done');
		});
}

データの整形

取り出したコメントには「イベント開始からの経過日数、走った距離、走った距離の累計、ひとこと」が書いてあります。いちおうフォーマットは決まっていましたが、ルール通りに記載されていないものや、ひとことしか書かれていないコメントなどがありましたので、自動的ではなく手作業でデータの整形を行っていきました。

整形後のデータの形式は、「投稿日時、投稿者、走行距離、コメント、経過日数、走行距離(累計)、目的地までの残りの距離」というものにしました。

データをスプレッドシートに挿入する

Googleフォームでテストデータを何件か入力し、作成されたスプレッドシートに上記のデータを挿入しました。挿入場所は、Googleフォームで追加されたデータとタイトル行の間になります。

GASの作成

投稿者の負担を考え、Googleフォームでは「投稿者、走行距離、コメント」のみ記載してもらうことにしました。スプレッドシートにデータを追加された場合に、「経過日数、走行距離(累計)、目的地までの残りの距離」を自動計算するように、GAS(Google Apps Script)を作成しました。

GASはあまり経験はありませんが、ExcelVBAはよく使っていますので、スプレッドシートの操作に対する理解はあまり悩まなかったと思います。

公開と問題の発生

Googleフォームで追加したデータは、基本的にスプレッドシートの下に追加されていきます。そのため、スプレッドシートを閲覧した時に最下行まで行かないと、登録した自分のデータを確認できないという問題がありました。対応として、以下のことを考えました。

  • スプレッドシートを投稿日時(A列)の降順にする
  • Googleフォームによりデータが追加された場合、いちど投稿日時の昇順に直し、データの整形が終わったら降順に戻す

ところが、うまくいきませんでした。

問題の調査と対処

降順に戻した後、「経過日数、走行距離(累計)、目的地までの残りの距離」を自動計算するのですが、なぜかセルが空白となってしまいます。調査をしたところ、Googleフォームから受け取ったデータが最下行ではなく、なぜか必ず8行目に挿入されるという事象が発生していました。

うーん……

再び考え、以下の対応をすることにしました。

  • スプレッドシートは投稿日時の降順のままとする
  • Googleフォームから受け取ったデータの行番号を調べ、該当の行をスプレッドシートの2行目に移動させる(1行目はタイトルなので2行目からがデータです)
// 該当データを一番上の行に移動させる
var inputRange = e.range;
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var range = sheet.getRange(inputRange.getRow(), 1);
sheet.moveRows(range, 2);
  • 経過日数などを計算させる

この対応で上手く動作するようになったので、とりあえず良しとします。
8行目に追加されてしまう原因は、おそらくGoogleフォームが持っている内部の行番号が影響しているのかなと思うのですが、原因が分かる人がいたら教えて頂きたいです。

最後に

ちょっと躓いたところなどを、何年か後の自分のためにまとめておきました。
まあ、mixiのイベントのコメントの移行をすることは二度と無いでしょうが、スプレッドシートの並び順を変えるとたいへんということだけは覚えておきたいと思います。

後は、イベント参加者がちゃんとGoogleフォームを使ってくれれば……。
なにとぞ、なにとぞー。