えんじにぃーあぶろぐ

あまり長い文章は好きではないので、長い時間をかけないで読める、簡単な内容を目指すエンジニアのブログです。

Go's Declaration Syntax

さて

 

週末いかがお過ごしでしょうか?

 

自分?

 

家事したりドライブしたり

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

昼寝したり

=====○)д`);.・;゛;ブッ 

 

 

 

 

 

 

 

 

 

 

 

 

 

さ、さて

 

Goの勉強を適度にしていると、プロフィールにも書いてありますが、

休日に「A Tour of Go」を再び読んでいました。

go-tour-jp.appspot.com

 

 

 

 

 

 

 

 

 

 

読んでいた人にはタイトルが何を示していたのか、お分かりだと思いますが、

 

タイトルはGoの構文についての記事です。

blog.golang.org

 

日本語版は有志の方が翻訳されていますね。ありがとうございます。

qiita.com

 

 

 

 

 

Goは比較的新しめの言語であるため、

既存の言語の不便な所を改善してあるところがあることが多いです。

 

こと、今回のGoの構文については記事にもある通り、

Cと比べてありますね。

 

 

 

 

 

C言語の場合は

戻り値の型 関数名(型 変数名,・・・) 

 

となっております。

 

記事内では複雑になると、ごちゃごちゃしてわけがわかないと書かれておりますが、

その理由は動線といいますか、

関数を解釈しようとするとき、右や左に行ったり来たりする、ということでしょうか。

 

 

例えば…

 

string main(int a(int x, int y), string tmp[10])

 

「戻り値はstring型で名前がこれ、引数は…

ふむふむ、int型が2つを引数に持つ関数と、string型の配列の2つなんだな。

int型2つの関数の戻り値は…int型か、

えーとつまり、一番上の関数はintとstringの配列を引数に持つ関数か。

戻り値の型はなんだっけ…そうそうstringか」

 

左から右に読んでいったつもりが、

思考をまとめるときに、左にまた読まなければいけないことになりますね。

 

 スパイラル状とも呼ぶそうです。

f:id:ygt1qa3:20190224205058j:plain

鳴門の渦巻きお勧めです。
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Goでは

func 関数名(変数名 型,・・・) 戻り値の型 

 という風ですね。

 

基本的に情報が右に集中しているので、左から右に読みながら

最後には一番上の関数の戻り値の型が記述してあることになるので、

本当に読んだまま解釈できるようになっております。

 

 

 

 

 

 

 

 

 

f:id:ygt1qa3:20190224204621j:plain

右から左じゃねぇか!

 

 

 

 

 

 

 

 

 

 

 

初めてGoを学び始めたとき、これすごい読みやすかった記憶があります。

 

それただC言語になれていないだけじゃないの?

=====○)д`);.・;゛;ブッ 

 

 

 

 

 

 

 

 

 

 

 

 今回の記事でポインタの話が出てきたので、

明日はそれを書こうかなと思います。

 

それでは。

コピーについて

さて、

 

最近読みたいな~という本が溜まってきています。

買っていない本、買って積んである本。

 

手を動かして読む系(いわゆる写経用)ばかりなので、

一冊きちんと読み終わるのに1か月ほどかかります。

平日は仕事もあり、ブログも書くので殆ど休日にがっつりやる感じですが。

 

とは言っても、休日の片方は一人暮らししているので家事で大半が消費されます。

結構家事の自動化を進めているので、だいぶ時間はとれるようになりましたが。

その辺もコラムとしてブログで書きたいな~と思いつつ。

 

 

 

 

 

 

 

 

 

 

今日はコピーについて少し書きます。

 

 

事の発端は、仕事でpythonを触っているときに

同じjsonファイルを2回、json.load()で開きました。

 

そうするとオブジェクトが2個できますが、

片方の要素を変更すると、もう片方も同じように変更されてしまうことがありました。

 

幸い、元々この辺については知識があったので

deepcopyで一旦コピーして編集することで逃れました。

 

