Версія даної теми для друку

Натисніть сюди для перегляду даної теми у оригінальному форматі

Розподілені обчислення в Україні _ Софт _ учим Cи

Автор: A1ex01 Aug 27 2013, 23:12

сабж, а заодно и асм х86
пока меня интересуют консольные приложения(работа с бинарными файлами), остановился на gcc(именно си, а не си++) под линух(debian)

предлагаю тут кидать ссылки на интересные мануалы/примеры или просто постить примеры

(Show/Hide)


ну для начала "хелло... ", кудаж без него)
создаем файл hello.c (gedit, например)

#include <stdio.h>
int main()
{
printf("Hello ...!\n" );
return(0);
}

компильнуть- gcc hello.c
запустить файл ./a.out
кл-во байт под переменные:

#include<stdio.h>
/*size of variable types*/
int main()
{
printf("int=%d  short int=%d \n",  sizeof(int),  sizeof(short int));
printf("signed int=%d  unsigned int=%d \n",  sizeof(signed int),  sizeof(unsigned int));
printf("char=%d  unsigned char=%d \n",  sizeof(char),  sizeof(unsigned char));
return 0;
}


работа с файлами
(Show/Hide)


http://younglinux.info/c/fopen
http://www.codingunit.com/c-tutorial-binary-file-io
http://cppstudio.com/spravochnik/standartnye-zagolovochnye-fajly-iz-si-v-s/zagolovochnyj-fajl-cstdio-stdio-h/funkciya-fseek/

int fseek( FILE * filestream, long int offset, int origin ); Функция fseek перемещает указатель позиции в потоке
filestream Указатель на объект типа FILE, идентифицируемый поток, offset Количество байт для смещения, относительно некоторого положения указателя, origin Позиция указателя, относительно которой будет выполняться смещение. SEEK_SET -Начало файла, SEEK_CUR -Текущее положение файла, SEEK_END -Конец файла

http://books.google.com.ua/books?id=094tYob7ipQC(тут куча книг, омг))
под линух асм имеет чуть http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s3
https://developer.apple.com/technologies/mac/core.html для мак, http://www.agner.org/optimize/

мой черновик задачи №1(осталось допилить чуток)
(Show/Hide)

задача #1:
написать прогу для вычисления http://ru.wikipedia.org/wiki/SHA-2 для 64 байтовых блоков из входного файла и запись результата в другой файл
т.е. прочитал 64 байт, получил хеш, записал и так далее. На выходе файл будет в ~2 раза меньше исходного

#include <stdio.h>
unsigned long int rotr (unsigned long int a, char b)
{/* analog asm ror a,b */
    return ((a>>b)|(a<<(32-b)));
}

unsigned long int inFileSize=0, w[64], s0, s1;
int i, i2, readedBytes=0;
char readBuffer[64];

FILE *myFile, *myFile2;
unsigned long int a,b,c,d,e,f,g,h,t1,t2,sum0,sum1,Ma,Ch,k[64] ={
   0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
   0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
   0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC, 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
   0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
   0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
   0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
   0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
   0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2},
h0 = 0x6A09E667,
h1 = 0xBB67AE85,
h2 = 0x3C6EF372,
h3 = 0xA54FF53A,
h4 = 0x510E527F,
h5 = 0x9B05688C,
h6 = 0x1F83D9AB,
h7 = 0x5BE0CD19;

