PANIC / kmem_suballoc: bad status return of 3

When you are modifying /boot/loader.conf on your FreeBSD system you easily can get an issue like this:

kmem_suballoc: bad status return of 3

When you have a remote server without possibility to insert a Live CD, fortunately you have an option to fix this with IP-KVM access:

  • During Boot Screen options selection, choose Escape to loader prompt
  • Now we can disactivate the wrong parameter and boot the system
OK unset vm.kmem_size
OK boot
  • if you need to remember the settings which you have modified you can list them all on the screen
OK show

In my case it worked well for FreeBSD 7.2

Web-cam in Delphi 7

To use web-cam in Delphi, we are going to use:

To import and use WinAPI functions in Delphi we need to use ShellAPI module

Uses
  ... , ShellAPI

For AVICap we need to define some constants and function signatures (for C++ version you can just include vfw.hwhich already have all needed functions and constants):

const
WM_CAP_START = WM_USER;
WM_CAP_STOP = WM_CAP_START + 68;
WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;
WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;
WM_CAP_SAVEDIB = WM_CAP_START + 25;
WM_CAP_GRAB_FRAME = WM_CAP_START + 60;
WM_CAP_SEQUENCE = WM_CAP_START + 62;
WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;
 
function capCreateCaptureWindowA(lpszWindowName : PCHAR;
dwStyle : longint;
x : integer;
y : integer;
nWidth : integer;
nHeight : integer;
ParentWin : HWND;
nId : integer): HWND; stdcall external 'AVICAP32.DLL';
 
var hWndC : THandle;

Code for the function which start capturing the video from web-cam:

procedure TForm1.Button1Click(Sender: TObject);
begin
 hWndC := capCreateCaptureWindowA('My Own Capture Window',
WS_CHILD or WS_VISIBLE ,
0,
0,
Panel1.Width,
Panel1.Height,
Panel1.Handle,
0); // using Panel object to output our image from WebCam
 
if hWndC <> 0 then // if Panel object is available and there were not errors during capCreateCaptureWindowA call
    SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);  // starting capturing
 
end;

Here you need to find a correct ID of your web-cam device. It could be 0,1,2,… depends on how many web-cams or other capturing devices you have installed.

SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, <device-number>, 0);

To finish:

procedure TForm1.Button2Click(Sender: TObject);
begin
  if hWndC <> 0 then
  begin
    SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);  // finish capturing
    hWndC := 0;
  end;
end;

Capture the image and show on Panel by Timer:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if hWndC <> 0 then SendMessage(hWndC, WM_CAP_GRAB_FRAME, 0, 0);
end;

One thing to mention, Panel object does not have Bitmap property, so if you want to work with image with classic GDI tools you need to use other component. For example, you can use Form component:

{…}
hWndC := capCreateCaptureWindowA(‘My Own Capture Window’,
     WS_CHILD or WS_VISIBLE ,
     0,
     0,
     Form1.Width,
     Form1.Height,
     Form1.Handle,
     0);

{…}
var
   bmp: TBitmap;
{…}
begin
{…}
   bmp := TBitmap.Create;
   bmp.Width := Form1.Width;
   bmp.Height:=Form1.Height;
   bmp.Canvas.CopyRect(Rect(0,0,Form1.Width, Form1.Height), Form1.Canvas, 
   Rect(0,0,Form1.Width, Form1.Height));
   bmp.SaveToFile('path for BMP file');
end;
{…}

WinAPI Threads

There are 2 main things to know to create a thread in Windows:

#include <windows.h>
#include <stdio.h>

void *mainThread;
DWORD * id;

// Code to execute inside thread function based on ThreadProc signature
DWORD WINAPI treadFunction(LPVOID lpParameter) {
     DWORD exitCode;
     while (GetExitCodeThread(mainThread,&exitCode) && exitCode == STILL_ACTIVE) { // while main thread did not finiched
           // executing our code in separate thread
           printf("-----------------  Hello from sub thread\r\n");
           Sleep(5000);
     }     
     return 0; 
}

int main() {
       mainThread = GetCurrentThread(); // reference to main thread of the process
       CreateThread(NULL,0,treadFunction,NULL,0,id); // creating our separate thread
       
       while(true) {
                   //  executing some code in the main process thread
                   printf("Hello from main thread\r\n");
                   Sleep(1000);
       }
       return 0;
}

Sokoban for Turbo Pascal

Here is the simple ASCII text graphics version of Sokoban game for Turbo Pascal.

