スプレッドシートを疑似wikiとして活用した話

本記事はWeb API Advent Calendar 2021の12日目の記事となります。

■概要
最近、スプレッドシートを活用して複数人で情報修正編集できる機能を活用し、twitchという動画配信サイト向けのプラグインを作った。
スプレッドシートをプログラム側で制御する手順等は日本語の記事がそれなりにあるので,そちらに任せるとして、
スプレッドシートを活用するまでの至った経緯などを紹介。
実際に使ってみたい方はGoogle Sheets APIで検索することをおすすめする。

■ツール概要
temtemというポケモンのようなモンスター同士を戦わせるゲームを生配信する際に視聴者が任意のモンスターの情報をカーソルをあわせることで配信上(overlay)で確認ができるというもの。

↓実際に動いている様子

プラグイン配信ページ(twitch)

ハースストーンというカードゲームでは有名な「HearthStone Deck Tracker」というプラグインがあり、プラグインの種類としてはにたようなもの。

格闘ゲームのような画面に動きがあるゲームは、そのゲームを知らない人でもなんとなくみることができる。
ただ、ターン制ゲームの視聴者はどうしても実際にそのゲームを今遊んでいる人が対象になってしまう課題がある。
なぜなら、プレイヤーであればカードゲームの絵柄を見るだけで、一体そのカードがどんなカードなのかわかるが、しばらくプレイしていない人ややったことがない人は何が起きているか分からないからだ。
(配信者も親切に使うときに効果を読み上げてくれたりはしない。遊戯王は親切だった。)

そのため、視聴者毎の知識差を埋めるためにこのプラグインを開発した。

視聴者の言語設定に応じて表示する言語を変えてくれる機能もつけることができる。(この機能は実装中)

■スプレッドシートはどこにでてくるの?
さて、ここまで来るとスプレッドシートが何も関係ないように思える。
スプレッドシートを使うに至る経緯を説明させてほしい。

■スプレッドシートを使うにいたった経緯
情報を表示するということは情報を入力する必要がある。

上であげたハースストーンというカードゲームはゲーム自体がログを出力しており、
それを集計するツールを利用してユーザーに表示する情報を取得している。

メモリを参照するようないわゆるリバースエンジニアリングは利用規約で禁止されている。
悪いことをしないホワイトなプログラマーとして、リバースエンジニアリングは行わない。

ではどのように情報入力をするか?

人間の力で解決する。

つまり配信者が”JSON形式で入力”である

ただ、この情報を毎回配信者が入力しているようではとてもじゃないが、不便である。

そのため、表示したい情報を選択すると自動でjson化してくれるサイトを作成した。(例えば技名を選べば、技の威力や説明などは自動で用意される。)

実際のJSON出力するサイト
HTMLを出力するgulpソース

使うモンスターを選べば覚える技リストが表示され、そこから選ぶ仕組みだ。
モンスターの情報を入れ終わった後に「CSV」というボタンを押せば何故かJSONが出力される。
(以前はCSV出力だったので残ったままだった・・・今気づいた)
出力されたJSONをtwitchの配信管理画面にコピペすれば、視聴者側に反映される。

ただ、それすらも私はめんどくさいと思うので、ゲームのスクリーンショットをアップロードすれば自動で入力される仕組みにした。
プログラマーたるもの怠けるべきで、簡単に”人間の力で解決する”などとはいってはいけない。

open CVとGCPのCloudFunctionを利用した仕組みになっているが、この記事のテーマとずれるため、
興味ある方は12/19にきっと更新されるであろう下記、AdventCalendarからどうぞ。
opencv AdventCalendar

じゃあそのサイトに乗せる情報はどこから持ってくるのか。
公式wikiからスクレイピングする。(selenium)
※ちなみにwikiの情報はCC BY-NC-SA 3.0で利用することができるので、ホワイトなプログラマーからジョブチェンジはしていない

スクレイピングした情報をcsvとしてローカルで管理し、gulpというタスクランナーでHTMLに変換している。

海外のゲームなので、wikiの情報は基本的に英語である。

しかし、日本ユーザーに日本語で表示したいし、日本語ユーザーが英語で情報入力するのはとても大変だ。

Google Translate APIなどを利用し、翻訳するロジックをいれたい所だが、
ゲーム内では日本語設定があり、独自の日本語訳があるため、自動翻訳は難しい。

ではどうするか。

人間の力で解決する。

しかし、僕一人でゲーム内の情報を確認して、この英語に対応する日本語はなにかなと入力する作業は現実的でないし、ホワイトなプログラマーのタイピング速度を持ってしても指が辛い。

英語のリストはスクレイピングで取得したので作成できる。
あとは日本語の情報入力を有志の方々にやっていただく。(この場を借りてお礼申し上げます。)

