Node.js ด้วยขุมพลัง Chakra ของ Microsoft

ตามคาดครับเจ้าใหญ่อย่าง Microsoft ก็เข้ามามีบทบาทในโลก Node.js หลังจากประกาศเป็นมิตรกับ Open Source วันนี้เรามาลองเล่น Node.js โดยที่รันด้วย ChakraCore ซึ่งเป็น Engine ที่รัน JavaScript ที่อยู่เบื้องหลัง Microsoft Edge (ผมชอบนะเปิด app เร็วดี :p ) แทนที่จะเป็น V8 ตาม version ปกติ

เริ่มจากไปดูใน node-chakracore เราก็พอจะได้ความว่า โปรเจคนี้เปิดตัวมา 6 เดือนแล้ว และมาถึงวันนี้ก็ยังอยู่ใน version ทดสอบอยู่นะครับ ซึ่ง Features หลักๆก็น่าจะพร้อมใช้งานระดับหนึ่ง

เนื่องจากผมขี้เกียจจะมา Build เองก็ไปโหลดตัว Prebuilt มาได้เลยจาก node-chakracore/releases เท่าๆที่ดูก็สามารถใช้งานได้บน Windows, ARM และ Linux (Mac หายไปไหน???)

ผมขอลอง Windows x64 ละกันครับ

หลังจาก Install แล้วตัว Node.js ก็น่าอยู่ที่ “C:\Program Files\nodejs (chakracore)” ซึ่งเป็น Path ปกติก็จะเห็นว่ามีไฟล์ ‘chakracore.dll’ เพิ่มเข้ามา

node_e_files.png
nodejs (chakracore) folder

ซึ่งถ้าเทียบกับ Node.js ปกติ จะเห็นว่า node.exe นั้นไฟล์ขนาด 16MB เพราะรวม V8 engine ไปด้วยในไฟล์เดียวกัน

node_v8_files.png
nodejs ปกติ

ลองเทส http server ง่ายๆก่อน

Code ข้างล่างเป็นการสร้าง Web Sever แบบพื้นฐานที่สามารถส่ง Hello.. กลับไปหน้าเวปได้

// app.js
let http = require(‘http’);

let server = http.createServer( (request, response)=> {
response.write(‘Hello…!’);
response.end();
});

server.listen(80);
console.log(“Server is listening”);

ก็รันได้ดีปกติครับ

node_e_run

 

Performance

ไหนๆก็ไหนๆมาลองดู Performance ดีกว่า เรามาวนลูปเล่นๆกัน “ล้าน” รอบ

console.time(‘test:’);
for(let i = 0; i < 1000000 ; ++i){
let x = Math.random();
}
console.timeEnd(‘test:’);

ลองรันไป 3 รอบ ก็ได้ค่าเฉลี่ยประมาณ 5ms!!

node_e_loop.pngลองรันกับ Node.js (V8) ปกติก็พบว่า…. 15ms ช้ากว่า Chakra เกือบ 3 เท่า…

node_v8_loop.png

ที่นี้เราลองเรียก fucntion หลายๆชั้นดีกว่า เพื่อดูว่าถ้ามี Function ใน Call Stack สัก 3 ชั้นผลจะเป็นยังไง

console.time(‘test:’);
for(let i = 0; i < 1000000 ; ++i){
let x = Math.random();
do1();
}
console.timeEnd(‘test:’);

function do1(){
do2();
}

function do2(){
do3();
}

function do3(){

}

Chakra จัดไป ~9.5ms

node_e_fn_loop.png

ส่วน V8 ก็ยังแถวๆ ~15.7ms

node_v8_fn.png

สรุปสำหรับ Performance ส่วนของ Chakra ก็ยังทำได้ดีกว่าระดับหนึ่ง ซึ่งก็สอดคล้องกับ Official Blog ใน https://blogs.windows.com/msedgedev/2016/06/22/javascript-performance-updates-anniversary-update/

 

Advertisements

สร้าง Node.js module แบบ Native ด้วย C++

node_cpp

เป็นที่รู้กันว่าสำหรับทุกคนว่า Node.js นั้น Powerful ก็เพราะว่ามี Modules ให้เราใช้ไปแทบทุกอย่าง รวมถึงหลายๆคนอาจจะเคยเขียน Module ด้วย JavaScript ทั้งใช้เองและให้คนอื่นใช้

