‫بررسی چند git server ویندوزی

git-dot-aspx

* مشکلی با فایل‌های حجیم ندارد. فقط کافی است http.postBuffer و maxRequestLength تنظیم شود.
* لازم نیست که حتماً repoها توسط خودش ایجاد شده باشد. اگر یک repo را در مسیر repoهایش قرار دهید می‌توانید از آن استفاده کنید.
* اینترفیس وبی آن فقط فهرست repoها و comment آخرین تغییر را نشان می‌دهد نه هیچ اطلاعات دیگری.
* همه repoهای آن باید پسوند ‎.git داشته باشند.
* به صورت پیش فرض anonymous است یعنی هر کسی می‌تواند clone بگیرد یا push کند.
* برای بالا بردن امنیت باید نوع Authentication را در IIS برابر Basic قرار دهید و با urlهایی شبیه به http://user:password@hostname با آن کار کنید. البته می‌توانید با هر با push/pull نام کاربری و password را هم ارسال کنید. امنیت در سطح کل repoها قابل تعریف است نه به ازای تک تک repoها. اگر در password از کاراکترهای ویژه استفاده کرده‌اید باید url را به صورت http://”user:password”@hostname استفاده کنید.

bonobo git server

* urlهای ارسالی به آن case sensitive است
* مشکل commitهای با حجم بالا دارد. با این که دستور git config http.postBuffer 524288000 یا git config –global http.postBuffer 524288000 را در client اجرا کرده و در web.config مقدار maxRequestLength را افزایش دادم باز هم نتوانستم فایل‌های بیش از مثلاً ۱۰۰ کیلوبایت را به سرور push کنم.
* به صورت پیش فرض از user/pass استفاده می‌کند. در نتیجه می‌توان از repoها حفاظت کرد.
* اینترفیس وب آن اطلاعات خیلی خوبی را ارائه می‌دهد، از جمله فهرست commitها.
* امکان تعریف کاربر و تعیین دسترسی به ازای تک تک repoها وجود دارد.

Git-Web-Access

* به هیچ وجه نتوانستم با آن کار کنم. یا من خیلی اشتباه عمل کردم یا این برنامه خیلی ناقص است.

‫git server با استفاده از ویندوز و دات‌نت

تا همین چند وقت پیش برای ایجاد یک git server در ویندوز مجبور بودید از راه حل‌های لینوکسی مثل OpenSSH و cygwin استفاده کنید. استفاده از این طور راه حل‌ها واقعاً سخت و عذاب آور بود و گاهی اوقات باعث می‌شد شخص قید git server ویندوزی را بزند و به سراغ گزینه‌های دیگری مثل مرکوری برود. خوشبختانه جامعه کاربری git در ویندوز بیکار ننشسته و طی این مدت روش‌ها و ابزارهای جدیدی ارائه شده است:

git-dot-aspx
تعداد دانلود خوبی داشته و با چهار رقمی شدن فاصله‌ای ندارد.

bonobo git server
با استفاده از ASP.NET MVC نوشته شده است. downloadهای زیادی ندارد و حتی نقد منفی هم دارد. آن را تست کردم و فعلاً در push کردن فایل‌های حجیم (بیش از یک مگابایت) مشکل دارد.

grack
یک راه حل مبتنی بر ruby

git_http_backend.py
یک راه حل مبتنی بر پایتون

استفاده از Apache و امکانات مخصوص msysgit
به جای IIS از Apache استفاده می‌کند ولی راه حل مطمئن و امتحان شده‌ای است.

Git-Web-Access
الهام گرفته از grak و git_http_backend.py ولی نوشته شده با ASP.NET و WCF

‫تجاربی از LibreOffice

