# How to solve VR moving ? #E3onTwitch

June 13, 2016

So, I am watching some TotalBiscuit’s E3 Snarkathon VR Killing Floor… whatever

The idea, consoles have solved the moving by having 2 sticks on the controller (I hope am right about that), so lets have 2 sticks on VR, wait this is bullshit, you will say?

Well may be, we already have the right stick by moving your head, the only question is how to make the left stick?

Do it like:

1. Make the chair you are sitting on detect movement, the way to image it like you are sitting on the left controller stick, which will move you through your experience by bending the chair in the 4 directions. YOU better add sensitivity calibration all right?

2. May be a cheaper way, using your right leg to move forward, backward, left leg moving left and right or using just one leg doing all the movement. This will allow me do lay on my couch, niceee.

I don’t have third solution, but think of the controller sticks when trying to solve this problem.

simple as that

# PHP Games – Solution to The Impossible Bet

April 8, 2016

```/**
* 100 people put a number in box.
* every one must find his box within 50 tries
*/
\$allTries = 100000;
\$usedTries = \$allTries;
\$players  = 50;
\$tries    = 25;
\$settings = [];
\$people   = [];
for (\$i = 0; \$i < \$players; \$i++) {
\$settings[\$i]  = \$i;
\$people[\$i]    = \$i;
}

\$mostPeopleWon = 0;
while (--\$usedTries >= 0) {
\$boxes = \$settings;
shuffle(\$boxes);

\$peopleWon = 0;
for (\$p = 0; \$p < \$players; \$p++) {

\$personBoxes = \$boxes;
\$started     = false;
\$won         = false;
for (\$t = 0; \$t < \$tries; \$t++) {
if (\$started === false) {
\$num     = array_rand(\$personBoxes, 1);
\$started = true;
}

\$value = \$personBoxes[\$num];
unset(\$personBoxes[\$num]);

if (\$value === \$people[\$p]) {
\$won = true;
unset(\$boxes[\$num]);
break;
} elseif (!array_key_exists(\$value, \$personBoxes)) {
\$started = false;
} else {
\$num = \$value;
}
}

if(\$won) {
\$peopleWon++;
} else {
break;
}
}

if (\$peopleWon > \$mostPeopleWon) {
\$mostPeopleWon = \$peopleWon;
}

if (\$mostPeopleWon >= \$players) {
var_dump('game won in ' . (\$allTries - \$usedTries) . ' games');
exit;
}
}

var_dump('game lost. most people won ' . \$mostPeopleWon);```

# Zf2 Naviagation Custom Active Page

October 31, 2015

Zf2 Naviagation Custom Active Page
Call in layout/view

```\$nav = \$this->navigation('Navigation');
\$pages = \$nav->getContainer()->getPages();
foreach (\$pages as \$page) {
\$page->setActive(true);
}
}```

# Set php error_log dynamicaly in .htaccess

September 20, 2015

1. Open your .htaccess file and add this lines to be bottom.

```php_value log_errors 1
php_value error_log ./php.error.log```

`error_reporting(E_ALL);`

Simple as that

# Zf2 Doctrine 2 Log Every Entity Change

September 18, 2015

In this article I will show a simple way to log every change to doctrine 2 entity.
This one will not be copy / paste. Just check out the code and help yourself.

1. Create event service