แต่วันนี้ผมจะมาแนะนำวิธีการเขียน Node.js module ด้วย C++ กัน

ก่อนอื่นในเมื่อเราเขียน Module ด้วย JavaScript ได้ทำไมต้องใช้ C++ มาดูข้อดีกันก่อนเลย

  1. System Access – ด้วย Native enviroment ทำให้ Module ที่เขียนด้วย C++ สามารถเข้าถึง API ของ System/OS ได้
  2. Performance – JavaScript นั้นทำงานด้วย Single Thread แต่ว่า Native นั้นสามารทำงานแบบ Multi Thread ได้
  3. Compiled Binary – JavaSciprt ถึงแม้จะมี Minify/Uglify แต่ก็พอจะ reverse engineer ได้แต่สำหรับ Native นั้นถึงแม้จะทำได้เหมือนกันแต่ก็ต้องมานั่ง Deassembly

เริ่มกันเลยครับ จริงๆแล้วผมก็ทำตาม https://nodejs.org/api/addons.html  แต่!…ผมทำตามแล้วมันมีขั้นตอนเยอะและต้องใช้ Python ในการ Build อีก ผมเลยขอสรุปเองจากการลองแงะ Python scipt เพื่อลดความงงลง(หรือว่ายากขึ้น?)

  1. สร้าง Project C++ ใหม่จาก Visual Studio 2015
    newproj
  2. เป็น DLL นะ
    dllproj
  3. ไปโหลด Node.js ไฟล์ headers และ node.lib มาครับที่
    https://nodejs.org/download/release เลือกตาม version ของ Node ที่เราจะใช้ได้เลย เช่น v6.3.0
    download
  4. Extract .gz แล้วก้ copy ไฟล์มาที่ Folder C++ Project ของเรา
    ผมตั้งชื่อ folder เป็น
    – include สำหรับ headers ไฟล์ที่เรา Extracted มา
    – lib สำหรับเก็บ node.lib
    copy_dep
  5. ที่นี้ก็ copy Source code นี้ไปที่ .cpp หลักครับ
    // anurocha_node.cpp : Defines the exported functions for the DLL application.
    //
    
    #include "stdafx.h"
    #include "include/node/node.h"
    
    namespace demo {
    
     using v8::FunctionCallbackInfo;
     using v8::Isolate;
     using v8::Local;
     using v8::Object;
     using v8::String;
     using v8::Value;
    
     void SayHi(const FunctionCallbackInfo<Value>& args) {
     Isolate* isolate = args.GetIsolate();
     args.GetReturnValue().Set(String::NewFromUtf8(isolate, "Hi - How are you doing?"));
     }
    
     void init(Local<Object> exports) {
     NODE_SET_METHOD(exports, "hello", SayHi);
     }
    
     NODE_MODULE(addon, init)
    
    } // namespace demo
  6. ลอง Build Project ดูครับ…เจ๊ง!
    link_err
    อ๊ะ!.. เราลืม Link ครับ
  7. ไปเพิ่ม lib/node.lib ใน Linker ซะ
    linker
  8.  Build อีกรอบ….เจ๊งเหมือนเดิม!!@#ไม่ต้องตกใจครับ….เป็นมุข..เรามี Lib ของ node.dll เป็น x64 ตามที่โหลดมา แต่เรากำลัง Compile แบบ x86 อยู่(ซึ่งเป็น Default Configuration ตอนสร้าง Project) ดังนั้นไปแก้ Project – Linker อีกรอบนึงครับ มั่นใจว่าแก้สำหรับ Platform x64 ด้วยนะครับ
    linker64
  9.  Build อีกทีจริงๆ ด้วย Target x64 นะครับbuildx64
  10. ถ้า Build ผ่านจะได้ไฟล์ .dll มาครับ
    out
    ให้เปลี่ยนชื่อเป็น anurocha.node แทน
  11. สร้างไฟล์ app.js ง่ายๆมา มี Code แค่ 2 บรรทัด ที่ Folder เดียวกับ anurocha.node
    const addon = require('./anurocha');
    console.log(addon.hello());
  12. รัน “node app.js” ดูครับ…..แล้วความตื่นเต้นก็เกิดขึ้น!!!
    node_out

