tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

【go】goenvとdirenvとGo Modulesとで新しいgo環境をつくる

はじめに

Golang環境は、職場でも数年利用していました。 Macが新しくなった + 日に日に新しくなっているのでこれを機にlocal環境を作りなおしてみるメモです。

アジェンダ

  1. 今回の構成
  2. goenvでgoいれる
  3. direnvでlocal設定する
  4. go modでpackage管理する
  5. 実行してみる

1. 今回の構成

場所はどこでも良いのですが、
以下にsampleをおくと仮定して進めます。

$ cd $HOME/sample

$ pwd
$HOME/sample

2. goenvでgoいれる

goenvは、go言語のバージョンを管理するものです。
rbenvやnodebrewを使ってる人には名前を見たらすぐわかりますね!

goenvのinstall

$ go version
go version go1.12.4 darwin/amd64

$ brew install goenv

$ goenv versions
* system (set by /Users/tweeeety/.goenv/version)

goenvの設定

$ vim ~/.bashrc
-- 追記 --
# for goenv
export GOENV_ROOT="$HOME/.goenv"
export PATH="$GOENV_ROOT/bin:$PATH"
eval "$(goenv init -)"
----------

goenvでgoの任意のversionをインストール

$ goenv install --list
Available versions:
 1.2.2
 1.3.0
 ~ 省略 ~ 
 1.11.3
 1.11.4
 1.12beta1

$ goenv install 1.11.4
Downloading go1.11.4.darwin-amd64.tar.gz...
-> https://dl.google.com/go/go1.11.4.darwin-amd64.tar.gz
Installing Go Darwin 64bit 1.11.4...
Installed Go Darwin 64bit 1.11.4 to /Users/tweeeety/.goenv/versions/1.11.4

# $HOME/sample配下を1.11.4にする
$ goenv local 1.11.4

$ ls -al
total 8
drwxr-xr-x  3 tweeeety  tweeeety   96  6 23 02:47 .
drwxr-xr-x  6 tweeeety  tweeeety  192  6 23 02:46 ..
-rw-r--r--  1 tweeeety  tweeeety    7  6 23 02:47 .go-version

$ cat .go-version
1.11.4

2. direnvでlocal設定する

direnvのinstall

direnvのinstallは以下をご参考ください

direnvの設定

$ pwd
$HOME/sample

$ direnv edit .
-- vi追記 --
export GO111MODULE=on
export GOPATH=$PWD/go
------------

# 念の為
$ direnv allow

3. go modでpackage管理する

package管理には
これまでglideやらdepやらがいましたが、
これからはGo Modulesらしいので使ってみます。

go mod initでgo.modを作る

go 1.12からはデフォルトだけど、
go 1.11ではexport GO111MODULE=onとすることで使用できるようです。

今回は、上記のdirenvにて、
特定のdirに対してはexportするように設定したものですね。

go mod init helloを打つと、
go.modというファイルができます。

$ go mod init hello
go: creating new go.mod: module hello

hello.goを作る

rsc.io/quoteは、 Go Modulesの説明のために作られたパッケージのようなのでそれを使います。

package main

import (
    "fmt"

    "rsc.io/quote"
)

func main() {
    fmt.Println(quote.Hello())
}

go buildでpackageのinstallも行う

go buildを打つと利用しているpackageをinstallまでしてくれます。

$ go build
go: finding rsc.io/quote v1.5.2
go: downloading rsc.io/quote v1.5.2
go: extracting rsc.io/quote v1.5.2
go: finding rsc.io/sampler v1.3.0
go: finding golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
go: downloading rsc.io/sampler v1.3.0
go: extracting rsc.io/sampler v1.3.0
go: downloading golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
go: extracting golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c

$ cat go.mod
module hello

go 1.12

require rsc.io/quote v1.5.2

また、この時点で以下のような構成になっています

$ pws
$HOME/sample

$ tree . -L 4
.
├── go
│   └── pkg
│       └── mod
│           ├── cache
│           ├── golang.org
│           └── rsc.io
├── go.mod
├── go.sum
├── hello
└── hello.go

6 directories, 4 files

4. 実行してみる

$ go run hello
こんにちは世界。

無事、実行できました!

おわり

Go Modules便利\(^o^)/

【node】pyenvでpython3使ってたらnpm install sleep --save-devで`gyp ERR! configure error`と怒られたメモ

はじめに

nodeのネタではあるんですが、
pythonでエラーというパターン

悲しみ...

なにがやりたいか

nodeでsleepが使いたかっただけです。
つまり以下が実行したかっただけです

$ npm install sleep --save-dev

どんなエラーか

$ npm install sleep --save-dev

> sleep@6.1.0 install /Users/tweeeety/sample/node_modules/sleep
> node-gyp rebuild

gyp ERR! configure error
gyp ERR! stack Error: Command failed: /Users/tweeeety/.pyenv/shims/python -c import sys; print "%s.%s.%s" % sys.version_info[:3];

~ 省略 ~ 

原因

原因はpython3系なことが原因のようです。

ちょっと前にわけあって
たしかにpyenvでpython3にしていた...

$ python --version
Python 3.7.2

$ pyenv versions
  system
* 3.7.2 (set by /Users/tweeeety/.pyenv/version)

どう対応するか

ここまで書いていると言わずもがなですが、
pyenvでsystem pythonに戻してからnpm installしなおします

$ pyenv global system
$ pyenv versions
* system (set by /Users/tweeeety/.pyenv/version)
  3.7.2

$ npm install sleep --save-dev

