Back home

الفنون رقم 002

الفنون رقم 002

ARTS هو نشاط بدأه 由左耳朵耗子--陈皓: قم بإجراء سؤال واحد على الأقل عن خوارزمية leetcode كل أسبوع، واقرأ مقالًا تقنيًا واحدًا على الأقل باللغة الإنجليزية وعلق عليه، وتعلم مهارة فنية واحدة على الأقل، وشارك المقالة مع الآراء والأفكار. (أي أن الخوارزمية والمراجعة والنصائح والمشاركة يشار إليها باسم ARTS) وتستمر لمدة عام واحد على الأقل.

فنون 002

هذه هي المقالة الثانية، وهي سيئة الكتابة نسبيا. وآمل أن تصبح أفضل وأفضل في المستقبل.

سؤال خوارزمية الخوارزمية

سؤال خوارزمية leetcode 242 الجناس الناقص صالح (تحقق مما إذا كان الجناس الناقص)

Given two strings s and t , write a function to determine if t is an anagram of s.
Example 1:
Input: s = "anagram", t = "nagaram"
Output: true
Example 2:
Input: s = "rat", t = "car"
Output: false
Note:
You may assume the string contains only lowercase alphabets.

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram"
输出: true
示例 2:
输入: s = "rat", t = "car"
输出: false
说明:
你可以假设字符串只包含小写字母。

الفكرة الأولية هي الفرز أولاً ثم المقارنة، أي فرز السلسلتين أولاً، ثم مقارنة ما إذا كانتا متساويتين. طريقة التحقق هذه هي الأكثر كفاءة. يمكنك استخدام الفرز الفقاعي، وفرز التحديد، وفرز الإدراج، وما إلى ذلك عند الفرز. على الرغم من أن تعقيد خوارزميات الفرز الثلاثة هذه هو O(n<sup>2</sup>)، فقد وجد الاختبار أنه عندما تكون كمية البيانات كبيرة، يكون فرز الإدراج أسرع بكثير من الخوارزميتين الأخريين، وهو ليس بنفس الترتيب من حيث الحجم. تنفيذ فرز الإدراج كما يلي:

char* insertionSort(char* str) {
    for (int j = 1; j < strlen(str); j++) {
        char *insertionChar = str + j;
        char iChar = *insertionChar;
        char * compareChar = insertionChar;
        
        for (int i = j-1; i >=0; i--) {
            if (iChar < *(str + i)) {
                compareChar = str + i;
                *(compareChar +1) = *compareChar;
            }
            else{
                break;
            }
        }
        *compareChar = iChar;
    }
    return str;
}

bool isAnagram(char* s, char* t) {
    if (strlen(s) != strlen(t)){
        return false;
    }
    char *s1 = insertionSort(s);
    char *s2 = insertionSort(t);
    
    if (strcmp(s1,s2)) {
        return false;
    }
    else{
        return true;
    }
}

ولكن لا يمكن تمريره على الإطلاق في leetcode. يبلغ طول سلسلة بيانات الاختبار على leetcode 100 كيلو بايت. لقد قمت بقياسه محليًا واستغرق الأمر ما يقرب من 20 ثانية باستخدام فرز الإدراج. ولكن إذا استخدمت فرز الفقاعات والاختيار، فقد استغرق الأمر أكثر من ساعة للانتهاء.

إذا لم تنجح هذه الطريقة، يمكنك تجربة فكرة أخرى. يمكنك حساب ما إذا كانت أنواع الأحرف والأرقام الموجودة في السلسلة متساوية. على سبيل المثال، تحتوي السلسلة s على 10 أحرف a، و5 أحرف b، و8 أحرف k. إذا كان الأمر نفسه صحيحًا بالنسبة للسلسلة t، فإن s عبارة عن الجناس الناقص لـ t. نفذت على النحو التالي

bool isAnagram(char* s, char* t) {
    if (strlen(s) != strlen(t)){
        return false;
    }

    int af[26]= {0};
    while (*s) {
        af[*s++ - 'a']+=1;
    }
    while (*t) {
        af[*t++  - 'a']-=1;
    }
    
    for (int i = 0; i<26; i++) {
        if (af[i] != 0) {
            return false;
        }
    }
    return true;
}

عند تنفيذ ذلك، يتم استخدام مصفوفة واحدة فقط بدلاً من مصفوفتين لحساب عدد الأحرف التي تظهر في سلسلتين على التوالي. يمكن أن يؤدي هذا إلى تجنب المواقف خارج الحدود بسبب حدوث عدد كبير جدًا من شخصية معينة.

مراجعة

