*.mdファイルを読み込んで整形してHTMLファイルに書き出すスクリプト

*.mdの内容をブロック要素ごとに分けて*.htmlとして出力するスクリプトを(けっこう前に)書いた。

f:id:wifeofvillon:20180312132109p:plain

github.com

description

*「利用規約とかライセンスとかのマークアップがアプリのAssetとサーバー上とで違うのdiff確認しづらくない?」
*「そのへんマークダウンで管理したいよね〜」

みたいな雑談が聞こえた後30分くらいで雑に書いた。

usage

npm installしてnpm testすると、SAMPLE.mdの内容を元にSAMPLE.html内の{{%}}を置換するかたちでTEST.htmlを生成する。

feature

マークダウンテキストをまるまるhtmlにパースして<body>に突っ込むのではなく、ブロック要素に分けてパースするようにした。

dependency

  • fs: ファイルのReadWriteはNode
  • markdown.js: マークダウンテキストのパース

github.com

課題

あまりにも雑に書いたので実際に使うならなんかもうちょっと考える必要がある。

そもそもReactなりVueなり使えばいいのでは……と思ったけどそれだとアプリのAssetで使えないのか……

Nodeクックブック

Nodeクックブック

【QA】QAとして開発チームにお願いした4つのこと

このエントリではゴリゴリの開発者ではない人間が、QAとしてアプリケーション開発チームに参加した後、実際にチームメンバーにお願いした内容を紹介する。

f:id:wifeofvillon:20180310200737j:plain

※この記事は以下のエントリ(英語)を和訳・追記したものです

medium.com

前提として

書いた人のスペック

ここ数年仕事としてソフトウェア開発はしてなかったけど、個人的にHTML5+JSベースのツールを公開したりはしていた。

求人票に書かれていた条件は次のような感じで、アプリケーション開発に関する知識は求められていなかった。

  • 日本語と英語でコミュニケーションがとれる
  • 文章でバグの内容を説明できる

そこへたまたま

  • アジャイルGitHub/カンバン/チャットツールベースのプロジェクトを経験している
  • GingerbreadかHoneycombくらいまでの古いAndroidアプリ開発の知識がちょっとある
  • テストケースを自分で作れる
  • MaterialDesign万歳

みたいなスキルセットで参加したので、1ヶ月ちょっと働いたあたりで「ちょっと待遇面について話そう」ということになった。そのときした話がこのエントリの元になっていて、待遇面の変化についてはまた別に書く。先に言っておくと時給が3割以上上がった。

どういう仕事をしているかというのはこの前別のブログに書いた。

growgrass.hatenablog.com

読んでみて欲しい人

このエントリは次のような人にとって役に立つかもしれない。

  • チームが大きくなってきてQAを雇いたいなーと思い始めたマネージャー
  • すでにQAと仕事をしていて、実機を使ったテストを依頼する開発者
  • 元々開発やってて初めてQAとしてプロジェクトに加わる人

1. 開発者の事情は不必要に考慮したくない

当たり前なんだけどユーザーの大半は開発側の事情を知らないし、考慮しようとも思わないので、QAとしてはそういう実際のユーザーの気持ちを尊重していきたい。

例えばバグを報告したときに「KitKatではそのAPI使えなくて〜」とか「実装するのめちゃくちゃ難しくて〜」みたいな開発者側の情報は書いてもいいけど、それよりも先に「バグなのか仕様上しょうがないのか」「直すのか直さないのか」を答えてほしいという気持ちがある。

メンバーに誠実であろうとしてロジックとか閾値とかOS仕様を説明したくなる気持ちはすごく分かる。分かるけど私は読み飛ばしていくからな(後述)。

2. テストの方法や質問への回答を明確に書いてほしい

結果的にたまたま偶然開発知識がある人間が参加してしまったけど、QAとして開発知識を持たない人間を雇う利点は客観的なブラックボックステストができるということだと思う。開発側の事情に忖度して「これ変だけど仕方ないか」って考え始めるともう人の手でわざわざ端末操作して目視で確認する意義がなくなる。
あと本来読まなくていいものを読んだり、確認しなくていいものを確認したりするようになると、限られた時間内で上げられる成果が小さくなるので極力やりたくない。

