یادداشتی برای کانفیگ i3

در ارسال قبلی از میز‌کار i3 صحبت کردم‌. قرار شد در این پست در مورد کانفیگ و رفع نیاز‌های اولیه‌مان روی این مدیر‌پنجره صحبت کنیم‌. اول از همه طبق معمول باید این میزکار را نصب کنیم‌. همانطور که در پست قبل گفتم این میزکار از نوع اعلان فونت X استفاده می‌کند که متاسفانه در فونت‌هایی که من امتحان کردم نتوانستم تایتل فارسی پنجره‌ها را به درستی نمایش دهم‌ (دوست خوبم فرود در کامنت‌های پست قبل گفتند که از قرار با فونت Ubuntu مشکل حل شده بود‌). پس از تماس با توسعه دهندگان i3 و راهنمایی‌شان‌، برای پشتیبانی از xft و طبیعتا دست بازتر در انتخاب فونت‌ها سورس را با این پچ آماده کردم‌. دوستان آرچر می‌توانند از این بسته برای نصب استفاده کنند‌. اما باقی که می‌خواهند خودشان کامپایل کنند کافیست پچ را در پوشهٔ‌ سورس کپی کنند و با دستور زیر ترتیب کار را بدهند:‌

patch -p1 < i3-wm-pango.patch

دوستان اسلکوری هم می‌توانند باقی کار را به این Slackbuild بسپارند‌. پس از نصب میزکار را اجرا کنید‌. چیزی که ما می‌خواهیم در نهایت شبیهش شویم به صورت زیر است:

قبل از این که بگویید این که چیزی ندارد تا بخواهیم کانفیگش کنیم بگذارید بگویم که دو روز وقتم را گرفت تا بتوانم به اینجا برسانمش ;-)

برای شروع کار می‌خواهیم فونت میزکار را تعیین کنیم‌. فایل کانفیگ i3 برای هر کاربر از شاخهٔ ‎~/.i3/config خوانده می‌شود‌ (توجه داشته باشید که در اولین اجرا اگر این فایل وجود نداشته باشد برنامهٔ کانفیگ خودکار i3 شروع می‌شود و از شما می‌پرسد که کدام کلید را به عنوان metaیتان تعریف کند‌ و بعد این فایل ساخته می‌شود-اگر هم نشد در userguide دنبالش بگردید و مسیرش را ببینید!) فایل کانفیگ را پیدا می‌کنیم و دنبال خط زیر می‌گردیم:

font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1

و آن را به صورت زیر ویرایش می‌کنیم:

font xft:Terminus 9

همچنین از آن‌جا که ترمینال پیش‌فرض i3 را دوست نداریم و می‌خواهیم Terminator جایگزینش شود به دنبال ‎# start a terminal می‌گردیم و خط زیرش را به صورت زیر ویرایش می‌کنیم:

bindsym $mod+Return exec --no-startup-id terminator

در ادامهٔ کار با کانفیگ‌های پیش‌فرض i3 می‌سازیم‌، جز این که یک مشکل کوچک و قابل حل وجود دارد‌. آن هم این که بعد از تغییر layout کیبورد به فارسی دیگر کلید‌های میانبر میزکارمان کار نمی‌کنند و باید layout را انگلیسی کنیم تا به کار بیافتند‌. برای حل این مشکل باید به جای کلید‌های bindsym (کلید‌های میانبری که با اسم کلید مثلا shift, Return و ... تعریف می‌شوند) از bindcode استفاده کنیم‌. برای نمونه ما کلید‌های میانبر تغییر layout را به این صورت تعریف می‌کنیم.

کلید‌های مدنظر ما برای تغییر صفحه کلید Alt+Shift است‌. اول از همه در اول فایل کانفیگ یک متغیر به اسم ‎$mod1 که به Alt اشاره می‌کند به صورت زیر تعریف می‌کنیم:

set $mod1 Mod1

و سپس خطوط زیر را در انتهای فایل کانفیگ اضافه می‌کنیم:

