۱۳۹۵/۰۸/۲۱

نوشته شده توسط Reza Alizadeh
دسته بندي: ,
RIP Leonard Cohen (1934 - 2016)

۱۳۹۵/۰۴/۲۵

نوشته شده توسط Reza Alizadeh
دسته بندي: , , ,

گاهی نیاز داریم به صورت مستقیم به پورتی از سرور لینوکسی بر روی سیستم لوکال دسترسی داشته باشیم. مثل وقتی که بخوایم به دیتابیس روی سرور دسترسی داشته باشیم. برای اینکار میتونیم به راحتی با استفاده از SSH پورت مورد نظرمون رو روی کامپیوتر لوکال فوروارد کنیم. برای اینکار از سوئیچ L بصورت زیر استفاده میکنیم.

ssh -L port:address:port host


که تو دستور بالا port اول پورت مورد نظر ما روی سیستم لوکال بوده و address:port آدرسی بر روی سرور هستش که میخواین بهش از طریق SSH دسترسی داشته باشیم.

۱۳۹۴/۱۰/۰۴

نوشته شده توسط Reza Alizadeh
دسته بندي: , ,

آپدیت: از دو روش زیر روش اول از grep ورژن 2.21 توصیه نمیشه و اگه از اون استفاده کنید با پیغام هشدار زیر روبرو میشوید.
grep: warning: GREP_OPTIONS is deprecated; please use an alias or script

یکی از سوئیچ هایی که موقع کار با grep خیلی به دردمون میخوره سوئیچ color هستش که مقدار جستجو رو بصورت رنگی نشون میده. ممکنه تو بعضی دیستروها این سوئیچ بطور پیش فرض ست نشده باشه و مجبور باشیم هر دفعه این سوئیچ رو تایپ کنیم.
برای اینکه این گزینه رو بطور پیش فرض داشته باشیم، میتونیم از یکی از دو روش زیر استفاده کنیم:

روش اول:

 برای اینکار کافیه که متغیر GREP_OPTIONS رو ست کنیم و برای اینکه تو هر بار اجرای bash این متغیر ها ست بشن میتونیم اون رو تو فایل .bashrc خودمون ست کنیم.

export GREP_OPTIONS=" --color"


روش دوم: 

راه دوم اینه که از alias ها استفاده کنیم. برای این موضوع میتونیم یک alias برای grep بصورت زیر تعریف کنیم و اون رو به فایل .bashrc خودمون اضافه کنیم:

alias grep='grep --color'

۱۳۹۴/۰۸/۲۴

نوشته شده توسط Reza Alizadeh
دسته بندي: , ,

اول از هر چیز موضع خودم در رابطه با اتفاقات اخیر پاریس:
من فکر میکنم یه حمله تروریستی تو پاریس انجام شده و همونطور که اگه این اتفاق برای ما میوفتاد این موج همدردی هیچ دردی از ما درمون نمیکرد، الان هم زیاد با این جریان موافق نیستم و برای همین هم خودم رو زیاد قاطی این جریانات نمیکنم. پس موضع من: نه مخالف و نه موافق ...

خوب حالا  بریم سر اصل داستان:
یه سری هستن که تا یه اتفاقی تو اروپا ( مثل اتفاقات شارلی ابدو و یا اتفاقات اخیر پاریس) میوفته و همدردی جامعه رو میبینن شروع میکنن که آآآی مگه مردم بقیه دنیا آدم نیستن !!! چرا هفته پیش که تو فلان کشور تو خاورمیانه شونصد نفر کشته شدن صداتون در نیومد؟‌ و به مردم هزار تا انگ غرب زدگی میچسبونن.

به نظر من این مقایسه از اساس اشتباه و نمیشه خاورمیانه ای رو که از سر تا پاش ناامنی میباره رو با اروپایی مقایسه کرد که  این جور اتفاقات توش یه اتفاق غیر معمول به حساب میاد. توی خاورمیانه اگه هفته ای باشه که توش عملیات تروریستی (استشهادی) رخ نده، باید تعجب کرد و این اتفاقات به یه امر روزمره تبدیل شده. اما تو اروپایی که به کوچکترین حقوق شهروندان توش اهمیت داده میشه و از قبل براش فکر شده نمیشه گفت که عملیات تروریستی یه موضوع عادی هستش و عکس العمل بین‌المللی به اون باید مشابه موارد مشابه تو خاورمیانه باشه.