ある程度のアカウント管理が出来て、誤った修正を戻す事ができて、
ないとは思うが、万が一悪意ある修正が行われた時、誰が行ったかわかるようにしたい。
また、情報入力する人はITに詳しくない方もいるので、タグや区切り文字など気にせずに作業をしてもらいたい。

このwikiのような機能を自前で実装するのは大変だ。

そこで登場するのがスプレッドシートだ。

ご存知のとおり、スプレッドシートは多人数でブラウザ上から編集できるEXCELのようなもの。

スプレッドシートの編集はGoogleアカウントで実施し、編集履歴の確認などもできる。
シートの所有者がどのアカウントに閲覧権限をつけるか、保護されない箇所の編集を許可するかを決めることができる。
保護箇所も修正・編集できる管理者、編集者、閲覧者をアカウントごとに指定できる。
※ただし、細かいロールのような仕組みは企業アカウントでないとできないようで、自前で別に管理シートを用意すればプログラム上で制御できそうだが、今回は用意していない。

そしてgoogleスプレッドシートをソースコード上から制御するのがGoogle Sheets APIである。

■処理の流れ
今回作ったバッチは以下の処理を行える。
Wikiからスクレイピングで取得した情報(英語)をCSVとして保存

CSVの情報をスプレッド載せる

プログラムで管理しているフラグ列やwikiから取得した情報にはロックをかけて編集できないようにする(現在列ロックは手動)

有志の方々に日本語訳を入力してもらう

プログラム側からスプレッドシートの情報を取得し、CSV化

作成したCSVを元にgulpでHTML(情報入力サイト)を出力

といった処理の流れでwikiのような仕組みを作った。

実際に有志の方に入力してもらう画面(一般ユーザーは閲覧のみが可能)

翻訳スプレッドシート
ローカルで動かすスプレッドシートを管理しているソースコード

複数人での文章編集作業が必要なコンテンツの作成に利用してみてはいかがでしょうか!

このプラグインにまつわる話は、他にも
GCPの無料枠でe-Sports配信をリッチにした話Google Cloud Platform Advent Calendar 2021
ゲームのステータス画面のスクショをデータ化して活用した話OpenCV Advent Calendar 2021
などでご紹介するつもりです!

以上、スプレッドシートをwikiのように活用した話でした!

なお、MMOポケモン、TemtemはSteam/PS5で好評販売中です。

CloudFunctionのアクセス制限メモ

特にアクセス制限を設けず、設定の権限でallUserが「Cloud Functions 起動元」の権限を持つと外部から無制限にアクセスすることができる。
想定外の実行をされたくない場合はロールを設定する。
ただしロールを決めると認証を1時間おきにやらないといけなくてめんどくさい
そのため、同VPC内のみにアクセス制限をかけて、allUserに「Cloud Functions 起動元」の権限をもたせるなどのやり方がある

windowsのvimからwslのファイルを使う上で困ったこと

windowsのvim上からwsl内のファイルを編集したい。

■背景
gulpでのビルドが非常に遅く、原因を調べていたところ、
win上のファイルをwsl上のgulpで更新した場合、ファイル形式の変換が走るためめちゃくちゃ遅くなる現象があった。
基本はwsl内のファイルはwsl内のvimから実施するべきだが、win上のvimでないと利用できないプラグイン等があるため、wsl上のファイルを編集したい

■事前知識
wslからwinのファイルを操作する場合は /mnt/c/hogehogeにアクセスすればいい。
逆にwinからwsl上のファイルにアクセスする場合は \\wsl$にアクセスすればいい。

■問題と解決策
nerdTreeで\\wsl$配下のファイルが取得できない。
→vimfilerなら取得できたのでそちらに移行した。

【ポケモンユナイト】ゲーム上手くない奴がソロでマスターになるには【ソロマスター】

先日、ポケモンユナイトでソロにてマスターランクに到達した。(到達時世界ランキング191位)
僕は決してリアルタイムで進行するゲームは上手くなく、どちらかと言えば平均以下だ。
これは謙遜でもなんでもなく一緒に遊んだことがある人ならわかると思うがマジで下手くそに部類される人間なのだ。
真面目に勝つためのプレイをしてスプラはAいけるか行けないかくらい。
ましてやMOBA系はほぼ未経験、一緒にやってくれる友達はβテストで満足してしまった。(僕は未プレイ)

では何故そんな僕がソロでマスターランクにまでこれたのか?
考え方ややってきた事を紹介しよう。

もくじ
・勝率51%を目指せ。プレイ時間でカバーしよう。
・味方が弱い!?仲間運ゲー?萎えないためのマインド
・仲間のバリューを最大化する
・強いキャラを使う。使うキャラをゲームの最初に交換する。
・アイテムレベルを上げる。
・最後まで諦めない。アクティブポイントを意識しよう。
・リスクはとらない