int main(int argc, char *argv[])
{
printf("input file name is '%s'\n", argv[1] );
if (argc==1) return(1);
myFile = fopen (argv[1], "rb");
myFile2 = fopen("out", "wb");
    
do
{
    fseek(myFile, inFileSize++*64, SEEK_SET);
    readedBytes=fread(readBuffer, 1, 64, myFile);
    printf("seek@=%d\n", inFileSize);
asm
(
    /* copy 16(10h) doubleWords from readBuffer[] to w[]*/
    "movl $0x10, %ecx\n\t"
    "leal readBuffer,%esi\n\t"
    "leal w,%edi\n\t"
    "cld\n\t"
    "rep movsl\n\t"
);
    for (i=16; i<64;i++)
{
    s0=rotr(w[i-15],7)^rotr(w[i-15],18)^(w[i-15]>>3);
    s1=rotr(w[i-2],17)^rotr(w[i-2],19)^(w[i-2]>>10);
    w[i]=w[i-16]+s0+w[i-7]+s1;
}
    a= h0;
    b= h1;
    c= h2;
    d= h3;
    e= h4;
    f= h5;
    g= h6;
    h= h7;

    for (i=0; i<64;i++)
{
    sum0=    rotr(a, 2)^rotr(a, 13)^rotr (a, 22);
    Ma=    (a &b)^(a &c)^(b &c);
    t2=    sum0 + Ma;
    sum1=    rotr(e, 6)^rotr(e, 11)^rotr(e, 25);
    Ch=    (e &f)^((~e) &g);
    t1=    h +sum1 +Ch +k[i] +w[i];

    h= g;
    g= f;
    f= e;
    e= d  +t1;
    d= c;
    c= b;
    b= a;
    a= t2 +t1;
}
    h0= h0 +a;
    h1= h1 +b;
    h2= h2 +c;
    h3= h3 +d;
    h4= h4 +e;
    h5= h5 +f;
    h6= h6 +g;
    h7= h7 +h;

    w[0]=h0;
    w[1]=h1;
    w[2]=h2;
    w[3]=h3;
    w[4]=h4;
    w[5]=h5;
    w[6]=h6;
    w[7]=h7;
    

    fwrite(w, 1, 8*4, myFile2);
}
while (readedBytes==64);

fclose(myFile2);
fclose(myFile);
printf("bytes readed last time=%d\n Total file size=%d\n", readedBytes,  --inFileSize*64+readedBytes);
return(0);
}


Автор: Rilian Aug 27 2013, 23:19

A1ex01, емае, учи Руби! Могу тебе мастер класс устроить в Киеве

http://learnxinyminutes.com/docs/c/

Автор: A1ex01 Aug 27 2013, 23:22

а чем руби лучше? (планирую постепенно подойти к опенЦл для видях +На будущее под боинк переводить проекты, может... )

по Си нагуглить можно кучу ссылок, предлагаю постить именно то, что сам заценил как полезное, понятное...

Автор: Rilian Aug 27 2013, 23:29

QUOTE(A1ex01 @ Aug 28 2013, 00:22) *

а чем руби лучше?

как минимум тем что на руби ты напишешь свой софт раз в 50 быстрее и качественнее

по поводу опенцл, тут да, все специфичнее. но это edge case smile.gif

Автор: tiss Aug 28 2013, 08:47

QUOTE(Rilian @ Aug 28 2013, 00:29) *

как минимум тем что на руби ты напишешь свой софт раз в 50 быстрее и качественнее


Руби это интерпретатор или есть с него компилятор?

Автор: arminV Aug 28 2013, 08:55

(A1ex01 @ Aug 28 2013, 00:12) *

пока меня интересуют консольные приложения(работа с бинарными файлами), остановился на gcc под линух

предлагаю тут кидать ссылки на интересные мануалы/примеры или просто постить примеры
(Show/Hide)


ну для начала "хелло... ", кудаж без него)

создаем файл hello.c
#include <stdio.h>
int main()
{
printf("Hello ...!\n" );
return(0);
}
компильнуть -gcc hello.c
запустить файл ./a.out


почему gcc и линукс?

Автор: A1ex01 Aug 28 2013, 09:21

gcc идет с любым линухом +повод привыкать к нему)

компильнуть под виндой потом не проблема, надеюсь

Автор: arminV Aug 28 2013, 10:40

В том-то и дело, что есть различия)
Как минимум, библиотеки могут не совпасть

