覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

Kotlin - 変数の基礎

「Kotlinイン・アクション」 を読みながら写経してます。(Javaと比較しながら)

Kotlinイン・アクション

Kotlinイン・アクション

  • 作者: Dmitry Jemerov,Svetlana Isakova,長澤太郎,藤原聖,山本純平,yy_yank
  • 出版社/メーカー: マイナビ出版
  • 発売日: 2017/10/31
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (2件) を見る


Kotlinにおける変数

Kotlin では多くの変数宣言で型を省略して記述します。

val value = 100

必要に応じて以下のように明示的に型を指定する事も可能です。

val value: Int = 100 


式本体の関数と同じように、型を指定しなければコンパイラは変数の初期化式を解析して、その型を変数の型に使用します。
この例では初期化式の 100 が Int型なので、変数もInt型になります。

例えば、以下のように浮動小数点をもった定数を初期化式に使用した場合は、変数は Double型になります

val valueDouble = 7.5e6


変数が初期化式を持たない場合は、その型を明示的に指定する必要があります。
変数にどのような値が割り当てられるかの情報がなければ、コンパイラが型を推論することができないからでです。

val unknown: Int
unknown = 35


ミュータブル変数・イミュータブル変数

変数を宣言するためのキーワードには次の2つがあります

  • val
    • value に由来
    • イミュータブル(不変)な参照です。valで宣言された変数は一度初期化されると、そのあとで値を再度割り当てることはできません。
    • Javaにおけるfinal変数に対応しています
    • Javaの言語仕様に val は存在しませんが、似たようなものを Lombok が提供しています
  • var
    • variable に由来
    • ミュータブル(変更可能)な参照です。こん変数の値は変更することができます。
    • Javaの(finalではない)通常の変数の宣言に対応しています。
    • ちなみに、JavaでもJava 10 からは var による型を省略して変数宣言が可能です。


基本的には、Kotlin では全ての変数は val キーワードで宣言するように努めるべきとされています。
必要な時だけ、varに変更します。
イミュータブルな参照、イミュータブルオブジェクト、副作用のない関数を使うことで、コードは関数型プログラミングスタイル に近づきます。

val 変数は、その変数が定義されたブロックの実行時に必ず一度だけ初期化されなければなりません。
しかし、初期化処理が1つだけしか実行されないことが保証されているのならば、状況に応じて異なる値を割り当てることができます。(以下の message 変数のような例)

val message: String

// success(: Boolean) の値が別途 決まるものとする
if (success) {
    message = "Response is success"
} else {
    message = "Response is failed"
}


val で宣言された変数の参照自体はイミュータブルで変更不可能ですが、それが指すオブジェクトはミュータブルになり得ます。以下のようなListの値がそれに該当します

val list = arrayListOf("Taro", "Jiro")    //  イミュータブルな参照として
list.add("Saburo")  //  参照が指す先のオブジェクトへの変更(追加)は可能

println(list) // -> [Taro, Jiro, Saburo]


var キーワードはによって値の変更は可能ですが、その型は固定されています。
次のようなコードはコンパイルエラーになります。

var numeric = 123
numeric = "Hello"    // 型がミスマッチでコンパイルできない

この例では、文字列を代入しようとしたところでエラーになります。文字列の型(String 型)が、期待していた型(Int 型)と異なるからです。
コンパイラは初期化時のみ型を推論し、それ以降で割り当てられる値は、型の決定には考慮されません。



関連エントリ

Kotlin - 関数の基礎

「Kotlinイン・アクション」 を読みながら写経してます。(Javaと比較しながら)

Kotlinイン・アクション

Kotlinイン・アクション

  • 作者: Dmitry Jemerov,Svetlana Isakova,長澤太郎,藤原聖,山本純平,yy_yank
  • 出版社/メーカー: マイナビ出版
  • 発売日: 2017/10/31
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (2件) を見る


Kotlinにおける関数宣言

Kotlin で関数を宣言するには以下の構文で基本的に記述します。

fun <関数名>(<仮引数名>: <引数の型>): <戻り値の型> {
    <関数本体>
}

具体的な関数で記述すると以下のようになります。

fun max(a: Int, b: Int): Int {
    return if (a > b) a else b
}

