Jump to content


sagnik

Member Since 29 Jun 2014
Offline Last Active Dec 04 2020 08:43 AM
*****

Topics I've Started

[Solved] Account Archived

24 November 2020 - 05:17 PM

Username: sgn
Main Domain: sgn.heliohost.org

Any suggestions on how can I convert questions into answers in PHP

12 November 2020 - 07:25 PM

Hi once again. As some of you might know that I'm currently working on a Machine Learning project in PHP, so I've already asked for help with drawing charts using the PHP GD library and I'm glad to let you know that the problem has been solved. But now I've got another problem (maybe I couldn't understand the logic). So let me describe the problem, as I've finished the basics of a Machine Learning library (Maths, Statistics & Charts), I've started to build the Natural Language Processing (NLP) module, I wouldn't say that the module is not working but not as expected. I've created a bot with a corpus about "Chatbots (from Wikipedia)" to test the module and the bot is replying very well but not as expected and I think I know why, because I couldn't add Grammars & Lemmatization so when I ask the bot something like (who is the created the Chatbots?, what chatbots do?, etc.) it's not replying with a proper answer instead its replying based on the algorithm I've used which is "TFIDF Vector" & "Cosine Similarity" so if I send first 1 or more words it is replying with the sentence that starts with the word(s) I've sent. So basically it's unaware of answering the question formally. And about Lemmatization I'm using the "Lemmatizer by WriteCrow - based on the WordNet project by Princeton University" but I couldn't find a way to implement it and even I don't know if after implementing Lemmatization it will fix the problem or not but it worths a try. So I need a way to implement the feature. If anyone knows anything about it, it'll be a great help for me and obviously I'll get into more troubles when I progress through the project and if anyone would like to contribute/collaborate with me you can reply in this post or PM me.

Problems drawing images with PHP GD

02 November 2020 - 03:57 PM

Hello again, I've got a problem with PHP GD. The problem is I'm trying to draw charts (i.e.Bar) and I'm trying to draw the Bell Curve of a data or an array with "Normal Distribution", but the problem is the chart is not fitting inside the allocated image size (1920 x 1080) so the chart is exceeding the boundaries of the image. So I've just tried a library "JpGraph" it works very well but doesn't fit my requirements, so I saw that the library is using some kind of canvas to draw the chart and then merging the image with the original one and I'm trying to do the same but I couldn't understand how. Please help me out, it's very urgent, I've to finish the project within a week.

public function histogram(array $samples, int $bins, string $heading = null, string $xAxisHeading = null, string $yAxisHeading = null) {
		if(is_array($samples)) {
			$data = $_bins = $this->calculateBins($samples, $bins);
			/*
			 * Chart settings and create image
			 */

			// Margin between label and axis
			$labelMargin = 8;

			$count = count($samples);

			// Max value on y-axis
			$yMaxValue = max(array_column($data, 'count'));
			if($yMaxValue % 2 == 1)
				$yMaxValue++;
			// Distance between grid lines on y-axis
			$yLabelSpan = ceil($yMaxValue / $bins);
			$t1 = ($yLabelSpan * $bins);
			if($t1 > $yMaxValue)
				$yMaxValue = $t1;

			// Bar and line width
			$lineWidth = 1;
			$barWidth = 20;

			// Image dimensions
			$imageWidthActual = round(count($data) * $barWidth * ($labelMargin / 2));
			$imageHeightActual = round((count($data) / 2) * $count / 2);
			$imageWidth = min(1920, $imageWidthActual);
			$imageHeight = min(1024, $imageHeightActual);

			// Grid dimensions and placement within image
			$gridTop = 40;
			$gridBottom = round(($imageHeight - $gridTop));
			$gridLeft = 50;
			$gridRight = round(($imageWidth - $gridLeft));
			$gridHeight = $gridBottom - $gridTop;
			$gridWidth = $gridRight - $gridLeft;

			// Bar space
			$barSpacing = $gridWidth / count($data);

			// Font settings
			$font = PHPML_ROOT.'assets/fonts/OpenSans-Regular.ttf';
			$headingFont = PHPML_ROOT.'assets/fonts/OpenSans-Bold.ttf';
			$fontSize = 10;
			$headingFontSize = 12;

			// Init image
			$chart = imagecreatetruecolor($imageWidth, $imageHeight);

			// Setup colors
			$backgroundColor = imagecolorallocate($chart, 255, 255, 255);
			$headingColor = imagecolorallocate($chart, 0, 0, 0);
			$axisColor = imagecolorallocate($chart, 85, 85, 85);
			$gridColor = imagecolorallocate($chart, 212, 212, 212);
			//$barColor = imagecolorallocate($chart, 47, 133, 217);
			$labelColor = $axisColor;

			imagefill($chart, 0, 0, $backgroundColor);
			imagesetthickness($chart, $lineWidth);

			/*
			 * Print grid lines bottom up and Y-Labels
             */
			for($i = 0; $i <= $yMaxValue; $i += $yLabelSpan) {
				$y = $gridBottom - $i * $gridHeight / $yMaxValue;

				// draw the line
				imageline($chart, $gridLeft, $y, $gridRight, $y, $gridColor);

				// draw right aligned label
				$labelBox = imagettfbbox($fontSize, 0, $font, strval($i));
				$labelWidth = $labelBox[4] - $labelBox[0];

				$labelX = $gridLeft - $labelWidth - $labelMargin;
				$labelY = $y + $fontSize / 2;

				imagettftext($chart, $fontSize, 0, $labelX, $labelY, $labelColor, $font, strval($i));
			}

			/*
			 * Draw x- and y-axis
             */
			imageline($chart, $gridLeft, $gridTop, $gridLeft, $gridBottom, $axisColor); //Left
			//imageline($chart, $gridRight, $gridTop, $gridRight, $gridBottom, $axisColor); //Right
			//imageline($chart, $gridLeft, $gridTop, $gridRight, $gridTop, $axisColor); //Top
			imageline($chart, $gridLeft, $gridBottom, $gridRight, $gridBottom, $axisColor); //Bottom

			$headingBox = $this->getTextBoundingBox($chart, $headingFontSize, $headingFont, strval($heading), 0);
			$xAxisHeadingBox = $this->getTextBoundingBox($chart, $fontSize, $font, strval($xAxisHeading), 0);
			$yAxisHeadingBox = $this->getTextBoundingBox($chart, $fontSize, $font, strval($yAxisHeading), 90);

			if(!empty($heading))
				imagettftext($chart, $headingFontSize, 0, $headingBox['x']['center'], $headingBox['y']['top'], $headingColor, $headingFont, $heading);
			if(!empty($xAxisHeading))
				imagettftext($chart, $fontSize, 0, $xAxisHeadingBox['x']['center'], $xAxisHeadingBox['y']['bottom'], $headingColor, $font, $xAxisHeading);
			if(!empty($yAxisHeading))
				imagettftext($chart, $fontSize, 90, $yAxisHeadingBox['x']['left'], $yAxisHeadingBox['y']['middle'], $headingColor, $font, $yAxisHeading);

			/*
			 * Draw the bars with X-labels
             */
			$itemX = $gridLeft + $barSpacing / 2;
			$canvasWidth = ($imageWidth * 2);
			$canvasHeight = ($imageHeight * 2);
			$canvas = imagecreatetruecolor($canvasWidth, $canvasHeight);
			$canvasBackgroundColor = imagecolorallocate($canvas, 255, 255, 255);
			$labelColor = imagecolorallocate($canvas, 85, 85, 85);
			$barColor = imagecolorallocate($canvas, 47, 133, 217);
			imagefill($canvas, 0, 0, $canvasBackgroundColor);
			foreach($data as $key => $bin) {
				// Draw the label
				$labelBox = imagettfbbox($fontSize, 0, $font, $key);
				$labelWidth = $labelBox[4] - $labelBox[0];
				$labelX = $itemX - $labelWidth / 2;
				$labelY = $gridBottom + $labelMargin + $fontSize;
				imagettftext($canvas, $fontSize, 0, $labelX, $labelY, $labelColor, $font, $key);
				foreach($bin as $k=>$value) {
					// Draw the bar
					$x1 = $itemX - $barWidth / 2;
					$y1 = $gridBottom - $value / $yMaxValue * $gridHeight;
					$x2 = $itemX + $barWidth / 2;
					$y2 = $gridBottom - 1;
					imagefilledrectangle($canvas, $x1, $y1, $x2, $y2, $barColor);
				}
				$itemX += $barSpacing;
			}
			$resized = $this->resize($canvas, $imageWidth, $imageHeight);
			imagealphablending($canvas, false);
			imagesavealpha($canvas, true);
			//imagecopyresampled($chart, $canvas, 0, 0, 0, 0, $canvasWidth, $canvasHeight, $imageWidth, $imageHeight);
			imagecopymerge($chart, $resized, 0, 0, 0, 0, $canvasWidth, $canvasHeight, 100);
			//imagecopyresized($chart, $canvas, 10, 10, 0, 0, $canvasWidth, $canvasHeight, $imageWidth, $imageHeight);
			/*
			 *  Output image to browser
             */
			//header('Content-Type: image/png');
			ob_start();
			imagepng($chart);
			$outBlob = ob_get_contents();
			ob_end_clean();
			imagedestroy($canvas);
			imagedestroy($chart);
			$outImg = "data: image/png;base64,".base64_encode($outBlob);
			/*
			 * Output image to file
             */
			//imagepng($chart, 'chart.png');
			return $outImg;
		}
		return false;
	}

Creating and connecting to Secure WebSockets in same IP

30 August 2020 - 01:58 PM

Hi again, I'm creating a chat system with PHP. So I've created the WebSocket server in PHP and the client using the built-in browser WebSocket API. Everything is working fine when I access the client using 'http' & 'ws' protocol, but my problem is when I access the client using 'https' & 'wss', I'm getting the error in firefox saying that: "Firefox can’t establish a connection to the server at wss://192.168.1.201:9000/server.php.". The files are located on https://192.168.1.201/socket/chat2/.

Here are the codes:


/socket/chat2/server.php:
<?php
$host = '192.168.1.201'; //host
$port = '9000'; //port
$null = NULL; //null var

//Create TCP/IP sream socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
}
//reuseable port
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);

