понеділок, 16 листопада 2015 р.

Java Collections: Map


     Map є частиною Java Collections Framework (docs.oracle.com). 
  • Map зберігає як ключі, так і приєднані до них дані, на відміну від Set, який зберігає тільки дані;
  •  не містить дублікати ключів;  
  • ключ може вказувати тільки на один єдиний відподний йому набір даних (набір даних -> клас);
  • залежно від імплементації, Map може або не може містити null;
  • Map - це інтерфейс, конкретні його реалізації  в Java SDK: HashMap, TreeMap, LinkedHashMap, а також інші;
  • Інтерефйс містить декілька методів, які не є обовязковими для імплементування (optional operation);
  • методи доступу до даних:

    Value get(Object ключ)
    • повертає дані, на які вказує цей ключ;
    • АБО null якщо Map не містить даного ключа;
    • АЛЕ, увага, якщо імплементація дозволяє nulls, то результат null ще не значить, що ключа немає в Map. В такому випадку перевірити наявність ключа можна методом containsKey ;
    Value put(Key ключ, Value дані)
    • якщо раніше цього ключа не було в Map - зберігає ключ та дані в Map і повертає null;
    • якщо ключ вже знаходиться в Map - знищує старі дані і записує нові, повертаючи значення старих даних;
    • АЛЕ, увага, якщо імплементація дозволяє nulls, то результат null ще не значить, що ключа не існувало в Map. Це може також значити, що ключ існував і його дані мали значення null.
    Value remove(Object ключ)
    • якщо ключ вже знаходиться в Map - знищує значення ключа та відповідні йому дані, повертаючи значення даних;
    • якщо цього ключа не було в Map - нічого не виконує і повертає null;
    • АЛЕ, увага, якщо імплементація дозволяє nulls, то результат null ще не значить, що ключа не існувало в Map. Це може також значити, що ключ існував і його дані мали значення null.

неділя, 15 листопада 2015 р.

Java Podcasts

     Про Java можна не тільки читати, але і слухати. Заодно і рівень англійської мови покращиться. Тут можна знайти підбірку декількох подкастів -  player.fm.

     Наразі мені сподобався ось цей - Java Pub House.








четвер, 12 листопада 2015 р.

Eclipse: The declared package does not match the expected package

     В моєму випадку я трохи реорганізував структуру директорій проекту, тому дерево пакетів із кодом не відповідало фізичній структурі каталогів проекту, і відповідно старі пакети вже не знаходилися в Java build class path.  Вихід - потрібно перепризначити Java build class path.





вівторок, 13 жовтня 2015 р.

Розмістити існуючий локальний проект на GitHub

     Мета - розмістити ваш існуючий локальний проект на GitHub (github.com).

     Для цього спочатку потрібно створити пустий репозитарій на GitHub.



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



     В кінці GitHub покаже вам команди Git, які ви можете скопіювати і виконати в командній стрічці Windows (або в Git Shell).


     Для цього на вашому ПК запустіть командну стрічку Windows, перемістіться до директорії, в якій знаходиться прихована директорія .git вашого проекту:

cd <path-to-git-project-file>

     Виконайте команду (atlassian.com):

git remote add <repository-synonym> <git-hub-url>
 
     Ця команда всього-навсього створить синонім до URL-адреси репозитарію. Поширеною практикою є називати центральні репозитарії origin.

     Потім власне ви можете опублікувати локальний проект на серверi GitHub командою:

git push -u <repository-synonym> --all


Ключ -u (або  --set-upstream) - створить референс до репозитарію, що потім дозволить використовувати деякі команди в скороченому вигляді, без зазначення URl-адреси репозитарію (наприклад, git pull). 

субота, 26 вересня 2015 р.

Default password for SYSMAN

     Хто не в курсі, всі версії Oracle DB тепер можна безкоштовно встановити на свій ПК, якщо використовувати базу не в комерційних цілях.

     Після встановлення бази даних Oracle потрібно виконати деякі налаштування. Для цього можна використасти web-кліент Oracle Enterprise Manager Database Express увівши в браузері http://localhost:port_number/em.

     В доцументації пишуть, що для входу в менеджер потрібно ввести користувача SYSMAN, пароль для якого ви повинні були задати під час встановлення бази даних (docs.oracle.com). Але я такого не пам'ятаю. Задавав двох системних користувачів SYS i SYSTEM, але не SYSMAN.

     Довго рився в інтернеті, але так і не знайшов вирішення. На форумі Oracle  тема з такою назвою нічого крім «розумних відповідей» не дала (community.oracle.com):

