試したこと、読んだ本について書いていくブログです。

Go言語でJSONを作成したときのイージーミス


はじめに

Go言語を使って構造体をJSON形式に変換しようとしたら詰まったのでメモです。
JSON形式への変換は標準パッケージに含まれているjson.Marshalを使っています。

失敗例

こんな感じで構造体のスライスをJSONにしようとしたところ、作成されたJSONの中身が空になっていました。

成功例

原因がわからなかったので色々と試行錯誤した結果、下記のコードで想定した動きを確認することができました。 失敗例では10〜12行目の構造体のフィード名の先頭文字を小文字にしていましたが、成功例では先頭文字を大文字に変えています。

原因

ここまで書けば原因がわかる方も多いと思いますが…
Go言語では変数や関数のスコープが先頭文字列が小文字か、大文字かで判定されます。 先頭文字が大文字の場合は他パッケージからの参照が可能(いわゆるpublic)、先頭文字が小文字の場合は他パッケージから参照不可(いわゆるprivate)となります。 このルールは構造体のフィードにも適用されます。
そのため、失敗例では構造体のフィードに対してパッケージ外からアクセスすることができず、作成されたJSONが空っぽになっていました。

ちなみに

作成されるJSONのKeyを先頭小文字にしたい場合、以下のようにフィードに対してタグをつけることで任意の名前を指定することができます。

おわりに

初歩的なミスでしたが原因に気づくまで時間がかかってしまいました。 前に触ったことがあるはずなんですが…先頭文字でスコープが変化するのは慣れないと忘れちゃいますね。
コンパイルエラーとかで教えてくれないかなぁ。

Read more ⟶

JavaからRESAS APIを使ってみましたよ


お久しぶりです。

巷で話題のビッグデータを使って何かやってみようかと思い立ったので、RESASから情報を取得してみます。
RESASとは地域の活性を目的とし、市町村名一覧や人口構成、観光資源などの多くの情報を公開しているWebサイトです。
APIも公開されているので、かんたんに情報を取得することができます。

地域経済分析システム(RESAS:リーサス)は、地方創生の様々な取り組みを情報面から支援するために、経済産業省と内閣官房(まち・ひと・しごと創生本部事務局)が提供しています。
自治体職員の方や、地域の活性化に関心を持つ様々な分野の方によって、効果的な施策の立案・実行・検証のためなどに広く利用されています。
引用元: RESAS 地域経済分析システム

とりあえず今回は勉強がてら、Javaを使って都道府県の一覧を取得してみます。
※RESASのAPIを使うには利用登録をしてAPIキーを発行してもらう必要があります。利用登録は公式サイトから行えます。
RESAS-API利用登録

以下のように結果が返ってきます。 JSON形式なので簡単に加工が出来そうです。