bindcode $mod1+62 exec ~/.i3/changekb.sh

bindcode $mod1+50 exec ~/.i3/changekb.sh

خوب حالا این دو خط چه می‌کنند؟ دستور bindcode به i3 می‌فهماند که باید از کد کلید‌های کیبورد برای شناسایی کلید ترکیبی استفاده کند‌. ‎$mod1 را هم که پیشتر خودمان به عنوان کلید Alt تعریف کردیم‌. حالا می‌ماند اعداد ۶۲ و ۵۰‌. این اعداد کد‌هایی هستند که کلید‌های شیفت چپ و راست کیبورد با آن‌ها شناخته می‌شوند و دقیقا مختص همین کلید‌ها هستند‌. برای کشفشان می‌توانید در ترمینال برنامهٔ xev را اجرا کنید کلید مورد نظرتان را فشار دهید و در خروجی‌ها به دنبال عبارت keycode و عدد روبرویش بگردید‌.

exec هم فرمانی است که با استفاده از آن می‌توانیم یک اسکریپت خارجی را اجرا کنیم که در اینجا ما اسکریپتی که layout را بررسی می‌کند و با توجه به وضعیت فعلی‌اش آن را به انگلیسی یا فارسی تغییر می‌دهد را به آن شناساندیم‌. پس لازم است کد زیر را که مربوط به این اسکریپت است در فایل changekb.sh وارد کرده و فایل را به پوشهٔ ‎.i3 در پوشهٔ خانگیتان کپی کنید:

#This is a script for changing keyboard between English and Persian layouts

if [ `setxkbmap -print | grep xkb_symbols | awk '{print $4}' | awk -F"+" '{print $2}'` = us ];

then echo "EN"; echo "changing to IR..."; setxkbmap ir;

else echo "IR"; echo "Changing to US..."; setxkbmap us ;

fi

نکته اینجاست که نمی‌دانم چرا Alt+Shift راست پس از تغییر layout به فارسی قادر به بازگردانیش به انگلیسی نیستند‌، در حالی که کلید‌های سمت چپ به راحتی این کار را انجام می‌دهند‌! البته این کار مزیتی برای خودش دارد و آن هم این که با استفاده از کلید‌های سمت راست دیگر خیالم راحت است که کیبورد فارسی است ;-)

در ادامه به حیاتی‌ترین بخش میزکارمان می‌رسیم‌. بخش گزارش‌گیری‌! نوار پایینی میزکار توسط برنامهٔ i3bar کنترل می‌شود‌. این برنامه می‌تواند خروجی برنامه‌های مختلف را در خود نمایش دهد‌. خود i3 برنامه‌ای به اسم i3status برای گزارش‌گیری دارد که من زیاد از آن خوشم نیامد‌. این شد که تصمیم گرفتم از conky برای این بخش استفاده کنم‌. چون هم ابزار‌های بیشتری دارد و هم قابلیت اجرای یک اسکریپت خارجی را بدون درد و خونریزی! این شد که به دنبال خط bar که احتمالا در انتهای فایل کانفیگ قرار دارد می‌گردیم و در میان آکولاد‌های روبرویش دو خط زیر را اضافه می‌کنیم:

font -*-terminus-bold-*-*-*-12-*-*-*-*-*-iso10646-*

status_command exec conky -c ~/.i3/i3conky

خط اول این دستور که فونت terminus را برای خروجی i3bar تعریف کرده را می‌توانید نادیده بگیرید و یا به صورت xft مثل دفعهٔ قبل تعیین کنید‌. اما خط دوم دستور conky را با فایل کانفیگ i3conky که در شاخهٔ ‎.i3 قرار دارد اجرا می‌کند‌. پس لازم است این فایل را ایجاد کنید و دستورات زیر را در آن کپی کنید:

background no

out_to_console yes

double_buffer no

short_units yes

out_to_x no

update_interval 1.0

total_run_times 0

use_spacer right



TEXT

