Golang チャンネルの構え(最初の一歩)

チャンネル

package main

import f "fmt"

func receiver(ch chan int) {
  for {
    i := <-ch
    f.Println(i)
  }
}

func main() {
  ch := make(chan int)

  go receiver(ch)

  i := 0
  for i < 10 {
    ch <- i
    i++
  }
}

このコードはエディタの助けがない状態で書いた。

配列の構え、mapの構え

スターティングGo言語の読み直しをしている。あたらしいパラダイムを学ぶのはやっぱり楽しいね!

配列の構え

とりま初期化できてappendできて回せたらなんとかなるでしょ(経験)

	//配列の 構えは
	n := 10
	s := make([]int, n)
	// 拡張
	x := 11
	s = append(s, x)
	fmt.Println(len(s))
	//回すのは
	for i, v := range s {
		fmt.Printf("%d - %d\n", i, v)
	}

mapの構え

	m := map[string]string{
		"a": "hoge",
		"b": "fuga",
	}
	s, ok := m["a"]

	if ok {
		f.Println(s)
	}

	for k, v := range m {
		f.Printf("%s - %s\n", k, v)
	}

MastodonにDBのGUIを追加する

qiita.com
読んで我が家のmastodonにも導入しました。

  • 9999ポートで待受
  • posgreSQLが立ち上がるまでrestart
  • アクセスはsshポートフォワーディングで

設定

docker-compose.ymlに下記追記

  postgres-gui:
    restart: always
    image: donnex/pgweb
    command: -s --bind=0.0.0.0 --listen=9999 --url postgresql://<mastodonのdbユーザー名>:<mastodonのdbパスワード(あれば)>@db/<mastodonのdb名>?sslmode=disable
    depends_on:
      - db
    ports:
      - "9999:9999"

"mastdonのdbユーザー名"や"mastodonのdb名"は.env.productionの冒頭に書いてあるのでそれを使います

作業

$ docker-compose stop
$ docker-compose up -d

起動時にimageをダンロードする動きが一回入ります(通常の起動より時間かかる)
だめなときはとりあえずdocker logsで内容確認。必要な対処を。多分問題なく動くはずです。

アクセス

sshポートフォワーディングでやります。

$ ssh -L 9999:localhost:9999 <user>@<server>

ブラウザでlocalhost:9999にアクセスするとmastodonのdbの閲覧、操作が出来ます。

感想

db見てなんの意味があるのでしょうか?という根本的な問題にぶち当たります。
dockerをいつの間にか見よう見まねで触ってますが、だんだん知識が深まっていきますね。
せっかく身につけた知識がムダにならないようにdockerには死なないでほしい今日このごろ。

スターティングGo言語読了 良書もう一度読み直して、次は何か作るべし。

ポモドーロしながらちょっとずつ手を動かしながら読みました。良書。
もう一度前半部を読み直して、後半のリファレンスっぽいところを軽く読んで何か作ってみよう。

スターティングGo言語 (CodeZine BOOKS)

スターティングGo言語 (CodeZine BOOKS)

Kindleで買ったので会社でKindleやらベッドサイドでiPadやらリビングでMacやら電車でiPhoneやら色んな所で読み進められた。電子書籍ライフは楽しいね。固定レイアウトじゃないのが良いね。

今日やったこと(やろうとしたこと)

サーバーの/boot領域がいい加減心もとないのでなんとか大きくしようとしました。
LiveDVDから起動して適当にググったサイトで/bootの/dev/sda1を消して/にgrub入れろとか書いてあったのでやってみました。
騙された!!(勝手な言い分)
起動しなくなりました。死に体。
いろいろやりましたけれど
/dev/sda1や/bootをもう一度作り直してgrub-installしました。
起動がGUIになってしまいました。死に体。
で、諦めた。
サーバー再起動時には
init 5して直付けディスプレイとキーボード・マウスはGUI運用します。openboxで。
サーバーなので基本sshさえあいていればなんとかなる。。
ムダな時間を使ってしまった。
4時間ぐらいゴニョゴニョしてサーバーのカオス度が一段と高くなりました。
スッキリしたいけど再セットアップはあまりにも労力が。。
もやもやする。忘れたい。

もうこれ以上変な事しようとしない(何度目の誓いよほんとアホかと)。

スターティングGo言語が良い

Go言語学ぶならA tour of Goより初めからスターティングGo言語買うと良い。とても良い。
付随的な知識でGoは「スーバーC」なので私はC言語で仕事をしたことが無いのもあるけれど、桁数とか桁あふれとか丸めとか補数とか体感できるし、そういう解説もある。JavaC#との比較もあるし「ベターなのはこの書き方」とかも書いてあるので非常に良い。本気でおすすめ。高い本ではないのでKindleで購入しましょ。まじ良い。