สำเร็จแล้วกับ 12 ขั้นตอนที่ยาวนาน !!!!!

ลองมาดูรายละเอียดกันครับเกี่ยวกับขั้นตอนการทำงานของ JavsScript <–> C++
ซึ่งหัวใจสำคัญที่ทำให้ทั้ง 2 ภาษาคุยกันได้คือ V8 ที่เป็น JavaScript Engine เขียนด้วย C++ จาก Google นั่นเอง

  1. เวลาที่ dll ถูกโหลดด้วย JavaScript จาก require(); ตัว dll จะถูกเรียกครั้งแรกเพื่อทำการ Init ค่าต่างๆ
    ในที่นี้เราทำการ export Fuction ที่ชื่อว่า hello ออกไป ซึ่ง function hello นั้นทำการ Map กับ Method ที่ชื่อว่า SayHi

    void init(Local<Object> exports) {
     NODE_SET_METHOD(exports, "hello", SayHi);
     }
    
     NODE_MODULE(addon, init)
  2. เวลาที่ JavaScript เรียก addon.hello();
    Code ฝั่ง C++ จะถูกเรียก Method ที่ชื่อว่า SayHi(); ทำให้มีการ return String object ที่มีค่า “Hi – How are you doing?” ออกมาให้ฝั่ง JavaScript

    void SayHi(const FunctionCallbackInfo<Value>& args) {
     Isolate* isolate = args.GetIsolate();
     args.GetReturnValue().Set(String::NewFromUtf8(isolate, "Hi - How are you doing?"));
     }

จากตัวอย่างนี้จะเห็นได้ว่าการเขียน Node.js Module ด้วย C++ นั้นอาจจะดูยุ่งยากซักนิดนึง แต่มันทำให้เราเขียน Logic ต่างๆด้วย C++ ได้ นั่นหมายความว่าถ้าเรารัน Node บน Windows เราก็สามารถเรียกใช้งาน Win32 API ต่างๆได้เช่น การเรียก Registry Key, ต่อ Socket, อ่านไฟล์บน HDD รวมถึงการทำงานร่วมกับสารพัด Library ของ C++ อย่างที่ทำได้เหมือนการเขียนโปรแกรมบน OS นั้นๆ….

LONG LIVE C++

ปล. Code ทั้ง Solution ดูได้จาก https://github.com/anurocha/node_cpp_addon ครับ

IDE หนึ่งในสิ่งพื้นฐานควรรู้ของ Developer

Developer คนไหนไม่รู้จัก IDE บ้าง? ถ้าคนๆนั้นเป็นคุณก็…..อ่านต่อเถอะครับ 🙂
ส่วนถ้ารู้แล้วก็ลองอ่านเล่นๆดูได้ครับ

IDE ย่อมากจาก Integrated Development Enviroment ซึ่งก็คือเครื่องมือที่ Developer ใช้ในการพัฒนา Software แบบครบวงจร เช่น Visual Studio, XCode, Netbean, Eclips, Xamarin และอื่นๆ

โดยความสามารถหลักๆ ของ IDE ผมขอแบ่งเป็น 4 อย่างใหญ่ๆละกัน

  1. Editor – เอาไว้เขียน Source Code รวมถึงพวก Syntax Hilight, Auto-Complete
  2. Compiler – เอาไว้ Build โปรแกรมจาก Code ไปเป็น Binary
  3. Debugger – เอาไว้ใช้ในการแก้หาวิธีในการแก้ Bug
  4. Tools – เครื่องมือช่วยต่างๆ เช่น Refactoring, จัดหน้าจอหรือ Visual Design, การทำ UML, ดู Database รวมถึงพวกทำ Static Code Analysis และการสร้าง Document จาก Code

มาถึงตรงนี้แล้วมีใครใช้ IDE ครบ 4 อย่างมั้ยครับ….จากประสบการณ์ของผมแล้วน้องๆ Developer  ส่วนใหญ่จะรู้จักมันในฐานะข้อ 1 และ 2 เท่านั้น

