วันพฤหัสบดีที่ 1 พฤศจิกายน พ.ศ. 2561

มาทดลองทำ Firestore Codelab ที่บ้านให้เหมือนไปทำที่งาน Android Bangkok 2018

สวัสดีค่ะทุกคน ในนี้ดูไม่ค่อยได้มาเขียนเลยแหะ ส่วนใหญ่สิงที่ medium เพราะเขียนง่ายดี bookmark ได้ด้วย เขียนยาวๆก็ดองได้งี้ 555 ก่อนเราจะเขียนบทความสั้นๆ (เหรอ) เรามาท้าวความนิดนึงแบบสั้นๆก่อนนะ

session นี้มีอยู่รูปเดียว แปะวนไปจ้า

เราได้ไปเป็น speaker งาน Android Bangkok 2018 พูดเรื่อง ExoPlayer เป็นงานใหญ่งานแรกที่ได้ไปพูดต่อหน้าประชาชน ซึ่งวันนั้นก็จะสวมหมวก speaker ด้วย สวมหมวกคนฟังด้วย เนื่องจากเราต้องขึ้นไปพูด session ตัวเองหลัง session codelab ทำให้เรายังไม่ได้ลอง codelab ที่ว่านี้ ที่หลายคนได้รับเสื้อ Firebase กลับบ้านไป ว่าจะทำยากง่ายเพียงใด

ปล. น้องในทีมเราเขียนเป็น web ส่งมาเลยแหะ ฮ่าาๆๆ

สามารถอ่านบล็อก session ของเรา และเกี่ยวกับงานได้ที่นี่
Playing video by ExoPlayer

ไม่รอช้า มาเปิด codelab ที่นี่ https://codelabs.developers.google.com/codelabs/firestore-android/#0 และทำไปพร้อมกันเลยค่ะ

1. Overview 
เตรียมเครื่องให้พร้อมเน้อ โดยรวมทำแอปเชื่อมต่อข้อมูลกับเจ้า Firestore นี่แหละ และคิดว่า Android Developer ที่เจอบล็อกนี้ คงจะใช้ Android Studio 3 กันบ้างแล้ว จริงๆให้ใช้ 2.3 ขึ้นไปแหละ และมีมือถือแอนดรอยด์อยู่แล้ว ใช่ป่ะ ถ้าไม่ก็ Emulator ก็ได้ก๊าาา

2. Set up the sample project
- โคลนมันออกมาซะ : git clone https://github.com/firebase/friendlyeats-android
- เปิด Email Authentication ในโปรเจก Firebase ของเรา

ตอนแรกไปที่ Authentication โปรเจกเรายังไม่มีเนอะ กดปุ่ม SET UP SIGN-IN METHOD เลยจ้า


แล้วก็เปิดเจ้า Email/Password ซะ


จริงๆเจ้า Authentication มีหลายตัวนะเออ


จากนั้นไปที่ Firestore ใส่ไปแบบนี้

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth.uid != null;
    }
  }
}


- ใส่ไฟล์ google-service.json ในแอปเราก่อนค่อย build นะ
ส่ิงที่ขาดไม่ได้ คือ google-service.json นั่นเองงง ไม่มีเหมือนขาดใจเลยทีเดียว ได้ไฟล์นี้โดยการเพิ่มแอปแอนดรอยด์ของเรา แล้วก็ download มา


จากนั้นรันแอปดูจ้า เป็นอันจบขั้นตอนที่สองงงง


ปล. อย่าเพิ่ง update gradle instant run อะไรสักอย่างหลังจากโคลนนะ ไม่งั้น import ของเราพังอย่างไร้สาเหตุ

3. Write data to Firestore
จริงๆทำตามนั้นแหละ บนไฟล์ MainActivity.java จะมี TODO อยู่ เพิ่มส่วน init firebase ลงไป

private void initFirestore() {
        mFirestore = FirebaseFirestore.getInstance();
}

และใส่ model Restaurant ลงไป

    private void onAddItemsClicked() {
        // Get a reference to the restaurants collection
        CollectionReference restaurants = mFirestore.collection("restaurants");

        for (int i = 0; i < 10; i++) {
            // Get a random Restaurant POJO
            Restaurant restaurant = RestaurantUtil.getRandom(this);

            // Add a new document to the restaurants collection
            restaurants.add(restaurant);
        }
    }

ตอนแรกใน Firestore จะเป็นว่างๆอยู่แบบนี้

