2016年12月11日 (日)

C言語からGo言語へコールバック登録する(Go 1.7.4)

Go言語でプログラミングするのは楽だな。。
と今だけ思ってる。
だけど、いろいろやろうとすると、
どの言語でもあるけど、面倒だなぁ。

C言語は使う時が多いので、
Go言語でC言語のライブラリを作ろうとしてみた。

簡単に呼ぶならできそうだったので、
C言語からコールバックを登録して、
Go言語から折り返す。

主にポインタとかポインタとか、ポインタがつらい。
C言語だと全部ポインタで、通るけど、
Go言語はそれより型がきっちりしている印象が出た。
夢のポインタ (void*)さんがない影響かな。


まず、C言語から呼ぶとか、Go言語から呼ぶは、
どうにかなりそうな感じだった。

The Go Programming Language
Command cgo

CからGo言語を呼ぶ場合は、
「C references to Go」にあるように、
exportってキーワードを使えば、C言語用のヘッダファイルも出してくれる。
C用のライブラリにするのは、こんなコマンド。

go build -buildmode=c-archive hogehoge.go

反対にGo言語からC言語を呼ぶ場合、
「Go references to C」にあるように、
ブリッジ用のメソッドをGo言語側に用意する必要があるようだった。
fortytwo がC言語側で定義されてるイメージになる例。

これを組み合わせると、何故かトラップが発生する。

メソッドに、export を指定すると、どうも、
import "C" より上のメソッドもC言語向けヘッダに出力される。
そのあとに、C言語向けのヘッダを読むようで、
重複定義になってしまう。

だから、exportを指定するGoファイルでは、
C言語用関数の実体は書けないみたい。
staticにすれば、いいみたいだけど、
それもヘッダに出ちゃってる。


そんなこんなで、
C言語からコールバックを指定するような場合、
export するGoファイルと、
ブリッジの実体を書くGoファイルを分ける必要があるみたい。

実体を書くだけで、
重複とエラーが出るので、
かなりわかりづらいけど、
今のcgoの仕様なのかな。

githubのcgoの
Function pointer callbacks

には、そんな例になってるので、
これが正解なんだろうな。

わかるまでは大変だな。
そして、どの言語も罠があるもんだな。


| | コメント (0) | トラックバック (0)

2016年12月 4日 (日)

makeの代わりにGradleを使ってみる

go言語を始めてみた。

いまだに、いいディレクトリ構成とか、
パッケージとかがよくわからないのだけど、

go build src/package/path

みたいな形でコマンドをうたないとだめっぽいのが分かった。

そして、GOPATH さんをうまいこと使わないといけないらしい。

毎回やるのが面倒くさいのは確かなので、
GOPATHの上書きと、ビルドコマンド実施を簡単にやりたい。
Makefileを作って、make コマンドを実行すればいいのはわかってる。

こんな感じだろうか。

export GOPATH=${GOPATH}:${CD}

all:
go build src/package/path

ただ、Windowsでやると、makeがないんだよね。
Windowsさんは、文字コードもあるし、
あまり使いやすいとは言えなくなってる。

ってことで、Gradleを使ってみようと思い立ったが、
結構、初心者には敷居が高いように感じてしまった。

単に、Makeはインストールしてないけど、
IntelliJ IDEAをインストールしてたので、
Gradleは入ってただけなんだけど・・・

Android Studioとかでは、設定の追加ぐらいはしてるが、
結局、プラグインが頑張ってる感じかな。
逆に、プラグインのマニュアルとにらめっこすることにはなる。

makeの代わりにする分には、
単純で良さそうだけど、
つまづいたなぁ。

Windowsなので、PATHのセミコロンとコロンの違いはあるけど、
こんな感じでいいらしい。
(IntelliJ IDEAで枠だけ作ってもらった)

task build << {

String goProjectName = "src/package/path"
exec {
Map env = new HashMap()
env.putAll(System.getenv())
String goPath = env["GOPATH"]
env.put("GOPATH", goPath + ";" + projectDir)
environment env
commandLine "go", "build", goProjectName
}
}

環境変数とか、もう少しうまくできるんだろうなぁと
思いつつもとりあえず、動かす方を優先。

