teruroom's diary

ほぼ 8歳602ヶ月‏ の てるるーむ のプログラミングダイアリー

シンタックスハイライトの試験

コトリンのソースのシンタックスハイライトのCSSを少しいじってみました。

fun 中括弧付き( 引数1: String, 引数2: Int ):String {
 return( 引数1 + 引数2 )
}

fun イコール付き戻り値あり( 引数1: String, 引数2: Int ): String = 引数1 + 引数2

fun イコール付き戻り値なし( 引数1: String, 引数2: Int ): Unit = println( 引数1 + 引数2 )

fun 戻り型省略戻り値あり( 引数1: String, 引数2: Int ) = 引数1 + 引数2

fun 戻り型省略戻り値なし( 引数1: String, 引数2: Int ) = println( 引数1 + 引数2 )

fun main(args: Array<String>) {
  println( 中括弧付き( "ほげ", 55 ) )
  println( イコール付き戻り値あり( "ばあば", 66 ) )
  イコール付き戻り値なし( "じいじ", 77 )
  println( 戻り型省略戻り値あり( "はげ", 88 ) )
}

はじめてのkotlin関数

コトリン関数ことはじめ

 kotlin(コトリン)の関数について説明します。コトリンの関数はクラス内のメソッドではありません。クラスと同列の独立したコトリンの構成要素です。コトリンの関数はクラス内にしか記述できないということはありません。
 これはちょうどスクリプト型のプログラミング言語JavaScriptの関数定義と同じです。コトリンと同じJVM言語であるスカラ(Scala)では関数はクラス(class)やトレイト(trait)やオブジェクト(object)内にしか定義できません。しかし、コトリンの関数はクラス内にも定義できますし、クラスの外でクラスと同列に定義することができるのです。

基本的なコトリンの関数の定義

 コトリンの基本的な関数は「fun」キーワードに続いて関数名を記述して定義します。引数は関数名に続いて括弧「()」内にパスカル記法で記述します。すなわち「引数名: 型名」のように記述します。複数の引数がある場合には、カンマ「,」で区切って記述します。
 また、戻り値の型は括弧「()」に続いてコロン「:」を記述し、その後に型名を記述します。
 さらに関数の処理は中括弧「{}」内に記述します。
 コトリン関数のもっとも簡単な具体例は以下の関数「ごあいさつ()」のようになります。

関数「ごあいさつ()」のコード例
fun ごあいさつ( お名前: String, メッセージ: String ): String {
  return お名前 + "さん!" + メッセージ
}

fun main( args: Array<String> ) {
  println( ごあいさつ( "高畑美月", "こんにちわ~!" ) )
}
関数「ごあいさつ()」の実行結果
高畑美月さん!こんにちわ~!

戻り値をダイレクト指定する関数の定義

 コトリンの関数は戻り値をイコール記号「=」の後に直接記述することもできます。
 関数「掛け算()」のコード例を見てください。中括弧「{}」内に処理を記述するかわりに「=」を記述し、その後に関数の戻り値の計算式「x * y」を記述しています。

変数の文字列への埋め込み

 なお、「main()」関数内の「println()」関数内の「${}」は中括弧「{}」内の変数を文字列内に埋め込むための記述方法です。ここでは関数「掛け算()」を文字列内に埋め込んでいます。関数「掛け算()」の戻り値が文字列内に埋め込まれてコンソールに表示されます。
 ここで中括弧「{}」は変数が式や関数の場合に記述します。変数のみの場合には中括弧「{}」を省略して「$x」や「$y」のように記述します。

関数「掛け算()」のコード例
fun 掛け算( x: Int, y: Int ) = x * y

fun main( args: Array<String> ) {
  println( "77 に 11 を掛けると ${掛け算( 77, 11 )} になります。" )
}
関数「掛け算()」の実行結果
77 に 11 を掛けると 847 になります。

戻り値のない関数の定義

 戻り値がない関数はコトリンでは型名に「Unit」キーワードを記述します。なお、戻り値がない関数はこの「Unit」キーワードを省略することもできます。
 関数「掛け算結果表示その1()」は型名に「Unit」キーワードを記述した例です。関数「掛け算結果表示その2()」は戻り値の型を省略した例です。