```/**
* @developer Ivan Gospodinow
*/

namespace Application\Service;

use Application\Entity\DbLogEntity;
use Application\Entity\AbstractEntity;
use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
use \DateTime;

class DoctrineLogChangesService
{

/**
* Hold the changes
* @var type
*/
protected static \$rows = [];
protected \$sm;
protected \$disabled = [
//'Application\Entity\UserEntity',
];

public function __construct(\$sm)
{
\$this->sm = \$sm;
\$sm->get(‘Application’)
->getEventManager()
->attach(‘finish ’, [\$this, 'flush']);
}

public function flush()
{
\$orm = \$this->sm->get(‘doctrine.entitymanager.orm_default’);

foreach (self::\$rows as \$row) {
\$orm->persist(\$row);
}
if (!empty(self::\$rows)) {
\$orm->flush();
}
}

public function getUnitOfWork()
{
return \$this->sm->get(‘doctrine.entitymanager.orm_default’)->getUnitOfWork();
}

public function getEntityTableName(LifecycleEventArgs \$args)
{
return \$meta->table['name'];
}

public function getEntityFields(LifecycleEventArgs \$args)
{
\$fields = [];
foreach (\$meta->fieldMappings as \$field) {
\$fields[\$field['fieldName']] = \$field['columnName'];
}

foreach (\$meta->associationMappings as \$field) {
if (isset(\$field['sourceToTargetKeyColumns'])) {
\$fields[\$field['fieldName']] = key(\$field['sourceToTargetKeyColumns']);
}
}

return \$fields;
}

/**
* @param LifecycleEventArgs \$args
* @return type
*/
public function postPersist(LifecycleEventArgs \$args)
{
\$entity = \$args->getObject();
if (in_array(get_class(\$entity), \$this->disabled)) {
return;
}

\$tableName = \$this->getEntityTableName(\$args);
\$fields = \$this->getEntityFields(\$args);

foreach (\$fields as \$field => \$column) {
\$value = call_user_func_array([\$entity, 'get' . ucfirst(\$field)], []);
\$row = [
'user' => \$this->sm->get('User')->getId(),
'table' => \$tableName,
'pk' => \$entity->getId(),
'column' => \$column,
'oldValue' => null,
'newValue' => \$value instanceof AbstractEntity ? \$value->getId() : \$value
];
\$log = new DbLogEntity();
\$log->exchangeArray(\$row);
self::\$rows[] = \$log;
}
}

/**
* @param LifecycleEventArgs \$args
* @return type
*/
public function preUpdate(LifecycleEventArgs \$args)
{
\$entity = \$args->getObject();
if (in_array(get_class(\$entity), \$this->disabled) || !\$entity->canUseLifecycleEvents()) {
return;
}

\$tableName = \$this->getEntityTableName(\$args);
\$fields = \$this->getEntityFields(\$args);
\$set = \$this->getUnitOfWork()->getEntityChangeSet(\$entity);
foreach (\$set as \$property => \$changes) {
\$oldValue = \$changes[0];
\$newValue = \$changes[1];
if (\$changes[0] instanceof AbstractEntity || \$changes[1] instanceof AbstractEntity) {
if (\$changes[0] instanceof AbstractEntity) {
\$oldValue = \$changes[0]->getId();
}
if (\$changes[1] instanceof AbstractEntity) {
\$newValue = \$changes[1]->getId();
}
}

if (\$oldValue == \$newValue) {
continue;
}

\$row = [
‘user’ => \$this->sm->get(‘User’)->getId(),
‘ table’ => \$tableName,
‘ pk’ => \$entity->getId(),
‘ column’ => \$fields[\$property],
‘ oldValue’ => \$this->getStringValue(\$oldValue),
‘ newValue’ => \$this->getStringValue(\$newValue)
];

\$log = new DbLogEntity();
\$log->exchangeArray(\$row);
self::\$rows[] = \$log;
}
}

public function getStringValue(\$value)
{
if (is_scalar(\$value)) {
return \$value;
}

if (\$value instanceof DateTime) {
return \$value->format('Y-m-d H:i:s');
} elseif (is_array(\$value)) {
return serialize(\$value);
}

return \$value;
}

}```

2. Add the event service to Doctrine 2

```/**
* @developer Ivan Gospodinow
*/

namespace Application;

use Zend\Mvc\MvcEvent;

class Module
{

public function onBootstrap(MvcEvent \$e)
{
\$application = \$e->getApplication();
\$sm = \$application->getServiceManager();
\$doctrineEntityManager = \$sm->get('doctrine.entitymanager.orm_default');
\$doctrineEventManager = \$doctrineEntityManager->getEventManager();
[
\Doctrine\ORM\Events::postPersist,
\Doctrine\ORM\Events::preUpdate,
],
new Service\DoctrineLogChangesService(\$sm)
);
}
}```

3. DbLogEntity

```/**
* @developer Ivan Gospodinow
*/

namespace Application\Entity;

use Doctrine\ORM\Mapping as ORM;
use \Exception;

/**
* @ORM\Table(name="__dblog")
* @ORM\Entity()
*/
class DbLogEntity
{

/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer", name="id")
*/
protected \$id;

/**
* @ORM\Column(type="string", name="user_id")
*/
protected \$user;

/**
* @ORM\Column(type="string", name="table_name")
*/
protected \$table;

/**
* @ORM\Column(type="integer", name="pk")
*/
protected \$pk;

/**
* @ORM\Column(type="string", name="column_name")
*/
protected \$column;

/**
* @ORM\Column(type="string", name="old_value")
*/
protected \$oldValue;

/**
* @ORM\Column(type="string", name="new_value")
*/
protected \$newValue;

/**
* @ORM\Column(type="datetime", name="timestamp")
*/
protected \$timestamp;

}```

Simple as that.
Suggestions or problems ? Write a comment.

# Zend Framework 2 change layout for ajax requests

September 15, 2015

How to change layout for ajax requests in Zend Framework 2

1. Module.php

```    public function onBootstrap(MvcEvent \$e)
{
\$e->getApplication()
->getEventManager()
->getSharedManager()
->attach(
'Zend\Mvc\Controller\AbstractController',
'dispatch',
function (\$e) {
\$controller      = \$e->getTarget();
if (\$controller->getRequest() instanceof HttpRequest) {
if (\$controller->getRequest()->isXmlHttpRequest()) {
\$controller->layout('layout/ajax');
}
}
},
100
);
}```

2. module.config.php Add the layout path

```    'view_manager' => array(
'template_map' => array(
'layout/ajax' => __DIR__ . '/../view/layout/layout.ajax.phtml',
),
),```

