Posts

Showing posts from 2022

Git clone บน SSH ทำยังไง ดีกว่า HTTPS ไหม ?

Image
        Programmer หลายคนที่ใช้ Git เป็น version control คงจะคุ้นเคยกับการ clone source code จาก repository ไม่ว่าจะเป็น GitHub หรือ Gitlab หรือเจ้าอื่นๆ ก็มีวิธีเดียวกันคือ ใช้ URL ประมาณนี้ https://github.com/lordgift/test-project.git  % git clone https://github.com/lordgift/test-project.git         การ clone แบบนี้คือ ช่องทาง HTTPS ซึ่งไม่ว่าจะใช้ cli หรือ tool อื่น ก็จะต้องการให้เรา authentication ก่อนในครั้งแรกเสมอ เช่น การกรอก username, password หรือการใช้ single sign-on จากผู้ให้บริการต่างๆ 👇🏻👇🏻👇🏻👇🏻👇🏻         เมื่อยุคสมัยเปลี่ยนไปเรื่องความปลอดภัย (Security) ก็มีความสำคัญมากขึ้น การใช้งานเพียง username, password ดูมีความเสี่ยงมากขึ้น คอนเซป 2 factors authentication (2FA) ก็เข้ามา ทำให้การแค่ clone ก็ดูยุ่งยากเพิ่มขึ้นมาอีก          การ clone ผ่าน SSH           คือท่าที่ผู้ให้บริการ git repository ต่างๆ เพิ่มความสะดวกให้เหล่า Programmer มากยิ่งขึ้น เพียงแต่ขั้นตอนของ  "ครั้งแรก" ของ SSH ก็ดุยุ่งยากหน่อยๆ แต่ก็ทำเพียงครั้งเดียว GitHub : clone via SSH        

[iOS] PHPickerViewController เครื่องมือสำหรับหยิบรูปจาก Photo Library ของใหม่บน iOS 14+

Image
         PHPickerViewController  เป็น class สำหรับเรียกใช้งาน Photo Library ซึ่งมีความสามารถเพิ่มเติมจาก UIImagePickerController ที่เป็นของเดิมที่น่าจะคุ้นเคยกันอยู่แล้ว สิ่งที่เหนือกว่าของ  PHPickerViewController รองรับการเลือกหลายไฟล์ (Muli-selection) รองรับ livePhoto  เป็นการทำงานแบบ async ไม่มีการขอ permission  การใช้งานก็ไม่ได้ยุ่งยากมากมายไปกว่ากันซะเท่าไร import PhotosUI ตั้งค่าและเรียกใช้งาน  PHPickerViewController var configuration = PHPickerConfiguration() configuration.filter = .any(of: [.images, .livePhotos, .videos]) configuration.selectionLimit = 2 let picker = PHPickerViewController(configuration: configuration) picker.delegate = self self.present(picker, animated: true)         และแน่นอนว่า การ handle response จำเป็นจะต้องใช้ delegate ตัวใหม่ เราจะต้อง implement protocol  PHPickerViewControllerDelegate ตัวใหม่ด้วย func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) { for result in r

[iOS] Property Wrapper ความสามารถในการเขียน Annotation บน Swift

Image
        Property Wrapper ถ้าแปลตามชื่อก็คือการปั้นตัวแปร เพื่อให้มีค่าเริ่มต้นตามที่กำหนด หรือความสามารถพิเศษตามที่เราต้องการ โดยอาศัยการระบุ annotation นำหน้าไปเท่านั้น !!! ลองมาดูวิธีใช้งานกันครับ ก่อนอื่น ต้องสร้าง annotation ที่เราต้องการก่อน @propertyWrapper struct Capitalized { var wrappedValue: String { didSet { wrappedValue = wrappedValue.capitalized } } init(wrappedValue: String) { self.wrappedValue = wrappedValue.capitalized } }         โดย @propertyWrapper เป็น attribute ที่บังคับต้องมี โดย datatype จะต้องตรงกับ attribute ที่เราเอาไปใช้งานด้วย ซึ่งตรงนี้เรามีการเพิ่มความสามารถ capitalized เข้าไปใน didSet ด้วย ตัวอย่างการใช้งาน struct User { @Capitalized var firstName: String @Capitalized var lastName: String } // firstName = Lord, lastName = Gift var user = User(firstName: "lord", lastName: "gift") หรือเราจะประกาศพร้อม assign value แบบนี้เลยก็ได้     // he

[Android] Desugaring กับการใช้งาน Official Date Time Library

Image
          Date Time library เป็นสิ่งที่มีปัญหามายาวนาน เอาแค่ในส่วนของ java standard library เองก็มี Class ให้เลือกใช้แบบงง ๆ (และก็ยังมีต่อไป) java.util.Calendar java.util.Date java.sql.Date ...           ทำให้นักพัฒนาหลายคนเลือกที่จะใช้ 3rd-party อย่าง Joda-Time เข้ามาแทน https://github.com/JodaOrg/joda-time         หลังจากนั้น Java 8 ก็ออกสู่สาธารณชน การมาของ Java 8 สร้างความตื่นเต้นให้ Java dev. พอสมควร ประกอบด้วย major changes เช่น lambda expression stream function Java DateTime library ตัวใหม่ ( java.time.* )           ในขณะที่ฝั่ง Android ก็อยากจะใช้บ้างอ่ะ แต่ติดว่าต้อง minimum SDK ต้องมากกว่า 26 หรือก็คือ Android 8.0 Oreo ขึ้นไปเท่านั้น เลยเกิด 2 ท่าหลักๆ เพื่อให้รองรับเครื่องเก่าๆ ด้วย คือ  Jack Toolchain เพื่อใช้ Java DateTime ตัวใหม่ และ lambda expression ได้ด้วย 3rd-party library เฉพาะเรื่อง DateTime           แต่ก็ต้องบอกว่าตัวเลือกแรกข้อเสียค่อนข้างเยอะ คือบิ้วช้ามากก บวกกับตอนนั้นคนยังไม่ได้ชินกับ lambda ขนาดนั้น คนเลยเลือกใช้ 3rd-party เฉพาะเรื่อง DateTime มากกว่า เช่

Facebook Comment

Recent Posts

Popular post of 7 days

Portal คืออะไรกันนะ???

[Java] ความแตกต่างระหว่าง Overloading กับ Overriding

มาตรฐานการตั้งชื่อตัวแปร (Naming Convention)

Popular

[Java] Java 8 DateTime ใหม่ ไฉไลกว่าเดิม

Portal คืออะไรกันนะ???

มาตรฐานการตั้งชื่อตัวแปร (Naming Convention)

ลืมรหัสปลดล็อค Android เข้าเครื่องไม่ได้ มีทางออกครับ

[Java] ความแตกต่างระหว่าง Overloading กับ Overriding

เรื่องของ ++i กับ i++

[Java] Java Static Variable และ Static Method

Push Notification คืออะไร มีวิธีทำอย่างไร (No Code)

พิมพ์ซองจากรายชื่อ excel ด้วยวิธี Mail Merge

[Android] เปิดเครื่องไม่ได้ โลโก้ค้าง (Boot Loop)