So-net無料ブログ作成
プログラミング ブログトップ
前の10件 | -

Golangを(雑に)学び直す。 [プログラミング]

しばらくGolangをやっていなかったので、お勉強サイトやリファレンスサイトで勉強するつもり。そういや、Golangの本って一冊も買っていないなぁ。結局、仕事で使わないものは買わない傾向にあるのだが、昔はわりと興味本位で色々買っていた。特にLinux関係は無駄な出費が多かった気がする。まぁ無駄なところも血肉になっているところもあるんだけどね。そういや最近技術書は全般的に買ってないっすね。

ともあれ、何か作りたい気持ちはあるので、改めてGolangを隅々まで勉強しておいた方がいいなと思ったりしている。文法は当然のこと、標準ライブラリにあたるところはできれば一回はそれぞれ使っておきたい。まぁimportするものは標準に用意されているものもたくさんあるので、ガチにやろうとするとそれなりに厳しいものがあるかも知れない。


まずプログラミング言語としての、C言語との差分を考えていこう。言語として近いものはやっぱりC言語かなと思うし、C言語ならそこそこ分かっているし、言語仕様が小さい同士なので比較しやすいんじゃないかと。というか、ここ10年くらいで流行っている言語はLLが多かったし、それらって基本的にオブジェクト指向言語だったりするので、あまりに差分が大きくなりそうな気がするしね。

Golangの環境構築などは書かない。基本的に言語仕様だけにしたい。しんどいw。




GolangのC言語との差分
ただ下のサイトを箇条書きにしただけ+他のサイトで補遺
http://gihyo.jp/dev/feature/01/go_4beginners/0001

●C言語にあって、Golangにないもの

・while, do while文(for文のみ)
・文末の;はなくていい
・三項演算子
・マクロ
・ポインタ演算(ポインタ自体はある)
・暗黙の型変換
・例外(try catch文がない。defer, panic, recover)
・ヘッダファイル

書きやすく、読みにくい分かりにくいものは廃止されているっぽい。



●C言語になくてGolangにあるもの、同じようだが違うこと

・string型が組み込み型にある。(C言語はchar*)
・変数の宣言の順が「var 変数名 型 = ほにゃらら」
・()でいっぺんに多くの変数を宣言できる。
・変数宣言と初期化を := で型推論してくれる。
・初期化されない変数はゼロ値で初期化される(MSのコンパイラでは0で初期化してたりしてた)
・NULLがnil(ざっくりすぎるが…)

・ガベージコレクションがあるため、自動変数でなくても意識的にメモリを解放しなくていい。

・if文に条件の( )がない。
・if文で繰り返す文が一行の場合、{ }が省略できなくなった。
・式(条件)を書くところに、一般的な文は書けない。

・for文にも条件の( )がない
・for文の、式(条件)を書くところにも、一般的な文は書けない。
・forで無限ループをするときに(;;)さえいらず、for{ }でよい。

・switch文で一つのcaseが終わると、その次のcaseに移らず処理が終わるため、breakが要らない。
・switch文で今までの言語の通りに次のcaseを実行させるには、fallthroughを明示的に書く。
・switch文のcaseに値だけでなく、式も書けるようになった。