reuse project ก่อนแปปนึงนะ

พอรันแอปจะพบหน้า sign-in email มาแบบนี้ ให้เราสมัครสมาชิกก่อน



หลังจากลงทะเบียนแล้ว ก็พบกับหน้าหลัก ลองกดเลือกดูเล่นๆ แต่ มันไม่ได้ query data มาให้เรานะ




และสุดท้ายหน้า Firestore จะมีข้อมูลแบบนี้ มาจาก RestaurantUtil ตอนที่เราเพิ่มที่ onAddItemsClicked() นั่นเอง


4. Display data from Firestore

สุดท้ายจะได้ data ขึ้นมาแบบนี้ แต่ยัง sort ไม่ได้นะเออ


5. Sort and filter data

แน่นอนเราขาดส่วนนี้เนอะ ใส่โค้ดลงไป ลอง query ดู อ้าวทำไมไม่ออกหล่ะ


ไปดู log มันบอกว่าให้ไป create index ก่อนนะ จิ้ม link สิ รอไร


สร้าง index สิออเจ้า


และ Firebase ก็จะสร้าง index ให้เรา


ทำไมหล่ะ...

กลับไปจิ้มดู ได้แย้วววววๆๆๆๆๆๆ



6. Organize data in subcollections

เราลองมาให้ rating ดูกันเถอะ ปรากฎว่านางว่าเราแหะ add ไม่ได้จ้าาาา


หลังจากเพิ่มโค้ดไป เราก็สามารถเพิ่ม rating ร้านได้แล้ว เย้



7. Secure your data

จะจบแล้ววววว ลองดูความปลอดภัยกันสักนิด แอปเรานั้นต้องปลอดภัยมากๆเลยเนอะ ไม่งั้น user โวยวาย ดังนั้นปรับแต่ง rule สักนิดนึง โดยให้สิทธิการแก้ไขข้อมูลให้คนที่ log-in เข้ามาเท่านั้น

การแก้ไข rule มีผลใน 1-5 นาทีนะเออ แต่เรากดไปบอกไม่เกิน 10 นาทีนะ

service cloud.firestore {
  match /databases/{database}/documents {
        // Restaurants:
        //   - Authenticated user can read
        //   - Authenticated user can create/update (for demo)
        //   - Validate updates
        //   - Deletes are not allowed
    match /restaurants/{restaurantId} {
      allow read, create: if request.auth.uid != null;
      allow update: if request.auth.uid != null
                    && request.resource.data.name == resource.data.name
      allow delete: if false;
      
      // Ratings:
      //   - Authenticated user can read
      //   - Authenticated user can create if userId matches
      //   - Deletes and updates are not allowed
      match /ratings/{ratingId} {
        allow read: if request.auth.uid != null;
        allow create: if request.auth.uid != null
                      && request.resource.data.userId == request.auth.uid;
        allow update, delete: if false;
        
        }
    }
  }
}

เรียบร้อยจ้า จบพิธีกรรมการลองทำ Codelab ชดเชยหลังจากที่ได้เสื้อไปก่อนหน้านี้ในฐานะ speaker แล้ว 555

และที่ทำไปนั้นอยู่ในนี้จ้า

ป้ายกำกับ: ,

วันเสาร์ที่ 21 กรกฎาคม พ.ศ. 2561

ทดลองใช้ flamelink เพื่อทำ cms บน firebase hosting

สวัสดีทุกคนนนนนนนน เรามีเป้าหมายในปีนี้ว่าจะทำ cms แล้วย้ายเจ้าบล็อกนี้ไปอยู่ใน firebase ซะ แต่เราไม่ใช่ web developer เนอะ แต่วันนี้เราจะมานำเสนอตัวช่วย ชื่อว่า flamelink เป็น cms ที่ทำบน firebase hosting นั่นเองงงง เอาเถอะ มาเริ่มกันเลยดีกว่า

ปล. อาจจะมีความไม่ต่อเนื่องกันบ้าง เนื่องจากบล็อกไป มีงานอื่นไป ต้องว่างก่อนถึงจะมาทำต่อ...


ก่อนอื่น ใครยังไม่มี เอ้ยยย ยังไม่มีโปรเจกใน Firebase ก็สร้างก่อนเลยจ้า
ในที่นี้เรามาลองทำบล็อกรีวิวหนังสือที่เราซื้อแล้วอ่านเองเนอะ จริงๆกลัวมันไปทับ web port อ่ะ เลยลองกับอันเปล่าๆก่อน แล้วจะย้ายค่อยว่ากันอีกที