ただ思いがけないところで引っかかったので、

今日の内容はこれにするか!って気分になったので、この場でまとめようと思います。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

シャローコピー(shallow copy

 

f:id:ygt1qa3:20190222213840j:plain

 

shallowが浅いという意味があるので、直訳は浅い複製。

 

基本的にプログラムでは、

a=1

としたとき、1という値をいつも扱っているわけではありません。

 

 

 

 

まず、1という値はメモリ(主記憶装置)上に格納されております。

 

メモリについてはこちらを参照。プログラムが動く仕組みって意外に楽しいですよ。

yamanjo.net

 

 

プログラムでは

 

・値

・その値がメモリのどこに格納されているかという情報(参照)

 

の2つを使って処理が行われています。

 

 

 

今回のシャローコピーでは、

あるオブジェクトをコピーしたとき、

 

コピー元のオブジェクトコピーして生成されたオブジェクトの2つは

同じ値を指しています。

 

 

 

 

 

つまり、

 

参照だけがコピーされたということですね。

 

f:id:ygt1qa3:20190222220301p:plain

 ※参照を切り離してもこっ〇りさんは出てきません。

 

 

 

 

 

 

ですので、片方のオブジェクトの値を変更すると、

もう片方もそれにつられて変更されてしまいます。

 

まさに冒頭の出来事ですね。

 

予期せぬことが起こるので、複製には注意したいですね。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ディープコピー(deep copy

 

f:id:ygt1qa3:20190222214116j:plain


こちらはshallowの反対、deepなので、直訳で不快深い複製

 

 

 

 

 

 

 

 

シャローは参照だけのコピーでしたが、

ディープコピーは値と参照、その二つが複製されます。

 

コピー元のオブジェクトコピーで生成されたオブジェクトは、

ともに別々の値を参照を持つことになりますので、

片方を変更しても片方には影響がありません。

 

f:id:ygt1qa3:20190222220936j:plain

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2つのコピーを簡単に書いてみました。

 

プログラミングをしているときは、

値と参照を意識して書きたいですね。

 

今回のコピー以外にも、似たような話で

参照渡し・値渡しという言葉もありますので、意識して損はないと思います。

 

コードを書いているときに、

頭の中で値と参照のやりとりを思い浮かべながら書くことができたら

最高に楽しそうです。

 

 

継続

さて

 

今日も仕事で出た話題からですが、

 

 

 

「継続」

 

 

 

についてです。

 

 

とは言っても、

 

 

 

 

 

 

 

f:id:ygt1qa3:20190221205628j:plain

 

 

 

 

 

 

 

ではなく、

 

 

 

 

 

 

 

 

 

 

 

 

計算機科学においての「継続」です。

 

ちなみに余談ですが、私は物事が継続しないタイプで、

twitterとかアカウント作っても3日ぐらいで飽きちゃうんです。

 

このブログは続けていきたいですけどね。

 

 

 

 

 

 

 

 

 

 

 …

 

 

 

 

 

 

 

 

 

 

今回の「継続」について、

自分はほとんど知識がなかったので、さっそく調べてみました。

 

計算機科学における継続(けいぞく、continuation)とは、プログラムの実行においてある時点において評価されていない残りのプログラム(the rest of the program)を意味するものであり、手続き(procedure)として表現されるものである。

 

継続 - Wikipedia

 

 天下のwiki様には、このような一言説明に加えて、

詳しい概要が記載されておりました。

 

 

 

 

 

 

 

 

 …

 

 

 

 

 

 

 

 

 

今回職場では、

 

 

 

「継続渡しスタイル」

「限定継続」

 

 

 

の2つが出てきたので、これに絞って各々について調べてみましょう。

 

 

 

 

 

 

 

 

 

 

 

「継続渡しスタイル」

 継続 (次に行う処理) を関数 (クロージャ) で表して、それを引数に渡して実行することにします。これを「継続渡しスタイル (CPS) 」といいます。

お気楽 Scheme プログラミング入門

 

 

 

ふむふむ。

文字だけ見ると概念的には簡単そうですね。

 

 

 

例えば、関数がAとBとCの3つがあるとして、

Aで実行して得た値を、

BとCのどれに渡すかを自由に決めれる、という感じでしょうか?

 

 

 

 

 

 

 

プラモデルを作る過程に似てますね。

 

 

 

 

 

 

f:id:ygt1qa3:20190221212016j:plain

 

 

 

 

足のパーツを作り終えたとします。

 

この次の作業として、

 

尻尾を作ってもいいし、ハサミをつくってもいいし、

胴体が完成していれば胴体に足をつけてもいい。

 

 

 

この次の作業というのが「継続」ということですね。

 

 

 

同じ記事内に

一般のプログラミング言語では、Scheme のように継続を取り出して保存することはできません。

とあったので、ほぼScheme特有の機能ということでしょうか?

割と古めかしい感じなんですかね?

 

「継続」自体は色々な言語に取り入れられているみたいですね。

新しめだとRubyとか。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

「限定継続」

限定継続とは、「この後の計算」の範囲に区切りをつけた (delimit) 継続です。限定継続は呼び出されると、区切りのところまで処理を進めて、呼び出し元に戻ります。

限定継続 (delimited continuation) の動作を理解する - 映画は中劇

 

新しめの継続の理論で、

より細かい単位で処理を行えるという認識です。

 

ちょっと難しいですね。

 

 

 

resetが区切りの印

 

shiftが区切りまで切り取り

 

 

って感じですかね?

それらを使って限定継続(部分継続)を取り出すと。

 

ふーむ。

 

まだピンときてはいませんが、雰囲気はわかりました。

 

また別の機会に調べてみるとします。

 

ブログに残せるっていいですね~。

 

HRTの原則

さて

 

最初の記事では自分のことを書き始めたいところですが。

 

今日職場でふと先輩から言われたことを記事にしようかと帰りの電車で思いついたため、今回はそちらにする。

 

タイトルにもある通り

 

 

 

 

 

「HKT」

 

 

 

 

 

f:id:ygt1qa3:20190220193428p:plain

 

 

 

 

 

 

ではなく、

 

 

 

 

 

「HRT」

 

 

 

 

についての話ですね。

 

 

先輩とデバッグ作業をしている中で、設計の欠陥から色々なバグが見つかったのですが

その時に

 

「このシステムにはこれだけの設計に穴があったんだ!見つけることができて良い日だ!」ということがありまして、そのときに「HRT」という言葉が出てきました。

 

 

先輩「ちなみにこのHRTは何の略か知ってる?」

 

自分「ホームルームタイム!」

 

=====○)д`);.・;゛;ブッ 

 

 

 

 

 

 

 

 

 

 

下の書籍で紹介された言葉らしいですね

 

Team Geek ―Googleのギークたちはいかにしてチームを作るのか

Team Geek ―Googleのギークたちはいかにしてチームを作るのか

 

 

Amazonではkindle版は扱っていないみたいですが、

オライリー様の方では電子書籍版を購入できるみたいですね。

www.oreilly.co.jp

 

 

 

対人関係についての原則で、

 

H・・・謙虚

R・・・尊敬

T・・・信頼

 

の頭文字をとったものなんですね。

 

 

 

 

恐らく仕事以外でも使える話だなと思ったり。

 

例えば、恋愛・結婚

 

交際を開始した・籍を入れた後の話ですが、

自分を磨くだけでなく、相手も磨かなくてはいけない。

そのためにはコミュニケーションをとり、お互いを刺激しあわなければいけない。

 

となると、職場と同じ状況が生まれるわけですね。

 

 

 

 

 

うーむ。

 

日常に当てはめると、さも当然のことなんですけどね。。。

 

先輩も仰られていましたが、人間うまくいかないと

気性が荒くなってしまいますから、ふと忘れてしまうもんです。

 

ブログに書けてよかった!