ludwig125のブログ

頑張りすぎずに頑張る父

vmwareで「パワーオン中にエラーが発生しました」が出た(Windows10)

起きたこと

Windows10 で、 VMware Playerで以下のエラーが発生して起動しない

パワーオン中にエラーが発生しました:Transport(VMDB)error -44 Message. The VMware Authorization Service is not running.

f:id:ludwig125:20190303074339p:plain
vmware

やったこと

Windows10の場合、左下のWindowsボタンから「PC」を検索 f:id:ludwig125:20190303074543p:plain

PCを右クリックして「管理」を開く f:id:ludwig125:20190303074844p:plain

「サービスとアプリケーション」を選択 f:id:ludwig125:20190303074952p:plain

「サービス」を選択 f:id:ludwig125:20190303075054p:plain

VMware Authorization Service」をダブルクリック f:id:ludwig125:20190303080041p:plain

「サービスの状態」の「開始」をクリック f:id:ludwig125:20190303075323p:plain

OKを押して閉じると「VMware Authorization Service」が「実行中」になっていることが確認できる f:id:ludwig125:20190303080227p:plain

go言語で呼び出す関数を動的に変更する

package main

import (
    "fmt"
)

func main() {

    funcList := []func(){function1, function2, function3}

    for i:=0; i < 3; i++{
    funcList[i]()
    }
}

func function1() {
    fmt.Println("print function1")
}

func function2() {
    fmt.Println("print function2")
}

func function3() {
    fmt.Println("print function3")
}

実行結果

print function1
print function2
print function3

実行例 https://play.golang.org/p/MQnTJWIu7P1

参考にしたページ C# - 関数名call1, call2, call3...の連続実行をまとめる方法はありますか?|teratail

応用

上のを応用して自前のretry関数の挙動を確かめたもの

スプレッドシートへの書き込みを3回失敗するまでretryする関数を作りたかった

https://play.golang.org/p/HV0uqiVphap

以下は、3回失敗するまでretryをする関数とその実行例

  • test1は、3回とも失敗するのでinsertedは0
  • test1は、3回目で成功するのでinsertedは10
package main

import (
    "errors"
    "fmt"
    "time"
)

type Resp struct {
    status int
}

func main() {

    target, inserted := retry([]func()(Resp, error){returnStatus1, returnStatus2, returnStatus3})
    fmt.Printf("test1. target %d, inserted: %d", target, inserted)
    
    fmt.Printf("\n----------------------\n")
    
    target, inserted = retry([]func()(Resp, error){returnStatus1, returnStatus2, returnStatus4})
    fmt.Printf("test2. target %d, inserted: %d", target, inserted)
}

func retry(returnStatusList []func()(Resp, error)) (int, int) {
    target_num := 10
    fmt.Printf("insert target num: %v\n", target_num)

    var MaxRetries = 3

    for attempt := 0; attempt < MaxRetries; attempt++ {
        resp, err := returnStatusList[attempt]()
        if err != nil {
            fmt.Printf("Unable to write value. %v. attempt: %d\n", err, attempt+1)
            time.Sleep(3 * time.Second) // 3秒待つ
            continue
        }
        status := resp.status
        if status != 200 {
            fmt.Printf("HTTPstatus error. %v. attempt: %d\n", status, attempt+1)
            time.Sleep(3 * time.Second) // 3秒待つ
            continue
        }

        // 書き込み対象の件数と成功した件数
        fmt.Printf("succeded to write value.\n")
        return target_num, target_num
    }
    fmt.Printf("Failed to write data to sheet. reached to MaxRetries: %d\n", MaxRetries )
    // 書き込み対象の件数と成功した件数
    return target_num, 0
}

func returnStatus1() (Resp, error) {
    resp := Resp{}
    resp.status = 200
    err := errors.New("error! happend")
    return resp, err
}

func returnStatus2() (Resp, error) {
    resp := Resp{}
    resp.status = 404
    return resp, nil
}

func returnStatus3() (Resp, error) {
    resp := Resp{}
    resp.status = 201
    return resp, nil
}

func returnStatus4() (Resp, error) {
    resp := Resp{}
    resp.status = 200
    return resp, nil
}

結果

