
هشام رزق الله
الأعضاء-
المساهمات
1442 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
31
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو هشام رزق الله
-
توجد عدة طرق في لغة ASP.NET للتأكد من الصلاحيات والأدوار فيمكنك على سبيل المثال استخدام هذه الطريقة: User.IsInRole("rolename") أو هذه الطريقة: Context.User.IsInRole("rolename") أو حتى هذه الطريقة: Threading.Thread.CurrentPrincipal.IsInRole("rolename") أما لو أرد التأكد ما إذا كان المستخدم لديه صلاحيات أم لا فيمكنك استخدام هذه الطريقة: If User.Identity.IsAuthenticated Then ' Good... else ' Not Good... End if للمزيد من المعلومات راجع هذا التوثيق.
- 1 جواب
-
- 1
-
-
يمكنك إنشاء تطبيقات اندرويد أو iOS بكل سهولة عن طريق استخدام Unity3D، ويجب أن تكون لديك بعض الخبرة في C# وجافا. بالنسبة إلى ألعاب iOS، فستحتاج إلى جهاز Mac مع برنامج Xcode مثبت عليه بالإضافة إلى رخصة Unity iOS basic أو Unity iOS Pro وإلى اشتراك لبرنامج iOS developer من شركة أبل. أما بالنسبة إلى ألعاب أندرويد، تحتاج إلى جهاز ويندوز أو ماك مع برنامج Android SDK مثبت عليه بالإضافة إلى رخصة Unity Android basic أو Unity Android Pro ولا تحتاج إلى اشتراك ببرنامج المطورين إذا لم ترغب بنشر تطبيقاتك.
-
توجد العديد من الطرق لفعل ذلك باستخدام روبي فقط وباستخدام إطار Sinatra، فيمكنك على سبيل المثال استخدام request.host كما في المثال التالي: get "/" do puts request.host #=> localhost end أو يمكنك استخدام متغيرات البيئة للحصول على العديد من المعلومات والتي من بينها اسم الخادم إذا مررت SERVER_NAME إلى تغير request.env كما في المثال التالي: request.env["SERVER_NAME"]
-
توجد عدة طرق لفعل ذلك في روبي، فيمكنك على سبيل المثال استخدام تابع frequency من وحدة facets مع كل مصفوفة ومن ثم مقارنتهم باستخدام العامل == كما في المثال التالي: require 'facets' [1, 2, 1].frequency == [2, 1, 1].frequency #=> true أو يمكنك استخدام طريقة التقاطع حيث سنستخدم معامل التقاطع & مع المصفوفتين الثانية مع الأولى ومن ثم تقارنها بالمصفوفة الثانية كما في المثال التالي: @array2 & @array1 == @array2
-
يمكنك فعل ذلك بطرق عديدة في بايثون، فيمكنك على سبيل المثال استخدام دوال مكتبة csv وتمرير quoting=csv.QUOTE_ALL إلى writer لوضع علامتي اقتباس ومن ثم استخدام دالة writerow للحصول على قيم القائمة وكتابتها كما في المثال التالي: import csv myfile = open('a_file.csv', 'wb') wr = csv.writer(myfile, quoting=csv.QUOTE_ALL) wr.writerow(mylist) أو يمكنك استخدام هذه الطريق والتي هي أقصر من الطريقة السابقة: out = csv.writer(open("a_file.csv","w"), delimiter=',',quoting=csv.QUOTE_ALL) out.writerow(myfile)
-
يوجد عدة طرق لفعل ذلك في بايثون، فيمكنك على سبيل المثال بناء التعبير النمطي على شكل سلسلة نصية كما في المثال التالي: my_regex = r"\b(?=\w)" + re.escape(AVARIABLE) + r"\b(?!\w)" if re.search(my_regex, subject, re.IGNORECASE): ... أو يمكنك فعل ذلك بسطر واحد فقط عن طريق استخدام صياغة السلسلة النصية كما في المثال التالي: if re.search(r"\b(?=\w)%s\b(?!\w)" % AVARIABLE, subject, re.IGNORECASE):
-
لا تحتاج إلى تغيير PYTHONPATH بل يمكنك فقط إضافة المسار الذي تريده عن طريق استخدام دالة append من مكتبة sys.path كما في المثال التالي: sys.path.append('/your/path') أو إذا كنت مُصرا على تغيير PYTHONPATH فيمكنك فعل ذلك بكل سهولة عن طريق استخدام os.environ من مكتبة os كما في المثال التالي: import os user_home = os.environ["HOME"] os.environ["PYTHONPATH"] = "..."
-
سمعت عن الكثير من المحترفين أن عملية التأكد من نوع كائن ملف غير جيدة ولا يُنصح بها في شيفرتك البرمجية إلا في الضرورة. فالكتابة في بايثون حيوية - dynamic -، فالطريقة التي ذكرتها وهي التأكد ما إذا كان المتغير هو كائن ملف أفضل من استخدام طريقة تجربة التعامل مع المتغير كملف والتعامل مع رسالة الخطأ كما يفعل البعض.
-
في كثير من الأحيان يحتاج مدراء أنظمة لينكس للإطلاع على ملفات السجلات (log files) للكشف عن الأخطاء والمشاكل، وهذا الأمر في الحقيقة يجب على أي مدير نظام القيام به. يستطيع نظام لينكس ومُختلف التطبيقات توليد مختلف أنواع الرسائل والتي يتم تسجيلها في ملفات السجلات المختلفة، ويستخدم نظام لينكس مجموعة من ملفات الإعدادات والمجلدات والبرامج والأوامر والعفاريت (daemons) لإنشاء وتخزين وحذف رسائل السجل. ولذلك فإن معرفة المكان الذي يحتفظ فيه النظام على ملفات السجلات وكيفية استخدام الأوامر المتعلقة به يمكن أن يساعدك على توفير وقتك الثمين أثناء استكشاف الأخطاء وإصلاحها. في هذا الدرس، سنلقي نظرة على مُختلف جوانب السّجلات وإدارتها على أنظمة لينكس ملاحظة: تم اختبار هذه الأوامر على أنظمة CentOS 6.4 و Ubuntu 12 و Debian 7. الموقع الافتراضي لملفات السجلات إن الموقع الافتراضي لملفات السجلات هو var/log/. يمكنك رؤية قائمة الملفات الموجودة في هذا المجلد عن طريق الأمر: ls -l /var/log هذه قائمة ملفات السجلات الموجودة في نظام CentOS الخاص بي: total 1472 -rw-------. 1 root root 4524 Nov 15 16:04 anaconda.ifcfg.log -rw-------. 1 root root 59041 Nov 15 16:04 anaconda.log -rw-------. 1 root root 42763 Nov 15 16:04 anaconda.program.log -rw-------. 1 root root 299910 Nov 15 16:04 anaconda.storage.log -rw-------. 1 root root 40669 Nov 15 16:04 anaconda.syslog -rw-------. 1 root root 57061 Nov 15 16:04 anaconda.xlog -rw-------. 1 root root 1829 Nov 15 16:04 anaconda.yum.log drwxr-x---. 2 root root 4096 Nov 15 16:11 audit -rw-r--r-- 1 root root 2252 Dec 9 10:27 boot.log -rw------- 1 root utmp 384 Dec 9 10:31 btmp -rw-------. 1 root utmp 1920 Nov 28 09:28 btmp-20131202 drwxr-xr-x 2 root root 4096 Nov 29 15:47 ConsoleKit -rw------- 1 root root 2288 Dec 9 11:01 cron -rw-------. 1 root root 8809 Dec 2 17:09 cron-20131202 -rw-r--r-- 1 root root 21510 Dec 9 10:27 dmesg -rw-r--r-- 1 root root 21351 Dec 6 16:37 dmesg.old -rw-r--r--. 1 root root 165665 Nov 15 16:04 dracut.log -rw-r--r--. 1 root root 146876 Dec 9 10:44 lastlog -rw------- 1 root root 950 Dec 9 10:27 maillog -rw-------. 1 root root 4609 Dec 2 17:00 maillog-20131202 -rw------- 1 root root 123174 Dec 9 10:27 messages -rw-------. 1 root root 458481 Dec 2 17:00 messages-20131202 -rw------- 1 root root 2644 Dec 9 10:44 secure -rw-------. 1 root root 15984 Dec 2 17:00 secure-20131202 -rw------- 1 root root 0 Dec 2 17:09 spooler -rw-------. 1 root root 0 Nov 15 16:02 spooler-20131202 -rw-------. 1 root root 0 Nov 15 16:02 tallylog -rw-rw-r--. 1 root utmp 89856 Dec 9 10:44 wtmp -rw------- 1 root root 3778 Dec 6 16:48 yum.log عرض محتويات ملف السجل هذه قائمة من ملفات السجلات الشائعة التي يمكن أن تجدها في مجلد /var/log/: wtmp utmp dmesg messages maillog أو mail.log spooler auth.log أو secure إن ملفات wtmp و utmp تتبع تسجيل دخول وخروج المستخدمين ولا يمكنك عرض محتويات هذه الملفات باستخدام الأمر cat أو ما شابه، فهنالك أوامر خاصة لفعل ذلك. سوف نتعلم في هذا الدرس بعضا من هذه الأوامر. لتعرف من الذي سجّل دخوله حاليا في خادوم لينكس يمكنك بسهولة استخدام الأمر who، وهذا الأمر يحصل على بياناته من ملف var/run/utmp/ (لأنظمة CentOS وDebian) أو من ملف run/utmp/ (لأنظمة أوبنتو). هذا مثال من نظام CentOS: who root tty1 2013-12-09 10:44 root pts/0 2013-12-09 10:29 (10.0.2.2) sysadmin pts/1 2013-12-09 10:31 (10.0.2.2) joeblog pts/2 2013-12-09 10:39 (10.0.2.2) في هذه الحالة بالذات، أنا المستخدم الوحيد للنظام ولقد شغّلت الخادوم من Oracle VirtualBox ومن ثم استطعت الوصول إليه كمستخدم جذر من الطرفية من جلسة SSH، أما بالنسبة للمستخدميْن الآخريْن (sysadmin وjoebolg) فهم أيضا فتحا جلسات لهما على النظام. الأمر last يخبرنا بتاريخ تسجيل الدخول للمستخدمين: last | grep sysadmin sysadmin pts/1 10.0.2.2 Mon Dec 9 10:31 still logged in sysadmin pts/0 10.0.2.2 Fri Nov 29 15:42 - crash (00:01) sysadmin pts/0 10.0.2.2 Thu Nov 28 17:06 - 17:13 (00:06) sysadmin pts/0 10.0.2.2 Thu Nov 28 16:17 - 17:05 (00:48) sysadmin pts/0 10.0.2.2 Thu Nov 28 09:29 - crash (06:04) sysadmin pts/0 10.0.2.2 Wed Nov 27 16:37 - down (00:29) sysadmin tty1 Wed Nov 27 14:05 - down (00:36) sysadmin tty1 Wed Nov 27 13:49 - 14:04 (00:15) في هذا المثال، أحاول إيجاد تاريخ تسجيل الدخول لمستخدم sysadmin، وكما ترى، فهنالك أمثلة لبضعة حالات توقّف فيها النظام. لتعرف متى كانت آخر مرة تم إعادة تشغيل (reboot) النظام، يمكننا كتابة الأمر التالي: last reboot وستكون النتيجة مشابهة لهذه: reboot system boot 2.6.32-358.el6.x Mon Dec 9 10:27 - 10:47 (00:19) reboot system boot 2.6.32-358.el6.x Fri Dec 6 16:37 - 10:47 (2+18:10) reboot system boot 2.6.32-358.el6.x Fri Dec 6 16:28 - 16:36 (00:08) reboot system boot 2.6.32-358.el6.x Fri Dec 6 11:06 - 16:36 (05:29) reboot system boot 2.6.32-358.el6.x Mon Dec 2 17:00 - 16:36 (3+23:36) reboot system boot 2.6.32-358.el6.x Fri Nov 29 16:01 - 16:36 (7+00:34) reboot system boot 2.6.32-358.el6.x Fri Nov 29 15:43 - 16:36 (7+00:53) ... ... wtmp begins Fri Nov 15 16:11:54 2013 وإذا أردت معرفة متى سجّل شخص معين دخوله آخر مرة إلى النظام، استخدم الأمر lastlog: lastlog في نظامي، ستكون النتيجة مشابهة لهذه: Username Port From Latest root tty1 Mon Dec 9 10:44:30 +1100 2013 bin **Never logged in** daemon **Never logged in** adm **Never logged in** lp **Never logged in** sync **Never logged in** shutdown **Never logged in** halt **Never logged in** mail **Never logged in** uucp **Never logged in** operator **Never logged in** games **Never logged in** gopher **Never logged in** ftp **Never logged in** nobody **Never logged in** vcsa **Never logged in** saslauth **Never logged in** postfix **Never logged in** sshd **Never logged in** sysadmin pts/1 10.0.2.2 Mon Dec 9 10:31:50 +1100 2013 dbus **Never logged in** joeblog pts/2 10.0.2.2 Mon Dec 9 10:39:24 +1100 2013 بالنسبة لبقية ملفات السجل النصية، يمكنك استخدام أوامر cat أو head أو tail لقراءة محتوياتها. في المثال بالأسفل، أحاول النظر إلى آخر 10 أسطر من ملف var/log/messages/ في نظام Debian: sudo tail /var/log/messages ستكون المخرجات كالآتي: Dec 16 01:21:08 debian kernel: [ 9.584074] Bluetooth: BNEP (Ethernet Emulation) ver 1.3 Dec 16 01:21:08 debian kernel: [ 9.584074] Bluetooth: BNEP filters: protocol multicast Dec 16 01:21:08 debian kernel: [ 9.648220] Bridge firewalling registered Dec 16 01:21:08 debian kernel: [ 9.696728] Bluetooth: SCO (Voice Link) ver 0.6 Dec 16 01:21:08 debian kernel: [ 9.696728] Bluetooth: SCO socket layer initialized Dec 16 01:21:08 debian kernel: [ 9.832215] lp: driver loaded but no devices found Dec 16 01:21:08 debian kernel: [ 9.868897] ppdev: user-space parallel port driver Dec 16 01:21:11 debian kernel: [ 12.748833] [drm] Initialized drm 1.1.0 20060810 Dec 16 01:21:11 debian kernel: [ 12.754412] pci 0000:00:02.0: PCI INT A -> Link[LNKB] -> GSI 11 (level, low) -> IRQ 11 Dec 16 01:21:11 debian kernel: [ 12.754412] [drm] Initialized vboxvideo 1.0.0 20090303 for 0000:00:02.0 on minor 0 عفريت rsyslog في قلب آلية التّسجيل نجد عفريت rsyslog، وهذه الخدمة مسؤولة عن الاستماع إلى رسائل السجلات من مختلف أجزاء نظام لينكس ومن ثم توجيه الرسالة إلى ملف السجل الصحيح في مجلد var/log/ وكما يمكنها إعادة إرسال رسائل السجلات إلى خواديم لينكس آخرى. ملف إعدادات rsyslog يحصل عفريت rsyslog على إعداداته من ملف rsyslog.conf الموجود في مجلد etc/، ويعمل هذا الملف أساسا على اخبار عفريت rsyslog أين يحفظ رسائل السجلات، وهذه التعليمات تأتي من سلسلة أسطر متكونة من جزئين داخل الملف. يمكن إيجاد هذا الملف في rsyslog.d/50-default.conf في نظام أوبنتو. تتكون مجموعتا التعليمات من محدد (selector) وإجراء (action)، ويتم الفصل بين الجزئين بفراغ. يُحدد جزء "المحدد" مصدر وأهمية رسالة السجل وأما جزء "الإجراء" فيحتوي على ما يجب فعله مع تلك الرسالة. ينقسم جزء "المحدد" إلى جزئين مفصولين بنقطة .، ويسمى الجزء الأول بـ facility (جزء أصل الرسالة) وأما الثاني وهو الذي يأتي بعد النقطة فيسمى بـ priority (جزء درجة أهمية الرسالة) ومعا، أي جزئي facility/priority والإجراء يخبران rsyslog ماذا يفعل عندما يتم إنشاء رسالة تتطابق مع المعايير. هذا مقتطف من ملف rsyslog.conf على توزيعة CentOS: # rsyslog v5 configuration file ... ... # Include all config files in /etc/rsyslog.d/ IncludeConfig /etc/rsyslog.d/*.conf #### RULES #### # Log all kernel messages to the console. # Logging much else clutters up the screen. #kern.* /dev/console # Log anything (except mail) of level info or higher. # Don't log private authentication messages! *.info;mail.none;authpriv.none;cron.none /var/log/messages # The authpriv file has restricted access. authpriv.* /var/log/secure # Log all the mail messages in one place. mail.* -/var/log/maillog # Log cron stuff cron.* /var/log/cron # Everybody gets emergency messages *.emerg * # Save news errors of level crit and higher in a special file. uucp,news.crit /var/log/spooler # Save boot messages also to boot.log local7.* /var/log/boot.log ... ... لنفهم السطور السابقة، دعونا ننظر في أنواع المختلفة من المنشئات (facilities) التي يعترف بها نظام لينكس: auth أو authpriv: الرسائل التي تأتي من الأحداث المرتبطة بالأمن والتراخيص (authorization). kern: للرسائل القادمة من نواة لينكس. mail: للرسائل التي تم إنشاؤها من نظام الفرعي للبريد. cron: للرسائل المتعلقة بعفريت Cron. daemon: للرسائل القادمة من العفاريت. news: للرسائل القادم من النظام الفرعي لأخبار الشبكة. lpr: لرسائل السجل المتعلقة بالطباعة. user: لرسائل السجل القادمة من برامج المستخدم. من local0 إلى local7: محجوزة للاستخدام المحلي. وهذه قائمة من الأولويات بترتيب تصاعدي: debug: بيانات تنقيح البرامج. info: رسالة معلومات بسيطة - لا يلزم التدخل. notice: حالة قد تتطلب الاهتمام. warn: تحذير. err: خطأ. crit: حالة حرجة. alert: حالة تتطلب تدخلًا فوريًا. emerg: حالة طارئة مستعجلة. والآن دعونا ننظر إلى هذا السطر من الملف: cron.* /var/log/cron هذا السطر سيخبر عفريت rsyslog بحفظ جميع الرسائل من عفريت cron في ملف يدعى var/log/cron/، وأما رمز * بعد النقطة فيعني أن الرسائل من جميع الأولويات سيتم تسجيلها، وبالمثل فإذا تم وضع رمز * في المنشأ (facility) فذلك يعني لجميع المصادر. يمكن أن تكون المنشئات والأولويات مرتبطة بعدة طرق، ففي الشكل الافتراضي، عندما يكون هنالك أولوية واحد محددة بعد النقطة، فذلك يعني تحديد جميع الأحداث التي أولويتها أكبر أو تساوي تلك الأولوية، لذلك في الموجه التالي فإنه سيتم تسجيل جميع الرسائل القادمة من نظام الفرعي للبريد والتي تكون أولويتها من نوع تحذير فما فوق في ملف خاص داخل مجلد var/log/: mail.warn /var/log/mail.warn سيتم تسجيل جميع الرسائل التي تساوي أولويتها لـ "تحذير" فما فوق وتتُرك بقية الرسائل التي تكون أولويتها أقل من ذلك، أي أن الرسائل ذات أولوية err أو crit أو alert أو emerg لن يتم تسجيلها في الملف. إذا تم استخدام رمز المساواة = بعد النقطة فسيتم تسجيل فقط الأولوية المطابقة، أي أنه إذا أردت الحصول على رسائل info فقط القادمة من نظام الفرعي للرسائل، فإنك ستكتب شيء مشابه لهذا: mail.=info /var/log/mail.info مرة أخرى، إذا أردت الحصول على جميع الرسائل من نظام الفرعي للبريد ماعدا رسائل info، فإنك ستكتب شيئًا مشابهًا لهذا: mail.!info /var/log/mail.info أو هذا: mail.!=info /var/log/mail.info في الحالة الأولى، سيحتوي ملف mail.info على جميع الرسائل التي تملك أولوية أقل من info، وفي الحالة الثانية، سيحتوي هذا الملف على جميع الرسائل التي تملك أولوية أكبر من info. في حالة وجود أكثر من مَنشأ على نفس السطر فيجب الفصل بينها بواسطة فواصل، وفي حالة وجود مصادر متعددة (facility.priority) في نفس السطر فيجب الفصل بينها بواسطة الفاصلة المنقوطة. عندما يتم وضع علامة * لأحد الإجراءات فهذا يعني أن الإجراء لجميع المستخدمين. هذا السطر في ملف rsyslog.conf في نظام CentOS يخبرنا بهذا الشيء: # Everybody gets emergency messages *.emerg * حاول أن تعرف ماذا يقول ملف rsyslog.conf في نظام لينكس، فهذا مقتطف من خادوم نظام ديبيان الذي أعمل عليه: # /etc/rsyslog.conf Configuration file for rsyslog. # # For more information see # /usr/share/doc/rsyslog-doc/html/rsyslog_conf.html ... ... auth,authpriv.* /var/log/auth.log *.*;auth,authpriv.none -/var/log/syslog #cron.* /var/log/cron.log daemon.* -/var/log/daemon.log kern.* -/var/log/kern.log lpr.* -/var/log/lpr.log mail.* -/var/log/mail.log user.* -/var/log/user.log # # Logging for the mail system. Split it up so that # it is easy to write scripts to parse these files. # mail.info -/var/log/mail.info mail.warn -/var/log/mail.warn mail.err /var/log/mail.err # # Logging for INN news system. # news.crit /var/log/news/news.crit news.err /var/log/news/news.err news.notice -/var/log/news/news.notice كما ترى، يحفظ ديبيان جميع الرسائل ذات مستوى أمني/تراخيص في var/log/auth.log/ في حين أن CentOS يحفظها في var/log/secure/. إن إعدادات rsyslog يمكن أن تأتي من ملفات خاصة أخرى، هذه الملفات الخاصة موجودة في العادة في مجلدات مختلفة داخل مجلد etc/rsyslog.d/ ويحتوي ملف rsyslog.conf على جميع هذه المجلدات باستخدام موجه IncludeConfig$. هكذا يبدو شكلها في نظام أوبنتو: # Default logging rules can be found in /etc/rsyslog.d/50-default.conf .... .... $IncludeConfig /etc/rsyslog.d/*.conf تبدو المحتويات الموجودة في مجلد etc/rsyslog.d/ كالتالي: -rw-r--r-- 1 root root 311 Mar 17 2012 20-ufw.conf -rw-r--r-- 1 root root 252 Apr 11 2012 21-cloudinit.conf -rw-r--r-- 1 root root 1655 Mar 30 2012 50-default.conf لا يجب أن تكون وجهة رسائل السجل بالضرورة هي ملف السجل، فيمكن أن تُرسل الرسالة إلى طرفية المستخدم، وفي هذه الحالة، سيحتوي حقل الإجراء على اسم المستخدم، وإذا كنت تحتاج إلى إرسال الرسالة إلى أكثر من مستخدم واحد، فيجب فصل أسماء المستخدمين بفواصل وإذا أردت إرسالها لجميع المستخدمين فيمكنك وضع الرمز * في حقل الإجراء. بما أن عفريت rsyslog جزء من نظام تشغيل الشبكة، فلا يُمكنه حفظ السّجلات محليا فحسب، وإنما يمكنه أن يُرسلها إلى خواديم لينكس أخرى في الشبكة أو أن يُصبح مستودعًا لبقية الأنظمة. فالعفريت يستمع لرسائل السجل من منفذ UDP 514. المثال التالي سيُغير وجهة الرسائل الحرجة للنواة إلى خادوم يدعى texas. kern.crit @texas إنشاء واختبار رسائل سجل الخاصة بك حان الآن وقت إنشاء ملفات سجل خاصة بنا، ولتجربة هذا سنحتاج إلى التالي: إضافة مواصفات ملف السجل في ملف etc/rsyslog.conf/ إعادة تشغيل عفريت rsyslog تجربة الإعدادات باستخدام أداة logger في المثال التالي، أضفت سطرين جديدين إلى ملف rsyslog.conf التابع لنظام لينكس CentOS الخاص بي، وكما ترى، كل واحد منها قادم من منشأ يدعى local4 ولديهم أولويات مختلفة. vi /etc/rsyslog.conf .... .... # New lines added for testing log message generation local4.crit /var/log/local4crit.log local4.=info /var/log/local4info.log بعد ذلك، سيتم إعادة تحميل ملف الإعدادات عند إعادة تشغيل الخدمة: /etc/init.d/rsyslog restart Shutting down system logger: [ OK ] Starting system logger: [ OK ] الآن، تم استدعاء تطبيق التسجيل لإنشاء رسالة سجل: logger -p local4.info " This is a info message from local 4" الآن، عند النظر إلى مجلد var/log/ سوف تجد ملفين جديدين: ... ... -rw------- 1 root root 0 Dec 9 11:21 local4crit.log -rw------- 1 root root 72 Dec 9 11:22 local4info.log إن حجم ملف local4info.log لا يساوي صفر، لذلك عندما يتم فتحه، سأرى الرسالة التي تم تسجيلها: cat /var/log/local4info.log Dec 9 11:22:32 TestLinux root: This is a info message from local 4 تدوير ملفات السجل كلما زادت المعلومات المكتوبة في ملفات السجل ازداد حجمها، ومن الواضح أن هذا الأمر سيقلل من الأداء وستكون إدارة هذه الملفات عملية متعبة. لينكس يستخدم مفهوم "التدوير" لملفات السجل بدلا من تنظيفها أو حذفها، عندما يتم تدوير سجل معين، سيتم إنشاء ملف جديد وتغيير اسم الملف القديم وضغطه بشكل إختياري. يمكن لملف السجل أن يملك عدة نسخ قديمة لا تزال موجودة، وهذه الملفات قد تعود لفترات قديمة من الزمن وستكون كسجل متراكم، وعند إنشاء عدد معين من هذه المتراكمات سيتسبب السجل المُدوّر بحذف ملف السجل الأقدم . يتم تشغيل التدوير عن طريق أداة logrotate. ملف إعدادات logrotate يعتمد logrotate مثل rsyslog على ملف الإعدادات واسم هذا الملف هو logrotate.conf وهو موجود في etc/. هذا ما أراه في ملف logrotate.conf على خادوم ديبيان الخاص بي: cat /etc/logrotate.conf # see "man logrotate" for details # rotate log files weekly weekly # keep 4 weeks worth of backlogs rotate 4 # create new (empty) log files after rotating old ones create # uncomment this if you want your log files compressed #compress # packages drop log rotation information into this directory include /etc/logrotate.d # no packages own wtmp, or btmp -- we'll rotate them here /var/log/wtmp { missingok monthly create 0664 root utmp rotate 1 } /var/log/btmp { missingok monthly create 0660 root utmp rotate 1 } # system-specific logs may be configured here الأسطر مفهومة وتشرح نفسها بنفسها، بشكل افتراضي، ملفات السجل يتم تدويرها بشكل أسبوعي مع الإبقاء على أربع سجلات في وقت واحد، عندما يشتغل البرنامج سيتم إنشاء ملف سجل جديد وسيتم ضغط الملف القديم اختياريا. الاستثناء الوحيد هو في ملفات wtmp و btmp، فملفات wtmp تتبع تسجيلات الدخول للنظام وأما btmp فهي تتبع تسجيلات الدخول النظام الخاطئة، كلا هذين الملفين يتم تدوريهما كل شهر ولن يتم إرجاع أي خطأ إذا كان أحد الملفات السابقة لـ wtmp أو btmp غير موجود. يتم الاحتفاظ بملفات إعدادات التّدوير المخصصة في مجلد etc/logrotate.d/، وهذه أيضا يتم تضمينها في ملف logrotate.conf مع التوجيه. يعرض لي نظام ديبيان محتويات هذا المجلد: ls -l /etc/logrotate.d total 44 -rw-r--r-- 1 root root 173 Apr 15 2011 apt -rw-r--r-- 1 root root 79 Aug 12 2011 aptitude -rw-r--r-- 1 root root 135 Feb 24 2010 consolekit -rw-r--r-- 1 root root 248 Nov 28 2011 cups -rw-r--r-- 1 root root 232 Sep 19 2012 dpkg -rw-r--r-- 1 root root 146 May 12 2011 exim4-base -rw-r--r-- 1 root root 126 May 12 2011 exim4-paniclog -rw-r--r-- 1 root root 157 Nov 16 2010 pm-utils -rw-r--r-- 1 root root 94 Aug 8 2010 ppp -rw-r--r-- 1 root root 515 Nov 30 2010 rsyslog -rw-r--r-- 1 root root 114 Nov 26 2008 unattended-upgrades محتويات ملف rsyslog تظهر لك كيف يتم تدوير بعض ملفات السجل: cat /etc/logrotate.d/rsyslog /var/log/syslog { rotate 7 daily missingok notifempty delaycompress compress postrotate invoke-rc.d rsyslog reload > /dev/null endscript } /var/log/mail.info /var/log/mail.warn /var/log/mail.err /var/log/mail.log /var/log/daemon.log /var/log/kern.log /var/log/auth.log /var/log/user.log /var/log/lpr.log /var/log/cron.log /var/log/debug /var/log/messages { rotate 4 weekly missingok notifempty compress delaycompress sharedscripts postrotate invoke-rc.d rsyslog reload > /dev/null endscript } كما ترى، إن ملف syslog ستتم إعادة تهيئته يوميا مع إبقاء ملفات السجل لمدة 7 أيام، أما بقية ملفات السجل فيتم تدويرها أسبوعيا. كما لا ننسى موجه postrotate فهو جدير بالذكر أيضا، فهذا الإجراء يحدد ماذا يحدث بعد الانتهاء من كامل عملية إعادة تدوير ملف السجل. تجربة التدوير يمكن أن يشتغل Logrotate يدويا لإعادة تدوير ملف أو أكثر، ولفعل ذلك، يمكننا ببساطة تحديد ملف الإعدادات الخاص بالأمر كمعامل لهذا الأمر. لنرى كيف يعمل، هذه قائمة جزئية من ملفات السجل موجود في مجلد var/log/ على الخادوم التجريبي CentOS الخاص بي: ls -l /var/log total 800 ... -rw------- 1 root root 359 Dec 17 18:25 maillog -rw-------. 1 root root 1830 Dec 16 16:35 maillog-20131216 -rw------- 1 root root 30554 Dec 17 18:25 messages -rw-------. 1 root root 180429 Dec 16 16:35 messages-20131216 -rw------- 1 root root 591 Dec 17 18:28 secure -rw-------. 1 root root 4187 Dec 16 16:41 secure-20131216 ... ... سوف تبدو المحتويات الجزئية لملف logrotate.conf كالتالي: cat /etc/logrotate.conf # see "man logrotate" for details # rotate log files weekly weekly # keep 4 weeks worth of backlogs rotate 4 # create new (empty) log files after rotating old ones create ... ... بعد ذلك قمنا بتشغيل أمر logrotate: logrotate -fv /etc/logrotate.conf سيتم نقل الرسائل عند إنشاء الملفات الجديدة والتعامل مع الأخطاء. وعندما يتنهي كل هذا، سنحاول التأكد من ملفات mail وsecure و messages الجديدة: ls -l /var/log/mail* -rw------- 1 root root 0 Dec 17 18:34 /var/log/maillog -rw-------. 1 root root 1830 Dec 16 16:35 /var/log/maillog-20131216 -rw------- 1 root root 359 Dec 17 18:25 /var/log/maillog-20131217 ls -l /var/log/messages* -rw------- 1 root root 148 Dec 17 18:34 /var/log/messages -rw-------. 1 root root 180429 Dec 16 16:35 /var/log/messages-20131216 -rw------- 1 root root 30554 Dec 17 18:25 /var/log/messages-20131217 ls -l /var/log/secure* -rw------- 1 root root 0 Dec 17 18:34 /var/log/secure -rw-------. 1 root root 4187 Dec 16 16:41 /var/log/secure-20131216 -rw------- 1 root root 591 Dec 17 18:28 /var/log/secure-20131217 كما ترى، تم إنشاء ملفات السجل الجديدة الثلاث، ملفات maillog و secure لاتزال فارغة، في حين أن ملف messages يملك بعض المعلومات. خاتمة نأمل أن يكون هذا الدرس قد أعطاك بعض الأفكار حول سجلات نظام لينكس، يمكنك أن تحاول وتجرب على خادومك التجريبي حتى تكون لديك فكرة أفضل، حالما تتعود على أماكن ملفات السجل وإعداداتها، استخدم معرفتك لدعم نظم الإنتاج الخاصة بك، وحينها، يمكنك إنشاء بعض الكُنيات aliases لتوفير بعض الوقت . ترجمة -وبتصرف- للمقال: How To View and Configure Linux Logs on Ubuntu and Centos لصاحبه Sadequl Hussain.
-
يوجد عدة طرق في روبي لفعل ذلك، فلو افترضنا أن hashes موجودة في متغيرين a وb فيمكنك دمجهما عبر استخدام تابع merge بسطر واحد كما في المثال التالي: a.merge(b) {|key, a_val, b_val| a_val.merge b_val } أما لو كنت تستخدم الإصدار الثالث من ريلز أو إصدار أحدث منه فيمكنك فعل نفس الأمر بطريقة أسهل وذلك عن طريق استخدام تابع deep_merge كما في المثال التالي: a.deep_merge(b)
-
للحصول على اسم الاستثناء الذي حدث يمكنك استخدام طريق as ex حيث ستضع جملة try except كالعادة لكن في except ستضيف as ex حيث أن ex هو اسم المتغير الذي ستضع فيه اسم الاستثناء كما في المثال التالي: try: ... except Exception as ex: print ex بالمناسبة يمكنك اختبار أكثر من استثناء في نفس الوقت والقيام بأوامر معينة حسب الاستثناء كما في المثال التالي: try: someFunction() except ValueError: # do something except ZeroDivision: # do something else
-
توجد عدة طرق لفعل ذلك في جانغو، فيمكنك على سبيل المثال استخدام دالة extract من مكتبة tldextract (بعد تحميلها وتثبيتها) كما في المثال التالي: >>> import tldextract >>> tldextract.extract('http://forums.news.cnn.com/') ExtractResult(subdomain='forums.news', domain='cnn', suffix='com') أو يمكنك استخدام دالة urlparse من مكتبة urlparse مع دالة format لاستخرج اسم النطاق كما في المثال التالي: from urlparse import urlparse parsed_uri = urlparse( 'https://academy.hsoub.com/freelance/productivity/%D9%83%D9%8A%D9%81-%D8%AA%D8%B3%D8%AA%D8%BA%D9%84-%D8%A7%D9%84%D8%B3%D8%A7%D8%B9%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D9%8A%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D9%8A-%D9%84%D8%A7-%D8%AA%D8%AC%D8%AF-%D9%81%D9%8A%D9%87%D8%A7-%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D9%84%D9%84%D8%B9%D9%85%D9%84-%D8%B9%D9%84%D9%8A%D9%87%D8%A7-%D9%84%D8%A8%D9%86%D8%A7%D8%A1-%D9%85%D8%B4%D8%B1%D9%88%D8%B9%D9%83-%D8%A7%D9%84%D8%AC%D8%A7%D9%86%D8%A8%D9%8A%D8%9F-r115/' ) domain = '{uri.scheme}://{uri.netloc}/'.format(uri=parsed_uri) print domain # gives 'http://academy.hsoub.com/'
- 2 اجابة
-
- 1
-
-
توجد عدة طرق في بايثون للتأكد من ذلك، فيمكنك على سبيل المثال استخدام دالة total_seconds() بعد القيام بعملية طرح التاريخ الثاني من التاريخ الأول وستحصل في النهاية على النتيجة كعدد حقيقي كالتالي: >>> (b-a).total_seconds() 87632.0 أو يمكنك استخدام seconds بعد القيام بعملية طرح كما في المثال التالي: >>> d = b - a >>> d.seconds 43
-
توجد عدة طرق لفعل ذلك في بايثون، فلو افترضنا أن أسماء الملفات موجودة في متغير باسم files فيمكنك استخدام هذه الطريق لدمجها في ملف نهائي باسم final.txt باستخدام حلقة التكرار for كما في المثال التالي: with open('/home/hichem/final.txt', 'w') as outfile: for fname in files: with open(fname) as infile: outfile.write(infile.read()) وإذا كان حجم الملفات كبير فيمكنك استخدام هذه الطريقة بدلا من الطريقة الأولى: with open('/home/hichem/final.txt', 'w') as outfile: for fname in files: with open(fname) as infile: for line in infile: outfile.write(line)
-
يوجد عدة طرق لفعل ذلك في لغة بايثون فيمكنك على سبيل المثال استخدام دالة unhexlify من مكتبة binascii كما في المثال التالي: import binascii binary_string = binascii.unhexlify(hex_string) أو يمكنك استخدام دالة int لتحويل العدد إلى عدد صحيح ومن ثم دالة bin لتحويلها إلى عدد ثنائي كما في المثال التالي: bin(int("abc123efff", 16))[2:] ولحل مشكلة الأصفار على اليسار يمكنك استخدام هذه الطريقة: bin(int("1ac", 16))[2:].zfill(8)
-
يوجد عدة طرق في روبي لفعل ذلك فإذا كنت تستخدم الإصدار 1.9 من روبي فيكفي أن تضع هذا السطر في شيفرتك البرمجية وسيصبح عفريت: Process.daemon أو يمكنك استخدام Daemonize.rb (daemons gem) وذلك عن طريق استعمال سطر Daemons.daemonize بعد استدعاء المكتبة كالتالي: require 'daemons' Daemons.daemonize ولتثبيت هذا gem يمكنك كتابة السطر التالي في الطرفية: gem install daemons
-
توجد عدة طرق في لغة بايثون لفعل ذلك، فيمكنك على سبيل المثال استعمال هذه الطريقة التي تستعمل طريقة الدوران في القائمة وتحديد هل هي مرتبة أم لا كما في المثال التالي: all(l[i] <= l[i+1] for i in xrange(len(l)-1)) أو يمكنك استخدام حل أسهل من هذا بكثير وهو عن طريق التأكد باستخدام الجملة الشرطية if ما إذا كانت القائمة المرتبة باستخدام دالة sorted() تساوي قائمتنا الحالية كما في المثال التالي: if sorted(l) == l: # code here
-
توجد في بايثون طرق عديدة لفعل ذلك، فيمكنك على سبيل المثال استخدام دالة float لتحويل العنصر إلى عدد حقيقي ومن ثم الدوران على عناصر القائمة عن طريق استخدام حلقة تكرار for حيث سينتج لنا قائمة جديدة تحتوي على أرقام حقيقية كما في المثال التالي: [float(i) for i in mylist] أو يمكنك استخدام دالة map إذا كنت تستخدم الإصدار الثاني من بايثون كما في المثال التالي: map(float, mylist) أما لو كنت تستخدم الإصدار الثالث، فيجب عليك استخدام دالة list على المثال السابق كالتالي: list(map(float, mylist) يقصد أرقام حقيقية(أعداد بالفاصلة مثل 3.14) والتي تسمى Float في بايثون و Real في لغات برمجة أخرى.
- 2 اجابة
-
- 1
-
-
توجد عدة طرق سهلة في بايثون لمعرفة ذلك، فيمكنك على سبيل المثال استخدام طريقة try except حيث ستجرب تحويل مدخلات المستخدم إلى int فإذا تحولت فهذا يعني أنها رقم وإذا ظهر خطأ من نوع ValueError فهذا يعني أنها ليست كذلك كما في المثال التالي: try: val = int(usersinput) except ValueError: print("Not Int!") أو يمكنك استخدام دالة isdigit معرفة ذلك كما في المثال التالي: if usersinput.isdigit(): #do smth
-
تعتبر set نوع من أنواع list كما يظهر في الاختبار التالي: type(my_set) >>> <type 'list'> أما لو رغبت بالتحويل فتوجد العديد من الطرق في لغة بايثون، ويمكنك التخلي عن فكرة حلقة التكرار لصالح دالة list التي ستحول لك set إلى قائمة عادية كما في المثال التالي: list1 = list(set1) print list1 >> [1, 2, 3] ويمكنك أيضا اختصار خطوات إنشاء وتحويل set في سطر واحد كما في المثال التالي: my_list = list(set([1,2,3])
-
يمكنك استخدام طرق عديدة للمقارنة بين عناصر قائمتين x و y، فيمكنك على سبيل المثال استخدام دالةCounter من مكتبة collections ومن ثم المقارنة باستخدام عامل == كالمعتاد كما في المثال التالي: import collections collections.Counter(x) == collections.Counter(y) أو يمكنك تحويل القائمتين إلى set عند المقارنة كالتالي: set(x) == set(y) أو يمكنك ترتيب عناصر القائمتين عند المقارنة كما في المثال التالي: sorted(x) == sorted(y)
- 1 جواب
-
- 1
-
-
يوجد عدة طرق لفعل ذلك في بايثون، فـ numpy يمتلك خيارين لحساب ذلك، فيمكنك على سبيل المثال استخدام دالة sum كما في المثال التالي: >>> np.sum(barray) 5 أو يمكنك أيضا استخدام دالة count_nonzero التي ستحسب العناصر الغير صفرية (الغير خاطئة) كما في المثال التالي: >>> np.count_nonzero(barray) 5 ملاحظة لن تعمل الطريقة السابقة في NumPy تتكون من قوائم تحتوي على قيم منطقية كما في المثال التالي: >>> sum([[False, False, True], [True, False, True]]) TypeError...
-
يوجد عدة طرق لمعرفة ذلك عن طريق استخدام لغة بايثون، فيمكنك على سبيل المثال استخدام دالة فتح رابط من مكتبة urllib2 لفتح موقع معين (مثل جوجل)، فإذا فتح فهذا يعني أن هنالك اتصال بشبكة الإنترنت كما في المثال التالي: import urllib2 def internet_on(): try: response=urllib2.urlopen('http://74.125.228.100',timeout=1) return True except urllib2.URLError as err: pass return False يمكنك تغيير رابط التجربة إلى أي رابط آخر تريده لكن يجب أن يكون الموقع سريع لأننا مررنا معامل timeout=1 والذي سيجرب الرابط في زمن لا يتعدى ثانية واحدة.
-
نعم، فلغة روبي تدعم العديد من الطرق للدوران والحساب، ولإنشاء الحلقة التي تريدها أنت يمكنك استخدم حلقة upto وتمرير العدد الأخير n ويجب البدء بأول عنصر تريد أن تبدأ به كما في المثال التالي: 1.upto(10) do |i| puts i end أو يمكنك استخدام step بدلا من upto والتي تتميز بأنها تسمح لك بزيادة قيمة الخطوة الواحدة كما في المثال التالي: 1.step(10,2) { |i| puts i } 1 3 5 7 9 حيث أن الخطوة تساوي في هذا المثال 2.