{
    "message": null,
    "result": [
        {
            "prefCode": 1,
            "prefName": "北海道"
        },
        {
            "prefCode": 2,
            "prefName": "青森県"
        },
        {
            "prefCode": 3,
            "prefName": "岩手県"
        },
        {
            "prefCode": 4,
            "prefName": "宮城県"
        },
        {
            "prefCode": 5,
            "prefName": "秋田県"
        },
        {
            "prefCode": 6,
            "prefName": "山形県"
        },
        {
            "prefCode": 7,
            "prefName": "福島県"
        },
        {
            "prefCode": 8,
            "prefName": "茨城県"
        },
        {
            "prefCode": 9,
            "prefName": "栃木県"
        },
        {
            "prefCode": 10,
            "prefName": "群馬県"
        },
        {
            "prefCode": 11,
            "prefName": "埼玉県"
        },
        {
            "prefCode": 12,
            "prefName": "千葉県"
        },
        {
            "prefCode": 13,
            "prefName": "東京都"
        },
        {
            "prefCode": 14,
            "prefName": "神奈川県"
        },
        {
            "prefCode": 15,
            "prefName": "新潟県"
        },
        {
            "prefCode": 16,
            "prefName": "富山県"
        },
        {
            "prefCode": 17,
            "prefName": "石川県"
        },
        {
            "prefCode": 18,
            "prefName": "福井県"
        },
        {
            "prefCode": 19,
            "prefName": "山梨県"
        },
        {
            "prefCode": 20,
            "prefName": "長野県"
        },
        {
            "prefCode": 21,
            "prefName": "岐阜県"
        },
        {
            "prefCode": 22,
            "prefName": "静岡県"
        },
        {
            "prefCode": 23,
            "prefName": "愛知県"
        },
        {
            "prefCode": 24,
            "prefName": "三重県"
        },
        {
            "prefCode": 25,
            "prefName": "滋賀県"
        },
        {
            "prefCode": 26,
            "prefName": "京都府"
        },
        {
            "prefCode": 27,
            "prefName": "大阪府"
        },
        {
            "prefCode": 28,
            "prefName": "兵庫県"
        },
        {
            "prefCode": 29,
            "prefName": "奈良県"
        },
        {
            "prefCode": 30,
            "prefName": "和歌山県"
        },
        {
            "prefCode": 31,
            "prefName": "鳥取県"
        },
        {
            "prefCode": 32,
            "prefName": "島根県"
        },
        {
            "prefCode": 33,
            "prefName": "岡山県"
        },
        {
            "prefCode": 34,
            "prefName": "広島県"
        },
        {
            "prefCode": 35,
            "prefName": "山口県"
        },
        {
            "prefCode": 36,
            "prefName": "徳島県"
        },
        {
            "prefCode": 37,
            "prefName": "香川県"
        },
        {
            "prefCode": 38,
            "prefName": "愛媛県"
        },
        {
            "prefCode": 39,
            "prefName": "高知県"
        },
        {
            "prefCode": 40,
            "prefName": "福岡県"
        },
        {
            "prefCode": 41,
            "prefName": "佐賀県"
        },
        {
            "prefCode": 42,
            "prefName": "長崎県"
        },
        {
            "prefCode": 43,
            "prefName": "熊本県"
        },
        {
            "prefCode": 44,
            "prefName": "大分県"
        },
        {
            "prefCode": 45,
            "prefName": "宮崎県"
        },
        {
            "prefCode": 46,
            "prefName": "鹿児島県"
        },
        {
            "prefCode": 47,
            "prefName": "沖縄県"
        }
    ]
}

備考

モンハンワールドが面白すぎて…進捗ダメです。

Read more ⟶

GoogleComputeEngineとのファイルやりとり


GoogleComputeEngine(GCE)とファイルをやりとりする必要があったので方法を調べてみました。
gcloud compute scpでGCEとのファイルのアップロード/ダウンロードが行えます。 gcloud compute copy-filesでもファイルコピーが行えますが、非推奨となっているのでgcloud compute scpコマンドを使うのがいいようです。

ローカルのカレントディレクトリにあるファイルを、GCEの/tmp配下にアップロードするには以下のコマンドで行えます。

gcloud compute scp ./gokuhi.txt gce_server:/tmp/

逆に、GCEの/tmp配下のファイルを、ローカルのカレントディレクトリにダウンロードするには以下のコマンドです。

gcloud compute scp gce_server:/tmp/gokuhi.txt ./

公式ドキュメントにも記載されている通り、gcloud compute scpにもいろいろとオプションが用意されていますが、単純なファイルアップロード/ダウンロードであればオプションを付けなくても簡単に使うことができます

Read more ⟶

DockerコンテナでDjango


はじめに

Dockerコンテナ上にDjangoの開発、実行環境を作りたいなぁ、と思ったので構築メモです。 Dockerエンジン自体はGoogleComputeEngine上で動かしています。

今回は、GCPのプロジェクトが作られている前提で説明を進めていきます。
GCEの仮想マシン作成などはWebUIからも作成できるのですが、説明が面倒くさいので今回はCloudShellからGCE仮想マシンを作って行きます。
CloudShellは、GCPのリソースを管理できる仮想マシンで、GCPのプロジェクトを作成していれば無料で使用することが可能です。 CloudShellの詳細は以下公式ドキュメントを参照してください。
Google Cloud Shell ドキュメント