insert target num: 10
Unable to write value. error! happend. attempt: 1
HTTPstatus error. 404. attempt: 2
HTTPstatus error. 201. attempt: 3
Failed to write data to sheet. reached to MaxRetries: 3
test1. target 10, inserted: 0
----------------------
insert target num: 10
Unable to write value. error! happend. attempt: 1
HTTPstatus error. 404. attempt: 2
succeded to write value.
test2. target 10, inserted: 10

少し書き換え

上のはretryの中で回数を指定しているのが気に食わなかったのでちょっと修正。 getReturnStatusというラップ関数を用意

https://play.golang.org/p/hQK-TunSAWE

package main

import (
    "errors"
    "fmt"
    "time"
)

type Resp struct {
    status int
}

func main() {

    target, inserted := retry()
    fmt.Printf("test1. target %d, inserted: %d", target, inserted)
}

func retry() (int, int) {
    target_num := 10
    fmt.Printf("insert target num: %v\n", target_num)

    var MaxRetries = 3

    for attempt := 0; attempt < MaxRetries; attempt++ {
        resp, err := getReturnStatus()
        if err != nil {
            fmt.Printf("Unable to write value. %v. attempt: %d\n", err, attempt+1)
            time.Sleep(3 * time.Second) // 3秒待つ
            continue
        }
        status := resp.status
        if status != 200 {
            fmt.Printf("HTTPstatus error. %v. attempt: %d\n", status, attempt+1)
            time.Sleep(3 * time.Second) // 3秒待つ
            continue
        }

        // 書き込み対象の件数と成功した件数
        fmt.Printf("succeded to write value.\n")
        return target_num, target_num
    }
    fmt.Printf("Failed to write data to sheet. reached to MaxRetries: %d\n", MaxRetries )
    // 書き込み対象の件数と成功した件数
    return target_num, 0
}

var count = 0

func getReturnStatus() (Resp, error) {
    funcList := []func()(Resp, error){returnStatus1, returnStatus2, returnStatus3}
    count++
    return funcList[count-1]()
}

func returnStatus1() (Resp, error) {
    resp := Resp{}
    resp.status = 200
    err := errors.New("error! happend")
    return resp, err
}

func returnStatus2() (Resp, error) {
    resp := Resp{}
    resp.status = 404
    return resp, nil
}

func returnStatus3() (Resp, error) {
    resp := Resp{}
    resp.status = 201
    return resp, nil
}

func returnStatus4() (Resp, error) {
    resp := Resp{}
    resp.status = 200
    return resp, nil
}

GoogleAppEngine(GAE)メモ

Tips

githubに上げたくない環境変数をどうやって管理するか

githubに上げたくない環境変数をどうやって管理するか

以下を参考に、別のyamlをincludesして、秘密にしたいinclude先のファイルは.gitignoreに入れてgithubには上げないようにする

app.yaml リファレンス  |  Python の App Engine スタンダード環境  |  Google Cloud

こんな感じ app.yamlの中身

env_variables:
  HOGE: "hoge"
  FUGA: "fuga"

includes:                                                                                        
- secret_piyo.yaml

secret_piyo.yamlの中身

env_variables:
  PIYO: "piyo"

secretの方はgitignoreする

$cat .gitignore      
secret_piyo.yaml

トラブル対応

INVALID_ARGUMENT: Your app may not have more than 15 versions.

$gcloud app deploy app.yaml
略
ERROR: (gcloud.app.deploy) INVALID_ARGUMENT: Your app may not have more than 15 versions. Please delete one of the existing versions before trying to create a new version.

こちらが大変参考になった 😅&lt; golang+gaeにて(gcloud.app.deploy) INVALID_ARGUMENT: Your app may not have more than 15 versions. Please delete one of the existing versions before trying to create a new version.が出た場合。 - Qiita

対応方法

$ gcloud app versions list

でバージョンのリストを表示

こんな感じに表示されるので、不要なVERSIONを選んで消す

$ gcloud app versions list
SERVICE  VERSION          TRAFFIC_SPLIT  LAST_DEPLOYED              SERVING_STATUS
default  20180811t000507  0.00           2018-08-11T00:05:29+09:00  SERVING
default  20180812t234454  0.00           2018-08-12T23:47:48+09:00  STOPPED
default  20180814t002149  0.00           2018-08-14T00:22:47+09:00  STOPPED
default  20180814t004044  0.00           2018-08-14T00:41:48+09:00  STOPPED