何人かで協力してバグを修正したり新機能を実装していく中で、「これは他のメンバーのために残しておいたほうがいい」と判断した情報をTrelloのカードに追記するのはすごくいいことなのでやってくれていいんだけど、私がいちいち「誰向けの情報か」を判断せずに読み飛ばせるよう、開発者向けの情報とQA向けの情報は明確に区別して記載してほしいというお願いをした。

3. フォーマットは守ろう

ここまでに挙がったことはフォーマットを守ってコメントを書けば達成できるので全然難しいことじゃない。

  • 確認してほしい環境(弊社の場合DeployGateのビルドバージョン)
  • 確認してほしい箇所
  • どうなっていてほしいか(もしくはその逆)

動作確認に必要な情報って基本これだけなので、開発メンバーの間で共有しなければいけない話は<hr>とか入れて区切るとかインデント下げるとか2秒でできる工夫をしてほしい。

以前はTrelloのカードにPull RequestのURLが貼ってあるだけみたいなカードでも動作確認していたんだけどあまりにも精神衛生によくないのと、純粋に効率が悪いので「今後はねーから!」宣言をした。これは具体的に言うと

  1. Pull RequestのMerge元のブランチ名を確認して
  2. ブランチ名から配布パッケージを探して
  3. Pull Requestのコメントを読んで再現手順を確認して
  4. 実機で動作確認をする

という手順で作業をすることになる。最初のステップで既にGitHubを使った開発知識がないと詰むし、PRに再現手順書いてるならそれカードにコピペするだけで私がリンク踏む必要なくなるよね?と念押しした。

ただ弊社環境、CIが止まってビルドされるまで時間がかかることがよくあるので、そういう場合はDeployGateの配布パッケージを書く代わりにブランチ名を書いてもらうようにした。

4. 変な質問をするかもしれないけど実装者を責めているわけではない

「変な質問」というのはほとんどが開発者にとって当たり前であることを確認するような質問で、もちろん実装者を責めているわけではない。実際にあった例でいうと「SMS送信の権限与えてないのにSMSに返信できるのはOKなの?」みたいな話。

人間は良くも悪くも慣れる生き物なので、ずっと同じ機能を実装していると慣れて見落とすことがある。「テスト用の文言を入れたままリリースしてユーザーに指摘される」みたいなミスは最悪だけどいろんな会社のいろんなプロダクトでよくある。そういうミスを防ぐためにPull Requestを送って複数人の目で確認してQAが実機で確認する、というプロセスを踏んでいるので、品質を上げるためだと思ってほしい。

最後に

デザイナーと開発者とQA、なんなら事務方を加えてもいいんだけど、みんな目指すべきゴールは「ユーザーの満足」なので、良いものができるように協力してやっていきましょう。

Android改善プログラミング (SHOEISHA DIGITAL FIRST)

Android改善プログラミング (SHOEISHA DIGITAL FIRST)

入門 Androidアプリケーションテスト

入門 Androidアプリケーションテスト

tl;dr

この日本語版を書いていて思ったんだけど、

みんな目指すべきゴールは「ユーザーの満足」なので

最後のこの部分を見失いがちなプロジェクトが巷にはすごく溢れているんじゃないだろうか。リーダーとか営業とか役員とかホールディングスとか受注元とかの顔色を窺って「いかに無難にそのプロジェクトを終わらせるか」が目標になってしまうケースは今までたくさん見てきた。

なので、こういう「ゴールを見失わないチーム」にいられることはとても幸せなことだし、できれば世の中の全てのチームが(業種問わず)そうなればいいよねと思う。

もちろんこういう気持ちになれるのは金銭報酬とか拘束時間とかの待遇に納得しているからなので、そういう合意を取らずに綺麗な目標だけ押し付けてくる職場は当たり前だけどよくないと思う。

【Android】端末標準の電話機能でSIPを使う方法(受信・送信)

設定から送信までまとめて日本語で書いてあるエントリがあんまり見当たらなかったので書く。

description

SMARTalkとかChiffonみたいなサードパーティアプリを使わず、050から始まる電話番号も使わず、Android端末の電話機能でSIP電話を受ける・かける方法。

スクショはNexus5 (Android 6.0)のものを掲載。

play.google.com

play.google.com