به خاطر دلخوشی خودم و به خاطر کسب آمادگی برای سویچ احتمالی به لینوکس، مدتی است که سعی می‌کنم به جای MS Office از LibreOffice استفاده کنم. LibreOffice کاملاً مشابه Open Office بوده و توسط تعدادی از برنامه‌نویسان قبلی Open Office اداره می‌شود. بد ندیدم نکاتی را که به عنوان یک ویندوز کار به آن برخورد کردم را بیان کنم.

۱- مهم‌ترین مزیت استفاده از LibreOffice برای من رایگان بودن آن، رهایی از مشکلات کرک و آسوده خیالی ناشی از رعایت کپی رایت می‌باشد.
۲- مهم‌ترین مشکلی که با LibreOffice دارم عادت نداشتن به آن است. به عنوان کسی که از زمان ویندوز ۳٫۱ از MS Office استفاده می‌کرده برایم خیلی سخت بوده و هست که به LibreOffice عادت کنم.
۳- ظاهراً LibreOffice Writer با متون دو زبانه مشکل دارد. گاهی اوقات که در یک پاراگراف فارسی از چند کلمه انگلیسی و بعضی کاراکترها مثل خط تیره استفاده می‌کنم. کلمات انگلیسی فارسی توی هم فرو می‌روند و به هیچ وجه قابل اصلاح نیستند.
۴- در Writer مکان‌نما در جای صحیح نشان داده نمی‌شود. یعنی زیادی به حروف یا حاشیه پاراگراف چسبیده است.
۵- نمی‌توانم در Writer فونت پیش فرض را عوض کنم.
۶- در MS Word می‌توانستم با یک shortcut خاص سایز فونت همه نوشته را با هم یکی بالا ببرم یا یکی پایین بیاورم. انجام این کار در Writer برایم غیر ممکن است.
۷- Paste کردن حتی از notepad باعث به هم ریختگی فونت می‌شود.

البته ممکن است همه این مشکلات به خاطر نا آشنایی خودم یا اجرای LibreOffice در ویندوز باشد.

پول ویندوز را بدهیم یا ندهیم؟

مدت‌هاست که می‌خواهم تکلیف خودم را با مجموعه محصولات مایکروسافت و دات‌نت مشخص کنم. یا باید اخلاق را بدون داشتن هیچ دلیل محکمی زیر پا بگذارم و بی‌خیال همه چیز از تمام محصولات مایکروسافت استفاده کنم. یا باید به لینوکس و ابزارهای توسعه‌ای مثل مونو سویچ کنم. یا هزینه‌های احتمالاً خیلی سنگین خرید ویندوز، ویژوال استودیو و غیره را پرداخت کرده و در دنیای ویندوز باقی بمانم.

قبل از ادامه باید به دو نکته توجه کرد. یکی این که موضوع انتخاب بین ویندوز و لینوکس یا بحث‌های open source و غیره نیست. من ویندوز را دوست دارم و می‌خواهم روی آن ادامه دهم. مشکل در اینجا فقط گران بودن و مشکلات تحریم است. نکته دوم این که همه این بحث‌ها وقتی که شما انفرادی کار می‌کنید خیلی اهمیتی ندارد. چون اکثر laptopها شامل یک ویندوز اصلی هم هستند و اگر صاحب آن برنامه‌نویس ویژوال استودیو نباشد، بدون نیاز به هزینه زیادی، Copyright را رعایت کرده است. بحث بر شرکت‌های کوچک و متوسطی است که می‌خواهند به نوعی این مشکل را حل کنند.

راه اول: کنار گذاشتن اخلاق و استفاده غیر قانونی از محصولات مایکروسافت

تا زمانی که دلیل محکمی برای عدم رعایت کپی‌رایت وجود نداشته باشد نباید این کار را کرد. به قول معروف آنچه برای خود نمی‌پسندی برای دیگران هم نپسند. اگر دوست ندارید محصولات نرم‌افزاری شرکت شما حاصل سرمایه‌گذاری و تلاش فراوانی است بدون پرداخت هزینه استفاده شود پس خود شما هم نباید این کار را با محصولات دیگران انجام دهید.

