Wen

AIFan へようこそ、ありがとうございます。

こちらでは、主に私の日常の呟きやプログラミングの話を中心に記録しています。
在日中国人でして、たまに中国関連のネタもお届けたりします。

ご興味のある方は、RSS をサブスクしてみてください。

ssh-今時のsshキー生成方法(アルゴ)だよ! ed25519

結論

RSAECDSA アルゴよりも ed25519 を使いましょう!

ssh-keygen -t ed25519 -C "your_email@example.com"

ちなみに、Githubや AWS も推奨で対応しています。

aws-ssh-keygen

今までのアルゴとの比較

  • rsa
    • SSH2, RSA-2048 以上での使用を推奨されている。
    • 鍵長が選べる。4096bit が主流。
  • dsa
    • rsa の代替として開発
  • ecdsa:
    • ブロックチェーンでも使われている楕円曲線暗号。
  • ed25519:
    • ecdsa の変種
    • ecdsa より署名生成/検証のパフォーマンスがいい。
    • 安全で性能がいい

おまけ

Ed25519 は 2014 年 1 月の OpenSSH 6.5 で導入されました。
ssh -V でバージョンを確認し必要に応じて OpenSSH を update しておいてください。

Mac の場合

ssh -V
brew install openssh


インストールされたバージョンの OpenSSH を有効するためにシェルを再起動します。

exec $SHELL -l

which ssh で有効になったかどうかを確認します。

which ssh
item.title
キャンプ道具紹介-3~4人家族向けチタンマグセット

ほぼ毎日 Youtube でキャンプ道具に関する動画をつまみとして楽しんでる人間です。😄
今回はキャンプ道具紹介シリーズの 3~4 人家族向けのチタンマグセットを紹介したいと思います。

まず個人的にチタン(Wiki)を押す理由としましては、
チタンという金属の以下のような化学・物理性質に原因があります。

  • 超軽量。(比重 4.51 で、銅の約 1/2、鉄の約 60%という軽さ)
  • 耐食性、耐熱性。(とにかく錆びない!)
  • 頑丈さ。(その分製錬・加工が難しくステンレス製品よりは高価)
  • 生体親和性が非常に高い。(人体にアレルギー反応を起こさない。という特性から、人工関節・人工骨といった、整形外科分野でも利用されている。)
  • 色彩。(焼くと青紫色という綺麗な色になる)

一回買えば一生ものとして使えるような素材です。

紹介したいもの

Snow peak マグ
Snow peak マグ手持ちの様子

紹介したい理由

Snow peak マグセット

Snow peak マグセット収納時

容量 220ml のやつが 45g しかなく超軽量で、
かつ上の図のように、合体できて収納性抜群です。

Amazon の商品の紹介ページ

おまけ

中国語においては (中国語発音:tài;英语:Titanium) という字になります。

Credits

画像はこちらより借りたものになります。

item.title
Golangでは暗黙的な型変換もあることを知ってた?

環境

Go version: go1.17.8

コード

下記のコードにあるように、
明示的に変換しないとエラーになるタイプ (int) と
変換せずにそのまま代入できるタイプ (map[string]int) があることがわかります。

package main

import (
    "fmt"
    "runtime"
)

type MyInt int
type MyMap map[string]int

func main() {
    fmt.Printf("Go version: %s\n", runtime.Version())

    var x MyInt
    var y int
    x = y // コンパイルエラー: cannot use y (type int) as type MyInt in assignment

    var m1 MyMap
    var m2 map[string]int
    m1 = m2 //  OK
    m2 = m1 // OK
}

理由

Golang の仕様書の 代入可能性(Assignability) のところでちゃんと書いてありました。

x’s type V and T have identical underlying types and at least one of V or T is not a defined type.

a と b が同一のunderlying type (基底型、背後霊的な型 w)を持ち、
a または b の少なくとも一方が defined type (派生型)でないなら、お互い代入可能のようです。
派生型は名前の通りで、別の型からtypeで新たに定義された方です。

そうすると、m1m2 はお互いに代入できることは明白ですが、

    var m1 MyMap
    var m2 map[string]int
    m1 = m2 //  OK
    m2 = m1 // OK
変数 基底型 派生型?
var m1 MyMap map[string]int Yes
var m2 map[string]int map[string]int No