Controls:

  • w, s, a, d – UP, DOWN, LEFT, RIGHT
  • ESC – exit

Map file example for input:

MAP.TXT
17 10
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
1 0 0 0 2 0 0 0 0 0 2 0 2 0 4 0 1
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 1 0 3 0 0 1 0 0 0 1
0 0 0 0 0 0 0 1 0 3 0 0 0 0 0 1 1
0 0 0 0 0 0 0 1 0 3 0 0 0 0 0 1 1
0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1
0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1
program sokoban;
uses crt;
type
 sPoint = record
  x:integer;
  y:integer;
 end; { structure type for map point }
 
const
 mxWidth = 100;
 mxHeight = 100; { max width and height of field }
 
 maxBlocks = 100; { max count of blocks }
 
var
 map: array [1..mxWidth, 1..mxHeight] of byte; { map }
 fin: Text; { map file }
 i,j:integer; { counters}
 v:byte; { sokoban player direction }
 m,n: integer; { windth and height of player map } 
 freesq,  { количесво свободных "контейнеров" для ящиков}
 countsq: integer; { количесво ящиков }
 c: char; { код клавиатуры }
 player: sPoint; { координаты игрока}
 nx, ny:integer; { временные переменные для хранения следующей позиции игрока}
 blockpoint: array [1..maxBlocks] of sPoint; { массив ящиков }
 lastpx, lastpy, lastbx, lastby, lastbi, lastc: integer; { временные переменные сохраняющие предпоследнюю позицию игрока }
 f: Boolean;  { флаг совершения хода, чтобы нельзя было отменить ход в самом начале игры }
 
{ возвращает идентификатор (номер) блока расположенного по координатам x,y, если блока нет, возвращает 0} 
function get_block(x,y:integer): integer;
var
 i:integer;
 v: integer;
begin
 v:=0;
 for i:=1 to countsq do { просматриваем массив блоков }
  if (blockpoint[i].x = x) and (blockpoint[i].y = y) then
  begin
   v := i;
   break; { если нашли, то прерываем работу цикла посика }
  end;
 get_block:=v;
end;
 
{пытаеться переместить блок, ели его толкает сокобан, если удалось возвращает значение Истина, иначе Ложь}
function TryMoveBlock(id:integer):Boolean;
var
 nx,ny,x,y:integer;
begin
 x:= blockpoint[id].x;
 y:= blockpoint[id].y; {запоминаем текущие координаты блока}

 lastbx:=x;
 lastby:=y;
 lastbi:=id;
 lastc := freesq; {сохраняем параметры блока, для восстановления если пользовател отменит последний ход}

 case v of {определяем направление движения сокобана, чтобы в этом же направлении сдвинуть блок}
 1: begin nx:=x; ny:=y-1; end; {вверх}
 2: begin nx:=x; ny:=y+1; end; {вниз}
 3: begin nx:=x-1; ny:=y; end; {влево}
 4: begin nx:=x+1; ny:=y; end; {вправо}
 end;

 if (get_block(nx,ny) = 0) and (map[ny,nx] <>1) then  {если дальше нет стены, или второго блока, то двигаем блок}
 begin

      blockpoint[id].x := nx;
      blockpoint[id].y := ny;
      if (map[ny,nx] = 3) and (map[y,x] = 0) then {если блок передвинут с пустой клетки, то уменьшаем счетчик свободных контейнеров}
      begin
         dec( freesq );
      end
      else if (map[ny,nx] = 0) and (map[y,x] = 3) then {иначе если блок передвинут с фыинального места на пустое, возвращаем значения счетчика}
         inc( freesq );

      TryMoveBlock := True;
      exit;
 end;
 TryMoveBlock := False;

end;

{пытаеться переместить сокобана на новые координаты если это возможно}
procedure MoveSokoban(x,y:integer);
var
 bi:integer; {идентификатор блока}
begin
     lastpx:=player.x;
     lastpy:=player.y; { запоминаем позицию сокобана, для последующего восстановления предыдущего хода, если потребуеться}

	 {определяем границы возможного перемещения}
     if ( x>0) and (y>0) and (x<m) and (y<m) then
     if map[y,x] <> 1 then begin {если впереди не стенка}
        bi  := get_block(x,y); { узнаем, есть ли там блок }
        if bi > 0 then {если есть }
        begin
           if (TryMoveBlock(bi)) then {то сначало пробуем переместить блок, а если удалось - перемещаем вслед сокобана}
           begin
                   player.x := x;
                   player.y := y;
           end;
        end
        else {если блока и стены нет, то просто перемещаем сокобана}
         begin
                   player.x := x;
                   player.y := y;
         end;
     end;
