Newer posts are loading.
You are at the newest post.
Click here to check if anything new just came in.

February 07 2018

Map の話 - golang

今回も覚え書き用の小ネタ。

map による連想配列の定義と基本操作

まず, map を使って以下の連想配列を考える。

type platnets map[string]float64

p := platnets{
    "Mercury": 0.055,
    "Venus":   0.815,
    "Earth":   1.0,
}

この連想配列の各要素を操作する記述は以下のような感じになる。

package main

import (
    "fmt"
)

type platnets map[string]float64

func main() {
    p := platnets{
        "Mercury": 0.055,
        "Venus":   0.815,
        "Earth":   1.0,
    }

    if v, ok := p["Mars"]; ok {
        fmt.Println("Mars =", v)
    } else {
        fmt.Println("Mars is not exist.")
    }

    p["Mars"] = 0.107 //add or set
    if v, ok := p["Mars"]; ok {
        fmt.Println("Mars =", v)
    } else {
        fmt.Println("Mars is not exist.")
    }

    delete(p, "Mars")
    if v, ok := p["Mars"]; ok {
        fmt.Println("Mars =", v)
    } else {
        fmt.Println("Mars is not exist.")
    }
}

このコードの実行結果は以下の通り。

Mars is not exist.
Mars = 0.107
Mars is not exist.

この連想配列の要素を全て取り出す。 これは for range 構文を使ってこんな感じに記述する。

package main

import "fmt"

type platnets map[string]float64

func main() {
    p := platnets{
        "Mercury": 0.055,
        "Venus":   0.815,
        "Earth":   1.0,
    }
    for k, v := range p {
        fmt.Println(k, v)
    }
}

結果は以下の通り。

Mercury 0.055
Venus 0.815
Earth 1

ちなみに for range 構文で map を使う場合,取り出しの順番は不定になる1。 例えば,アルファベット順に取り出したければ以下のようにキーをソートした配列を用意する。

package main

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

type platnets map[string]float64

func main() {
    p := platnets{
        "Mercury": 0.055,
        "Venus":   0.815,
        "Earth":   1.0,
    }

    keys := []string{}
    for k, _ := range p {
        keys = append(keys, k)
    }
    sort.Slice(keys, func(i, j int) bool {
        return strings.Compare(keys[i], keys[j]) < 0
    })
    for _ , k := range keys {
        fmt.Println(k, p[k])
    }
}

結果は以下の通り

Earth 1
Mercury 0.055
Venus 0.815

map は連想配列を参照するオブジェクトである

map連想配列への参照を属性として持つオブジェクトである。 したがって map インスタンスを引数として渡した場合は見かけ上「参照渡し」として機能する。

package main

import "fmt"

type platnets map[string]float64

func (p platnets) print() {
    for k, v := range p {
        fmt.Println(k, v)
    }
}

func add(p platnets, k string, v float64) {
    p[k] = v
}

func main() {
    p := platnets{
        "Mercury": 0.055,
        "Venus":   0.815,
        "Earth":   1.0,
    }
    p.print()
    fmt.Println()

    add(p, "Mars", 0.107)
    p.print()
}

このコードの実行結果は以下の通り。

Mercury 0.055
Venus 0.815
Earth 1

Mercury 0.055
Venus 0.815
Earth 1
Mars 0.107

連想配列の複製

map 内の連想配列の複製を行う関数は用意されていない2 ため for range 構文で地道に処理する。

package main

import "fmt"

type platnets map[string]float64

func (p platnets) print() {
    for k, v := range p {
        fmt.Println(k, v)
    }
}

func (p platnets) copy() platnets {
    c := platnets{}
    for k, v := range p {
        c[k] = v
    }
    return c
}

func main() {
    p1 := platnets{
        "Mercury": 0.055,
        "Venus":   0.815,
        "Earth":   1.0,
    }

    p2 := p1.copy()
    p2["Mars"] = 0.107

    p1.print()
    fmt.Println()
    p2.print()
}

このコードの実行結果は以下の通り。

Mercury 0.055
Venus 0.815
Earth 1

Mercury 0.055
Venus 0.815
Earth 1
Mars 0.107

連想配列の比較

map インスタンス同士は == 演算子による比較ができない。 以下のコードはコンパイルエラーになる3

package main

import "fmt"

type platnets map[string]float64

func (p platnets) copy() platnets {
    c := platnets{}
    for k, v := range p {
        c[k] = v
    }
    return c
}

func main() {
    p1 := platnets{
        "Mercury": 0.055,
        "Venus":   0.815,
        "Earth":   1.0,
    }

    p2 := p1.copy()
    if p1 == p2 {
        fmt.Println("p1 == p2")
    } else {
        fmt.Println("p1 != p2")
    }
}
prog.go:23:8: invalid operation: p1 == p2 (map can only be compared to nil)

