goでdbrを使ってdbを検索
go始めてみました。
とりあえずよくやる、databaseにアクセスしてusersテーブルからUserを取得する的なものをやってみました。
dbrを使う
orm的なものはいくつかあるみたいだけど、goではあまりリッチなのは好まれない傾向がありますかね。
でもmysql-driverを生で使ってSQL書いていくのは私のようなゆるエンジニアには辛いのです。
で、調べてみたらgocraftのdbrというライブラリがいい具合っぽいので使ってみました。
package main import ( "fmt" _ "github.com/go-sql-driver/mysql" "github.com/gocraft/dbr" ) type User struct { ID int Email string } func main() { var user User // mysqlのドライバーを使ってuser: mysql、password: rootでログインしてmydatabase_developmentを使う。loggerは使わない conn, _ := dbr.Open("mysql", "mysql:root@/mydatabase_development", nil) sess := conn.NewSession(nil) sess.Select("*").From("users").Where("id = ?", 1).Load(&user) fmt.Printf("%v", user) }
自分のコードから抜き出したものなので、まさにこのコードが動くかチェックしてないです。でもこんな感じで動くはず。
ここでvar user User
をvar users []User
にして実行すると配列で取得できるのが賢いなと思いました。
気になってるけどまだ分かっていないこと
- loggingする方法
- transactionの使い方
- コネクションプーリング出来るかどうか
- go-sql-driver/mysqlの仕組み?
他のORMの選択肢
その他
goの本を読み始めたんですが、みんなのGo言語いいっすね。 初学では文法を教えてくれるわけではないので厳しいですが、なんとなくgoを知ってさえいれば現場で使える技術が分かる。
初学ならスターティングGo言語を読んだらいいのかな。さっきkindleで買ったのでこれから読みます。
- 作者: 松木雅幸,mattn,藤原俊一郎,中島大一,牧大輔,鈴木健太,稲葉貴洋
- 出版社/メーカー: 技術評論社
- 発売日: 2016/09/09
- メディア: 大型本
- この商品を含むブログ (1件) を見る
- 作者: 松尾愛賀
- 出版社/メーカー: 翔泳社
- 発売日: 2016/05/11
- メディア: Kindle版
- この商品を含むブログを見る
最近やってみたいと思っている技術ネタ
最近、dockerやrust, go, elixir, kotlinなど幾つかのこと勉強して、やりたいことが湧き上がってきたのでメモを残しておくことにした。
サービス分割とDockerによる環境提供
仕事で作っているサービスはアクションによってもっと最適な言語やFWを使いたい部分もあって、例えば普段はRailsを使っているが単純な作業をやるだけで応答速度を上げたい部分なんかはGoを使ってもいいと思ってたりします。 サービスのコードベースが大きくなってくるとちょっとずつ分けたほうがいいところもあるかなと思っていて、そうなると細かく分かれたサービスを一つ一つ立ち上げるとか管理するとかすることのコストがかかってくる。
マイクロサービス化といえばそうなんだが、マイクロサービス化というとそっちの定義の話になってしまうのでサービスの分割くらいの感覚で考えている。 Goはマイクロサービスを開発するのにすごく向いてそうですよね。
そういうところでDockerをうまいこと使えば簡単になりそうだし、他チームの人も簡単に環境構築出来るし困らないかなと思ってもいます。
複数サービスを統合したテストの仕組み
複数サービスの構成になると特に結合テストが大事になってくるかなと思っていて、複数のサービスが組み合わさって正しく動いているかの保証をしたい。 これまではRailsのrequest specとか使ってたりしたのがそもそもそのRailsのサービスに閉じない、他のサービスをテストしないといけなくなってくるのではないかと。
そうしたらCasperJSやNightwatch.jsの出番になるんだろうか。 全くよく調べていない状況だが、その辺のライブラリはHTMLをテストするのに向いている気がしていて、WebAPIのテストに向いているのだろうか。 JSのライブラリなのでHTTPのリクエストやjsonのテストはうまく行えそうではあるが。 Rubyなどで作っても良いのだが、テストはJSで書いたほうが最近のWeb事情に親和性がある気がしているのだけど、なんでかは深掘り出来ていない。
これもテスト環境をDockerで準備出来ていると誰でもさっと実行出来そうで良いな。
Kotlinを使ったWebサービス開発
突然話は飛ぶがKotlinを使ったWebサービス開発も興味がある。
元々JVMはWebサービスでは大量の知見や実績があるところに、とても分かりやすく見通しが良さそうな言語で開発ができたら開発者として単純に楽しそうと思っています。 最近はKtorというKotlin公式のフレームワークも開発され始めているし、Androidのみの言語じゃなくWebサービス開発に使ってみるのも面白いのでは。 Javaでもいい?うーん、JVMはすごいと思うんだけど言語としては継ぎ足し継ぎ足しになっているし、新たにデザインされた言語を使いたいなと個人的には思う。
まあただ、Ktorはフレームワークはまだ成熟には程遠い状態(ドキュメントも書きかけ)なので仕事などでは辛い気がしています。 Kotlinはもうプロダクションでいける
Windows版homebrew的存在、Chocolateyを使う
macならHomebrewに当たるパッケージマネージャ的なものがWindowsにもあって、Chocolateyというのがそれです。
コマンドがchoco
なのがかわいい。
install方法
PowerShellを管理者権限で立ち上げます。 Win+xでPowerShell(管理者)を選ぶと立ち上がります。
Win+xをたたいたところ
あとはこのコマンドでinstallできました。
iwr https://chocolatey.org/install.ps1 -UseBasicParsing | iex
環境によって違うらしいので詳しくは公式のページを見てください
installが終わったら一度PowerShellを再起動させておいた方が変更が反映されて良さそうです。
使い方
Chocolateyは基本的に管理者権限を必要とします。
普通にPowerShellを立ち上げて使っても
require admin rights.
のように警告が出てきます。
使い方を調べる
とにかく使い方やコマンドが分からなくなったらこれ。
choco -h
-?
なども使える。
使えるコマンドやオプションも表示されてだいぶ親切。
コマンドの使い方を調べたいときはコマンドの後に-h
を付けると使い方が分かります。
choco list -h
新しいパッケージをinstallする
choco install
まずはこれですね。
例えばgitはこうなります
choco install git
これでPowerShellを再起動するとgit
が使えます。
いちいちインストーラーを持って来ずにPowerShell上で出来るのが良い!
途中でYes/Noを聞かれることも多いので分かりきってる時は-y
を渡すと良いすね。
アップグレードする
choco upgrade
installしたパッケージのバージョンを上げたりします
choco upgrade git
Chocolatey自身をアップグレードすることもできます
choco upgrade chocolatey
パッケージの検索
choco list
このまま叩くと時間がかかるので基本は検索対象を入れた方が良いです。
choco list ruby
rubyのパッケージを見つけたいときはこうですね。
ただ、検索はあまり頭が良くないというか、部分一致すればとにかく出てくるような感じなのでchoco list vi
とか打つと候補があまり絞れません (´・ω・`)
インストールしたパッケージの確認
choco list --local-only
ここまででインストールしたパッケージはこれで確認できました。
GUIツール
GUIツールもあります。
choco install chocolateygui
これであとはアプリからChocolateyGUIを起動するだけです。
こういう雰囲気のアプリが立ち上がります
そういえば最近のWindowsはWinキーを押すとそのままアプリ名を入力出来てアプリが起動出来ていいっすね。
感想
Windowsにもhomebrewみたいなアプリがあるのはいいですね。 いちいちインストーラーを探さなくてもいいし、アップグレードも簡単そう。 Rubyもここから入れてみようかな。
少し心配なのは、install中にエラーが起こることがたまにあること。gitも一回目は失敗したけどもう一度チャレンジしたら成功しました。
SkypeやChromeのようなWindowsアプリもあるしgitのような開発向けのコマンドラインツールもあるので当面は使ってみようと思います。
Good!
Bash on Ubuntu on Windowsでrubyを使う
せっかくWindowsでbashが動くようになったのでその上でrubyが動くようにしてみました。 rbenvを使う方法と、apt-getでrubyとruby-switch使う方法を試しました。
単純にapt-getするだけも良いんですが、一応複数バージョンを管理できるようにという前提です。
下準備
必要なライブラリをインストールする
$ apt-get update $ sudo apt-get install -y git curl gcc make $ sudo apt-get install -y libssl-dev libreadline-dev zlib1g-dev bzip2
apt-get
はsudo
必要だったかな。すいません忘れちゃいました。
rbenvを使う方法
macを使っている人ならおなじみのrbenvを使う場合はrbenvのREADMEに則ってコマンドをたたいていきました。
$ cd ~/.rbenv && src/configure && make -C src $ ~/.rbenv/bin/rbenv init $ eval "$(rbenv init -)"
もし必要なコマンドが足りてなかったらapt-getでインストールしておけばいいと思います。
あとは.bashrc
に以下を追加しました
export PATH="$HOME/.rbenv/bin:$PATH" eval "$(rbenv init -)"
apt-get、ruby-switchを使う方法
これはJekyll on Bash on Ubuntu on Windows - daverupert.comを見て知った方法。
$ sudo apt-add-repository ppa:brightbox/ruby-ng $ sudo apt update $ sudo apt install ruby2.3 ruby2.3-dev ruby-switch
これでrubyが使えるように!
$ ruby -v ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux-gnu]
ruby-switchというものがあるのは全然知らなかったんですが、さっと使えるしとても楽。 rbenvだとインストール方法の都合上ライブラリが足りないと落ちたりするけど、apt-getは依存するライブラリを入れてくれるからいいっすね。
どっちがおすすめ?
ここまでやってrubyが動くようになったんですが、実はこの後Railsをインストールして実行するところがとても面倒でどっちもおすすめとは言えない状況かなと思ってます。
bundle install
がうまくいかず、一個一個のgemを手作業でインストールすることになってひたすら面倒だった。
とはいえどっちもrubyの実行には問題ないし、特にapt-getで入れちゃう方はシンプルだしとても楽でした。 インストールに時間はそれなりにかかったけど。
そもそもBash on Ubuntu on Windowsは多少クセがあるし知見もネットにたくさん転がっている訳でもないのでPowerShellとDocker for Windowsを駆使した方が環境を壊しにくいし楽なのではと思い始めてます。 今後はそっちの方法を試してみようかな。
Docker本も買ったので読んでます。
- 作者: Adrian Mouat,Sky株式会社玉川竜司
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/08/17
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
なにはともあれ簡単にbash立ち上げてなにか試したいくらいならBash on Ubuntu on Windowsは良さそうです
マシンはずっとMateBookを使ってます。
Huawei Matebook Gold Windows 10 8GB 256GB 12インチIPS液晶 Intel Core m5 プロセッサ 【日本正規代理店品】
- 出版社/メーカー: Huawei
- 発売日: 2016/07/15
- メディア: Personal Computers
- この商品を含むブログを見る
Small. Simple. Secure. のAlpine Linuxのdockerイメージを使う
小さいdockerのイメージが欲しい
dockerをポチポチ触ってみているんですが、imageが大きくなりがちで普段から潤沢とはいえない容量のマシンも使うので少しハラハラしながら使ってました。
しかしあくまでコンテナな訳だしなんとか小さいimageないのかなって見てたらAlpine Linuxのimageがいい具合っぽいということを知りました。
キャッチフレーズは"Small. Simple. Secure."らしい。 Docker Hubにもalpineのイメージがある。 しかもサイズが2MB!
Alpine Linuxはbusyboxという組み込み向けのLinux Distributionが元になっている。
busyboxはパッケージマネジメント機能もないんだが、Alpine Linuxはapk
というコマンドがあってパッケージマネジメント機能も提供してくれてる。
というわけで、僕のようなゆるいエンジニアには優しい作りなのもうれしい。
いい具合に優しさがある。
Rubyのimageでも最近のバージョンのものはalpine版があってimageのサイズが30数MBくらいになってるも最高だ。
すごい簡単に使ってみる
docker run -it alpine /bin/ash
alpineはデフォルトではbashがなくてashを使ってるのでashを使います。 機能はbashやzshに比べると少ないということだけど、まあdockerで使うくらいだったらそんなにシェルの機能は必要なさそうだし気にしない
ごくごく基本的なcat
, cp
, ls
などのコマンドは入ってるけどvi
などは入っていない。
せっかくapk
があるんだし入れてみよう。
まずはapk
と叩いてみて出来ることを確認。
/ # apk apk-tools 2.6.5, compiled for x86_64. usage: apk COMMAND [-h|--help] [-p|--root DIR] [-X|--repository REPO] [-q|--quiet] [-v|--verbose] [-i|--interactive] [-V|--version] [-f|--force] [-U|--update-cache] [--progress] [--progress-fd FD] [--no-progress] [--purge] [--allow-untrusted] [--wait TIME] [--keys-dir KEYSDIR] [--repositories-file REPOFILE] [--no-network] [--no-cache] [--arch ARCH] [--print-arch] [ARGS]... The following commands are available: add Add PACKAGEs to 'world' and install (or upgrade) them, while ensuring that all dependencies are met del Remove PACKAGEs from 'world' and uninstall them fix Repair package or upgrade it without modifying main dependencies update Update repository indexes from all remote repositories info Give detailed information about PACKAGEs or repositores search Search package by PATTERNs or by indexed dependencies upgrade Upgrade currently installed packages to match repositories cache Download missing PACKAGEs to cache and/or delete unneeded files from cache version Compare package versions (in installed database vs. available) or do tests on literal version strings index Create repository index file from FILEs fetch Download PACKAGEs from global repositories to a local directory audit Audit the directories for changes verify Verify package integrity and signature dot Generate graphviz graphs policy Show repository policy for packages stats Show statistics about repositories and installations Global options: -h, --help Show generic help or applet specific help -p, --root DIR Install packages to DIR -X, --repository REPO Use packages from REPO -q, --quiet Print less information -v, --verbose Print more information (can be doubled) -i, --interactive Ask confirmation for certain operations -V, --version Print program version and exit -f, --force Do what was asked even if it looks dangerous -U, --update-cache Update the repository cache --progress Show a progress bar --progress-fd FD Write progress to fd --no-progress Disable progress bar even for TTYs --purge Delete also modified configuration files (pkg removal) and uninstalled packages from cache (cache clean) --allow-untrusted Install packages with untrusted signature or no signature --wait TIME Wait for TIME seconds to get an exclusive repository lock before failing --keys-dir KEYSDIR Override directory of trusted keys --repositories-file REPOFILE Override repositories file --no-network Do not use network (cache is still used) --no-cache Read uncached index from network --arch ARCH Use architecture with --root --print-arch Print default arch and exit This apk has coffee making abilities.
どうやらapk add
を使うと良さそう。
/ # apk add vim WARNING: Ignoring APKINDEX.5a59b88b.tar.gz: No such file or directory WARNING: Ignoring APKINDEX.7c1f02d6.tar.gz: No such file or directory ERROR: unsatisfiable constraints: vim (missing): required by: world[vim]
ん?もしやupdateが必要か。
/ # apk update fetch http://dl-cdn.alpinelinux.org/alpine/v3.3/main/x86_64/APKINDEX.tar.gz fetch http://dl-cdn.alpinelinux.org/alpine/v3.3/community/x86_64/APKINDEX.tar.gz v3.3.3-122-gcf13b9e [http://dl-cdn.alpinelinux.org/alpine/v3.3/main] v3.3.3-74-g713311c [http://dl-cdn.alpinelinux.org/alpine/v3.3/community] OK: 5859 distinct packages available
お、packagesの情報を持ってきたぽい。 再チャレンジ
/ # apk add vim (1/5) Installing lua5.2-libs (5.2.4-r2) (2/5) Installing ncurses-terminfo-base (6.0-r6) (3/5) Installing ncurses-terminfo (6.0-r6) (4/5) Installing ncurses-libs (6.0-r6) (5/5) Installing vim (7.4.943-r3) Executing busybox-1.24.1-r7.trigger OK: 36 MiB in 16 packages
これでvim
が動かせるように!
ash
が気に食わない場合はzsh
もあるし、mysql-dev
やcurl
など各種開発時に必要になりがちなpackageもあるので困ることも少なそう。
simple, smallなのはとても伝わってきた。 (・∀・)イイネ!!
secureの部分はどこを見たら分かるんだろう (・・?
- 作者: Adrian Mouat,Sky株式会社玉川竜司
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/08/17
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
普段はMac使ってるけどWindows10を使いってみたくなった
Windows10を使ってみたくなった
最近のmicrosoftはAzureやCortana、Bash on Ubuntu on Windowsなどいろいろ頑張ってていいですよね。 Edgeもぼちぼち評判いいみたい。
というわけでWindows10を使ってみたくなりました。 こういうところが気になります
- 最近のWindowsってどんなものか知りたい
- macOSにはないタッチ操作をやってみたい
- Bash on Ubuntu on Windowsを使ってみたい
- Web系のプログラミングがどんな感じで出来るか知りたい(特にWindowsプログラミングがしたいわけではない)
MateBook買った
そういう訳で、仕事ではMacbookProを使っているし家にもメインのマシンはあるのでとりあえず遊べるマシンを探してみました。
最初はVaio Zを考えたんですが、何しろ高い。フリップモデルとか199,800円からでビビる。かっこいいけど
というところで見つけたのがHuaweiのMateBook。
Huawei Matebook Gold Windows 10 8GB 256GB 12インチIPS液晶 Intel Core m5 プロセッサ 【日本正規代理店品】
- 出版社/メーカー: Huawei
- 発売日: 2016/07/15
- メディア: Personal Computers
- この商品を含むブログを見る
いわゆるタブレット型のマシンで見た目は細かい違いこそあれiPadと大差なくて良くも悪くもさすがHuaweiといったところ。 すっきりかっこいいし、メモリ8GBモデルもあるし(本当は16GBほしい気もするけど)とりあえず遊んでみる分には楽しそうだったので買ってみました。 値段は10万超えるけど見た目や12インチのタブレットでWindowsという面白そうさに負けてしまった。
Huawei 純正 Matebook用 Portfolio Keyboard ブラウン 5点マルチタッチ対応トラックパッド 防滴 02452066 【日本正規代理店品】
- 出版社/メーカー: Huawei
- 発売日: 2016/07/15
- メディア: Personal Computers
- この商品を含むブログを見る
カバー型のキーボードもすっきりしててとても良いので買ってしまいました。
MateBookのいいところ
MateBookは12型のタブレットで8GBのメモリ、USB typeCでの充電、指紋認証が付いているのが高ポイント。 指紋は認証スピード速いし、パスワードを打つ必要がなくなるので本当にうれしい。macでもタッチUIや指紋認証を導入してほしい! iOSだとプログラミングは困難だけど、Windowsだとポチポチプログラミングも出来るというのがありがたい。最高だ CPUはIntel Core m5でまあ悪くはないかな。
MateBookの微妙なところ
タッチパッドはカーソルを少しだけ左に移動させたいみたいな場面でなかなかうまく移動できなかったりするんだけどそれは慣れの問題なのか、OSの問題なのか、ハードの問題なのかまだよくわからない。
スリープモードもカバーを閉めたら入ったり入らなかったりで挙動が分からないこともある。
Windows10
昔のWindowsXPの記憶が強い自分からするとWindows10はすっきりこなれてて、色々ユーティリティ的なソフトウェアをインストールしなくてもすいすい使える。
例えばWindowsキーをたたくとこういう画面が立ち上がって起動させたいアプリの名前を入れると候補が出てきてあとはEnterで立ち上がる
タッチパネル
タッチパネルはそれなりに使えるけどまだ画面に触るという習慣が付いていないからかまだあまりわからない。
なんか記事を読んでるときはスクロールやリンクをたどるのにとても便利。
タブレットモード
これが微妙というかなんというか。。 デスクトップモードとの違いはアプリが全画面になるくらいでタッチ操作に特化した操作感もあまりなく、タブレットモードは使わずにタッチができるノートブックとして使ってたほうが良さげ。
Windowsにデフォルトで入っているアプリ
あとはマネーとか天気とかニュースとかアプリに統合されたアプリがあってその辺りは見てて面白い。
マネーは株価をチェックしたりできる。
でもその辺のアプリはタッチパッドのジェスチャーが効かないことも多い。統合が徹底されていないかも。
スクリーンショットなどはOneDriveに統合されてて使いやすい。さすが。
edge
edgeは結構気にせず普通に使える。初期の画面レンダリングに多少時間がかかることがあるかもってくらい。 ただ、拡張機能などはまだ全然ないからその辺は期待できない。
OneNoteは統合されてて使いやすそう。OneNote使ってたら良いかも
当面はedgeを使ってみて困ったらChromeを使おうと思う
その他アプリ
StoreなどWindowsなので結構アプリはある。 でもSlackなど時々フォントが荒いアプリがあってその辺は昔のWindowsを思い出したりした。
あと、macのアプリと比べると挙動が粗いものも多い感じがする。
以上
とにかく概ね満足してて、このくらいのスペックのマシンをとりあえず買ってみたのは良かった気がしてます。
まだタブレットとしては粗いけどmacとは違う文化圏に触れてみて意外と使えるものだなという感想。 あたりまえだけどWindowsXPとは隔世の感がある。 そう言えば日本語変換もそんなに違和感ない。
今度は開発周りのことを色々試してみようと思います
rustでデバッグ
rust-lldb
例えばopen_fileというプログラムを作っていたら、rust-lldbが使える。
rust-lldb ./target/debug/open_file
コマンド入力待ちになるのでここでコマンドを打つ。
(lldb) command source -s 0 '/tmp/rust-lldb-commands.ezgyPg' Executing commands in '/tmp/rust-lldb-commands.ezgyPg'. (lldb) command script import "/Users/byoma/.multirust/toolchains/stable-x86_64-apple-darwin/lib/rustlib/etc/lldb_rust_formatters.py" (lldb) type summary add --no-value --python-function lldb_rust_formatters.print_val -x ".*" --category Rust (lldb) type category enable Rust (lldb) target create "./target/debug/open_file" Current executable set to './target/debug/open_file' (x86_64). (lldb)
help
コマンドでコマンドのリストなど使い方が分かる。
breakpointを張る
関数名でbreakpoitを張れる
(lldb) breakpoint set --name read_file
breakpointまで実行
(lldb) run
stepでいわゆるstep in nextでstep overになる
変数の中身を確認
frameコマンドで現在のthreadに対してコマンドが実行出来るっぽい。 frameはfrで略せる。
(lldb) fr v path
これでpathの変数になにが入っているか分かる。
というわけで
これで簡単なdebugは出来そう。あとはprintln!
などで単純に出力するのもよさそう。
よくわからないこと
- lldbがどんな仕組みか分からない