上の2列目がバージョンID

以下のように消す

$gcloud app versions delete  20190224t071430 20190226t055739 ...以下複数まとめて消せる

deleteには結構時間がかかる

go言語アルゴリズムやTipsなどメモ

内容

go言語で自分がよく使う書き方やTipsのまとめ

並行処理関係は以下

ludwig125.hatenablog.com

BenchmarkTestは以下

ludwig125.hatenablog.com

Tips

入力値

入力値を受け取る

文字列で受け取る

var s string
fmt.Scan(&s)

整数で受け取る

var N int
fmt.Scan(&N)

複数の入力をまとめて受け取ることもできる

var a, b, c int
fmt.Scan(&a, &b, &c)

空白区切りの入力値を受け取ってスライスにする

N文字の空白区切りの入力された数値をスライスにする

  • fmt.Scanは、改行もしくは空白を区切ってしまうので、N回ループする
l := make([]int, N)
for i := range l {
    fmt.Scan(&l[i])
}
20 24 59  ← 入力値
[20 24 59]

空白区切りの入力値を一行受け取ってスライスにする

参考: Goで標準入力から文字列や数値列を取得する - Qiita

package main

import (
    "bufio"
    "fmt"
    "os"                             
)

func main() {
    s := bufio.NewScanner(os.Stdin)
    s.Scan()
    input := s.Text()
    l := strings.Split(input, " ")
    fmt.Println(l)
}
3 42 25  ← 入力
[3 42 25]  ← 全部stringなので注意

全部intのスライスにしたい場合はこんな感じかな

  • この方法よりは上記のfmt.Scanを使ったほうがよっぼど簡単だと思う
package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
    "strings"
)

func main() {
    s := bufio.NewScanner(os.Stdin)
    s.Scan()                                             
    input := s.Text()
    l := strings.Split(input, " ")

    toIntL := func(l []string) []int {
        var intL []int
        for _, v := range l {
            i, _ := strconv.Atoi(v)
            intL = append(intL, i)
        }
        return intL
    }
    fmt.Println(toIntL(l))
}

実行結果

431 12 64 ←入力値
[431 12 64]

整数の数列をソート

package main

import (
    "fmt"
    "sort"
)

func main() {
    a := []int{10, 3, 4, 1}
    
    A := a
    sort.Ints(A)
    fmt.Println(A)
    
    B := a
    fmt.Println(sort.IntSlice(B))  // 上と同じ出力

    C := a
    sort.Sort(sort.IntSlice(C))
    fmt.Println(C)    // 上と同じ出力

    D := a
    sort.Sort(sort.Reverse(sort.IntSlice(D)))
    fmt.Println(D)  // 逆順に出力
}

結果 [1 3 4 10] [1 3 4 10] [1 3 4 10] [10 4 3 1]

文字列を辞書順にソート

いったんスライスにしてソートしてからjoinで戻す方法

参考

package main

import (
    "fmt"
    "sort"
    "strings"
)

func main() {
    var s string
    fmt.Scan(&s)
    sl := strings.Split(s, "")
    sort.Strings(sl)
    sj := strings.Join(sl, "")

    fmt.Println(sj)                                  
}

実行

gasdbfgaa ← 入力
aaabdfggs ← 出力

逆順にソートしたいときは以下を使う

  • sort.Sort(sort.Reverse(sort.StringSlice(s)))

関数化したもの

複数条件で優先順位をつけたソート

安定ソートを数回するといい - 安定ソート(SliceStable)を使うことで、最初の並びをなるべくそのままにしつつ並べ替える

参考 - GoのSliceをSortする(sort.Sliceとsort.SliceStable) - Qiita

package main

import (
    "fmt"
    "sort"
)

type Person struct {
    ID   int
    Name string
}