ซึ่งผมอยากแนะนำสำหรับคนที่ยังไม่ได้ลองใช้ความสามารถของ IDE ในการเป็น Debugger ควรจะหาเวลาไปเรียนรู้ไว้ครับ เพราะมันจะช่วยทำให้คุณแก้ Bug รวมถึงพัฒนา Feature ที่ซับซ้อนได้เร็วขึ้นจริงๆ

แต่ช้าก่อน…..ถ้าท่านที่สามารถทำงานกับโปรเจคขนาดใหญ่โดยไม่ต้องใช้ Debugger ได้ผมนับถือมากครับ แสดงว่า  Source Code น่าจะมี Unit Test ครบ 100% ซึ่งทำให้เจอBug ได้จาก Unit Test และไม่ต้องพึ่งการ Debug

นี่คือ Utopia of Software – Software ในอุดมคติเลย!

Final Fantasy X/X-2 HD Remaster กับ Windows architecture

พอดีได้ข่าวว่า Final Fantasy X ได้ทำการ Port มาลง PC ก็เลยลองเล่นดูครับ เพราะภาคนี้ผมเล่นตอน PS2 ได้ประมาณ 30-40% แล้วก็ไม่ได้เล่นต่อเนื่องจากติดทำ Project จบสมัยเรียน เลยขายเครื่องทิ้งไปเพราะกลัวเรียนไม่จบ 🙂

แต่ที่เขียนถึงวันนี้คงพูดถึงเรื่อง Windows architecture กันนิดหน่อย

สืบเนื่องมาจากว่า ผมเล่นเกมนี้ไปได้ประมาณไม่นานเช่น 10-20นาที โปรแกรมก็ Crash ซึ่งมาจากขั้นตอนที่ไม่แน่นอน หรือเรียกว่า Random Crash นั่นเอง

ซึ่งการ Crash ของ Application นั้นก็หมายถึงการที่โปรแกรมหยุดทำงานด้วยสาเหตุใดสาเหตุหนึ่งแล้วโปรแกรมก็เด้งออกอัตโนมัติทิ้งให้เราอึ้งไปหลายวิ..

As User

จากการที่เราเป็น End User ของเกมนี้ก็ แน่นอนครับ ติดปัญหาเราก็ต้องลองหาใน Google ดูก็ก่อนเลย ซึ่งก็พบว่ามีหลายๆคนเจอปัญหาเดียวกัน

http://steamcommunity.com/app/359870/discussions/0/364042063114641626/
http://steamcommunity.com/app/359870/discussions/0/364042262885080038/
http://steamcommunity.com/app/359870/discussions/0/364042262879682906/

ซึ่งผมลองทำตาม workaround ต่างๆแต่ก็ยังไม่สำเร็จ เล่นไปสักแป๊บนึงเกมก็เด้งออกมาอีกเช่นเคย

As Developer

แต่ด้วยความที่เราก็ Developer ผมก็ตัดสินใจลอง Investigate ปัญหานี้ดูด้วยตัวเอง

สิ่งแรกที่ผมเห็นคือเวลามัน Crash ตัวไฟล์ CoreDump.dmp จะถูกสร้างขึ้นมา

coredump.png

ลองเปิดด้วย Visual Studio เพื่อทำการ Analyze Dump ไฟล์ได้ข้อมูลน่าสนใจตามนี้

dumpinfo

  1. Process นี้เป็น x86 ก็คือ 32 Bits
  2. Crash ที่เกิดขึ้นมี Exception เกี่ยวกับ Virtual Address หรือ Virtual Memory นั่นเอง

พอรู้แบบนี้ผมก็ลองเปิด Process Explorer ดูเลยครับว่าเวลาเล่นเกมนี้ มันใช้ Memory ขนาดไหน ปรากฎว่า…

ชัดเจนครับแค่เปิดเกมมา Virtual Memory ก็1.9GB แล้ว

screen

memreach

นี่คือสาเหตุของปัญหานี้ครับ..เนื่องจากว่า เกม(Process) นี้ถูก Compile ด้วย 32 Bits ทำให้สามารถใช้งาน Memory Space ได้ 2^32 bytes หรือประมาณคร่าวๆได้ 4GB (4,000,000KB โดยประมาณ)

แต่เนื่องจาก Windows Architect นั้นได้ทำการแบ่ง Memory ไว้เป็น 2 ส่วนคือ Kernel space กับ Application space (User space) อย่างละ 2GB

