Подготвя ли се падане на валутният борд и инфлация?

От два дни започва да ми прави впечатление странна тенденция в статиите на новинарските ежедневници. Започвам да си задавам въпроси:
Пада ли валутният борд?
Грози ли ни зловеща инфлация и обезценяване на лева?
Това план ли е или е плод на некадърността на политиците ни?
Примерно статия от днес (12.09.2013):
Кризата променила възгледите на Орешарски за икономиката

Моето виждане отпреди кризата беше, че стабилната фискална политика е най-важна в дългосрочен хоризонт, но сега смених мисленето си, за мен по-важно е преструктурирането и структурните мерки, каза той.

Пламен Орешарски – на дискусията “Бъдеще за Европа” в Китай

Какво, по дяволите, значи това? Какво означава преструктуриране и структурни мерки? Защо те са по-важни от фискалната стабилност на държавата? Лично за мен това е една завоалирана алабалистика, която има за цел да ни подготви за едно предстоящо решение – падането на валутният борд! Да не говорим, че кризата започна 2008-ма година, а Орешарски чак сега я е забелязал, та и си сменил мнениято :). Изглежда като да се надува някакъв сапунен мехур от празнодумие, но какво се крие?

Естествено тенденциите в думите на Орешарски не остават незабелязани от много хитрия ни народ и вследствие водят до:
Лошите кредити на българите набъбнали с 43 млн. лв. за месец

Много от нас помнят голямата инфлация, когато за една нощ лева се обезценяваше с 300%. Тогава някои хора направиха много пари – кредитните милионери. Схемата беше добре подготвена и контролирана, така че да засегне само хората, които нямат допирателни със властта. Спестяванията се стопиха буквално за един миг.
Става ли същото и сега? Започвам да придобивам чувството, че това правителство дойде на власт с една-едничка цел и задача – да направи няколкото хора, които контролират държавата, още по-богати! Въобще не им пука за обикновения трудещ се човек, за това че едвам оцелява, че няма работа, че тока и парното са безбожно скъпи. Популизъм се лее ежедневно с измислени намаления на електро-енергията. Но не за това ми се ще да пиша в момента.

Друг важен белег за нещо лошо, което се случва е дефлацията. Новина също от днес:
Август е шестият пореден месец с дефлация

От началото на годината (август 2013 спрямо декември 2012) също е отчетена дефлация от 2.2%. Годишната инфлация (август 2013 спрямо август 2012 г.) е минус 0.7%. Средногодишната инфлация за периода септември 2012 – август 2013 г. спрямо периода септември 2011 – август 2012 г. е 2.9%.

Всеки, който е учил поне един семестър икономика знае, че дефлацията често е много по-опасна от инфлацията. При дефлация в най-общи линии се получават ниски приходи в бюджета, ниски печалби на фирмите, намаляне на работните места. Понякога дефлацията предхожда силна инфлация.
Съвсем скоро ще разберем какво са ни приготвили премиера Орешарски и задкулисното му обкръжение. Какво точно е искал да преструктурира и какво значат структурни мерки. Искрено се надявам да не съм прав, че се задават тежки времена за левчето. Моята прогноза е, че до април-май ще се случи нещо брутално ненормално с икономиката на България. Така, че ще е добре да сме предпазливи, а който има някой скътан лев е добре превантивно да го обърне в евро или друга стабилна валута.

Share and Enjoy !

Shares

Nimbus атомайзер и Private V2 механичен мод – ревю

Взех си да тествам малко от китайските бюджетни джаджи за е-цигарено изпаряване. Чиста механика, без грам електроника, та дори и без една жица. Дори батериите с които изпарявам, някакви Sanyo 2800Mah, са без защита, за да мога да подкарвам намотки с ниски съпротивления. Та бих искал да споделя виждането за подобна техника.
Взех ги от FastTech – Private V2 Mod, Nimbus 2.

Мода Private V2 се прецака на 2-я ден. Всъщност самия мод си е ок, обаче главата му е алуминиева и вече не мога да завия нормално дрипера. Хрумнаха ми разни типс анд трикс, колкото да мога да си го ползвам, но като цяло съм разочарован. Повече никакъв алуминий!!! Към момента го ползвам, като изрязах тънка лентичка от капачка на кисело мляко, която навивам предварително около вътрешната резба на главата на мода. Работи, но гледам да не свалям Nimbusa от него.
За Nimbusa спретнах dual coil намотка от Nichrome 0.22mm, а фабричните намотки заминаха директно в коша. Съпротивлението на едната на мотка е 1.6Ohm, което означава, че двете паралелно дават около 0.8Ohm. Пуши та се къса! Като цяло първият ми опит с дрипери (атомайзери с периодично ръчно накапване с никотинено сокче) го оценявам като успешен! Въпреки неудачите с мода.
Техниката изглежда така:

Private V2 + Nimbus

Private V2 + Nimbus

Private V2 + Nimbus

Така изглежда мода Private V2 с картомайзер Dream BT804 SS V2 – къса версия:
eyk0fJ

А това са съставните части на Private V2:
CjV1rd

