Archiwum

Archive for Sierpień 2013

Piraci napadają na przedsiębiorczych czyli jak Gdańsk po raz kolejny uczy realizować marzenia

Sierpień 21, 2013 Dodaj komentarz

Inkubator Starter organizuje mini-program akceleracyjny, który zakłada tydzień intensywnego ćwiczenia przedsiębiorczości. Założenie jak w życiu – nie wszyscy mogą mieć swoją firmę, nie wszyscy odniosą sukces, ale wszyscy powinni sprawdzić siebie w egzekucji swoich marzeń I to chyba najlepsza definicja tego co prywatnie każda osoba może wyciągnąć z tygodnia przebywania z praktykami biznesu.

Zasada jest prosta, dowiesz się tyle ile wiedzy wchłoniesz, a wchłoniesz tyle ile pytań zadasz. Nie ma nic za “darmo”, nie ma drogi na skróty, ale to szansa, którą można wykorzystać w dobry sposób.

evento_setembro2012-porto_v1.1

Do zobaczenia w Gdańsku! Strona internetowa wydarzenia to http://gdansk.startuppirates.org

Windows Phone–doza ryzyka + dobry pomysł => ~sukces

Sierpień 19, 2013 4 komentarze

Tytuł podsumowuje moje przemyślenia na temat tej technologii, jakie mam od kilku miesięcy w mojej głowie. Jako PlaceChallenge zaryzykowaliśmy ostatnio z aplikacją, która jest planem lekcji dla uczniów– I co się okazało?

Ludzie to ściągają. Aplikacja z dnia na dzień rośnie prawie o 20% w ilości ściągnięć. Potocznie można powiedzieć… leci jak przeciąg w wiosenny poranek. Nie można inaczej powiedzieć o aplikacji, która ma kilka tysięcy ściągnięć dziennie.

image

Niestety nic tu nie jest przypadkowe, to wypadkowa doświadczeń zdobytych na polu innych aplikacji wydanych dla tego MarketPlace.
  • Aplikacja musi mieć nazwę – to nie żart. To ważny temat ponieważ Google, Apple I Microsoft mają mechanizm rozmyty do badania słów (Fuzzy Lookup / Fuzzy Grouping). Ostatni przykład aplikacji Photom wydanej przez znajomych pokazuje, że sklepy uznają to za literówkę I poprawiają automatycznie słowo do wyszukania na Photo, które mają w słowniku.
  • Aplikacje płatne się nie ściągają w Windows Phone. Nie oznacza to, że w ogóle się nie ściągają, ale przełożenie płatne – bezpłatne to 2% dla tych pierwszych. Na konferencjach słyszymy, że aplikacje płatne ściągają się 10 razy lepiej jeżeli mają wersję demo (try version) – to prawda, ale to jest właśnie to 2%. Jeżeli masz płatną aplikację bez wersji demo (czyli można ściągnąć cokolwiek za darmo) twoja aplikacja praktycznie nie będzie kupiona ani razu. Ludzie odzwyczaili się od kupowania kota w worku.
  • Czytanie komentarzy ma sens – omijam osoby, które piszą, że jesteśmy najgorszymi ludźmi na świecie bo wymagamy dostępu do Internetu. Wszystkie poprawki jakie wyszły po wersji 1 były spowodowane komentarzami, które sugerowały kolejne funkcjonalności.
  • Aby ktoś ściągnął aplikację musi ona dać się znaleźć. By dała się znaleźć trzeba wiedzieć czego ludzie szukają, albo mogą szukać.
    • Możemy wybrać się na wycieczkę do Google Trends I zobaczyć czego ludzie aktualnie szukają, mamy podział na kraje I daty http://www.google.com/trends/?hl=pl
    • Z niewiadomych dla mnie powodów nie ma narzędzi do analizy słów kluczowych aplikacji dla Windows Phone MarketPlace. Tutaj musimy się posiłkować (powinniśmy my!) narzędziami dla na przykład AppStore. Polecam narzędzie autorstwa Tomka Kolinko AppCod.es – to narzędzie może pomóc znaleźć nam popularne słowa połączone z aplikacją, którą wydajemy. Takie słowa to pomoc dla wyszukiwarek, które mogą nam zaprezentować potencjalnym użytkownikom.
    • Możemy próbować wpasować się w aktualne wydarzenia, my wpasowujemy się w rozpoczynający się za chwile rok szkolny – jesteśmy dodatkowo w kilku krajach promowani w sekcji “Powrót do szkoły”