プラグインがあればいいかもしれないけど、
自分で作る分には、もっとサンプルがほしいな。

それにしても、ココログのpre属性が変。
コード書くときにつらいなぁ。




| | コメント (0) | トラックバック (0)

2016年6月 1日 (水)

「Scala福岡2016」に行ってきた

Scalaを実際に書いたことはないけど、
Scalaの初心者ページは見てたので、Scala福岡に行ってきた。

書いたことがないから、ほぼわからない気もしていたが、
なんとなく雰囲気がつかめたのは、よかったかな。
ただ、実際に書くとすると、何をしたらいいのやら。。

さて、会場は、初めての場所だったが、
入口の狭さと比べて、中は広めだった。

ハンズオンは、PCの持ち込みが必要だったので、
今回は拒否して、実践トラックで、もふもふしてた。

では、以降にそれぞれのセッションについて書いていく。


サーバーレスScala
資料:Serverless Scala

Pythonみたいにツールを書くとか、
ちょっとしたものを作るための話かと思ってたが、違ってた。。

ちょっとしたものというのは、合っているけれども、
web上にAPIを作る話だった。

AWSを利用する話だったが、
AWS LambdaとAPI Gatewayを利用して、
ちょっとしたAPIを作るという話。
これを軸に、サービスとサービスの橋渡しをする。
ツールっぽく利用する方法として、
サーバ系初心者には、おもしろそうな話には思えた。

デモを見て、Scala初心者だからなのか、
antみたいなビルドツールがあるんだなと感じたのが一番の衝撃。


Play Framework 2.5 でつくる Web アプリケーション
資料:Scala Fukuoka Play 25 2016

Play Frameworkの特徴的な話と、その突っ込んだ説明だった。
Scalaというより、Playに目を向けた話。
フレームワークなので、こんな便利なところがあるとか、
ここはちょっとダメだったの話があった。

Scala自体がさっぱりなので、
気になったのは、コンパイル時間の話と、バージョンアップの話。

資料の時間が短めだったので、
何とも言えないけど、そんなに遅いのだろうか。
今は、でっかくなると、
気になるレベルなのかなぐらいの感触しかないので、
実際にやってみないとわからない悩みだろうな。
Androidも1日かかるからなぁ~とか遠い過去を眺めてた。

あと、バージョンアップで、互換性がないのがつらそう。
フレームワークじゃなくても、
前のが動かないのはつらいよね。悲しいよね。


エレガントなコードのための関数プログラミング入門
資料:Scala Fukuoka

最初は、こんな話が続くのかと思ったりもしたが、
Scalaを知らないだけに、楽しめた話だった。
結局、関数型プログラミングは謎のままだが、
式と文の話は、手続型との区別の話としてわかりやすかった。

ただ、PlaceholderとMethod Valuesの説明とか、
消化不良なものもあった。
コンパイルで差があるらしいけど、
結局意識する必要はないのかなとも思ってる。

突っ込んだところは、やってからおいおいだろうけど、
(使うとつらいこともあるという説明もあったし)
関数型への入門として、楽しめた。


Option型を使いこなして初心者から中級者へ
資料:Option型を使いこなして初心者から中級者へ / scala fukuoka

Optionという謎の型の話だった。
当初、nullとさよならするために、Optionがあると始まった。
これだけだと、手続き脳からすると、
最初にnullチェックをすればいいじゃんと思ってしまう。

関数型的な思想だと、関数の置き換えができない的な観点から、
NGな思想だと思えるが、better-javaと言われると、使うかなと悩む。

ただ、最後の例のところで、Futureを使うところがある。
ここに関しては、この機能あれば、楽なんだろうなと思った。

同期待ちをがりがりと書かずに、
Optionを利用したfor式の記述で、勝手に待ってくれるらしい。
すごく、すっきりしそうな記載だった。


まとめ
各セッションはこんな感じで、初心者としては、
消化不良もあるが、雰囲気がつかめたのは収穫だったかな。
どちらかというと、Scalaの考え方が、おもしろいんだろうなと感じた。

サーバに出会わない世界だと、
scala自体を見かけることがないので、
手始めが難しいが、なんかネタを探すかなぁ


リンク:
connpassのScala福岡2016


