How to open my app in Google Play market from code?

Another one simple tip for Android developers. In a lot of applications you can see the pop-up with the text „Rate our app in Google Play”, then you click OK, you are redirecting to the market.
How it is done? The solution contains few lines of code. Below is sample function, which can open your app in Google Play market.

private void openGooglePlay()
    {
  Uri uri = Uri.parse("market://details?id=" + getApplicationContext().getPackageName()); //get current package name
  Intent googlePlay = new Intent(Intent.ACTION_VIEW, uri);
  googlePlay.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  try {
   getApplicationContext().startActivity(googlePlay);
  } catch (Exception e) {
     //your catching exceptions...
  }
    }

Custom font in Android application

Short and simple tip for mobile developers. Default, in Android projects you don’t have much choice to choose a font.

It’s simple to use your custom font in app. The first step is copy your font to „assets/fonts” in your project’s files (ttf and otf format are support).
After copying files, go to your Activity class and add following code:

TextView tvYourBoringTextView; //in section of declaration
//few lines later in OnCreate:
tvYourBoringTextView = (TextView) findViewById(R.id.tvYourBoringTextView); //find your control from XML
//and the final step:
Typeface typeface = Typeface.createFromAsset(getAssets(), "fonts/yourfont.ttf");
tvYourBoringTextView.setTypeface(typeface);

It’s a way to set your custom font programmatically. Soon I will tell you about setting custom font from XML.
This simple example lets you understand how it works.

JIRA in command line

Today’s entry is about „how to use JIRA from command line?”. It’s easier than you think.
The first step to use JIRA from the command line is download JIRA CLI. The latest version is 3.9.0.
After wget&unzip archive you can use the JIRA command line interface.

How to use the jar’s file? In this way:

java -jar path/to/jira-cli-3.9.0.jar --params

The JIRA CLI is really functional. You can see it in these examples.
Why I’m interested in this tool?
It gives me a new possibilities in connection JIRA&Bamboo. By JIRA CLI we can update JIRA’s issues in Bamboo’s jobs. It’s reason why I looked for something like that.
Short but useful tip.

Bamboo – ABC konfiguracji

Ten post powstał m.in. z tego powodu, że sam bardzo potrzebowałem pomocy w kwestii konfiguracji Bamboo, a nie udało mi się znaleźć nic sensownego co rozwiałoby moje wątpliwości. Więc drogą dedukcji i błędnych prób, udało mi się zrozumieć jak działa Bamboo (mam taką nadzieję! :D). Opiszę podstawy konfiguracyjne, zasady działania oraz prosty przykład jak skonfigurowałem swoje środowisko i jakie dało mi to korzyści.
Zauważyłem, że mam ciągoty do tematów związanych z „zarządzaniem projektami”, jednak w tym wpisie skupie się na konfiguracji i możliwościach Bamboo w połączeniu z Bitbucket i JIRA.

Mam do dyspozycji instancję Bamboo onDemand – więc będe wszystko opisywał na jej przykładzie.
Jeśli nie wiesz czym jest Bamboo || Bitbucket || JIRA, odsyłam Cię na stronę producenta gdzie znajdziesz wszystkie niezbędne informacje.
Warto też zaznaczyć, że narzędzia te są od pewnego stopnia płatne, jednak moim zdaniem przy pracy nad większymi projektami koszty te się w zupełności zwrócą, a nawet będziemy w stanie zaoszczędzić na tych narzędziach. Wszystko oczywiście zależy od potrzeb, wielkości projektu etc. Ten wpis nie ma na celu reklamowania usług Atlassian. Moim zadaniem było skonfigurowanie Bamboo, więc chcę się z wami podzielić i przedstawić moją subiektywną opinię na ten temat.

*jeśli nie wiesz czym jest Bamboo, obejrzyj ten filmik. Da Ci pogląd z czym to się je.

Czym jest Bamboo dowiedziałem się z kanału na u2b Atlassian. W filmikach o Bamboo nie było wzmianek o tym, jak działa „od kuchni”, więc dopiero podczas konfiguracji dowiedziałem się, że używanie Bamboo bez konta na Amazone (koszta++;) nie ma większego sensu. Oczywiście nie chodzi tutaj o same konto, a o instancje, które trzeba utrzymywać by zapewnić Bamboo moce przerobowe.

Konfiguracja Bamboo

Pierwszym krokiem będzie konfiguracja elastycznych instancji. Ten krok będzie możliwy po włączeniu „Elastycznego Bamboo” i podłączeniu swojego konta Amazon. Proces jest banalny i nie powinien nikomu sprawić problemów. Natomiast podczas pierwszego zetknięcia z Bamboo nasuwało mi się pytanie PO CO?. Odpowiedź poznałem dopiero po kilku godzinach badania Bamboo.
Konfigurując elastyczne Bamboo (bardzo) ważną kwestią jest wybranie odpowiedniego AWS Region.
Jeśli wybierzemy strefe US East (Northern Virginia) będziemy mieli do dyspozycji domyślne obrazy instancji przygotowane przez Bamboo – może nam to znacznie ułatwić pierwsze kroki. Możemy też przygotować Custom Image.
Instancje stawiane przez Bamboo, będziemy mogli śledzić w naszym koncie na Amazone. Istnieje dość ciekawy cron, dzięki, któremu możemy automatycznie zaplanować start instancji, oraz ich wyłączenie.
To bardzo na plus.
Kolejną rzeczą wartą uwagi są globalne zmienne, które można zdefiniować. Ciekawa sprawa, przydaje się bardzo często w definiowaniu konkretnych tasków. Możemy raz ustawić ścieżkę do projektu i później używać; gdy się zmieni – dokonujemy podmiany w jednym miejscu.

