Aktualności:

Nowy polski projekt BOINC - Universe@Home

Menu główne

To co? Bawimy się? :D

Zaczęty przez mariotti, 24 Maj 2013, 17:01

krzyszp

To, że w Stanach są kontrowersje, to mnie nie dziwi - ich prawodawstwo jest chore...

Jedno jest pewne - jeśli serwer chodzi u Ciebie i nie includujesz jego bibliotek w swoim progsie, to masz pełne prawo komercyjnie soft rozprowadzać. Wiem, bo konsultowałem się z prawnikiem na ten temat, gdyż soft mojej firmy tak działa...

Fajne zegarki :)
Należę do drużyny BOINC@Poland
 Moja wizytówka

Dario666

Wg licencji GNU GPL, jeśli chcesz korzystać w swoim programie z oprogramowania będącego na takiej licencji to twój program też musi być na licencji GPL. Tak więc musisz udostępnić żródła tego programu. Chyba, że jest oprogramowanie bazowe jest na licencji LGPL, ale tu głównie chodzi o biblioteki dołączanie dynamiczne...

CytatPodobnie nie jest dla mnie oczywiste kiedy dochodzi do publikacji utworu, a kiedy nie, np.
czy prezentacja wyników w htmlu na stronie www jest już publikacją czy nie jest?

Jeśli twój program działa jako strona WWW to jest to publikacja, a jeśli tylko jest to pokazanie jego możliwości to nie jest to publikowanie.

krzyszp

Dario, wyraziłeś się nieprecyzyjnie...

Założenie jest takie, że dopóki nie załączasz kodu źródłowego lub wynikowego programu objętego licencją GPL do swojego programu, również poprzez linkowanie statyczne oraz nie rozprowadzasz żadnej części tego kodu wraz z Twoim, to nie podlegasz pod postanowienia tej licencji...
1. Czyli, jeżeli stawiasz u siebie serwer MySQL, a twój program się z nim łączy - wszystko jest ok, nie musisz udostępniać źródeł.
2. Wypadek jak wyżej, ale Twoj program wykorzysztuje np. mysql_connector includowany w kodzie - w tym momencie podlegasz pod GPL i musisz udostępnić kod.

Dodam, że nic nie stoi na przeszkodzie, abyś w OBYDWU przypadkach sprzedawał swój program (a nawet serwer MySQL), ale w drugim przypadku masz OBOWIĄZEK udostępnić klientowi kod źródłowy i Twój program automatycznie jest wtedy na licencji GPL.

Fajne zegarki :)
Należę do drużyny BOINC@Poland
 Moja wizytówka

mariotti

#203
Cytat: krzyszp w 07 Czerwiec 2013, 18:11
Założenie jest takie, że dopóki nie załączasz kodu źródłowego lub wynikowego programu objętego licencją GPL do swojego programu, również poprzez linkowanie statyczne oraz nie rozprowadzasz żadnej części tego kodu wraz z Twoim, to nie podlegasz pod postanowienia tej licencji...
Dzięki za wyjaśnienia :)

Cytat: krzyszp w 07 Czerwiec 2013, 18:11
Dodam, że nic nie stoi na przeszkodzie, abyś w OBYDWU przypadkach sprzedawał swój program (a nawet serwer MySQL), ale w drugim przypadku masz OBOWIĄZEK udostępnić klientowi kod źródłowy i Twój program automatycznie jest wtedy na licencji GPL.
Zgadza się. Tego faktu do niedawna nie wiedziałem, gdyż kilka osób powtórzyło mi
zgodnie, że nie można sprzedawać. Nie wiem dlaczego ten mit się tak łatwo
rozpowszechnił.

Pozdrawiam

Dario666

Ja bym się z tym nie zgodził. W licencji GPL jest informacja, że programu takiego nie można sprzedawać, bo wtedy nie jest już to "wolne oprogramowanie" tylko komercyjne. Na to pozwala tylko licencja BSD lub X11.

krzyszp

Cytat: Dario666 w 08 Czerwiec 2013, 19:54
Ja bym się z tym nie zgodził. W licencji GPL jest informacja, że programu takiego nie można sprzedawać, bo wtedy nie jest już to "wolne oprogramowanie" tylko komercyjne.
Sorry, ale bzdury opowiadasz ;)

Nie ma zapisu o zakazie sprzedaży w żadnej wersji GPL. "Wolne" oznacza "wolne źródła", a nie "darmowe" - "free as 'freedom' not as 'free beer'".

Fajne zegarki :)
Należę do drużyny BOINC@Poland
 Moja wizytówka

Dario666

To podaj program na licencji GPL za który trzeba zapłacić.

krzyszp

Cytat: Dario666 w 08 Czerwiec 2013, 22:35
To podaj program na licencji GPL za który trzeba zapłacić.
Red Hat Enterprise :)

Edit:

Dla rozrywki odbiję też piłeczkę - podaj paragraf licencji GPL (obojętnie której wersji) w którym jest napisane, że NIE MOŻESZ sprzedawać programu na licencji GPL...

Fajne zegarki :)
Należę do drużyny BOINC@Poland
 Moja wizytówka

mariotti

#208
Cytat: Dario666 w 08 Czerwiec 2013, 19:54
Ja bym się z tym nie zgodził. W licencji GPL jest informacja, że programu takiego nie można sprzedawać, bo wtedy nie jest już to "wolne oprogramowanie" tylko komercyjne. Na to pozwala tylko licencja BSD lub X11.
W GPL jest coś w rodzaju "obojętnie czy sprzedajesz czy udostępniasz za darmo" -
dla mnie to znaczy że licencja GPL może dotyczyć zarówno programów komercyjnych jak i
darmowych. GPL głównie ma na celu:
- unikanie odpowiedzialności przez programistów za ewentualne błędy w programach
- zapewnienie klientom dostępu do źródeł, chociażby w celu update gdy autor się wypnie
- zabezpieczenie autorom praw autorskich do wszystkich fragmentów kodu które
  utworzyli; nie można wziąć programu na GPL i go sprzedać/dać komuś wprowadzając
  tego kogoś w błąd, że ktoś inny (np. sprzedający) jest autorem.
O zakazie sprzedaży w licencji nic nie ma, a wielu ludzi twierdzi że nie można
sprzedawać - nie wiem czemu bo to jest jasne. Zagmatwane jest określenie "utwory zależne".
Całkiem sensowną interpretację podał:
Cytat: krzyszp w 07 Czerwiec 2013, 18:11
Założenie jest takie, że dopóki nie załączasz kodu źródłowego lub wynikowego programu objętego licencją GPL do swojego programu, również poprzez linkowanie statyczne oraz nie rozprowadzasz żadnej części tego kodu wraz z Twoim, to nie podlegasz pod postanowienia tej licencji...
Aby mieć absolutną pewność, to najlepiej jeszcze poprosić prawnika o kilka wyroków w
sprawach sądowych. Ja takich wyroków na razie nie widziałem, ale też nigdy nie starałem
się ich znaleźć.
Pozdrawiam

