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

ISO8601 TimeZone กับ Oracle PLSQL

ตัดสินใจส่ง XML เข้าไป Parse ใน Oracle procedure แทนที่จะ Parse ด้วย Erlang แล้วส่งไป ซึ่งก็น่าจะดีกว่า (หันไปเขียน PL อย่างเดียว)

แต่พอ Extract XML มาก็เจอปัญหา ISO8601 ที่ก่อนนี้ผมใช้ Erlang iso8601 library parse ออกมาแล้ว convert เป็น Oracle DateTime format ก่อนนำไปยัดเข้า Statement แล้วส่งผ่าน ODBC/OCI

แต่พอเป็น PL เหมือนต้องเรียนใหม่ (เหมือนเขียน Pascal เลยนะ) หาทาง Convert ISO8601 ที่ Generate มาจาก .net ไม่เจอ เพราะ format ที่มาเป็นแบบนี้

2013-08-30T14:26:58.1640094+07:00

ค่อยๆ ไล่ที่ละตัวจนได้ format

yyyy-mm-dd"T"hh24:mi:ss.ff7

ด้วย function TO_TIMESTAMP ของ PL

แต่ TimeZone นี่สิยังไม่ผ่าน อ่านในเอกสารพบว่า

ถ้าเป็น named timezone เช่น
CET : Central European Time
PST : Pacific Standard Time
ให้ใช้ TZR

ถ้าเป็น +/- เวลาเช่น
+07:00 ประเทศไทยเรา
ให้ใช้ TZH:TZM

แต่ลองใช้ยังไงก็เจอ ORA-01821 : date format not recognised

สุดท้าย พบว่า ต้องใช้ TO_TIMESTAMP_TZ ก็เสียเวลาปีสามชั่วโมงเต็มๆ

TO_TIMESTAMP_TZ('2013-08-30T14:26:58.1640094+07:00',  'yyyy-mm-dd"T"hh24:mi:ss.ff7TZH:TZM');


Erlang เป็นญาติกับ Prolog, ยังไง?

ก็เลยลอง Port Erlang มาเป็น Prolog สนุกๆ จะได้เห็นว่า จริงๆ แล้ว Erlang ไม่ไช่ภาษาที่คิดใหม่ทั้งหมดนะ

 Erlang
-module(mathStuff).
-export([factorial/1]).

factorial(0) -> 1;
factorial(N) -> N * factorial(N-1).


Prolog
:- module(mathStuff).
:- export  factorial/1.

factorial(0, 1).
factorial(N, R) :-
R is R * factorial(N-1).


วันจันทร์ที่ 20 มกราคม พ.ศ. 2557

กับดัก iso8601 ของ .Net

งมกับ DateTime ทั้งวัน Insert Record เข้าไปแล้ว Data ก็เดียวกัน ทำไม Query กลับมาไม่เจอ ผีหลอก!!!

ตอน Insert นี่ผมใช้ Erlang parse iso8601 มาเป็น Tuple แล้วใช้ ErlSQL จัดการ statement โดย parse DateTime format ที่ได้มาจาก XML ที่สร้างจาก .NET ตัวอย่าง

2013-08-30T14:26:58.1620093+07:00

ISO8601 ใน Erlang Parse ออกมาได้เป็น {{2013,8,30},{7,26,58}} โดยเอา +7:00 มาคิด ลดเวลาให้เป็น GMT +0:00 ซึ่งก็น่าจะถูก 

เวลาที่ได้คือ 7:26:58

แต่ Code .NET หาไม่เจอ!!!! ฉิบหายละ!!!!

.NET อ่าน XML file เดียวกัน Data เดียวกัน แต่ไม่ใช้ +7:00 มาคำนวน จาก XML ได้เป็น 14:26:58 ไม่เอา +7:00 มาคิด!!!!

ถ้า Iso8601 ของ Erlang ถูก...ซึ่งผมต้อง port .NET service มาเป็น Erlang แล้วข้อมูลเดิมล่ะ...

ถ้า .NET ถูกคงไม่มีปัญหาอะไร เดี๋ยวทำ Erlang ให้ผิดตามก็ได้

พอเข้าไปดู http://www.timestampgenerator.com/
แล้วลอง Generate ISO8601 ดู อ้าว Erlang ถูกนะ งั้น .NET framework (2.0) ก็ Bug น่ะสิ... เวรละ.... 

หรือเพราะ .NET ฉลาด!!! ดู Local time จาก Control Panel แล้วเทียบเวลา โดยไม่แปลง เวลาให้ลดลง 7 ชม. (ให้เป็น GMT) เพราะเข้าใจว่า มันคือ Local time zone

แล้วเวลาที่ได้มา 14:26:58 มันคือการบันทึกตอนไหน? ตอน 7:26:58 หรือ ตอน 14:26:58 