引数や戻り値が無い場合は以下のようになります

fun hello() {
    println("Hello World!")
}


関数の宣言を見た場合に、Javaと比較して以下のような違いを見ることができます

  • 関数の宣言には fun というキーワードを付ける
  • 引数の型は、その引数名の後ろに宣言する(これは変数の宣言などでも同様)
  • 戻り値の型は、仮引数のリストの後ろにコロンで区切られて記述する
  • 関数はファイルのトップレベルに宣言することができる。クラスの中に置く必要はない
  • 行末のセミコロンは不要


関数をファイルのトップレベルに置くことができるので以下のような書き方をして実行することが可能です

package net.yyuki.sandbox

fun max(a: Int, b: Int): Int {
    return if (a > b) a else b
}

fun hello() {
    println("Hello World!")
}

fun main() {
    println(max(1, 2))

    hello()
}

実行結果

2
Hello World!


if は式

Kotlin では if は結果となる値を返す式となっていることが Java とは異なります。
上述のmax関数のif 式の内容は、Java では 三項演算子 で (a > b) ? a : b と書くことになります。

Kotlin では if は式であり、文ではありません。

  • 式は、別の式の一部として使用できる値を持つものです
  • 文は、常にブロックに囲まれたトップレベルの要素でそれ自身の値を持ちません

Kotlin では繰り返し文を除くほとんどの制御構造は式で成り立っています。

一方 Java では値の割り当ては式であるのに対して、Kotlin では文になります。
これにより、比較と割り当てのミスでの混乱というのを避けることができます。
例えば、Javaでは ifの条件で == と書きたい場所で誤って以下のように = と書いてしまうことが可能ですが、これはKotlinではコンパイルエラーとなります。

// 本当は flg == true と書きたかった
if (flg = true)


関数の簡略化

上述のmax関数は、関数の本体が1つの式で構成されており、このような場合は波括弧とreturn 文を省略して、その式を関数の本体として使用できます。(以下のように記述できます)

fun max(a: Int, b: Int): Int = if (a > b) a else b


さらに、戻り値の型を省略して以下のようにシンプルに記述することも可能です

fun max(a: Int, b: Int) = if (a > b) a else b

全ての変数と式には型があり、全ての関数には戻り値の型があります。
しかし、明示的に型を指定していなくても、式本体の関数についてはコンパイラが関数の本体として使われる式を解析して、その型を関数の戻り値の型として使用します。 このような型の解析は一般的に 型推論(type interface) と呼ばれます。

ただし、戻り値の型を省略できるのは式本体の関数に対してのみ許可されています。
値を返すブロック本体を持つ関数の場合、戻り値の型を指定してretrurn文を明示的に記述する必要があります。
関数は今回のような単純なものだけではなく、長い記述になるものもあり複数のreturn 文を含む場合もあります。
そのような場合に戻り値の型と明示的なreturn文が書かれる事で、その関数が何を返すのかをすぐに把握できます

「基礎からわかるTCP-IP-ネットワークコンピューティング入門-第3版」

「基礎からわかるTCP-IP-ネットワークコンピューティング入門-第3版」 を読んでみました。

基礎からわかるTCP/IP ネットワークコンピューティング入門 第3版

基礎からわかるTCP/IP ネットワークコンピューティング入門 第3版

内容紹介では以下のように書かれています。

TCP/IPネットワークの実際が基礎から理解できる! 
TCP/IPを真に理解するため、ネットワーク技術の解説はもちろん、コンピュータ内部の構造、
データやパケットをやり取りする仕組みを解説した一冊。豊富な解説図により、パケットやメッセージの動作がよくわかります。


目次以下のようになっています。

  • 第1章 TCP/IP入門
  • 第2章 TCP/IPの理解を助けるアプリとコマンド
  • 第3章 ネットワーク技術を支えるコンピュータの基礎
  • 第4章 ネットワークの基礎知識とTCP/IP
  • 第5章 IPはインターネットプロトコル
  • 第6章 TCPとUDP
  • 第7章 TCP/IPアプリケーション
  • 第8章 IPを助けるプロトコルと技術


元々、Twitterでフォローしている方が、この本をかなり推していたので試しに読んでみたのですが、
これは本当にいい本でした。

