Peppermint, wbar, lxde and language applet

Peppermint ми стана любимо Linux дистро за флашката. Изключително леко и бързо. Инсталирам го Universal USB Installer с персистентно пространство, за да мога да инсталирам допълнителни програми и да го конфигурирам. Ето малко тарикатлъци:
1. Добавяне на applet за смяна на английски и бълграски:

gedit ~/.linuxmint/skl

Поставям следния текст и Save:

setxkbmap "us,bg(phonetic)" -option "grp:alt_shift_toggle"

След това се стартира с:

~/.linuxmint/skl

И можете да си менкате кирилица или латиница с Shift+Alt (левите)
За улеснение може да се викне и аплета Keyboard layout switcher:
Десен клик на лентата със задачите -> Add/Remove Panel Items -> Panel Applets -> +Add -> Keyboard layout switcher

2. Добавяне на Wbar панел (като тоя в MAC)

apt-get install wbar

За улеснение при конфигурирането се изтегля WbarConf.
Инсталиране на WbarConf:

sudo ./install.sh /usr

И вече го имаме в Menu -> Accsessories -> WbarConf
Настройките за позицията и т.н. са в File -> Settings

3. Автоматично стартиране на програми със зареждането на Peppermint
Повечето съвременни Linux дистрибуции разполагат с улеснен Autostart на програмите. По принцип това може да се види и редактира в сесията на десктопа. Но ние сме пичове и обичаме да го правим сами. Ще покажа как могат да се набутат горните 2 “програми” в autostart-а на Peppermint.
Отивате в ~/.config/autostart и създавате празен файл keyb.desktop. Разширението .desktop казва на операционната система да зареди този файл при зареждането на десктопа за текущия потребител. Вътре в keyb.desktop поставяме следното съдържание:

[Desktop Entry]
Encoding=UTF-8
Name=Keyboard Layout
Comment=Keyboard Layout Settings
X-GNOME-Autostart-Delay=60
Exec=/home/peppermint/.linuxmint/skl

Същото можем да направим и с Wbar – wbar.desktop:

[Desktop Entry]
Encoding=UTF-8
Name=Wbar
Comment=Wbar panel
Exec=bash -c "sleep 10; /usr/bin/wbar -pos top --above-desk"

В крайна сметка, след рестарт, всичко си е на мястото и работи идеално:
wbar panel and wbar settings
Може би не е най-елегантното решение, но пък върши много добра работа.

Share and Enjoy !

Shares

Greasemonkey scripts

Ползвали ли сте Greasemonkey? Това е една изключително готина добавка за Firefox (вече и за други браузери, в Chrome 4 си я има по подразбиране), която доста улеснява живота. Greasemonkey ви позволява да промените начина по който изглежда или се държи дадена Web-страница, благодарение на малки парченца javaScript код.
Greasemonkey може да се използва за персонализиране на редакторите във форумите. Как примерно да добавим бутончета към редактора за постове в Dbg:
– да прави цвета на селектирания текст в синьо, а текста удебелен
– да слага тагове за цитиран текст

Ей го скрипта:

// ==UserScript==
// @name           Add DBG Buttons
// @namespace      http://www.download.bg/*
// @description    Add DBG Buttons
// @include        
// ==/UserScript==
 
var BlueBtn = document.createElement('a');
BlueBtn.appendChild(document.createTextNode('Blue'));
BlueBtn.setAttribute("onclick", "s('[color=blue][b]', '[/b][/color]', document.posting_form.message)");
BlueBtn.setAttribute("style", "color: blue; font-weight: bold; cursor:pointer; margin: 0 2px; background: #eeeedd; border: 1px solid #bbbbaa;");
 
var content=document.evaluate("//a[@class='rtbutton']", document, null, 9, null).singleNodeValue;
content.parentNode.insertBefore(BlueBtn, content);
 
var QuotBtn = document.createElement('a');
QuotBtn.appendChild(document.createTextNode('"quot"'));
QuotBtn.setAttribute("onclick", "s('[q]', '[/q]', document.posting_form.message)");
QuotBtn.setAttribute("style", "color: black; font-weight: normal; cursor:pointer; margin: 0 2px; background: #eeeedd; border: 1px solid #bbbbaa;");
 
var content=document.evaluate("//a[@class='rtbutton']", document, null, 9, null).singleNodeValue;
content.parentNode.insertBefore(QuotBtn, content);

Много готино е, че Frefox поддържа XPath! За разлика от лайното Internet Explorer (трябва да се забрани със закон и всеки потребител да подписва договор, че никога, за нищо на света няма да използва IE, ам наистина НИКОГА!). А XPath яко улеснява писането на JavaScript и неимоверно съкращава кода.
Резултата може да се види на картинките по-долу.
Оригинална лента:

С добавените бутони:

Скрипта може да се изтегли от тук:
Добавяне на бутони към коментарите в DBG
======================================

Между другото Greasemonkey може да автоматизира и въвеждането на информация в специални сайтове, като например онлайн игрите. Има една онлайн игра Dimiva.com, където трябва да въртиш някакво зомбирано колело и междувременно ти излизат някакви зомбирани реклами, които трябва да познаваш за какво са и да кликаш на radio-бутони под тях. Изобщо зомбирана ситуация. Използвам я само за примерен скрипт, който да маркира автоматично radio-бутоните.

// ==UserScript==
// @name           Dimiva
// @namespace      https://www.dimiva.com/*
// @description    Dimiva advent script
// @include        
// ==/UserScript==
 
var items = {
"24ins" : "Застрахователен",
"0_7_wonders" : "Сладкарница",
"0_svobodni_kvartiri" : "жилища под наем",
"folio4cars" : "Затъмняване",
"cube_fitness_club" : "Фитнес",
"0_4by4" : "Off-Road",
"0_qbi_group" : "Застрахователен",
"0_maniq_varna" : "Дрехи втора упореба",
"e4995150fc0a" : "Алмохадон"
};
 
var images = document.getElementsByTagName('img');
 
for (var i=0; i<images.length; i++){
	for(var index in items) {
		if (images[i].src.indexOf(index) != -1) {
			document.evaluate("//div[contains(@class,'banner-container')]/a/img[contains(@src,'" + index +"')]/../../div/label[contains(text(),'" + items[index] + "')]/input", document, null, 9, null).singleNodeValue.setAttribute('checked', 'checked');
		}
	}
}

Спред картинката, която се зарежда, маркирам и съответния бутон. Картинките са с постоянни имена, което улеснява зомбираната ситуация.
И скрипта: dimiva.com – radio clicker

======================================
Ще покажа и още един пример, който обработва всички зададени тагове от дадена страница. Примерно искаме да сменим цвета на “син” на всички линкове в някой сайт. За да си спестя безмислено писане на код, отново ще използвам XPath.

// ==UserScript==
// @name           Blue Links
// @namespace      http://statcounter.com/
// @include        http://statcounter.com/*
// ==/UserScript==
 
 
textNodes = document.evaluate("//a", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
 
for (var i=0;i<textNodes.snapshotLength;i++) {
  var node = textNodes.snapshotItem(i);
  node.style.color = "blue";
}

======================================
На сайта на филмовата база данни IMDB има много интересни класации и рейтинги на филми. Но при отварянето на някои излиза досаден банер, който те призовава да станеш ProUser. Примерна страница:
https://pro.imdb.com/moviemeter/?d=tt_moviemeter_why
IMDB ProUser - banner

Това е смешно… и естествено е редно да го разкараме:

// ==UserScript==
// @name           imdb hide pro banner
// @namespace      none
// @include        http://pro.imdb.com/moviemeter/*
// ==/UserScript==
 
var snode = document.evaluate("//div[@id='pro_upsell_wrapper']", document, null, 9, null).singleNodeValue;
snode.style.display = 'none';

След като приложихме скрипта, получаваме една нормална страница:
IMDB ProUser Banner removed - Greasemonkey

======================================

И още един скрипт за оналайн магазина SportsDirect, който скрива резултати с цена по-висока от избраната от нас. Примерно искаме да скрием всички стоки, които са с цена по-висока от 29 паунда.

// ==UserScript==
// @name           SportsDirect
// @namespace      http://www.sportsdirect.com/
// @include        http://www.sportsdirect.com/*
// ==/UserScript==
 
var price_custom = 29; // Nad kakva cena da skriva rezultata
 
textNodes = document.evaluate("//span[@class=\"sellingprice s-largered productPrice productHasRef\"]", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
 
for (var i=0;i<textNodes.snapshotLength;i++) {
 
  var nodeText = textNodes.snapshotItem(i).textContent.replace("£","");
  var node = textNodes.snapshotItem(i)
  if(nodeText>=price_custom){
	node.parentNode.parentNode.parentNode.parentNode.parentNode.style.visibility = 'hidden';
  }
}

Файл за инсталиране: SportsDirect price filter

======================================

Малко полезни линкове:
https://userscripts.org/ – база данни с потребителски скриптове. Добро място за разучаване на кодирането с Greasemonkey.
https://wiki.greasespot.net/ – мястото от където е добре да започнем
document.evaluate – обяснение за опциите на document.evaluate

Share and Enjoy !

Shares

Blender + Photoshop – Winter wallpaper

Хвана ме Коледното настроение. Може би е заради Jim Beam-а и лошото време :)! Мек бърбън за кеф! моите приятели не го харесват, но на мен ми е една голяма мазня, от готните. И изобщо Jim Beam-а ми влиза в челната 3-ка на любимите алкохоли. Естествено, че ми действа депресарски липсата на всякакви видове сняг. Искам сняг бе хора! Айде, развалете го малко т’ва време, да му се не види! Ама ми е гот де :)! Все още е само лееекинко Коледно, но пък с тенденция!
Докато си мислих (недей да мислиш, бъди себе си …пффффф :)) и слушах Коледния албум на Pink Martini – Joy to the World реших да рисувам. Пийньето действа на музите, ако ти се намират. Изразни средства, които ползвам: Blender 3D (вездесъщия моделер!) и Photoshop, не че и с GIMP не става, това дето го драща.
Ето я картинката:
Коледа Wallpaper
Прилагам и сорса – 3D-файла и PSD-Photoshop файла: Blender + Photoshop Winter wallpaper
Идеята иска още много работа, като примерно да и надълбая една пъртина, да мацна някоя зарязана шейна, да заваля сняг и дъра-бъра. Но и така стилизирано ми харесва на деКстопа. Ако ви се вали сняг, завалете си го.

Share and Enjoy !

Shares

GTK2 and Perl GUI – simple example

Често ми се налага да правя GUI-та за малки програмки на perl, ruby, python и за това ще постна простичък интерфейс, който показва основните неща:

#!/usr/bin/perl -w
 
use utf8;
use Gtk2 '-init';
use strict;
 
my $buffer;
my $wm   = Gtk2::Window->new;
   $wm->set_title ('GTK2 + Perl GUI');
my $vbox = Gtk2::VBox->new;
my $hbox = Gtk2::HBox->new( 0, 0 );
my $sw   = Gtk2::ScrolledWindow->new( undef, undef );
my $tw   = Gtk2::TextView->new();
my $button = Gtk2::Button->new( "Click me" );
my $entry = Gtk2::Entry->new_with_max_length( 50 );
 
sub create_widgets {
    $wm->signal_connect (destroy => sub { Gtk2->main_quit; });
 
    $wm->set_default_size( 260, 150 );
    $sw->add( $tw );
    $sw->set_policy( 'automatic', 'automatic' );
 
    $button->signal_connect( clicked => sub { \&button_click() } );
 
    $vbox->pack_start($hbox,0,0,0);
    $hbox->set_border_width(2);
 
    $hbox->pack_start( $entry, 0, 0, 0 );
    $hbox->pack_start( $button, 0, 0, 0 );
    $vbox->pack_start( $sw, 1, 1, 0 );
 
    $wm->add( $vbox );
    $wm->show_all();
}
 
create_widgets();
 
sub button_click{
    my $str = $entry->get_text();
    my $buffer = $tw->get_buffer();
    # append text:
    # $buffer->insert ($buffer->get_end_iter, "$str\n");
    $buffer->set_text($str);
}
 
Gtk2->main;

Резултат:
GTK2 Perl Simple Example

Ако все пак нямате инсталиран GTK2 на вашата дистрибуция, можете да го инсталирате така (за Debian базирани):

sudo apt-get install libgtk2.0-dev
sudo apt-get install libgtk2-perl

Share and Enjoy !

Shares

PoetryHaxor for Linux

Скоро написах една програмка за търсене на рими – PoetryHaxor за Windows. Преработих програмката и за linux, но вместо C++ използвах Perl, че е доста по-лесен.
Работи нормално под Gnome среда, защото GUI-то ползва GTK2.
Тествана е под Debian 2.6.32-5-686 и Ubuntu 11.04 с десктоп Gnome 2.30.2.
Версия на интерпретатора: perl v5.10.1
Изглежда ето така:
PoetryHaxor for linux
За да се стартира програмата се стартира perl-файла poetryhaxor.pl. Това може да се направи по няколко начина. Примерно:

perl poetryhaxor.pl

или да я направим да се отваря с двоен клик:

chmod +x poetryhaxor.pl

Скрипта може да се изтегли от тук: PoetryHaxor 1.0
Ако все пак нямате инсталиран GTK2 на вашата дистрибуция, можете да го инсталирате така (за Debian базирани):

sudo apt-get install libgtk2.0-dev
sudo apt-get install libgtk2-perl

Share and Enjoy !

Shares

PoetryHaxor – програма за търсене на рими

Написах простичка програма за търсене на рими. Демек програма за поезия. Мислех си да го напасна по срички (имаше една тема в DBG като идея), но стигнах до извода, че няма прекалено много думи, които да съвпадат по срички, за да хвърля ресурси в тая насока.
Писах го на C++, пак с опреснителна цел, както и други проекти напоследък. Макар, че като погледна кода леко ме хваща сТрам :). Прилагам проекта със сорса и ако някой има желание, може да си го прекомпилира и оптимизира (минимум :)). Речника е отделен от exe-то и е обикновен текстов файл с много думи. Начоплил съм го от BGOffice Помощник.
Ето линк към програмката, “мечта” на всички поети :): PoetryHaxor_1.0
PoetryHaxor - програма за търсене на рими
Речника е доста сериозен, а програмката не е особено оптимизирана. В тоя смисъл, за да работи по-бързичко се иска по-съвременна машина, но мисля, че и на 1GHz с 1Gb ще върви що-годе с забавяне при търсенето 3-4 секунди.

Пренаписах програмата (на perl) за linux – PoetryHaxor for Linux.
PS: Благодарение на bvbfan от форума на linux-bg.org пренаписах програмата, като кеширах речника в паметта. Към момента не отчитам подобряване на бързодействието, но ще си мисля още по въпроса. Ето и версия 0.2 на програмата: PoetryHaxor-v.02

Написах нова версия на програмата – PoetryHaxor 3.0. Тази версия е писана на C# и изисква .Net фреймуърк. Речника е обогатен с двойно повече думи и търсенето на думи става за по-малко от секунда. Изстегляне: PoetryHaxor-v.03.

Share and Enjoy !

Shares

C++ RegEx wxDev-C++ – прост регулярен израз

Тия дни пиша една програмка за един приятел. Но реших вместо на php да я напиша на C++, че и без това го мъча напоследък. За компилатор и среда използвам wxDev-C++, че ми идва в всичко на куп, вкючително и за GUI.
Но нещо не можах да подкарам нормално Regular Expression. wxDevCpp разполага с интегрирани библиотеки, но какъвто и код да напиша не баца, да го weba! Случайно в мрежата открих и друг пич с подобен проблем и от него разбрах, че ако добавя по-долните редове в Линкера всичко ще е мед и рози:
-static
-l$(WXLIBNAME)
-l$(WXLIBNAME)_gl
-lwxtiff
-lwxjpeg
-lwxpng
-lwxzlib
-lwxregex
-lwxexpat
-lkernel32
-luser32
-lgdi32
-lcomdlg32
-lwinspool
-lwinmm
-lshell32
-lcomctl32
-lole32
-loleaut32
-luuid
-lrpcrt4
-ladvapi32
-lwsock32
-lodbc32
-lopengl32

За да се добавят, трябва да се създаде нов проект, след което се избира: Project -> Project Options -> Additional Command-Line Options -> пейства се в полето Linker.
Прост код за пример:

#include <iostream>
#include <wx/wx.h>
#include <wx/regex.h>
using namespace std;
 
int main()
{
wxRegEx reg("[0-9]{3}$");
wxString str = "sddgtrf156";
if(reg.Matches(str)) cout << "matches\n"; // match the string - yes!!
}

Share and Enjoy !

Shares

C++ – read text file and add line to vector

Реших да си припомня малко C++, защото в някои случаи е просто незаменимо като скорост на изпълнение. Което е обратно пропорционално на скоростта на писане (в моя случай). Но пък винаги е добре да владееш до известна степен някой друг език, дава ти различен ъгъл за виждане.
Днешната цел е да прочета текстов файл и да вкарам всеки ред от файла в масив. В случая няма да ползвам масив, а вектор, защото ми е по-лесно да работя с вектори:

/* 
    Open the text file in code. C++ has iostream and fstream headers to assist with this.
    Until you reach EOF, read one line at a time.
    // For each line in step 2, split the line on a space (google string tokenizer)
    // For each token from step 3, add to a vector
    For each line in step 2, add to a vector
    Close the file
*/
#include <iostream>
#include <fstream>
//#include <string>
#include <vector>
 
using namespace std;
 
 
int main () {
string line;
vector<string> myvector;
ifstream myfile ("example.txt");
 
 
if (myfile.is_open()){
  while ( myfile.good()){
    getline (myfile,line);
    // cout << line << endl;
    myvector.push_back (line);
  }
  myfile.close();
} else cout << "Unable to open file"; 
 
 
for(int i = 0; i < myvector.size(); i++ ){
    cout << myvector[i] << "\n";
}
 
return 0;
}

В началото на скрипта има едни коментари, които ги свих от някакъв сайт. По тези коментари може лесно да се направи програмата да разделя текста и на отделни думи.

Share and Enjoy !

Shares

Google search като p2p

За ефективното търсене с google има писани много книги и статии. Но не се иска да си завършил в Сорбоната за да събереш 2 прости идеи в една доста по-креативна. В този пост ще си сложа само маркери, които доста ме улесняват да си намирам достъпни за теглене музика, книги, различни видове файлове (като .blend за Blender 3d), речници за brute-force.
За пример ще дам няколко стринга за търсене. Ако сте фен на яки джазета от сорта на Bebel Gilberto (дъщерята на великия João Gilberto) и искате да си изтеглите някой неин албум, да речем Momento, можете да използвате следния критерий за търсене:

-inurl:(htm|html|php) intitle:”index of” +”last modified” +”parent directory” +description +size +(wma|mp3) “Bebel Gilberto – Momento”

Ако си търсите учебник по програмиране на D с графичните библиотеки на Tango, можете да се пробвате със следния сърч:

-inurl:(htm|html|php) intitle:”index of” +”last modified” +”parent directory” +description +size +(pdf|doc) “Learn to Tango with D”

За да се търсят zip, rar или друг тип файлове се променят разширенията в скобите (pdf|doc). Черичкта “|” означава “или”.

Повече инфо за критериите за търсене може да се намери в документацията на google:
Google Search Operators
More search help

Share and Enjoy !

Shares

JavaScript GUI – бързо, вкусно, лесно с GLUEScript

Днес докато се ровех за интересни нови неща около JavaScript интепретатора на mozilla – SpiderMonkey попаднах на много интересна среда за програмиране GLUEScript, базирана на този интерпретатор. За графичния потребителски интерфейс (GUI) се използват wxWidgets.
Възможността да се пишат GUI програми с JavaScript особено много ме гизкефи. JavaScript е доволно популярен и приложим език за програмиране. Информация в мрежата бол.
Ето едно много просто приложение, което показва лекотата за писане с GLUEScript – температурен конвертор между Фаренхайд и Целзий:

var wx = require("wx");
wx.theApp.onInit = function()
{
  var frame = new wx.Frame(null, wx.Id.ANY, "Fahrenheit to Celsius Converter", { x:-1, y: -1}, new wx.Size(307, 73));
  var panel = new wx.Panel(frame, wx.Id.ANY);
  var button = new wx.Button(panel, wx.Id.EXIT, "Convert", { x : 112, y : 8 });
 
	var textbox1 = new wx.TextCtrl(panel, wx.Id.EXIT, "", { x : 6, y : 8 });
	var textbox2 = new wx.TextCtrl(panel, wx.Id.EXIT, "", { x : 192, y : 8 });
 
	button.onClicked = function(event){
		textbox2.value = (textbox1.value - 32)*5/9;
	}
  frame.center();  
  frame.show();
  return true;
}

Запазваме програмата като converter_c_to_t.js и я изпълняваме през промпта или конзолата:

glue converter_f_to_c.js

Резултат:
JavaScript GUI - Fahrenheit to Celsius Converter
С WinRar можем да направим програмката изпълнимо exe, като включим всички необходими файлове: F_to_C_Converter.exe

Share and Enjoy !

Shares