React native + Android studio : SDK Location + Run APK

รา build app เพื่อให้ได้แฟ้ม .apk ที่พัฒนาขึ้นด้วย React native ร่วมกับ Android SDK ซึ่งสามารถส่งออกผลงานได้หลายวิธี เมื่อได้แฟ้ม .apk มาแล้ว นำไปใช้บนอุปกรณ์ หรือ emulator ได้อีกหลายวิธี ซึ่งวิธีหนึ่งที่น่าสนใจ คือ upload แฟ้ม .apk ขึ้นไปทำงานบน เว็บบราวเซอร์ (Run APK Online in Browser) ผ่านบริการของ appetize.io หรือ ApkOnline Chrome extension (ส่วน testobject.com และ Manymo.com ประกาศยุติแล้ว) ซึ่งตัวอย่างนี้ เลือกใช้บริการที่ appetize.io เมื่อสมัคร และกรอกอีเมล ระบบจะส่งลิงค์ register ไปให้ทางอีเมล หลังจากนั้นจะพบลิงค์เข้าแอพแบบ online ในอีเมล หัวข้อ “Your links are ready!” มีข้อความว่า Your app is ready to go at https://appetize.io/app/g7..ym หรือ sign in เข้า dashboard เลือก ชื่อโปรเจคของเรา (myproject) มีตัวเลือก view , embed , manage , .. หากเลือก view ก็จะเปิด emulator แบบ online มาให้ใช้งาน ถ้าต้องการใช้บริการมากกว่านี้ หรือมีข้อจำกัดที่ลดลง เลือกจ่ายค่าบริการได้ ซึ่งหน้าตาแอพบนเว็บไซต์ เหมือนที่พบบน emulator โดยเงื่อนไขให้บริการแบบ Trail มีระยะเวลาหนึ่งเดือน หรือจำกัดจำนวน มีรายละเอียดดังนี้ Current plan: Trial. Period usage: 0 sessions, 0 minutes from Aug 1, 2021 12:00:00 AM to Sep 1, 2021 12:00:00 AM UTC. You are limited to 1 concurrent user and 100 minutes of streaming per month.

Android Studio
 Menu bar, Tools, SDK Manager, Android SDK Location: C:\Users\burin\AppData\Local\Android\Sdk
 Menu bar, Tools, SDK Manager, Android SDK, SDK Platforms, Check : Android 9.0 (Pie) API Level 28
 Menu bar, Tools, SDK Manager, Android SDK, SDK Tools,
 Check : Intel x86 Emulator Accelerator (HAXM installer) - Installed
 Bios : VT-x Virtualization must be enabled in Bios ( VT-x )
 C:> sysdm.cpl
 ANDROID_SDK_ROOT=C:\Users\burin\AppData\Local\Android\Sdk
 อ่านเพิ่ม https://developer.android.com/studio/run/emulator-commandline
 dir C:\Users\burin.android\avd พบ folder : Nexus_5X_API_24.avd
 C:\Users\burin\AppData\Local\Android\Sdk\emulator> emulator @Nexus_5X_API_24
 C:> react-native init myproject
 C:\myproject> gradlew assembleRelease
 dir E:\myproject\android\app\build\outputs\apk\release\app-release.apk - 31 MB
 dir E:\myproject\android\app\build\outputs\apk\debug\app-debug.apk - 44 MB

#AndroidStudio ตอนที่ 8.1 สิ่งที่ทำได้ และไม่ได้ในการใช้ HTML ใน TextView

#AndroidStudio ตอนที่ 8.1 สิ่งที่ทำได้ และไม่ได้ในการใช้ HTML ใน TextView  

<introduction>
หลังทบทวนที่ได้ใช้โปรแกรม Android Studio แล้วพบ ปัญหา และทางออกในหลายวิธี แล้วแบ่งปันในกลุ่มเฟส สมาคมโปรแกรมเมอร์ไทย ก็มีเพื่อนมาร่วมแลกเปลี่ยน แชร์โฮมเพจดี ๆ มาให้อ่าน หลังเขียนเรื่องที่อยากเขียนแล้ว ก็นำเรื่องที่อ่านเพิ่มเติมมาเขียนในข้อที่ 8 มีอะไรอีกมากที่ต้องเรียนรู้ ทั้ง 1) properties อีกอื้อ 2) ต้องเปลี่ยนตนเองตามการเปลี่ยนรุ่นของเครื่องมือ 3) การเลือกใช้เครื่องมือที่เหมาะสมกับงาน

Google เจ้าของ Android Studio ได้เตรียมเครื่องมือไว้เยอะ บางเรื่องบางงานก็ใช้ได้หลายเครื่องมือ ยกตัวอย่างง่าย ๆ สำหรับงานง่าย ๆ ก็มี layout ให้เลือกตั้งเยอะ และตอบโจทย์สำหรับงานง่ายได้ทุก layout แต่ถ้าต้องออกแบบ layout เชิงลึกถึงจะเห็นว่างานแบบลึกนั้น จะต้องใช้ layout แบบใดที่มีคุณสมบัติเฉพาะ และใช้ layout แบบอื่นไม่ได้จริง ๆ