| | コメント (0) | トラックバック (0)

2013年7月 5日 (金)

JavaScriptの考え方

Twitterか何かで、
最強オブジェクト指向言語 JavaScript 再入門!
というリンクが流れてた。

JavaScriptを覚えた方がいいかなと、
思ってただけに、
食いついてしまったが、
何かいい感じに、
いろんな事がすっきりした。


Javaとかやってたから、
オブジェクト指向→クラス
っていうイメージがあったが、
JavaScriptは違うらしい。
「クラスがない」

オブジェクトだけだという考えが
私的に鍵だった。

プロトタイプとか、
実際に使ったことないけども、
なんとなく納得した。
(コード書いたこと自体ないが・・)

いろんな考え方もあるもんだ。


| | コメント (0) | トラックバック (0)

2012年10月28日 (日)

Eclipseの補完のキー設定

最近話題のVisual Studio!!
C#で使っているけど、
補完とか確かに楽。

androidの時も、
Eclipseでも同じ感じだったけど、
ちょっぴり不便だった気がする。

それよりも、
Visual Studioになれたので、
キーコードを同じにしたいので、
補完をCtrl+Spaceにしてみた。

調べてみたら、
Ubuntu10.04 Eclipseで補完機能をCtrl + Spaceに変更する
にやり方があった。

おおまかには、
Anthyからキーバインドをはずして、
Eclipseで割り当てる。

Anthyはメニューバー?のアイコンから
右クリックで設定を選ぶ。
そこから、
キーショートカット->切替に
Ctrl+Spaceが入ってるので、削るだけ。

Eclipse(なぜか英語)は、
Windows->Preference->Keyの
Content Assistの設定を変える。

Anthyがバインドしてるのは、
自力ではずせたが、
Eclipseはさっぱりなので、助かった。


他にも補完が発生する時間を
指定する方法もあったので、
もっさりしているなぁと感じたのも、
多少改善すると思う。

補完時間は、
「Eclipseの補完設定をカスタマイズして爆速コーディング」
参考にした。


Eclipseって、
設定変更してなんぼって感じなのかなと
改めて感じてしまった。

リンク:
Ubuntu10.04 Eclipseで補完機能をCtrl + Spaceに変更する」by polidog lab++様
「Eclipseの補完設定をカスタマイズして爆速コーディング」by ser1zw's blog様

| | コメント (0) | トラックバック (0)

2012年9月10日 (月)

NFC Labに行ってきた

雨が降ってて、
内容もちょっぴり不安だったが、
福岡のNFC Labに行ってきた。
第4回目なのかな?

初のAIP Cafeってことで、
迷子補正がかかる予定だったが、
道案内のページのおかげで、
問題なくたどり着いてしまった。

ここにお世話に成りました。
Aip Cafeへの道順 |福岡のグレート・ビーンズ


Android 中国支部を思わせるような
ぐだぐだ感が漂っていたが・・。

内容が結構濃かった。
しかも、
組み込みとかハードに近い方なので、
結構好みかもと思ったが、
レベルが高い気もする。

なんとなく勉強になりそうだけど、
ついていけるかが問題だなぁ。

ってことで、
販売してた本で勉強しないと・・。

1347283336289

そして、基板を入手しないといけない。

最後に、
佐賀県は組込みが活発らしいので、
そっちにも足を伸ばしてみたいな。


リンク:
Fukuoka NFC Lab
→参加したHack 4レポート



| | コメント (0) | トラックバック (0)

2012年5月20日 (日)

x-loaderのソースを眺めて(2)

前回に続いて、
x-loaderのソースを見てみたところを
適当に書いてみる。

ソースは、前回同様に、104SHのやつ。
ENTRYで指定してある
cpu/omap4/start.S の _start から読んでいく。

いきなりのb命令。
アセンブラガイドなるものによると、
分岐命令らしい。
私的には、ジャンプ命令のがわかりやすい。

ってことで、出鼻を挫かれて、
reset:からやり直し。

ldrとstrがリードとライトと見れば、
あとは適当に眺めていく。


r4は、scratchpad ってことなので、
よくわからないので、無視しておく。
OMAPの資料だと、
L4_WKUPのRAMらしいけど、何かのおまじないかな。