元々、初版は15年以上前に発売されていて私が読んだのは第3版となります。
版を重ねるごとの変遷を私は抑えていないのですが、全く古さを感じさせない内容でした。
むしろ新しいサービスの名前などをキーワードとして盛り込んでおり、読者の理解を助けているように思いました。

ネットワークの基礎だけではなく、そのベースとなるコンピュータの基礎も抑えられていて、読み進める度にどんどんと知識が整理されていく感覚を覚えました。

また、基礎といいつつも、ただ浅い部分に言及しているだけではなく、けっこう深い部分にも話は及んでいます。

ネットワーク関係の本は、もともとネットワークに興味がある人にとっては読み進めるのに苦労は無いかもしれませんが、
そうでない人は、途中で飽きが来てなかなか読み進める速度が上がらなかったりしがちです。

が、この本は、ネットワークの仕組みや動きの図解や例えがとてもわかりやすく、読み進めるのが楽しかったです。
図の部分だけでも何度も見返すだけでも、理解を深めたり知識の整理ができます。

現在の世の中を支えるインターネット、WEBというものへの理解を深めるためにも、 ITエンジニア全員が読むべき名著だと思います。

「イラスト図解式 この一冊で全部わかるセキュリティの基本」

「イラスト図解式 この一冊で全部わかるセキュリティの基本」 を読んでみました。

イラスト図解式 この一冊で全部わかるセキュリティの基本

イラスト図解式 この一冊で全部わかるセキュリティの基本

内容紹介では以下のように書かれています。

最新のセキュリティの基本をこの1冊で! 


大好評の「イラスト図解式」シリーズ 第5弾! 
今回のテーマは「情報セキュリティ」です。

ネットワークが高度に発達した現在では、サービスの提供者はもとより、利用者側も「セキュリティの基礎知識」は必修です。
基本的なことを知っておくだけでも、情報漏えいや不正アクセスといったリスクを大幅に軽減できます。
本書ではセキュリティの基礎知識を「防御」「観測」「攻撃」の3つに大別して説明していきます。
なぜセキュリティが必要なのか。どのようにしてセキュリティは確保されているのか。その仕組みを重要用語とともに図解で解説します。

また、セキュリティ関連の法律についても触れています。
セキュリティ技術の多くは関連法律と密接に関係しているため、基本的な全体像を把握しておくことはとても大切です。
ぜひ本書で情報セキュリティの全容をぜひ理解してください


章立ては以下のようになっています。

  • Chapter1 セキュリティの基本
  • Chapter2 セキュリティの確保に必要な基礎知識
  • Chapter3 攻撃を検知・解析するための仕組み
  • Chapter4 セキュリティを脅かす存在と攻撃の手口
  • Chapter5 セキュリティを確保する技術
  • Chapter6 ネットワークセキュリティ
  • Chapter7 セキュリティ関連の法律・規約取り組み


約190ページの本で、その半分はイメージ図となっています。

本のタイトル、内容紹介、ページ数やそのおおよその構成からも分かる通り、
セキュリティをものすごく深掘りしたものではなく、
セキュリティに関する用語や各種攻撃方法、セキュリティ対策方法など概要を抑えるのにとても良い内容となっています。

基本的な内容から実運用に関連するような内容まで扱われていて、
図もわかりやすく、とにかくセキュリティに関する各種イメージを掴むのにとても良いです。

セキュリティという世界に深く入り込む前に全体像を一旦抑えるために読むというのが良いと思います。

言ってしまうと、この本の守備範囲は広く浅くということにはなってしまうので、
この本を読んだからといって具体的なセキュリティに関する監視や防御のシステム構成を設計したり構築するのは厳しいです。
しかし、その前提となるセキュリティとはそもそも何を考えなければいけないか、一般的にどういう攻撃があってどの対策すべきかといったところの知識を身に付けることが可能です。

セキュリティに関する深い知識を持つ方は全く読む必要はありませんが、そうでない方にとっては十分に読むに値する本だと思います。

セキュリティの知識を身につける最初の一歩として良いと思います。

内容が体系立っているので、手元にあると意外な場面で役に立ったりするかもしれません。