今回、3つの仮想マシンを操作するので、混乱しないようにプロンプトに仮想マシンを示すようにしています。 使用する仮想マシンは以下の通りです。

項目説明
CloudShellGCPで標準で提供されている仮想マシン。
HostMachineDockerEngineが稼働する仮想マシン。OSはCentOS7です。
Container実際にDjangoが動くDockerコンテナ。OSはCentOS7です。

全体的な流れ

  1. GCEでCentOS7を作成、SSHで接続
  2. docker導入
  3. Dockerfile作成
  4. Dockerイメージとコンテナを作って接続
  5. djangoプロジェクト作成、allowhost設定
  6. django開発用サーバ起動
  7. ブラウザからアクセス

GCEでCentOS7を作成、SSHで接続

以下コマンドで、GCEをのインスタンスを作成します。 後半で必要になるので、作成したインスタンスのEXTERNAL_IP(外部IP)を控えておいてください。 その後、インスタンスに対してSSHで接続します。

(CloudShell)$ gcloud compute instances create example-name --tags http-server --zone asia-east1-a --image centos-7
(CloudShell)$ gcloud compute ssh example-name

GCEインスタンス作成時に使用したオプションは以下の通りです。

オプション名記事内の値説明
INSTANCE_NAMESexample-nameGCEインスタンス名です。オプション名は指定する必要がありません。
zoneasia-east1-aGCEインスタンスを作成するゾーンを指定します。指定しないと、対話形式でゾーンを指定することになります。
tagshttp-serverGCEインスタンスに適用するファイアウォールを指定します。今回はHTTPでの接続を許可するファイアウォールを指定しています。
imagecentos-7GCEインスタンスの元イメージです。デフォルトではdebian-9が指定されています。

docker導入

以下コマンドでDcokerをインストールし、有効化します。

(HostMachine)$ sudo yum install -y docker
(HostMachine)$ sudo systemctl start docker
(HostMachine)$ sudo systemctl enable docker

Dockerfile作成

以下の通りDockerfileを作成します。

Read more ⟶

完全栄養食COMPを食べてます


はじめに

みなさんは完全栄養食COMPをご存知でしょうか。
完全栄養食の名の通り、これを食べるだけで必要な栄養素が取得できるという優れものです。 アメリカではソイレントが有名ですね。

概要

COMPはパウダータイプ(水などとシェイクして飲む)と、グミタイプの2種類を販売していますが、今回はパウダータイプのお話になります。

パウダータイプのCOMPには、400キロカロリーの小袋と、4,000キロカロリーの大袋が販売されています。 大袋で買った方が、カロリー単価の値段は安いのですが、僕は飲むときの手間が少ないことを優先して小袋を購入しています。

最初は1日3食なので、小袋で3袋分を摂取すれば必要な栄養素が摂取できると考えていました。 調べてみると、小袋3食分ということではなく、人間が生きるために必要なカロリー分のCOMPを飲めば必要な栄養素が摂取できる、ということでした。
必要なカロリーについては、COMP公式サイトをはじめ、いろいろなサイトに掲載されているのですが、体格、年齢、性別、運動量などが影響する関係でサイトに毎に必要なカロリーが異なっています。 いくつかのサイトから平均を取ったところ、僕の場合は2,000キロカロリー(±200キロカロリー)ぐらいが妥当みたいでした。 2,000キロカロリーをCOMPで摂取すると、小袋で5袋が必要になります。

さすがに、毎日5袋のCOMPを飲んで生活をするのは非人間的な気がするので、僕は朝食のみをCOMPで補い、昼夜は普通の食事を取るようにしています。

メリット

COMPのメリットとしては、まず朝食の時間短縮が挙げられます。
朝食をCOMPにする前は、卵焼いてー、キャベツ千切りにしてー、適当な野菜でスムージー作ってー、と雑ながらも朝食を作っていました。 料理に慣れていないこともあり、作り始めてから片付けるまで1時間ぐらいかかっていました。 COMPにしてからは、作り始めてから片付けるまで10分以内に収まるようになりました。