This thing called the Internet - something called Google.

   Зрештою, довго вдивляючись в діалог для вводу імені-паролю,  ввів дані системного користувача, який був ініціалізований під час встановлення - один з двох,  SYS або SYSTEM. Працює.

понеділок, 14 вересня 2015 р.

ORA-12705: cannot access NLS data files or invalid environment specified

     Можлива причина, особливо для неангломовних користувачів, змінна середовища NLS_LANG може містити неприпустиме значення мовних налаштувань (мова, територія, набір символів (language, territory, or character set)).

     Можливе вирішення проблеми - програмна установка локальних налаштувань, наприклад, десь в класі ініціалізації роботи з базою даних:

 
1
static {Locale.setDefault(Locale.ENGLISH);}


     Інші ігри із ключем NLS_LANG в реєстрі \HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE для моєї кириличної системи нічого не дали. Серед порад зустрічав:
- просто переіменувати ключ NLS_LANG;
- змінити його значення на AMERICAN_AMERICA.CL8MSWIN1251.

Spring, Hibernate, Maven: java.lang.ClassNotFoundException: oracle.jdbc.OracleDriver

     Відповідь взята з форуму stackoverflow.com.

     У вас виникла помилка, спричинена відсутністю драйвера oracle.jdbc.OracleDriver:

type Exception report
message Request processing failed; nested exception is org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.GenericJDBCException: Could not open connection
description The server encountered an internal error that prevented it from fulfilling this request.
exception
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.GenericJDBCException: Could not open connection
 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982)
 org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
 org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)

вівторок, 1 вересня 2015 р.

Стилізація коду для повідомлення на блозі

     Щоб опублікований код виглядав красиво, можна скористатися двома опціями:

- gist -це проект на GitHub. Там можна не реєструючись вставити шматок коду, натиснути кнопочку і отримати посилання, яке буде вести на репозитарій, де буде збережено стилізований код. Посилання вставляєте в повідомлення на блозі. Питання в тому, скільки часу цей код буде зберігатись на їх сервері?

- hilite.me - цим буду користуватись я. Потрібно вставити фрагмент коду, натиснути на кнопку HighLight! і скопіювати стилізований HTML, який вставляєте в свій блог. Таким чином, у вас зберігається весь код, а не на чужому сервері.

Spring MVC: Доступ до статичних ресурсів

     Статичні ресурси - це елементи веб-програми, які є статичними. Ось так просто. Тобто, це файли, які не змінюються протягом виконання програми, такі як CSS-стилі,  HTML-сторінки, скрипти JavaScript, зображення і т.п. Все б нічого, але, виявляється, Spring MVC не вміє їх обробляти, якщо йому в цьому не допомогти.

     Справа в тому, що по-замовчуванню, статичні запити обробляє так званий DefaultServlet, який створюється самим сервером і який привязаний до адреси /, тобто до кореневої папки веб-програми (web application root). Якщо програма отримала запит (request) і для нього зареєстровано відповідний сервлет в файлі web.xml, то цей сервлет буде викликано для обробки запиту. А коли відповідного сервлету не зареєстровано, запит буде оброблено згаданим "сервлетом по-замовчуванню" (java-allandsundry.com). Це він знає, як обробляти запити до статичних ресурсів.

     Але згідно концепції  Spring MVC феймворку, коренева папка веб-програми закріплена за так званим фронт-контролером, який називається DispatcherServlet (див. метод getServletMappings()):


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class MusicBoxDispatcherServlet 
       extends AbstractAnnotationConfigDispatcherServletInitializer {

 @Override
 protected String[] getServletMappings() {
  return new String[] { "/" };
 }
 
 @Override
 protected Class<?>[] getRootConfigClasses() {
  return new Class<?>[] { RootConfig.class };
 }
 
 /*
  * DispatcherServlet loads beans containing web components
     * such as controllers, view resolvers, and handler mappings
     * that are defined in the SpringAppConfig configuration 
     * class (using Java configuration).
  */
 @Override
 protected Class<?>[] getServletConfigClasses() {
  return new Class<?>[] { SpringAppConfig.class };
 }

}

