• ↓
  • ↑
  • ⇑
 
Записи с темой: php (список заголовков)
23:58 

Spiral matrix traversal PHP

Vi Veri Veniversum Vivus Vici
  1. <?php
  2.  
  3. $r1 = rand(0, 7);
  4. $r2 = rand(0, 7);
  5. $a = [];
  6. for ($i = 0; $i < $r1; $i++) {
  7. for ($j = 0; $j < $r2; $j++) {
  8. $a[$i][$j] = rand(1, 10);
  9. }
  10. }
  11. $r = [];
  12. for ($i = 0; $i < $r1; $i++) {
  13. $t = [];
  14. for ($j = 0; $j < $r2; $j++) {
  15. $t[] = $a[$i][$j];
  16. }
  17. $r[] = '[' . implode(', ', $t) . ']';
  18. }
  19.  
  20. echo "[\n" . implode(",\n", $r) . "\n];\n\n";
  21.  
  22. //var_dump([$r1, $r2]);
  23. /**$a = [
  24. [6, 10, 9],
  25. [3, 5, 2],
  26. [8, 2, 5],
  27. [4, 1, 8],
  28. [6, 10, 5],
  29. [6, 8, 10]
  30. ];
  31. */
  32.  
  33. /**
  34. $a = [
  35.  [1, 2, 3, 4],
  36.  [14, 15, 16, 5],
  37.  [13, 20, 17, 6],
  38.  [12, 19, 18, 7],
  39.  [11, 10, 9, 8]
  40. ];*/
  41.  
  42. $rows = sizeof($a);
  43. if ($rows) {
  44. $cols = sizeof($a[0]);
  45. } else {
  46. $cols = 0;
  47. }
  48.  
  49. $total = $rows * $cols;
  50.  
  51. $i = $cols;
  52. $d = 'cols';
  53. $j = 0;
  54. $c = 0;
  55. $x = 0;
  56. $y = 0;
  57.  
  58. $dy = 0;
  59. $dx = 1;
  60.  
  61.  
  62. $r = [];
  63. while ($c < $total) {
  64. $r[] = $a[$y][$x];
  65. $j++;
  66. if ($j === $i) {
  67. $j = 0;
  68. list($dx, $dy) = [-$dy, $dx];
  69. if ($d === 'cols') {
  70. $rows--;
  71. $i = $rows;
  72. $d = 'rows';
  73. } else {
  74. $cols--;
  75. $i = $cols;
  76. $d = 'cols';
  77. }
  78. }
  79. $x = $x + $dx; $y = $y + $dy;
  80.  
  81. $c++;
  82. }
  83.  
  84. if (empty($r)) echo "Empty result\n";
  85. echo implode(' ', $r);

@темы: PHP

15:23 

Regexp for password starting from letter

Vi Veri Veniversum Vivus Vici
Password with 2 uppercase letter, 2 lowercase, and two 2 digits at least, starting from letter.


^[A-Za-z](?=.*[A-Z])(?=.*[0-9].*[0-9])(?=.*[a-z]).{7,32}$

@темы: PHP, regexp

23:24 

Парсер отчетов от Мегафона

Vi Veri Veniversum Vivus Vici
Понадобилось чекнуть отчетность своих расходов (которые крайне невелики, но все же) на мобильную связь. Решил написать простую парсилку


Использование:


$ php parse.php ~/work/megafon/all.html
Исходящие прочие:
01.03.15
1.72 минута на 0.40 рублей
02.03.15
3.13 минуты на 1.45 рубль
03.03.15
0.45 минут на 0.29 рублей
05.03.15
0.75 минут на 0.29 рублей
06.03.15
1.27 минута на 0.58 рублей
07.03.15
2.15 минуты на 0.87 рублей
08.03.15
8.22 минут на 4.35 рубля
09.03.15
0.07 минут на 0.29 рублей
11.03.15
4.67 минуты на 1.45 рубль
12.03.15
6.92 минут на 2.90 рубля
13.03.15
3.72 минуты на 1.16 рубль
14.03.15
6.32 минут на 2.90 рубля
15.03.15
2.08 минуты на 1.74 рубль
16.03.15
10.93 минут на 3.48 рубля
17.03.15
4.27 минуты на 1.45 рубль
SMS:Услуги SMS-центра:
01.03.15
1 штука на 1.60 рубль
02.03.15
1 штука на 1.60 рубль
03.03.15
1 штука на 1.60 рубль
14.03.15
4 штуки на 6.40 рублей
17.03.15
3 штуки на 4.80 рубля
Премиум WAP(WAP-клики):
08.03.15
2 штуки на 65.00 рублей
Исходящие внутрисетевые:
15.03.15
4.28 минуты на 1.45 рубль

@темы: PHP

19:27 

Generate permutations PHP

Vi Veri Veniversum Vivus Vici
  1. <?php
  2.  
  3. function g($a, $u = [])
  4. {
  5. $r = [];
  6. $size = sizeof($a);
  7. for ($i = 0; $i < $size; $i++) {
  8. if (empty($u[$i])) {
  9. $u[$i] = true;
  10. $vs = g($a, $u);
  11. $r[] = [$a[$i]];
  12. foreach($vs as $v) {
  13. $r[] = array_merge(array(
  14. $a[$i]
  15. ) , $v);
  16. }
  17.  
  18. $u[$i] = false;
  19. }
  20. }
  21.  
  22. return $r;
  23. }

@темы: PHP

23:26 

Задачка от Яндекса; Longest subarayy with equal count of 0 and 1

Vi Veri Veniversum Vivus Vici
Дан массив длины n из нулей и единиц. Найдите в нём подмассив макисмальной длины, в котором количество единиц равно количеству нулей. Ограничения: O(n) по времени и O(n) по дополнительной памяти.

  1. function getLongest(s) {
  2. var begin = 0,
  3. finish = 0,
  4. len = 0,
  5. b = {},
  6. sum = 0,
  7. i,
  8. n = s.length;
  9. prefix,
  10. padding = '',
  11. cursor;
  12. for (i = -n; i < n; i++) {
  13. b[i] = null;
  14. }
  15. b[0] = -1;
  16. for (i = 0; i < n; i++) {
  17. sum += (s[i] == 1 ? 1 : -1);
  18. if (b[sum] == null) {
  19. b[sum] = i;
  20. console.log('for sum = ' + sum + ' index = ' + i);
  21. } else {
  22. console.log('for sum = ' + sum + ' at index = ' + i + ' b = ' + b[sum]);
  23. if (len < i - b[sum]) {
  24. begin = b[sum] + 1;
  25. finish = i;
  26. len = i - b[sum];
  27. console.log('begin = ' + begin + ' finish = ' + finish + ' len = ' + len);
  28. }
  29. }
  30. }
  31. if (begin === finish) {
  32. console.log('No subarray');
  33. return;
  34. }
  35. prefix = '['+begin+':'+finish+'] = ';
  36. for (i = 0; i < prefix.length + s.length; i++) {
  37. cursor = i - prefix.length;
  38. padding += (cursor === begin || cursor === finish) ? '^' : ' ';
  39. }
  40. console.log(prefix + s);
  41. console.log(padding)
  42. console.log(padding.substr(0, prefix.length + begin) + s.substr(begin, finish - begin + 1));
  43. }
  44. (function(tests) {
  45. var i, j, s, len;
  46. for (i = 0; i < tests; i++) {
  47. len = Math.round(Math.random() * 10) + 1;
  48. s = '';
  49. for (j = 0; j < len; j++) {
  50. s += Math.round(Math.random());
  51. }
  52. console.log(s);
  53. getLongest(s);
  54. }
  55. })(3);

@темы: Algorithms, JavaScript, PHP

00:50 

MySQL concurrency with GET_LOCK

