вівторок, 23 грудня 2014 р.

Eclipse, Android, VMware та VirtualBox

Якщо віртуальні пристрої, які створюються за допомогою Android Virtual Device чимось не підходять для роботи, то один із способів зробити емулятор для написання програм під Android є створення віртуальної машини у VMware або ж VirtualBox..

Усе робиться доволі просто.
1. Звантажуємо образ диску з Android (наприклад, звідси (http://www.android-x86.org/download))
2. Далі встановлюємо або VMware або VirtualBox. Virtual Box безкоштовний і його можна звантажити з офіційних сайтів (наприклад, звідси (https://www.virtualbox.org/wiki/Downloads))
3. Створюємо віртуальну машину і встановлюємо на ній Android. На youtube є маса відео по встановленню, тож я не буду у прінтскрінах все це показувати. Можна скористатися хоча б цим відео:

середу, 10 грудня 2014 р.

Як зробити завантажувальну флешку Windows 7?

Як зробити завантажувальну флешку Windows 7?

Для того, щоб наше встановлення Windows відбувалося з флешки недостатньо просто скопіювати файли з диску встановлення Віндовз 7 на флеш накопичувач. Спочатку потрібно відформатувати флешку і зробити її активною (тобто вказати, що вона є завантажувальною). Є декілька способів зробити вищенаведене.

- Використати утиліту windows DISKPART
- Використати програму UltraISO
- Використати інші, схожі на UltraISO програми

Найпростіший спосіб, як на мене - перший. Оскільки вам нічого не потрібно встановлювати, а лише заходимо в командний рядок віндовз. Для цього можна натиснути ПУСК і у рядку пошуку ввести CMD. Далі діємо згідно зображень.

1. Запускаємо DISKPART

четвер, 13 листопада 2014 р.

Перенаправлення blogger-блогу на інший сайт або інший блог

Суть, потрібно блог на блогері (зокрема, там знаходиться і даний блог) перенеправити на інший сайт або ж на інший блог на цій же платформі . Щоб це зробити необхідно додати відповідні рядки у HTML код блогу.

Для цього на сторінці управління блогом спочатку заходимо у Шаблон, а далі натискаємо кнопку Редагувати HTML.


четвер, 6 листопада 2014 р.

Множини та дії над ними

Для тих хто не вчив, але хоче вивчити, або ж вчив, але уже все забув - хороший відеоурок про множини, об'єднання множин, перетин і т.д.

Так би мовити - множини для чайників :)

Розробникам ongradient.com респект, за такі уроки і за те, що роблять крім російської ще й українською.

середу, 5 листопада 2014 р.

Цикл while та цикл do...while



У відео ідеться про цикли з передумовою (while) та з післяумовою (do..while) у Java, особливості їхнього застосування, ключові слова break та continue. Приведено приклад консольної гри на вгадування числа з використанням циклу do...while.

пʼятницю, 31 жовтня 2014 р.

Важливість базових знань



Чим більше вивчаєш, тим більше розумієш, що якщо спочатку щось не зрозумів, вірніше, якщо не засвоїв базові (основні, елементарні) знання з певної галузі, то згодом це може становити значну проблему у розумінні складнішого матеріалу. Так, для прикладу візьмемо, програмування і Java. Якщо ти не освоїв базові концепції об'єктно-орієнтованого програмування і те як це все реалізовано в Java (так зване Java Core) до найменших деталей, то рух дальше буде важкий.  Переважно з таких програмістів стають так звані "бидлокодери", які просто ліплять куски коду докупи до кінця не розуміючи, що кожен рядок коду означає. До певних пір це працює, але лише до певних. Крім того після таких людей розібрати код просто нереально. Що правда через цей етап мабуть проходять усі спочатку:), оскільки, часто, щоб зрозуміти щось, потрібно спробувати хоч щось запрограмувати і пройтися дальше в матеріалі, а згодом повернутися.

Те ж саме стосується математики, якщо добре не освоїти шкільної математики, то в університеті максимум що зможеш, то автоматично застосовувати формули по якомусь накатаному алгоритму. Проте, коли поставити якусь задачу по обробці конкретних даних експерименту, то може бути повний тупик, або ж неправильне застосування певних методів і т.п. Цим грішать багато наукових досліджень. Зокрема, доволі мало людей має хороше уявлення про елементарні речі, які давно знають деякі статисти: в біології, медицині, психології і у всьому що пов'язано з людьми і живими організмами, не можна покладатися на окремі випадки і спостереження. А ще крім того, людський мозок часто забуває певні нюанси і те що не використовується довго і все це потрібно повторювати, якщо не хочеш забути.

середу, 29 жовтня 2014 р.

Освоюємо Java: Цикл For (відеоурок)

 
У відеоуроці: 
види циклів у Java, класичний цикл For та покращений цикл for (for each), 
вивід елементів масиву, безкінечний цикл, інструкція break у циклі for

Інші відеоуроки: тут
Все стосовно Java: тут

четвер, 16 жовтня 2014 р.

Для чого освіта?

Цікаві дані, які я зустрів в книзі "Статистика для Чайников". Книга хороша для початківців, але в російському перекладі є проблема із шрифтами: грецькі букви не були добре надруковані, що дещо унеможливлює нормальне читання тих частин тексту, де ідеться про формули з грецькими літерами. Щоправда формули там не такі вже й важливі, переважно елементарні і їх доволі мало. Мене вона зацікавила передусім цікавим викладом матеріалів та великою кількістю ілюстрацій. Ось один з цікавих графіків про залежність зарплати в США від рівня освіти.
Як видно з графіка, що чим кращий рівень освіти тим вища зарплата. Щоправда, не забуваємо, що це все в середньому. Цілком може людина без вищої освіти, при певних здібностях і відповідному характеру заробляти набагато більше ніж більшість людей з вищою освітою. Проте в середньому чим краща освіта тим більше ви можете заробляти. На тим кращі посади та зарплати ви можете претендувати із меншою кількістю зусиль ніж люди з нижчим рівнем освіти. Навіть якщо людина лише протирала штани в інституті, усе рівно щось та відкладалось в голові, як мінімум в неї більший кругозір. Звичайно диплом не гарантує успіху, але це хороший старт. Усе решта залежить від реальних знань, персональних якостей та цілей в житті.

вівторок, 9 вересня 2014 р.

Патерн «Фабрика»

Вирізка із книги "GoF Design Patterns - with examples using Java and UML2" by: Benneth Christiansson (Ed.) Mattias Forss, Ivar Hagen, Kent Hansson, Johan Jonasson, Mattias Jonasson, Fredrik Lott, Sara Olsson, and Thomas Rosevall. License: Creative Commons Attribution-ShareAlike 3.0 License.

Визначення
Патерн Фабрика (Factory Pattern) надає шлях використання екземпляру як об’єктну фабрику. Фабрика може повертати екземпляр одного з декількох можливих класів (у ієрархії класів), в залежності від заданих даних.

Де використовується:
  • Коли клас не може передбачити, який об’єкт, якого класу потрібно створити
  • Ви хочете вказати, екземпляр якого клас хочете створити
  • Коли ви маєте класи, які походять від одних і тих же класів, або ж класи, які ділять один інтерфейс.  Тобто, методи у екземплярів цих класів одні і ті ж самі і можуть використовуватися взаємозамінно.  
  • Коли ви хочете ізолювати клієнта від актуального типу, що ініціалізується.

середу, 27 серпня 2014 р.

Отримуємо шлях до файлу в кирилиці

Є виконуваний jar файл, поряд з ним у каталозі є підкаталог у якому є файл help.txt. Необхідно запустити jar файл і при виборі із меню пункту "Help" запустити файл help.txt.

Тож все це робиться так:
File currentJavaJarFile = new File
     (Test.class.getProtectionDomain()
     .getCodeSource().getLocation().getPath());
String path=currentJavaJarFile.getParent();
String comand="notepad.exe " + path+"\\Resources\\help.txt";
Runtime.getRuntime().exec(comand);

Проте як виявлось усе працює правильно, якщо шлях до файлу латинськими літерами. Як тільки у шляху з'являється кирилиця, видає помилку знаходження файлу.

Отримати правильно шлях допоможе UrlDecoder:
currentJavaJarFile=new File(java.net.URLDecoder.decode(
            (Test.class.getProtectionDomain().getCodeSource()
            .getLocation().getPath()).toString() ,
            "UTF-8"));




get path with cyrillic

вівторок, 26 серпня 2014 р.

Вибір подальшого шляху (MindMap)

Написанню даної замітки посприяла стаття "Роздоріжжя навколо нас".

Постійно приходиться нагадувати собі що головне, а що другорядне. Хочеться багато чого освоїти, проте реально приходиться зосереджуватися на найбільш актуальному і потрібному для себе в даний час. Вирішив якось промалювати свою інтелект карту в яких напрямках рухатись дальше. В результаті вирішив що краще розділити на декілька невеличких, але основних. У мене вийшло аж 4 основні інтелект карти: Англійська, Математика, Програмування, Java (як підкарта програмування). У перших трьох розгалужень не так і багато, а ось Java вийшла доволі розкішна:) Постарався представити те що я освоїв, але ще варто закріпити знання, або уже почав освоювати, або збираюсь освоїти найближчим, або ж просто є велике бажання в майбутньому освоїти (як то Android SDK). Результат того, що накидав десь за хвилин 20-ть:

Java - My Mind Map

Можна звичайно деталізувати безкінечно, так у Java EE багато цікавого чого хотілось б освоїти, але поки що зобразив як на мене основне.

середу, 13 серпня 2014 р.

Як показати діалог "зберегти" з допомогою JFileChooser

Як показати діалог "зберегти" з допомогою JFileChooser

Якщо вашій програмі потрібно зручно вказати положення файлу, папки або ж місцезбереження файлу, то для цих цілей Swing надає клас javax.swing.JFileChooser. Виклик діалогу збереження файлу схожого на той що використовується у віндовз, здійснюється через метод showSaveDialog():

  public int showSaveDialog(Component parent)

Де parent - це батьківський компонент діалогу, переважно JFrame. Коли користувач введе ім'я файлу і натисне ОК або Cancel, метод повертає одне з наступних значень:

   
   JFileChooser.CANCEL_OPTION // користувач відмінив вибір файлу
   JFileChooser.APPROVE_OPTION // користува здійснив вибір файлу
   FileChooser.ERROR_OPTION // якщо користувач закрив вікно
                            // кнопкою закриття Х.

Після того як користувач здійснив свій вибір, ми можемо використати метод getSelectedFile() щоб взяти нам об'єкт файлу:

    File getSelectedFile()

Перед викликом методу showSaveDialog(),  ви можливо захочете встановити деякі опції для діалогу:
  
    setDialogTitle(String) // встановлює заголовок вікна.
    setCurrentDirectory(File) // встановити директорію для збереження

Приклад коду:

// батьківський компонет діалогового вікна
JFrame parentFrame = new JFrame();
 
JFileChooser fileChooser = new JFileChooser();
fileChooser.setDialogTitle("Вкажіть як зберегти файл");   
 
int userSelection = fileChooser.showSaveDialog(parentFrame);
 
if (userSelection == JFileChooser.APPROVE_OPTION) {
    File fileToSave = fileChooser.getSelectedFile();
    System.out.println("Зберегти як: " + fileToSave.getAbsolutePath());
}

Можна встановити фільтр для задання розширень файлу:

 
FileNameExtensionFilter filter = 
                      new FileNameExtensionFilter("csv файл","csv");
fileChooser.setFileFilter(filter);

Вікно може виглядати так:


В результаті отримали об'єкт File і можна створювати потоки вводу-виводу і записувати у файл використовуючи отриманий об'єкт File. Об'єкт File, хто ще не знає є дискриптором файлу і мабуть, основне що в ньому є - це адрес розміщення файлу і його назва.

 При написанні було використано матеріали із codejava.net

пʼятницю, 25 липня 2014 р.

Заміщення (overriding) методів у Java


У відеоуроці розглядається наступне:
Що таке заміщення  методів? 
Чому заміщення і перевизначення це не одне й те саме? 
Дещо про успадкування та поліморфізм у Java.
Особливості статичних методів.
Модифікатор final при визначенні методів Java.


пʼятницю, 11 липня 2014 р.

WindowBuilder Error: Unhandled event loop exception

Вирішив поставити плагін WindowBuilder у Eclipse. При спробі використовувати графічний редактор зразу ж Eclipse почав видавати помилку: Unhandled event loop exception


Думав, знов щось нахомутав при встановленні. Проте завдяки посту:  "Eclipse Bug: Unhandled event loop exception No more handles", довідався що у цьому можуть бути винні деякі процеси запущені у windows. Методом проб і помилок як і у випадку описаному у моєму пості "JVM creation failed" виявилося, що знов винен електронний словник Abby Lingvo. Ну не люблять чомусь Java IDE цю програмку :)  і взагалі продукти фірми ABBY :).