Автор: Rilian Aug 28 2013, 10:44

http://eax.me/haskell-opengl/

Автор: A1ex01 Aug 28 2013, 10:53

спасибо, почитал, вот бы еще по openCl примеров(для компутинга на видяхах)...

Автор: LSA Aug 28 2013, 11:17

http://habrahabr.ru/post/73526/

Автор: eugeny Aug 30 2013, 10:07

Я в лихих 90-х в школе учил по этой книге: worthy.gif

(Show/Hide)


Автор: Rilian Sep 1 2013, 17:11

статья которую надо читать перед написанием нового проекта http://habrahabr.ru/post/117193/

и закинуть такие справочники подальше smile.gif

Автор: tiss Sep 1 2013, 20:30

QUOTE(Rilian @ Sep 1 2013, 18:11) *

статья которую надо читать перед написанием нового проекта http://habrahabr.ru/post/117193/


Удод он. Типичное мышление прикладного программиста с большим похуизмом на конечного пользователя.

Автор: Rilian Sep 1 2013, 20:45

tiss, объясни ?

Автор: A1ex01 Sep 1 2013, 23:00

(Rilian @ Sep 1 2013, 18:11) *

статья которую надо читать перед написанием нового проекта http://habrahabr.ru/post/117193/

и закинуть такие справочники подальше smile.gif

1) пользы по ссылке мало
2) какие справочники? и где взять лучше?

задача #1:
написать прогу для вычисления http://ru.wikipedia.org/wiki/SHA-2 для 64 байтовых блоков из входного файла и запись результата в другой файл
т.е. прочитал 64 байт, получил хеш, записал и так далее. На выходе файл будет в ~2 раза меньше исходного
смогеш?)

up:
условия уточнил, 512bit (SHA-256), а не байт, что равно 64байт

Автор: Rilian Sep 1 2013, 23:10

QUOTE(A1ex01 @ Sep 2 2013, 00:00) *

какие справочники? и где взять лучше?

смысл в статье в том что ЩЯС куча современных методологий и бест-практисов, а также библиотек для решения практически всех распространенных задач. И совет не изобретать велосипеды и думать что ты умнее компилятора

---
По теме, каков объем исходных данных ?

Автор: A1ex01 Sep 1 2013, 23:15

(Rilian @ Sep 2 2013, 00:10) *


---
По теме, каков объем исходных данных ?

анлим) (0,1-100Гига)
можно начать с Килобайт (Кибибайт)

ап:
также интересует как у http://ru.wikibooks.org/wiki/Ruby/Подробнее_о_числах с битовым вращением? на си можно вставить asm rol/ror eax,ecx...

Автор: Rilian Sep 2 2013, 00:00

QUOTE(A1ex01 @ Sep 2 2013, 00:15) *

QUOTE(Rilian @ Sep 2 2013, 00:10) *


---
По теме, каков объем исходных данных ?

анлим) (0,1-100Гига)
можно начать с Килобайт (Кибибайт)

ап:
также интересует как у http://ru.wikibooks.org/wiki/Ruby/Подробнее_о_числах с битовым вращением? на си можно вставить asm rol/ror eax,ecx...

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

для потоковой обработки руби/питон тебе не поможет. Парсинг входящих бинарных данных на С это довольно простая задача

я почему спрашиваю, потому что посчитать данные это одно дело, а вот использовать их эффективно - совсем другое

если тебе надо рейнбоу тейбл то сразу задумайся о структуре для хранения и поиска

Автор: A1ex01 Sep 2 2013, 11:15

(Rilian @ Aug 28 2013, 00:19) *

A1ex01, емае, учи Руби! Могу тебе мастер класс устроить в Киеве
(Rilian @ Sep 2 2013, 01:00) *

для потоковой обработки руби/питон тебе не поможет. Парсинг входящих бинарных данных на С это довольно простая задача

Рилиан, ты бы в тему въехал сначала, а потом советы))