func main() {
    group := []Person{
        {ID: 2, Name: "A"},
        {ID: 1, Name: "A"},
        {ID: 3, Name: "A"},
        {ID: 2, Name: "C"},
        {ID: 1, Name: "B"},
        {ID: 1, Name: "C"},
        {ID: 3, Name: "C"},
        {ID: 3, Name: "B"},
        {ID: 2, Name: "B"},
    }

    // groupをgroup1, group2に代入してそれぞれの変化を見る

    group1 := group
    // 最初にID順にソート
    sort.SliceStable(group1, func(i, j int) bool { return group1[i].ID < group1[j].ID })
    // 次にName順にソート。この時、Nameが同じであれば上でソートされたID順の並びを崩さない(安定ソート)
    sort.SliceStable(group1, func(i, j int) bool { return group1[i].Name < group1[j].Name })
    fmt.Printf("IDで安定SortしてからNameで安定ソート:%+v\n", group1)

    group2 := group
    // 最初にName順にソート
    sort.SliceStable(group2, func(i, j int) bool { return group2[i].Name < group2[j].Name })
    // 次にID順にソート。この時、IDが同じであれば上でソートされたName順の並びを崩さない(安定ソート)
    sort.SliceStable(group2, func(i, j int) bool { return group2[i].ID < group2[j].ID })
    fmt.Printf("Nameで安定SortしてからIDで安定ソート:%+v\n", group2)
}

The Go Playground

実行結果

IDで安定SortしてからNameで安定ソート:[{ID:1 Name:A} {ID:2 Name:A} {ID:3 Name:A} {ID:1 Name:B} {ID:2 Name:B} {ID:3 Name:B} {ID:1 Name:C} {ID:2 Name:C} {ID:3 Name:C}]
Nameで安定SortしてからIDで安定ソート:[{ID:1 Name:A} {ID:1 Name:B} {ID:1 Name:C} {ID:2 Name:A} {ID:2 Name:B} {ID:2 Name:C} {ID:3 Name:A} {ID:3 Name:B} {ID:3 Name:C}]

数字の各桁の数値をすべて足す

方法1.
sum := 0
for n > 0 {
        sum += n % 10
        n /= 10
}

⇒ n が 12345なら sは15

方法2.
sum := 0
for i := n; i > 0; i /= 10 {
        sum += i % 10
}

ポインタ

変数のポインタ

package main

import (
    "fmt"
)

func main() {   
    t := 10
    fmt.Println(t)
    change := func(t *int) {
        *t = 11
    }
    change(&t)
    fmt.Println(t)
}

実行結果

10
11

グリッド

二次元配列を組み立て

package main

import (
    "fmt"
    "strings"
)

func main() {
    var h, w int
    fmt.Scan(&h, &w) // high, width

    var p [][]string
    for i := 0; i < h; i++ {
        var l string
        fmt.Scan(&l)
        p = append(p, strings.Split(l, ""))
    }                                                          
    fmt.Println(p)
    fmt.Println(p[0][1])

}

実行結果

3 5
12345
67891
23456 
[[1 2 3 4 5] [6 7 8 9 1] [2 3 4 5 6]] ← 出力
2 ← 出力

行列計算

n * m の二次元配列を入力から受け取り

 var n, m int
    fmt.Scan(&n)
    fmt.Scan(&m)

    a := make([][]int, n)
    for i := 0; i < n; i++ {
        a[i] = make([]int, m)
        for j := 0; j < m; j++ {
            fmt.Scan(&a[i][j])
        }
    }

n * mの行列Aと m * l の行列Bの積としてn * lの行列Cを作成

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_7_D

 var n, m, l int
    fmt.Scan(&n)
    fmt.Scan(&m)
    fmt.Scan(&l)

    a := make([][]int, n)
    for i := 0; i < n; i++ {
        a[i] = make([]int, m)
        for j := 0; j < m; j++ {
            fmt.Scan(&a[i][j])
        }
    }
    b := make([][]int, m)
    for i := 0; i < m; i++ {
        b[i] = make([]int, l)
        for j := 0; j < l; j++ {
            fmt.Scan(&b[i][j])
        }
    }
    c := make([][]int, n)
    for i := 0; i < n; i++ {
        c[i] = make([]int, l)
    }

    for k := 0; k < n; k++ {
        for j := 0; j < l; j++ {
            for i := 0; i < m; i++ {
                c[k][j] += a[k][i] * b[i][j]
            }
        }
    }
    fmt.Println(c)

構造体とメソッド

構造体

