computer scientists vs computational scientists

ไปเจอมา ขำดี แต่มันก็จริงนะครับ 555

Computational scientists solve tomorrow’s problems with yesterday’s computers; computer scientists seem to do it the other way around.

– anonymous

หา drive ของ USB drive

ทีมที่ต้องไปนำเสนองานเพื่อขอเงินล้านทีมหนึ่งต้องการใช้ Shiny ขอมาว่าให้ช่วยหน่อย โดยที่มีความต้องการว่าไม่ต้องการให้มีเซ็ตหรือเปิดอะไรยุ่งยากเพียงแค่ เสียบ USB drive ในเครื่องลูกค้าซึ่งเป็น Windows แล้ว double click อะไรก็แล้ว ให้ตัว Shiny app ก็เปิดขึ้นมาเลย ผมเลยบอกว่าได้ง่ายมาก เลี้ยงก๋วยเตี๋ยวผมก่อนชามหนึ่งเดี๋ยวเขียนscript ง่ายๆให้ เวลาใช้ก็เพียง double click ที่ icon ของ batch file นี้

วิธีที่ผมทำนั้นมันง่ายจริงๆครับ เพียงเขียน batch file หาว่า drive ที่เข้าเสียบนั้นอยู่ drive อะไรก่อน จากนั้นก็เพียง set ค่าพารามิเตอร์ที่ rstudio ต้องการใช้ในการหา R  และก็แก้ script นิดหน่อยให้ R มันโหลดตัว app เลย

อันนี้เป็นตัวอย่างโค้ด batch file ที่ใช้หา USB drive ที่ชื่อว่า MONEY ครับ  ไอเดียก็มีว่าใช้ wmic เขียนว่าUSB drive นั้นdrive อะไรแล้วเขียนลงไฟล์ชื่อ wmic.txt จากนั้นก็เปิดไฟล์ wmic.txt อ่าน พร้อมกับเช็ตตัวแปรชื่อ USBDrive จากนั้นก็เอาไปทำอะไรที่เราต้องการได้ครับ ซึ่งตัวอย่างนี้ผมก็เอาไปเปิดไฟล์ที่ slphyx.dat โชว์บน screen ครับ

wmic LOGICALDISK where volumename="MONEY" get deviceID > wmic.txt
for /f "skip=1" %%b IN ('type wmic.txt') DO (set "USBDrive=%%b")
type %USBDrive%\practices\slphyx.dat

 

ส่วนใครที่อยากรู้ว่าเกิดอะไรขึ้นหลังจากที่เราเรียกใช้ R ก็ดูตามนี้เลยครับ

เครดิต: https://twitter.com/thomasp85

 

เพิ่มเติม  https://rviews.rstudio.com/2017/04/19/r-for-enterprise-understanding-r-s-startup/

https://cran.r-project.org/web/packages/startup/vignettes/startup-intro.html

Continue reading “หา drive ของ USB drive”

LexTo บน Windows

ผมเอา code LexTo เค้ามาลองเขียนเล่นสำหรับใช้งานแบบ offline บน Windows (7, 8 และ 10)ครับ

สนใจdownload ได้ที่นี่ครับ

ที่download มันจะเป็นไฟล์ zip ที่มีตัวโปรแกรมชื่อ Araiwa.exe กับไฟล์ dictionary ชื่อ lexitron.txt พร้อมกับไฟล์ araiwadll.dll ก็ให้แตกไฟล์ zip นี้ออก แล้วdouble click ที่ไฟล์ Araiwa.exe ได้เลยครับ

ส่วนใครที่อยากใช้มันใน R ผมเขียนเป็นpackage เรียกมันว่า araiwa ครับ ดูเพิ่มเติมได้ที่ https://github.com/slphyx/Araiwa

ใช้งาน mono+rdotnet บน Rocks cluster

ตัวอย่างการใช้งาน mono + Rdotnet บนระบบ Rocks cluster ครับ

เวอร์ชั่น Rocks cluster ที่ผมใช้คือ 6.2 ครับ การติดตั้งก็แบบเดิมๆเลยตามที่อธิบายในเอกสารบนเวบของ Rocks เลย ไม่มีอะไรพิเศษ จากนั้นก็ผมก็ yum ติดตั้ง mono จาก https://copr.fedorainfracloud.org/coprs/tpokorra/mono-opt/  โดยในเวอร์ชั่นนี้ mono จะถูกติดตั้งไว้ที่ /opt/mono และก็ yum ติดตั้ง R ซึ่ง R จะถูกติดตั้งไว้ที่ /usr/lib64/R ของ head node ครับ

