Перешел на Linux. Проблемы и решения.

Мне тут посоветовали перейти на Linux. Мой выбор клон Ubuntu — Linux Mint. Ну с линуксом мы дружим с мохнатого 1999 года, так что проблем не возникло. Ну почти =)).

  1. При установке ессно похерил все на винте =) И фотки любимой жены тоже.
    Решение: TestDisk восстановил даже то что я и забыл когда удалял =)

  2. MATE переодически зависает после выбора проприетарных дров для видюхи на ноуте.
    Решение: стандартные драйвера вернул.

  3. После syspend отваливается wi-fi. Лечится только ребутом.
    Решение: Гугление показало что виноват wpa_supplicant. Нужно его гасить перед засыпанием. В /etc/pm/sleep.d создаем файл wpa_supplicant_kill. В нем пишем:

#!/bin/sh
case "$1" in
resume|thaw)
killall wpa_supplicant
;;
esac

Ну и потом: chmod +x wpa_supplicant_kill
Как написал парень, у которого я решение подсмотрел: Not really ideal, but it saves a bit of typing at each resume.
Полность согласен, но работает, поэтому пока оставлю так.

Пока все.
=) Нет не все. Еще в файл /etc/pm/config.d/suspend_modules

SUSPEND_MODULES="$SUSPEND_MODULES ath9k r8169"

так надо эти модули выгружать перед syspend, и при resume они автоматически будут подгружаться и обновляться. И так и случилось. Все заработало. Казалось бы =)
Только после syspend, а вот после hibernate нет. Так же network disabled.
Короче пока что отключил hibernate в control center -> power manager.
Есть вот такое сообщение:

prof-K53SM log # cat pm-powersave.log
...
Running hook /usr/lib/pm-utils/power.d/wireless true:
Turning powersave for wlan0 on...Error for wireless request "Set Power Management" (8B2C) :
SET failed on device wlan0 ; Operation not supported.
Failed.
/usr/lib/pm-utils/power.d/wireless true: success.

Вот что пишет про это linux guru по имени blip:

Keep in mind any wifi issues you may experience could be caused by forcing this setting. You can make this change permanent by creating /etc/modprobe.d/ath9kps.conf containing
Code:

options ath9k ps_enable=1

If the option is removed or renamed, your wifi will stop working and you will need to remove that file.

Смотрим:

prof-K53SM power.d # modprobe ath9k ps_enable=1
prof-K53SM power.d # modprobe ath9k ps_enable=0
prof-K53SM power.d # ps -A | grep wpa
19719 ? 00:00:00 wpa_supplicant
prof-K53SM power.d # kill 19719
prof-K53SM power.d #

Действительно, отключаем и включаем wlan и eth0.

Нет, чет не момогло, после hibernate опять network disabled, и на

prof-K53SM power.d # modprobe ath9k ps_enable=1
prof-K53SM power.d # modprobe ath9k ps_enable=0

не реагирует. =(

А вот после syspend включается. И на заклинания

prof-K53SM power.d # modprobe ath9k ps_enable=1
prof-K53SM power.d # modprobe ath9k ps_enable=0

не реагирует. =( ну ну =)).

prof-K53SM sleep.d # uname -r

3.13.0-37-generic

удалил uswsusp
увеличил swap раздел.

проблема решилась

Введение в Web MVC framework. Контроллер.ч.1

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

@Controller
public class CategoryController {

    private static final Logger LOGGER = LoggerFactory.getLogger(CategoryController.class);

    @Autowired
    public Dao dao;

    @RequestMapping("/category")
    // если наш браузер передает контроллеру запрос 
    // http://localhost:8080/category
    // то контроллер выполнит метод viewCategory()
    public ModelAndView viewCategory() throws SQLException, ClassNotFoundException {
    // этот метод возвращает после работы ссылку на объект типа ModelAndView
    // этот тип имеет несколько важных полей, рассмотрим его внимательнее
    //public class ModelAndView {
    //  private Object view; /** Содержит ссылку на объект типа View или на строку, которая этот вью       идентифицирует */
    //  private ModelMap model; /** это ссылка на модель, модель грубо говоря это хэшмап с передаваемыми значениями */
    //

        LOGGER.debug("Received request for SELECT from table CATEGORY");
        return new ModelAndView("category", "viewCategory", dao.listCategory());

    }