Мода е малко по-дълъг от необходимото и не работи с единична батерия 18350, за това, а и заради алуминиевата глава е на цена от $12. Хитра и простичка конструкция, но не го препоръчвам! Ако някой иска да си купи готин механичен мод, нека приготви поне двойно на тия парички и да си вземе нещо стоманено (SS).
Примерно китайския клонинг на Nemesis, който е на невероятната цена от $29:
Nemesis

Share and Enjoy !

Shares

Изряване на сцена от филм и конвертиране до GIF-анимация

Малко се позабавлявах да изрязвам gif-чета от AVI-филм.
Необходими инструменти:
ffmpeg за Windows
Faststone Image Viewer
GifSicle за Windows
bash за Windows

Избираме си сцена от филм и виждаме времето на сцената, плюс-минус 1-2 секунди. Аз си избрах Mr. Brooks с бай Кевин Костнър. Плейването можем да го направим с всеки плеър. В случая използвам GOM-player:
AVI to Gif animation
Изрязваме сцената до jpeg, като използваме ffmpeg, но преди това влизаме в Bash, за да използваме брояч на файловете:
AVI to Gif animation
Ето и командата към ffmpeg:

ffmpeg -i "Mr.Brooks.2007.BRRip.XviD.AC3-SANTi.avi" -qscale 0 -r 23 -ss 00:02:01 -t 3 -f image2 foo-%03d.jpg

Изпълнението на горната команда ще извлече по 23 кадъра в секунда от AVI-файла и ще ги конвертира до jpg-картинки. Отваряме с FastStone директорията и изтриваме всички ненужни файлове. След това обработваме останалите файлове в Bach-режим, като си настройваме колко да се отреже от картината, намаляме размера и конвертираме всички файлове до GIF-картинки:
AVI to Gif animation

AVI to Gif animation

Предварително си записваме региона от сцената, който ни интересува. В случая режа регион 424x384px, като започвам от координати x=72, y=0:
004_01

AVI to Gif animation

AVI to Gif animation

AVI to Gif animation

AVI to Gif animation

След това използваме GifSicle, за да съединим всички GIF-файлове в един общ анимиран файл. Трябва да зададем delay (-d) мили секунди за всеки кадър, командата да цикли за всички GIF-ове последователно (-l *.gif), и името на изходния файл (-o Kostner.gif):

gifsicle -d 4 -l *.gif -o Kostner.gif

В резултат получаваме една прилична анимация, с която да се бъзикаме със съфорумците :):
AVI to Gif animation

А ето и още няколко рязаници от “Z-та световна война” с на Брат Пит бат му:
AVI to Gif animation

AVI to Gif animation

AVI to Gif animation