หลังจากที่ติดตั้ง mono และ R เรียบร้อยแล้วก็เอา code ของ C# ที่เขียนสำหรับเรียกใช้งาน rdotnet บวกกับก็อปปี้ไฟล์แอสเซมบลีของ Rdotnet ต่างๆมาไว้ใน folder ที่ต้องการก่อนทำการคอมไพล์ครับ โดยไฟล์ต่างๆของ Rdotnet ก็มีอย่างเช่น DynamicInterop.dll, RDotNet.dll, RDotNet.NativeLibrary.dll

ก่อนคอมไพล์หรือเรียกใช้งาน mono เราก็ต้องโหลดenviroment ต่างๆของ mono ก่อน โดยการพิมพ์

$ . /opt/mono/env.sh

ซึ่งมันก็คือเซ็ตpath ต่างๆของตัวแปรอย่าง LD_LIBRARY_PATH กับ PKG_CONFIG_PATH ครับ

export PATH=/opt/mono/bin:$PATH
export LD_LIBRARY_PATH=/opt/mono/lib:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=/opt/mono/lib/pkgconfig:$PKG_CONFIG_PATH

จากนั้นก็ export ค่า R_HOME ไปยัง path ของ R ที่ติดตั้งแล้ว

$ export R_HOME = “/usr/lib64/R”

อันนี้เป็นตัวอย่าง code ที่ผมก็อปปี้มาจากเวบของ RDotnet ครับ สำหรับเรียก R มาเพื่อทำ t-test ของเลข 2 ชุดครับ

#testRDotNet.cs
using System;
using System.Linq;
using RDotNet;

namespace Sample1
{
 class Program
 {
 static void Main(string[] args)
 {
 REngine.SetEnvironmentVariables();
 REngine engine = REngine.GetInstance();
 // REngine requires explicit initialization.
 // You can set some parameters.
 engine.Initialize();

// .NET Framework array to R vector.
 NumericVector group1 = engine.CreateNumericVector(new double[] { 30.02, 29.99, 30.11, 29.97, 30.01, 29.99 });
 engine.SetSymbol("group1", group1);
 // Direct parsing from R script.
 NumericVector group2 = engine.Evaluate("group2 <- c(29.89, 29.93, 29.72, 29.98, 30.02, 29.98)").AsNumeric();

// Test difference of mean and get the P-value.
 GenericVector testResult = engine.Evaluate("t.test(group1, group2)").AsList();
 double p = testResult["p.value"].AsNumeric().First();

Console.WriteLine("Group1: [{0}]", string.Join(", ", group1));
 Console.WriteLine("Group2: [{0}]", string.Join(", ", group2));
 Console.WriteLine("P-value = {0:0.000}", p);

// you should always dispose of the REngine properly.
 // After disposing of the engine, you cannot reinitialize nor reuse it
 engine.Dispose();

}
 }
}

เวลาคอมไพล์ก็เพียงพิมพ์

$ mcs /reference:RDotNet.dll /reference:RDotNet.NativeLibrary.dll /reference:DynamicInterop.dll testRDotNet.cs

ซึ่งคำสั่ง mcs นี้จะแปลงไฟล์ .cs ของเราให้เป็น binary ไฟล์ที่คอมพิวเตอร์จะเข้าใจได้ 🙂 ครับ ซึ่งในที่นี้มันจะสร้างไฟล์ชื่อ testRDotNet.exe ให้ครับ ส่วนoption ของคำสั่ง /reference เป็นการบอกว่าเราเรียกใช้ namespace จากไฟล์แอสเซมบลี่อะไรบ้าง

วิธีการรันไฟล์ exe ที่ได้จาก mcs ก็เพียงพิมพ์ mono แล้วตามด้วยไฟล์ exe ครับ เช่น

$ mono testRDotNet.exe

Welch Two Sample t-test

data: group1 and group2
t = 1.959, df = 7.0306, p-value = 0.09077
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.01956909 0.20956909
sample estimates:
mean of x mean of y
 30.015 29.920

Group1: [30.02, 29.99, 30.11, 29.97, 30.01, 29.99]
Group2: [29.89, 29.93, 29.72, 29.98, 30.02, 29.98]
P-value = 0.091