ในมุมมองของผู้ใช้งานโทรศัพท์ Android อาจจะเข้าใจได้ว่า Internal Storage คือ Storage ที่ built in มากับเครื่อง เช่น Samsung S21 128GB และ External Storage คือพวก SD Card ที่ใส่เพิ่ม แต่ในมุมมองของการพัฒนามันไม่ใช่แบบนั้นนะซิ !

___________

คือพื้นที่ที่ถูกสร้างขึ้นหลังจากติดตั้ง Application เพื่อใช้เป็นพื้นที่ส่วนตัวของแต่ละแอป โดย directory จะถูกสร้างอยู่ที่ data/data/{ตามด้วยชื่อ package ของแต่ละแอป com.package.xxx} ซึ่งไฟล์ที่จัดเก็บในนี้จะไม่สามารถถูกเข้าถึงได้จาก Application อื่น หรือแม้แต่ user (ยกเว้นแต่เครื่องที่ถูก root นะ) และถ้าหาก user ลบแอปของเราทิ้ง ไฟล์พวกนี้ก็จะถูกลบไปด้วยเช่นกัน ตัวอย่างไฟล์ที่เก็บอยู่ในนี้ เช่น cache , Shared Preference, Cookies เป็นต้น และคำสั่งในการอ้างอิงถึง directory นี้คือ context.getFilesDir() และ context.getCacheDir()

2. External Storage
คือพื้นที่ภายนอกจาก Internal Storage ถ้ามองในมุมผู้ใช้งานมันคือพื้นที่ Storage ของโทรศัพท์และรวมถึง SD Card ด้วย เป็นพื้นสาธารณะที่ทุกแอปสามารถใช้งานได้ ซึ่งแอปที่ต้องการจัดเก็บไฟล์ไว้ที่ External Storage จำเป็นต้องขอ Permission จาก User ก่อน และเมื่อ user ลบแอปทิ้งไฟล์เหล่านั้นก็จะไม่ถูกลบตามไปด้วย เช่น Picture, Download หรือ Custom directory เป็นต้น

แต่ในเรื่องของ Storage บน Android 10 ขึ้นไปจะมีการเปลี่ยนแปลงค่อนข้างเยอะ โดยทาง Google จะบังคับใช้ Scope Storage กับแอปพลิเคชั่นเพื่อเพิ่มความเป็นส่วนตัวและความปลดภัย โดยการบังคับใช้ targetSdkVersion : 30 โดยบังคับใช้วันที่ 2 สิงหาคม 2564 สำหรับแอปใหม่ และ แอปอัพเดท บังคับใช้ 1 พฤศจิกายน 2564


ขอยกตัวอย่างจากบทความของ Eda Kavlakoglu ชื่อ AI vs. Machine Learning vs. Deep Learning vs. Neural Networks: What’s the Difference? https://www.ibm.com/cloud/blog/ai-vs-machine-learning-vs-deep-learning-vs-neural-networks

เขาบอกว่า AI vs. Machine Learning vs. Deep Learning vs. Neural Networks มันมีความสัมพันธ์ซึ่งกันและกันคล้ายกับตุ๊กตา Russian ที่เปิดออกมาก็จะเจอตุ๊กตาอีกตัวไปเรื่อย ๆ เช่นเดียวกับการศึกษา AI

Neural Network เป็นการเลียนแบบการทำงานของสมองมนุษย์ ด้วยกลุ่มของ Algorithm ซึ่งโดยพื้นฐาน Neural Network นี้จะประกอบด้วย 4 Component ได้แก่ 1. inputs |…


กระบวนการเข้ารหัสของ Https ที่ใช้รับส่งข้อมูลระหว่าง Client <-> Server นั้นจะใช้ Cryptography 2 แบบด้วยกัน

https://medium.com/@emilywilliams_43022/cryptography-101-symmetric-encryption-444aac6bb7a3
  1. Symmetric Cryptography (มีกุญแจดอกเดียว) คือใช้กุญแจดอกเดียวในการเข้ารหัส และถอดรหัส โดยกุญแจนี้มักถูกเรียกว่า Secret Key เพราะกุญแจนี้ควรเก็บไว้เป็นความลับ

เนื่องจากได้มีงานเขียน Backend Service (Spring Boot)โดยต้องไปเรียก REST Service Api ของส่วนกลางหลาย ๆ เส้นเพื่อเอา Data มารวมร่างกัน (จนแอปตัวเองแถบจะไม่ต้องใช้ Database เลย @_@) จึงได้รู้จักกับ CompletableFuture ที่จะช่วยให้การทำงาน Async ง่ายขึ้น

Fork-Join framework

Fork-Join framework ถูกเพิ่มเข้ามาใน Java 7 ช่วยเพิ่มความเร็วในการทำงาน โดยแตกงานออกเป็นงานย่อยๆ แล้วให้ทำงานพร้อมกันแบบ Parallel ซึ่งจะกระจายการทำงานไปยัง threads ต่างๆ ใน common thread pool โดยเรียกว่า ForkJoinPool

ForkJoinPool

แต่ละ thread ใน ForkJoinPool จะมี algorithm “workstealing” คือ เมื่อ thread…


เมื่อมีผู้ใช้งานโทรศัพท์ Huawei รุ่นใหม่ที่ไม่สามารถใช้งาน Google Service ได้ (โดยเฉพาะลูกค้าคนสำคัญ !!) ดังนั้นเราจึงต้องทำให้แอปให้ Support Huawei Mobile Service จึงได้ไปเจอบทความของ wongnai

