versions.gradle にバージョンを列記する

完全にただのメモなんですが。

Androidのサンプルコード見てたら、アプリケーションのgradle(build.gradle Module:app)に次のように書いてあって、?!と思いました。

android {
compileSdkVersion build_versions.target_sdk
buildToolsVersion build_versions.build_tools
///中略
}

build_versions.target_sdk

ってどこで定義されてるのかな?って思ったら、versions.gradleというファイルがあって、そこにバージョンたちが列記されていました。


def build_versions = [:]
build_versions.min_sdk = 14
build_versions.target_sdk = 28
build_versions.build_tools = "28.0.3"
ext.build_versions = build_versions

すごい。バージョンなどをいじるときに、アプリケーションのgradleファイルをいじらなくていいんですね。

設定は、プロジェクトのgradleファイル(build.gradle(Project:BasicSample)に次のように書いたらよいようです。

buildscript {
apply from: 'versions.gradle'
}


ローカルの開発環境(Vagrant)のPHPでcURLが機能しない

タイトルがわかりにくいですね。

困った

こんなことをしていました。

$url = 'http://' . $_SERVER['HTTP_HOST'] . SERVER_URL . 'index.php?action=hoge';

$curl = curl_init($url);
    (中略)
$response = curl_exec($curl);
※$url: http://local-host.name/server_url/index.php?action=hoge な感じ

こんな風になりました。

Could not resolve host: local-host.name

いやぁ繋がらん繋がらん…… 軽く調べたらDNSがまずいみたいな話🤔

解決

vagrant上の/etc/hosts127.0.0.1 local-host.nameを追加して、$ vagrant reloadしたら解決していた。

[vagrant@localhost ~]$ sudo vim /etc/hosts
    (~編集~)
[vagrant@localhost ~]$ sudo cat /etc/hosts

127.0.0.1 local-host.name

[vagrant@localhost ~]$ exit
Abgemeldet
Connection to 127.0.0.1 closed.

C:\hoge\vagrant\piyo>vagrant reload
~~~

ちょろいもんですわ。(反映されるタイミングが少し怪しかったけど……)

参考

Smart cast to “TextView” is impossible, because “textView” is a mutable property…

JavaからKotlinへ移行してAndroidアプリ書いている、私のような人にはタイトルのようなエラー結構出ると思うんですけど。

下記のようなシンプルなコードがあったとします。

    private var textView: TextView? = null

    //アプリが開始されると最初に処理されるメソッド
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.content_input_voice)

        textView = findViewById<View>(R.id.textView) as TextView

        textView.setText(getText(R.string.no_task_error)) //ここでエラー
}

これは、結論から言いますと、次の2パターンで治ります。

//パターン1 textViewはnull許可だってわかってるよ?とする
textView?.setText(getText(R.string.no_task_error)) 
//パターン2 textViewをvalにする
val textView:TextView = findViewById<View>(R.id.textView) as TextView
textView.setText(getText(R.string.no_task_error))

mutable は可変という意味です。

varという宣言していたり、Null許可している変数にアクセスしようとすると出ます。


Ubuntu18.04 LTS | HDDの増設

前回の続き。

内蔵HDDの追加作業をしました。

調べたらGUIで簡単にできるらしい。さっくりと実践。
(うっかりスクショ撮り忘れたので文字ばっかですがご了承ください)

参考: HDDをフォーマットする – Ubuntu 18.04 LTS編

  1. Windowsキーとか押して「disk」と入力し、出てきた「ディスク」を開く。
  2. セットアップを行いたいディスクを選択し、メニュー(≡)から「ディスクを初期化」を選択。
  3. ディスクの初期化
    何も入っていないドライブだったので下記のように選択して初期化。
      消去: 既存のデータを上書きしない(クイック)
      パーティション: 新しいシステムと(中略)互換(GPT)
  4. [➕]を押して未割り当て領域にパーティションを作成
    パーティション作成ダイアログでは、パーティションのサイズを最大にしました。
  5. ボリューム名などの設定は以下のようにして作成。
      ボリューム名: data
      消去: オフ
      タイプ: Linuxシステム専用の内蔵ディスク(Ext4)。
  6. [▶]を押してパーティションをマウント
  7. [⚙]を押してマウントオプションを編集
    Ubuntu起動時に自動でマウントされるよう設定する。
      ユーザーセッションのデフォルト: オフ
      ☑ システム起動時にマウントする
      ☑ ユーザーインターフェースに表示する
      マウントポイント: /media/onlineconsultant/data
      識別: UUID=~~~~~~~~~~
      ファイルシステムのタイプ: auto
    として [🆗]。認証を求められるのでパス入れて完了。
  8. 再起動して確認。

サイト通りの手順でできてしまった。

一応コマンドでもできるという話

まず現状確認

$ cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/sda1 during installation

UUID=d2916135-4486-43be-a209-b548c96bfe38 / ext4 errors=remount-ro 0 1
/swapfile none swap sw 0 0

ここで、以下のようにコマンド実行

sudo echo -e '/dev/sda1 /media/onlineconsultant/data auto defaults 0 0' >> /etc/fstab

みたいなことをしてもできます。(ちょっと /etc/fstab ファイルの中身は違うけど実質同じ(はず))

おわり。

参考

Class ‘Task’ is not abstract and does not implement abstract member public abstract fun writeToParcel(p0: Parcel!, p1: Int): Unit defined in android.os.Parcelable

AndroidのParcelのことでつまづています。

Parcelという仕組みは、例えばIntentからIntentへ何か値を渡すときに、String(文字列)とかInt(整数)とかだと簡単に渡せるんですが、自分で作った自作クラスのオブジェクトを渡すための仕組みです。(かなりはしょっていますが)

Parcelについて(Android公式 英語)

で、Javaでやってた時はかなりごちゃごちゃ書かないと、 自分で作った独自クラス にParcelというのを実装できませんでした。

Kotlinでも、少し古いのを読むと、の独自クラスに実装するのに、やはりかなりわかりにくい処理を書かねばいけませんでした。

しかし、なんと!!

Android StudioのKotlinのプラグインの1.3.60 以降では、下記のように

@Parcelize
class Task(val _id: String, val _name: String):Parcelab

これだけでOKになりました!

@Parcelize

アノテーションと、Parcelableを継承するだけで完結!

になったらしいです。

A study of the Parcelize feature from Kotlin Android Extensions
https://medium.com/@BladeCoder/a-study-of-the-parcelize-feature-from-kotlin-android-extensions-59a5adcd5909

しゅごいー

と思って早速実装したところ、タイトル通り、ビルドできませんでした。

下記のStack Overflowさんにも、1.3.60以降はこのエラー出ないヨ!って書いてあるんですけどね…。

https://stackoverflow.com/questions/56018761/class-x-is-not-abstract-and-does-not-implement-fun-writetoparcel-defined-in-an

仕方なく

androidExtensions {
experimental = true
}

をアプリケーションのbuild.gradleに書いたらビルドできるようになりました。

build.gradleの全部をサンプルで載せておきます。

apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "hogehoge.myapplication"
        minSdkVersion 14
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'

        androidTest.java.srcDirs += 'src/androidTest/kotlin'
    }
}

androidExtensions {
    experimental = true
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'com.android.support:design:28.0.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}