TextView ไม่รองรับ HTML แต่โดยดี จึงมีเรื่องมาเล่า ดังนี้ 1) ใส่ HTML Tag เข้า TextView ใน Layout โดยตรง 2) ใส่ HTML Tag ใน string ที่อยู่ใน strings.xml แล้วอ้างอิงจาก Textview ใน layout 3) การส่ง img ใน strings.xml ไป TextView ใน layout ที่แสดงผลเฉพาะตัวอักษรหนา ส่วนภาพไม่ออก 4) การส่ง img ใน MainActivity.java ไป TextView ผ่าน ImageGetter แบบใช้ได้ 5) การส่ง img ใน strings.xml เข้า MainActivity.java ไป TextView ผ่าน ImageGetter แบบใช้ได้ 6) การส่ง img ใน strings.xml เข้า MainActivity.java ไป TextView ผ่าน ImageGetter แบบสั่ง replace แทนกำหนด Html Tag 7) ปรับ ImageGetter กันดีกว่า 8) การใช้ drawableStart แทน drawableLeft

</introduction>

กำลังเล่าเรื่อง การใช้โปรแกรม Android Studio สู่เพื่อนนักพัฒนา ผ่าน Blog

<process>

1. ใส่ HTML Tag เข้า TextView ใน Layout โดยตรง

ต.ย.1 การใช้ HTML Tag ใน TextView แบบนี้ไม่ได้ เกิด Error : Build ไม่ผ่าน

android:text="<b>hello</b>"

ต.ย. 2 การใช้ Entity Reference ใน TextView แบบนี้ไม่ได้ เกิด Error : Build ไม่ผ่าน

android:text="&lt;b>hello&lt;/b>"

ต.ย. 3 การอ้างอิงข้อมูลมาใช้ ต้องเคยถูกประกาศไว้ใน strings.xml จึงจะถูกต้อง แบบนี้ดี

android:text="@string/data1"

2. ใส่ HTML Tag ใน string ที่อยู่ใน strings.xml แล้วอ้างอิงจาก Textview ใน layout 

การใช้ HTML เขียนใน strings.xml แล้วอ้างไปแสดงผลใน layout.xml ทันที แบบนี้ เป็นวิธีที่ถูกต้อง มีคำแนะนำไว้ใน guide ของ  android.com ว่าสามารถใช้ <b> <i> หรือ <u> ได้ เพื่อประกอบการแต่ข้อความที่แสดงใน TextView

ปัญหา คือ การใส่ img หรือภาพไปพร้อมข้อความใน TextView ต้องเพิ่ม code พิเศษ

<string name="data"><b>hello world</b></string>
android:text="@string/data"

3. การส่ง img ใน strings.xml ไป TextView ใน layout ที่แสดงผลเฉพาะตัวอักษรหนา ส่วนภาพไม่ออก

แบบนี้ไม่พบ error แต่ภาพไม่แสดง ต้องมี code มาช่วย จึงจะแสดงภาพใน TextView

<string name="data"><b>hello world</b> <img src="lp01" /></string>

4. การส่ง img ใน MainActivity.java ไป TextView ผ่าน ImageGetter แบบใช้ได้

บรรทัดที่ 46 มี HTML Tag ที่ทำให้ ตัวอักษรหนา และเรียกภาพมาแสดงได้จริง
ประกาศข้อมูลแบบ String ที่อยู่ภายใน MainActivity.java เอง
แบบที่่ 1 ที่ใช้งานได้ build ผ่าน และแสดงผลถูกต้อง

String mData = "<b>hello</b> <img src=\"lp01\" />";

แบบที่่ 2 ที่ใช้งานได้ เหมือนแบบแรก

String mData = "<b>hello</b> <img src=lp01 />";

แบบที่่ 3 ที่ใช้งานได้ เหมือนแบบแรก

String mData = "<b>hello</b> <img src='lp01' />";

แบบนี้ error ต้องแก้ไขทันที

String mData = "<b>hello</b> <img src="lp01" />";

บรรทัดที่ใช้ได้ทั้ง 3 ตัวอย่างข้างต้น
จะถูกส่งต่อไปให้ class ImageGetter ที่ประกาศใต้ class MainActivity
ก่อนจะส่งภาพให้ TextView ที่อยู่ใน Layout จะใช้ setText( .. )
ก็ต้องแปลงข้อมูลกันก่อน ด้วย Html.fromHtml( .. ) และใช้ ImageGetter ที่นี่
แต่ fromHtml มีหลายรุ่น จึงใช้ IF ตรวจสอบว่ารุ่นไหน ต้องเรียกใช้แบบใด

htmlTextView.setText(Html.fromHtml(mData, new ImageGetter(),null)); 

ตัวอย่าง Code ทั้งหมด 55 บรรทัดที่ใช้ใน MainActivity.java อยู่ข้างล่างนี้