المقالة التالية تأتي من: https://littlebitesofcocoa.com/251-face-aware-image-views-with-aspectfillfaceaware;. يتحدث عن استخدام Sidefillfaceaware لإدراك أنه عند تعيين صورة لـ imageView، إذا كانت الصورة تحتوي على وجه، فيمكن عرض الوجه تلقائيًا في المركز.

طرق عرض الصور Face Aware باستخدام AspectFillFaceAware (استخدم AspectFillFaceAware للسماح لـ imageView بالتعرف على الوجوه)

عند استخدام UIImageViews، قد تؤدي أوضاع المحتوى المضمنة في بعض الأحيان إلى تضييق أسلوبنا.

عند استخدام UIImageViews، أحيانًا ما يدمر وضع المحتوى المدمج أسلوبنا ولا يمكنه تلبية احتياجاتنا.

في كثير من الأحيان، نعرض صور الأشخاص. في هذه الحالات، سيكون من الرائع أن يتم توجيه عرض الصورة بطريقة ما لقص الصورة حول وجه الشخص بذكاء.

في كثير من الأحيان، نعرض صور الأشخاص. في هذه الحالات، سيكون من الرائع أن يتمكن عرض الصورة من قص الصورة حول وجه الشخص بطريقة ذكية.

سنتعرف اليوم على مكتبة من Beau Nouvelle تسمى AspectFillFaceAware. الأمر بسيط للغاية، دعونا نلقي نظرة.

سنلقي اليوم نظرة على مكتبة صفية من Beau Nouvelle تسمى AspectFillFaceAware. انها بسيطة جدا، دعونا نلقي نظرة.

AspectFillFaceAware هو في الأساس مجرد امتداد لـ UIImageView. فهو يوفر طريقتين لتكوين طريقة عرض الصورة لتكون “مدركة للوجه”.

AspectFillFaceAware هو في الأساس مجرد امتداد لـ UIImageView. يوفر طريقتين لتكوين عرض الصورة لـ “التعرف على الوجه”.

الأول في Interface Builder، يمكننا تمكين الميزة عن طريق النقر على الميزة في المفتش. (ألا ترى الخيار؟ قم بتشغيل مشروعك مرة واحدة، ثم يجب أن يظهر).

الطريقة الأولى هي في Interface Builder، حيث يمكننا تمكين الميزة من خلال التنقل بين الميزات في المفتش. (ألا ترى الخيار؟ قم بتشغيل مشروعك مرة واحدة وسيظهر).

<img src=“/img/15334638167496.jpg” width=“50%” height=“50%” /> وهنا كيف يبدو:

يمكننا أيضًا تمكين الوظيفة في التعليمات البرمجية عن طريق تعيين صورة عرض الصورة باستخدام هذه الوظيفة الجديدة:

يمكننا أيضًا استخدام هذه الميزة الجديدة من خلال الكود:

imageView.set(الصورة: الصورة الرمزية، focusOnFaces: صحيح) يمكننا أيضًا وضع نصف قطر زاوية سريع على طبقة عرض الصورة لتجربة وظيفة “التعرف على الوجه” في عرض دائري. (أي الصور الرمزية للمستخدم):

يمكننا أيضًا وضع نصف قطر زاوية سريع على طبقة عرض الصورة لتجربة ميزة “التعرف على الوجه” في العرض الدائري. (أي الصورة الرمزية للمستخدم):

دع نصف القطر = imageView.bounds.size.width / 2.0 imageView.layer.cornerRadius = radius

تحت الغطاء، تستخدم المكتبة CIDetector منخفض الدقة مع نوع CDetectorTypeFace للتعامل مع اكتشاف الوجه الفعلي. هل تريد الغوص بشكل أعمق هنا؟ لقد قمنا بتغطية أجهزة كشف CI في اللدغة رقم 87.

تحت الغطاء، تستخدم المكتبة CIDetector منخفض الدقة من النوع CIDetectorTypeFace للتعامل مع اكتشاف الوجه الفعلي. هل تريد التعمق أكثر؟ لقد قدمنا نهج CIDetectors في اللدغة رقم 87.

نصيحة