//bind socket to specified host
socket_bind($socket, 0, $port);

//listen to port
socket_listen($socket);

//create & add listning socket to the list
$clients = array($socket);

//start endless loop, so that our script doesn't stop
while (true) {
	//manage multipal connections
	$changed = $clients;
	//returns the socket resources in $changed array
	socket_select($changed, $null, $null, 0, 10);
	
	//check for new socket
	if (in_array($socket, $changed)) {
		$socket_new = socket_accept($socket); //accpet new socket
		$clients[] = $socket_new; //add socket to client array
		
		$header = socket_read($socket_new, 1024); //read data sent by the socket
		perform_handshaking($header, $socket_new, $host, $port); //perform websocket handshake
		
		socket_getpeername($socket_new, $ip); //get ip address of connected socket
		$response = mask(json_encode(array('type'=>'system', 'message'=>$ip.' connected'))); //prepare json data
		send_message($response); //notify all users about new connection
		
		//make room for new socket
		$found_socket = array_search($socket, $changed);
		unset($changed[$found_socket]);
	}
	
	//loop through all connected sockets
	foreach ($changed as $changed_socket) {	
		
		//check for any incomming data
		while(socket_recv($changed_socket, $buf, 1024, 0) >= 1)
		{
			$received_text = unmask($buf); //unmask data
			$tst_msg = json_decode($received_text, true); //json decode 
			$user_name = $tst_msg['name']; //sender name
			$user_message = $tst_msg['message']; //message text
			$user_color = $tst_msg['color']; //color
			
			//prepare data to be sent to client
			if(!empty($tst_msg['notification']))
				$response_text = array('type'=>'notification', 'name'=>$user_name, 'message'=>$user_message, 'color'=>$user_color);
			else
				$response_text = array('type'=>'usermsg', 'name'=>$user_name, 'message'=>$user_message, 'color'=>$user_color);
			
			$response_text = mask(json_encode($response_text));
			send_message($response_text); //send data
			break 2; //exist this loop
		}
		
		$buf = @socket_read($changed_socket, 1024, PHP_NORMAL_READ);
		if ($buf === false) { // check disconnected client
			// remove client for $clients array
			$found_socket = array_search($changed_socket, $clients);
			socket_getpeername($changed_socket, $ip);
			unset($clients[$found_socket]);
			
			//notify all users about disconnected connection
			$response = mask(json_encode(array('type'=>'system', 'message'=>$ip.' disconnected')));
			send_message($response);
		}
	}
}
// close the listening socket
socket_close($socket);

