środa, 23 marca 2016

Trikatuka 2

Trikatuka czyli moja aplikacja do przenoszenia playlist i utworów w Spotify dostała nowe życie. Poprzednia wersja miała ponad 240 pobrań, co mnie cieszy - bo znaczy, że ktoś używał. Szkoda tylko, że feedback słaby, no ale nic na to nie poradzę. W każdym bądź razie poprzednia wersja była tak na prawdę taka sobie. Robiła to co miała robić, ale była nieco toporna. No i trzeba było ją pobierać i odpalać na kompie.

Na szczęście w najnowszej wersji pozbyłem się tych problemów. Nic już nie trzeba pobierać, a aplikacja wg mnie działa płynniej i lepiej. Wszystko dlatego, że napisałem ją w angularze, którego jako tako znam. Szkoda tylko, że aplikacja potrzebuje serwera http z powodu flow logowania w spotify. Z przyjemnością wyeliminowałbym node.js z tej układanki i zostawił tylko apke w angularze. A tak, to jakaś część logiki musiała być napisana po stronie serwera. Nie chciałem przechowywać żadnych informacji o użytkownikach w bazie, więc dane autoryzacji otrzymane w callbacku ze spotify, są przesyłane do aplikacji klienckiej socketami i tam trzymane w przeglądarkowym session storage, więc generalnie od momentu zalogowania, wszystko dzieje się już po stronie klienta.

Aplikację hostuje na https://www.openshift.com/. Ekstra sprawa! Aplikacja jest malutka, ja nie mam żadnego wykupionego hostingu, a openshift oferuje darmowe konto, które w zupełności wystarczy do hostingu tej aplikacji. Na Heroku, jest podobnie, ale tam aplikacja wyłączała sie przy bezczynności. Tutaj tego nie zauważyłem więc chyba openshift jest trochę lepszy :)

W samej aplikacji niewiele się zmieniło. Dalej robi to co mam robić, czyli przenosi playlisty i przenosi utwory. W planach mam jeszcze subskrybowanie artystów, których subskrybowaliśmy na poprzednim koncie, ale to dorobię w wolnej chwili.

Tak to wygląda. Użyty framework css to uikit


Aplikacja dostępna tutaj: http://trikatuka-aknakn.rhcloud.com/
Instrukcja (jeśli komuś potrzebna) jest tutaj: http://aknowakowski.blogspot.com/p/trikatuka-spotify-migration-tool.html
A projekt na githubie tu: https://github.com/aartek/trikatuka2

Czekam na wszelkie uwagi!


wtorek, 15 grudnia 2015

Folder "Pobrane", powolne ładowanie - Rozwiązanie problemu

Ostatnio doświadczyłem problemu z powolnym ładowaniem folderu "Pobrane". Mimo, że folder mam na dysku SSD, jego zawartość wyświetlała się po upływie dobrych kilku sekund. Było to na tyle uciążliwe, że zaczęło mnie męczyć, więc konieczne stało się znalezienie rozwiązania.

Na szczęście okazuje się, że rozwiązanie jest bardzo proste. Folder "pobrane" ładuje się długo, wtedy kiedy Windows myśli, że to folder z obrazkami. Żeby to zmienić wystarczy wejść we właściwości folderu, kliknąć zakładkę "Dostosowywanie" i z listy rozwijalnej "Optymalizuj ten folder dla:" wybrać "Elementy ogólne". W moim przypadku pomogło i folder nareszcie działa normalnie.


http://i.imgur.com/xTlpjPn.png

wtorek, 27 października 2015

Jeździsz na rowerze? Odwiedź Enduro Trails w Bielsku-Białej!

Ostatnio miałem okazję odwiedzić polską alternatywę dla Rychlebskich Stezek czyli Enduro Trails w Bielsku-Białej. Na rychlebach jest na prawdę super, więc ciężko temu miejscu dorównać ale bielskie trailsy sobie z tym poradziły. To znakomite miejsce dla każdego kto lubi jeździć na rowerze, a wizyta tam przerosła moje oczekiwania.

Enduro Trails to świeżutki projekt zbudowany dzięki budżetowi obywatelskiemu. Na jednej z bielskiej Koziej Górze powstały 4 ścieżki rowerowe o różnym stopniu trudności. Ja wytestowałem dwie z nich: DH+ i Twistera.

Brama do raju

Twister to chyba najprzyjemniejsza trasa na jakiej miałem ostatnio okazję jeździć. Jest dokładnie taka jaka według mnie powinna być trasa w takim miejscu. To znaczy bezproblemowo przejezdna dla amatorów, ale dająca także mega przyjemność tym bardziej doświadczonym. 
Twister jest zbudowany z niezliczonej ilości zakrętów (co ważne bezpiecznych i dobrze zrobionych, a to w Polsce jest rzadkością!) i całej masy wałków które nie wyrzucają nas na mordę, nie każą nam nad nimi skakać (choć na to pozwalają), tylko po prostu pomagają nam się napędzić. Jedzie się tam zupełnie jakbyśmy płynęli po dobrze zrobionym pumptracku. Tyle, że ten "pumptrack" ma ponad 4 kilometry! "Flow" na tej trasie jest niesamowity, a ilość tych wszystkich elementów daje nam poczuć nóżki. Idealna jest również nawierzchnia. Dwa dni z rzędu padało i o ile na trasie dh było bardzo dużo błota, to na twisterze cały czas jechało się po równiutkiej ubitej i przyczepnej nawierzchni. Dla mnie nie ma nic do czego można by się przyczepić.

