Go関連のことを調べてみた2019年12月13日

Go関連のことを調べてみた2019年12月13日

Go言語のフレームワークGobotでドローンを制御してみた。

[LIFULL Advent Calendar 2019](https://qiita.com/advent-calendar/2019/lifull) 13日目の記事になります。

仕事では主にSalesforceやRPAなどのアプリケーション開発に関わっている新卒1年目Webエンジニアです。
9月にメルペイ主催のGopher道場に参加したことをきっかけに、Goの技術中心に最近はキャッチアップしています。

そんな中、GoはIoTにも活用できると聞き、試してみたいと思っていたのでドローンtelloを購入しました。

今回はそんなドローンをGoのフレームワークGoBotで色々動かしてみた話をします。

# Gobotとは
Gobotは以下の35のプラットフォームに対応したGo言語のロボティクス・IoTフレームワークになります。

ARDrone/Arduino/Beaglebone/Black Bebop/Bluetooth LE/C.H.I.P./C.H.I.P. Pro /Digispark/DJI Tello/Dragonboard/ESP8266/GoPiGo3/HS-200

元記事を表示

09. Typoglycemia

## 09. Typoglycemia
スペースで区切られた単語列に対して,各単語の先頭と末尾の文字は残し,それ以外の文字の順序をランダムに並び替えるプログラムを作成せよ.ただし,長さが4以下の単語は並び替えないこととする.適当な英語の文(例えば”I couldn’t believe that I could actually understand what I was reading : the phenomenal power of the human mind .”)を与え,その実行結果を確認せよ.

###Go
“`go
package main

import (
“fmt”
“math/rand”
“strings”
“time”
)

/*
* 配列からランダムで1要素を取り出し値を返す、またその配列は削除する
*/
func choice(m *[]string) string {
// 値数内の乱数を発生
i := rand.Intn(len(*m))

// 該当の単語を取得しマップから削除
str := (*m)[i]

// これは便利(

元記事を表示

過激派によるGoの勧め

モバイルエンジニアとして、CBcloudに参画したbigbackboomです。メインでAndroidアプリの開発を行なっています。今回Adventカレンダー二度目の投稿です。

弊社では全く使用されていない**Go**ですが、私が前社でGoのサーバーを設計開発をしたので、私自身はGoをかなりの推し言語としています。今回は、Goの良いとこ、悪いとこを書いていこうと思います!

# go言語って?
**Go**はオープンソースのマルチプラットフォームで動くコンパイル型言語です。言語仕様に、型安全、信頼、効率の三つに主眼をおいた言語です。

元々は2007年にGoogleに所属していた、ロバート・グリーズマー、ロブ・パイク、ケン・トンプソンが考案し、2009年に正式に発表されました。彼らは**良いプログラミング言語**とは[以下のように定義](https://web.stanford.edu/class/ee380/Abstracts/100428-pike-stanford.pdf)しました。

– 簡潔かつリーダブルな言語
– 静的型付
– webpageなどでの軽量差
– 速い
– ス

元記事を表示

gRPCでオンラインポーカーを作った話

ここ何ヶ月か合間の時間を見繕って勉強がてらgRPCとgoでオンラインポーカーを作っていたのでご紹介してみる(ソースがあれですみません。。

* proto
https://github.com/admogh/online-porker-protos
* server
https://github.com/admogh/online-porker-server
* client(go)
https://github.com/admogh/online-porker-clients

Dockernizeしていないのでそのままですが多分諸々入れればローカルで動作するようになっています。
# 仕様
* ポーカーのルール的には古いクローズドなファイルカードドローで(ただし現状ベッティング要素なし)、4人プレイ専用で、単純に1人ずつカード交換をします。
* 他のクライアントからの接続がない場合Wait後残りのプレイヤーをNPCとしてゲームが開始されます。
* 基本的にクライアントが何もしないとサーバ側で自動的にタイムアウトしたとみなして処理を進めていきます。
* リクエスト的には

元記事を表示

Cloud Runでbeegoアプリケーションをデプロイ

## はじめに
こんにちは、SREエンジニアやってます。@hayaosatoです。
今回はGCPのCloud Runの入門としてbeegoで作ったアプリケーションをデプロイしてみたいと思います。

## beego
beegoはGoのフルスタックなWebアプリケーションフレームワークで、beeというCLIツールがあり、Railsライクなフレームワークです。
今回CloudRunでデプロイするアプリケーションはこのbeegoで作成したアプリケーションをデプロイしたいと思います。
beegoコンテナのDockefileは以下のようになります。

“`Dockerfile
FROM golang:1.13.5

ENV GOPATH $GOPATH:/go
ENV PATH $PATH:$GOPATH/bin
WORKDIR /go/src

RUN apt update &&\
go get “github.com/go-sql-driver/mysql” &&\
go get “github.com/beego/bee” &&\
go get “github.com/ast

元記事を表示

Goでのスライスと配列の違い

# 最初に
最近Goの勉強をはじめました。JSからGoにきた自分にとってスライスってなんぞやってやりました。
いろいろなサイトや本でも詳しく書かれていることが多いですが、自身の理解を深めるためにも書いてみました

# スライス

スライスは簡単に言えば「可変長配列」を表現する型です。つまりは、容量(cap)を変えることができます。

## スライスの属性

| 名称 | 説明 |
| —- | :——————–: |
| cap | スライスの容量 |
| len | スライスの長さ |
| ptr | スライス全体のポインタ |

## スライスの作り方

### var を使った書き方

“`go
// []の後ろで型名を指定できる
var s []int
fmt.Printf(“val=%v,len=%d,cap=%d\n”, s, len(s), cap(s))
// val=[],len=0,cap=0
“`

append を使うことで新たに値を追加することができます

元記事を表示

SpreadSheet + GoogleCloudFunctions + Goで管理画面作った

# つくったもの
サークルのホームページとその管理画面
(所属サークルがばれるのでURLは割愛)

# 要件
– 無料で運用したい(サークルの経費節約?)
– 非エンジニアがHPを更新するので、データを入力する管理画面が必要
– バックエンドはGoで書きたい

# システム概要
スクリーンショット 2019-12-11 22.12.11.png

# 管理画面
管理画面を作るのがめんどうだったので、非エンジニアでも使いやすいGoogleSpreadSheetを採用。

スクリーンショット 2019-12-06 0.03.56.pngGo x WebAssembly ってどんな?

この記事は [Wano Group Advent Calendar 2019](https://qiita.com/advent-calendar/2019/wano-group) の12日目の記事となります。

Advent Calendar もそろそろ折り返しですね??

## GoとWebAssembly
WebAssemblyとは何ぞって話は詳しくはしませんが、ブラウザが読めるアセンブリのコード形式のことです。([詳しくはここ](https://www.w3.org/TR/wasm-core-1/))
特徴としてjavascriptに比べ高速という点が挙げられ、jsの補完的な立ち位置で、[モダンブラウザは概ねサポートしています。](https://caniuse.com/#feat=wasm)

Goではv1.11よりWebAssemblyがサポートされるようになり、進行形で様々な改善がされているみたいです。
[Official](https://github.com/golang/go/wiki/WebAssembly)に色々書いてあります。

ということで勉強がてらGo

元記事を表示

FyneでFineな(文字化けしない✙可搬性あり)アプリを作る方法

#Abstract
GoでGUIアプリを作れるライブラリFyneで日本語が文字化けしないかつ可搬性あるアプリを作成する方法を見つけたので報告します。

#Introduction
FyneはGoでGUIアプリを作れるライブラリです。Fyneの概要や使用法は以下のリンクをご参照ください。
– [公式](https://fyne.io/develop/distribution.html)
– [Github](https://github.com/fyne-io/fyne)
– [GoDoc](https://godoc.org/fyne.io/fyne)
– [GoでGUIを作るFyne というライブラリが楽しそうだよ、というご紹介(@KanikoroRerereさんのQiita記事)](https://qiita.com/KanikoroRerere/items/e2dcc44e625849526015)

#Problem
でも、Fyneで日本語を使用するアプリを作ると文字化けします。原因はバンドルされたフォントが英語圏用の[Noto Sans](https://github.com

元記事を表示

Goでライフゲームを実装してみた

こちらは [Go4 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/go4) 12日目の記事です。

この記事ではGoでライフゲームを実装したコードの紹介とその解説をおこないます。

## Motivation

最近Twitter上でセル・オートマトンというのを発見しまして、言葉では表現しづらいのですが、物凄く心に響くものがありました。ロマンを感じた。

自分もやってみたいなと思い調べてみると、代表的な実装例としてライフゲーム([Game of Life](https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life))があるというのを知りました。

すでにGoを含め色々な言語で実装したものがネット上には溢れていたのでN番煎じではありますが、やりたいのでやってみました。

## Output

Repository: [mqtsuo02/go-game-of-life](https://github.com/mqtsuo02/go-game-of-li

元記事を表示

仕事中でもDJがしたい

本稿は、クソアプリ Advent Calendar 2019 12日目の記事です。

# 概要
毎日毎日CUIに向かってvimやemacsやnanoを駆使してYAMLを書いたりコーディングしたり。
そんな仕事に日々追われるエンジニアの皆さんに足りていないもの。

そう、**クラブ通い** ですね。

仕事で忙しい上に年末の忘年会ラッシュで皆さんもなかなか週次でクラブに足を運ぶことができていないのではないでしょうか。
私もその一人です。
音楽を聞くだけであればYoutubeのMIX動画などである程度事足りますが、実際にDJをするとなると難しい。
家に帰るともう夜遅くて気力がないし、土日は体力回復のためにひたすら寝るか、死んだような目でYoutubeで魚を捌く動画か焚き火の動画を見て過ごすのが関の山。

となるともう**仕事中にDJをする**しかありませんね。

仕事中にDJをするのは少々困難が伴います。
業務中、CUIしか開いていないであろう皆さんがrekordboxやTRAKTORなどを開いていようものであれば上司はカンカンに怒って謎のNoSQLの検証タスクをアサインしてくることでしょ

元記事を表示

【Go】関数からポインタを返すのは値を返すより遅くなる?

# はじめに

[Should I Use a Pointer instead of a Copy of my Struct?](https://medium.com/a-journey-with-go/go-should-i-use-a-pointer-instead-of-a-copy-of-my-struct-44b43b104963)といった記事をいくつか最近目にしました。

`func NewMyStructVar() myStruct` な関数と `func NewMyStructPtr() *myStruct` な関数はどう使い分けたら良いか腹落ちさせるために実験してみました。

この記事では計測して得たプロファイル結果を踏まえて私の”考察”、”推測”を記載しているのでご注意ください。確認が不足してる点もあるので随時更新したいです。

# TL;DR

どちらが結果的に速いかというのは一意に決められません。返された値・ポインタの寿命と使われ方に依ります。
端的にまとめると、寿命が短く頻繁に呼ぶような使い方の場合は値の方が良く、低頻度に呼ばれ他の処理に渡して長く使い回すよ

元記事を表示

役にたつか立たないかわからないInteliJIDEの話 【随時更新していくよ!!】

# はじめに

勢いでIntelliJ All Products Pack買いました!
衝動買い楽しい。
せっかくだしちゃんと勉強しながら色々と使いこなせるようにメモします。
この機能の紹介をぜひー!とかこれ忘れてないなどあればどんどんお教えいただけますと幸いです。追記していきます!!
あと、サムライズムさんとかIntelliJとかお金もらってかいているわけではないです。

## 色々あるけど・・・

いろんな機能があって色々と扱えるものも違ってきます。
ちなみに最強はIntelliJ IDEA Ultimate Editionです。
plugin で追加さえすればめちゃめちゃ捗ります。

僕がweb開発とアプリする人間なので、それ以外にどうするべきなのかはわからないです。
値段は年間ですが、3年目まで毎年安くなっていきます。

## JavaScripter

webStormで要件を満たせます。
**年間6300円で、三年目だと3700円**です。

webStormは、**HTML/CSS、js, ts, coffe script**を扱うことができます。なので、フロントエンドだ

元記事を表示

GoからGmailAPIで送信する時の文字化けに対応する

# はじめに
[前回](https://qiita.com/siro33950/items/7c129ffbd67d717d8646)GoからGmailを送信したが、そのままだと送信者名と題名に日本語を指定すると文字化けしてしまった
対応方法のメモ

# 原因
現状のメールの仕様上、ヘッダーは標準でASCII文字にしか対応していないが、Goは文字列をUTF-8で扱っている
そのため、本文以外でエンコードをした上で文字コードとエンコード方式を教えてあげる必要がある

# 対応
日本語をBase64でエンコードした上で

“`
=?文字セット?エンコード方式?エンコード後の文字列?=
“`
の形式で記述する

今回やりたいことに対応するためには以下の処理が必要

“`go

subject := base64.StdEncoding.EncodeToString([]byte(“メールの題名”))
suportedSubject := “=?UTF-8?B?” + subject + “?=”
“`

# 実装

“`go

func createMessage(senderN

元記事を表示

Goのフレームワーク「echo」でCORSの設定を行う

# 概要

フロント側はポート番号`8080`、サーバーサイド側はポート番号`8008`で立てた際に**ローカル環境でもCORSが起こった**のでCORSの設定を行う

以下エラー発生時のChromeのコンソール部分
![コメント 2019-11-21 130116.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85815/74d37940-e7d4-c1bb-142b-427fd2efeba6.png)

# サーバー側のサンプルコード

単純にパラメータ`name`を`POST`すると`tasks`テーブルnameを登録できるというアプリです。
**※実際にはトークンなども必要ですがここでは割愛します**

“`main.go
package main

import (
“database/sql”
“log”
“net/http”

_ “github.com/go-sql-driver/mysql”

“github.com/labstack/echo”
)

func main(

元記事を表示

【Go】.envファイルをGolangでも使用するためのライブラリ「godotenv」

# godotenv

要は`.env`ファイル(環境変数定義)を使用するためのライブラリ

## インストール

“`
go get github.com/joho/godotenv
“`

## importに以下を追記

“`.go

pckage main

import “github.com/joho/godotenv”

“`

## .envファイルを作成

ディレクトリ構成は以下

“`.bash
/
|- .env
|- .env.example //git管理用のサンプル.env
|- server/
|- main.go
“`

デフォルトでは普通の`.env`が読み込まれるようです

## .envファイル作成後に中身を記述

“`.env
ENV=local
DB_USER=root
DB_PASS=pass1234
DB=test_db
“`

ちなみに`.env.example `には環境ごとに代わる値は空にしておく

## .envに定義した値を取得

“`main.go
package main

import (

元記事を表示

Go言語で「embedded で継承ができる」と思わないほうがいいのはなぜか?

この記事は [Go7 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/go7) 11日目の穴埋め記事です。

# 背景

以前、 @mattn さんが↓のようなツイートをされていまして、