function send_message($msg)
{
	global $clients;
	foreach($clients as $changed_socket)
	{
		@socket_write($changed_socket,$msg,strlen($msg));
	}
	return true;
}


//Unmask incoming framed message
function unmask($text) {
	$length = ord($text[1]) & 127;
	if($length == 126) {
		$masks = substr($text, 4, 4);
		$data = substr($text, 8);
	}
	elseif($length == 127) {
		$masks = substr($text, 10, 4);
		$data = substr($text, 14);
	}
	else {
		$masks = substr($text, 2, 4);
		$data = substr($text, 6);
	}
	$text = "";
	for ($i = 0; $i < strlen($data); ++$i) {
		$text .= $data[$i] ^ $masks[$i%4];
	}
	return $text;
}

//Encode message for transfer to client.
function mask($text)
{
	$b1 = 0x80 | (0x1 & 0x0f);
	$length = strlen($text);
	
	if($length <= 125)
		$header = pack('CC', $b1, $length);
	elseif($length > 125 && $length < 65536)
		$header = pack('CCn', $b1, 126, $length);
	elseif($length >= 65536)
		$header = pack('CCNN', $b1, 127, $length);
	return $header.$text;
}

//handshake new client.
function perform_handshaking($receved_header,$client_conn, $host, $port)
{
	$headers = array();
	$lines = preg_split("/\r\n/", $receved_header);
	foreach($lines as $line)
	{
		$line = chop($line);
		if(preg_match('/\A(\S+): (.*)\z/', $line, $matches))
		{
			$headers[$matches[1]] = $matches[2];
		}
	}

	$secKey = $headers['Sec-WebSocket-Key'];
	$secAccept = base64_encode(pack('H*', sha1($secKey . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
	//hand shaking header
	$upgrade  = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" .
	"Upgrade: websocket\r\n" .
	"Connection: Upgrade\r\n" .
	"WebSocket-Origin: $host\r\n" .
	"WebSocket-Location: wss://$host:$port/server.php\r\n".
	"Sec-WebSocket-Accept:$secAccept\r\n\r\n";
	socket_write($client_conn,$upgrade,strlen($upgrade));
}
?>

/socket/chat2/client.js:
var colors = [
	'#007AFF','#FF7000','#FF7000','#15E25F','#CFC700','#CFC700','#CF1100','#CF00BE','#F00'
];
var color_pick = Math.floor(Math.random() * colors.length);

//create a new WebSocket object.
var msgBox = $('#message-box');
var wsUri = "wss://192.168.1.201:9000/server.php";
websocket = new WebSocket(wsUri);

websocket.readyStateChange = function (e) { // connection is open 
	console.log(e);
}

websocket.onopen = function (ev) { // connection is open 
	msgBox.append('<div class="system_msg" style="color:#bbbbbb">Welcome to my "Demo WebSocket Chat box"!</div>'); //notify user
}
// Message received from server
websocket.onmessage = function (ev) {
	var response = JSON.parse(ev.data); //PHP sends Json data

	
	
	var res_type = response.type; //message type
	var user_message = response.message; //message text
	var user_name = response.name; //user name
	var user_color = response.color; //color

console.log(res_type);
	switch (res_type) {
		case 'usermsg':
			if($("#user_typing").length > 0)
				$("#user_typing").remove();
			msgBox.append('<div><span class="user_name" style="color:' + user_color + '">' + user_name + '</span> : <span class="user_msg">' + user_message + '</span></div>');
			break;
		case 'system':
			msgBox.append('<div style="color:#bbbbbb">' + user_message + '</div>');
			break;
		case 'notification':
			var user_notification = response.notification; //notification type
			if(user_notification === 'typing'){
				if($("#user_typing").length <= 0)
					msgBox.append('<div id="user_typing"><span class="user_name" style="color:' + user_color + '">' + user_name + '</span> : <span class="system_msg">' + user_message + '</span></div>');
			} else
				msgBox.append('<div id="user_notification"><span class="user_name" style="color:' + user_color + '">' + user_name + '</span> : <span class="system_msg">' + user_message + '</span></div>');
			break;
	}
	msgBox[0].scrollTop = msgBox[0].scrollHeight; //scroll message 

};

websocket.onerror = function (e) {
	msgBox.append('<div class="system_error">Error Occurred - ' + e.data + '</div>');
};
websocket.onclose = function (e) {
	if(e.wasClean)
		msgBox.append('<div class="system_msg">Connection Closed</div>');
	else
		msgBox.append('<div class="system_error">Connection Interrupted - [Error#' + e.code + '] ' + e.reason + '</div>');
};

//Message send button
$('#send-message').click(function () {
	send_message();
});

//User hits enter key 
$("#message").on("keydown", function (event) {
	if (event.which == 13) {
		send_message();
	}
});
//User typing
$("#message").on("keypress", function (event) {
	if (event.which !== 13)
		send_notification('typing','Typing...');
});

var notifications = [], isTyping = false;

//Send message
function send_message() {
	var message_input = $('#message'); //user message text
	var name_input = $('#name'); //user name

	if (message_input.val() == "") { //empty name?
		alert("Enter your Name please!");
		return;
	}
	if (message_input.val() == "") { //emtpy message?
		alert("Enter Some message Please!");
		return;
	}
	
	isTyping = false;

	//prepare json data
	var msg = {
		message: message_input.val(),
		name: name_input.val(),
		color: colors[color_pick]
	};
	//convert and send data to server
	websocket.send(JSON.stringify(msg));
	message_input.val(''); //reset message input
}

//Send message
function send_notification(type, msg) {
	var name_input = $('#name'); //user name
	notifications.push(type);
	//prepare json data
	var msg = {
		notification: type,
		message: msg,
		name: name_input.val(),
		color: colors[color_pick]
	};
	if(!isTyping){
		isTyping = true;
		//convert and send data to server
		websocket.send(JSON.stringify(msg));
	}
}

/socket/chat2/index.html:
<?php 
$colors = array('#007AFF','#FF7000','#FF7000','#15E25F','#CFC700','#CFC700','#CF1100','#CF00BE','#F00');
$color_pick = array_rand($colors);
?>
<!DOCTYPE html>
<html>
	<head>
		<meta name="viewport" content="width=device-width, initial-scale=1">
		<style type="text/css">
			.chat-wrapper {
				font: bold 11px/normal 'lucida grande', tahoma, verdana, arial, sans-serif;
				background: #00a6bb;
				padding: 20px;
				margin: 20px auto;
				box-shadow: 2px 2px 2px 0px #00000017;
				max-width:700px;
				min-width:500px;
			}
			.system_error {
				color: #a00;
			}
			.system_msg {
				color: #bbb;
			}
			.user_msg {
				color: #00f;
			}
			#message-box {
				width: 97%;
				display: inline-block;
				height: 300px;
				background: #fff;
				box-shadow: inset 0px 0px 2px #00000017;
				overflow: auto;
				padding: 10px;
			}
			.user-panel{
				margin-top: 10px;
			}
			input[type=text]{
				border: none;
				padding: 5px 5px;
				box-shadow: 2px 2px 2px #0000001c;
			}
			input[type=text]#name{
				width:20%;
			}
			input[type=text]#message{
				width:60%;
			}
			button#send-message {
				border: none;
				padding: 5px 15px;
				background: #11e0fb;
				box-shadow: 2px 2px 2px #0000001c;
			}
		</style>
	</head>
	<body>
		<div class="chat-wrapper">
			<div id="message-box"></div>
			<div class="user-panel">
				<input type="text" name="name" id="name" placeholder="Your Name" maxlength="15" />
				<input type="text" name="message" id="message" placeholder="Type your message here..." maxlength="100" />
				<button id="send-message">Send</button>
			</div>
		</div>
		<script src="https://cdn.sgnetworks.net/jquery/lib/3.2.1/jquery-3.2.1.min.js"></script>
		<script language="javascript" type="text/javascript" src="client.js"></script>
	</body>
</html>