วันอาทิตย์ที่ 22 มีนาคม พ.ศ. 2558

Simple Form post with Golang

วันนี้ขอนำเสนอวิธีการ ส่ง HTTP request เรื่องการ post form การ post form นั้นจะมีการส่งค่าตรงแปรต่างๆเข้าไปด้วย ในภาษา Go นั้น package net/http มี function PostForm ให้เราใช้ได้ง่ายๆเลย
ตัวอย่างง่ายๆตามนี้เลย


package main

import ("net/http"
        "log"
        "net/url"
        "fmt"
        )

func main()  {

 postUrl := "https://www.somesite.com/login"

 values := make(url.Values)

 values.Set("user", "neverlock")
 values.Set("pwd", "password")

 // Submit form
 resp, err := http.PostForm(postUrl, values)
 if err != nil {
         log.Fatal(err)
 }
 fmt.Printf("[%d] %s\n",i,resp.Status)
 defer resp.Body.Close()

}

สำหรับวิธีง่ายๆในการที่จะหาว่า มีค่าอะไรบ้างที่จะต้องส่งไปในการ post form แต่ละครั้งก็ให้ใช้ chrome หรือ firefox แล้วเปิด developer tool ขึ้นมาจากนั้น post form ไปเลยเพื่อดูว่ามันส่งอะไรมั่งจะได้ไม่ต้องไปเสียเวลานั่งไล่ code html ดูในส่วนของ Form Data ได้เลยว่า formpost นั้นๆส่งค่าอะไรไปบ้าง


วันเสาร์ที่ 14 มีนาคม พ.ศ. 2558

หาตำบลจาก lat long

วันก่อนเห็นมีคนเอาข้อมูลจาก opendata จาก http://data.go.th/  มาใช้งานวันนี้ผมลองเขียน api สำหรับบอกข้อมูลว่า ณ. location ที่เราอยู่เราอยู่ใกล้ตำบลอะไร จังหวัดอะไร ส่งข้อมูลเป็น lat long ที่เป็นเลขฐาน 10
ไปลองทดลองใช้กันได้ครับที่ http://api.conf.in.th:8081/distance?lat1=100.1&lon1=30.2


วันศุกร์ที่ 13 มีนาคม พ.ศ. 2558

วิเคราะห์ Virus auto post บน facebook

เมื่อกี้เห็นมีคน post อะไรแปลกๆบน facebook ผมเลยลองแกะไล่ดูว่ามันเกิดอะไรขึ้น

จากรูปจะเห็นได้ว่า app นี้คน post ไม่ได้ post ด้วยตัวเอง เป็นการ post ผ่าน app ที่ชื่อ "BlackBerry Samrthphone App" เมื่อลองกดเข้าไปดูในหน้า app นั้นจะเห็นว่า app นั้นไม่มีอะไรเลย

เป็นหน้า app เปล่าๆ
ผมลองเสี่ยงตายกดไปที่รูป(ไม่ได้สนใจเนื้อหา vdo จริง จริ๊ง) แล้วมันจะ redirect เราไปอีกเว็บหนึ่งแทน และเมื่อเราลอง monitor ดูว่ามันส่งข้อมูลเราไปไหนบ้างจะเห็นว่า

มันไปเรียก server ของ app ที่ domain http://l3s26vtpgb9.f.giaybansi.vn ซึ่งเอาว่าเป็นของคนเวียดนาม
จากนั้นดูว่า domain นี้ IP อะไรเพื่อที่ลองหาดูว่า เค้าตั้ง server ไว้ที่ไหน
ปรากฏว่าเค้าไปเช่า Digital Ocean อยู่

แนวทางแก้ปัญหา

ผมลองหาทาง report app นี้เองมัน report ไม่ได้เพราะคนที่จะ report ได้มันจะต้องเป็นคนที่ใช้ app นั้นๆอยู่ โดยเข้าไป report ตามกระบวนการนี้
ฉะนั้นต้องเป็นหูเป็นตาช่วยกันถ้าเห็นเพื่อน post อะไรแปลกๆก็บอกเพื่อนเลยครับว่าให้ไป  report app มัน มันจะได้โดน facebook ban app มัน

สาเหตุการเกิดหละ?

