Lumen Taba في مراقبة الإنتاجية: نكتب تطبيقنا الخاص لمصباح ذكي

الصورةمرحبًا بالجميع ، لطالما كنت مهتمًا بمنزل "ذكي" ، وعلى وجه الخصوص ، برمجة بعض الأجهزة المرتجلة. آخر مرة قمت بتثبيت OpenWrt على جهاز التوجيه الخاص بي وعبر الهاتف باستخدام GPIO ، فتحت الباب الأمامي (في الوقت الحالي ، التخطيط). هذه المرة ستكون حول الإنتاجية ، وليس السلامة.

لقد سمع الكثير بالفعل عن المصابيح "الذكية" التي يمكنها تغيير الألوان وحتى وميض الموسيقى. منذ وقت ليس ببعيد حصلت على واحدة في يدي. هذه لوميني. من منا المبرمجين مهتم بجهاز "ذكي" فقط ، والذي لا يمكننا صنع تطبيقاته الخاصة به ، ولكن هناك الكثير من الأفكار.

اتضح أن لوميني لنا. عند فتح التطبيق الأصلي لنظام التشغيل iOS ، أدركت على الفور أنني سأتمكن من الوصول إلى المصباح الكهربائي. تم توصيل المصباح الكهربائي بطريقة سحرية ، وبعد توصيله ، بدأت في الهندسة العكسية لتطبيقات Android. سمعت في مكان ما أنهم تم تحويلهم إلى ملفات Java تمامًا ، ومن هناك يمكنك بالفعل أخذ كل منطق العمل مع المصباح. لم يكن الحصول على apk أمرًا صعبًا. هنا هناك ويمكن الاطلاع على التطبيقات APK من Google Play، ولكن هناك وdecompiled في التعليمات البرمجية. في موازاة ذلك ، أخبرت زميلي بالفعل عن الفكرة واستمعت إلى مراجعة إيجابية. لذا ، بينما قمت بفك الشفرة ، وجدت خادمًا على Node.js ، يتصل بالمصباح ويعطي "مقابض" للتحكم. فكرت وقررت ، لماذا لا. لذا ، يمكنني الآن التحكم في المصباح بمفردي - تم إنجاز نصف المهمة.

الصورةالصورة

بعد ذلك ، كان عليك اختيار فكرة.
1. ضع المصباح الكهربائي خلف الشاشة وقم بتشغيل اللون الخاص به تحت الصورة على الشاشة. لقد رأيت العديد من هذه التلفزيونات.
2. قم بتشغيل لون المصباح في الصباح حسب الطقس.
3. اضبط سطوع الضوء حسب سطوع الشاشة (على سبيل المثال ، ليس ساطعًا تمامًا في الليل). اتضح أنها غير مجدية.
4. ضع المصباح الكهربائي خلف الشاشة وقم بتشغيل الضوء الأحمر عندما تتلامس مع الميمات أثناء التشغيل ، على سبيل المثال.

بدت الفكرة الرابعة مفيدة للغاية. كنا بالفعل اثنين في فريق واندفعنا للقيام بذلك. لقد كتبت الطلب لـ OS X على Swift'e ، وقام أحد الزملاء بتنظيف الفائض من الجزء الشمالي. حول الخادم ، لن أكتب أي شيء آخر ، يمكن رؤية جميع الأشياء المثيرة للاهتمام هنا .

لقد اخترت OS X و Swift ، لأنني أعرف الثاني أكثر أو أقل ، ولكن لأول مرة خدشت يدي لفترة طويلة لكتابة شيء ما ، آمل أن يكون الأمر جيدًا. لذلك ، يجب على التطبيق تتبع المواقع "السيئة" ووضع مصباح كهربائي في الطلاء: قم بتشغيل الضوء الأحمر. لا توجد مثل هذه الميزة المضمنة في اللغة (وجيدة). حسنًا ، لقد ذهبت إلى الخزانة لأطلب من Google .

الصورة

- أريد أن أعرف علامات التبويب المفتوحة في المتصفح باستخدام Swift أو على الأقل Objective-C.
- أعتقد أنك لست بحاجة إليها ، إليك AppleScript.
- رائع ، ولكن ما هو؟
- نصوص مدمجة يمكن أن تتحكم في النظام وتستخدمها عادة للتشغيل الآلي.
- حسنًا ، أخبرني بعد ذلك عن كيفية العثور على علامات التبويب المفتوحة ، على سبيل المثال ، في Safari.
- نعم هنا ( رابط) هناك أيضًا متصفحات أخرى.
- حسنا ، يمكنك بالفعل العمل مع هذا ، شكرا.