map が参照している連想配列の内容を比較したいのであれば reflect.DeepEqual() 関数が使える。

package main

import (
    "fmt"
    "reflect"
)

type platnets map[string]float64

func (p platnets) copy() platnets {
    c := platnets{}
    for k, v := range p {
        c[k] = v
    }
    return c
}

func main() {
    p1 := platnets{
        "Mercury": 0.055,
        "Venus":   0.815,
        "Earth":   1.0,
    }

    p2 := p1.copy()
    if reflect.DeepEqual(p1, p2) {
        fmt.Println("p1 == p2")
    } else {
        fmt.Println("p1 != p2")
    }
}

このコードの実行結果は以下の通り。

p1 == p2

map が参照している連想配列のインスタンスが同一であるかどうか調べるには reflect.ValueOf() 関数で値(=連想配列)を取得し,そのポインタ値を == 演算子で比較する。

package main

import (
    "fmt"
    "reflect"
)

type platnets map[string]float64

func (p platnets) copy() platnets {
    c := platnets{}
    for k, v := range p {
        c[k] = v
    }
    return c
}

func main() {
    p1 := platnets{
        "Mercury": 0.055,
        "Venus":   0.815,
        "Earth":   1.0,
    }

    p2 := p1
    if reflect.ValueOf(p1).Pointer() == reflect.ValueOf(p2).Pointer() {
        fmt.Println("p1 == p2")
    } else {
        fmt.Println("p1 != p2")
    }

    p2 = p1.copy()
    if reflect.ValueOf(p1).Pointer() == reflect.ValueOf(p2).Pointer() {
        fmt.Println("p1 == p2")
    } else {
        fmt.Println("p1 != p2")
    }
}

このコードの実行結果は以下の通り。

p1 == p2
p1 != p2

ブックマーク

参考図書

photo
プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
Alan A.A. Donovan Brian W. Kernighan 柴田 芳樹
丸善出版 2016-06-20
評価

スターティングGo言語 (CodeZine BOOKS) Go言語によるWebアプリケーション開発 Kotlinスタートブック -新しいAndroidプログラミング Docker実戦活用ガイド グッド・マス ギークのための数・論理・計算機科学

著者のひとりは(あの「バイブル」とも呼ばれる)通称 “K&R” の K のほうである。

reviewed by Spiegel on 2016-07-13 (powered by G-Tools)


  1. 言語仕様上定義されていないという意味ではなく,意図的に乱択されるらしい。 [return]
  2. 代入構文では map インスタンスの複製ができるだけで,参照している連想配列は同じものになる。 [return]
  3. &p1 == &p2 ならコンパイルエラーにはならないが,やってることは map インスタンスのポインタ値を比較しているだけである。 [return]

February 06 2018

節分どうでしょう - remark

みなさん,節分はいかが過ごされましたか。 私は今年は「ビールと枝豆」で過ごしました。

いや,ベランダや室内に豆撒いたら後の掃除が大変じゃないですか。 恵方巻? 知りませんよ,そんな習慣。

節分なのでビールと枝豆 節分なのでビールと枝豆

と思ってたら,実家から電話がかかってきて「恵方巻食べた?」と訊かれました。 どうやら実家はもう「恵方巻」が完全に定着しているようです。

昨年 Facebook で恵方巻について調べた記事を見つけたので以下に紹介します。 ちなみに昨年はナッツ入りチョコを食べてました。


恵方巻きの起源については北海道文教大学の調査論文がありました。

これによると大阪方面では1970年代までに寿司や海苔の業界で販促キャンペーンがあったようです。 実際に流行り始めたのは,やはり広島のセブン-イレブンがきっかけらしい。 1989年に「丸かぶり寿司」として売り出したのが最初で,そこから1990年代に全国に拡大していったそうです。 実はその前に小僧寿しが「縁起巻」という名前で全国キャンペーンしたそうですが,あまり流行らなかったそうな。 でも知ってる人はこの辺から知ってる人はいるかも。


広島人って基本的に保守的なのに食い物にはアグレッシブだよなぁ。

ちなみに件の論文 によると,恵方巻が「古来の伝統の復活ではなく、全く新しい行事として消費者に受け入れられた」理由として

  1. 寿司類は従来から祭りや節句などのハレの日の食べ物であったため抵抗がなかったこと
  2. 子供から高齢者、男女とも、幅広く好まれる食べ物であること
  3. 家庭の献立を考える食事担当者がその日は負担がなくなること

と考察している。

そういや最近は巻き寿司自体を食べなくなったなぁ。 別に嫌いになったわけじゃないけどね。 安くて旨い立ち食い寿司屋とか行くのでわざわざ巻き寿司は食べなくなったのかな?

貧乏性なので(恵方巻に限らず)食べ物が大量廃棄されている映像は心が痛む。 毎年のことなんだから,それこそ AI でも使って市場予測しろよ。 つってもサンプルが少なすぎて AI じゃ無理かな(笑)

