Kotlin+OkHttp3でjsonをPOSTする

build.gradle

build.gradleのdependenciesに以下を追加してください

compile 'com.squareup.okhttp3:okhttp:3.9.0'
compile group: 'org.json', name: 'json', version: '20170516'

Test.kt

以下のような感じでコードを書くと結果を受け取れます. 別途Nullチェックはするべきっぽいです.

import okhttp3.MediaType
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody
import org.json.JSONObject

class Test(){
    fun post(): String?{
        val url = "url"
        val client: OkHttpClient = OkHttpClient.Builder().build()

        // create json
        val json = JSONObject()
        json.put("name", "mituba")
        json.put("hobby", "programming")

        // post
        val postBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json.toString())
        val request: Request = Request.Builder().url(url).post(postBody).build()
        val response = client.newCall(request).execute()

        // getResult
        val result: String? = response.body()?.string()
        response.close()
        return result
    }
}

非常に簡単にPOSTすることができました.

spring+kotlinでJSONのリクエストとレスポンスをやってみた

Controller

package com.example.demo

import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RestController

@RestController
class DemoController() {
    @GetMapping("/user")
    fun getUser(): User {
        val user = User(
            username = "grahamcox",
            screenName = "Graham"
        )
        return user
    }

    @PostMapping("/user")
    fun  registerUser(@RequestBody user: User): User {
        return user
    }
}

Userクラス

package com.example.demo

import com.fasterxml.jackson.annotation.JsonCreator

data class User @JsonCreator constructor(
    val username: String,
    val screenName: String
)

GETリクエス

http://localhost:8080/userにアクセスすると,{"username":"grahamcox","screenName":"Graham"}のようなJSONが返ってくる

POSTリクエス

下のようなリクエストをcurlで送る

curl --data '{"username":"test", "screenName":"mituba"}' -v -X POST -H 'Content-Type:application/json' http://localhost:8080/user

{"username":"test","screenName":"mituba"}のようなJSONが返ってくる

参考

参考にしました

scotch.io

kotlin+springをSpring Initializrを使ってサクッとhello worldまで

とりあえず今回は以下のバージョンで行いました

  • spring:2.0.0

Generate Projectを押すとzipファイルが落ちてきます. それを解答して,開発を始めます.

Controllerの追加

DemoApplicationが指定したgroupID, ArtifactIDの階層にあると思うので,そこと同じ階層にDemoControllerを作成します.

package com.example.demo

import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.RestController

@RestController
class CustomerController() {

    @GetMapping("/")
    fun hello() = "hello"

    @GetMapping("/{name}")
    fun helloName(@PathVariable name:String)
            = name
}

ルーティング

  • 今回は以下のようなルーティングにした
Method Route
GET /
GET /{name}

あとはgradle bootRunで起動する.http://localhost:8080にアクセスすると確認できる.

sbtのプロジェクト作成からAkka Streamの触りまでをやってみた

  • scala version:2.12.3
  • sbt version:1.0.2

sbtプロジェクト作成する

sbt new sbt/scala-seed.g8 

name [Scala Seed Project]:と聞かれるのでプロジェクト名を入力します.

プロジェクトのディレクトリが作成されます.

build.sbtの依存関係にAkka Streamを追加する

import Dependencies._

lazy val root = (project in file(".")).
  settings(
    inThisBuild(List(
      organization := "com.example",
      scalaVersion := "2.12.3",
      version      := "0.1.0-SNAPSHOT"
    )),
    name := "Hello",
    // 以下のように変更(libraryDependenciesを変更)
    libraryDependencies ++= Seq(
        scalaTest % Test,
        "com.typesafe.akka" %% "akka-actor" % "2.5.6",
        "com.typesafe.akka" %% "akka-stream" % "2.5.6"
        )
  )

コードを変更する

プロジェクト作成時に作成されているHello.scalaを以下のように変更しました.

package example

import akka.stream._
import akka.stream.scaladsl._
import akka.actor.ActorSystem

object Hello extends Greeting with App {
  implicit val system = ActorSystem("QuickStart")
  implicit val materializer = ActorMaterializer()

  val source = Source[Int](1 to 5)
  val sink = Sink.foreach[Int](println)

  source
   .map(_ * 2)
   .runWith(sink)


  println(greeting)
}

trait Greeting {
  lazy val greeting: String = "hello"
}

以下のように出力されたら成功です.

hello
[debug]     Thread run-main-0 exited.
[debug] Waiting for thread QuickStart-akka.actor.default-dispatcher-2 to terminate.
2
4
6
8
10

参考にしました

adtech.cyberagent.io

Apache Solrで,(カンマ)の扱いを任意の処理にさせる

Apache Solrのコアを作成したあと,$SOLR/server/solr/birth_3gram.xml/conf/managed-schemaのstringsフィールドの設定を以下のように変更します.(今回はカンマが含まれる文字列をsolrにsplitさせて検索させる方法です)

<fieldType name="strings" class="solr.TextField" multiValued="true">
      <analyzer type="index">
          <tokenizer class="solr.PatternTokenizerFactory" pattern="\s*,\s*"/>
          <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
         <filter class="solr.LowerCaseFilterFactory"/>
     </analyzer>
     <analyzer type="query">
         <tokenizer class="solr.PatternTokenizerFactory" pattern="\s*,\s*"/>
         <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
         <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
         <filter class="solr.LowerCaseFilterFactory"/>
     </analyzer>
 </fieldType>

その後,Analysisで確認すると分割されていることがわかります.

f:id:MitubaEX:20171006020950p:plain

今回はindex, query両方共に適応していますが,どちらかだけしかいらない場合はその都度消します.

GOでのファイル読み取り(標準入力も)

以下のコードでできる

package main

import (
    "bufio"
    "fmt"
    "os"
)



func main() {
    // ファイル読み取り(引数でファイル名受け取り)
    fp, err := os.Open(os.Args[1])
    if err != nil {
        panic(err)
    }
    defer fp.Close()
    scanner := bufio.NewScanner(fp)
    for scanner.Scan() {
        fmt.Println(scanner.Text())
    }
    if err := scanner.Err(); err != nil {
        panic(err)
    }

        // 標準入力読み取り
    s := bufio.NewScanner(os.Stdin)
    for s.Scan() {
        fmt.Println(s.Text())
    }
}