カテゴリー
kotlin プログラム言語

kotlin スコープ関数

Kotlinには、スコープ関数と呼ばれる、特定のスコープ内でのみ有効な関数がいくつかあります。主なものには、以下があります。

  1. let: オブジェクトに対して、特定のスコープ内でのみ有効なローカル変数を定義します。
  2. also: オブジェクトに対して、特定のスコープ内でのみ有効なローカル変数を定義し、オブジェクト自体を返します。
  3. run: オブジェクトに対して、特定のスコープ内でのみ有効なローカル変数を定義し、最後に実行された式の結果を返します。
  4. with: オブジェクトに対して、特定のスコープ内でのみ有効なローカル変数を定義し、オブジェクト自体を返します。
  5. apply: オブジェクトに対して、特定のスコープ内でのみ有効なローカル変数を定義し、オブジェクト自体を返します。
  6. repeat: 特定のスコープ内で、指定回数繰り返し処理を実行します。

■let関数の使い方

使用方法は次のようになります。

val myString = "Hello, World!"

val result = myString.let { 
    // it は myString を指す
    val newString = it.toUpperCase()
    newString.length
}

println(result)  // 13

上記のコードでは、myStringに対してlet関数を呼び出し、その中で、itというローカル変数を定義し、itにはmyStringが代入されます。 そして、itを大文字に変換し、文字数を取得し、resultに代入しています。 let関数は最後に実行された式の結果を返すので、resultには13が格納されます。

let関数は、nullableな値に対しても使用することができます。その場合、nullableな値がnullでない場合のみ、スコープ内の処理が実行されます。

val myString: String? = "Hello, World!"

val result = myString?.let { 
    // it は myString を指す
    val newString = it.toUpperCase()
    newString.length
}

println(result)  // 13

上記のように、?.演算子を使用し、nullableな値に対してlet関数を呼び出すことができます。 この場合、myStringがnullの場合は、スコープ内の処理は実行されず、resultにはnullが格納されます。

■also関数の使い方

使用方法は次のようになります。

val obj = SomeObject()
val result = obj.also {
    // 処理
}

also 関数は、引数に渡した lambda 式内でオブジェクトに対して処理を行うことができます。その後、処理を行ったオブジェクト自身が返り値となります。

例えば、以下のようにしてオブジェクトのプロパティを更新することができます。

val obj = SomeObject()
val updated = obj.also {
    it.property = "new value"
}

この例では、objproperty プロパティが “new value” に更新され、updated には obj 自身が格納されています。

■run関数の使い方

run 関数は、オブジェクトに対して処理を行い、最後に処理の結果を返す関数です。使い方は、以下のように記述します。

val obj = SomeObject()
val result = obj.run {
    // 処理
    // 結果
}

run 関数は、引数に渡した lambda 式内でオブジェクトに対して処理を行うことができ、最後に処理の結果を返すことができます。

例えば、以下のようにしてオブジェクトのプロパティを取得し、その結果を返すことができます。

val obj = SomeObject()
val propertyValue = obj.run {
    this.property
}

この例では、objproperty プロパティの値が propertyValue に格納されます。

また、run 関数は、オブジェクトに対して複数の処理を行って結果を返す場合に便利です。例えば、以下のようにしてオブジェクトの複数のプロパティを取得し、その結果を返すことができます。

val obj = SomeObject()
val (property1, property2) = obj.run {
    Pair(property1, property2)
}

この例では、objproperty1 プロパティと property2 プロパティの値がそれぞれ property1property2 に格納されます。

also 関数と run 関数は、オブジェクトに対して処理を行うための関数ですが、返り値の違いがあります。

  • also 関数は、処理を行ったオブジェクト自身を返します。
  • run 関数は、処理の結果を返します。

■with関数の使い方

with 関数は、特定のオブジェクトに対して複数の処理を行うための関数です。使い方は、以下のように記述します。

val obj = SomeObject()
with(obj) {
    // 処理1
    // 処理2
    // ...
}