راه دوم: سویچ به لینوکس و ابزارهای توسعه‌ای مثل مونو:
اگر کمی عقلانی فکر کنیم هزینه‌های این راه خیلی خیلی زیاد است. باید سال‌ها تجربه و آشنایی با محصولات مایکروسافت و ویژوال استودیو را کنار گذاشت. علاوه بر این مشتری‌های ما ویندوزی هستند. توسعه نرم‌افزارهایی تحت ویندوز داخل محیط لینوکس کار خیلی سختی است. ضمناً فراموش نکنید که شما یک شرکت هستید که چندین برنامه‌نویس در آن مشغول به کارند. اگر به لینوکس مهاجرت کنید هم باید برنامه‌نویس‌های فعلی را متقاعد کنید که به لینوکس سویچ کنند و هم  این که در استخدام‌های بعدی باید به دنبال معدود برنامه‌نویسانی باشید که بتوانند در محیط شما کار کنند. مثلاً مونو کار باشند.

راه سوم: پرداخت کامل هزینه لایسنس ویندوز و بقیه محصولات:
اول باید ببینیم هزینه استفاده از محصولات قانونی چقدر است و آیا از عهده ما بر می‌آید یا نه. از آنجا که خیلی از شرکت‌ها و برنامه‌نویس‌ها از تمام امکانات محصولات مایکروسافت استفاده نمی‌کنند و از آنجا که فعلاً می‌خواهیم با کمی صرفه جویی کارمان را شروع کنیم، از هزینه خرید ویندوز سرور چشم پوشی کرده و به جای آن از ویندوز ۷ استفاده می‌کنیم. در مورد Visual Studio و MS SQL هم سعی می‌کنیم کارمان را با نسخه‌های express یا محصولات رایگان دیگر مثل MySql یا SharpDevelop راه بیندازیم. پس تنها چیزی که ما می‌خواهیم خرید چند نسخه ویندوز است. فرض کنید شرکتی ۱۰ کارمند دارد و ۱۲ تا کامپیوتر. اگر قیمت هر نسخه از ویندوز (یک ویرایش متوسط) را ۱۵۰ هزار تومان فرض کنیم، پول لایسنس‌هایمان یک میلیون و هشت صد هزار تومان می‌شود. اگر این هزینه را با دیگر هزینه‌های شرکت‌داری مثل اجاره دفتر که ممکن است تا چند میلیون تومان در ماه برسد مقایسه کنیم، خواهیم دید که پرداخت این مبلغ آنقدر سخت نیست که بخواهیم به خاطر آن به لینوکس مهاجرت کرده یا از زیر آن در برویم. البته طرح‌های رایگانی مثل BizSpark هم هستند ولی نمی‌شود در ایران از آنها استفاده کرد.

به این نکته توجه کنید که بعضی از دوستان اظهار می‌دارند که آنها می‌توانند و دوست دارند هزینه ویندوز را پرداخت نمایند اما مایکروسافت اسم ایران را از لیست کشورهایش حذف کرده. علاوه بر این حتی اگر این پول را به نحوی پرداخت کنیم ممکن است به خاطر تحت تحریم بودن نتوانیم از هیچ کدام از حمایت‌ها و امکانات حاصله از خرید قانونی استفاده کنیم. نمی‌دانم صحت و سقم این صحبت‌ها چقدر است. ولی اگر درست باشد متاسفانه می‌تواند دلیل محکمی برای ادامه راه حل غیر اخلاقی شماره یک و بی‌خیال CopyRight شدن باشد.

‫راه اندازی سرویس SVN در ویندوز

هر چند که با وجود git ممکن است کمتر انگیزه‌ای برای انتخاب SVN به عنوان یک سورس کنترل جدید وجود داشته باشد، اما به هر حال اگر نیاز به نصب SVN به عنوان یک سرویس ویندوز باشد می‌توان از راهنمای خوب Jeff Atwood برای این کار استفاده کرد.