overview

  1. Android端末にSIPアカウントを割り当てる
  2. SIPアドレス宛てに電話をかける

Android端末にSIPアカウントを割り当てる

Android端末をSIP電話の受信機にするにはSIPアカウントを割り当てる必要がある。

key value
ユーザー名 foo
パスワード bar
ドメイン example.com

「foo@example.com」宛てのSIP電話を受信するための設定手順はだいたい以下の通り(例外多数)1

  1. 「電話(Phone)」を開く
  2. 連絡先検索バーの「…」をタップ
  3. 「設定(Settings)」をタップ(→画像)
  4. 「通話(Call settings)」をタップ
  5. 「通話アカウント(Calling accounts)」をタップ(→画像)
  6. SIPアカウント(SIP accounts)」をタップ(→画像)
  7. SIPアカウント」一覧のヘッダの「+」をタップ(→画像)
  8. ユーザー名、パスワード、ドメインを設定して「保存(Save)」(→画像)
  9. 「通話アカウント」画面で「着信を受ける(Receive incoming call)」をオンにする

f:id:wifeofvillon:20180308122912p:plain

f:id:wifeofvillon:20180308122946p:plain

f:id:wifeofvillon:20180308123826p:plain

f:id:wifeofvillon:20180308124026p:plain

f:id:wifeofvillon:20180308124257p:plain

SIPアドレス宛てに電話をかける

「foo@example.com」宛てに電話をかける場合「連絡先(Contact)」にアドレスを登録してしまうのが多分一番早い2

連絡先の「その他の項目(More fields)」に「SIP電話」の項目があるのでそこに「foo@example.com」を登録する。(→画像)

f:id:wifeofvillon:20180308125219p:plain

tl;dr

読まなくていい個人的にハマったところ

  • SIP ♯とは(→IP電話プロトコルの一種だよ!)
  • ドメインをタイポしまくる(→コピペするか他の人にも確認してもらおう!)
  • 「着信を受ける」がオンになってない(→送信はできるけど受信はできないよ!)
  • Wi-Fiがオンになってない(→インターネットに繋がってないと使えないよ!)

マスタリングTCP/IP SIP編

マスタリングTCP/IP SIP編


  1. ZenFoneシリーズだとそもそもこの通話設定が電話じゃなくてWi-Fiとかあの辺の設定と一緒に設定画面にあったり、メーカーによって微妙に画面遷移が違ってたりする。

  2. ダイヤルパッドからアルファベットと記号打てそうな気がするんだけどやり方がわからなかった

【MONA】tipmonaを使う方法

仮想通貨界隈が焦げ付いている今日この頃ですが、@を使った投げ銭を試してみたのでメモ

tipmonaの使い方

tipmonaはTwitterを使って投げ銭ができる仕組みで、送金以外にも残高参照などもろもろの機能をCIっぽく使うことができますが、TwitterAPI制限もあるので実質使うのは送金の「tip」だけになりそう。

送金以外の機能はだいたいMonappyからでも可能です。

@tipmona tip @${screen_name} ${value}

他のコマンドは公式ドキュメントを参照のこと。

monappy.jp

Monappy⇔tipmona間のMONA移動

今回はMonappyでMONAを貸してくれる人を募り、Monappyで投げ銭してもらったMONAをtipmonaで返してみました。

今回引っかかったのは「Monappyとtipmonaのウォレットは別」という点でした。簡単な図を用意しましたが、Monappyで借りたMONAをtipmonaで返すには

f:id:wifeofvillon:20180128171456j:plain

  1. Monappy上で受け取ったMONAはMonappyのウォレットにプールされる
  2. Monappyから手数料0.01MONAを払ってtipmonaのウォレットに入金する
  3. tipmonaでMONAを送金する

という手順を踏む必要があります(必然的に0.01MONA目減りする)。

毎回約7円くらい目減りするというのもアレなので、ウォレット間のMONA移動はある程度MONAが溜まってからの方が良さそうな気がしました。

MONAの入手方法

MONAbitbank.ccbitFlyerで購入することもできるのですが、口座開設の身元確認に少なくとも1営業日はかかるので、1MONAくらいなら絵が描ける人はMonappyで投げ銭してもらう方が早い気がします。

↓実装中

macOS High Sierra の「Month 13 is out of bounds」エラーに対処する(β)