こんな感じにstructを宣言して初期化できる

package main

import "fmt"

type Person struct {
    name   string
    age    int
    weight float64
}

func main() {
    person1 := Person{name: "Taro", age: 21, weight: 60.12} // フィールド名を指定するとわかりやすい
    fmt.Println(person1)
    person2 := Person{"Akira", 22, 61.12} // 順番通りなら指定しなくてもいい
    fmt.Println(person2)
}

実行結果

{Taro 21 60.12}
{Akira 22 61.12}

メソッド

goにはクラスはないが、構造体にメソッドを追加することでクラスメソッドのように使える

上で定義したPerson構造体の要素をすべてstringにしたスライスを返すメソッドを追加した例

func (p *Person) toString() []string {
    var str []string
    str = append(str, fmt.Sprintf("%s", p.name))
    str = append(str, fmt.Sprintf("%d", p.age))
    str = append(str, fmt.Sprintf("%f", p.weight))
    return str
}

func main() {
    person1 := Person{name: "Taro", age: 21, weight: 60.12}
    fmt.Println(person1.toString())
}

実行結果

[Taro 21 60.120000]

例2

Person構造体のスライスPersonsを定義して、要素をすべてinterfaceの二次元配列にして返す関数を使ってみた例

type Person struct {
    name   string
    age    int
    weight float64
}

type Persons []Person

func (p *Person) toString() []string {
    var str []string
    str = append(str, fmt.Sprintf("%s", p.name))
    str = append(str, fmt.Sprintf("%d", p.age))
    str = append(str, fmt.Sprintf("%f", p.weight))
    return str
}

func (p *Person) toInterfaceSlice() []interface{} {
    var is []interface{}
    is = append(is, p.name)
    is = append(is, p.age)
    is = append(is, p.weight)
    return is
}

func (ps *Persons) toInterfaceSlices() [][]interface{} {
    var iss [][]interface{}
    for _, p := range *ps {
        iss = append(iss, p.toInterfaceSlice())
    }
    return iss
}

func main() {
    person1 := Person{name: "Taro", age: 21, weight: 60.12}
    fmt.Printf("要素が全部stringのスライスに変換 %v\n", person1.toString())
    fmt.Printf("要素が全部interfaceのスライスに変換 %v\n", person1.toInterfaceSlice())

    persons := Persons{}
    persons = append(persons, person1)

    person2 := Person{name: "Akira", age: 22, weight: 61.12}
    persons = append(persons, person2)
    fmt.Printf("要素が全部interfaceの二次元スライスに変換 %v\n", persons.toInterfaceSlices())
}

実行結果

要素が全部stringのスライスに変換 [Taro 21 60.120000]
要素が全部interfaceのスライスに変換 [Taro 21 60.12]
要素が全部interfaceの二次元スライスに変換 [[Taro 21 60.12] [Akira 22 61.12]]

コード https://play.golang.org/p/FeJx-_wXv68

Enum

参考

4 iota enum examples · YourBasic Go

Go言語 - enumを定義する - 覚えたら書く

エラーハンドリング

参考

【go】golangのエラー処理メモ - ②. 例外はないがエラーハンドリングはできるよ(インスタンスや型でハンドリング) - tweeeetyのぶろぐ的めも

エラー・ハンドリングについて(追記あり) — プログラミング言語 Go | text.Baldanders.info

Golangのエラー処理とpkg/errors | SOTA

Go言語のエラーハンドリングについて - Qiita

Errors are values - The Go Blog ← 同じ関数を複数回呼ぶ時のエラーをまとめて扱う

reflect

こちらにまとめた ludwig125.hatenablog.com

アルゴリズム

全N個のものをM個単位で処理する

以下のようなlistを指定の件数ずつ分割して処理したいとき

package main

import (
    "fmt"
)

func main() {
    l := []int{1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10}

    for _, i := range l {
        fmt.Println(i)
    }

}
// 結果
/*
1
2
3
4
5
6
6
7
8
9
10
*/

以下のようにしてみた

package main

import (
    "fmt"
)

func main() {

    l := []int{1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10}

    chunkSize := 3
    for start := 0; start < len(l); start += chunkSize {
        
        end := start + chunkSize
        if end > len(l) {
            end = len(l)
        }
        fmt.Println(l[start:end])
        fmt.Println("---")
    }
}

