tweeeetyのぶろぐ的めも

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

【git】submocule updateでfailed & 毎回パスワード聞かれる問題

はじめに

とあるrepositoryにsubmoduleを複数使っていて、
git submodule updateをしたかったのですが
以下の2つで困ったのでメモ

  • 毎回パスワードを聞かれる
  • ID/pass入力でfatal: Authentication failedしてしまう

アジェンダ

  1. 起こったこと
  2. 対応したこと

1. 起こったこと

冒頭に記載したまんまですが、

  • 毎回パスワードを聞かれる
  • ID/pass入力でfatal: Authentication failedしてしまう

が起こっていました。

このときの状態

このときの状態は以下のようになっていました。

$ vim .gitmodules
-- vi --
[submodule "template/a"]
  path = template/a
  url = https://github.com/hoge/template-a.git
[submodule "template/b"]
  path = template/b
  url = https://github.com/hoge/template-b.git
[submodule "template/c"]
  path = template/c
  url = https://github.com/hoge/template-c.git
--------

実行したとき

3回ID/passが聞かれた上にfailedしました。

$ git submodule update
Cloning into '/Users/tweeeety/github/any-repos/template/a'...
Username for 'https://github.com': tweeeety
Password for 'https://tweeeety@github.com':
remote: Invalid username or password.
fatal: Authentication failed for 'https://github.com/hoge/template-a.git/'
fatal: clone of 'https://github.com/hoge/template-a.git' into submodule path '/users/tweeeety/github/mercari/any-repos/template/a' failed
failed to clone 'template/a'. Retry scheduled
Cloning into '/Users/tweeeety/github/mercari/any-repos/template/a'...

~ 省略 ~

2. 対応したこと

対応としては.gitmodulesのurl指定をhttps指定からssh指定に変えました。

こんな感じですね

$ git diff .gitmodules

--- a/.gitmodules
+++ b/.gitmodules

 [submodule "template/a"]
        path = template/a
-       url = https://github.com/hoge/template-a.git
+       url = git@github.com:hoge/template-a.git
 [submodule "template/b"]
        path = template/b
-       url = https://github.com/hoge/template-b.git
+       url = git@github.com:hoge/template-b.git
 [submodule "template/c"]
        path = template/c
-       url = https://github.com/hoge/template-c.git
+       url = git@github.com:hoge/template-c.git

.git/config 内のsubmoduleの向き先は
この時点では変わらないので以下を実行します

$ git submodule sync

で、実行してみるとうまくいきましたとさ

$ git submodule update
Cloning into '/Users/tweeeety/github/any-repos/template/a'...
Cloning into '/Users/tweeeety/github/any-repos/template/b'...
Cloning into '/Users/tweeeety/github/any-repos/template/c'...
Submodule path 'template/a': checked out 'xxxxxxxxxxae935311265746382d1b54b4e2ab0f'
Submodule path 'template/b': checked out 'xxxxxxxxxx2b91a43b8a318f491348aa62b5306f'
Submodule path 'template/c': checked out 'xxxxxxxxxxa378276a71869ef3a63cdb3bb7b2c9'

おわり

httpsだとなんでダメなんや...
というところはあやふやにしてしまいましたが、
一旦次行きたいのでメモのみで!!\(^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^)/