ท่าใช้ MSSQL บน Docker

ผมพยายามลง MSSQL Server บน Windows หลายรอบแต่ไม่รอด แต่ลงบน GNU/Linux ดันใช้ได้ซะงั้น แต่วงลงบน notebook รู้สึก package จะตีกันสิ่งที่เคยลงไว้หน่อย กอปรเครื่องผมมันเต็ม ๆ ก็เลยไปทำบน server ครับ และเพื่อให้ไม่ตีกันก็เลยเอา tool ไว้ใน container หนึ่ง เอา server ไว้อีก container หนึ่ง

ทีเคยพลาดคือใช้เครื่อง RAM น้อยไปหน่อยอย่างน้อย ๆ ควรจะมีสัก 4GB

ผมจะข้ามขั้นตอนลง docker ไปเลย เพราะว่าตอนผมใช้ ผมก็เลือก image ที่มี docker อยู่แล้ว

ท่าลง MSSQL-Server

  1. docker pull microsoft/mssql-server-linux
  2. docker run -e ‘ACCEPT_EULA=Y’ -e ‘SA_PASSWORD=รหัสผ่าน’ -p 1433:1433 microsoft/mssql-server-linux

ผมไม่ใส่ -d เพราะว่าไม่เห็น error message ผมเปิดคาไว้ใน tmux เอา

ท่าลง tool (sqlcmd) อันนี้มันลำบากหน่อยผมหา docker image ไม่เจอ ก็เลยลงธรรมดา  ไม่ได้สร้าง dockerfile เพราะมันตกกด accept ด้วย

  1. ทีแรกก็สร้าง docker image ใหม่เลย docker run -ti ubuntu:xenial
  2. apt-get update && apt-get install -y curl apt-transport-https nano
  3. อันนี้แก้ปัญหา locale ใช้ nano /etc/locale.gen  ไป uncomment en_US.UTF-8 แล้วสั่ง locale-gen
  4. curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add –
  5. curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > /etc/apt/sources.list.d/msprod.list
  6. apt-get update
  7. apt-get install -y mssql-tools

ตอนใช้งานก็สั่งแบบนี้ครับ

sqlcmd -S 172.17.0.1 -U SA -P รหัสผ่าน

ผมเอาไว้ลองใช้เองนะครับ ไม่ได้ใช้ใน production ผมความรู้น้อย ท่าเปิดนี้อาจจะเปิดช่องโหว่อะไรไว้ก็ได้

อ้างอิง

 

เกี่ยวกับ web scraping

อ่านเรื่อง web scraping ที่ท่าน Arm Adisorn กรุณาแบ่งปันมา แล้วพิจารณาอยู่สักพัก

ผมคิดว่าเครื่องมือแกะ HTML แบบไม่ต้องรัน JS ที่ง่ายที่สุดเท่าที่ผมเคยใช้มาคือ Nokogiri กับ Ruby

โดยใน Nokogiri .css ทำให้ดึง node ได้ท่าเดียวกับ $(‘…’) ของ jQuery และ .text ก็ดึงเนื้อหาออกมาได้ดื้อ ๆ เลย เอามาใช้ร่วมกับ .map  ของ Ruby นี่สะดวกมาก ๆ

ดูเพิ่ม
http://ruby.bastardsbook.com/chapters/html-parsing/

คำสั่ง LEAQ ของ AMD64 เอามาบวกเลขได้ด้วย

ผมลองดู assembly ของคำสั่ง foo(x) = x + 3 ที่ generate ออกมาจาก Julia ที่ generate ผ่าน LLVM อีกที มันไม่ใช้ ADDQ นะครับ ถ้าเป็นเลขน้อย ๆ ใช้ LEAQ ซึ่ง LEA นี่ย่อมาจาก Load Effective Address

ใช้ X86 มาหลายปีมากแล้ว แต่ก็ยังงง ๆ ชุดคำสั่งของมันอยู่ T_T

ลอง Julia lang อีกแล้ว

จริง ๆ ลองเขียน Julia มาหลายรอบแล้วแต่ว่าไม่เกิน 5 บรรทัด วันนี้ลองอีกแล้วเขียน function แบบ

bar(x) = x + 30

บรรทัดเดียว 😛

แต่ว่าเพิ่งดู video มาพบว่ามันทำแบบนี้ได้ด้วย

code_native(bar,(Int64,)) หรือ code_native(bar,(Float64,)) แล้วมันแสดง assembly ให้ดูแบบด้านล่าง

julia_native

ผมยังไม่ได้ตังใจอ่าน/ฟังมาก แต่ก็สงสัยว่า Julia  มันเร็วเพราะแบบนี้หรือเปล่า ดูจะเป็นภาษาแบบ dynamic type ก็จริง แต่ว่าเล่นสร้าง native code สำหรับทุก (?) type เลย 😛

หวังว่า node.js จะมาแทน JVM ได้บางเรื่อง

เอาผมฝัน ๆ เพ้อ ๆ นะครับไม่ได้มีสาระ ผมใช้ node.js และประทับใจแต่ว่าเวลาเอาไปติดตั้งบน Windows นี้กลายเป็นเรื่องยากเลย เพราะว่า extension บางอย่างเขียนด้วย C บ้างและหรือ C++ บ้าง แล้วบางทีหา binary package บน Windows ยาก บางทีก็ไม่มีต้องมา build เอง สรุปสั้น ๆ เลยก็คือ node.js บางครั้งใช้บน Windows ลำบาก

ผิดกับ JVM ที่ว่า package ส่วนใหญ่เป็น byte code ของ JVM และอัดอยู่ใน jar อยู่แล้ว ไม่ค่อยมี package ที่เขียนด้วย C++ แล้วต้องมา build เป็น machine code อีก  เวลาติดตั้งบน Windows ก็เลยไม่มีอะไรลำบาก ใช้ lein หรือ maven ช่วยก็ติดตั้งได้สบาย ๆ

