Thu, 2 Apr 2015 5:26 pm
Magical #mongodb #enlightenment, perintah ini mencari dokumen sesuai "query", lalu meng-increment-kan nomor_agenda sejumlah 1, jika dokumen tidak ditemukan maka akan di-create ... dan ... hasil "atomic" ini akan mengembalikan value. Big WoW. Biasanya untuk menambah 1 setiap nomor agenda kita akan mengquery dulu nilai terakhir, lalu menambah satu dan terakhir update/insert sesuai nilai yang sudah ditambahkan. Cara ini sangat rawan terjadi kesalahan jika ada lebih dari 1 user mempost dalam waktu yang sama persis, dengan perintah mongo ini, hal seperti itu bisa diatasi ...
db.nomor_agenda.findAndModify({
    "query" : {"kode_jabatan": "02"},
    "update" : {"$inc" : {"nomor_agenda": 1}},
    "upsert" : true,
    "new" : true
})
#project
296 views
Thu, 2 Apr 2015 11:49 am
Saatnya masuk ke menu USER sms #project
197 views
Thu, 2 Apr 2015 11:44 am
246 views
Thu, 2 Apr 2015 11:38 am
sms-go #done at
- Admin Login
- Admin Logout
- Admin User
- Admin Jabatan
#project #go
283 views
Wed, 1 Apr 2015 7:39 pm
Hari pertama ngisi logbook #kantor
198 views
Wed, 1 Apr 2015 7:38 pm
@bengkel-pinggir-jalan depan hotel grand mentari #banbocor
203 views
Wed, 1 Apr 2015 6:55 am
Pagi di #rawasari, #aim lg liat traktor di youtube pake hape abah, ini posting pake hape #ayang
243 views
Tue, 31 Mar 2015 3:00 pm
@kursi-tunggu-lt7 antrean ke ruang pa kanwil, sama #pakarif,n #bufitri mau mbahas rencana extra effort #kantor
272 views
Tue, 31 Mar 2015 8:59 am
@aula-lt-8 iht ngisi logbook imbas kenaikan 2 juta (yang kalo ga tercapai jd dikurang 400 ribu) #hahaha #kantor
215 views
Mon, 30 Mar 2015 8:33 pm
sms masih sempat lanjut disamping tugas rutin kantor, hari ini sudah selesai di auth admin #project, tadi sempat bermasalah saat mengambil value hasil query mongodb. Interfave{} doesnt support indexing, #alhamdulillah sudah terselesaikan dengan menyamakan type map[string]interface{} disisi model dan controller #project
221 views
Mon, 30 Mar 2015 8:30 pm
@nasi-padang #rawasari
215 views
Mon, 30 Mar 2015 8:11 am
Progonosa restitusi 731 sudah diemail rifqi ke duktekkon240 #reminder #kantor
233 views
Mon, 30 Mar 2015 8:03 am
194 views
Mon, 30 Mar 2015 7:55 am
PPN Kanwil s.d. hari ini sudah melampaui PPN tahun 2012 periode yang sama, sepanjang sejarah kanwil PPN tertinggi ada di tahun 2012 #nice #kantor
221 views
Mon, 30 Mar 2015 7:42 am
@desktop #kantor
214 views
Sun, 29 Mar 2015 11:17 am
@mr_pancake_dutamall #sabtuminggu
216 views
Sun, 29 Mar 2015 5:19 am
Subuh #rawasari
205 views
Sat, 28 Mar 2015 5:14 am
Subuh #rawasari
206 views
Fri, 27 Mar 2015 10:43 pm
Ngobrol sama #omjalun di kamarnya, april ini mau ada kemah santri seIndonesia di bumi perkemahan tambang ulang, kmungkinan Bpk Presiden akan hadir. Ngobrol seputar kampusnya juga, ternyata aliansi NU di iain adalah HMI #info
79 views
Fri, 27 Mar 2015 9:35 pm
Olga meninggal #dukacita
76 views
Fri, 27 Mar 2015 9:17 pm
Ke rumah #acilsofi
82 views
Fri, 27 Mar 2015 8:55 pm
Antrian kasir @giant-pal7 sama #aim, #ayang, #omopal, #ninibanjar n #kaibanjar
228 views
Fri, 27 Mar 2015 6:09 pm
Package Checklist
Session : OK
MongoDB : OK
#todo
- Pecah sms-server ke package-package
- Rapikan Folder Templates
#project #go
265 views
Fri, 27 Mar 2015 5:47 pm
Belajar #go mulai masuk package, hari ini runtime sms sudah berhasil dipecah ke beberapa package #enlightenment
242 views
Fri, 27 Mar 2015 12:26 pm
Ke lt 1 #jumat an
219 views
Fri, 27 Mar 2015 10:29 am
To handle different methods differently: Many of my HTTP handlers contain nothing but a switch statement like this:
switch r.Method {
   case "GET":
       // Serve the resource.
   case "POST":
       // Create a new record.
   case "PUT":
       // Update an existing record.
   case "DELETE":
       // Remove the record.
   default:
       // Give an error message.
}
#go #stackoverflow #reminder
300 views
Fri, 27 Mar 2015 7:35 am
#aim td dibawai #ninibanjar senam di sekolahan ninibanjar
226 views
Thu, 26 Mar 2015 6:13 pm
Pusing sama tanggal am & pm, otak ane perlu loading sebentar untuk paham #fyuuh
216 views
Thu, 26 Mar 2015 6:02 pm
Login system sms-admin juga ready, base juga dipisahkan,jadi 4 base; sms-admin_base, sms-admin_base_noauth, sms-user_base, sms-user_base_noauth #project
207 views
Thu, 26 Mar 2015 5:57 pm
#aim lwn #ayang lg bjalanan ... #rawasari
245 views
Thu, 26 Mar 2015 12:48 am
sms-server.go
package main

  import (
      "fmt"
      "github.com/gorilla/mux"
      "github.com/gorilla/sessions"
      // "github.com/fzzy/radix/redis"
      // "github.com/fatih/structs"
      "net"
      "net/http"
      "html/template"
      "gopkg.in/mgo.v2"         
      "gopkg.in/mgo.v2/bson"
      "regexp"
      "strings"
      "crypto/rand"
      "time"
      "strconv"
      // "encoding/json"
      // "reflect"
  )

  var (
      // MongoDB
      mongoConfig       = "mongodb://localhost:27017/admin"
      MongoSession, err = mgo.Dial(mongoConfig)
      MDB               = MongoSession.DB("admin")
      BlogCol           = MDB.C("blog")
      UserCol           = MDB.C("user")

      // Session
      store             = sessions.NewCookieStore([]byte("something-very-secret"))

      // Blog
      skipHome          = 0
      limit             = 10
      rowsNum           = 10

      // Tag Factory
      tagPattern        = "#([a-z]|[A-Z]|[_])+"

      // Path
      templatePath      = "D:\\PROJECTS\\GO-APP\\webkoe\\templates\\"
      publicPath        = "D:\\PROJECTS\\GO-APP\\webkoe\\public\\"
  )

  func cekKodeJabatan(r *http.Request) string {
      session,_       := store.Get(r, "session-name")
      kode_jabatan    := fmt.Sprintf("%s", session.Values["kode_jabatan"])
      return kode_jabatan  
  }

  func SmsHomeHandler(w http.ResponseWriter, r *http.Request) {

      if cekKodeJabatan(r) == "" {
          http.Redirect(w, r, "/login", 301)
          fmt.Println(cekKodeJabatan(r))
          fmt.Println("*** @home -> No Data ")
      }else{
          templates := template.Must(template.New("").ParseFiles(templatePath + "sms-base.html", templatePath + "sms-home.html"))
          err := templates.ExecuteTemplate(w, "base", cekKodeJabatan(r))
          if err != nil {
              http.Error(w, err.Error(), http.StatusInternalServerError)
          }        
      }
  }

  func SmsLoginFormHandler(w http.ResponseWriter, r *http.Request) {

      if cekKodeJabatan(r) == "" {
          templates := template.Must(template.New("").ParseFiles(templatePath + "sms-base.html", templatePath + "sms-loginform.html"))
          err := templates.ExecuteTemplate(w, "base", nil)
          if err != nil {
              http.Error(w, err.Error(), http.StatusInternalServerError)
          }
      }else{
          http.Redirect(w, r, "/", 301)
      }
  }  

  func SmsPostLoginHandler(w http.ResponseWriter, r *http.Request) {
      
      if cekKodeJabatan(r) == "" {
          username          := r.FormValue("username")
          password          := r.FormValue("password")

          var results map[string]interface{}
          err = UserCol.Find(bson.M{"username": username, "password" : password}).One(&results)
          if err != nil {
              http.Redirect(w, r, "/#error", 301)
          }else{
              kode_jabatan, _ := results["kode_jabatan"]
              session, _                     := store.Get(r, "session-name")
              session.Values["kode_jabatan"]  = kode_jabatan
              session.Save(r, w)
              http.Redirect(w, r, "/", 301)
          }
      }else{
          http.Redirect(w, r, "/", 301)
      }
  }

  func SmsLogoutHandler(w http.ResponseWriter, r *http.Request) {
      
      session, _                     := store.Get(r, "session-name")
      session.Values["kode_jabatan"]  = ""
      session.Save(r, w)

      http.Redirect(w, r, "/", 301)
  }

  func safehtml(text string) template.HTML { 

      text = text + " "
      text = strings.Replace(text, "<", "<", -1)   
      text = strings.Replace(text, ">", ">", -1) 
        
      text = strings.Replace(text, "", "
", -1) text = strings.Replace(text, "", "", -1) text = strings.Replace(text, "", "", -1) text = strings.Replace(text, "", "", -1) text = strings.Replace(text, "", "", -1) text = strings.Replace(text, "", "", -1) text = strings.Replace(text, "", "", -1) text = strings.Replace(text, "=", "=", -1) text = strings.Replace(text, "<a href=", "", "", -1) text = strings.Replace(text, "<img src=", "", ">", -1) regexPagar, _ := regexp.Compile(tagPattern) tags := regexPagar.FindAllString(text, -1) for _ , value := range tags { tagAscii := strings.Replace(value, "#", "#", 1) tagOnly := strings.Replace(value, "#", "", 1) text = strings.Replace(text, value, "" + tagAscii + "", 1) } return template.HTML(text) } func timeFormatter(text string) template.HTML { text = strings.Replace(text, " ", "-", -1) text = strings.Replace(text, ":", "-", -1) split := strings.Split(text, "-") tahun, _ := strconv.Atoi(split[0]) bulan, _ := strconv.Atoi(split[1]) tanggal, _ := strconv.Atoi(split[2]) jam, _ := strconv.Atoi(split[3]) menit, _ := strconv.Atoi(split[4]) detik, _ := strconv.Atoi(split[5]) var _bulan time.Month if bulan == 1 { _bulan = time.January }else if bulan == 2 { _bulan = time.February }else if bulan == 3{ _bulan = time.March }else if bulan == 4{ _bulan = time.April }else if bulan == 5{ _bulan = time.May }else if bulan == 6{ _bulan = time.June }else if bulan == 7{ _bulan = time.July }else if bulan == 8{ _bulan = time.August }else if bulan == 9{ _bulan = time.September }else if bulan == 10{ _bulan = time.October }else if bulan == 11{ _bulan = time.November }else if bulan == 12{ _bulan = time.December } // const layout = "Mon Jan 2, 2006 at 3:04pm (MST)" (MST) --> WITA const layout = "Mon, 2 Jan 2006 3:04 pm" t := time.Date(tahun, _bulan, tanggal, jam, menit, detik, 0, time.Local) return template.HTML(t.Format(layout)) } 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 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 main() { mx := mux.NewRouter() // *** home *** mx.HandleFunc("/", SmsHomeHandler) // *** login *** mx.HandleFunc("/login", SmsLoginFormHandler).Methods("GET") mx.HandleFunc("/login", SmsPostLoginHandler).Methods("POST") // *** logout *** mx.HandleFunc("/logout", SmsLogoutHandler).Methods("GET") // *** static server *** mx.PathPrefix("/").Handler(http.FileServer(http.Dir( publicPath ))) http.ListenAndServe(":80", mx) } #go #script
415 views
Thu, 26 Mar 2015 12:44 am
It's time to #zzz
228 views
Thu, 26 Mar 2015 12:44 am
Login system SMS versi GO ready :) #project
219 views