CPU: ${cpu cpu1},${cpu cpu2},${cpu cpu3},${cpu cpu4} @ FRQ: $freq | RAM:$mem/${memmax} ($memperc%) ${if_up eth0}| LAN: D:${downspeed eth0} U:${upspeed eth0} ${endif} \

| ${exec ~/.i3/kbstatus.sh} | VOL: $mixer | ${time %a %d.%m.%y} ${time %H:%M}

توضیح آرگومان‌های این فایل بماند به عهدهٔ خودتان‌. فقط من برای دیدن وضعیت فعلی صفحه کلید اسکریپت تغییر صفحه کلید را ویرایش کردم و آن را به اسم kbstatus.sh در شاخهٔ ‎.i3 قرار دادم تا از conky آن را فرا بخوانم‌. این اسکریپت فقط layout فعلی را در خروجی نشان می‌دهد و کدش به صورت زیر است:

#!/usr/bin/bas

setxkbmap -print | grep xkb_symbols | awk '{print $4}' | awk -F"+" '{print $2}'

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

default_orientation vertical

همچنین می‌خواهم تعدادی از برنامه‌هایم مثل mdic یا vlc به صورت float (تایل نشده) باز شوند که برای این کار دستورات زیر را اضافه می‌کنم:

for_window [class="Vlc"] floating enable

for_window [class="Mdic"] floating enable

for_window [instance="DTA"] floating enable

for_window [instance="Download"] floating enable

for_window [instance="xfce4-notifyd"] floating enable

مقدار class و یا instance را می‌توانید پس از ران کردن دستور xprop WM_CLASS و سپس کلیک روی برنامهٔ مورد نظر به دست آورید‌. مثلا در مورد فایرفاکس خروجی به صورت زیر است:

WM_CLASS(STRING) = "Navigator", "Firefox"

که Nvigator مقدار instance و Firefox مقدار class است‌. توجه داشته باشید که این مقدار Case sensetive است‌!

من فایل کانفیگ i3 و اسکریپت‌های مورد استفاده‌ام را روی این کانال git گذاشته‌ام‌. برای پی‌بردن بیشتر به جزئیات می‌توانید از آن‌ها استفاده کنید!

تجربهٔ کار با i3 یک رقیب قدر‌!

ویژگی‌ها:

مستند‌سازی عالی:

برای ورود به دنیای i3 جدای از این که اگر از Awesome استفاده کرده باشید نیاز به یادگیری چیز زیادی ندارید‌، می‌توانید به یک User guide عالی که توسط توسعه دهندگانش حاضر شده مراجعه کنید‌. چیزی که متاسفانه برای Awesome پیدا نمی‌شد‌!

فایل config:

کانفیگ میزکار Awesome با زبان lua نوشته می‌شد‌ که همین امر قابلیت‌های زیادی هم برایش به همراه می‌آورد‌. حال ممکن است که text بودن کانفیگ i3 کمی مایوس کننده به نظر برسد‌. اما سادگی و کارایی‌اش به خوبی کمک حالم شد‌. حقیقتش را بخواهید تا آخرین لحظات هم از زبان lua سر در نیاوردم و همین امر باعث شده بوده که بیشتر از کانفیگ‌های دیگران برای تنظیمات Awesome بهره بگیرم‌. ولی الان روی i3 همه چیز تحت کنترل من است‌. از طرفی اگر در فایل کانفیگ اشتباهی رخ داده باشد‌، سیستم خطایاب میزکار به دقت محل خطا و دلیلش را نشان می‌دهد‌، در حالی که در Awesome دیگر فایل کانفیگ لود نمی‌شد و از کانفیگ پیش‌فرض برای لود سیستم استفاده می‌شد‌.

Tiling دستی

