Rails5 インストール時にeventmachineでハマる

  • 2015.12.25

Rails5 beta1が出たので試してみようと思い、インストール時に一箇所ハマりかけたので記録として残しておきます。

環境

ruby 2.2.4
bundler 1.11.2
Rails 5.0.0.beta1

あとは

% gem install rails --pre

でインストールを実行。この際にgemのエラーでインストールエラーになる。

ハマり方

ログ見れなくなっちゃったので忘れましたが eventmachineopenssl.h を読めませんよ的なエラー。

解決方法

eventmachine インストール時にコケるのでオプションつけてインストール

% gem install eventmachine -- --with-cppflags=-I/usr/local/opt/openssl/include

eventmachineのissueにもあがってました

これで再度Railsのインストールを実行

% gem install rails --pre

これで無事にインストールできました。

Android2系でインストール時にINSTALL_FAILED_DEXOPTエラー

  • 2015.11.27

お久しぶりです。Goエンジニアやってたと思ったら今ではAndroidエンジニアやってる今日このごろです。

Android2系でこんな感じのエラーに遭遇してしまい、メソッド数を減らさなくてはいけないため対処した内容をメモっておきます。

どうもgradleで com.google.android.gms:play-services を読み込んでいると、ほとんど使ってない余計なものがたくさんあるようで、なんと 18513 もメソッドがあるようです。

dependencies {
  compile 'com.google.android.gms:play-services:6.5.+'
}

なので、これを

dependencies {
  compile 'com.google.android.gms:play-services-base:6.5.87'
  compile 'com.google.android.gms:play-services-identity:6.5.87'
}

こんな感じに必要なものだけをcompileするようにします。これでメソッド数がかなり減らせるのと、ビルド時間もかなり短縮できます。

さらに詳しくはこちらをみてみてください。

GoでJSONを返す

  • 2015.07.28

仕事でGoでAPI開発やってるのですが、JSON書き出しのところメモっておきます。

基本的なJSONの書き出し方

structでオブジェクトを定義してjson化します。

package main

import (
    "encoding/json"
    "fmt"
)

type Object struct {
    Name  string `json:"name"`
    Value string `json:"value"`
    Memo  string `json:"memo"`
}

func main() {

    o := Object{Name: "unko", Value: "ばりゅー", Memo: "めもめもー"}

    response, _ := json.Marshal(o)
    fmt.Println(string(response))
}

こんな感じのコードだと

{
  "name":"unko",
  "value":"ばりゅー",
  "memo":"めもめもー"
}

こんな感じのJSONとして書き出されます。とてもシンプルです。

書き出したくないプロパティがある場合

structの中で書き出したくないパラメータがあります。 この場合はアノテーションを使って - を与えます。

package main

import (
    "encoding/json"
    "fmt"
)

type Object struct {
    Name  string `json:"name"`
    Value string `json:"value"`
    Memo  string `json:"-"`
}

func main() {

    o := Object{Name: "unko", Value: "ばりゅー", Memo: "ここは表示されないよー"}

    response, _ := json.Marshal(o)
    fmt.Println(string(response))
}

で、こんな感じにo.Memoは表示されなくなります。

{
  "name":"unko",
  "value":"ばりゅー"
}

GoはJSONの扱いがとても簡単なのでした。

ようやくモバイルフレンドリー化した

  • 2015.07.26

ひろぽっぽれすがやっとモバイルフレンドリーになりました。

何が悪かったかっていうと、画像がスマフォで見た時にどうやらはみ出しまくるサイズになっていたようで。

サクッと

.article {
  img {
    max-width: 100%;
  }
}

にしてやりましたよ。

ドヤァ

夏暑いです。

美人時計のgemつくった

  • 2015.03.25

Hello, world. funnythingzです。めんどくさすぎてブログを放置していました。明日から本気出す。

プルリクにLGTMするときに美人時計を表示したいなと思ったのでなんとなくbijintというgemをつくってみました。けっこう適当です。

Chromeエクステンションとかまではつくるのがめんどくさかったのでとりあえずコマンドベースで美人時計の画像パスのマークダウンとか生成してくれます。あまり難しいことはしていません。

bijintをインストールする

$ gem install bijint

とっても簡単インストールです。

使い方

一番シンプルなコマンドです。今の時間の画像パスを生成します。

$ bijint
http://www.bijint.com/assets/pict/tokyo/pc/0039.jpg

ランダムな時間の画像パスを生成します。

$ bijint random
http://www.bijint.com/assets/pict/tokyo/pc/1530.jpg

今の時間の画像パスをマークダウン形式で生成してくれます。

