ter n i m al (لاحظ الإملاء) هو برنامج يرسم شكل حياة متحرك في المحطة باستخدام رموز كتلة Unicode. إنه يعمل في معظم المحاكيات الطرفية ومع معظم الخطوط أحادية.

من منظور عملي ، البرنامج ليس مفيدًا جدًا. ومع ذلك ، فإنه يحتوي على قدر كبير من التكنولوجيا والرياضيات الرائعة:
Ternimal هو أيضا تمرين في الحد الأدنى وضبط النفس. مكتوبة في 1000 سطر فقط من الصدأ ، لا يوجد لديه تبعيات ويستهلك موارد قليلة جدًا: 400 كيلو بايت على القرص و 3 ميغابايت من ذاكرة الوصول العشوائي و 4 ٪ من قلب وحدة المعالجة المركزية واحدة مع المعلمات الافتراضية. وهو ينفذ عمليات الجبر الخطي من الصفر ، وكذلك تحليل سطر الأوامر الأساسي ومولد أرقام عشوائية بسيطة.
لا يوجد لدى Ternimal تبعيات بصرف النظر عن مكتبة Rust Standard ، ولا تتطلب شحنًا للبناء. يجب تثبيت rustc فقط (> = 1.20) ، وفي هذه النقطة يمكن بناء Ternimal مع:
git clone https://github.com/p-e-w/ternimal.git
cd ternimal
rustc -O ternimal.rs
في الأساس ، لا يفعل Ternimal أكثر من لون حقل المسافة من شريحة من المسار المتعرج. هناك العديد من المعلمات التي تتحكم في هذه العملية ، ومع ذلك ، يمكن معالجة جميعها تقريبًا من خلال سطر الأوامر.
هذا يجعل النظام مرنًا جدًا. فيما يلي مجرد أمثلة قليلة لما هو ممكن:
./ternimal length=100 thickness=1,4,1,0,0 radius=6,12 gradient=0:#666600,0.5:#00ff00,1:#003300

يمكن استخدام موجات الجيب لتوليد أشكال عضوية تمامًا. في هذه الحالة ، تشكل نصف الموجة الواحدة جسم الثعبان.
./ternimal length=200 thickness=0,4,19,0,0

Ternimal فقط يجعل نموذج واحد. ومع ذلك ، يمكن أن تعطي اختلافات السماكة ظهور كيانات متعددة غير متصلة تتحرك بطريقة منسقة.
./ternimal length=20 thickness=70,15,0,1,0 padding=10 radius=5 gradient=0.03:#ffff00,0.15:#0000ff,0.3:#ff0000,0.5:#00ff00

تشمل وظيفة السماكة معلمة الوقت. هذا يجعل من الممكن تحديد الرسوم المتحركة الشكل. يمكن تحديد العديد من مصطلحات سلسلة فورييه بشكل تعسفي ، مما يتيح الرسوم المتحركة المعقدة للغاية.
تم تحسين Ternimal بشكل كبير للأداء ، إلى حد أنه في العديد من المواقف ، يكون وقت وحدة المعالجة المركزية اللازمة لإنشاء ناتجه أقل من تلك التي اتخذتها المحاكي الطرفي لعرضها. يتم استخدام الحيل المختلفة لتقليل الحمل الحسابي وحجم الإخراج. في محطة جنوم ، تقدم المعلمات الافتراضية ما يصل إلى 2500 إطار في الثانية.
لقد جربت كل شيء تحت الشمس للضغط على المزيد من الأداء ، مع نتائج مختلطة. بعض المحاولات غير الناجحة/شبه الناجحة تشمل:
f32 بدلاً من f64 . هذا يعطي تسريع من 5 إلى 10 ٪ ، ولكنه يواجه مشاكل دقيقة بعد بضعة أيام. قد يكون من الممكن "إعادة تعيين" الوقت والموضع في فترات منتظمة لتجنب ذلك ، لكن المنطق سيكون معقدًا للغاية.stdout و/أو التخزين المؤقت. على الرغم من أن Ternimal يكتب كمية كبيرة من الإنتاج ، فإن هذا التحسين ينتج فقط في تسريع 1 ٪ مخيبة للآمال وبالتالي تم التخلي عنه.format! من الصعب التغلب على الماكرو لهذا الغرض ، وكان كل بديل جربته إما متساوية أو أبطأ.target-cpu=native . هذا أيضا أعطى أي تحسن ملموس.يكشف التنميط مع Callgrind و Oprofile أن معظم وقت وحدة المعالجة المركزية يقضي في بناء وكتابة سلسلة الإخراج وأن الحسابات التي تجعل فقط تلعب دورًا لنماذج كبيرة جدًا. نظرًا لعدم النجاح في محاولة جعل معالجة الإخراج بشكل أسرع ، يبدو من المعقول أن نقول إن أداء Ternimal مرضي بالفعل.
تم اختبار Ternimal على Linux و MacOS و Windows.
على نظام Linux ، تقدم جميع المحاكيات الطرفية تقريبًا بلا عيب. على MacOS ، ينصح iterm2 أو alacritty. على Windows ، يبدو أن PowerShell و WSL يعملان بشكل جيد ، حيث يعمل Conemu أيضًا ولكنه يفتقر إلى ألوان 24 بت.
على الأرجح لأن محطةك لا تدعم تسلسل الهروب من ألوان RGB 24 بت. وهذا بدوره يعني أنك تستخدم terminal.app 'app ، وهو محاكي الطرفي الرئيسي الوحيد الذي لا يزال يفتقد إلى هذه الميزة.
لديك خياران:
true_color=false للعودة إلى لوحة 256 لونًا ، والتي يدعمها كل محاكي طرفي (ولكن لا تبدو لطيفة).إما لأن أحرف كتلة الخط الخاص بك لا تملأ خلية الأحرف تمامًا ، أو لأن محطة الطرف الخاصة بك لها تباعد خط أكبر من الصفر.
يعمل Ternimal بشكل أفضل مع الخطوط التي لها نسبة عرض إلى حد ما في الحرف القريبة من 2: 1 قدر الإمكان. الخط في screencasts هو iosevka الرائع.
وحدة Linux لا تدعم خطوط Unicode. ومع ذلك ، يبدو أنه يتعرف على ترميز Unicode ، ويحاول ترجمة بعض نقاط رمز Unicode إلى نقاط رمز في الترميز الداخلي ، والذي يتضمن رموز الكتلة التي تتطلبها Ternimal.
يبدو أن هناك خطأ في هذا التحويل. تتم ترجمة حرف بلوك النصف العلوي بشكل صحيح ، لكن كتلة النصف السفلي ليست ، مما يؤدي إلى نمط مخطط.
مثله:

المساهمون دائما موضع ترحيب. ومع ذلك ، يرجى تقديم مشكلة تصف ما تنوي إضافته قبل فتح طلب سحب ، خاصة بالنسبة للميزات الجديدة! لدي رؤية واضحة لما أريد (ولا أريد) Ternimal ، لذلك قد تساعدك مناقشة الإضافات المحتملة على تجنب الازدواجية والعمل الضائع.
من خلال المساهمة ، فإنك توافق على إصدار التغييرات الخاصة بك بموجب نفس الترخيص مثل بقية المشروع (انظر أدناه).
حقوق الطبع والنشر © 2017 Philipp Emanuel Weidmann ([email protected])
تم إصداره بموجب شروط رخصة GNU العامة ، الإصدار 3