<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>Go言語</title><link>http://blogs.wankuma.com/esten/category/2215.aspx</link><description>Googleさんとこ生まれのホヤホヤ言語</description><managingEditor>片桐　継（Tugu Katagiri）</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>Go言語、新しい汎用パッケージ登場！</title><link>http://blogs.wankuma.com/esten/archive/2010/09/23/193153.aspx</link><pubDate>Thu, 23 Sep 2010 13:01:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2010/09/23/193153.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/193153.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2010/09/23/193153.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/193153.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/193153.aspx</trackback:ping><description>&lt;p&gt;またしても、リリース。&lt;/p&gt;&lt;a href="http://golang.org/doc/install.html"&gt;The Go Programming Language&lt;br&gt;http://golang.org/doc/install.html&lt;/a&gt; &lt;p&gt;といっても、Windows版はテストしなおしのため、もうちょっと先ね。&lt;/p&gt; &lt;p&gt;言語自身はさりげにAMD64対応とか、ARM対応とか、地味だけどジワジワと勢力拡大中ｗ&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Andrewいわく、今回の目玉は、フルテキストインデックスパッケージの登場！&lt;/p&gt; &lt;p&gt;便利な機能ががんがん増えとるなぁ。&lt;/p&gt; &lt;p&gt;いっそLINUXに環境立ち上げようかしらorz&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/193153.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>Go言語公式サイトがリニューアル</title><link>http://blogs.wankuma.com/esten/archive/2010/09/16/193023.aspx</link><pubDate>Thu, 16 Sep 2010 17:47:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2010/09/16/193023.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/193023.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2010/09/16/193023.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/193023.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/193023.aspx</trackback:ping><description>&lt;P&gt;&lt;A href="http://golang.org/"&gt;The Go Programming Language&lt;BR&gt;http://golang.org/&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;ガラリとデザイン変更＆メニュー変更。&lt;/P&gt;
&lt;P&gt;今回の目玉は&lt;FONT color=#008000&gt;&lt;STRONG&gt;「サンプルプログラムが動くぜ、ひゃっほー」ボタンの追加&lt;/STRONG&gt;&lt;/FONT&gt;。&lt;/P&gt;
&lt;P&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://esten.cside.com/wankuma/img/Go_FA0F/image.png" width=524 height=293&gt; &lt;/P&gt;
&lt;P&gt;「COMPILE＆RUN」ボタンを押すと、結果が表示されまする。&lt;/P&gt;
&lt;P&gt;いくつかサンプルコードが仕掛けられているので、ちょこっと触ってみると面白いかも。&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#ff0000&gt;&lt;STRONG&gt;Windows版リリースは、テスト環境がMINGW32からWin32配下になってテストしなおしになり、正式な対応が遅れる模様。&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/193023.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>Go言語が2010年BossieAword受賞</title><link>http://blogs.wankuma.com/esten/archive/2010/09/08/192829.aspx</link><pubDate>Wed, 08 Sep 2010 23:12:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2010/09/08/192829.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/192829.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2010/09/08/192829.aspx#Feedback</comments><slash:comments>80</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/192829.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/192829.aspx</trackback:ping><description>&lt;P&gt;Infoworld.comが主催する2010年のベストオープンソース開発アプリケーションソフトウェアにGo言語が選ばれたとのことです。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.infoworld.com/d/open-source/bossie-awards-2010-the-best-open-source-application-development-software-140&amp;amp;current=2&amp;amp;last=1"&gt;Bossie Awards 2010: The best open source application development software | Open Source - InfoWorld&lt;BR&gt;http://www.infoworld.com/d/open-source/bossie-awards-2010-the-best-open-source-application-development-software-140?t=2&amp;amp;last=1&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blog.golang.org/2010/09/go-wins-2010-bossie-award.html"&gt;The Go Programming Language Blog: Go Wins 2010 Bossie Award&lt;BR&gt;http://blog.golang.org/2010/09/go-wins-2010-bossie-award.html&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;ほそぼそやってる日本とは違い、海外での盛り上がり方は異常ｗ&lt;/P&gt;
&lt;P&gt;とか、そんな個人的な感想は置いといて、&lt;/P&gt;
&lt;P&gt;Go言語の新しいアップデートが来てます。&lt;/P&gt;
&lt;P&gt;もちろん、しっかり対応プラットホームの仲間入りしたWindows版も同時アップデート&lt;/P&gt;
&lt;P&gt;&lt;A href="http://code.google.com/p/gomingw/downloads/list"&gt;Tue Sep 7 21:39:49 PDT 2010 release.2010-09-06&lt;/A&gt; 
&lt;P&gt;タイムラグがなくなったのが嬉しいなぁ。くわしいWindows版Go言語については、サイトでみておくんなまし。&lt;/P&gt;&lt;A href="http://esten.wankuma.com/index.html"&gt;WindowsでGo言語：：トップページ&lt;BR&gt;http://esten.wankuma.com/index.html&lt;/A&gt; 
&lt;P&gt;今回の対応でWindows＆言語仕様がらみでポイントになりそうなのは&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;パッケージコンパイラの変更 
&lt;LI&gt;GoDocのHTML最適化完了 
&lt;LI&gt;httpパッケージのPostメソッドパラメータ対応 
&lt;LI&gt;httpパッケージのファイル日付処理関数対応 
&lt;LI&gt;httpパッケージのURL構造体にセキュアサイト用パスワード追加 
&lt;LI&gt;net/textprotにマルチラインレスポンス対応追加 
&lt;LI&gt;netにLookupMX関数追加 
&lt;LI&gt;netchanにコード(-1:infinite)追加、Sync、Drain関数追加 
&lt;LI&gt;regexpにエスケープ文字（\a \b \f \n \r \t \v.）が追加&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;こんなところ。あとはバグフィクスがいくつかなのはいつものことなので。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/192829.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>Go言語アップデートがリリース</title><link>http://blogs.wankuma.com/esten/archive/2010/08/25/192579.aspx</link><pubDate>Wed, 25 Aug 2010 18:34:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2010/08/25/192579.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/192579.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2010/08/25/192579.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/192579.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/192579.aspx</trackback:ping><description>&lt;p&gt;というわけで、Go言語バイナリー、アップデートされてます&lt;/p&gt;&lt;strong&gt;Last update&lt;/strong&gt; Wed Aug 25 00:55:05 PDT 2010 release.2010-08-25  &lt;p&gt;それにあわせて、Windows版ももちろんアップデート。&lt;/p&gt; &lt;p&gt;今回の目玉は、&lt;font color="#008000"&gt;&lt;strong&gt;いままでちまちまとMASMとCで書いてたWindowsプラットホーム対応処理の部分をWindowsAPIで処理するように変更&lt;/strong&gt;&lt;/font&gt;ってところかな。&lt;/p&gt; &lt;p&gt;オープンソースなので、つまりは、&lt;strong&gt;Go言語で使えるWindowsAPI処理のサンプルがごそっと増殖した&lt;/strong&gt;ってことですね。&lt;font color="#808080"&gt;うふふふ（謎笑い）&lt;/font&gt;&lt;/p&gt; &lt;p&gt;ダウンロードや開発環境等の情報は、&lt;/p&gt; &lt;p&gt;&lt;a href="http://esten.wankuma.com/index.html"&gt;WindowsでGo言語&lt;br&gt;http://esten.wankuma.com/index.html&lt;/a&gt;&lt;/p&gt; &lt;p&gt;こっちでね。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/192579.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>「WindowsでGo言語プログラミング」のまとめサイト</title><link>http://blogs.wankuma.com/esten/archive/2010/08/24/192555.aspx</link><pubDate>Tue, 24 Aug 2010 14:29:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2010/08/24/192555.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/192555.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2010/08/24/192555.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/192555.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/192555.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://esten.wankuma.com/"&gt;WindowsでGo言語：：トップページ&lt;br&gt;http://esten.wankuma.com/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;ブログにちまちま書いてた事を、ちまちまと静的情報としてまとめることにした。&lt;/p&gt; &lt;p&gt;そういや、わんくまサーバーのWEBエリア、全く使ってなかったのねｗ&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/192555.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>Simple SMTP Sample Code for Go Language</title><link>http://blogs.wankuma.com/esten/archive/2010/08/23/192514.aspx</link><pubDate>Mon, 23 Aug 2010 15:24:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2010/08/23/192514.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/192514.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2010/08/23/192514.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/192514.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/192514.aspx</trackback:ping><description>&lt;p&gt;This sample is super simple sending E-mail without "Pop before SMTP" or "MD5" ..or&amp;nbsp; .etc.&lt;/p&gt; &lt;p&gt;&lt;font color="#008000"&gt;&lt;strong&gt;A package "net/textproto” new added on 2010-08-11 version is very very useful!&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Go言語で動かしてみる超簡易SMTP処理。&lt;/p&gt; &lt;p&gt;POP Before SMTPとかMD5認証とか何それ？ｗ&lt;/p&gt; &lt;p&gt;なんだかやってみたらできたよVersion。&lt;/p&gt; &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:fefa0e9b-36de-41ee-8125-e795dcd11425" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c:nocontrols"&gt;package smtp

