كيف تستخدم virtualenv

Posted: أبريل 26, 2013 in General
الوسوم:,

 

لتجربة أفضل في القراءة فضلا تابع الموضوع هنا

http://arabteam2000-forum.com/index.php/topic/277534-%D9%83%D9%8A%D9%81-%D8%AA%D9%86%D8%B4%D8%A6-%D8%A8%D9%8A%D8%A6%D8%A7%D8%AA-%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D9%85%D8%B9%D8%B2%D9%88%D9%84%D8%A9-%D9%84%D9%85%D8%B4%D8%B1%D9%88%D8%B9%D9%83-%D8%B9%D8%A8%D8%B1-virtualenv/

 

كتبت مشروع ب Django 1.0 وسارت الأمور جيدا ولكن أحببت أن تكتب مشروع آخر ب Django 1.5 ويوجد تغييرات كثيرة ، فقد تقوم بعمل عدة أشياء تعتمد على إصدارات مختلفة من نفس الحزمة وهنا تحدث المشكلة. كيف يمكن تنصيب Django 1.0 و Django 1.5 في نفس الوقت ؟
أو حتى غير متاح لك عبر الصلاحيات إضافة حزم على مستوى النظام ؟

system-wide installation
المقصود بها هو التنصيب لتصبح مع المكتبات المعلومة على مستوى النظام ، ستجدها على سبيل المثال في مسار مثل
/usr/lib64/python/site-packages
وهذا مايتم فعله عندما تستخدم easy_install او pip

كالعادة يوجد لدينا حل ذكي وهو virtualenv وهي آداة تقوم بإنشاء بيئات مستقلة قائمة بذاتها لبايثون

أذهب الآن إلى سطر الأوامر وقم بتنفيذ

easy_install virtualenv
easy_install pip

الآن بعض العمل

<br />[striky@localhost mywspace]$ virtualenv sniply<br />New python executable in sniply/bin/python<br />Installing setuptools............done.<br />Installing pip...............done.<br />[striky@localhost mywspace]$ cd sn<br />snapboard-read-only/ sniply/ <br />[striky@localhost mywspace]$ cd sniply/</p><p>

قمنا بإنشاء بيئة عمل جديدة بإسم sniply -المفترض إسم مشروع مشابه ل gist ويقوم بتصغير الرابط كذلك- عبر الأمر virtualenv
لاحظ وجود setuptools إفتراضيا إذا أردت أن تستخدم distribute فقم بتمرير معامل –distribute للأمر virtualenv او قم بتعريف متغير
$export VIRTUALENV_DISTRIBUTE=true

فلنظر لهيكلية البيئة التي تم إنشائها