субота, 29 серпня 2015 р.

web.xml is missing and <failOnMissingWebXml> is set to true

     Ви не використовуєте web.xml для свого J2EE проекту, а pom-файл Maven видає наступну помилку:

 web.xml is missing and <failOnMissingWebXml> is set to true

Це тому, що за замовчуванням ця опція для maven-war-plugin має значення true. Щоб прибрати цю помилку, можна або створити пустий web.xml, або змінити значення згаданої опції наступним чином:

     <plugins>
           .........
           .........
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <configuration>
                        <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
           </plugin>
           .........
           .........
     </plugins>

MockMvc: тестування в Spring - java.lang.NoClassDefFoundError: javax/servlet/SessionCookieConfig

     Якщо для тестування Java-програми, написаної на основі Spring MVC фреймворку, ви використвуєте їхнє API (модуль MockMvc), то під час виконання тесту може виникнути наступна помилка:
java.lang.NoClassDefFoundError: javax/servlet/SessionCookieConfig
    at org.springframework.test.web.servlet.setup.StandaloneMockMvcBuilder.initWebAppContext(StandaloneMockMvcBuilder.java:329)
    at org.springframework.test.web.servlet.setup.AbstractMockMvcBuilder.build(AbstractMockMvcBuilder.java:127)
    at com.musicbox.springmvcproject.HomeControllerTest.testHomePage(HomeControllerTest.java:28)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: java.lang.ClassNotFoundException: javax.servlet.SessionCookieConfig
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 25 more

     Причина - MockMvc фреймворк працює тільки в середовищі Servlet 3.0+ . Тож якщо ви отримали цю помилку, швидше за все ви використовуєте jar-бібліотеку для старішої Servlet-специфікації. Перевірте доступні  бібліотеки в classpath. Або якщо працюєте з Maven, відкрийте pom-файл, там ви можете побачити щось подібне:

      <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>

неділя, 24 травня 2015 р.

Tomcat & Eclipse: Port NUMBER required by Tomcat v7.0 Server at localhost is already in use

     Ви запускаєте веб-компонент на сервері і отримуєте помилку:

Port 8080 required by Tomcat v7.0 Server at localhost is already in use. The server may already be running in another process, or a system process may be using the port. To start this server you will need to stop the other process or change the port number(s).

субота, 23 травня 2015 р.

Java Web-розробка в Eclipse

     Щоб створювати Java веб-додатки в Eclipse потрібно з офіційного сайту Eclipse встановити оболонку розробника Eclipse IDE for Java EE Developers (її ще називають Eclipse Web Tool Platform, WTP).


понеділок, 11 травня 2015 р.

GIT: основи роботи

     GIT (вимовляється "ґіт")  - це безкоштовна програма з відкритим кодом, розроблена для розподіленого контролю за версіями проекту (distributed version control system, VCS). "Проектом" може бути будь-що, що зберігається на комп'ютері у вигляді файлів. В тому числі, звичайно, проекти програмістів.


    
     Роботу над Git розпочав Лайнус Торвальдс (Linus Torvalds) в 2005 році з метою керування версіями для написання ядра операційної системи Linux. Слово git  в британському слензі має значення "неприємна персона".

субота, 18 квітня 2015 р.

JUnit 4.x: основи роботи

     JUnit - це звичайний фреймворк, який призначений для написання та запуску тестових програм. Тобто це набір класів (jar-пакет), які ми використовуємо для створення інших, тестових джава-класів, які будуть перевіряти коректність роботи цільових класів. Фреймворк не пише тести замість вас, їх потрібно кодувати в Java, як і звичайні класи. Тільки запускати тест на виконання потрібно з допомогою JUnit-ранерів (test runner).

     Офіційний сайт проекту - junit.org. , в розділі  FAQ якого можна почитати про основи роботи з фреймворком. З цього сайту потрібно завантажити на комп'ютер jar-пакети: junit.jar та hamcrest-core.jar. Потім записати шлях до них в системну змінну CLASSPATH.

неділя, 15 березня 2015 р.

Java: Path та Classpath

     Path та Classpath - важливі поняття, без розуміння яких іноді можна отримати купу проблем незрозумілого походження.

     Після установки пакету Java для програмування на ваш комп'ютер, директорія JDKбуде мати наступний вигляд:


     Директорія bin містить всі виконавчі файли JDK (Java Development Kit): компілятор, пусковик, javadoc, та інші.

     PATH - змінна середовища в операційних системах Unix, DOS, OS/2, та Microsoft Windows. Вона містить шляхи до виконавчих файлів всіх програм, які виконуються із командної стрічки на комп'ютері. Налаштовувати змінну для роботи із Джавою необов'язково, але в такому разі вам потрібно буде кожного разу вказувати повний шлях до місцезнаходження компілятора javac.exe та пусковика java.exe. Наприклад:

C:\Java\jdk1.7.0\bin\javac MyClass.java

вівторок, 10 березня 2015 р.

Eclipse: як змінити workspace та як його видалити?

     Workspace, тобто робочий простір, це папка по замовчуванню, де Eclipse буде зберігати всі ваші проекти.

      Щоб змінити workspace за замовчуванням, потрібно вибрати в меню File \ Switch Workspace \ Other...


     І потім задати шлях до потрібної директорії:


     Але якщо вам захочеться працювати взагалі без workspace, то видалити його можна через меню Window \ Preferences, потім із групи властивостей General вибрати Startup and Shutdown \ Worcspaces у вікні справа вибрати поточний шлях до робочого простору та настиснути кнопку Remove, ну і потім кнопки Apply та OK.



середа, 11 лютого 2015 р.

День здачі тесту Oracle Certified Professional, Java SE 7 Programmer ( 1Z0-803 )

     Нарешті я його здав. Тест не є надто складним. Навіть не маючи виробничого досвіду можна його здати, але потрібно мати добру теоритечну підготовку. Я набрав 85 %. Підготовка зайняла 4 місяці, але можна і в два рази швидше. Тест проходить тільки англійською мовою.

     На тест потрібно прийти завчасно, адже вас ще мають зареєструвати, сфотографувати. Потім заведуть в клас із компами і посадять за один із них. В класі, де я здавав, було всього три комп'ютери, за двома з них вже хтось був і вони здавали інші тести. На столі був фломастер та ламінований папір, по якому можна було писати. Це називається erasable board, але гумку так ніхто і не дав, тому використовуйте папір економно. Можливо, можна було попросити, але я не став... На цьому папері можна розписувати роботу циклів, чи проводити математичні обрахунки, робити UML-схемки, зв'язки між об'єктами та їх реферансами...

вівторок, 10 лютого 2015 р.

Запис на тест Oracle Certified Associate, Java SE 7 Programmer

     Для запису потрібно зайти на сайт Oracle University :



     На наступній сторінці потрібно обрати рівень сертифіката та версію Java. Якщо це ваш перший Джава-сертифікат, то починати потрібно від найнижчого рівня і поступово йти до найвищого (Associate -> Professional -> Master). Я обираю Oracle Certified Associate, Java SE 7 Programmer:


неділя, 8 лютого 2015 р.

OCA - mock exam

     Фінальний етап в підготовці до тесту  Oracle Certified Associate, Java SE 7 Programmer (номер екзамену: 1Z0-803) - проходження тренувальних тестів (англійською mock exam). Це необов'язково, але дуже добре для оцінки своїх можливостей та занурення в середовище реального екзамену.

      Кілька типових запитань можна знайти на сайті самого Оракла. Ще кілька питань ось тут - www.gocertify.com. Багато посилань на різні ресурси по підготовці до тесту можна знайти на сайті www.coderanch.com. Там також є джава-форум та багато навчальних матеріалів.

      Можна також купити тестові симулятори. Я обрав Enthuware. Обирав перш за все за ціною - коштує всього 9.95 $, на відміну від аналогів, таких як EPractizeLabs - 30 $, WhizLabs - 39.95 $. Зустрічав також варіанти, які коштували 100 доларів.

     Тест від Enthuware виявився хорошим інструментом для підготовки. Інтерфейс оболонки схожий на реальний, який використовується під час тесту.