import(
  os "os"
  fmt "fmt"
  tnet "net/textproto"
  strings "strings"
)

// use this Struct for sending
type MailInfo struct {
  SmtpServer string
  SmtpPort int
  FromAddr string
  ToAddr string
  Subject string
  Body string
}

//Get Responses and Check end of line is "OK" 
func checkResponse(rb *tnet.Reader) (string,bool){

  msg, err := rb.ReadLine()
  if err != nil {
    return "",false
  }
  
  if strings.LastIndex(strings.ToLower(msg),"ok") &amp;gt;= (len(msg) - 3) {
    return msg,true
  }

  return msg,false
}

//Get Responses  
func GetResponse(rb *tnet.Reader) (string,bool){

  msg, err := rb.ReadLine()
  if err != nil {
    return "",false
  }

  return msg,true
}

//Get Response only specific code  
func waitUntilResponseCode(rb *tnet.Reader,code int) (int,string,bool){

  cd, msg, err := rb.ReadCodeLine(code)
  if err != nil {
    return -1,"",false
  }

  return cd,msg,true
}

//send command to server  
func doCommand(wb *tnet.Writer,cmdstr string) os.Error{

  err := wb.PrintfLine(cmdstr)
  if err != nil {
    return err
  }
  
  return nil
}

//send dotText protocol to server  
func WriteMessage(wb *tnet.Writer,str string) os.Error{

  wwc := wb.DotWriter()

  _,err := wwc.Write([]byte(str))
  if err != nil {
    return err
  }
  
  err = wwc.Close()
  if err != nil {
    return err
  }
  
  return nil
}

