Mon, 9 Mar 2015 12:32 am
Single file #webkoe server written in #go :)

package main

  import (
    "github.com/go-martini/martini"
    "github.com/martini-contrib/render"
    "gopkg.in/mgo.v2"
    "gopkg.in/mgo.v2/bson"
    "net"
    "net/http"
    "fmt"
    "time"
    "crypto/rand"
    "strings"
    "regexp"
  )

  // local 
  var mongoConfig = "127.0.0.1:27017"
  var blogCollection = "webkoe_blog"
  var hostHome = "localhost:8080"
  var hostCatatan = "catatan"


  // webkoe
  // var mongoConfig = "mongodb://usermongo:passmongo@localhost:portmongo/dbmongo"
  // var blogCollection = "blog"
  // var hostHome = "webkoe.net:8080"
  // var hostCatatan = "catatan.webkoe.net"


  type Blog struct {
    Id string
    Things string
    Date string
    Ip string
    Agent string
    Tag []string
  }

  func GetIP(r *http.Request) string {
      if ipProxy := r.Header.Get("X-FORWARDED-FOR"); len(ipProxy) > 0 {
          return ipProxy
      }
      ip, _, _ := net.SplitHostPort(r.RemoteAddr)
      return ip
  }

  func randStr(strSize int, randType string) string {
     var dictionary string
     if randType == "alphanum" {
        dictionary = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
     }
     if randType == "alpha" {
        dictionary = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
     }
     if randType == "number" {
        dictionary = "0123456789"
     }
     var bytes = make([]byte, strSize)
     rand.Read(bytes)
     for k, v := range bytes {
        bytes[k] = dictionary[v%byte(len(dictionary))]
     }
     return string(bytes)
   }

  func main() {

      // MARTINI
      m := martini.Classic()
      m.Use(render.Renderer(render.Options{
            Layout: "layout",
      }))

      // MONGODB
      session, err := mgo.Dial(mongoConfig)
      if err != nil {
        panic(err)
      }
      defer session.Close()
      session.SetMode(mgo.Monotonic, true)
      webkoe_blog := session.DB("admin").C(blogCollection)

      // ROUTER
      m.Get("/", func(r render.Render, req *http.Request) {
        if req.Host == hostHome {
          r.HTML(200, "home", req.Host)
        }else if req.Host == hostCatatan {
          r.HTML(200, "home-catatan", req.Host)
        }
      })

      m.Get("/blog", func(r render.Render) {
        var results []Blog
        err = webkoe_blog.Find(bson.M{}).Sort("-date").Limit(100).All(&results)
        if err != nil {
          panic(err)
        }
        // fmt.Println(results)
        r.HTML(200, "blog", results)
      })
      m.Post("/blog", func(req *http.Request, r render.Render){
        
        things := req.FormValue("things") + " "
        
        // tag
        regex, err := regexp.Compile("#([a-z])+ ")
        remove, err := regexp.Compile("(#| )")
        tags := regex.FindAllString(things, -1)
        // fmt.Println(tags)

        // modify semua listA
        var modTags []string
        for _, value := range tags {
            final := remove.ReplaceAllString(value, "")
            modTags = append(modTags, final)
        }
        // fmt.Println(modTags)


        waktu := strings.Split(fmt.Sprint(time.Now()), ".")[0]
        blog_id := randStr(7, "alphanum")
        ip := GetIP(req)
        agent := fmt.Sprint(req.Header["User-Agent"])

        jsonBlog := &Blog{Id: blog_id, Things: things, Date: waktu, Ip: ip, Agent: agent, Tag: modTags}
        err = webkoe_blog.Insert(jsonBlog)
        if err != nil {
          panic(err)
        }
        // fmt.Println(agent)
        r.Redirect("/blog")
      })
      m.Get("/blog/write", func(r render.Render) {
        r.HTML(200, "blog-form", nil)
      })

      m.RunOnAddr(":8080")
  }

230 views
Mon, 9 Mar 2015 12:30 am
Menempel ke tag#webkoe from #go
236 views
Mon, 9 Mar 2015 12:29 am
Tags behavior added to #go again ...
322 views
Mon, 9 Mar 2015 12:26 am
Tags behavior added to #go
62 views
Sun, 8 Mar 2015 11:46 pm
Script #go khusus modifikasi list http://play.golang.org/p/dpuX0ORbYJ
194 views
Sun, 8 Mar 2015 11:41 pm
Kesimpulan array #go sampai dengan hari ini

