IRO UTSUSHI
تطبيق لا يطلب منكم أبدًا تسمية شعوركم بالكلمات. أسقطوا اللون على الماء، وحرّكوه بإصبعكم، وستبقى حركة يدكم كصورة واحدة.
متوفر على App Storeما الذي يمكن للتطبيق فعله
- أسقطوا اللون وحرّكوه … أسقطوا حتى خمسة ألوان من لوحة تضم ستة ألوان على الماء، وامزجوها بإصبعكم لتكوّن صورة واحدة. يمكن التبديل بين اللوحتين، «ألوان هادئة» و«ألوان زاهية»، حتى بعد إسقاط اللون.
- بلا كلمات ولا تصنيفات … لا توجد قائمة حالات مزاجية للاختيار من بينها، ولا تُضاف أي تسمية لاحقًا. كل ما يتبقى هو أثر اللون وحركة الإصبع.
- حتى 60 ثانية لكل تسجيل … يُعلَن عن اقتراب النهاية بموجات وتوهج وصوت. ولا يُستخدم الاهتزاز أبدًا للتعجيل.
- أربعة مقاييس للحركة … السرعة (الوسيط للسرعة اللحظية)، والانتشار (متوسط المسافة من مركز الثقل)، والتغيّر (عدد مرات تغيير الاتجاه إضافة إلى تشتت السرعة)، والديناميكية. تكون هذه المقاييس مخفية افتراضيًا في شاشة النتيجة: فتطبيق يرفض تصنيف المشاعر لا ينبغي أن يبدأ بعرض نتيجة رقمية.
- إعادة التشغيل … تُعاد بناء الماء من تسلسل اللمسات المحفوظ وتُعاد تشغيله بسرعة ×1 أو ×2، مع إمكانية التقديم والرجوع. يمكن رسم مسار إصبعكم ونقاط اللمس فوق الماء.
- التصدير والمشاركة … التصدير كملف MP4 بمعدل 30 إطارًا في الثانية مع الصوت، أو كملف PNG. يمكن تصفح السجل بالتمرير لأعلى ولأسفل، وحذف عدة تسجيلات دفعة واحدة.
- الصوت يُنشأ داخل التطبيق … يتحول مكان اللمس إلى نغمة في سلم خماسي، وتتحول سرعة الحركة إلى مستوى الصوت وسطوع النغمات التوافقية. تتوفر خمسة أصوات: مفاتيح ناعمة، وكاليمبا، وهارب، ووسادة أوتار، وهارمونيكا زجاجية.
- إمكانية الوصول وعشر لغات … صُمم مع مراعاة مستخدمي ضعف البصر بشكل أساسي، مع دعم النص الديناميكي (Dynamic Type)، وVoiceOver، و«زيادة التباين»، و«تقليل الشفافية»، و«تقليل الحركة». متوفر باليابانية والإنجليزية والإسبانية والفرنسية والكورية والصينية التقليدية والبرتغالية البرازيلية والألمانية والإيطالية والفيتنامية.
كيف تم بناؤه
| التطبيق | Swift + SwiftUI، مكتوب كحزمة تطبيق (App Package) لـ Swift Playgrounds، دون أي اعتماد على حزم خارجية. |
|---|---|
| الماء | محاكاة موائع مكتوبة بلغة Metal. تعمل جميع العمليات — حقل السرعة، وإسقاط الضغط، والحمل، وتقييد الدوامية، ومزج الأصباغ — على وحدة معالجة الرسوميات (GPU). |
| الصبغة | تُحفظ كجسيمات لاغرانجية وتُطبَّق طبقاتها بالمزج الطرحي وفق قانون بير-لامبرت. ولأنها جسيمات، فهي لا تتلاشى بالانتشار مع مرور الوقت. |
| المظهر | يُرسم الانكسار والانعكاسات اللامعة من المتجهات العمودية المشتقة تحليليًا من حقل ارتفاع الماء، مع إضافة ضوضاء حبيبية وتنقيط لتجنب ظاهرة التبقيع اللوني. |
| الإدخال | يُؤخذ من أحداث UIKit الخام، مع تمرير كل اللمسات المُجمَّعة ضمن الإطار الواحد إلى المحاكاة. تُسجَّل حتى خمس لمسات متزامنة وتُعاد تشغيلها وتُقاس كضربات مستقلة، ضربة واحدة لكل إصبع. |
| التخزين | تحتوي قائمة السجل على معلومات خفيفة فقط بصيغة JSON؛ والصورة هي ملف PNG واحد؛ وتسلسل اللمسات بيانات ثنائية ذات عرض ثابت مضغوطة بخوارزمية LZFSE، ضمن مجلد خاص بكل تسجيل. |
| إعادة التشغيل والتصدير | تُعاد بناء الماء بإعادة تشغيل المحاكاة من الخطوات المحفوظة. ملف MP4 ليس تسجيلًا للشاشة: بل تُعاد تركيب الإطارات من تلك الخطوات وتُكتب بمعدل 30 إطارًا في الثانية. |
| الصوت | يُركَّب داخل التطبيق، بسلم خماسي يدعم حتى 16 صوتًا في آنٍ واحد. لا توجد ملفات صوتية. |
| الفحوصات الذاتية | نظرًا لتعذر استضافة XCTest في هذه البيئة، تُشغَّل بدلاً منه مجموعة فحوصات مكتوبة خصيصًا لهذا التطبيق (SelfChecks.swift) عند التشغيل في وضع التصحيح. |
| التشفير | لا يُستخدم إطلاقًا؛ ويُرفَق مع التطبيق رد الامتثال لضوابط التصدير (export compliance). |
الجوانب المثيرة تقنيًا
يستمر الذيل بالالتفاف بعد مرور إصبعكم
يتضمن الحمل تصحيح MacCormack، الذي يحافظ على الدوامات الرفيعة التي يمحوها الحمل شبه اللاغرانجي البسيط. الإصبع لا يدفع الماء، بل يُسقط زوجًا من الدوامات المتعاكسة الدوران على طول اتجاه السحب، لذا يستمر الماء بالالتفاف لبعض الوقت بعد مرور الإصبع. تُعبَّر جميع معاملات التخامد والمتابعة «بالثانية»، لذا تبدو الحركة متطابقة سواء على جهاز بمعدل 60 هرتز أو 120 هرتز.
فصل «الموجة المرئية» عن «الموجة التي تحرك الأشياء»
قوة الموجة المرئية وتأثيرها على الصبغة مُعاملان منفصلان. والموجة تحرك موضع الصبغة مباشرة، لا سرعتها. تُسحَب سرعة الصبغة في كل إطار نحو سرعة تيار الماء — بثابت زمني يبلغ نحو 0.36 ثانية في المناطق الكثيفة — بينما تعيش الموجة مدة أقصر من ذلك، لذا أظهرت القياسات أن إضافة السرعة بالكاد كانت تحرك الصبغة. بهذا لم يعد ضبط المظهر وضبط الإحساس يُفسد أحدهما الآخر.
قرار عدم جعل الأصباغ تتجاذب
كانت هناك سابقًا قوة «تماسك» تجمع الصبغة معًا، لكن المكان الوحيد الذي كانت تستقر فيه كان كتلة دائرية: فمع مرور وقت كافٍ كان الماء يمتلئ بدوائر معتمة لا تنفصل مجددًا أبدًا. أما الآن، فيُعاد إنتاج تغميق حواف الألوان المائية دون تحريك أي صبغة. يبقى حقل الكثافة كما هو، ويُرسم الحد منه كتظليل على سطح الماء، بحيث لا شيء في الصورة يتجمد.
التسجيل نفسه يُعاد تشغيله دائمًا كالصورة نفسها
المحاكاة ثابتة عند 60 خطوة في الثانية، ويحفظ كل تسجيل بجانبه أرقام الخطوات الفعلية التي استُهلك عندها إدخال UIKit، وعدد خطوات البداية التمهيدية، وطوابع زمنية من نوع Float32 مع إحداثيات من نوع UInt16.
تعتمد إعادة التشغيل على هذه الخطوات المحفوظة بدلًا من وقت الساعة الجدارية. وتُقاس السرعة استنادًا إلى UITouch.timestamp، لأن الحركات ضمن الإطار الواحد لا يمكن تمييزها بوقت الساعة الجدارية.
تُستخدم اللمسات المتوقَّعة فقط لتقدير السرعة، ولا تؤثر أبدًا في موضع الصبغة.
علاوة على ذلك، يوجّه SimulationEngineRegistry كل قيمة simulationVersion محفوظة صراحةً إلى المحرك المطابق لها.
الإصدار 6 مجمَّد بالكامل، بثوابته وساعته ومعدل انتقال الحبر فيه، ولا يُمرَّر أي إصدار مستقبلي غير معروف بصمت إلى أحدث محاكاة.
والهدف هو ألا تُعاد صياغة صورة تسجيل قديم إلى شيء آخر بفعل تحديث للتطبيق.
عدم إظهار النتيجة الرقمية أولًا
لا تُقتطَع المقاييس الأربعة عند سقف معيّن؛ بل تقع على منحنى يقترب تدريجيًا من 100، بحيث لا تمنح حركة سريعة واحدة العلامة الكاملة. ومع ذلك، تبقى مخفية افتراضيًا في شاشة النتيجة. فإذا بدأ تطبيق يرفض تصنيف المشاعر بكلمات بعرض الأرقام أولًا، ستصبح تلك الأرقام مجرد تسمية جديدة.
الخصوصية والتواصل
يحفظ IRO UTSUSHI تسجيلاتكم على جهازكم فقط. لا يحتوي على تسجيل حساب، ولا إعلانات، ولا أدوات تحليل، ولا أي ميزات لتتبع المستخدمين. للتفاصيل، راجعوا سياسة خصوصية IRO UTSUSHI.
لإبداء الآراء أو الإبلاغ عن الأخطاء، يمكنكم أيضًا التواصل معنا عبر صفحة الدعم الخاصة بـ Sizu dev.