$ bijint md
[![bijint](http://www.bijint.com/assets/pict/tokyo/pc/0043.jpg)](http://www.bijint.com/assets/pict/tokyo/pc/0043.jpg)

ランダムな時間のマークダウン形式の画像パスを生成してくれます。

$ bijint md_random
[![bijint](http://www.bijint.com/assets/pict/tokyo/pc/1407.jpg)](http://www.bijint.com/assets/pict/tokyo/pc/1407.jpg)

pbcopy と組み合わせて使うとクリップボードにコピーしてくれるので貼り付けも簡単です。

$ bijint | pbcopy

それでは良き美人時計ライフを!

GolangでTruncateできるsunnydayというパッケージをつくった

  • 2015.02.14

こんにちは、funnythingzです。GoでTruncateがありそうでなかったのでつくってみました。超シンプルです。

github.com/funnythingz/sunnyday

使い方は超簡単です。

まず go get します。

% go get github.com/funnythingz/sunnyday

importして sunnyday.Truncate をこんな感じで呼び出します。

package main

import(
    "fmt"
    "github.com/funnythingz/sunnyday"
)

func main() {
    fmt.Println(sunnyday.Truncate("うんこっこたのしいお!", 5))
}
うんこっこ…

超シンプルです。簡単です。

... をカスタムするには第3引数にカスタム用のstringを渡すだけです。

fmt.Println(sunnyday.Truncate("うんこっこたのしいお!", 5, "...more"))
うんこっこ...more

超カンタンです。難しいことはなにひとつありません。

こんな感じであると地味に便利なTruncateです。ぜひ使ってみてください。

goqueryでHTMLをパースする

  • 2015.02.05

HTMLのパースをするならgoquery!goquery便利すぎて泣いた。 jQueryっぽく使えて良いです。

まずはgoqueryを入れましょう。

% go get github.com/PuerkitoBio/goquery

HTMLをパースする

それではパースしてみましょう。 HTMLのパースのやり方はいくつかあります。

URLから直接パースする

doc, _ := goquery.NewDocument("http://yahoo.co.jp")

文字列をパースする

html := `<h1 class="heading">見出し</h1>`
r := strings.NewReader(html)
doc, _ := goquery.NewDocumentFromReader(r)

パースしたHTMLから要素を取り出す

goqueryでパースしたHTMLから要素を取り出してみましょう

doc.Find(".heading").Text()  //=> 見出し

こんな感じでとっても簡単です。

goqueryのひと通りの操作のテストを書く

goqueryのテストをざっくり書いてみるとこうなります。

package main

import (
    "github.com/PuerkitoBio/goquery"
    "strings"
    "testing"
)

func TestParseHtml(t *testing.T) {
    html := `
<section>
<h1 class="heading">うんこっこ</h1>
<p class="lead">なんかにおうってばよ</p>
</section>
`
    r := strings.NewReader(html)
    doc, _ := goquery.NewDocumentFromReader(r)

    docHeading := doc.Find(".heading").Text()
    heading := "うんこっこ"

    if docHeading != heading {
        t.Errorf("got %v want %v", docHeading, heading)
    }

    docLead := doc.Find(".lead").Text()
    lead := "なんかにおうってばよ"

    if docLead != lead {
        t.Errorf("got %v want %v", docLead, lead)
    }
}

goのテスト実行コマンドで実行してみましょう。

% go test -v
=== RUN TestParseHtml
--- PASS: TestParseHtml (0.00s)
PASS
ok

こんな感じで動けばテスト完了です。 今回のテストコードはGitHubにもあげました。

テスト、だいじだよ、テスト。

インストールしたGoパッケージを最新にする

  • 2015.02.04

go get でインストールしたパッケージたちを一気にアップグレードする。

% cd $GOPATH
% go clean -i ./...
% go install ...

これでいけた!

Golangでbluemondayを使ってhtml_safeなsanitizeをする

  • 2015.01.25

ここ数年ブログを書くのが億劫すぎていたのでまさかの1日2連続エントリーです。2015年はブログもちゃんと書くぞ!

GolangでBlackfridayを使ってMarkdownをHTMLに変換する

上記記事でも軽くふれたのですが、sanitizerのmicrocosm-cc/bluemondayも便利なので(名前が鬱になるけど)使ってみました。

html

hoge.html

<h1>hoge</h1>
<p>hogehoge</p>
<script>alert(1);</script>
<style>body {font-size: 100px;}</style>
<footer>&copy; funnythingz</footer>

Go

demo.go

package main

import (
    "fmt"
    "github.com/microcosm-cc/bluemonday"
    "io/ioutil"
)

func check(e error) {
    if e != nil {
        panic(e)
    }
}

func main() {
    html, err := ioutil.ReadFile("hoge.html")
    check(err)

    p := bluemonday.UGCPolicy()
    fmt.Println(p.Sanitize(string([]byte(html))))
}

出力結果

% go run demo.go

で実行すると

<h1>hoge</h1>
<p>hogehoge</p>


© funnythingz

となってhtml_safeな感じで出力されます。ちなみにbluemondayのポリシーで許可されているタグは下記になります。

article, aside, figure, section, summary, h1~h6, hgroup, br, div, hr, p, span, wbr, abbr, acronym, cite, code, dfn, em, figcaption, mark, s, samp, strong, sub, sup, var, b, i, pre, small, strike, tt, u, rp, rt, ruby

詳細はbluemondayのコードをみてみてください。

こんな感じでblackfridayとbluemondayを組み合わせて使うといろいろできそうですね!

GolangでBlackfridayを使ってMarkdownをHTMLに変換する

  • 2015.01.25

Rails大好きfunnythingzです。TypeScriptよりもRails書いてます。

Railsに慣れすぎてしまうと他のことができなくなってやばいと思い2015年はGolangに力を入れていこうと思っています。Go界隈の流れの早さについていけていません。

それはさておきGoでMarkdownをHTMLにしたいなと思いGitHubをいろいろ探していたらrussross/blackfridayというものを見つけました。名前が中二感ハンパなくてカッコイイです。sanitizerのmicrocosm-cc/bluemondayというものもあります。名前カッコイイわー。

とりあえず使い方は簡単なのでコード書いておきます。

markdown

hoge.md

# hoge

hogehoge

- hoge
- hoge

## hoge

Go

demo.go

package main

import (
    "fmt"
    "github.com/russross/blackfriday"
    "io/ioutil"
)

func check(e error) {
    if e != nil {
        panic(e)
    }
}

func main() {
    md, err := ioutil.ReadFile("hoge.md")
    check(err)
    output := blackfriday.MarkdownCommon([]byte(md))
    fmt.Println(string(output))
}

出力結果

% go run demo.go

で実行すると

<h1>hoge</h1>

<p>hogehoge</p>

<ul>
<li>hoge</li>
<li>hoge</li>
</ul>

<h2>hoge</h2>

となります。簡単!