読者です 読者をやめる 読者になる 読者になる

万年素人からHackerへの道

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

Kotlin ktor 文字化け

Kotlin ktorのWebでうまく日本語が出ない・・。

call.respondText("へろわ", ContentType.Text.Html)のように書いてだめだったのでこうしたのに。

import org.jetbrains.ktor.netty.*
import org.jetbrains.ktor.routing.*
import org.jetbrains.ktor.application.*
import org.jetbrains.ktor.host.*
import org.jetbrains.ktor.http.*
import org.jetbrains.ktor.response.*
import java.net.URLEncoder // URLEncoder使うため

fun main(args: Array<String>) {
    val server = embeddedServer(Netty, 8080) {
        routing {
            get("/") {
                val msg = "へろわ"
                //var en = URLEncoder.encode(msg, Charsets.ISO_8859_1.toString())
                var en = URLEncoder.encode(msg, Charsets. UTF_8.toString())
                //val en = URLEncoder.encode(msg, Charsets.UTF_8.name())
                call.respondText(en, ContentType.Text.Html)

        }
    }
    server.start(wait = true)
}

ちなみに、IntelliJ IDEAを使っってる。 この辺の設定はUTF-8なんだけどな。 f:id:shinriyo:20170521174508p:plain

設定ファイルを一応ヘルプから生成しておいた。 f:id:shinriyo:20170521174523p:plain

すでにUTF-8なのでCharsets.UTF_8は不要だと思う運だけどな・・。 ちなみにtoString()name()で結果が変わった。

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

Kotoline

めんどくさいけどSDKMAN使えば楽。 JVMコマンド。

SDKMAN

curl -s "https://get.sdkman.io" | bash

Kotlin

sdk install kotlin

Java

Java入れてないので・・・

sdk install java
Oracle requires that you agree with the Oracle Binary Code License Agreement
prior to installation. The license agreement can be found at:

  http://www.oracle.com/technetwork/java/javase/terms/license/index.html

Do you agree to the terms of this agreement? (Y/n): Y


Downloading: java 8u131

In progress...

###################                                                       27.3%

Gradle

Apache AntやApache Mavenのコンセプトに基づくオープンソースビルド自動化システムであり、プロジェクト設定の宣言にはApache Mavenが利用するXML形式ではなくGroovyベースのドメイン固有言語 (DSL) を採用している。

どっちも使ったことないけどMavenと似たようなやつと思うが、Gradleんがいいっぽいのでそうした。 こいつもsdkコマンドで入るぜ。

sdk install gradle

Unity uGUIのRectTransformのpivot

http://answers.unity3d.com/questions/1007886/how-to-set-the-new-unity-ui-rect-transform-anchor.html

なので左上にするなら

    public static void SetPivotLeftUp(this RectTransform aRectTransform)
    {
        Vector2 vec2 = Vector2.one;
        vec2.Set(0.0f, 1.0f);
        aRectTransform.anchorMax = vec2;
        aRectTransform.anchorMin = vec2;
        vec2.Set(0.5f, 0.5f);
        aRectTransform.pivot = vec2;
    }

Google Map iOSのClientParametersRequest failedエラー

GoogleMapのAPIを使おうと

developers.google.com

ここに行って設定したのにも関わらず、、、

ClientParametersRequest failed, 7 attempts remaining (0 vs 11). Error 

のエラーがXcodeで出てくる。

ここ見た。 http://stackoverflow.com/questions/32054346/googlemaps-gmsview-wont-display-in-ios

このページで console.developers.google.com ↓のを有効にする。 f:id:shinriyo:20170514221025p:plain