f:id:wifeofvillon:20171201084934p:plain

NOTE: Mac初心者が成長するためのぼっちアドベントカレンダー・21日目

WIP: このエントリで紹介している内容には開発者向けbeta版の話題を含みます

前置き: 筆者のマシンに起こっていたこと(2017-12-21現在)

今回のエントリを書く背景には大きくふたつの問題があり、今回はひとつめの問題について対処した話をします。

  1. 大した作業をしているわけではないのにハング→再起動を繰り返す
  2. 艦隊これくしょん-艦これ-」と「刀剣乱舞-ONLINE-」を同時にGoogle ChromeでプレイするとCPU使用率がすごく高くなる

macOS High Sierraで起きていた(いる)「Month 13 is out of bounds」エラー

元々「滅多にフリーズしない」と言われているMacをやたらハングさせる筆者ですが、12月上旬は5日に1回ペースだった異常終了がどんどん頻繁になっていき、ついには12月20日の時点でブラウザ上での作業が困難になりました。

Macのログメッセージを確認する

Macでは「コンソール」を使用することでログメッセージを確認することができます。

support.apple.com

最初はSystem.logに適当にあたりをつけて再起動直前の状況を知ろうと思っていたのですが、とにかくものすごい勢いで「Month 13 is out of bounds」というエラーが吐かれていることを発見しました。

f:id:wifeofvillon:20171221221447p:plain

「Month 13 is out of bounds」エラー

これはCore Foundationに作り込まれているバグらしく、スペックがあまりに低いわけでもない限りそこまで著しくCPU使用率を逼迫させていたわけではないようです。

applech2.com

Core Foundation - Wikipedia

ただ筆者が使っているマシンがCore i5/メモリ8GBという微妙なスペックであること、常駐アプリが多いこと、Chromeで大量にタブを開いて作業をしていることなどが重なり、頻繁な再起動に繋がったのではないかと考えています。

とりあえずの対応としては以下が挙がっています。

  • システム時間を2017年12月以前に戻す
  • UserEventAgentをkillする

システム時間をいじるのは影響範囲が大きそうなのでやりたくないのと、UserEventAgentが何をやっているプロセスなのかググってもよくわからなかったのとで、他の対応を取ることにしました

applech2.com

対応1: mdworkerを止める

mdworkerというSpotlight検索のプロセスが、UserEventAgent以外で頻繁にエラーログに出現していたので、元々Spotlight検索をそれほど使っていなかったこともあり、マシン内を検索しないように設定しました。

webhoric.com

対応2: メモリを意識的にクリアする

下のエントリでMagicanLiteというアプリを紹介しています。常にCPU/メモリ使用率を意識してチェックするようにし、頻繁にメモリをクリアするようにしたのですが、「艦隊これくしょん」で遠征に出すことすらつらいという状況でした。

wifeofvillon.hatenablog.com

あとMagicanLiteがすげー勢いで「Month 13 is out of bounds」を吐く……

対応3: ChromeHelperをできるだけ立ち上げないようにする

Google Chromeを使っているとChromeHelperというプロセスが実行されます。
これがCPUもメモリも食う上にタブの数だけ(?)増えるという状態だったので一部の作業というか、連隊戦イベント絶賛開催中の「刀剣乱舞-ONLINE-」をSafariで実行するようにしました(薄々そんな気はしていたのですが案の定あまり意味はありませんでした。これについては明日書きます)。
また、できるだけタブを開きっぱなしにしないようにしましたがこれもまた限度がありました。

今検索したら良さげなコマンドがあったので明日試そう。

ottan.xyz

対応4: 「macOS High Sierra 10.13.3 beta 2」をインストールする

イムリーなことに12月19日に開発者向けbeta版がリリースされていたので、完全に力技なんですけどインストールしました。

minatokobe.com

Apple Developer

夫のアカウントを使ったので確証はないんですけど、以下の条件を満たす必要があるかもしれません。

  • Apple Developer Accountを持っている
  • メンバーシップを購入している

結論: 正式リリースはよ

とりあえずこれを書いている現状、理不尽な再起動は起こっていませんが、Google Chromeが阿呆ほど重いのと、Beta版なので(「Month 13 is out of bounds」でない)エラーログが尋常じゃない勢いで吐かれています。