end;
begin
 freesq := 1;
 countsq := 0;
 Assign(fin, 'Map.txt');
 Reset(fin); {открываем файл карты}
 Read(fin,m,n); {считываем размеры карты}
 for i :=1 to n do
  for j := 1 to m do
  begin { считываем саму карту }
   Read(fin, v);

   case v of
    1: map[i,j] := 1; {стена}
	  2: map[i,j] := 3; {"контейнер" для ящиков}
    3: begin blockpoint[freesq].x := j; blockpoint[freesq].y := i; inc(freesq);  inc(countsq); end; {блок}
    4: begin player.x := j; player.y := i; end; {игрок}
	else
	 map[i,j] := 0; {пустая клетка}
   end;
  end;
  Close(fin); {закрываем файл карты}
  lastc := freesq;
  f:=False; {запоминаем условия отмены хода}
 while(freesq > 1) do {пока хоть один контейнер свободен}
 begin
   clrscr; {очищаем экран}

   for i:=1 to n do
   begin
    for j:=1 to m do
    begin {отображаем карту}
     gotoxy(j,i);
     TextColor(14);
     if (map[i,j] = 1) then
      write('І')
     else if (map[i,j] = 3) then
      begin
        TextColor(2);
        write('Ь');
      end

     else
      write(' ');
    end;

    writeln;
   end;

   for i:=1 to countsq do
   begin {отображаем блоки}
        gotoxy( blockpoint[i].x , blockpoint[i].y);
        TextColor(5);
        write('Ы');
   end;

   TextColor(14);
   gotoxy(player.x, player.y);
   write(''); {отображаем игрока}

   gotoxy(80,25); {убираем курсор, чтобы не мозолил глаз}
   c := ReadKey;
   case c of {проверяем ввод с клавиатуры}
   'w': begin nx:=player.x; ny:=player.y-1; v:=1; end; {ход вверх}
   's': begin nx:=player.x; ny:=player.y+1; v:=2; end; {ход вниз}
   'a': begin nx:=player.x-1; ny:=player.y; v:=3; end; {ход влево}
   'd': begin nx:=player.x+1; ny:=player.y; v:=4; end; {ход вправо}

   'z': if f then begin
             freesq := lastc;
             player.x := lastpx;
             player.y := lastpy;

             blockpoint[lastbi].x := lastbx;
             blockpoint[lastbi].y := lastby;
             continue;
   end;
   #27: break; {выход }
   end;
   f:=True;
   MoveSokoban(nx,ny); {пытаемся переместить сокобан}
 end;
 clrscr;
 textcolor(15);

 if (freesq = 1) then {сообщаем пользователю о выйгрыше если ему удалось заполнить все контейнеры}
  writeln('You Win!')
 else {или о проигрыше если , он самостоятельно прервал игру}
  writeln('You Lose!');
 writeln('Press Enter for exit!');
 readln;
end.

Snake for Turbo Pascal

Snake is another ASCII graphics game example for Turbo Pascal additionally to Sokoban.

program  csnake;
uses crt;
type
 sPoint = record
  x:integer;
  y:integer;
 end; {тип для точки} 
const
 maxWidth = 40; {максимальна длинна змейки} 
var
 width: integer; {длина змейки}
 e :sPoint; {координаты еды} 
 snakebody: array [1..maxWidth] of sPoint; {массив с координатами частей тела змейки} 
 i, {считчик цикла} 
	nx, ny:integer {координаты головы змейки} ; 
 v: byte; {вектор направления головы змейки} 
 gameover: boolean; {флаг окончания игры} 
 key: char; {буфер клавиши} 

 {проверяет свободна ли клетка и не выходит ли она за границы поля} 
function CheckNext(x:integer; y:integer):boolean;
var
 isset: Boolean; {флаг проверки занятости клетки или выхода за границы поля} 
 i: integer;
begin
  isset := True;
  for i:=1 to width do
  begin {проверяем нет ли на места клетки змейки} 
   if (x = snakebody[i].x) and ( y = snakebody[i].y ) then
      isset := False;
  end;
  if isset then
  begin {проверяем не вышла ли голова змейки за границы поля} 
   if (x <= 0) or (y<=0) or (x>=80) or (y>=25) then isset := False;
  end;
  CheckNext := isset;