■勝率51%を目指せ。プレイ時間でカバーしよう。
マスターになれる人はどんな人だろう?
強い人?うまい人?課金した人?
どれもあっているが、間違ってもいる。
マスターランクになれる人は正確には
「一定以上の勝率を出すことができ、規定の試合数をこなした人」だ。
このゲームは勝てば1増えて、負けると1減るポイントが一定数貯まるとランクアップする。

では、”一定以上の勝率”とは何か?
その基準となるのは切り上げて51%だ。
※実際にはプレイヤーに有利に働くアクティブポイントの存在から50%、または50%を若干下回っていてもマスターに到達できるが、一旦はアクティブポイントについては考慮しないものとする。

ビギナーランクまでは負けてもポイントが下がらないので、スーパーからが本番だ。
スーパー4クラス、ハイパー以降は5クラス、各クラス3ポイントと、計57ポイント分勝ち越せばマスターに上がることができる。
勝率が100%の人であればビギナー+57試合でマスターになることができ、勝率51%の人はその50倍の試合をこなせばマスターに上がることができる。
ちなみに勝率60%ある場合は100%の人に比べて5倍の試合数をこなすだけで良い。
実際にはアクティブポイントの存在によってこの試合数よりは遥かに少ない数でマスターにあがることができる。

メインのカビゴンが56%、ほぼ同じ数使ったサブのワタシラガが52%、どちらも取られたときに使う他の面々が20%程度の勝率で平均勝率が53%しかないが、マスターにあがれた。
今マスターに上がっている人は勝率70-75、低くても60%だ。

では何故勝率がそこまで高くない僕がマスターになったのか?
僕のマスター到達時点での試合数が420試合だからだ。(強い人は大体250試合以下)
サービス開始から6日でマスターに上がったが、1日およそ70試合回している。僕がマスターになれた理由はそこに尽きる。
あなたのトレーナーカードをみてほしい。ゲーム慣れしている人は僕よりも勝率が高いと思うが、結構やっている人と比べても試合数は僕の方が多いだろう。(記事掲載時点)

マスター以降はレーティングとなるため、同じようにはいかないが、マスターに到達するだけであれば、強い人がなれるものではないと理解いただけたと思う。
さらにこのゲームはなぜか2ランク下の人とも普通にマッチングするため、エキスパート10人の中で平均戦果を出す必要がない。エキスパート帯はエキスパート帯としかマッチングしないのであれば僕は勝ち越せなかったと思う。

勝率55%の人よりも勝率60%の方が強いが、試合数を倍以上こなせば勝率55%の方が先にマスターに到達する。
強い人間がマスターになるのでなく、”勝率に見合った試合数を先にこなした人”がマスターになるのだ。
勝率60%の固定を組める時間の倍の時間勝率55%のソロを回すことができるのであれば、マスター到達はほぼ同時になる。

とはいえ、勝率が高ければ試合数も少なく済むためどうやって上手くないなりに勝率をあげるか以下にまとめる。

■味方が弱い!?仲間運ゲー?萎えないためのマインド
とんでもない動きをして敗因を作っているように見える味方にあたることがある。
ソロは味方運ゲーと言われる事もあるが、ちょっと待ってほしい。

このゲーム、というかランダムマッチ系のゲーム全てにおいて共通していえることがある。
実は”ゲームを破壊するような弱い人”が味方にくる確率より、敵に行く確率の方が高いのだ。
なぜなら、敵は5人いるが、味方は4人のため、単純に抽選枠が少ないからだ。

勝率を80%目指したい人は仲間に引っ張られて勝率をあげられないかもしれない。
しかし、マスターを目指す上でとればいい勝率は51%だ。
そして目指すのは勝利でなく勝率なので、(実際にそうかどうかはおいておいても)ある特定の味方で負けたとしても、
同レベルの人が敵に行って勝つ確率の方が高い。
勝率51%+αを目指す場合は長期的にみて味方がルールをわかっていなくて負けたとしても、関係がないのだ。

とはいいつつ、僕はプレイしているときはとても配信できないような言動と小学生並みの語彙力でプレイしているが、それはそれである。
一定の勝率を出しつつ、試合数を稼ぐことが大事なので萎えない心が大事なので、誰にも聞こえない・見えない所でこっそりキレ散らかそう。

■仲間のバリューを最大化する
5対5のゲームなので、1人が試合に貢献できる総量はたかがしれている。
もちろん、圧倒できる強さやゲームの上手さがあれば試合に蹂躙して圧倒できるかもしれない。
ただし、この記事の趣旨はそんな蹂躙する強さを持たない人がどのようにマスターに行くか?だ。
最低限の知識やタブーを覚える事は必要だが、それ以上に大切なことがある。
それは仲間のバリューを最大化することだ。
相手の5人の平均戦力と、コチラの4人の平均戦力はランダムマッチの性質上ほとんど同じといえる。
勝率51%を目指すのであれば、各々のバリューをしっかりとだしてもらうことで、自分がたとえ平均以下の実力でも勝率51%を超えることは容易だ。
なぜなら、仲間のバリュー最大化ができていない人が多いので、最大化していない相手の試合は勝ち越すことができるからだ。

