TAG | Go
チームWordProgressの新着記事一覧です :
(※各記事の内容を閲覧するためには、各記事のタイトルをクリックしてください。)
記事概要の
プレビュー
Go上で実装された最初の言語はどうやらForthっぽい。
http://github.com/ArtemTitoulenko/GoForth/
マイノリティ言語好きのくせにForthはノーチェックだったのでちょっとググってみる。
日本語をForthにコンパイルする日本語プログラミング言語Mindという先達が今も気を吐いているのに驚いた(Mindで書かれた商用の全文検索がばりばり現役)
・・・ので、せっかくだから「擬似日本語=>Forth =>Goコード」というものをやってみようかと。
日本語は簡単な文字列の置換でそこそこforthコードを吐き出せるらしい。試しに書いてみた
—-(日本語コード)—#ループカウンタ「i」は事前定義とのこと
変数sum
0をsumに代入
50以下について、
「sumを参照し、iと足して、sumに代入する。」
というループ。
—-(自動変換後のForthコード)—
variable sum
0 sum !
50 0 do
sum @ i + sum !
loop
———————————————-
単発ネタのつもりだったが、日本語で並列処理を書けたら面白いかもしれないので、
もう少し追いかけてみようかな。
アセンプラとの親和性が売りらしいForth、果たして、Goとどう組み合わせるべきか。
Forth, Go
Hide
・・・なんと、Golangのアップデートについて書いた投稿を更新時に、WordPressのアップデートの影響によってか消えてしまった。。。 まぁ、golangの公式アップデートは半月に一回ぐらいで、以下のようやるんだけれどけっこう時間がかかるねぇというお話だった。
$ cd $GOROOT/src
$ hg pull
$ hg update release
$ make all
で、問題はWindowsでGolang MLでもちょこちょこ議論されているところなんだけど、書いたことが消えちゃったし、問題は解決できるわけでもないので、取り急ぎ。ここまで(汗)。。。
Go
Hide
12月に入ってから、開発が続けられているGolangのSinatra風フレームワーク(?)web.go。
http://github.com/hoisie/web.go
ビルドには、最新版のgolangが必要。特徴は、バイナリにコンパイルして実行するから高速とのこと。クリスマスイブの夜に、VPSでいきなり80番開放してテストしてみる。
今晩はハローワールドのみ。
package main
import (
“fmt”
“web”
)
func hello(val string) string {
return fmt.Sprintf(“こんにちは、世界 %s”, val)
}
func main() {
web.Get(“/(.*)”, hello)
web.Run(“0.0.0.0:80″)
}
キモは、「web.Get(“/(.*)”, hello)」のところで、関数helloにurlの/以下のユーザーが入力した値が渡される。
Golang開発チームからのクリスマスプレゼントで、プログラム中にセミコロンを書かかなくとも良くなった(ほとんどの場合)。省略ルールの詳細は押さえていないが、「スクリプト風言語」にいよいよGolangも仲間入りした気がするなぁ。
実行結果は以下の通り :
[入力]
http://MyDomain.jp/。メリークリスマス!!
[出力]
こんにちは、世界 。メリークリスマス!!
とりあえず、web.go、UTF-8でソースを書けば、日本語込みで動作するよ、との報告まで。
Sinatra風か・・・どうかはこれから検証予定(POSTも動作している模様)
・・・おそらく、web.go これからもけっこう変化するんだろうけれど、これからに期待ということで。
Go
Hide
@IT誌にグーグルGolangの記事の連載を開始させていただきました(こちら)。
ありがたいことに、相当数の方にはてぶしていただいておりまして、年末のGo言語界隈の話題提供に多少お役に立てているかと思っています。
ただ、第一回目の内容は、2週間近く前に書いたものでして、今見返すと、「恥ずかしながら・・・」 な微妙な記載や誤りもありました ( 速報的に記事を書いた後、別件に関わっていたこともあり内容をあまり見直しができておらず・・・早速、ありがたいご指摘もいただきましたので、訂正できる部分は確認の上、訂正したいと思います)。
現在もGolangは楽しんで学ばせていただいておりまして、今後仕事の場でもGolangを使いはじめてみたいと思っています
(当初は、Perlなどのスクリプト言語と組み合わせてのバッチ処理記述に用いたいと思っています。・・・来年1年くらいかけて、もっと先までいけるといいなと、願いつつ)。
勉強を続けてまいりますので。連載記事の方、温かい目で眺めてもらえますと幸いです。
(むろん、誤りが見受けられる際には、ビシバシご指摘いただけますとありがたいです)。
それでは、今後ともよろしくお願いいたします。
[付記]
当サイトには、Golang・Goを検索キーワード経由で多数の方にお越しいただいています。本日は、加えて@IT誌のgolang記事からも多数の方にお越しいただいています。ちょっと気になって、オープン1月ほどの当サイトのアクセスについて、ブラウザのシェアを見てみたところ、以下のようになりました。
Firefox 49.18%
Chrome 17.95%
Internet Explorer 16.97%
Safari 8.94%
Opera 3.34%
興味深いことに、IEを若干押さえて、Chromeが上位にきています。Golangに興味を持つ方々にとっては、Chromeはすでにメジャーなブラウザであるようです(私もChrome/Safariユーザー)。
Chrome/Chrome OSのプラグイン等の記述に、golangが用いられる日はいつごろなのでしょうか・・・
「恥ずかしながら・・・」 な「恥ずかしながら・・・」 な「恥ずかしながら・・・」 な「恥ずかしながら・・・」 な
Go, ご挨拶
Hide
ついに平日昼間もgolangしだした。
functionとfuncがかぶるとかだけじゃなく、少なくともコードの見た目はけっこう似たもの同士かなと秘かに思っていたPHPとgolang。
しかも、PHP5.3は名前空間にクロージャPHP6.0ではユニコードと、PHPの将来はなんだかgolangな方(?)を向いている気が。
ついでに、国内golang一番手といって良いだろうmoriyoshi氏は、Python界隈だけなく、PHP を魔改造して「いじり」倒しているPHP界隈の人でもある(氏の肉声はこちら・・・勉強になるので、ブログ書きながら肉声でお勉強(以下、勝手に「★」で割り込ませる)。)。・・・逆にruby界隈からgolnagに攻めてきている人はいないなぁ。
★そっか、PHPはテンプレートエンジンなのか。SAPIモジュールとか、なんも知らんかったなぁ。
ということで、PHP5.3記事をgolang視点で見てみた・・・ら、やっぱりけっこう似ているぞ。ということで、調子に乗って、シリーズ化してしまおう。
★TSRMというのが、マルチスレッド化に関与しているのか @ ZendEngineと。
今回は、gihyo.jpのPHP5.3記事(クロージャとgo to文)。
元のPHPソースを引用。はじめに無名関数。
※ <?php~?>の部分はうまく表示されないようなので、省略。
$fruits = array(
“lemon”=>156, “orange”=>210, “banana”=>180, “apple”=>343);
array_walk($fruits,function($price,$name) {
echo $name.’:’.$price.PHP_EOL; });
ここで、array_walkは、配列の各要素に対して、 関数で定義した操作をする(いわゆるmap 関数)。 参考サイト PHPの配列関連の処理についての解説
ほぼそのままgolangに移すと :
package main
import (“fmt”;)
func main() {
fruits := map[string] int {
“lemon”:156, “orange”:210, “banana”:180, “apple”:343
};
for key ,val := range fruits {
func (price int, name string) [...]
Go
Hide
60分シリーズ開始。
のつもりだったけど、mapへの要素追加方法だけを確したいだけだったので、30分ちょいで書いたになりました、です。あと、flag、ようやく使って見た。
package main
import (“fmt”; “strconv”;”flag”;)
func main(){
flag.Parse();
mp := make(map[string]string);
if flag.NArg() != 0 {
for i := 0; i < flag.NArg(); i++ {
mp[flag.Arg(i)] = “会員番号”+strconv.Itoa(i)
}
for k,v := range mp {
fmt.Printf(“%sは、%s\n”,k,v)
}
[...]
Go
Hide
golangはクロージャもできる子。
というわけで、まだ使ったことなかったgolangのクロージャとmapしてみた。
とりあえず、クロージャで書く意味はないコードをさらす。12月は佐々木月らしいので :
package main
import (“fmt”; “strconv”;)
func main() {
//クロージャで参照される変数。
minimum := 20;
count := 0;
//クロージャの定義
logic := func(age int) (b bool) {
if age >= minimum {
b = true;
count ++;
[...]
Go
Hide
以下、ライブラリ対応が不完全とか文句言われている、go-windows、けっこうまともに動いているよのエントリ。
前回、質実剛健宣言したわりにはまたも軟弱なコードだが、Print文の手直ししての再コンパイル~リンク~実行終了まで0.1秒くらいしかかからなかったことに今さらながら感動したのでコードと実行結果をさらしておく。Golang、Pascalを彷彿させるとかいう古典的な文法を持ちながら、XMLライブラリは相当モダンで 「来たぜ21世紀的」。ちょっとそっけないけど、悪くない。やはり、golangには質実剛健に取り組みたくなる今日この頃。
参考サイト => こちらの方がぜんぜん質実剛健にやっておられるぞ。
package main
import (“fmt”; “flag”; “os”; “io”;”xml”;)
type Member struct {
Name string;
Org string;
Char string;
}
type Meibo struct {
GroupName string;
Member []Member;
}
func main() {
flag.Parse();
if flag.NArg() == 0 {
fmt.Printf(“using: %v [...]
Go
Hide
30分以内縛りの最終回。moriyoshi氏のプレゼンがsliceで終わっていたのと、どこかで、mutableなStringは、StringVectorなんだね、とつぶやいていた方がいたので、両者の関係をお勉強。ライブラリ読んでるだけで、20分以上たってしまったので、コードと実行結果だけ。
package main
import “fmt”;
import “container/vector”;
func main() {
vec := vector.NewStringVector(0);
vec.Push(“abc”);
vec.Push(“DEF”);
vec.Push(“ghi”);
vec.Push(“いろは”);
vec.Push(“ニホテト”);
fmt.Printf(“StringVectorの中身\n : %s\n”,vec);
slc := vec.Data(); //Data()の返り値がsliceとなる
fmt.Println(“StringVectorの中身をsliceで取り出しrangeでつなげる”);
for i,s :=range slc { fmt.Printf(“%d:%s\n”,i,s)}
for _,s :=range slc { fmt.Print(s)}
}
[結果] ★go-windowsで実行
StringVectorの中身
: %s(*vector.StringVector=&{{[abc DEF ghi いろは ニホテト]}})
StringVectorの中身をsliceで取り出しrangeでつなげる
0:abc
1:DEF
2:ghi
3:いろは
4:ニホテト
abcDEFghiいろはニホテト
—————–
コピペミスなどで、制限時間オーバー、、。次回から60分以内で学ぶにしよう・・・
Go
Hide
2日ほど前から、ダウンロード可能となっているgo-windows(こちら)。
golangしている人々とwindowsな人々とは接点が少ないのか、いまだにエントリーがないようなので、一応MSDNユーザーだったりする自分がエントリーしておく(といっても、いささか手抜きなので、ちゃんとした追加エントリーを期待しつつ)。
注意 以下、windows-vistaでの例
コマンドライン(cmd.exe)でMSゴシックなどが使えるようにしておく (たとえば、このあたりを参考にさせていただきつつ)。
※レジストリをいじり、再起動する必要がある
こちらから、go-1.zipをダウンロードし解凍先を決めて、解凍。
解凍先にコマンドラインのショートカットを作る。
「3」で作成したショートカットを右クリックし、起動時の文字コードをutf-8とする。具体的には、リンク先を「%SystemRoot%\system32\cmd.exe /f:on /k “chcp 65001″」と変更する(ついでに作業フォルダも決めておくと良い。)
お試しの人は、作業フォルダに以下の 内容のバッチファイル(例、g.bat)を作成し、保存する
set GOROOT=C:\go-win
set GOOS=mingw
set GOARCH=386
[追記] mingw(Windows版GNU C)のインストールはコメントに指摘してくださった方の言う通り不要。
以下の内容のファイル(例、hi.go)をutf-8で作成し、保存する
package main
import “fmt”
func main() {
fmt.Printf(“こんにちは、世界!!\n”)
}
コマンドラインに入り、PATHのgoのbinを追加(例、PATH=%PATH%;C:\go-win\bin)
5で設定したバッチファイル(例、g.bat)を実行
いよいよ、コンパイル&リンク&実行
C:\go-win\mysrc>8g hi.go
C:\go-win\mysrc>8l -o hi.exe hi.8
C:\go-win\mysrc>hi.exe
こんにちは、世界!!
※ 5と7は、環境変数に設定してしまう手もある。
※ (レジストリとか分かっているひと向け) 例えば、コマンドラインで以下(実際は一行)をタイプ一発でMSゴシックがcmd.exeに追加されるはず。自分の好きなフォントを追加するもご自由に。その前にレジストリのバックアップはしておこうね。
reg add “HKLM\Software\Microsoft\Windows NT
\CurrentVersion\Console\TrueTypeFont” /v “0.”
/t “REG_SZ” /d “MS Gothic”
おおっ、なんとめんどくさい(躓く人が出てしまうことであろう・・・)。
その通りなのである。
とにかくvistaあたりまではwindowsはひたすら囲い込みをしていたから。。。cmd.exeがディフォルトでutf-8対応するのは、windows-8からなのではなかろうか!?
ついでに上のfmt.Printfのところの文字列に、fmt.Printf(“ただのWindowsには興味ありません。この中にWindow-8ユーザー、Window-9ユーザー、Window-10ユーザーがいたら私のところにきなさい。\n“)などと長い文字を指定してみると、ここまでやってきた方法が不完全であることがわかるだろう。。。
ともあれ、goのコンパイルはwindows版でも極めて高速なことだけは気持ちが良いので、興味ある方はがんばってトライしてみてください。
ライブラリの互換性などの報告はそのうちに。いやはや、タイトルに「!!」をつけた割には、歯切れの悪いエントリー、失礼。
Go
Hide
Older posts >>