Автор: Rilian Sep 2 2013, 13:49

обычно ядро обработки пишется на чем-то низкоуровневом, а все остальное например на руби для удобства работы и запуска этих самых низкоуровневых обработчиков

например, тебе надо будет данные брать из сети. Это удобнее сделать на Руби чем на С. Иначе 99% времени будешь бороться с утечками памяти, вместо решения задачи

Автор: whynot Sep 7 2013, 21:34

QUOTE(A1ex01 @ Sep 2 2013, 00:00) *

смогеш?)


легко

CODE

    perl -MDigest -we '
    $aa=Digest->new("SHA-256");
    while(read STDIN,$ab,64){ $aa->add($ab); print $aa->b64digest,"\n" }'


Подвернул для читаемости. Отдавал в base64, потому что когда бинарное сыпется в терминал, то становится совершенно не смешно.


Автор: A1ex01 Sep 8 2013, 15:46

лепота)
теперь задача№2
модифицировать код так, чтобы из файла2 можно было получить файл1

Автор: Alien Sep 8 2013, 15:56

как насчет сделать аналогичную тему по питончику? кто у нас в нем спец? =)

Автор: Waterfall Sep 11 2013, 16:47

Вам усім, по-моєму, краще сюди http://viknaodessa.od.ua/news/?news=78591 rtfm.gif rilian.gif

Автор: whynot Sep 15 2013, 20:15

QUOTE(A1ex01 @ Sep 8 2013, 16:46) *

модифицировать код так, чтобы из файла2 можно было получить файл1


Использование глагола "модифицировать" наводит на подозрение, что ТС неадкватно представляет себе задачу.
Вместе с тем, это, конечно, не было легко, но так, "задача на одну трубку":

CODE

perl -MDigest -we '
$aa=Digest->new("SHA-256");
%ac=();$ad=0;
while( $ab=STDIN->getline ){
  chomp $ab;
  $ac{$ab} = [$ad++] }
@ae=((0)x64);
while(1){
  $af=pack "C*",@ae;
  $ag=$aa->add($af)->b64digest;
  exists $ac{$ag} or next;
  push @{$ac{$ag}},$af;
  @{$ac{$ag}}>2 and die "CLASH!: $ag @ae\n";
  print "found: $ag\n";
  keys %ac == grep(@{$ac{$_}}==2,keys %ac) and last }
continue{
  $ae[0]++;
  $ad=0;
  while($ae[$ad]==256){$ae[$ad]=0;$ae[++$ad]++}
  @ae==65 and die "BUSTED!\n";
  printf "\r[%3i]", $ad }
foreach $ad (sort{$a->[0]<=>$b->[0]} values %ac){
  print $ad->[1] }'


Отличия от ТЗ: на вход принимаются base64 encoded, newline terminated строки.
Глюкало мне не нравится;
лучшим решением было бы писать развернутый буфер в STDERR (перенаправленный в /dev/null, ессно, а то будет больно) и лет через этак 200 подсмотреть в этом самом STDERR как далеко ушли.

p.s. 200 лет это если использовать не стоковый Digest::SHA, а какой-нибудь XS на либу, которая считает на какой-нибудь Tesla.

p.p.s. Проверять работоспособность, может быть, можно только на специально подготовленном входе.
Очевидно, проверять на произвольном -- у меня есть лучшее применение циклам.

p.p.p.s. http://www.tomshardware.com/reviews/wireless-security-hack,2981-9.html.

Автор: A1ex01 Sep 16 2013, 15:28

(whynot @ Sep 15 2013, 21:15) *

Использование глагола "модифицировать" наводит на подозрение, что ТС неадкватно представляет себе задачу.

улыбнуло, всегда же можно уточнить непонятки...
задача№1 -это архиватор на базе sha2, поэтому предложил его(sha2) модифицировать для возможности обратной распаковки филе2, всего лишь...

Invision Power Board
© Invision Power Services