четверг, 1 марта 2018 г.

Кроссворды на русском для android

Классическая словесная игра головоломка, которую я написал еще в 2015 году.
ссылка play.google

Идея создания пришла мне в голову, когда стоя в автобусe, я наблюдал, как пожилого вида женщина старательно разгадывала кроссворд на своем стареньком android девайсе. Вот она - целевая аудитория, не избалованная яркой графикой и увлекательным геймплеем. Я, как начинающий разработчик, как раз обдумывал написать какое-нибудь приложение для портфолио. Однако идея создания бесполезного приложения, которое никто никогда не увидит и не будет использовать, не вселяла вдохновения, поэтому хотелось придумать то, что хоть кто-то захочет установить себе на телефон и не удалить в течении следующей минуты.

Получилось, считаю не плохо. Получив несколько сотен установок за первый месяц и опыт взаимодействия с реальными пользователями, я, с чувством глубокого удовлетворения, приложение забросил. Потом я выпускал иногда какие-то минорные фиксы, появилось просто множество приложений конкурентов, и в поиске по запросу 'кроссворд' приходилось долго листать, чтобы найти мой апп.
За 2 года установок набралось с десяток тысяч, заработал 20$ на рекламе (отключаемый в настройках баннер на экране с сеткой). Сейчас пробую немного реанимировать старичка, добавить уровней (разной сложности), поработать на графикой и фичами, подвинуть конкурентов в поисковых запросах. Посмотрим, что выйдет. Заработать на этом вряд ли получится, зато интересный опыт инди разработчика.


среда, 30 июля 2014 г.

brute method of post image throught multipart/form data


  ResponseExtractor extractor = new HttpMessageConverterExtractor();

        String boundary = "*****";


        FileInputStream fileInputStream = new FileInputStream(new File(localPath));
        URL url = new URL(uriBuilder.build().toString());
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

        conn.setDoInput(true);
        conn.setDoOutput(true);
        conn.setUseCaches(false);

        conn.setRequestMethod("POST");

        conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
        DataOutputStream dos = new DataOutputStream(conn.getOutputStream());

        dos.writeBytes("--" + boundary + "\r\n");
        dos.writeBytes("Content-Disposition: form-data; name=\"image\";filename=\"image.png\"\r\n");
        dos.writeBytes("\r\n");
        int bufferSize = 4096;
        int bytesAvailable;
        byte[] buffer = new byte[bufferSize];
        int bytesRead = fileInputStream.read(buffer, 0, bufferSize);
        while (bytesRead > 0) {
            dos.write(buffer, 0, bufferSize);
            bytesAvailable = fileInputStream.available();
            bufferSize = Math.min(bytesAvailable, bufferSize);
            bytesRead = fileInputStream.read(buffer, 0, bufferSize);
        }
        dos.writeBytes("\r\n");
        dos.writeBytes("--" + boundary + "--\r\n");
        fileInputStream.close();
        dos.flush();
        dos.close();

        StringBuilder responce = new StringBuilder();
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));

            String buff;
            while ((buff = reader.readLine()) != null) {
                Log.d("Debug", "Server Response " + buff);
                responce.append(buff);
            }
            reader.close();
        } catch (IOException ioex) {
            Log.e("Debug", "error: " + ioex.getMessage(), ioex);
        }
        return responce.toString();


четверг, 5 июня 2014 г.

Определения, понятия, очевидности

Агрегация (композиция, включение)- методика создания нового класса путем включения существующих (машина состоит из колес, двигла...)
Делегирование - задача поставленная внешнему классу, перепоручается вложенному

Агрегация (агрегирование по ссылке) - отношение часть-целое, когда вложенный объект может существовать независимо от внешнего.
Композиция (агрегирование по значению) - внутренний объект не может существовать без объекта обертки.(университет - факультет)

Персистентность - сохранение состояния объектов между запусками программы.

Идентичность объектов  - есть равенство ссылок(java)
Эквивалентность объектов - есть равенство состояний объектов

Порядок инициализации объектов:

1. блок статической инициализации/инициализация статического поля базового класса.
2. блок статической инициализации/инициализация статического поля собственно класса.
3. Вызывается конструктор класса
3.1. Вызывается конструктор базового класса
3.2. Происходит инициализация переменных/ блоков инициализации в порядке их определения.
3.3. Вызывается остальной код конструктора.

Java and frustration

Java is very complex language. At least for me. I often fall into frustration learning it, especially passing tests like SCJP.


Var args syntax:

1:    static void varArgs1(int... args){}  
2:    static void varArgs2(int[] args){}  

3:    public static void main(String[] args) {  
4:      varArgs1(10, 20, 30);  
5:      varArgs1(new int[]{10, 20, 30});   //oyw. ok  
6:      varArgs2(10, 20, 30); //compile error  
7:      varArgs2(new int[]{10, 20, 30});  
8:  }  


воскресенье, 21 октября 2012 г.

пустой logcat в eclipse


Пришлось переставить eclipse, как тут же возникла проблема с логом для android. Окно Logcat совершенно пустое для моего старенького хуевея. Причем для виртуального устройства все ок, лог просто ломится от наплыва инфы.
Решением оказалось удаление файлов вида org.eclipse.mylyn.* из папки
\<папка с eclipse>\plugins\

суббота, 18 августа 2012 г.

inner, left, right, cross join




Пусть имеются две таблицы
Customers                                         City
Id FirstName   CityId          |         Id      Name
-  -           -               |         -       -
1 Вася         1               |         1       Москва
2 Петя         2               |         2       Воронеж
3 Коля         3               |         4       Париж
4 Дима         4               |         6       Лондон
5 Олег         5               |         7       Гондурас
6 Лена         6               |

Заметим, что для Олега и Коли нет соответствующих городов. Так же нет людей живущих
в Гондурасе.


Результат для inner join (inner join тоже что и просто join):