My best Ubuntu applications



I’m using Mendeley to read and annotate PDFs on my desktop and mobile. It can sync your PDFs annotates too 🙂


Screenshot from 2016-05-01 19:28:41

Guake Terminal

If you are using terminal frequently, Guake Terminal can help you a lot because Guake is faster than launching a new terminal because the program is already loaded into memory and so can be useful to people who frequently find themselves opening and closing terminals.


Screenshot from 2016-05-01 19:31:48

Indicator MultiLoad

Via this tool I can check my systems recourses like CPU, Memory, Network and etc


Screenshot from 2016-05-01 19:24:41


I’m using Chromium Browser instead chrome because it’s open-source 😀




If you want to accessing your files from different devices or sharing files between co-workers it’s bestest solution



Best Command-line proxy, it’s can send all traffic to your remote Server.


Screenshot from 2016-05-01 19:29:18


VLC can play everything 😀


Simple Practices for Designing RESTful API


Following these standards means:

  • Documentation will make more sense and so developers will understand your API quicker.
  • Developers will therefore be able to integrate quicker and therefore deliver products faster and at lower cost.
  • Many of the principles will make your clients faster, improving product quality

1. Use nouns but not verb

For an easy understanding use this structure for every resources:
Screenshot from 2016-04-06 01:11:33

Note: Do not mix up singular and plural nouns, Keep it simple and use only plural nouns for all resources

2. Use sub-resources for relations

If a resource is related to another resource use subresources
Example: GET /cars/711/drivers/4  Return driver #4 for car 711

3. Provide filtering, sorting and paging for collections


Use a unique query parameter for all fields.
Example: GET /cars?color=red


Allow ascending and descending sorting over multiple fields.
Example: GET /cars?sort=-model


Use limit and next URL. It is easy for the client to showing items.
Example: /cars?limit=10


4. Version your API

Make the API Version mandatory and do not release an unversioned API.
Note: Use a simple ordinal number and avoid dot notation such as 2.5

5. Error handling

Error responses should include a common HTTP status code, message for developer, message for the end-user (when appropriate).
For example:

“developerMessage”:”Verbose, plain language description of the problem”,
“userMessage”:”This is a message that can be passed along to end-users, if needed.”

Use three simple, common response codes indicating (1) success, (2) failure due to client-side problem, (3) failure due to server-side problem:

  1. 200 – OK
  2. 400 – Bad Request
  3. 500 – Internal Server Error

6. Using actions

Sometimes, it is required to expose an operation in the API that inherently is non RESTful. Actions are basically RPC-like messages to a resource to perform a certain operation.

Example: POST /users/12/follow   Following user #12

Note: The actions should only be used as an exception, when there is a good reason that an operation cannot be mapped to one of the standard RESTful methods.

Thank you guys:

یکسری وب سایت و ابزار بدرد بخور برای اندروید کارا


  • Context, What Context: این مطلب در رابطه با انواع کانتکست های اندرویده و اینکه از هر کدومشون کجا باید استفاده و کجا نباید استفاده کرد. 
  • Android Material Design Slidenerd Style: آموزش  فوق العاده کاربردی در رابطه با طراحی متریال دیزاین.


  • Android Asset Studio: یه ابزاره حسابیه برای درست کردن انواع آیکون ها مثل آیکن اعلان، اکشن بار، لانچر و …
  • DP/PX Convertor: تبدیل DP، پیکسل، اینچ و … به هم
  • App Mirror: مجموعه ای کامل از اپلیکشن های اندرویده که به راحتی قابله دانلود روی مرورگر هست
  • Mocking Bot: یه وب سایت خوب و رایگان برای درست کردن ماک برنامه

کتابخانه ها (Library)

  • ButterKnife: یه کامپونته خیلی خفن که تو همه پروژه ها ازش استفاده می کنم، کارش اینه که ویجت ها (TextView, Button , …) رو با یه خط انوتیت (Annotate) می شه وارد کرد به اکتیویتی یا فرگمنت، حتما توصیه می کنم یه چک بکنین
  • ASNE: یه کتابخانه کامل برای کار با شبکه های اجتماعی مثل: Twitter, Linkedin, Google Plus, Facebook, Instagram , …
  • timber: یه لاگر فوق العاده کاربردی نسبت به Log کلاس پیش فرض اندروید، با این کتابخانه می تونید لاگ های دیباگ و ورباس (Timber.d , Timber.v) رو تو نسخه نهایی غیر فعال کنید و لاگ های ارور و هشدار (Timber.e , Timber.w) رو از طریق exception reporter (مثل google analytics) ارسال کنید برای خودتون.
  • Android-Iconics : تو اندروید یکی از سخت ترین کارا اضافه کردن آیکونه، این کتابخونه با استفاده از فونت های آیکونی با جاش این مشکل رو حل کرده.