ซึ่งง่ายๆก็คือ Applicatoin จะใช้ได้ 2GB เท่านั้น ทำให้ถ้าใช้เกินโปรแกรมก็จะ Crash (ถ้าจัดการไม่ดี)

วิธีแก้ปัญหา

Windows นั้นได้มี Feature ที่เรียกว่า Large Address Aware ซึ่งทำให้ Application สามารถใช้งาน Memory ได้มากกว่า 2GB นั่นเอง

Tool ตัวนี้คือ Editbin.exe ซึ่งติดตั้งมากับ Microsoft Visual Studio อยู่แล้วครับ

พิมพ์ไปเลยครับตามนนี้

editbin /largeaddressaware “D:\Games\Final Fantasy X\FFX.exe”

editbin.png

เราก็จะได้ FFX.exe ตัวใหม่ที่ทำการเปิด Feature Large Address Aware แล้ว และเมื่อลองทดสอบดู Process ของเกมนี้ก็สามารถใช้ Memory ได้เกิน 2GB แล้ว

final_mem

และสุดท้ายตั้งแต่ผมแก้มาก็เล่นได้ 4-5 ชั่วโมงได้ไม่เจออาการ Crash/Freeze อีกเลยครับ 🙂

 

English:

For english guys (if any), I found one potential workaround to solve the random crash/freeze issues on FFX HD Remaster on PC. I think the issue is around memory reach limit of 32 Bits process which is 2GB for application space(from totally 4GB  – kernel and app/user space) which FFX has been built as 32 Bits app.

so once you configured the game with high graphic settings. it uses higher memory and might be able to trigger the issue more eaiser.

we can use the tool called “editbin.exe” which is the small utility to allow us to change the flag of the process which is “/largeaddressaware” that can help to incrase the app/user space of memory up to 3/4GB based on OS. but at least it will be higer than 2GB as system default.

you can find “editbin” from Visual Studio.

and after I applied this flag. I can play the game for 4-5 hours for 2 days without any crash. hope this can help for some.

 

HAPPY GAMING…

Windows 10 – Universal Windows Platform ขอลองซักนิด

เนื่องจากว่า Microsoft โปรโมทนักหนากับ Universal Windows Platform (UWP) ที่เมื่อเขียนแล้วสามารถนำไปรันบน Windows 10, Windows Phone, Xbox, etc.. ซึ่งน่าจะเป็นการพลักดันครั้งสำคัญของ Microsoft ในการสร้าง Eco System ให้กลับมาแย่ง Market Share อีกครั้ง

โดยส่วนตัวแล้วผมก็มีประสบการณ์กับ C# + WPF มาพอสมควรทำให้ปรับตัวได้ไม่ยาก และ  UWP น้ันมี Architect เดียวกับ WPF ในการทำ User Interface.

เริ่มจาก

  1. Install Visual Studio 2015 Community Editoin ซึ่งใช้งานได้ Free 🙂
  2. สร้าง Project ใหม่เป็นแบบ UWP

newproj

3. ไฟล์ที่ถูกสร้างมาจาก UWP project ก็คุ้นหน้าคุ้นตา MainPage.xaml อีกแล้ว..

default_files

4. ลองมาดู Project Properties..ก็พบว่าเราสามารถ target App ของเราได้ตาม Windows 10 Build version

project_prop

5. มาดูฝั่ง XAML กันบ้าง ซึ่งตัว code ที่ Visual Studio สร้างมาให้ก็เป็นแค่หน้าจอขาวๆ

xaml_code.png

6. พวก Default Controls ของโลก WPF ก็ยังมาอย่างครบครัน

system_controls

7. ลองใส่ Button ดูก็ลอง ลาก แล้วก็วางได้เลย

xaml_code2

8. ลอง Double Click ที่ Button Object เพื่อเขียน Code Behide กัน
ลอง โชว์ Message Box

private async void button_Click(object sender, RoutedEventArgs e)
{
var dialog = new MessageDialog(“Hey Windows Universal Platform app!”);
await dialog.ShowAsync();
}

9. Compile App ได้เลยแล้วลอง Click ที่ปุ่ม Button

App เราก็จะถูก Style ด้วย Windows 10 – WUP UI เป็นค่าเริ่มต้น

msgbox_run