次に、r5の比較がたくさん。
r0の近くを読んでるから、
内部ROMから渡された値になるっぽい。
コメントを見る限り、
どのデバイスでブートされたかを
この辺でチェックしてるみたい。

そして、skip_typecheck は、
一部の比較スキップ処理なんだろうな。


その次から、
"bl cpu_init_crit"までの処理が
例外割り込み設定になるのかな。

_startの場所辺りから、
64バイトをコピーしている。

コピー先が
「OMAP4460 ES1.x TRM Revision Q」の
「27.4.2.2 RAM Memory Map」の
RAM Exception Vectors
(0x4030D000)と一緒なので、
なんとなく納得できそうな処理になる。

全部、do_hangに飛ぶらしい。
でも、"add r0,r0,#4"した分だけずれるような
違和感があるが、あってるのかな・・。


そして、"bl cpu_init_crit"は
ジャンプ命令なので、
やっと、概要のひとつ目の関数にたどりついた。

先が長そうだ・・。


リンク:
「Bootloader Project(翻訳)」on 電脳羊(Android Dream)
RealView® Compilation Tools アセンブラガイド(バージョン 4.0)

| | コメント (0) | トラックバック (0)

2012年5月16日 (水)

x-loaderのソースを眺めて

Twitter上で、
OMAPのBootloaderの話が流れてたので、
概要を参考に、ソースを眺めてみた。

翻訳された方もいたので、
主にそっちを参考にしたけど(汗)
「電脳羊(Android Dream)」様の記事

ソースは、カーネルと一緒に
公開されていたので、
sharpの104SHのものを
公開サイトから拾ってきた。


いきなり全部はつらいので、
x-loaderからちらちらと眺めてみる。

それっぽいdefineがあるところが、
通ってるルートなんだろうと、
目星をつけやすくて助かる。

そして、初期化シーケンスの
参考資料のリンクがあったので、
リンク先のOMAPのドキュメントのところから
「OMAP4460 ES1.x TRM Revision Q」
をダウンロードして、ソースを見始めてみた。


start.Sから始めるとあるけど、
複数あるってことでまずつまづいた。

makeファイルが苦手だけど、
make omap4430sdp_config とかで、
インクルードファイルを作るらしい。
足跡が残ってるので、
omap4430sdp_config で当たりっぽくて、
やっと、start.Sを特定。


そして、C言語な頭なので、
mainがないって、混乱開始。

いろいろ見てみると、
ldの-Tオプションで、x-load.ldsを読んで、
そこで、ENTRY指定されてる関数が
開始ポイントらしい。

普段、makeとかで簡単にビルドしてるけど、
中の人は結構苦労してそうだなと
感じてしまう。


・・長くなったので、
続きは別記事で書くかな。


リンク:
「Bootloader Project(翻訳)」on 電脳羊(Android Dream)

| | コメント (0) | トラックバック (0)

2011年4月14日 (木)

ETロボコンのビルド環境設定(Ubuntu10.04)

先日、ETロボコンの勉強会に行ってきたけど、
時間中に環境設定がうまくいかなかった。

なので、手順とはまった点についてまとめておく。


私が設定した環境は、
Ubuntu10.04が入ったPCになる。
Androidのビルドできるぐらいにはなってた。

対象の開発環境は、
nxtOSEK/JSPなるものらしい。

大枠な手順としては、リンクをたどって、
nxtOSEKのインストール
Linux (Ubuntu 8.10 32bits)
としてまとめてある方法。
(英語だけど・・)

ビルドだけできればと思って、
手順1と2を実施。

★手順1★
クロスコンパイラの導入。
Androidで使ってた奴はどうも動かないらしい。
(ライブラリ関係な気がする)
全部がsynpaticとかではなく、一部スクリプトを使う。

1-1 必要なものをapt-getでもってくる
 "tk-dev ncurses-dev libmpfr-dev texinfo”が必要
1-2 スクリプトのダウンロード
 ※手順書にリンクがある
1-3 スクリプトの実施
 "sh ./build_am_toolchain.sh"