plan, stage, job, task – są to pojęcia bardzo często się przewijające, których nie będę tłumaczył ani odmieniał żeby tekst był bardziej zrozumiały.

Warto obejrzeć ten filmik by zrozumieć czym są plan, stage, job i task.

Sercem Bamboo są plans. Ich tworzenie jest proste, podobnie jest ze stages i jobs. Pominę więc tą kwestię, a przejdę do tasks, które są według mnie bardzo fajnie przemyślane.

Tworząc nowy task, możemy określić jego typ. Myślę, że nawet bardziej wymagający gracze znajdą coś dla siebie 🙂

Do ciekawszych zaliczyłbym: SCP Task, SSH Task, PHPUnit, JUnit, Script. Jeśli nie znajdziemy konkretnego typu task, zawsze możemy to uzupełnić SSH Task, Script, które są naprawdę bardzo przydatne – możemy się posiłkować narzędziami z zewnętrznych serwerów.

W kolejnych wpisach poruszę temat tworzenia planów build, deployment oraz jaką rolę odgrywają artifacts.

How to hide real path of downloading files in PHP script?

It’s another one simple tip for php programmers. Very often, programmer wants to hide the real path of downloading file. Why? For example: the file has to be limited for users or required authentication. If user knows the real location on server, he can download files without any limits or sharing it for others. It’s not expected effect of our script.

Here’s very simple example, how to hide real path of files. We uses cURL for that:

$ch = curl_init($file)); //$file - link to file; http://sth.com/file.zip
 curl_setopt($ch, CURLOPT_NOBODY, true);
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
 curl_exec($ch);
 $retcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); //getting the http code, does file exist?
 curl_close($ch);

 if($retcode == 200) //if everything went OK
 {
   header("Content-Description: File Transfer"); 
   header("Content-Type: application/octet-stream"); 
   header("Content-Disposition: attachment; filename=\"getSecureName($file)\""); //The getSecureName is described bellow
   readfile ($file); //give file for user
 }

*getSecureName( ); – it’s an imaginary method which returns secure file’s name. The default name is address http of file; f.e: (http%3A%2F%2Fdomain.com%2Fsecret%2Fpath%2Ffile.zip (encoded)).

How script works? I suggest to keep the url of files in the database. The script should select file by ID from $_GET[‚id’] (f.e: http://domain.com/download.php?id=2). In the meantime, we should check the user’s permission to download (authentication, limits or whatever else). It’s important to set the correct headers, because it lets to download file for user.

In summary:

  1. The script gets file URL by ID
  2. We should check if the user can download file (authentication, limits)
  3. The script downloads file (readfile) in memory and give it back to user

User cannot know the real location of file. In http’s headers is only our script address.

Sorry for my English. It’s only my second post in this language, so I’m still learning. If something was not clear, give me feedback in comments, please 🙂

Import dużych plików do bazy MySQL

W związku z przenosinami na nowy serwer, musiałem zaimportować stare bazy na nowego Linuksa. Dostałem archiwum *.zip, ważące ~200MB. Czyli wiadomo było, że plik będzie bardzo duży, tekst się bardzo dobrze kompresuję. Po rozpakowaniu plik do importu *.sql, ważył niecałe 3GB.
Można byłoby to zrobić na okrętkę przez phpMyAdmin, modyfikując maksymalny rozmiar uploadowanego pliku, ale po co? Są prostsze sposoby.
BTW, tak dużego pliku nie mogłem otworzyć w żadnym edytorze z GUI pod Windows. Dopiero vi, pod Linuksem to ruszył.
Import pliku do bazy danych :

mysql -u rootOrSth -p someDBName < /path/to/file.sql

i po płaczu 🙂

Jak zmienić maksymalną ilość połączeń z bazą MySQL?

Temat prosty, więc krótko i na temat. Często domyślna konfiguracja deamonów nie jest wystarczająca, jak np liczba maksymalnych połączeń do bazy MySQL. Jeśli masz błąd:

Too many connections ...

to wykonaj to; edytuj plik konfiguracyjny (możliwe, że : /etc/mysql/my.cnf). Odszukaj linijkę:

#max_connections = 100

Odkomentuj ją i wstaw po znaku równości odpowiednią wartość lub pozostaw 100.
Zresetuj deamona MySQL:

sudo /etc/init.d/mysql restart

Powinno działać.