C read word line from text file

C read word from file
Прост C код, който чете от текстов файл line-by-line и показва резултата като думи. Идеята е, ако имаме файл, на който всеки ред представлява дума, да можем да вземем тази дума и да я обработим.

#include <stdio.h>
#include <stdlib.h> // ANSI C exit() prototype
 
#define MAX 40
 
int main(){
	FILE * fp;
	char words[MAX];
 
	if ((fp = fopen("in.list", "r")) == NULL){
		printf("Can't open file\n");
		exit(1);
	}
 
	while (fscanf(fp,"%s",words) == 1){
		puts(words);
	}
 
	if (fclose(fp) != 0) printf("Error in closing file \n");
}

Текстовия файл in.list съдържа следните редове:
foo
bar
biz

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

Share and Enjoy !

Shares

Apache and PHP Server Session not working

Това е един прост трик, който задължително трябва да знаете, ако ви се прецакват PHP-сесиите на локалния компютър. При мен се получи при 2 различни версии на XAMPP. Задължително тествайте сайта, като в адресната лента не пишете “localhost” или “127.0.0.1”, а пишете iP-то, което имате в мрежата ви.
Това може да се види, като се изкара един промпт и в него пишете:

ipconfig /all

… или командата “ifconfig”, ако ползвате Linux.

Share and Enjoy !

Shares

C++ use ENTER to quit program – излизане от конзолна програма с Enter

C++ е много печен език и почти винаги едно нещо може да се напише по 10 различни начина. Но всеки от начините си има предимства и недостатъци. Скрипта по-долу е една моя алтернатива на проверка за натиснат 2 пъти ENTERR в конзолна програма. Използва Enter-а за изход, като просто проверявам, дали има въведен string в командния вход – cin:

#include <iostream>
using namespace std;
 
int main () {
string a;
 
while(1){
    getline(cin, a);
    if (a.empty())
        break;
    cout<<"You added: "<<a<<endl;
}
 
cout<<"You Enter!"<<endl;
}

След компилиране се получава това:
C++ use Enter to quit program

Share and Enjoy !

Shares

Excel VBA add row – добавяне на ред с Vba в Excel

Днес ми се наложи да добавям доста редове в Excel таблица, която беше предварително форматирана. Добавянето и форматирането на редовете един по един е хамалска работа, затова реших да напиша простичък макрос на VBA, който да свърши работата. Кода на макроса е:

Private Sub CommandButton1_Click()
    ActiveCell.Offset(1).EntireRow.Insert
    ActiveCell.EntireRow.Copy
    ActiveCell.Offset(1).EntireRow.PasteSpecial Paste:=xlPasteFormats, _
        Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
End Sub

Кода го вкарвам в Shee-та:
Excel VBA add code to Sheet1
За да го стартирам се вижда, че съм използвал бутон, вкаран в Shee-та:
Excel VBA - добавяне на ред
Екселския файл може да се изтегли от тук: Excel VBA add row
Ето и едно видео, което показва цялата операция:
Excel VBA add row
[flv:https://blog.nediko.info/examples/excel_VBA_add_row/Add_row.flv https://blog.nediko.info/wp-content/uploads/2012/06/excel_addrow_03.jpg 472 388]

Share and Enjoy !

Shares

wxRuby + RubyScript2exe – мания

От известно време се забавлявам с Ruby. Този език е абсолютна мания за обектно-ориентирано програмиране. Липсваше ми само едно нещо – правенето на екзета, за да не инсталирам навсякъде интерпретатора. Намерих му колая, разбира се не без известни мъки :).
Използвам следните инструменти:

  • ruby-1.8.7-p72-i386-mswin32
  • wxRuby – инсталира се само един файл wxruby.so тук: ruby\lib\ruby\site_ruby\1.8\i386-msvcrt\wxruby.so. Инсталационния файл е wxruby-0.6.0-mswin.exe
  • rubyscript2exe – 0.5.3 (29.05.2007)

Това са стари версии, но само с тях разполагах под ръка.

