czwartek, 8 marca 2018

React Native Debugger + Expo + Windows

(based on
https://github.com/jhen0409/react-native-debugger/issues/84#issuecomment-303962375
and
https://streetsmartdev.com/debugging-react-native-expo-using-react-native-debugger/)

assumption: react native v. 0.52

1. Download https://github.com/jhen0409/react-native-debugger/releases and unpack it
2. npm install --only=dev react-native-debugger-open
3. In your package.json: 
"scripts": {
  "postinstall": "rndebugger-open --expo"
}
4. Find file node_modules/react-native/Libraries/Core.Devtools/setupDevtools.js and change 'localhost' to your phone address in local network
5. Run unpacked React Native Debugger.exe app
6. Close browser debugger-ui if opened
7. Run exp start . --lan
8. Manually run npm run postinstall in another terminal

9. Remember to set remote js debugging

piątek, 23 maja 2014

ERROR: Error installing json (openSUSE)

Building native extensions. This could take a while...
ERROR: Error installing json:
              ERROR: Failed to build gem native extension

              /usr/bin/ruby2.0 extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib64/ruby/include/ruby.h



the solution is:

zypper install ruby-devel

piątek, 11 kwietnia 2014

OpenCV HOWTO: capture camera and do linear transformation on image

In this tutorial I'll try to show you how to do magic with OpenCV. I hope you've already installed it. We'll need some standard namespaces:

First, we have to create some Mat objects in which we'll store our images:
And variables to store linear transformation values:
Then we intialize capturing camera image:
And open windows to show results:
Then we have to open infinite loop. In each iteration we have to capture the image from camera:
We can also make it gray:
If we want to get negative image, we have to subtract the image pixels values from 255 (because 255 is maximum value):
If we want to get color negative image, we have to subtract the image pixels values in all dimensions (3) from 255:
For linear transformation we have to calculate each dimension of each pixel. If we have to increase (decrease) contrast, we have to multiply source value by value grater than 1 (smaller than 1). Adding (subtracting) value to the source gives increased (decreased) brightness:
Next we want to show our images:
At the end, we want to manipulate the values to linear transformation by pressing arrows or pressing ESC to leave the application.
That's all, hope you'll find it useful!

czwartek, 13 marca 2014

[System.Windows.LayoutCycleException] = {System.Windows.LayoutCycleException: Layout cycle detected. Layout could not complete.}

Having code like this:
<phone:LongListSelector>
  <phone:LongListSelector.ItemTemplate>
    <DataTemplate>
      <StackPanel>
        <Image/>
      </StackPanel>
    </DataTemplate>
  </phone:LongListSelector.ItemTemplate>
</phone:LongListSelector>


and a problem like this:
[System.Windows.LayoutCycleException] = {System.Windows.LayoutCycleException: Layout cycle detected.  Layout could not complete.}


you should do this:
<StackPanel Width="446">


or this:
<Image Stretch="None"/>

Problem solved.

sobota, 8 lutego 2014

EmguCV / OpenCV - synonim wiecznego problemu... (HRESULT: 0x8007007E)

OpenCV i jej wrapper EmguCV są potężnym narzędziem, którego możliwości są doprawdy ogromne. Niech jednak podniesie rękę ten, kto nie zna TypeInitializationException. Pracuję na Win8.1 64bit, i niestety w tym przypadku problem nie okazał się trywialny (spędziłam nad nim dobrych parę godzin w ciągu dwóch dni). Po podłączeniu wszystkich wymaganych DLLek, jak każą wszystkie tutoriale i wszystkie rozwiązane problemy na StackOverflow, dostałam błąd:
(*)
{System.DllNotFoundException: Nie można załadować biblioteki DLL 'opencv_core290': Nie można odnaleźć określonego modułu. (Wyjątek od HRESULT: 0x8007007E)
   w Emgu.CV.CvInvoke.cvRedirectError(CvErrorCallback errorHandler, IntPtr userdata, IntPtr prevUserdata)
   w Emgu.CV.CvInvoke..cctor()}

Co ciekawe, po podmianie opencv_core290.dll (i innych) na wersję odpowiednią dla mojego systemu (64bit) błąd zmienił się na następujący:
(**)
{System.BadImageFormatException: Próbowano załadować program w niepoprawnym formacie. (Wyjątek od HRESULT: 0x8007000B)
   w Emgu.CV.CvInvoke.cvRedirectError(CvErrorCallback errorHandler, IntPtr userdata, IntPtr prevUserdata)
   w Emgu.CV.CvInvoke..cctor()}

Po zmianie bitowości (jak każe tutorial EmguCV) w zakładce Build w propertiesach projektu znowu dostałam błąd (*)...
Wait... what?! czy ja dobrze widzę? Jak wrzucę coś, co się nie zgadza bitowo to mówi, że mu się nie zgadza, a jak wrzucę coś dobrego, to w ogóle tego nie widzi?!
Po przejściu wszystkich możliwych tutoriali instalacji ze skutkiem co najwyżej mizernym opracowałam metodę nachamową, która jest rozszerzeniem poprzednio znanych, opartych na: http://www.emgu.com/wiki/index.php/Download_And_Installation#The_type_initializer_for_.27Emgu.CV.CvInvoke.27_threw_an_exception.

Metoda ta zawiera się w prostej instrukcji:

Copy BOTH of the folders x86 AND x64 from /bin folder from Emgu installation folder to the Debug (Release) folder of your solution. 

Działa? działa.

poniedziałek, 13 stycznia 2014

f*ck jako słowo klucz

5 lat studiów i specjalizowania się na admina, 2 lata wolontariatu w admince na pierwszej uczelni, zaciskanie RJ'tek zębami i paznokciami a człowiek jak głupi jest, tak i będzie. Jednak jak uczono mnie od podstawówki: Wstęp, rozwinięcie, zakończenie.

Wstęp
Jak każdej wolnej niedzieli, obudziliśmy się wczesnym rankiem o 11. Po zjedzonym śniadaniu przyszła kolej na Internet Hour(s). Do trzeciej przeglądałem zdjęcia kotów w internetach (-"znowu gołe baby oglądasz"), podczas gdy "M" pisała komunikację sieciową w swojej magisterce, w której nieoficjalnie zostałem Product Ownerem (w myśl ScrumagilekanbanBEST technik nowoczesnego pisania kodu).
Niestety napadła mnie myśl, że trzeba coś produktywnego zrobić w życiu. Przez 15 minut odganiałem ją skutecznie, ale jak przyprowadziła kolegów (wyrzuty sumienia), to sponiewierali mnie nazbyt mocno i musiałem się poddać.

Rozwinięcie
-Chcesz coś ze sklepu?
-Mrrrrumiau? - odpowiedziała kotka (mała, czarna, włochata, nie "M"), która leniwie przeciągnęła się po nowo zdobytej przestrzeni na moim krześle
-Co dziś na obiad? - należało już do "M". Uwielbiam te słowne potyczki, zadaj pytanie na pytanie, zaśmiej się z regionalizmu biednego chłopa ze wsi, dorzuć niemieckie słowo w myśl krzyżackiej zasady przystosowywania podległych ludów, itd.
-Zrobie coś, chcesz coś ze sklepu?
-Na jutro na obiad kup to, to i to
Zwycięstwo w tej małej potyczce nie smakowało jednak tak jak dawniej. Zebrałem więc w myślach listę zakupów i po 30 minutach wróciłem z pełną torbą nijak mającą się do tejże listy.
-Nie było kurczaka, kupiłem parówki
Nasz osiedlowy market popularnej francuskiej sieci, rządzi się w niedzielę specyficznymi zasadami. Nigdy nie dostanę tam w ten święty dzień kapusty pekińskiej. W sobotę cały zapas wykupowany jest przez polskie Perfekcyjne Panie Domu, które od dziesięcioleci przygotowują co tydzień najważniejsze polskie danie, znane na całym świecie - Schabowe z ziemniakami i kapustą pekińską. Problemem jest także mięso, więc pamiętając o kurczaku trzeba się zadowolić parówkami, o ile będą.

Następnę 4 godziny zeszły mi na sprzątaniu tego burd... kuchni i gotowaniu kebabu z ryżem i zieleniną.
Pardon! Shoawermy z brokułem gotowanym na parze.

Po wciągnięciu przez odkurzacz połowy choinki (samoskładającej się! ale tylko raz), doszedłem do wniosku, że w końcu mogę zabrać się za coś ciekawego. Czyli wróciłem do problemu, nad którym straciliśmy poprzednie dwa wieczory.
-Te ustawienia robią tak, że jak pytasz po domenie, to przekierowuje na inny katalog, a po adresie na ten pierwszy, Apache czyta nagłówek zapytania i sprawdza, jak ktoś zawołał ten serwer
-Acha, ale nie działa. Czekaj, zadzwonie do taty
Kilka chwil później, mimo przekierowywania portów przez tajwańskie serwery proxy, proste zapytanie po domenie nadal nie chciało zwrócić oczekiwanej odpowiedzi. Postanowiłem, że zapoznam "M" z najcięższą bronią dostępną w wyszukiwarce google.
-Wpisz: "Why, for f*ck sake, this f*ckin' Apache isn't f*ckin' workin'. F*ck"
Jednak "M" nie chciała tego spróbować, obawiając się pewnie, że agenci NSA już nas namierzają i będzie na nią. Za to wpisała magiczny adres jeszcze raz, używając tym razem podglądu zapytań przeglądarki.
-To zapytanie idzie dwa razy, wpierw po domenie, a potem po adresie IP - oznajmiła, z nieukrywanym zdziwieniem. "Nic nowego, widziałem to już dwa dni temu" pomyślałem, ale zanim cokolwiek powiedziałem, usłyszałem:
-To jest ramka, przekierowanie w ramce, on wyświetla ramkę!
Nożesz kurczaczki pieczone! Jak zwykłe przekierowanie domeny na adres IP może wyświetlać zawartość tegoż. Tknęło mnie jednak coś innego:
-Pokaż mi jak przekierowałaś domenę
-Ale ja sie na tym nie znam, masz tu mój panel i patrz:

Przekieruj domene na IP/URL/hostname:
naszadomena.pl : http://123.123.0.123/

Kurtyna, dziękuje, dobranoc.


Zakończenie
home.pl jest świetnym dostawcą usług internetowych. Jedną z wielu rzeczy, którą oferują, jest przekierowanie domeny na adres url. Niestety, informacja o tym, że jest to robione tylko i wyłącznie za pomocą ramki, schowana jest na samym końcu strony "Więcej o przekierowaniach", którą Informatyk przez duże I, taki jak ja, po prostu nie czyta.
Informacja dla niezbyt kumatych komputerowo: Trzeba było wpisać tylko naszadomena.pl : 123.123.0.123. "M" ze zboczeniem pisania aplikacji WWW, użyła zamiast tego "http://123.123.0.123/". A ja zamiast sprawdzić w tamtym miejscu, od trzech dni zmieniałem ustawienia biednej sierotce Apache.

Epilog
Kota przeciągnęła się leniwie na swojej połowie krzesła. O godzinie 23 udało mi się uruchomić edytor tekstowy do swojego projektu. Wyrzuty sumienia wraz z produktywną myślą dawno zdechły ze śmiechu więc korzystając z ich nieobecności, uśpiłem maszynę i rzuciłem się w błogie objęcia Piaskowej Dziuni (żeńska wersja Piaskowego Dziadka).

środa, 8 stycznia 2014

chciałbym z tobą pouprawiać… pair programming.

- chcesz to zrobić ze mną?
- sam to zrób, szybciej będzie
- kochanie, chciałbym z tobą pouprawiać pair programming
- g**no programming.


Dwóch devów w jednym stało domu. Po spędzaniu z sobą, chcąc nie chcąc, prawie 24h/dobę przez miesiąc przy kodzie, przez jakiś czas sklejaliśmy związek z powrotem. Kiedy ktoś ci wytyka błędy w kodzie i tym kimś jest bliska osoba, podwójnie ciężko jest to przełknąć. W dodatku nie masz potem do kogo przyjść i powiedzieć ‘wiesz co, ale on to się nie zna na niczym, dupa nie programista’, wyżyć i powyzywać, bo przypadkowo to do tej osoby zawsze przychodzisz w tym celu.
Tak, ‘you are not your code’, gdzieś już to słyszałam. Jakoś mnie nie przekonuje, kod się sam nie pisze. Źle napiszę wypracowanie na polski to dostanę pałę. Jeśli takich pał zbiorę kilka, to znaczy że coś jest nie tak. Ergo - kod świadczy o twórcy, koniec kropka.

//właśnie usłyszałam suchara:
jak to było? ‘control kocham cię’*?

Właśnie dlatego jak ognia wystrzegałam się wspólnego kodowania aż do zeszłej niedzieli. Dzisiaj właśnie sobie przypomniałam dlaczego. Każde ma swoją działkę i niech tak zostanie. Dwoje koderów (w ogóle dwoje ludzi jednego zawodu) dzielący mieszkanie i życie, nie wydaje się zbyt rozsądne. Nuda, rutyna, w końcu ile można rozmawiać o tym samym?

Ma to jednak swoje dobre strony, można razem pograć na konsoli, pozachwycać się nowinkami technicznymi, konkurować na tle posiadanego sprzętu (i te docinki ‘a twoja maszyna to udźwignie?’, ‘a, bo ty nie masz ssd…’ itp.) i siedzieć do nocy i debugować ‘bo nie działa a przecież powinno’. Z trzeciej strony, idziesz do pracy - programiści. Idziesz do szkoły - programiści. Przychodzisz do domu - programista i kot. Czasem można mieć dość. Cóż, całe życie z komputrami. Tyle słowem wstępu. Życzę nam powodzenia i wytrwałości, żeby nie skończyło się na jednym wpisie.

*ctrl+k+c komentuje zaznaczenie w VS