☆確認ポイント☆
スクリプトを実行したフォルダに、
srcとbuildとgnuarmの3つフォルダができる。
srcの中に、以下3つあるのを確認すること。
 ・binutils-2.20.tar.bz2
 ・gcc-4.4.2.tar.bz2
 ・newlib-1.18.0.tar.gz
  ※バージョンは異なることあるかも。
私がやったときは、
newlibがダウンロードできてなかった。

足りない場合は、
ブラウザとかでダウンロードして、
srcにいれて、再度スクリプト実行でOK。

足りないと、ビルドしたときに、
足りないファイルが出てくる。
→stdlib.hとかで驚く(笑)


★手順2★
wineのインストールと
OSとかのファイル取得。

2-1 wineをインストール(apt-get)
2-2 nxtOSEK 2.15をダウンロード
 nxtOSEKのダウンロードページからリンクあり
 →私はここに飛んでいった
2-3 適当な場所に解凍
2-4 ダウンロードの不足分(sg.exe)取得
 ダウンロードページの注意書きにあるように、
 nxtOSEKに含まれなくなったらしい。
 なので、toppersから
 OSをゲットして解凍して、不足分のみ2-3の環境に追加
2-5 環境設定ファイルの変更
 解凍したところのecrobot/tool_gcc.mak の中の、
 GNUARM_ROOT の設定値を記載
 →手順1-3で作ったgnuarmのフォルダ
2-6 ビルド確認
 どこでもいいけど、手順書的には以下のフォルダ。
  "cd ./nxtOSEK/samples_c/helloworld"
  "export LANG=C"
  "make all"

☆確認ポイント☆
 手順書とかで特に記載がなかったので、
 ビルド時のエラー対処をまとめておく。
 "make clean"→"make all"とかやると、
 ログがきちんとでる。
 cleanしていないと、kernel_cfg.cがないとかで、
 最初の要因が消える場合がある。

 1.WCUSERエラー
  err:wineconsole:WCUSER_SetFont wrong font

  wineのエラーみたい。
  export LANG=C を設定すればOK
  日本語環境特有かも。

 2.sg.exe入れ忘れ
  適当に改行いれてるけど、こんなエラー
  wineconsole: Starting program
  "../../ecrobot/../toppers_osek/sg/sg
  ./helloworld.oil -os=ECC2
  -I../../ecrobot/../toppers_osek/sg/impl_oil
  -template=../../ecrobot/../toppers_osek/
  sg/lego_nxt.sgt" failed.
  The command is invalid.

つまづいたのは、これぐらい。
同じようなことをしてる人の
参考になれば、幸い。

リンク:
ETロボコン2011
ETロボコン2011中四国地区大会
nxtOSEK/JSP(開発環境)
「SolarisでWineを試す。」on ブログってもしかたない
青大ロボコン研 「非」難所wiki

| | コメント (3) | トラックバック (0)

2011年4月11日 (月)

ETロボコン中四国独自勉強会0に行ってきて

ロボコンという響きに導かれて、
興味あると返信したことが、
事の始まりだった・・。

勉強会に出てから、
参加決めればいいと言われたが、
既に参加者になってるらしい。

参加者かどうかはおいおい悩むとして・・。


ETロボコン2011中四国地区大会なるものが
あるらしく、事前勉強会に参加してみた。

車で行ってみたが、
岡山と比べてかなり近かった。
この距離なら行けそうだけど、
会場が駅前なので、駐車代がつらい・・
ってことで、次回から電車に。


内容的には、
環境設定+ビルド方法+基本的なAPI説明
って感じだった。
実際に、
ロボット貸してもらえたので、
かなり楽しめる。
やっぱ、説明だけってより、
動かせると悩んでいいと思う。
(ロボットは買うと高いので、
 借りれるといい)

説明が、Windowsベースだったこともあり、
私は(遅れたのもあるが、)
環境設定が終わらず・・
見てるだけぇ~な状態だった。


ハード検証とかは、
あまり経験がないので、
楽しめそうだなぁ~。
(Myロボットあればだけど・・)

ってことで、
隠れてついていくことに・・。


#環境設定自体は、
 9時間遅れで完了したっぽいので、
 またの機会にでも。


リンク:
ETロボコン2011
ETロボコン2011中四国地区大会
nxtOSEK/JSP(開発環境)


| | コメント (0) | トラックバック (0)