แต่ว่าเร็ว ๆ นี้มีของใหม่มาคือ  Web Assembly (wasm) คล้าย ๆ จะเป็น byte code ของ JavaScript ไม่ว่า node.js จะอยาก support หรือเปล่า แต่ v8 support ก็เป็นอันว่า node.js ก็ใช้ได้ไปด้วย เริ่มมีคนเอา musl ที่เป็น libc ตัวเล็กกว่า GNU libc มา compile เป็น wasm แล้ว นี่ก็อาจจะเป็นไปได้ว่าโปรแกรมที่เขียนด้วย C ก็อาจจะเป็นไปได้ว่า npm ในอนาคตอาจจะเอา package ที่ compile มาเป็น wasm แล้วมาใช้เลยก็ได้ ทำให้ตัดปัญญาในย่อหน้าแรกไปได้

สรุปว่าก็เป็นแค่ความฝันนะครับว่า node.js มันจะติดตั้ง extension ง่าย ๆ แบบสูสี JVM ได้

ข้อจำกัดของ Functional Programming แบบเพียว

ผมอ่านจากโพสนี้มา http://flyingfrogblog.blogspot.com/2016/05/disadvantages-of-purely-functional.html เกี่ยวกับข้อจำกัดของ Functional programming แบบเพียว หรือพูดอีกอย่างคือภาษาแบบ Haskell ทั้งหลาย รวมทั้ง Elm และอื่น ๆ

  • ผมเคยคิดว่าใช้ mutable hash table กับ monad แล้วจะเร็ว แต่ผมคิดผิด มีโพสที่ link ไปจากโพสนี้บอกว่ามีกรณีที่ช้ากว่า IntMap อีก
  • บางประเด็นก็เป็นปัญหาตั้งแต่ Lisp เลย เช่น allocate memory เยอะแยะเกิน ประเด็นนี้แม้แต่ภาษาที่ไม่ใช่ FP ก็อาจจะมีปัญหานี้เหมือน ไปคาบเกี่ยวกับเรื่อง Boxing and Unboxing
  • ยังมีประเด็นอื่น ๆ อีกมากมาย

 

ความสวยงามของภาษา Smalltalk

วันนี้อภิปรายกับอจพ.ว่าผมเขียนโปรแกรมด้วย Python ก็ได้แต่รู้สึกว่ามันไม่ค่อยสนุกเท่าไหร่ เพราะว่าบางทีมันเรียกแบบ function บ้าง บางทีก็เรียกแบบ method บ้าง อย่างเช่นจาก Learn Python3 in Y Minutes นี้ ก็จะมีกรณีว่า len นี่เป็น function เรียกแบบ len(“ABCD”) แต่พอเป็น format กลับใช้แบบ method เช่น “X={}”.format(10) พอมาเจอ print ก็เป็น function อีก ถ้าเขียนแบบ “ABCD”.len() เลยมันก็จะเป็นแบบเดียวกันกว่าไหม

ส่วนของ Smalltalk เท่าที่ดูจาก Learn X in Y Minutes นี่เป็นแบบเดียวกันหมด ทุกอย่างอยู่ในรูปแบบ message หมดเลย กระทั่ง log แทนที่จะเขียนแบบ log(100,10) ก็จะเขียนเป็น 100 log: 10. แบบนี้ ส่วน len ผมดูมาจาก Rosetta code อีกที ก็จะเป็นประมาณ ‘ABCD’ size. หรือ print ก็จะเป็น ‘ABCD’ printString.

โดยสรุปคือ  Smalltalk จะเรียงทุกอย่าง แบบ Subject Verb (และอาจจะมี Object ด้วย) แบบภาษาอังกฤษทั้งหมดเลย ไม่มีแบบ verb อยู่หน้าบ้างหลังบ้าง กลางบ้าง ซึ่งผมมองว่ามันเป็นความมีระเบียบไพเพราะ

return

function ใน Lisp Ruby Rust หรือแม้แต่ JavaScript ใหม่ ๆ เวลาใช้ลูกศร มันไม่ต้องใส่ return
 
ผมคิดมันก็น่าจะเป็นแบบนั้นอยู่แล้ว สมัยเด็ก ๆ คิดถึง function ก็จะถึงประมาณ f(x) = 2*x + 5 ทำนองนี้ ไม่เคยเห็นว่ามันจะมี return
 
ครั้งแรกที่ผมรู้จัก return คือเห็นมันใช้คู่กับ gosub ใน MBasic ซึ่ง sub ย่อมาจาก subroutine ในภาษา Basic เวลานั้นมันก็เป็นเลขบรรทัดต่อไปเรื่อย ๆ ไม่ได้มี block อะไร พอสั่ง return ตอน subroutine จบโปรแกรมก็กระโดดมาทำงานคำสั่งต่อจาก gosub ไม่ได้ส่งค่าอะไรออกมาแบบ function ตอนนั้นผมก็คิดว่าดูตรงไปตรงมาดี
อาจจะทำให้เวลาเขียนโปรแกรมในภาษาที่มันไม่ต้องใส่ return ก็เลยไม่ได้รู้สึกว่าขัดใจอะไร

Lumo: REPL ของ ClojureScript ที่เร็วมาก

สัปดาห์ที่ผ่านมาเห็น Lumo ใน Twitter เต็มไปหมดแล้วมันน่าเล่นก็เลยลองดู พบว่ามี start ไวกว่า sbcl อีกประทับใจมาก ๆ

lumo_fast

อยากเอาไปใช้กับ Emacs และ Cider แต่ว่าทำไม่เป็น 😛