// 結果
/* 
[1 2 3]
---
[4 5 6]
---
[6 7 8]
---
[9 10]
---
*/

Ubuntuインストール後の設定メモ

前提

Windows7にUbuntuをインストールする手順メモ - ludwig125のブログ

Ubuntuでデスクトップのディレクトリ名を「Desktop」にする

参考: Ubuntuでデスクトップのディレクトリ名を「Desktop」にする - ぬいぐるみライフ?

端末エミュレータを開き,以下のコマンドを実行する.

$ LANG=C xdg-user-dirs-gtk-update
ダイアログが表示されるので,「Don't ask me this again」をチェックし,「Update Names」をクリックすればOK.

すでに「デスクトップ」の中にファイルを作っている場合、上記のコマンドで日本語の「デスクトップ」ディレクトリが残ったまま「Desktop」が作られる

ショートカットキー

UbuntuTips/Desktop/KeyboardShortcutOnUnity - Ubuntu Japanese Wiki

Ubuntu 16.04 LTSで使えるキーボードショートカット一覧 - 旧ID:itiriのブログ

端末

端末のショートカットキー

コピーアンドペースト 端末の起動 Ctrl+Shift+n

コピー Ctrl+Shift+c

ペースト Ctrl+Shift+v

 .bash_profile

参考: ユーザーの環境変数を設定するbashの設定ファイルと、カスタムプロンプトについて | OXY NOTES Linuxユーザのためのチップス: .bash_profileで環境変数を設定する。

[~/Documents ] $ cat ~/.bash_profile 
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

# User specific environment and startup programs

ENV=$HOME/.bashrc
USERNAME="xxxx"
PATH=$PATH:"/$HOME/bin"

export USERNAME ENV PATH

PS1="[\w ] $ "
[~/Documents ] $

Ubuntu14で.bash_profileが認識されない 正しくは .profile

Ubuntu14.04で.bash_profileが読み込まれない(見つからない) - Qiita

bash - I cannot find .bash_profile in ubuntu - Ask Ubuntu

上記に.bash_profileの設定を書いたが、起動時に.pash_profileに書いた設定が読み込まれていないようだったので調査

ubuntu14では .profileが認識されているらしい

Ubuntu起動と同時に端末を開く

参考: Ubuntu起動と同時に自動でターミナルを開く - Qiita

Ubuntuのターミナルでタブを複数起動させて、タブごとに別サーバにログインしたい時 | shinodogg.com

自分の設定(gnome端末を使っていた時)

[~] $cat ~/.config/autostart/gnome-terminal.desktop
[Desktop Entry]
Exec=gnome-terminal --geometry=160x48+0+0
Type=Application
[~] $

↑使う端末をterminatorに変えたのでこれになった - 以下の設定で保存すると、次回からUbuntuを開くときに横幅1200、縦幅960のterminatorのWindowが左上隅に表示される

[~] $cat ~/.config/autostart/terminator-terminal.desktop
[Desktop Entry]
Exec=/usr/bin/terminator --geometry=1200x960+0+0 
Type=Application

git

gitインストール

参考: 第3回 さっそくGitを使ってみよう!:ハックガールズと学ぼう!ゼロから学ぶGit講座|gihyo.jp … 技術評論社

sudo apt-get install git 

[~ ] $ git config --global user.name "ludwig125"
[~ ] $ git config --global user.name 
ludwig125
[~ ] $ git config --global user.email "XXXX@gmail.com"
[~ ] $ mkdir ~/git
[~ ] $ cd git/
[~/git ] $ ls
[~/git ] $ ls
[~/git ] $ git init
Initialized empty Git repository in /home/XXXX/git/.git/
[~/git ] $ git status
On branch master

最初のコミット

nothing to commit (create/copy files and use "git add" to track)
[~/git ] $

 githubの登録

今さら聞けない!GitHubの使い方【超初心者向け】 | TechAcademyマガジン

githubリポジトリ作成

f:id:ludwig125:20190119231748p:plain f:id:ludwig125:20190119231810p:plain

git pushに失敗