P.S.
Może zamieszanie spowodowanie jest tym, że nie można sprzedawać źródeł programu, za źródła
można pobierać opłatę nie większą niż cena nośnika.

krzyszp

Masz rację, a  jednocześnie się mylisz :)

1. Były już sprawy sądowe dotyczące programów GPL - walczyła o to FSF (http://di.com.pl/news/20805,0,Skype_nie_uwolnil_sie_od_warunkow_GPL.html - jeden przykład, http://gpl-violations.org/).
2. Wolno sprzedawać kod (zarówno źródła jak i kod wynikowy) na licencji GPL:
a) po cenie nośnika, jeśli kod nie jest Twój;
b) w dowolnej cenie, jeśli jesteś choćby w części autorem kodu - zwróć uwagę na ceny wspomnianego przeze mnie Red Hat'a ;)

Komercyjna sprzedaż programów na licencji GPL jest rzadkością, gdyż jest bardzo trudne - raz sprzedany program szybko powoduje "wyciek" kodu, który nabywca może (i zwykle to robi) udostępnić za darmo. Np. w przypadku Red Hat'a robią to twórcy CentOS'a, który jest klonem tego systemu i tylko branding ma zmieniony ze względu na fakt, że nazwa i logotyp Red Hat są zastrzeżonymi znakami towarowymi.

Fajne zegarki :)
Należę do drużyny BOINC@Poland
 Moja wizytówka

mariotti

Cytat: krzyszp w 09 Czerwiec 2013, 09:35
Masz rację, a  jednocześnie się mylisz :)
Hmmm

Cytat: krzyszp w 09 Czerwiec 2013, 09:35
1. Były już sprawy sądowe dotyczące programów GPL - walczyła o to FSF (http://di.com.pl/news/20805,0,Skype_nie_uwolnil_sie_od_warunkow_GPL.html - jeden przykład, http://gpl-violations.org/).
Może wyraziłem się niezbyt jasno. Więc jeszcze raz: na pewno nie chodzi mi o to, że jest
sprawą dyskusyjną, czy trzeba załączać treść licencji czy nie - a ta sprawa sądowa była głównie o to.
Licencję trzeba załączyć, więc sprawę mogli przegrać już o to. Podobnie na życzenie klienta
trzeba udostępnić kod. Z materiału w tym artykule wynika że nie postarali się o udostępnienie. To
wszystko we mnie też nie wywołuje żadnych wątpliwości. Więc ta sprawa sądowa dotyczy czegoś
innego niż mojego zmartwienia :)


Cytat: krzyszp w 09 Czerwiec 2013, 09:35
2. Wolno sprzedawać kod (zarówno źródła jak i kod wynikowy) na licencji GPL:
a) po cenie nośnika, jeśli kod nie jest Twój;
O to samo mi chodziło, chyba znowu coś napisałem niezrozumiale :)


Cytat: krzyszp w 09 Czerwiec 2013, 09:35
b) w dowolnej cenie, jeśli jesteś choćby w części autorem kodu - zwróć uwagę na ceny
wspomnianego przeze mnie Red Hat'a ;)
Jeśli produkt opublikowaliśmy, to nie możemy sprzedać źródeł po cenie wyższej niż cena
nośnika ( nie mam pewności czy można wziąć pieniądze za cenę opakowania i koszty
dostarczenia jeśli wysyła się kurierem albo pocztą  - ale to mało ważne ). Natomiast
jeśli produktu nie opublikowaliśmy, to licencja, w sensie wynikających z niej
obowiązków, nie obowiązuje - mamy tylko same prawa z niej płynące.


Cytat: krzyszp w 09 Czerwiec 2013, 09:35
Komercyjna sprzedaż programów na licencji GPL jest rzadkością, gdyż jest bardzo trudne - raz sprzedany program szybko powoduje "wyciek" kodu, który nabywca może (i zwykle to robi) udostępnić za darmo. Np. w przypadku Red Hat'a robią to twórcy CentOS'a, który jest klonem tego systemu i tylko branding ma zmieniony ze względu na fakt, że nazwa i logotyp Red Hat są zastrzeżonymi znakami towarowymi.
Osobiście nie mam rzetelnych danych na ten temat, ale byłem kilka razy
przekonywany, że nie jest rzadkością, chociażby dlatego że zbudowanie aplikacji
ze źródeł może być trudne. Drugim powodem przemawiającym za tym że
często dochodzi do sprzedaży na licencji GPL, może być to że klientom jednak nie
zależy na dalszym udostępnianiu kodu - więc po kupieniu zatrzymują kod dla
siebie.

Tak czy inaczej, ja widzę że się zgadzamy co do najważniejszych faktów :)

Moje zmartwienia polegają na czymś innym. Mianowicie na tym, że
nie wiem jak w sprawach sądowych były interpretowane dwa określenie. Po
pierwsze jak sądy wyznaczają granicę pomiędzy tym co  opublikowanie a nieopublikowane.
Po drugie jak sądy wyznaczają granicę pomiędzy tym co jest utworem zależnym a
utworem niezależnym. Przeczytałem to co napisałeś kilka postów wyżej na
temat utworów zależnych i zrozumiałem. Chodzi mi o to, że nie znam spraw sądowych
w których spierano się o to, czy utwór jest zależny czy nie jest zależny. I tak samo
względem publikacji. W jakich sprawach spierano się o to, czy utwór był już publikowany
czy też nie.

Pozdrawiam :)

krzyszp

Wydaje mi się, że kwestia tego, czy utwór był opublikowany jest dość prosta - jeśli dany utwór został choć w jednym egzemplarzu sprzedany/oddany to uznaje się za opublikowany.
Warto wspomnieć, że nie musisz w takim przypadku udostępniać kodu wszystkim - masz ten obowiązek tylko w stosunku do osoby, której kod udostępniłeś!

Natomiast spraw sądowych o to jest faktycznie mało, gdyż firmy "przyłapane" na rozpowszechnianiu utworu objętego GPL a nie udostępniające kodu źródłowego zazwyczaj (w 99,9% przypadków) po upomnieniu i zagrożeniu procesem przez FSF (gpl-violations) po prostu udostępniają kod - tak było np. w przypadku MS i (chyba) narzędzia USB Download Tool.

Natomiast, co do utworów zależnych, to faktycznie jest to trochę bardziej skomplikowane. Na własny użytek, mam własny sposób.

Moje programy korzystają z narzędzia (biblioteki) VBMySQLDirect* objętej licencją GPL, ale nie załączam jej w swoich programach. Po prostu informuję klienta, że taką bibliotekę musi samodzielnie zainstalować u siebie.
Generalnie, jeżeli nie pomyliłem terminów, to można bez problemów odwoływać się do takich bibliotek, ale nie można ich linkować statycznie.

*VBMySQLDirect oferuje do 100x szybszego połączenia z MySQL niż biblioteki z Oracle - sprawdziłem to eksperymentalnie na dużych bazach...

Fajne zegarki :)
Należę do drużyny BOINC@Poland
 Moja wizytówka

Rysiu

Serwer BOINC można spokojnie stawiać na MySQL.

