Netbeans дебъгване на PHP-код с Xdebug

Не знам защо до сега не съм използвал възможностите за дебъгване на PHP. Може би от глупост, щото едва ли не ми се е налагало. Е, да но вече като знам, че е добре да се дебъгва, едва ли ще пропусна да използвам тази благинка.
Нямам по-читав редактор за PHP, освен портабъл версия на Netbeans 7.4. Няма инсталирана и чиста Java (необходима, за да работи IDE-то), за това ще използвам портабъл версия – OpenJDKPortable_7_Update_9_b02_Development_Test_1.paf.exe.
Портабъл версиите понякога се държат много идиотски. А защо не използвам инсталатори е една друга тема. И за да работи всичко както трябва се наложи да направя простотията да инсталирам 3-те “инструмента” в следните директории:
NetBeans 7.4: C:\installed\soft\NetBeans_PHP_7.4_Portable
OpenJDK 7: C:\installed\soft\CommonFiles\java
PHP 5.4.23: C:\installed\soft\php

След стартиране на NetBeans, видях, че всичко е наред, само дето не му работеше дебъгването. Това се оправя по следния начин:
1. Download на php_xdebug-2.2.5-5.4-vc9-nts.dll от тук
2. Записва се в директорията: C:\installed\soft\php\ext
3. Редактира се файла php.ini, като в края му се добавя:
zend_extension='C:\installed\soft\php\ext\php_xdebug-2.2.5-5.4-vc9-nts.dll'
xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_host=localhost
xdebug.remote_port=9000

И почва да се пие бира и да се дебъгва неистово.

Bootstrap 3 dropdown login form example

Търсих си неразкрасена логин форма за Bootstrap 3. Трябваше да я набутам в бутон на на nav-панела. Не намерих нищо свястно, ам тя работата е елементарна. Ще покажа 2 различни примера.
Bootstrap login form - dropdown, popover
BS3 Login form с popover и html код разположен някъде в страницата:
Javascript – поставя се най-долу в кода на страницата

1
2
3
4
5
6
7
$('button[data-toggle=popover]').popover({ 
    html : true,
    //trigger: "click", // може да се смени
    content: function() {
      return $('#popover_content_wrapper').html();
    }
});

HTML-кода:

1
2
3
4
5
6
7
8
9
10
11
12
<div id="popover_content_wrapper" style="display: none">
  <form action="" role="form">
    <div class="form-group">
      <label for="user">User</label>
      <input type="text" class="form-control" id="user" placeholder="User" />
      <label for="password">Password</label>
      <input type="password" class="form-control" id="password" placeholder="Password" />
    </div>
      <button type="submit" class="btn btn-default">Sign in</button>
 
  </form>
</div>

BS3 Login form с dropdown:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<li>
 
  <div class="dropdown">
    <button type="button" class="btn btn-default navbar-btn" data-toggle="dropdown">Login</button>
 
    <div class="dropdown-menu" style="padding: 10px; background: #ddd">
      <form action="" role="form">
        <div class="form-group">
          <label for="user">User</label>
          <input type="text" class="form-control" id="user" placeholder="User" />
          <label for="password">Password</label>
          <input type="password" class="form-control" id="password" placeholder="Password" />
        </div>
        <button type="submit" class="btn btn-default">Sign in</button>
      </form>
    </div>
  </div>
 
</li>

Пример с 2-те форми може да се види тук:
Bootstrap 3 dropdown login form example

Guest Blogging Articles – система за гест-статии

Article-X е проста система за писане на статии от гост-потребители. Системата я написах така, че да наподобява малко CMS. Може да се настройва.
Article-X - guest blogging system
Подробности и видео урок как се ползва могат да се намерят тук:
Aricle-X – Guest Blogging System
Фронт-демо на системата тук.

CSS – Attribute Selectors

CSS – Attribute Selectors

CSS разполага с няколко “странни” символа, които в други езици са известни като wildcards. Тези символи представляват селектори на текст и могат да съвпадат с части от текста.

  • [att^=val] – започва с “val”
  • [att$=val] – завършва с “val”
  • [att*=val] – съдържа “val”

