GolangのGinでStatusCodeが取得方法がわからなかった件

背景

GoのフレームワークであるGinの上でPostgreSQLをいじってたがerrorがJSONで返せない! →結局返せた

該当コード

      _, err := db.Exec("insert into foo bar;")
      if err != nil {
          c.JSON(200, gin.H{
            "message": err,
            })
          return
        }

こんな感じで動くと思ってた
 
実際はdb.ExecのHTTPStatusCodeが400なのに200を返そうとするとちゃんとJSONが返せないっぽい

解決策

で,どうやってdb.ExecのHTTPStatusCodeを取得するか

f:id:taillook:20180415123246p:plain

あった
詳細(https://gowalker.org/github.com/gin-gonic/gin)

これを使って200c.Writer.Status()とするとJSONが返せる

Go言語でPostgreSQLを操作するAPIサーバーを作ってみる

Go言語とは

Googleが開発したプログラミング言語.
1つのバイナリにできるので楽

早速やってみる

WebフレームワークはGinを使います.
Goのバージョンは1.8以上を使います.
まずはパッケージのインストールをしましょう!

go get github.com/gin-gonic/gin
go get github.com/lib/pq

コードはこんな感じになります

package main

import (
    "database/sql"
    "net/http"
    _ "github.com/lib/pq"
    "github.com/gin-gonic/gin"
)

func main() {
    db, err :=  sql.Open("postgres", "user=ユーザー名 dbname=DB名 password=パスワード sslmode=disable host=ホスト名")
    if err != nil {
        panic(err.Error())
    }
    defer db.Close()
    r := gin.Default()
    r.GET("/", func(c *gin.Context) {
        c.String(http.StatusOK, "Hello World")
    })
    r.GET("/user/:user", func(c *gin.Context) {
      db.Exec("insert into users (id) values(c.Param("user"))")
      c.String(http.StatusOK, "Hello World: " + c.Param("user"))
    })
    http.Handle("/", r)
}

go run main.goでローカルサーバーを起動します

これでhttp://localhost:8080/user/ユーザーidと叩くとuserテーブルにレコードが追加されます(実際はPOSTメソッドを使います)

実際に使うときはバリデーション関数とか挟んでいろいろしてやる感じですね
こんな感じで簡単にAPIサーバーが立てられるのでGo言語を試してみるのもいいですよ!

Swift RxSwiftのcombineLatestで情報フェッチ時のネストを回避する

問題

以前までこのような形で情報をフェッチしてビューに反映させてました
(この例ではViewとViewModelを分けたりとかしてませんが実際はいい感じに分けます)

    User.system.getMyPhoto({ (photo) in
      User.system.getMyName({ (name) in
        User.system.getMyID({ (id) in
          引数に3つの情報が必要ななんらかの処理
        })
      })
    })

これだとネストがいっぱいでイヤ!
(そもそも”引数に3つの情報が必要ななんらかの処理”が必要かという話は置いておいて...)

解決策

RxSwiftで値を監視しようぜという提案
こうします

  var photo = Variable<String>("")
  var name = Variable<String>("")
  var id = Variable<String>("")
  let bag = DisposeBag()

  User.system.getMyPhoto() { self.photo.value = $0 }
  User.system.getMyName() { self.name.value = $0 }
  User.system.getMyID() { self.id.value = $0 }
  Observable.combineLatest(photo.asObservable(), name.asObservable(), id.asObservable()) {photo, name, id in
    (photo, name, id)
    }.subscribe { event in
      引数に3つの情報が必要ななんらかの処理
    }.disposed(by: bag)

RxSwiftに詳しく無いので書き方はあってるかわかりませんが一応ネストを少なくできるかなといった感じです

とくめいチャットアプリ「NYAGO」の開発に携わって

こんにちは、株式会社UNDEFINEDのているです

ツイッターでは(しているている)っていう名前です

twitter.com

今はインターン的なバイト的な感じでジョインしてます.
創業2ヶ月とか3ヶ月くらいのときにジョインしました.

UNDEFINEDと関わった経緯

CEOの若月くんからツイッターで謎のDMを送りつけられて一週間くらい無視してたけどなんとなく会った.
その時にHiveShibuyaに行って流れでジョインすることになった.

NYAGOに関わった経緯

その日にコンセプトとかを聞いて自分のような隠キャには無い感覚で面白そうだったからいいなって思った.
コードを見せてもらったけどデザインの画像の上に透明なボタンを乗せる謎実装でこれはまずいな(笑)と思いながらも, 自分が完成まで関わればスキルアップに繋がるかなと思って関わることにしました.

4ヶ月経ってみて

私がジョインして4ヶ月ほど経ちましたが以前と比べてかなり成長したなと思います.
個人的にも未経験のサーバーサイドを触ったりして一応動くものは出来たしiOSに関しても設計をちゃんと意識するようになってきた.
(まだテストコードとか書いてないしBitriseとかも導入したい)

まとめ

サービスのリリースに関わるのは初めてなのでとてもいい経験が出来たと思います.
というわけで,みなさんNYAGOを使ってみてください,

NYAGO(ニャゴ・にゃご)

NYAGO(ニャゴ・にゃご)

  • UNDEFINED, INC.
  • ソーシャルネットワーキング
  • 無料

laravelのサブドメインでのワイルドカードルーティング*

目的

laravelフレームワーク上でサブドメインでのワイルドカードルーティングを実現する.

背景

{ユーザー名}.example.com的な感じでユーザー固有ページへアクセスさせたいため.

コード

以下のようにして実現できる.

  Route::domain('{userid}.example.com')->group(function () {
    Route::get('/', 'Controller@showUser');
  });

サブドメイン無しのドメインのみ固定ページを表示する場合は以下のようにして実現する.

  Route::domain('example.com')->group(function () {
    Route::get('/', 'Home');
  });

Swiftのfilterを使ってみる

filterについて

配列の中の欲しい要素だけが入った配列を生成できるメソッドです

解説

以下のコードでは"date"と"value"のkeyがある[String: Any]型の配列から"date"が"2018-02-02"である要素のみの配列と取得するコード

コード

let arr: [[String: Any]] = [["date": "2018-02-02", "value": 1], ["date": "2018-02-01", "value": 2]]
print(arr.filter{($0["date"] as! String) == "2018-02-02"})

仮想通貨で投げ銭出来る小説投稿サービス「tipNovel」プレリリース

タイトル通りのサービスをリリースしました

 tipNovel

 

tipmona等のボットサービスを用いて送金する感じのやつです

 

ユーザー数増やしてデータ取りたいのでツイート拡散お願いします

 

 

 

Juliaで2進数と8進数と16進数

Juliaでのn進数変換のやり方を調べた

環境

  • Julia 0.6

まとめた

binary octal hexadecimal
Variable a=15 a=15 a=15
Convert bin(a)
"1111"
oct(a)
"17"
hex(a)
"f"
Set Length bin(a,4)
"1111"
oct(a,4)
"0017"
hex(a,4)
"000f"

Swift UIButtonをコードのみで作る

備忘録

環境

  • Swift4
  • Xcode9

コード

let button = UIButton()
//表示されるテキスト
button.setTitle("Tap Me!", for: .normal)
//テキストの色
button.setTitleColor(UIColor.blue, for: .normal)
//タップした状態のテキスト
button.setTitle("Tapped!", for: .highlighted)
//タップした状態の色
button.setTitleColor(UIColor.red, for: .highlighted)
//サイズ
button.frame = CGRect(x: 0,y: 0,width: 300,height: 50)
//タグ番号
button.tag = 1
//配置場所
button.layer.position = CGPoint(x: view.frame.width / 2, y: view.bounds.height / 2)
//背景色
button.backgroundColor = UIColor.white
//角丸
button.layer.cornerRadius = 10
//ボーダー幅
button.layer.borderWidth = 1
//ボタンをタップした時に実行するメソッドを指定
button.addTarget(self, action: #selector(self.buttonTapped), for:.touchUpInside)
view.addSubview(button)

Julia 0.6 でターミナルのサイズを取得する

日本語の資料見つからなかったので書く

経緯

Inspired by :

qiita.com

横幅ぴったりに表示させたいとか、lsコマンドのように長いリストを折り返しせずに複数列表示したりするときには、端末(ターミナル)の幅と高さを知る必要があります。
Juliaでこの2つを取得したいときは、Base.tty_size()を使うと可能です。より簡単な方法はありません。

これを試して出来なかったので

I/O and Network · The Julia Language

を参考にした

To get your TTY size,

julia> Base.displaysize(STDOUT)
(34, 147)

やり方

f:id:taillook:20171217141820p:plain

タプルで返ってきます.
displaysize(STDOUT)でも動きます.
ターミナルのサイズを変えるとdisplaysizeもちゃんと変わる.