Intel

หลังจากได้รู้จักกับ Intel AppUp Center รวมถึงได้เห็นหน้าค่าตาของ Intel Atom Developer Program SDK สำหรับแอพลิเคชันที่จะเข้าไปทำตลาดกันบ้างแล้ว คราวนี้เราจะมาลองสร้าง/ปรับปรุงแอพลิเคชันเพื่อเตรียมลุยใน AppUp กัน โดยในบทความนี้จะเริ่มจากภาษา C/C++ กันก่อน เพราะตัว SDK รองรับมาตั้งแต่แรก ส่วนภาษาอื่นๆ นั้นแนวคิดจะคงเดิมแต่อาจจะต้องใช้ตัว binding ครับ

เตรียมวัตถุดิบ

  1. โอนสัญชาติเป็นชาวอเมริกัน โดยเปิดหน้าต่าง Region and Language จาก Control Panel แล้วแก้ไขค่าต่อไปนี้
    • Format: English (United States)
    • Current location: United States
    • Current language for non-Unicode programs: English (United States)
  2. ติดตั้ง Intel Atom Developer Program SDK
  3. ติดตั้ง Visual C++ 2008 (ใช้รุ่น 2010 ได้ แต่ต้องติดตั้งรุ่น 2008 ไว้ด้วย เนื่องจาก SDK พัฒนาโดยอ้างอิง C Runtime รุ่น 9.0)

เตรียมโปรเจกต์

เพื่อให้โปรเจกต์ของเราเรียกใช้ SDK ได้ เราจะต้องตั้งค่าเล็กน้อยเพื่อให้โปรเจกต์ของเรารู้จักไฟล์ header และไลบรารีก่อน

สำหรับ Visual C++ 2008

  1. เลือกเมนู Projects > [ชื่อโปรเจกต์] Properties...
  2. ในหัวข้อ Configuration Properties > General กำหนดค่า Common Language Runtime support: Common Langauge Runtime Support (/clr)
  3. ในหัวข้อ Configuration Properties > C/C++ กำหนดค่า Additional Include Directories: [ที่อยู่ SDK ของคุณ]\include (สำหรับ SDK 1.0 ขึ้นไป เปลี่ยนเป็น [ที่อยู่ SDK ของคุณ]\Cpp\include)
  4. ในหัวข้อ Configuration Properties > Linker กำหนดค่า Additional Library Directories: [ที่อยู่ SDK ของคุณ]\library (สำหรับ SDK 1.0 ขึ้นไป เปลี่ยนเป็น [ที่อยู่ SDK ของคุณ]\Cpp\lib)
  5. ในหัวข้อ Configuration Properties > Linker > Input กำหนดค่า
    • Additional Dependencies:
      • สำหรับโหมด debug: adpcored.lib adpcppfd.lib Psapi.lib Advapi32.lib shlwapi.lib
      • สำหรับโหมด release: adpcore.lib adpcppf.lib Psapi.lib Advapi32.lib shlwapi.lib
    • Force symbol references: __DllMainCRTStartup@12
สำหรับ Visual C++ 2010
  1. เลือกเมนู Project > [ชื่อโปรเจกต์] Properties...
  2. ในหัวข้อ Configuration Properties > General จากหัวข้อด้านซ้าย กำหนดค่า
    • Platform Toolset: v90
    • Common Language Runtime support: Common Langauge Runtime Support (/clr)
  3. ในหัวข้อ Configuration Properties > VC++ Directories แล้วเพิ่มที่อยู่ต่อไปนี้เข้าไป
  • Executable Directories: เพิ่ม [ที่อยู่ SDK ของคุณ]\bin (สำหรับ SDK 1.0 ขึ้นไป เปลี่ยนเป็น [ที่อยู่ SDK ของคุณ]\Cpp\bin)
  • Include Directories เเพิ่ม [ที่อยู่ SDK ของคุณ]\include (สำหรับ SDK 1.0 ขึ้นไป เปลี่ยนเป็น [ที่อยู่ SDK ของคุณ]\Cpp\include)
  • Library Directories เพิ่ม [ที่อยู่ SDK ของคุณ]\lib [ที่อยู่ SDK ของคุณ]\Cpp\lib)
  1. ในหัวข้อ Configuration Properties > Linker > Input กำหนดค่าเช่นเดียวกับ Visual C++ 2008 แต่คั่นแต่ละชื่อไฟล์ด้วย semi-colon
  2. ในกรณีที่เป็นโปรเจกต์แบบ Windows Form ซึ่งต้องใช้ .NET Framework นั้น จำเป็นต้องเปลี่ยนโปรเจกต์ให้ทำงานบน .NET Framework รุ่น 3.5 หรือต่ำกว่า ทำได้โดย
    • ปิดโปรเจกต์นั้นก่อน
    • เปิดไฟล์โปรเจกต์ (นามสกุล .vcxproj) ด้วยโปรแกรมแก้ไขไฟล์ข้อความ
    • แก้ไขค่าในแท็ก TargetFrameworkVersion ให้ตรงกับรุ่นที่ต้องการ

