Смена языка по нажатию caps lock

Сама по себе клавиша caps lock бесполезна. Но вот уже давно я нашел ей хорошее применение, повесив на нее смену языка. В системе их у меня два, поэтому оказалось очень удобно.

OS X

Я использую специальную раскладку Lipton, нашел ее здесь: http://azaitsev.com/avt/caps_switch_macos.html. Там же описание как ее использовать.

Windows

Для этой системы я остановился на Сapswitch: https://code.google.com/p/capswitch. Пока самая удобная, поставил и сразу работает.

Неожиданно

При использовании в контроллере конструкции redirect:/some-page результатом было добавление всех параметров в строку запроса, например: localhost/success?param1=value1&param2=value2&param3=value3.
А такого быть не должно. Поэтому, после небольших поисков нашлось следующее решение. Для Spring 3.1 необходимо включить опцию ignoreDefaultModelOnRedirect:

<mvc:annotation-driven ignoreDefaultModelOnRedirect="true"/>

А вот для версии, скажем 3.0, такого тэга нет. Но можно использовать небольшую хитрость, просто добавить переменную RedirectAttributes (даже можно не использовать ее) в метод, где вызывается редирект:

@RequestMapping("save")
public String doSave(RedirectAttributes ra)
{
   return "redirect:/success";
}

Как запустить OSGi консоль

По умолчанию, для созданного через визард Eclipse RCP «Hello World» приложения, OSGi консоль не запускается. Так вот, чтобы ее запустить надо сделать следующее:

  1. Добавить следующие бандлы/плагины в настройках запуска (Run Configurations):

  2. В параметры запуска добавить -console;
  3. Все, запускаем приложение и консоль должна запуститься автоматически.

Команда tree

Иногда бывает надостаточно команды ls и хочется увидеть дерево папок, а так как в bash нет такой команды, то пришлось написать свой вариант. Сначала конечно поискал в интернете и нашел пару стандартных запросов, основанных на команде find. Они были громоздки и сложны в использовании. Каждый раз надо было копировать, вставлять и запускать ибо запомнить такое просто невозможно. Но ведь хотелось просто вызвать tree в любой папке и увидеть всю иерархию.

Ниже представлен переработанный код:

# tree.sh

# по умолчанию показывает только директории,
# а если ввести -f, то скрипт отобразит и файлы
if [ "$1" = "-f" ]; then
   PARAM1=""
else
   PARAM1="-type d"
fi

# все просто, основано на find, поиск из текущей
# директории, затем идет разбор каждой строки,
# каждая строка разбивается по слешу на части и 
# вместо каждой директории отображает 5-ть пробелов и |,
# а затем отображает имя файла
find . $PARAM1 -print 2>/dev/null | awk '!/\.$/ {
   for (i=1; i<NF; i++) {
      d = (i==1) ? 0:5;
      printf("%"d"s", "|");
   } 
   print "--- "&NF;
}' FS='/'

Код надо сохранить в какой-нибудь sh файл, скажем tree.sh. Теперь необходимо иметь возможность его легкость запустить из любой директории. Я просто создал папку tree в корневой директории пользователя, поместил туда скрипт и добавил alias в ~/.bash_profile:

alias tree='~/tree/tree.sh'

Теперь все. Для примера возьмем apache-tomcat-7.0.32, перейдем в какую-нибудь директорию и позапускаем скрипт. Вот результаты:

# переходим в директорию manager
cd apache-tomcat-7.0.32/webapps/manager

# запускаем
tree

|--- images
|--- META-INF
|--- WEB-INF
|    |--- jsp

# отображаем дополнительно файлы
tree -f

|--- images
|    |--- add.gif
|    |--- asf-logo.gif
|    |--- code.gif
|    |--- design.gif
|    |--- docs.gif
|    |--- fix.gif
|    |--- tomcat.gif
|    |--- update.gif
|    |--- void.gif
|--- index.jsp
|--- META-INF
|    |--- context.xml
|--- status.xsd
|--- WEB-INF
|    |--- jsp
|    |    |--- 401.jsp
|    |    |--- 403.jsp
|    |    |--- 404.jsp
|    |    |--- sessionDetail.jsp
|    |    |--- sessionsList.jsp
|    |--- web.xml
|--- xform.xsl