開発環境はGogland一択。デバッグに設定いらない、補完めっちゃ賢い。Idea系統の優れたUI最高です。CE版出てほしいなぁ。仕事でGoを使う可能性はゼロなので趣味のプログラムのために有償のIDE購入はちょっと違うよね、と。

今日の勉強おしまいー

スターティングGo言語 (CodeZine BOOKS)

スターティングGo言語 (CodeZine BOOKS)

再掲:javascriptでActiveRecordっぽくハッシュを検索するコードの断片

2011年の投稿ですが個人的によくできたと思ったので再掲します

記事

javascriptrubyと同様にインスタンス*1に対して動的にフィールドを追加できるようだ。javascriptなのでバインドは名前を付けた関数でも可能である。
ということでActiveRecordみたいな手触りのものが作れる。
めっぽう簡単なコードで。
今のところ機能として絞り込み(and検索)にも対応しているが都度実処理してしまっているところを最終段階まで遅延させたいところ。

// コード
var AR = {
    Init : function(hash){
      //関数をバインド
      for(x in this)
         if(typeof this[x] == "function")
            hash[x] = this[x];
      return hash;
    },
    find :function(k) {
        //関数をバインド
        for(x in this)
          if(typeof this[x] == "function")
             this[k][x] = this[x];
        return this[k];
    },
    query : function(m){
        //検索クロージャ
        this.selecta = function(finder,_this,qs){
            var ret = {};
            //検索をしつつ絞り込みのために関数もバインド    
            for(x in _this){
                if(qs == _this[x][finder])
                    ret[x] = _this[x];                
                else if(typeof _this[x] == "function")
                    ret[x] = _this[x];
            }
            return ret;
        };
        this.finder = m;
        return this;
    },
    is :function (qs){ // 検索を実行
       return this.selecta(this.finder,this,qs);
    },
    clean : function(){
       // バインドした関数を取り外す
       for(x in this)
         if(typeof this[x] == "function")
            delete(this[x]);
       return this;
    }
};
//対象データ 
var datasource = {
    tableA : { 
               rowA: { field1 : 1,field2 : 1, field3 : 4 } ,
               rowB: { field1 : 2,field2 : 1, field3 : 5 } ,
               rowC: { field1 : 3,field2 : 2, field3 : 6 } ,
               rowD: { field1 : 4,field2 : 2, field3 : 7 } ,
               rowE: { field1 : 5,field2 : 3, field3 : 8 } ,
               rowF: { field1 : 5,field2 : 3, field3 : 9 } 
            },
    tableB : { 
               rowA: { field1 : 1,field2 : 1, field3 : 4 } ,
               rowB: { field1 : 2,field2 : 1, field3 : 5 } ,
               rowC: { field1 : 3,field2 : 2, field3 : 6 } ,
               rowD: { field1 : 4,field2 : 2, field3 : 7 } ,
               rowE: { field1 : 5,field2 : 3, field3 : 8 } ,
               rowF: { field1 : 5,field2 : 3, field3 : 9 } 
            },
    tableC : { 
               rowA: { field1 : 1,field2 : 1, field3 : 4 } ,
               rowB: { field1 : 2,field2 : 1, field3 : 5 } ,
               rowC: { field1 : 3,field2 : 2, field3 : 6 } ,
               rowD: { field1 : 4,field2 : 2, field3 : 7 } ,
               rowE: { field1 : 5,field2 : 3, field3 : 8 } ,
               rowF: { field1 : 5,field2 : 3, field3 : 9 } 
            }
};
//使い方
var ret = AR.Init(datasource).find("tableB").query("field2").is(2).clean();
for(x in ret)
  console.log(ret[x].field1 + " - " + ret[x].field2 + " - " + ret[x].field3 );
/*
3 - 2 - 6
4 - 2 - 7
*/
//絞り込み
var ret = AR.Init(datasource).find("tableB").query("field2").is(2).query("field1").is(3).clean();
for(x in ret)
  console.log(ret[x].field1 + " - " + ret[x].field2 + " - " + ret[x].field3 );
/*
3 - 2 - 6
*/

都度回すよりも簡単です。ハッシュはjavascriptでも(やはり)速いので配列よりもハッシュがこのましい。
配列を回すと処理時間が不安定なのでsetTimeoutとか使って処理をバックグラウンドで行う場合にはやはりハッシュが好ましいです。

速度

dev状態のmusicdbで使用しているが軽快っぽい
http://lovesaemi.daemon.asia/musicdb_dev/

*1:呼び方知らない