۱۳۹۴/۰۸/۲۳

نوشته شده توسط Reza Alizadeh
دسته بندي: , , , ,

درصورتی که قصد داشته باشیم document هایی از یک collection خاص را براساس شرطی بر روی یکی از فیلد های از نوع آرایه ای آنها پیدا کنیم میتونیم از عبارت $elemMatch بصورت زیر استفاده کنیم:


مثال اول:

فرض میکنیم collection ما شامل موارد زیر باشد:


{ _id: 1, results: [ 82, 85, 88 ] }
{ _id: 2, results: [ 75, 88, 89 ] }


در این صورت برای پیدا کردن document هایی که قیلد result آنها دارای عدد ۸۸ است بصورت زیر عمل میکنیم:

db.collection.find({
    results: { $elemMatch: 88 }
})


همچنین میتوان از شرط های پیچیده تری استفاده نمود:

db.collection.find({
    results: {
        $elemMatch: { $gte: 80, $lt: 85 }
    }
})


مثال دوم (آیتم های آرایه از نوع آبجکت):

فرض میکنیم collection ما شامل موارد زیر باشد:

{ _id: 1, results: [ { product: "abc", score: 10 }, { product: "xyz", score: 5 } ] }
{ _id: 2, results: [ { product: "abc", score: 8 }, { product: "xyz", score: 7 } ] }
{ _id: 3, results: [ { product: "abc", score: 7 }, { product: "xyz", score: 8 } ] }

برای یافتن مواردی که در آنها product ی با مقدار score بزرگتر مساوی 8 باشد بصورت زیر عمل میکنیم:

db.collection.find({
    results: {
        $elemMatch: {
            product: "xyz",
            score: { $gte: 8 }
        }
    }
})


۱۳۹۴/۰۷/۱۷

نوشته شده توسط Reza Alizadeh
دسته بندي: , ,

ممکنه لازم باشه بطور روزمره به یه سرور ssh بزنیم. برای اینکار با دستور زیر میتونیم کلید عمومی خودمون رو به سرور اضافه کنیم تا موقع لاگین دیگه نیازی به رمز عبور نباشه:

$ ssh-copy-id user@server.example.com

یا اگه مسیر فایل کلید عمومی رو بخوایم تغییر بدیم بصورت زیر عمل میکنیم:

$ ssh-copy-id -i ~/.ssh/id_dsa.pub user@server.example.com

یا برای ssh به پورتی غیر از پورت پیش فرض:

$ ssh-copy-id -i /path/key/file.pub "user@server.example.com -p PORT_NUMBER"

بروز رسانی: برای ماشین هایی که دستور ssh-copy-id رو پشتیبانی نمیکنند میتوان بصورت زیر عمل نمود:

cat ~/.ssh/id_rsa.pub | ssh user@machine "mkdir ~/.ssh; cat >> ~/.ssh/authorized_keys"

۱۳۹۳/۱۰/۲۵

نوشته شده توسط Reza Alizadeh
دسته بندي: , , , ,

اگه تا بحال راجع به بانک های اطلاعاتی NoSQL شنیده باشید، حتما اسم MongoDB رو هم شنیدید. یک بانک اطلاعاتی Document Based که اطلاعات رو بصورت داکیومنت هایی به فرمت JSON ذخیره میکنه.
الان یه مدته که من هم سر و کارم به این بانک اطلاعاتی افتاده و دارم ازش استفاده میکنم. از این به بعد نکاتی رو که در رابطه با MongoDB بهشون بر میخورم رو هم تو این وبلاگ داکیومنت میکنم تا شاید بعدا به درد خودم یا کس دیگه ای بخوره.

خوب یکی از مواردی که تو کار با MongoDB ممکنه بهش بر بخوریم تغییر نام یک دیتابیس هستش. از اونجایی که خود MongoDB (حداقل تا الان) دستوری رو برای این منظور نداره و باید برای اینکار بصورت دیگه ای عمل کنیم. که در ادامه به چند روش انجام این کار اشاره میکنم:

تغییر نام بوسیله کپی کردن بانک اطلاعاتی:


یکی از روش هایی که برای تغییرنام میتونیم استفاده کنیم کپی بانک و پاک کردن نسخه قدیمی اون از روی سرور هستش، برای اینکار بصورت زیر عمل میکنیم:

> db.copyDatabase('old_database', 'new_database')
> use old_database
> db.dropDatabase()

تغییر نام بوسیله Backup\Restore:


MongoDB برای Backup گیری از بانک ها و همچنین برگردوندن Backup ها دو تا دستور mongodump و mongorestore رو ارائه داده که میشه از اونها برای backup گیری از دیتابیس و برگردوندن backup با اسم جدید از اونها استفاده کرد. برای این منظور بصورت زیر عمل میکنیم:

mongodump --db old_database
mongorestore --db new_database /path/to/old_db_backup

پس از برگردوندن backup به سرور وصل میشیم و نسخه قدیمی رو با دستور dropDatabase پاک میکنیم:

mongo

> use old_database
> db.dropDatabase()

۱۳۹۳/۰۹/۲۲

نوشته شده توسط Reza Alizadeh
دسته بندي: , ,

برای کسانی که با لینوکس کار میکنن و زیاد با محیط shell سر و کار دارند، vi یکی از ابزاریه که کار کردن با اون یکی از واجبات به حساب میاد. از ویرایش فایل های config گرفته تا کارهای سطح بالاتری مثل diff گرفتن بین دو فایل.این ادیتور امکانات زیادی رو در اختیار کاربر میزاره که کاربر با کانفیگ vi حتی میتونه از اون به عنوان یه IDE حرفه ای استفاده کنه.

یکی از امکاناتی که vi در اختیار کاربر میزاره indent گزاری خودکار هستش که معمولا بطور پیش فرض این گزینه غیر فعال هستش.(البته تا اونجایی که من باهاش برخورد داشتم) برای اینکه بتونیم این امکان رو فعال کنیم باید توی فایل .vimrc خودمون این امکان رو فعال کنیم. برای اینکار این خط رو به فایل تنظیمات خودمون اضافه میکنیم :

set autoindent

بعد از انجام این تنظیم vi بطور خودکار خط های جدید رو با indentation خط قبلی ایجاد میکنه که این امکان بخصوص موقع کدنویسی خیلی بکارمون میاد.


۱۳۹۳/۰۸/۲۳

نوشته شده توسط Reza Alizadeh
دسته بندي: , , , , ,

چند وقت پیش که داشتم tor رو روی اوبونتو نصب میکردم، سراغ پروکسی گیج کننده (obfsproxy) هم رفتم. اما چون به یه خطایی خوردم بیخیالش شدم و با خود tor بدون استفاده از obfsproxy کار میکردم. تا اینکه امروز تنبلی رو کنار گذاشتم و با یه سرچ کوچیک توی اینترنت راه حل رفع مشکل نصب obfsproxy رو توی اوبونتو پیدا کردم.

برای اینکار، بعد از نصب tor باید بسته obfsproxy رو هم نصب کنیم:

sudo apt-get install tor
sudo apt-get install obfsproxy

حالا که بسته های مورد نیاز خودمون رو نصب کردیم باید تنظیمات tor رو انجام بدیم تا از obfsproxy استفاده کنه. برای اینکار فایل torrc خودمون رو ویرایش می‌کنیم:

sudo vi /etc/tor/torrc

تنظیمات زیر رو به انتهای این فایل اضافه میکنیم:

UseBridges 1
ClientTransportPlugin obfs2 exec /usr/bin/obfsproxy --managed 
ClientTransportPlugin obfs3 exec /usr/bin/obfsproxy --managed

در اینجا یه نکته ای وجود داره و اونم اینه که ممکنه که obfsproxy تو مسیر دیگه ای نصب شده باشه ( توی راهنماهایی که توی اینترنت وجود داشت معمولا در مسیر /usr/local/bin ) که باید با توجه به مسیر نصب روی سیستم خودتون مسیر های دو خط آخر رو اصلاح کنید.

حالا بعد از انجام تنظیمات بالا نیاز داریم تا یکسری bridge برای استفاده tor داشته باشیم که برای بدست آوردن جدید ترین bridge ها یک ایمیل به آدرس bridges@torproject.org میفرستیم و توی متن ایمیل مون از یکی از دستورات زیر با توجه به نوع bridgeی که لازم داریم، استفاده میکنیم:

جهت دریافت bridge های عادی:
get bridges

جهت دریافت bridge های بر پایه obfs2:
get transport obfs2

 جهت دریافت bridge های بر پایه obfs3:
