воскресенье, 12 августа 2012 г.

Настройки -Xmn, -Xms, -Xmx для запуска Eclipse

Настройки запуска Eclipse.
Это короткая заметка о том, как выставить правильные настройки для запуска Eclipse.

Eclipse работает в JVM (Java Virtual Machine), поэтому параметры требуются для JVM, которая запускает Eclipse.

Небольшая заметка, основанная на эмпирическом опыте при многократном запуске Eclipse с разными параметрами.

Для наблюдения за памятью в Eclipse, можно включить опцию 
Window / Preference / General / галочка Show heap status
После этого в правом нижнем углу эклипса появится индикатор памяти.
Клик правой кнопкой / Show max heap.
Теперь красной полоской отмечено значение MAX (примерное значение 95% * Xmx)
Граница оранжевой полоски TOTAL (примерное значение 93% * Xms)
Белая полоска HeapSize показывает сколько места сейчас занято.
Если нажать на мусорное ведро, то сработает сборщик мусора, и белая полоска будет стремиться установиться в позицию равную по значению Xmn (параметр из опций запуска)
(P.S. Описанное выше в плане % приблизительно.)

Список некоторых параметров запуска:
-Xmn  определяет объём занятой памяти до которой сборщик мусора должен освобождать память (если это возможно).
-Xms  определяет размер начальной выделенной памяти под объекты
-Xmx  определяет максимальный размер памяти, выше которого приложение не задействует.


Правило настроек запуска Eclipse:
-Xmn < -Xms < -Xmx
А также:  
Xms примерно равно Xmx;
Xmn примерно половина от Xms;

Оптимальные настройки запуска Eclipse для ОЗУ в 6Gb (для эклипса выделяется не более 2.5Гб)
-Xmn1200m -Xms2400m -Xmx2500m

Оптимальные настройки запуска Eclipse для ОЗУ в 2Gb (для эклипса выделяется  не более 800Мб)
-Xmn380m -Xms750m -Xmx800m


Полезные ссылки:
http://habrahabr.ru/post/117274/
http://www.javaspecialist.ru/2011/04/permanent.html
http://www.javaspecialist.ru/2011/04/java-thread-stack.html
http://habrahabr.ru/post/65076/ 

среда, 9 мая 2012 г.

Запуск Netty\Java на android эмуляторе

Сегодня 09.05.2012.
Сегодня произошла большая радость. Мне удалось откомпилировать и запустить мой тестовый консольный клиент, написанный на Netty, на android-эмуляторе!

вторник, 8 мая 2012 г.

Netty\Java - асинхронный событийно ориентированный сетевой фреймворк

Заметка по Netty\Java.

Netty is an asynchronous event-driven network application framework
for rapid development of maintainable high performance protocol servers & clients.

Netty - асинхронный событийно ориентированный сетевой фреймворк для быстрой разработки высоконагруженных клиент-серверных приложений.

четверг, 1 марта 2012 г.

Взять таблицу по имени (VBA)

Ох уж этот странный Visual Basic!
Приведённый код проверялся на Visual Basic 6.3

Задача:
Получить указатель на таблицу по её имени.

Рабочий пример:
(Работает)
    Dim db As DAO.Database
    Dim td As DAO.TableDef
    Dim strName As String

    Set db = CurrentDb()
    Set td = db.TableDefs("имя таблицы")

    strName = td.Name



А теперь два примера, которые должны работать с точки зрения C++ программиста, но они не работают!
(нет 1)
    Dim td As DAO.TableDef
    Dim strName As String

    ' записано одним выражением
    Set td = CurrentDb().TableDefs("имя таблицы")

    ' будет ошибка!
    strName = td.Name
(нет 2)
    Dim td As DAO.TableDef
    Dim strName As String

    ' убраны скобки после CurrentDb
    Set td = CurrentDb.TableDefs("имя таблицы")

    ' будет ошибка!
    strName = td.Name

пятница, 20 января 2012 г.

Ошибка "undefined reference to vtable for"

При написании элементарного класса в Qt у вас возникла ошибка содержания

undefined reference to vtable for MyClass

В таком случае, вам, вероятно, надо обновить Makefile'ы. Если вы работаете в виндовс, то вы можете просто удалить эти файлы, Qt создаст новые.

Или можно воспользоваться командой qmake, которая обновит эти файлы

Также Qt обновит Makefile файлы если вы измените содержимое .pro/.pri файлов