February 05 2018

「仮想通貨」と公開鍵基盤 - remark

Twitter で見かけた記事。

Satoshi Nakamoto 氏の論文を引いていてかなり面白い内容だと思うが,言いたいことは単純で,私がこれまで述べてきた通り

  • Bitcoin のアドレスの帰属先について Bitcoin/Blockchain は関知しない。Bitcoin が気にするのは Blockchain に記載されるアドレスの一貫性と無矛盾性である。アドレスの証明が必要な場合は外部の PKI を利用するか新たに組み込む必要がある

ということに尽きる。

今回はこの部分についてもう少し詳しく書いてみる。

まずは定義から

Blockchain もしくは Blockchain に準ずる技術を用い,価値可換なトークンによって取引を行うシステムを括弧書きで「仮想通貨」または「「仮想通貨」システム」と命名する。 この時の「価値可換なトークン」を「コイン」と命名する。 コインは量で表すことができるものとする。

また「仮想通貨」システムで発生する取引を記録する追記型データベースを「元帳」と命名する。 もちろん元帳は「Blockchain もしくは Blockchain に準ずる技術」を用いて実装されているわけだ。

ここで,ある「仮想通貨」システム上でユーザ $A$ からユーザ $B$ へコインを移転1 する「取引」を考える。

  • 「ある「仮想通貨」システム」を $COIN$ とする
  • 取引を $T$ とし,取引の際に移転するコインの量を $c$ とする
  • $A$ が持つ「仮想通貨」のアドレスを $a$ とし, $B$ が持つ「仮想通貨」のアドレスを $b$ とする

このときの取引全体を示す図式2 を以下のように記述してみる。

\[ COIN : A[a] \xrightarrow{T(c)} B[b] \]

このとき取引 $T$ を元帳に追記する内容は

\[ a \xrightarrow{c} b \]

であり,取引関係者である $A$ や $B$ は一切登場しないのがポイントである。

「仮想通貨」はアドレスの帰属先を証明(Certificate)しない

「仮想通貨」は $a$ の帰属先が $A$ であること,あるいは $b$ の帰属先が $B$ であることを証明しないし証明できない。 もう少し厳密にいうなら「「仮想通貨」はアドレスの帰属先を証明する責務を負わない」と言える。

このことが何をもたらすか,いくつかシナリオを考えてみよう。

  • $a$ の帰属先が $A$ であると証明できない
    • $B$ は入金 $c$ を $A$ によるものではないと主張できる。 $B$ は $A$ からの入金を否認し $A$ に尚も $c$ を請求するかもしれない
    • $a$ は別の誰か(たとえば $E$)に乗っ取られているかもしれない。これにより $B$ は取引不成立とみなし $A$ に何らかのペナルティを課すかもしれない \[ COIN : E[a] \xrightarrow{T( c )} B[b] \]
  • $b$ の帰属先が $B$ であると証明できない
    • $B$ は $b$ が自身に帰属しないと主張できる。これにより $B$ は $A$ からの入金を否認できる
    • $b$ は別の誰かに乗っ取られているかもしれない。これにより $A$ は取引不成立とみなして出金を拒否した上で $B$ に何らかのペナルティを課すかもしれない(出金した $c$ を上回る量の賠償請求を行うなど) \[ COIN : A[a] \xrightarrow{T( c )} E[b] \]

Coincheck 事例の事実関係は(今のところ)よく分かってない部分もあるが,知らない誰かがアドレスを乗っ取って知らない誰かへ「流出」したということであれば

\[ COIN : E[a] \xrightarrow{T(c)} E[b] \]

という図式も成り立つ。

しかし実態がどのようなものであれ「仮想通貨」の元帳には $a \xrightarrow{c} b$ という記録が事実として残るのみで,それが望んだ取引なのか何らかの不正を含んでいるのかといった点について「仮想通貨」は一切関知しない。

「仮想通貨」は P2P を前提とする

アドレスの帰属先を証明できないというのは実際の取引において致命的な問題となるが,それでもそれなりにまわっているのは「仮想通貨」がユーザ同士の P2P (peer-to-peer) な関係を前提にしているからである。 つまり「$a$ の帰属先は $A$ である」であり「$b$ の帰属先は $B$ である」であることを $A,B$ 相互に「信用」していることが取引の前提になっている。

しかし,見知った者同士の取引ならともかく,不特定の誰かを何の担保もなく「信用」するのは無理だし,その「信用」そのものを数学的に示す方法は存在しない。 存在しないのであれば,それに代わる「運用でカバー」するしかない。

この「運用」のロジックのことを「信用モデル(trust model)」と呼ぶ。 「仮想通貨」自体はアドレスに対する信用モデルを持たないが,「仮想通貨」を利用するサービスが何らかの信用モデルと組み合わせることによりアドレスの帰属先を証明することが可能になる。 また,出来のよい信用モデルを導入することにより不正取引を働くインセンティブが低下することも期待できるだろう。

