تطبيق أندرويد
بابان من الهاتف، خادمك أنت أو مستودع خاصّ على GitHub: وورقة المشاركة التي تلتقط إلى الخزانة، والتحديثات، وما لا يفعله عن قصد.
أسطرلاب لأندرويد ملف APK على صفحة الإصدارات. وهو باب إلى الخزانة التي تحفظها أصلًا: تلك التي يخدمها خادمك أنت، أو تلك التي تعيش في مستودع خاصّ على GitHub. للتطبيق شاشتان من عنده، شاشة اتصال وورقة التقاط، وبعد الأولى منهما يسلّم الشاشة كلها إلى غرفة القراءة، ملء الشاشة. وكل ما تعرفه عن أسطرلاب على الحاسوب المحمول هو نفسه هنا، لأنه هو نفسه: عميل الويب يرتّب نفسه أصلًا لليد — شاشات، وشريط من خمسة أبواب، وأوراق، وأهداف بحجم الإبهام — ويقرأ العربية من اليمين، والتطبيق لا يشحن شيئًا من ذلك مرتين.
ما هو
يفتح التطبيق بابًا من بابين، وأنت تختار أيّهما على شاشته الأولى.
خادمك أنت. لا يحمل الهاتف خزانة ولا مستودعًا ولا نسخة عمل. بل يقرأ ويكتب عبر واجهة HTTP البرمجية نفسها التي يستخدمها عميل الويب، وبكعكة الجلسة نفسها، فكل سؤال عمّا يحدث حين يحرّر مكانان ملاحظة واحدة له الجواب الذي يعطيه الخادم دائمًا: الحفظ الذي كان سيكتب فوق نسخة لم ترها يُرفض ولا يُدمج، تمامًا كما في المتصفح (حين يتغير الملف من تحتك). والنسخ الاحتياطي والمزامنة عمل الخادم ويبقى عنده. وهذا هو الباب الذي بُني التطبيق من أجله، وهو الباب الذي تستعمله إن كنت تشغّل نسخة؛ وللغلاف عمل واحد: ألا يفتح إلا العنوان الذي أعطيته إياه، وكل رابط آخر في ملاحظاتك يذهب إلى متصفح الهاتف.
مستودع خاصّ على GitHub، لمن لا يشغّل خادمًا أصلًا. تُنسخ الخزانة إلى تخزين التطبيق نفسه، وتُقرأ وتُكتب هناك، ثم تُدفع راجعةً؛ والقسم أدناه عن ذلك. وهي نسخة حقيقية من ملاحظاتك تحتها git، وهو ما رفضته النسخة الأولى من هذا التطبيق عن قصد؛ والذي تغيّر هو الصحبة التي تصحبها تلك النسخة. فالرفض كان عن نسخة على الهاتف تعيش إلى جانب خادم حيّ يكتب الخزانة نفسها، حيث تكون نسخة عمرها أسبوع تستيقظ في جيب تعارضَ دمج داخل نثر أحدهم يحلّه هاتف. أمّا خزانة GitHub فلا خادم حيّ لها: الكاتب الآخر الوحيد حاسوبك المحمول أنت، عبر git، وهو الترتيب الذي يعيشه أصلًا كلّ من يحفظ ملاحظاته في مستودع. وتشغيل الخادم نفسه على الهاتف مرفوض إلى اليوم، لحقيقة لا لتفضيل: أسطرلاب يحتاج Node حديثًا، وليس في الهواتف واحد.
الاتصال
- افتح التطبيق واكتب عنوان خادمك:
notes.example.com، أو192.168.1.24:6801. الاسم المجرد يُحمل علىhttps؛ والعنوان في شبكتك الخاصة (10.xو192.168.xو172.16–31.xو*.localو*.lanوlocalhost) يُحمل علىhttp. وكتابة البروتوكول بيدك تغلب دائمًا. - يفحص التطبيق العنوان قبل أن يذهب إلى أي مكان، فالخطأ الإملائي جملة على هذه الشاشة لا صفحة فارغة.
- ويتذكر ما نجح. فالتشغيل التالي يعيد الاتصال من غير نقرة؛ وإيماءة الرجوع من أول صفحة في نسختك تعيدك إلى هنا لتختار خادمًا آخر، والرجوع من هنا يخرج من التطبيق.
- سجّل الدخول على شاشة تسجيل الدخول الخاصة بنسختك، مرة واحدة. وتبقى الجلسة؛ فخادمك يمنحها عمرًا منزلقًا من سبعة أيام، فالكاتب الذي يفتح التطبيق في معظم الأيام لا يلقى شاشة تسجيل الدخول مرة أخرى.
ملاحظاتك وسمتك ولغتك وكل شيء آخر ملك النسخة؛ والتطبيق لا يغيّر شيئًا منها. وأشرطة النظام (شريط الحالة في الأعلى وشريط الإيماءات في الأسفل) يبعدها التطبيق نفسه عن الصفحة، ولوحة المفاتيح تغيّر حجم الصفحة بدل أن تغطيها.
مغادرة الخزانة
طريقتان إلى شاشة الاتصال من أيّ خزانة. المزيد ← غيّر الخادم أو الخزانة… (وعلى شاشة بعرض سطح المكتب ⋯ ← غيّر الخادم أو الخزانة… في الشريط السفلي)، ولا يعرضه عميل الويب إلا داخل هذا التطبيق، يأخذك إليها مباشرة: لتكتب عنوانًا آخر، أو تختار عنوانًا محفوظًا، أو تفتح خزانة من GitHub. وإيماءة الرجوع، بعد أن تمشي عائدةً في كل ما كان للخزانة أن تعود إليه، تصل إليها أيضًا. أما تسجيل الخروج من النسخة فلا يفعل ذلك: تكون قد خرجت من ذلك الموقع وما زلت تنظر إليه، وهذا معنى تسجيل الخروج؛ والباب هو الصف أعلاه.
خزانة من GitHub
اختر أو افتح خزانة من GitHub على الشاشة الأولى. يعرض التطبيق رمزًا قصيرًا، فتكتبه في github.com/login/device في أيّ متصفّح، متصفّح الهاتف نفسه أو الحاسوب الذي أنت مسجَّل الدخول فيه أصلًا، وتوافق هناك. ولا يسألك شيء عن كلمة مرور GitHub، ولا يحمل التطبيق سرًّا من عنده: هذا هو تدفّق الأجهزة من GitHub، المصمَّم لجهاز لا يستطيع حفظ سرّ بأمان. ويطلب إذنًا واحدًا، قراءة مستودعاتك والكتابة فيها، وهو أضيق نطاق يبلغ مستودعًا خاصًّا. ولك أن تسحبه متى شئت من صفحة التطبيقات في حسابك على GitHub.
ثمّ اختر المستودع الذي فيه ملاحظاتك، والفرع. ينسخه التطبيق إلى تخزينه الخاصّ، أحدثَ إيداع فقط لا التاريخ كلّه، لأنّ خزانة وراءها خمس سنوات دقيقةُ شبكة لم تطلبها، ثمّ يفتح غرفة القراءة عليها. وهو عميل الويب نفسه الذي تستعمله على الحاسوب: المحرّر والوصلات والمخطط والبحث والوسوم والخصائص والمدارات والسِّجِلّ والمتتبّعات والتقويم. وكلّ شيء على الجهاز، فيفتح ويبحث من غير شبكة البتّة.
ما الذي يسافر، ومتى
فتح التطبيق يسحب، والعودة إليه تسحب مرّة أخرى، وسحبُ قائمة في الملاحظات إلى الأسفل من أعلاها يسحب في الحال — فالإيماءة التي تعني «حدِّث» في كلّ تطبيق هاتف هي في هذا التطبيق زامِن الآن. وكلّ حفظ إيداع واحد باسم الملاحظة. والدفع محبوس نصف دقيقة، ففقرة كُتبت في تسع عمليات حفظ تخرج دفعةً واحدة، وتخرج فورًا حين تضع الهاتف. وسطر صغير قرب أسفل الشاشة يقول ما ينتظر: ٣ تغييرات لم تُرسَل، لا اتّصال. تغييراتك محفوظة على هذا الهاتف.، نرسل تغييراتك…، ٢ من الملاحظات تغيّرت في المكانين. ولا يقول أبدًا إنّك متزامن وشيء ما ينتظر — وحين يُرسَل كلّ شيء يتنحّى، لأنّ «تمّت المزامنة» ليس خبرًا. ويقف بعيدًا عن شريط الأبواب الخمسة لا فوق آخرها. انقره ليرسل الآن.
والمزامنة لا تحرّكك أبدًا. تُقرأ الملاحظات التي تغيّرت من جديد تحتك، ويبقى المجلد الذي كنت فيه، والمجلدات خلفه، والملاحظة التي كنت تقرؤها، حيث كانت؛ وكذلك مكانك حين يعيد أندرويد التطبيق من الخلفية. والسهم › في المجلد يصعد إلى المجلد الذي فوقه، لا إلى «اليوم» أبدًا (الرجوع يعني الصعود).
على Galaxy Z Fold، وعلى اللوح. الملاحظة تأخذ الصفحة. مطويًّا، الشاشة الخارجية هاتف: عمود واحد وشريط الأبواب الخمسة. ومفتوحًا، الشاشة الداخلية عمود واحد كذلك — الملاحظة التي تفتحها من القائمة تملأ الشاشة كلها، و**‹** يعود إلى القائمة — وتحتفظ بالألسنة: افتح ملاحظة ثانية فتبقى الأولى على بُعد نقرة في صفّ تحت شريط الملاحظة، و**×** يغلق إحداها، وتبقى الألسنة بعد الرجوع إلى القائمة وإعادة التحميل وعودة التطبيق. واللوح الممسوك قائمًا مثله. أما اللوح على جنبه (1000 بكسل عرضًا فما فوق) فله عمودان — الأبواب في عمود جانبي، وملاحظاتك بجانب الملاحظة في عمود بعرض قائمة — وإخفاء القائمة في أسفل عمود الأبواب يترك الصفحة للملاحظة هناك أيضًا. وافتح الهاتف القابل للطي أو اطوه، أو أدِر اللوح، فتبقى الملاحظة التي تقرؤها مفتوحة (على الهاتف القابل للطي مفتوحًا، وعلى اللوح).
الإعدادات، واللسان الذي يخصّ الهاتف
افتح الإعدادات ← النسخ الاحتياطي والمزامنة في خزانة من GitHub تجد لوحة الهاتف نفسه لا لوحة خادم: المستودع والفرع اللذان فتحتهما، والسطر نفسه الذي يعرضه التطبيق فوق خزانتك، وزرّ زامن الآن يسحب ثمّ يدفع، وأزواج الملاحظات المحفوظة جنبًا إلى جنب (أدناه)، ومغادرة هذه الخزانة التي تنسى المستودع والرمز وتعيدك إلى شاشة الاتّصال، ولا تحذف شيئًا من GitHub ولا من الهاتف.
وكلّ ما تغيّره في الإعدادات سواه يُحفَظ في الخزانة، في .astrolabe/settings.json، ويُودَع كما تُودَع ملاحظة. وهو الملفّ نفسه الذي تضعه النسخة على الخادم هناك، فاسم الموقع أو التقويم أو مجلّد اليوميّات أو القالب الذي تختاره على الهاتف يصير على حاسوبك حالما يسحب، والذي تختاره على الحاسوب يصير على الهاتف. وما لا يستطيع الهاتف حفظه لا يُعرَض: الصفوف التي عن الزوّار أو الخطوط المرفوعة أو أيقونة الموقع أو مصحف الحديث أو القصّاصة باهتةٌ والسبب فوقها، وتحت موقعك لا يُرسم إلا ما تحمله الخزانة نفسها (الاسم، وسطر التعريف، والشعار، وأيقونة الموقع، والسمة الافتراضية، والتذييل)، بلا صفوف التخطيط أو الصفحة الرئيسية أو التعليقات أو إشارات الويب أو الفيديفيرس؛ أمّا قسما المجموعات واسأل فليسا هناك أصلًا.
حين يتغيّر الجانبان في ملاحظة واحدة
لا يدمج الهاتف نثرك أبدًا. فإن تغيّرت ملاحظة هنا وعلى حاسوبك، تبقى نسخة المستودع باسمها وتوضع نسخة الهاتف إلى جانبها باسم <الملاحظة> (phone).md. وتُودَع النسختان وتُدفعان، فالزوج على كلّ جهاز. ويقول السطر الأسفل كم زوجًا ما زال قائمًا، ويظلّ يقوله بعد إغلاق التطبيق وفتحه من جديد، حتى تقرأ الاثنتين وتحذف التي لا تريد. فلا شيء يُدمج، ولا شيء يُرمى.
ما لا تفعله خزانة GitHub
لا نصف علنيّ لها، فلا تستطيع النشر، ولا مدوّنة لها ولا زوّار ولا حواشي ولا مصمّم موقع ولا رمز قصّاصة. ولا دليل بيانات لها على قرص، فالخطوط المرفوعة وتعليقات PDF ليست هناك. ولا نسخة ثانية تزامنها، لأنّها هي المزامنة. وكلّ واحدة من هذه تقول ذلك حين تبلغها، في جملة تسمّي الناقص وباللغة التي تقرأ بها التطبيق، بدل أن تخفق بصمت. وماضي الملاحظة يأتي من المستودع: الإيداعات التي جرت منذ أُخذت النسخة، وهناك يبدأ تاريخ هذه النسخة.
ولا تذهب ملاحظاتك إلى مكان غير مستودعك أنت. وليس للتطبيق خادم من عنده ولا حساب عند أحد.
تسجيل التطبيق، إن بنيته بنفسك
طريقتان للدخول. البسيطة تعمل في كل بناء: أنشئ رمز وصول شخصيًّا على github.com (من Developer settings في حسابك، ثم Personal access tokens — رمزًا دقيقًا فيه Contents: read and write على المستودع الذي هو خزانتك، أو رمزًا كلاسيكيًّا بنطاق repo)، والصقه في الباب، فيتحقّق التطبيق منه عند GitHub قبل أن يحتفظ به. ويبقى على الهاتف ولا يُرسَل إلا إلى github.com، كلمةَ مرور على كل طلب git. والطريقة الأخرى زرّ سجّل الدخول بـ GitHub — رمز تقرؤه من الهاتف وتكتبه على github.com — ويحتاج إلى مُعرّف تطبيق OAuth مضمَّن في البناء: أنشئ واحدًا تحت Developer settings ← OAuth Apps ← New OAuth App، وشغّل Enable Device Flow، وضع مُعرّف العميل في mobile/.env باسم ASTROLABE_GITHUB_CLIENT_ID قبل البناء. ولا سرّ للعميل؛ فتدفّق الأجهزة لا يستعمل واحدًا. والبناء الذي لا مُعرّف له يبقى له الباب: الزرّ لا يُرسم فحسب، وحقل الرمز موجود.
ورقة المشاركة
شارك رابطًا أو فقرة أو جملة من أي تطبيق واختر التقاط إلى أسطرلاب. تلحقها الورقة نقطةً مختومة بالوقت في ملاحظة صندوق اليوم، Inbox/YYYY-MM-DD.md، وتُنشئ الملاحظة والمجلد إن كان هذا أول التقاط في اليوم. وتحمل الكتابة وقت تعديل الملاحظة شرطًا مسبقًا، كما تفعل عمليات حفظ المحرر؛ فإن تحركت الملاحظة من تحتها (كنت تحرّرها على الحاسوب المحمول) أعادت الورقة القراءة والإلحاق مرة واحدة. والإلحاق هو الكتابة النادرة التي يكون هذا فيها آمنًا: ما يُضاف لم يكن في الملف في المرتين.
وتعمل الورقة في مهمة خاصة بها، فلا يكلّفك الالتقاط مكانك في التطبيق أبدًا: شارك، وانظر التأكيد، وأنت حيث كنت.
هذه ورقة التطبيق نفسه. أما الموقع المثبَّت، أي الموقع المضاف إلى الشاشة الرئيسية من متصفح الهاتف والموصوف تحت الالتقاط، فله هدف مشاركة خاص به يودع الصفحة المشارَكة تحت Clips/ والجملة المشارَكة تحت ## Captured في ملاحظة اليوم. وكلا الطريقين يؤدي إلى الخزانة؛ فطريق التطبيق هو الذي يعمل قبل أن يكون الموقع مسجَّلَ الدخول في أي مكان، وطريق الموقع هو الذي يقصّ صفحة.
الموقع المثبَّت، والتطبيق
لا تحتاج إلى ملف APK ليكون أسطرلاب على هاتفك. فالموقع قابل للتثبيت من المتصفح (أضف إلى الشاشة الرئيسية)، والموقع المثبَّت يفتح ملء الشاشة، ويحمل اسم الموقع وألوان سمته الافتراضية، ويحتفظ بالملاحظات التي قرأتها للقراءة دون اتصال، ويظهر في ورقة مشاركة الهاتف. ويضيف التطبيق ثلاثة أشياء فوق ذلك: شاشة اتصال تتذكر خادمك وتفحصه قبل الفتح، والتقاطًا لا يحتاج إلى متصفح ولا إلى صفحة مفتوحة، وإيماءة رجوع تسلك مسلك التطبيق لا المتصفح.
وداخل أيٍّ منهما، يُلتقط السطر من الحقل في أعلى شاشة اليوم (وخزانة GitHub تحفظه أيضًا: يذهب السطر إلى الملاحظة التي تسمّيها، أو إلى بريد اليوم، ويُحفظ في المستودع كأي تعديل آخر)، والسِّجِلّ والمدارات والمكتبة والمخطط وسائر الأدوات صفوف تحت المزيد.
التحديثات
يعلم الهاتف بملف APK جديد كما يعلم سطح المكتب بملف AppImage جديد: طلب واحد إلى صفحة الإصدارات، مرة في كل تشغيل، في خيط خلفي. والتطبيق المثبَّت يدويًا لا يستطيع أن يحدّث نفسه، فمثبّت الحزم في الهاتف هو الوحيد المسموح له باستبداله، فأقصى ما يستطيعه التطبيق بصدق أن يقول إن إصدارًا موجود وأن يسلّم ملف APK إلى المتصفح، فينزّله ويعرض تثبيت. والنسخة الجديدة موقّعة بالمفتاح نفسه، فيعاملها أندرويد على أنها التحديث الذي هي عليه: الملاحظات والإعدادات وتسجيل الدخول لا تُمسّ.
وهادئ عن قصد: لا يُعرض شيء حين يكون التطبيق حديثًا، والإصدار الذي صرفته بـلاحقًا لا يُذكر مرة أخرى يومًا كاملًا. وكل ما في جانب الويب يصل إلى الهاتف لحظة تحديث الخادم؛ ولا يتغير ملف APK إلا حين يتغير الغلاف نفسه، وهذا نادر.
ما لا يفعله
لا كاميرا ولا موقع ولا جهات اتصال ولا تخزين ولا تحليلات ولا إشعارات دفع. لا يطلب بيانه إلا الوصول إلى الشبكة، ومنذ 3.24 — للملاحظات الصوتية — الميكروفون، ويسألك أندرويد عنه أول مرة تسجّل ولا يسألك قبلها. وهو موجَّهًا إلى خادمك أنت لا وضع له خاصًّا به دون اتصال: الصفحة التي يعرضها تحتفظ بنسخة تطبيق الويب دون اتصال كما يفعل المتصفح، وحين لا نسخة ولا خادم يقول ذلك ويتوقف. أمّا خزانة من GitHub فحالة أخرى بالكامل: هي النسخة نفسها، وتفتح من غير شبكة البتّة.
تثبيته
ملف APK ليس على أي متجر؛ ثبّته بنفسك. انسخ ملف .apk إلى الهاتف (تطبيق مزامنة ملفات، أو كابل) وافتحه في مدير ملفات الهاتف. يطلب أندرويد الإذن بتثبيت تطبيقات غير معروفة لمدير الملفات ذاك؛ امنحه، وثبّت، واسحب الإذن بعدها إن شئت. وتثبيت ملف APK أحدث فوق أقدم يحتفظ ببياناته ما دام الاثنان موقّعين بالمفتاح نفسه، وكل إصدار كذلك. أما البناء الذي صنعته بنفسك من المستودع فموقّع بمفتاح خاص به ولا يستطيع أن يحلّ محل إصدار ولا أن يحلّ إصدار محله؛ ألغِ التثبيت أولًا.
ويسمح التطبيق بـhttp المجرد ويثق بمخزن شهادات الهاتف نفسه، لأن خزانة مستضافة ذاتيًا على http://192.168.1.24:6801 أو خلف سلطة شهادات خاصة هي الحالة التي وُجد من أجلها؛ وهو لا يكلّم أبدًا إلا المضيف الواحد الذي سمّيته.
صفحات ذات صلة
- الالتقاط: ورقة الالتقاط السريع، والقصّاصة، وهدف مشاركة الموقع المثبَّت
- تطبيق سطح المكتب: المنتج نفسه على الحاسوب، بسياسة تحديث خاصة به
- القراءة دون اتصال: ما تحتفظ به الصفحة على الجهاز
- اللوحات والتبويبات والنوافذ: ما تفعله الواجهة على الهاتف