C. For each function independent of data types

При работе на C часто имеешь дело с массивами разного типа. Для вывода содержимого каждой из них нужно реализовать собственные функции. Учитывая, что перегрузка в данном случае не поддерживается, нужно еще и разные имена придумать. Всем известна функция qsort

void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))

которая может работать с массивами абсолютно разного типа. Можно ли реализовать аналогичную универсальную функцию для вывода содержимого массивов так же независимо от типа.  Ниже приведен один из подходов.

#include <stdio.h>
#include <string.h>

#define count(x) sizeof(x) / sizeof(x[0])

typedef struct {
  int id;
  char title[50];
  char author[50];
  char subject[50];
} Book;

void for_each(void *base, size_t num, size_t size, void (*by_item) (void *)) {
  unsigned char *p = (unsigned char *) base;
  unsigned int i = 0;
  for (; i < num; i++) {
    by_item(p + i * size);
  }
}

// show int item
void show_num(void *item) {
  printf("item = %d\n", *((int *) item));
}

// show char item
void show_char(void *item) {
  printf("item = %c\n", *((char *) item));
}

// show Book item
void show_book(void *item) {
  printf("id:%d title:%s author:%s subject:%s\n", 

                   ((Book *) item)->id, 
                        ((Book *) item)->title, 
                              ((Book *) item)->author, 
                                    ((Book *) item)->subject);
}

int main() {
  int nums[] = {1, 2, 3, 4, 5};
  char chars[] = "abcdefgh";
  Book books[] = {
    {11179, "Book_1", "Jon Bredbery", "Tutorial_1"},
    {34454, "Book_2", "Adam Rich", "Tutorial_2"},
    {76899, "Book_3", "Den Swarovsky", "Tutorial_3"}
  };

  for_each(nums, count(nums), sizeof(int), show_num);//show all nums
  for_each(chars, strlen(chars), sizeof(char), show_char);//show all chars
  for_each(books, count(books), sizeof(Book), show_book);//show all books

  return 0;
}


PHP5. Redis. Install redis client (Predis) on Unix/Windows OS

Predis является гибким и полнофункциональным php клиентом для работы с Redis хранилищем. Более подробно с функционалом можно ознакомиться по ссылке:

https://github.com/nrk/predis/wiki

Для того, чтобы задействовать данного клиента, нужно минимум действий.
Склонируйте следующий репозиторий в директорию проекта:

$ git clone git://github.com/nrk/predis.git

или загрузите с данного репозитория архив, на данный момент доступен следующий:

https://github.com/nrk/predis/archive/v1.0.zip

На выходе должна получиться следующая структура

/project
    /index.php
    /predis
        /...
       
Далее в коде регистрируем автозагрузчик классов:

require "predis/autoload.php";
Predis\Autoloader::register();


После чего создаем клиента и работаем с ним:

// для локального подключения
$client = new Predis/Client();
 

// для удаленного подключения
$client = new Predis/Client(array(
    "scheme" => "tcp",
    "host" => "192.168.5.172",
    "port" => 6379
));


Ниже приведен пример использования данного клиента

<?php
require "predis/autoload.php";
Predis\Autoloader::register();

try {
    $client = new Predis/Client();
    $client->set('foo', 'bar');
    $value = $client->get('foo');
    echo $value;
}
catch (Exception $e) {
    die($e->getMessage());
}

?>

Данное мини руководство справедливо как для unix, так и для windows платформ.



oracle v.11.2. Generate new ids for hierarchical query

with
 
  -- source hierarchical test data
  tbl1(id, pid) as (
    select 1, null from dual union all
    select 2, 1 from dual union all
    select 3, 2 from dual union all
    select 4, null from dual union all
    select 5, 4 from dual union all
    select 6, null from dual union all
    select 7, 6 from dual union all
    select 8, 7 from dual union all
    select 9, 8 from dual union all
    select 10, 9 from dual
  ),


 -- source hierarchical test data with generated new ids
 tble2(new_id, id, pid) as (
   select floor(dbms_random.value(1, 1000)) new_id , id, pid
   from tbl1
 )

select
  level
 ,r.id
 ,r.pid
 ,sys_connect_by_path(r.id, '\')
 ,r.new_id
 ,r.new_pid
 ,sys_connect_by_path(r.new_id, '\')
from (
  select
    t2.id
   ,t2.pid
   ,t2.new_id
   ,(select t.new_id from tble2 t where t2.pid = t.id) new_pid
  from tble2 t2
) r
connect by prior r.id = r.pid
start with r.pid is null




Как сгенерировать новые ключи для иерархических записей? Выше представлен один из способов решения данной задачки. Генерация новых ключей, понятное дело приведено для примера, в Вашем случае могут использоваться consequences. Конструкция with позволяет однократно сгенерировать новые ключи и в дальнейшем за счет этого получать доступ к соответствующим родительским ключам.

Javascript. Индексирование массивов

Очень часто возникают задачи связанные с частым обращением к тем или иным массивам. Есть различные алгоритмы, позволяющие уменьшить время обращения к определенным элементам в массиве, но можно поступить и следующим образом: реализовать возможность индексирования массива по значениям, по которым в дальнейшем можно быстро обращаться к массиву имея на руках объект индексов

Array.prototype.createIndex = function (byValue) {
    var self = this, indexes = {};
if (typeof byValue !== 'function')
byValue = function (value) {return value};
for (var index = 0, len = self.length, value; index < len; index++) {
value = byValue(self[index]);
(indexes[value] || (indexes[value] = [])).push(index);
}
return indexes;
};

var array1 = ['one', 'two', 'three', 'four', 'two'];
var Array1Indexes = array1.createIndex();
console.log(Array1Indexes);

На выходе:

{ 
  four:  [3],
  one:   [0],
  three: [2],
  two:   [1, 4]
}

var array2 = [{id: 51, value: 10}, {id: 10, value: 11}, {id: 2, value: 12}, {id: 152, value: 13}, {id: 30, value: 14}];
var Array2Indexes = array2.createIndex(function (item) {return item.id});
console.log(Array2Indexes);

На выходе:

{ 
  2:   [2],
  10:  [1],
  30:  [4],
  51:  [0],
  152: [3]
}