# Creating issues in Jira for multiple users with Jira API

September 12, 2015

1. Creating Jira issue

```   \$jiraUsername = 'Jira login username';
\$jiraHost     = 'http://my-jira-host.com/';
\$data = array(
'fields' => array(
'project' => array('key' => 'PR'/* Project Key*/),
'summary'=> 'Issue title',
'description' => 'Some text here, no html tags',
'labels' => array('API', 'IvanGospodinow'/* Put the username so you know which one added it */),
'issuetype' => array('id' => 1 /* or similar */)
)
);

\$ch = curl_init();
'Accept: application/json',
'Content-Type: application/json'
);
curl_setopt(\$ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt(\$ch, CURLOPT_VERBOSE, 1);
curl_setopt(\$ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt(\$ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt(\$ch, CURLOPT_POSTFIELDS, json_encode(\$data));
curl_setopt(\$ch, CURLOPT_URL, \$jiraHost . 'rest/api/2/issue/');
\$response = curl_exec(\$ch);
\$error = curl_error(\$ch);
if (!empty(\$error)) {
throw new Exception('EQ Error: ' . \$error);
}
curl_close(\$ch)```

2. Getting all issues for user

```        \$ch = curl_init();
'Accept: application/json',
'Content-Type: application/json'
);
curl_setopt(\$ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt(\$ch, CURLOPT_VERBOSE, 1);
curl_setopt(\$ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt(\$ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt(\$ch, CURLOPT_URL, \$jiraHost . 'rest/api/2/search?jql=' . urlencode('labels in (API, 'IvanGospodinow')'));
\$response = curl_exec(\$ch);
curl_close(\$ch);```

Simple as that.

# Zend Framework 2 load multiple config files from Module

September 7, 2015

Module.php

```    public function getConfig()
{
return
(include __DIR__ . '/config/module.config.php')
+
(include __DIR__ . '/config/module.config.permissions.php');
}```

Simple as that.

# Copy big MySQL database with php in 5 steps

July 17, 2015

1. Dump structure of the big database.
2. Open the sql file and cut the constraints.
3.  Import the structure to another database.
4. Run this code:

```/**
* Sync from live database
*/
ini_set('memory_limit','512M');

\$limit      = 100000;
\$time       = time();
\$sleep      = 1;
\$sleepEvery = 60;

"__HOST__",
"__USER__",
"__DATABASE__"
);

"__HOST__",
"__USER__",
"__DATABASE__"
);

\$tables = [];
while(\$row = mysqli_fetch_assoc(\$result)) {
/**
* Filter the tables if you want
*/
\$table = \$row[key(\$row)];
\$tables[] = \$table;
}

foreach (\$tables as \$table)
{
\$offset = 0;
\$hasRows = true;
while (\$hasRows) {
echo "Excecuting SELECT * FROM `\$table` LIMIT \$limit OFFSET \$offset" . PHP_EOL;
flush();
\$result = \$link->query("SELECT * FROM `\$table` LIMIT \$limit OFFSET \$offset");
if (!\$result) {
\$hasRows = false;
break;
}

\$rows = [];
while(\$row = mysqli_fetch_assoc(\$result)) {
\$rows[] = \$row;
}

if (!empty(\$rows)) {
dumpToDatabase(\$table, \$rows);
}

\$offset += \$limit;
takeANap();
if (count(\$rows) < \$limit) {
\$hasRows = false;
break;
}
}
}

function takeANap()
{
global \$time, \$sleep, \$sleepEvery;
if (\$time + \$sleepEvery <= time()) {
\$time = time();
echo 'Sleep for ' . \$sleep . PHP_EOL;
flush();
sleep(\$sleep);
}

}

function dumpToDatabase(\$table, \$rows)
{
echo 'begin_transaction' . PHP_EOL;
\$inserts = [];
foreach  (\$rows as \$row) {
\$values = [];
foreach (\$row as \$id => \$value) {
}

\$inserts[] = sprintf(
'(%s)',
implode(',', \$values)
);

if (count(\$inserts) >= 1000) {
\$str = sprintf(
'INSERT INTO `%s` (%s) VALUES %s;',
\$table,
implode(',', array_keys(\$row)),
implode(',', \$inserts)
);

\$inserts = [];
}
}

if (!empty(\$inserts)) {
\$str = sprintf(
'INSERT INTO `%s` (%s) VALUES %s;',
\$table,
implode(',', array_keys(\$row)),
implode(',', \$inserts)
);

}
echo 'commit' . PHP_EOL;
}

die('END');```

5. Add the constrains from step 2.

Easy as that.

# Warning: Division by zero – easy way to get arround?

September 26, 2014
```\$sum = [0, 0, 0, 0];

echo count(\$sum) / array_sum(\$sum);
// Warning: Division by zero

\$arraySum = 0.00001 + array_sum(\$sum);
\$number = count(\$sum) / \$arraySum;
echo round(\$number, 2);
// Result is 0;```

Just add some small number to the one you are not sure that it will be bigger than zero.
Easy as that.