پلاگین برای اندروید استادیو

  • ParcelableGenerator: برای تولید Parcelable اندروید، کلاس رو بسازید، فیلد ها رو بهش اضافه کنید بعدش کلید میانبر ALT + Insert رو بزنید و گزینه Parcelable رو انتخاب کنید. 😀
  • ADB Idea:  یه میانبر خوب برای اجرای دستورات پر کاربرد بر روی گوشی ای که به سیستم وصله، دستوراتی مثل حذف نرم افزار، بستن نرم افزار، پاک کردن کش، و اجرای مجدد نرم افزار
این مجموعه در حال تکمیله اگه شما هم ابزار بدرد بخوری می شناسید معرفی کنید

OpenJDK VS Oracle JDK

مشکلی که همیشه موقع نصب جاوا برام پیش میاد اینه که اوپن JDK رو کارایی بهتری داره و یا اوراکل JDK،  این دفعه مشکل رو با کمی تحقیق حل کردم:
هنریک استال معاون مدیریت اجرایی گروه جاوا تو شرکت اوراکل در این رابطه نوشته (متن به صورت خلاصه ترجمه شده):
این دو بسیار به هم شبیه اند، برای ایجاد نسخه ی اوراکل JDK تنها چند تکه به آن اضافه می کنیم،
به طور مثال:
  •  پلاگین جاوا (اجرا کننده ی Applet ها) و وب استارت (اجرا کننده ی نرم افزار جاوا به صورت یک کلیک)
  • یکسری از کامپوننت های کد بسته دیگر شرکت ها مثل graphics rasterizer و بعضی از فونت های استفاده شده
  • یکسری از کامپوننت های کد باز دیگر شرکت ها مثل Rhino ( راینو: موتور جاوا اسکریپت که به طور کامل با جاوا پیاده سازی شده است و توسط شرکت موزیلا توسعه داده می شود)

در ادامه هنریک نوشته : نیت ما کد باز کردن تمامی قسمت های اوراکل JDK هست به جز قسمت هایی که دارای امکانات تجاری هستند مثل Jrockit Mission Control (ابزاری برای مانیتور کردن و پروفایل کردن نرم افزار های جاوا که هنوز این محصول از طرف اوراکل ارائه نشده) باقی قسمت ها با کامپوننت های متن باز جابه جا خواهند شد.
طبق گفته این دوست عزیز از نظر کارایی تفاوت چندانی نمی کنه که از کدام JDK استفاده کنیم، برای همین من ترجیح می دم از اوپن JDK‌استفاده بکنم که هم کد بازه و هم با یک دستور تو اوبونتو نصب می شه
sudo apt-get install openjdk-8-jdk

Code Refactoring

What Is Refactoring ?

Refactoring is the process of changing a software system in such a way that it does not alter the external behavior of the code yet improves its internal structure. It is a disciplined way to clean up code that minimizes the chances of introducing bugs. In essence when you refactor you are improving the design of the code after it has been written.
Tip: When you find you have to add a feature to a program, and the program’s code is not structured in a convenient way to add the feature, first refactor the program to make it easy to add the feature, then add the feature.

The First Step in Refactoring

Whenever I do refactoring, the first step is always the same. I need to build a solid set of tests for that section of code. The tests are essential because even though I follow refactorings structured to avoid most of the opportunities for introducing bugs, I’m still human and still make mistakes. Thus I need solid tests.
Tip: Any fool can write code that a computer can understand. Good programmers write code that humans can understand.

Why Should You Refactor?

 I don’t want to proclaim refactoring as the cure for all software ills. It is no “silver bullet.” Yet it is a valuable tool, a pair of silver pliers that helps you keep a good grip on your code. Refactoring is a tool that can, and should, be used for several purposes.

Refactoring Helps You Find Bugs

Help in understanding the code also helps me spot bugs. I admit I’m not terribly good at finding bugs. Some people can read a lump of code and see bugs, I cannot. 
However, I find that if I refactor code, I work deeply on understanding what the code does, and I put that new understanding right back into the code. By clarifying the structure of the program, I clarify certain assumptions I’ve made, to the point at which even I can’t avoid spotting the bugs.
It reminds me of a statement Kent Beck often makes about himself, “I’m not a great programmer; I’m just a good programmer with great habits.” Refactoring helps me be much more effective at writing robust code.

Refactoring Helps You Program Faster