https://gist.github.com/thaiall/bcd1c4a61fd16bf1cfb5dd32fc274d93

5. การส่ง img ใน strings.xml เข้า MainActivity.java ไป TextView ผ่าน ImageGetter แบบใช้ได้

เปลี่ยนจากการกำหนดค่าคงที่ (Constant) เป็นการอ้างอิงค่า (Reference) จาก R.string.data หากไม่แก้ไข MainActivity.java อีก มาดูกันว่าต้องกำหนดข้อมูลใน strings.xml อย่างไร เพื่อทำให้แสดงภาพใน TextView

String mData = res.getString(R.string.data);

ใช้ Entity Reference คือ &lt; ทำให้ภาพออก เห็นตัวอักษา แต่ตัวอักษาไม่หนา

<string name="data"><b>hello</b> &lt;img src="lp01" /></string>

ใช้ Entity Reference คือ &lt; แทน < ทำให้เห็นทั้งภาพ และตัวอักษรหนา

<string name="data">&lt;b>hello&lt;/b> &lt;img src="lp01" /></string>

ใช้ Entity Reference คือ &lt; แทน < แบบไม่มี Quote  หรือ “” ก็ได้

<string name="data">&lt;b>hello&lt;/b> &lt;img src=lp01 /></string>

 

6. การส่ง img ใน strings.xml เข้า MainActivity.java ไป TextView ผ่าน ImageGetter แบบสั่ง replace แทนกำหนด Html Tag

หากไม่ต้องการใช้ HTML Tag ระบุชื่อภาพ แต่ใช้การแทนที่ ก็สามารถเพิ่ม code ใน MainActivity.java ได้ โดยมีตัวอย่างข้อมูลใน strings.xml ดังนี้

 <string name="data">pic01 pic02 pic03</string>

เพิ่มคำสั่ง for สั่ง replace ข้อมูลใน mData หากพบ pic0 ก็ให้เปลี่ยนเป็น Img Tag ตามรูปแบบที่ต้องการ ถือเป็นการลดรูปของข้อมูลภาพใน strings.xml ไม่ต้องพิมพ์ยาว ๆ

String mData = res.getString(R.string.data);
for(int i=1;i<=3;i++) {
 mData = mData.replace("pic0" + i, "<img src=lp0" + i + " />");
}

หากกำหนดข้อมูลใน strings.xml ให้ตัวอักษรเข้ม และปัดบรรทัด
ยังต้องใช้ Entity Reference คือ &lt; แทนเครื่องหมาย < ดังอธิบายในข้อ 5

<string name="data"><b>hello</b><br/>pic01</string>

แม้จะใช้คำสั่ง replace แทนที่ < เป็น &lt; ก็ไม่ทำให้ผลลัพธ์เปลี่ยนแปลง
เหมือนกับไม่เกิดการแทนที่เกิดขึ้น ก็เพียงแต่เล่าว่า วิธีนี้ใช้มาแล้ว

mData = mData.replace("<", "&lt;");
mData = mData.replace("<b>", "&lt;b>");