仲間のバリュー最大化を簡単にできる方法が2つある。

・好きなモンスターを選ばせる。
・意思の疎通をとり、クイックチャットを活用する

以上2つだ。

まず、「好きなモンスターを選ばせる」について。
こういったキャラクターを選ぶゲームは少なからず、”○○専門”と言った人が必ずいる。
1キャラだけ熱心に練習している人たちだ。
特にこのゲームはアイテムレベルの存在から、普段プレイしていないモンスターを使うときに不利になりやすい。
なので、最低2キャラ、できれば3キャラは使えるようにして、仲間に好きなモンスターを選んでもらった後に自分は選ぼう。
これをやれるかどうかで、相手が専門被りした試合は勝ち越せるので勝率51%を超えることが容易になる。

そしておすすめは中央レーン以外でタイプが異なるモンスターを使えるようにすることだ。

なぜなら中央レーンは勝利に直結しやすいから。
ゲームがうまい人なら絶対にアタッカーや中央レーンをやることがおすすめだ。
しかし、この記事はゲームが上手くない人へ向けたものなので、中央レーンは選んではならない。
勝率70%を目指すなら間違いなく中央レーンを練習したほうがいい。
逆にいえば自分が中央レーンになった場合、相手の中央レーンに勝ち越せないと勝率が大きく下がるため
そのため中央レーン以外をやったほうがいい。自分でプレイしなければ敵の中央レーンより味方の中央レーンがうまい確率はほぼ50%になる。
勝率51%を目指す場合は”勝利に直結しないポジションで平均戦果を出す”そして、”仲間のバリューを最大化させる”だけでいい。

次に「意思の疎通を取り、クイックチャットを活用する」について。
簡単にいえば仲間に指示を出すということ。
マイナスボタンでマップを開くと、”拠点の防衛”であったり、クイックチャットで撤退の意思表示ができる。
クイックチャットをいったところで意味のない味方も頻繁に遭遇するかもしれないが、その味方の事は考えなくていい。
なぜなら敵にいったところで同じような行動をするからだ。
だが、”クイックチャットをくれれば気づく・動ける・撤退できる”といった層は決して少なくない。
そんな味方がきたときにちゃんとクイックチャットを打てるチームと打てないチーム、勝てるチームはどちらだろうか。
ちょっと自分一人が良いプレイをする以上にクイックチャットをすることは価値のある行動といえる。

今の環境でのおすすめクイックチャットは
・前に出すぎた味方に対して”撤退”を打つ
・カジリガメが湧く45秒前に”下レーンに移動を打つ”、20-30秒前に”集合”を打つ
この2つを意識するだけで平均以下の実力でも勝率51%を出すことは容易だ。なぜならやらない人が多いから。

全てに言えることだが、”他人を変える事は難しい。一番簡単に変えることができるのは自分の行動と環境”である。
自分一人の行動改善によって勝率を数%上げるより、環境を変えることで味方の行動改善し勝率を上げるほうが容易と思う。

■強いキャラを使う。使うキャラをゲームの最初に交換する。
2-3キャラ使うとして何を使えばいいだろう?
それは強いと言われているキャラを使うことだ。
もちろん、[モチベーションを維持するために好きなモンスターを使う]といった観点も大事だ。
なぜなら[プレイしなくなったらマスターにはなれない]から。モチベーションを維持できる範囲で強いモンスターを持ちキャラにしよう。
また、1-2キャラまでは人に譲るため、ポジションがかぶらないほうがいい。
例えば、カビゴンメインの、サブヤドランにすると、ヤドランを使うときはカビゴンが必ずチームにいるため、バランスが悪い。
また、上レーン用キャラであれば、サブは下レーン用キャラが良い。(なぜなら、上レーンを譲るということは余る湧く上1下2になるから。)
今のおすすめはディフェンス+サポート。アタッカーは中央レーンにいかされがちなので、アタッカーを使う場合は上下レーンを先に宣言して中央レーンに行かない宣言をしよう。