end;

{создает еду на поле} 
procedure NewEat;
begin
 e.x := random(78) + 2;
 e.y := random(23) + 2; {генерируем координаты еды} 

 {если место занято, генерируем еще раз, и так пока не найдем свободное} 
 while (not CheckNext(e.x, e.y)) do
 begin
  e.x := random(78) + 2;
  e.y := random(23) + 2;
 end;
end;

{перемещает змейку}
procedure MoveSnake(x,y:integer);
var
 i:integer; {счетчик цикла} 
begin
 for i:=1 to width do
 begin
  snakebody[i] := snakebody[i+1]; 
 end; {перещаем все состовляющие змеки, на место соседнего} 
 
 snakebody[width].x := x;
 snakebody[width].y := y; {голове змейки присваиваем новые координаты} 
 
 if (x = e.x) and (y = e.y) then {если голова нашла еду} 
 begin
  width := width + 1; {добавляем еще 1 клетку к змейке} 
  snakebody[width].x := x;
  snakebody[width].y := y;
  NewEat; {создаем новую еду} 
 end;
end;

begin
 gameover := false;
 {выстраиваем начальное тело змейки} 
 width := 4;

 snakebody[1].x := 1;
 snakebody[1].y := 1;

 snakebody[2].x := 2;
 snakebody[2].y := 1;

 snakebody[3].x := 3;
 snakebody[3].y := 1;

 snakebody[4].x := 4;
 snakebody[4].y := 1;

 clrscr;
 v  := 1;

 Randomize;

 NewEat; {создаем еду} 

 while(width < maxWidth) do {пока длина змейки меньше заданной} 
 begin

   if (KeyPressed) then {если была нажата клавиша} 
   begin
     key:=Readkey; {считываем её} 
     case key of
      'w': begin if v = 4 then continue; v := 3;  end; {вверх}  
      's': begin if v = 3 then continue; v := 4;  end; {вниз} 	  
      'a': begin if v = 1 then continue; v := 2;  end; {влево} 
      'd': begin if v = 2 then continue; v := 1;  end; {впправо} 
      #27: break; {выход} 
     end;
   end;

   clrscr;

   {поеределение направления движения головы змейки}
   case v of
    1: begin nx := snakebody[width].x + 1;  ny := snakebody[width].y; end; {вправо}
    2: begin nx := snakebody[width].x - 1;  ny := snakebody[width].y; end; {влево}
    3: begin nx := snakebody[width].x;  ny := snakebody[width].y - 1; end; {вверх}
    4: begin nx := snakebody[width].x;  ny := snakebody[width].y + 1; end; {вниз}
   end;

   {если впереди граница или препятствие} 
   if (not CheckNext(nx,ny)) then
   begin
    gameover := true; {заканчиваем игру с поражением пользователя}
    break;
   end;

   MoveSnake(nx, ny); {перемещаем змейку} 

   gotoxy(e.x, e.y);
   write(''); {отображаем еду} 


   for i:=1 to width-1 do
    begin {отображаем тело змейки} 
     gotoxy(snakebody[i].x, snakebody[i].y);
     write('Ы');
    end; 
   gotoxy(snakebody[width].x, snakebody[width].y);
   write('+'); {отображение головы змейки} 

   gotoxy(80,25); {уводим курсор, чтобы не мешал} 

   Delay(30000); {задержка, для разных процессоров разная!}  
 end;

 clrscr;

 if (gameover) then {выводим сообщение пользователю о выйгрыше или проигрыше} 
  WriteLn('GAME OVER!')
 else
  WriteLn('YOU WIN!');

  WriteLn('Press Enter for exit!');
  readln;
end.

Recursive graphics in Turbo C++ 3.0

This code is using graphics.lib library and requires Borland Graphics Interface. I was using for my tests EGAVGA.bgi copied to from Turbo C++ 3.0 BGI\ folder (if you do not want to copy .bgi file to the folder with your application you can precise the path in initgraph() third argument).

#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>
#include <math.h>
/*
x,y - center coordinated
n - rays count
level - subrays level number
*/
void snowflake(int x, int y, int n, int level)  {
	if (level == 4) return; // the level 4 is maximum
	int i, nx, ny;
	float dAngel = 2.0 * M_PI/n ; // agnle step

	for(i=0;i<n;i++) {

	  setcolor(random(14) + 1); // random color
	 
	  // drawing the line
	  moveto(x,y);
	  nx = x + floor((200/(level*level))*sin((float)i*dAngel + level - 1) );
	  ny = y - floor((200/(level*level))*cos((float)i*dAngel + level - 1) );
	  lineto(nx,ny);
	  
	  //recursive call for sublevel
	  snowflake(nx,ny,n,level+1);
	}
}