Vi Veri Veniversum Vivus Vici
I trying to use GET_LOCK for application-level blocking in my application. So I research how to do it in propert way. As I can see, IS_FREE_LOCK function is non-atomic, but GET_LOCK with second parameter (timeout) equal to 0 is works very good. So we should to use two checking steps: IS_FREE_LOCK as first and then GET_LOCK($lockId, 0) === 1.

First, we need to create code like this (its not ideal, and hasnt error handling: its a just proof-o-concept):

  1. <?php
  2. $db = new mysqli('localhost', 'root', '');
  3. if ($db->connect_errno) {
  4. printf("Не удалось подключиться: %s\n", $db->connect_error);
  5. exit();
  6. }
  7. function get_named_lock($lockname, $i) {
  8. global $db;
  9. $rs = $db->query("SELECT IS_FREE_LOCK('$lockname';) AS isfree");
  10. $result = $rs->fetch_array();
  11. if ($result['isfree']) {
  12. printf("Is free! PID = %s I = %d\n", getmypid(), $i);
  13. $rs = $db->query("SELECT GET_LOCK('$lockname', 0) AS locked");
  14. $result = $rs->fetch_array();
  15. $locked = $result['locked'];
  16. printf("%s Locked! PID = %s I = %d\n", $locked ? 'IS' : 'NOT', getmypid(), $i);
  17. return $locked;
  18. } else {
  19. return false;
  20. }
  21. }
  22. function release_named_lock($lockname) {
  23. $db->query("DO RELEASE_LOCK('$lockname';)");
  24. }
  25. printf("Started %s\n", getmypid());
  26. for ($i = 0; $i < 10000; $i++) {
  27. get_named_lock('mylock', $i);
  28. usleep(10);
  29. }
  30. printf("Release %s\n", getmypid());


Lets save it in file lock_test.php and then write small Bash sсript (run.sh):

  1. #!/bin/bash
  2. for i in {1..10}
  3. do
  4. `php lock_test.php >> /tmp/out.log` &
  5. done


Then you can to run it and see into logs:

$ ./run.sh
$ tail -f /tmp/out.log
Started 29376
Is free! PID = 29376 I = 0
IS Locked! PID = 29376 I = 0
Started 29369
Started 29377
Started 29368
Started 29370
Started 29373
Started 29374
Started 29372
Started 29378
Started 29379
Release 29373
Release 29370
Release 29376
Is free! PID = 29378 I = 9844
Is free! PID = 29369 I = 9964
Is free! PID = 29374 I = 9989
IS Locked! PID = 29369 I = 9964
Is free! PID = 29377 I = 9852
NOT Locked! PID = 29374 I = 9989
NOT Locked! PID = 29378 I = 9844
NOT Locked! PID = 29377 I = 9852
Release 29374
Release 29369
Release 29372
Is free! PID = 29377 I = 9876
Is free! PID = 29368 I = 9881
Is free! PID = 29379 I = 9906
Is free! PID = 29378 I = 9876
IS Locked! PID = 29379 I = 9906
NOT Locked! PID = 29378 I = 9876
NOT Locked! PID = 29368 I = 9881
NOT Locked! PID = 29377 I = 9876
Release 29379
Is free! PID = 29378 I = 9973
IS Locked! PID = 29378 I = 9973
Release 29368
Release 29378
Release 29377



As you can see, lot of sсripts can to catch lock as "free" at same time, but only one can actually catch it with GET_LOCK. Anyway, a lot of iterations are skipped by IS_FREE_LOCK check step - its fast and enough to skip non-concurrency scripts.

@темы: concurrency, PHP, MySQL, GET_LOCK, Bash, mutex

11:34 

PHP Warning: require_once(PHP/Timer/Autoload.php): failed to open stream

Vi Veri Veniversum Vivus Vici
If you get this error:

  1. $ phpunit -c config.xml SomeTest.php
  2. PHP Warning: require_once(PHP/Timer/Autoload.php): failed to open stream: No such file or directory in /usr/share/php/PHPUnit/Autoload.php on line 47
  3. Warning: require_once(PHP/Timer/Autoload.php): failed to open stream: No such file or directory in /usr/share/php/PHPUnit/Autoload.php on line 47
  4. PHP Fatal error: require_once(): Failed opening required 'PHP/Timer/Autoload.php' (include_path='.:/usr/share/php') in /usr/share/php/PHPUnit/Autoload.php on line 47
  5. Fatal error: require_once(): Failed opening required 'PHP/Timer/Autoload.php' (include_path='.:/usr/share/php') in /usr/share/php/PHPUnit/Autoload.php on line 47