Ещё в Qt Creator есть пункт меню Build \ Run qmake, полагаю, он также запускает qmake. Раньше никогда не пользовался этой опцией :)

Источник: http://www.prog.org.ru/topic_10329_0.html#msg62742

среда, 18 января 2012 г.

Как напечатать UTF-8 текст из bat-файла?

Это просто! Надо всего лишь прочитать 100-500 мануалов по командной строке Windows и провести 200 экспериментов по написанию bat-скриптов)

Если серъёзно, то вывести файл с текстом в формате UTF-8 можно следующим образом

@echo off
set file=YourFileName
cmd /u /c chcp 65001 | echo my super text1 > "%file%"
cmd /u /c chcp 65001 | echo my super text2 >> "%file%"
cmd /u /c chcp 65001 | echo my super text3 >> "%file%"
...

Кавычки в записи "%file%" нужны по той причине, что имя файла может содержать пробелы.

Мы вызываем CMD cо флагом /u, который сообщает, что запускаемая консоль должна возвращать результат в формате UTF-8.

Далее в этой же строке после флага мы передаём команду. Кстати, флаг означает, что после выполнения переданной команды, консоль закрывается.

Как можно заметить, мы передаём две команды, разделённых знаком |. Данный знак позволяет записать две нужных нам команды в одну строку.

Первая команда chcp 65001 устанавливает кодировку UTF-8 в запущенной консоли. (Чтобы узнать, какая текущая кодировка установлена в консоли, достаточно вызвать команду chcp без параметров.)

Вторая команда echo текст > "%HOME%\%file%" печатает соответствующий текст в файл с именем "%HOME%\%file%", где имена переменных развёртываются в путь к домашней директории и имени файла .bash_login.

Как установить текущую дерикторию для Cygwin?

Любители работать в консоли, подобной консоли линукса, могут установить себе Cygwin, юникс подобную среду, где будут доступны стандартные консольные программы из линукса.

Ставится Cygwin довольно просто. В процессе установки в одном из режимов можно выставить флажки напротив программных пакетов, которые вы хотите установить. Я выбрал себе пакеты nano, git и что-то ещё.

После инсталляции на рабочем столе появляется ярлычок Cygwin для запуска среды.


Запуск Cygwin из любой папки

Так как я пользуюсь TotalCommander-ом, мне удобно запускать программы сразу из нужной мне директории. Создадим удобный bat-файл для запуска Cygwin.

Сразу, без долгих размышлений, копируем строку "Объект" из свойства этого ярлыка в новый созданный нами файл C:\bin\bash.bat
Полное содержимое файла будет выглядеть так:

@start "" C:\cygwin\bin\mintty.exe -i /Cygwin-Terminal.ico -

Обратите внимание на то, что путь до exe-файла у вас может быть другим. У себя я установил Cygwin в директорию C:\cygwin.
Также если директория C:\bin у вас ещё не добавлена в переменную окружения PATH, то это следует сделать.


Настройка запуска Cygwin

После некоторой работы с Cygwin я обнаружил, что не смотря на то, что запускать Cygwin я могу из любой директории, просто прописав слово bash, сама же запускаемая среда всегда открывается в домашней директории вашего пользователя. (Домашняя директория установлена в переменной окружения HOME).

Это выглядит не очень удобно, ведь если я пишу команду bash, находясь в директории D:\xyz, то я и рассчитываю, что запущенный Cygwin также будет находиться в директории D:\xyz.

Если вы обратите внимание, то увидите, что ярлык с рабочего стола запускает утилиту mintty.exe. Мы сразу понимаем, что необходимо ознакомиться с перечнем входящих атрибутов для данной команды.
Открываем Cygwin и вводим

man mintty

После внимательного изучения мануала, мы радуемся некоторым возможностям, о которых не подозревали, а именно: возможности задать размеры и координаты запускаемого окна Cygwin.

Открываем наш bat-файл и изменяем его содержимое на следующее:

@start "" C:\cygwin\bin\mintty.exe -i /Cygwin-Terminal.ico --size 120,77 --position -4,0 -

В данном случае я установил нужный мне размер окна Cygwin и позицию появления окна (отрицательное значение -4 нужно, чтобы кромка окна оказалась за границей монитора, и её не было видно).

Теперь моё окно будет всегда появляться в удобных мне координатах, а не будет смещаться при каждом новом запуске на +8 пикселей по x,y.

Но как же быть с директорией запуска Cygwin?