Co do includowania bibliotek MySQL to przecież w aplikacji liczącej nic takiego nie powinno być dodawane. Mamy więc problem z głowy.

Ogólnie dyskusja zeszła na trochę inny temat.

mariotti

Cytat: krzyszp w 09 Czerwiec 2013, 10:42
Wydaje mi się, że kwestia tego, czy utwór był opublikowany jest dość prosta - jeśli dany utwór został choć w jednym egzemplarzu sprzedany/oddany to uznaje się za opublikowany.
Niepokoją mnie te wszelkie zastosowania w których bezpośrednio publikowane są wyniki
działania aplikacji, a nie sama aplikacja. Przykładowo można na nośniku udostępniać
tylko aplikację kliencką która zaprezentuje wyniki działania serwera. Jednak cały utwór to
komplet: serwer i klient. Gdy serwer nie opuszcza mojego lub wynajmowanego przeze mnie
komputera, to wydaje się, że źródeł serwera nie muszę udostępniać - choćby był zależny od
oprogramowania GPL - ale pewności nie mam.

Cytat: krzyszp w 09 Czerwiec 2013, 10:42
Warto wspomnieć, że nie musisz w takim przypadku udostępniać kodu wszystkim - masz ten obowiązek tylko w stosunku do osoby, której kod udostępniłeś!
Tak też i ja rozumiem GPL - dlatego pisałem o takiej możliwości, w której nikt z wąskiego grona klientów
nie rozpowszechni kodu źródłowego dalej.


Cytat: krzyszp w 09 Czerwiec 2013, 10:42
Natomiast spraw sądowych o to jest faktycznie mało, gdyż firmy "przyłapane" na rozpowszechnianiu utworu objętego GPL a nie udostępniające kodu źródłowego zazwyczaj (w 99,9% przypadków) po upomnieniu i zagrożeniu procesem przez FSF (gpl-violations) po prostu udostępniają kod - tak było np. w przypadku MS i (chyba) narzędzia USB Download Tool.
Jeśli firmy nie zdecydowały się wejść na drogę sądową, to też dużo mówi, dużo więcej
niż opinia prawnika postawiona na bazie samej znajomości prawa. Chodzi po prosto o te
wszystkie sporne sytuacje, gdy ktoś uważał że utwór już był opublikowany, a
ktoś inny że jeszcze nie był i to samo względem zależności.


Cytat: krzyszp w 09 Czerwiec 2013, 10:42
Natomiast, co do utworów zależnych, to faktycznie jest to trochę bardziej skomplikowane. Na własny użytek, mam własny sposób.
Moje programy korzystają z narzędzia (biblioteki) VBMySQLDirect* objętej licencją GPL, ale nie załączam jej w swoich programach. Po prostu informuję klienta, że taką bibliotekę musi samodzielnie zainstalować u siebie.
Generalnie, jeżeli nie pomyliłem terminów, to można bez problemów odwoływać się do takich bibliotek, ale nie można ich linkować statycznie.
Chyba masz rację, ja myślę tak samo.


Cytat: krzyszp w 09 Czerwiec 2013, 10:42
*VBMySQLDirect oferuje do 100x szybszego połączenia z MySQL niż biblioteki z Oracle - sprawdziłem to eksperymentalnie na dużych bazach...
Sto razy to bardzo dużo.


Pozdrawiam

mariotti

Cytat: Rysiu w 09 Czerwiec 2013, 11:27
Serwer BOINC można spokojnie stawiać na MySQL.
Co do includowania bibliotek MySQL to przecież w aplikacji liczącej nic takiego nie powinno być dodawane. Mamy więc problem z głowy.
Ogólnie dyskusja zeszła na trochę inny temat.
BOINC jest na licencji LGPL i korzysta z MySQL który jest na licencji GPL - tego
to już zupełnie nie rozumiem :) Przecież licencja GPL jest licencją wirusową, więc
BOINC też powinien być na licencji GPL. Czyżby sposób w jaki korzysta z MySQL
nie powodował, że w myśl licencji GPL jest utworem zależnym?

Może dyskusja zeszła na inny temat, ale oprogramowanie BOINC jest w jakimś
stopniu zależne od GPL i LGPL - więc warto dokładnie wiedzieć jakie mamy
prawa i obowiązki.

Pozdrawiam

krzyszp

Cytat: mariotti w 09 Czerwiec 2013, 11:35
Cytat: krzyszp w 09 Czerwiec 2013, 10:42
Wydaje mi się, że kwestia tego, czy utwór był opublikowany jest dość prosta - jeśli dany utwór został choć w jednym egzemplarzu sprzedany/oddany to uznaje się za opublikowany.
Niepokoją mnie te wszelkie zastosowania w których bezpośrednio publikowane są wyniki
działania aplikacji, a nie sama aplikacja. Przykładowo można na nośniku udostępniać
tylko aplikację kliencką która zaprezentuje wyniki działania serwera. Jednak cały utwór to
komplet: serwer i klient. Gdy serwer nie opuszcza mojego lub wynajmowanego przeze mnie
komputera, to wydaje się, że źródeł serwera nie muszę udostępniać - choćby był zależny od
oprogramowania GPL - ale pewności nie mam.
To możesz mieć pewność ;)

Jak rozumiem, sytuacja jest taka, że serwer projektu (baza danych, czy cokolwiek innego) działa na oprogramowaniu GPL (Apache, MySQL, itd) natomiast Twój program ma być zamknięto-źródłowy, tak?
W takim razie, o ile nie załączasz do klienta żadnych bibliotek objętych licencją GPL (a ja nie widzę w tym przypadku takiej potrzeby) to nie musisz udostępniać swoich źródeł. Dodatkowo, możesz dowolnie modyfikować oprogramowanie na serwerze i również nie ma konieczności udostępniania źródeł (wszak nie udostępniasz kodu serwera).

Reasumując -spokojnie możesz zamknąć źródła.
Domyślam się, że chcesz chronić swój algorytm?

Serwer BOINC korzysta z MySQL, ale go nie zawiera - zachodzi tutaj taka sama sytuacja jak w przypadku mojego oprogramowania (sam doinstalowujesz, czyli "zaopatrujesz" się w MySQL).

Fajne zegarki :)
Należę do drużyny BOINC@Poland
 Moja wizytówka

mariotti

Cytat: krzyszp w 09 Czerwiec 2013, 11:45
To możesz mieć pewność ;)
OK :)

Cytat: krzyszp w 09 Czerwiec 2013, 11:45
Reasumując -spokojnie możesz zamknąć źródła.
Domyślam się, że chcesz chronić swój algorytm?
Jeśli chodzi o algorytmy we wszelkich projektach związanych z szachami, to zawsze
"chroniłem" je przez około 2-3 lata, potem udostępniałem wszystko za darmo i zupełnie
bez żadnych ograniczeń - tak samo będzie w tym projekcie. Spowodowane jest to tym,
że czasami na różnych imprezach, mogę zostać poproszony o udowodnienie że jestem
autorem, a jest trochę trudniej gdy można fragmenty kodu wygooglać :)