package main

    import "fmt"
    import "encoding/json"

    type Blog struct {
        id string
        things string
        tag []string
    }

    func main() {
        
        fmt.Println("\nMari mulai belajar list dan map Golang ...")

        // list
        listA   := []string{"ikan","sayur","buah", "1", "2", "3"}
        listB, _ := json.Marshal(listA)
        fmt.Println("\nlistA adalah " + string(listB))

        listA2   := []int{1,2,3}
        listB2, _ := json.Marshal(listA2)
        fmt.Println("\nlistA2 adalah " + string(listB2))   

        // dict
        mapA    := map[string]int {"apple": 5, "lettuce": 7}
        mapB, _ := json.Marshal(mapA)
        fmt.Println("\nmapA adalah " + string(mapB))

        fmt.Println("\nlist A")
        for _, value := range listA {
            fmt.Println(value)
        }

        fmt.Println("\nlist A2")
        for _, value := range listA2 {
            fmt.Println(value)
        }      

        fmt.Println("\nmapA")
        for key , value := range mapA {
            fmt.Println(key + " " + fmt.Sprint(value))
        }

        // manipulate list
        fmt.Println("\nAppend listA")
        x := append(listA, "77")
        fmt.Println(x)

        // modify semua listA
        fmt.Println("\nModify listA")
        var modListA []string
        for _, value := range listA {
            modListA = append(modListA, "mod:" + value)
        }
        fmt.Println(modListA)
    }

script diatas menghasilkan output

D:\PROJECTS\GO-APP>go run coba_json_sendiri.go

Mari mulai belajar list dan map Golang ...

listA adalah ["ikan","sayur","buah","1","2","3"]

listA2 adalah [1,2,3]

mapA adalah {"apple":5,"lettuce":7}

list A
ikan
sayur
buah
1
2
3

list A2
1
2
3

mapA
lettuce 7
apple 5

Append listA
[ikan sayur buah 1 2 3 77]

Modify listA
[mod:ikan mod:sayur mod:buah mod:1 mod:2 mod:3]

209 views
Sun, 8 Mar 2015 10:39 pm
Huruf a sering lepas ... #fyuuh
196 views
Sun, 8 Mar 2015 10:38 pm
Home #webkoe pake bootstrap storystrap
187 views
Sun, 8 Mar 2015 6:42 pm
Sudah di balai lagi #dinasluar
188 views
Sun, 8 Mar 2015 5:25 am
Subuh di rumah #niniusti #dinasluar
245 views
Sat, 7 Mar 2015 6:05 pm
Nunggu taksi mau ke rumah #niniusti #dinasluar, alamatnya di Graha indah a3 no 3 rt.6 Dekat SDN 033
245 views
Sat, 7 Mar 2015 2:36 pm
belajar list/array di $go

Yang saya tahu pada awalnya, pada #javascript dan #python
    
    a = ['ikan', 'sayur', 'buah', 1, 2, 3]

selesai, list sudah langsung terbentuk
bahkan dengan #php pun mudah

    a = array('ikan', 'sayur', 'buah', 1, 2, 3)

Buum, jadi ....

di GO lumayan runyam, namun JELAS dan RAPI

    listA   := []string{"ikan","sayur","buah", "1", "2", "3"}
    listB, _ := json.Marshal(listA)
    fmt.Println(string(listB)) // output ["ikan","sayur","buah","1","2","3"]

    listA2   := []int{1,2,3}
    listB2, _ := json.Marshal(listA2)
    fmt.Println(string(listB2)) // output [1,2,3]

listA adalah list dengan type data STRING, angka bisa masuk, tapi dia tidak diperlakukan sebagai INT (dengan petik dua "")
sedangankan listA2 adalah list dengan type data INT, anggotanya benar-benar angka (tanpa petik dua ""),
ikan sayur buah ERROR pada saat di-compile jika dipaksakan masuk

