كيف تبدأ في أستخدام i3

Posted: سبتمبر 22, 2016 in General

ناس كتير عندي في الشغل بتحب تستخدم i3 وهو window manager نوعا ما أخف وبتكون more productive من خلاله

هو tiling window manager بمعنى أن الشاشة بتتقسم في صورة tiles 🙂

التنصيب

sudo apt-get install i3

اخرج من ال session اللي انت فيها وrelogin من خلال i3 (لاحظ مينفعش يكون في أكتر من window manager فعال في نفس الوقت)

لاتتعجل (أقرأ للنهاية قبل أن تدخل في i3 ولاتعلم كيفية الخروج منه بعد)

ستقوم بأختيار MOD لتستخدمه مع أوامر i3 وغالبا سيكون هو Alt (تأكد من أختيارك في أول مرة تدخل فيها إلى i3)

يهمنا جدا ال terminals تستطيع فتح واحدة جديدة من خلال MOD+Enter

قم بإنشاء عدة terminals بنفس الأمر MOD + ENTER (جميل ماتراه أليس كذلك؟) 😀

لغلق نافذة اضغط على MOD + SHIFT + q

لعرض شاشة في ال full screen قم بضغط MOD + f

تريد زيادة أو تصغير حجم الشاشة الظاهرة؟ تستطيع ذلك عبر MOD + R ثم يمين أو يسار

افتراضيا يتم وضع النوافذ الجديدة بقسمة مساحة الشاشة بينهم ولكن تستطيع تغيير ذلك السلوك بأن تستخدم tabs عن طريق MOD + w او تضعهم في stack عن طريق MOD + s

تستطيع الأنتقال ل workspace عن طريق MOD + 0-9

وتستطيع نقل نافذة إلى workspace عن طريق MOD + shift + 0-9

كيف أفتح تطبيق؟ بكل بساطة تستطيع استخدام launcher وفي حالتنا هنا سيكون dmenu عن طريق MOD + d

قمت بتعديل إعدادات i3؟ تستطيع اعلام i3 بذلك عبر MOD + shift + c

إعادة تشغيل i3? وذلك عبر MOD + shift + r

للخروج من i3 قم بالضغط على MOD + shift + e

لإضافة layout والتبديل عبر alt+shift تستطيع إضافة التالي في ملف اعدادات i3 غالبا سيكون تحت المسار

~/.config/i3/config

exec --no-startup-id "setxkbmap -option grp:switch,grp:alt_shift_toggle us,ar"

لزيادة وخفض درجة الصوت

bindsym XF86AudioRaiseVolume exec amixer -q set Master 2dB+ unmute

<p align="left">bindsym XF86AudioLowerVolume exec amixer -q set Master 2dB- unmute</p>
<p align="left">bindsym XF86AudioMute exec amixer -q set Master toggle

روابط مفيدة

https://i3wm.org/

https://i3wm.org/docs/userguide.html

https://i3wm.org/docs/refcard.html

Introduction to Screen

Posted: سبتمبر 13, 2016 in General

هنتكلم النهاردة عن GNU Screen

السؤال: ليه أستخدم terminal multiplexer انا عندي tabs وأقدر أفتح كذا terminal صح؟

الجواب: مش دايما عندك الرفاهية دي من خلال remote connection

يوجد العديد من ال terminal multiplexers مثل screen و tmux و byobu ، قطعا tmux أشهرهم حاليا، ستجد screen غالبا في مستودعات التوزيعة خاصتك

ابدأ بتشغيل screen

 screen

تستطيع استخدام -S لتحديد اسم ال session

screen -S sessionname

أضغط Enter لتجاهل تلك الرسالة الترحيبية

لنتفق عندما تجد كلمة PREFIX أن الPREFIX هو Ctrl+a او أختصارا ^a

وهو يعني كل أوامرك يجب أن تبدأ بال PREFIX ليفهم screen أنك توجه أمر خاص له

لأطلاع سريع على الأوامر المتاح أضغم PREFIX ثم علامة استفهام ؟

~> PREFIX ?

لمحو الكتابة على الشاشة اضغط PREFIX + C

أكتب مثلا أمر top

~> top

ماذا نفعل الآن؟ هل أصبحت عالقا؟ أريد أن أكتب أوامر أخرى

بكل بساطة تستطيع إنشاء نافذة جديدة

لتنشئ نافذة جديدة اضغط PREFIX + c