Raczej wybiegłem myślami w przyszłość. Co jakbym kiedyś miał dla kogoś napisać
jakiś algorytm w środowisku BOINC i ten ktoś chciałby żeby kod został zamknięty?

Cytat: krzyszp w 09 Czerwiec 2013, 11:45
Serwer BOINC korzysta z MySQL, ale go nie zawiera - zachodzi tutaj taka sama sytuacja jak w przypadku mojego oprogramowania (sam doinstalowujesz, czyli "zaopatrujesz" się w MySQL).
Ok.

Dzięki i pozdrawiam

mariotti

Wróćmy do problemów technicznych....

No więc często gdy coś czytam, to napotykam w opisach archaiczne
wersje systemów, narzędzi i kompilatorów - co napawa mnie przerażeniem.

Przykładowo na tej stronie:
http://www.spy-hill.net/myers/help/boinc/boinc-on-linux.html
mamy problem kompilatora gcc-2.9, a u mnie na kompie jest
kompilator w wersji 4.6.1, pomimo że nigdy u siebie go nie
aktualizowałem.

Podobnie, spotkałem się już kilkakrotnie z informacją, że BOINC z systemu CSV
przeszedł na SVN, a tymczasem BOINC do kontroli wersji wykorzystuje już  GIT -
i to wszystko napisane nie w moim ojczystym języku - co będzie dalej to
już sobie wyobrażam :)

Pozdrawiam

mariotti

Cytat: mariotti w 09 Czerwiec 2013, 12:41
i to wszystko napisane nie w moim ojczystym języku - co będzie dalej to
już sobie wyobrażam :)

No i sobie wyobraziłem ;)