قدّم طريقة استخدام Proxifier وshadowsocks لتحقيق الوصول الثانوي إلى الإنترنت بواسطة الوكيل. تحتاج بعض الشركات إلى المرور عبر وكيل للوصول إلى الإنترنت. في هذه الحالة، لا يمكننا استخدام Shadowsocks للوصول إلى الإنترنت من خلال وكيل. على سبيل المثال، تستخدم الشركة التي أعمل بها حاليًا وكيلًا للوصول إلى الإنترنت. إذا كنت تريد الوصول إلى الشبكة الخارجية، فيجب عليك وكيل خادم الشركة للوصول إلى الإنترنت. في هذه الحالة، لن ينجح استخدام Shadowsocks مباشرة. هل من الممكن إيجاد طريقة للسماح لـ Shadowsocks باستخدام الوكيل أيضًا؟ لذلك وجدت برنامج Proxifier. Proxifier، وظيفة هذه الأداة هي تولي جميع الطلبات الصادرة عن جميع التطبيقات قيد التشغيل، ومن ثم يمكنك التحكم فيما إذا كان التطبيق يستخدم وكيلاً، بحيث يمكن للتطبيقات التي لا تدعم الوكيل أيضًا استخدام وكيل. في الأصل، يصل عميل ss (shadowsocks) مباشرة إلى خادم وكيل ss. من خلال Proxifier، يمكن التحكم في عميل SS للانتقال إلى وكيل الشركة أولاً، ثم إلى خادم وكيل SS. العملية العامة هي كما يلي

  • عملية الإعداد هي كما يلي: افتح Proxifier، وحدد علامة التبويب “الوكلاء” لتعيين وكيل HTTP الخاص بالشركة ووكيل Socks5 المحلي:

يمكن فتح المنفذ 127.0.0.1 لعرض التكوين المتقدم لـ ShadowSocks. عند بدء تشغيل عميل ShadowSocks، ستجد أن Proxifier يلتقط تلقائيًا التطبيق المسمى ss-local، وهو عميل SS الذي يفتحه ShadowSocks، ويقوم بتعيين قواعد الوكيل الخاصة به على وكيل الشركة الذي تم إنشاؤه مسبقًا: ثم اسمح لـ Localhost وDefault بالانتقال إلى ss-local (آخر عنصرين في الصورة).

يمكنك أن ترى أن التكوينات الثلاثة الأولى هي مباشرة. يمكن إعداد بعض مواقع الويب أو التطبيقات التي لا تتطلب وكيلًا بهذه الطريقة. إذا وجدت أن بعض التطبيقات تواجه مشكلات بعد تمكين Proxifier، فمن المحتمل أن يكون السبب هو الوكيل. على سبيل المثال، بعد تشغيل Proxifier، وجدت أنه كان متوقفًا عند استخدام Xcode لتشغيل برنامج C. لاحقًا، اكتشفت أنه عندما يقوم Xcode بتشغيل برنامج C، فإنه سيبدأ تلقائيًا خدمة محلية لخادم تصحيح الأخطاء. منذ أن قمت بتعيين الوكيل الافتراضي، لم تتمكن الخدمة من الاتصال بشكل طبيعي. لقد قمت بتغيير خادم تصحيح الأخطاء إلى Direct ويمكن تشغيله بشكل طبيعي. يمكنك أن ترى أن Proxifier يمكنه تحديد ما إذا كان اسم التطبيق يستخدم وكيلاً مباشرةً أو ما إذا كان عنوان IP معين يستخدم وكيلاً. إنها بالفعل مريحة جدًا للاستخدام.

المادة المرجعية: http://www.devtalking.com/articles/shadowsocks-guide/ http://blackwolfsec.cc/2016/09/19/Proxifier_Shadowshocks/ https://github.com/cyfdecyf/cow/blob/master/doc/sample-config/rc https://www.latoooo.com/xia_zhe_teng/179.htm http://haoweiguang.me/2017/05/08/Mac下shadowsocks全自动地代理翻墙/ https://blog.e9china.net/tufan/macshanganzhuangcowproxyfanqiangjiaocheng.html

شارك

لقد قمت مؤخرًا بتغيير شركة، وهي شركة ذات عمل إضافي جاد. عندما أتيت إلى هنا لأول مرة، كنت أرغب دائمًا في المغادرة، ولكن بعد التفكير في الأمر، قررت عدم المغادرة. الشركة التي يمكن أن تكون كبيرة جدًا (سمعت أن هناك ما يقرب من 20000 شخص يعملون في مجال البحث والتطوير) يجب أن يكون لديها شيء يستحق التعلم، لذلك قررت الهدوء والدراسة. أما بالنسبة للعمل الإضافي، فيمكنك التعلم وتحسين نفسك أثناء العمل الإضافي. القدرة، السبب الذي دفعني إلى الانضمام إلى هذه الشركة ليس لأن مستواي الفني ليس جيدًا بما فيه الكفاية، لذلك يجب علي تحسين نفسي في أسرع وقت ممكن. لا أعرف أين رأيت جملة: «يجب أن تتحمل الأمر أو تخرج من هنا».

في الواقع، أشياء كثيرة هي من هذا القبيل. عندما لا تكون قدرتك جديرة بطموحك، ما عليك فعله هو تحسين قدرتك بدلاً من الشكوى من البيئة.