Ето и кратко видео, което показва подробно стъпките за правене на AVI to GIF animation:
[flv:https://blog.nediko.info/examples/avi_to_gif/Kostner_tutorial.flv examples/avi_to_gif/001.jpg 480 397]
Ако сървара не иска да пусне видеото, може да се изтегли и от тук:
Avi to GIF movie tutorial

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

Update: 09.12.2016

Има и много по-прост начин за правене на подобни GIF-чета, като се използва само ffmpeg:

ffmpeg -i video.mkv -ss 416 -t 2 -filter:v "crop=500:360:240:30, scale=320:-1" -loop 0 -final_delay -1 out.gif

, където:
-ss 416 – старт на отрязъка. В случая 416-та секунда от видеото.
-t 2 – продължителност на отрязъка. В случая 2 секунди.
crop=500:360:240:30 – изрязва прозорец от горния ляв ъгъл с размери ШxВ: 500x360px. Започва да реже по X и Y: 240px по X и 30px по Y.
scale=320:-1 – преоразмерява видеото на ширина, като запазва съотношението по височина.
-loop 0 и -final_delay -1 – са за да стане видеото на непрекъсната GIF-анимация.

Един пример на анимация, която направих по този начин:

ffmpeg animate gif

Share and Enjoy !

Shares

JavaScript обекно ориентирано програмиране – наследяване (пример)

Един много прост пример за наследяване на клас в JavaScript.
В случая имам клас Shape (форма), който ще разширя с клас за правоъгълник (Rectangle), който на свой ред ще разширя с клас за квадрат (Square).

<html>
<head>
<script type="text/javascript">
var Shape = function() {name: 'Shape'};
Shape.prototype.toString = function() {return this.name;};
 
var Rectangle = function(width, height) {this.width = width; this.height = height; this.shape = 'Rectangle';};
Rectangle.prototype = new Shape;
Rectangle.prototype.constructor = Rectangle;
Rectangle.prototype.area = function() {return this.width * this.height;};
 
var Square = function(width) {this.width = width; this.shape = 'Square';};
Square.prototype = new Rectangle();
Square.prototype.constructor = Square;
Square.prototype.area = function() {return this.width * this.width;};
 
myShape = new Square(6);
</script>
</head>
<body>
	myShape = new Square(6) ==&gt;<br/>
	<script type="text/javascript">document.write(myShape.width);</script>
</body>
</html>

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

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

var Shape = function () {};
 
var Triangle = function(w, h) { this.width = w; this.heigh = h; }
Triangle.prototype = new Shape();
Triangle.prototype.getArea = function () {return this.width * this.heigh; };
 
// ====== Kvadrat
var Square = function (l) { this.width = l; this.heigh = l; };
Square.prototype = new Triangle();
 
// ======== Examples
 
var square = new Square(4),
    triangle = new Triangle(2, 5);
 
print(square.getArea());
print(triangle.getArea());

За да стартирам кода използвам SublimeText2 с инсталирана приставка за стартиране на команди от шела Turtlestein, а за JavaScript интерпретатор използвам SpiderMonkey 1.8.5 for Windows.

Share and Enjoy !

Shares

Simple JavaScript rich text format editor

Прост, базов RTF редактор за сайт
JS_WisWyg_Editor_by_Ned
Дълго съм се чудил кой е най-подходящия JavaScript Wysiwyg редактор с най-много възможности за напасване към сайт. Ползвал съм NicEdit, TinyMCE и други, които сам съм писал, неподдържащи rich text format (RTF). Обаче напасването на тези редактори към различни дизайни е развибащо от към бачкане и тестване в различните браузери. Реших да почопля няколко такива редактора и да разбера кое е толкова загадъчно и сложно, за да се напише подобен редактор. Истината е тривиална и се казва – iFrame. Този таг се ползва в почти всички подобни редактори, точно заради поддръжката му на RTF. При събмитване на формата, цялото съдържание на iform се подава на textarea, който си седи удобно скрит.

Това е моят редактор, без CSS-форматиране, като в примера добавям и опция за обработка на текста от базата данни, където присъства без тагове, с ексейпнати малко по-рискови символи.

<?php
$field = '<a href="aloooha">Test\'ed. kavicha</a> dyra, byra.<br />Още текст и още "кирилица".';
$clearpost = $field;
 
 
if(isset($_POST['button'])){
	echo $_POST['myTextArea'];
	$clearpost = $_POST['myTextArea'];
}
 
//$clearpost = preg_replace('@delete|select|insert|update|where@i',"", $clearpost); // Почистване на 
//$clearpost = preg_replace('/[\x7f-\xff]/', "", $clearpost); // Clear Dirty Data
$clearpost = preg_replace("/;/", "&#59;", $clearpost);
$clearpost = preg_replace("/\*/", "&#42;", $clearpost);
$clearpost = preg_replace("/\r\n/", "<br />", $clearpost);
$clearpost = preg_replace("/\r/", "<br />", $clearpost);
$clearpost = preg_replace("/\n/", "<br />", $clearpost);
$clearpost = preg_replace("/</", "&lt;", $clearpost);
$clearpost = preg_replace("/=/", "&#61;", $clearpost);
$clearpost = preg_replace("/>/", "&gt;", $clearpost);
$clearpost = preg_replace("/\'/", "&#39;", $clearpost);
$clearpost = preg_replace("/\`/", "&#96;", $clearpost);
$clearpost = preg_replace("/\"/", "&quot;", $clearpost);
 
if (!get_magic_quotes_gpc()) $clearpost = preg_replace('@\\\@', "&#92;", $clearpost);
else {
	$clearpost = stripslashes($clearpost);
	$clearpost = preg_replace('@\\\@', "&#92;", $clearpost);
}
 
 
$clearpost = preg_replace("/&#39;/", "\&#39;", $clearpost); // Ескейпване на единичната кавичка, за да може да се показва в iframe!!!
?>
 
<!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>
<meta http-equiv="content-type" content="text/html; charset=windows-1251" /> 
<script src="wiswyg_ned/nedEditor.js"></script>
<script type="text/javascript">
 
window.onload=function(){
	iFrameOn();
	if(isIE){
		var myFrame = document.getElementById('richTextField');
		var frameDoc = myFrame.contentDocument || myFrame.contentWindow;
 
		if (frameDoc.document){
		  frameDoc = frameDoc.document;
		}
		frameDoc.write ('<?php echo html_entity_decode($clearpost, ENT_QUOTES); ?>') ;
	} else {
		window.frames['richTextField'].document.body.innerHTML = '<?php echo html_entity_decode($clearpost, ENT_QUOTES); ?>' ;
	}
}
</script>
</head>
<!-- <body onLoad="iFrameOn();" > -->
<body>
<form action="" enctype="multipart/form-data" name="myForm" id="myform" method="post">
<div id="wysiwyg_cp" style="padding:8px; width:700px;">
	<input type="button" onClick="iBold()" value="B"> 
	<input type="button" onClick="iUnderline()" value="U">
	<input type="button" onClick="iItalic()" value="I">
	<input type="button" onClick="iFontSize()" value="Text Size">
	<input type="button" onClick="iForeColor()" value="Text Color">
	<input type="button" onClick="iHorizontalRule()" value="HR">
	<input type="button" onClick="iUnorderedList()" value="UL"><br />
	<input type="button" onClick="iOrderedList()" value="OL">
	<input type="button" onClick="iLink()" value="Link">
	<input type="button" onClick="iUnLink()" value="UnLink">
	<input type="button" onClick="iImage()" value="Image">
	<input type="button" onClick="iRemoveFormat()" value="Remove Format"> 
</div>
	<!-- Hide(but keep)your normal textarea and place in the iFrame replacement for it -->
	<textarea style="display:none;" name="myTextArea" id="myTextArea" cols="100" rows="14"></textarea>
 
	<iframe name="richTextField" id="richTextField" ></iframe>
	<br />
	<input type="submit" name="button" id="button" value="Make Changes" onClick="javascript:submit_form();"/>
</form>
</body>
</html>

Съдръжанието на JavaScript файла:

// Check Browser
var isOpera = !!(window.opera && window.opera.version);  // Opera 8.0+
var isFirefox = testCSS('MozBoxSizing');                 // FF 0.8+
var isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0;
    // At least Safari 3+: "[object HTMLElementConstructor]"
var isChrome = !isSafari && testCSS('WebkitTransform');  // Chrome 1+
var isIE = /*@cc_on!@*/false || testCSS('msTransform');  // At least IE6
 
function testCSS(prop) {
    return prop in document.documentElement.style;
}
//====================
 
 
function iFrameOn(){ 
    richTextField.document.designMode = 'On';
    //window.frames['richTextField'].document.body.innerHTML = '<a href="aloooha">Aloha</a> dyra, byra.<br />Още текст има тук.';	
}
function iRemoveFormat(){
    richTextField.document.execCommand('removeformat',false,null); 
}
function iBold(){
    richTextField.document.execCommand('bold',false,null); 
}
function iUnderline(){
    richTextField.document.execCommand('underline',false,null);
}
function iItalic(){
    richTextField.document.execCommand('italic',false,null); 
}
function iFontSize(){
    var size = prompt('Enter a size 1 - 7', '');
    richTextField.document.execCommand('FontSize',false,size);
}
function iForeColor(){
    var color = prompt('Define a basic color or apply a hexadecimal color code for advanced colors:', '');
    richTextField.document.execCommand('ForeColor',false,color);
}
function iHorizontalRule(){
    richTextField.document.execCommand('inserthorizontalrule',false,null);
}
function iUnorderedList(){
    richTextField.document.execCommand("InsertOrderedList", false,"newOL");
}
function iOrderedList(){
    richTextField.document.execCommand("InsertUnorderedList", false,"newUL");
}
function iLink(){
    var linkURL = prompt("Enter the URL for this link:", "http://"); 
    richTextField.document.execCommand("CreateLink", false, linkURL);
}
function iUnLink(){
    richTextField.document.execCommand("Unlink", false, null);
}
function iImage(){
    var imgSrc = prompt('Enter image location', '');
    if(imgSrc != null){
        richTextField.document.execCommand('insertimage', false, imgSrc); 
    }
}
function submit_form(){
    var theForm = document.getElementById("myform");
    theForm.elements["myTextArea"].value = window.frames['richTextField'].document.body.innerHTML;
    theForm.submit();
}

Сорс кода: wiswyg_by_ned.rar
Demo нa кода.

Share and Enjoy !

Shares

rtmpdump – дъмпване на онлайн телевизия – БНТ 1, БТВ и Нова ТВ

На тази тема има публикуван нов материал с включени видео-уроци. Можете да го прочетете тук:
rtmpdump tutorial – урок за начинаещи

Заиграх се малко с rtmpdump. Много готин инструмент, с който може да се прихваща защитено видео. За да си набавя параметрите за дъмпа, използвах Wireshark.
Дъмп за гледане на БНТ1 през VLC:
rtmpdump -r “rtmp://edge2.evolink.net:2020/fls” -a “fls” -f “WIN 11,5,502,149” -W “https://cdn.bg/flash/jwplayer510/player.swf” -p “https://cdn.bg/live/4eViE8vGzI” -T “B@1R1st1077” -y “bnt.stream” –quiet | vlc –

Update [14.03.2016] Променен е стрийма на БНТ1. По долу е работещ към днешна дата код. БНТ1 разпознава само БГ IP-та, затова от чужбина трябва да се ползва прокси.

rtmpdump -r "rtmp://edge2.cdn.bg:2020/fls" -a "fls/" -W "http://i.cdn.bg/eflash/jwplayer510/player.swf" -f "WIN 18,0,0,232" -p "http://cdn.bg/live/4eViE8vGzI" -y "bnt.stream?at=22c035726e941f171f6676751141b491" -T "B@1R1st1077" --quiet | vlc -

БНТ HD

rtmpdump -r "rtmp://edge2.cdn.bg:2020/fls" -a "fls/" -W "http://i.cdn.bg/eflash/jwplayer510/player.swf" -f "WIN 18,0,0,232" -p "http://i.cdn.bg/live/OQ70Ds9Lcp" -y "bntHDt.stream?at=22c035726e941f171f6676751141b491" -T "B@1R1st1077" --quiet | vlc -

Дъмп на БНТ2

rtmpdump -r "rtmp://edge11.cdn.bg:2020/fls" -a "fls/" -W "http://cdn.bg/eflash/jwplayer510/player.swf" -f "WIN 18,0,0,232" -p "http://cdn.bg/live/ZBPbdxDHm7" -y "bnt2.stream?at=22c035726e941f171f6676751141b491" -T "B@1R1st1077" --quiet | vlc -

Дъмп на БТВ
rtmpdump -r “rtmp://46.10.150.111:80/ios” -a “ios” -f “WIN 11,5,502,149” -W “https://images.btv.bg/fplayer/flowplayer.commercial-3.2.5.swf” -p “https://www.btv.bg/live/” -y “btvbglive” –quiet | vlc –

rtmpdump -r "rtmp://46.10.150.113:80/alpha" -a "alpha" -f "WIN 11,5,502,149" -W "http://www.btv.bg/static/bg/shared/app/flowplayer/flowplayer.rtmp-3.2.13.swf" -p "http://www.btv.bg/live/" -y "alpha" --quiet | vlc -

И двата стринга могат да се запазят като изпълними скриптове на десктопа и да се стартират с 2 клика.

Може да се дъмпва и директно до файл, като се посочи output -o. Пример за дъмпване на бТВ до файл:

rtmp://46.10.150.113:80/alpha" -a "alpha" -f "WIN 11,5,502,149" -W "http://www.btv.bg/static/bg/shared/app/flowplayer/flowplayer.rtmp-3.2.13.swf" -p "http://www.btv.bg/live/" -y "alpha" -o "BTV_01.flv"

Нова ТВ
– плей с VLC

rtmpdump -r "rtmp://edge1.evolink.net:2010/fls" -a "fls/_definst_" -y "ntv_2.stream" -p "http://i.cdn.bg/live/" -T "N0v4TV6#2" --quiet | vlc -

– кепчъринг с rtmpdump

rtmpdump -r "rtmp://edge1.evolink.net:2010/fls" -a "fls/_definst_" -y "ntv_2.stream" -p "http://i.cdn.bg/live/" -T "N0v4TV6#2" -o "NovaTV_01.flv"

За да записвам Нова ТВ се наложи да декомпилирам swf-файла в който беше набутана паролата за стринга (Secure Token – TEA). Тази парола се добавя с параметъра -T, в случая е -T “N0v4TV6#2”

Дъмп на Канал 3

rtmpdump -V -r "rtmp://edge4.cdn.bg:2017/fls" -a "fls/" -W "http://i.cdn.bg/flash/jwplayer510/player.swf" -f "WIN 18,0,0,232" -p "http://i.cdn.bg/live/FP08SWAJ4v" -y "kanal3.stream?at=22c035726e941f171f6676751141b491" --quiet | vlc -

Дъмп на ТВ Европа

rtmpdump -r "rtmp://lb.blb.cdn.bg:2018/fls" -a "fls/" -y "tvevropa.stream" --quiet | vlc -

Дъмп на SPortal
До файл:

rtmpdump -V -r "rtmp://pri.cdn.bg:2001/fls" -a "fls/" -y "sportal_tv_hd.stream" -p "http://www.novini.bg/tv/703-sportal-bg.html" -o "proba.flv"

До VLC palyer:

rtmpdump -V -r "rtmp://pri.cdn.bg:2001/fls" -a "fls/" -y "sportal_tv_hd.stream" -p "http://www.novini.bg/tv/703-sportal-bg.html" --quiet | vlc -

===========================================
Подробно описание, как прихващам стриймовете (писал съм го за един форум, но го поствам и тук).
Надушвам ги с Wireshark. Ето как:
1. Стартираш Wireshark и “надушваш” кое е IP-то което стриймва. Това може да стане и с друга програма, като SmartSniffer или подобна лека програмка. Там се вижда много ясно кое IP точи постоянен трафик. След това залагаш това IP като филтър в Wireshark:
01.8699
Може да си сложиш IP-то като филтър и автоматично, с 2 клика:
02.8583
2. След това кликам на някой от прихванатите филтрирани пакети и с десен бутон избирам [b]Follow TCP stream[/b].
03.6096
3. Показва се прозореца с данните от прихванатите пакети, като в него намирам всичката ми необходима информация, за да направя дъмп на видеото:
04.7009
pageUrl…https://www.btv.bg/live/
flashVer…WIN 11,5,502,149
app…ios
swfUrl..https://images.btv.bg/fplayer/flowplayer.commercial-3.2.5.swf
tcUrl…rtmp://46.10.150.111:80
play………….btvbglive

4. С тези данни мога да стриймвам директно, ако сървара ми позволи, или пък да дъмпна стрийма с rtmpdump, като просто си заместя инфото като аргументи за стартиране на програмата:

rtmpdump -r “rtmp://46.10.150.111:80/ios” -a “ios” -f “WIN 11,5,502,149” -W “https://images.btv.bg/fplayer/flowplayer.commercial-3.2.5.swf” -p “https://www.btv.bg/live/” -y “btvbglive” -o “BTV_01.flv”

UPDATE: Стрийма на БТВ е променен. Новият е:
rtmpdump -r "rtmp://46.10.150.113:80/alpha" -a "alpha" -f "WIN 11,5,502,149" -W "https://www.btv.bg/static/bg/shared/app/flowplayer/flowplayer.rtmp-3.2.13.swf" -p "https://www.btv.bg/live/" -y "alpha" -o "BTV_01.flv"

5. Пийваш малко биричка и междувременно можеш да си пуснеш дъмпвания файл в някой плеър, за да си го гледаш в реално време.
————–
Междувременно написах проста програма – TV Player, която използва по-горните команди за гледане на онлайн телевизия. Програмката се намира тук:
Simple BG TV Player – прост rtmpdump плеар за гледане на BG-телевизии
Изглежда така:
simple bg tv player - онлайн телевизии

Share and Enjoy !

Shares

JScript Dot_NET GUI example

За да се програмира под .NET платформата е достатъчно да се инсталира някоя версия на фреймърка.
След инсталацията на .NET фреймуърк автоматично се инсталират няколко компилатора:
csc.exe – компилатор за C Sharp (C#)
jsc.exe – компилатор за JScript .Net
vbc.exe – компилатор за Visual Basic .Net

В момента имам инсталиран .Net framework 2.0 и работя с него, но предполагам, че и при по-новите версии ситуацията ще е подобна. Компилаторите се намират в директорията: C:\WINDOWS\ServicePackFiles\i386>
Аз харесвам JScript като структуриране на програмите и ще използвам него за конкретния пример. Както и в други GUI-примери, ще използвам и сега примерна програма за конвертиране на температура от Целзий до Фаренхайт.
Преди да поставя реалния код, ще покажа базов, рамкиращ код за това как се програмира подобна програма с графичен интерфейс:

import System;
import System.Drawing;
import System.Collections;
import System.Windows.Forms;
import System.ComponentModel;
import Accessibility;
 
public class Exercise extends System.Windows.Forms.Form {
    // var ...;
 
	function Exercise(){
		InitializeComponent();
		this.button1.add_Click(this.button1_Click);
	}
 
	function button1_Click(sender : Object, e : System.EventArgs){
		//...
	}
 
	function InitializeComponent(){
		// iniciirat se wsi4ki komponenti ot GUI-to
		this.textBox1 = new System.Windows.Forms.TextBox();
		// ...
	}
}
var frmPledge : Exercise = new Exercise();
frmPledge.ShowDialog();

На база на този пример попълваме целия необходим код. Помогнах си за интерфейса с SharpDevelop 3.2 – чудесна програма за .NET програмиране. За съжаления програмата нативно не поддържа JScript, за това от нея копирам само кода за формата, като леко го промених. Програмата изглежда така:
faren_to_celsius

Кода е сравнително лесен за писане и разбиране. Самото exe е едва 8kb. С включения сорс код може да се изтегли от тук: fahrenheit to celsius

import System;
import System.Drawing;
import System.Collections;
import System.Windows.Forms;
import System.ComponentModel;
import Accessibility;
 
public class Exercise extends System.Windows.Forms.Form {
    var button1  : System.Windows.Forms.Button;
    var textBox1 : System.Windows.Forms.TextBox;
    var textBox2 : System.Windows.Forms.TextBox;
 
	function Exercise(){
		InitializeComponent();
		this.button1.add_Click(this.button1_Click);
	}
 
	function button1_Click(sender : Object, e : System.EventArgs){
		var Faren : double;
		var Celsius : double;
		Faren = ConvertToDouble(this.textBox1.Text);
		if(!isNaN(Faren)){
			Celsius = (Faren - 32)*5/9;
			this.textBox2.Text = Celsius.ToString();
		} else {
			this.textBox2.Text = "Wrong format";
		}
	}
 
	function ConvertToDouble(valueto){
		var ddd = valueto.ToString(System.Globalization.CultureInfo.InvariantCulture)
		return ddd;
	}
 
 
	function InitializeComponent(){
		// iniciirat se wsi4ki komponenti ot GUI-to
		this.textBox1 = new System.Windows.Forms.TextBox();
		this.button1 = new System.Windows.Forms.Button();
		this.textBox2 = new System.Windows.Forms.TextBox();
		this.SuspendLayout();
		// 
		// textBox1
		// 
		this.textBox1.Location = new System.Drawing.Point(12, 12);
		this.textBox1.Name = "textBox1";
		this.textBox1.Size = new System.Drawing.Size(100, 20);
		this.textBox1.TabIndex = 0;
		// 
		// button1
		// 
		this.button1.Location = new System.Drawing.Point(118, 10);
		this.button1.Name = "button1";
		this.button1.Size = new System.Drawing.Size(75, 23);
		this.button1.TabIndex = 1;
		this.button1.Text = "Convert";
		this.button1.UseVisualStyleBackColor = true;
		// 
		// textBox2
		// 
		this.textBox2.Location = new System.Drawing.Point(199, 12);
		this.textBox2.Name = "textBox2";
		this.textBox2.Size = new System.Drawing.Size(100, 20);
		this.textBox2.TabIndex = 2;
		// 
		// MainForm
		// 
		this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
		this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
		this.ClientSize = new System.Drawing.Size(311, 46);
		this.Controls.Add(this.textBox2);
		this.Controls.Add(this.button1);
		this.Controls.Add(this.textBox1);
 
		this.Name = "Exercise";
		this.Text = "faren_to_celsius";
		this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
		this.MaximizeBox = false;
		this.MinimizeBox = false;
	}
}
 
var frmPledge : Exercise = new Exercise();
 
frmPledge.ShowDialog();

За да се компилира този код до изпълнимо exe правим следното:

  • запазваме сорс-кода в файла, примерно far_to_cel.js
  • отваряме команден прозорец cmd (Start -> Run -> cmd). Или натискаме шифт и кликаме в директорията със сорс-кода, след това избираме “Open command window here”.
  • след като сме позиционирали cmd в директорията със сорс-файла ще трябва да извикаме компилатора jsc.exe:
    C:\Windows\Microsoft.NET\Framework\v4.0.30319\jsc.exe /t:winexe far_to_cel.js

Ако не се покаже грешка, значи сме компилирали всичко нормално.

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

Прилагам същата програмка, но написана на C#:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Text.RegularExpressions;
using System.Globalization;
 
public class CelToFar : Form {
 
  Button button1;
  TextBox textBox1;
  TextBox textBox2;
 
  public CelToFar() {
    button1 = new Button(); 
    button1.Text = "Calculate";
    button1.AutoSize = false;
    button1.Location = new Point(80, 15);
    button1.Size = new Size(75, 23);
 
    textBox1 = new TextBox();
    textBox1.Location = new Point(12, 12);
    textBox1.Name = "textBox1";
    textBox1.Font = new Font("Microsoft Sans Serif", 14F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
    textBox1.Size = new Size(60, 40);
    textBox1.Text = "";
 
    textBox2 = new TextBox();
    textBox2.Location = new Point(165, 12);
    textBox2.Name = "textBox2";
    textBox2.Font = new Font("Microsoft Sans Serif", 14F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
    textBox2.Size = new Size(60, 40);
    textBox2.Text = "";
 
    button1.Click += new EventHandler(ButtonClicked);
 
    this.Controls.Add(button1);
    this.Controls.Add(textBox1);
    this.Controls.Add(textBox2);
 
    this.Height = 120;
    this.Width = 255;
    this.StartPosition = FormStartPosition.CenterScreen;
    this.Visible = true;
  }
 
  public void ButtonClicked(object source, EventArgs e) {
    string FarenTxt = this.textBox1.Text;
    double Faren;
    double Celsius;
    Regex rgx = new Regex(@"^[\d\.]*$");
 
    if(rgx.IsMatch(FarenTxt) && !String.IsNullOrEmpty(FarenTxt)){
      Faren = Convert.ToDouble(FarenTxt, CultureInfo.InvariantCulture);
      Celsius = (Faren - 32)*5/9;
      this.textBox2.Text = System.Math.Round((decimal)Celsius, 3).ToString(CultureInfo.InvariantCulture);
    } else {
      this.textBox2.Text = "Wrong format";
    }
  }
 
  static void Main() {
    Application.Run(new CelToFar());
  }
}

Запазваме файла с името Far_to_celsius.cs, след което компилиарнето на кода става по подобен начин:

1
C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /t:winexe Far_to_celsius.cs

Share and Enjoy !

Shares

wxPerl example TextCtrl – Button getValue(), appendValue()

Един интересен пример с WxPerl, който може да ми е полезен, ако реша да програмирам GUI за Windows.
За примера съм инсталирал:
Perl 5.10.1.1008 в директорията D:\installed\perl
Wx 0.9914
Alien-wxWidgets 0.61
Win32-GUI 1.06

Целия пакет с разни други полезни модули може да се изтегли от тук:
ActivePerl-5.10.1.1008-Win32+Win32GUI+WxPerl.rar

Програмата в примера не прави нищо собено, но е достатъчна базова информация, за да се започне скромна диалогова програмка. В общи линии, при натискане на бутон взима текста от едното поле и го добавя към другото поле:

#!/usr/bin/perl -w
use strict;
use Wx;
 
package MyFrame;
 
use Wx qw (wxVERTICAL wxTOP wxGROW wxHORIZONTAL wxTE_MULTILINE wxFIXED_MINSIZE wxLEFT );
use base 'Wx::Frame';
# import the event registration function
use Wx::Event qw(EVT_BUTTON);
 
sub new {
    my $ref = shift;
    my $self = $ref->SUPER::new( undef,           # parent window
                                 -1,              # ID -1 means any
                                 'wxPerl rules',  # title
                                 [-1, -1],        # default position
                                 [430, 360],      # size
                                 );
 
    my $panel = Wx::Panel->new( $self,            # parent window
                                -1,               # ID
                                );
    my $button = Wx::Button->new( $panel,         # parent window
                                  -1,             # ID
                                  'Click me!',    # label
                                  [30, 20],       # position
                                  [-1, -1],       # default size
                                  );
    $self->{txt} = Wx::TextCtrl->new(
            $panel,                      # parent window
            -1,                         # control identifier
            "Type your message here",   # default text value
            [10, 50],              # text control position [x, y]
            [400, 20],                  # text control size [width, height]
                         # style: wxTE_MULTILINE=The text control allows multiple lines
    );
    $self->{txt2} = Wx::TextCtrl->new(
            $panel,                      # parent window
            -1,                         # control identifier
            "",   # default text value
            [10, 100],              # text control position [x, y]
            [400, 200],                  # text control size [width, height]
            wxTE_MULTILINE, #=The text control allows multiple lines   style => wxTE_MULTILINE
    );
 
    # register the OnClick method as an handler for the
    # 'button clicked' event. The first argument is a Wx::EvtHandler
    # that receives the event
    EVT_BUTTON( $self, $button, \&OnClick );
 
    return $self;
}
 
# this method receives as its first parameter the first argument
# passed to the EVT_BUTTON function. The second parameter
# always is a Wx::Event subclass
sub OnClick {
    my( $self, $event ) = @_;
 
    if (my $rr = $self->{txt}->GetValue()) {
        print $rr."\n";
 
		$self->{txt2}->AppendText($rr."\n");
    }
 
    $self->SetTitle( 'Clicked' );
}
 
package MyApp;
use base 'Wx::App';
 
sub OnInit {
    my $frame = MyFrame->new;
    $frame->Show( 1 );
}
 
package main;
 
my $app = MyApp->new;
$app->MainLoop;

wx_example

Кода може да се компилира с Cava Packager 2.0. Това чудо прави страхотни екзета от Perl-скриптове, като добавя всички необходими модули.

Share and Enjoy !

Shares

Лесно генериране и помнене на сложни пароли

1. Използване на клавиатурата
Този метод се базира на стандартните клавиатури за PC. Естествено трябва да се запомни нещо простичко. Примери:
1.1. Запомняме буквата “T по часовниковата стрелка” без Shift и с Shift. Получават се символите:
6ygfr^YGFR

1.2. Запомняме “2 по диагонал” без Shift и с Shift
2wsx#EDC

1.3. Запомняне на 2 букви “RO по часовниковата” без Shift и с Shift
5tfde)PLKI

Изключително лесен метод за запомняне на сложни пароли! А вариантите са безкрайни.

2. Парола по лични данни
Можете да правите различни комбинации от личните си данни. Примерно с името и ЕГН-то
Да речем, че името ви на латински е: Lambri Lazarov
А ЕГН-то ви е: 7404113358
Можете да запомните “първите три” и примерна парола може да е:
първите три букви от името: Lam
първите три цифри от ЕГН-то: 740
първите три букви от фамилията: Laz
Паролата става: Lam740Laz

Може да се комбинира и с последните три: bri358rov
Или всякакви други комбинации, примерно първите три, средните четири, последните три: Lam4113rov

3. Парола по таблица с лични данни
В този случай пак лесно и достъпно можете да запомните паролата си. Примерно помните първите 4 колони:
LL7aa4mz0ba4

Получи се идеална 12-символна парола с малки и големи букви и цифри! Естествено отново могат да се правят всякакви комбинации.

Към техниките от т.1 и т.2 могат да се добавят и други данни, които винаги са ви в главата. Примерно град на раждане, презимето и т.н.

4. Използване на криптиращ алогитъм.
Отново много простичък метод, който обаче изисква да имате под-ръка интернет или криптираща програма, ако забравите паролата.
За начало можем да потърси в google за някакъв генератор на чек-суми по дума. Пълно е с такива за MD5 и SHA1 криптиращи алгоритми. Ето два примерни за MD5:
https://www.miraclesalad.com/webtools/md5.php
https://www.md5.cz/
С помощта на генератора генерирах чек-стринг на малкото име “lambri”. Резултата е:
948a01f083bd635e81acaa336e3ba4a4
Сега от тази поредица символи можем да вземем първите 10 символа и имаме готова достатъчно сигурна парола “948a01f083“.
Ако я забравим, ще е достатъчно да потърсим в google отново за md5-генератор и да напишем “lambri”. MD5-генератори има вградени във всяка Linux дистрибуция, може да се изтегли такъв и за Windows, така, че да не зависим от интернет.
Има и удобни хеш-генератори за телефони, които също могат да се използват. Лично аз ползвам HashDroid за Android
HashDroid MD5 Sum
Целия стринг може да се принтира и да си го сложите в портфейла, като само вие ще знаете кои точно символи използвате за парола.

5. Карти с пароли от passwordcard.org
Тази техника изисква да помните дължината на паролата и някакви други маркери, като цвят, символ, ред. Може да се държи на видно място и се генерират добри пароли, но трябва да си пазите картата.

6. Таблици с пароли
Идеята е да помните 5 символна дума и на нейна база генерирате парола. Да видим как работи. Ако се казвате Ламбо, можете да си генерирате доста уникална парола, като само трябва да си помните името, изписано на латиница.
В случая “lambo” би изглеждало, като парола, така: L6CK3Xsaenb

А как се получи?! Много е просто! Имаме име от 5 букви и таблица с 5 реда. Всеки ред отговаря на поредния символ от името:
1-ви символ “l” – ред едно, колона “KL” -> L
2-и символ “a” – ред втори, колона “AB” -> 6C
3-ти символ “m” – ред трети, колона “MN” -> K3
4-ти символ “b” – ред четвърти, колона “AB” -> Xsa
5-ти символ “о” – ред пети, колона “OP” -> enb

Share and Enjoy !

Shares

Калкулатор за пресмятане на течност за електронни цигари

Написах скромен HTML-JavaScript калкулатор за пресмятане на прости рецепти за сокчета (e-juice) за електронни цигари.
Демо на калкулатора.
Изтегляне.

Share and Enjoy !

Shares