関数「掛け算結果表示1()」および「掛け算結果表示2()」のコード例
fun 掛け算結果表示その1( x: Int, y: Int ): Unit {
  println( "$x$y を掛けると ${ x * y } になります。" )
}

fun 掛け算結果表示その2( x: Int, y: Int ) {
  println( "$x$y を掛けると ${ x * y } になります。" )
}

fun main( args: Array<String> ) {
  掛け算結果表示その1( 99, 222 )
  掛け算結果表示その2( 111, 777 )
}
関数「掛け算()」の実行結果
99 に 222 を掛けると 21978 になります。
111 に 777 を掛けると 86247 になります。

クラス内の関数定義

 コトリンの関数はクラス内で定義することができます。クラス内でも独立した関数と同じように定義します。
 クラス内に関数を定義した場合にはクラスのインスタンスを生成してから、インスタンスを介して関数を呼び出します。具体的にはクラスのインスタンスの続いてドット「.」記号を記述し、その後に関数名と引数値を与えます。

クラスのインスタンス

 クラスのインスタンスを生成するにはクラス名につづいて括弧「()」内にコンストラクタ引数値を与えます。Javaのように「new」演算子は不要です。具体的には「クラス名( コンストラクタ引数値, ・・・)」のように記述します。これはちょうど同じJVM言語のスカラにおけるケースクラスのようなインスタンス化の記述方法になります。
 生成したインスタンスが不変変数キーワード「val」で定義されたインスタンス変数に代入するか、あるいは、「クラス名( コンストラクタ引数値, ・・・)」の記述のままでインスタンスを表します。
 クラスのインスタンスを複数回使う場合には、インスタンス変数にいったん代入し、インスタンスを一回しか使わないない場合には、インスタンス変数に代入せずにそのまま利用するとよいでしょう。
 下記のコード例では、クラス「計算クラス()」のインスタンスをいったん不変変数「掛け算」に代入し、「掛け算. 掛け算結果を表示する( 1234, 55 )」のように関数「掛け算結果を表示する()」を呼び出しています。また、インスタンスを不変変数に代入せずに「計算クラス().掛け算結果を表示する( 3333, 4444 )」のようにダイレクトに関数「掛け算結果を表示する()」を呼び出しています。

関数「掛け算結果を表示する()」のコード例
class 計算クラス() {
    fun 掛け算結果を表示する( x: Int, y: Int ): Unit {
      println( "$x$y を掛けると ${ x * y } になります。" )
    }    
}

fun main( args: Array<String> ) {
  掛け算結果表示その1( 99, 222 )
  掛け算結果表示その2( 111, 777 )
  
  val 掛け算 = 計算クラス()
  掛け算. 掛け算結果を表示する( 1234, 55 )
  計算クラス().掛け算結果を表示する( 3333, 4444 )
}
関数「掛け算結果を表示する()」の実行結果
1234 に 55 を掛けると 67870 になります。
3333 に 4444 を掛けると 14811852 になります。

この記事のコード例

 ここで紹介したコード例を以下の https://ideone.com/z4ZhYe で公開しています。ここで実行結果も「stdout」に表示されていますので参考になると思います。
 下記「ideone」の一番右の「fork」アイコンをクリックするとあなたご自身のコードとして編集の上、[Run]ボタンの押下でコンパイルし、実行することができます。

Kotlinをインストールする(Windows10編)

最初に

 GoogleAndroid OSの標準開発言語に選んだJVM(Java仮想マシン)言語であるKotlinのインストール方法に関するメモ書きです。Javaの経験者がKotlinに取り組むことがおおく、インストールは自明のものとして扱われます。特にKotlinはインストール方法を詳しく書いてくれる人がいないような気がします。
 そこで、私が記事にしてみました。あくまでも個人的な忘備録です。
 この記事は執筆時の最新安定バージョンである1.1.4-3の場合のものです。バージョン番号1.1.4-3は適当に読み替えてください。
 もっと利用者数が多いであろうWindows OSの場合の記事にしました。LinuxMacOSXの場合はコマンドのみでもう少し、スマートになると思います。WindowsでもWindows PowerShellがWinkdows7から標準装備されてLinuxに負けないShellが提供されました。ですので、今後はLinuxのように開発環境の構築もクソがつくくらい冗長なWindowsGUIを使わず、コマンドベースが主流になっていくものと思われます。ここでは環境変数の設定もコマンドベースのスマートな方法も紹介してみました。