This sounds counterintuitive. When I talk about refactoring, people can easily see that it improves quality. Improving design, improving readability, reducing bugs, all these improve quality. But doesn’t all this reduce the speed of development
I strongly believe that a good design is essential for rapid software development. 
Indeed, the whole point of having a good design is to allow rapid development. Without a good design, you can progress quickly for a while, but soon the poor design starts to slow you down. You spend time finding and fixing bugs instead of adding new function.
Changes take longer as you try to understand the system and find the duplicate code. New features need more coding as you patch over a patch that patches a patch on the original code base. A good design is essential to maintaining speed in software development. Refactoring helps you develop software more rapidly, because it stops the design of the system from decaying. It can even improve a design.

When Should You Refactor

In almost all cases, I’m opposed to setting aside time for refactoring. In my view refactoring is not an activity you set aside time to do. Refactoring is something you do all the time in little bursts. You don’t decide to refactor, you refactor because you want to do something else, and refactoring helps you do that other thing.

Refactor When You Need to Fix a Bug

In fixing bugs much of the use of refactoring comes from making code more understandable. As I look at the code trying to understand it, I refactor to help improve my understanding. Often I find that this active process of working with the code helps in finding the bug. One way to look at it is that if you do get a bug report, it’s a sign you need refactoring, because the code was not clear enough for you to see there was a bug.

When Shouldn’t You Refactor

There are times when you should not refactor at all. The principle example is when you should rewrite from scratch instead. There are times when the existing code is such a mess that although you could refactor it, it would be easier to start from the beginning.
A clear sign of the need to rewrite is when the current code just does not work. You may discover this only by trying to test it and discovering that the code is so full of bugs that you cannot stablilize it.
The other time you should avoid refactoring is when you are close to a deadline. At that point the productivity gain from refactoring would appear after the deadline and thus be too late.
Summary of the Refactoring: Improving the Design of Existing Code” book

جابه جایی پورت در لینوکس یا Port Forwarding

به کمک iptables لینوکس می خوایم یک پورت مشخص مثل 9090 رو به یه آدرس ای پی و پورت مشخص دیگه وصل کنیم.
با Port Forwarding کار های زیادی می شه انجام داد مثل :

  • جدا کردن سرور آپاچی و سرور دیتابیس (Load Balancing)
  • در مواقعی که فیلتر شکن ها اجازه نمی دن سرور خارجی بهمون وصل بشه با جابه جایی مبدا می شه فیلتر شکن رو گول زد
  • به عنوان سرور آینه (Server Mirroring)
  • و …

برای شروع به یک سرور لینوکسی نیاز داریم،  
اول از همه ip forward رو با دستور زیر فعال می کنیم :
sudo sysctl net.ipv4.ip_forward=1 
حالا باید رول ها رو تنظیم کنیم :
sudo iptables -t nat -A PREROUTING -p tcp -d x.x.x.x –dport 80 -j DNAT –to-destination y.y.y.y:8014 
x.x.x.x: این آدرسه خود سرور پراکسی هستش که روی پورت ۸۰ تنظیم شده
y.y.y.y: این هم آدرس کلاینتم هستش که روی پورت ۸۰۱۴ تنظیم شده
بعد از اجرا کردن دستور بالا دستور زیر رو اجرا کنید:
iptables -t nat -A POSTROUTING -j MASQUERADE 
با دستور بالا مبدا رو عوض می کنیم و کلاینت ها فکر می کنن از خود سرور پراکسی ما دارن داده ها رو دریافت می کنن
تمام ، با این کار اگه به سرور x.x.x.x روی پورت 80 وصل بشیم سرور ما رو جا به جا می کنه و پاکت های ارسالی رو برای y.y.y.y روی پورت 8014 ارسال می کنه
برای دیدن لیست Rule‌ ها دستور زیر رو بزنید:
iptables -t nat –line-numbers -L
و برای پاک کردنشون هم دستور زیر رو همراه با شماره خط دستور قبلی وارد کنید :
iptables -t nat -D PREROUTING 6
برای استفاده از روش SNAT به جایه MASQUERADE از دستور زیر استفاده کنید:
iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT –to-source x.x.x.x

با دستور بالا آدرس مبدا پاکت ها رو به x.x.x.x تغییر می دهیم


چیزی حدوده یک سالی می شه که با نرم افزار wine کار نکرده بودم و تا اونجایی که یادم زیاد کامل نبود و باگ های زیادی توش بود . امروز هنگام نصب نرم افزار ادیت صدا در لینوکس مجبور شدم wine رو نصب کنم . در هنگام کپی یک سری از فایل های exe به ویندوز به یه چیزه جالب برخورد کردم :

اجرای فایل های exe روی لینوکس به راحتی یک کلیک !!! اگه خودم با چشمای خودم نمی دیدم هرگز باور نمی کردم آخه مگه ممکنه !! (البته یک سری برنامه های سیستمی اجرا نمی شن)
به عنوان یه برنامه نویسم هزم این قضیه خیلی برام سخته !!

لینوکس هر روز بهتر از دیروز دینگ دینگ