問題はMyInt ですね。

    var x MyInt
    var y int
    x = y // コンパイルエラー: cannot use y (type int) as type MyInt in assignment
変数 基底型 派生型?
var x MyInt int Yes
var y int int No じゃなかった! ← ここ重要

int は 一見派生型じゃないように見えますが、
実は Golang の都合上、ソースコードにあるように、int も(自分自身の…)派生型になります。

type int int

ちなみに、上記のリンク先にあるように、
int以外にboolstring などの predeclared type が全て defined type (派生型)になるようです。

参考記事

入門 Go 言語仕様 Underlying Type / Go Language Underlying Type
惊了!原来 Go 语言也有隐式转型

Credits

Photo by Chinmay Bhattar

Golang-文字数を数える方法,4バイト以上の絵文字もある

背景

こちらの記事 UTF-8 のテーブル(MySQL5.6)に竈門禰󠄀豆子が格納できない問題を調べてみたがきっかけで、
Golangにおける絵文字の文字数を確認する方法を調査して見ました。

ちなみに、Golang のソースコードや文字列リテラルは UTF-8 が採用されています。
UTF-8 は、英数字は 8bit で表現して、それ以外は 16,24,32bit で可変的に表現しています。
例えば、ひらがなカタカナ漢字の様な日本語は 2 byte のものが多いのですが、上記の記事にでもあった一部の異体字(wikipedia)は 4 byte だったりします。

あと、😺 とかの絵文字も 4byte のものが多いのですが、
🧑‍🤝‍🧑 や 👨‍👩‍👧‍👦 といった絵文字は複数の絵文字を組み合わせた絵文字で、 4byte 以上になったりします。

確認用コード

Go version: go1.17.8

package main

import (
    "fmt"
    "runtime"
    "unicode/utf8"

    "github.com/rivo/uniseg"
)

func main() {
    fmt.Printf("Go version: %s\n", runtime.Version())
    emoji := "😺"

    // 文字数
    println(1 == utf8.RuneCountInString(emoji))

    // バイト数
    println(4 == len(emoji))

    // バイト数(😺 ) = 4bytes
    println(4 == utf8.RuneLen('😺')) // RuneLen は,文字のエンコードに必要なバイト数を返します。
    println(1 == utf8.RuneLen('a'))

    emoji2 := "🧑‍🤝‍🧑"
    println(5 == utf8.RuneCountInString(emoji2)) // 文字数(🧑‍🤝‍🧑 ) = 5 . (4bytesを超えた文字はutf8.RuneLen関数を使用できない)
    println(18 == len(emoji2))                   // バイト数(🧑‍🤝‍🧑 ) = 18bytes

    // uniseg という Go 言語用パッケージがあって,これを使うと UTF-8 文字列を「文字」単位に切り出してくれる。
    gr := uniseg.NewGraphemes(emoji2)
    for gr.Next() {
        rs := gr.Runes()
        fmt.Printf("%v : %U\n", string(rs), rs)
    }
    // Output: 🧑‍🤝‍🧑 : [U+1F9D1 U+200D U+1F91D U+200D U+1F9D1]

    // おまけ:string以外に []byte と []rune の文字数とバイト数も求め方も
    buf := []byte("😺")
    runes := []rune("😺")

    println(1 == utf8.RuneCount(buf))
    println(1 == len(runes))

    println(4 == len(buf))
    println(4 == len(string(runes)))
}

Golang Playground Demo

item.title
Golang:同じ文字列を繰り返して連結する方法

Golang での同じ文字列を繰り返して連結する方法

  • 環境
$ go version
go version go1.17.2 darwin/amd64
  • 方法
package main

import (
    "bytes"
    "strings"
)

func main() {
    // repeat byte
    bufBytes := []byte("😺")
    println("repeat byte:" + string(bytes.Repeat(bufBytes, 3))) //😺😺😺

    // repeat strings
    str := "😺"
    println("repeat strings:" + strings.Repeat(str, 3)) //😺😺😺

    // repeat rune
    // rune 型のスライスにはrepeat関数が用意されていないため、for 文を使う必要がある。
    bufRunes := []rune("😺")
    for i := 0; i < 3; i++ {
        bufRunes = append(bufRunes, []rune("😺")...)
    }
    println("repeat runes:" + string(bufRunes)) //😺😺😺

}
repeat byte:😺😺😺
repeat strings:😺😺😺
repeat runes:😺😺😺😺