[~/git/work ] $ git push origin master
Username for 'https://github.com': ludwig125
Password for 'https://ludwig125@github.com': 
remote: Invalid username or password.
fatal: Authentication failed for 'https://github.com/lugwig125/work.git/'
[~/git/work ] $

 git へpushする方法

1.アクセストークンを使う

[Git][GitHub]GitHubにPushする際に認証失敗する | DevAchieve hubを2-factor authentication(2要素認証)有効でも使いたい - Qiita

以下のように「Personal access tokens」でアクセストークンを発行してコピーしておく

f:id:ludwig125:20190119232834p:plain

パスワード入力にアクセストークンを使ったらpushできるようになった

[~/git/work ] $ git push origin master
Username for 'https://github.com': ludwig125
Password for 'https://ludwig125@github.com': 
Counting objects: 6, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (5/5), 438 bytes | 0 bytes/s, done.
Total 5 (delta 0), reused 0 (delta 0)
To https://github.com/lugwig125/work.git
3847557..36d73b5 master -> master
[~/git/work ] $ 

2.SSH認証をする

アクセストークンは面倒なので、こちらのほうが便利

参考:

GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~ - Qiita SSHの公開鍵を作成しGithubに登録する手順 - mon_sat at Co-Edo(半年前の自分への教科書 / 別院) MacでGitHubを使う手順 – SSH Keysの登録 / リポジトリの作成 / 基本コマンド | maesblog

手順

  • ssh-keygen -t rsa -C "メルアド"

=> Enter passphrase :ubuntuのパスワードを入力

=> この公開鍵をコピー

[~/git/work ] $ ssh-keygen -t rsa -C "gitに登録したメルアド"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/XXX/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/XXX/.ssh/id_rsa.
Your public key has been saved in /home/XXX/.ssh/id_rsa.pub.
The key fingerprint is:
☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓
The key's randomart image is:
+--[ RSA 2048]----+
| .               +==.      |
|                    *OE+. |
|                   .=+*= . |
|                     . +o.= |
|                         S... |
|                                |
|                                |
|                                |
|                                |
+-----------------+
[~/git/work ] $ 
[~/git/work ] $ cat ~/.ssh/id_rsa.pub
ssh-rsa ○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○
[~/git/work ] $ ssh -T git@github.com
Warning: Permanently added the RSA host key for IP address '192.30.252.129' to the list of known hosts.
Hi lugwig125! You've successfully authenticated, but GitHub does not provide shell access.
[~/git/work ] $

 SSHKey登録結果

f:id:ludwig125:20190119232205p:plain

c++を使えるようにする

g++のインストール

[~/git/work/src/bin ] $ sudo apt-get install g++
[~/git/work/src/bin ] $ g++ -v

省略
gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.1) 
[~/git/work/src/bin ] $

c++コンパイル

参考: 第6回 LinuxでC/C++言語のコンパイルを試す(3ページ目) | 日経クロステック(xTECH)

caps lockをctrlにする手順

下記を参考にしたら、capslockが無効になったが、ctrlにはならなかった。

またいつか試してみる

$ sudo vi /etc/default/keyboard
XKBOPTIONS="ctrl:nocaps"

追記 キーボードの CapsLock と Control を入れ替える – talkwithdevices.com

sudo dpkg-reconfigure keyboard-configuration

をして設定を更新必要があるらしいが、以下のような画面が出た。

自分のキーボードの種類がわからない。。あとで

f:id:ludwig125:20190119232357p:plain

参考:

Ubuntu日本語フォーラム / Ubuntu14.04 LTSでのCtrlとCapslockの入れ替えについて

[LXDE] Caps LockキーをCtrlキーにする(LXDE) - Life with IT

keyboard - How to map Caps Lock key to something useful? - Raspberry Pi Stack Exchange

CapsLockをCtrlにするまとめ - Λlisue's blog

キーボードの CapsLock と Control を入れ替える – talkwithdevices.com

Zsh

zshを使う - ludwig125のブログ

その他設定

https://ludwig125.hatenablog.com/entry/2020/03/19/043511

vmware playerとホストのWindowsの間のフォーカスを切り替える - ludwig125のブログ

4kディスプレイで仮想マシンのUbuntuの文字サイズを大きくする - ludwig125のブログ

トラブル対応

Ubuntu14.0.4でGoogleChromeが起動しない - ludwig125のブログ