ต้องไปหาที่มาของเวลาแล้วค่อยกลับมาหาว่า ควรจะปรับใครยังไงอีกที

ไงละ แค่ DateTime :'(

วันอาทิตย์ที่ 19 มกราคม พ.ศ. 2557

Copy Code ข้ามเครื่อง แบบ Quick and Dirty

ช่วงนี้เป็นฤดู port code จาก Windows Service ที่เขียนด้วย .net มาเป็น Erlang แล้ว code ส่วนมากจะเป็น SQL Statement ที่เหมือนกัน ไม่ว่าจะเขียนด้วยภาษาอะไร พอโครงสร้างที่เขียนด้วย Erlang เสร็จ เช่นพวก Supervisor ไหนจะดูแล Process ไหน Process ไหนเป็น dynamic เป็น static ตรงไหนใช้ OTP บ้าง ครบหมด ถึงคิวต้อง port SQL Statement แล้ว

ซึ่งการ port (สำหรับผม) ไม่ใช่ว่า อ่าน code แล้วเขียนตามได้เลย อย่างน้อยๆ มันก็ code คนละประเภทกัน (OOP vs Functional) แต่สิ่งที่ต้อง port มาให้เหมือนๆ กันเลยก็คือ PL/SQL statement สำหรับ Oracle

ผมไม่ได้ดูแค่ตา เนื่องจากไม่ได้เขียน C# เลย ตอน Microsoft ออก C# ก็ปฏิเสธมาตลอด (อยู่แต่กับ C/C++) พอจะต้อง port C# ก็เลยต้องอาศัย Visual Studio (2005 อีกต่างหาก) debug ไป F9, F10, F11, Shift-F11 ไป เจอ code ก็ว่ากันไป

ทีนี้ถึงเวลาต้อง Copy SQL statement มาอีกเครื่อง เลยต้องหาทางที่สะดวกที่สุด เพราะ C# code ต้อง debug อยู่บน Windows7+Visual Studio 2005 ส่วน Erlang code อยู่บน Mac OSX

แต่ก่อน ส่ง message ระหว่างเครื่องผมใช้ MSN บ้าง Jabber บ้าง แต่ตอนนี้ไม่มี MSN ส่วน Jabber เสียเวลาสร้าง account อีก Google account ก็เป็น Hangouts หมด งง ใช้ไม่เป็น เสียเวลา ช้า

ค้นไปเจอ IP Messenger เข้า น่าสนใจครับ เล็ก เร็ว สะดวก ไม่ต้องมาสร้าง account วุ่นวาย Open Source ด้วย

บน Windows : http://www.ipmsg.org/index.html.en
บน OSX : http://ishwt.net/en/software/ipmsg/

ง่ายดี ไม่ต้องคิดมาก แถมมี code เผื่อเอาไปทำอะไรต่อยอดได้อีก


วันพฤหัสบดีที่ 16 มกราคม พ.ศ. 2557

ErlSQL : SQL Statement สะดวกๆ ด้วย Erlang

ใครว่า ลอก Project ชาวบ้านมาเป็นของตัวเอง ง่าย!!!?
ไม่จริงเลย วันนี้พบปัญหาว่า ต้อง Port Project ที่มีคนเขียนไว้ด้วย .net (C#) มาเป็น Erlang จริงๆ มันก็ไม่ยากหรอก แต่ปัญหาใหญ่ที่สุดตอนนี้คือการ Port ส่วนฐานข้อมูล Oracle กว่า 30 Tables ที่สำคัญบาง Table มีขนาด 300 fields (โหดโพด...)

 จะให้เขียน Statement ตรงๆ คงมึนกันไปข้าง เลยลองค้นดูพบ ErlSQL โดย Yariv (เพื่อนผมเรียก Yariv ว่า โต ซิลลี่ฟูล เขาบอกว่า หน้าคล้ายๆ โต)
http://yarivsblog.blogspot.com/2006/09/introducing-erlsql-easy-expression-and.html

Yariv เขียน Module อำนวยความสะดวกในการ Generate SQL statement ชื่อ ErlSQL ไว้เมื่อปี 2008 ซึ่งปัจจุบันเป็นส่วนหนึ่งของ ErlyWeb 0.7.2
https://github.com/yariv/erlyweb

ผมเอามาเฉพาะ ErlSQL.erl แล้วให้ Rebar จัดการเข้ากับ Project ปัจจุบัน (ก็แค่ copy ไปไว้ใน src folder นั่นแหละ)

เวลาใช้ก็แค่


1> erlsql:sql({insert,project,[{foo,5},{baz,"bob"}]}).
[<<"INSERT INTO ">>,<<"project">>,40,
 [<<"foo">>,44,<<"baz">>],
 <<") VALUES ">>,
 [40,[<<"5">>,44,<<"'bob'">>],41]]
2>

แหม่...สะดวกจริงๆ...