เริ่มต้น

สำหรับภาษา C แน่นอนว่าเราต้องเรียกใช้จากฟังก์ชันต่างๆ ที่ SDK เตรียมไว้ให้เท่านั้น แต่กับภาษา C++ เรามีให้เลือกสองวิธีหลักๆ คือ

  • สร้างวัตถุจากคลาส Application ขึ้นมาใช้โดยตรง
  • สร้างคลาสสืบทอดจากคลาส Application เพื่อใส่การทำงานของแอพลิเคชันของเราลงไปก่อน แล้วค่อยสร้างคลาสนั้นขึ้นมาใช้

เนื่องจากที่อื่นจะแสดงวิธีแรกให้เห็นกันเป็นส่วนมาก วันนี้เราจะแนะนำโดยทำวิธีหลังกันครับ

ก่อนอื่นเรามาสร้างคลาสแอพลิเคชันของเรากัน

โครงสร้างของโปรเจกต์ตัวอย่าง

ADPApplication.h

{syntaxhighlighter brush: cpp}
#include <vcclr.h>
#include "stdafx.h"
#include "adpcppf.h"
#include "MainForm.h"

using namespace HelloAppUp;

// Define your application ID, or use ADP_DEBUG_APPLICATIONID in testing.
const com::intel::adp::ApplicationId adp_app_id = ADP_DEBUG_APPLICATIONID;

class ADPApplication: public com::intel::adp::Application {

public:
    
    // Constructor
    ADPApplication(): com::intel::adp::Application(adp_app_id) {
        // Don't remove this pair of bracket, to pass the compilation.
    }

    int run() {
        System::Windows::Forms::Application::Run(gcnew MainForm());
        return 0;
    }

};
{/syntaxhighlighter}

เริ่มต้นจากการสร้างคลาสสำหรับแอพลิเคชันของเรา ซึ่งสืบทอดมาจากคลาส Application ใน SDK เนื่องจากใน Windows Form ก็มีคลาสชื่อ Application เหมือนกัน เพื่อไม่ให้สับสน เราจึงต้องระบุ namespace ของคลาสกำกับไว้ด้วยเมื่อเรียกใช้

ในส่วนของ constructor ของคลาส Application นั้นจะให้เราระบุหมายเลขแอพลิเคชันของเรา (Application ID) เป็นอาร์กิวเมนต์ด้วย ซึ่งเราจะได้จากการลงทะเบียนแอพลิเคชันในระบบ แต่ในช่วงพัฒนาแอพลิเคชัน เราสามารถใช้หมายเลขพิเศษ ADP_DEBUG_APPLICATIONID ไปก่อนได้

ส่วนฟังก์ชัน run ไม่ใช่ฟังก์ชันบังคับจาก SDK นะครับ ผมสร้างเองเพื่อใช้รันแอพลิเคชัน ซึ่งก็คัดลอกเอาซอร์สโค้ดส่วนเปิดหน้าต่างแอพลิเคชันจากโปรเจกต์ที่สร้างขึ้นตอนแรกมาใช้เท่านั้นเอง

การตรวจสอบสิทธิ์การรันแอพลิเคชันของผู้ใช้

แน่นอนว่าเราไม่อยากให้ใครคัดลอกแอพลิเคชันของเราไปใช้ฟรีๆ ดังนั้น SDK จะช่วยเราตรวจสอบผู้ใช้ที่เปิดแอพลิเคชันว่า ซื้อแอพลิเคชันของเรามาถูกต้อง และยังไม่หมดอายุการใช้งาน การทำงานส่วนนี้อยู่ใน constructor ของคลาส Application โดยจะตรวจสอบสิทธิ์ของผู้ใช้สำหรับแอพลิเคชันที่มีหมายเลขตามที่เราระบุลงไปเป็นอาร์กิวเมนต์ใน constructor นั่นเอง ยกเว้นสำหรับหมายเลขพิเศษ ADP_DEBUG_APPLICATIONID นั้น ส่วนของ SDK จะปล่อยผ่านให้ เพื่อให้เราใช้ทดสอบได้