> sleep@6.1.0 install /Users/tweeeety/sample/node_modules/sleep
> node-gyp rebuild

  CXX(target) Release/obj.target/node_sleep/module_init.o
  CXX(target) Release/obj.target/node_sleep/sleep_cpp11.o
  CXX(target) Release/obj.target/node_sleep/sleep_posix.o
  CXX(target) Release/obj.target/node_sleep/sleep_win.o
  SOLINK_MODULE(target) Release/node_sleep.node
npm WARN search_repository@1.0.0 No description
npm WARN search_repository@1.0.0 No repository field.

+ sleep@6.1.0
added 1 package from 1 contributor and audited 65 packages in 4.001s
found 0 vulnerabilities

おわり

pythonでnpmがエラーになるみたいな感じだと
最初はめっちゃわかりにくい...

pyenv localの方で設定すれば良かった説もありますが><

【perl】gzipを読み込むメモ - Compress::Raw::Zlib

はじめに

perlを触っていて、
gzipなデータを読み込みたかったのでそのメモです

なにがやりたいか

APIのresponseデータなど、内部データとしてgzipデータを読み込みたかったのです。

gzipのファイルを読むという記事はぐぐれば結構あるのですが、
内部データっていうところがミソですね。

どうやるか

Compress::Raw::Zlibというcpanモジュールで簡単にできました。

$gzip_dataがgzipなデータだったとするとこんな感じです。

use Compress::Raw::Zlib;

my ($d, $status) = new Compress::Raw::Zlib::Inflate(
  -WindowBits => WANT_GZIP,
);
my $output;
$status = $d->inflate($gzip_data, $output);

サンプルコード

参考にサンプルコードを載せました

おわり

Compress::Raw::Zlibなかなか便利です \(^o^)/

【bash】コマンドラインやシェルスクリプトでディレクトリ名を取得する

はじめに

コマンドラインやシェルスクリプトにて、
ディレクトリ名だけを取得したいときありますよね。

すごい簡単なのですが忘れがちなのでメモ

どうやるか

basename $(pwd)

以上ですw

$ pwd
/Users/tweeeety

$ basename $(pwd)
tweeeety

おわり

わすれがちーー\(^o^)/

【perl】`Wide character in xxxxx」`エラーが出るメモ

はじめに

久しぶりにperlを触っていて、
とある処理を行うときに
Wide character in gzwrite at output-sample.pl line 20.
のように怒られたのでメモ。

エラー

やろうとしていたこと

やろうとしていたのはこれだけ

  • プログラム内で適当な文字列を定義
  • それをgzip形式でファイルを書き出す
use utf8;

# 省略

# 怒られる処理
$fh->gzwrite($text);
実行時エラー

ただ単にperlを実行するだけで怒られる。

$ plenv exec perl output-sample.pl
Wide character in gzwrite at output-sample.pl line 20

どうするか

対応は簡単で、内部文字列にutf8 encodeをすれば大丈夫です

use utf8;
use Encode;

# 省略

$text = encode('utf-8', $text);

# 怒られる処理
# -> 怒られなくなる
$fh->gzwrite($text);

おわり

あいかわらずperlは文字コード関連はよく何か起こるなー\(^o^)/

【make】Errorが出ても無視する`-@`のメモ

はじめに

久しぶりにmakefileを書いていて
失敗したときに無視するのどうやるんだっけなーとなったのでメモ

エラー

makefile

hoge.shというのがあり、中身がエラーだとする

hoge:
   @./hoge.sh
実行
# errorが出る
$ make hoge
make: *** [hoge] Error 255

どうするか

実行を表す@-をつけることで無視できるようです!

makefile

@->-@とする

hoge:
   -@./hoge.sh
実行
# errorだがignoredされる
$ make hoge
make: [hoge] Error 255 (ignored)

参考

おわり

参考サイトさんthxです\(^o^)/

【perl】plenvで"Segmentation fault: 11"とエラーが出る対処メモ

はじめに

久しぶりにperlを触りたい機会があったので、
以下を元にplenvをinstallしていました。

途中でSegmentation fault: 11というエラーが出たのでメモ

エラー

# versionは出る
$ plenv --version
plenv 2.2.0

# install -lはエラー
$ plenv install -l
Segmentation fault: 11

どうするか

perl buildbrew install perl-buildでinstallしていましたが、
tokuhiromさんところから持ってきて入れると良さそうです。

# install -lがエラー
$ plenv install -l
Segmentation fault: 11

# pluginsディレクトリがないことを確認
$ ls -al ~/.plenv/
total 0
drwxr-xr-x   4 tweeeety  tweeeety   128  5  5 00:10 .
drwxr-xr-x+ 52 tweeeety  tweeeety  1664  5  5 00:04 ..
drwxr-xr-x   2 tweeeety  tweeeety    64  5  4 22:28 shims
drwxr-xr-x   2 tweeeety  tweeeety    64  5  4 22:28 versions

# download
$ git clone git://github.com/tokuhirom/Perl-Build.git $(plenv root)/plugins/perl-build/

# pluginsにはいる
$ ls -al ~/.plenv/
total 0
drwxr-xr-x   4 tweeeety  tweeeety   128  5  5 00:10 .
drwxr-xr-x+ 52 tweeeety  tweeeety  1664  5  5 00:04 ..
drwxr-xr-x   3 tweeeety  tweeeety    96  5  5 00:12 plugins
drwxr-xr-x   2 tweeeety  tweeeety    64  5  4 22:28 shims
drwxr-xr-x   2 tweeeety  tweeeety    64  5  4 22:28 versions

# install -lが正常にうごく
$ plenv install -l
Available versions:
 5.29.10
 5.29.9
 ~ 省略 ~
 5.6.0
 5.5.670
 5.003_13

おわり

ひさしぶりのperl\(^o^)/