おそらく「仮想通貨」を利用するユーザの多くはウォレット・サービスや通貨交換所が信用モデルを組み込むことを期待しているんじゃないかと思うが(投機目的で「仮想通貨」を運用している人はどうでもいいと思ってるかも知れない),実際にそれらのサービスがアドレスをどうやって「運用」してるのかは(私は現在の「仮想通貨」への興味が薄いので)知らない。

公開鍵基盤の信用モデル

ここで少し目先を変えて公開鍵基盤(Public Key Infrastructure; PKI)の信用モデルを2つほど紹介してみる。 公開鍵基盤というのは公開鍵が誰に帰属するかをサービスを横断して証明するための技術基盤である。

なぜ公開鍵基盤かというと,公開鍵を使った暗号通信の要件が「仮想通貨」による取引の要件によく似ていると考えられるからだ。 公開鍵を使った暗号通信には以下の4つの要件がある。

  1. 機密性(Confidentiality)
  2. 完全性(Integrity)
  3. 認証(Authentication)
  4. 否認防止(Non-repudiation)

暗号なので1番目は言わずもがなだが,2番目は電子署名によって達成できる。 そして3番目を達成する手段として公開鍵基盤がある。

ちなみに2番目と3番目が達成できれば4番目も達成可能なのだが,否認防止の重要性は前節までを見ればお分かりいただけるだろう。

X.509 の信用モデル

典型的な hierarchical PKI として有名なのが X.509 である。 Web の HTTPS 通信で必要な「電子証明書」は X.509 下で運用されている。

X.509 では認証局(Certification Authority; CA)が公開鍵(の帰属先)を証明する電子証明書を発行する。 電子証明書は具体的には,ユーザの公開鍵に対して認証局の鍵で電子署名を付与したものである。 では,認証局の鍵はどうやって証明するかというと,さらに上位の認証局が証明する。 ただし最上位のルート認証局は誰も証明してくれない(自己証明のみ)。

graph TD CA1["root CA"]-- Digital Sign -->CA2 CA1-- Digital Sign -->CA3 CA2-- Digital Sign -->Aa(("A[a]")) CA3-- Digital Sign -->Bb(("B[b]"))

X.509 は「認証局は信用できる」という前提に立った信用モデルと言える。 言い方を変えると,ある認証局が信用できるのであれば配下の認証局やユーザは総て信用できる。

X.509 は大規模かつ安定的な運用に向いているが,いったん認証局の信用が崩れると配下の認証局やユーザの信用が一気に崩れることになる。 そのため,認証局,特にルート認証局では高いセキュリティが要求される。

OpenPGP の信用モデル

OpenPGP における典型的な信用モデルは「信用の輪(web of trust)」と呼ばれている3。 信用の輪はユーザ間の P2P な関係がベースになっている。

信用の輪ではユーザ同士がお互いの公開鍵に電子署名を付与する。 たとえば $A$ と $B$ に面識があるなら,相互に電子署名を付与することができる。

graph LR Aa(("A[a]")) Bb(("B[b]")) Aa-- Digital Sign -->Bb Bb-- Digital Sign -->Aa

ここで3人目の $D$ に登場してもらおう。 $B$ と $D$ は面識があって電子署名を交わしているが, $A$ と $D$ は面識がないものとする。

graph LR Aa(("A[a]")) Bb(("B[b]")) Dd(("D[d]")) Aa-- Digital Sign -->Bb Bb-- Digital Sign -->Aa Bb-- Digital Sign -->Dd Dd-- Digital Sign -->Bb

この場合でも $A$ と $B$ との関係, $B$ と $D$ との関係をもとに $A$ から見て $D$ も信用できるとみなすのだ。

graph LR Aa(("A[a]")) Bb(("B[b]")) Dd(("D[d]")) Aa-- Digital Sign -->Bb Aa-. validate! .->Dd Aa-. trust .->Bb Bb-- Digital Sign -->Aa Bb-- Digital Sign -->Dd Bb-. trust .->Dd Dd-- Digital Sign -->Bb

信用の輪はコミュニティ内のアドホックな鍵管理に向いているが,全く関係のない第3者を証明するのは難しい。

X.509 と OpenPGP

山根信二さん等の「OpenPGPとPKI 」では X.509 と OpenPGP の PKI の比較を行っている4。 以下に比較表を示す。

特徴 X.509 OpenPGP PKI の形態 hierarchical PKI trust-file PKI 公開鍵の認証者 専門機関(CA) 各ユーザ 信頼点 ルート CA 利用者自身(面識) 認証の連鎖構造 ツリー型 ユーザ中心型 認証者を認証する根拠 利用者による選択 利用者自身 証明書の破棄と管理 あり 不完全 コスト 高い 低い