این راهنما به طور خلاصه شامل دو مرحله است. اول ایجاد سرویس با کمک ابزار sc و دوم راه اندازی آن با کمک ابزار net. البته اگر با ویندوزهای جدیدتر مثل ویندوز ۷ یا ویندوز ۲۰۰۸ سر و کار دارید، باید حواستان باشد که این ویندوزها هم ip v4 را پشتیبانی می‌کنند و هم ip v6 را. بنابراین باید به هنگام ایجاد سرویس به svn بگویید حواسش به ipهای نسخه ۴ باشد یا نسخه ۶. جهت کسب اطلاعات بیشتر به اینجا مراجعه کنید.

پ.ن.: راه حل مربوط به ipهای نسخه ۴ و ۶ را ناصر حاجلو زحمت کشیده و پیدا کرده.

‫راه اندازی git server در ویندوز با استفاده از CopSSH

یکی از راه‌های نصب git به صورت سرویس ویندوز، استفاده از CopSSH می‌باشد. مراحل انجام این کار در ویندوز ۷ (۳۲ بیتی) به صورت زیر است:

۱- دریافت CopSSH و نصب آن.

۲- حتماً مسیر نصب را از Program Files به مسیری در C:‎ مثل C:SSH تغییر دهید. در غیر این صورت در مراحل بعدی به خاطر وجود کاراکتر «فاصله» در فولدر Program Files دچار مشکل خواهید شد.

۳- در بقیه مراحل پیش فرض‌های خود برنامه نصب را بدون تغییر قبول کنید.

۴- Passwordی که به اکانت SvcCOPSSH اختصاص می‌دهید فراموش نکنید.

۵- بعد از اتمام مراحل نصب، با استفاده از COPSSH Control Panel کاربر فعلی ویندوز را انتخاب کرده و آن را به فهرست Activated users اضافه کنید. فرض می‌کنیم نام کاربر mohebbi و نام کامپیوتر Amir-PC است. در این مرحله چیزی شبیه به این دیده می‌شود:

۶- برنامه PuTTY را دریافت و نصب کنید. PuTTY مجموعه‌ای از چند برنامه است که ما فقط با دو تا از آنها کار داریم. اگر TortoiseGIT را در سیستم‌تان نصب دارید، آن دو تا برنامه را در فولدر TortoiseGIT هم می‌توانید پیدا کنید.

۷- با استفاده از برنامه PUTTYGEN یک کلید عمومی و یک کلید خصوصی بسازید.

۸- کلید عمومی را در فایلی به نام authorized_keys ذخیره کنید. این فایل باید در مسیر c:usersmohebbi.ssh قرار بگیرد.

۹- کلید خصوصی را با نام private_key.ppk در مسیر C:SSHhomemohebbi.ssh ذخیره کنید. استفاده از passphrase اختیاری است.

۱۰- فایل ‎.bashrc که در مسیر C:SSHhomemohebbi قرار دارد را با ویرایشگر خوبی مثل Visual Studio باز کنید.

۱۱- خط  User dependent .bashrc file را پیدا کرده و زیر آن خط export HOME=/c/SSH/home/mohebbi را اضافه کنید. bach به بود و نبود فاصله‌ها و کوچک و بزرگ بودن حروف خیلی حساس است. پس ممکن است مجبور شوید اول و آخر این خط را کمی دستکاری کنید.

۱۲- از همین فایل یک کپی تهیه کرده و در آدرس c:usersmohebbi قرار دهید.

۱۳- Unix BASH Shell را از منوی Copssh اجرا کرده و دستور echo $HOME را در آن صادر کنید. با فرض این که msysgit را نصب کرده‌اید، Git Bash را هم اجرا کرده و مجدداً دستور echo $HOME را در آنجا هم صادر کنید. خروجی هر دوی آن باید یک چیز باشد و آن هم: /c/SSH/home/mohebbi

