tag:blogger.com,1999:blog-26919633041846240772024-03-05T10:38:22.410-08:00My NotesPrzemysław Wróblewskihttp://www.blogger.com/profile/00315640642865740907noreply@blogger.comBlogger19125tag:blogger.com,1999:blog-2691963304184624077.post-19573147223026449642015-02-10T01:06:00.000-08:002015-02-10T01:06:02.109-08:00Rubymine - JDK7 + optymalizacje GCRubyMine
czasami działa potwornie wolno, experymentując z aplikacją serwującą miliony requestów dziennie znalazłem lepsze ustawienia GC które powodują więcej lekkich GC i praktyczny brak FullGC.
Dodatkowo aby wymusić działanie Rubymine pod JDK 1.7 trzeba w pliku /Applications/RubyMine.app/Contents/Info.plist, zmienić JVMVersion z 1.6* do 1.7* :
<pre style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEKf460rq8NW0xXTdwe06_Qdx150tASLvVPkAWqKc4xadkKb1ijpZlH6Kg9x3vCJErCAu6ohP40v0L_CRQR9KXoPRUYX0sHGxoSivs4Mbe2hsFyEqIzQGz147WBmHslZhVe9GzlGPqhXT2/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"><code style="color:#000000;word-wrap:normal;"> <key>JVMVersion</key>
<string>1.7*</string>
</code></pre>
RubyMine.app/bin/idea.vmoptions:
<blockquote>
-Xms128m
-Xmx512m
-XX:MaxPermSize=250m
-XX:+UseCompressedOops
</blockquote>
dodałem extra:
<blockquote>
-XX:NewRatio=2
-XX:SurvivorRatio=2
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
-XX:+ParallelRefProcEnabled"
</blockquote>Przemysław Wróblewskihttp://www.blogger.com/profile/00315640642865740907noreply@blogger.com0tag:blogger.com,1999:blog-2691963304184624077.post-3614674173442101272015-01-07T09:12:00.001-08:002017-01-15T12:26:48.204-08:00MacBook Pro jumpstart<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3MSPC_8YuwaGcQI49JNysJSw6OTfkC-I8ONFhkwU5HlzXr3lDzExeU2E51KUoHU9LVUlaYPtPO9NVxNbQGEwzI0RVIAs0DWwpkqlZo4hT2c0pOPo1RGA7QZ2SKvJvCSeFzhHUMCZfcpY/s1600/dsc08906.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3MSPC_8YuwaGcQI49JNysJSw6OTfkC-I8ONFhkwU5HlzXr3lDzExeU2E51KUoHU9LVUlaYPtPO9NVxNbQGEwzI0RVIAs0DWwpkqlZo4hT2c0pOPo1RGA7QZ2SKvJvCSeFzhHUMCZfcpY/s320/dsc08906.jpg"></a></div>
<p>Nowy rok i nowa maszyna, ilość ramu oraz miejsce na dysku w poprzedniej przestały być wystarczające, tym razem wybór padl na 1,5kg Apple MacBook Pro 13,3" (MGX82PL/A/P1/R1) Retina</p>
<p>To już moje drugie zetknięcie z OSX, mógłbym oczywiście zmigrować stary system na nowy ale chciałem postawić wszystko od nowa unikając poprzednich błędów, i tak:</p>
<ul>
<li>http://iterm2.com/ - absolutny must have do pracy z terminalem</li>
<li>http://brew.sh/ - instalacja homebrew poprzez przeklejenie linka do terminala</li>
<li>https://github.com/robbyrussell/oh-my-zsh - czyli ładny terminal z obsługą git i rvm</li>
<li>http://jumpcut.sourceforge.net/ - helperek pozwalający zapamiętać w schowku do kilkudziesięciu zawartości</li>
<li>https://rvm.io/rvm/install - manager różnych wersji rubiego</li>
<li>https://www.jetbrains.com/ruby/download/ - perfekcyjny IDE</li>
<li>https://code.google.com/p/tunnelblick/ - czyli vpn pod kontrolą</li>
<li>http://www.sequelpro.com/download - najładniejszy klient mysql</li>
<li>http://robomongo.org/ - najładniejszy klient mongo</li>
<li>https://github.com/zimbatm/direnv - czyli zmienne środowiskowe per katalog</li>
</ul>
<p>
co ciekawe na Yosemite <i>bundle install</i> w moich projektach działa bez większych problemów, postgresql i mysql wymagały instalacji paczki z brew, na razie żadnych problemów z kompilacją extension-ów jeszcze nie było (odpukać)</p>
<h5>UPDATE 2016-03-25:</h5>
<p>Nowy Macbook pro 2015, po podłączeniu zewnętrznego monitora zmknięcie klapy nie powoduje sleep, mac dalej działą przełączając obraz na drugi monitor. Fajne, szkoda że nie dali opcji jak to wyłączyć, przynajmniej takiej human friendly.
No ale zawsze sposób się znajdzie (wykonać bez podłączonego monitora + restart po komendzie):</p>
<code>
sudo nvram boot-args=niog=1
</code>Przemysław Wróblewskihttp://www.blogger.com/profile/00315640642865740907noreply@blogger.com0tag:blogger.com,1999:blog-2691963304184624077.post-35275873884345360902014-11-28T09:20:00.001-08:002014-11-28T09:31:14.397-08:00Przyprawa24.pl - sklep internetowy w kilka godzin<div class="separator" style="clear: both; text-align: center;"><a href="http://przyprawa24.pl" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj32GM6odLDvvZU8_KqGP4meDFEP4JPTUuQ5JB04t2BkEAWmA-bUB6savnMTt5tfx-zhMUEQ89OO7MgfYTgEDre3MAL2WNhJcf0E9JEyeX4ghjHlUlPsehHdIB5qZeByfrOUfJ1asEdQeE/s320/Screen+Shot+2014-11-28+at+17.58.19.png" /></a></div>
<p>powinienem to już dawno opisać ale czas ciągle gdzieś uciekał, teraz przymusowo mam kilka dni wolnego to mogę uzupełnić takie zaległości.</p>
<p>Na początku lutego 2013 miałem uruchomić <a href="http://przyprawa24.pl">sklep z przyprawami RoyalBrand</a>, ponieważ był to projekt lowcostowy nie było mowy o jakimkolwiek rozwiązaniu które wymagało by z mojej strony dużo pracy, z kilku kandydatów typu oscommerce, magento itp wybór padł na PrestaShop.</p>
<p>Na początek muszę przyznać że pozytywnie mnie to oprogramowanie zaskoczyło, na start dostajemy:<br/>
- lekki nowoczesny design a po kilku godzinach lekkich customizacji dostajemy gotowy front dla sklepu.<br/>
- dość rozbudowany panel admina, cms, zarządzanie zamówieniami, mejlingi
</p>
<p>Jest również dostępne wiele rozszerzeń, np:<br/>
- bramka płatności <b>transferuj.pl</b><br/>
- integracja z porównywarkami <a href="http://pl.seigi.eu/informacje/prestashop-moduly.html">Pricewars</a> (utrzymywana i rozwijana jako opensource przez seigi-ego)</p>
<p>Nie obędzie się jednak bez wad:<br/>
- nie wszystko da się z menu wyklikać, czasami trzeba dłubać w PHP, a nie jest to ładny php. To że modelem nazwiemy klasę Produkt i wrzucimy tam 8k lini kodu nie czyni rozwiązania przejrzystym.<br/>
- testy, buhahaha! to dla mięczaków lub jakiś zwyrodnialców, nie ma jak zmiana pliku, upload ftp na produkcje i reload<br/>
- wiele rozszerzeń jest płatnych, za byle bzdure wątpliwej jakości nieraz widać cenę $50<br/>
- brak powiązania sposobu wysyłki z sposobem płatności (akurat do zrobienia ale patrz pkt1 - na forach są dostępne "pacze" słownomuzyczne postaći "w tej lini zmień to na to")
</p>
<p>Niemniej jednak po prawie 2 latach jestem z tego rozwiązania zadowolony, na tyle że do określonych celów poleciłem je znajomemu</p>Przemysław Wróblewskihttp://www.blogger.com/profile/00315640642865740907noreply@blogger.com2tag:blogger.com,1999:blog-2691963304184624077.post-49437649924428413652013-07-29T02:12:00.001-07:002014-03-17T09:11:30.895-07:00gem install iconv memcached on OSX with Homebrew<blockquote>$ gem install iconv -v '1.0.3' -- --with-iconv-include=/usr/local/Cellar/libiconv/1.14/include --with-iconv-lib=/usr/local/Cellar/libiconv/1.14/lib</blockquote>
2014-03-17:
<blockquote>$ env ARCHFLAGS="-arch i386" gem install -r -V memcached --no-rdoc --no-ri
</blockquote>Przemysław Wróblewskihttp://www.blogger.com/profile/00315640642865740907noreply@blogger.com0tag:blogger.com,1999:blog-2691963304184624077.post-44322091235050225612012-10-08T10:28:00.002-07:002014-11-28T11:55:31.610-08:00MacBook Air OSX Jumpstart<div class="separator" style="clear: both; text-align: left;"></div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjh9hC9Ve1UrCLHJiwgbiNBp40aFlKKkp0wCOYXhatZwZa-A4HzEQmxZskqwz9OobZT-7IjZ22OzqzYMZsff3BXOA_70HxVgh06zIU8d922VDd8fWE47oD11sU6Nf3WV-0-EmNpVekuCJM/s1600/2012macbookair13.jpg" imageanchor="0"><img align="left" border="0" height="266" width="400" style="margin:1em" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjh9hC9Ve1UrCLHJiwgbiNBp40aFlKKkp0wCOYXhatZwZa-A4HzEQmxZskqwz9OobZT-7IjZ22OzqzYMZsff3BXOA_70HxVgh06zIU8d922VDd8fWE47oD11sU6Nf3WV-0-EmNpVekuCJM/s400/2012macbookair13.jpg" /></a>
<p>Trochę czasu minęło od zakupu do napisania tego posta, za to zdążyłem zweryfikować moje stanowisko i dzisiejszy wpis nie podlega już pod hype nowości.</p>
<p>Przez wiele lat pracowałem na wysłużonym HP 6280s, DTR 17". Już przy zakupie nie był to demon prędkości, parametrami lekko odstawał ale za to miałem 17" jako drugi monitor. Wtedy wydawało mi się to super pomysłem aby mieć dodatkowy jak największy ekran.
Po niespełna kilku miesiącach udało mi się zupgrejdować dysk 5400RPM i 2GB ram do dysku 7200RPM i 4GB ram. Nareszczie maszyna nabrała skrzydeł, jak na laptopa w 2008r miała całkiem niezłe parametry. Niestety wracając do wagi to pierwotny zamysł że będę miał komputer przenośny upadł, przy 3kg wagi tylko kilka razy chciało mi się to taskać spowrotem do domu, kilka razy byłem z nim na wyjeździe na różnych konferencjach.
Co do moblności w biurze to też kiepsko bo DTR był przywiązany do biurka masą różnych kabelków: mysz usb, klawiatura usb, ethernet, vga, zasilacz, słuchawki - każdorazowe podłączanie skutecznie niwelowało chęci aby go gdzieś zabrać. Ok 2010r doczekałem się lekkiego upgrejdu, dostałem dysk SSD 40GB, maszyna znowu odżyła. Wtedy też powoli zaczynały pojawiać się Macbooki AIR z możliwością upgrejdu ramu do 4GB, ten setup wzbudził moje zainteresowanie.</p>
<p>Na początku 2012 nareszcie otrzemałem mój dream setup - <b>Macbook Air z 4GB ram, SSD128 i Core i5</b>. Tu historia się rozpoczyna: pierwszy pomysł miał polegać na tym że jak OSX nie przypadnie mi do gustu zainstaluje tu ubunciaka. Naszczęście tak sie nie stało.
Tu jeszcze nawiąże do sterty akcesoriów którą kiedyś podłączałęm, klawiatura Logitech UltraX przestała być potrzebna bo domyślna klawiatura jest równie dobra, mysz Logitech też poszła w odstawkę, gładzik apple jest rewelacyjny, w niczym to nie przypomina krnąbrnych małych płytek z della, hp czy innych "markowych" sprzętów. Jedyne czego mi brakuje to bezprzewodowe słuchawki i monitor bezprzewodowy, ale może kiedyś...
Co do samego softu to jako wierny fan Ubuntu ciężko było mi się odnaleźć w świecie OSX, sporo pomógł mi poniższy tutorial:</p>
<p><a href="https://gist.github.com/1110217">https://gist.github.com/1110217</a></p>
<p><a href="http://mxcl.github.com/homebrew/">Homebrew</a> - czyli manager pakietów jako alternatywa do systemu portsów jest rewelacyjny,
nie zastąpi co prawda apt-get ale chociaż w niewielkim stopniu potrafi umilić codzienne życie byłym userom linuksów.</p>
<p><a href="http://code.google.com/p/tunnelblick/">TunnelBlick</a> czyli manager do polaczeń VPN zapewni nam łączność, próbowałem walczyć z jakimś skryptem shellowym który by to robił ala /etc/init.d/openvpn ale sromotnie poległem. Na osx część rzeczy musi mieć ładny interfejs i nie ma co z tym walczyć.</p>
<p>Czy OSX daje rade jako środowisko do developmentu ? Raczej tak, ale OSX nigdy nie zastąpi mi ubuntu, ciągle je posidam w wersji server zamknięte w virtualboxie - niestety soft który piszę nie jest standardowy, wymaga masy libów debianowych których próżno szukać w osx, nawet z homebrew.</p>Przemysław Wróblewskihttp://www.blogger.com/profile/00315640642865740907noreply@blogger.com0tag:blogger.com,1999:blog-2691963304184624077.post-73018368398729943522012-04-30T05:47:00.001-07:002012-04-30T05:47:26.892-07:00eDeklaracje PIT, drukowanie PDF w CUPS<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTsaIn4RJ2a4V_yI_t1voXspR30ym6O7LvHY0eOOmuekzI9kjT-7YStLl3Da9Q0Pb_g5WViMd-gKFF3cV-AJQUXVyMnuOlciNYqtZsPElMe4XZOA1_U4QUnmyB3mPXsbjZq4_ndEM_xyM/s1600/edeklaracje2012.jpg" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"><img border="0" height="335" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTsaIn4RJ2a4V_yI_t1voXspR30ym6O7LvHY0eOOmuekzI9kjT-7YStLl3Da9Q0Pb_g5WViMd-gKFF3cV-AJQUXVyMnuOlciNYqtZsPElMe4XZOA1_U4QUnmyB3mPXsbjZq4_ndEM_xyM/s400/edeklaracje2012.jpg" /></a></div>
na początku chciałbym pochwalić Ministerstwo Finansów za stworzenie naprawde fajnego oprogramowania na wszystkie platformy. Rok temu rozliczałem pity na Ubuntu Linuxie, w tym roku na OSX i dzięki Adobe AIR wszędzie wygląda to tak samo. Co do sposobu weryfikacji danej osoby to podanie kwoty z zeszłorocznej deklaracji na tyle uprościło proces że przeciętny Kowalski czy Wróblewski jest w stanie sam to wysłać bez ponoszenia dodatkowych nakładów finansowych. W porównianiu do potworka zwanego Płatnik gdzie trzeba podpisywac się kluczem prywatnym na karcie, działającego tylko pod Windowsem z tajnym protokołem transmisji gdzie Prokom ma prawo pozywać każdego kto z tego protokołu chce skorzystać Ministerstwo Finansów dostarczyło nową jakość, gdzie z radością patrze na co moje podatki zostały wydane.
Tu jednak nie wszystko w tym roku poszło OK, na początek mój PIT po wysłaniu zostawał odrzucany z powodu błędu 414. Szybki skok na strony MF i <a href="http://www.e-deklaracje.gov.pl/index.php?page=faq/faq&p=g20110406-4&lp=4">mam wyjaśnienie</a>:
<blockquote>
Popełniłeś błąd w danych identyfikacyjnych przenoszonych do sekcji danych autoryzujących w zeznaniu
W danych autoryzujących wpisałeś błędną kwotę przychodu z zeznania lub rocznego obliczenia podatku za rok podatkowy o dwa lata wcześniejszy niż rok, w którym jest składany dokument elektroniczny
</blockquote>
Po 10 próbach odpusciłem sobie, trzeba to wydrukować i udać się na pocztę lub do US.
Wszystko fajnie tylko nie mam drukarki..., ale jak zapisze w PDF to będe mógł to wydrukować wszędzie.
Niestety próżno szukać takiej opcji w tym programie. Następnie chciałem korzystając z drukarki CUPS-PDF wydrukować go do PDF.
Przynajmniej tak mi sie wydawało bo Formularz PDF jest zabezpieczony przed zapisywaniem go do PDF, pytam sie po co ?
Analizująć logi cups pdf natrafiłem na taki fragment:
<blockquote>
Mon Apr 30 13:07:17 2012 [DEBUG] output filename created (/var/spool/cups-pdf/lowang/job_8-PIT-37_17__v1-0E_pdf.pdf)
Mon Apr 30 13:07:17 2012 [DEBUG] ghostscript commandline built (/usr/bin/pstopdf -o /var/spool/cups-pdf/lowang/job_8-PIT-37_17__v1-0E_pdf.pdf /var/spool/cups-pdf/SPOOL/cups2pdf-59950)
Mon Apr 30 13:07:17 2012 [DEBUG] output file unlinked (/var/spool/cups-pdf/lowang/job_8-PIT-37_17__v1-0E_pdf.pdf)
Mon Apr 30 13:07:17 2012 [DEBUG] TMPDIR set for GhostScript (/tmp)
Mon Apr 30 13:07:17 2012 [DEBUG] entering child process
Mon Apr 30 13:07:17 2012 [DEBUG] GID set for current user
Mon Apr 30 13:07:17 2012 [DEBUG] UID set for current user (lowang)
Mon Apr 30 13:07:17 2012 [DEBUG] ghostscript has finished (59392)
Mon Apr 30 13:07:17 2012 [DEBUG] no postprocessing
Mon Apr 30 13:07:17 2012 [DEBUG] waiting for child to exit
Mon Apr 30 13:07:17 2012 [DEBUG] spoolfile unlinked (/var/spool/cups-pdf/SPOOL/cups2pdf-59950)
</blockquote>
Gdybym miał plik cups2pdf-59950 to mógłbym sprawdzić co się stało przy konwersji, tu w drugiej zakładce terminala uruchomiłem while true; do cp ... i za chwile miałem plik PostScriptu.
próba uruchomienia konwersji pokazała błąd:
<blockquote>
This PostScript file was created from an encrypted PDF file.
Redistilling encrypted PDF is not permitted.
</blockquote>
Szybkie sprawdzenie na necie i okazuje się że te pliki PostScript mają deklaracje która to powoduje wyglądającą tak:
<blockquote>
%ADOBeginClientInjection: DocumentSetup Start "No Re-Distill"
%% Removing the following eleven lines is illegal, subject to the Digital Copyright Act of 1998.
mark currentfile eexec
54dc5232e897cbaaa7584b7da7c23a6c59e7451851159cdbf40334cc2600
30036a856fabb196b3ddab71514d79106c969797b119ae4379c5ac9b7318
33471fc81a8e4b87bac59f7003cddaebea2a741c4e80818b4b136660994b
18a85d6b60e3c6b57cc0815fe834bc82704ac2caf0b6e228ce1b2218c8c7
67e87aef6db14cd38dda844c855b4e9c46d510cab8fdaa521d67cbb83ee1
af966cc79653b9aca2a5f91f908bbd3f06ecc0c940097ec77e210e6184dc
2f5777aacfc6907d43f1edb490a2a89c9af5b90ff126c0c3c5da9ae99f59
d47040be1c0336205bf3c6169b1b01cd78f922ec384cd0fcab955c0c20de
000000000000000000000000000000000000000000000000000000000000
cleartomark
%ADOEndClientInjection: DocumentSetup Start "No Re-Distill"
</blockquote>
Przynajmniej napisali odrazu co zrobić ;-) po wycięciu tego badziewia ps2pdf zadziałał bez zarzutu.Przemysław Wróblewskihttp://www.blogger.com/profile/00315640642865740907noreply@blogger.com2tag:blogger.com,1999:blog-2691963304184624077.post-52204827393411343802012-02-29T04:51:00.002-08:002012-02-29T04:56:26.929-08:00Text 2 AsciiArtKazdy nowy projekt który wystawia coś po http opisujemy stroną startową z informacjami co to jest i co mozna z tym zrobic.<br />Aby fajnie wygladalo na takiej stronie zamieszczamy tytul projektu wygenerowany w ascii-art, <br />dla takich potrzeb znalazłem fajny generator ascii art z podanego tekstu: <a href="http://patorjk.com/software/taag/">http://patorjk.com/software/taag/</a><br /><br />wynik:<br /><br /><pre><code> <br /> ___ ___ <br /> ,--.'|_ ,--.'|_ ,---, <br /> | | :,' | | :,' __ ,-.,---.'| <br /> .--.--. : : ' : : : ' : .--.--. ,' ,'/ /|| | : <br /> / / '.;__,' / ,--.--. .;__,' / / / ' ' | |' |: : : <br />| : /`./| | | / \ | | | | : /`./ | | ,': |,-. <br />| : ;_ :__,'| : .--. .-. |:__,'| : | : ;_ ' : / | : ' | <br /> \ \ `. ' : |__ \__\/: . . ' : |__ \ \ `. | | ' | | / : <br /> `----. \| | '.'| ," .--.; | | | '.'| `----. \; : | ' : |: | <br /> / /`--' /; : ;/ / ,. | ; : ;/ /`--' /| , ; | | '/ : <br />'--'. / | , /; : .' \ | , /'--'. / ---' | : | <br /> `--'---' ---`-' | , .-./ ---`-' `--'---' / \ / <br /> `--`---' `-'----' <br /></code></pre> (Font Name: 3D Diagonal)Przemysław Wróblewskihttp://www.blogger.com/profile/00315640642865740907noreply@blogger.com0tag:blogger.com,1999:blog-2691963304184624077.post-85011167215101566482012-01-23T06:42:00.000-08:002012-01-23T07:25:50.910-08:00OSX Lion, apache bench "Connection reset by peer"Obecnie testuje różne kontenery http na jruby, oprócz uruchomienia i testu z przegladarki zależy mi na określeniu jaka będzie strata/zysk przy konwersji MRI->JRUBY. Naturalnym dla mnie narzędziem do takich testów jest <span style="font-weight:bold;">ab</span> z pakietu apache utils.<br /><br />Jakie było moje zdziwienie kiedy zamiast czasu otrzymałem błąd:<br /><code><br />$ ab.old -n100 -c40 http://localhost:3000/<br />This is ApacheBench, Version 2.3 <$Revision: 655654 $><br />Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/<br />Licensed to The Apache Software Foundation, http://www.apache.org/<br /><br />Benchmarking localhost (be patient)...Send request failed!<br />Send request failed!<br />Send request failed!<br />apr_socket_recv: Connection reset by peer (54)<br />Total of 3 requests completed<br /></code><br /><br />pół dnia spędziłem, zmieniając serwery, zmieniłem również implementacje javy na openjdk, wszystko na nic, aby pod koniec dnia natrafić na <a href="http://superuser.com/questions/323840/apache-bench-test-erroron-os-x-apr-socket-recv-connection-reset-by-peer-54">odpowiedz na superuser</a>. Czemu wcześniej na to nie trafiłem? A kto by podejrzewał ab...<br /><br />Okazało się że <span style="font-weight:bold;">ab</span> dostarczany z osx ma ten błąd i należy przekompliować ab z źródeł. no comment<br /><br />UPDATE: po kompilacji dostłem nowy błąd "bind: address family not supported by protocol family 47", tu znowu wkracza osx ktory za localhost podstawia adres IPv6. Rozwiązanie polegało na usunięciu wpisów ipv6 z /etc/hosts powiązanych z localhostemPrzemysław Wróblewskihttp://www.blogger.com/profile/00315640642865740907noreply@blogger.com0tag:blogger.com,1999:blog-2691963304184624077.post-36478047497045178762011-09-19T01:05:00.001-07:002011-09-19T01:11:15.944-07:00vimdiff on directoriesJedyną rzeczą której mi brakowało w gedit/rubymine było porównywanie katalogów, prawde mówiąc był to jedyny powód dla którego korzystałem od czasu do czasu z Eclipse/Aptana gdzie to działało rewelacyjnie.<br />Do teraz, bo właśnie znalazłem plugin DirDiff:<br /><br />http://www.vim.org/scripts/script.php?script_id=102<br /><br />wystarczy wpisać:<br /><br />:DirDiff katalog1 katalog2<br /><br />a oto efekt:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjifBO8AeLAU3SD98lXq1vrRz-8v3R3ZABF1OevzJI2pZfv-zvXQCL6vO8v84_w1X9aXUv6ri1h4kYBcfLnzowRR9Cn_MJNlVhJdYekEMXiIMRoNRtBRZDsDsptbJZQkArPbgQrghcswOs/s1600/vim+diff+directory.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 241px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjifBO8AeLAU3SD98lXq1vrRz-8v3R3ZABF1OevzJI2pZfv-zvXQCL6vO8v84_w1X9aXUv6ri1h4kYBcfLnzowRR9Cn_MJNlVhJdYekEMXiIMRoNRtBRZDsDsptbJZQkArPbgQrghcswOs/s400/vim+diff+directory.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5653980114196414882" /></a>Przemysław Wróblewskihttp://www.blogger.com/profile/00315640642865740907noreply@blogger.com0tag:blogger.com,1999:blog-2691963304184624077.post-45255035891324321292011-07-24T08:44:00.001-07:002011-07-24T09:05:21.173-07:00XBMC match movie title based on filenameBardzo często zdarzało mi się że XBMC przydzielał niepoprawny film z imdb na podstawie dziwnej nazwy pliku np: "rx-hl-720p-dtshd.mkv"<br />Z poziomu interfejsu XBMC znalezienie takich nieprawidłowości było niemożliwe.<br /><br />Większość moich filmów ma poprawne nazwy katalogów więc pomyślełem że mogę użyć nazwy katalogu do weryfikcaji tego co XBMC przypisał do danego pliku na dysku.<br /><br />XBMC składuje swoje dane w sqlite i ma ładny opis co gdzie leży. W związku z tym napisałem króciutki programik do weryfikacji mapowań XBMC:<br /><br /><pre class="brush:ruby"><br />require 'rubygems'<br />require 'sqlite3'<br /><br />STOPWORDS = [ "the", "ii", "iii", "iv", "v", "vi", "3d"]<br />WHITELIST = YAML.load_file(ENV['HOME'] + '/bin/xbmc-verify.yml')<br /><br />def detect_movie(title, path)<br /> words = title.downcase.gsub(/[^a-z0-9]+/, " ").gsub(/ +/, " ").split(" ")<br /> words.delete_if { |w| STOPWORDS.include? w }<br /> dir = path.downcase<br /> included = words.collect { |w| dir.include?(w) ? true : nil }.compact<br /> included.length == words.length<br />end<br /><br />db = SQLite3::Database.new ENV['HOME'] + "/.xbmc/userdata/Database/MyVideos34.db"<br /><br />db.execute("select c00, c16, strPath from movieview" ) do |row|<br /> next if WHITELIST.include? File.basename(row[2])<br /> unless detect_movie(row[0], row[2]) or detect_movie(row[1], row[2]) <br /> movie_title = row[1]<br /> movie_title << " (#{row[0]})" if row[0] != row[1]<br /> puts "!!! #{movie_title} - #{row[2]}"<br /> end<br />end<br /></pre>Przemysław Wróblewskihttp://www.blogger.com/profile/00315640642865740907noreply@blogger.com0tag:blogger.com,1999:blog-2691963304184624077.post-35639725342948024902011-05-28T08:11:00.000-07:002011-05-28T08:29:49.150-07:00Windows 7Ponieważ w najbliższej przyszłości czeka mnie (o zgrozo!) naprawa dwóch windowso napędzanych pecetów które rodzinka i znajomi chcą mi podrzucić, postanowiłem przećwiczyć instalacje nowej odsłony okienek na własnym komputerze aby uniknąć problemów na w/w zestawach.<br /><br />Korzystając z opisu <a href="http://kmwoley.com/blog/?p=345">Kevina</a> stworzyłem z obrazu płyty instalacyjnen bootujący dysk USB i uruchomiłem system z niego, na czarnym ekranie mignęło coś ala "ładowanie windows", więc czekam...<br /><br />Wow, po kilku minutach ujrzałem tapetę nowego windowsa i kursor myszki (nawet reagował na ruch gryzonia!) i to by było na tyle, więcej nic sie nie dzieje, dysk z którego uruchomiłem system nie pracuje - pomyślałem że już udało mu sie zawisnąć.<br /><br />Ale dostał szansę, w tap defence na telefonie włączyłem kolejne kilka plansz więc dostał gdzieś z 10 minut spokoju. Okazało się że to mu bardzo pomogło bo po ~15 minutach nareszcie pokazał coś do klikania na ekranie.<br />A więc standardowa akceptacja regulaminu, czy robie upgrade czy instaluje od nowa etc.<br />Wybrałem nową instalację i moim oczom ukazała się następująca plansza:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://lh5.googleusercontent.com/-NkWglfrHm5I/TeEOo5tsZ4I/AAAAAAAAF8w/6kPAMv2O_Jo/2011-05-28%25252017.00.21.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 800px; height: 465px;" src="https://lh5.googleusercontent.com/-NkWglfrHm5I/TeEOo5tsZ4I/AAAAAAAAF8w/6kPAMv2O_Jo/2011-05-28%25252017.00.21.jpg" border="0" alt="" /></a><br /><br />Gwoli wyjaśnienia, mam w komputerze 9 dysków - system uruchamiam z WD Raptora 74GB,<br />na którym mam ubuntu i windowsa viste - domyśliłem się że to dysk 4. <br /><br />Pytanie która partycja to Vista a która Ubuntu?<br /><br /><span style="font-weight:bold;">"Drogi" microsofcie </span> - czy tak trudno było w polu nazwa dać nazwę producenta i model, a w typie wyświetlić typ partycji (ntfs, linux, etc) ?<br /><br />Cóż - zagadka pozostanie niewyjaśniona bo szkoda mi stracić swoje dane, ja mam już dosyć, eksperymentował dalej będę na dostarczonych pctach.Przemysław Wróblewskihttp://www.blogger.com/profile/00315640642865740907noreply@blogger.com0tag:blogger.com,1999:blog-2691963304184624077.post-19102254012315869462011-05-15T23:09:00.000-07:002011-05-15T23:17:07.064-07:00ubuntu 11.04 so which tab is active?<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://i.imgur.com/JHc5s.png"><img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 483px; height: 148px;" src="http://i.imgur.com/JHc5s.png" border="0" alt="" /></a><br />Obok laptopa mam monitor, każdy z ekranów jest inaczej ustawiony i aby zobaczyć aktywną zakładkę muszę patrzeć na ekran pod odpowiednim kontem - okazało się że nie tylko ja mam taki problem, rozwiązaniem jest ostylowanie aktywnej zakładki w poniższy sposów:<br /><br /><pre>lowang@lowang-laptop:~$ cat .gtkrc-2.0 <br />style "gnome_terminal_notebook"<br />{<br /> fg[NORMAL] = "#00ff00"<br />}<br /><br />widget "*TerminalWindow.*.GtkNotebook*" style "gnome_terminal_notebook"</pre><br /><br />po tym tylko restart aplikacji i zmiana powinna być widoczna.<br /><br />na podstawie:<br /><br /><a href="http://askubuntu.com/questions/40332/how-to-make-selected-tab-in-terminal-more-prominent">http://askubuntu.com/questions/40332/how-to-make-selected-tab-in-terminal-more-prominent</a>Przemysław Wróblewskihttp://www.blogger.com/profile/00315640642865740907noreply@blogger.com0tag:blogger.com,1999:blog-2691963304184624077.post-68353426654363724392011-05-15T22:37:00.000-07:002011-05-15T23:07:39.628-07:00Ubuntu 11.04 Natty Narwhal<img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 206px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSuxjH39N8zLhSjcgIzAho2WIWj3rrsLoILJXeU_uO19aBRuaGftug1j-F7Eck8i_Zt-PwA2KhyB7uFTA-9RENapTpZ8is8n8X7sCdpJMiPKDv3qE_LPheJNIKTiAkQkS6lm-ETe73gQU/s320/Screenshot.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5607188982880070754" />Od wersji 10.04 Ubuntu zaczęło być dla mnie na tyle dopracowane, że nie śpieszyłem sie z kolejnymi upgrejdami do nowszych wersji. Natomiast zawsze z niecierpliwościa obserwowałem co tym razem zostanie dodane/zmienione w tej wyśmienitej dystrybucji. Tym razem miał być to nowy interfejs więc zaraz po pojawieniu się wersji 'stabilnej' zrobiłem 2 upgrejdy - na kompuerze domowym i na laptopie. Pierwsze wrażenie - WOW, jak to teraz wygląda, nowy luncher ala osx, i ... zwis. Wróciłem do starego kernela na desktopie (Asus P5K Pro) i zniknęły problemy ze stabilnością. Przynajmniej tak mi się wtedy wydawało ;-) Co do samego nowego lunchera - jest świetny, uwielbiam jak ikonka epiphany (chat klient) podskakuje sobie po otrzymaniu nowej wiadomości - coś czego zawsze zazdrościłem osxowi (Adium) teraz mam w ubuntu.<div><br /></div><div>Ok, teraz trochę o wadach - do tej pory nie wiem jak edytować programy w nowym luncherze, próżno szukać opcji edytuj pod prawym przyciskiem myski. Gdzieś na forach czają się opisy jak to zrobić ale nie wygląda to na trywialną operację.</div><div>Kolejna sprawa to po kilku dniach używania (robię sleep na noc w desktopie, laptop chodzi cały czas) zauważyłem że gdzieś mi pamięć znika. Winowajcą okazał się compiz - potrafi 3G pamięci zjeść przez kilka dni, magiczne <b>Alt-F2</b> i <b>compiz --replace</b> rozwiązują chwilowo problem ale trzeba pamiętac aby raz na dzień to zrobić.</div><div><br /></div><div>Podsumowując jestem zadowolony ze zmiany, Ubuntu to darmowe oprogramowanie i nie ma co od niego wymagać aby było perfekcyjne od dnia wydania, z czasem wszystkie niedogodności które napotkałem zostaną rozwiązane i dzięki automatycznym aktualizacją pojawią się na moich komputerach, lecz na przyszłość postaram się pamiętać aby nowy system instalować z kilkutygodniowym opóźnieniem.</div>Przemysław Wróblewskihttp://www.blogger.com/profile/00315640642865740907noreply@blogger.com0tag:blogger.com,1999:blog-2691963304184624077.post-19305027503547552132010-09-24T04:22:00.000-07:002010-09-24T04:31:31.381-07:00Blueconnect Huawei E122 w Ubuntu 10.04<div>Po podłączeniu modemu gsm zazwyczaj wystarczy zrobic <span class="Apple-style-span" >eject /dev/sr1</span></div><div>niestety huawei jest na to odporny :(</div><div><br /></div><div>Aby go odpalic wystarczy:</div><div><br /></div><div><span class="Apple-style-span" >$ sudo apt-get install usb-modeswitch usb-modeswitch-data</span></div><div><span class="Apple-style-span" >$ sudo usb_modeswitch -v 12d1 -p 1001 -H 1</span></div><div><br /></div><div>teraz networkmanager juz widzi modem, w dmesgu otrzymamy potwierdzenie tego faktu:</div><div><br /></div><div><div><span class="Apple-style-span" >[6020235.400753] usb 2-3: USB disconnect, address 28</span></div><div><span class="Apple-style-span" >[6020239.730122] usb 2-3: new high speed USB device using ehci_hcd and address 29</span></div><div><span class="Apple-style-span" >[6020239.881162] usb 2-3: config 1 interface 1 altsetting 0 bulk endpoint 0x85 has invalid maxpacket 256</span></div><div><span class="Apple-style-span" >[6020239.881174] usb 2-3: config 1 interface 1 altsetting 0 bulk endpoint 0x5 has invalid maxpacket 256</span></div><div><span class="Apple-style-span" >[6020239.881183] usb 2-3: config 1 interface 2 altsetting 0 bulk endpoint 0x86 has invalid maxpacket 256</span></div><div><span class="Apple-style-span" >[6020239.881191] usb 2-3: config 1 interface 2 altsetting 0 bulk endpoint 0x6 has invalid maxpacket 256</span></div><div><span class="Apple-style-span" >[6020239.883626] option 2-3:1.0: GSM modem (1-port) converter detected</span></div><div><span class="Apple-style-span" >[6020239.883820] usb 2-3: GSM modem (1-port) converter now attached to ttyUSB0</span></div><div><span class="Apple-style-span" >[6020239.884534] option 2-3:1.1: GSM modem (1-port) converter detected</span></div><div><span class="Apple-style-span" >[6020239.884700] usb 2-3: GSM modem (1-port) converter now attached to ttyUSB1</span></div><div><span class="Apple-style-span" >[6020239.885937] option 2-3:1.2: GSM modem (1-port) converter detected</span></div><div><span class="Apple-style-span" >[6020239.886088] usb 2-3: GSM modem (1-port) converter now attached to ttyUSB2</span></div><div><span class="Apple-style-span" >[6020239.887020] scsi69 : usb-storage 2-3:1.3</span></div><div><span class="Apple-style-span" >[6020239.887960] scsi70 : usb-storage 2-3:1.4</span></div><div><span class="Apple-style-span" >[6020240.883984] scsi 69:0:0:0: CD-ROM HUAWEI Mass Storage 2.31 PQ: 0 ANSI: 2</span></div><div><span class="Apple-style-span" >[6020240.883995] scsi 70:0:0:0: Direct-Access HUAWEI SD Storage 2.31 PQ: 0 ANSI: 2</span></div><div><span class="Apple-style-span" >[6020240.885180] sd 70:0:0:0: Attached scsi generic sg2 type 0</span></div><div><span class="Apple-style-span" >[6020240.903658] sd 70:0:0:0: [sdb] Attached SCSI removable disk</span></div><div><span class="Apple-style-span" >[6020240.904152] sr1: scsi-1 drive</span></div><div><span class="Apple-style-span" >[6020240.904317] sr 69:0:0:0: Attached scsi CD-ROM sr1</span></div><div><span class="Apple-style-span" >[6020240.904421] sr 69:0:0:0: Attached scsi generic sg3 type 5</span></div><div><span class="Apple-style-span" >[6020251.580164] sr1: CDROM (ioctl) error, command: Xpwrite, Read disk info 51 00 00 00 00 00 00 00 02 00</span></div><div><span class="Apple-style-span" >[6020251.580193] sr: Sense Key : Hardware Error [current] </span></div><div><span class="Apple-style-span" >[6020251.580203] sr: Add. Sense: No additional sense information</span></div></div><div><br /></div>Przemysław Wróblewskihttp://www.blogger.com/profile/00315640642865740907noreply@blogger.com0tag:blogger.com,1999:blog-2691963304184624077.post-18253451465114034702009-12-23T03:32:00.000-08:002009-12-23T03:58:36.358-08:00HP SmartArray P410i - what a piece of shit!<div>Platforma DL 160 jest oferowana w 2 wersjach 4x3,5" i 8x2,5". Pierwsza wersja jest NO Hotplug podłączona do kontrolera INTEL ICH10R, kolejna ma już kieszonki na dyski i działa na kontrolerze HP SmartArray P410i/ZM ( nie da się z niego zrezygnować, przynajmniej mi się nie udało )</div><div><br /></div>Co do samego kontrolera HP SmartArray P410i, jest to urzadzenie które z premedytacją ukrywa dyski przed systemem więc przy instalacji debiana był 1wszy zonk, gdzie mam go zainstalować?<div><br /></div><div>Pomęczyłem troche support HP i dostalem w koncu odpowiedz: "NIE DA SIE".</div><div>Ba, support był wielce zdziwiony że jak to chce wyłączyć funkcje raid w ich kontrolerze, przecież to nie będzie działać...</div><div>Pewnie tak samo sie dziwił dział zamówień że zamówilismy serwery bez cdromów... lol</div><div><br /></div><div>Wcześniej miałem doczynienia z serwerami <b>Fujitsu-Siemens</b> i do głowy mi nie przyszło że taki absurd może się pojawić, ale cóż, to tylko hp.</div><div><br /><div>Obejściem tego okazało się zrobienie fizycznej macierzy RAID z poziomu narzędzia zwanego ORCA - taki mini bios tego kontrolera, cholernie ograniczony z minimalną ilością opcji.</div><div>Teraz zamiast mieć wszędzie raid softwarowy przez to badziewie jesteśmy zmuszeni do robienia wyjątków w konfiguracji i korzystania z raidu softwarowego. Oczywiście tak samo wygląda sprawa w przypadku S.M.A.R.T - hp daje swoje własne narzędzie. Oczywiscie pod debianem to kolejny klopot bo daja to w RPM-ach do Redhata.</div><div><br /></div><div>Kolejna sprawa to wydajność, domyślnie SmartArray ma wyłączoną opcję buforowania zapisu, więc działa baaardzo słabo. Ale troche magi w narzędziu zwanym <b>hpacucli</b>, czyli:</div><div><b><br /></b></div><div><b>=> ctrl slot=4 modify drivewritecache=enable</b></div><div><br /></div><div>i udało się to włączyć.</div><div><br /></div><div>Naszczęscie kontroler ten poprawnie rozpoznał dyski INTEL-a, a tu miałem trochę wątpliwości bo nikt nie był mi w stanie tego potwierdzić. Niby wspiera SATA, ale kto wie jakie ficzery HP mógł tam dopisać...</div><div><br /></div><div>Ciekawe jak będę zmieniał firmware w tych dyskach skoro nie mam do nich dostępu z systemu...</div><div><br /></div><div>Podsumowując: narazie działają, ale ciągle żałuje że ich nie wyrzuciłem i nie zastąpiłem np INTELEM SASUC8I który ma tzw RAID-passthrough więc dyski sa normalnie widoczne.</div></div>Przemysław Wróblewskihttp://www.blogger.com/profile/00315640642865740907noreply@blogger.com0tag:blogger.com,1999:blog-2691963304184624077.post-64872536209621390332009-06-30T00:41:00.000-07:002009-06-30T00:51:07.060-07:00rcov plugin overwrites its resultstak sie dzieje dla zadania rake test:test:rcov, testy funkcjonalne nadpisuja jednostkowe itd...<div>Dlatego dodałem prosty task:</div><div><br /></div><div><br /><pre name="code" class="Ruby"><br />for test_task in %w(test:units test:functionals test:integration)<br /> task_name = "rcov:set_proper_output_directory_for_#{test_task.gsub(/(test:)/,'')}".to_sym<br /> task task_name do |t, args|<br /> t.name =~ (/set_proper_output_directory_for_(.*)/); test_type=$1<br /> RcovTestSettings.output_dir = File.expand_path("./coverage/#{test_type}")<br /> end<br /> task test_task.to_sym => task_name <br />end<br /></pre><br /><br /><div>który uruchamia się przed każdym testem i ustawia poprawny katalog gdzie rcov ma zapisywać.</div><div>Inne rozwiazanie znalazłem na blogu ale nie udało mi się go uruchomić(nie bawiłem sie nad tym): </div><div><a href="http://programmers-blog.com/2009/06/05/rconv-rails-rake-task-test-test-rcov-overwrites-its-output">http://programmers-blog.com/2009/06/05/rconv-rails-rake-task-test-test-rcov-overwrites-its-output</a></div></div>Przemysław Wróblewskihttp://www.blogger.com/profile/00315640642865740907noreply@blogger.com0tag:blogger.com,1999:blog-2691963304184624077.post-45386437194818479232009-05-31T04:09:00.000-07:002009-05-31T04:35:16.444-07:00Multiple database connections in Rails with tests and fixturesKolejnym problemem okazało sie wykorzystanie fixturek w testach które miały by działać na różnych bazach.<br /><br />Same fixturki można ładnie rozrzucić po różnych katalogach:<br /><blockquote>fixtures/<br /> import/<br /></blockquote>i ładować je przez<br /><blockquote>fixtures :"import/fixture_name"</blockquote>jednak domyślnie klasa Fixturek korzysta z ActiveRecord::Base.connection więc cały plan legnie w gruzach.<br />W tym miejscu na ratunek wychodzi kolejny plugin: use_db<br /><blockquote>script/plugin install git://github.com/remi/use_db.git</blockquote>W modelach zamiast estabilish_connection dajemy:<br /><blockquote>use_db :prefix => "import_", :rails_env => RAILS_ENV.split('_').last<br />self.abstract_class = true<br /></blockquote>Plugin ten nadpisuje domyślne ładowanie fixturek i jeśli znajdzie pasujący model do fixturki który korzysta z use_db to wykorzysta Model.connection zamiast AR::Base.connection do operacji ładowania danych.<br /><br />Co do wypełnienia bazy schemą to wykorzystałem loopy_multiple_databases:<br /><blockquote>RAILS_ENV=import_development rake db:test:load</blockquote><blockquote></blockquote>niestety w samych testach nie działa odwoływanie się do fixturek przez<br /><blockquote>fixture_name(:rekord)<br /></blockquote>więc trzeba rekordy wczytywać ręcznie, ale jeszcze nad tym będę pracował.<br /><br />Linki:<br /><a href="http://www.elctech.com/tutorials/using-and-testing-rails-with-multiple-databases">use_db blog entry</a><br /><a href="http://github.com/remi/use_db/tree/master">use_db fixed git clone</a>Przemysław Wróblewskihttp://www.blogger.com/profile/00315640642865740907noreply@blogger.com0tag:blogger.com,1999:blog-2691963304184624077.post-17517087830710053392009-05-28T03:39:00.000-07:002009-05-28T05:53:34.951-07:00Multiple database connections in Railsw obecnym projekcie wykorzystuje naraz 3 różne bazy danych, dodatkowo ostatni typ jest shardowany - czyli występuje na wielu maszynach.<br /><br />O ile dostęp do wielu baz naraz można uzyskać przez definicje w stylu<br /><blockquote>development:<br /> <<: *dev_basics<br /> database: import_sharded<br /> host: 127.0.0.1<br /><br />import_development:<br /> <<: *dev_basics<br /> database: import<br /> host: 127.0.0.1<br /></blockquote>a następnie przez stworzenie modeli Proxy:<br /><blockquote>class ImportProxy < ActiveRecord::Base<br /> establish_connection "import_#{RAILS_ENV.split('_').last}"<br />end</blockquote>o tyle problem pojawia się w migracjach - jak zapewnić aby migracje działały na różnych bazach ?<br /><br />Sprawa okazała się trywialna:<br /><blockquote>class CreateImportOffers < ActiveRecord::Migration<br /> def self.connection<br /> ImportProxy.connection<br /> end<br /> <br /> def self.up<br /> create_table :offers do |t|<br /></blockquote>wystarczyło nadpisać metode connection.<br /><br />Tu jednak sprawa sie nie kończy bo jak pisałem na wstępie mamy to do czynienia z bazami shardowanymi a informacje o przeprowadzponych migracjach są trzymane tylko w 1 miejscu,<br />czyli jesli serwer S1 wykonal wszystkie migracje - czesc globalnych a czesc lokalnie na swojej bazie , zakładam że główne połączenie jest do bazy wspólnej to serwer S2 już nic nam nie będzie chciał zrobić a jego baza lokalna pozostanie pusta. Odwracając sytuacje gdzie główne połączenie jest na bazie lokalnej to wystąpi konflikt przy migracjach na bazie wspólnej - 1 z serwerów nie będzie wiedział że migracje już zostały wykonane.<br /><br />Rozwiązanie ? Może 2 osobne projekty - 1 działający na maszynach shardowanych a 2gi działający na maszynie wspólnej ?<br /><br />Taki też był pierwszy pomysł, ale w rzeczywistosci oba projekty różniły by się jedynie katalogiem migracji i plikiem databases.yml - wszystko inne było by w jakiś sposób linkowane.<br />Bez sensu.<br /><br />Naszczescie znalazlem gotowe rozwiązanie tego problemu - plugin <a href="http://playtype.net/past/2008/3/27/multiple_databases_in_rails_without/">loopy_multiple_databases</a><br /><br />Co to mi dało ?<br /><br />Teraz mam możliwosc spearacji migracji per środowisko - osobne podkatalogi w db/migrate, w zależniości od sposobu uruchamiania wykonuje się inny zestaw migracji:<br /><blockquote>RAILS_ENV=import_development rake db:migrate:up VERSION=20090520143515<br />RAILS_ENV=development rake db:migrate:up VERSION=20090520113821</blockquote>domyślne zadanie rake db:migrate zostało nadpisane i powoduje wykonanie migracji na wszystkich zdefiniowanych środowiskach poprzez uruchomienie:<br /><blockquote>RAILS_ENV=srodowisko rake db:migrate_without_other_databases<br /></blockquote>Przemysław Wróblewskihttp://www.blogger.com/profile/00315640642865740907noreply@blogger.com0tag:blogger.com,1999:blog-2691963304184624077.post-42578104603431921132009-05-19T14:05:00.000-07:002009-05-28T05:56:36.601-07:00Rake - multiple task execution / invocationstandardowo taski Rake dają się uruchomić tylko raz, ponowne ich wywołanie nic nie daje.<br />Problem z którym się spotkałem polagał na tym aby móc uruchomić pojedyńczy task z konsoli jak i wykonać serie pojedyńczych tasków z innego zadania rake. Poniższy przykład wszystko wyjaśni:<br /><pre><br />task :start do<br />$queue = Queue.new<br />$queue << start_jobs =""> [:working1, :working2] do<br />puts "start_jobs END"<br />end<br /><br />task :working1 do<br />process_shop(1)<br />end<br /><br />task :working2 do<br />process_shop(2)<br />end<br /><br />def process_shop(worker_id)<br />while true do<br /> shop_id = $queue.pop(false)<br /> puts "[#{worker_id}]processing shop: #{shop_id}"<br /> t = Rake::Task['shop_job']<br /> t.reenable<br /> t.invoke(shop_id, worker_id)<br /> sleep 1<br />end<br />rescue<br />end<br /><br />task :shop_job, [:shop_id, :worker_id] do <code class="moz-txt-verticalline"><span class="moz-txt-tag">|</span>t, args<span class="moz-txt-tag">|</span></code><br />puts " [#{args.worker_id}]hello from shop_job #{args.shop_id}"<br />end<br /><br /></pre>Przemysław Wróblewskihttp://www.blogger.com/profile/00315640642865740907noreply@blogger.com0