لعرض أسماء النوافذ المفتوحة تستطيع كتابة PREFIX + w ستظهر لك menubar بأرقام وأسماء النوافذ .. هل لاحظت أن جميعها مسماه bash؟

لعرض اسماء النوافذ كقائمة اكتب PREFIX + “

لتغيير الأسم للنافذة تستطيع تنفيذ أمر PREFIX + A

لتستطيع التنقل بينها بسهولة عن طريق

PREFIX + windowNumber

PREFIX + ‘windowName

للدوران على النوافذ المتاحة تستطيع تنفيذ PREFIX + p او PREFIX +n

لتقسيم النافذة لعدة مناطق تستطيع استخدام PREFIX + S للقسمة افقيا أو PREFIX + | للقسمة رأسيا وتستطيع التنقل بينهم عن طريق PREFIX + tab ولغلق أحدها أضغط PREFIX + X

لنخرج من هذه الجلسة عن طريق PREFIX + d

نستطيع أن نعرف الجلسات الموجودة ب screen عن طريق screen -ls

وللعودة إلى جلسة ما نستخدم screen -r ثم أسم الجلسة او سيتم الدخول للمتاحة

لأغلاق الجميع تستطيع تنفيذ PREFIX + \

*يوجد الكثير من الأوامر للتعامل مع screen ونفس الكيفية لأدوات مثل tmux, terminator, byobu

تسجيل لجلسة تعامل مع screen بالأوامر المذكورة

https://asciinema.org/a/1uwwhh4l9jabrj2krfhgmx0e4

Life.resume()

Posted: ماي 7, 2016 in General

خلاص خلصت جيش ، وبدأت شغل جديد بتستخدم فيه لغات Python ,Go بكثافة وفي حاجة كتير بتعلمها/اتعلمتها في شوق أن أشارككم بيها

حاليا شغال على REST microservice مكتوبة بلغة Go/Gin framework
الناس الي كانت بتسأل على كتاب بايثون فهو محطوط على مستودع
https://bitbucket.org/xmonader/pyguide
وبالنسبة لباقي المصادر الي كانت على الموقع طيب الذكر programming-fr34ks فاحنا نقلناها إلى
http://tuxcoders.sourceforge.net/dokuwiki/doku.php?id=pythonguide&do=index

استنوني 🙂

لعبة سودكو الشهيرة، تعتمد في حلها على عدم تكرار نفس الرقم في نفس الصف او في نفس العمود او في نفس المربع


سنقوم بعمل برنامج لحل اللعبة بإستخدام لغة برولوج وعلى نموذج مصغر 4×4 ولكن بنفس القواعد. والأرقام المقبولة هي 1,2,3,4

?- solve(1,4, _, _, _, _, 4, _, 2, _, _,_, _, _, _, 3).
1 4 3 2
3 2 4 1
2 3 1 4
4 1 2 3

كيف نقوم بحل ذلك السؤال؟
انظر على حلول لغات مثل سي هنا
http://rosettacode.org/wiki/Sudoku
يوجد اتجاه او اسلوب برمجي اخر يسمى ال declarative programming … كل ماعلينا هو أن نقوم بوصف الحل لا الخطوات للحل..

طريق سريع لبرولوج

1-التنصيب
http://www.swi-prolog.org/Download.html

مستخدمي لينكس موجود لديكم في مدير الحزم

striky@localhost ~/m/prolog&gt; touch hello.pl master
striky@localhost ~/m/prolog&gt; swipl master?
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 6.6.6)
Copyright (c) 1990-2013 University of Amsterdam, VU Amsterdam
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
Please visit http://www.swi-prolog.org for details.

For help, use ?- help(Topic). or ?- apropos(Word).

?- write('Hello, World!').
Hello, World!
true.
?- write('Hello,'), nl, write('world').
Hello,
world
true.
?- X is 3*4 + 2.
X = 14.

لاحظ أي امر في برولوج ينتهي بال نقطة .
write يستخدم لطباعة نص
nl
تستخدم لطباعة سطر جديد
البرنامج في برولوج عبارة عن قاعدة معرفة knowledge base وفيه يتم ادراج الحقائق facts وقواعد الأستنباط rules

friend(john, julia).
friend(john, jack).
friend(julia, sam).
friend(julia, molly).

loves(john, julia).
loves(julia, sam).
loves(sam, julia).

male(brad).
male(john).
male(jim).
male(alfred).
female(marry).
child(brad, alfred).
child(john, jim).
child(john, marry).