Атрибут селекторите могат да се използват за всякакви атрибути на таговете, като класове (.class1, class2…) или идентификатори(#id1, id2…), href, title, name и т.н.

Примери за прилагане на стилове с атрибут селектора “започва с”:
begin with css selector
The “begins with” CSS selector – DEMO

Примери за прилагане на стилове с атрибут селектора “завършва с”:
ends with css selector
The “ends with” CSS selector – DEMO

Примери за прилагане на стилове с атрибут селектора “съдържа”:
contains css selector
The “contains” CSS selector – DEMO

Simple BG TV Player – прост rtmpdump плеар за гледане на BG-телевизии

Програмата я написах една вечер, когато се прецака кабелната в къщи. Използвал съм rtmpdump за прихващане на стриймовете. Плеъра, който излъчва стрийма е Mplayer за Windows – беше най-малкия плеър, който намерих и който може да излъчва поточно rtmp видео. Писал съм го на AutoIt 3, че за такива нужди е възможно най-лекия и бърз вариант.
Към момента може да плейва следните телевизии:

  • BTV
  • NovaTV
  • TV Europa
  • БНТ
  • БНТ HD
  • БНТ 2
  • Kanal 3
  • Sportal

Не, че това са ми любимите телевизии, но тия ми се мернаха, като търсих с какво да попълня списъка.
При стартиране на някоя от телевизиите се отваря допълнителен прозорец, който показва буферирането на стрийма и разни други интересни неща. Прозореца лесно може да се скрие.
Програмата работи под 64bit Win. Тествана е под WinXP. изглежда така:
simple bg tv player - онлайн телевизии
Изтегляне 64bit (в архива е и сорскода): Simple BG TV Player – v.0.8.beta.rar
Изтегляне на 32bit версия: Simple BG TV Player – v.0.8.beta-x86.rar
Старата версия все още е достъпна от тук: v.0.7.rar

Нямам време за постоянни ъпдейти на стриймовете, така че се извинявам на всички, които ми писаха да оправя кода. Току що във v.0.4 от (13.03.2016) оправих всички стриймове. Добавих някои канали – БНТ, БНТ HD, БНТ2, SPortal. Махнах City TV и Алфа. Във v.0.5 оправих объркването на БНТ с БНТ HD. От v.0.5 трябва да са добавени и двете. Във версия 0.6 е променен сървара за BTV.

Важно! 03.01.2017 Във v.0.8.beta е променен напълно кода. Адресите на стриймовете, както и някои настройки на програмата са изнесени във външен ini-файл: settings.ini. Това позволява всеки потребител сам да добавя или премахва телевизии от списъка, без да се налага прекомпилиране от сорс-код. Пък и хората имат различни интереси по отношение на телевизиите, плюс това не всички са програмисти. Кода е лек и кратък, на принципа – “направи го елементарно, но да върши работа”. Beta – това го сложих, защото ini-файла се зарежда релативно и все още нямам отзиви, дали програмата се плейва нормално при потребителите. Ето изглед от ini-файла:
Simple TV Player - настройки
INI-файла позволява да се замени плеъра (примерно с VLC), както и дъмпера (примерн с ffmpeg). Редактира се с най-обикновен текстов редактор.
Ето една статия, която показва възможностите за редакция на settings.ini:
Simple TV Player – трикове с ini-файла

А това е ini-файл с добавена телевизия BNT World: settings_v.8+BNT_Wolrd.ini.zip

ПС: Програмата е публикувана с образователна цел. Можете да я теглите, променяте, публикувате и използвате целия код или части от него. Основната ми цел, беше да се запозная по-добре със онлайн-стриймването и начините на защитата му.
ПС2: Ако искате да гледате български телевизии под Android устройство, погледнете статията ми: Гледане на български телевизии (БНТ, bTV, Nova…) под Android с XMTV Player

За любителите на rtmpdump-инга имам Новогодишен подарък – серия от кратки урочета, които се надявам да доразвия, като запазя простотата и достъпността:
rtmpdump tutorial – урок за начинаещи
———-
Nota bene:
Можете да погледнете и статията Гледане на български ТВ канали с Kodi. Добавил съм кратко видео, което показва стъпките от инсталацията под Windows до гледането на най-гледаните български ТВ-канали. Програмата може да се инсталира на всички популярни устройства и операционни системи, включително Android и Apple.

Windows AutoIt Gestures – управление с жестикулации с мишката

Написах простичка програмка за управление на Windows с мишката. Писана е на AutoIt. Може да се напасне лесно за всякакви команди, като съм оставил възможност за редакция на един ini-файл, който контролира цялата хава.
В момента са добавени 8 базови функции, които се изпълняват от десния бутон на мишката.
Windows Mouse Gestures programming functions

Кратко видео с функционалността може да се види тук:


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

#include <Misc.au3>
AutoItSetOption("WinTitleMatchMode", 4)
 
$dll = DllOpen("user32.dll")
$ini = "functions.ini"
$func1 = IniRead($ini,"HotKey","Function1",@WindowsDir&"\system32\calc.exe")
$func2 = IniRead($ini,"HotKey","Function2",@WindowsDir&"\system32\calc.exe")
$func3 = IniRead($ini,"HotKey","Function3",@WindowsDir&"\system32\calc.exe")
$func4 = IniRead($ini,"HotKey","Function4",@WindowsDir&"\system32\calc.exe")
$func5 = IniRead($ini,"Gestures","Function5",@WindowsDir&"\system32\calc.exe")
$func6 = IniRead($ini,"Gestures","Function6",@WindowsDir&"\system32\calc.exe")
$func7 = IniRead($ini,"Gestures","Function7",@WindowsDir&"\system32\calc.exe")
$func8 = IniRead($ini,"Gestures","Function8",@WindowsDir&"\system32\calc.exe")
$funcl1 = IniRead($ini,"Label","Function1",@WindowsDir&"\system32\calc.exe")
$funcl2 = IniRead($ini,"Label","Function2",@WindowsDir&"\system32\calc.exe")
$funcl3 = IniRead($ini,"Label","Function3",@WindowsDir&"\system32\calc.exe")
$funcl4 = IniRead($ini,"Label","Function4",@WindowsDir&"\system32\calc.exe")
$funcl5 = IniRead($ini,"Label","Function5",@WindowsDir&"\system32\calc.exe")
$funcl6 = IniRead($ini,"Label","Function6",@WindowsDir&"\system32\calc.exe")
$funcl7 = IniRead($ini,"Label","Function7",@WindowsDir&"\system32\calc.exe")
$funcl8 = IniRead($ini,"Label","Function8",@WindowsDir&"\system32\calc.exe")
 
While   1
    Sleep ( 500 )
    ToolTip("")
    If _IsPressed("04", $dll) Then ; Moje da se smeni s drug buton na mishkata
        $ori = MouseGetPos()
            SplashImageOn("","gdot.bmp","30","30",$ori[0]-15,$ori[1]-15,1)
        Do
            Sleep(100)
        $cur = MouseGetPos()
        If $ori[0] - $cur[0] > 100 And  $ori[1] - $cur[1] > 100  Then
            ToolTip($funcl1)
        ElseIf $ori[0] - $cur[0] < -100 And  $ori[1] - $cur[1] > 100  Then
            ToolTip($funcl2)
        ElseIf $ori[0] - $cur[0] > 100 And  $ori[1] - $cur[1] < -100  Then
            ToolTip($funcl3)
        ElseIf $ori[0] - $cur[0] < -100 And  $ori[1] - $cur[1] < -100  Then
            ToolTip($funcl4)
        ElseIf $ori[0] - $cur[0] > 50 Then
            ToolTip($funcl5)
        ElseIf $ori[0] - $cur[0] < -50 Then
            ToolTip($funcl6)
        ElseIf $ori[1] - $cur[1] > 50 Then
            ToolTip($funcl7)
        ElseIf $ori[1] - $cur[1] < -50 Then
            ToolTip($funcl8)
        Else
            ToolTip("")
        EndIf
 
        Until Not(_IsPressed("04", $dll));Moje da se smeni s drug buton na mishkata
        $cur = MouseGetPos()
 
    	If WinActive("classname=ExploreWClass") Or WinActive("classname=CabinetWClass") Then
 
        	If $ori[0] - $cur[0] > 100 And  $ori[1] - $cur[1] > 100  Then ; Nagore i naliavo - Back
            	Send($func1)
        	ElseIf $ori[0] - $cur[0] < -100 And  $ori[1] - $cur[1] > 100  Then ; Nagore i nadiasno - Forward
            	Send($func2)
        	ElseIf $ori[0] - $cur[0] > 100 And  $ori[1] - $cur[1] < -100  Then ; Nadolu i nalqwo - Minimize
            	Send($func3)
        	ElseIf $ori[0] - $cur[0] < -100 And  $ori[1] - $cur[1] < -100  Then ; Nadolu i nadiasno - Close
            	Send($func4)
 
			ElseIf $ori[0] - $cur[0] > 50 Then ; Naliavo - My Docu
            	ShellExecute($func5)
        	ElseIf $ori[0] - $cur[0] < -50 Then ; Nadiasno - Disc D:\
            	ShellExecute($func6)
        	ElseIf $ori[1] - $cur[1] > 50 Then ; NAGORE - Calculator
            	ShellExecute($func7)
        	ElseIf $ori[1] - $cur[1] < -50 Then ; NADOLU - Notepad
            	RShellExecute($func8)
			EndIf
		Else
 
			If $ori[0] - $cur[0] > 50 Then ; Naliavo - My Docu
            	Run($func5)
        	ElseIf $ori[0] - $cur[0] < -50 Then ; Nadiasno - Disc D:\
            	Run($func6)
        	ElseIf $ori[1] - $cur[1] > 50 Then ; NAGORE - Calculator
            	Run($func7)
        	ElseIf $ori[1] - $cur[1] < -50 Then ; NADOLU - Notepad
            	Run($func8)
        	Else
            	SplashTextOn("Gestures","No action","250","20","-1","-1",2,"","","")
            	Sleep(500)
            	SplashOff()
        	EndIf
 
		EndIf
 
        SplashOff()
    EndIf
WEnd
DllClose($dll)

За да се промени функционалността на жестикулациите, трябва да се редактира секцията “Gestures” във файла functions.ini:

[HotKey]
Function1 = !{LEFT}
Function2 = !{RIGHT}
Function3 = !{SPACE}N
Function4 = !{F4}
 
[Gestures]
Function5 = explorer.exe C:\
Function6 = explorer.exe D:\
Function7 = calc.exe
Function8 = Notepad.exe
 
[Label]
Function1 = Back
Function2 = Forward
Function3 = Minimize
Function4 = Close Explorer
Function5 = Disk C
Function6 = Disk D
Function7 = Calculator
Function8 = Notepad

Секцията “Hot Key” също може да се редактира. Информация за командите в AutoIt тук:
Затварянето или временната пауза на програмата става от тук: HotKey-help.html
Windows Gestures - Stop or Pause
Изтегляне за 32bit Windows: Windows AutoIt Gestures – 32bit
Изтегляне за 64bit Windows: Windows AutoIt Gestures – 64bit

MS Word search strings – търсене на думи в Word файлове

Проста програмка за търсене на думи в MS Word файлове. Програмата е само за 32-bit Windows. Тествана е само под WinXP, но може би ще работи и под други OS.
Писана само за трнировка. Разполага само с базови възможности. Би могло да и се добавят доста повече опции, като рекурсивно преравяне на директории, търсене на кирилица, търсене с регулярни изрази, запазване на резултата в текстов файл и т.н. Към момента ги няма тия дивотии, но ако ми текне музата някой ден може и да я пооправя. Използвал съм 2 езика за програмиране – AutoIt и Perl. Използвах компилатор-пакетера pp, за да компилирам Perl-файла.

Програмата е с отворен код и ако на някой му се занимава, може да си я пипне. Изглежда така:
MS Word Search
Сорс кода:
AutoIt-файла

#include 
#include 
#include 
#include 
#include 
#include 
 
Local $line
 
$Form1 = GUICreate("Search in word files", 621, 473, 192, 124)
$Label2 = GUICtrlCreateLabel("Text to Find", 8, 13, 60, 23)
$Rezult = GUICtrlCreateEdit("", 8, 64, 609, 369)
; GUICtrlSetData(-1, "Edit1")
$String = GUICtrlCreateInput("", 80, 8, 393, 21)
$SelectDir = GUICtrlCreateButton("Select Dir", 8, 32, 65, 25)
$Directory = GUICtrlCreateInput("", 80, 32, 393, 21)
$Search = GUICtrlCreateButton("SEARCH", 480, 8, 137, 49)
$Help = GUICtrlCreateButton("?", 584, 440, 25, 25)
$Label1 = GUICtrlCreateLabel("--==[ Programming by Nedialko Voinigovski ]==--", 8, 448, 444, 17)
GUISetState(@SW_SHOW)
 
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $SelectDir
			_seldir()
		Case $Search
			_search()
		Case $Help
			_help()
	EndSwitch
WEnd
 
 
func _seldir()
	$outfolder = FileSelectFolder("Choose a folder.", "")
	GUICtrlSetData($Directory, $outfolder)
EndFunc
 
func _search()
$command = @comspec &amp; ' /c ws.exe' &amp; ' "' &amp; GUICtrlRead($String) &amp; '"' &amp; ' "' &amp; GUICtrlRead($Directory) &amp; '"'
$cmd = Run($command, @WorkingDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
 
	$line = "Wait ..." &amp; @CRLF
	While 1
		$line &amp;= StdoutRead($cmd)
		If @error &lt;&gt; 0 Then ExitLoop
		Sleep(1000)
		GUICtrlSetData($Rezult, $line)
	WEnd
	$line &amp;= "--------------------------" &amp; @CRLF &amp; "All done!"
	GUICtrlSetData($Rezult, $line)
EndFunc
 
func _help()
	MsgBox(0,"HELP","Програмата е комбинация от езиците за програмиране" &amp;@CRLF&amp; "AutoIt (за графичната част) и Perl (за ровичкането в Word-файловете)." &amp;@CRLF&amp;"Има възможност да се използват PCRE (perl регулярни изрази) за търсене в файловете, но " &amp;@CRLF&amp;"все още липсва добра поддръжка на кирилица."&amp;@CRLF&amp;@CRLF&amp;"За да работи всичко нормално трябва и двете exe-та да са в една директория.")
EndFunc

Perl-файла, който върши съществената работа:

use Win32::OLE;
use Win32::OLE::Enum;
use Cwd 'abs_path';
 
$dir = $ARGV[1]; chdir $dir;
@files = &lt;*.doc *.docx&gt;;
$find = $ARGV[0];
 
 
 
foreach $file (@files) {
	$doc = Win32::OLE -&gt; GetObject(abs_path($file));
	open (FH,"&gt;jgfd75w43589azwq210");
 
	$paragraphs = $doc-&gt;Paragraphs();
	$enumerate = new Win32::OLE::Enum($paragraphs);
	while(defined($paragraph = $enumerate-&gt;Next())){
		$text = $paragraph-&gt;{Range}-&gt;{Text};
		print FH "$text\n";
	}
	$doc-&gt;Close;
	close FH;
 
	open (FH,"&lt;jgfd75w43589azwq210");
	while ($line = ) {
		if($line =~ m/$find/i){
			print "$find\t--&gt;\t$ARGV[1]\\$file\n";
			last;
		}
	}
	close FH;
	unlink("jgfd75w43589azwq210");
}

Пакетите за Perl, които ми бяха необходими за компилирането:

gcc environment - 3.4.5 (mingw-vista special r3)
PAR Packager, version 1.009 (PAR version 1.002)

Компилирането на Perl стана елементарно. Просто написах в промпта:

pp search_in_word.pl

Програмата може да се изтегли от тук: MS Word Search

Ohm Calculator за реотани на електронни цигари на Excel

Проста програмка на Excel за изчисляване на съпротивлението на coil-а за изпарител на електронна цигара.
Най-интересното във файла е, че съм използвал именувани полета, за да създам нещо като база данни от която се извличат данните.
Ohm Calculator Excel - e-cigarette
Файла може да се изтегли от тук: Ohm Calculator – e-cigarette

PHP-file UTF-8 encoding

Попаднах на стар хостинг (с php 5.2.3), който прецаква енкодинга при ъплауд на php-файлове. Изключително досаден проблем. Пробвах да вкарвам разни дивотии в .htaccess, но нищо не помогна. Ей такива неща опитах:

AddDefaultCharset utf-8
AddCharset utf-8 .php
DefaultLanguage en-US

Единствения шанс, който ми остана беше да накарам интерпретатора да каже на сървара, че файла трябва да се излъчи в UTF-8 encoding. По-долния код се поставя преди рендването на съдържанието:

<?php header('Content-Type: text/html; charset=utf-8'); ?>

Доста удобно за моя стил на програмиране :).

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.