RustがC言語に取って代わる存在かもしれないという話。

最近になってRust言語を勉強しています。

なぜRust言語なのか。

C言語って、コンパイルすると、機械語のファイルになります。

最近のトレンドでは、JavaやC#などの中間言語(仮想マシンが中間言語ファイルを翻訳し実行する)や、Pythonなどのスクリプト言語(プログラムを1行ずつ読み取って実行する)がありますが、

Rustはコンパイルすると、中間言語を必要としない機械語のファイルになります。

しかも後発の言語なので、C言語にない機能とかも搭載されているんです。

例えば変数を効率よく使用できる

例えば、

変数初期化を強制している点(不確定変数を許容しない)、

Boolean型が存在する、

配列の不正なIndex参照を防ぐ、などなど。

C言語のありがちな不具合を未然に防いでくれると言う点でかなりメリットがあります。

しかも、実行速度もC言語にかなり近づいているんだとか。

C言語が一番最適化されていると思われていたのですが。

で、さらに注目されていることがあって、

LinuxカーネルをRustで開発できないか、というのを検討しているみたいです。

https://japan.zdnet.com/article/35157012/

カーネルって、PCを動かすのに必要なコアのプログラムですよ。

Linuxカーネルなので当然Androidにも搭載される訳ですので。

LinuxカーネルでRustが採用されたらプログラミング言語の勢力図が変わるかもしれませんね。

【ANDROID】【実質北海道一周】距離をファイルに保存する。

前回までの状況はこちら。

最新ソースはこちら(gitHub)

https://github.com/takishita2nd/AroundHokkaido

今回はGPSの情報から取得した移動距離合計をファイルに保存する処理を作成していきます。

クラスを一つ作成し、北海道一周関連の処理はこのクラスの中で処理していきたいと思います。

package com.takilab.aroundhokkaido

import java.io.File

class AroundHokkaido {
    private val filename: String = "distance.txt"
    private val citylist: CityList = CityList()
    private var totalDistance: Double = 0.0
    private val activity: MainActivity = SingletonActivity.GetActivity()

    fun getDistance(): Double{
        val file = File(activity.filesDir, filename)
        if(file.exists()){
            totalDistance = file.readText().toDouble()
        }
        return totalDistance
    }

    fun updateDistance(distance: Double): Double {
        val file = File(activity.filesDir, filename)
        if(file.exists()){
            totalDistance = file.readText().toDouble()
        }
        totalDistance += distance
        file.writeText("%.3f".format(totalDistance))
        return totalDistance
    }
}

まず、Android内でファイルアクセスするためには、MainActivityが必要です。

exists()でファイルの存在の有無を確認し、存在していれば、ファイルに保存済みのデータを読み込みます。

ファイルはテキストで保存されているので、Double型に変換して取得します。

保存するときは、桁数を指定しないと、指数表記でテキスト保存されてDouble型に変換出来ないという問題があるので、桁数を絞っています。

これをMainActivityでUIに表示させます。

    private lateinit var aroundHokkaido: AroundHokkaido

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        SingletonActivity.SetActivity(this);

        aroundHokkaido = AroundHokkaido()
        val distance: Double = aroundHokkaido.getDistance()
        distanceText.text = "%.3f".format(distance)

        requestPermission()

~中略~

                            override fun onResponse(call: Call, response: Response) {
                                var str = response!!.body!!.string()
                                val jsonObject = JSONObject(str)
                                val jsonArray = jsonObject.getJSONArray("Feature")
                                for (i in 0 until jsonArray.length()) {
                                    val jsonData = jsonArray.getJSONObject(i)
                                    val geometry = jsonData.getJSONObject("Geometry")
                                    val distance = geometry.getDouble("Distance")
                                    val totalDistance: Double = aroundHokkaido.updateDistance(distance)
                                    val mainHandler : Handler = Handler(Looper.getMainLooper())
                                    mainHandler.post(Runnable {
                                        distanceText.text = "%.3f".format(totalDistance)
                                    })
                                }
                            }

まず、AroundHokkaido()の中でMainActivityを使用していますので、AroundHokkaidoの初期化はSingletonActivity.SetActivity(this);の後に行わなければなりません。

で、AroundHokkaidoから現在の移動距離を取得しUIに表示します。

これがアプリ立ち上げたときの初期表示値です。

WebAPIのレスポンスを取得したときの処理も同様にします。