万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

  • ・資産運用おすすめ
    10万円は1000円くらい利益
    資産運用ブログ アセマネ
    • ・寄付お願いします
      YENTEN:YYzNPzdsZWqr5THWAdMrKDj7GT8ietDc2W
      BitZenny:ZfpUbVya8MWQkjjGJMjA7P9pPkqaLnwPWH
      c0ban:8KG95GXdEquNpPW8xJAJf7nn5kbimQ5wj1
      Skycoin:KMqcn7x8REwwzMHPi9fV9fbNwdofYAWKRo

    Kotlinのktorを使う

    Getting Startedを見てみる。 Getting Started · Kotlin/ktor Wiki · GitHub

    importがない・・・。

    https://github.com/Kotlin/ktor

    公式でさえ

    embeddedServer(Netty, 8080) {
        routing {
            get("/") {
                call.respondText("Hello, world!", ContentType.Text.Html)
            }
        }
    }.start(wait = true)

    しかない。 一応これをsrc/main/kotlin/main.ktにでも記載する。

    fun main(args: Array<String>) {
        val server = embeddedServer(Netty, 8080) {
            routing {
                get("/") {
                    call.respondText("Hello, world!", ContentType.Text.Html)
                }
            }
        }
        server.start(wait = true)
    }

    build.gradle

    これの記載は

    buildscript {
    //    ext.kotlin_version = '1.0.3'
    //    ext.ktor_version = '0.3'
    
        ext.kotlin_version = '1.1.3'
        ext.ktor_version = '0.3.2'
    
        repositories {
            mavenCentral()
        }
    
        dependencies {
            classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        }
    }
    
    apply plugin: 'kotlin'
    apply plugin: 'application'
    
    repositories {
        mavenCentral()
        maven { url "https://dl.bintray.com/kotlin/kotlinx" }
        maven { url "https://dl.bintray.com/kotlin/ktor" }
    }
    
    dependencies {
        compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
        compile "org.jetbrains.ktor:ktor-core:$ktor_version"
        compile "org.jetbrains.ktor:ktor-locations:$ktor_version"
        //runtime "org.jetbrains.ktor:ktor-netty:$ktor_version"
        compile "org.jetbrains.ktor:ktor-netty:$ktor_version"
        // いらないかも?(https://mvnrepository.com/artifact/io.netty/netty-all/4.0.4.Final)をみた
        compile group: 'io.netty', name: 'netty-all', version: '4.0.4.Final'
    }
    
    sourceSets {
        main.kotlin.srcDirs += 'src/main/kotlin'
        main.java.srcDirs += 'src/main/java'
    }
    // いらないかも?
    mainClassName = 'org.jetbrains.ktor.netty.DevelopmentHost'

    インポートの記載

    一旦ここを参考にした。 ohtomi.hatenablog.com

    import org.jetbrains.ktor.netty.*
    import org.jetbrains.ktor.netty.embeddedNettyServer // deprecatedなので不要
    import org.jetbrains.ktor.routing.*
    import org.jetbrains.ktor.application.*
    import org.jetbrains.ktor.host.*
    
    import org.jetbrains.ktor.http.* // embeddedServer
    import org.jetbrains.ktor.response.*
    
    fun main(args: Array<String>) {
        val server = embeddedServer(Netty, 8080) {
            routing {
                get("/") {
                    call.respondText("Hello, world!", ContentType.Text.Html)
                }
            }
        }
        server.start(wait = true)
    }

    org.jetbrains.ktor.netty.embeddedNettyServerをインポートするともうdeprecateで古いって言われる。 新しいembeddedServerを使うためimport org.jetbrains.ktor.http.*を使う。

    この辺を見るとimportの参考になる ktor/EmbeddedApplication.kt at 8e14bfa6d032a5ab03fad724dde503d52e1aeccb · Kotlin/ktor · GitHub

    他にもどのメソッドがどこにあるかわからないがこんな感じ? ↓

    routing・・・import org.jetbrains.ktor.routing.*をする。 call・・・・import org.jetbrains.ktor.response.*をする。 Netty・・・・こいつが曲者import org.jetbrains.ktor.netty.*にある。

    build.gradle

    //    ext.kotlin_version = '1.0.3'
    //    ext.ktor_version = '0.3'

    コメントアウトしたのは1.0だとcall.respondTextが使えないとか言われるから。

    build.gradle · master · Artur Bosch / TinboServer · GitLab

    でも正しいバージョンとかわからないので↑を見て。

        ext.kotlin_version = '1.1.3'
        ext.ktor_version = '0.3.2' // 上だと1だけど2でも行けたからそっちにした

    にした。

    Error:(13, 13) Kotlin: 'get(String, suspend PipelineContext<ApplicationCall>.(ApplicationCall) -> Unit): Route' is only available since Kotlin 1.1 and cannot be used in Kotlin 1.0
    Error:(13, 13) Kotlin: The feature "coroutines" is only available since language version 1.1 (see: https://kotlinlang.org/docs/diagnostics/experimental-coroutines)
    Error:(14, 22) Kotlin: 'respondText(String, ContentType): Unit' is only available since Kotlin 1.1 and cannot be used in Kotlin 1.0

    があああ・・とまだいろいろエラーでる。 build.gradleに書いたのは関係ない?

    おそらくIDE自体の設定で、今回のプロジェクトに絞ったのではない設定だと思うが、 「command + ,」での設定(またはバーのIntelliJ IDEA→Prefarences…)。

    f:id:shinriyo:20170521153123p:plain

    ここを1.0から1.1にする。

    しかしこれではだめだった。

    今回のプロジェクト設定もする。 (個別設定があるので先程の手順はいらないかもれない)

    f:id:shinriyo:20170521153653p:plain

    プロジェクト名のあるフォルダを右クリックしてここを選ぶ。(ショートカットは「command + 」) さらにここで自分のtest/test_mainを選んで1.1にする。

    「Use project settings」にチェックでもいいと思う。先程の手順はいらないかもれないって言ったけどこの時なら役立つね。

    これでやっと動いたーーーーーー。 f:id:shinriyo:20170521154554p:plain