kode lengkapnya #go-nya :

    package main

    import "fmt"
    import "encoding/json"

    type Blog struct {
        id string
        things string
        tag []string
    }

    func main() {
        
        fmt.Println("Mari mulai ...")

        // list
        listA   := []string{"ikan","sayur","buah", "1", "2", "3"}
        listB, _ := json.Marshal(listA)
        fmt.Println(string(listB))

        listA2   := []int{1,2,3}
        listB2, _ := json.Marshal(listA2)
        fmt.Println(string(listB2))   

        // dict
        mapA    := map[string]int {"apple": 5, "lettuce": 7}
        mapB, _ := json.Marshal(mapA)
        fmt.Println(string(mapB))    
    }

304 views
Sat, 7 Mar 2015 12:43 pm
Benar benar galau, look like GO more fast then express #webkoe
65 views
Sat, 7 Mar 2015 11:07 am
Nyari info node.js di Indonesia, malah digiring ke forum kaskus, pas kebetulan ada yang menawarkan proyek simple web. Nice, simple web ... ane coba ikutan daftar, ternyata digiring ke http://project.co.id - inti dari web ini sama seperti Linkedn. Ane Bid (istilahnya melamar) ke projek tadi, trus bisa melihat siapa saja yang sudah bid, ada nama ahmadsuhaimi (http://www.ahmadsuaidi.com/) yang ternyata sudah punya rekam jejak banyak tentang perwebsite an, ane lihat portofolionya, ada traveller dan blablabla ... dari situ ane lihat ada fitur ticket, ternyata cara kerjanya seperti ini
1. Admin menyedikan form
2. User menginput
3. Diarahkan ke API Ticketing
4. Ada pilih, dan pemesanan
   ** ane pikir API nya langsung ke Maskapai, ternyata seperti kata Dino, mereka masuk ke Bulk travel dulu, dan sepertinya mereka melakukan pemesanan secara manual.
   ** lantas kenapa user ga langsung ke website maskapai saja, dan melakukan pembayaran langsung, tanpa perantara ?
   ** Mmm ... membingungkan
#project
220 views
Sat, 7 Mar 2015 10:59 am
API ticketing http://neotravellers.net/
URL : http://neotravellers.net/tiket-pesawat
POST : trip=0&flight=garuda&city_from=BPN-Balikpapan&city_to=BDJ-Banjarmasin&date_from=12-03-2015&date_to=&adult=1

Soure kode kota ada di home nya, murni HTML, tinggal sorong ...
#project
202 views
Sat, 7 Mar 2015 9:02 am
tidak mudah migrasi ke #go ... kembalikan lagi ke express, sementara ini #go masih dapat porsi di port 8080, http://webkoe.net:8080 #webkoe
244 views
Sat, 7 Mar 2015 8:55 am
tag posting lewat #go belum berafiliasi dengan tag manapun ... #webkoe
58 views
Sat, 7 Mar 2015 8:52 am
Bagian terberat ... parsing tag ke json tag, ... ane belum ngerti struktur data #go #todo
57 views
Sat, 7 Mar 2015 8:50 am
UserAgent OK #test #go #webkoe
52 views
Sat, 7 Mar 2015 8:50 am
#test UserAgent
55 views
Sat, 7 Mar 2015 8:37 am
Ip client Added #go #webkoe
51 views
Sat, 7 Mar 2015 8:36 am
Get IP Client #test
61 views
Sat, 7 Mar 2015 8:33 am
Get IP again #test
64 views
Sat, 7 Mar 2015 8:32 am
Get Ip Client #test
47 views
Sat, 7 Mar 2015 7:38 am
Hoahaha ... lumayan lah ni theme slate-nya bootstrap #webkoe
55 views
Sat, 7 Mar 2015 7:16 am
<code> fmt.Println("hello") </code> #test
49 views
Sat, 7 Mar 2015 6:27 am
Hahaha, ... ternyata webkoe masih sering kena spam ... mesti buru-buru ke captcha ni #webkoe
60 views
Sat, 7 Mar 2015 6:26 am
Random string untuk id_blog fixed #go #webkoe
65 views
Sat, 7 Mar 2015 6:17 am
look very minimalis, server migrasi ke #go #webkoe
57 views
Sat, 7 Mar 2015 6:12 am
#webkoe dihandle #go
61 views
Sat, 7 Mar 2015 6:07 am
Waktu dikoreksi #go
60 views
Sat, 7 Mar 2015 6:01 am
WAktu #test
74 views