with 関数は、引数に渡したオブジェクトに対して、lambda 式内で複数の処理を行うことができます。 lambda 式内では、そのオブジェクトを this として参照することができます。

例えば、以下のようにして、オブジェクトの複数のプロパティを取得し、それぞれの値を表示することができます。

val obj = SomeObject()
with(obj) {
    println(property1)
    println(property2)
}

また、with 関数は、複数のオブジェクトに対して同じ処理を行う場合にも使用することができます。

val obj1 = SomeObject()
val obj2 = SomeObject()
val obj3 = SomeObject()

with(obj1, obj2, obj3) {
    println(property)
}

このように、with 関数は、複数のオブジェクトに対して同じ処理を行う場合にも使用することができるので、コードを簡潔に書くことができます。

注意点として、with 関数は、処理の結果を返すことはありません。 また、with 関数は、Kotlin1.1以降で利用可能です。

■apply関数の使い方

apply 関数は、オブジェクトに対して複数の処理を行い、そのオブジェクト自身を返すための関数です。使い方は、以下のように記述します。

val obj = SomeObject().apply {
    // 処理1
    // 処理2
    // ...
}

apply 関数は、引数に渡したオブジェクトに対して、lambda 式内で複数の処理を行うことができます。 lambda 式内では、そのオブジェクトを this として参照することができます。

例えば、以下のようにして、オブジェクトの複数のプロパティを設定することができます。

val obj = SomeObject().apply {
    property1 = "value1"
    property2 = "value2"
}

apply 関数は、オブジェクトを返すため、オブジェクトを変更した上で、そのオブジェクトを返す場合に使用することができます。 これにより、以下のような書き方も可能です。

val obj = SomeObject()
val updated = obj.apply {
    property = "new value"
}

また、apply 関数は、also 関数と似ていますが、apply 関数は、オブジェクトを返すのに対して、also 関数は、オブジェクトを返しません。

このように、apply 関数は、オブジェクトを変更した上で、そのオブジェクトを返す場合に使用することができます。

■repeat関数の使い方

repeat 関数は、指定した回数、ブロック内の処理を繰り返し実行するための関数です。使い方は以下のように記述します。

repeat(5) {
    // 処理1
    // 処理2
    // ...
}

この例では、ブロック内の処理を5回繰り返し実行します。

val count = 5
repeat(count) {
    // 処理1
    // 処理2
    // ...
}

繰り返し処理のインデックス値を取得することもできます。

repeat(5) {
    println("Iteration: $it")
}

このように、repeat 関数を使用することで、簡単に指定した回数繰り返し処理を実行することができます。

ちなみにrepeat関数は、高速なforループの代替ですが、高速ではないので、特に処理が重い場合は、forループを使用するほうが良いです。

カテゴリー
kotlin プログラム言語

kotlin 開発 アーキテクチャパターン MVP

MVP(Model-View-Presenter)は、アーキテクチャパターンの1つで、アプリケーションの設計において、データ(Model)と表示(View)を分離することを目的としています。

これにより、データと表示を分離することで、複雑なコードをスッキリさせることができ、保守性や拡張性が向上します。

MVPモデルには、以下の3つのパーツがあります。

■Model

  • データに関する処理を行う部分で、ビジネスロジックやデータベースなどから取得したデータを扱います。

■View

  • ユーザーに対して表示をする部分で、UI(ユーザインターフェイス)を担当します。 Viewは、ユーザーの操作に対してPresenterに通知します。

■Presenter

  • ModelとViewの間に挟まれ、Modelから取得したデータをViewに反映する役割を担います。 Viewからの入力に対して、Modelに対する処理を行い、結果をViewに反映します。

MVPモデルを使用することで、ViewとModelを分離することで、ビジネスロジックと表示を分けることができ、複雑なコードをスッキリさせることができ、保守性や拡張性が向上します。 また、MVPモデルは、Androidアプリケーション開発においても使用されることが多いアーキテクチャパターンの1つです。

