ワテのブログ

The fundamental things apply As time goes by.

2014年7月31日木曜日

[golang] cgoの使い方

スポンサーリンク

ファイル構成

$ ls
test.c  test.go  test.h

goからc/c++の関数を呼び出す。
c/c++からgoの関数を呼び出す方法。
import “C”の真上のコメントがCの定義部として処理されます。
そこで定義されているものはgoの世界から”C.”プリフィックスでアクセスできます。
C.GoStringはcの文字列からgoの文字列を生成します。
C.CStringはgoの文字列からc文字列を生成します。mallocでメモリが確保されるのでfreeで解放する必要があります。

goの関数は関数上に//export 関数名と書くことで_go_export.hに書きだされます。
c側で
#include “_cgo_export.h”
としてやれば呼び出すことができます。
関数の戻り値は関数名_returnという構造体が自動的に定義されます。

$ go tool cgo test.go

で_objフォルダにcのコードが吐出されます。
こいつの中をみれば理解しやすいでしょう。
ちなみにc++のコードを呼ぶときは関数の宣言をextern “C” {}で囲ってやればよろしい。

関連項目

// test.go
package main

/*
#include "test.h"
*/
import "C"
import (
    "fmt"
    "unsafe"
)

//export gohoge
func gohoge(h *C.hoge_t) (C.int, *C.char) {
    fmt.Printf("go -> %d:%s\n", h.a, C.GoString(h.str))
    return 2, C.CString("return from go")
}

func main() {
    h := &C.hoge_t{
        a:   C.int(1),
        str: C.CString("hello from go"),
    }
    C.hoge(h)
    C.free(unsafe.Pointer(h.str))
}
// test.h
#ifndef test_h
#define test_h
#include <stdio.h>
#include <stdlib.h>

typedef struct hoge_t {
  int a;
  char *str;
} hoge_t;

extern void hoge(hoge_t* h); 
#endif
// test.c
#include "test.h"
#include "_cgo_export.h"

void hoge(hoge_t* h) {
  struct gohoge_return r = gohoge(h);
  fprintf(stdout, "c  -> %d:%s\n", r.r0, r.r1);
  free(r.r1);
}
# 実行結果
go -> 1:hello from go
c  -> 2:return from go
スポンサーリンク

2014年7月19日土曜日

PS3 media serverをvagrantで動かす

スポンサーリンク

PS3 Media ServerをvagrantのUbuntuで動かす方法。

Ubuntuは12.04TLS (precise)

まず、PS3 Media Serverをインストール

$ sudo add-apt-repository ppa:happy-neko/ps3mediaserver
$ sudo apt-get update
$ sudo apt-get install ps3mediaserver

これでPS3 Media Serverがインストールされます。
PS3 Media Serverは同一のLANないに存在するDLNA Client(PS3等)と通信します。
そのためDLNA Clientからvagrant上のUbuntuにアクセスできなければなりません。
色々やりかたはありますがVagrantをブリッジ接続する方法を選択しました。

Vagrantfileに以下の記述を追加します。

config.vm.network :public_network

この設定を追加しvagrant upすると
ブリッジするインタフェイスを訊いてくるので自分が利用しているインタフェイスを選択してください。

Ubuntuが起動したら

$ ps3mediaserver

でPS3 Media Serverが起動します。

DNLA Client側からこのサーバーに接続すれば利用できます。

参照

スポンサーリンク

2014年7月15日火曜日

[golang] goで簡易httpサーバ

スポンサーリンク

The Go Programming Languageで簡易的なhttpサーバを作成してみました。

コマンド引数で指定したファイルをサーブします。
go言語シンプルにかけていい感じです。

ビルドの方法
httpd.goを保存後

$ go build

実行方法

$ ./httpd httpd.go -p 8080

試しに接続

$ curl -i localhost:8080
HTTP/1.1 200 OK
Content-Disposition: attachment; filename="shttpd.go"
Date: Tue, 15 Jul 2014 10:43:30 GMT
Content-Length: 1299
Content-Type: text/plain; charset=utf-8

package main

import (
  "flag"
  "fmt"
  "net/http"
  "log"
  "io"
  "os"
  "path"
)
...

ソースコード

参考にしたサイト
* http - The Go Programming Language
* flag - The Go Programming Language

スポンサーリンク