VMwareplayerのトラブル - ludwig125のブログ

vmwareで「パワーオン中にエラーが発生しました」が出た(Windows10) - ludwig125のブログ

scalaでjavaクラスを呼び出す

概要

仕事でScalaから別javaを呼び出すときに妙に悩んだのでメモ

以下の3パターンを列挙する

自分の状況

  • scalaよくわかってない
  • java全然しらない

javaからjavaを使う

javaの場合はclass名とファイル名が同じでないといけないらしい

以下のファイルを用意する

[ludwig125 JavaJava]$ cat SampleClass.java
public class SampleClass {
        public static String val = "hoge";

    public static int add(int x, int y) {
        return x + y;
    }
    public static int sub(int x, int y) {
        return x - y;
    }
}
[ludwig125 JavaJava]$
[ludwig125 JavaJava]$ cat useSample.java
public class useSample {
    public static void main(String[] args) {

        System.out.println(SampleClass.val);
        System.out.println(SampleClass.add(5, 3));
        System.out.println(SampleClass.sub(5, 3));
    }
}
[ludwig125 JavaJava]$

コンパイルして実行

[ludwig125 JavaJava]$ javac SampleClass.java useSample.java
[ludwig125 JavaJava]$ java useSample
hoge
8
2
[ludwig125 JavaJava]$

scalaからscalaを使う

以下のファイルを用意する

[ludwig125 ScalaScala]$ cat SampleClass.scala
class S {
  val v = "hoge"
  def add(a: Int, b: Int): Int = a + b
  def sub(a: Int, b: Int): Int = a - b
}
[ludwig125 ScalaScala]$
[ludwig125 ScalaScala]$ cat useSample.scala
object useS {
  def main(args: Array[String]): Unit = {
    val s = new S
    println(s.v)
    println(s.add(5, 3))
    println(s.sub(5, 3))
  }
}
[ludwig125 ScalaScala]$

コンパイルして実行

[ludwig125 ScalaScala]$ scalac SampleClass.scala useSample.scala
[ludwig125 ScalaScala]$ scala useS
hoge
8
2
[ludwig125 ScalaScala]$

特記事項

scalaの場合javaと違ってファイル名とクラス名を一致させる必要はない 「val」がscalaの予約後なのでvに変えたが、valのまま使う方法もあったはず

scalaの場合、scalacでファイル名を指定してコンパイルしたあと、scalaコマンドの実行対象はクラス名(この場合useS)であることに注意

scalaからjavaを使う

以下のファイルを用意する

[ludwig125 ScalaJava]$ cat SampleClass.java
public class SampleClass {
        public static String v = "hoge";

    public static int add(int x, int y) {
        return x + y;
    }
    public static int sub(int x, int y) {
        return x - y;
    }
}
[ludwig125 ScalaJava]$
[ludwig125 ScalaJava]$ cat useSample.scala
object useS {
  def main(args: Array[String]): Unit = {
    println(SampleClass.v)
    println(SampleClass.add(5, 3))
    println(SampleClass.sub(5, 3))
  }
}
[ludwig125 ScalaJava]$

コンパイルして実行

javascalaを個別にコンパイルしたけど、まとめてやる方法があるのかどうかは確認してない

[ludwig125 ScalaJava]$ javac SampleClass.java
[ludwig125 ScalaJava]$ scalac useSample.scala
[ludwig125 ScalaJava]$ scala useS
hoge
8
2
[ludwig125 ScalaJava]$

Ubuntu 14.04のPython2のデフォルトバージョンをPython 2.7.9にする

たまたまやる必要があったのでメモ

参考

https://www.ralphlepore.net/installing-python-279-on-ubuntu-1404-lts/

このとおりやればできる

アップデート前

[~] $python2 --version
Python 2.7.6
[~] $

アップデート

mkdir ~/software
cd ~/software
wget https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz

# Now we are going to unpack the tar and install python
tar -xvf Python-2.7.9.tgz
cd Python-2.7.9
./configure
make
sudo make install

反映させるために再起動 以下をする前に大事なものは保存しておく

# Restart server to ensure everything is up to date.
sudo shutdown now -r

アップデート後

[~] $python2 --version
Python 2.7.9
[~] $