//sending E-mail  
func ( mainInfo *MailInfo) SendMail() (string, bool){
  
  var log string

  myConn,err := tnet.Dial("tcp", fmt.Sprintf("%s:%d",mainInfo.SmtpServer,mainInfo.SmtpPort)) 
  if err != nil { 
    log += fmt.Sprintf("%s\n",err.String())
    return log,false
  }

  defer   myConn.Close()

  rb := tnet.NewReader(myConn.Reader.R)
  wb := tnet.NewWriter(myConn.Writer.W)
  
  m,b := GetResponse(rb)
  log = fmt.Sprintf("%s\n",m)
  if b == false {
    return log,false
  }
  
  err = doCommand(wb,"EHLO")
  if err != nil { 
    log += fmt.Sprintf("%s\n",err.String())
    return log,false
  }

  m,b = GetResponse(rb)
  log = fmt.Sprintf("%s%s\n",log,m)
  if  b == false {
    return log,false
  }
  
  err = doCommand(wb,fmt.Sprintf("MAIL FROM:&amp;lt;%s&amp;gt;",mainInfo.FromAddr))
  if err != nil { 
    log += fmt.Sprintf("%s\n",err.String())
    return log,false
  }

  m,b = checkResponse(rb)
  log = fmt.Sprintf("%s%s\n",log,m)
  if b == false {
    return log,false
  }

  err = doCommand(wb,fmt.Sprintf("RCPT TO:&amp;lt;%s&amp;gt;",mainInfo.ToAddr))
  if err != nil { 
    log += fmt.Sprintf("%s\n",err.String())
    return log,false
  }

  m,b = checkResponse(rb)
  log = fmt.Sprintf("%s%s\n",log,m)
  if b == false {
    return log,false
  }
  
  err = doCommand(wb,"DATA")
  if err != nil { 
    log += fmt.Sprintf("%s\n",err.String())
    return log,false
  }

  m,b = GetResponse(rb)
  log = fmt.Sprintf("%s%s\n",log,m)
  if b == false {
    return log,false
  }
  
  err = WriteMessage(wb,fmt.Sprintf("Subject:%s \n\n%s\n",mainInfo.Subject,mainInfo.Body))
  if err != nil { 
    log += fmt.Sprintf("%s\n",err.String())
    return log,false
  }

  m,b = checkResponse(rb)
  log = fmt.Sprintf("%s%s\n",log,m)
  if b == false {
    return log,false
  }
  
  err = doCommand(wb,"QUIT")
  if err != nil { 
    log += fmt.Sprintf("%s\n",err.String())
    return log,false
  }

  m,b = GetResponse(rb)
  log = fmt.Sprintf("%s%s\n",log,m)
  if b == false {
    return log,false
  }

  return log,true
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;認証とか必要な時には、それにあったプロトコルをやり取りすればできると思うｗ&lt;/p&gt;
&lt;p&gt;ちなみに、呼び出し元ではこんな感じで&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:a3bfeafb-e7da-4a03-8389-d2671070ba0f" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c:nocontrols"&gt;package main

import(
  fmt "fmt"
  smtp "smtp"
)

func main(){

  var myInfo smtp.MailInfo
  
  myInfo.SmtpServer = "hogeserver"
  myInfo.SmtpPort = 25
  myInfo.FromAddr = "from@sample.com"
  myInfo.ToAddr = "to@sample.com"
  myInfo.Subject = "てすと"
  myInfo.Body = "本文"
  
  log,erb := myInfo.SendMail()
  
  if erb {
    fmt.Printf("OK!\n%s",log)
    
  }else{
    fmt.Printf("NG!\n%s",log)
  }
    
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;やだ、超シンプルｗ&lt;/p&gt;
&lt;p&gt;&lt;font color="#008000"&gt;&lt;strong&gt;SMTPパッケージの中で使っている要の汎用パッケージ、"net/textproto"、は８／１１のバージョンアップで追加されたものなんだけど、これのおかげでポートのやり取り＝プロトコルのコントロールが本当に楽になった。&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;文字コード制御とかE-mailヘッダー制御とかも書いてない、とりあえずの骨組みだから、必要だと思う人は頑張って追加してくださいましですｗ　&lt;font color="#808080"&gt;私はこれで満足してしまった＜おい&lt;/font&gt;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/192514.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>ダブりしたって言うけど、そうかな？どうかな？</title><link>http://blogs.wankuma.com/esten/archive/2010/08/21/192475.aspx</link><pubDate>Sat, 21 Aug 2010 11:05:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2010/08/21/192475.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/192475.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2010/08/21/192475.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/192475.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/192475.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://blogs.wankuma.com/esten/archive/2010/08/20/192454.aspx"&gt;SSIでIISでGoでテンプレ&lt;br&gt;http://blogs.wankuma.com/esten/archive/2010/08/20/192454.aspx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;のGo言語で作ったSSIカウンター、実は致命的な欠点がまだあるの。&lt;/p&gt; &lt;p&gt;同じ人が何回もF5すると、その回数だけ訪問回数が増えちゃうんだ。&lt;/p&gt; &lt;p&gt;なので、その対策として、訪問者の重複チェックもしてみよう、というのでさらにリファクタ。&lt;/p&gt; &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:9a82d93e-d78b-480f-b2fc-936003c65c5b" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c:nocontrols"&gt;package main

//使用する汎用パッケージ
import (
 fmt "fmt";
 util "io/ioutil"
 strings "strings"
 os "os"
 template "template" 
 strconv "strconv"
 time "time"
)

//テンプレートに引き渡す情報
type Record struct {
    today string
    yesterday string
    total string 
  }

//ファイルレコード分析用
const (
   Today = iota;
   Yesterday;
   Total;
   Day;
)

//データファイル名（実行exeと同じフォルダにあること）
const COUNTER_FILE = "cnt.dat"
const VISITED_FILE = "chk.dat"

//出力テンプレート
const tpl = ` 
  &amp;lt;div class="counter"&amp;gt;
    &amp;lt;div class="ctToday"&amp;gt;
      &amp;lt;div class="hToday"&amp;gt;Today:&amp;lt;/div&amp;gt;
      &amp;lt;div class="cToday"&amp;gt;{today}&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div class="ctYesterday"&amp;gt;
      &amp;lt;div class="hYesterday"&amp;gt;YesterDay:&amp;lt;/div&amp;gt;
      &amp;lt;div class="cYesterday"&amp;gt;{yesterday}&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div class="ctTotal"&amp;gt;
      &amp;lt;div class="hTotal"&amp;gt;Total:&amp;lt;/div&amp;gt;
      &amp;lt;div class="cTotal"&amp;gt;{total}&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
` 

//エラー処理
func IfErrorExit(err os.Error) {

  if err == nil {
    return
  }

  fmt.Printf("Content-Type: text/html;charset=UTF-8\n\n")
  fmt.Printf("%s\n",err.String())
  
  os.Exit(0)    

}

//重複アクセスチェック
func checkVisited(cbuf string, nowday int, inrm string) (bool,string) {

  //先頭１つめの記録日付を取り出して、チェック
  rmInfos := strings.Split(cbuf , "," ,-1)

  v,er := strconv.Atoi(rmInfos[0])
  IfErrorExit(er)

  //今日の最初のサイト訪問者なら無条件にカウントアップ
  if v != nowday {

    return false,fmt.Sprintf("%d,%s,",nowday,inrm)
    
  }
  
  //今日はじめての訪問なら無条件にカウントアップ
  if strings.Index(cbuf,  fmt.Sprintf(",%s,",inrm)) &amp;lt; 0 {

    return false,fmt.Sprintf("%s,%s,",cbuf,inrm)
  
  }
  
  return true,cbuf
  
}

//ファイル名を取得
func getReadFileName() (string,string ){
  //IISなので、SSIで動かす時はルート相対パス指定

  //IISからみたURLのルートパス（URLのルート物理パス）
  myrpath := strings.Split(os.Getenv("PATH_TRANSLATED"),"\\",-1)

  //IISからみた実行スクリプトパス
  myspath := strings.Split(os.Getenv("SCRIPT_NAME"),"/",-1) 

  //配列の一番後ろ＝スクリプトexeファイル名なので消去
  myspath[len(myspath)-1] = "";
  
  //ルートパス＋スクリプトパス＋データファイル名の物理パスを返す
  ppath := fmt.Sprintf("%s%s",strings.Join(myrpath,"\\"),strings.Join(myspath,"\\"))
  return fmt.Sprintf("%s%s",ppath,COUNTER_FILE),fmt.Sprintf("%s%s",ppath,VISITED_FILE) 
}

//メイン処理
func main() {

  //読込データファイル（exeと同フォルダ内の固定ファイル）を読む
  ctFile,ckFile := getReadFileName()
  
  buf,er := util.ReadFile(ctFile)
  IfErrorExit(er)

  checkbuf,er := util.ReadFile(ckFile)
  IfErrorExit(er)

  //データレコードを分割して、順番に意味づけ
  myCounter := strings.Split(fmt.Sprintf("%s",buf),",",-1)
  
  wtotal,er := strconv.Atoi(myCounter[Total])
  IfErrorExit(er)

  wtoday,er := strconv.Atoi(myCounter[Today])
  IfErrorExit(er)

  wyesterday,er := strconv.Atoi(myCounter[Yesterday])
  IfErrorExit(er)

  wday,er := strconv.Atoi(myCounter[Day]) 
  IfErrorExit(er)

  //チェックのための日付準備
  now := time.LocalTime()
  visitInfo := os.Getenv("REMOTE_ADDR")
  
  //サイト再訪問チェック
  retbln,retstr := checkVisited(fmt.Sprintf("%s",checkbuf), now.Day ,visitInfo)
  
  //今日はじめての訪問だったら、カウントアップしてログ記録
  if retbln == false {

    //前回データ保持日付が記録されているので、比較して日付更新処理
    if now.Day != wday  {
      
      wyesterday = wtoday
      wtoday = 1
      wday = now.Day
  
    }else{
  
      wtoday++;
      
    }
    
    //トータルカウントアップ処理
    wtotal++;
        
    //データの書き込み
    er = util.WriteFile(ctFile, []byte(fmt.Sprintf("%d,%d,%d,%d",wtoday,wyesterday,wtotal,wday)),777)
    IfErrorExit(er)
    
    er = util.WriteFile(ckFile, []byte(retstr),777)
    IfErrorExit(er)
    
  }
  
  //テンプレの準備
  var nowCounter Record;
  nowCounter.today = fmt.Sprintf("%05d",wtoday);
  nowCounter.yesterday = fmt.Sprintf("%05d",wyesterday);
  nowCounter.total = fmt.Sprintf("%05d",wtotal);  

  //テンプレ書き出し
    fmt.Printf("Content-Type: text/html;charset=UTF-8\n\n")
  t := template.MustParse(tpl, nil); 
  t.Execute(nowCounter, os.Stdout); 

  os.Exit(0)
  
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;サイト訪問者のリモートアドレスを１日分蓄積して、そこと照らし合わせてカウンターまわすかどうか決めてるしくみ。&lt;/p&gt;
&lt;p&gt;SSIなので、CookieヘッダーはWEBサーバー側で握りつぶされるので使おうと思っても使えないから、サーバー側で対処ね。ここ、意外とひっかかるので注意だったり。&lt;/p&gt;
&lt;p&gt;今回のソースは、Go言語らしく、１関数で複数の戻り値を使って書いてるから、実行する効率はPerlやCで書く時よりも良いはず。Go言語の作者さんは「ここがすごいところなんだぜ？」とイチオチの機能だし。&lt;/p&gt;
&lt;p&gt;といっても、まだまだきっとリファクタできるんだろけど、私はこれで満足？したから、また何かCGIとか欲しくなったら作ろう＜おい&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/192475.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>Goでexeで環境変数</title><link>http://blogs.wankuma.com/esten/archive/2010/08/20/192463.aspx</link><pubDate>Fri, 20 Aug 2010 23:25:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2010/08/20/192463.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/192463.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2010/08/20/192463.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/192463.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/192463.aspx</trackback:ping><description>&lt;p&gt;ほんと、判らなくてorz。Perlとかと似てるようでちょっとした所が違うのね。なので表示するプログラムを作って調べてたの。&lt;/p&gt; &lt;p&gt;WEBサーバー上で実行環境ができてるか、これをコンパイルして、できたexeを置いてWEBサーバーから動かせばOK。&lt;/p&gt; &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:bc072de4-2412-4e47-b3d7-3209d22fa23d" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c:nocontrols"&gt;package main

//使用する汎用パッケージ
import (
 template "template" 
 os "os"
 vector   "container/vector"
)

//テンプレートに引き渡す情報
type Record struct {
    values vector.StringVector; 
  }

//出力テンプレート
const tpl =` 
  &amp;lt;!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"&amp;gt;
  &amp;lt;HTML&amp;gt;&amp;lt;HEAD&amp;gt;
  &amp;lt;meta HTTP-EQUIV = \"Content-Type\" CONTENT = \"text/html; charset=UTF-8\" &amp;gt;
  &amp;lt;title&amp;gt;あなたの世界！&amp;lt;/title&amp;gt;
  &amp;lt;/HEAD&amp;gt;
  &amp;lt;BODY&amp;gt;
  &amp;lt;center&amp;gt;
  &amp;lt;table&amp;gt;
  &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;環境変数&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;
    {.repeated section values}&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;{@}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;{.end}
  &amp;lt;/table&amp;gt;
  &amp;lt;/center&amp;gt;
  &amp;lt;br /&amp;gt;&amp;lt;hr&amp;gt;produced by Tugu Katagiri.&amp;lt;br /&amp;gt;
  &amp;lt;/body&amp;gt;
  &amp;lt;/html&amp;gt;
` 

//メイン処理
func main() {

  myEnv := os.Environ()
  
  //取得した環境変数をテンプレ用情報に変換
  m := new(Record)
  for _,v := range myEnv {
    m.values.Push(v)    
  }
  
  //テンプレ書き出し
  t := template.MustParse(tpl, nil); 
  t.Execute(m, os.Stdout); 

  os.Exit(0)
  
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;テンプレに情報を引き渡す時、変数名がはっきり判るように構造体で渡してあげると、中で繰り返しを制御できたりしてとっても便利。&lt;/p&gt;
&lt;p&gt;&lt;font color="#008000"&gt;&lt;font color="#000000"&gt;上の例で言うと、&lt;/font&gt;&lt;strong&gt;{.repeated section values}&lt;/strong&gt;&lt;/font&gt;って書くと&lt;strong&gt;&lt;font color="#008000"&gt;{.end}&lt;/font&gt;&lt;/strong&gt;の部分まで、&lt;font color="#ff0000"&gt;引き渡した構造体の中のvaluesという名前の変数に値がある限り&lt;/font&gt;、勝手に繰り返して書いてくれる。&lt;/p&gt;
&lt;p&gt;ASP.NETでいう、Repeaterオブジェクトと同じような動きだと思うの。&lt;/p&gt;
&lt;p&gt;構造体に変換する部分が面倒だけど、その後の楽チンさを考えるとやっぱりそうしておく方がずっと良いよね。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/192463.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>SSIでIISでGoでテンプレ</title><link>http://blogs.wankuma.com/esten/archive/2010/08/20/192454.aspx</link><pubDate>Fri, 20 Aug 2010 22:28:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2010/08/20/192454.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/192454.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2010/08/20/192454.aspx#Feedback</comments><slash:comments>323</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/192454.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/192454.aspx</trackback:ping><description>&lt;p&gt;なんだかよく判らない（笑）&lt;/p&gt; &lt;p&gt;夏も盛りにGo言語、最新バイナリアップされてるので欲しい方どうぞ。&lt;/p&gt; &lt;p&gt;ちまちまとIIS上のサイトなんかを作ってるんですが、PHPセットアップしたと思ったらしてなかったので、それならついでに、とGo言語でCGIを作ってみたｗ&lt;/p&gt; &lt;p&gt;欲しかったのはSSIで動作する埋め込みのカウンター。よくあるやつね。&lt;/p&gt; &lt;p&gt;いちおう、HTMLで動作できるようにIISを仕込んであって、後はGoで作成したexeファイルを動くようにさえしてしまえば良い状態だったし、色々と練習したかったのもあって、頑張ってみた。&lt;/p&gt; &lt;p&gt; &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:3922c4ea-b4e0-4e3d-b4a3-d9161a24e9b8" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c:nocontrols"&gt;package main

//使用する汎用パッケージ
import (
 fmt "fmt";
 util "io/ioutil"
 strings "strings"
 os "os"
 template "template" 
 strconv "strconv"
 time "time"
)

//テンプレートに引き渡す情報
type Record struct {
    today string
    yesterday string
    total string 
  }

//ファイルレコード分析用
const (
   Today = iota;
   Yesterday;
   Total;
   Day;
)

//出力テンプレート
const tpl = ` 
  &amp;lt;div class="counter"&amp;gt;
    &amp;lt;div class="ctToday"&amp;gt;
      &amp;lt;div class="hToday"&amp;gt;Today:&amp;lt;/div&amp;gt;
      &amp;lt;div class="cToday"&amp;gt;{today}&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div class="ctYesterday"&amp;gt;
      &amp;lt;div class="hYesterday"&amp;gt;YesterDay:&amp;lt;/div&amp;gt;
      &amp;lt;div class="cYesterday"&amp;gt;{yesterday}&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div class="ctTotal"&amp;gt;
      &amp;lt;div class="hTotal"&amp;gt;Total:&amp;lt;/div&amp;gt;
      &amp;lt;div class="cTotal"&amp;gt;{total}&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
` 

//ファイル名を取得
func getReadFileName() string {
  //IISなので、SSIで動かす時はルート相対パス指定

  //IISからみたURLのルートパス（URLのルート物理パス）
  myrpath := strings.Split(os.Getenv("PATH_TRANSLATED"),"\\",-1)

  //IISからみた実行スクリプトパス
  myspath := strings.Split(os.Getenv("SCRIPT_NAME"),"/",-1) 

  //配列の一番後ろ＝スクリプトexeファイル名なので消去
  myspath[len(myspath)-1] = "";
  
  //ルートパス＋スクリプトパスにデータファイル名cnt.datを設定して物理パスを返す
  return fmt.Sprintf("%s%scnt.dat",strings.Join(myrpath,"\\"),strings.Join(myspath,"\\"))
}

//メイン処理
func main() {

  //読込データファイル（exeと同フォルダ内の固定ファイル）を読む
  rFile := getReadFileName()
  buf,er := util.ReadFile(rFile)

  if er != nil {
      fmt.Printf("Content-Type: text/html;charset=UTF-8\n\n")
      fmt.Printf("%s\n",er.String())
      return    
  }
  
  //データレコードを分割して、順番に意味づけ
  myCounter := strings.Split(fmt.Sprintf("%s",buf),",",-1)
  
  wtotal,er := strconv.Atoi(myCounter[Total])
  if er != nil {
      fmt.Printf("Content-Type: text/html;charset=UTF-8\n\n")
      fmt.Printf("%s\n",er.String())
      return    
  }

  wtoday,er := strconv.Atoi(myCounter[Today])
  if er != nil {
      fmt.Printf("Content-Type: text/html;charset=UTF-8\n\n")
      fmt.Printf("%s\n",er.String())
      return    
  }

  wyesterday,er := strconv.Atoi(myCounter[Yesterday])
  if er != nil {
      fmt.Printf("Content-Type: text/html;charset=UTF-8\n\n")
      fmt.Printf("%s\n",er.String())
      return    
  }

  wday,er := strconv.Atoi(myCounter[Day]) 
  if er != nil {
      fmt.Printf("Content-Type: text/html;charset=UTF-8\n\n")
      fmt.Printf("%s\n",er.String())
      return    
  }

  //前回データ保持日付が記録されているので、比較して日付更新処理
  now := time.LocalTime()
  
  if now.Day != wday  {
    
    wyesterday = wtoday
    wtoday = 1
    wday = now.Day

  }else{

    wtoday++;
    
  }
  
  //トータルカウントアップ処理
  wtotal++;
  
  //データの書き込み
  er = util.WriteFile(rFile, []byte(fmt.Sprintf("%d,%d,%d,%d",wtoday,wyesterday,wtotal,wday)),777)

  if er != nil {
      fmt.Printf("Content-Type: text/html;charset=UTF-8\n\n")
      fmt.Printf("%s\n",er.String())
      return    
  }
  
  //テンプレの準備
  var nowCounter Record;
  nowCounter.today = fmt.Sprintf("%05d",wtoday);
  nowCounter.yesterday = fmt.Sprintf("%05d",wyesterday);
  nowCounter.total = fmt.Sprintf("%05d",wtotal);  

  //テンプレ書き出し
    fmt.Printf("Content-Type: text/html;charset=UTF-8\n\n")
  t := template.MustParse(tpl, nil); 
  t.Execute(nowCounter, os.Stdout); 

  return
  
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;動作バージョンは最新で。&lt;/p&gt;
&lt;p&gt;でもって、テスト確認用にHTMLを作成して、testフォルダには「0,0,0,0,」とだけ書かれたテキストファイル(cnt.dat)を入れておく。&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:7653ba7c-11d5-411c-9e1b-5a6b558656ef" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="xml:nocontrols"&gt;&amp;lt;html&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;!--#exec cgi="/test/counter.exe" --&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt; 
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;動作させると、&lt;/p&gt;
&lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://esten.cside.com/wankuma/img/SSIIISGo_13BC2/image.png" width="132" height="126"&gt; &lt;/p&gt;
&lt;p&gt;後は必要な所に組み込んで、CSSを書いて体裁を整えればOK。&lt;/p&gt;
&lt;p&gt;IISでSSIでGoのexeを動かすと環境変数が何で来るのかさっぱり判らなくて、探って無理矢理しこんだ部分はあるから、もっと良い方法があるかもしれないね。&lt;/p&gt;
&lt;p&gt;&lt;font color="#008000"&gt;ま、動いてるからいいや＜おいこらまて&lt;/font&gt;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/192454.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>Go言語forWindows　最新リリースきました</title><link>http://blogs.wankuma.com/esten/archive/2010/08/03/191931.aspx</link><pubDate>Tue, 03 Aug 2010 07:51:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2010/08/03/191931.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/191931.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2010/08/03/191931.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/191931.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/191931.aspx</trackback:ping><description>&lt;P&gt;というわけで、早速ダウンロード。&lt;/P&gt;
&lt;P&gt;&lt;U&gt;&lt;FONT color=#0000ff&gt;&lt;A href="http://code.google.com/p/gomingw/downloads/list"&gt;http://code.google.com/p/gomingw/downloads/list&lt;/A&gt;&lt;/FONT&gt;&lt;/U&gt;
&lt;/p&gt;
&lt;P&gt;ざらっと見たリリースノートでの修正点は 
&lt;UL&gt;
&lt;LI&gt;Httpsへの対応 
&lt;LI&gt;MultiReader/Writerの対応 
&lt;LI&gt;MimeにAddExtentionType関数追加 
&lt;LI&gt;TimeZone考慮ロジックの追加&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Windows関係で大きな変更は 
&lt;UL&gt;
&lt;LI&gt;Syscall 
&lt;UL&gt;
&lt;LI&gt;Syscall12の復活！ 
&lt;LI&gt;ForkExecの実装 
&lt;LI&gt;WindowsErrorハンドリングの実装 
&lt;LI&gt;FormatMessage関係の実装 
&lt;LI&gt;Pipe処理の実装&lt;/LI&gt;&lt;/UL&gt;
&lt;LI&gt;Netパッケージ 
&lt;UL&gt;
&lt;LI&gt;空文字のRead/Writeで例外発生するのを対処 
&lt;LI&gt;LookupHost/Port/Srvの関数追加 
&lt;LI&gt;Read時のEOF判定の追加&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;あとはBugFixいっぱい＜おい&lt;/P&gt;
&lt;P&gt;また色々と使ってみないと判んないなー。でもSyscall12の復活は嬉しい。&lt;/P&gt;
&lt;P&gt;それにしてもForkExecってどう動くんだろ。プロセスまるごと複製をマジでやるんかな？&lt;/P&gt;
&lt;P&gt;
&lt;HR&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;って思って、パッケージのソース読んで、「プロセスまるごとマジ複製」なのを確認。&lt;/P&gt;
&lt;P&gt;中でGetStartupInfoして、その中身でCreateProcessしなおしてたｗ　マジだ。でもForkだｗ&lt;/P&gt;
&lt;P&gt;無いものは作る。基本だし、ベタだけど、アリだ。GJ！&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/191931.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>