Ter n i m al (perhatikan ejaan) adalah program yang menarik bentuk hidup animasi di terminal menggunakan simbol blok unicode. Ini bekerja di sebagian besar emulator terminal dan dengan sebagian besar font monospaced.

Dari perspektif praktis, program ini tidak terlalu berguna. Namun, itu mengandung sedikit teknologi dan matematika yang keren:
Ternimal juga merupakan latihan minimalis dan pengekangan. Ditulis hanya dalam 1000 baris karat, ia tidak memiliki dependensi dan mengkonsumsi sangat sedikit sumber daya: 400 kb pada disk, 3 MB RAM dan 4 % dari inti CPU tunggal dengan parameter default. Ini mengimplementasikan operasi aljabar liniernya sendiri dari awal, serta parsing baris perintah dasar dan generator bilangan acak sederhana.
Ternimal tidak memiliki ketergantungan selain dari perpustakaan standar karat, dan tidak memerlukan kargo untuk membangun. Hanya rustc (> = 1.20) yang harus dipasang, di mana titik ternimal dapat dibangun dengan:
git clone https://github.com/p-e-w/ternimal.git
cd ternimal
rustc -O ternimal.rs
Pada dasarnya, Ternimal tidak lebih dari mewarnai bidang jarak dari segmen jalur yang berkelok -kelok. Ada banyak parameter yang mengendalikan proses ini, namun, hampir semuanya dapat dimanipulasi melalui baris perintah.
Ini membuat sistem ini sangat fleksibel. Berikut ini hanyalah beberapa contoh dari apa yang mungkin:
./ternimal length=100 thickness=1,4,1,0,0 radius=6,12 gradient=0:#666600,0.5:#00ff00,1:#003300

Gelombang sinus dapat digunakan untuk menghasilkan bentuk yang cukup organik. Dalam hal ini, satu gelombang setengah membentuk tubuh ular.
./ternimal length=200 thickness=0,4,19,0,0

Ternimal hanya membuat model tunggal. Namun, variasi ketebalan dapat memberikan penampilan beberapa entitas terputus bergerak dengan cara yang terkoordinasi.
./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

Fungsi ketebalan mencakup parameter waktu. Ini memungkinkan untuk mendefinisikan animasi bentuk. Secara sewenang -wenang banyak istilah seri Fourier dapat ditentukan, memungkinkan animasi yang sangat kompleks.
Ternimal sangat dioptimalkan untuk kinerja, sejauh dalam banyak situasi, waktu CPU yang diperlukan untuk menghasilkan outputnya kurang dari yang diambil oleh emulator terminal untuk menampilkan hal yang sama. Berbagai trik digunakan untuk meminimalkan beban komputasi dan ukuran output. Di terminal GNOME, parameter default membuat hingga 2500 frame per detik.
Saya telah mencoba semuanya di bawah matahari untuk memeras lebih banyak kinerja, dengan hasil yang beragam. Beberapa upaya yang gagal/semi-sukses meliputi:
f32 sebagai pengganti f64 . Ini memberikan speedup 5-10 %, tetapi mengalami masalah presisi setelah beberapa hari. Dimungkinkan untuk "mengatur ulang" nilai waktu dan posisi secara berkala untuk menghindari ini, tetapi logikanya akan sangat kompleks.stdout secara manual dan/atau buffering. Meskipun Ternimal menulis sejumlah besar output, optimasi ini hanya dihasilkan dalam speedup 1 % yang mengecewakan dan karenanya ditinggalkan.format! Makro sulit dikalahkan untuk tujuan ini, dan setiap alternatif yang saya coba sama atau lebih lambat.target-cpu=native . Ini juga tidak memberikan peningkatan yang terukur.Profil dengan Callgrind dan Oprofile mengungkapkan bahwa sebagian besar waktu CPU dihabiskan untuk membangun dan menulis string output dan bahwa rendering komputasi hanya memainkan peran untuk model yang sangat besar. Mengingat kurangnya keberhasilan mencoba membuat penanganan output lebih cepat, tampaknya masuk akal untuk mengatakan kinerja Ternimal sudah cukup memuaskan.
Ternimal telah diuji di Linux, MacOS, dan Windows.
Di Linux, hampir semua emulator terminal membuat ternimal dengan sempurna. Pada macOS, ITERM2 atau Alacritty direkomendasikan. Di Windows, PowerShell dan WSL tampaknya bekerja dengan baik, dengan Conemu juga bekerja tetapi tidak memiliki warna 24-bit.
Kemungkinan besar karena terminal Anda tidak mendukung urutan pelarian warna RGB 24-bit. Ini pada gilirannya mungkin berarti bahwa Anda menggunakan terminal default macOS.app, yang merupakan satu -satunya emulator terminal utama yang masih kehilangan fitur itu.
Anda memiliki dua opsi:
true_color=false untuk kembali ke palet 256 warna, yang didukung oleh hampir setiap emulator terminal (tetapi tidak terlihat bagus).Baik karena karakter blok font Anda tidak sepenuhnya mengisi sel karakter, atau karena terminal Anda memiliki jarak garis lebih besar dari nol.
Ternimal bekerja paling baik dengan font yang memiliki rasio aspek karakter sedekat mungkin dengan 2: 1. Font di screencasts adalah iosevka yang indah.
Konsol Linux tidak mendukung font Unicode. Namun, tampaknya mengenali pengkodean unicode, dan berupaya menerjemahkan titik kode unicode tertentu ke titik -titik kode dalam pengkodean internalnya, yang mencakup simbol blok yang diperlukan oleh ternimal.
Tampaknya ada bug dalam konversi ini. Karakter setengah blok atas diterjemahkan dengan benar, tetapi setengah blok bawah tidak, menghasilkan pola bergaris.
Seperti ini:

Kontributor selalu diterima. Namun, silakan ajukan masalah yang menggambarkan apa yang ingin Anda tambahkan sebelum membuka permintaan tarik, terutama untuk fitur baru! Saya memiliki visi yang jelas tentang apa yang saya inginkan (dan tidak mau) ternimal, jadi mendiskusikan potensi penambahan dapat membantu Anda menghindari duplikasi dan pekerjaan yang terbuang.
Dengan berkontribusi, Anda setuju untuk melepaskan perubahan Anda di bawah lisensi yang sama dengan sisa proyek (lihat di bawah).
Hak Cipta © 2017 Philipp Emanuel Weidmann ([email protected])
Dirilis di bawah ketentuan Lisensi Publik Umum GNU, Versi 3