Проблема вирішується або вбивством процесу  LvAgent.exe або ж у налаштуваннях лінгво забрати галочки пов'язані з роботою з клавіатурою, щоб взагалі не було реагувань на клавіші.

вівторок, 10 червня 2014 р.

Логування в Java (log4j 2)

Мабуть чи не всі програмісти виводять додаткову інформацію на консоль для зневадження програми і просто з метою стеження за її виконанням.  Проміжну інформацію про стан виконання програми, про певні критичні помилки часто корисно записувати у файл чи передати по мережі. Тоді користувач програми може надіслати розробнику звіт і розробник зможе розібратися, що ж пішло не так. Логування у будь-якому разі корисне. Логування у файл можна звичайно зробити самому. Проте навіщо винаходити велосипед, якщо на цьому поприщі вже багато чого зроблено. Існує декілька бібліотек, які спрощують логування. Зараз мова піде про log4j 2-ї версії.

Що потрібно звантажити

* Apache Log4j 2 з оф. сайту (http://logging.apache.org/log4j/2.x/download.html)
* Log4j 2 User’s Guide – посібник користувача (http://logging.apache.org/log4j/2.x/log4j-users-guide.pdf)
* SLF4J – це бібліотека для логування на якій базується log4j 2 (http://www.slf4j.org/download.html)


Підключення бібліотек


Для того щоб наші приклади працювали. Необхідно підключити відповідні *.jar файли до проекту. Не буду пояснювати як це робити.

Розархівовуємо вміст архівів звантажених з інтернету і з них я підключав наступні:

log4j2.0\log4j-api-2.0-rc1.jar
log4j2.0\log4j-core-2.0-rc1.jar
log4j2.0\log4j-slf4j-impl-2.0-rc1.jar
slf4j-1.7.7\integration\lib\slf4j-api-2.0.99.jar
slf4j-1.7.7\integration\lib\slf4j-simple-1.6.99.jar

Якщо не підключити slf4j, то буде видавати помилку виду:

 Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/ILoggerFactory
      at java.lang.ClassLoader.defineClass1(Native Method)...........



Конфігурація Log4j 2

Для того щоб логування працювало як нам потрібно необхідний відповідний файл конфігурації. Можна створити .xml файл, а можна файл properties. Приклади файлів конфігурації можна знайти в посібнику (User’s Guid). Файл повинен бути прописаний в classpath проекту. Можна просто закинути файл у корінь проекту, або у каталог src. Файл конфігурації краще назвати log4j2.xml.

У посібнику користувача можна знайти різні приклади файлу конфігурації для різних цілей: виводу лише на консоль, виводу у файл, виводу у мережевий сокет і т.д. Для виводу у файл матимемо:

<configuration>
    <appenders>
        <file append="false" filename="A1.log" name="A1">
            <patternlayout pattern="%t %-5p %c{6} - %m%n">
        </patternlayout></file>
        <console name="STDOUT" target="SYSTEM_OUT">
            <patternlayout pattern="%d %-5p [%t] %C{6} %M (%F:%L) - %m%n">
        </patternlayout></console>
    </appenders>
    <loggers>
        <logger level="debug" name="org.apache.log4j.xml">
            <appenderref ref="A1">
        </appenderref></logger>
        <root level="debug">
            <appenderref ref="STDOUT">
        </appenderref></root>
    </loggers>
</configuration>

Наступний приклад демонструє роботу з логуванням.
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class HelloWorld {
 private static Logger logger = LogManager.getLogger("HelloWorld");

 public static void main(String[] args) {
  logger.info("Hello, world");
  
  Logger fileLog=LogManager.getLogger("org.apache.log4j.xml");
  fileLog.debug("Write in file!");
 }
}

В результаті, якщо був використатий файл конфігурації наведений вище, то на консолі отримаємо:
2014-06-10 15:04:31,610 INFO  [main] HelloWorld (HelloWorld.java:8) - Hello, world
2014-06-10 15:04:31,612 DEBUG [main] HelloWorld (HelloWorld.java:11) - Write in file!
А у файлі:
main DEBUG log4j.xml - Write in file!
Спочатку отримуємо наш основний «Логер», який направлений буде на консоль.

private static Logger logger = LogManager.getLogger("HelloWorld");

Якщо ми хочемо писати у файл щось, то отримуємо логер для файлу:

Logger fileLog=LogManager.getLogger("org.apache.log4j.xml");

І пишемо у файл:

fileLog.debug("Write in file!");

Те як виглядатими наш лог, що туди включатиметься в значній мірі залежить від файла конфігурації.


Можливі передачі у лог і винятків (Exception):

logger.info("Error: ", new Exception("An exception"));


Рівні логування

Не хочеться вдаватися глибоко у цю тему, але необхідно згадати основне. При логуванні розрізняють рівні логування:

1.    TRACE – повідомлення найвищого рівні

2.    DEBUG – зневаджувальні повідомлення, менш детальні ніж TRACE

3.    INFO – стандартні інформаційні повідомлення

4.    WARN – некритичні помилки

5.    ERROR – помилки, що можуть вплинути на правильність результату

6.    FATAL – фатальні помилки, які заважають роботі

За допомогою файлу конфігурації ми можемо вказати, які повідомлення включати у наш лог.  У нас у файлі конфігурації маємо level="debug" . Це означає що на консоль і у файл буде виводитися всі повідомлення рівня Debug і нижче. Повідомлення рівні trace не будуть включатися. Тобто рядок в коді logger.trace("Hello, world"); - нам нічого не виведе ні в лог, ні у файл, ні на консоль, якщо ми не підвищемо рівень логування до TRACE у файлі конфігурації.

Патерни логування

Для формування вигляду логу, використовується відповідний патерн або ж шаблон. У нас використано два патерни, один для файлу інший для консолі.

<PatternLayout pattern="%t %-5p %c{2} - %m%n" />

<PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n" />

%d – вивести дату

%t – ім’я нитки (thread)

%-5p — виводить рівень логу (ERROR, DEBUG, INFO …), цифра 5 означає, що для виводу використовується 5 символів ,  (-), те що вирівнювання буде відбуватися по лівій стороні

%c{1} — виводить назву логера, у фігурних дужках регулюється наскільки повною видаватиметься назва

%L —номер рядка, в якій відбувася виклик запису у лог

%m — повідомлення, що було передано в лог

%n — перехід на новий рядок

Усе це детальніше подато у посібнику користувача.