get transport obfs3

بعد از اینکه ایمیل درخواست خودمون رو ارسال کردیم، به فاصله چند لحظه یک ایمیل دریافت میکنیم که حاوی ۳ تا آدرس bridge از نوع مورد نظر ماست، این آدرس ها رو هم بصورت زیر در ادامه فایل تنظیمات اضافه میکنیم:

bridge [transport type] IP_ADDRESS:PORT [finger print]

بطور مثال برای bridge های عادی:
bridge 111.111.111.111:1111 21b87f4b3e43cce851344f0e85a24694b27d114b

و برای bridge های از نوع obfs2:
bridge obfs2 111.111.111.111:1111 21b87f4b3e43cce851344f0e85a24694b27d114b

حالا که تنظیمات خودمون رو انجام دادیم، فایل تنظیمات رو ذخیره میکنیم و سرویس tor رو دوباره راه اندازی میکنیم:

sudo service tor restart

بعد از راه اندازی سرویس tor میتونیم با مشاهده انتهای لاگ فایل tor از وصل شدن اون مطلع بشیم:

tailf /var/log/tor/log 

Nov 14 20:21:24.000 [notice] We now have enough directory information to build circuits.
Nov 14 20:21:24.000 [notice] Bootstrapped 80%: Connecting to the Tor network.
Nov 14 20:21:24.000 [notice] Bootstrapped 90%: Establishing a Tor circuit.
Nov 14 20:21:31.000 [notice] Tor has successfully opened a circuit. Looks like client functionality is working.
Nov 14 20:21:31.000 [notice] Bootstrapped 100%: Done.

خوب تا اینجا روش معمول راه اندازی bridge ها بر روی tor بود و اگه قرار نباشه از obfsproxy استفاده کنیم تا اینجا کارمون راه افتاده و میتونیم از tor استفاده کنیم.

اما اگه بخوایم از  bridge های بر پایه obfsproxy استفاده کنیم موقع اجرای tor با خطای زیر روبرو میشیم:

Nov 14 19:56:34.000 [warn] We were supposed to connect to bridge '54.164.6.73:40872' using pluggable transport 'obfs3', but we can't find a pluggable transport proxy supporting 'obfs3'. This can happen if you haven't provided a ClientTransportPlugin line, or if your pluggable transport proxy stopped running.

این خطا به دلیل مشکلی پیش میاد که توی اسکریپت apparmor برای tor وجود داره و برای رفع اون باید فایل اسکریپت apparmor برای tor رو ویرایش کنیم:

sudo vi /etc/apparmor.d/system_tor

توی این فایل باید مسیر obfsproxy رو بصورت زیر اضافه کنیم:

/usr/bin/obfsproxy  Ux,

که فایل اسکریپت به صورت زیر تغییر میکنه:

# vim:syntax=apparmor
#include <tunables/global>

profile system_tor {
  #include <abstractions/tor>

  owner /var/lib/tor/** rwk,
  owner /var/log/tor/* w,

  /usr/bin/obfsproxy  Ux,  ## this is the FIX

  /{,var/}run/tor/control w,
  /{,var/}run/tor/tor.pid w,
  /{,var/}run/tor/control.authcookie w,
  /{,var/}run/tor/control.authcookie.tmp rw,

  # Site-specific additions and overrides. See local/README for details.
  #include <local/system_tor>
}

حالا با راه اندازی مجدد tor خطای قبلی برطرف میشه و به شبکه tor وصل میشیم.

۱۳۹۳/۰۵/۰۷

نوشته شده توسط Reza Alizadeh
دسته بندي: , ,

توی اوبونتو بطور پیش فرض یک نسخه minimal‌ از ادیتور  vi نصبه و این نسخه خیلی از امکانات این ادیتور رو از جمله امکان syntax highlighting، پشتیبانی نمیکنه. حالا اگه میخواین که از این ادیتور با تمامی امکاناتش استفاده کنید باید نسخه کامل اون رو نصل کنید:

sudo apt-get install vim

بعد از نصب کافیه توی ادیتور با دستورات زیر این امکان رو فعال یا غیر فعال کنید:

:syntax on 

:syntax off

اگر هم میخواین که این امکان بصورت پیش فرض فعال باشه کافیه این دستور رو توی فایل .vimrc خودتون قرار بدین:

syntax on