Trasa dh też jest całkiem w porządku, choć trochę krótka. Było dużo błota więc nie poznaliśmy jej pełnych walorów ale jechało się dobrze. Jedzie się po niej dość szybko i jest kilka hopek, czyli generalnie jest ok. Nie jest to jakieś ultra trudne dh, tylko takie przystępne dla każdego. Daliśmy radę 3 razy wjechać do góry i opcja dwa razy twister plus raz dh wydaję się być odpowiednia. Ale trzeba sobie przemyśleć, czy długi podjazd jest wart krótkiego zjazdu :)

Szkoda że forma taka kiepska i ciężko zrobić więcej podjazdów bo zabawa na Enduro Trails jest przednia. Podjazd w Bielsku co prawda nie jest tak malowniczy jak na rychlebskich stezkach, ale nie jest też tak wymagający. Na szczęście to co czeka na tych którzy dotrą do góry, wynagradza trudy podjazdu z nawiązką.

Enduro Trails niczym nie ustępują Rychlebom. Powiedziałbym nawet że Twister podoba mi się bardziej niż tamtejszy Superflow. Zjazdu co prawda jest mniej, ale mniej też podjazdu, a to akurat idealnie wpasowuje się w moje preferencje. Cztery kilometry w dół dostarcza dostatecznie dużo radości.

Polecam wycieczkę do Bielska każdemu kto lubi jeździć na rowerze. Nie trzeba mieć żadnych specjalnych umiejętności i nie wiadomo jakiego roweru. Była z nami Sylwia na rowerze z najpopularniejszej kategorii "do dwóch tysięcy" i z twisterem radziła sobie bez problemu. Gwarantuje że każdy zjedzie z uśmiechem na ustach! (Tylko obowiązkowo w kasku!)

Gratulacje dla budowniczych ścieżek, bo wykonali bardzo dobrą robotę. Mam nadzieję że takich miejsc powstanie jeszcze więcej, bo to idealny sposób na spędzenie niedzielnego popołudnia.


A tutaj czyjś filmik z youtuba, który bardzo dobrze pokazuje jak tam jest:




O Bielsku napisałem też trochę tutaj.

czwartek, 22 października 2015

Hibernate 5 + Maven + MySQL - "Hello World" app in Java

This is short example of hello world app in java with hibernate 5 and maven. It doesn't describe the details, but might be useful if you just want to see the working code. It shows example maven's pom.xml, hibernate configuration file and code for creating one table with one record.

1. Creating project with Maven

in your console run command:
mvn archetype:generate -DgroupId="com.blogspot.aknowakowski
ski" -DartifactId="Hibernate-Hello-World" -DarchetypeArtifactId="maven-archetype-quickstart"


(you can confirm suggested 1.0-SNAPSHOT version if maven asks)

Edit pom.xml and add dependencies for hibernate and for mysql connector:
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.0.2.Final</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.37</version>
</dependency>

Add exec plugin which will make running app easier:
<build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.4.0</version>
                <configuration>
                    <mainClass>com.blogspot.aknowakowski.App</mainClass>
                    <cleanupDaemonThreads>false</cleanupDaemonThreads>
                </configuration>
            </plugin>
        </plugins>
    </build>
Take a look at line <mainClass>com.blogspot.aknowakowski.App</mainClass>. You need to specify there class with your main method.

Full example of pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.blogspot.aknowakowski</groupId>
    <artifactId>Hibernate-Hello-World</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>IOR-Testy</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.0.2.Final</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.37</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.4.0</version>
                <configuration>
                    <mainClass>com.blogspot.aknowakowski.App</mainClass>
                    <cleanupDaemonThreads>false</cleanupDaemonThreads>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

2. Coding

Create entity class:

package com.blogspot.aknowakowski;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="task")
public class Task {
    @Id
    @Column(name="task_id")
    Long id;

    @Column(name="name")
    String name;

    public Task(Long id, String name, String description) {
        this.id = id;
        this.name = name;
        this.description = description;
    }

    public Task() {
    }

    @Column(name="description")
    String description;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

Create hibernate configuration file hibernate.cfg.xml and put it to src/main/resources directory. (Because maven copies files from main/resources to target)
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="connection.url">jdbc:mysql://localhost:3306/hibernate-hello</property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>

        <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>

        <property name="connection.username">root</property>
        <property name="connection.password"></property>
        <!-- DB schema will be updated if needed -->
        <property name="hbm2ddl.auto">update</property>
        <property name="show_sql">false</property>
        <property name="format_sql">false</property>

        <mapping class="com.blogspot.aknowakowski.Task"></mapping>


    </session-factory>
</hibernate-configuration>

Don't forget to add mapping in configuration file (<mapping class="com.blogspot.aknowakowski.Task"></mapping>)


Create class with application main method:

package com.blogspot.aknowakowski;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class App 
{
    public static void main( String[] args )
    {
        SessionFactory sessionFactory;
        sessionFactory = new Configuration()
                .configure() // configures settings from hibernate.cfg.xml
                .buildSessionFactory();

        Session session = sessionFactory.openSession();

        Transaction tx = session.beginTransaction();
        Task task = new Task();
        task.setId(new Long(1));
        task.setName("Hello world task");
        task.setDescription("Hello world task description");
        session.save(task);
        tx.commit();
        session.close();
    }
}

3. Running app

Run commands
mvn package
mvn exec:java

first command will build your app,
second command will run your main method
(you can combine them - mvn package exec:java)

If everything is ok you should see added table and record in the database: