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

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

PHP XPath command line graber – for Windows and Linux

Написах скромно скриптче на PHP за прилагане на XPath изрази през командния ред. Скрипта изисква инсталиран Lynx или, ако се ползва под Windows трябва да се постави Lynx в същата директория. Готиното на това програмче е, че не се интересува дали има грешки в страницата.

<?php
if ($argc != 3 || in_array($argv[1], array('--help', '-help', '-h', '-?'))) {
?>
 
This is a XPath extractor.
 
  REQUIRES:
  "lynx" to be installed!
 
  USAGE:
  <?php echo $argv[0]; ?> <site> <xpath>
 
  EXAMPLE:
  <?php echo $argv[0]; ?> http://site.com/some_page.html "//a[contains(@href,\"?rec\") and not(contains(@href,\"comment\"))]/@href"
  --------------------
 
  With the --help, -help, -h,
  or -? options, you can get this help.
 
<?php
} else {
$site=$argv[1];
function get_cont($url){
$c = `lynx -source $url`;
return $c;
}
$html = get_cont($site);
$dom = new DOMDocument();
@$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$hrefs = $xpath->evaluate($argv[2]);
for ($i = 0; $i < $hrefs->length; $i++) {
	$bb = $hrefs->item($i)->nodeValue;
	print "$bb\n";
}
}
?>

Начин на употреба:

php xpath.php site.com/some_page.html "//a[contains(@href,\"?rec\") and not(contains(@href,\"comment\"))]/@href"

Остава да успея и да го компилирам :). За сега съм пробвал с Bambalam compiler, Roadsend, phc и още няколко по-незнайни емдера и компилатора, но … дърво от всякъде. Все пак, ако си имате инсталиран php и Lynx си работи идеално.
Lynx за Winblowz може да се ползва от тук: Lynx for Windows
Причината да използвам конзолния браузер Lynx е, че много сайтове използват gzip компресия на страниците, за да се зареждат по-бързо. Така не ми се налага да правя еквилибристики от сорта на:

wget -O - somesite.com | gunzip -c

Share and Enjoy !

Shares

ТОТО 6 от 49 генератор – Javascript generate random unique numbers

Скоро в форума на DBG коментирахме скрипт за генериране на случайни числа за тото 6 от 49. Аз си написах собствен JavaScript генератор, който използва специфични и важни javascript трикове:
1. Генериране на обхват от числа
2. Проверка дали дадено число е част от масив
3. Възходящо сортиране на масив от числа
Ето и кода за тото-генератора:

// Деклариране на минимално и максимално число
var min = 1;
var max = 49;
// Брой на случайно-генерираните числа
var randnums = 6;
/* =================================== */
var nums = [];
var c = 0;
var seqarr =[];
 
function compare(a,b){return a - b}
 
for (var num = min; num <= max; num++){nums.push(num)}
 
do{
	var el = nums[Math.floor(Math.random() * nums.length)];
	if(seqarr.indexOf(el) != -1){continue}
	else {
		seqarr.push(el);
		c++;
	}
}while(c<randnums);
 
document.write(seqarr.sort(compare));

Пример може да се види тук:
JavaScript Random Numbers – ТОТО 6 от 49

Share and Enjoy !

Shares

Нова версия на BGHotelCMS

Най-накрая намерих малко време да обновя проекта си, с който искам да подпомогна българския туризъм – BGHotelCMS 1.01.
Кода го пренаписах от нулата, като използвах PHP MiniTemplator, за да разделя програмирането от дизайна. Това ми помогна да съкратя доста кодирането и ми позволява да създавам и добавям много лесно нови теми за дизайна.

Повече подробности за този проект могат да се видят на страницата му – https://bghotelcms.nediko.info/

Share and Enjoy !

Shares

Web Mechanize engines

Съществуват много приложение на ботовете за автоматизиране на web-среда, т. нар. Web Mechanize engines. Тук ще разгледам няколко такива системи за механизиране и автоматизиране на работата с web-страници.

Приложение на Mechanize-ботовете

С помощта на скриптовете за автоматизиране на Web могат да се:

  • Попълват множество бланки и формуляри с еднородна информация
  • Търси в мрежата
  • Автоматизират регистрации. Примерно автоматизирано попълване на бланки за Гражданска отговорност.
  • Извличане на информация от множество сайтове наведнъж и съхраняването и.

и т.н.

Някои по-популярни Mechanize системи

WWW::Mechanize – Perl модул, написан от Jesse Vincent. Един от първите подобни модули за автоматизирано браузване.
mechanize – Python алтернатива на по-горния модул. Включва достъпните (супер лесни за работа даже) mechanize.Browser и mechanize.UserAgentBase имплементации на urllib2.OpenerDirector.
LWP – The World-Wide Web библиотека отново за Perl.
twill – базиран на Python изключително прост език за автоматизирано браузване. Изпълнява се от команден ред и изисква Python 2.3 или по-нов.
zope.testbrowser – още един модул за Python.
Watir – библиотека на Ruby за автоматизирано браузване. Супер лесна за работа.
Scriptable Browser – PHP алтернатива на горните модули. Все още има какво да се желае, но определено доста интересен проект.
Snoopy – PHP клас, който също е насочен към автоматизирано браузване.
Compass_Mechanize – PHP пакет, който е наречен от авторите “WWW::Mechanize for PHP”. Изисква Zend Framework.

Firefox Mechanize extensions

Освен посочените по-горе модули или езици, съществуват и приложения, които работят в средата на браузъра. Ще посоча някои механизатори за Firefox:
iMacros – Един от най-яките автоматизатори. Записва всички събития и генерира изключително лек и четим код. Не е нужно да изучвате скриптов език. Супер елементарно се работи с тази добавка.
iMacros Command Line – това брилянтно разширение разполага и с поддръжка на командния ред.
Chickenfoot – много любим механизатор. Има си собствен език за писане на скриптовете, който е доста лесен. Разполага и с рекордер на събитията, както и старт от командния ред: firefox -cf-run.
DejaClick – още една добавка за Firefox, която може да записва събития. Генерира малко трудно-четими скриптове, иначе пък си има някои полезни опции.
Selenium IDE – един от първите автоматизиращи плъгини за Firefox. Помня, че четох за него преди поне 6-7 години, дет се вика от зората на пандата. Не съм го ползвал, защото тогава не ми е бил необходим, но определено заслужава да е в този списък.

Разбира се има и много стари и достъпни методи за автоматизиране на по-леки задачи в Web. Например с cURL и wget понякога могат да се постигнат чудеса.

Share and Enjoy !

Shares