・enumと同じことをするには、const ( iota でできる。

・配列は [n]T で定義できる(C言語とは前後逆)。
・[...]Tで必要な配列の長さを暗黙的に指定できる。
・長さが違う配列は、要素の方が同じでも違う方として認識。
・s[2:4]とコロンで挟んで範囲指定して切り出すことができる。[:]で全部指定。
・for文の中でrangeを用いると,添字と値の両方が取得できる(スライス、マップ、チャネル共に)。

・可変長配列のスライスは [ ]Tで定義する。(動的にやろうとするとmallocとか使うのが普通でした。)
・append()でスライスの末尾に追加(組み込み関数)。
・func sum(nums ...int) などとするとintのスライスとして引数を受け取れる。

・マップでキーバリュー形式を使える。
var week map[int]string = map[int]string{}
week[1] = "Sunday"
week[2] = "Monday"
fmt.Println(week) // map[1:Sunday 2:Monday]

もちろんkeyがintじゃなくてもいい([]stringでできるっしょ)。
宣言と初期化を一度にやると下記になる。
week := map[int]string{
    1: "Sunday",
    2: "Monday",
}

・マップからデータを消すときにはdelete()を使う(組み込み関数)
・forとrangeで、Key-Valueを取り出せるが順番はまちまちらしい。

・マップ、スライスは参照型なので、普通はポインタを使う必要はない。


・関数の返り値は引数の次に書く。
・関数の返り値は複数あっていい(その場合丸括弧で囲む)。returnのあとカンマで区切って返す。
・関数の引数は同じ場合、最後の一つにまとめられる。
  func sum(i, j int) { // func sum(i int, j int) と同じ
・関数から返り値を受け取る時は数を揃え、要らない時は_で埋めておく。
・返り値でエラーを返す場合、最後の返り値に設定するのが慣習。
・返り値で異常を表現できない場合、panicとrecoverを使う。

・無名関数を作ることができる。
・関数を変数に代入したり、引数に渡したりできる。


・defer文が付いたら関数を抜ける前に必ず実行される(ファイルのClose()などによく使う)。
・ゼロ除算などのエラーはパニックとして発生。
・パニックで発生したエラーはrecover()で取得。deferの中に書けばエラー処理してから関数を抜けられる。
・panic()で自分でパニックを発生させることができるが、重大なエラーや大域脱出が必要な場合などに限られるべきで、基本はエラーは関数の呼び出し側に返す。


・typeで独自の型を作れる(C言語のtypedefと何が違うのか?)。

・構造体のフィールドも初期化しないとそれぞれゼロ値で初期化。
・構造体は参照型じゃないので、関数に渡す時にそのまま渡すと値渡しとなる。
・コンストラクタはないので、Newで始まる関数を定義し,その内部で構造体を生成するのが通例。
・structがメソッドを持つことができる。

・ゴルーチンでスレッドを使うことができる。関数の前にgoというキーワードを付けるだけ。
・チャネルでゴルーチン間でデータをやり取りできる。make()でチャネルを生成する。





細かいところも書いたので、ずいぶんな分量となった。C言語前提でこれだから小さいと言われる言語体系も実際に使っていくとなるとそんなに小さい気はしない。ただリファレンスなしに覚えられそうな量ではある。

基本、一つのサイトを箇条書きにしただけなのでモレはあるとは思うので、気がついたらここに加えていくかもしれません。

タグ:Golang
コメント(0) 
共通テーマ:パソコン・インターネット

MacでGolangでhttpdでTLSでLet's Encryptを使ってみた。 [プログラミング]

まずGolangでセキュアなWebサーバを立ち上げるところからやってみる。最初はオレオレ証明書でやる。ブラウザで警告は出るだろうけど気にしない。

https://github.com/denji/golang-tls/blob/master/README.md

初めのコードは
package main

import (
    "net/http"
    "log"
)

func HelloServer(w http.ResponseWriter, req *http.Request) {
    w.Header().Set("Content-Type", "text/plain")
    w.Write([]byte("This is an example server.\n"))
}

func main() {
    http.HandleFunc("/hello", HelloServer)
    err := http.ListenAndServeTLS(":443", "server.crt", "server.key", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

で、simpleHttpd.goという名前をつけて、以下のコマンドを打ちました。オレオレ証明書。
openssl genrsa -out server.key 2048
openssl req -new -x509 -sha256 -key server.key -out server.crt -days 3650
go build simpleHttpd.go
./simpleHttpd


https://localhost/hello

でうまくいった。案の定、ブラウザのワーニングが出て面倒くさいけど。これってTLSのバージョンとかどうなっているんかな? curlで調べる。

https://qiita.com/Esfahan/items/53399964cb76cdb87e60

curl -s -v --tlsv1.0 https://localhost/hello


証明書がダメだというエラーが出るけど-kオプションで無視できるようだ。

http://www.turbolinux.com/support/document/knowledge/866.html

$ curl -k -s -v --tlsv1.0 https://localhost/hello
《中略》
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* SSL_write() returned SYSCALL, errno = 32
* Failed sending HTTP2 data
* nghttp2_session_send() failed: The user callback function failed(-902)
* Connection #0 to host localhost left intact

とエラーが出てくる。どうやらHTTP/2を使っている模様。HTTP1.1だと思っていたから手間が省けた。

http: TLS handshake error from [::1]:63217: remote error: tls: unknown certificate authority

サーバ側でも上記のエラーが出てる。HTTP2はTLS1.1は使わないっぽい。なもんでTLS1.2を使ってみる。

$ curl -k -s -v --tlsv1.2 https://localhost/hello
《中略》
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x7fa353000400)
> GET /hello HTTP/2
> Host: localhost
> User-Agent: curl/7.54.0
> Accept: */*
> 
* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
< HTTP/2 200 
< content-type: text/plain
< content-length: 27
< date: Tue, 11 Dec 2018 23:56:58 GMT
< 
This is an example server.
* Connection #0 to host localhost left intact

はい、HTTP/2でTLS1.2を使っていることがわかりました。Golangの標準パッケージにHTTP/2がもう組み入れられていたんだね。いつだったんだろ。というか、TLSのバージョンはこういう方法でしか確かめられんのか…。




オレオレ証明書を使っているのも何なのでLet's Encryptを使ってみたいと思います。一度node.jsで使ったことがあるので、そのノウハウは使えるんじゃないかと思ってはいます。

brew install certbot


したら依存性で結構色々入れられた。あ〜入れられるコマンドの名前から違いますね。

長くなりそうなので、Let's Encryptは次の機会にします。

タグ:Golang
コメント(0) 
共通テーマ:パソコン・インターネット

GitHubのためにAtomでMarkdownを書いてみる。 [プログラミング]

プログラマーじゃない人は何のこっちゃという感じなのでしょうが、Markdownという記法があって、それを書けばプレーンテキストでもリッチな表現ができるので、Atomというエディタを使って書いてみた、という話です。プログラマー以外の人はあまり利益がないものでしょう。そもそもプログラムソースのREADME.mdぐらいしかマークダウンの文章って見たことがないし。

技術系の他には理数系ぐらいしか利用価値はなさそうです。

https://trap.jp/post/371/

結局、数式が手打ちで打てるっていうメリットしか謳ってないなココ。普通の人がLaTeXに触れること自体ほとんどないと思われますし、どちらにしても限られた人のものと感じます。ともあれ、HTMLのタグを書かずに文章装飾をすることができるというのが主目的なので、お手軽にできたら良いなと思ったりした。


Markdownに特化したエディタとかもあるようだけど、別にそんなにマークダウンの文章を書くつもりもないので、Atomの付属機能でやることにした。Atomといえば、HDDのCPU遅めのマシンでやったら、かなりストレスが溜まるレベルの速度でしか起動したりしなかったのを覚えています。ともあれ、サクラエディタとかも遅かったので、最近のエディタはメモリもCPUも食うものだと思って諦めました。しかし、MacBook Airのメモリを16GBまで増やしておいてよかった。Atom Helperというのが1GB強使っているんだけどAtomメモリ食いすぎだよw。

というかAtomは最初からMarkdownのプレビューの機能とかあるんやね。プラグインみたいに落としてきて機能を付け加えるんかと思っていたから、最初から入っているとは思わなかった。そんでググったサイトに「Markdown-Writer」と「markdown-scroll-sync」を入れとけみたいなことを書いてあったので、定番的に入れてみました。SSDの肥やしにはなるかもしれないけど、それによって極端に遅くなることもないでしょう。

ただMarkdown-scroll-syncはすぐに動かなくて色々原因を調べてみたんだけど、Atomを再起動したら動くようになった。これはmarkdownのソースとプレビューの位置が連動して動くようになるから便利です。というか、ないとシンドい。今度からパッケージ入れてすぐに動かなかったらAtomを一回落としてみよう。


最初はGitHubを見て良さそうなREADME.mdのソースをコピってきて、それをAtomに貼り付けてPreviewを見てみた。比較してみてみればだいたいわかる。というか、そんなにmarkdown特有の感じはしないんだけど、ちょっと加えるだけで随分HTMLで装飾したようなものができるなぁと感心しました。

特にソース部分なんかはガチでHTML+CSSでやったらしんどそうなものが、かなりお手軽にできるというのは良いことですね。

``` HTML

```
の間に挟むだけで、HTMLが色分けされてHTMLで出てくるというのは結構感激ものでした。ブログにかかわらずHTMLでHTMLを表示しようとすると、HTMLタグが邪魔して表示しにくかったりして、英字の小なり記号<が%でエスケープしないといけなかったりで面倒だったのですが、直接示せるというのは良いものですね。とはいえ、ブログとかで全部HTML機能を実装するってのも難しい話だし、自分でHTMLを入れたい場合には困る。

何にしても案外マークダウンって良いものですね。正直、記法を覚えるほど書きたくはないんだけども、Markdown-Writerでチートシートも見られるし、メニューからも入れられる。ともあれ、使うものというのは限られていて、多用するものは覚えられそうだ。HTMLほど統一感はないけど、簡易的な記法が多いし。

おそらくGitHubの機能もあってMarkdownの機能が高まっているのだろうけど、それがなくてもHTMLに代わる機能があるのは良いですね。今後はGitHubのREADME.md以外のものでもメリットがあったら使ってみたいと思う。にしてもAtomはたかがエディタのくせにかなりハードウェアリソース要求するんだな。21世紀のエディタみたいなことを書いてあったと思うんだけど、メモリの消費量は少なくとも21世紀級であると言えるだろう。

コメント(0) 
共通テーマ:パソコン・インターネット

HandsonTableをハンズオンしてみる。 [プログラミング]

HTML5というかJavaScriptで、ブラウザ上でExcelのようなグリッドを実現するHandsonTable。他にもグリッドを実現するソフトはいくつかあるようなのだけれど、最初に使って問題なく使えたので、他のは使っていません。フリーで簡単な用途だけだったらこれでも良いかなと思いました。Pro版では色々機能が使えるようなので、本気で仕事に使うとかするときにも良いかもしれません。

そんなわけでHandsonTableをハンズオンするわけですが、最初ハンソンテーブルと勘違いして読んでいました。その後もハンソンなのにhansonじゃねぇのかよとか思っていましたが、hands-onなのね。そういうスペリングするのかと思ってしまった。

実際の動作サンプルはこっちを見てもらうことにして

https://miff.blog.so-net.ne.jp/2018-12-05-1

はまったところを中心に内容をレクチャーしていく。

ソースはこちら。

https://github.com/miffy/handsontable_sample/blob/master/README.md

このブログにソース埋められる方法があるみたいなんだけど、README.mdとかだとダメなんかな。ともあれ簡単に解説していく。

HTML部分はExcelのようなHandsonTableのグリッドと、そこから生成されるHTMLコードを格納するテキストエリアと、HTMLコードを生成するボタンになっています。それぞれIDが付けられていてJavaScriptでラベリングというか、それを目印に操作を行っていくわけです。

JavaScriptのここでHTMLのIDを取ってくる。操作的には一般的なものだと思います。オブジェクトかなんか得られるのかな?
var grid = document.getElementById('grid');
var output = document.getElementById('output');
var getButton = document.getElementById('getButton');


ふつうだとHandsontableのオブジェクトを生成する際に、データを渡してグリッドの行と列の数を自動的に特定するのだけれど、今回は最初から何も入っていないものなので、startCols, startRowsで明示的に指定してあげる。
var table = new Handsontable(grid, {
    startCols: 10,
    startRows: 20,
    width: 400,
    height: 400,
    outsideClickDeselects: false,
    selectionMode: 'range',
});

明示的に指定してあげるのは良いけど、幅も適当に指定されてしまうのでブログとかの限られた領域ではwidth, heightで制限してあげて、スクロールバーを出るようにしてあげる。セルに入れる文字数によって幅と高さが広がってしまうので書いてあげたほうがいい。

outsideClickDeselectsははまった。falseにしないとボタンを押すときに選択範囲が消えて、グリッド部分から情報が取って来られなくなる。これは何が悪いのか他に色々試してみてしまったけど、ただ単に外側選択の時に選択がなくならないような設定があったというオチでした。

というか、大体外側触ってもセルの選択をなくすとか不便すぎるからデフォルトで選択したままにして欲しいんですが…。これはわかんないとハマりやすい。そもそも、そういう設定があるのかどうかを調べようとするところまで行くのが大変。自分はブラウザのデバッガがエラーを吹いていたので気がついたけど、本家の通りにやっていない限りはハマること間違いなしだよな。他に問題があるかと思っちゃうもん。


getButton.addEventListener('click', function(event) {

のところですが、ここが本丸で、グリッドに入力して、HTMLテーブルにしたい部分を選択して、ボタンを押した時の挙動ですね。これも一般的な表記かと思います。

  var selected = table.getSelected();
  var data = [];
  for (var i = 0; i < selected.length; i += 1) {
    var item = selected[i];
    data.push(table.getData.apply(table, item));

ここでHandsontableで選択したセルの情報を取ってきています。それを配列に詰める。うまいことに行列が配列の入れ子に分けて保存されているので、だらーっとセルの内容が入れられるってこともないです。そこのところの仕組みがどうなっているかはよくわからん。

  //console.log(JSON.stringify(data));
  //output.value = JSON.stringify(data);

コメントアウト部分はHTML形式で吐き出す前に、JSONで出していたんですよね。というか、本家がJSONで吐き出していたので単にその名残です。console.logの方はブラウザに吐き出して、output.valueはHTMLのテキストエリアに吐き出しているところです。JSONってJavaScriptの内部データを吐き出すフォーマットなんだなと何となく今更ながら感じている。


実際に内部データをHTMLテーブル形式に並べるところ。
  var htmlstr = "<table>\n";

  for ( var keyA in data ) {
    for ( var keyB in data[keyA] ) {
	  htmlstr = htmlstr + "<tr>\n";
      for ( var keyC in data[keyA][keyB] ) {
        htmlstr = htmlstr + "<td>";
	    if(data[keyA][keyB][keyC]!=null){
		  htmlstr = htmlstr + data[keyA][keyB][keyC];
		}
        htmlstr = htmlstr + "</td>\n";
	  }
	  htmlstr = htmlstr + "</tr>\n"
    }
  }

  htmlstr = htmlstr + "</table>"

配列が空のJSONを見ると、[[[]]]と三重構造になっているので、ループを回してデータ取るところも三重構造にしないとあかんかった。keyAとかBとかの名前には意味がありません。参考にして取ってきたところがそうしていただけで変えてないだけです。

本当は$keyAとか気持ち悪い変数名だったので、$は取りましたけどね。というか、以前のJavaScriptでは変数に$を付けることが普通だったようです。別に決まったノーテーションというわけではないのに、どうしてそういう書き方が一般的だったのか意味不明ですね。今では一般的ではないと思います。ごく初期の慣例的に行われていたことだったのかもしれません。

そしてセルが何も入っていないとnullが入ってきて、放っておくと"null"という文字が入ってしまうので、それを阻止しています。空白のところってのもあり得ないからどうせ後からでも入れるので、その時に削除してもらえばいいかなと思ったのですが、デバッグの時にあまりに鬱陶しかったのでnullが入らないようにしました。

見出しで一番上をthタグで入れればよかったんですが、面倒で入れていません。大した手間じゃないから入れればいいのにね。まぁコメントに入れろやと言われたら入れます。数行入れるだけなので時間はかからないでしょう。

あ、そうそう。JavaScriptって+=演算子使えないのな。Javaでは書けたんだったっけ? ググってみたらかけるみたい。プリミティブ型はもちろん、文字列型もいけるらしい。というか、+=演算子使えないとか書き方が冗長すぎて鬱陶しいんだが…。

  output.value = htmlstr;
  output.select();
  var retVal = document.execCommand('copy');

最後は生成したHTMLソースをテキストエリアに吐き出してそれを選択してクリップボードにコピーすることをしています。どこぞで仮想的なテキストエリアを作って実際的にはコピーだけするという方法もあったのですが、別にテキストエリアを作らない意味もなかったのでそうしませんでした。というか、クリップボードにコピーされたことを示すダイアログなりアラートを出さないといけなかったし、そっちの方が面倒だったりしたのでやめました。

そんなわけで、こんな短いコードでExcelもマクロもなしで、HTMLでHTMLテーブルを生成することができました。これというのもHandsonTableのおかげですね。これを自分で作れとなると数年かかってしまいそうなのでCommunity Editionを提供してくれるのはありがたいことです。

自分もこういう有用なソフトを書ければいいのになと切に思います。OSSで食っていけたらいいのになとぼーっと考えることもあるのですが、それができるのは一部の優秀な人だけなんでしょうね。はやくゆうしゅうになりたーいぃ(妖怪人間のていでw)

タグ:JavaScript
コメント(0) 
共通テーマ:パソコン・インターネット

GoでWebサーバ計画再始動 [プログラミング]

GoでHTTP/2サーバを実装しようとしたらプロトコル実装が既にあったので、車輪の再発明はバカっぽいなぁと思ってやめていた。HTTP/3もできるって話なのでやろうかなと思っていたけど、どうせほかの人に先を越されるのでやめて実際のWebサーバを作ろうかと思ったりした。

よくスクリプト言語とかで、Webサーバをフロントエンドとして、バックロジックを書くみたいなことをやっている事が多いと思う。RubyだとWebrickとかがあったが、基本的に既存のWebサーバをかまして運用したほうがいいって話になってたりするので、パフォーマンスなどの面でWebサーバ自体はスクリプト言語で動かさないほうがいいのでしょう。

んで、Go言語でWebサーバを作ろうとすると、パフォーマンスなんかはLL言語よりかは良いのだろう。Webサーバ部分を軽く作って、Webアプリのロジック部分を軽く分離して、同じくGo言語で組み入れてしまうというアプローチはどうだろう。基本的にWebサーバとして使う部分は作っておいて、あとは自分で組み入れてしまうという考えは、コンパイル言語のWebサーバとしてはあまりない気はする。基本CGIみたいな外付けプロセスを、LL言語のWebサーバみたいに言語内に組み入れてしまう、というのはどうだろう。

本来ならコンパイルされたプロセスにお伺いして動かすのが一般的なんだろうけど、それをWebサーバとして一つに固めてしまう。プログラムの粒度も結合度も高すぎると言われそうだが、Linuxだってモノリシックで台頭できたではないか。ハードウェアとしても単一CPUなどよりもSoCの世界が普通になってきているし。結局、プログラマの意識なんだと思うんだよね。確かに細かめに機能分けしてモジュール分けするのは良いのかもしれないけど、最終的には全体が一つになって動くんだし。




そんなわけでGolangをMacBook Airに入れて設定してみたい。Goの設定って久しぶりだな。まとめておさらいしておこう。

brew install golang


GOPATHの設定は最近(でもないか)変わったっぽい。なんかユーザーフォルダに決め打ちでがっつり作るのか?

https://golang.org/doc/code.html#GOPATH

新しいMacBook Airには、~/.bash_profile も~/.bashrcもないので作らないといけない。

touch ~/.bash_profile


これを書くようになった。
export GOPATH=$(go env GOPATH)


該当のディレクトリは事前に作成しなくて良いのかな?

とりあえずgo getしてみようと思う。
go get github.com/PuerkitoBio/goquery

一番最近作ったソースがgoqueryを使っていたので入れてみた。

あ、勝手に-/go ディレクトリ作られた。というか、ユーザーディレクトリにドットで隠しもしないディレクトリ作ってとか横柄すぎないか? まぁそれだけの忠誠心を試されるということか…。




再始動ということで、前のマシンのソースをさらってみたが大したソースは出てこない。このブログを見てみたら、やっぱりそこそこしかやっていない。まぁ当然か。

HTTP/2.0はTLSを使うのでそこから [2015/08/15 05:32]

Goで簡易Webサーバ4 [2015/08/14 09:17]


HTTP/1.1からのHTTP/2.0 [2015/08/13 07:37]

Goで簡易Webサーバ3 [2015/07/16 08:02]

Goで簡易Webサーバ2 [2015/07/13 06:49]

Goで簡易Webサーバ1 [2015/07/12 09:46]

Goで簡単なWebサーバを作ってみようか画策中。 [2015/07/08 12:46]


何かTLSと一緒にHTTP/2をやろうとしているので、あまり意味がよくわからなくなっている。現在の状況でできることを再度検証してみる。

まずはHTTP/2の前に、普通のHTTP 1.1でSSLというかTLSを使うときはどうなのか、というところから行くべきだろう。幸い今はlet's encryptというタダのSSL証明書があるので、検証はお金をかけずにできるようになった。

2016年の終わり頃にサンプルがあってググっても一番にそれが出てくる。

https://github.com/denji/golang-tls

三つのサーバの実装があるみたい。一つはクライアントだから三つだと思うが、クライアントはTLS対応のツールとかないっけ? curlはTLS対応してるよな。下のようにできるっぽいから一般的なクライアントでやりたい場合は、Webブラウザかcurlでやったほうが一般的だろう。

https://qiita.com/Esfahan/items/53399964cb76cdb87e60

基本的に標準ライブラリで対応できてそう。

"crypto/tls"
"net/http"

あたりでインプリできて、その他の外部ライブラリを使っていないようなので、今後の潰しも利く。とりあえずできるのかどうかをLet's Encryptを絡めて実際にやってみたいと思う。HTTP/2はあるのかもしれないけど、後で見てみることにする。

タグ:Golang
コメント(1) 
共通テーマ:パソコン・インターネット

シンプルなHTMLテーブル製造機を作ってみた。 [プログラミング]

自分がやりたかったのでは質素なHTMLのテーブルを簡単に作りたかっただけ。テーブルというとわかりにくいけど、HTMLで示される表のことです。Excelなどで吐き出すと表の変な属性がついたり、フォントが決め打ちになっていたりしていらない記述が多くなる。その分、気にするほどではないが読み込みが重くなるしリソースの消費も多くなる。

そんなわけで、Excel VBAでHTMLのテーブルのタグだけを質素に出力するものを作ったが、Excelがないところでは使えない。LibreOfficeでも動くには動くがWindowsで便利なところが使えない。

そんなにHTMLのテーブルを使うことはないんだけど、いざ作るとなると面倒だし、手でタグを打っている場合じゃないし、ブログでHTMLタグを打たなくていい昨今、そんなことをしている人はほとんどいないだろう。そんなわけで、HTMLはHTMLに作らせようという目論見でHandsonTableに手を出した。

下のテーブルに入力して、テーブルにしたい範囲を決めてボタンを押すと、HTMLテーブルソースがクリップボードにコピーされます。ただそれだけだけど、実際手で打とうとするとかなり面倒な作業なので、かなりの省力化になると思います。本当にテーブルとその中のテキスト以外は入らないので、必要に応じてタグで装飾してみてください。初めからごっちゃりいらないタグがついているのを消していくのを考えると気が楽です。













何か機能を追加してほしい場合にはコメントでも残していってください。

HTMLをHTMLで(Javascriptで)生成するのっていいよね。基本的にコード生成をそれと同じ言語でできるっていうのは、その言語が熟成しているということに他ならないと思います。HandsonTableみたいないいソフトを作れたらなぁ。作例はソースを見てもらえばいいんだけど、そのうち簡単なレクチャーをしたいと思います。





タグ:JavaScript
コメント(1) 
共通テーマ:パソコン・インターネット

ブログネタがない、ので暗号化を少し [プログラミング]

何かしていればなにがしか書くことはあるのだが、暑くて何もしてなくて書くことがない。まぁそろそろiPhoneの新製品が出るだろうし、MacBookかMacBook Airの新製品が出るだろうから、もう少しするとネタにも困らなくなるんだろうけど、それも何か他力本願な気がする。

今、暗号のAESを簡単に調べてソースとかねーかなと見てみたりしているのだが、あんまり有望そうなソフトもないっぽい。ECBという一番簡単にクラックできるものを実装しているものが多いような気がする。それを使うならオレオレ暗号化の方がいくらかまともかもしれないと思うのだけれども。

そもそも3DESとかどんなもんかとか分かっていないのに、AESも何もあるもんかいという事もあろうかとは思うのだが、今更使ってないDESのアルゴリズムを理解するのも面倒なのでやらない。というか、基本的に暗号化ってコンピューターになっちゃうと鍵と暗号化されるデータのXORがほとんどなんだろうと思っちゃうんだけどね。

鍵データの適用が分かってしまわないように、いい感じにどうシャッフルするかとかそういう事なんだろうけど、実装の面倒くささはいいにしても、暗号化復号化のコストは重要なところなんだろう。あまり重すぎる処理というのもどこでも使えるようにはならないからね。処理の重さと処理速度は案外大事だろう。

AESにはいくつかモードがあって、基本的な処理は同じかと思うが、最終的に違う暗号化くらいにやっていることが違うっぽい。

・ECB (Electronic CodeBook mode)
・CBC (Cipher Block Chaining mode)
・CFB (Cipher FeedBack mode)
・OFB (Output FeedBack mode)
・CTR (CounTeR mode)

とあるらしい。これは本で読んだ。

暗号技術入門 第3版

暗号技術入門 第3版

  • 作者: 結城 浩
  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2015/08/26
  • メディア: 単行本



暗号技術入門 第3版 秘密の国のアリス

暗号技術入門 第3版 秘密の国のアリス

  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2015/08/25
  • メディア: Kindle版


推奨されるのはCBCモードかCTRモードらしい。その他は何らかの脆弱性があるっぽい。でも最悪ECBモードを使わなければいい程度だろうと思われる。

ともあれ、ECBモードは基本だと思うので、習作的に実装してみたいとは思っている。それとCBCとCTRを実装すればいいかな。暇があったら3DESとかエニグマとか半分シャレでインプリしてみようかと思ったり。まぁ先ずはAESということで。AESが終わったらRSAに行くのだろうけど、RSAはデカい素数が必要だろうから実装しても暗号強度が云々というのは分からないかもしれない。まぁ小さい素数でも復号できれば実装を確かめるには問題ないだろうが。


こういうものは本家に情報を求めるのが一番なんだな。

https://csrc.nist.gov/projects/cryptographic-standards-and-guidelines/archived-crypto-projects/aes-development

というか、最近一次情報をぶんどってきてアフィリエイトに役立てるだけのような奴が多くて困る。まぁ人の事言えんけど、単なる再録みたいなのはやりたくはない。
あ、本家にC言語のリファレンスコードがありやんの。

https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Standards-and-Guidelines/documents/aes-development/rijndael-unix-refc.tar

これをコンパイルしてGolangの実装に役立てたい。最初はC言語でやろうと思っていたのだけれど、本家でやってたんじゃ意味ないし。とりあえず今度は上のコードレビューをしてみようかなと思ったり。なんか本気になってきたぞ。職業にはもう何にも関係なくなってしまったがなw。

タグ:暗号化
コメント(0) 
共通テーマ:パソコン・インターネット

これからは、暗号化と音声操作をやろうと思う。 [プログラミング]

プログラミングをしばらくやっていない。というか、プライベートが充実していない。リア充とかじゃなくて趣味的に動けていないという事だ。全く動けていないわけではないが、暇な時間を本を読んだりしかしていない。アニメも見るが停滞しがちだ。

とりあえず趣味としては生産的な事をしていない。一番生産的なところと直結するのがプログラミングだったりするのだが、基本的にコンピュータは情報取入れ端末としてしか使えていない。まぁ普通の人が使う使い方だ。ものを作り出すよりか消費する方が容易い。ただそれが面白いかどうかはまた別問題で、面白いからと言って楽か楽でないかは気分によっても違う。

ちょっと前はGolangでWebサーバを作ろうみたいな話をしていたのだが、なんだか面倒になって止めてしまった。HTTP/2の仕様も考えないといけなくなったし。他にもちょっとしたツールも作っていたのだが、WSLがなんかうまく動かないみたいで頓挫してしまった。普通にLinuxを使えばいいのだけれど、それも面倒になって止めてしまった。サーバをずっと立ち上げっぱなしにしておくのは夏の間は辛い。

そんなわけで手元でプログラミングすることをあきらめてしまったのだが、あまりにも退屈で生産的ではないので、前にやろうと思っていた暗号化と音声操作をやろうと思っている。暗号化はAESとRSAを主に、音声操作はWindowsでできるところで、という具合に。とりあえず手を動かして実際に動かすところと、ソースと理論のかけ橋にするところをやってみたい。案外、よく使うけど作った人に任せがちなところを自分でやってみたいというのは変わっていない。


ところで新しいMacBook Proが出たのだが、そこそこマイナーチェンジで良くなっているようだ。実際に使っている話も出てきていて、値段以外は良しという事になっているらしい。というか、それまで結構問題が散見されていてそれが解決しそうな感じではあるのかな。ただ、安くても20万円越えなので4コア8スレッドになるとはいえ、ちょっと踏み切れそうにない感じ。Kaby Lake Refreshで安いの出してくんないかな~。

とはいえ、今のタイミングでMacBook Airを買うというのもちょっと気が引けるし、お手軽な値段でノートを買いたい気持ちはある。それとプログラミングをするという点で、MacだとUNIXのお作法で簡単に作れるしね。そこはWSLとも仮想化とも別サーバーとも違う。

最近、Appleも自分もちょっとMacを見放し気味だったけど、ちょっと欲しくなってきた。今持っているMacがへぼ過ぎるので、買い替えないとはいけないと思ってはいるんだけども、正直Armへの乗り換え路線も控えていることだしなぁ。オリンピックあたりには出るんだろうけども。

にしても13inch MacBook ProはKaby Lake Refreshじゃなくて、モバイル用のCoffee Lakeらしい。6コアな15インチのはCoffee Lakeだと分かっていたけど、これじゃ第八世代Core iって本当にわけわからんラインナップになっとるな。Coffee Lakeは消費電力が多すぎてモバイルには向かないと言われていたんだけど、そこのところはパスしたんだな。

モバイルCoffee LakeはMeltdownとかSpectre対策はしてあるんだろうか。そのわりにはベンチマークは悪くないみたいだけどな。だから今回はやってなさそうな気がするな。MacBookは値段のわりにアレなので、MacBook Airが刷新されればいいのにと思っている。USB Type-Aポート付けたままで、いろいろアップグレードを付けつつ、Touch Bar周りは全く付けない方向で。そうじゃないと安くならないもんな。

膝の上か寝転んで安いMacを使いたい。ただそれだけかもしれない。

コメント(0) 
共通テーマ:パソコン・インターネット

プログラミング言語のインデントの話 [プログラミング]

今、C++のソースを扱っていて、インデントの仕方がTabだったりスペースだったりと統一感がなくてイライラしますw。基本4タブなので、大抵のエディタでは問題ないのですが、何というかいつの日も気持ち悪さをはらんでしまうインデント問題。Tabの持つ便利さが問題を起こしている気もします。

インデントにはスペース文字
2個分
4個分
8個分
が主だと思います。その他は変態野郎という事でw。8個なんてデカいインデント誰が打つんだ、というWindowsなプログラマもいるかもしれませんが、Linuxでデフォルトなエディタやビュアーであるviやlessでは普通はTabがスペース8個分で表示されるはずです。

4タブが主流になったのは、WindowsのIDEやエディタがそうだったからだと思います。まぁ普通に字下げの単位として四文字というのはちょうどいい長さであるというのもあると思う。2タブだとTabを使う意味があまりないし、8タブだとやっぱり普通に使うには長すぎる。

LLなどのスクリプト言語だとスペース二つ分のインデントも多い。というか、JavaScriptで初めてそういうのを見たような気がする。2タブも悪くないと思う。何にしてもTab文字を使わず、スペースですぐに入力できるというのが良いと思う。ただインデントとして見やすいかどうかというのは微妙な話だ。

何にしてもTab文字とスペース文字を混ぜてインデントしないでほしい。色々気持ち悪い。

コメント(0) 
共通テーマ:パソコン・インターネット

NVENCをC言語のソースに組み入れたい [プログラミング]

NVENCを既存のC言語のソースに入れ込みたいと考えているのですが、SDKのソースがC++で書かれていて容易にC言語のものには組み込めないようです。C++のソースにC言語の関数を取り入れるのは難しくはないけど、逆はちょっと面倒くさい。APIの関数はC言語っぽいんだけどな。

最終的にはC++で処理を書いて、extern "C"で処理の入り口を書くという事になるのでしょう。正直、キメラっぽくて気持ち悪い状態なわけですが、そうしないとVideo Codec SDK側のソースをC言語で書かないといけないのだろうと思われます。具体的にはNvHWEncoder.cpp、dynlink_nvcuvid.cpp、dynlink_cuda.cppなどC++の記述があるところで、これをC言語に書き換えれば問題ないのかもしれませんが、SDKの中身が変わった時にソースのコピペで対応することができなくなってしまいます。自分が書いた側の対応も必要でしょうが、いちいち両方とも手を入れないといけないのはしんどすぎます。

そんなわけでVideo Codec SDK側のソースには手を入れないことにしました。一番手間のかからない方法でかつ確実性のある方法でやろうと。でも、C言語のバイナリにC++のバイナリを組み合わせて動作させるのは気持ち悪い気はします。その前にCUDA用にnvccでコンパイルしたバイナリをC言語のソースに混在させていたので、それと大した違いはないのかなと思って我慢します。

移植のために意気込んで色々準備していましたが、CプログラミングではなくC++とMakefileの扱いになってしまいますね。特殊な使い方をしていないもののC++はあんまりやりたくないんだよなぁ。Objective-Cよりかやだ。

タグ:NVENC
コメント(0) 
共通テーマ:パソコン・インターネット
前の10件 | - プログラミング ブログトップ