จากนั้นไปที่ https://flamelink.io/ และจัดการ sign-up log-in ให้เรียบร้อย ตอนนี้นางเป็น beta อยู่นะ

เข้ามานางบังคับให้สร้างเลยจ้าาาาาา เป็น UX ที่เขาคิดมาแล้วแน่ๆเลยยยย


Application Code ก็เอามาจาก Firebase Project ของเรา เขามีสอนด้วยน๊าาาา
ไปที่หน้าโปรเจก กดที่ Add Firebase to your web app แล้วก็อปโค้ดมาแปะในนี้เจ้าาา


เลื่อนลงมา เราน่าจะใช้เจ้า database และ storage แน่ๆ ในการเก็บ data blog ของเรา ถ้าเราทำ log-in เข้าเว็บเราก็น่าจะใช้เจ้า authentication ด้วยเนอะ 

สรุป พวก database กับ storage copy rule ไปแปะอันนั้นนะ ส่วน authentication นั้น enable เจ้า email ซะ ชัดแล้วไม่พูดซํ้า


สุดท้าย กรอกชื่อสกุล อีเมลล์ รหัสผ่าน เป็นอันจบ เราจะได้โปรเจกมาแล้ว วิ๊งงงๆๆๆ


เข้ามาข้างในก็เป็นแบบนี้แหละออเจ้า


ปล. วิธีสร้างโปรเจก developer เขาแนะนำบล็อกนี้มานะ เผื่อใครสนใจอ่านเป็นภาคภาษาอังกฤษ


ค่อยๆเริ่มมาเล่นทีละ tab แล้วกันเนอะ

Content อ้าวกดแล้วไม่ได้พาไปเขียนบล็อกหรอ งงเลย อ่ะสร้าง SCHEMA ก่อนก็ได้จ้า


ใส่รายละเอียดไป อ่ะลองคลิกไปอีกแท็ปนึง


อะไรเนี่ย อ้าวลากวางได้ด้วยอ่ะ


อ่อออออออ มันคือหน้าตาหน้าเขียนบล็อกเรานี่เอง เออจริงๆเราก็ยัง งงงงงงงงงง อยู่นะ คือ stun ไปเลย ทำอะไรต่อดี



ในส่วนของ Media นั้น เป็นตัวอัพไฟล์รูป......... ทำไมอัพแยกอ่ะ งงอีกแล้วววว


Navigation เป็นการสร้าง Menu ตรงตัวเลยแหะ


ลองเขียนสักบล็อกนึงสิ กดไปที่ SCHEMA ที่สร้าง


แล้วกด new entry


แล้วก็กดงงต่อ..... เขียนสิเห้ย งงอะไรอยู่

สุดท้ายตบตีเสร็จ แต่ละอย่างมันทำอะไรได้บ้างอ่ะ
ก็คือเขียนบทความได้บ้าง แต่อัพรูปจากหน้านี้ไม่ได้อ่ะ แล้วก็ใส่ SEO แล้วก็ status บนความว่า draft หรือ public



แล้วเราจะเห็นได้ยังไงหล่ะว่าที่เขียนอยู่ที่ไหน

กดไปอ่านที่นี่ https://flamelink-docs.firebaseapp.com/user-guide/quick-start

และพบว่าโยนไปที่นี่จ้า https://flamelink.github.io/flamelink/#/getting-started

สำหรับเราคิดว่ายังไม่ค่อย work เท่าไหร่อ่ะ เจ้าหน้า schema ไปไม่เป็นเลย อะฮืออออ คงไม่เหมาะกับเราจริงๆอ่าาา 

แต่จริงๆเขาก็มี slack support นะแล้วก็ update version ใหม่ๆด้วยแหละ https://flamelink.io/slack

ดูเป็นบล็อกที่จบไม่ค่อยสวยเท่าไหร่อ่ะ เอาจริงๆตอนที่เริ่มศึกษาเจ้านี่ก็ไม่ค่อยเห็นใครเขียนถึงมันแบบครบลูปเท่าไหร่นะ


ป้ายกำกับ: ,

วันจันทร์ที่ 19 กุมภาพันธ์ พ.ศ. 2561

เมื่อ Google Analytics for Firebase ไม่รองรับ Hosting เราจะทำยังไงดีน๊า