MySQL импорт

Скажем, что для создания mysql дампа мы используем такую команду:

mysqldump -udemo -p12345 --routines demo_db | gzip -9 > dump.sql.gz

В результате мы получим dump.sql.gz архив, который впоследствии можем импортировать двумя способами:

# импорт через распаковку
gunzip dump.sql.gz && mysql -u{name} -p{password} {db_name} < dump.sql

# импорт через пайп
gunzip < dump.sql.gz | mysql -u{name} -p{password} {db_name}

А теперь, используя комманду time, засечем время выполнения каждого из способов. Для каждого из них я пересоздавал базу. В дампе находятся не только структура базы, но и тестовые данные. Размер файлов представлен ниже. И разница в том, что во втором случае архив остается на месте.

# 81.9 MB - dump.sql дамп
# 11.8 MB - dump.sql.gz архив

# импорт через распаковку
time (gunzip dump.sql.gz && mysql -udemo -p12345 demo_db < dump.sql)

real 1m9.599s
user 0m2.499s
sys  0m0.245s

# импорт через пайп
time (gunzip < dump.sql.gz | mysql -udemo -p12345 demo_db)

real 1m7.093s
user 0m2.536s
sys  0m0.193s

Редактируем колонку таблицы

Ни для кого не секрет, что vaadin таблицу можно сделать редактируемой, если вызвать метод table.setEditable(true) и наоборот. В этом случае редактировать можно все ячейки.

Но что, если необходимо редактировать ячейки только одной колонки? Например так:

Форумы и «Book of Vaadin» подсказывают, что надо использовать TableFieldFactory. Например: https://vaadin.com/book/-/page/components.table.html, параграф «Navigation in Editable Mode».

Собственно, примерно так должен выглядеть код:

// создаем таблицу и определяем ее колонки
Table table = new Table();
table.addContainerProperty("num", Integer.class, null);
table.addContainerProperty("name", String.class, null);
table.addContainerProperty("age", String.class, null);

// переопределяя метод создания редактируемых полей, мы просто 
// указываем конкретную колонку или колонки, для которых надо 
// создавать эти самые поля
table.setTableFieldFactory(new TableFieldFactory() {
   @Override
   public Field createField(Container c, Object itemId, 
         Object propertyId, Component uiContext) {
      TextField field = null;

      if ("age".equals(propertyId)) {
         field = new TextField((String) propertyId);
         field.setWidth("100%");
      }

      return field;
   }
});

// а это позволит проверить работоспособность примера по 
// двойному нажатию мышки на табличке
table.addListener(new ItemClickEvent.ItemClickListener() {
   @Override
   public void itemClick(ItemClickEvent event) {
      if (event.isDoubleClick()) {
         table.setEditable(!table.isEditable());
      }
   }
});

// осталось заполнить таблицу данными и запустить приложение
int index = 1;
table.addItem(new Object[]{index, "Nathan Fielding", 41}, index++);
table.addItem(new Object[]{index, "John Smith", 26}, index++);
table.addItem(new Object[]{index, "Jane Hill", 88}, index++);
table.addItem(new Object[]{index, "John Sheridan", 32}, index++);
table.addItem(new Object[]{index, "Marc Torvalds", 40}, index++);
table.addItem(new Object[]{index, "Sarah Richards", 34}, index++);
table.addItem(new Object[]{index, "Peter Fielding", 85}, index++);
table.addItem(new Object[]{index, "Lenny Sheridan", 32}, index++);
table.addItem(new Object[]{index, "Lenny McGoff", 70}, index++);
table.addItem(new Object[]{index, "John Halas", 72}, index++);

Intellij IDEA, правильный путь для Git

Для настройки Git в Intellij IDEA необходимо указать правильный путь — /usr/local/git/bin/git.
Если все правильно, то получим сообщение:

В моем случае сработало, иначе можно выполнить which git в коммандной строке и получить этот самый путь.

https://code.google.com/p/git-osx-installer/downloads/list — скачать git для OS X.
http://youtrack.jetbrains.com/issue/IDEA-89514 — был даже тикет с таким вопросом.