MVPはModel-View-Presenterの略で、MVC(Model-View-Controller)に似ていますが、PresenterがViewに対しての状態の管理を行っているため、ViewとModelが耐性が高い。 状態の管理はPresenterが行うことにより、ViewはViewに関する処理だけを行うことができ、Viewの拡張性や保守性が向上する。

カテゴリー
kotlin プログラム言語

kotlin 配列オブジェクトの種類

Kotlinでは、標準ライブラリに搭載されている配列オブジェクトには、以下の2つの種類があります。

Array:

  • Javaの「配列」に相当するオブジェクトで、要素の数が固定で、配列の要素に対して下标アクセスが可能です。 以下のように宣言します。
    val intArray: Array<Int> = arrayOf(1, 2, 3)

List:

  • Javaの「リスト」に相当するオブジェクトで、要素の数が可変で、配列の要素に対して下标アクセスが可能です。
    Listは、immutable(不変)なものとmutable(可変)なものがあります。
    以下のように宣言します。
    val intList: List<Int> = listOf(1, 2, 3)

ArrayやListは、標準ライブラリで提供されているクラスで、配列やリストの操作に必要なメソッドが多数提供されています。 また、配列やリストは、配列やリストを構成する要素を指定して、直接生成することもできます。

ちなみに、 KotlinでもJavaのArrayListやLinkedListなどのコレクションクラスを使用することもできます。

カテゴリー
kotlin プログラム言語

kotlin for文の種類

Kotlinでは、標準的なfor文、for-each文、while文、do-while文の4つの種類のループ文があります。

標準的なfor文:

for (i in 0 until 10) {
println(i)
}

for-each文:

val list = listOf("apple", "banana", "orange")
for (element in list) {
println(element)
}

while文:

var i = 0
while (i < 10) {
println(i)
i++
}

do-while文:

var i = 0
do {
println(i)
i++
} while (i < 10)

for文やwhile文は、C言語やJavaなどと同様の書き方ができます。 また、 for-each は、Javaでいう for(element : list) のような形式で、配列やコレクションなどの要素を順に処理することができます。

ただし、Kotlinでは、配列やコレクションを直接指定しなくても、イテレーターを使って順にアクセスすることができるため、for-each文を使う必要はありません。

また、Kotlinでは、for-each文に加えて、イテレーション時に特定の要素にアクセスするためのインデックスも取得することができる「インデックス付きfor-each文」も提供されています。

カテゴリー
kotlin プログラム言語

kotlin

Kotlinは、プログラミング言語です。Javaと互換性が高く、Androidアプリ開発にも使用されています。Googleが2017年にAndroid公式サポート言語に指定したことで、その人気が高まっています。Kotlinは、Javaよりもシンプルで安全な記述ができるとされています。

kotlinが利用できるプログラムは?

Kotlinは、Java Virtual Machine (JVM)上で動作するため、Javaと互換性が高いため、Javaと同じように、サーバーサイド、デスクトップアプリ、モバイルアプリ、Webアプリなど幅広い分野で使用することができます。

特に、Androidアプリ開発においては、Googleが2017年にAndroid公式サポート言語に指定したことで、Androidアプリ開発において使用が推奨されています。 またKotlin/Nativeが提供する機能によって、iOSアプリの開発も可能になります。 Kotlinは、Javaとの相互運用性が高いため、現在既存のJavaのコードベースを活用しながら新しいKotlinの機能を導入することも可能です。

kotlin言語はどうやって生まれたのか?

Kotlinは、JetBrains社によって開発されました。 JetBrains社は、IntelliJ IDEAなどのJava用の開発環境を開発する企業です。 2011年に、Kotlinの開発が始まりました。当初は、JetBrains社内のプロジェクトとして開発されており、その後、オープンソースとして公開されました。 Kotlinは、Javaの言語仕様をベースにしているため、Javaとの互換性が高く、Javaのような書きやすさと、ScalaやClojureのような高機能を持ち合わせた言語を目指して開発されました。