image

a po wejściu do środka (School Timetable)

image

  • Microsoft chętnie promuje popularne aplikacje w innych krajach.

image

My dzięki uprzejmości Microsoftu zwiedziliśmy już jako polecana aplikacja

  • Polskę
  • Chiny
  • Indie
  • Japonię
  • Niemcy
  • Wielką Brytanię
  • za chwilę będziemy w USA

Tu niezwykle ważne jest to, że inicjalnie Nasza aplikacja musi wygenerować ruch (być ściągana), nie mieć zarejestrowanych błędów I mieć względnie dobre komentarze.

Pytanie zasadnicze… I co z tego? Gdzie są pieniądze?

No tak, zasadniczo przyjdzie moment, w którym zadamy sobie to pytanie. W naszym przypadku, prób płatnych aplikacji, płatnych z wersją demo I bezpłatnych utknęliśmy w momencie, w którym ściąga się tylko jak jest bezpłatna. Współczynnik był niestety na poziomie 0 ściągnięć (przy płatnej dziennie przez 7 dni) do kilku tysięcy dziennie po zmianie na opcję bezpłatną… sic!

Zastanówmy się w takim razie co mamy… mamy dziesiątki tysięcy użytkowników… co można z nimi zrobić? … … … może pokazać reklamę?

Bingo!

Reklamy działają, reklamy przynoszą pieniądze, ale…

  • działają tylko wtedy kiedy mamy użytkowników w aplikacji,
  • dają pieniądze, kiedy ludzie prócz zainstalowania uruchamiają aplikację często – mają powód do tego.
Podsumowanie?
  • znalezienie potrzeby, dopasowanie do nadchodzących wydarzeń, odpowiedź na narastającą potrzebę
  • prosta realizacja
  • spowodowanie, że będziemy widoczni (słowa kluczowe, dobry opis)
  • analiza komentarzy
  • rozbudowa produktu, małe zmiany – częste wydania – badanie opinii ponownie
  • dobranie odpowiedniego stopnia monetyzacji. Nie przetestujemy czy aplikacja by się kupiła kiedy ludzie inicjalnie jej nie ściągają. Jeżeli mam 10 ściągnięć tygodniowo I zamienię na wersję płatną mam całkiem inny wynik badań I przekłamanie niż gdybym inicjalnie wygenerował stabilnie kilka tysięcy ściągnięć I zamienił na chwilę aplikację na wersję płatną.
  • Nie liczyć na szczęście – to czy ktoś ściągnie Naszą aplikację czy nie ma niewiele wspólnego ze szczęściem.

Powodzenia!

Dzień bez błędu Entity Framework dniem straconym–dziś HRESULT 2146233079

Sierpień 18, 2013 Dodaj komentarz

Niezwykle udana nocka przy migracji PlaceChallenge z EF 4 na 5 zaowocowała porannym uderzeniem jak grom z jasnego nieba… w postaci HRESULT 2146233079.

return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<GameInfo_DataDomain>("GetGameInfoById", gameIdParameter);
System.InvalidOperationException was unhandled by user code
  HResult=-2146233079
  Message=Wartość właściwości EntityCommand.CommandText jest nieprawidłowa dla polecenia StoredProcedure. Wartość EntityCommand.CommandText musi mieć formę „ContainerName.FunctionImportName”.
  Source=System.Data.Entity

Błędy tego typu strasznie źle mi się kojarzą.. z jakimś złym COM/OLE/C++ I tym podobnym dziwom – a ja przecież jestem w C# jakby zapominając, że dalej jestem w Windows.

Po kilku godzinach mozna powiedzieć, że rozwiązanie proste jak drut.

Entity Framework by działać potrzebuje mieć poprawnie skonstruowany ConnectionString, który jest trochę bardziej skomplikowany od takiego zwykłego znanego z ADO.NET.

<connectionStrings>
    <add name="placechallenge_getchi_prodEntities" connectionString="metadata=res://*/DataModel.csdl|res://*/DataModel.ssdl|res://*/DataModel.msl;provider=System.Data.SqlClient;provider connection string="data source=XXXX;initial catalog=XXX;persist security info=True;user id=XXX;password=XXX" providerName="System.Data.EntityClient" />
  </connectionStrings>