delete_file.cpp:40:25: fatal error: svn_version.h: Nie ma takiego pliku ani katalogu
compilation terminated.
make[1]: *** [delete_file.o] Błąd 1
make[1]: Opuszczenie katalogu `/home/x/Dokumenty/c/boinc_repo/sched'
make: *** [all-recursive] Błąd 1


Ciekawe co to za błąd i jak sobie z nim poradzić.

Pozdrawiam


krzyszp

Brak pliku svn_version.h?

Fajne zegarki :)
Należę do drużyny BOINC@Poland
 Moja wizytówka

mariotti

Cytat: krzyszp w 09 Czerwiec 2013, 13:57
Brak pliku svn_version.h?
To na pewno. Pytanie dlaczego go nie ma, skoro ściągnąłem świeżą
wersję z gita. Może tutorial przestarzały... Odpaliłem jeszcze raz, tym razem samo
"make" bez tych parametrów które podają w tutorialu i zakończyło się bez
błędów.

Teraz próbuje opanować skrypt make_project.

Pozdrawiam

mariotti

Cytat: mariotti w 09 Czerwiec 2013, 14:04
Teraz próbuje opanować skrypt make_project.

Coś zrobiłem... nie do końca wiem co :)


./make_project --delete_prev_inst --drop_db_first --project_root /home/x/boinc_test_0 --db_host localhost --db_user xxxx --db_passwd xxxx boinc_test_0
Creating project 'boinc_test_0' (short name 'boinc_test_0'):
   PROJECT_ROOT = /home/x/boinc_test_0/
       URL_BASE = http://localhost6.localdomain6/
  HTML_USER_URL = http://localhost6.localdomain6/boinc_test_0/
   HTML_OPS_URL = http://localhost6.localdomain6/boinc_test_0_ops/
        KEY_DIR = /home/x/boinc_test_0/keys/
        DB_NAME = boinc_test_0
        DB_HOST = localhost

Delete /home/x/boinc_test_0/? [y/N]  y
Deleting /home/x/boinc_test_0/

Continue? [Y/n]  y
Creating directories
Generating encryption keys
Copying files
Setting up database
Writing config files
Linking CGI programs
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php5/20090626/mcrypt.so' - /usr/lib/php5/20090626/mcrypt.so: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php5/20090626/mcrypt.so' - /usr/lib/php5/20090626/mcrypt.so: cannot open shared object file: No such file or directory in Unknown on line 0
update_translations finished
Done installing default daemons.

Done creating project.  Please view
/home/x/boinc_test_0/boinc_test_0.readme
for important additional instructions.


Tak jakby zabrakło pliku: /usr/lib/php5/20090626/mcrypt.so. Ciekawe czemu akurat
w takim podkatalogu go szuka? Tak oznaczają wersje czy co?

Niemniej coś działa .Nie bardzo wiem co działa, ale działa :)
Wpisałem w przeglądarkę sugerowany url:
http://localhost6.localdomain6/
i mam:

It works!
This is the default web page for this server.
The web server software is running but no content has been added, yet.


Nie widzę odpowiednich zmian w plikach konfiguracyjnych apache... a stronę
podał - masakra jakaś.

Pozdrawiam

krzyszp

mcrypt nie jest czasami używany do generowania sum kontrolnych plików?

Fajne zegarki :)
Należę do drużyny BOINC@Poland
 Moja wizytówka

mariotti

Cytat: krzyszp w 09 Czerwiec 2013, 14:39
mcrypt nie jest czasami używany do generowania sum kontrolnych plików?

Coś w tym rodzaju :)
http://www.php.net/manual/en/intro.mcrypt.php
Nigdy tego nie używałem, przynajmniej świadomie :)

Pozdrawiam

mariotti

Poczytałem sobie instrukcję konfiguracji web-serwera:
http://www.spy-hill.net/myers/help/boinc/httpd-conf.html

Nie wiem czy zrozumiałem, wydaje mi się, że większość tak. Jednak
nie piszę dlatego żeby poinformować o tym że czytałem. Dochodzę
do wniosku, że ktoś kto nie miał wcześniej do czynienia z konfiguracją
web-serwera nie jest w stanie  zrozumieć tej instrukcji. Ja miałem
takie doświadczenia, ale raczej w małym stopniu.

Ogólny wniosek z tego jest taki, że do postawienia serwera
BOINC  trzeba się znać na... chyba na wszystkim.

Po pierwsze trzeba się znać na:
a) danym zagadnieniu które chce się policzyć
b) programowaniu rozproszonym i optymalizacji w programowaniu rozproszonym
c) programowaniu niskopoziomowym i optymalizacji kodu (jakiś C/C++/Fortran/Asembler/CUDA i konkurencja/MMX i spółka/itd)

Po drugie:
a) konfiguracji systemu Linux, zwłaszcza na zabezpieczeniach, instalacji, konfiguracji pakietów oprogramowania, itd
b) konfiguracji webserwera, konkretnie Apache
c) konfiguracji mysql
d) języku SQL
e) języku PHP, HTML, JavaScript i co tam jeszcze potrzebne do robienia aplikacji webowych
f) znajomość takich drobiazgów jak język xml czy skrypty powłoki też nie zawadzi

Dopiero wtedy można:
a) poznać i skonfigurować samo środowisko
b) nauczyć się frameworków i API dla C/C++/PHP - aby to było możliwe raczej trzeba mieć doświadczenia w innych frameworkach
c) napisać aplikację serwerową
d) napisać aplikację kliencką pod każdy system "osobno" - w cudzysłowie, bo czasami można pisać przenośnie.

Trzeba jeszcze dobrze czytać po angielsku i domyślać się co w opisach i tutorialach jest już nieaktualne :)

Gdy zaczynałem, to myślałem że jest to takie środowisko, do którego może przysiąść zupełnie każdy
programista, nawet z małym doświadczeniem. Tymczasem zakres zagadnień na których trzeba się
chociaż w średnim stopniu znać jest spory. Nie chcę w ten sposób powiedzieć że się wycofuję ani nic
podobnego. Chodzi mi o to,  że środowisko do obliczeń rozproszonych wykorzystywane na tak wielką skalę,
powinno być już dawno przez kogoś lepiej zintegrowane. Właśnie to powinno wyglądać tak, że ktoś
instaluje jakiś pakiet softu i po prostu pisze kod serwera i klienta. Przecież takie zintegrowanie jest
jak najbardziej możliwe - choć bardzo pracochłonne, ale doprowadzenie BOINC do takiego stanu w
jakim jest obecnie, też było pracochłonne.

Pozdrawiam

mariotti

Kontynuując...

Próbowałem kilka razy utworzyć projekt przy pomocy skryptu 'make_project'.
Wciąż były takie lub inne problemy, ale w końcu się udało. Dodałem lokalną
sub-domenę do DNS, wygenerowałem hasła dla operatora projektu i widzę
dwie strony: jedną dla użytkowników, drugą dla operatorów.

Trochę mnie dziwi że na stronie nie ma nazwy projektu, trzeba nazwę nadać przy
pomocy jakiegoś 'Project Management' - nie mam bladego pojęcia czy to jakiś program,
czy jakiś dział na tej stronie dla operatorów... Pewnie za jakiś czas się wyjaśni.
Trochę tylko głupio że make_projekt nie nadaje nazwy, skoro ją pobiera jako
parametr.

Ogólnie ciężkie to wszystko. Gdy się wejdzie na stronę dla operatorów to pełno
jakiś opcji, na razie nie mam bladego pojęcia do czego one są. Baza danych
pustego projektu BOINC ma 36 tabel. Oczywiście to nie zawsze jest miarodajne,
ale gdy aplikacja ma 8 tabel, to już może być całkiem skomplikowaną aplikacją.

No ale cóż... będzie trzeba przez to wszystko w bólu przebrnąć... Dobrze że
chociaż witryny projektu działają :D

Pozdrawiam





krzyszp

Baza danych Magento ~360 tabel.
Program do prowadzenia działalności gospodarczej (bez księgowości) - ~70tablel
Mój najbardziej rozbudowany program - 175 tabel.

Im bardziej optymalizujesz zapis informacji w bazie (poprzez atomizację), tym większa ilość tabel powstaje, a przynajmniej tak wynika z mojej praktyki...

Fajne zegarki :)
Należę do drużyny BOINC@Poland
 Moja wizytówka

sknd

dasz radę! czekamy na jakieś testowe WU  ;)

mariotti

Cytat: krzyszp w 11 Czerwiec 2013, 11:44
Baza danych Magento ~360 tabel.
Program do prowadzenia działalności gospodarczej (bez księgowości) - ~70tablel
Mój najbardziej rozbudowany program - 175 tabel.
To bardzo dużo jak na moje programistyczne doświadczenia. Zwykle jak klepałem
jakiś projekt przez 200-300 roboczo-godzin to baza "rozrasta" się może do 8-10  tabel.
Dużo zależy od tego jaki projekt i jak mocno baza jest znormalizowana. Teraz wklepujemy z
kumplem od pół roku pewien projekcik i baza ma 20 tabel, w tym około 5 tabel jest do
wywalenia po zmianach projektowych. Czasami patrzę na gołe instalację frameworków
PHP np. OpenCart, Concreate, Joomla, WordPress i tam 70 tabel to raczej minimum.
No cóż... pewnie te table są potrzebne, a ja jakoś przypadkiem trafiałem tylko na projekty w
których 10 tabel załatwiało sprawę :)


Cytat: krzyszp w 11 Czerwiec 2013, 11:44
Im bardziej optymalizujesz zapis informacji w bazie (poprzez atomizację), tym większa ilość tabel powstaje, a przynajmniej tak wynika z mojej praktyki...
Nie wiem jak rozumiesz atomizację. W przypadku bazy danych były postacie normalne.
Kiedyś pamiętałem która postać co oznacza :D Jeśli nie mylę pojęć, to ja w każdym projekcie
dążę trzeciej postaci normalnej, no i wychodzi mi średnio do 10 tabel.


Cytat: sknd w 11 Czerwiec 2013, 12:55
dasz radę! czekamy na jakieś testowe WU  ;)
Dzięki za doping! Za jakiś czas się okaże czy dam radę. Niby z dnia na dzień wiem o
BOINC coraz więcej. Przy poprzednim podejściu utknąłem z powodu jakiś problemów z
Pythonem. Od tamtej porty kompletnie nic nie zmieniałem przy Pythonie, a za drugim
podejściem problem jakoś się nie pojawił... może teraz mam lepszą/nowszą wersję
BOINC - nie wiem. Tak czy inaczej, pusta aplikacja, taka bezpośrednio po instalacji,
lokalnie na moim kompie zadziałała.

Zastanawiam się co dalej. Mam laptopa na procesorze N270. W maksymalnym stresie
pobiera 17Watt mocy - idealny do zastosowań 24-godzinnych na dobę :) Komputer na
jakimś mobilnym procesorze i3 pewnie byłby jeszcze lepszy, ale jedyny egzemplarz jaki
mam, jest mi potrzebny do pracy. Może będę musiał kupić jakiegoś laptopa z I3. Laptopy
zwykle ma słabe dyski, może od razu powinienem kupić jakiś zewnętrzny dysk na USB 3.0.
Adres IP mam stały, ale jednak co kilka tygodni zdarza się że mój provider internetowy
go zmienia. Była jakaś taka usługa... zapomniałem jak się nazywała... chyba home-ip?
Instaluje się na kompie program, który wysyła do serwera bieżący adres IP, a serwer w
czasie rzeczywistym przypisuje ten adres IP do domeny. Potem jeszcze na routerze
trzeba coś skonfigurować, żeby router wiedział do którego kompa z sieci lokalnej przekazywać
przychodzące pakiety... Znowu coś do przebrnięcia, ale tym sposobem byłby komputer w
domu ze stałą domeną i z możliwością instalowania serwerów. Alternatywą jest wykupienie
gdzieś jakiegoś serwera dedykowanego, ale z tego co pamiętam, jest to koszt powyżej
150zł miesięcznie i za każde dodatkowe urządzenie (np. N-ty dysk) trzeba dopłacać. Jak się
kupi laptopa, to po roku się zwróci.

Na takim domowym serwerku będzie trzeba postawić Linuxa, MySqla, Apache, Pythona, trochę
bibliotek, no i  BOINC - chyba taki sobie wyznaczę następny etap.

Hmmm... a może polecicie mi jakiś zestaw do powyższego zastosowania? W sumie to wystarczy płyta,
procesor, pamięć, dysk USB. Na dysku bym zainstalował Linuxa, potem bym wszystko skonfigurował
przez jakiś rdesktop - pewnie wyszłoby taniej niż cały laptop.

Pozdrawiam

krzyszp

no-ip.com :)

Natomiast serwer BOINC może Ci pomóc utrzymać Fundacja - do tego (m.in.) jest powołana :)

Co do atomizacji, to rozumiem ją jako jak najmocniejsze sprowadzenie informacji do najmniej mozliwej wartości, np. tabele klient-towar-rachunek:
Tabela klienta:
IDklienta
Imie
Nazwisko
Adres
itd (adres w wielu polach, dalsze dane, itd)

Tabela Faktury:
IDfaktury
Nrfaktury
IDklienta
IDtowaru

Tabela Towary:
IDTowaru
Nazwa
Ilosc

W ten sposób już masz trzy tabele (oczywiście bardzo je uprościłem), które pozwalają na pewną atomizację, ale gdy klient może mieć kilka adresów (np. filie) to już potrzebujesz nowej tabeli z adresami, dodaj do tego kwestie adresów wysyłkowych, kontakty z klientem (np. lista wiadomości), itd szybko przekraczasz założone 10 tabel - taka atomizacja wymusza/powoduje rozbicie danych na jak najmniejsze części co daje potem wygodę i elastyczność w ich wykorzystaniu. W dodatku ja mówię o znacznie więcej niż 300 roboczogodzinach, takie systemy rozwijają się latami :)

Jako przykład napisze tylko, że dobry system firmowy gromadzi i obrabia dane nie tylko o towarach, ale także pojazdy i maszyny (a to bardzo różne "sprawy" z punktu widzenia programisty), zarządzanie załogą, CRM, zakupy, itd - sama lista zadań jest większa niż 10 pozycji ( a przecież na każdą z nich przeznaczysz więcej niż jedną tabelę).

Fajne zegarki :)
Należę do drużyny BOINC@Poland
 Moja wizytówka

mariotti

Cytat: krzyszp w 11 Czerwiec 2013, 16:38
no-ip.com :)
Dzięki za przypomnienie :)

Cytat: krzyszp w 11 Czerwiec 2013, 16:38
Natomiast serwer BOINC może Ci pomóc utrzymać Fundacja - do tego (m.in.) jest powołana :)
Na czym ta pomoc polega i co trzeba zrobić żeby ją uzyskać? Właściwie to na dziś
planowałem (jednak) wykupienie jakiegoś serwera wirtualnego, a następnie chciałem
na nim wystawić na świat jakąś pustą instalację.


Cytat: krzyszp w 11 Czerwiec 2013, 16:38
Co do atomizacji, to rozumiem ją jako jak najmocniejsze sprowadzenie informacji do najmniej mozliwej wartości, np. tabele klient-towar-rachunek:
To mówimy o takiej samej postaci :)

Cytat: krzyszp w 11 Czerwiec 2013, 16:38
W ten sposób już masz trzy tabele (oczywiście bardzo je uprościłem), które pozwalają na pewną atomizację, ale gdy klient może mieć kilka adresów (np. filie) to już potrzebujesz nowej tabeli z adresami, dodaj do tego kwestie adresów wysyłkowych, kontakty z klientem (np. lista wiadomości), itd szybko przekraczasz założone 10 tabel - taka atomizacja wymusza/powoduje rozbicie danych na jak najmniejsze części co daje potem wygodę i elastyczność w ich wykorzystaniu. W dodatku ja mówię o znacznie więcej niż 300 roboczogodzinach, takie systemy rozwijają się latami :)

Jako przykład napisze tylko, że dobry system firmowy gromadzi i obrabia dane nie tylko o towarach, ale także pojazdy i maszyny (a to bardzo różne "sprawy" z punktu widzenia programisty), zarządzanie załogą, CRM, zakupy, itd - sama lista zadań jest większa niż 10 pozycji ( a przecież na każdą z nich przeznaczysz więcej niż jedną tabelę).
W systemach zintegrowanych jest jak mówisz, ilość tabel szybko się rozrasta. Ja zwykle
pracowałem przy mniejszych projektach.

Pozdrawiam


krzyszp

Nie mogę się wypowiadać w imieniu Fundacji, ale mam dość dobre pojęcie co i jak robi, więc wnioskując z tego, że obecnie utrzymuje serwer Radioactive@Home oraz OProject myślę, że mogła by także pomóc w utrzymaniu Twojego serwera projektu (masz już nazwę?).

Najlepiej zwróć się bezpośrednio do którejś z osób z zarządu (wszystkie są obecne na forum: Cyfron, Tobas, Goofyx). Możesz też użyć formularza kontaktowego/danych ze strony Fundacji: http://boincpolska.org/

Fajne zegarki :)
Należę do drużyny BOINC@Poland
 Moja wizytówka

mariotti

Cytat: krzyszp w 13 Czerwiec 2013, 09:53
Nie mogę się wypowiadać w imieniu Fundacji, ale mam dość dobre pojęcie co i jak robi, więc wnioskując z tego, że obecnie utrzymuje serwer Radioactive@Home oraz OProject myślę, że mogła by także pomóc w utrzymaniu Twojego serwera projektu (masz już nazwę?).
Najlepiej zwróć się bezpośrednio do którejś z osób z zarządu (wszystkie są obecne na forum: Cyfron, Tobas, Goofyx). Możesz też użyć formularza kontaktowego/danych ze strony Fundacji: http://boincpolska.org/
W takim razie za jakiś czas zwrócę się do kogoś o pomoc w tej kwestii.
Na razie będę miał serwer wirtualny za 20zł / miesiąc + domena 50zł / na rok - to
w sumie są grosze.

Kupiłem specjalny dysk na work-units do głębokości 16 ruchów. Roboczy plik
będzie miał rozmiar 200GB, więc na 17 ruchów miałby rozmiar 5TB - ale do
takiej głębokości raczej nie dojdziemy. Zastanawiam się czy takie narzędzia
jak sort i uniq z powłoki linuxa radzą sobie z takimi dużymi plikami. Jak nie,
to będę musiał użyć sqlite - to podobno najszybsza baza danych.

Nad nazwą projektu i domeny jeszcze myślę... może po prostu perft, albo
perft-test. Może jedn domena na kilka projektów - docelowo chcę
uruchomić zupełnie inny i bardziej ambitny projekt niż zliczanie węzłów.
Szkoda że computer-chess.com jest zajęta :/

Pozdrawiam

Karlik

Cytat: mariotti w 13 Czerwiec 2013, 13:47Jak nie, to będę musiał użyć sqlite - to podobno najszybsza baza danych.
Chyba najszybsza do użycia, bo najprostsza, ale przetwarzanie czegokolwiek na tym może być problematyczne. A uniq i sort powinny sobie poradzić o ile jesteś w stanie zapewnić wystarczająco dużo pamięci  :P

krzyszp

1. Szybki VPS to IMHO "minimalne minimum" aby serwer BOINC na tym chodził...
2. BOINC posługuje sié MySQL'em i aby nie komplikować spraw zatrzymałbym sié na nim... Nie wiem jak sqlite sié zachowa z taká ilościá danych (natomiast MySQL wiem, pracuje dobrze z bazá ~400GB).

Jeśli VPS, a nie dedyk, to polecam Ultimahost - majá tam fajne VPS'y oparte o dyski SSD za 69pln miesiécznie (mam, korzystam, działa bardzo sprawnie konwertujác ebooki i liczác WCG).

Fajne zegarki :)
Należę do drużyny BOINC@Poland
 Moja wizytówka

mariotti

Cytat: Karlik w 13 Czerwiec 2013, 14:21
Cytat: mariotti w 13 Czerwiec 2013, 13:47Jak nie, to będę musiał użyć sqlite - to podobno najszybsza baza danych.
Chyba najszybsza do użycia, bo najprostsza, ale przetwarzanie czegokolwiek na tym może być problematyczne.
Dlaczego przetwarzanie czegokolwiek na sqlite jest problematyczne?

Cytat: Karlik w 13 Czerwiec 2013, 14:21
A uniq i sort powinny sobie poradzić o ile jesteś w stanie zapewnić wystarczająco dużo pamięci  :P
Widzę że sort ma w opcjach katalog tymczasowy. Nie wiem, ale wnioskuję z tego, że sort umie
pracować także gdy pamięci jest mało.

Tak czy inaczej... nie umiem sobie poradzić przy użyciu samych poleceń sort i
uniq, więc sięgam po sqlita :D

Pozdrawiam

krzyszp

Cytat: mariotti w 13 Czerwiec 2013, 14:29
Tak czy inaczej... nie umiem sobie poradzić przy użyciu samych poleceń sort i
uniq, więc sięgam po sqlita :D
Eee, po MySQL? ;)
Czy ja nie zrozumiałem? ;)

Fajne zegarki :)
Należę do drużyny BOINC@Poland
 Moja wizytówka

mariotti

Cytat: krzyszp w 13 Czerwiec 2013, 14:28
1. Szybki VPS to IMHO "minimalne minimum" aby serwer BOINC na tym chodził...
Na początek musimy się zadowolić rozwiązaniem najtańszym. Wydaje mi się, że
do testów wystarczy każdy kiepski wirtual. Na takim podrzędnym wirtualu zrobimy:
1) instalację i konfigurację serwera BOINC
2) testy poprawności na głębokości 12-13 ruchów
3) testy poprawności na kluczach różnej długości
4) optymalizację kodu
Jeśli projekt szczęśliwie dotrwa do ostatniego punktu, to wtedy pomyślimy nad
lepszym/droższym hostingiem.


Cytat: krzyszp w 13 Czerwiec 2013, 14:28
2. BOINC posługuje sié MySQL'em i aby nie komplikować spraw zatrzymałbym sié na nim...
Nie wiem jak sqlite sié zachowa z taká ilościá danych (natomiast MySQL wiem, pracuje
dobrze z bazá ~400GB).
SQLIte to będzie tylko pośrednie narzędzie do wygenerowania WU. Gdy WU będą gotowe,
to (o ile rozumiem jak działa serwer BOINC) doda się je do specjalnych katalogów, a do bazy
mysql trafiają tylko bieżące WU.

Cytat: krzyszp w 13 Czerwiec 2013, 14:28
Jeśli VPS, a nie dedyk, to polecam Ultimahost - majá tam fajne VPS'y oparte o dyski SSD za 69pln miesiécznie (mam, korzystam, działa bardzo sprawnie konwertujác ebooki i liczác WCG).
Jeśli projekt ruszy pełną gębą, to pomyślimy nad jakimś dedykiem z dobrym RAIDem :D

Pozdrawiam


mariotti

Cytat: krzyszp w 13 Czerwiec 2013, 14:44
Cytat: mariotti w 13 Czerwiec 2013, 14:29
Tak czy inaczej... nie umiem sobie poradzić przy użyciu samych poleceń sort i
uniq, więc sięgam po sqlita :D
Eee, po MySQL? ;)
Czy ja nie zrozumiałem? ;)
SQLIte prawdopodobnie jest najszybszą bazą, bo oferuje najmniejszą funkcjonalność, więc
po SQLita. Napiszę programik narzędziowy do wygenerowania WU. Gdy będą gotowe, to
doda się do serwera BOINC tak jak BOINC tego wymaga. A jeśli dobrze zdążyłem się
zorientować, to BOINC wymaga aby WU leżały w specjalnych katalogach, do bazy
trafiają WU chyba tylko na czas przetwarzania - gdy są bieżącymi WU. Ale mogę się
mylić :)

Pozdrawiam

mariotti

Jakby ktoś chciał spojrzeć w kod, to na dole załączam źródło programu
do generowania (a właściwie do grupowania i optymalizowania) work-units.

Program grupuje w jednym pliku tekstowym chunk zadań. Jedno
zadanie (zadanie to w zasadzie to samo co układ do przeszukania)
mieści się w jednym wierszu. Wszystkie zadania są do programu
podawane na standardowe wejście. Zadania mogą wiele razy się
powtarzać, więc program usuwa powtórzenia, a na końcu każdego
wiersza dopisuje ilość powtórzeń. Dodatkowo program do każdego pliku
dopisuje depth na jaką będą przeszukiwane zadania-układy. Bardzo
ważne jest, aby zadania były pogrupowane zgodnie z kolejnością w jakiej
zostały podane do programu na standardowe wejście - więc program
zachowuje kolejność.

Program w zasadzie tylko pośredniczy pomiędzy źródłem zadań a bazą
SQLite. Całą brudną robotę robi baza SQLite.

Program właściwie może pracować na dowolnych danych, byle jedno
zadanie mieściło się w jednym wierszu - więc może komuś jeszcze się
przyda takie narzędzie. Wystarczy program skompilować, przekierować
do niego dowolny plik z wierszami, wpisać chunk i wiersze zostaną
pogrupowane w plikach. Parametr depth pewnie nikomu się nie przyda, ale
można łatwo usunąć ze źródła.



#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QVariant>
#include <QDir>
#include <QDebug>

#include <QFile>
#include <cstdlib>

#include <iostream>


void startTransaction( QSqlDatabase &db ) {
QString q = QString("BEGIN");
QSqlQuery query( db );
if( !query.exec( q ) ) qCritical() << query.lastError().text();
}


void commitTransaction( QSqlDatabase &db ) {
QString q = QString("COMMIT");
QSqlQuery query( db );
if( !query.exec( q ) ) qCritical() << query.lastError().text();
}


QSqlDatabase connectDB( const QString &db_path ) {
if( QFile::exists(db_path) )
QFile(db_path).remove();
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName( db_path );
if( ! db.open() )
qCritical() << "Cant open connection to database";
return db;
}


void createDB( QSqlDatabase &db ) {

QSqlQuery query( db );

{
QString q =
"CREATE TABLE Fens ("
"id       INTEGER      NOT NULL PRIMARY KEY ASC AUTOINCREMENT,       "  // klucz główny
"fen      VARCHAR(70)  NOT NULL,                                     "  // układ
"repeat   INTEGER      NOT NULL                                      "  // powtórzenia
")";
if( ! query.exec( q ) )
qCritical() << q.toAscii().constData() << query.lastError().text().toAscii().constData();
}

{
QString q = "CREATE UNIQUE INDEX IdxFens ON Fens(fen)";
if( ! query.exec( q ) )
qCritical() <<  q.toAscii().constData() << query.lastError().text().toAscii().constData() ;
}

}


//void incOrInsert( QSqlDatabase &db , const char fen[] ) {
// QSqlQuery query( db );
// QString q = QString("SELECT count(*) as cnt FROM Fens WHERE fen='%1'").arg(fen);
// if( ! query.exec( q ) ) Q_ASSERT_X( false , q.toAscii().constData() , query.lastError().text().toAscii().constData() );
// if( ! query.next()    ) Q_ASSERT_X( false , q.toAscii().constData() , query.lastError().text().toAscii().constData() );
// if( query.value(0).toLongLong() > 0 )
// q = QString("UPDATE Fens SET count=count+1 WHERE fen='%1'").arg(fen);
// else
// q = QString("INSERT INTO Fens (fen,repeat) VALUES ('%1',1)").arg(fen);
// std::cout<<q.toAscii().constData()<<std::endl;
// if( ! query.exec( q ) ) Q_ASSERT_X( false , q.toAscii().constData() , query.lastError().text().toAscii().constData() );
//}



void incOrInsert( QSqlDatabase &db , const char fen[] ) {
QSqlQuery query( db );
QString q = QString("SELECT * FROM Fens WHERE fen='%1'").arg(fen);
if( ! query.exec( q ) ) qCritical() << q.toAscii().constData() << query.lastError().text().toAscii().constData() ;
if( query.next() )
q = QString("UPDATE Fens SET repeat=repeat+1 WHERE fen='%1'").arg(fen);
else
q = QString("INSERT INTO Fens (fen,repeat) VALUES ('%1',1)").arg(fen);
// if( ++nr % 1000 == 0 )
// std::cout<<nr<<"  "<<q.toAscii().constData()<<std::endl;
if( ! query.exec( q ) ) qCritical() << q.toAscii().constData() << query.lastError().text().toAscii().constData() ;
}



long long numberUnique( QSqlDatabase &db ) {
QSqlQuery query( db );
QString q = QString("SELECT count(*) AS cnt FROM Fens");
if( ! query.exec( q ) ) qCritical() <<  q.toAscii().constData() << query.lastError().text().toAscii().constData() ;
if( ! query.next()    ) qCritical() <<  q.toAscii().constData() << query.lastError().text().toAscii().constData() ;

const long long uniq = query.value(0).toLongLong();
std::cout<<"number of unique: " << uniq << std::endl;
return uniq;
}


void allSum( QSqlDatabase &db ) {
QSqlQuery query( db );
QString q = QString("SELECT sum(repeat) AS cnt FROM Fens");
if( ! query.exec( q ) ) qCritical() <<  q.toAscii().constData() << query.lastError().text().toAscii().constData() ;
if( ! query.next()    ) qCritical() <<  q.toAscii().constData() << query.lastError().text().toAscii().constData() ;
std::cout<<"all sum: " << query.value(0).toLongLong() << std::endl;
}


void maxRepeat( QSqlDatabase &db ) {
QSqlQuery query( db );
QString q = QString("SELECT fen, repeat FROM Fens WHERE repeat = (SELECT max(repeat) FROM Fens)");
if( ! query.exec( q ) ) qCritical() << q.toAscii().constData() << query.lastError().text().toAscii().constData() ;
std::cout<<"max repeated:"<<std::endl;
for( int i=1 ; query.next() ; i++ )
std::cout<<i<<". "<<query.value(0).toString().toAscii().constData()<<" rep:"<<query.value(1).toInt()<< std::endl;
std::cout<<"------------------"<<std::endl;
}


void saveWorkUnit( QSqlDatabase &db , const char out_dir[] , const long long start , const long long end , const int depth ) {
QSqlQuery query( db );
QString q = QString("SELECT fen, repeat FROM Fens WHERE id>=%1 AND id<%2").arg(start).arg(end);
if( ! query.exec( q ) ) qCritical() << q.toAscii().constData() << query.lastError().text().toAscii().constData() ;

QString content = QString("%1\n").arg(depth);

while( query.next() )
content += query.value(0).toString() + ";" + query.value(1).toString() + "\n";

const QString f_name = QString("%1/wu_%2_%3.txt").arg(out_dir).arg(start,10,10,QChar('0')).arg(end,10,10,QChar('0'));
QFile file( f_name );
if( ! file.open(QFile::WriteOnly|QFile::Truncate) )
qCritical() << f_name.toAscii().constData() ;
file.write( content.toAscii().constData() );
file.close();

}

void panic(QtMsgType type, const char *msg) {
abort();
}

int main(int argc, char *argv[]) {
qInstallMsgHandler(panic);

if( argc != 5 ) {
std::cout<<"using:"<<std::endl;
std::cout<<"wu_test_perft db_path dir depth chunk"<<std::endl;
qCritical();
}

if( ! QDir().exists(argv[2]) ) {
if( ! QDir().mkpath(argv[2]) )
qCritical() << "cant create dir: " << argv[2];
}


int depth;
{
bool ok;
depth = QString(argv[3]).toInt(&ok);
if( !ok || depth < 1 )
qCritical() << "invalid depth";
}

int chunk;
{
bool ok;
chunk = QString(argv[4]).toInt(&ok);
if( !ok || chunk < 1 )
qCritical() << "invalid chunk";
}


QSqlDatabase db = connectDB( argv[1] );
createDB( db );

startTransaction(db);

char fen[1024];
for( long long i=1 ; ! std::cin.getline( fen , 1024 ).fail() ; i++ ) {
int len = strlen(fen)-1;
while( len>=0 && ( fen[len] == ' ' || fen[len] == '\t' || fen[len] == '\n' || fen[len] == '\r' ) )
fen[len--] = 0;
incOrInsert( db , fen );
std::cout<<"\rcreating "<<i;
}
std::cout<<std::endl;

const long long uniq = numberUnique(db);
allSum(db);
maxRepeat(db);

commitTransaction(db);

for( long long i=1 ; i<=uniq ; i+=chunk ) {
const long long start = i;
const long long end   = qMin( start + chunk , uniq );
saveWorkUnit( db , argv[2] , start , end , depth );
std::cout<<"\rsaving "<<end;

}
std::cout<<std::endl;



db.close();
// QFile(argv[1]).remove(); // drop db sqlite
return 0;
}



Pozdrawiam

P.S.
Serwer wirtualny wykupiłem, domenę wykupiłem, więc niedługo będzie coś online :)
Proponuję dla każdego kto mnie wspierał w tym projekcie, jakieś strony-wizytówki w
tej samej domenie co projekt - oczywiście jeśli uda się projekt postawić na nogach :)