เราเองก็ใช้ Firebase มาประมาณนึงแหละ

ถ้าทำแอปเราก็สามารถใส่ Google Analytics for Firebase ได้ในบรรทัดเดียว ตอนเพิ่มใน gradle
แต่พอเรามาทำเว็บใน Firebase Hosting ก็เริ่มมีปัญหา คือ Google Analytics for Firebase รองรับเฉพาะแอปหล่ะสิ แล้วทีนี้เราเก็บสถิติคนเข้าเว็บยังไงดีหล่ะเนี่ย

ให้ Firebase Hosting มา แต่ดันไม่ให้ Analytics มานี่นะ  -*-

ทางออกของปัญหานี้ คือ ติด Google Analytics นี่แหละ

กลายเป็นว่า ก่อนที่คุณจะให้ใครมาเล่นเว็บที่ทำจาก Firebase Hosting คุณต้องติด Google Analytics ก่อนที่จะปล่อยออกไป เพื่อเก็บสถิติเว็บที่เราสร้างขึ้นเนอะ

หนูพาสเทลระวังตกนะลู๊กกก ><

จริงๆมันก็คือ case study นะ เราติด Google Analytics หลังจากปล่อยสามเว็บนี้ ทำให้บางเว็บไม่เจอจุดพีคว่าคนเข้าไปหน้าไหนบ้าง มาจากไหนงี้

- เว็บลุงสุขุม : https://loongsukhum-7a4a9.firebaseapp.com/
- เว็บน้องหมีตัวแตก : https://onemeal-d909a.firebaseapp.com
- เว็บ portfolio : https://mikkipastel.firebaseapp.com/

อันนี้ติดตอนหลังงาน open data ของเว็บลุงสุขุม ก็มีคนเข้าไปหาลุงบ้าง
ในที่นี้เราจะใส่เพิ่มใน 2 เว็บ คือ เว็บน้องหมีตัวแตก กับ เว็บ portfolio อาจจะยกมาแบบสลับๆกัน

เอางี้ มาเริ่มกันดีกว่า ไปที่เว็บไซต์ของ Google Analytics จากนั้น sign-in ให้เรียบร้อย

ไปที่เมนู Admin จากนั้นไปเพิ่ม Account โดยการไปกด drop-down เพื่อสร้างใหม่ ซึ่งเราสามารถตั้งชื่อโปรเจกเองได้

Property เราจะให้เจ้า Google Analytics เก็บข้อมูลจากไหน ไปเพิ่มโดยการกด drop-down เช่นเคย สามารถเพิ่ม resource ได้ 2 ประเภท คือ แอปมือถือ กับ เว็บไชต์

ถ้าใน mobile app จะ link กับตัว Firebase นะ สามารถจิ้ม package id ได้เลย แน่นอนหล่ะ มันไม่แนะนำให้เราใช้กับแอป นางจะไล่ให้ไปใช้ Firebase แทน 55555


เราต้องเลือก tab website เนอะ ใส่ชื่อเว็บลงไป ซึ่งมันจะเป็นชื่อ Property ของเรา ใส่ url ของเว็บที่เราต้องการ เลือก catrgory และ time zone เมื่อใส่ข้อมูลเสร็จแล้ว กดปุ่ม Get Tracking ID เลยจ้าาา


จากนั้นเราก็จะได้ Tracking ID มา สามารถเข้าไปใช้ได้เลย และสำหรับหน้าเว็บ สามารถก็อปโค้ดในส่วน Global Site Tag ไปแปะที่หน้าเว็บ ในส่วนของ <HEAD> ในทุกหน้าเว็บนะ มีหน้าเดียวก็สบาย ใส่ที่ index.html หน้าเดียว แต่ถ้ามีหลายหน้าก็ใส่หมดทุกหน้านะ



สุดท้ายยย หน้า Admin ก็จะเห็นทั้งหมดเป็นแบบนี้


เรามาทดลองใส่หน้าเดียวที่ index.html ผลคือ มันจะเก็บ tracking ที่หน้า index.html อย่างเดียว

ดังนั้นใส่โค้ด tracking แบบนี้กับทุกหน้าเนอะ สำหรับเว็บใส่โค้ดเสร็จไม่ต้องทำอะไร มัน detact ได้เองว่า user เข้าไปที่หน้าไหน สามารถดูแบบ real-time ได้เลย แบบนี้