「FACTFULNESS(ファクトフルネス) 10の思い込みを乗り越え、データを基に世界を正しく見る習慣」

「FACTFULNESS(ファクトフルネス) 10の思い込みを乗り越え、データを基に世界を正しく見る習慣」 を読んでみました。

話題になってる本なんですかね?素直に面白かったです。


この本、最初に以下のクイズが出題されます。

  • 質問1:現在、低所得国に暮らす女子の何割が、初等教育を修了するでしょう?
    • A 20%
    • B 40%
    • C 60%
  • 質問2:世界で最も多くの人が住んでいるのはどこでしょう?
    • A 低所得国
    • B 中所得国
    • C 高所得国
  • 質問3:世界の人口のうち、極度の貧困にある人の割合は、過去20年でどう変わったでしょう?
    • A 約2倍になった
    • B あまり変わっていない
    • C 半分になった
  • 質問4:世界の平均寿命は現在およそ何歳でしょう?
    • A 50歳
    • B 60歳
    • C 70歳
  • 質問5:15歳未満の子供は、現在世界に20億人います。国連の予測によると2100年に子供の数は約何人になるでしょう?
    • A 40億人
    • B 30億人
    • C 20億人
  • 質問6:国連の予測によると、2100年には今より人口が40億人増えるとされています。人口が増える最も大きな理由は何でしょう?
    • A 子供(15歳未満)が増えるから
    • B 大人(15歳から74歳)が増えるから
    • C 後期高齢者(75歳以上)が増えるから
  • 質問7:自然災害で毎年亡くなる人の数は、過去100年でどう変化したでしょう?
    • A 2倍以上になった
    • B あまり変わっていない
    • C 半分以下になった
  • 質問8:(図を伴うため省略します)
  • 質問9:世界中の1歳児の中で、何らかの病気に対して予防接種を受けている子供はどのくらいいるでしょう?
    • A 20%
    • B 50%
    • C 80%
  • 質問10:世界中の30歳男性は、平均10年感の学校教育を受けています。同じ年の女性は何年間学校教育を受けているでしょう?
    • A 9年
    • B 6年
    • C 3年
  • 質問11:1996年には、トラとジャイアントパンダとクロサイはいずれも絶滅危惧種として指定されていました。この3つのうち当時よりも絶滅の危機に瀕している動物はいくつでしょう?
    • A 2つ
    • B 1つ
    • C ゼロ
  • 質問12:いくらかでも電気を使える人は、世界にどのくらいるでしょう?
    • A 20%
    • B 50%
    • C 80%
  • 質問13:グローバルな気候の専門家は、こらからの100年で地球の平均気温はどうなると考えているでしょう?
    • A 暖かくなる
    • B 変わらない
    • C 寒くなる


ここでは、解答は書きませんが、これら質問は世界を取り巻く状況の変化にまつわる質問であって、
複雑な問題やひっかけ問題はひとつもありません。

2017年にオンラインで1万2千人に行った調査では、質問13以外の正解数は、平均で12問中2問という結果だったとのことです。

これは、チンパンジーに解かせる(ランダムに答えるので大よそ正解率33%で4問正解する)よりも低いということになります。

また、チンパンジーは3つの選択肢から不正解の選択肢2つを同じ確率で選ぶが、人間はよりドラマチックな選択肢を選んでしまう傾向にあるとのことです。

(私自身もやってみましたが、2問よりはまだ正解数多かったですが、それでも間違った解答をした問題多かったです。)


上記クイズの答えと詳細な説明も交えながら、人間がなぜ誤ったものの見方をしてしまうのかについて人間の本能を以下の10種類に分けて、それを抑止するための方法や事実(データ)にもとづいて物事を見るファクトフルネスを解説してくれています。

  • 分断本能
  • ネガティブ本能
  • 直線本能
  • 恐怖本能
  • 過大視本能
  • パターン化本能
  • 宿題本能
  • 単純化本能
  • 犯人探し本能
  • 焦り本能


書籍中に何度か似たような表現で記述されていましたが、以下の記述内容はとても重要なものであると自分自身は受け止めました。

「世界は変わり続けている、死ぬまでずっと知識と世界の見方をアップデートし続けなければならない


色んな人に読んでほしい本です。