حقیقتش را بخواهید دلیل جذب شدنم به Awesome قابلیت کنترل تمام و کمالش به کیبورد بود و نه Tilingاش‌! حتما می‌پرسید چرا؟ Tiling در Awesome به صورت خودکار انجام می‌گرفت و با وجود قابلیت استفاده از layout‌های مختلف هنوز هم یک جای کار می‌لنگید‌!‌ مثلا من نیازی ندارم که دیکشنری mdic هم tile شود‌! آن هم هر دفعه که می‌خواهد یک لغت ترجمه کند‌، این شد که کلا قابلیت نمایش پنجرهٔ mdic را بی‌خیال شده بودم و برای ظاهر نشدنش در هر جا به یک میزکار جدا محدودش کرده بودم‌. نرم‌افزار‌هایی از این دست برایم زیاد بودند‌. مثل gimp یا vlc یا صفحهٔ گفتگوی Pidgin! حالا i3 چطور کمکم می‌کند؟ در i3 به راحتی می‌توان تعیین کرد پنجرهٔ بعدی کجا باز شود و یا حالت پیش‌فرضی برای باز شدن پنجره‌ها تایین کرد‌. مثلا با یک meta+v می‌گویم پنجرهٔ بعدی زیر پنجرهٔ حاضر باز شود‌! البته هنوز یک مشکل هم دارم که احتمالا باگ باشد‌ (با این زبان داغانم در اینجا به مشکل اشاره کردم‌). یا اصلا می‌توان گفت که یک پنجره tile نشود‌! meta+shift+space پنجره را می‌کند و دیگر خیالت راحت است!

میزکار‌های داینامیک‌:

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

مشکلات:

پشتیبانی نکردن از تایتل‌های فارسی:

اعلان خط به صورت -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1 که فکر می‌کنم مربوط به X باشد و با استفاده xfontsel قابل تعیین است‌، متاسفانه امکان استفاده از فونت‌های یونیکد را نمی‌دهد ( یا یه همچین چیزی! هنوز درست مشکل را درک نکرده‌ام! باید بیشتر تحقیق کنم ) همین می‌شود که در تایتل‌های فارسی برنامه‌ها که در فایرفاکس بیشتر از همه نمود پیدا می‌کند‌، به مشکل بر بخوریم‌. البته این مشکل را حل کرده‌ام و در پست بعد در موردش می‌نویسم‌.

قابلیت‌های گزارش دهی ضعیف i3status:

این برنامه در واقع برای گزارش‌گیری این نرم‌افزار و دادن اطلاعات برای منوهای میزکار ساخته شده‌. ولی با وجود این که اطلاعات اولیه خوبی ارائه می‌دهد ولی هنوز هم با وجود ابزاری مثل conky وجودش تقریبا بیهوده است‌.

keybinding برای تغییر صفحه کلید:

حقیقتش این یکی نابودم کرد تا حلش کنم‌! دوست نداشتم روی X کلیدی تعریف کنم که صفحه کلید را تغییر دهد‌. از طرفی نمی‌خواستم عادت چندساله‌ام برای Alt+shift را کنار بگذارم‌. یعنی حقیقتش در اولین اقدام آمدم با Capslock این کلیدها را جایگزین کنم که عوض دو حالت‌، سه حالته شد‌! یعنی یک بار که می‌زدی انگلیسی بود‌، بار بعد انگلیسی Capital بود و بار بعد فارسی می‌شد (که باید دنبال دلیلش بگردم و اگر شد این کلید را جایگزین کنم). بگذریم‌! مشکل اینجا بود که برای keybindingها می‌شود از یک کلید یا یک metakey به علاوهٔ یک کلید استفاده کرد‌! حالا مشکل اینجا بود که alt و shift هر دو meta حساب می‌شوند و خوب یعنی نمی‌شد تعیینشان کرد‌! که البته این مشکل هم حل شده و در موردش در پست بعد می‌نویسم‌!

نتیجه:

با وجود این که i3 خیلی وقتم را برای کانفیگ و درکش گرفت و Awesome خیلی قابلیت‌های بدرد بخور و خوشگل‌تر از i3 داشت‌، سادگی و سر راست بودن این میزکار جذبم کرده و فعلا می‌خواهم از آن استفاده کنم‌! حتی اگر قابلیت نمایش عکس BackGround هم نداشته باشد D:

*: همانطور که گفتم برای من این دو تا بودند‌! آن بیرون خیلی خیلی بیشتر از دو انتخاب برای میزکار با این قابلیت‌ها وجود دارد!

وقایع نگاری شخصی سازی emacs قسمت اول

اول این که جهت چینش هر پاراگراف را مثل مرورگر‌های جدید بر اساس نوع نوشتار تعیین می‌کند‌. این یعنی متن فارسی را می‌توان مثل آدمی‌زاد درش نوشت و درد نگرفت‌!

دوم مدیر بسته‌هاست که کلی چیز جدید می‌تواند به emacsتان اضافه کند‌. بحث ما هم سر همین دومیست‌.

ایمکس به صورت پیش‌فرض خیلی خوب است‌، خیلی‌. ولی می‌توان با دستکاری خیلی چیز بهتر و کارا‌تری هم از تویش در آورد‌. این است که می‌خواهم چند تا بسته برای کار‌هایم توش اضافه کنم‌. اما اول از همه باید یک مخزن درست و درمان به مدیر بسته‌هایم اضافه کنم تا برای نصب بسته‌ها درد کمتری متحمل شوم (بماند که خود این مدیر بسته کلی دردناک می‌شود به وقتش‌!). پس اگر فایل ‎.emacs در پوشهٔ خانگی‌ام ندارم یکی می‌سازم و به صورت زیر مخزن‌هایم را اضافه می‌کنم:

(setq package-archives '(("ELPA" . "http://tromey.com/elpa/")

("gnu" . "http://elpa.gnu.org/packages/")

("marmalade" . "http://marmalade-repo.org/packages/")))

خوب گل سر سبد این مخازن اسمش Marmalade است که از فرود عزیز بابت معرفیش تشکر می‌کنم ;-). خوب بسته‌ها اضافه شد و کافیست بعد از باز کردن ایمکس کلید M + x را فشار دهیم‌. (M مخفف Meta است و منظور در اینجا کلید Alt و یا اگر نداریدش کلید Esc هست) و در اعلان ظاهر شده بنویسیم package-list-packages (اعلان ایمکس قابلیت Auto Completion دارد پس با Tab کارتان را در نوشتن دستوراتش راحت‌تر کنید). پس از مدتی انتظار لیستی از بسته‌های قابل نصب یا نصب شده روی سیستم‌تان نمایش داده می‌شود. نشانگر را روی هر بسته ببرید‌. Enter را فشار دهید تا توضیحاتش را بخوانید‌. اما فعلا بی‌خیال این بخش شوید و همراه من بیایید تا چند بستهٔ حیاتی به درد بخور را نصب کنیم:

Auto-complete:

اولین نیاز من برای یک ادیتور به درد بخور همین قابلیت تکمیل خودکار متن است‌. اول این که سرعتم را بالا‌تر می‌برد‌. دوم هم این که خیالم را در خطاهای املایی در برنامه‌نویسی راحت‌تر می‌کند ;-) این می‌شود که در ایمکس دستور زیر را وارد می‌کنم M + x package-install RET auto-complete و بسته نصب می‌شود‌. آن‌وقت فایل ‎.emacs را باز می‌کنم و خط‌های زیر را به آن اضافه می‌کنم‌:

;;Start Auto-complete config