X.509 と OpenPGP の信用モデルはコンセプトが直交しているためどちらが正解とは言えない。 また相互補完的に運用することも可能である。

「仮想通貨」の信用モデルは?

「仮想通貨」のアドレスの運用についても,おそらく正解はひとつではなく,さまざまな信用モデルがありうると思う。 また信用モデルを「仮想通貨」システム自体に埋め込むのか周辺の(ウォレットや交換所などの)サービスで提供するのかというのも議論の余地があると思う。

「仮想通貨」が単なる投機物件ではなく generative な経済活動の技術基盤として生き残っていくことを期待したい。

ブックマーク

参考図書

photo
暗号技術入門 第3版 秘密の国のアリス
結城 浩
SBクリエイティブ 2015-08-25
評価

自作エミュレータで学ぶx86アーキテクチャ コンピュータが動く仕組みを徹底理解! 数学ガールの秘密ノート/丸い三角関数 数学ガールの秘密ノート/微分を追いかけて 情報セキュリティ白書2015: サイバーセキュリティ新時代:あらゆる変化へ柔軟な対応を 数学ガールの秘密ノート/数列の広場

SHA-3 や Bitcoin/Blockchain など新しい知見や技術要素を大幅追加。暗号技術を使うだけならこれ1冊でとりあえず無問題。

reviewed by Spiegel on 2015-09-20 (powered by G-Tools)

photo
UNDERGROUND MARKET ヒステリアン・ケース
藤井太洋
朝日新聞出版 2013-11-07
評価

UNDERGROUND MARKET アービトレーター ビッグデータ・コネクト (文春文庫) UNDER GROUND MARKET アンダーグラウンド・マーケット (朝日文庫) Gene Mapper -full build- 公正的戦闘規範 (ハヤカワ文庫JA) オービタル・クラウド 下 (ハヤカワ文庫JA) オービタル・クラウド 上 (ハヤカワ文庫JA) アリスマ王の愛した魔物 (ハヤカワ文庫JA) SF飯:宇宙港デルタ3の食料事情 (ハヤカワ文庫JA)

日本で「仮想通貨」が流行る前に登場した傑作。つかエンジニアは全員「UNDERGROUND MARKET」シリーズを読め!

reviewed by Spiegel on 2018-02-04 (powered by G-Tools)


  1. $A$ から見ると $B$ への「出金」, $B$ からみると $A$ からの「入金」と言える。 [return]
  2. 数式じゃなくて図式。数式記号を使ってるけどあくまで図式と言い張ってみる。 [return]
  3. OpenPGP の実装である GnuPG では信用の輪以外にも TOFU (Trust On First Use) などの信用モデルを実装している(参考: “TOFU for OpenPGP ”)。 [return]
  4. この論文は2002年に旧 OpenPKSD.org で公開されたが,サイトそのものが消失したため Internet Archive からサルベージした。 [return]

February 04 2018

LibreOffice と OpenPGP (仕切り直し) - openpgp

Git Extensions と LibreOffice 6 と OpenPGP」で LibreOffice 文書に OpenPGP 署名できなくて「何がいけないんだろう。 誰かやり方を教えてください」と締めくくっていたが,原因が分かったので仕切り直しの記事を書くことにする。 情報を下さった方には感謝を捧げます。

OpenPGP 署名について

まず LibreOffice 6.0 のリリースノートはこちら。

Linux 版では LibreOffice 5.4 から OpenPGP 署名とその検証が可能だったようだが, 6.0 で Windows 版および macOS 版でも可能になった。 他のプラットフォーム(Android 版のビュアーとか)で対応しているかどうかは不明。

LibreOffice ドキュメントへのデジタル署名は X.509 鍵では以前から可能だった。 デジタル署名を付与することにより以下が担保される。

  • 完全性(Integrity): 改竄の有無
  • 認証(Authentication): なりすましの有無
  • 否認防止(Non-repudiation): 文書作成の否認を防止(完全性と認証により達成可能)

デジタル署名可能な LibreOffice ドキュメントとして以下を確認している。

  • Writer (文書ドキュメント)
  • Calc (表計算ドキュメント)
  • Impress (プレゼンテーション)
  • Draw (図形描画)
  • Math (数式)

また LibreOffice では PDF ドキュメントへのデジタル署名も可能だが, OpenPGP 署名には対応していないようだ(X.509 のみ)。 残念(まぁ,他の PDF ツールが対応してないと意味がないし)。

この記事では以下の環境を前提に話をすすめる。

  • Windows 7 Professional SP1 64ビット版(Win10 でも大丈夫っぽい)
  • LibreOffice 6.0.0 Windows 64ビット版(Portable 版でもいけるらしい)
  • GnuPG 2.2.x

理由はすぐに分かる。

GnuPG のインストール

OpenPGP 署名を行うために GnuPG をインストールする。 インストールの手順については以下を参照のこと。