หลังจากติด tracking code ทุกหน้าแล้ว หน้าไหนมีคนเข้าก็จะเห็นประมาณนี้

หน้า real-time สามารถบอกได้ว่า ใน 30 นาทีนี้ คนเข้ามาหน้าไหน pageview เท่าไหร่ มาจาก device อะไร มาจากไหน บลาๆ
แค่ผลที่ไม่ค่อยดี คือ Firebase Hosting ของเรานั้น มีส่วน bytes stored ที่เพิ่มขึ้นมา หลังจากที่เราเพิ่ม Google Analytics ลงไป ให้เราดูตกใจเล็กน้อย


ตอนแรกแบบ bytes stored มันจะขึ้นมาแบบน่าตกใจเว้ยย แบบงงว่าทำไมเพิ่มขนาดนั้น ตอนลุงสุขุมมันไม่ค่อยขึ้นเยอะขนาดนี้นะ ต้องรอหลายวันมันถึงจะนิ่งนะ


เราเองก็สงสัยนะ ทำไม ทำไมมีสีฟ้ากับสีม่วง ในส่วน Bytes Stored ด้วยนะ ต่างกันตรงไหนน๊าาาา ทำไมเดี๋ยวฟ้าเดี๋ยวม่วง ปกติที่จำได้มีสีเดียวนี่นาา เลยเอาไปถามในกรุ๊ป Firebase Developer Thailand ซึ่งเป็นคำตอบจากที่พี่ตี๋ไปถามใน stackoverflow มา เป็นดังนี้

ref: https://stackoverflow.com/questions/48140962/what-is-the-difference-between-blue-and-purple-bytes-stored-in-firebase-hosting

อื้มมมม จ้าาาาาา เราไม่ต้องไปกังวลสงสัยอะไรหล่ะ.... ทางนั้นบัคเอง
ตอนที่ปล่อยบล็อกเขาแก้บัคตัวเส้นม่วงเรียบร้อยไปแล้ว และเส้นมันก็นิ่งเหมือนเว็บลุงสุขุมนั่นแหละ

----------------- ----------------- ----------------- ----------------- 

สำหรับใครเพิ่งเริ่มรู้จัก อยากเริ่มทำตั้งแต่พื้นฐานเลย อ่านได้ที่ https://googleanalyticsthailand.wordpress.com/2015/03/01/%e0%b8%a7%e0%b8%b4%e0%b8%98%e0%b8%b5%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b8%95%e0%b8%b4%e0%b8%94%e0%b8%95%e0%b8%b1%e0%b9%89%e0%b8%87-google-analytics/

----------------- ----------------- ----------------- ----------------- 

ของแถม สำหรับ blogger แห่งนี้ก็ทำได้นะ เพียงใส่ Tracking ID ลงไป เลือก การตั้งค่า -> อื่นๆ แล้วเลื่อนไปหา Google Analytics แล้วกรอกลงไป


ข้อมูลที่ได้หลังจากการติด Google Analytics ประมาณ 1 วัน เป็นแบบนี้ เราแคปมาให้ดูคร่าวๆนะ

บอกได้ว่า คนเข้าจากไหน ส่วนใหญ่ของเราเป็น Organic Search นะ

เข้าไปที่หน้าไหนบ้าง จำนวน pageview แต่ละวันมีเท่าไหร่ และเท่าหมดของแต่ละวันมีเท่าไหร่

อันนี้บอกว่าคนเข้ามาดูช่วงไหน มาจากไหน ใช้ device อะไรบ้าง
ของบล็อกสามารถดูพฤติกรรมคนอ่านว่าอ่านอะไร แล้วไปไหน drop-off เท่าไหร่ เพื่อเอาไปปรับปรุงบล็อกต่อไป

ถือว่า 2018 plan list ข้อแรกก็ได้ผ่านไปแบบง่ายๆงงๆ คือ ตอนนี้สามารถ tracking ได้ทุกหน้าว่ามี pageview เท่าไหร่ แต่เข้ามาจากไหนอาจจะยังไม่เห็นภาพชัดเจนในวันแรกเนอะ แต่คิดว่าน่าเก็บ stat ของบล็อกตอนทำ CMS เองได้อยู่ ถ้าทำเว็บบล็อกเองแต่ไม่มี analytics นี่ชีวิตพังเลยเนอะ

หวังว่าจะเป็นประโยชน์กับคนอ่านนะ :)

ป้ายกำกับ: ,