При компилиране ми излизаше една грешка в rubyscript2exe:
rubyscript2exe.rb:621:in `replace’: can’t modify frozen string (TypeError)
Пачнах го като замених ред 621:

$0.replace(File.expand_path("./init.rb"))

с

$_0 = File.expand_path("./init.rb")
alias $__0 $0
alias $0 $_0

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

Някои полезни трикове.
Има още една яка библиотека, с която могат да се компилират exe-та с Ruby – ocra.
Компилиране на TK-GUI:

ocra tk.rb --windows D:\ruby-1.9.3\lib\tcltk --no-autoload --add-all-core

Share and Enjoy !

Shares

Perl start from batch file – md5 sum check

Има много хитър начин да си набавим в Windows някои от популярните инструменти в Mac, UNIX, Linux, Android и т.н., като е достатъчно да имаме инсталиран Perl. Ето един пример, как да си набавим md5 sum checker за стрингове от командния ред:

@rem = 'source http://www.dostips.com
@CD/d"%~dp0"&perl -s "%~nx0" %*&Exit/b&:';
 
#perl script starts below here
use strict;
use Digest::MD5  qw(md5_hex);
if($ARGV[0]== ""){
	print "Vyvedi string!!!\n";
	exit;
}
my $md5_data = $ARGV[0];
my $md5_hash = md5_hex( $md5_data );
print "$md5_hash\n";

Запазваме кода в batch-файл, като md5.bat. Добра идея е да го запазим там където имаме достъп, чрез променлива на обвивката, примерно директорията system32. След това си генерираме md5 суми от стрингове директно през промпта:

md5 "proba"

Резултата е: c0a8e1e5e307cc5b33819b387b5f01fd

Share and Enjoy !

Shares

PHP image change order – смяна на подредбата на картинки

Искаше ми се да подобря някои галерии които съм правил за разни сайтове. Не знам как до сега не съм се сетил да вкарам нещо толкова полезно и толкова дребно, като кодиране, като смяната на подредбата или последователността (change order).
PHP picture change order
Ще покжа прост пример, като ще използвам обикновена текстова база данни със следното съдържание:

a=>edno
b=>dve
c=>tri
d=>chetiri
e=>pet

И php скрипта:

<?php
$act = $_GET['act'];
$id = $_GET['id'];
 
$x=0;
 
if( isset($act) && ($act == 'up' || $act == 'down')){
	$arf = file("db.txt");
	foreach($arf as $line){
		list($k, $v) = preg_split('/=>/', rtrim($line));
		$input[$k] = $v;
		if($k == $id){
			$xp = $x;
		}
		$x++;
	}
	$inkey = array_keys($input);
	$inval = array_values($input);
	if($act == 'up'){
		$prevord = array_slice($inval, $xp-1, 1);
		$previd = array_slice($inkey, $xp-1, 1);
		$curord = array_slice($inval, $xp, 1);
 
		$prevord = $prevord[0];
		$previd = $previd[0];
		$curord = $curord[0];
		$curid = $id;
 
		$input[$previd] = $curord;
		$input[$curid] = $prevord;
 
		foreach ($input as $key => $val){
			$write .= $key."=>".$val."\r\n";
		}
		file_put_contents("db.txt", $write);
		header("Location:sortar.php");
		exit;
	} else {
		$nextord = array_slice($inval, $xp+1, 1);
		$nextid = array_slice($inkey, $xp+1, 1);
		$curord = array_slice($inval, $xp, 1);
 
		$nextord = $nextord[0];
		$nextid = $nextid[0];
		$curord = $curord[0];
		$curid = $id; // c
 
		$input[$nextid] = $curord;
		$input[$curid] = $nextord;
 
		foreach ($input as $key => $val){
			$write .= $key."=>".$val."\r\n";
		}
		file_put_contents("db.txt", $write);
		header("Location:sortar.php");
		exit;
	}
}
 
 
 
 
$arf = file("db.txt");
foreach($arf as $line){
	list($k, $v) = preg_split('/=>/', rtrim($line));
	$input[$k] = $v;
}
 
$inkey = array_keys($input);
$inval = array_values($input);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<style type="text/css">
body {background: #ededed;}
table {border-collapse:separate; border-spacing:5px; }
table tr td {border: 1px solid #fff;}
table tr td:first-child {background: #ddd;}
table tr td:first-child a {text-decoration: none; color: blue; font-weight: bold; font-size: 24px;}
</style>
</head>
 
<body>
	<table>
	<?php
	for($x=0; $x<count($inval);$x++){ ?>
		<tr>
		<?php if($x==0){ ?>
			<td><a href="sortar.php?act=down&id=<?php echo $inkey[$x]; ?>" >\/</a></td>
			<td><img src="img/<?php echo $inval[$x]; ?>.jpg"></td><td><?php echo $inkey[$x]; ?></td>
		<?php } elseif($x==(count($inval)-1)){ ?>
			<td><a href="sortar.php?act=up&id=<?php echo $inkey[$x]; ?>" >/\</a></td>
			<td><img src="img/<?php echo $inval[$x]; ?>.jpg"></td><td><?php echo $inkey[$x]; ?></td>
		<?php } else { ?>
			<td><a href="sortar.php?act=up&id=<?php echo $inkey[$x]; ?>" >/\</a>
			<a href="sortar.php?act=down&id=<?php echo $inkey[$x]; ?>" >\/</a></td>
			<td><img src="img/<?php echo $inval[$x]; ?>.jpg"></td><td><?php echo $inkey[$x]; ?></td>
		<?php } ?>
		</tr> <?php
	}?>
	</table>	
</body>
</html>

Демо може да се види тук: PHP change order images

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

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