понедельник, 7 июля 2014 г.

Автоматическое монтирование раздела диска. Xubuntu 14.04



   Ubuntu линейка всегда привлекала тем, что многое она делает автоматически, и не нужно лезть в дебри линукса для какой-то настройки (от установки системы, драйверов до минимально-необходимых пользовательских программ).

   Но логические разделы Ubuntu монтирует при «первом обращении»: на рабочем столе (или в файловом менеджере) есть соответствующий ярлычек (визуально неактивный), при нажатии на который и монтируется раздел (в /media/label_name). В общем, как флешка :)

   У меня диск разбит на 3 логических раздела (+ 1 swap), на которых:
1 — корневая папка (система, корневая папка)
2 — домашняя папка (home)
3 — медиа данные (data)

   Просмотреть подключенные диски (и разделы на них) можно командой:
$ sudo fdisk -l
   Мой вывод:

~$ sudo fdisk -l
Диск /dev/sda: 250.1 Гб, 250059350016 байт
255 головок, 63 секторов/треков, 30401 цилиндров, всего 488397168 секторов
Units = секторы of 1 * 512 = 512 bytes
Размер сектора (логического/физического): 512 байт / 512 байт
I/O size (minimum/optimal): 512 bytes / 512 bytes
Идентификатор диска: 0x000889da
Устр-во Загр Начало Конец Блоки Id Система
/dev/sda1 * 2048 84005954 42001953+ 83 Linux
/dev/sda2 84006912 284583935 100288512 83 Linux
/dev/sda3 284583936 484202495 99809280 83 Linux
/dev/sda4 484202496 488396799 2097152 82 Linux своп / Solaris
~$

   Т.е., соответственно, мои разделы
1 — /dev/sda1
2 — /dev/sda2
3 — /dev/sda3


   1. Информация о подключаемых (монтируемых) разделах находится в файле /etc/fstab. Просмотреть ее можно, выполнив, например:
 
$ cat /etc/fstab

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/sda1 during installation
UUID=fab0b341-ecd7-469e-91a6-ac3b151cab99 / ext4 errors=remount-ro 0 1
# /home was on /dev/sda2 during installation
UUID=669142a1-0f6d-4b0f-b93d-095d09472caa /home ext4 defaults 0 2
# swap was on /dev/sda4 during installation
UUID=503c6c67-db36-4efb-9baf-cf1a76085554 none swap sw 0 0
~$

   Как мы можем увидеть из комментариев, формат файла имеет следующий вид:
<file system> <mount point> <type> <options> <dump> <pass>

<файловая_система> <точка_монтирования> <тип_ФС> <опции_монтирования> <флаг_DUMP> <флаг_проверки диска>

Коротко:
default настроек вполне достаточно для простого монтирования,

<флаг_DUMP> указывает на включение/исключение устройства хранения информации в список резервного копирования программы DUMP, если последняя используется.
0 — не выполнять резервное копирование; 1 — выполнять резервное копирование.

<флаг_проверки диска> устанавливает порядок проверки раздела на наличие ошибок. Если установить один и тот же порядок для двух разделов, они будут проверяться одновременно.
0 — раздел не проверяется; 1 — раздел проверяется первым; 2 — раздел проверяется вторым и т.д.
Подробнее о параметрах fstab я приведу ссылку ниже.


   2. UUID раздела можно посмотреть командой:
$ sudo blkid

/dev/sda1: UUID="fab0b341-ecd7-469e-91a6-ac3b151cab99" TYPE="ext4"
/dev/sda2: UUID="669142a1-0f6d-4b0f-b93d-095d09472caa" TYPE="ext4"
/dev/sda3: LABEL="data" UUID="a3993688-fd45-478d-a428-6c67239a8f7f" TYPE="ext4"
/dev/sda4: UUID="503c6c67-db36-4efb-9baf-cf1a76085554" TYPE="swap"
~$


   3. Создаю точку монтирования (папку, к которой я подключу свой раздел). У меня это будет /mnt/data:

~$ cd /mnt/
/mnt$ sudo mkdir data

   4. Редактируем fstab , дополняя его строкой:

# mount /dev/sda3: LABEL="data" UUID="a3993688-fd45-478d-a428-6c67239a8f7f" TYPE="ext4" to /mnt/data:
UUID=a3993688-fd45-478d-a428-6c67239a8f7f /mnt/data ext4 defaults 0 3

   В комментарий я вставил строку, полученную blkid'ом, с пометкой «что я монтирую и куда»:

UUID=a3993688-fd45-478d-a428-6c67239a8f7f — мой UUID раздела /dev/sda3
/mnt/data — точка монтирования моего раздела.
(ВАЖНО: /mnt/data — должны быть уже созданы)
ext4 — тип моей фйловой системы на данном разделе
defaults — монтируем с параметрами по-умолчанию
0 — отключаем дамп (не выполнять резервное копирование)
3 — проверять диск на ошибки третьим (т. к. первый — корневой, второй — раздел домашней папкой)

   После чего перегружаемся и проверяем, что у нас в /mnt/data — нужный нам раздел, и что самое главное — авто-монтируемый! :)


   Большая благодарность за статью, послужившую источником данного материала: Автоматическое монтирование дисков иразделов в Linux или что такое fstab?

   Рекомендую с ней ознакомится, т. к. в ней более подробное описание.

воскресенье, 6 июля 2014 г.

JDK 8 и Eclipse на Mac OS


   Одна очаровательная студентка, давшая свой ноут (MacBook) для установки JDK и Eclipse, являясь недавним (и еще не опытным) пользователем Mac OS, наблюдая за моими манипуляциями немного разочарованно произнесла:
- И зачем я купила этот макбук..
- У вас наверное айфон?
- Да..
- Ну от они с маком - полностью совместимы! :-)


 

   А если серьезно, пару полезных ссылок начинающим и краткая инструкция по установке JDK и Eclipse.
   В принципе, ничего сложного в этом нет, стоит лишь знать битность Мак ОС:
- жмем "яблочко", далее
- "о маке", и
- смотрим имя процессора.

   Если у вас Intel Core Solo или Intel Core Duo - значит у вас 32-битный MacOS. Если же у вас процессор Intel Core 2 Duo или выше (т.е., любой иной) - значит у вас 64-битный MacOS.
   Подробнее, на страничке Apple: Как определить, установлен ли в Mac 32- или 64-разрядный процессор Intel.



   1.1 Для установки JDK на MacOS, качаем актуальный пакет (согласно битности системы, расширение .dmg), соглашаясь с лицензией.

   1.2 Запускаем скачавшийся пакет (напр, jdk-8u5-macosx-x64.dmg) и устанавливаем (все по-умолчанию).

   1.3 После установки проверяем версию Java: в терминале вводим команду:
$ java -version

Если все прошло успешно, вывод будет примерно таким (для Java 8):

$ java -version
java version "1.8.0_05"
Java(TM) SE Runtime Environment (build 1.8.0_05-b13)
Java HotSpot(TM) Server VM (build 25.5-b02, mixed mode)


   2.1 Для установки Eclipse - качаем с официального сайта Eclipse Standard.
   

   2.2 Распаковываем менеджером архивов (или с командной строки, как вам удобнее), и в распакованной папке для удобства выносим значек запуска в удобное для нас место).
  

   2.3 Для проверки, запускаем Eclipse, создаем новый проект, создаем класс (напр, HelloWorld), и проверяем на запуск.

   На всякий случай, HelloWorld выглядит примерно так:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}


   Также, мне на глаза попалась статья о настройке Эклипс на Маке, возможно вам будет познавательно :)
   Для новичков Mac OS, переехавшим с Windows рекомендую почитать "Работа с Mac для пользователей PC" с официального сайта Apple.


  В Mac OS я столкнулся с такой проблемой: при работе в Eclipse, не работает комбинация клавиш Ctrl+Space (автодополнение), т.к. это системный вызов поиска приложений. На глаза попалась данная статья, но проверить какие-либо манипуляции у меня не было возможности. Имейте это ввиду.

  Удачного кодинга!


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

Тестовое задание — Консольная игра


   В предыдущем посте я описывал как создать Maven-проект и залить его на Git.



   Сегодня я хочу поделиться своим небольшим опытом.



   На днях, мне попалась вакансия компании IDAP с тестовым заданием для позиции iOS Trainee. Тест предполагает собой выполнить одно из трех заданий (на выбор) на любом языке и любым способом. Также, предусмотрены дополнительные баллы за выполнение некоторых условий, подробнее.



   Признаюсь честно, задание с игрой показалось мне довольно тривиальным, т. к. до этого приходилось не раз делать небольшие консольные приложения с многоуровневым меню, но мое решение выполнить пункт « возможность скармливать игре текстовые файлы с той же структурой, но другим наполнением» сначала постигло меня в глубокий ступор :)

   Но, поэкспериментировав (конечно же, я понимаю, что мое решение далеко не идеально), я решил зашить в файл и логику и контент.



   В реализации, я считывал конфиг-файл в мапу (Map<Integer key, String values>), парсил и корректировал под свои нужды, в результате чего получил мапу Map<Integer key, Entity entity>, где объект Entity представлял собой объект с полями-параметрами.



   Конечно же, идея хранить весь контент в одной мапе не самое правильное, т. к. мы загружаем ее себе в ОЗУ, но в оправдывая свой выбор скажу что каждый раз считывать строку (искать по ключу) я счел более тяжеловесным в сравнении с моим небольшим текстовым контентом.



   Отдельно хочу подчеркнуть то, что в строке перенос строки '\n' — это два символа, а в коде — это один символ, в результате чего необходимо корректировать получаемые значения. На это у меня ушло пару часов — не повторяйте мои ошибки!)





   Итак, допустим игру написали, время собирать проект.



   Для сборки Maven'ом, в пом файл (pom.xml):