Program exited.

Golang Playground Demo

注意:ちなみに、stringsの場合は、+ による連結もできますが、Repeat()の方がパフォーマンス的に良いです。

おまけ

ご参考まで、他の言語の書き方もまとめますと、

言語 方法
Go 言語 strings.Repeat(str, 3)
Scala str * 3
Groovy str * 3
PHP str_repeat($str, 3)
Python str * 3
Ruby str * 3
Perl $str x 3

参考記事

同じ文字列を繰り返して連結するには(文字列の乗算みたいな)

Linux:nohupと&の違い

nohup& の違い

python test.py というコマンドで説明しますと、

コマンド ctl+c ターミナルを終了
python test.py コマンドが中断される コマンドが中断される
python test.py & コマンドが中断されない コマンドが中断される
nohup python test.py コマンドが中断される コマンドが中断されない
nohup python test.py & コマンドが中断されない コマンドが中断されない

中断されなく残ってしまう場合は、ちゃんと kill しましょう。

ps -ef | grep test.py
kill -9 {pid}

参考記事

Linux 中的 nohup 和&区别

item.title
おすすめの中国映画-レイン・オブ・アサシン(剑雨)

今日紹介したいのは、ミシェール・ヨー(楊 紫瓊、Michelle Yeoh Choo-Kheng) 主演の
楊紫瓊 レイン・オブ・アサシン (中国語: 剑雨)という 2010 年の映画になります。

大ヒットを記録した『レッド・クリフ』シリーズのジョン・ウー監督が放つ武侠アクション大作です。

ストーリー

明朝期の中国を背景に、武術界の究極の奥義をめぐって最強の刺客たちが繰り広げる愛と闘いのドラマを描く。
孤高の女刺客には『グリーン・デスティニー』のミシェル・ヨー、相手役に『グッド・バッド・ウィアード』のチョン・ウソンがふんする。
共演には『孫文の義士団』のワン・シュエチー、『インファナル・アフェア』シリーズのショーン・ユーらアジアの実力派がそろう。

  • 映画『レイン・オブ・アサシン』予告編

あと、映画の中の詩がとても好きでしたので、こちらにも貼っておきます。

中国の伝統楽器二胡に興味ある方へのおすすめYoutubeチャンネル:Guo Gan - Chinese Erhu Master

今回は二胡に興味のある方に 果敢さん (Wiki) という二胡演奏家の方のチャンネル Guo Gan - Chinese Erhu Master を紹介したいと思います。

まず、WIKI から抜粋となりますが、二胡とは、

二胡(にこ、拼音: èrhú)は中国の伝統的な擦弦楽器の一種。
2 本の弦を間に挟んだ弓で弾く。琴筒はニシキヘビの皮で覆われている。

ちなみに、果敢さん
2016 年 4 月に日本で公演(東京および大阪)を開いたこともあるようです。

それらの動画の中に個人的にでも好きな Butterfly Lovers 梁祝 という中国人なら誰でも知っている曲のリンクを貼っておきます。

item.title
中国の伝統楽器古筝に興味ある方へのおすすめYoutubeチャンネル:碰碰彭碰彭Jingxuan

まず古筝について、Wiki からの抜粋を貼っておきます。

古筝(こそう、グーチェン、あるいは単に筝、拼音: gǔzhēng)は中国の伝統的なツィター属の撥弦楽器である。
弦の本数は地方によって異なるが、現代では 21 本のものが代表的である。
弦の材質には金属弦・絹糸の弦・金属芯のナイロン弦などがある。右手の指にはめた義爪で弦をはじいて演奏する。

チャンネルの名前 碰碰彭碰彭Jingxuan は、多分その Youtuber の方の名前と関係するようなのものかなと思います。

動画の内容としましては、路上で中国の曲はもちろんですが、
中国以外の各国の名曲を古筝で演奏したりしています。

その中にでも自分が特に好きな動画のリンクを貼っておきます。
ゆっくりご鑑賞ください。

  • 古箏演奏《Rolling In The Deep》

  • 梁祝 The Butterfly Lovers