При работе на 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 платформ.
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 позволяет однократно сгенерировать новые ключи и в дальнейшем за счет этого получать доступ к соответствующим родительским ключам.
-- 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]
}
Subscribe to:
Posts
(
Atom
)