また、このゲームのキャラクター選択画面は”ライセンス取得順”で並んでいる。(早いもの勝ちの仕様も微妙だけど、この仕様が微妙さに拍車をかける)
そのため、メインかサブキャラが可能な限り少ない操作で選べる場所に配置されている必要がある。
まずメインキャラにカーソルがあってる状態にし、同じライセンスを最初にとった人は”何もモンスターを選んでいない”ような表示になる。
その状態でいることはチェックマークが付くまで持ちキャラからカーソルが外れるのを待っている状態だ。
サブキャラが誰も使っていないようなら、メインは譲ってあげよう。
サブキャラが誰かに取られている場合は空気を読まずにメインをそのまま選択する。なぜなら自分が使えないキャラを使うより、○○専門勢のサブの方がまともな確率が高いから。
逆に自分のメインが先に選択されている場合は、急いでサブキャラを選択しにいく。
そしてメインもサブも全部取られている場合はアタッカーキャラクター以外はクイックチャットをうつといい
「サポート型のポケモンで戦うよ!」「ディフェンス型のポケモンで戦うよ!」である。どちらも2回くらい言えば、複数キャラ使える人が譲ってくれる可能性が高い。
それでも譲ってもらえない場合は適当なモンスターを使おう。その試合は負けても良い。
なんにしても、たくさん持ちキャラを持たないのであれば、自分の持ちキャラが最初にカーソルがあっていることは非常に大事だ。

■アイテムレベルを上げる。
このゲーム、アイテムレベルが20あるかないかでかなりの違いがでる。
そのため、利用するアイテムは全て最低でも20、可能なら30を目指そう。
特に課金を気にしないのであればまずはジェム購入して、アイテムきょうかキットをひたすら交換したほうがいい。
課金した人が勝つゲームではないが、課金すれば勝率があがるので、51%を目指す上では課金してしまうのが手っ取り早い。
というかゲームが上手くない自覚があってマスターに行きたいのであれば課金しよう。「そんなに変わらないよー」ってレベル以上の差はある。
上限も比較的安いため、あなたがマックスまで課金すればチームの平均道具レベルは相手より上になる。

■最後まで諦めない。アクティブポイントを意識しよう。
このゲームは今の環境だと亀を2-3匹倒すゲームである。
しかし、亀を倒したチームが勝つわけではなく、レベル差3以上あってもサンダーで逆転したりと逆転することも多い。
そのため、本当に詰むまで最後まで諦めてはいけない。
ただ、もうまず無理な試合のとき、針の穴の勝利を目指したり、降参したりするよりもやることがある。
アクティブポイントの獲得(ゴール)だ。

アクティブポイントとはゲーム参加で10点、連勝や獲得したゴールポイント数によって試合後にもらえるポイントのこと。
例えばエキスパート帯では、
・100ポイント以上ある場合は100ポイントを失いランクダウンをしない。(実質1敗がなくなる)
・400ポイント貯まると400ポイント消費し、1勝したことになる。
このポイントは非常に大事で、勝ったら1増えて負けたら1減るゲームだとポイントの総量はほとんど変わらない。
しかしこの制度によってポイントの総量はめちゃくちゃ増えている。
これが勝率50%をちょっと切っていてもマスターになれる所以だ。

ではアクティブポイントの獲得とはなにか?
アクティブポイントはゲーム中に獲得したゴールの点数によって、最後の5ポイント~のポイントがもらえる。
50ポイント、100ポイント、200ポイント・・・がその基準だ。
そのため、勝ち確の場面や負け確の場面では放棄せずにしっかりとポイントを入れて上記点数を超えるように意識するといい。
特にラストスパート中は得点が2倍になるので、50点にぎりぎり届いていない場合は特攻してでもポイントを入れよう。
※だたしその行動によって試合結果が変わるようなことがあってはならない
50点いれていない試合を入れるように、100点入れてない試合を入れるように意識を変えるとどうなるか?
なんと20試合で1敗がなくなる分のポイントがたまるのだ。
これは本当に大きくて、勝率1%あげるよりも簡単に勝率1%以上の価値がでる。
もうだめな試合でも諦めずに勝ちを目指すこと、そしてどうあがいても勝てない試合はポイントをとることを意識する。

■リスクはとらない
対戦ゲームにおいて全てにいえることだが、勝因を作る事よりも敗因を作らない事を意識したほうがいい。
常にリスクには敏感になる。ファインプレーよりもクソプレイをしないことを心がける。
ワンチャンかける(ハイリスクハイリターン)はもうそうしないと負けるときだけでいい。どっちが勝つか分からない状態でリスクをとってはいけない。

やってはいけないことを知ることが大事なので、そのあたりは僕ではなくうまい人のガイドを参考にすると良い。

hapi.jsフレームワークのエラー解消法

node js関連のフレームワーク勉強中。

'use strict';

const Hapi = require('hapi');

const server = new Hapi.Server();
server.connection({ port: 3000, host: 'localhost' });

server.route({
    method: 'GET',
    path: '/',
    handler: function (request, h) {
        reply('Hello, ' + encodeURIComponent(h.params.name));
    }
});

server.start((err) => {

    if (err) {
        throw err;
    }
    console.log(`Server running at: ${server.info.uri}`);
});

公式が配布しているhello worldを動かすと下記エラーが出る