<br />[striky@localhost sniply]$ tree .<br />.<br />├── bin<br />│   ├── activate<br />│   ├── activate.csh<br />│   ├── activate.fish<br />│   ├── activate_this.py<br />│   ├── easy_install<br />│   ├── easy_install-2.7<br />│   ├── pip<br />│   ├── pip-2.7<br />│   └── python<br />├── include<br />│   └── python2.7 -&gt; /usr/include/python2.7<br />├── lib<br />│   └── python2.7<br />│   ├── _abcoll.py -&gt; /usr/lib64/python2.7/_abcoll.py<br />│   ├── _abcoll.pyc<br />│   ├── abc.py -&gt; /usr/lib64/python2.7/abc.py<br />│   ├── abc.pyc<br />│   ├── codecs.py -&gt; /usr/lib64/python2.7/codecs.py<br />│   ├── codecs.pyc<br />│   ├── config -&gt; /usr/lib64/python2.7/config<br />│   ├── copy_reg.py -&gt; /usr/lib64/python2.7/copy_reg.py<br />│   ├── copy_reg.pyc<br />│   ├── distutils<br />│   │   ├── distutils.cfg<br />│   │   ├── __init__.py<br />│   │   └── __init__.pyc<br />│   ├── encodings -&gt; /usr/lib64/python2.7/encodings<br />│   ├── fnmatch.py -&gt; /usr/lib64/python2.7/fnmatch.py<br />│   ├── fnmatch.pyc<br />│   ├── genericpath.py -&gt; /usr/lib64/python2.7/genericpath.py<br />│   ├── genericpath.pyc<br />│   ├── lib-dynload -&gt; /usr/lib64/python2.7/lib-dynload<br />│   ├── linecache.py -&gt; /usr/lib64/python2.7/linecache.py<br />│   ├── linecache.pyc<br />│   ├── locale.py -&gt; /usr/lib64/python2.7/locale.py<br />│   ├── no-global-site-packages.txt<br />│   ├── ntpath.py -&gt; /usr/lib64/python2.7/ntpath.py<br />│   ├── orig-prefix.txt<br />│   ├── os.py -&gt; /usr/lib64/python2.7/os.py<br />│   ├── os.pyc<br />│   ├── posixpath.py -&gt; /usr/lib64/python2.7/posixpath.py<br />│   ├── posixpath.pyc<br />│   ├── re.py -&gt; /usr/lib64/python2.7/re.py<br />│   ├── re.pyc<br />│   ├── site-packages<br />│   │   ├── easy-install.pth<br />│   │   ├── pip-1.2.1-py2.7.egg<br />│   │   │   ├── EGG-INFO<br />│   │   │   │   ├── dependency_links.txt<br />│   │   │   │   ├── entry_points.txt<br />│   │   │   │   ├── not-zip-safe<br />│   │   │   │   ├── PKG-INFO<br />│   │   │   │   ├── SOURCES.txt<br />│   │   │   │   └── top_level.txt<br />│   │   │   └── pip<br />│   │   │   ├── backwardcompat.py<br />│   │   │   ├── backwardcompat.pyc<br />│   │   │   ├── basecommand.py<br />│   │   │   ├── basecommand.pyc<br />│   │   │   ├── baseparser.py<br />│   │   │   ├── baseparser.pyc<br />│   │   │   ├── commands<br />│   │   │   │   ├── bundle.py<br />│   │   │   │   ├── bundle.pyc<br />│   │   │   │   ├── completion.py<br />│   │   │   │   ├── completion.pyc<br />│   │   │   │   ├── freeze.py<br />│   │   │   │   ├── freeze.pyc<br />│   │   │   │   ├── help.py<br />│   │   │   │   ├── help.pyc<br />│   │   │   │   ├── __init__.py<br />│   │   │   │   ├── __init__.pyc<br />│   │   │   │   ├── install.py<br />│   │   │   │   ├── install.pyc<br />│   │   │   │   ├── search.py<br />│   │   │   │   ├── search.pyc<br />│   │   │   │   ├── uninstall.py<br />│   │   │   │   ├── uninstall.pyc<br />│   │   │   │   ├── unzip.py<br />│   │   │   │   ├── unzip.pyc<br />│   │   │   │   ├── zip.py<br />│   │   │   │   └── zip.pyc<br />│   │   │   ├── download.py<br />│   │   │   ├── download.pyc<br />│   │   │   ├── exceptions.py<br />│   │   │   ├── exceptions.pyc<br />│   │   │   ├── index.py<br />│   │   │   ├── index.pyc<br />│   │   │   ├── __init__.py<br />│   │   │   ├── __init__.pyc<br />│   │   │   ├── locations.py<br />│   │   │   ├── locations.pyc<br />│   │   │   ├── log.py<br />│   │   │   ├── log.pyc<br />│   │   │   ├── __main__.py<br />│   │   │   ├── __main__.pyc<br />│   │   │   ├── req.py<br />│   │   │   ├── req.pyc<br />│   │   │   ├── runner.py<br />│   │   │   ├── runner.pyc<br />│   │   │   ├── status_codes.py<br />│   │   │   ├── status_codes.pyc<br />│   │   │   ├── util.py<br />│   │   │   ├── util.pyc<br />│   │   │   └── vcs<br />│   │   │   ├── bazaar.py<br />│   │   │   ├── bazaar.pyc<br />│   │   │   ├── git.py<br />│   │   │   ├── git.pyc<br />│   │   │   ├── __init__.py<br />│   │   │   ├── __init__.pyc<br />│   │   │   ├── mercurial.py<br />│   │   │   ├── mercurial.pyc<br />│   │   │   ├── subversion.py<br />│   │   │   └── subversion.pyc<br />│   │   ├── setuptools-0.6c11-py2.7.egg<br />│   │   └── setuptools.pth<br />│   ├── site.py<br />│   ├── site.pyc<br />│   ├── sre_compile.py -&gt; /usr/lib64/python2.7/sre_compile.py<br />│   ├── sre_compile.pyc<br />│   ├── sre_constants.py -&gt; /usr/lib64/python2.7/sre_constants.py<br />│   ├── sre_constants.pyc<br />│   ├── sre_parse.py -&gt; /usr/lib64/python2.7/sre_parse.py<br />│   ├── sre_parse.pyc<br />│   ├── sre.py -&gt; /usr/lib64/python2.7/sre.py<br />│   ├── stat.py -&gt; /usr/lib64/python2.7/stat.py<br />│   ├── stat.pyc<br />│   ├── types.py -&gt; /usr/lib64/python2.7/types.py<br />│   ├── types.pyc<br />│   ├── UserDict.py -&gt; /usr/lib64/python2.7/UserDict.py<br />│   ├── UserDict.pyc<br />│   ├── warnings.py -&gt; /usr/lib64/python2.7/warnings.py<br />│   ├── warnings.pyc<br />│   ├── _weakrefset.py -&gt; /usr/lib64/python2.7/_weakrefset.py<br />│   └── _weakrefset.pyc<br />└── lib64 -&gt; ./lib</p><p>16 directories, 122 files</p><p>