اگر این طور نبود مراحل ۱۱ و ۱۲ را آنقدر تکرار کنید تا مسئله حل شود.

۱۴- msysgit که همان توزیع اصلی git در ویندوز است را نصب کنید. اما باز هم در مسیر root درایو C نصب کنید. نه در Program Files.

۱۵- کل محتویات شاخه‌های bin و libexecgit-core از محل نصب git را به شاخه bin فولدر نصب SSH کپی کنید. راه درست انجام این کار تنظیم صحیح Path و سایر متغیر محیطی ویندوز و بعضی تنظیمات bash است. اما من چون راه بهتری پیدا نکردم از این راه استفاده کردم.

۱۶- برنامه PAGEANT از مجموعه PuTTY را اجرا کنید. این برنامه به طور خودکار در tray قرار می‌گیرد. روی آن دابل کلیک کرده و کلید private_key.ppk را از آدرس C:SSHhomemohebbi.ssh به آن اضافه کنید.

۱۷- برنامه PAGEANT باید همیشه در حال اجرا باشد. پس بهتر است آن را به startup ویندوز اضافه کنید. دادن مسیر کلید خصوصی فراموش نشود.

۱۸- مراحل نصب تمام شد. حالا در مسیر C:SSHhomemohebbi یک شاخه با اسم فرضی myapp.git بسازید. با کمک git، شاخه myapp.git را به یک bare repo تبدیل کنید. اینجا همان repo است که قرار است دیگران از طریق سرویس ویندوز شما به آن دسترسی پیدا کنند.

۱۹- مراحل نصب به پایان رسید. حالا از یک کامپیوتر دیگر با استفاده از git client دلخواه خود، مثلاً TortoiseGit، به git server جدیدتان وصل شده و با وارد کردن آدرس ssh://mohebbi@amir-pc/SSH/home/mohebbi/myapp.git یک clone از مخزن تهیه کنید.

۲۰- کل مراحل به پایان رسید. حال فقط چند فایل را به طور امتحانی commit و push/pull کنید تا مطمئن شوید همه چیز درست است.

راه اندازی git server با استفاده از ویندوز کار چندان راحتی نیست. حین اجرای این مراحل مشکلات خیلی زیادی ممکن است به وجود بیاید. این مشکلات باید با سعی و خطای فراوان، حوصله و کمی مطالعه و خلاقیت حل شوند. من کل این مراحل را با استفاده از ویندوز هفت ۳۲ بیتی و آخرین نسخه هر یک از ابزارهای ذکر شده در تاریخ ۲۶ فروردین ۱۳۸۹ انجام دادم. این راهنما خودش بر اساس راهنمای tim davis و راهنمای مربوطه در TortoiseGit نوشته شده است. در صورت بروز مشکل می‌توان از این دو راهنما هم استفاده کرد. اما دقت کنید که راهنمای tim davis بر اساس نسخه‌های قدیمی ابزارها نوشته شده و راهنمای TortoiseGit هم به جای تکیه بر git استاندارد به خود TortoiseGit وابستگی دارد.

‫به اشتراک گذاشتن سورس‌های git

مهم‌ترین مزیت git از دید من خاصیت Distributed آن است. به این معنی که فرضاً در یک سرور git اینترنتی سورسی وجود دارد که من یک نسخه از آن را در laptop خودم clone کرده‌ام. حالا می‌خواهم در کامپیوتر منزلم که دسترسی به اینترنت و آن سرور git اینترنتی ندارد هم همین سورس را داشته باشم. به عبارتی دیگر می‌خواهم از کامپیوتر منزلم به laptop وصل شده و سورس را دریافت کنم. ضمن این که بتوانم بین کامپیوتر منزلم و laptop به راحتی تغییرات سورس را رد و بدل (push/pull) کنم.

