понедельник, 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


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

или



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