จากนั้นเลยทำตามโดยเลือก Solution แบบ Bridge Class เพราะว่ามันน่าจะดีที่สุดโดยเริ่มจาก ใช้ Product Flavor แยกระหว่าง Google กับ Huawei

2. แยก dependencies ตาม Product Flavor เพื่อให้แอปไม่ใหญ่


ใน Android 10 ได้มีการปรับปรุงการใช้งาน และการเข้าถึง Device Storage เพื่อเพิ่มความปลอด และความสะดวกต่อการใช้งาน

  • การใช้งาน Storage แบบเดิม
    1. แต่ละแอปจะมี Private Directory เป็นของตัวเองใน Internal Storage เช่น android/data/com.package.xxx ซึ่งแอปอื่นจะไม่สามารถเข้ามา access ได้
    2. แอปจะขอ Permission ที่กว้างเกินไป เช่น WRITE_EXTERNAL_STORAGE ซึ่งทำให้แอปที่ได้ Permission นี้ไปสามารถจัดการไฟล์ที่อยู่ที่ External Storage ได้ทั้งหมด (ไฟล์ของชาวบ้านเขาด้วย)
    3. …


Application Assessment Overview

Phase 1 — Static analysis
Phase 2 — Dynamic and Runtime analysis
Phase 3— Communication Channel
Phase 4— Server Side and End-to-End Testing

Static analysis

  1. Reverse Engineering on Application Binary

คือการใช้ tools เช่น jadx และ apktool ควบคู่กัน ใช้ในการ Reverse Engineer และเข้าไปแก้ไข Source Code และ compile ใหม่เป็นแอพที่ถูกการแก้ไขจาก hacker
แนวทางป้องกัน -> ใช้การ…


สำหรับงานที่ต้องการกำหนดการใช้งานอุปกรณ์หรืองานประเภทอื่นๆ ที่เราจำเป็นจะ ต้องใช้ Device ID ในการเช็คโดยการดึง Device ID จะประกอบด้วย 5 วิธีหลักดังนี้

1. Unique Telephony Number (IMEI, MEID, ESN, IMSI)

ใช้ได้เฉพาะมือถือหรือ Tablet ที่มีการใส่ซิมการ์ดเท่านั้น emulator หรือ device ที่ไม่มีการใช้งานซิมการ์ดจะไม่สามารถดึงค่าได้

2. MAC Address

เราสามารถดึงค่า mac address ได้จากอุปกรณ์ที่มี wifi หรือ bluetooth hardware แต่วิธีการนี้ไม่แนะนำเพราะว่าทุก device อาจไม่มี wifi hardware และถึงแม้จะมีก็ต้องเปิดใช้งานก่อนถึงจะสามารถดึงค่าได้

3. Serial Number

Device บางรุ่น สามารถกำหนด serial number เองได้ และบาง device อาจไม่มี serial number ก้ได้ ทำให้วิธีการนี้ไม่น่าเชื่อถือ

4. Secure Android ID

เมื่อ android device ถูกเปิดใช้งานจะมีการ random ค่าและเก็บไว้ ค่านี้สามารถเรียกใช้ได้ผ่าน Settings.Secure.ANDROID_ID ซึ่งค่าที่ได้จะเป็นชุดตัวเลขที่ถูกเก็บไว้ไม่เปลี่ยนจนกว่าจะมีการ reset factory และอย่างที่รู้กันมี bug จากผู้ผลิตซึ่งส่วนใหญ่เป็นกับโทรศัพท์ที่เป็นรุ่นยอดนิยม ทำให้บางครั้งมี ANDROID_ID ซ้ำกัน

String androidId = Settings.Secure.getString(getContentResolver(),
Settings.Secure.ANDROID_ID);

5. UUID

ใช้ function UUID.randomUUID() เพื่อสร้างชุดตัวเลขที่ไม่ซ้ำ (แต่ละเครื่องจะไม่ซ้ำกัน) เพื่อใช้กำหนดตอนติดตั้งแอพพลิเคชั่น แต่เราจำเป็นต้องเก็บค่าไว้ใน local storage เอง และสามารถใช้ Android Backup service ในการเก็บ Unique ID นี้เพื่อสามารถนำไปใช้กับเครื่องอื่นได้ด้วย

Android Backup service https://developer.android.com/google/backup/signup

ref: https://medium.com/@ssaurel/how-to-retrieve-an-unique-id-to-identify-android-devices-6f99fd5369eb


การสร้างข้อความแบบเว้นบรรทัดใน javascript es6 ทำได้ง่ายขึ้นกว่าเดิมโดยการใช้ เครื่องหมาย ` แทน double quote เพียงเท่านี้ก้จะได้ข้อความเว้นบรรทัดแล้ว

ES5 -> var str = “Hello\n World. \n Java Script”;ES6 -> const str = `Hello 
World.
Java Script`;
This is a same results;

rest parameters มีประโยชน์ในการทำให้รับค่า parameter กลายเป็น array และ การรับค่าของ function ก็จะ dinamic ขึ้นด้วย (ไม่จำเป็นต้องประการตัวแปร Array ก่อนนั่นเอง) ดังตัวอย่าง …params คือ rest parameters

function showArray (…params) {
let result = 0;
params.forEach(function(value) {
result += value;
});
console.log(result);
}
showArray(1,2,3,4);output: 10 // 1 + 2 +3 + 4 = 10

Panya.Bas

{ เขียนไว้เพื่อกลับมาอ่านกันลืม }

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store