10. ถ้าอยากลองเทสกับหน้าจอหลายๆแบบ ใน Visual Studio ก็มีให้ปรับตามนี้

screen_res.png

11. ลองมาดู output files ของการ compile กันครับ ผลออกมาคือ .exe และ พวก dependencies assemblies ทั้งหลาย

app_output

12. ลอง double click เพื่อรัน App2.exe ตรงๆกันดูครับ

อ้าว error! แล้วเราจะรัน app ของเรายังไงล่ะครับ….

runtime_err.png

13. ลองไป เมนู Deploy App ดู

deploy.png

14. หลังจาก Deploy เสร็จ App ของเราก็มาโผล่ที่ Start Menu นั่นเอง

startmenu

และเนื่องจากผมลองเขียน app ที่มี scope ชัดเจนนิดนึง เลยลองเขียน App อ่านเวปสุดฮิต
แน่นอน Pantip นั่นเอง 🙂

ซึ่งตอนนี้ทาง app ก็ยังไม่มีอะไรมาก แค่ ListView ที่ทำ Data Binding กับ List Object เอามา render บนหน้าจอได้รวมถึงได้ลองใช้ HTTP req ในการดึง Data จาก Pantip.

pnatipw

ท้ายที่สุดจากการทดลองของผม UWP app นั้นเริ่มต้นได้ไม่ยากสำหรับคนที่มีความคุ้นเคยกับ C# และ WPF ซึ่งผมคิดว่าคนที่เคยเขียน Windows Form ก็น่าจะปรับตัวได้ไม่ยาก รวมถึง Visual Studio ที่เป็น IDE ที่ค่อนข้าง Powerful จึงทำให้การเขียนโปรแกรมทำได้เร็วขึ้น

 

ทดสอบ C# ด้วย .NET Core บน OSX

สำหรับคนที่เขียน C# บน Windows ก็คงต้องอยากที่จะให้มันเขียนได้บน Mac หรือ Linux ใช่มั้ยครับ จริงๆแล้วก็มี Mono Framework ที่ตอบโจทย์อยู่แล้ว แต่ถ้าเราต้องการ Native Experience ล่ะ?

.NET Core อาจจะเป็นคำตอบ (มั้ง)

เนื่องจากผมอยากลองดูว่า .NET Core ที่เป็น Open Source ของ .NET Framework ที่ทาง Microsoft ประกาศไว้ช่วงต้นๆปีที่แล้วจะเป็นยังไง ผมก็เลยลอง Setup ดูบน Mac เพื่อทดสอบ

เริ่มต้นจากทำตาม link นี้ http://dotnet.github.io/getting-started/ ซึ่งทางเวปจะ detect ให้ว่าตอนนี้เรากำลังใช้ OS อะไรอยู่

สำหรับ Mac – OSX จะต้องโหลดไฟล์ .pkg เพื่อทำการลง dotnet compiler ลงบนเครื่อง

หลังจากลงเสร็จก็มาเริ่มต้นจากใช้ Termial

Screen Shot 2559-01-10 at 11.48.19 PM

ลองสร้าง new default project ผ่าน commandline “dotnet new”

Screen Shot 2559-01-10 at 11.49.50 PM

ลอง “ls” ดูไฟล์ที่สร้างขึ้นมาจะได้แบบนี้ ซึ่งประกอบด้วย

  1. NuGet.Config
  2. Program.cs
  3. project.json

Screen Shot 2559-01-10 at 11.51.06 PM.png

ลองรัน command ตามที่ Getting Started บอกถัดไป “dotnet restore” เพื่อทำการ restore หรือ download พวก assemblies/dlls/modules ที่ได้กำหนดใน project.json มาเพื่อใช้ในการ Compile ตัวโปรเจคของเรา

Screen Shot 2559-01-10 at 11.54.08 PM

หลังจาก restore พวก dependencies ของโปรเจคเราแล้วลองสั่ง  compile และ run กันด้วย “dotnet run”

!!!! Error…

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly ‘System.Console, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a’ or one of its dependencies. The system cannot find the file specified.

Screen Shot 2559-01-10 at 11.56.20 PM

ปัญหานี้ก็คือมาดูที่ไฟล์ Program.cs