1) добавляем зависимости сборки:   
<build>
 <plugins>
  <plugin>
   <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
     <version>${maven-compiler-plugin.version}</version>
      <configuration>
       <source>${jdk.version}</source>
       <target>${jdk.version}</target>
      </configuration>
 </plugin>
 <plugin>
  <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-jar-plugin</artifactId>
    <version>2.4</version>
     <executions>
      <execution>
       <goals>
        <goal>test-jar</goal>
       </goals>
      </execution>
     </executions>
      <!--add classpath Main-->
      <configuration>
       <archive>
        <manifest>
         <addClasspath>true</addClasspath>
         <mainClass>Main</mainClass>
        </manifest>
       </archive>
      </configuration>
 </plugin>
</plugins> 
</build>


2) в <project
         …
         <properties>
                 …
 
добавляем настройку кодировки: 

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

 подробне тут.

3) указываем MANIFEST (точка входа в программу, иными словами — наш класс Main): 

подробнее тут.


<configuration>
 <archive>
  <manifest>
   <addClasspath>true</addClasspath>
   <mainClass>Main</mainClass>
  </manifest>
 </archive>
</configuration>

 
4) указываем свои ресурсы, которые необходимо скопировать с папки resources. Для этого добавляем плагин:

<plugin>
 <artifactId>maven-resources-plugin</artifactId>
  <version>2.5</version>
   <executions>
    <execution>
     <id>copy-resources</id>
     <phase>validate</phase>
     <goals>
      <goal>copy-resources</goal>
     </goals>
    <configuration>
     <outputDirectory>${project.build.outputDirectory}/src/main/resources/</outputDirectory>
      <resources>
       <resource>
        <directory>src/main/${project.build.sourceDirectory}/resources/${project.name}</directory>
       <filtering>true</filtering>
        <includes>
         <include>**/*.cfg</include>
        </includes>
      </resource>
     </resources>
    </configuration>
   </execution>
  </executions>
</plugin>



5) Сборка Maven-проекта в Intellij Idea осуществляется очень просто:
справа жмем кнопку Maven (на боковой панеле), выбираем (с помощью кнопки ctrl) 'clean' и 'install', и жмем на "пуск" (зеленый треугольник).


Если мы видим 'BUILD SUCCESS', значит, мы сделали все верно и в папке с проектом появилась директория target, где лежат наши скомпилированные классы и готовый jar.


Весь мой пом-файл:
pom.xml


И, собственно, сам проект:

или



Буду рад, если кому-то будет полезно. С удовольствием прочту критику. Давайте «расти» вместе! :)



вторник, 24 июня 2014 г.

Создание нового Maven проекта в Intellij Idea 13 и заливка его на Git.


   Данное мероприятие я делал на своей Xubuntu 14.04, но думаю у Windows-пользователей данная процедура не должна вызвать осложнений (терминальные команды я выполнял через консоль IDE).

   Предполагается, что у вас есть зарегистрированный аккаунт на github.com.

1. Создаем новый репозиторий (зеленая кнопка), даем ему имя (Repository name) и описание (необязательное поле).

   Репозиторий публичный (т.к. аккаунт не платный), галку не ставим (т.к. заливать будем с нашей ИДЕ весь проект «с нуля»).

   В данном примере у меня репозиторий имеет имя "textgame".

   Далее мы видим настройки с нашим репозиторием, и предлагаемые 2 варианта:
- создать репозиторий на сервере
- загрузить с нашего пк.
   Если присмотреться, то можно заметить совпадение последних двух строчек команд))
   Мы будем делать по "второму" варианту.

2. Переходим в нашу ИДЕ.

Жмем New Project → выбираем слева Maven, справа (по необходимости) его готовый архитип (для этого нужно будет нажать галку) → next



Заполняем groupid и artefactid, я выставляю обычно версию 0.1 т.к. проект только создается и до релиза 1.0 еще очень далеко :)
next



Вводим, имя проекта и его локацию. Как правило, если у вас установлен JDK, то SDK в IDE подтягивается автоматически. Если вдруг нет, то указываете папку, куда установлен ваш JDK.

Проект и структуры папок созданы!


3. В консоле, в корневой папке с проектом инициализируем репозиторий:

$ git init

Если все удачно, видим следующее сообщение:
Инициализированный пустой репозиторий Git в /home/vg/javaProjects/TextGame/.git/


Создаем файл README (в корне проекта), и добавляем в наш репозиторий файлы.

$ git add *.c
$ git add README
$ git commit -m 'initial project version'


Лично у меня после комита, выскакивает что-то подобное:

Заглавный коммит
Несопровождаемые файлы:
.idea/
TextGame.iml
pom.xml
нет изменений, добавленных в коммит, но существуют несопровождаемые файлы

Я их добавляю вручную:

$ git add .idea/
$ git add TextGame.iml
$ git add pom.xml
$ git add README

И комичу:

$ git commit -m 'initial project version'
[master (root-commit) 073f1f8] initial project version
11 files changed, 611 insertions(+)
create mode 100644 .idea/.name
create mode 100644 .idea/compiler.xml
create mode 100644 .idea/copyright/profiles_settings.xml
create mode 100644 .idea/encodings.xml
create mode 100644 .idea/misc.xml
…...


ВАЖНО! В Git имеется по факту два(!) вида репозиториев:
- глобальный, который на сервере github и
- локальный, который на клиенстком пк.

Команда comit — обновляет только локалоьный репозиторий!
Для того, что б закомитить в глобальный — необходимо делать comit + push (рассмотрим далее).
Команда clone - копирует (клонирует) локальный репозитарий в глобальный (или наоборот).

Итак, у нас есть новый проект, локальный репозиторий с данным проектом. Заливаем в глобальный. Возвращаемся на страницу с нашим вновь созданным репозиторием, и выполняем две нижние команды:

$ git remote add origin git@github.com:vaReliy/textgame.git
$ git push -u origin master
Counting objects: 19, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (19/19), 7.24 KiB | 0 bytes/s, done.
Total 19 (delta 1), reused 0 (delta 0)
To git@github.com:vaReliy/textgame.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.

Проверяем — теперь наш проект на глобальном сервере! Дальнейшие комиты осуществляются одной командой (предварительно добавив файлы для комита)

$ git push -u origin master

либо через саму IDE:



либо стандартным путем: правый клик на папке/файле → git → add/commin/revert..

Меню, которое вызвано на картинке (если кто не знает), вызывается комбинацией «Alt+~»

Удачного кодинга! ;-)


суббота, 21 июня 2014 г.

Windows 7, установка JDBC драйвера (ojdbc14) без установки Maven

   Приветствую!

   Для того, что б настроить JDBC драйвер, не обязательно устанавливать сам Maven, достаточно просто его скачать и распаковать в папку, в пути которого нет пробелов и кирилицы (только англоязычные имена папок без пробелов).
   Качать нужно bin, а не src версию. Например, apache-maven-3.2.1-bin.zip.

   Настройка:

   1. Необходимо прописать переменную M2_HOME. Она нужна только 1 раз для настройки драйвера.
   В коммндной строке (Пуск - cmd) вводим: 

set PATH=%PATH%;C:\Java\apache-maven-3.2.1\bin 

где, C:\Java\apache-maven-3.2.1\bin  - путь к папке bin в расспакованном нами архве мавена.

   2. Следующий шаг - прописать (если в этом есть необходимость) переменную JAVA_HOME. Подробнее я описывал этот шаг здесь.

   3. Я работаю с версией 1.4 драйвера, поэтому его имя имеет вид: ojdbc14.jar.
Желательно, что б папка с мавеном и ojdbc14.jar были в одной папке - тогда не будет необходимости переходить по папкам.

Итак, после того как прописали M2_HOME и проверили, что у нас прописан JAVA_HOME проверяем настройку мавена:

mvn -version

Если все хорошо, мы увидим что-то по типу:
c:\Java>mvn -version
Apache Maven 3.2.1 (ea8b2b07643dbb1b84b6d16e1f08391b666bc1e9; 2014-02-14T
2+02:00)
Maven home: C:\Java\apache-maven-3.2.1\bin\..
Java version: 1.7.0_60, vendor: Oracle Corporation
Java home: c:\Program Files\Java\jdk1.7.0_60\jre
Default locale: ru_RU, platform encoding: Cp1251
OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"
"cmd" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

А это значит, мы можем приступать непосредственно к установке драйвера.
   4. Вводим (обязательно с папки, где лежит ojdbc14.jar) команду:
mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0.5.0 -Dpackaging=jar -Dfile=ojdbc14.jar -DgeneratePom=true

..и смотрим, как собирается пакет. Если после сборки мы видим BUILD SUCCES - поздравляю, установка драйвера прошла успешно! :)