چندین راه برای این کار وجود دارد. راه اصلی آن همان طور که می‌شود حدس زد راه اندازی یک git server است. هر چند که انجام این کار سخت نیست اما چون git یک ابزار لینوکسی است و برای راه اندازی یک git server نیاز به کار کردن با چند ابزار لینوکسی دیگر مثل openSSH است، بهتر است از راه‌های ساده‌تری استفاده شود.

در این لینک چندین راه ساده برای انجام این کار توضیح داده شده است. روش File Share در این بین از همه ساده‌تر به نظر رسیده و در ویندوز هم به راحتی قابل انجام است. همان طور که در اینجا و اینجا توضیح داده شده برای این کار باید از یک محل مشترک به اسم Dropbox و یک سورس bare استفاده گردد. ظاهراً Dropbox در لینوکس معادل فولدرهای Share در ویندوز است.

ترتیب مراحل در ویندوز این طور است:

۱- کسب اطمینان از نصب git در هر دو کامپیوتر

۲- کسب اطمینان از این که کامپیوترها می‌توانند IP و فولدرهای share یکدیگر را ببینند.

۳- ایجاد یک سورس bare در فولدر share یکی از کامپیوترها (مثلاً کامپیوتر ۱) با استفاده از دستور git init –bare. اول باید فولدر ساخته شده و این دستور از داخل فولدر مذکور فراخوانی شود.

۴- push کردن سورس از منبع اصلی به این فولدر share با استفاده از دستور git push origin //machine1/shared_git_repo. این دستور باید از داخل دایرکتوری سورس اصلی فراخوانی شود.

۵- اجرای دستور git clone //machine1/shared_git_repo از داخل کامپیوتر ۲ یا هر کامپیوتر دیگری که به این فولدر share دسترسی دارد.

۶- برای push و pull کردن بین فولدرهای داخل یک کامپیوتر می‌توان از urlی شبیه به file://d:/projects/gitrepo استفاده کرد.

با وجود همه این حرف‌ها بهترین راه به اشتراک گذاشتن سورس‌های git استفاده از سرورهای اینترنتی مثل github.com و assembla.com است. چون نیاز به هیچ configuration و نگهداری نداشته و از تمام دنیا قابل دسترس است.

Confusing problem with log4net

I’m using log4net for logging in my ASP.NET application. This web site is based on .Net framework 3.5 and is installed on IIS 7.5 and Windows Server 2008 R2 in a 64 bit machine. Logging was working greatly when I was running application from Visual Studio 2010’s internal web server, but was not working at all when run from IIS.

First thing that I thought about was permission. So I grant full access to network service with the folder containing application: “c:inetpubwwwrootmyapp”. But this didn’t work and no log file generated. As I’m new to Windows Server 2008, I tried to grant full permission to all users that I knew: IUSR, local service, aspnet, IIS_IUSRS, Everyone, etc. But still nothing was working. A question in SO caused me to think this is because of trust level, so I set my application’s trust level to full. But still nothing was working. Another question in serverfault.com caused me to think the problem root is that Windows Server 2008 is using a new user for IIS. So I tried to use icacls to add ApplicationPoolIdentity to permission list. After it, I tried to change Identity of DefaultAppPool to Network Service. But none of this two solutions solved my problem.

Some people have been recommending to enabling internal logging of log4net to detect original problem. And yes, this showed me what was the problem:

log4net: XmlConfigurator: config file [C:inetpubwwwrootlog4net.config] not found. Configuration unchanged.

After some investigations, root cause was detected. It was due to incorrect use of Server.MapPath. I was forgotten to add a tilde mark in beginning of log4net.config’s path. When I used Server.MapPath as follow, all headaches have suddenly disappeared and my log file appeared and get working as I was desiring:

XmlConfigurator.Configure(new FileInfo(Server.MapPath("~/log4net.config")));

A wrong path has been causing log4net to search c:inetpubwwwroot for log4net.config not my application’s path at c:inetpubwwwrootmyapp. All this nightmare was because of my own mistake not Windows, IIS or .Net!