Do this command:

  1. $ sudo pear install --alldeps --force phpunit/PHP_Timer
  2. [sudo] password for user:
  3. downloading PHP_Timer-1.0.5.tgz ...
  4. Starting to download PHP_Timer-1.0.5.tgz (3,597 bytes)
  5. ....done: 3,597 bytes
  6. install ok: channel://pear.phpunit.de/PHP_Timer-1.0.5


Now all will be OK

@темы: pear, PHPUnit, PHP

12:14 

Ordering when inserting in Nested Sets tree

Vi Veri Veniversum Vivus Vici
Imagine you have Nested Sets tree, and you must to order it (by moving nodes) by some value (may be date, or some number value).

  1. $a = array();
  2.  
  3. for ($i = 0; $i < 15; $i++) {
  4. $a[rand(1, 1000)] = rand(1, 50);
  5. }
  6.  
  7. print_r($a);
  8.  
  9. asort($a);
  10. $c = array_keys($a);
  11.  
  12. print_r($a);
  13.  
  14. $q = array();
  15.  
  16. foreach ($a as $key => $value) {
  17. $aKey = array_search($key, $c, true);
  18. if (isset($c[$aKey + 1])) {
  19. $bKey = $c[$aKey + 1];
  20. array_unshift($q, array($value, $key, $bKey));
  21. }
  22. }
  23.  
  24. // proof-o-concept: how array can be created
  25. $r = array($key => $value);
  26.  
  27. foreach ($q as $data) {
  28. echo vsprintf("Moved %s from index %d before %dn", $data);
  29. $r = array_replace(array($data[1] => $data[0]), $r);
  30. }
  31.  
  32. print_r($r);
  33.  
  34.  
  35.  
  36.  

@темы: PHP

11:55 

Config for XDebug for memory and CPU profiling

Vi Veri Veniversum Vivus Vici
  1. [XDebug]
  2. zend_extension="/usr/lib/php5/20100525/xdebug.so"
  3. xdebug.remote_enable=1
  4. xdebug.remote_port="9000"
  5. xdebug.profiler_enable=1
  6. xdebug.profiler_output_dir="/tmp"
  7. xdebug.auto_trace=On
  8. xdebug.trace_output_dir="/tmp"
  9. xdebug.show_mem_delta=Off
  10. xdebug.collect_params=0
  11. xdebug.collect_return=Off
  12. xdebug.trace_format=2




Path to zend_extension must be equal to path which will be output by sudo pecl install xdebug command

@темы: PHP

17:43 

PHP nested arrays creation

Vi Veri Veniversum Vivus Vici
  1. <?php
  2.  
  3.  
  4.  
  5. function fill($keys, $value, $a = array()) {
  6. $keys = (array)$keys;
  7. $key = array_pop($keys);
  8. $v = &$a;
  9. foreach ($keys as $keyName) {
  10. $v = &$v[$keyName];
  11. }
  12. $v[$key] = $value;
  13. return $a;
  14. }
  15.  
  16. var_dump(fill(['a', 'b', 'c', 'd', 'e'], 'f', array('a' => array('b' => array('b1' => array())))));
  17. var_dump(fill(['a', 'b', 'c'], 'd', array('a' => array('a1' => 3))));
  18. var_dump(fill(['c'], 'd'));
  19. var_dump(fill('kkk', 'd'));

@темы: PHP

17:40 

Online PHP sandbox

Vi Veri Veniversum Vivus Vici
For example, you can to test your code in PHP >= 5.4
sandbox.onlinephpfunctions.com/

@темы: PHP

18:27 

PHP network interface bind