(add-to-list 'load-path "~/.emacs.d/elpa/auto-complete-1.4")

(require 'auto-complete-config)

(add-to-list 'ac-dictionary-directories "~/.emacs.d/elpa/auto-complete-1.4/dict")

(ac-config-default)

;;End Auto-complete config

حالا عملا کار باید تمام شده باشد‌. اما یک مشکل وجود دارد که حدود دو سه ساعت وقتم را نابود کرد تا بفهمم از کجاست‌. بستهٔ Auto-complete برای نمایش دادن آن جعبهٔ خوشگلش برای کلمات پیشنهادی از یک بستهٔ دیگر به اسم popup استفاده می‌کند که خوشبختانه مدیر بسته‌ها هم این بسته را به عنوان پیش‌نیاز نصب می‌کند‌. اما در یک پوشهٔ جدا‌. حالا بستهٔ Auto-complete هر چه می‌گردد در پوشهٔ خودش نمی‌تواند popup.el را پیدا کند‌. این می‌شود که می‌نویسیم:

cp ~/emacs.d/elpa/popup/popup.el ~/emacs.elpa/auto-complete-1.4

حالا این بسته نصب شده و در همه‌جا فعال است‌. این بسته در شاخهٔ dict در محل نصبش یک سری فایل با شناسهٔ Modeهای مختلف ایمکس دارد که در واقع لغت‌های پیشنهادی را از آن‌جا می‌یابد‌. لغات در بعضی از دیکشنری‌های مخصوصا برای C+‎+‎ خیلی ناقص است‌. می‌توانید دستی فایل را باز کنید و کاملش کنید‌.

zenburn-theme:

این تم را قبلا معرفی کرده‌ام‌. برای نصبش می‌نویسیم M + x package-install RET zenburn-theme RET و کار تمام است. حالا برای لود شدن این تم به صورت پیش‌فرض خطوط زیر را به ‎.emacs اضافه می‌کنیم:

;;Start: config theme

(add-to-list 'custom-theme-load-path "~/.emacs.d/elpa/zenburn-theme-1.5")

(load-theme 'zenburn t)

;;End: config theme

این تم در حالت گرافیکی به راحتی لود می‌شود‌. اما در حالت متنی emacs -nw به خاطر کم بودن رنگ‌ها ممکن است مشکل داشته باشید‌. برای حل این مشکل فعلا الالحساب این خط را به فایل ‎.bashrc یا ‏‏‎.zshrc تان اضافه کنید تا بعدا در یک پست مجزا در موردش توضیح دهم:

export TERM=xterm-256color

بعله‌. الان دیگر تمتان هم خیلی میزان است و همه‌جا قابل استفاده ;-)

php-mode, js2-mode, css-mode:

مهم‌ترین چیز برای برنامه‌نویس‌هایی که می‌خواهند از ایمکس برای توسعهٔ پروژه‌هایشان استفاده کنند همین مد‌های ایمکس هستند‌. در اینجا سه مد مختلف برای زبان‌های php, javascript و CSS معرفی شده‌اند که به نظرم خیلی عالی هستند‌. مخصوصا js2-mode که یک IDE به تمام معنا برایتان مهیا می‌کند‌! برای نصب که دیگر باید بدانید چه کار کنید‌. هیچ خطی هم نیاز نیست به ‎.emacsتان اضافه کنید‌. تنها برای رفتن به هر مد کافیست تایپ کنید M + x mode-name RET همین. فعلا برای قسمت اول کافیست‌. در قسمت بعد با چیز‌های هیجان‌انگیز‌تری بر می‌گردیم D:

دانلود تمام عکس‌های SimpleDesktop با سه خط در Bash!

http://simpledesktops.com/download/?desktop=301

همهٔ آدرس جز عدد ۳۰۱ در انتهایش ثابتند و آن عدد از ۱ یکی‌‌یکی زیاد می‌شود‌. هر کدام از این عکس‌ها پس از درخواست شدنشان به آدرس یکی از عکس‌های روی سرور اشاره می‌کنند‌. خوب دیگر داستان از این هم ساده‌تر می‌شود؟ کافیست که اراده کنیم و با یک حلقهٔ for اعداد را تولید کنیم و جلوی آدرس ثابتمان بنویسیم‌. پس می‌شود این:

#!/usr/bin/bash



for i in {1..5000}

do

echo "http://simpledesktops.com/download/?desktop=$i"

done

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

...

http://simpledesktops.com/download/?desktop=4995

http://simpledesktops.com/download/?desktop=4996

http://simpledesktops.com/download/?desktop=4997

http://simpledesktops.com/download/?desktop=4998

http://simpledesktops.com/download/?desktop=4999

http://simpledesktops.com/download/?desktop=5000

حالا کافیست در اسکریپت به جای echo که هر چه جلویش باشد را در خروجی استاندارد چاپ می‌کند یک wget بنویسیم تا آدرس‌های جلویش را دانلود کند‌. اما نه‌! در اولین اقدام تیرمان خطا رفت‌! در سرور‌های Apache یک فایلی هست به اسم ‎.htaccess و همان‌طور که از نامش معلوم است کارش این است که کنترل کند چه کسی به کجا دسترسی دارد‌. هر نرم‌افزاری هم که به یکی از این سرور‌ها درخواست بدهد موظف است اول خودش را معرفی کند‌. خوب wget که از نامش فساد می‌بارد عموما از طرف چنین سایت‌هایی مسدود می‌شود‌.

این است که باید به wget بگوییم نقابش را به صورت بزند و دوباره اقدام کند‌. اینبار اسکریپتمان این شکلی می‌شود‌:

#!/usr/bin/bash



for i in {100..5000}

do

wget -U "Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2" "http://simpledesktops.com/download/?desktop=$i"

done

و بعله‌! ران می‌کنیم و خیلی خوشکل اقدام به دانلود عکس‌ها می‌کنیم ;-)

پی‌نوشت: در حین جستجو برای نوشتن این اسکریپت کشف کردم که قبلا اسکریپت‌هایی با Python یا PHP هم برای شیره‌کشی از این سایت نوشته شده‌. ولی این اسکریپت از همه‌شان کوتاه‌تر بود و خوب سادگی زیبـــــاست ;-)

پی‌نوشت ۲: دیگر خودتان حواستان باشد که ‎#!‎/‎usr/bin/bash آدرس bash سیستم من است و می‌توانید با یک whereis bash پیدا کنید که مال شما کجاست‌!

پی‌نوشت ۳: ممکنه بعد از دانلود متوجه بشین که فایل‌های دانلودی با یه همچین اسمایی ذخیره می‌شن index.html?desktop=100 اتفاقی که برای من روی سرور آرچ افتاد‌. عجیب بود که اسم فایل درست رو می‌دید ولی خودش از رو این Querystring ساخته شده اسم رو می‌نوشت‌. پس از جستجو کشف کردم که باید آپشن زیر هم به wget اضافه بشه:

```bash

--content-disposition

```

ترمیناتور، آخر‌الزمان ترمینال‌ها

ترمینال قبلی‌ای که استفاده کرده بودم Konsole بود‌! قبل‌تر‌ها هم (در دوران جاهلیت‌) از Terminal گنوم استفاده کرده بودم‌. ولی همیشه یک چیزی کم بود‌. آدم احساس خفگی می‌کرد‌. ابزار‌هایی مثل Screen بودند که کمک کننده باشند ولی خیلی از کار‌ها مثل قاچ کردن (!) صفحه به دو بخش. و یا این که ترمینال کانفیگ شده‌ام در تمام میز‌کار‌ها به یک شکل نشان داده شود‌ به نظرم خیلی مهم‌تر از ترنسپرنت شدن ترمینال می‌آمدند‌.

این شد که از هفت هشت ماه پیش (بخصوص پس از مهاجرت به Awesome) شروع به استفاده از Terminator کردم‌. قابلیت Tabسازی و Split کردن صفحه‌اش با این کلید‌های میانبری که جدیدا کشف کردم‌، واقعا به سرعت کار کمک می‌کنند‌. (برای دیدن میانبر‌ها از Prefrences تب Keybinding را باز کنید)

همچنین قابلیت‌های دیگری هم مثل پشتیبانی از یونیکد (که به درد ما نخورد) نیز می‌تواند جالب توجه باشد‌.

نمونه‌ای از کار با Terminator