aoma blog

エンジニアの日常とか技術とか

PHPer がはじめて Tour of Go を学んだときのポイント24選

Goって興味はあったけど全然触ってこなかったaomaです。

Goには A Tour of Go という、これをやればGoマスターになれるステキサイトがあります。

A Tour of Go

普段PHPに慣れている中で、ムムッ!?っとなった点を目次別にメモしました。
PHPerでこれからGoを学ぶよって人の助けになれば幸いです。

Packages, variables, and functions.

Flow control statements: for, if, else, switch and defer

More types: structs, slices, and maps.

  • ポインタ

  • structのフィールドはポインタで (*p).Xのようにアクセスできる。p.Xと省略することも可能

  • structのポインタpを出力すると&がついた形で返ってくる。(変数だと0x414020みたいなやつなのに...)
  • 配列は固定長。可変長はスライスをうまく使う

    • https://go-tour-jp.appspot.com/moretypes/7
    • コロンで指定した最初の要素は含むが、最後の要素は含まない。var s []int = primes[1:4]の場合、要素は3つ。
    • Sliceは配列のような感じ。要素をいじると元の配列や別のSliceの要素も変更される
    • 長さと容量。とっつきにくいが、長さはどこまで見せるか(カーテンどこまで開けるか)、容量は実際に持っている値たちと考えるとわかりやすい。
    • makeで様々な空のsliceを作れる
    • appendでsliceに追加できる。
      • https://go-tour-jp.appspot.com/moretypes/15
      • cap増え方の謎...
        • 調べた

          https://qiita.com/hitode7456/items/562527069e13347b89c8
          > 長さ が 容量 を超えた時に、その時の 容量 の倍の 容量 が新たに確保されることが分かりました。
          http://toc-dev.blogspot.com/2012/09/goslice-make.html
          > 2のn乗で徐々にメモリが拡張されているのがわかる。
          
        • ということで2の倍数で増えてく模様。(cap=3のときに溢れても6ではない)

          2個目の記事で、3 3 3 3 6 6 6 12 になっているところは、今実行すると、3 3 3 3 8 8 8 8 になった。
          
        • Goのバージョンによっても変わるらしい。気にしなくていいっぽい。

          https://stackoverflow.com/questions/38573983/capacity-of-slices-in-go
          > TL; DR - スライスの容量がどれだけ拡張されるかは仕様に記載されていません。Goのバージョンが異なれば(または実装が異なる場合も、アーキテクチャが異なる場合も同じバージョンなど)、スライスの容量は異なります。
          
  • Maps(辞書的なやつ。key/value

  • 関数は関数の引数や戻り値としても使える

  • クロージャーは変数を保持する。戻り値が関数だとクロージャーと判断してよさそう。

Methods and interfaces

ゴルーチン

  • http://cuto.unirita.co.jp/gostudy/post/goroutin/
    • 並列処理用。独立して動作する実行単位であり、OSが管理するスレッドに割り当てられて動作します。
    • 関数の呼び出し時に先頭に「go」を付けるだけ
    • 「ゴルーチン」として呼び出した関数の終了は待たないことです。そのため、呼び出した関数が返す戻り値を受け取ることはできません。
    • mainから開始している親となる処理が終了すれば、いくら他に「ゴルーチン」が動いていても、すべて中断して終了します。

おまけ

Note: Go playground上の時間は、いつも "2009-11-10 23:00:00 UTC" です。 この値の意味は、読者の楽しみのために残しておきます(^^)

一体どんな意味が!?と思い調べてみました。

Goは2009年11月に公に発表され[23]、バージョン1.0は2012年3月にリリースされました。 https://en.wikipedia.org/wiki/Go_(programming_language) https://opensource.googleblog.com/2009/11/hey-ho-lets-go.html

なるほどGoの誕生日ね!おめでとう!

【MySQL】壊れているビューを削除できない!

現象

気づいたらビューが壊れている。

#1356 - View 'testdb.view_test' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them

削除しようとしても消せない!!

DROP TABLE view_test;
// #1051 - Unknown table 'testdb.view_test'

解決策

まず適当なSQLで壊れていない状態に作り直す!

CREATE OR REPLACE VIEW view_test AS SELECT now();

そして削除!

DROP TABLE view_test;

SO COOL!!!

昨今のJavaScriptをレビューしたら全くわからなかった話

はじめに

最近JavaScriptのプルリクが来たので「よーしやったるでー」って感じでレビューしたんですが、まったく理解できずレビューになりませんでした。

その時疑問に思ったことをメモします。。
誰かの助けになれば幸いです。。

これはもう引退やな。。

classの中で function って書くの省略してるの?

class TestClass {
    test() {
        処理
    }
}

function を省略して書けるのかなと思ったらそうではない。むしろ書いてはいけない。 下記はエラーになる。

class TestClass {
    function test() {
        処理
    }
}

PHPに慣れてるからか、もやもやする。

(a, b) => は無名関数なのはわかったけど function(a, b) じゃダメなの?

(a, b) => は無名関数で function(a, b) と同じ。

好みの問題だがthisに違いがある。

this.hoge;
function(a, b) {
   this.hoge; ←違うもの
}
this.hoge;
(a, b) => {
   this.hoge; ←同じ!こっちのほうがthisが何を指してるかわかりやすい!(外と同じthisになってる)
}

... ってなんや...

... はスプレッド演算子
中身バラす(展開する)やつ。
こんな感じで使う。

var parts = ['shoulders', 'knees']; 
var lyrics = ['head', ...parts, 'and', 'toes']; 
// ["head", "shoulders", "knees", "and", "toes"]

Arrayだったりオブジェクトだったりいろいろあるらしい。。詳しくはこちら

こんな感じで引数としても使える。無限引数。

const testFunction = (...items) => {
    items.forEach(function(item) {
        console.log(item);
    });
}

testFunction('aaa');
testFunction('aaa', 'bbb', 'ccc');

{} は処理書き忘れ?

{} は空のオブジェクト宣言。 function の処理の中身ないやつかと思ったらオブジェクトだった。なるほど、、まぁたしかに。。

reduce 関数とかで出てくる。

var countedNames = names.reduce(function (allNames, name) { 
  if (name in allNames) {
    allNames[name]++;
  }
  else {
    allNames[name] = 1;
  }
  return allNames;
}, {});

copy2clipboard = copy; って何してるんや...

copyクリップボードにコピーする関数。 https://blog.leko.jp/post/copy-function-of-developer-tools/

小技として、 promiseの中とかで使おうとすると名前解決できなかったりするので、

copy2clipboard = copy;

のように、事前にクローンしておいて、

this.copy2clipboard("logloglog");

みたいな感じで使える。

Mapって何や...

new Map(kvArray);

Mapは配列を連想配列にするクラス。Mapは型。
{} とは別。{} はキーに数値を使えないじゃん、ちゃんとした連想配列作ろうよ!ってことでMapができた。

詳しくはこちら

await 恐怖症や...

awaitはasyncが指定されてるときに使える。処理が終わるまで待つ。

awaitがないとthis.usersValidnesにプロミスが入って、this.usersValidnes自体にthenがないのでプロミスのまま生き続ける。処理は終わるけど結果が取れない。

hensu;
hoge().then(e => {
   hensu = e;
})

hensu;
hensu = await hoge()

は一緒。

awaitをなくすと

hensu= hoge()

となり、thenがないことになるので、

hensu.then(e=>~~~~)

してあげる必要がある。

hoge()は5秒くらいで"A"という文字列を返すプロミスだとする。

hensu = hoge();
await hensu; // 処理が終わるまで待つ
console.log(hensu) // 終わったプロミスが表示されるだけ

下記ならば値が取れる

hensu = hoge();
hensu2 = await hensu; 5秒かかる
console.log(hensu2) // "A"
hensu = hoge();
await hensu; // 処理が終わるまで待つ
console.log(await hensu) // ”A”
console.log(await hensu) // ”A”
console.log(await hensu) // ”A”
console.log(await hensu) // ”A”

とかはできる。 awaitは「プロミスを結果に変換する関数」だと考えるとわかりやすい!

async*アスタリスクは何なんや!

* はジェネレータになる。ふつうはfuctionにつく。classだとfunction書けないのでasyncに付いたりする。

yield (いーるど)って何やねん!

ジェネレータ用のキーワードreturn みたいなもの。

yieldreturn する。次呼ばれると yield の下から処理が始まる。

では yield* は一体何なのか...

yield を返すときは yield* としなければいけない。 return ではダメらしい。

function* func1() {
  yield 42;
}

function* func2() {
  yield* func1();
}

ややこしい。。詳しくはこちら

const って上書きできるの?

for await (const record of recordsGenerator) {
    処理
}

constを上書きしてるように見えるが、そうではない。

constは上書きできないので下記は当然エラーになる。

const a = 1;
const a = 2;

が、ここでは下記のような事になるので、スコープが違うのでエラーにならない。

{
   const a=1;
}
{
   const a=1;
}
// constを上書きしているのではなく別モノを定義している。

さいごに

近年のJSはぼくの知ってるJSちゃんじゃなかった。。大人になってた。。

GKEのpodに入るコマンドメモ

Cloud Shellにて、よく忘れるのでメモ。

podを探す(pod一覧)

kubectl get pod

podに入る

kubectl exec -it {pod名} /bin/bash

オプションの意味

  • -i:コンテナへ標準入力(STDIN)を渡す
  • -t:標準入力(STDIN)をTTY(コンソール入力)とする

詳しくはこちら

Googleスライドでプレゼンする時に使えるオススメの技 1選!

こんばんはaomaです!

今日は金曜ですね!このあと勉強会でプレゼンする人もいるのではないでしょうか?

そんなあなたにオススメする技の紹介です!

よく〇〇のオススメ13選とか、△△のオススメ70選とかあったりしますが、多すぎるだろと。2桁いったらもう覚えきれないです。その中から真のオススメに絞ってくれよと。なーんて思ったりするわけです。

なので1選!

Googleスライドでプレゼンする方は是非試してみてください!

オススメ1選!その技とは!!?

プレゼンテーション中にwまたはbを押してみてください。

これで画面が真っ白、または真っ黒になります。

ええ、これだけです。

G Suite アップデート ブログ: Google スライドのプレゼンテーションでの空白画面への切り替えと、自動再生の切り替わり時間オプションの設定

これ地味に良くないですか!?
開始前に真っ黒にしておいて、話し始めてから表紙見せたりとか、話に集中して欲しい時とかに画面真っ黒にして集中させたり。
使い方は無限大です!水陸空無限大!

プレゼンに戻る時は適当なキーを押せば復帰します。 ちなみにwはwhite、bはblackの略ですね!

是非使ってみてくださいー。

【ブログ運営報告】祝!脱ビギナー!

8月は毎日ブログを更新し続けました!

そしたら奥さん、月間3000PV、、超えられましたよ。

ebloger.net

ということで!やりました!ついに脱ビギナー!いえーい!

目標はやっぱり口に出すべきですね!(ブログだったけど)

aoma23.hatenablog.jp

心が折れそうなとき、誰かに見られてる(応援してくれてる)と思えたことで、毎日ブログ更新という目標を達成する事ができました!(クソ記事ばかりですがしかも良記事ばかり!)

ここ最近のアクセス数を載せておきます。

平均100超えてる!マンモスうれCー!

結論

継続はチカラなり。

これからもよろしくお願いしますー。

【目標達成!】8月毎月ブログ更新できたよ!

8月は毎日ブログ更新することが目標でした!

aoma23.hatenablog.jp

アクセス数とか1ヶ月更新し続けてどうなったかは後日報告しますね!

まずは...やりました!頑張りました!すごい!エライ!

ということで褒めてほしいw