直接的な食事時間以外にも、買い物の時間が短縮できたことも大きなメリットになります。 今までは週に2,3回は食材の買い出しに行っていたのですが、買い出しの頻度を減らすことができました。 スーパーに行くと、つい余計なものまで買ってしまうので、スーパーに行く頻度が下がったのは時間だけでなく、無駄遣い防止にも大きく貢献ししています。

また、冷蔵庫の中身を把握しておく必要がなくなったのは、精神的にかなり楽になりました。
朝食を作っていると、食材の残量を把握して、足りなければ買い出しをする必要が出てきます。 毎朝料理をするとなると、冷蔵庫の中身を気にする頻度も高くなり、それがストレスにつながっていました。。
今は週末にしか料理をしないので、平日に冷蔵庫の中身を気にする必要がなくなったので、ストレスフリーになりました。

おすすめの味

COMP自体は豆乳っぽい味なので、水に溶かして飲むのがベーシックなスタイルになります。
ベーシックな味があまり気に入らなかったので、以下を混ぜて作っています。
とりあえず、健康によさそうなものを入れてみたら美味しくなりました。
(純ココアはCOMPの鈴木社長が以前おすすめしていたので取り込んでいます。)

  • COMP
  • SAVAS(ココア味)
  • ナチュラルヘルシースタンダード(ピーチ)
  • 純ココア
  • 調整豆乳

screenshot

まとめ

日本には「ハレとケ」の文化があります。
友人知人との会食や、時間があるときにはハレの食事として、美味しいものをのんびり食べる。 それ以外はケの食事として、最低限栄養の取れるものを食べる。 と、使い分けていけばいいのかな、と思っています。

Read more ⟶

Google Home Miniを買いました


はじめに

先日のGoogleイベントで日本での発売が発表されたGoogle Home Miniを購入しました。

Google Home Miniができることや同封物については以下のようなページで多数公開されているので、ここでは省略します。 Google HomeとGoogle Home Miniの違いはスピーカーの音質程度のようで、動作内容自体に差異は内容です。
手のひらに乗るスマートスピーカ「Google Home Mini」開封の儀

Google Home Miniの電源ポートはマイクロUSBです。次期的にTypr-Cが使われると思っていたので意外なところです。 ただ、僕の身の回りにはマイクロUSBを使っているデバイスがまだ多いので、他のケーブルを流用できるので結果オーライと考えていました。
しかし、下の写真を見ていただくと分かる通り、マイクロUSBポートが本体の奥の方についているので、Google Home Mini自体がケーブルと干渉してしまい、僕の持っている他のケーブルでは代用することができませんでした。
まぁ、持ち運ぶ想定をしていないので仕方がないのですが、ちょっと別の部屋に持っていきたいときには不便でですね(バッテリーも内蔵していないので、給電しながらでないと使えませんし)。 screenshot

とりあえず、天気やニュースを尋ねたり、音楽を再生したりしましたが、対応しているサービスについては、求めている解答が返ってくるのでとても気持ちがいいです。
僕は滑舌が悪いので、音声認識がうまく動作するか不安だったのですが問題なく使うことができました。 さすがはGoogleさんです。

しかし、対応しているサービスがまだ少ないので、かゆいところに手が届かないと感じる部分も多いです。 例えば、僕はPocket Castsというサービスはを使ってPodcastを聴いているのですが、まだGoogle Home Miniに対応していません。 「未視聴のPodcastを順次再生」とかを音声で指示ができればベストです。

懸念事項

Google Home Miniは物理的にミュートボタンがあるので、マイクを無効にすることもできますが、基本的には音を拾い続けたまま使うことになると思われます。
以下のようなバグもあったようですし、悪意の有無に関わらず、情報が外部に漏れてしまうリスクは考えておくべきでしょう。
Google Home Miniに常時録音してしまうバグ発覚、すでに修正済みで製品版には影響なし