    @RequestMapping(value = "/category_insert.html", method = RequestMethod.GET)
    public ModelAndView getInsertCategoryView() throws SQLException, ClassNotFoundException {
        LOGGER.debug("Received request for get InsertCategory View");
        return new ModelAndView("category_insert", "insert_form", new CategoryInsertForm());
    //  создаем и возвращаем ссылку на ModelAndView используя конструктор
    //  public ModelAndView(String viewName, String modelName, Object modelObject) {
    //      this.view = viewName;
    //      addObject(modelName, modelObject);
    //  }
    //  "category_insert" - эту строку DispatcherServlet использует для определения какая jsp будет 
    //  использована для отображения
    //  "insert_form" - это имя модели, которое мы будем использовать чтобы обращаться к модели из сервлета
    //  а это сама модель с данными
    }

Ну вот примерно так. Статья будет расширяться описанием остальными методами.

Введение в Web MVC framework. Контроллер.

Я попробую комментировать процесс моего понимания Web MVC концепции.  Все  файлы которые упоминаются здесь вы можете скачать с GitHub. То что описывается здесь, происходит конкретно в branch — spring-boot.

Web MVC framework

Этот фремворк построен на DispatcherServlet .  По русски это диспетчер.  Если при слове диспетчер вы подумали о тетечке в стеклянной будке, которая что-то бубнит в громкоговоритель, то вы не ошиблись, именно так и есть.  Ей дали бумажку с текстом и она его вам доносит, через громкоговоритель.  DispatcherServlet делает то-же самое.  Он принимает запрос из браузера и несет его контроллеру.  Контроллер это класс который будет решать что дальше делать с запросом.  Аннотация @Controller указывает что наш класс будет выполнять функции контроллера. Выглядит это так:

@Controller
public class CategoryController {
}

Теперь DispatcherServlet будет знать что именно этот класс занимается обработкой запросов. Чтобы контроллер мог принимать решения о дальнейшей судьбе запроса используется аннотация @RequestMapping:

@RequestMapping(value = "/")
public String index() {

return "Hello world!";
}

Здесь в аннотации в скобках указывается «/», то-есть корень нашего сайта. Теперь контроллер точно знает что делать если браузер обращается к корню нашего сайта.
Вот так например: http://localhost:8080/. При таком запросе контроллер выполнит метод index() и мы увидим в браузере заветную надпись Hello World! Так-же сразу хочу добавить что аннотация @RequestMapping очень гибкая. В ней так-же можно указывать какой метод мы ожидаем в запросе:

@RequestMapping(value = "/category.html", method = RequestMethod.POST)
public String viewCategory() {
// TO DO something
}

Здесь в аннотации указано, что если у нас запрос страницы category.html и метод запроса POST. То контроллер выполнит метод viewCategory(). Причем если мы запросим эту же страницу, но метод запроса будет GET, то мы получим 404. Тут можно еще немного добавить про аннотацию @RequestMapping. Можно например в одной аннотации указывать несколько обслуживаемых адресов:

@RequestMapping(value = {"/category.html","/"})
public String viewCategory() {
// TO DO something
}

То-есть при обращении к корню нашего сайта: http://localhost:8080/ и при обращении к странице: http://localhost:8080/category.html. Будет выполняться один и тот-же метод.

@RequestMapping(value = "/category.html/{id};{name}")
public String viewCategory() {
// TO DO something
}

В этом примере мы указываем, что будем ожидать запрос с таким шаблоном «{id};{name}». В браузере это выглядит так:
http://localhost:8080/3;Петя
И тут мы плавно переходим к следующей аннотации @PathVariable. Она используется для извлечения данных из запроса, добавим ее в пример выше:

@RequestMapping(value = "/category.html/{id};{name}")
public String viewCategory(@PathVariable("id") Integer id, @PathVariable("name") String name {
// теперь мы можем использовать пришедшие в запросе
// данные, уже как обычные переменные, и обработать
// их как-либо
Integer myId = id;
String myString = name;
// TO DO something
}

Для более детального и вдумчивого изучения курим документацию. Поправляем где я ошибся.
Во второй части будет непосредственно код из файла CategoryController.java с комментариями.

Установка Spring-Boot в IDEA

Крутим Spring-Boot

Почитать и скачать этот самый Spring-Boot можно на сайте проекта. Сайт англоязычный, вот есть его копия по русски. Но там немного переведено, поэтому привыкаю читать на английском, это полезный скил.
Ну так в двух словах, про Spring-Boot. Вот что нам обещают разработчики:

Spring Boot позволяет вам легко создавать полноценные, производственного класса Spring-приложения, про которые можно сказать — «просто запусти». Мы включили Spring-платформу и сторонние библиотеки, чтобы вы могли запустить с минимум усилиями. Большинству Spring Boot приложениям требуется совсем маленькая Spring-конфигурация.

Возможности

  • Создание полноценных Spring приложений
  • Встроенный Tomcat или Jetty (не требуется установки WAR файлов)
  • Обеспечивает ‘начальные’ POMs для упрощения вашей Maven конфигурации
  • Автоматическая конфигурирация Spring когда это возможно
  • Обеспечивает такими возможностями, как метрики, мониторинг состояниями и расширенная конфигурация
  • Абсолютно без генерации кода и без написания XML конфигурация

Ну посмотрим.
Итак далее.
Если вы используете Maven надо немного покопипастить =).
Это в dependencies:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>javax.servlet.jsp-api</artifactId>
    <version>2.3.2-b01</version>
    <scope>provided</scope>
</dependency>

Это в плагины:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

Наблюдаем  волшебство Maven. И теперь у нас в секции Plugins есть плагин spring-boot.

Опция spring-boot:run это то что мы будем жать очень часто, это и есть запуск нашего сервера Tomcat с установленным на нем
Spring-Boot.

Кстати хочу сразу заметить, запущенный сервер изменяет jsp файлы на лету, так сказать, и при внесении изменений в них, сервер перезапускать не надо. Но если изменили java файл то тогда останавливаем сервер, пересоздаем пакет и запускаем снова. Иначе ничего не случится.
Если после запуска плагина spring-boot:run не выкинуло ошибок, и нет сообщений об ошибках.
То собственно и все, вы счастливый обладатель рабочего фреймворка. Теперь весь мир у ваших ног.
А если не запустился, то пишите, будем думать как его прикрутить.

Первый пост

Сегодня я поучаствовал в интересной беседе по хэнгу.  Мой ментор Сережа Пономаревпригласил для общения Максима Педича. Чтобы поднять мотивацию. Так, про Сергея я потом отдельный пост напишу. А может даже и про Максима =). А пока, по их вот советам решил вести блог где буду описывать процесс познания JavaWorld.