Tłumacząc z języka Microsoftu na Nasz… mamy nazwę, metadane I informacje o serwerze I technologii dostępowej.

  • Nazwa – wiadomo, nie trzeba tłumaczyć mam nadzieję
  • Technologia dostępowa – tutaj SQLServer
  • Informacje o serwerze – loginy, hasła, adres do serwera, nazwa bazy danych
  • Metadane… to jest właśnie winowańca całej sprawy. W momencie wygenerowania modelu na podstawie bazy dostajemy gratis trzy pliki, jeden mapuje aktualny stan obiektów stworzonych przez EF, drugi ma spisane jak wyglada baza (tabele, kolumny, procedury, parametry), a trzeci mapuje jedno w drugie.

 

U mnie było nawiązanie do starych plików, nie nowych… I ot to mamy błąd HRESULT.

Kategorie:.NET Tagi: ,

Błąd w systemie transakcyjnym IdeaBank rozdaje pieniądze. Czyżby reklamy mówiły prawdę, że to bank przyjazny przedsiębiorcom?

Sierpień 13, 2013 2 komentarze

To co się stało to dostałem do dyspozycji dwa razy więcej pieniędzy niż faktycznie tam dziś miałem. Pytanie kto jest winny I czy zasadna będzie ewentualna kara za debet, na który nie mam umowy?

Pominę dzisiaj kwestię bezpieczeństwa bo jest to temat na osobny wpis, a sądzę, że gra nie warta świeczki to jednak warto wspomnieć o innym ciekawym “feature” w systemie transakcyjnym. Ten trick działa często (nie zawsze) rano, na przeglądarkach Chrome I Internet Explorer 10+.

Dzisiaj na tapecie są przelewy!

Sytuacja z życia wzięta, kwoty prawdziwe… a co, nie mam nic do ukrycia.

Schemat wydarzeń:

  • Na koncie wczoraj było 327,12zł
  • Przychodzi przelew na kwotę 2500,00zł I nie ma tu wielkiej matematyki… mam na koncie 2827,12zł.
  • Dzisiaj rano wykonuję szybkie 3 przelewy w sumie na kwotę 972,40 zł… na koncie zostaje 1854,72zł – powiedzmy, że na razie jest OK.
  • Wykonuję przelew całości tego co pozostało do innego banku I od teraz nagle na rachunku widzę znowu to co widziałem przy pierwszym zalogowaniu czyli 2827,12zł… czyli jakby wszystkie 4 przelewy nie zostały wykonane, ale historia mówi że jednak były, a hasła smsowe są na moim telefonie – nie śniło mi się!

Od teraz jest dziwnie… skoro bank mi zwrócił moje pieniadze to czemu by nie przelać całości znowu gdzieś… I co się okazuje?! Mogę! Udało się! Przychodzi hasło sms, potwierdzam I pieniądze znikają tym razem zerując mi stan konta.

Jako dowód mam historię przelewów I hasła sms do potwierdzenia tych transakcji. Komentarz pozostam innym.

Kategorie:Life Hacking

Entity Framework 5.0, który czasami udaje 4.4–czyli jak zbudować system wersjonowania, który będzie dla nas mało czytelny I jednocześnie udawał że jest OK!

Sierpień 13, 2013 1 komentarz

Dzisiaj temat z natury “ciekawy świata” I od razu idziemy do Visual Studio. Jako przykładny architekt jednego z moich rozwiązań postanowiłem swego czasu zrobić upgrade (używając systemu do aktualizacji wersji NuGET) Entity Framework do stabilnej wersji 5.0.

Klik tu, klik tam I mam wersję 5.0. Ucieszony sobie programuje I niczym się nie przejmuje, aż tu nagle… nie wiem dlaczego pokusiło mnie by zobaczyć jaką mam wersję Entity Framework w referencjach I co się okazuje…. że 4.4!

image

Problem w tym, że wersja 4.4 oficjalnie nie istnieje (sic!). Okazuje się, że ktoś wpadł na pomysł, że poreklamuje co to ciekawego ma w nowościach Entity Framework 5 (np: obsługa typów Spatial, enum), ale pozwoli z tego przywileju korzystać tylko osobom, które zmieniają target framework rozwiązania na .NET 4.5 (sic!). Jak masz target framework na poziomie 4.0 to po cichu zamiast EF 5.0 instaluje się 4.4, który nie ma wspomnianych nowości.