หากผู้ใช้ไม่ผ่านการตรวจสอบ ไม่ว่าจะเกิดจากผู้ใช้ยังไม่ได้ซื้อแอพลิเคชันของเรา, แอพลิเคชันหมดอายุแล้ว, เปิดแอพลิเคชันนี้ไว้แล้ว, หรือไม่สามารถติดต่อบริการ (service) ตรวจสอบสิทธิ์ได้ จะโยน exception ออกมาให้ ดังนั้นเมื่อเรานำคลาสเมื่อสักครู่นี้ไปใช้ เราจะต้องดักจับ exception นี้ด้วย

เราไปดูไฟล์ที่มีฟังก์ชัน main ซึ่งจะเรียกใช้คลาส ADPApplication ที่เราสร้างไว้ครับ

HelloAppUp.cpp

{syntaxhighlighter brush: cpp}
// HelloAppUp.cpp : main project file.

#include "stdafx.h"
#include "ADPApplication.h"

ADPApplication *adp_app = NULL;

using namespace HelloAppUp;

[STAThreadAttribute]
int main(array<System::String ^> ^args) {
// Enabling Windows XP visual effects before any controls are created
System::Windows::Forms::Application::EnableVisualStyles();
System::Windows::Forms::Application::SetCompatibleTextRenderingDefault(false);

// Try to authen.
try {
    adp_app = new ADPApplication();
}
catch (AdpException& ex) {
    // Authentication failed. Show the error message, then exit.
    String^ errorMessage = gcnew String(ex.message());
    MessageBox::Show(errorMessage, "Authorization Problems",
        System::Windows::Forms::MessageBoxButtons::OK,
        System::Windows::Forms::MessageBoxIcon::Error);

    if (adp_app != NULL) {
        delete adp_app;
    }

    exit(-1);
}

// Authentication passed. We can run the application now.
int returnCode = adp_app->run();

// Don't forget to clear the Application object from the memory.
if (adp_app != NULL) {
    delete adp_app;
}

return returnCode;

}
{/syntaxhighlighter}

ส่วนหลักของโปรแกรมก็พยายามสร้างวัตถุจากคลาสแอพลิเคชันของเราขึ้นมา หากไม่มีสิทธิ์รันแอพลิเคชันก็จะแสดงหน้าต่างแสดงข้อผิดพลาดขึ้นมา และจบโปรแกรมทันที

สังเกตว่า อย่าลืมลบวัตถุจากคลาส Application ก่อนจบแอพลิเคชันด้วยนะครับ เพื่อไม่ให้วัตถุค้างอยู่ ซึ่งจะทำให้ตรวจสอบสิทธิ์ผู้ใช้ไม่ผ่านในรอบต่อๆ ไป

การทดสอบแอพลิเคชัน

ตอนนี้แอพลิเคชันของเราก็รันได้ และพร้อมที่จะทดสอบเบื้องต้นแล้ว โดยในการทดสอบนั้น เราจะต้องเปิดการทำงานของบริการ ATDS เสียก่อน โดยเรียกใช้ได้จาก Start Menu

สำหรับเครื่องที่ติดตั้ง Intel AppUp Center ไว้ด้วย จะต้องปิดโปรเซสบริการของ Intel AppUp Center (serviceManager.exe) ก่อนนะครับ

เมื่อเปิด ATDS แล้วเปิดโปรแกรมของเราขึ้นทดสอบ หน้าต่างคอนโซลของ ATDS จะแสดงข้อมูลการติดต่อกับแอพลิเคชันของเราให้เห็น

หน้าต่างคอนโซลของ ATDS

การบันทึกสถิติและข้อผิดพลาดของแอพลิเคชัน