そしてインストール先だが,必ず既定の “C:\Program Files (x86)\gnupg” フォルダにインストールすること

どうやら LibreOffice は実行本体である gpg.exe の場所を “C:\Program Files (x86)\gnupg\bin” フォルダに決め打ちしているらしく,他のフォルダにインストールしても LibreOffice が認識しないのだ1。 ただ最近のインストーラはインストール先を指定する画面をすっ飛ばすみたい(?)なので,新規にインストールしている場合はあまり考えなくていいかもしれない。

なお LibreOffice が推奨している Gpg4win は不要で GnuPG の最小構成のみインストールできていれば問題ない。 フロント・エンドの Kleopatra も不要2

LibreOffice ドキュメントへの OpenPGP 署名

まずメニューから「ファイル(F)」→「デジタル署名(Q)」→「デジタル署名®…」と辿っていく。

LibreOffice: digital sign LibreOffice: digital sign

すると以下のウィンドウが表示される。

List of digital sigs (1) List of digital sigs (1)

ここで「ドキュメントに署名(D)…」ボタンを押すと署名可能な鍵のリストが表示される。

Select key Select key

OpenPGP 鍵であれば「支払期日」(何で?)の項目が “OpenPGP” と表記されている筈である(X.509 鍵なら “X.509” と表記される)。 鍵を選択して「署名」ボタンを押すとデジタル署名が付与される3

List of digital sigs (2) List of digital sigs (2)

デジタル署名は複数付与できる。 署名が完了したら「閉じる」ボタンを押して作業を終える。

正しいデジタル署名が付与されていれば,編集画面が以下のようになる筈である。

Valid sig Valid sig

またこの状態で編集作業を行うと以下の表示になる。

Editing Editing

ドキュメントの保存を実行するとデジタル署名が削除されるのでご注意を。

保存時に OpenPGP 暗号化オプションがあるんだけど…

文書を「名前を付けて保存」すると以下のオプションが表示される。

Save as... Save as...

ここで「GPGキーで暗号化する」をチェックして保存すると暗号化可能な鍵のリストが表示されて暗号化できるっぽいんだけど,実際にやってみると

Encryption error Encryption error

となって上手くいかない。 自分の鍵でもダメだったので,まだ機能が組み込まれてないとか?

OpenPGP 鍵でドキュメントが暗号化できると取り回しが凄く楽になるんだけどねぇ。 メールにパスワード書くとかマヌケなことをしなくて良くなるし(笑)

追記

真っさらな状態から OpenPGP 鍵を作って,その鍵を使って暗号化を行ったら上手くいった。 更にその状態で自分の公開鍵をインポートし,その公開鍵で暗号化を行ったところ,これも上手くいった。 どうも,私の鍵束もしくはその設定に問題があるっぽい。

というわけで,暗号化の方も使えるようだ。

  • 暗号化は1つの公開鍵のみ受け入れる? (2つ以上同時に選ぶとエラーになる)
  • 暗号化して保存した後にデジタル署名を行えば暗号化とデジタル署名を同時に行える

ブックマーク


  1. いや,これダメだろ。何でこんなダサい作りになってるんだ? 普通にインストールすれば PATH が張られるし,オプションに OpenPGP の項目があるんだから gpg.exe までのフルパスを指定できるようにすればいいぢゃん。 [return]
  2. 色々試行錯誤して Gpg4winKleopatra も不要と分かったときには椅子から転げ落ちそうになったよ。何だったんだ前回のアレは orz [return]
  3. 必要に応じて gpg-agent が Pinentry を起動して PIN またはパスフレーズの入力を促す。 [return]
Save as...
Encryption error
Editing
Valid sig
Select key
List of digital sigs (1)
Pinentry
List of digital sigs (2)

February 03 2018

週末スペシャル: 2019年の暦象,他 - remark

久しぶり,週末の戯れ言特集。 今回は Facebook の TL に書き散らしたものを中心にお送りします。

  1. 2019年の暦象
  2. Coincheck のアレ
  3. インフルエンザ過敏症とトリアージ
  4. 「公衆無線LANセキュリティ分科会報告書(案)に対する意見募集」

2019年の暦象

今年も予定通り国立天文台から来年(2019年)の暦象が公開された。

祝日から解説すると,12月23日の天皇誕生日がなくなる。 これは新しい天皇が即位されるのが2019年5月で,その時点から「天皇誕生日」が2月23日に変わるため2019年中は天皇誕生日はないということらしい。 また即位による祝日が5月1日になった場合は前後の平日も祝日になるようだ。

暦象については2019年は水星の日面経過がある。 ただし日本では見られない。 また金環日食もあるが日本では部分日食になる。

Coincheck のアレ