はよう正式リリースを頼む。

おわりに

図らずもアドベントカレンダーのネタができてしまったことを嘆く筆者のツイートです。

Macでフルスクリーン化(最大化)した複数のアプリをひとつのディスプレイに表示させる方法

f:id:wifeofvillon:20171201084934p:plain

NOTE: Mac初心者が成長するためのぼっちアドベントカレンダー・20日目

フルスクリーン化(最大化)したふたつのアプリをひとつの作業領域(ディスプレイ)に表示させる

先日、Mission Controlを使って複数の作業領域を使う方法について書きました。

wifeofvillon.hatenablog.com

今日は「絶対できること知らない人いるって!」と言われたので、フルスクリーン化したふたつのアプリをひとつの作業領域に表示させる方法を紹介します。

上の表現だと意味不明だと思うんですけど要するにこういうこと(Atom+Trello)

f:id:wifeofvillon:20171220194612p:plain

複数のアプリをひとつの作業領域に表示する

実現方法は次の通りです。

  1. (前提:ふたつのアプリをフルスクリーン表示にする)
  2. Mission Controlを表示する
  3. 片方のアプリをもう片方のアプリにドラッグ&ドロップする

f:id:wifeofvillon:20171220195503p:plain

f:id:wifeofvillon:20171220195507p:plain

f:id:wifeofvillon:20171220195510p:plain

解除方法

何気なくやってできたのでちゃんと調べていないのですが、筆者は片方のアプリのフルスクリーン化を一旦解除することで元に戻しています。

余談

これ無限にアプリ追加していけるのかと思ったらそうでもなかった。

おわりに

ちなみにネタ提供者は曲面ディスプレイ使いでした。はぁなるほど

Macの「カレンダー」にGoogleカレンダーの内容を同期させる

f:id:wifeofvillon:20171201084934p:plain

NOTE: Mac初心者が成長するためのぼっちアドベントカレンダー・19日目

Macの「カレンダー」にGoogleカレンダーの内容を同期させる

生活基盤の結構な割合をGoogleAmazonに握られているので「全部ブラウザでいいじゃん」と思っていました。
ただ次のエントリを書いたときに「通知センターって実は超便利なのでは?」と思ったのと、Twitterで「ネタがない」と呻いていたら@さんからお題を頂戴したので、Googleカレンダーを「カレンダー」で読み込んでみることにしました。

AppleアカウントにGoogleアカウントを連携する

ログイン中のAppleアカウント(で合ってる?)と連携しているインターネットアカウントはシステム環境設定 > インターネットアカウントの「アカウント」タブで確認・追加・削除できます。
今回はタイトルに「Googleカレンダーの内容を同期させる」と大きく出ましたが、もちろんノータイムで変更が反映される訳ではなく定期的にReadして反映してくれるようです。その時間間隔もここで設定できます。

f:id:wifeofvillon:20171219153845p:plain

「カレンダー」からGoogleアカウントに接続する

「システム環境設定」を開かなくても「カレンダー」から直接Google他のアカウントに接続することができます。

「カレンダー」を開き、カレンダー > アカウントを追加をクリックすると、接続できるWebサービスの候補が表示されます。

f:id:wifeofvillon:20171219154941p:plain

Google」を選択し「続ける」と、Googleのログイン画面が表示されます。

f:id:wifeofvillon:20171219155057p:plain

Googleアカウントにログインすると、どのアプリケーション連携するかを訊かれるので、今回は「カレンダー」を選びます(ここで「メール」も選んでおくと普通にGmailの同期も始まる)。

f:id:wifeofvillon:20171219155146p:plain

この同期作業をしている間、16時に「テスト」という予定をブラウザ経由で追加しておいたのですが、ちゃんと反映されましたね。

f:id:wifeofvillon:20171219155803p:plain

通知センターにも反映されました。

f:id:wifeofvillon:20171219155853p:plain

おわりに

はるか昔SIerに入社したときにある先輩のすぐ「紐付ける」って言葉を使うところが(その先輩のことは今でも五本の指に入る程度には尊敬してるんですけど)好きじゃないなぁと思っていたのに、自分も「紐付ける」おばさんになってしまったことに気付きました。
慌てて別の用語に変更しましたが漏れがあるかもしれません。