แล้วถ้าข้อมูลพิมพ์ [ แทนเครื่องหมาย < แล้วสั่ง replace
ผลลัพธ์จะออกมาเป็นการแสดง source code คือ <b>hello</b><br/>และภาพ

<string name="data">[b>hello[/b>[br/>pic01</string>
mData = mData.replace("[", "&lt;");

7. ปรับ ImageGetter กันดีกว่า

7.1 บรรทัดที่ 34 คือ setBounds (.. )
เนื่องจากผมเขียนโปรแกรมทดสอบเกี่ยวกับภาพ เห็นว่าภาพใหญ่เกินไป
จึงปรับให้ขนาดเล็กจิ๋ว กว้าง 48 * 2 =96 pixel สูง 64 *2 =128 pixels
ถ้าต้องการใช้ความกว้างสูงของตัวภาพ แล้วทำให้ใหญ่ 2 เท่า หรือเล็กครึ่งหนึ่ง ก็ทำได้

d.setBounds(0,0,d.getIntrinsicWidth(), d.getIntrinsicHeight());

7.2 หากจะปรับขนาดภาพให้เป็นตามชื่อภาพ
เราก็มีชื่อภาพในตัวแปร source แก้โปรแกรม โดยเปลี่ยนบรรทัด 34 เป็น 4 บรรทัดข้างนี้
แล้วปรับขนาดได้ตามชอบใจ

if(source.equals("lp01"))
    d.setBounds(0,0,48 * 2, 64 * 2);
else
    d.setBounds(0,0,300, 400);

7.3 ปรับการตรวจสอบ id
ตรวจสอบค่าของ getPackageName(); พบมีค่า com.thaiall.www.myapplication
ทำให้โปรแกรมที่เขียนขึ้นสามารถบรรทัดที่ 18 – 21 เพราะมีบรรทัดที่ 17 อยู่แล้ว

String p = getPackageName();

8. การใช้ drawableStart แทน drawableLeft
ได้แชร์ blog ตอนที่ 8 ในเฟสกลุ่ม สมาคมโปรแกรมเมอร์ไทย
แล้วคุณ Somkiat Ake Khitwongwattana แนะนำให้อ่าน Advance Android TextView ที่เขียนโดย Chiu-Ki Chan พอเข้าไปก็เห็นว่ามีคุณสมบัติที่ชื่อ drawableTop, drawableBottom และอีกเยอะที่ทดสอบแล้วใช้ได้เลยใน TextView แต่ drawableLeft ที่น่าจะใช้ได้พบว่า Android Studio ที่ผมใช้เค้าให้เปลี่ยนเป็น drawableStart และ drawableEnd ซึ่งเป็นการเปลี่ยนแปลงตลอดระหว่างการเปลี่ยนรุ่นของเครื่องมือที่ใช้พัฒนา นี่เป็นตัวอย่าง code ที่ปรับมาจากคำแนะนำที่ไปอ่านมา และผมไม่ใช้ lp01 เพราะรูปใหญ่เกิน จึงเลี่ยงไปใช้ ic_insert_emoticon_black_24dp และใน Page ของ Chiu-Ki Chan ยังมี Guide ที่น่าสนใจอีกมาก

<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/app_name"
    android:drawableStart="@drawable/ic_insert_emoticon_black_24dp"
    android:drawableEnd="@drawable/ic_insert_emoticon_black_24dp"
    android:drawableTop="@drawable/ic_insert_emoticon_black_24dp"
    android:drawableBottom="@drawable/ic_insert_emoticon_black_24dp" />

</process>

สรุปว่าวิธีที่ใส่ภาพ และ html อยู่ข้อ 5 
ส่วนข้อ 6 เป็นการเล่าเพิ่มเติม เรื่อง code

<website_guide>
http://chiuki.github.io/advanced-android-textview/#/
</website_guide>

หมายเหตุ 
ถ้าสนใจติดตามเนื้อหาในบล็อกนี้ สามารถ subscribe ด้วย email ที่อยู่ข้างขวา หรือ click here

#AndroidStudio ตอนที่ 4 ทำหน้าเพจที่มีข้อมูลมากจนต้อง scroll ลงไป และการเพิ่ม icon ประจำแอพ

ตอนที่ 4 ทำหน้าเพจที่มีข้อมูลมากจนต้อง scroll ลงไป และการเพิ่ม icon ประจำแอพ

<introduction>
แอพพลิเคชั่น มักจะหมายถึง โปรแกรมที่ทำงานบน Smartphone เดี๋ยวนี้ใคร ๆ ก็ใช้แทน Desktop กันเยอะ แล้วแอพก็ยังโด่งดังมาจากกระแสนิยมโหลดโปรแกรมใน App Store ของ Apple และ Google ก็ทำ Play Store สิ่งที่อยู่ในแอพ เป็นอะไรก็ได้ แต่สิ่งหนึ่งที่ไม่อาจมองข้ามคือข้อมูล ให้อ่าน ให้ศึกษา และเรียนรู้ อาทิ บทความ ประวัติความเป็นมา เรื่องเล่า และนิยายพื้นบ้าน เป็นต้น

ถ้าเรื่องราวที่ต้องการใส่ในแอพ คือ ชุดตัวอักษรที่มีจำนวนมาก การใส่ตัวอักษรจำนวนมากในหนึ่งหน้า แล้วเราก็เปิดอ่านอย่างต่อเนื่อง เลื่อนลงไปผ่าน Scroll Bar นั่นเป็นโจทย์ที่น่าสนใจ สำหรับการอธิบายขั้นตอนการสร้างแอพครั้งนี้ แล้วผมก็มีบทความที่จะทดสอบกับบทเรียนนี้ คือ ไอทีในชีวิตประจำวัน เรื่องที่่ 611 และปิดบทความ How to ครั้งนี้ด้วยขั้นตอนการติดตั้ง icon ประจำแอพ หากใคร install app ใน smart phone ก็จะมี icon สวย ๆ ปรากฎไม่ใช้สัญลักษณ์ android ที่เค้าทำเป็นค่า Default มาให้
</introduction>

<process>
กระบวนการในการพัฒนา APP

เพื่อแสดงข้อมูลเป็น Text หรือ String ที่มีขนาดยาวเกิน 1 หน้าที่จะแสดงผลได้
จึงต้องใช้ความสามารถในการทำ ScrollView

มีขั้นตอน ดังนี้

1. เริ่มต้นก็สร้าง Project แบบ Empty Activity แล้วจากการสำรวจว่า TextView อยู่ตรงไหน เพราะเป็นพระเอกของตอนนี้ โดยเข้าไปใน app, res, layout, activity_main.xml  พบว่า สามารถเข้าดูได้ 2 แบบคือ Tab:Design หรือ Tab:Text ถ้าเลือกดูแบบ Text ก็เหมือนดู Source code ที่เป็น XML จะพบกับ Tag ที่ชื่อ TextView มี Properties คือ android:text=”Hello World!” ซึ่งคำยอดนิยมนี้ สามารถเปลี่ยนได้ตามต้องการ

2. สังเกตก็จะพบส่วนของ properties หรือ คุณสมบัติ ของ TextView จะเห็นได้หากเราคลิ๊กคำว่า TextView ใน Component Tree จะพบ Properties Windows ทางด้านขวา
และมองเห็นคุณสมบัติของ layout_width กับ layout_height ที่เดิมมีค่าเป็น wrap_content ซึ่งหมายความว่า จะเปลี่ยนแปลงตำแหน่งตามเนื้อ content และมีตำแหน่งกลางจอภาพโดยอัตโนมัติ หากเปลี่ยนคุณสมบัติใน layout ทั้ง 2 เป็น match_parent
ก็จะทำให้อ้างอิงกับหน้าต่าง และ TextView ขยายเต็มจอภาพ และคำว่า Hello World! ก็จะไปอยู่ที่มุมบนซ้าย

นี่เป็นคุณสมบัติเติมขณะที่ไม่ได้แก้ไขใด ๆ
<TextView
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”Hello World!”
app:layout_constraintBottom_toBottomOf=”parent”
app:layout_constraintLeft_toLeftOf=”parent”
app:layout_constraintRight_toRightOf=”parent”
app:layout_constraintTop_toTopOf=”parent” />

แล้วถ้าสร้าง TextView ด้วยการใช้เครื่องมือ แบบ Drag and Drop ก็จะได้ Code ดังนี้

<TextView
android:id=”@+id/textView”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”TextView” />

3. ขั้นต่อไป ก็ไปหาเนื้อหา (Content) มาวางในช่อง text เพื่อให้มีข้อมูลแสดงผลมากกว่าแค่ Hello World! ผมหาบทความที่มีข้อมูลขนาด 2313 ตัวอักษร แล้ว paste ลงไป เรียงต่อกันเป็นพรืด เมื่อทดสอบแสดงผลใน Device emulator : Nexus_5X_API_19 พบว่าไม่แสดงภาษาไทย หายไปหมด เหลือแต่ภาษาอังกฤษ 

การพัฒนา App ในเครื่อง สามารถส่งงานไปแสดงผลในอุปกรณ์ได้หลายวิธี แต่การเลือก Device emulator อาจไม่สวยงาม และช้ากับเครื่องที่แรมน้อย จึงเปลี่ยนไป Run บน Smartphone ก็จะได้ผลงานเหมือนจริงที่ไม่ใช่การจำลองอุปกรณ์

4. การทำให้แสดงผลแบบมี Scroll Bar ให้เลือนขึ้นลง ดูข้อมูลที่เกิน 1 หน้าได้ ต้องใช้ ScrollView ร่วมกับ TextView มีตัวอย่างตาม Code ด้านล่าง และทำงานใน Smart Phone ได้อย่างถูกต้อง

https://gist.github.com/thaiall/2ebf07ea7a56c033b660bf6abb1a70c1

5. พบว่า IDE ของ Android Studio  แนะนำว่าให้ใช้ @String แทนการวางข้อมูลจำนวนมากใน TextView โดยตรง จึงเข้า app, res, values, strings.xml แล้วเพิ่ม Tag นี้

<string name=”data1“>
ข้อมูลที่นี่จำนวน 2313 ตัวอักษร เป็นบทความที่ย้ายไปเขียนไว้ด้านล่าง
</string>

แล้วไปแก้ไขแฟ้ม activity_main.xml ให้อ้างอิงข้อมูลจาก data1 ตาม code ด้านล่างนี้

<TextView
android:id=”@+id/textView1″
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:scrollbars=”vertical”
android:text=”@string/data1” />

6. การกำหนดภาพ icon ประจำ Project ถ้าไม่ชอบภาพตัว Android ที่เค้ามีมาให้ ก็เข้าไปกด right click ที่ app, res แล้วเลือก New, image asset เลือก image เลือก file ภาพจากในคอมพิวเตอร์ แล้วกด next, finish หลังจากนั้น ภาพที่อัพโหลดเข้าไปจะไปปรากฎใน app, res, mipmap, ic_launcher.png จำนวน 5 ภาพ ต่อไปถ้าส่ง APK เข้า Smartphone ก็จะได้เห็นภาพสวย ๆ ชวนให้ Click กัน

7. เขียนโปรแกรมเสร็จแล้วก็ต้องทดสอบ RUN แฟ้มที่ต้องการนำไปใช้
คือ app-debug.apk  มักอยู่ใน C:\Users\[user name]
\AndroidStudioProjects\[project name]\app\build\outputs\apk\

การทดสอบก็มักใช้ Device Emulator เพราะง่ายที่สุด แต่เครื่องคอมพิวเตอร์ที่ใช้มี RAM 4GB ลง Win10 OEM ที่โหลด Windows Defender ตลอดเวลาอีก เมื่อสั่งเปิด Emulator ก็จะทำให้เครื่องช้าลงอย่างเห็นได้ชัด และผลการจำลองก็ไม่สวยงาม จึงเลือกที่จะส่งแฟ้ม app-debug.apk ไปประมวลผล นอกเครื่องคอมพิวเตอร์ แล้วผมเลือกส่งออกไปทาง Smart Phone ผ่านการเชื่อมต่อของ APP : WiFi ADB และทำผ่าน DOS ก็สะดวก จะส่งผ่าน Android Studio ก็ทำได้ ซึ่งการ Connect ทำครั้งเดียว ส่วนการ Install จะทำหลังจากการ Build ในแต่ละครั้ง

</process>

<website_guide>
https://guides.codepath.com/android/Working-with-the-ScrollView
http://www.viralandroid.com/2015/10/how-to-make-scrollable-textview-in-android.html
+ http://blog.teamgrowth.net/index.php/android/how-to-make-the-textview-in-android-scrollable
+ http://www.thaiall.com/itinlife
+ https://play.google.com/store/apps/details?id=com.thaiall.itarticle
</website_guide>

 

ไอทีในชีวิตประจำวัน #611 เมื่อเพื่อนขอใช้โทรศัพท์เข้าสื่อสังคม ()

อาจมีสักครั้งที่เพื่อนสนิท หัวหน้า กิ๊ก หรือแฟนขอยืมสมาร์ทโฟนของเราเข้าสื่อสังคม ในกรณีที่โทรศัพท์ของผู้ที่เข้ามายืมมีปัญหาและมีเหตุผลจำเป็น คำตอบโดยปกติคือ ไม่ให้ยืม แต่ถ้าคำตอบต้องเป็นให้ยืม แล้วต้องทำอย่างไร บางครั้งอาจต้องมีการทำงานกลุ่ม ต้องการภาพ หรือคลิ๊ปที่มีคุณสมบัติเหมือนกันจากสมาร์ทโฟนเครื่องเดียวกันเพื่ออัพโหลด หรือในกลุ่มมีเพียงของเราที่เชื่อมต่อเครือข่าย 3G หรือ WiFi ได้ หรือในกลุ่มพร้อมใจกันไม่ได้พกอุปกรณ์ติดตัวไปด้วย นั่นมีเหตุผลมากมายที่ต้องให้ยืม แล้วผู้พัฒนาแอพพลิเคชั่นเข้าใจเงื่อนไขเหล่านี้ จึงพัฒนาโปรแกรมบราวเซอร์ให้สามารถเปลี่ยนเป็นโหมดส่วนตัวที่ไม่บันทึกข้อมูลขณะใช้งาน และหายไปเมื่อเลิกใช้ได้ ซึ่งรองรับการให้เพื่อนยืมสมาร์ทโฟนเพื่อเข้าสื่อสังคมได้

ในสมาร์ทโฟนมักมีโปรแกรมบราวเซอร์ (Browser) อยู่หลายค่าย อาทิ Chrome, Firefox, Opera, Baidu หรือ Dolphin ผู้ใช้บางท่านอาจลงผลิตภัณฑ์หลายทุกค่าย ซึ่งมักมีคุณสมบัติในการเข้าโหมดส่วนตัวทุกค่าย แต่ละค่ายก็จะมีชื่อเรียกโหมด และวิธีการใช้งานที่แตกต่างกันไป แต่โหมดส่วนตัวหรือโหมดปลอดภัยจะมีคุณสมบัติเหมือนกัน คือ จะไม่เก็บรหัสผู้ใช้และรหัสผ่านขณะใช้งานในโหมดปลอดภัยนี้ ไม่บันทึกการใช้งานให้ติดตามได้ใน History และไม่เก็บข้อมูลคุกกี้ไว้ในเครื่องเมื่อเลิกใช้ และทำงานแยกออกจากโหมดใช้งานปกติ ซึ่งผู้ใช้สามารถล๊อกอินเข้าระบบสื่อสังคม อาทิ เฟสบุ๊ค หรือทวิตเตอร์ด้วยบัญชีผู้ใช้ที่แตกต่างกันระหว่างโหมดปกติ และโหมดปลอดภัยคนละชื่อ หากมี 3 โปรแกรมบราวเซอร์ และสลับโหมดก็จะสามารถให้เพื่อนไม่ต่ำกว่า 6 คนเข้าสู่ระบบของสื่อสังคมด้วยบัญชีที่แตกต่างกันได้ แต่คงจะวุ่นวายอยู่ไม่น้อยกับการใช้สมาร์ทโฟนเครื่องเดียวโดยผู้ใช้ 6 คน

การเข้าโหมดลับของโปรแกรม Chrome เรียก New incognito tab แล้วยังเปิดได้หลาย Tab และมี Notification ที่สั่งปิดได้ทุกแท็บ ส่วนโปรแกรม Firefox เข้าผ่าน Private tab หรือ Tools, New Guest Session ก็จะมีคุณสมบัติที่แตกต่างกัน ส่วนโปรแกรม Opera เข้าผ่าน Tab ที่ชื่อ Private คล้ายกับของ Firefox การใช้งานในโหมดลับนี้จะป้องกันการเห็นข้อมูลเฉพาะในตัวเครื่องเท่านั้น การเชื่อมต่อแล้วส่งข้อมูลออกไปภายนอกยังคงเปิดเผย และมีการเก็บข้อมูลการจราจร (Traffic Log) เช่นเดิม ผ่านผู้ให้บริการเครือข่าย ข้อความที่ส่งไปในสื่อสังคมก็ไม่ลับ หากข้อความนั้นมีคุณสมบัติเป็นสาธารณะ ดังนั้นการส่งข้อความใดก็ควรอยู่ในวิจารณญาณว่าจะไม่ก่อความเดือดร้อนให้ตนเอง หรือผู้อื่นไม่ทางใดก็ทางหนึ่ง เพื่อความปลอดภัยของตนเองเป็นที่ตั้ง เพราะความลับไม่มีในโลก และอย่างน้อยความลับที่ว่าลับนักนั้นตนเองก็รู้

หมายเหตุ 
ถ้าสนใจติดตามเนื้อหาในบล็อกนี้ สามารถ subscribe ด้วย email ที่อยู่ข้างขวา หรือ click here

#AndroidStudio ตอนที่ 2 ทำ App เรียกโฮมเพจมาแสดงใน Smart Phone

ตอนที่ 2 ทำ App เรียกโฮมเพจมาแสดงใน Smart Phone

<introduction>
เคยเห็นแอพใน Smartphone ที่เปิดขึ้นมา แล้วก็ไปเรียกเว็บจาก URL มาแสดง
คำสั่งสำคัญที่มักใช้กัน คือ webview
แต่มีการปรับรุ่น SDK + Security + Device
ทำให้การใช้คำสั่งต้องมีรายละเอียดเพิ่มขึ้น
และนึกถึงการทำเว็บแบบ Progressive Web Apps
แต่ PWA กับ APK เชื่อมกันได้ไม่สนิท หรืออาจไม่เชื่อมกันเลย
ผมก็พยายามปรับ code ฝั่ง web server และ android ได้คุยกันรู้เรื่อง
โดยให้ส่ง user agent ไปให้กับ php ทั้งที่มี

HTTP_X_REQUESTED_WITH = [The package name from the app]

เพื่อกำหนดการทำงานให้ถูกต้องว่า
1) ถ้าถูกเรียกจาก app ใน android ต้องส่งอะไรไปให้
2) ถ้าเปิดแบบปกติก็ปล่อยให้เป็นการทำงานของ PWA
สำหรับ URL ที่ใช้เป็นกรณีศึกษาครั้งนี้เลือกใช้ Miss Grand 2017
http://www.thaiall.com/actress/missgrand2017/
และทดสอบกับ Smartphone จริง ผ่านแอพ WiFi ADB
https://play.google.com/store/apps/details?id=com.ttxapps.wifiadb
แล้ว code ที่แสดงไว้นี้ ฝากไว้กับ github.com เพราะมี plugin ใน blog

ทำให้แสดงผลได้สวยงาม
</introduction>

<process>
กระบวนการในการพัฒนา APP
เพื่อใช้งาน webview เรียกโฮมเพจผ่าน URL มาแสดงผล
มีขั้นตอน ดังนี้

1. เปิด Android Studio แล้วสร้าง New Project
เลือก Activity แบบ Empty Activity

2. ใน IDE ของ Android Studio มองหา Tab ด้านซ้าย
จะพบ 1: Project หรือกดปุ่ม ALT-1 ก็ได้
จะพบ 2 หัวข้อใหญ่ คือ app กับ gradle scripts
ให้ดูใน app จะพบหัวข้อ manifests, Java และ Res

3. ถ้าจะทำให้ App เรียกโฮมเพจผ่าน URL มาแสดงผล
สิ่งแรกที่ต้องทำ คือ คลิ๊กเปิดแฟ้ม AndroidManifest.xml ใน manifests
แล้วใส่ tag user-permission 2 บรรทัดตามตัวอย่าง code
เข้าไปด้านท้าย แทรกกลางระหว่าง TAG : /application กับ /manifest

</application>
แทรก code ไว้ที่นี่
</manifest>

AndroidManifest.xml

https://gist.github.com/thaiall/6d91cabec8a2d6adc59b74e646654edc

4. เปิดแฟ้ม MainActivity.java ที่อยู่ใต้ Package Name
ใน code ก็จะเริ่มด้วย package บรรทัดต่อมาก็ import อีกเพียบ
ตามด้วย public class MainActivity ..
สรุปว่า
copy code ด้านล่างนี้ไปวางทับของเดิม
แล้วแก้ชื่อ package name หรือแก้ไขข้อมูลอื่น ๆ ตามความเหมาะสม
อาทิ url ที่ต้องการ load
หรือ package name ให้ตรงกับที่ท่านตั้งไว้
หรือ user agent ถ้าไม่ใช้ ก็ลบบรรทัดนี้ไปได้
หรือ เปลี่ยนชื่อ host ที่ไม่ต้องการให้ทำ Intent ไปนอก App

 

MainActivity.java

https://gist.github.com/thaiall/32ac305eb17452490b74833a06dbbc35

5. ความตั้งใจคือ เรียกโฮมเพจตาม URL มาแสดงใน APP
เมื่อเปิดแฟ้ม activity_main.xml ที่อยู่ในใน app,res,layout
ก็ใส่ Tag : WebView ที่สำคัญเพียง Tag เดียว

activity_main.xml

https://gist.github.com/thaiall/3368a93b542548f2b9e9e175a50f4fe6

6. ในบทเรียนนี้ สรุปว่าต้องแก้ไข 3 ส่วน เมื่อมองจาก project explorer
เปิดผ่าน Menu bar ที่ View, Tool Windows, Project
– app, manifests, AndroidManifest.xml
– app, java, [package name], MainActivity.java
– app, res, layout, activity_main.xml

7. เมื่อแก้ไข code เสร็จแล้ว และไม่มี error มาให้กวนใจ
ก็สั่ง Menu bar, Make Project หรือ Ctrl+F9 หรือ Build APK 
แล้วส่ง Menu bar, Run, Run ‘app’ หรือ Shift+F10
เพื่อดูผลการทำงานของ App ใน Device Emulator หรือ Device
</process>

<website_guide>
+ http://www.thaiall.com/android
</website_guide>

หมายเหตุ 
ถ้าสนใจติดตามเนื้อหาในบล็อกนี้ สามารถ subscribe ด้วย email ที่อยู่ข้างขวา หรือ click here

ldap server สำหรับ windows

ldap for windows
ldap for windows

22 พ.ย.55 จากการทดสอบติดตั้งโปรแกรม ldap for windows เพื่อจัดตั้ง ldap server
สำหรับให้บริการข้อมูล ก็พบว่า OpenLDAP for Windows 2.4.30 ติดตั้งง่าย
ในการติดตั้งก็กด next เป็นส่วนใหญ่ ยกเว้นรหัสผ่านของ user name ที่ผมได้กำหนดไป
โดยกำหนดให้เหมือนค่า default password ของ server ที่มีมาให้
เมื่อใช้คำสั่ง netstat -na ก็พบว่า port 389 ถูกเปิดรอให้บริการอยู่แล้ว
แล้วใช้ Apache Directory Studio
เชื่อมต่อไปที่ host:localhost port:389
แล้วเลือก No Authentication ก็เข้าได้แล้วครับ

ldap : apache directory studio
ldap : apache directory studio

การติดตั้ง Apache Directory Studio นั้น ต้องมี JRE อยู่ในเครื่อง
แล้วผมก็ copy ห้อง /jre ไปไว้ใน  C:\Program Files\Apache Directory Studio
แล้วสามารถเรียกใช้โปรแกรมได้ตามปกติ เพราะพัฒนาด้วยภาษา Java
ถ้าเข้าระบบแบบ No Authentication จะมองเห็นข้อมูลทั่วไป
แต่ไม่เห็นรหัสผ่าน ของสมาชิก จะต้องกำหนด User และ Password สำหรับแบบ Simple Authentication
จึงจะเข้าแก้ไขข้อมูลที่ถูกปิดไว้ ได้แก่ password ของ member นั่นเอง

ldap ou=xxx,dc=xxx,dc=xxx
อาทิ ldap ou=xxx,dc=xxx,dc=xxx

ติดตั้ง visual studio 2010

how to install visual studio 2010
how to install visual studio 2010

เพื่อนร่วมงานให้โปรแกรมมาลองติดตั้ง เป็น VS 2010 แล้วผมก็ลง 2 รอบ เพราะรอบแรก Hang ส่วนรอบ 2 ใช้ Reinstall ปัญหาใหญ่คือเครื่องเก่า แต่สุดท้ายก็ข้าม error ไปจนเปิดโปรแกรมได้สำเร็จ
OS: XP V2002 SP3
CPU: AMD Althlon 64 X2 Dual Core Processor 4000+
Ram: 1 GB
HD: 60 GB ก่อนติดตั้งพบว่า D: เหลือ  1 GB และ C: เหลือ 10 GB
พบความขลุกขลักระหว่างติดตั้ง เพราะต้องคิดเรื่อง Deepfreeze และสรุปได้ว่าทำให้ D: เหลือมากกว่า 2 GB แล้วคัดลอกตัวติดตั้งลงไป แล้วใช้ daemon tool อ่านเพื่อติดตั้งลงไปใน C: ระหว่างรอพบว่าโปรแกรมสั่ง restart ระหว่างติดตั้งเพื่อเข้าสู่โปรแกรมใหม่  เมื่อเริ่มใหม่ก็ต้องปลุกให้ Daemon tool ทำงานต่อ ก็ทำให้การติดตั้งผ่านต่อไปในส่วนของ Visual Studio ได้สำเร็จ

http://www.facebook.com/media/set/?set=a.527414350606034.132429.506818005999002