一応,重大なセキュリティ・インシデント(かつ現在進行形)なんで挙げておくけど,個人的には「仮想通貨」の投機には小指の先ほども興味が無いので完全に他人事である。 だいたい,あんな短期間に価値が乱高下する通貨なんか取引に使えないだろ。 もはやこれを「通貨(currency)」と呼ぶことさえ疑問に感じてしまう。 もう「チューリップ」でいいぢゃん。

以上,終わり。

インフルエンザ過敏症とトリアージ

これね、結局リスク・マネジメントの問題なのよ。

インフルエンザに対してリスクの高い(重症化しやすい)人はいる。 例えば循環器系にリスクがある人,子供や老人,等々1。 あるいは受験等の重要なイベントを控えている人などは出来るだけ避けたいと思うだろう。 そういった人(あるいはその家族)がリスクを下げるために予防接種や罹患時に早めの措置を行なうことは意味がある。

でもリスクというのは系(system)全体で最小になるように再配分(trade-off)しなければならない。 医療ってのは一種の公共サービスなんだから個人の思惑が通らないこともある。 リソースは有限なのだから。

で,(急変など)予測を超える事態が起きた場合に備えて(救急車の手配や医師やベッドの確保など)医療機関側の体制を整えておかなきゃいけないのに,実際には医療機関側のリソースは軽症者に使い潰されているわけ。 そこが問題で,そのことを(正しくリスクを再配分すべき)国が全く分かってないというのが批判の核心なのである。

もうね,インフルエンザだからって診断証明を要求するのは止めなよ。 日本の悪しき慣習。 “This Is Japan” って奴。 病院をバイオ・ハザードにするつもりか。

そろそろ日本人は「インフルエンザ過敏症」から卒業して正しいリスク感覚を身に着けるべきなんじゃないのか。 何度おなじ失敗を繰り返したら懲りるんだ。

まぁあとは「てうが」ね。

「公衆無線LANセキュリティ分科会報告書(案)に対する意見募集」

途中まで読んで「公衆無線 LAN 版安全・安心マーク」という語句を見た瞬間に読む気が失せた。 これが日本のネットワーク・セキュリティの現状である。

海外から来られる皆さん,日本政府はあてにならないのでぜひ自衛してください。

参考図書

photo
UNDERGROUND MARKET ヒステリアン・ケース
藤井太洋
朝日新聞出版 2013-11-07
評価

UNDERGROUND MARKET アービトレーター ビッグデータ・コネクト (文春文庫) UNDER GROUND MARKET アンダーグラウンド・マーケット (朝日文庫) Gene Mapper -full build- 公正的戦闘規範 (ハヤカワ文庫JA) オービタル・クラウド 下 (ハヤカワ文庫JA) オービタル・クラウド 上 (ハヤカワ文庫JA) アリスマ王の愛した魔物 (ハヤカワ文庫JA) SF飯:宇宙港デルタ3の食料事情 (ハヤカワ文庫JA)

日本で「仮想通貨」が流行る前に登場した傑作。つかエンジニアは全員「UNDERGROUND MARKET」シリーズを読め!

reviewed by Spiegel on 2018-02-04 (powered by G-Tools)


  1. それ以外では劇症型または劇症型が予測されるウイルスの場合とか。これは「新型インフルエンザ」のときに大騒ぎしたのでみんな覚えてると思う。でも劇症型のインフルエンザなんてそうそうないのよ。 [return]

URI エンコーディングについて - golang

今回は軽く小ネタで。

「パーセント・エンコーディング(percent-encoding)」というのがある。 これは文字符号を “%xx” 形式でオクテット単位の16進数コードに展開して記述することを指して言うらしい。 たとえば「こんにちは」は UTF-8 で「%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF」と表記する。

パーセント・エンコーディングは Web などの URI 表記で使われる。 詳しいことは RFC 3986 辺りを参照してもらうとして, Go 言語ではこれを標準の net/url パッケージで提供している。 ただし以下の2種類ある。

  • url.QueryEscape() / url.QueryUnescape()
  • url.PathEscape() / url.PathUnescape() 1

どう違うかは実際にコードを組んでみたほうが早いだろう。

まずは url.QueryEscape() / url.QueryUnescape() のほうから

package main

import (
    "fmt"
    "net/url"
    "os"
)

func main() {
    str0 := "こんにちは 世界"

    str1 := url.QueryEscape(str0)
    fmt.Println(str1)
    // %E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF+%E4%B8%96%E7%95%8C

    str2, err := url.QueryUnescape(str1)
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        return
    }
    fmt.Println(str2)
    // こんにちは 世界
}

次に url.PathEscape() / url.PathUnescape() のほう

package main

import (
    "fmt"
    "net/url"
    "os"
)

func main() {
    str0 := "こんにちは 世界"

    str1 := url.PathEscape(str0)
    fmt.Println(str1)
    // %E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%20%E4%B8%96%E7%95%8C

    str2, err := url.PathUnescape(str1)
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        return
    }
    fmt.Println(str2)
    // こんにちは 世界
}