Kotlinのダウンロード

 GitHubのKotlin公開ページから最新のKotlinコンパイラーのインストーラーを入手します。
github.com
 このページの下のほうに「Downloads」があります。ここから「kotlin-compiler-1.1.4-3.zip」をクリックし、ダウンロードします。ダウンロードしたZIPフォルダーを解凍したら「kotlinc」フォルダーがあります。これを例えば「C:\Dev\」フォルダに配置(コピー)します。以下、「C:\Dev\kotlinc」にKotlinコンパイラーを配置したものとして説明します。

環境変数にパスを通す

 次に配置したKotlinコンパイラーへのパスを通します。以下の手順です。

設定ダイアログや設定パネルなどのGUIを使う場合

 とても冗長なのでわたしはこの方法がきらいです。しかし、一般的には書籍などでもこちらの方法を紹介している場合がほとんどでなげかわしい限りです。もっとLinuxライクにWindows PowerShellを活用してほしいものです。

  • スタートボタン → 「sysdm.cpl」と入力 または Windows PowerShellで「control sysdm.cpl」と入力します。
  • 「詳細設定」タブ → [環境変数]ボタン クリック
    • ユーザー環境変数の場合
      • ログインする人があなただけなら、こちらをお勧めします。
      • 「○○○ のユーザー環境変数」ブロック(上の方)で設定します
    • システム環境変数の場合
      • ログインする全ユーザーに適用されます
      • 「システム環境変数」ブロック(下の方)で設定します
      • [新規]ボタン → 「新しいユーザー変数」ダイアログ
        • 変数名 → KOTLIN_HOME と入力
        • 変数値 → C:\Dev\kotlinc と入力
      • [OK]ボタン クリック
      • まだPathがない場合(ユーザー環境変数の場合はこちらが多いかもしれません)
        • [新規]ボタン → 「新しいユーザー変数」ダイアログ
          • 変数名 → Path と入力
          • 変数値 → %KOTLIN_HOME%\bin と入力
        • [OK]ボタン クリック
      • すでにPathがある場合(システム環境変数の場合はこちらです)
        • 「Path」クリック
        • [編集]ボタン → 「環境変数名の編集」ダイアログ
          • [新規]ボタン
            • %KOTLIN_HOME%\bin と入力
        • [OK]ボタン クリック
    • [OK]ボタン クリック
  • [OK]ボタン クリック

コマンドで設定する場合

 こちらをつよくお勧めします。WindowsGUIは冗長すぎるので、LinuxでShellが標準で使われているようにWindows PowerShellをもっとつかいましょう。

  • ユーザー環境変数の場合(ログインする人があなただけなら、こちらをつよくお勧めします)
> setx KOTLIN_HOME "C:\Dev\kotlinc"
> setx PATH "%PATH%;%KOTLIN_HOME%\bin"
  • システム環境変数の場合(ログインする全ユーザーに適用されます。)
> setx KOTLIN_HOME /M "C:\Dev\kotlinc"
> setx PATH /M "%PATH%;%KOTLIN_HOME%\bin"

動作確認の方法

 閉じないと上記コマンドの環境変数の設定が有効になりません。

> kotlinc -version
  • 実行結果

 以下のようにコンソールに表示されればインストールは成功しています。

info: kotlinc-jvm 1.1.4-3 (JRE 1.8.0_31-b13)

対話環境REPLでこんにちわ

 本当に動いているかをもうすこし確認するために対話環境REPLを使って「こんにちわ。世界!」とコンソールに表示してみましょう。

  • REPL環境に入ります。