極端に悪意がある例では、ジョージオーウェルの1984に登場するテレスコープを使って、国民の監視をしていました。 現時点でのGoogle Home(Mini)は音を拾うだけですが、今後カメラなどが搭載されると、ますますテレスコープ化していくことになります。

良い例でいうと、自分の家に異常があったことを検知できるので防犯、防災対策に活用することが期待できます。 また、体調の変化をすぐ発見してもらえたり、アリバイの証明に使うこともできるかもしれません。

今後の希望

現在は、一問一答での対話となっているので、正直なところ会話をしている感じではありません。 会話のキャッチボールが長く続けられるのであれば、英会話のレッスンを受けたり、愚痴を聞いてもらったりできそうです。

HoloLensをはじめとする、Mixed Realityのヘッドマウントディスプレイと連携させ、アシスタント用のアバターを仮想空間上に表示することも可能になると思います。 そうすれば、Haloシリーズのコルタナや、PSYCHO-PASSの登場人物 常守茜の部屋にいるクラゲ型アバターのキャンディ、のようにますます愛着を持って扱うことができそうです。

Googleの公式ブログにも記載されているように、開発キットも公開されています。 日本語にも対応し始めたようなので、何か作ってみても面白いかもしれません。
Google アシスタント対応アプリを日本語で開発してみよう

Read more ⟶

英語のお勉強


はじめに

みなさんは英語を使いこなしていますか。僕は使えません。
最近はGoogle翻訳の精度も上がりましたが、英語の講演を聞いたり、画像として表示されている英語を理解するためには自身の英語力を鍛える必要があります。

国内で開催されるAmazonWebServiceやGoogleCloudPlatformのイベント、セミナーによく参加しているのですが、英語の講演を理解できず、せっかくの貴重な機会を逃してしまうことが多々ありました。

なので、中学生レベルの英語力があるかも怪しい僕ですが、一念発起して英語の勉強を始めてみました。

試している勉強方法

とりあえず、英語を読む、聴くことが人並みになることが目標なので、Podcastを使ったリスニング、 Kindleでのリーディングを中心に進めています。

Podcast

通勤中に以下のPodcastを中心に聴いています。 アメリカとの文化の違いや、最近の時事問題をテーマにすることも多く、飽きずに聴き続ける事ができます。

以下のような英語のテック系Podcastも聴いています。 正直なところshow noteで概要を見ながら聴いても内容が聴き取れていません。
なので、これらのPodcastをスムーズに聴き取れることが現状の目的になっています。

Kindle

リーディングの勉強としては、Kindkeを使って、英語の絵本や童謡を読んでいます。
電子書籍であれば、わからない単語の翻訳も行えるので、なんとか読み進めることができます。 最初は絵本を読むことに恥ずかしさがあったのですが、読んで見ると読めない単語が多いことに気が付き、恥ずかしがっている場合ではないと腹をくくることができました。

最終的にはO’Reillyの洋書とか読みたいですね(格安、または無料で公開されている本も多くありますし)。

今のところ、読み終えた本は以下の通りです。

Duolingo

無料で使える語学勉強用のWebサービスDuolingoも使っています。
このサービスはゲーム感覚でリスニングやリーディング能力を鍛えることができるので毎日続けています。 英文の意味を日本語で解答する問題では、日本語を入力して解答する都合上、文章の揺らぎが生まれるのですが、ある程度はDuolingo側で吸収してくれるので、自分の言葉で解答することができます。

問題を解いていると「あれ」「これ」「それ」がごっちゃになったり、代名詞の変化を忘れていたりするので、レベルの低さに落ち込むこともありますが、なのか続いています。 1回の学習が10分程度と短時間で完結し、PC版やスマホ版が出ているので、少し空いた時間にサクッとこなせるように設計されているようです。

おわりに

今のところ、スピーキングについては必要としていないのでスカイプ英会話などは使っていません。
海外の人と話したい欲求が生まれたら、スピーキングの勉強を始めてもいいかもしれません。

Read more ⟶

カタカナ表記について


はじめに