JetBrains社によって開発され、2011年に最初のバージョンがリリースされ、2016年には1.0がリリースされました。

2016年には、GoogleがAndroid公式サポート言語に指定したことで、Kotlinの人気が高まり、現在ではAndroidアプリ開発においても広く使用されています。

カテゴリー
未分類

CentOS Stream9でSSHログインできない問題

CentOS Stream9に認証鍵を使ってログインを行おうとすると、接続することができない。

vi /var/log/secureで内容を確認してみたところ、

「userauth_pubkey: key type ssh-rsa not in PubkeyAcceptedAlgorithms」

とエラーが表示されている。

どうも、鍵がRSAだとうまくいかないようす。試行錯誤して、「Ed25519」で鍵を作り直し設定したところうまくいきました。

putty key generatorでEd25519の鍵を作る場合は以下の設定で行う

メニューのkeyから設定

※MD5に設定しないとうまくいかなかった。

あとは、いつも通りの作成手順でいけます。

サーバへの設定手順も他と同じ。

カテゴリー
未分類

AWS IOT

自社で実験的に観葉植物をIOTを駆使して育てる実験環境を構築していきます。

今回は、データを取得する端末には、Arduinoを使いAWS IOTにデータを転送させ、長期データの分析、リアルタイムデータの可視化と分析を行う環境の構築を目指します。

こんなイメージ

■AWS IOT Core

簡単に言うと、IOT端末から取得した各種データを吸い上げ、AWSに保存するためのインターフェースです。

AWS IOTで得たデータを、ルール設定されたアクションにデータを引き渡していくことが可能なようです。

■AWS IoT Analytics

デバイスから取得したデータをもとにデータ分析・調整・保存を行うことができます。
・ノイズデータの削除などを行うことが可能
・データの変換を行うことが可能 単位等
・データ保存、外部へのデータエクスポートが可能
・Amazon QuickSight へのコネクタを提供しているため、統合することで、データの可視化を行うことが可能

■Amazon QuickSight
ダッシュボードを作ることが可能

カテゴリー
未分類

GASでSJIS変換

GAS(Google Apps Script)でSJISコードへの変換で、「~」文字がどうしても「?」になってしまう。

SJIS-winのコードが対応していないため、「MS932」を指定して変換を行ってみたところ、無事に「~」のまま文字変換されました。

var resumeBlob = Utilities.newBlob('', 'text/plain', 'upload.dat')
  .setDataFromString(content, 'MS932');

軽くはまったので、メモとして残しておくことにします。

カテゴリー
未分類

RFID のEPCエンコード方式

EPCエンコード方式のメモ

■SGTIN
 用途:商品ひとつひとつを識別したい
 使い道:製品、医療機器、原材料、等

■SSCC
用途:物流の輸送単位を識別したい
 使い道:荷物を輸送する際の輸送梱包単位。ケースやパレット、カゴ台車等の積載単位。輸送ラベル

■GRAI
用途:パレットやカゴ台車などを管理
 使い道:パレット、クレーンなど、何回も使う資産の管理

■GIAI
用途:什器やIT機器などの固定資産の管理
使い道:事務機器、IT機器など、固定資産

■GDTI
 用途:契約書などの書類を管理
 使い道:証明書、免許書等、画像等

カテゴリー
未分類

IME不具合 日本語入力できない

メモリ不足が原因かわからないが、IMEがおかしくなってしまい、急に日本語入力ができなくなってしまう場合が時々おきます。

結構な頻度でおきます。

そのたびにPC再起動をして復旧してましたが、もっと簡単に復旧できる方法を見つけたので備忘録です。

DOS画面から以下を実行すると、IMEが再起動できるようです。

ctfmon.exe

こんな感じ

日本語変換できないときは試してみてください。

補足:

時々プロセスをkillしてからじゃないとうまくいかない場合があるので、

tasklist /fi "imagename eq ctfmon.exe"

で取得したPIDを、killしてください。

taskkill /pid 3104

killすると勝手に立ち上がってくるので。起動させなくてもよさそう。