Archive for November, 2009

Готин Bash хак за изтриване на път

Tuesday, November 24th, 2009

Забелязъл съм нещо интересно, което може да се прави в csh, но работи по друг начин в bash.
Да речем че съм написал някакъв дълъг път:

/mnt/storage/mp3/Manowar

… и се сетя че всъщност не съм имал предвид “Manowar” като последна директория, а “rammstein”. Единия начин да оправя това е като набия 7 backspace-а и да изтрия всяка буква поотделно, докато стигна до наклонената черта. Ами ако се сетя че “rammstein” не е в “mp3”, а в “/mnt/storage/Music”? Тогава чаткането по backspace става още повече.
В csh това става елементарно с CTRL-W – комбинацията изтрива всичко от командния ред до предната наклонена черта.
Така

/mnt/storage/mp3/Manowar

става

/mnt/storage/mp3/

с един CTRL-W. Следващия CTRL-W ще махне “mp3/”, следващия ще махне “storage/” и т.н.
Гугъл върна един резултат на това търсене – тук в Shallow Thoughts.
На кракто решението е следното:
Това отива в ~/.inputrc:

set bind-tty-special-chars Off

А това отива в ~/.bash_profile:

bind '\C-w:backward-kill-word'

Шела се рестартира (logout -> login) и трябва да работи.
Обяснение на дълго защо се случва това – в горния линк.

GIMP – прекалено сложна за ползване

Sunday, November 22nd, 2009

Тези две новини от два различни сайта пристигнаха в RSS четеца ми една след друга:
GIMP няма да е в Ubuntu 10.04 по подразбиране
50% от завършващите гимназия са неграмотни
Мисля че новините идеално се допълват в контекста на една друга.
GIMP заемала прекалено много място. Инсталаторът е цели 14МВ, докато Photoshop архивите в дата-та са към 300-400MB.
Интерфейсът на GIMP бил прекалено сложен. Има-няма 20 инструмента.
GIMP била алтернатива на Photoshop, а Photoshop не била включена по default в Windows, за това GIMP не трябва да е в Ubuntu. О… Боже… Мой…

Регулярни изрази в C (PCRE)

Thursday, November 19th, 2009

Предполагам че на всеки, който пише код рано или късно му се налага да парсва низове. В случай че низът не е нещо кратко, точно и ясно, се налага използването на regex. В различните езици регулярни изрази се ползват по различен начин. Общото е че върху изследвания низ се налага шаблон и според това дали низът попада в шаблона (match-ва) се предприемат някакви действия или части от низа се прехвърлят в други променливи. В Perl това става лесно – има си езикова конструкция:

  1.  
  2. $string = "The lazy dog jumped over the quick brown fox.";
  3. if ($string =~ /(\w{3}\./){
  4. $match = $1;
  5. do_something_on($match);
  6. }
  7.  

Кракто и ясно – ако низът попада в /шаблон/ – да се направи еди какво си. Няма да се спирам точно върху синтаксиса на шаблоните, понеже самия факт че четете това тук предполага че сте на ясно 🙂
Все пак ако не сте на ясно, ето ви един плашещ шаблон, за да се откажете още тук:
/^([\d\.]+?)\skill\s+(\d+)\s+([\w\s]+?)(\d+?)\s+([\w\s]+?)\w+$/
Това използвам за парсване на тези редове от логовете на Unreal Tournament:
175.48 kill 1 Sniper Rifle 5 Sniper Rifle Decapitated
В PHP няма езикова конструкция, но има доста функции за Perl Compatible Regular Expressions, които работят на същия принцип.
Сега да видим как е положението в С.
От много време търсех как мога да ползвам регулярни изрази, но все удрях на камък. Когато ми се е налагало да парсвам низове съм ползвал sscanf или разбиване на символи, броене, чакане Х-тия символ да е точно ‘А’, Y-тия да е точно ‘B’ и т.н. Неприятна работа включваща жонглиране с цикли, if-ове, strcmp и двадесет нива индентация на кода.
Днес открих че в С има поддръжка на PCRE и ми се дощя да се самоубия 🙂
Ако работите на нормална операционна система, то може да видите много информация с man pcre и man pcreapi. Ако сте наистина щастливци, някъде из дистрибуцията ще имате файл pcredemo.c, който нагледно показва как се работи с PCRE функциите.
Ако не сте от тези щастливци можете да си намерите файла от тук.
Използват се две основни функции: pcre_compile и pcre_exec. Първата поема съставения шаблон от потребителски низов вид и го превръща във вътрешното представяне, което компилатора използва. Втората функция налага шаблона върху тествания низ и връща съвпаденията във вид на масив от вектори, сочещи началните позиции на съвпаденията. Можете да прочетете за функциите в съответните man страници. И най-добре вижте pcredemo.c

Нов адрес на Void and Null

Thursday, November 19th, 2009

Поради настъпващото глобално затопляне (вземайки предвид географското местонахождение на текущия сървър), ще местя блога към по-високи места – на blog.ivanatora.info. Който има някакъв интерес насам – да си ъпдейтне връзките 🙂
И някои готини нововъведения – версията на WordPress е обновена до последната налична и е инсталирана добавка, която форматира код. Това последното много ми липсваше до сега.

Закоментиране на цял блок код с един знак

Sunday, November 1st, 2009

Този бърз хак работи само в езици, които поддържат коментари от вида “//” за коментиране на ред и такива от вида “/* … */” за коментиране на блок.
Да вземем този блок:

  1.  
  2. blqk();
  3. puf();
  4. paf();
  5.  

Да го закоментираме целия:

  1.  
  2. /*
  3. blqk();
  4. puf();
  5. paf();
  6. */
  7.  

И да закоментираме затварящия коментар 🙂

  1.  
  2. /*
  3. blqk();
  4. puf();
  5. paf();
  6. //*/
  7.  

В този момент целия блок е закоментиран. Ако сега добавим единична “/” пред отварящия коментар, коментарите ще отпаднат и блокът ще се разкоментира:

  1.  
  2. //*
  3. blqk();
  4. puf();
  5. paf();
  6. //*/
  7.  

Изпробвано е и работи в С и РНР. Ако имате пуснато оцветяване на кода в редактора, който ползвате (и оцветяването работи добре в реално време), ще видите интерсна гледка при добавяне и премахване на магическата “/” 🙂