هذا ملف KB يشمل مجموعة من الحقائق … برولوج ستساعدنا كثيرا لإجابة الكثير من الاسئلة .. لنرى!

?- [hello].
% hello compiled 0.00 sec, 3 clauses
true.

?- listing(friend).
friend(john, julia).
friend(john, jack).
friend(julia, sam).
friend(julia, molly).

true.

?- listing(loves).
loves(john, julia).
loves(julia, sam).
loves(sam, julia).

true.

?- listing(parent).
ERROR: toplevel: procedure `parent' does not exist (DWIM could not correct goal)

نستطيع استخدام listing لعرض الحقائق

?- friend(john, julia).
true .

?- friend(john, jack).
true.

?- loves(john, julia).
true.

?- loves(john, sam).
false.

استعلامات بسيطة على الحقائق التي لدينا

?- friend(john, Who).
Who = julia ;
Who = jack.

هذا الاستعلام يعني … ماهي قيمة المتغير Who التي تجعل العلاقة friend(john, Who) صحيحة؟
نجد في ال KB قيم مثل julia وتقوم برولوج بإخبارنا بذلك .. ولكن يوجد قيم اخرى نستطيع الوصول اليها بالضغط على ;
*لاحظ ان المتغيرات تبدأ بحرف capital

الواد john دا ابن مين

?- listing(child).
child(brad, alfred).
child(john, jim).
child(john, marry).

true.

?- child(john, X).
X = jim ;
X = marry.

الأستنباط

يوجد الكثير من الأسئلة والأجابات
مثلا هل العلاقات

friend(julia, john)

صحيحة؟
هل john is friendzoned؟
😀
هل فلان ابو فلان؟
لنقوم بإضافة بعض القواعد

rule :- stmt1, stmt2,...

تنطق ال rule محققة اذا كان ( :- ) stmt1, stmt2 محققين

parent(X, Y) :- child(Y,X).

فلان X هو أبو Y في حال اذا كان Y هو ابن ل X

father(X, Y) :- child(Y,X), male(X).

فلان X هو اب ل Y في حال اذا كان Y هو ابن X وX هو male

mother(X, Y) :- child(Y,X), female(X).

فلان X هي ام ل Y في حال اذا كان Y هو ابن ل X و X تكون female

friend(X, Y) :- friend(Y,X).

فلان X صديق Y .. اذا كان في ال kB معروف ان Y صديق X

friendzoned(X) :- loves(X, Y), \+ loves(Y,X).

فلان X في ال friendzone اذا كان X بيحب Y وفي نفس الوقت Y لاتحب X

?- friend(julia, john).
true .
?- male(jim).
true.

?- parent(jim,X).
X = john.

?- father(jim, X).
X = john.

?- mother(X, john).
X = marry.

?- mother(marry,X).
X = john.

?- mother(marry, john).
true.

قصة قصيرة حزينة…

جون بيحب جوليا، ولكن جوليا وسام بيحبوا بعض

?- loves(julia, X).
X = sam.

?- friendzoned(julia).
false.

?- friendzoned(john).
true.

الكود

اولا نقوم بتعريف ال domain .. وهو القيم المقبولة للمتغيرات

num(1). num(2).
num(3). num(4).

التأكد من أن القيم فريدة بين 4 متغيرات

%create unique values of A,B,C,D based.
uniq(A,B,C,D) :-
num(A), num(B), num(C), num(D), \+ A=B, \+ A=C, \+ A=D, \+ B=C, \+ B=D, \+ C=D.

هنا نقول ان A لايساوي B ولايساوي C ولايساوي D وكذلك B لايساوي C ولا يساوي D وكذلك C لايساوي D وكل منهم عبارة عن رقم قد يكون 1 او 2 او 3 او 4

الحصول على الحل

%find solution to sudoku 4x4 based on constraints.
solution(C11, C12, C13, C14,
C21, C22, C23, C24,
C31, C32, C33, C34,
C41, C42, C43, C44) :-
%rows (every row is uniq).
uniq(C11, C12, C13, C14), uniq(C21, C22, C23, C24), uniq(C31, C32, C33, C34), uniq(C41, C42, C43, C44),
%columns (every column is uniq).
uniq(C11, C21, C31, C41), uniq(C12, C22, C32, C42), uniq(C13, C23, C33, C43), uniq(C14, C24, C34, C44),
%blocks (every block (2x2) cells is uniq).
uniq(C11, C12, C21, C22), uniq(C31, C32, C41, C42), uniq(C13, C14, C23, C24), uniq(C33, C34, C43, C44).

لاتنزعج!
اولا الboard او لوحة السودكو عبارة عن 16 خانة .. 4 صفوف و 4 أعمدة
قم بتسميتهم من C11 الى C44
C21 تعني الخلية في الصف الثاني والعمود الأول

الآن لنصف الحل ..

الحل يعتمد على
1-تفرد القيم في كل صف ..

uniq(C11, C12, C13, C14)

هنا نقول ان القيم C11, C12, C13,C14 المكونة للصف الأول يجب ان يتم اسناد قيمة مختلفة لها من 1 ل 4 وهذا ماوضحناه في uniq
وبالمثل مع الخلايا المكونة لباقي الصفوف الثاني والثالث والرابع

2- تفرد الفيم في كل عمود ..

uniq(C11, C21, C31, C41)

وبالمثل مع الخلايا المكونة لباقي الأعمدة
3- تفرد القيم في كل مربع
لدينا ٤ مربعات (C11, C12, C21, C22) (C31, C32, C41, C42)(C13, C14, C23, C24)(C33, C34, C43, C44)

يجب ان تكون الأرقام مختلفة داخل المربع

uniq(C11, C12, C21, C22)

لقد أنتهينا!
الآن برولوج ستقوم بالبحث عن القيم اللتي تتفق مع وصفنا لتلك المشكلة

الآن لنقوم بعرض القيم

solve(C11, C12, C13, C14,
C21, C22, C23, C24,
C31, C32, C33, C34,
C41, C42, C43, C44) :-

solution(C11, C12, C13, C14,
C21, C22, C23, C24,
C31, C32, C33, C34,
C41, C42, C43, C44),
showrow(C11, C12, C13, C14), showrow(C21, C22, C23, C24), showrow(C31, C32, C33, C34), showrow(C41, C42, C43, C44),nl.

كان من الممكن دمجهم في الكود السابق
فقط نقوم بطباع كل 4 خلايا المكونين لصف عن طريق showrow المعرف كالتالي

showspace :- write(' ').
%row representation.
showrow(A, B, C, D) :-
showspace, write(A), showspace, write(B), showspace, write(C), showspace, write(D), nl.

*لاحظ showspace تقوم بطباعة مسافة فارغة فقط لاأكثر

الكود كامل

%based on thinking as computation example

%domain
num(1). num(2).
num(3). num(4).
showspace :- write(' ').
%row representation.
showrow(A, B, C, D) :-
showspace, write(A), showspace, write(B), showspace, write(C), showspace, write(D), nl.

%create unique values of A,B,C,D based.
uniq(A,B,C,D) :-
num(A), num(B), num(C), num(D), \+ A=B, \+ A=C, \+ A=D, \+ B=C, \+ B=D, \+ C=D.

%find solution to sudoku 4x4 based on constraints.
solution(C11, C12, C13, C14,
C21, C22, C23, C24,
C31, C32, C33, C34,
C41, C42, C43, C44) :-
%rows (every row is uniq).
uniq(C11, C12, C13, C14), uniq(C21, C22, C23, C24), uniq(C31, C32, C33, C34), uniq(C41, C42, C43, C44),
%columns (every column is uniq).
uniq(C11, C21, C31, C41), uniq(C12, C22, C32, C42), uniq(C13, C23, C33, C43), uniq(C14, C24, C34, C44),
%blocks (every block (2x2) cells is uniq).
uniq(C11, C12, C21, C22), uniq(C31, C32, C41, C42), uniq(C13, C14, C23, C24), uniq(C33, C34, C43, C44).
solve(C11, C12, C13, C14,
C21, C22, C23, C24,
C31, C32, C33, C34,
C41, C42, C43, C44) :-

solution(C11, C12, C13, C14,
C21, C22, C23, C24,
C31, C32, C33, C34,
C41, C42, C43, C44),
showrow(C11, C12, C13, C14), showrow(C21, C22, C23, C24), showrow(C31, C32, C33, C34), showrow(C41, C42, C43, C44),nl.

https://github.com/xmonader/prolog-rands/blob/master/sudoku.pl

كيف تستخدم الأمر bc

Posted: أكتوبر 25, 2014 in General
الوسوم:, ,

كيف تستخدم BC؟
ماهي BC؟
هي لغة موجه للعمليات الحسابية وتعريف الدوال بالإضافة لمكتبة رياضية قياسية، تتشابه مع لغة سي في طريقة كتابتها
تأخد تعليماتها من ال stdin
العناصر الأساسية

1- الأرقام (تعبر عنها كأرقام عشرية)
مصطلح length يعني عدد الخانات الموجودة في الرقم
مصطلح scale المقصود به عدد الخانات بعد العلامة العشرية
2-المتغيرات
يوجد نوعين من المتغيرات، متغيرات بسيطة ومصفوفات (يجب ان تسمى بأسماء تبدأ بحرف صغير يليه حروف صغيرة او ارقام)

-يوجد متغيرات محجوزة منها
last يعبر عن آخر قيمة
scale يعبر عن عدد الخانات المقبولة بعد العلامة العشرية

التعليقات
لإضافة ملاحظات على التعبيرات تستطيع استخدام
/* */ كما في لغة سي

لتشغيل البرنامج اكتر الأمر bc
وللخروج منه اكتب quit
حاسبة بسيطة
تستطيع استخدام المعاملات المعروفة كالجمع + والطرح – والضرب * والقسمة / ومعامل الباقي ٪ وكذلك عملية الأس ^ وكذلك استخدام المعاملات العلائقية
>, <, ==, !=, >=, =< وكذلك المعاملات المنطقية ك && (and) و ||(or) و ! (للنفي)


striky@localhost ~> bc                                                                                 20
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
1
1
1+2
3
3*4
12
4/2
2
4%3
1
3^2
9
5-7
-2
-3 + 48
45


3>5
0
5>3
1
5==5
1
7 >= 5
1
6 != 4
1

3 && 5
1
3 || 0
1
!0
1
!1
0

استخدام المتغيرات

لتعريف متغير فالأمر بسيط كل ماعليك هو

varname = expr
x=4
y=6
x+y
10
x++
4
x
5
x *= 2
x
10

تستطيع ان تفرض اولوية تحقيق اي تعبير بوضعه بين قوسين

يوجد تعبيرات خاصة مثل length و scale (عدد الخانات وعدد الخانات بعد العلامة)
كذلك الأمر read لقراءة مدخل من المستخدم
ودالة sqrt للحصول على الجذر التربيعي لتعبير ما

length(1234)
4
length(1234.2421)
8
scale(.33)
2
scale(.3300)
4
scale(4121.3300)
4
sqrt(4)
2
read()
4
4

الأمر limits
للحصول على معلومات عن حدود إصدار bc الخاص بك

limits
BC_BASE_MAX     = 2147483647
BC_DIM_MAX      = 16777215
BC_SCALE_MAX    = 2147483647
BC_STRING_MAX   = 2147483647
MAX Exponent    = 9223372036854775807
Number of vars  = 32767

الدوال
لتعريف دالة

define FUNCTION_NAME(PARAMS) {
	/* auto VARIABLES */
	/* code */
	
}
define get3() { 
return 3
}

هنا قمنا بتعريف دالة تعيد دائما الرقم 3

z=get3()
z
3
define dbl(n){
return 2*n
}

هنا قمنا بتعريف دالة تضاعف المدخل n

dbl(3)
6
dbl(20)
40

لإستخدام المكتبة الرياضية القياسية يجب ان تشغل bc مع إضافة الأمر -l

bc -l

يوجد الدوال

s -> sin
c -> cos
a -> arctan
l -> natural logarithm
e -> exponential

لطباعة جملة -بين علامتي تنصيص- يوجد الأمر print

print "SOMETHING"

الشروط
تستطيع اختبار شرط عبر جملة if/else

لدينا متغيرين x,y ونريد ان نسند قيمة الأكبر منهما إلى z

z=0
x=19
y=24
if (x>y) {
	z=x
}else{
	z=y
}
z
24

الحلقات
تدعم كذلك while, for, break, continue

مثلا نريد الحصول على مجموع الأرقام من 0 إلى 6


total = 0
for (i=0; i<6; i++) {
  total +=i
  total
}

0
1
3
6
10
15

total
15

دالة المضروب factorial


define fact(x) {
  if (x < 2) {
     return (1);
   } else {
     return ( x*fact(x-1) );
   }
}


fact(3)
6
f(5)
120

سنقوم بعمل دالتين لحساب المحيط والمساحة للدائرة

pi = 3.14
define perim(radius) {

    return (2*pi*radius);
}

perim(3)
18.84

define circle_area(radius) {
    auto area	      
    area = radius * pi * pi
    return (area);
}
circle_area(4)
39.4384

مصادر
https://www.gnu.org/software/bc/manual/html_mono/bc.html
/