Code โปรแกรมเรามีการเรียกใช้ Console.WritLine หมายความว่ามันมี Dependency กับ System.Console ทำให้ Compile ไม่ผ่าน

using System;

namespace ConsoleApplication
{
 public class Program
 {
 public static void Main(string[] args)
 {
 Console.WriteLine("Hello World!");
 }
 }
}

ทีนี้มาดูไฟล์ project.json

{
 "version": "1.0.0-*",
 "compilationOptions": {
 "emitEntryPoint": true
 },
"dependencies": {
 "NETStandard.Library": "1.0.0-rc2-23616"
 },
"frameworks": {
 "dnxcore50": { }
 }
}

เราต้องทำการเพิ่ม dependencies เพื่อให้โปรเจคนี้รู้จัก dlls อื่นมากขึ้นเช่น System.Console ดังนั้นแก้ไฟล์ประมาณนี้

{
 "version": "1.0.0-*",
 "compilationOptions": {
 "emitEntryPoint": true
 },
"frameworks": {
 "dnxcore50": { 
"dependencies": { 
 "System.Console": "4.0.0-beta-*", 
 "System.IO": "4.0.11-beta-*", 
 "System.Runtime": "4.0.21-beta-*" 
 }
 }
 }
}

ลองรัน “dotnet restore” อีกรอบเพื่อโหลด dlls มาใหม่ก็จะยัง Error!!! ถ้าใช้ OSX 10.11.2+

ที่นี้ลองมาใช้ command นี้แทนในการ restore

“dotnet restore –runtime osx.10.10-x64”

จากนั้นก็ลอง “dotnet run” ในที่สุด Hello World! ก็ออกมาแล้ว

Screen Shot 2559-01-11 at 12.29.49 AM

ลองเขียน C# บน mac ด้วย Mono

วันนี้ว่างๆครับ เลยลองทดสอบการเขียนโปรแกรมด้วย C# บน mac
เนื่องจากว่า C# นั้นพัฒนาจาก Microsoft ซึ่งแรกเริ่มเดิมทีนั้นทำมาเพื่อ Windows

โดยทางสถาปัตยกรรมแล้วโปรแกรมหรือแอฟที่พัฒนาด้วยภาษา C# นั้นต้องทำงานภายใต้ .NET framework

ซึ่งได้มี project ที่ชื่อว่า Mono พัฒนา .NET framework สำหรับ OS อื่นๆที่ไม่ใช่ Windows และเราจะใช้สิ่งนี้ในการรันโปรแกรม C# บน Mac ครับ

เริ่มต้นจาก download  Mono จาก http://www.mono-project.com/download/ ก่อนซึ่งตัวนี้จะเป็นโปรแกรมที่เอาไว้รัน .exe ที่ compile จาก C#

จากนั้นก็ไป download http://www.monodevelop.com ซึ่งเป็นเครื่องมือ (IDE) ที่ทำให้เราพัฒนาโปรแกรม C# ได้ง่ายขึ้น เช่น UI Design, Debugging และ อื่นๆ ซึ่งจริงๆแล้ว IDE ตัวนี้คือ Xamarin Studio นั่นเอง

จากนั้นผมก็ลองเขียนโปรแกรมง่ายๆ คือการ แสดง message box หลังจาก click ที่ปุ่มที่สร้างขึ้นมาเพื่อที่ว่าผมจะได้ทำความเข้าใจกับ IDE  ตัวนี้

1. Code ในส่วนของการสร้าง window เปล่าๆไม่มีอะไรมาก

Screen Shot 2558-12-13 at 12.29.59 PM

2. มาหน้า Designer ซึ่งทาง Xamarin Studio ก็มี ToolBox Panel ที่ทำให้เราเลือก Control มาวางที่ Window ได้เลยเหมือนที่ทำได้ใน Microsoft Visual Studio

Screen Shot 2558-12-13 at 12.47.20 PM

3. ทำการ handle event เวลาที่มีการ Click ปุ่ม แล้วแสดง Message Box

Screen Shot 2558-12-13 at 12.30.22 PM

4. ลองรันโปรแกรมดู ok เราได้ MessageBox กับข้อความที่ต้องการScreen Shot 2558-12-13 at 12.30.42 PM

เป็นการจบการ install และการทำ simple app อย่างง่ายดาย 🙂