TypeError: server.connection is not a function
    at Object. (/home/ユーザー名/temp/server.js:6:8)
    at Module._compile (internal/modules/cjs/loader.js:778:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:623:3)

下記部分を書き換え

server.connection({ port: 3000, host: 'localhost' });

const server = new Hapi.Server({ port: 3000, host: 'localhost' });

理由としてはhapi v17.0.0から単一サーバーの複数接続のサポートが削除されたため。

さて、これで実行すると下記エラーが出る。

Debug: internal, implementation, error 
    TypeError: reply is not a function
    at handler (/home/ユーザー名/temp/server.js:11:9)
    at module.exports.internals.Manager.execute (/home/ユーザー名/temp/node_modules/hapi/lib/toolkit.js:31:106)
    at Object.internals.handler (/home/ユーザー名/temp/node_modules/hapi/lib/handler.js:46:48)
    at exports.execute (/home/ユーザー名/temp/node_modules/hapi/lib/handler.js:31:36)
    at Request._lifecycle (/home/ユーザー名/temp/node_modules/hapi/lib/request.js:312:68)
    at process._tickCallback (internal/process/next_tick.js:68:7)

これはHapiのバージョン17でAPIが大幅に変更されたかららしい。(https://hapijs.com/api/17.1.0)
仕様変更したら変更前のソース実行時にエラーメッセージ出すとかしてほしいね?

    handler: function (request, h) {
        reply('Hello, ' + encodeURIComponent(h.params.name));
    }

上記を下記に書き換える。

    handler: function(request) {
            return 'Hello, ' + encodeURIComponent(request.params.name);
    }

そして以下が完成形のHello worldソース

'user strict';
  
var Hapi = require('hapi');
const server = new Hapi.Server({ port: 3000, host: 'localhost' });
server.route({
    method: 'GET',
    path: '/{name}',
    handler: function(request) {
        return 'Hello, ' + encodeURIComponent(request.params.name);
    }
});
server.start(function() {
    console.log('Server running at:', server.info.uri);
});

動作確認

node server.js

実行したまま、別画面を開き、実行したサーバー内部から下記コマンドを実行

pc:~$ url -X GET localhost:3000/shibamata
Hello, shibamata

shibamataは適宜変更すればその文字が返る。

日本語の情報少なすぎませんかね?

Hello worldから躓いて解決策分からないと辛いので、誰かの助けになれば。

google検索するときに変換候補を選ぶ事ができない

知人のPCで起きた問題を解決したのでメモ。

【症状】
google検索のトップページで文字入力し、ある程度まで入力してから変換候補を選んでも、
画面下のブックマークを選択してしまったり、候補が選ばれずにひらがなの入力が完了するだけになる。
サジェストが選べない。

また、シークレットモードではこの事象は発生せず、正常に候補を選択することができる。
ひらがな入力を完了させてからなら候補を選ぶことができる。

【原因】
最新のMicrosoft IMEがクソ

【解決策】
MicrosoftIMEの設定で以前のバージョンを利用するにチェックを入れる。

LINE API(LIFF)+AWS でハンズオンしてきた

とても良かった(小並感)

AWSの資格を取得したものの、ちゃんと何か作ったことないなーとか、
他の資格とるには経験足りないなーと思ったのが参加のきっかけ。

簡単操作でやった感が出るとてもいいハンズオンだった。

ほぼ永続的にハンズオン教材や動画を残しておいてくれるそうなので、試してみたい人はぜひ。

AWSのアカウント作ったー LINEグループ作れるよーくらいで以下のようなアプリが作れちゃいます。

ボードだして、イラスト書くとそのままラインにおくれちゃう!

実際のコーディング部分はほぼなくて、値の設定くらい。
どっちかっていうと、LIFFの作り方やAWSでどう環境構築するか?みたいな部分をもりもり試せた。
ほぼ無料枠内のみで完結して、後始末手順もしっかりあり、当日はAWS社員やLINE社員の手厚い介護を受けながら試せる。

これ無料でいいのか!?

AWSで触ったサービスはS3、Lambda、APIGateway、CLOUD9、chaliceとかかな。
CLOUD9なるオンラインエディタとchaliceは初めて聞いたけど、デプロイ簡単過ぎるし、ローカルへの環境構築がいらなくてハンズオンとの相性は最高だった。

LINEのミニアプリ(LINEの中で動くアプリのようなもの)の説明や、
サーバーレスでどのようにサービスを作るかみたいな座学もあり、本当に充実していた。
また参加したいなー。

当日のハンズオン資料は下記にあるので、興味ある方はぜひ試してみてください。
LINE APIでAWS上でアプリを作ろう! 2020年版
LINE API × TECH API VOL. 2 POWERED BY AWS

ちなみに他の人に使ってもらうのは下記の丸でかこった部分を押してDeveloperからpublicに変更すればいいです。
※自己責任で。

【本日の格言】
オンプレはブサイク
※個人の見解であり、所属する団体とはry

2020年:AWSソリューションアーキテクト-アソシエイト合格体験記と書籍紹介

2019/12末、長期休暇に入るにあたり、時間取れるし何かやるかなーと思いたち、
前々から取ろうと思っていたAWSソリューションアーキテクト-アソシエイトを勉強して取得してきました。

1中旬に取得したので、だいたい2週間ちょっとくらい。
その間にどんな勉強したかを忘れないうちに書いておきます。
合格体験記とか勉強法は記事がたくさんあると思うので、
実際に利用した勉強サービスや書籍を紹介したいと思います。

■スペック
AWS未経験
インフラほぼ未経験
アプリエンジニア数年

■今回購入したもの
AWS認定アソシエイト3資格対策(書籍)
この一冊で合格!AWS認定テキスト&問題集(書籍)
一夜漬けAWS認定ソリューションアーキテクトアソシエイト(書籍)
AmazonWebServices 基礎からのネットワーク&サーバー構築(書籍)
AWS WEB問題集で学習しよう(WEBサービス)
公式模擬試験(WEB)

■無料で利用したもの
blackbelt
公式のよくある質問
公式のサンプル問題

■AWS認定アソシエイト3資格対策(書籍)
おすすめ度:★★★☆☆
勉強時間:1週読む(1.5日)
AWS認定試験でソリューションアーキテクトの本が乱立する中、DeveloperとSysOpsも抑えた1冊
3資格コンプリート目指す人が読む分にはいいかなーと思いつつも、それぞれの資格の境界線が曖昧であることや
いざソリューションアーキテクトを受かった後にDeveloper勉強しようにもいまいち使い勝手が悪く、
初動にざっくりやるにはいいけれど、試験前日に読む書籍ではなかったなあという印象でした。

■この一冊で合格!AWS認定テキスト&問題集(書籍)
おすすめ度:★★★★☆
勉強時間:2週読む、付属の問題をすべて完璧にする(2日)
問題集が欲しかったために購入したが、問題はそんなに多くない。
内容としては既に古いものもあったが、内容も図解がわかりやすく概ね満足した。
模擬試験の難易度が他の書籍に比べて高く、本番以上だった。
ただし、本番にでない形式の問題があるなど、出題形式に慣れたい場合は不向き?
この一冊で!とあるが、各種レビューサイトにもかかれているが、この一冊だけで合格は結構しんどいと思う。
というか、1冊だけで合格がしんどい資格だと思います。
おすすめは2~3冊購入して情報の網羅性を高めることと、2~3冊で重複する内容は出やすいものなので、複数冊買う方がいいんじゃないかなと思います。

■一夜漬けAWS認定ソリューションアーキテクトアソシエイト(書籍)
おすすめ度:★★★★★
勉強時間:3週読む、付属の問題をすべて完璧にする(4日)
2020年発売の書籍。情報も新しい。一番のおすすめ。
章構成が実際の出題カテゴリとリンクしていて、公式の模擬試験で点数が悪かった場所を重点的に勉強も可能
ページ上部にポイントとなる概要、その下に解説という形式をとっているため、試験前日にポイントを読む→分からなければ解説を読む
といった勉強がとてもしやすかった。
また、問題の出題形式についての具体的な解説やこのサービスの問題はこういったことが聞かれるといった内容がかかれている(実際にでた)
受かるために必要な情報が凝縮された一冊でした。
模擬問題の解説がめちゃくちゃよくて、他の問題集は正解の理由が書いてあるだけで、
誤答に対して、なぜそれがだめなのか?について丁寧に記載されている点が本当によい。
今から受ける人がいれば絶対にお勧めしたい一冊です。

■AmazonWebServices 基礎からのネットワーク&サーバー構築(書籍)
おすすめ度:★★★★☆
勉強時間:1週読みながらハンズオン(2日)
AWS試験を受かるには手を動かすことだ!といった話を聞くことも多く、まず触ってみるかーと吟味して選んだ一冊。
勉強後にちゃんと終了させれば無料枠で出来る内容しか記載されておらず、やろうと思えば1日かからずできる量であることがよかった。
結論として、短期間で受験するなら実際に触る時間を机上で勉強した方が時間効率はいいように感じた。
しかし、この書籍のハンズオンはネットワーク未経験だった自分にサブネットやTCP/IPの内容をわかりやすく書いてくれたおかげで後の勉強がやりやすくなったことや
1冊勉強を終えたという達成感、NAT関連の問題にはまず間違えずに即答出来るようになり、自信がついたことなど、
短時間のハンズオンでありながらメンタル面でとてもプラスになった。
ただし、利用するソフトウェアのversionのかみ合わせが悪く、本の通りにやるだけだと動くところまでいかず、トラブルシューティングに時間がかかって計2日かかってしまった。
ちょっとそこだけは残念だなーと思いつつ、書籍だから仕方ないと割り切った。
もし買ってつまった方は以下の記事を読んでもらいたい
awsでWordPressが500エラー時の対処法

■AWS WEB問題集で学習しよう(WEBサービス)
おすすめ度:★★☆☆☆
勉強時間:2日?
スマホからも利用できる問題集。4500円くらい。
勉強法や合格体験記を読んでいるとよく話題にあがるサイト。
問題数は多く、移動中ができるのは魅力だがそれだけのサイト。
AWSの知識を増やすにはいいけれど、出題の仕方や実際の試験で問われるベクトルと異なる問題も多数あり、
ping-tなどの資格問題サイトを経験した後だと間違えた問題を一覧でみるとか、問題にフラグをつけるといった機能がなく
ただただ使いにくかった。
時間に余裕があるときに壁打ちを繰り返すにはいいかもしれないけれど、
スマホからできることのメリットを生かせないなら、値段と比較してしまうと個人的にはあまりおすすめできない。

■公式模擬試験
おすすめ度:★★★★☆
勉強時間:半日以下
問題数は少ないけど、良質な問題
難易度は低めなので油断しないように。
ただ、答えもらえないのがただただマイナス。

■blackbelt
おすすめ度:★★★☆☆
勉強時間:2日
公式の情報動画、無料。
最新の情報がでるが、厳密な情報も多いが、情報過多でノイズになりがち。
分からないサービスを理解するにはかなり良かった。
問題解きつかれた頭で受け身で勉強もできる。
問題点は物量がすごいことと、ITの知識がちょっとないと内容が難しいことがある点。

■公式のよくある質問
おすすめ度:★★★★☆
勉強時間:1日
公式のサービス別よくある質問。
ここから出る問題も少なくない。ただ物量があるため、頻出サービスの苦手分野だけ読むほうがいいかも。
理解度の低いサービスの理解度は一気に上がる。

■公式のサンプル問題
おすすめ度:★★★★☆
勉強時間:30分
簡単すぎる問題。ただすぐ終わるし無料なのでとりあえずやっとけ感はあります。

【おまけ】ネットで出ている情報で古かったもの・誰かに教えてほしかったもの
・2018年3月くらいから新試験が開始されていて、8月頃に旧試験が終了した。
・2020年3月頃から更に新試験が出る。難易度はあがりそう、現試験もいつかは終わる
・資格の有効期間が2年から3年に延長された
・プロフェッショナル試験は前提のアソシエイト試験をもっていなくてもよくなった
・遠隔カメラで監視されて英語でチャットみたいな話も聞くけど、そんなことはなかった。会場によるかもしれないけど最近の受験記事できかない。

awsでWordPressが500エラー時の対処法

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版を読みながらAWSをいじっていた時躓いたので
同じ状況の人のためにメモ。

■状態
CHAPTER8 DBを用いたブログシステムの構築 の項目内
8-4 WordPresssを設定する において
サーバーに接続しようとした際、500エラーが返却されてページが表示されない。

■原因
最新のWordPressが求めるPHPのバージョン条件を満たしていない

書籍出てから結構立つし、しゃーないよねって話。

以下、上記書籍の手順通りに作成している場合の原因確認方法と解決方法を記載する。

■確認方法(直し方知りたいだけの人はここは飛ばす)
まずPHPのエラーは以下のコマンドで確認できる。

sudo less /var/log/httpd/error_log | tail -20

すると以下のようなエラーがでているはずだ。

[Sat Jan 04 19:53:14 2020] [error] [client *****] PHP Parse error:  syntax error, unexpected '.', expecting '&' or T_VARIABLE in /var/www/html/wp-includes/functions.php on line 1064

これは、WordPress 5.2ではPHP 5.6.20以降が必要なだが、古いPHPを利用してるときに発生する。
参考サイト

蛇足だが、インストールされてるPHPのバージョンを確認するのは以下

yum list installed | grep php

私の環境ではPHP5.2であったため、そもそもバージョンが足りていなかった。

■解決方法
理想はPHPのバージョンを7.xにすることだが、少々めんどくさい
また、今回はネットワークの勉強やAWSをさわりたい人がやっていると思うので、
書籍から大きく変わらない手順で対応するため、WordPressのバージョンを落とす。

以下のコマンドで配置したファイルの削除を行う

 
cd /var/www/html/
sudo rm -rf ./*
cd 
rm -rf wordpress

8-3 でwget で行ったコマンドを以下に読み替える

wget https://ja.wordpress.org/wordpress-4.9.13-ja.tar.gz

※併せてtar の展開コマンドも変える。

以降の手順は書籍通りに実施すれば500エラーが出ずにWordPressのページが開けるはずだ。

以上