الآن ماذا ؟
كما ترى في مجلد bin يوجد عدة ملفات تنفيذية مثل activate, easy_install, pip, python
فكما خمنت قم بتفعيل تلك البيئة الإفتراضية المعزولة عبر activate

<br />[striky@localhost sniply]$ source bin/activate<br />(sniply)[striky@localhost sniply]$</p><p>

لاحظ هنا وجود كلمة (sinply) اما مؤشر المستخدم لتشير إلى أنك داخل البيئة الإفتراضية sniply

للخرو ج من بيئة sniply بكل بساطة إستدعي الأمر deactivate

<br />(sniply)[striky@localhost sniply]$ deactivate <br />[striky@localhost sniply]$</p><p>

قم بتنصيب ماتشاء

<br />(sniply)[striky@localhost sniply]$ pip install flask<br />

مثلا سأقوم بتنصيب flask لكون النسخة التي تم تنصيبها على النظام قديمة قليلا

الناتج

<br />(sniply)[striky@localhost sniply]$ ls lib64/python2.7/site-packages/<br />easy-install.pth pip-1.2.1-py2.7.egg<br />flask setuptools-0.6c11-py2.7.egg<br />Flask-0.9-py2.7.egg-info setuptools.pth<br />jinja2 werkzeug<br />Jinja2-2.6-py2.7.egg-info Werkzeug-0.8.3-py2.7.egg-info</p><p>

لاحظ أن تم تنصيب flask و الحزم المتعلقة بها على مستوى بيئة sniply وليست على مستوى النظام
لنا لقاء آخر عن virtualenvwrapper

http://www.virtualenv.org/en/latest/

وصلني هذا الرابط يتساءل فيه أحد الأشخاص عن مشاركات المرأة في ذلك الموقع

 

الغريب وجود ردود من بعض الساقطة لاتعبر إلا على مستوى كبير من العنصرية والجهل وللأسف من إدارين في هذا الموقع مثل

 

ان كنت إمراه فهذا السؤال لا رأس له ولا رجلين وان كنت رجلا فما حاجتك تبحث في امور النساء ؟

—-

وأحد الساقطين ممن لانعلم له رأس من قدم كتب

“أنا معترض على المرأة ، فما الفائدة من العمل إذا كان الزوج متكفل بالبيت على أتم وجه ؟ 
ولا أريد أن يظهر لنا قاسم أمين أخر في المنتدى ، رجاءً”