อีกส่วนหนึ่งที่ SDK จะช่วยเหลือเราคือการบันทึกสถิติการใช้งานของผู้ใช้ (ในรุ่นเบต้านี้จะบันทึกไว้เฉพาะระยะเวลาที่ผู้ใช้ใช้แอพลิเคชัน) และข้อผิดพลาดต่างๆ ของแอพลิเคชัน โดยข้อมูลเหล่านี้จะถูกบันทึกไว้ในเครื่องของผู้ใช้ก่อน จากนั้นบริการของ AppUp จะจัดการส่งข้อมูลไปที่ Developer Portal เพื่อรวบรวมข้อมูลมาแสดงให้เรารู้ทางแดชบอร์ดต่อไป

เราจะกลับไปที่คลาส ADPApplication ของเราอีกครั้งเพื่อเพิ่มเติมคำสั่งในส่วนนี้กันครับ

ADPApplication.h (เพิ่มเติม)

{syntaxhighlighter brush: cpp}
#include <vcclr.h>
#include "stdafx.h"
#include "adpcppf.h"
#include "MainForm.h"

using namespace HelloAppUp;

// Define your application ID, or use ADP_DEBUG_APPLICATIONID in testing.
const com::intel::adp::ApplicationId adp_app_id = ADP_DEBUG_APPLICATIONID;

class ADPApplication: public com::intel::adp::Application {

public:
    
    // Constructor
    ADPApplication(): com::intel::adp::Application(adp_app_id) {
        // Don't remove this pair of bracket, to pass the compilation.
    }

    int run() {
        try {
            // Our normal source code of the application goes here.
            System::Windows::Forms::Application::Run(gcnew MainForm());
            return 0;
        }
        catch (Exception^ e) {
            // Unhandled exception is caughted. We'll report it, and exit the application.
            ADP_RET_CODE reportResult = reportException(e);
            String^ message;

            if (reportResult == ADP_SUCCESS) {
                message = "Unexpected error occurs. It'll be reported to the developers.";
            }
            else {
                message = "Unexpected error occurs, and it can't be reported.";
            }

            MessageBox::Show(message,  "Unexpected Error",
                    System::Windows::Forms::MessageBoxButtons::OK,
                    System::Windows::Forms::MessageBoxIcon::Error);

            return -1;
        }
    }

private:

    ADP_RET_CODE reportException(Exception^ e) {
        // Collect general information.
        // Sending stack trace as errorData, and useing __LINE__ are not good examples.
        wchar_t* moduleName = toWchar(e->Source);
        wchar_t* message = toWchar(e->Message);
        wchar_t* category = L"Exception";
        wchar_t* errorData = toWchar(e->StackTrace);
        long line = __LINE__;
        
        // Prepare the custom fields.
        ADP_CrashReportField customFields[1];
        customFields[0].name = L"ExceptionType";
        customFields[0].value = toWchar(e->GetType()->FullName);

        // Report.
        return pClientProxy->ReportCrash(moduleName, message, category, line,
            errorData, customFields, 1);
    }

     static wchar_t* toWchar(String^ str) {
        // Just convert the String^ to wchar_t*
        pin_ptr<const wchar_t> result = PtrToStringChars(str);
        return (wchar_t*)result;
    }

};
{/syntaxhighlighter}

เนื่องจากเราก็ไม่รู้เหมือนกันว่าแอพลิเคชันของเราจะเกิดข้อผิดพลาดตรงไหน ดังนั้นจุดยุทธศาสตร์หลักที่เราจะดักไว้ ก็คือดักข้อผิดพลาดครอบการทำงานของทั้งแอพลิเคชันเลยครับ จากนั้นเมื่อเกิดข้อผิดพลาดก็ใช้เมธอด reportCrash ของ pClientProxy เพื่อรายงาน ก่อนจะปิดแอพลิเคชันลงอย่างสวยงามด้วยหน้าต่างแจ้งผู้ใช้ของเรา

ข้อมูลเบื้องต้นที่เราส่งได้ก็คือ ชื่อโมดูลที่เกิดปัญหา, ข้อความ, หมวดหมู่ของปัญหา, บรรทัดที่เกิดปัญหา รวมถึงใส่ฟิลด์ของเราเองเพิ่มได้ นอกจากนี้ เรายังสามารถส่ง stack trace ไปได้ด้วย โดยต้องลงแรงเพิ่มอีกสักหน่อย แต่เราจะไม่พูดถึงในบทความนี้ และใช้วิธีที่ง่ายๆ คือส่งไปในฟิลด์ errorData แทน

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

การแสดงผลจาก ATDS เมื่อรายงานข้อผิดพลาด

ตัวอย่างเนื้อหาไฟล์บันทึกข้อมูลความผิดพลาด