> kotlinc
  • 以下のように入力します。
>>> val あいさつ = "こんにちわ!世界"
>>> println( あいさつ )
  • 以下のようにコンソールに表示されます。
こんにちわ!世界
  • REPLを抜けましょう。
>>> :quit

最後に~日本語プログラミングについて~

 Java界隈では日本語(2バイトUnicode)を変数名に使うことに抵抗のある方が多いと思います。しかし、ことWindows OSでKotlinを試してみる場合には遊び感覚で日本語をつかうのもありかもしれません。すくなくともわたしは日本語をつかうことに躊躇はありません。
 コメントを日本語でまめにいれるくらいなら、コメントのかわりにクラス名、オブジェクト名、関数名、メソッド名、変数名などを日本語にして日本人であるわたしやまわりの日本人への可読性を高める。そんな意図があります。
 わたしはコメントがきらいです。コメントは美しいプログラムのソースコードの邪魔になるとさえおもっています。美しいプログラムの実装はコメントがなくても容易に意図を読み取れる。そう思っています。コメントレス日本語プログラミング。それがわたしのモットーです。

クロージャ~関数内のスコープにある引数以外の変数を参照できる関数~

 関数内の変数の参照は通常、引数を介して行います。ところが引数を介さずにある関数のスコープ内の変数を参照できる関数を定義することができます。これを クロージャ といいます。
 引数を介さずに関数内の変数を参照するためには通常はアクセッサメソッドであるgetter()を使います。しかし、クロージャはアクセッサメソッドを介さずに関数内のある変数を参照することができるのです。

 それでは、クロージャーの具体例をサンプルでみてみましょう。

  • 関数ストップウォッチ()の定義

 以下のコード例では、引数のない関数ストップウォッチ()を定義しています。この関数内のスコープに可変変数カウンターを宣言し、初期値として 0 を格納しています。このカウンターは外部から参照することはできません。
 しかし、この関数は引数のない無名関数を返す処理を行っています。この無名関数がクロージャです。

 具体的にはこのクロージャには名前がなくて引数もないので「()」のように記述しています。そうして、このクロージャの処理を「」記号の右辺に記述しています。処理は可変変数 カウンター の値を1インクリメントすることです。
 さらに、このクロージャの戻り値は可変変数 カウンタ になります。Scalaでは関数の最後の式や値が評価されてそのまま戻り値になります。したがって、このクロージャの戻り値は可変変数 カウンタ になります。
 これで、関数ストップウォッチ()内の可変変数 カウンタ が参照できました。

  • 関数を利用して可変変数 カウンタ の参照

 まず、関数 ストップウォッチ() を不変変数計測に代入します。不変変数計測クロージャー()を呼び出すたびに可変変数 カウンター がインクリメントされて1づつ値が増えていきます。実行結果は以下のようになります。

object Main extends App {
  def ストップウォッチ() = {
    var カウンタ = 0
    () ⇒ カウンタ += 1 ; カウンタ
  }

  val 計測 = ストップウォッチ()
  print( 計測() + "秒 : " )
  print( 計測() + "秒 : " )
  print( 計測() + "秒 : " )
  print( 計測() + "秒 : " )
  print( 計測() + "秒 : " )
}
  • 実行方法
> scala ストップウォッチ.scala
  • 実行結果
> 1秒 : 2秒 : 3秒 : 4秒 : 5秒 :

 以下のWebサービスで動作を確認してみてください。

https://paiza.io/projects/X-nwb6dyTrfhjfLfecK-EQ

クロージャ~関数内のスコープにある引数以外の変数を参照できる関数~ - Qiita

qiita.com

Softbank光に変えたら特定のサイトにしかつながらなくなった

SoftBank光に変えたらGoogle系とYahoo系しかつながりません。Youtubeは見れるけど、Hulu、Ameba、Hatena等全滅です。

 

pingを飛ばしてもGoogle系とYahoo系だけIPアドレスが返って来ます。

 

これはDNSが不完全にしか機能していないのではと思いました。そこで、以下のコマンドを投入して解決しました。

>ipconfig /all

>ipconfig /renew