وأحد الساقطين الآخرين

“لم يبق للمرأة إلا أن تعمل مكانك”

—————————————-

 

وعلى ذلك فأنا أحذر من ذلك الموقع وأعضائه العنصريين مادام القائمين عليه متساهلين مع هذا التمييز  والعنصرية من بعض أشباه الرجال خاصة الإداريين منهم

تنصيب Ocaml و OPAM

Posted: يناير 29, 2013 in General
الوسوم:,

لغة Ocaml لغة Functional (تدعم البرمجة الكائنيةهل سمعت عن F# لغة مايكروسوفت؟ استنسخت العديد من صفات Ocaml وأضافت إليها بعض التحسينات-)شهيرة جدا في نطاقها مثل Haskell و Lisp

 

سنتحدث اليوم عن كيفية التنصيب

 ستجد Ocaml موجودة في مدير الحزم لديك وهذا ماكنت أستخدمه حتى فترة قريبة وأقوم بإضافة الحزم التي أريدها من مدير الحزم بدون وجع دماغ ولكن سريعا ستجد أن بعض الحزم غير موجودة وعلى كل حال Ocaml تقدم مدير حزم مثل Gems او Cabal لتقوم بإضافة وتحديث الحزم كما تشاء من مستودعات ocaml

 

فقط كل ماعليك

wget http://www.ocamlpro.com/pub/opam_installer.sh
sh ./opam_installer.sh /usr/local/bin

 

 

 

بعد الإنتهاء هناك العديد من الأوامر مثل

opam info xxx

opam search xxx

opam install xxx

opam update

opam list

 

xxx هو إسم الحزمة التي تريدها

تستطيع كذلك إدارة عدد من الإصدارات ل Ocaml عبر opam switch –إستخدم دائما آخر إصدار

 

http://opam.ocamlpro.com/doc/Quick_Install.html

بوست سريع نظرا للإنشغال

بداية بعتذر لجميع المتابعين والمهتمين ببايثون وروبي عن توقف موقع PF حاليا

عملنا إنتقالة لمشروع وسيط tuxcoders على sourceforge ونقلنا ليه معظم الوثائق

للوصول السريع
http://tuxcoders.sourceforge.net/dokuwiki/doku.php?id=start&do=index

كتاب بايثون العربي
http://tuxcoders.sourceforge.net/dokuwiki/doku.php?id=pythonguide:pythonguide

كتاب مقدمة في روبي
http://tuxcoders.sourceforge.net/dokuwiki/doku.php?id=intro_ruby:intro_ruby

دروس LazarusTutorial في الفهرس

easy_install rbac

وتشمل وحدتين
1- simplerbac
2- dbrbac

الأولى تقدم لك SimpleAuthManager وهو مناسب جدا إذا الموارد التي ستتحكم فيها قليلة نوعا ما والثاني DBAuthManager وهو يقوم بتخزين الموارد والصلاحيات عليها في قاعدة بيانات (يتطلب منك SQLAlcemey وبإذن الله سيتوافر آخر ل Django)
يتميز كلا منها بالقدرة على قراءة ال authitems -(وهي إما role او task او operation وتفاصيلهم) -بالإضافة لصلاحيات المستخدمين من خلال ملفات إعداد مسبقة مثل json او ini وهذا سيتم توضيحه في الأمثلة التالية

أنظر إلى المثال التالي



def testINI():
        import io
        
        
        s="""
[authitems]
admin=role
taskmanagement=task
user=role
topic.create=operation
topic.read=operation
topic.update=operation
topic.delete=operation


[taskmanagement]
childs=topic.read topic.create topic.read topic.update topic.delete
description= topic crud task

[admin]
childs=taskmanagement
description=admin role

[user]
childs=topic.read topic.create





[topic.create]
description=create topic 

[users]
1=user topic.delete
2=user

""" 
        fp=io.BytesIO(s)
        
        sm=SimpleAuthManager()
        sm.init_from_ini(fp)
        print sm.get_user_caps(1)
        print "admin can topic.delete", sm.can("admin", "topic.delete")
        print "user can topic.delete", sm.can("user", "topic.delete")
        print "user 1 can topic.delete", sm.user_can(1, "topic.delete")
        print "user 2 can topic.delete", sm.user_can(2, "topic.delete")
        

يتم تعريف ال authitems في قسم خاص بها
ثم إذا كان هناك تعريفات ل authitem معينة مثل الوصف او الأبناء فيتم وضعها في قسم خاص بها
اما المستخدمين فيتم تعريف صلاحياتهم في قسم users حيث يحتوي كل صف على رقم المستخدم في مقابل السماحيات المتاحة له

كيفية العمل:
1- إنشاء الكائن من الصف المناسب SimpleAuthManager او DBAuthManager
2- إنشاء الصلاحيات وتحديدها إما عبر صيغة ini او json أو يدويا كما سنرى في مثال لاحق
3- الإستعلام عبر can لإختبار صلاحيات authitem على authitem اخر و user_can لإختبار صلاحيات مستخدم على authitem معينة

ملاحظة عن ال AuthItems

ال AuthItem هو طبقة أعلى لوصف Role او Task او Operation
فمثلا في موقعنا نجد هناك عدة عمليات على مورد مثل المواضيع فيكون هناك operations مثل topic.create لإنشاء المواضيع و topic.read للإطلاع على المواضيع و topic.update لتحديث المواضيع و topic.delete لحذف المواضيع وبصورة أشمل كل هذه العمليات الخاصة بالمواضيع نستطيع وصفها بمهمة Task وهي إدارة المواضيع
ففي موقعنا يوجد 3 roles واحد منها هو المستخدم user وله صلاحيات محددة مقيدة بالoperations الخاصة بالإنشاء والإطلاع والتحديث للمواضيع وليس له صلاحيات الحذف
المشرفين لهم كل صلاحيات المستخدم بالإضافة لصلاحية حذف الموضوعات فعليه بدل مانقوم بإسناد كل ال operations للمشرفين فإننا نضع هذه ال operations تحت مهمة taskManagement مثلا ونقوم بإسناد هذه المهمة للrole الخاصة بالمشرفين وليكن moderators
ويوجد role اخرى وهي مدير الموقع وله كل صلاحيات المشرفين بالإضافة لعملية فتح وغلق المنتدى فنجد ان role الخاصة به admin تحتوي على role المشرفين بالإضافة ل operation مثل forums_offline_control

النظر لهذا المثال يعطيك فكرة جيدة

def testINI():
        import io
        
        
        s="""
[authitems]
admin=role
taskmanagement=task
user=role
topic.create=operation
topic.read=operation
topic.update=operation
topic.delete=operation


[taskmanagement]
childs=topic.read topic.create topic.read topic.update topic.delete
description= topic crud task

[admin]
childs=taskmanagement
description=admin role

[user]
childs=topic.read topic.create





[topic.create]
description=create topic 

[users]
1=user topic.delete
2=user

""" 
        fp=io.BytesIO(s)
        
        sm=SimpleAuthManager()
        sm.init_from_ini(fp)
        print sm.get_user_caps(1)
        print "admin can topic.delete", sm.can("admin", "topic.delete")
        print "user can topic.delete", sm.can("user", "topic.delete")
        print "user 1 can topic.delete", sm.user_can(1, "topic.delete")
        print "user 2 can topic.delete", sm.user_can(2, "topic.delete")
        

مثال ل DBAuthManager مع json

from rbac import DBAuthManager, set_db

        
def testDBJSON():

        
        s="""
        

{
        "acl":{

                "items":["admin","user","taskmanagement", "topic.create", "topic.delete", "topic.read", "topic.update"],
                "admin":{
                        "type":"role",
                        "description":"admin role",
                        "childs":["taskmanagement"]
                },
                "user":{
                        "type":"role",
                        "description":"user role",
                        "childs":["topic.create", "topic.read", "topic.update"]
                },
                "taskmanagement":{
                        "type":"task",
                        "description":"topic crud",
                        "childs":["topic.create", "topic.delete", "topic.read", "topic.update"]
                },
                "topic.create":{
                        "type":"operation",
                        "description":"topic.create operation"
                },
                "users":{
                        "1":["user", "topic.delete"],
                        "2":["user"]
                }

        }
}
"""
        set_db('sqlite:///:memory:', create=True, echo=False)
        sm=DBAuthManager()
        sm.init_from_json(s)
        print "admin can topic.delete", sm.can("admin", "topic.delete")
        print "user can topic.delete", sm.can("user", "topic.delete")
        print "user 1 can topic.delete", sm.user_can(1, "topic.delete")
        print "user 2 can topic.delete", sm.user_can(2, "topic.delete")
        
        adm=sm.item_by_name("admin")

if __name__=="__main__":
        
        testDBJSON()

الدالة set_db تقوم بتحديد قاعدة البيانات و create لإنشاء الجداول و echo لعرض جمل sql التي تنفذ
الوظيفة init_from_json لتجهيز المدير بمدخلات معرفة بصيغة json
الوظيفة init_from_ini لتجهيز المدير بمدخلات معرفة بصيغة ini

*ملاحظة لمن لديه خبرة ب SQLAlchemey يستطيع تقديم يد المساعدة في dbrbac لأن العلاقات مع sqlalchemy سخيفة نوعا ما

مشروع pytorrentrename وهو لتسمية ملفات التورنت بالأسماء الأصلية لها (إذا كان ملف التورنت عبارة عن أرقام أو ماشابه) فهو يقول بإستخلاص الإسم الذي سيتم التحميل إليه وتغير اسم الملف للأسم الأصلي

اما مشروع migratex فهو مشروع لإطار العمل yii لتسهيل عمل ال migrations الخاصة بإنشاء جداول لتكون بإسلوب مشابة ل rails

./yiic migratex create create_crazyauthors name:string age:int dead:tinyint

 

أما مرشح الرئاسة اللي اختارته هو

 

CIki3-markdown

Posted: سبتمبر 20, 2011 in General
الوسوم:, ,

السلام عليكم

مشروعCiki تكلمت عنه قبل كدا ولكن مش هيمنع نتكلم عنه تاني

سبب المشروع هو عدم توفر وحدة لويكي متاحة عامة غير من خلال ExpressionEngine

التحديثات:

الإنتقال ل markdown بدلا من Text_wiki

إعادة التنظيم للواجهة بإستخدام إطار twitter-bootstrap

اسلوب افضل للتكامل مع لوحة التحكم للmodules

أحد اهم المشكلات اللي خلتني اختار الطريق ل markdown (لامانع من إضافة دعم ل Creole و Textile ) هي pear فبغض النظر عن التحايل على كودإجنيتر لإستخدام مكتبات Text_wiki فهي للأسف مكتوبة على PHP4 والport الجديد لها على PHP5 غير مستقر

فكرت كذلك في إستخدام ال parser من مشروع Doku ولكن مشكلة كبيرة هي حجم الإعتماديات بغض النظر عن الكود الغلس اللي ممتلئ ب globals .. فكرني ب Mediawiki!! فالإتنين أكوادهم متداخلة وصعب تستخلص منه مكتبة ( ولكن ربما في القريب يتوفر سواء بإعادة كتابة من البداية او محاولة تعديل على الإعتماديات الموجودة )

في ملف تنصيب كذلك

هحاول إني احافظ عليه بحجم بسيط وخفيف!

المستودع: https://bitbucket.org/xmonader/ciki3-markdown

وبس كدا شكرا :d أترككم مع الصور

Hewarforum-bootstrap

Posted: سبتمبر 12, 2011 in General
الوسوم:, ,

تتطلب عرض الشرائح هذه للجافا سكريبت.

أهم التحسينات

1- الإنتقال لإطار bootstrap من تويتر

2- إصلاح نظام الإضافات (يعمل جيدا الآن)

3- إعادة هيكلة عديد من القوالب

وبعض التعديلات الصغيرة

https://bitbucket.org/xmonader/hewarforum3-bootstrap/changesets

وفي بوست جديد هوافيكم بيه عن تحديثات ل Ciki