เกิดได้หลายสาเหตุเดายากเหมือนกัน อาจจะเกิดจากการ click link ประหลาดๆ แต่ถ้าให้ผมเดาน่าจะเปิดจากการใช้ app บน mobile  ที่มันแปลกๆ แล้ว app มันขอ permission ในการ post หน้า facebook ของเรา ฉะนั้นถ้าเจอ app อะไรขอ permission เกี่ยวกับ facebook ให้ตรวจสอบให้ดีก่อนเปิดใช้นะครับ


วันพฤหัสบดีที่ 12 มีนาคม พ.ศ. 2558

Free geoip api service

เมื่อกี้ไปเจอคนในกลุ่ม go Thailand dev post เกี่ยวกับ go project ที่ปล่อย api geoip เห็นน่าสนใจดีเลยลองตั้ง service ดูใช้งานง่ายดีไม่มีอะไรยุ่งยากร้องขอ output ได้ 3 แบบคือ json,xml และ csv 

http://geoip.conf.in.th:8080/json/
http://geoip.conf.in.th:8080/xml/
http://geoip.conf.in.th:8080/csv/

วิธีการด้านบนจะเป็นการถาม IP ตัวเองแต่ถ้าอยากจะระบุหา IP อื่นก็ใช้แบบนี้

http://geoip.conf.in.th:8080/json/8.8.8.8

ใครสนใจ project นี้ตามไปอ่าน code ได้ที่ 

https://github.com/fiorix/freegeoip

สำหรับความแม่นยำนั้นก็อยู่ในระดับของฟรี ผมเข้าไปตรวจสอบดูละประเทศไทยความแม่นยำในระดับ 50KM อยู่ที่ 28% เอง (ตัว GeoIP2 City ที่เป็น 60% นั้นมันของเสียเงินซื้อครับ )

 

ถ้าเป็น IP เมกาจะค่อนข้างแม่นคือประมาณ 71%


วันอังคารที่ 10 มีนาคม พ.ศ. 2558

Golang simple web service

Go lang เป็นภาษาที่เหมาะสำหรับทำ web service มาก code ที่สั่ง start web server แค่ บรรทัดเดียวก็ทำได้ละ (บรรทัดอื่นๆเป็นการ controll route ที่จะวิ่งเข้าที่ server)
จริงๆแล้วการกำหนด route สามารถเขียนเองใน go โดยไม่ต้อง import อะไรพิเศษได้แต่ส่วนตัวแล้วผมชอบ lib ของ github.com/gorilla/mux code นี้จะเป็น code ง่ายๆที่ return ค่า "Hello world" ออกมาถ้าเราเข้าเว็บ http://localhost:8080/hello


go get github.com/gorilla/mux


package main

import (
        "fmt"
        "net/http"
        "github.com/gorilla/mux"
)

func main() {
        rtr := mux.NewRouter()
        rtr.HandleFunc("/hello",sayHi).Methods("GET")
        http.Handle("/", rtr)
        bind := ":8080"
        fmt.Printf("listening on %s...\n", bind)
        http.ListenAndServe(bind, nil)

}

func sayHi (w http.ResponseWriter, r *http.Request){
        str:="Hello world"
        w.Write([]byte (str))
}

Blogger Custom URL Error code bX-??????

เมื่อคืนจะเข้าไปปรับ URL ของ blogger หน่อยปรับยังไงก็ปรับไม่ได้ มันเด้งบอกว่า เรา logout จากอีกที่แถมขึ้น Error เวลาเข้าไปที่หน้า setting ด้วย


ลอง Debug ใน dev mode ดูเห็น internal error code 500 จาก server google เลย


search ดูใน forum support ของ blogger เองก็มีคนเจอปัญหานี้เยอะเหมือนกันแต่ยังไม่เห็นมีคนมาตอบปัญหาให้เลย คงต้องรอกันต่อไป T_T

EDIT:
บ่ายๆของวันที่เขียน blog นี้10 มี.ค. 2558 ระบบ set DNS ใช้งานได้แล้ว

วันจันทร์ที่ 9 มีนาคม พ.ศ. 2558

การทำ code syntax hight light บน Blog หรือเว็บ

เมื่อคืนนั่งลองหา css ที่ทำเกี่ยวกับ code syntax hight light บน blog เห็นมีอยู่หลายตัวแต่ลองแล้วชอบใจก็มี Prettyfy ที่อยู่ใน https://code.google.com/p/google-code-prettify/wiki/GettingStarted วิธีการใช้งานก็ง่ายๆ