Vi Veri Veniversum Vivus Vici
For example, you can use it for SOAPClient: stackoverflow.com/questions/3444359/is-it-possi...
Or for common purposes: ilia.ws/archives/51-PHP-bind-support-via-stream...

  1. <?php
  2.  
  3. $conn = stream_context_create(array('socket'=>array('bindto' => "1.2.3.4:0")));
  4. file_get_contents("url";, NULL, $conn);
  5.  
  6. ?>

@темы: PHP, SOAPClient

12:34 

Late Static Binding PHP

Vi Veri Veniversum Vivus Vici
  1. <pre>
  2. <?php
  3.  
  4. class S {
  5.  
  6. protected $_data = array();
  7.  
  8. public function __construct($separator) {
  9. $name = get_class($this);
  10. for ($i = 1; $i < 3; $i++) {
  11. for ($j = 1; $j < 3; $j++) {
  12. $this->_data[$i][$j] = sprintf('Property %d%s%d of %s', $i, $separator, $j, $name);
  13. }
  14. }
  15. }
  16.  
  17. public function get($id, $pid) {
  18. return isset($this->_data[$id][$pid]) ? $this->_data[$id][$pid] : null;
  19. }
  20. }
  21.  
  22. class S1 extends S {
  23. }
  24.  
  25. class S2 extends S {
  26. }
  27.  
  28. abstract class A {
  29.  
  30. abstract protected function i();
  31.  
  32. public static function getById($id, $property_id) {
  33. if ($id <= 0 || $property_id <= 0) {
  34. throw new Exception('Неверные данные');
  35. }
  36. return static::i()->get($id, $property_id);
  37. }
  38. }
  39.  
  40. class B extends A {
  41.  
  42. private static $instance;
  43.  
  44. protected function i() {
  45. if (!self::$instance) {
  46. $len = rand(1, 20);
  47. self::$instance = new S1(str_repeat('-', $len));
  48. }
  49. return self::$instance;
  50. }
  51.  
  52. }
  53.  
  54. class C extends A {
  55.  
  56. protected function i() {
  57. $len = rand(1, 20);
  58. return new S2(str_repeat('*', $len));
  59. }
  60.  
  61. }
  62. for ($i = 0; $i < 5; $i++) {
  63. ?>
  64. <div style="border:1px #ccc dashed;"><?php var_dump(B::getById(rand(1,2), rand(1,2))); var_dump(C::getById(rand(1,2), rand(1,2)));?> </div>
  65. <?php
  66. }


If there will be "return self::i()->get($id, $property_id);", you will get

Fatal error: Cannot call abstract method A::i() in /var/web/tests/lsb_2.php on line 37
 
Call Stack:
0.0003 350596 1. {main}() /var/web/tests/lsb_2.php:0
0.0003 350728 2. A::getById() /var/web/tests/lsb_2.php:65
 

@темы: PHP

15:26 

setlocale и буквы "Ф", "Ц", "Ы" в stristr, preg_match

Vi Veri Veniversum Vivus Vici
Ебались с локалью под Fedora 16 - не срабатывал поиск без учета регистра (данные в базе лежат в CP1251), беглое гугление дало подсказку использовать setlocale. Однако она упорно не хотела ставиться, после чего был найден способ создать нужную локаль:
sudo localedef -f CP1251 -i ru_RU ru_RU.cp1251

Затем делаем
setlocale(LC_ALL, 'ru_RU.cp1251');

И все в шоколаде!

@темы: PHP

15:58 

Паттерн Цепочка ответственности (Chain-of-responsibility pattern)

Vi Veri Veniversum Vivus Vici
Написал вот такой небольшой пример быдлокода. Предполагается, что необходимо 1) реализовать паттерн как таковой 2) реализовать динамическое изменение цепочки, как изнутри, так и снаружи, если процесс выполнения не может возвращать эту цепь по каким-либо причинам (проблемы в архитектуре, как частный случай).

читать дальше

@темы: Design Patterns, PHP

Small Coder Blog

главная