僕は工業高校の出身なのですが、当時プログラミングやネットワークを教えてくれた先生からComputerやrouterをカタカナで書くときには長音符は省略した方がいい」と教わってきました。
そのため「コンピュータ」「ルータ」のように末尾の長音符を省略して書いていました。
長音符を省略する理由については覚えていないのですが、おそらくJIS規格に準拠しようとしたのでしょう。

しかし、MicrosoftもWindows7から「コンピューター」「ディレクトリー」のように末尾に長音符をつけるようにしました。
最近は製品やメディアによって、長音符の有無がバラバラになっている状況になっています。

表記がブレると見栄えも悪くなり、検索も難しくなるので、少なくとも自分が自由に書く文章については、意識して表記を統一したいと考えています。 とりあえず、使用者が多いWindows製品を真似て、なるべく長音符を付ける方向で、テクニカルコミュニケーター協会が策定しているガイドラインに準拠していきます。
外来語(カタカナ)表記ガイドライン第3版

ガイドラインに様々な単語に対するカタカナ表記が記載されているので、これを元にしておけば統一感のでる文章が書けるようになります。
これまで、長音符を省略して書いていたので、慣れるまでは混ざってしまうかもしれませんが、徐々に慣れていきます。

ガイドラインに沿って書かれているかを判定してくれるツールがあると助かりますね。

蛇足

ちなみにガイドラインに沿った場合、profileはプロファイルと表記するようです。 ずっとプロフィールだと思ってました。

バトルロイヤルとバトルロワイヤルもごっちゃになっていましたが、バトルロイヤルはプロレスなどで全員敵の状態で戦うルールのこと(CoDでいうFree For Allですね)で、バトルロワイヤルは中学生が殺し合いをする小説、映画のタイトルということでした。
最近人気のPLAYERUNKNOWN’S BATTLEGROUNDS(通称:ドン勝)がバトルロワイヤルに影響を受けた、と書かれた記事が多くあるので混乱してしまいました。
この辺は、ガイドラインにも記載されていないので、それぞれの意味をググって正しい単語を選択しなくてはいけませんね。

Read more ⟶

CloudShellでのブログ執筆環境


ブログ環境

こんにちは、ブログを再開した@foresukeです。
実は諸事情によりメインのPCをChromeBookを使っています。ChromeBookはブラウザと、Androidアプリしか使えない端末です。なので基本的にはネットワークに接続していることが前提となっており、スタンドアローンではまともに使うことができません。

本ブログは、hugoと呼ばれる静的サイトジェネレータで構築しています。静的サイトジェネレータについては以下のサイトに詳しく書かれているので、ここでは省略します。
脱WordPress!静的サイトの特徴やメリットなどのまとめ

静的サイトジェネレータの運用方法としては、ローカル上でhtml/cssファイルを生成し、webサーバにアップロードして公開する、といった流れを繰返すことになります。 僕がChromeBookを使っており、ローカル上でhtml/cssファイルを生成できないので、GoogleClougShellをローカル環境として使うことにしました。

CloudShellはDebianベースのGoogleComputeEngineに開発ツールがインストールされた状態で提供される仮想マシンで、ブラウザから手軽にアクセスできる環境です。がっつり開発するには向きませんが、手軽な開発ツールとして重宝しています。

Debianベースということもあるので、勉強がてらvimを使おうと四苦八苦していましたが、CloudShellにクラウド版エディタがベータとして提供されたので使ってみました。 クラウド版エディタでmarkdownファイルを編集したところ、画面の右側にプレビューがリアルタイムで表示されました。 これはなかなか便利で、ブログ記事を書くのはクラウド版エディタで充分な感じです。

まだ改善の余地はありますが、いい感じにブログ執筆環境ができたので、細々と書いていきます。

Read more ⟶

ブログ再開 -2017秋-


ご挨拶

お久しぶりです、foresukeです。
転職、引越しなどがあり、ブログ更新が停滞していましたが、少しは落ち着いた感じがするので再開していきます。
ブログに慣れるまでは、質より量を優先してどんどん書いていきたいです。

Read more ⟶