غيّر النص قليلاً.

tell application "System Events" to set frontApp to name of first process whose frontmost is true

if (frontApp = "Safari") then
    using terms from application "Safari"
        tell application frontApp to set currentTabUrl to URL of front document
        tell application frontApp to set currentTabTitle to name of front document
    end using terms from
else if (frontApp = "Google Chrome") then
    using terms from application "Google Chrome"
        tell application frontApp to set currentTabUrl to URL of active tab of front window
        tell application frontApp to set currentTabTitle to title of active tab of front window
    end using terms from
else if (frontApp = "Lumen Taba") then
    return 1
else
    return
end if

return currentTabUrl


الآن يبقى لتشغيل هذا الشيء في الخلفية ، والشيء في القبعة.

//run tracker in background mode
let qualityOfServiceClass = QOS_CLASS_BACKGROUND
let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
dispatch_async(backgroundQueue, {
    while !self.needStop {
        self.isRunning = true
        var error: NSDictionary?
        
        //run script
        if let scriptObject = NSAppleScript(source: self.scriptText!) {
            if let output: NSAppleEventDescriptor = scriptObject.executeAndReturnError(
                &error) {
                //if browser is active
                if output.stringValue != nil {
                    
                    //this app is active
                    if (output.int32Value == 1) {
                        continue
                    }
                    
                    //if bad url
                    if self.urlValidator.isUrlStringBanned(output.stringValue!) {
                        
                        //bad url isn't changed
                        if self.lastBadUrl == output.stringValue {
                            continue
                        }
                        
                        self.lastBadUrl = output.stringValue
                        NSNotificationCenter.defaultCenter().postNotificationName("BadUrlIsOpened",
                            object: self.lastBadUrl)
                        continue
                    }
                    
                }
                
                
                //the browser is not active
                //turn off lamp if it was on
                if self.lastBadUrl != nil {
                    self.lastBadUrl = nil
                    NSNotificationCenter.defaultCenter().postNotificationName("BadUrlIsClosed", object: nil)
                }

            } else if (error != nil) {
                print("error")
            }
        }
        sleep(self.CHECK_INTERVAL)
    }
    
    self.isRunning = false
})
الصورة
هذه هي الطريقة التي يتم بها في Swift.

الآن نختبر عنوان url لفساده. تم اختياره لاستخدام تعبيرات regex كقائمة توقف. يكفي المجال فقط وسيتم حظر جميع صفحات الموقع. بالطبع ، من الممكن وجود حالات مختلفة ومختلفة قليلاً حيث سيحتوي موقع آخر على نطاق محظور ، ولكن هنا على الأرجح أنت تفعل شيئًا خاطئًا (لماذا تبحث عن vk.com على Google). تم وضع إضافة مواقع في الإعدادات مع الحفظ في ملف مضمن في التطبيق ، ويبدو التحقق نفسه في الرمز كما يلي:

private func checkUrl(url: NSURL) -> Bool {
    let domain = url.host
    
    //there is no domain
    if (domain == nil) {
        return false
    }
    
    let badRegexes = getBadRegexes()
    for br in badRegexes {
        if matchesForRegexInText(br, text: url.absoluteString) {
            return true
        }
    }
    
    return false
}

private func matchesForRegexInText(regex: String!, text: String!) -> Bool {
    do {
        let regex = try NSRegularExpression(pattern: regex, options: [])
        let nsString = text as NSString
        let results = regex.matchesInString(text,
                                            options: [],
                                            range: NSMakeRange(0, nsString.length))
        return results.count > 0 ? true : false
        
    } catch let error as NSError {
        print("invalid regex: \(error.localizedDescription)")
        return false
    }
}


يمكنك رؤية جميع التعليمات البرمجية في المستودع ، ولكن الآن سأعرض النتيجة النهائية.

الصورة
الصورة



أتطلع إلى التعليقات والأفكار الجديدة ، كم هو رائع استخدام مصباح كهربائي مماثل.

أيضًا ، إذا كنت مهتمًا بمقالة وترغب في الحصول على مثل هذا الموظف ، فإن سيرتي الذاتية هي لك: goo.gl/ppnr6z .

في غضون 14 يومًا من تاريخ نشر هذه المقالة ، يمكنك شراء Lumen Smart Light Bulb بخصم 10٪ باستخدام رمز GEEKT-UL .

Source: https://habr.com/ru/post/ar396195/


All Articles