<html>
<head>
<script src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js"></script>;
</head>
<body>
.
.
<pre class="prettyprint">
.
.
</pre>
.
.
</body>
</html>

ทั้งยังสามารถเปลียน skin ได้หลายแบบตามนี้

Default
<script src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js">

Desert
<script src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js?skin=desert">


Sunburst
<script src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js?skin=sunburst">

Sons-Of-Obsidian
<script src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js?skin=suns-ofobsidian">

Doxy
<script src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js?skin=doxy">


การกำหนดสีของ syntax
 เราสามารถเปลี่ยนสี hight light ตามภาษาที่เขียนได้เปลี่ยนได้หลายภาษาโดยใน class "prettyprint" ของ tag pre ให้เพิ่ม lang-xxx ภาษาเข้าไป โดยlist ของภาษาที่สนับสนุนตามนี้เลย
<pre class="prettyprint lang-css">
.
.
</pre>

การใส่เลขบรรทัด
<pre class="prettyprint linenums">
.
.
</pre>

วันอาทิตย์ที่ 8 มีนาคม พ.ศ. 2558

Golang Concat variables

ช่วงนี้กำลังหัดเขียนภาษา Go รู้สึกถูกจริตกับภาษานี้มากเพราะมันให้บรรยากาศเหมือนเขียน C และภาษา script แต่ทำอะไรสมัยใหม่ได้โดยไม่ต้องพัฒนาอะไรเองเพิ่งมากนักแถมยังกิน resource น้อยและทำงานได้ดีอีกด้วย



โดยปรกติภาษาใหม่ๆหน่อยมันจะมีวิธี Concat variables กับ Strings ได้ง่ายๆแต่ของ golang จะใช้ Sprintf ช่วยตามตัวอย่างนี้


query := fmt.Sprintf("Uid=%s&fName=%s&lName=%s&searchType=null",ID,FN,LN)

rtmpdump howto

บางเว็บจะใช้เทคนิค flash ดึง vdo  จาก rtmp server ซึ่งจะไม่สามารถ download ได้ปรกติจะต้องใช้คำสั่ง rtmpdump ในการ download ซึ่งจะต้องใส่ option ให้ถูกต้องตามที่ flash ส่งข้อมูลเข้าไปที่ vdo server การหา option นั้นถ้าจะให้แม่นจริงๆจะต้องใช้ วิธี ดัก package ในทีนี้ใช้ WireShark ดัก

ในตัวอย่างนี้เป็นวิธี download vdo จาก rtmp server ของ tv.ohozaa.com ซึ่ง IP ของ rtmp server คือ 103.22.182.59 ใช้ wireshark จับขาแลนไว้ หาคำว่า rtmp จะเจอพวก handshack หรืออื่นๆ กดขวาแล้วเลือก Follow TCP Stream จากนั้นหา rtmp เหมือนเดิมลองไล่หาไปล่างๆ จะเจอ rtmp://103.22.182.59/vod/..fpad..... (ต้องเจอคำว่า fpad ก่อน) ส่วนนี้จะเป็นโปรแกรมนะครับ
จากนั้นก็ต้องหาชื่อ ก็ไล่หาต่อไปมันจะอยู่ต่อคำว่า play เจอแล้ววววว
result.@.........?.............-........play.............mp4:ch3/11-13-2014/20.mp4.......


เมื่อได้ข้อมูลมาครบแล้วก็ เริ่ม Download กันเลยโดยใช้คำสั่งดังนี้

$ rtmpdump -r rtmp://103.22.182.59/vod -s http://tv.ohozaa.com/iswf/ex0743728/playerx_0765817.swf?kk.m=336e96-t rtmp://103.22.182.59/vod/ -p http://tv.ohozaa.com/hourly-rerun/3/2014-11-13/20/ -y mp4:ch3/11-13-2014/20.mp4 -o file.flv

func main {

fmt.Println("Hello World")



สวัสดีชาวโลก ปรกติผมไม่ค่อยชอบเขียน blog เท่าไรส่วนมากที่เขียน online ไว้จะเป็นพวกบันทึกช่วยจำหรือบทความเชิงเทคนิคอะไรแนวๆนี้ซะมากกว่าแต่รู้สึกว่ามันกระจัดกระจายเกินไปเลยตัดสินใจทำ blog ไปเลยดีกว่า
 }