int main() {
	int gd = DETECT, gm ;
	initgraph(&gd,&gm,""); // graphics initialization, put here the path to BGI if needed
	snowflake(getmaxx()/2,getmaxy()/2,12,1); // drawing our recursive showflake
	closegraph(); // properly closing graphics interface
	return 0;
}

Insertion sort in Assembly for Intel 8080 (and Soviet Union KR580) processor

	lxi h, arr 	; put address of arr first element in HL
	mvi c, 5	; create a counter for 6 elements (starting counting from 0)
	
	inx h;	; using the first element by HL address for data exchange purposes
	inx h;	; i = 1

for:	lxi d, arr 	; put address of arr first element in DE
	mov a , m	; a = m,  a = arr[i]
	xchg		; exchange HL < - > DE
	mov m , a	; m = a , arr[0] = a (in HL the address of the first element currently)
	xchg		; exchange HL < - > DE

	mov b,h	;
	mov e,l	; save current position in array	

ins:	dcx h		; arr[j-1]	
	sub m		; compare a and arr[j-1]
	jnc endif	; if a > arr[j-1], then exit from loop
	add m		; restoring the value of a
	mov d,m	; d = m , d = arr[j-1]
	inx h		; 
	mov m,d	; m = d, arr[j] = arr[j-1]
	dcx h
	jmp ins
endif:
	add m		;  restoring the value of  a
	inx h		; 
	mov m,a;	; arr[j] = a
	
	mov h,b	;
	mov l,e	; restoring the position in array

	inx h		; i++
	dcr c		; c--
	jnz for	; while c != 0 go to for
	
	hlt		; exit

	arr db 00h, 04h, 09h, 07h, 08h, 01h, 02h ; input array

Bubble sort in Assembly for Intel 8080 (and Soviet Union KR580) processor

	  mvi c,5  	; c = 5
next: lxi h,arr	; put reference address to arr in HL
	  mov d,c	; d = c
move: mov a,m 	; put first element to accumulator a = arr[d]

	  inx h   	; move to the next array element,	arr[d+1]

	  sub m 	; a = a - m, arr[d] - arr[d+1]
	  jnc endif	; compare elements if a > m , arr[d] > arr[d+1], finish


			  ; exchange elements values
	  add m		; a = a + m
	  mov b,m	; b = m , b = arr[d+1]
	  mov m,a	; m = a , arr[d+1] = arr[d]
	  dcx h		; move to previous element, arr[d]
	  mov m,b	; m = b, arr[d] = b
	  inx h		; move to current element, arr[d+1]
endif:dcr d		; d--
	  jnz move 	; if d <> 0 , then continue to  move
	  dcr c		; c--
	  jnz next 	; if c <> 0 then continue to next


	  hlt		; exit
	
	  arr db 02h, 01h, 03h, 04h, 05h ; input array

Issue with SQL Server 2008 connection from Visual Studio

If you are trying to connect from Visual Studio to your .mdf database file and have an error like this:

Failed to generate a user instance of SQL Server due to a failure in starting the process for the user instance. The connection will be closed.

First of all you need to check user permissions on the file and SQL Server data folder. Otherwise you can just turn off the User Instance creation in connection string. To fix the issue that way:

  1. Check if you do not have any data in and remove C:\Users[username]\AppData\Local\Microsoft\Microsoft SQL Server Data\SQLEXPRESS folder
  2. Restart SQL Server service and Visual Studio
  3. Optionally add or set User Instance = False in connection string to the database

Similar issue discussion on Stackoverflow

PHP and JavaScript function

When you are in a position of Full Stack developer and you need implement back-end in PHP and use JavaScript for front-end, it is good to have some functions which are used for similar operations in both languages.

Rounded value in JavaScript:

 var i  =  1.233342;
 document.write(i.toFixed(2));

Rounded value in PHP

$i = 1.233342;
print round($i, 2);

Splitting and joining strings in JavaScript

test = str.split('_'); 
str = test.join('_');

Splitting and joining strings in PHP

$test = explode('_',$str);
$str = implode('_', $test);