No I jeszcze jedno…jak już się połapiemy, że popełniliśmy błąd (bo to przecież Nasza wina) I zmienimy wersję framework na 4.5 to dllka EF nie zmieni się na wersję 5.0. Update NuGET nie zadziała, bo przecież on uznaje, że ma najnowszą wersję (ma wpisane 5.0) w konfiguracji. Pozostaje usunąć wpis z pliku packages.config I zainstalować EF od nowa. Powodzenia Smile

Kategorie:.NET Tagi: ,

MVC 4 + Reactive Framework 2.0 robią ze mnie idiotę–czyli jak biblioteka .NET twierdzi, że nie wie czym jest .NET

Sierpień 11, 2013 2 komentarze

Czasem sobie myślę, że jeszcze jeden dzień I stracę cierpliwość do tego jak niektóre technologie ze sobą działają… współdziałają… nie działają.

Postanowiłem doinstalować wczoraj Reactive Framework (RX) do mojego świeżutkiego projektu ASP.NET MVC 4.0… I oto co zobaczyłem po uruchomieniu:

image

ogólnie katastrofa… widzę komunikat “type ‚System.Object’ is defined in an assembly that is not referenced”… a jeszcze przed chwilą było wszystko dobrze.

Okazuje się, że musimy dodać oto taką linijeczkę do web.config by wszystko zadziałało znowu jak dawniej – sekcja <system.web> w pliku web.config katalogu Views:

<compilation debug="true" targetFramework="4.5">
      <assemblies>
        <add assembly="System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
      </assemblies>
    </compilation>

I znowu działa.

Entity Framework i wstrzykiwanie otwartego połączenia–czyli wyjaśniamy czym jest Connection Polling I jak sobie z nim radzić

Sierpień 5, 2013 Dodaj komentarz

Odkrywam kawałek tajemnicy dla osób, które zamierzają tworzyć strony internetowe używane przez tysiące…. jednym z wąskich gardeł jest Baza Danych… sic! Nie będę się tu wdawał w kwestie budowania architektury, dobrej I złej. Bardziej chciałbym naświetlić pewien problem I możliwe rozwiązanie.

Bazy danych w .NET Framework w większości (zakładam, że 99% przypadków), są obsługiwane przez mechanizm ADO.NET, a ten bazuje na ConnectionString do źródła danych, który jest zdefiniowany według wzoru zgodnego z bazą do której się łączymy. Różne wzory znajdziemy tutaj – http://www.connectionstrings.com/

Różne bazy, różne wymagania, ale jednym stałym punktem jest tak zwany Connection Pooling… o których jak się okazuje niewiele osób wie.

Connection Pooling to mechanizm, który pozwala zachować (cache’ować) otwarte połączenia do bazy danych by móc je wykorzystać ponownie podczas kolejnych zapytań bez potrzeby otwierania nowych kanałów do serwera. Niewiele osób wie, że jak nie zdefiniujemy nic sami, to standardowo mechanizm jest włączony I ma limit do 100 połączeń.
Jeżeli aplikacja wykorzystuje w jednym momencie 100 połączeń do bazy (wykonuje 100 zapytań)… I próbuje otworzyć 101 to po odczekaniu odpowiedniego czasu (timeout) otrzymamy Exception. Nie jest to ciekawe…. dodatkowo mało deterministyczne, jakby to powiedział programista “U mnie działa”.

W jednym z projektów jakie ostatnio widziałem była dość ciekawa pętla, która potrafiła otworzyć kilka…dziesiąt połączeń per użytkownik, per request. Panic mode pełną parą.

Rozwiązanie tego bez znaczącej zmiany logiki wyglądało tak, że użytkownik przychodzący na serwer z swoim requestem otrzymywał jedno połączenie do bazy I to połączenie wykorzystywał do dostępów wszystkich metodach jakie wywoływał na bazie aż do zakończenia renderowania widoku.

We wszystkim tutaj pomogło użyte w projekcie Entity Framework.Standardowo kiedy tworzymy nowy Context bazy w sekcji using połączenie jest otwierane I zamykane wraz z skończeniem zapytania (sekcji using). Ciekawą funkcjonalność ma tutaj EntityFramework, która pozwala sobie wstrzyknąć otwarte połączenie (DbConnection) do konstruktora, a ten w momencie zakończenia sekcji using nie zamknie połączenia, tylko zostawi je otwarte.

Działa tutaj prosta zasada… jak Context ma wykonać zapytanie to tworzy, otwiera I zamyka połączenie. Jak ktoś mu dał jednak połączenie, to po prostu z niego korzysta, nie ubija, nie zamyka – super!