บทสรุป

จากที่ผ่านมาทั้งหมด สังเกตว่าผมไม่ได้พูดถึงตัวแอพลิเคชันเลยแม้แต่น้อย เพราะการพัฒนาแอพลิเคชันสำหรับออกสู่ตลาด Intel AppUp Center นั้น เราไม่จำเป็นต้องแก้ไขหรือเขียนโปรแกรมสำหรับ AppUp โดยเฉพาะ เพียงแต่เติมเต็มส่วนต่างๆ เพื่อเอาประสิทธิภาพในการซื้อขายแอพลิเคชันผ่าน AppUp มาใช้เท่านั้น ซึ่งดูจะง่ายกว่าการเตรียมระบบยืนยันต่างๆ เวลาทำแอพลิเคชันขายเองมากเลยทีเดียว

หมายเหตุ

  • ตัวอย่างนี้ไม่แยกการประกาศคลาสในไฟล์เฮดเดอร์ และเขียนซอร์สโค้ดการทำงานในไฟล์ซอร์สโค้ดแยกต่างหาก เพื่อความสะดวกในการอธิบาย
  • การดักจับข้อผิดพลาดในตัวอย่างอาจดักจับข้อผิดพลาดของโปรแกรมที่ทำงานแบบมัลติเธรดไม่ได้

เพิ่มเติม

  • สำหรับใครที่จะลองพัฒนา แนะนำแหล่งข้อมูลและชุมชนนักพัฒนาหลักๆ ที่เว็บไซต์ของ Intel Atom Developer Program ครับ
  • ส่วนตัวอย่างแอพลิเคชันในบทความนี้ดาวน์โหลดได้ที่นี่ครับ
  • ในตอนนี้เองประเทศไทยมีนักพัฒนาร่วมในโครงการ IADP เป็นอันดับที่ 15 ของโลก และอันดับ 5 ของเอเชียรองจาก อินเดีย, จีน, ปากีสถาน, และมาเลเซีย ครับ
  • ใบ้ๆ ว่าเร็วๆ นี้เราจะมีโครงการแข่งซอฟต์แวร์ภายใน Blognone นะครับ ถึงตอนนี้อาจจะลองหาลู่ทางพัฒนาไว้ได้เลย

ข่าวและบทความหมวด - Intel AppUp Center ได้รับการสนับสนุนจากอินเทล เพื่อประชาสัมพันธ์โครงการ Intel Atom Developer Program ให้กับนักพัฒนาในประเทศไทย

Hiring! บริษัทที่น่าสนใจ

