?

Log in

Previous 10

Feb. 8th, 2017

tux

Но мой папа не любит...

...эти модные приколы.
Только чистый C,
по заветам старой школы!




Jan. 24th, 2017

tux

Велосипед для rsync

Конечно, их уже навалом есть. Но что бы свой не написать, раз процентов 80 кода по другим рабочим скриптам болтается? Ну и на баше :)

Основная идея в том, что списки файлов для потоков формируются по-умному. Ну, как по-умному, относительно :) См. Partition problem # The greedy algorithm. Все файлы, которые меньше указанного размера, идут отдельным потоком. А те, что больше - делятся на части как можно более близкого размера.

Полный список ключей:
Usage: prsync.sh [options]
Valid options, * - required:
    -src   DIR   *  source directory
    -dst   DIR   *  destination directory (see '-x' option)
    -s     SIZE     file size to put it in papallel process, default: '10M' 
                    about size's format see 'man find', command line key '-size' 
    -p     N        additional processes, >0, default: '2'
    -v              be verbose
    -c              cleanup '-dst' directory before sync
    -x              print processes info and exit (no '-dst' required)
    -d              show debug info (some as '-x', but launch sync) 
    -k              keep temporary files 
    -b     N        show N biggest files with -x, default: '4'  
    --     OPT      rsync options, default: '-a --delete -q'


Для экспериментов есть ключи -v, -b, -k, -x. При указании -x запуска rsync не происходит, поэтому его удобно использовать для подбора параметров. Например:

$ sudo ./prsync.sh -src /home/postgres/pg95/data/base/16385 -s 1G -x
Additional processes:
 files:        0, bytes:                  0 (/tmp/prs-v6lKZe.include)
 files:        0, bytes:                  0 (/tmp/prs-GVbwQe.include)
Main process:
 files:     1387, bytes:     30 219 743 748 (/tmp/prs-qzGVYd.include)
Biggest files:
Rsync arguments: -a --delete -q


Обломс, падаем до 100M:

$ sudo ./prsync.sh -src /home/postgres/pg95/data/base/16385 -s 100M -x 
Additional processes:
 files:       35, bytes:     13 422 071 808 (/tmp/prs-KO7Zlt.include)
 files:       36, bytes:     13 527 990 272 (/tmp/prs-Z9e4at.include)
Main process:
 files:     1316, bytes:      3 269 681 668 (/tmp/prs-3P4rut.include)
Biggest files:
      1 073 741 824 bytes '/175490'
      1 073 741 824 bytes '/175489'
      1 073 741 824 bytes '/175487.2'
      1 073 741 824 bytes '/175487.1'
Rsync arguments: -a --delete -q


Уже лучше, но...

$ sudo ./prsync.sh -src /home/postgres/pg95/data/base/16385 -s 500M -x 
Additional processes:
 files:       10, bytes:      8 813 338 624 (/tmp/prs-Uy9twY.include)
 files:        9, bytes:      8 315 084 800 (/tmp/prs-79klmY.include)
Main process:
 files:     1368, bytes:     13 091 320 324 (/tmp/prs-jMVkFY.include)
Biggest files:
      1 073 741 824 bytes '/175490'
      1 073 741 824 bytes '/175489'
      1 073 741 824 bytes '/175487.2'
      1 073 741 824 bytes '/175487.1'
Rsync arguments: -a --delete -q


Во! Чего-то более приличного для 2 дополнительных процессов добиться с этим набором файлов уже не выйдет. А больше 2 (фактически трёх) - это уже индивидуально.

Да, живёт тут: Github # prsync.

Jan. 17th, 2017

tux

Победа

По поводу вот этого патча отписался автор AStyle:
Added to astyle as "attach-closing-while".
It will be in the next commit.


Dec. 9th, 2016

tux

Телефонодизайн

Интересно, откуда в последнее время пошла волна узкого дизайна? Казалось бы, нужно по максимуму использовать место, которого и так немного. Но нет, как будто боятся растянуть объекты на всю ширину экрана. Бесит ещё больше, чем плоскота.

Примеры, одно приложение для SMS (дело не в количестве символов, все балуны обрезаются по одной границе, и не в аватарах, без них то же самое):



Другое:



Viber - просто лидер. особенно убого эта узенькая полоска смотрится на 8+ дюймах:



Да тысячи их :( Наверное, опять какой-нибудь гайд корпорация добра написала, и все ломанулись его соблюдать...

Dec. 6th, 2016

tux

Рабочее

Всё так и есть :)



http://xkcd.ru/705/



http://xkcd.ru/303/

Dec. 2nd, 2016

tux

Сишникам всех стран

А также плюсанутым :)
  1. Как запустить PVS-Studio в Linux
  2. Как использовать PVS-Studio бесплатно
  3. И моя сегодняшняя поделка: Встраиваем PVS-Studio в Eclipse CDT (Linux)
P.S. Всё для Linux, само собой. Как оно под Windows - понятия не имею.

Nov. 10th, 2016

tux

Полезный Яндекс

Тепер-то я точно знаю, как тёмным зимним вечером должен выглядеть дом по адресу Ленинский проспект, 129, корпус 1!



Nov. 7th, 2016

tux

Code golf

Имеется следующая строка (пример на C, но для других языков - аналогично).
for(int i = 0; i < 3; ++i );
Выполняется цикл, понятное дело, 3 раза. Задача: сделать этот цикл бесконечным, никак не модифицируя строку. Доп. условие: переменная цикла должна объявляться внутри него или непосредственно перед, но только объявляться. То есть так можно:
int i;
for( i = 0; i < 3; ++i );
А так - нельзя:
int i = some_magic();
// или int i; some_magic(&i); и т.д.


Пока лидирует решение на Perl (кто б сомневался):
use overload;
BEGIN {
 overload::constant ( integer => sub {
  return 'inf' if($_[1]==3);
  $_[1];
 } );
}

for( my $x = 0; $x < 3; ++$x );
Смысл его в том, что перегружается константа "3", она становится "inf", то есть бесконечностью.

Мой вариант не так эпичен:
use Variable::Magic qw/wizard cast/;

my $foo = \${ *x{SCALAR} };
cast $$foo, wizard( set => sub {
  my ($ref) = @_;
  $$ref = 0;
} );

for( our $x = 0; $x < 3; ++$x );
В принципе аналогичное можно было бы соорудить и с tie, но так веселей :)

Решения на сишностях не так интересны, они в основном с #define играют. А вот C#, Java, JavaScript и даже PHP с PowerShell - оказывается, ещё как могут! Слежу за развитием событий.

Oct. 29th, 2016

tux

Удалённое создание репозиториев Git

Век живи - век учись:
wget --user=USER --password=PASSWORD --auth-no-challenge \
    "https://api.github.com/user/repos" --post-data='{"name":"REPO_NAME"}'

Или:
curl -u 'USER:PASSWORD' https://api.github.com/user/repos -d'{"name":"REPO_NAME"}'


Sep. 14th, 2016

tux

Патчик для Artistic Style

Лежит тут.

Смысл: добавляет ключ (--attach-do-while-bracket), который не переносит while на новую строку. Без него, всегда:
do {
/* ... */
}
while(0);


После, при указании ключа:

do {
/* ... */
} while(0);


Патчил только линуксовые исходники, OsX и Windows не смотрел.

P.S. A Free, Fast, and Small Automatic Formatter for C, C++, C++/CLI, Objective‑C, C#, and Java Source Code.

Previous 10