Ведь переходить в нужную директорию из домашней - жутко не удобно!

Решение было найдено! Для установки текущей директории при запуске Cygwin мы можем использовать скрипт автозапуска для запускаемой среды bash.

Значит нам нужно усовершенствовать наш bash.bat файл таким образом, чтобы он создавал файл автозапуска для запускаемой консоли bash

Запускаем Cygwin, вводим команду "man bash" и читаем документацию в поисках необходимого нам. Находим несколько вариантов имён файлов для домашней директории пользователя, который запускаются при авторизации в bash.
Файлы, запускаемые при авторизации в bash:

~/.bash_profile
~/.bash_login
~/.profile

Файл, запускаемый при запуске "bash без авторизации в нём

~/.bashrc

Важное замечание: файл автозапуска ~/.bash_login (или любой другой) должен быть написан в кодировке UTF-8! И не должен использовать символы \r. (Например команда pwd у меня не выполнялась, когда файл содержал в конце символ \r, свойственный системе Windows).

Как оказалось, вывести UTF-8 текст из CMD не так-то просто, но возможно!
Вот пример, как это делается:

cmd /u /c chcp 65001 | echo некий текст >"имя_файла"

Усовершенствуем наш C:\bin\bash.bat файл, теперь он имеет содержимое:

@echo off
SET file=.bash_login
cmd /u /c chcp 65001 | echo #!/bin/bash > "%HOME%\%file%"
cmd /u /c chcp 65001 | echo cd "%CD:\=/%" >> "%HOME%\%file%"
@start "" C:\cygwin\bin\mintty.exe -i /Cygwin-Terminal.ico --size 120,77 --position -4,0 -

После запуска, консоль bash выполняет содержимое файла ~/.bash_login. Этот файл должен быть в формате UTF-8. Для этого мы вызываем CMD cо флагом /u, который сообщает, что запускаемая консоль должна возвращать результат в формате UTF-8.

Далее в этой же строке после флага мы передаём команду. Кстати, флаг означает, что после выполнения переданной команды, консоль закрывается.

Как можно увидеть, мы передаём две команды, разделённых знаком |. Данный знако позволяет записать две нужных нам команды в одну строку.

Первая команда chcp 65001 устанавливает кодировку UTF-8 в запущенной консоли. (Чтобы узнать, какая текущая кодировка установлена в консоли, достаточно вызвать команду chcp без параметров.)

Вторая команда echo текст > "%HOME%\%file%" печатает соответствующий текст в файл с именем "%HOME%\%file%", где имена переменных развёртываются в путь к домашней директории и имени файла .bash_login.

Обратите внимание на необычное обращение к переменной CD, в которой содержится текущий каталог cmd-консоли. Если обычно переменная развёртывается записью

%CD%

То в нашем случае, мы используем запись

%CD:\=/%

Что позволяет сразу заменить все слеши в стиле Windows \ на слеши в стиле Linux / .

Не забываем помещать все имена файлов и директорий в двойные кавычки, таким образом это позволит попадать в директории содержащие пробелы.

За счёт того, что используется UTF-8, данная конструкция успешно позволяет открывать Cygwin в директориях с русскими именами.

Таким образом, при каждом запуске в консоли команды bash, будет запускаться скрипт C:\bin\bash.bat, который перезаписывает файл автозагрузки среды bash в Cygwin. Теперь мы можем легко и удобно запускать консоль bash из любой директории и сразу попадать в эту же самую директорию в bash-консоли.

Радуемся и наслаждаемся результатом!


Подведём итоги

  1. Мы установили Cygwin
  2. Создали файл C:\bin\bash.bat с содержимым
        @echo off
        SET file=.bash_login
        cmd /u /c chcp 65001 | echo #!/bin/bash > "%HOME%\%file%"
        cmd /u /c chcp 65001 | echo cd "%CD:\=/%" >> "%HOME%\%file%"
        @start "" C:\cygwin\bin\mintty.exe -i /Cygwin-Terminal.ico --size 120,77 --position -4,0 -
        
    (Заметка: путь C:\bin\ должен содержаться в переменной окружения PATH)
    За счёт этого мы добились:
    • запуска терминала Cygwin в указанной позиции экрана (параметр --position)
    • запуска окна определённого размера (параметр --size)
    • запуска Cygwin из любой директории, набрав в консоли слово bash
    • при этом запущенный Cygwin располагается в той же директории, откуда был запущен!