CP AXTRA Public Company Limited - Lotus's company cover
CP AXTRA Public Company Limited - Lotus's
CP AXTRA Lotus's is revolutionizing the retail industry as a Retail Tech company.
Token X company cover
Token X
Blockchain, ICO, Tokenization, Digital Assets, and Financial Service
Carmen Software company cover
Carmen Software
Hotel Financial Solutions
Next Innovation (Thailand) Co., Ltd. company cover
Next Innovation (Thailand) Co., Ltd.
We are web design with consulting & engineering services driven the future stronger and flexibility.
United Information Highway Co., Ltd. company cover
United Information Highway Co., Ltd.
UIH is Thailand’s leading Digital Infrastructure and Solution Provider for Business
KKP Dime company cover
KKP Dime
KKP Dime บริษัทในเครือเกียรตินาคินภัทร
Kiatnakin Phatra Financial Group company cover
Kiatnakin Phatra Financial Group
Financial Service
Fastwork Technologies company cover
Fastwork Technologies
Fastwork.co เว็บไซต์ที่รวบรวม ฟรีแลนซ์ มืออาชีพจากหลากหลายสายงานไว้ในที่เดียวกัน
Thoughtworks Thailand company cover
Thoughtworks Thailand
Thoughtworks เป็นบริษัทที่ปรึกษาด้านเทคโนโยลีระดับโลกที่คว้า Great Place to Work 3 ปีซ้อน
Iron Software company cover
Iron Software
Iron Software is an American company providing a suite of .NET libraries by engineer for engineers.
CLEVERSE company cover
CLEVERSE
Cleverse is a Venture Builder. Our team builds several tech companies.
Nipa Cloud company cover
Nipa Cloud
#1 OpenStack cloud provider in Thailand with our own data center and software platform.
CDG GROUP company cover
CDG GROUP
Provider of IT solutions to public, state, and private sectors in Thailand for over 56 years
Bangmod Enterprise company cover
Bangmod Enterprise
The leader in Cloud Server and Hosting in Thailand.
CIMB THAI Bank company cover
CIMB THAI Bank
MOVING FORWARD WITH YOU - CIMB is the leading ASEAN Bank
Bangkok Bank company cover
Bangkok Bank
Bangkok Bank is one of Southeast Asia's largest regional banks, a market leader in business banking
Gofive company cover
Gofive
“We create world-class software experience”
KBTG - KASIKORN Business-Technology Group company cover
KBTG - KASIKORN Business-Technology Group
KBTG - "The Technology Company for Digital Business Innovation"
Siam Commercial Bank Public Company Limited company cover
Siam Commercial Bank Public Company Limited
"Let's start a brighter career future together"
Icon Framework co.,Ltd. company cover
Icon Framework co.,Ltd.
Global Standard Platform for Real Estate แพลตฟอร์มสำหรับธุรกิจอสังหาริมทรัพย์ครบวงจร มาตรฐานระดับโลก
REFINITIV company cover
REFINITIV
The Financial and Risk business of Thomson Reuters is now Refinitiv
H LAB company cover
H LAB
Re-engineering healthcare systems through intelligent platforms and system design.
LTMH TECH company cover
LTMH TECH
LTMH TECH มุ่งเน้นการพัฒนาผลิตภัณฑ์ที่สามารถช่วยพันธมิตรของเราให้บรรลุเป้าหมาย
Seven Peaks company cover
Seven Peaks
We Drive Digital Transformation
Wisesight (Thailand) Co., Ltd. company cover
Wisesight (Thailand) Co., Ltd.
The Best Choice For Handling Social Media · High Expertise in Social Data · Most Advanced and Secure
MOLOG Tech company cover
MOLOG Tech
We are Modern Logistic Platform, Specialize in WMS, OMS and TMS.
Data Wow Co.,Ltd company cover
Data Wow Co.,Ltd
We enable our clients to realize increased productivity by solving their most complex issues by Data
LINE Company Thailand company cover
LINE Company Thailand
LINE, the world's hottest mobile messaging platform, offers free text and voice messaging + Call
LINE MAN Wongnai company cover
LINE MAN Wongnai
Join our journey to becoming No.1 food platform in Thailand
Apple
public://topics-images/apple_webp.png
SCB10X
public://topics-images/347823389_774095087711602_515970870797767330_n_webp.png
Windows 11
public://topics-images/hero-bloom-logo.jpg
Huawei
public://topics-images/huawei_standard_logo.svg_.png
Google Keep
public://topics-images/google_keep_2020_logo.svg_.png
Instagram
public://topics-images/instagram_logo_2022.svg_.png
SCB
public://topics-images/9crhwyxv_400x400.jpg
Microsoft
public://topics-images/microsoft_logo.svg_.png
Basecamp
public://topics-images/bwpepdi0_400x400.jpg
FTC
public://topics-images/seal_of_the_united_states_federal_trade_commission.svg_.png
Pinterest
public://topics-images/pinterest.png
Palantir
public://topics-images/-nzsuc6w_400x400.png
AIS Business
public://topics-images/logo-business-2021-1.png
PostgreSQL
public://topics-images/images.png
JetBrains
public://topics-images/icx8y2ta_400x400.png
Krungthai
public://topics-images/aam1jxs6_400x400.jpg
Palworld
public://topics-images/mccyhcqf_400x400.jpg
Bill Gates
public://topics-images/bill_gates-september_2024.jpg
VMware
public://topics-images/1nj4i1gp_400x400.jpg
Take-Two Interactive
public://topics-images/0khle7nh_400x400.jpg
OpenAI
public://topics-images/ztsar0jw_400x400.jpg
Thailand
public://topics-images/flag_of_thailand.svg_.png
ServiceNow
public://topics-images/ytnrfphe_400x400.png
Klarna
public://topics-images/urcllpjp_400x400.png
Google Play
public://topics-images/play.png
Drupal
public://topics-images/drupal.png
Virtua Fighter
public://topics-images/virtua_figther_2024_logo.png
Paradox Interactive
public://topics-images/paradox_interactive_logo.svg_.png
Europa Universalis
public://topics-images/europa-icon.png
Nintendo Switch 2
public://topics-images/mainvisual.png
Cloudflare
public://topics-images/cloudflare_logo.svg_.png
Samsung
public://topics-images/samsung.png
Google
public://topics-images/google_2015_logo.svg_.png
Uber
public://topics-images/uber.png
Microsoft 365
public://topics-images/m365.png
USA
public://topics-images/flag_of_the_united_states.svg_.png
GM
public://topics-images/0pe0po-z_400x400.jpg
Perplexity
public://topics-images/perplex.jpg
Xperia
public://topics-images/xperia.png
iOS 18
public://topics-images/ios-18-num-96x96_2x.png
True
public://topics-images/true_logo.png
SoftBank
public://topics-images/softbank.jpg
Pac-Man
public://topics-images/pacman.png
Harry Potter
public://topics-images/harry.png
Marvel
public://topics-images/marvel.png
Skydance
public://topics-images/skydance.png
SEA
public://topics-images/sealogo.png
Find My Device
public://topics-images/find.png
Gemini
public://topics-images/google_gemini_logo.svg__1.png
Accessibility
public://topics-images/accessibility-128x128_2x.png
Material Design
public://topics-images/m3-favicon-apple-touch.png
Android 16
public://topics-images/android16.png
Android
public://topics-images/android_0.png
Firefox
public://topics-images/firefox_logo-2019.svg_.png
Google Messages
public://topics-images/messages.png
Notepad
public://topics-images/notepad.png
Singapore
public://topics-images/flag_of_singapore.svg_.png
Airbnb
public://topics-images/airbnb.png
PS5
public://topics-images/ps5.png
Krafton
public://topics-images/krafton.png
Doom
public://topics-images/doom-game-s_logo.svg_.png
AMD
public://topics-images/amd_logo.svg_.png
GTA
public://topics-images/gta_0.png
DoorDash
public://topics-images/doordash.png
YouTube
public://topics-images/yt.png
YouTube Music
public://topics-images/yt-music.png
Facebook
public://topics-images/fb.png
iQiyi
public://topics-images/iqiyi_0.png
Viu
public://topics-images/viu.png
Amazon Prime Video
public://topics-images/prime-vid.png
Spotify
public://topics-images/spotify.jpg
Apple TV
public://topics-images/apple-tv.png
HBO Max
public://topics-images/max.png
Threads
public://topics-images/threads.png
Alexa
public://topics-images/alexa.png
Kindle App
public://topics-images/kindle.png
Shopee
public://topics-images/shopee.png
Waze
public://topics-images/waze.png
Bilibili
public://topics-images/bili.png
Google Maps
public://topics-images/maps.png
Apple Music
public://topics-images/apple-music.png
Claude
public://topics-images/claude.png
TikTok
public://topics-images/tiktok.png
Xbox
public://topics-images/xbox.png
Tesla
public://topics-images/tesla.png
Chrome
public://topics-images/chrome.png
Google Calendar
public://topics-images/gcal.png
Google Home
public://topics-images/ghome.png
Google Meet
public://topics-images/meet.png
NotebookLM
public://topics-images/notebooklm.png
Reddit
public://topics-images/reddit.png
Assassin’s Creed
public://topics-images/ac.png
Mark Zuckerberg
public://topics-images/zuck.jpg
Meta
public://topics-images/meta.png
Meta AI
public://topics-images/meta-ai.png
Epic Games
public://topics-images/epic_games_logo.svg_.png
Unreal
public://topics-images/unreal_engine_logo-new_typeface-svg.png
Fortnite
public://topics-images/fortnite.png
DeepMind
public://topics-images/deepmind.png
Databricks
public://topics-images/databricks.png
Netflix
public://topics-images/netflix-logo.png
Microsoft Azure
public://topics-images/azure.png
Microsoft Copilot
public://topics-images/microsoft_copilot_icon.svg_.png
Bing
public://topics-images/bing.png
EA
public://topics-images/ea.png
Intel
public://topics-images/intel.png
Amazon
public://topics-images/amazon.png
AWS
public://topics-images/aws.png
Zoom
public://topics-images/zoom.png
Dropbox
public://topics-images/dropbox_0.png
Roblox
public://topics-images/roblox.png
Dell Technologies
public://topics-images/dell-tech.png
Nothing
public://topics-images/nothing.svg_.png
Microsoft Teams
public://topics-images/teams.png
Mojang
public://topics-images/mojang.png
Minecraft
public://topics-images/minecraft.png
Redis
public://topics-images/redis_logo.svg_.png
Ubisoft
public://topics-images/ubisoft_logo.svg_.png
Elden Ring
public://topics-images/elden.png
Brave
public://topics-images/brave.png
Opera
public://topics-images/opera.png
Vivaldi
public://topics-images/vivaldi.png
Microsoft Edge
public://topics-images/edge.png
Duolingo
public://topics-images/duolingo.png
LinkedIn
public://topics-images/linkedin.png
Canva
public://topics-images/canva.png
Realme
public://topics-images/realme.png
NASA
public://topics-images/nasa-logo.png
Booking.com
public://topics-images/booking.png
Agoda
public://topics-images/agoda.png
Bolt
public://topics-images/bolt.png
Grab
public://topics-images/grab.png
Temu
public://topics-images/temnu.png
LINE
public://topics-images/line.png
Facebook Messenger
public://topics-images/messenger.png
WhatsApp
public://topics-images/whatsapp.png
Telegram
public://topics-images/telegram.png
Signal
public://topics-images/signal.png
X.com
public://topics-images/x.png
Grok
public://topics-images/grok.png
xAI
public://topics-images/xai.png
CapCut
public://topics-images/capcut.png
Edits
public://topics-images/edit.png
Google One
public://topics-images/gone.png
Tinder
public://topics-images/tinger.png
Whoscall
public://topics-images/whoscall.png
OneDrive
public://topics-images/onedrive.png
Lightroom
public://topics-images/lr.png
Meitu
public://topics-images/meitu.png
Outlook
public://topics-images/outlook.png
Excel
public://topics-images/excel.png
PowerPoint
public://topics-images/ppt.png
Microsoft Word
public://topics-images/word.png
Phone Link
public://topics-images/phone-link.png
OneNote
public://topics-images/onenote.png
Windows App
public://topics-images/windows-app.png
Notion
public://topics-images/notion.png
Google Drive
public://topics-images/drive.png
YouTube Kids
public://topics-images/yt-kids.png
Gboard
public://topics-images/gboard.png
DeepSeek
public://topics-images/deepseek_logo.svg_.png
Prince of Persia
public://topics-images/prince-persia.png
Sony
public://topics-images/nq0nd2c0_400x400.jpg
Tencent
public://topics-images/z4xi4oyc_400x400.jpg
Cisco
public://topics-images/jmyca1yn_400x400.jpg
Alibaba
public://topics-images/4axflwia_400x400.jpg
Alibaba Cloud
public://topics-images/qm43orjx_400x400_cloud.png
Coinbase
public://topics-images/consumer_wordmark.png
CarPlay
public://topics-images/carplay.png
Rust
public://topics-images/rust-logo-blk.png
Red Hat
public://topics-images/redhat.png
Anthropic
public://topics-images/anthropic.png
Xcode
public://topics-images/xcode.png
Tim Cook
public://topics-images/tim-cook.jpg
Donald Trump
public://topics-images/trump.jpg
Microsoft Surface
public://topics-images/surface.jpg
Copilot+ PC
public://topics-images/copilotpc.png
Stellar Blade
public://topics-images/stellar-blade.jpg
Snapdragon
public://topics-images/snapdragon_chip.png
Qualcomm
public://topics-images/qualcomm-logo.svg_.png
CoreWeave
public://topics-images/coreweave.png
Ford
public://topics-images/ford.png
Xiaomi
public://topics-images/xiaomi.png
Google Cloud
public://topics-images/google_cloud_logo.svg_.png
PlayStation Network
public://topics-images/psn.png
PlayStation Plus
public://topics-images/ps-plus.png
Windsurf
public://topics-images/windsurf.png
Square Enix
public://topics-images/square-enix.png
MIT
public://topics-images/x7hyjl3t_400x400.jpg
Zoox
public://topics-images/zoox.jpg
Evernote
public://topics-images/1neatidg_400x400.jpg
Magic the Gathering
public://topics-images/magic.png
Call of Duty
public://topics-images/cod.png
NVIDIA
public://topics-images/nvidia_logo.svg_.png
Satya Nadella
public://topics-images/nadella.png
Nintendo
public://topics-images/nintendo.png
Japan
public://topics-images/japan_flag.png
China
public://topics-images/china-flag-sq.png
Sam Altman
public://topics-images/sam-altman.png
SNK
public://topics-images/snk_logo.svg_.png