パッと見で分かりやすいのは空白文字の扱いだろう。 両者の違いは関数の名前の通り URI の query 部分(part)で使うか path 部分で使うかの違いである。

ちなみに URI を

foo://example.com:8042/over/there?name=ferret#nose

とするなら,構成要素(component)は

部分名 部分 scheme foo authority example.com:8042 path /over/there query name=ferret fragment nose

という感じに分類される。 上手く使い分けよう。

ブックマーク

参考図書

photo
みんなのGo言語【現場で使える実践テクニック】
松木雅幸 mattn 藤原俊一郎 中島大一 牧 大輔 鈴木健太 稲葉貴洋
技術評論社 2016-09-09
評価

WEB+DB PRESS Vol.95 プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES) プログラミングElixir Go言語によるWebアプリケーション開発 詳解MySQL 5.7 止まらぬ進化に乗り遅れないためのテクニカルガイド (NEXT ONE) WEB+DB PRESS Vol.94 Docker スターティングGo言語 (CodeZine BOOKS) オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方 WebデベロッパーのためのReact開発入門 JavaScript UIライブラリの基本と活用

リファレンス本なのに索引が貧弱。これなら Kindle で買ってもよかったか。 1.7 への言及があるのはよかった。

reviewed by Spiegel on 2016-11-17 (powered by G-Tools)

photo
Go言語によるWebアプリケーション開発
Mat Ryer 鵜飼 文敏
オライリージャパン 2016-01-22
評価

プログラミング言語Go マイクロサービスアーキテクチャ nginx実践入門 (WEB+DB PRESS plus) 改訂2版 基礎からわかる Go言語 サーバ/インフラエンジニア養成読本 DevOps編 [Infrastructure as Code を実践するノウハウが満載! ] (Software Design plus)

日本語監訳者による解説(付録 B)が意外に役に立つ感じ。 Web アプリケーションだけでなく,サーバサイドで動く CLI アプリへの言及もある。

reviewed by Spiegel on 2016-03-13 (powered by G-Tools)


  1. url.PathEscape() / url.PathUnescape()Go 1.8 から追加された。 [return]
節分なのでビールと枝豆
via Instagram bit.ly/2EATdGZ

Git Extensions と LibreOffice 6 と OpenPGP - openpgp

Git Extensions 2.51 と OpenPGP 署名

先日 Git Extensions 2.51 がリリースされた。

2.51 では色々と機能追加・改善があるが,個人的な目玉は OpenPGP 署名に対応したことだ。 メインのリポジトリ・ウィンドウでは “GPG” タブが追加され,コミットの電子署名の検証ができるようになった。 こんな感じ1

GitEx: gpg validation GitEx: gpg validation

“GPG” タブを表示させるには設定で「GPG 情報を表示」にチェックを入れる。

GitEx: setting GitEx: setting

更にコミットやタグ作成時に電子署名を付与することもできる。 コミット時はこんな感じ。

GitEx: commit GitEx: commit

タグ作成時はこんな感じ。

GitEx: create tag GitEx: create tag

GitGnuPG を連携する方法については以下を参照のこと。

LibreOffice 6 と OpenPGP 署名

LibreOffice 6 がリリースされた。

これも色々と機能追加・改善があるが,この記事ではやはり OpenPGP 署名について。 Linux 版では以前からできてたそうだがバージョン 6 で Windows や macOS でもできるようになった。

LibreOffice: digital sign LibreOffice: digital sign

つか,うまくいかないんだけど!

どうも GnuPG 本体だけではダメみたいで Kleopatra などのフロントエンド・ツールが必要なようだ。 Windows 環境では Gpg4win を導入することで関連ツールを一度にインストールできる(macOS では GPG Suite を導入すればいいらしい)。 GnuPG 側と上手く連携できていれば「証明書の選択」ダイアログに電子署名可能な鍵が表示されるらしい。

でもダメなんだよねー。

Empty Empty

何がいけないんだろう。 誰かやり方を教えてください。 はっきり言って Gpg4win 要らないので使えないなら削除したい。

【2018-02-04 追記】 原因が分かったので仕切り直した。

ブックマーク


  1. 一部文字化けなのはご容赦。文字化けしてるのは時差表示の部分なのだが,うちの Windows 環境ではこの部分を Shift-JIS で吐き出すので文字化けしてしまうのだ。 display-charset オプションを弄ってもダメぽい。コマンドプロンプトや NYAGOS で使うぶんには問題ないんだけどねぇ。 [return]
Empty
LibreOffice: digital sign
GitEx: setting
GitEx: gpg validation
Older posts are this way If this message doesn't go away, click anywhere on the page to continue loading posts.
Could not load more posts
Maybe Soup is currently being updated? I'll try again automatically in a few seconds...
Just a second, loading more posts...
You've reached the end.

Don't be the product, buy the product!

Schweinderl