PHPer がはじめて Tour of Go を学んだときのポイント24選
Goって興味はあったけど全然触ってこなかったaomaです。
Goには A Tour of Go という、これをやればGoマスターになれるステキサイトがあります。
普段PHPに慣れている中で、ムムッ!?っとなった点を目次別にメモしました。
PHPerでこれからGoを学ぶよって人の助けになれば幸いです。
Packages, variables, and functions.
- 変数名の 後ろ に型名を書く
- 戻り値となる変数に名前をつけることができる
- 関数の中では、var 宣言の代わりに := の代入文で暗黙的な型宣言が可能
- 関数の外では、キーワードではじまる宣言( var, func, など)が必要
- 1 << 100
- (Go関係ないけど)<<はシフト(bitの移動)で乗のこと。1は2進数で表現されている。つまり2の2乗。
Flow control statements: for, if, else, switch and defer
- for、ifに括弧 ( ) は不要。中括弧 { } は必要
- for の初期化と後処理ステートメントの記述は任意
- whileはない。代わりにforを使う。セミコロン(;)の省略が可能
- if は、 for のように、条件の前に、評価するための簡単なステートメントを書くことが可能
- switch はbreakが不要
- https://go-tour-jp.appspot.com/flowcontrol/9
- 条件のないswitchは、 switch true と書くことと同じ
- caseに条件を書くことも可能
- defer ステートメントは、 defer へ渡した関数の実行を、呼び出し元の関数の終わり(returnする)まで遅延させる
defer へ渡した関数の引数は、すぐに評価される
https://go-tour-jp.appspot.com/flowcontrol/12
package main import "fmt" func main() { t := 1 defer fmt.Println(t) t++ fmt.Println(t) } // 2 // 1
defer が複数ある場合はLIFO(last-in-first-out) で呼び出される
More types: structs, slices, and maps.
ポインタ
&
オペレータで、その変数へのポインタを引き出す。p = &i
*
オペレータで、ポインタの指す先の変数を示す。*p(iのこと)
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)
- https://tour.golang.org/moretypes/19
- エクササイズ
- https://tour.golang.org/moretypes/23
- やった
- https://play.golang.org/p/kbXho4nncW7
- Goは変数使わないと怒られる。使わないものは_にすれば逃げれる
- The Go Playgroundでソースコードシェアできる
関数は関数の引数や戻り値としても使える
クロージャーは変数を保持する。戻り値が関数だとクロージャーと判断してよさそう。
- https://tour.golang.org/moretypes/25
- sum := 0 は一度しか呼ばれない
adder() func(int) int
の最後のint
はfunc(int)の戻り値ってこと。- https://play.golang.org/p/53ao0yB3GIS
Methods and interfaces
- 構造体にメソッド定義できる
- intなどの型にもメソッド定義できる。型をtypeで定義すれば。
- ポインタレシーバーで書き換えれる
ゴルーチン
- 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
みたいなもの。
yield
は return
する。次呼ばれると 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ちゃんじゃなかった。。大人になってた。。
Googleスライドでプレゼンする時に使えるオススメの技 1選!
こんばんはaomaです!
今日は金曜ですね!このあと勉強会でプレゼンする人もいるのではないでしょうか?
そんなあなたにオススメする技の紹介です!
よく〇〇のオススメ13選とか、△△のオススメ70選とかあったりしますが、多すぎるだろと。2桁いったらもう覚えきれないです。その中から真のオススメに絞ってくれよと。なーんて思ったりするわけです。
なので1選!
Googleスライドでプレゼンする方は是非試してみてください!
オススメ1選!その技とは!!?
プレゼンテーション中にwまたはbを押してみてください。
これで画面が真っ白、または真っ黒になります。
ええ、これだけです。
G Suite アップデート ブログ: Google スライドのプレゼンテーションでの空白画面への切り替えと、自動再生の切り替わり時間オプションの設定
これ地味に良くないですか!?
開始前に真っ黒にしておいて、話し始めてから表紙見せたりとか、話に集中して欲しい時とかに画面真っ黒にして集中させたり。
使い方は無限大です!水陸空無限大!
プレゼンに戻る時は適当なキーを押せば復帰します。 ちなみにwはwhite、bはblackの略ですね!
是非使ってみてくださいー。
【ブログ運営報告】祝!脱ビギナー!
8月は毎日ブログを更新し続けました!
そしたら奥さん、月間3000PV、、超えられましたよ。
ということで!やりました!ついに脱ビギナー!いえーい!
目標はやっぱり口に出すべきですね!(ブログだったけど)
心が折れそうなとき、誰かに見られてる(応援してくれてる)と思えたことで、毎日ブログ更新という目標を達成する事ができました!(クソ記事ばかりですがしかも良記事ばかり!)
ここ最近のアクセス数を載せておきます。
平均100超えてる!マンモスうれCー!
結論
継続はチカラなり。
これからもよろしくお願いしますー。
【目標達成!】8月毎月ブログ更新できたよ!
8月は毎日ブログ更新することが目標でした!
アクセス数とか1ヶ月更新し続けてどうなったかは後日報告しますね!
まずは...やりました!頑張りました!すごい!エライ!
ということで褒めてほしいw