Ubuntu +Nginx установка certbot и получение сертификата

sudo apt-get install software-properties-common python-software-properties
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot
sudo certbot certonly

Saving debug log to /var/log/letsencrypt/letsencrypt.log

How would you like to authenticate with the ACME CA?
——————————————————————————-
1: Place files in webroot directory (webroot)
2: Spin up a temporary webserver (standalone)
——————————————————————————-
Select the appropriate number [1-2] then [enter] (press ‘c’ to cancel):
//Отвечаем 1
Enter email address (used for urgent renewal and security notices) (Enter ‘c’ to
cancel):ваша@почта с которой регистрировались в letsencrypt

Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree
in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
——————————————————————————-
(A)gree/(C)ancel: a //соглашаемся

Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let’s Encrypt project and the non-profit
organization that develops Certbot? We’d like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
——————————————————————————-
(Y)es/(N)o: // как считаете нужным

Please enter in your domain name(s) (comma and/or space separated) (Enter ‘c’
to cancel): ваши домены через запятую или пробел

1: Enter a new webroot
——————————————————————————-
Press 1 [enter] to confirm the selection (press ‘c’ to cancel): //нажмите 1 и ентер
Input the webroot for ваш_домен.com: (Enter ‘c’ to cancel): /var/www/ваш_домен.com // укажите путь к корню домена

Конфигурационный файл домена
server {
listen 443 ssl;
root /usr/share/nginx/backline.ru;
index index.php index.html index.htm;
server_name backline.ru www.backline.ru;
ssl_certificate /etc/letsencrypt/live/backline.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/backline.ru/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers ‘EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH’;
………………..
}

server {
listen 80;
server_name backline.ru www.backline.ru;
return 301 https://$host$request_uri;
}

Как увеличить раздел /boot

Необходимость увеличения раздела /boot появляется при обновлениях, в случае если /boot является разделом, а не каталогом и размер его недостаточен для процесса обновления системы.
1. Первый вариант, который приходит в голову — загрузиться с live-cd и с помощью gparted изменить разделы диска в нужных пропорциях. Есть риск потери данных, поэтому надо бэкапить все важные данные. Но этот вариант в моем конкретном случае не подошел. У меня виртуальный сервер на firstVDS.
2. Тогда я решил заменить раздел /boot каталогом /boot (кто мне ответит зачем я его сделал, да и еще размером в 90мб…?).
Вот этот процесс я и опишу.
Не буду говорить о необходимости бекапов, каждый сам знает насколько важны его данные. Я не делал, поскольку был сильно уверен, что все получится с первого раза. Получилось, но не совсем с первого :).
Итак первое я посмотрел какие разделы у меня смонтированы
#mount
….
мне интересны строки

/dev/vda3 on / type ext4
/dev/vda2 on /boot type ext2

Затем я посмотрел что же у меня в /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>
/dev/vda3 / ext4 errors=remount-ro 0 1
/dev/vda2 /boot ext2 defaults 0 2

Значит строчку с /dev/vda2 надо закомментировать, т.о. 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>
/dev/vda3 / ext4 errors=remount-ro 0 1
#/dev/vda2 /boot ext2 defaults 0 2

Теперь в корне файловой системы я создал каталог /boot_new и скопировал в него все содержимое /boot

#cp -R /boot/* /boot_new/

Затем отмонтировал раздел /dev/vda2

#umount /dev/vda2

Поскольку теперь каталог /boot освободился, то назад копируем все файлы из /boot_new , но в /boot_new я ничего не удалил.

#cp -R /boot_new/* /boot/

Теперь можно обновляться, что я и сделал.
Вот тут, вероятнее всего, я совершил ошибку. Решил, что все готово и запустил перезагрузку

#reboot

А, как я сейчас предполагаю, надо было дать команду

#update-grub

и это избавило бы меня от лишних волнений.
Ну чтож, опишу дальнейшие мои действия.
Сервер не загрузился 🙁 , загрузилась консоль grub
grub>
Не буду описывать процесс поиска решения, а сразу дам его (решение).

grub>ls
(hd0) (hd0,gpt3) (hd0,gpt2) (hd0,gpt1)

Я помню, что /boot был на vda2 — hd0,gpt2 а корень на vda3 — hd0,gpt3 , значит:

set prefix=(hd0,gpt3)/boot/grub
set root=(hd0,gpt3)
ls /boot
initrd.img-3.13.0-106-generic //оказалось там только один файл, остальные исчезли при обновлении..

Ладно, я помню, что оставил /boot_new и он мне помог

set prefix=(hd0,gpt3)/boot_new/grub
set root=(hd0,gpt3)
linux /boot_new/vmlinuz-3.13.0-107-generic root=/dev/vda3
initrd /boot_new/initrd.img-3.13.0-107-generic
boot

Ура, сервер запустился!
Я сразу же дал команду

#update-grub

И еще раз перезагрузил сервер, чтобы убедиться, что все сработало.

Java MySQL кириллица

Казалось бы простая задача прочитать файл xls приложением на Java, обработать данные и вставить их в базу MySQL отняла достаточное время на борьбу с вопросами вместо кириллических символов. Не помогали различные попытки перекодировать содержимое перед внесением их в базу. Помог <a href=’http://www.linux.org.ru/forum/general/10798611′>совет доброго человека с ЛОРа</a> Итак , добавляем в конец секции mysqld вот такие строки
<pre>
collation_server=utf8_unicode_ci
character_set_server=utf8
skip-character-set-client-handshake
</pre>
Рестартуем сервер базы
<pre>
sudo service mysql restart
</pre>
И самое сложное — пересоздаем базу.

Увеличить раздел LVM

На одном из линукс-серверов (rhel5) стало катастрофически не хватать дискового пространства. Испробовав на подобных системах увеличение раздела с помощью GParted, я сначала успокоился, но увидев в fdisk -l
<pre>
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 13054 104751832+ 8e Linux LVM
</pre>
понял, что настал момент освоения LVM. Итак нам к виртуалке прилепили еще 500 гб, которые надо было освоить. Сразу после добавления, fdisk не видел эти 500 гб, пришлось ребутить машину. Создал новый раздел /dev/sda5 и изменил его тип на 8e, так, что получилось
<pre>

Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 13054 104751832+ 8e Linux LVM
/dev/sda3 13055 78325 524289307+ 5 Extended
/dev/sda5 13055 78325 524289276 8e Linux LVM
</pre>
Еще раз перезагрузка, так посоветовал fdisk . Теперь добавляем в нашу текущую группу томов новый раздел
<pre>
$sudo vgextend VolGroup01 /dev/sda5
Volume group «VolGroup01» successfully extended
</pre>
и посмотрим что получилось:
<pre>
$sudo lvdisplay
— Logical volume —
LV Name /dev/VolGroup01/LogVol00
VG Name VolGroup01
LV UUID CroKa1-1xUj-ZwvZ-uH1o-0aLS-Ry3U-ufMWWX
LV Write Access read/write
LV Status available
# open 1
LV Size 94.97 GB
Current LE 3039
Segments 1
Allocation inherit
Read ahead sectors auto
— currently set to 256
Block device 253:0

$sudo vgdisplay
— Volume group —
VG Name VolGroup01
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 4
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 2
Act PV 2
VG Size 599.88 GB
PE Size 32.00 MB
Total PE 19196
Alloc PE / Size 3196 / 99.88 GB
Free PE / Size 16000 / 500.00 GB
VG UUID is0cO1-Nhap-3B8U-Vp9g-j5PV-b535-RXjuOF
</pre>
Видно, что группа томов имеет свободное пространство 500 гб, но логический том LogVol00 попрежнему 95 гб. Необходимо еще две операции — расширить логический том, указав ему сколько-то гигов и затем расширить саму файловую систему. Вот эти две заключительные команды:
<pre>
sudo lvextend -L +500G /dev/VolGroup01/LogVol00
sudo resize2fs /dev/VolGroup01/LogVol00
</pre>
Причем, если первая команда выполняется быстро, то вторая заняла некоторое время и, чтобы убедиться , что все идет по плану, я открыл вторую консоль и командой df наблюдал за постепенным увеличением нужного раздела.
<b>Консольные команды</b>
<pre>
dmsetup — низкоуровневая работа с драйвером device-mapper
lvm — инструмент для настройки LVM
lvmdiskscan — сканирует доступные диски, показывает их размер и принадлежность к PV LVM
Physical Volume

pvcreate — инициализация устройства как PV
pvchange — изменение атрибутов PV
pvremove — удаление неиспользуемого PV
pvmove — перемещение PV между различными устройствами
pvresize — изменение размера PV занятой VG
pvscan — сканирование дисков на предмет PV
pvs — вывод информации о PV
pvdisplay — вывод атрибутов PV
Volume Group

vgcfgbackup — резервное копирование области описания VG в файл
vgcfgrestore — восстановление области описания VG из файла
vgconvert — конвертация метаданных из LVM1 в LVM2
vgcreate — создание VG
vgremove — удаление VG
vgchange — изменение параметров VG
vgrename — переименовывание VG
vgmerge — склеивание двух VG
vgsplit — разделение одной VG на две
vgscan — сканирование дисков на наличие VG
vgdisplay — вывод атрибутов VG
vgs — вывод информации о VG
vgexport — отключение VG
vgimport — подключение VG
vgextend — добавление PV в VG
vgreduce — удаление неиспользуемых PV из VG
vgck — проверка целостности метаданных VG.
vgmknodes — пересоздание файлов для VG в каталоге /dev
Logical Volume

lvcreate — создание LV
lvremove — удаление LV
lvrename — переименовывание LV
lvchange — изменение параметров LV
lvresize — изменение размера LV
lvextend — увеличение размера LV
lvreduce — уменьшение размера LV
lvscan — поиск LV в VG
lvdisplay — вывод атрибутов LV
lvs — вывод информации о LV
</pre>

Java запись JTable в файл Excel

По роду деятельности часто приходится выполнять просьбы пользователей о сбросе данных в формат xls. Ранее сохранял данные в CSV формате и открывал их в Excel. Постоянная неудовлетворенность привела к варианту (надеюсь не окончательному) с использованием библиотеки JExcelAPI
<pre>
protected void saveToXLS(JTable table) {
// Определяем куда
String path = «output.xls»;// Если полный путь не определен, то файл запишется в текущий каталог с именем output.xls
JFileChooser fileopen = new JFileChooser();
fileopen.removeChoosableFileFilter(fileopen.getFileFilter());
FileFilter filter = new FileNameExtensionFilter(«Excel files», «xls»);
fileopen.addChoosableFileFilter(filter);

int ret = fileopen.showDialog(null, «Сохранить в файл»);
if (ret == JFileChooser.APPROVE_OPTION) {
path = fileopen.getSelectedFile().getAbsolutePath();
}
if (!path.substring(path.length() — 4, path.length()).equalsIgnoreCase(
«.xls»)) {
path += «.xls»;
}
System.out.println(path);
// создаем новый XLS документ
WritableWorkbook workbook;
try {
workbook = Workbook.createWorkbook(new File(path));
WritableSheet sheet = workbook.createSheet(«Sheet1», 0);

WritableFont wf_color = new WritableFont(WritableFont.ARIAL, 10,
WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE,
Colour.AQUA);
WritableCellFormat wff_color = new WritableCellFormat(wf_color);
wff_color.setBackground(Colour.DARK_BLUE);
// Строка заголовка
int colCount=table.getColumnCount();
// Здесь пропускается первая колонка с номерами строк,
// поскольку у Excel свой нумератор и наша колонка будет как зайцу пятая нога
for (int i = 1; i < colCount; i++) {
Label colName = new Label(i-1, 0, table.getColumnName(i), wff_color);
sheet.addCell(colName);
}

//Заполняем лист Excel данными из таблицы
for (int i = 0; i < table.getRowCount(); i++) {
for (int j = 1; j < colCount; j++) {
try {
Label l = new Label(j-1, i + 1, table.getValueAt(i, j).toString());
sheet.addCell(l);
} catch (Exception e) {
e.printStackTrace();
}

}
}
// На любителя — автоподбор ширины столбцов
for (int i = 0; i < colCount-1; i++) {
CellView c = sheet.getColumnView(i);
c.setAutosize(true);
sheet.setColumnView(i, c);
}
// Записываем и закрываем
workbook.write();
workbook.close();
} catch (IOException e) {
JOptionPane.showMessageDialog(Main.this, e.toString(), «Ошибка!»,
JOptionPane.ERROR_MESSAGE);
} catch (JxlWriteException e) {
JOptionPane.showMessageDialog(Main.this, e.toString(), «Ошибка!»,
JOptionPane.ERROR_MESSAGE);
} catch (WriteException e) {
JOptionPane.showMessageDialog(Main.this, e.toString(), «Ошибка!»,
JOptionPane.ERROR_MESSAGE);
}

}
</pre>

Сервер 1С:Предприятие 8.3 на Lubuntu 14.04

В статье я указал, что на сайте 1С мы скачали клиента и сервер 1С 8.3. Распакуем их например в каталоги
<pre>
~/1c/client/

1c-enterprise83-client_8.3.4-437_i386.deb
1c-enterprise83-client-nls_8.3.4-437_i386.deb
</pre>
и
<pre>
~/1c/server/

1c-enterprise83-common_8.3.4-437_i386.deb
1c-enterprise83-common-nls_8.3.4-437_i386.deb
1c-enterprise83-crs_8.3.4-437_i386.deb
1c-enterprise83-server_8.3.4-437_i386.deb
1c-enterprise83-server-nls_8.3.4-437_i386.deb
1c-enterprise83-ws_8.3.4-437_i386.deb
1c-enterprise83-ws-nls_8.3.4-437_i386.deb
Установим распакованные deb-пакеты:

cd ~/1c/server/

dpkg -i *.deb

cd ../client/

dpkg -i *.deb
</pre>

В статье я указал, что на сайте 1С мы скачали клиента и сервер 1С 8.3. Распакуем их например в каталоги
<pre>
~/1c/client/

1c-enterprise83-client_8.3.4-437_i386.deb
1c-enterprise83-client-nls_8.3.4-437_i386.deb
</pre>
и
<pre>
~/1c/server/

1c-enterprise83-common_8.3.4-437_i386.deb
1c-enterprise83-common-nls_8.3.4-437_i386.deb
1c-enterprise83-crs_8.3.4-437_i386.deb
1c-enterprise83-server_8.3.4-437_i386.deb
1c-enterprise83-server-nls_8.3.4-437_i386.deb
1c-enterprise83-ws_8.3.4-437_i386.deb
1c-enterprise83-ws-nls_8.3.4-437_i386.deb
Установим распакованные deb-пакеты:

cd ~/1c/server/

dpkg -i *.deb

cd ../client/

dpkg -i *.deb
</pre>

Клиент сразу не поставился, попросил libwebkitgtk 1c-enterprise83-client зависит от libwebkitgtk-1.0-0 (>= 1.2.5), однако: Пакет libwebkitgtk-1.0-0 не установлен. Надо, значит надо:
<pre>
sudo aptitude install libwebkitgtk-dev
</pre>
Вот и все!!! Пробуем создать базу 1С. Ярлык клиента 1С создается в разделе меню Офис
Меню
Запускаем -> Добавить -> Создание новой информационной базы -> … без конфигурации … -> На сервере
Клиент
После нажатия кнопки Далее> у меня опять выскочило такое же окно с предложением дозаполнить нижние поля формы. Повторил, дальше все прошло успешно. Сейчас очевидно мы встретимся с предупреждением о том, что не обнаружена лицензия. У меня есть аппаратный ключ и поэтому я установлю его драйвер.

PostgreSQL 9.2.4 с патчами от 1С на Lubuntu 14.04

Старенький ноутбук Toshiba Satellite-A75 станет стендом для этой практической работы по установке сначала базы данных PostgreSQL, затем клиента и сервера 1С:Предприятие версии 8.3. Процессор Intel(R) Pentium(R) 4 CPU 3.20GHz, память 1381MiB. Предварительно скачаем и установим сам линукс Lubuntu http://cdimage.ubuntu.com/lubuntu/daily-live/current/trusty-desktop-i386.iso . Выбор Lubuntu стал результатом исключительно нетребовательности к ресурсам по железу. На сайте 1С https://users.v8.1c.ru берем нужные файлы (подразумевается имеющийся дуступ), а именно: Патчи вместе с исходниками PostgreSQL 9.2.4 или для тех, кто не хочет заморачиваться с патчами готовый deb-пакет Cервер 1С:Предприятия для DEB-based Linux-систем Клиент 1С:Предприятия для DEB-based Linux-систем Разумеется, клиент может быть и под Windows. Начнем. В скачанном файле patch.rar находим каталог SRC_DEB, а в нем исходники оригинального постгреса postgresql-9.2_9.2.4.orig.tar.bz2. Распакуем исходники в каталог ~/src/postgresql-9.2.4/ и в нем создадим каталог для патчей ~/src/postgresql-9.2.4/patches, в который уже скопируем сами патчи 1c_FULL_92-0.23.1 applock-1c-9.2.patch online_analyze.patch plantuner.patch postgresql-1c-9.2.patch Зайдем в каталог с патчами
<pre>
~/src/postgresql-9.2.4/patches
</pre>
и поочередно выполним
patch -d .. -p1 <1c_FULL_92-0.23.1

patch -d .. -p1 <applock-1c-9.2.patch patch=»» -d=»» ..=»» -p1=»» <online_analyze.patch=»» <plantuner.patch=»» <postgresql-1c-9.2.patch=»» <=»» pre=»»>
Теперь пробуем подготовиться к компиляции
<pre class=»brush: bash»>cd ~/src/postgresql-9.2.4/

./configure
</pre>
упс…

<strong>configure: error: in `/home/baklan/src/postgresql-9.2.4′: configure: error: no acceptable C compiler found in $PATH See `config.log’ for more details.</strong>

ага, нечем компилировать. Я выполнил стандартную установку:
<pre class=»brush: bash»>sudo apt-get install linux-headers-`uname -r` binutils pkg-config build-essential
</pre>
еще раз ./configure выявила следующую ошибку:

<strong>configure: error: readline library not found If you have readline already installed, see config.log for details on the failure. It is possible the compiler isn’t looking in the proper directory. Use —without-readline to disable readline support.</strong>

ну это было и 5 лет назад, значит нужно
<pre class=»brush: bash»>sudo aptitude install libreadline-dev
</pre>
Сейчас ./configure успешно. Идем дальше, компиляция:
<pre class=»brush: bash»>make
</pre>
компиляция с первого раза выдала старую знакому ошибку:

<strong>error: ‘APPLICATION’ undeclared here (not in a function) PG_KEYWORD(«application», APPLICATION</strong>

Уже известно как исправляется

Нужно: в src/interfaces/ecpg/preproc/preproc.h после строки UMINUS = 746 поставить запятую и добавить строку APPLICATION = 747 . Т.о. получим вот такой фргмент этого заголовочного файла
<pre class=»brush: bash»>UMINUS = 746,

APPLICATION = 747

};

#endif
</pre>

в src/backend/parser/gram.h аналогично
<pre class=»brush: bash»>UMINUS = 669,

APPLICATION = 670

};

#endif
</pre>
и опять
<pre class=»brush: bash»>make

make install

cd contrib

make install
</pre>
если получите

<strong>mchar.h:7:27: fatal error: unicode/uchar.h: Нет такого файла или каталога</strong>

необходима установка
<pre class=»brush: bash»>sudo aptitude install zlib1g-dev
</pre>
еще раз
<pre class=»brush: bash»>make install
</pre>
Я решил сделать каталог баз данных в /home/bases
<pre class=»brush: bash»>sudo mkdir /home/bases
</pre>
Добавим пользователя postgres и группу postgres
<pre class=»brush: bash»>sudo useradd -g postgres -d /home/bases -s /bin/bash -c «PostgreSQL Server» -u 5026 postgres
</pre>
Пользователя сделаем владельцем каталога баз данных
<pre class=»brush: bash»>sudo chown postgres:postgres /home/bases
</pre>
Установим пароль для пользователя postgres
<pre class=»brush: bash»>sudo passwd postgres

Введите новый пароль UNIX:

Повторите ввод нового пароля UNIX:

passwd: пароль успешно обновлён
</pre>
Теперь от пользователя postgres инициализируем базу данных
<pre class=»brush: bash»>su postgres

/usr/local/pgsql/bin/initdb -D /home/bases
</pre>
и первый запуск PostgreSQL
<pre class=»brush: bash»>/usr/local/pgsql/bin/pg_ctl -D /home/bases -l /home/bases/pgsql.log start

server starting
</pre>
Проверим прослушивается ли стандартный порт PostgreSQL 5432
<pre class=»brush: bash»>netstat -atn

tcp 0 0 127.0.1.1:53 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN

tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN

</pre>

<hr>

По старинке сделаем скрипт запуска сервера postgres
<pre class=»brush: bash»>sudo nano /etc/init.d/pgsql
</pre>
вот такого содержания:
<pre class=»brush: bash»>#!/bin/sh

case $1 in
restart)
sudo -u postgres -H /usr/local/pgsql/bin/pg_ctl -D /home/bases -l /home/bases/pg.log stop
sudo -u postgres -H /usr/local/pgsql/bin/pg_ctl -D /home/bases -l /home/bases/pg.log start
;;
start)
sudo -u postgres -H /usr/local/pgsql/bin/pg_ctl -D /home/bases -l /home/bases/pg.log start
;;
stop)
sudo -u postgres -H /usr/local/pgsql/bin/pg_ctl -D /home/bases -l /home/bases/pg.log stop
;;
*)
echo start|stop|restart
return 1;
;;
esac
</pre>

Права запуска для этого скрипта:
<pre class=»brush: bash»>sudo chmod +x /etc/init.d/pgsql
</pre>
и автозапуск:
<pre class=»brush: bash»>sudo update-rc.d pgsql defaults
</pre>
пробуем проверить работу скрипта:
<pre class=»brush: bash»>sudo service pgsql restart

waiting for server to shut down….

done server stopped server starting
</pre>
Итак мы установили сервер баз данных PostgreSQL 9.2.4 с патчами для работы 1С:Предприятие. Далее рассмотрим установку самого сервера 1С 8.3</applock-1c-9.2.patch>

Изменение размеров рисунков (Linux)

Изменение размеров рисунков (линукс) Часто возникает необходимость изменения размеров нескольких рисунков, иногда очень большого количества. Для таких целей в линукс есть прекрасный инструмент convert из состава imagemagick, если у вас он еще не установлен, то sudo aptitude install imagemagick Подготовим маленький shell-скрипт conv.sh
<pre>
#!/bin/sh
n=1
for f in $* ;do
convert -geometry 180×240 $f $n.jpg
n=$(($n + 1))
done
# end of script
</pre>
Если выполнить этот скрипт примерно так ./conv.sh ./img/IMG*.jpg то в каталоге ./img все рисунки, имена которых начинаются на IMG, скопируются в рисунки под номерами 1.jpg, 2.jpg и т.д. новыми размерами 180×240 (180 ширина, 240 высота). Можно указать только ширину, тогда высота изменится пропорционально. Если нужно оставить те же имена, то предварительно лучше создать каталог для новых рисунков, поскольку в каталог с оригинальными нельзя сохранять, они будут замещаться рисунками с новыми размерами. Скрипт в таком случае примет вид
<pre>
#!/bin/sh
for f in $* ;do
convert -geometry 180×240 $f /newcatalog/$f
done
# end of script
</pre>
Здесь скрипт упростился, счетчик уже не нужен. Можно имена новым рисункам дать другие, например добавить приставку convert -geometry 180×240 $f /newcatalog/min_$f Таким образом легко сделать миниатюры фотографий для сайта. Мало того, мы можем jpg сконвертировать в png и другие форматы. Для этого надо взять базовое имя исходного файла и добавить к нему нужное расширение
<pre>
#!/bin/sh
for f in $* ;do
convert -geometry 180×240 $f ${f%.*}.png
done
# end of script
</pre>

Java — получить все переменные окружения

<pre>
public class SysEnv {

public SysEnv() {
// TODO Auto-generated constructor stub
}

public static void main(String[] args) {
// TODO Auto-generated method stub
java.util.Enumeration e = System.getProperties().propertyNames();
while( e.hasMoreElements() )
{
String prop = (String)e.nextElement();
System.out.print(prop);
System.out.print(» = «);
System.out.println( System.getProperty(prop) );

}
}
}
</pre>

Eclipse — нумерация строк

Для включения нумерации строк в редакторе Eclipse можно пойти двумя путями:

В меню Window -> Preferences -> General -> Editors -> Text Editors -> Поставить галку в чекбоксе Show line numbers;
Правой кнопкой мыши в окне редактора вызвать контекстное меню. В нем Preferences -> General -> Editors -> Text Editors -> Поставить галку в чекбоксе Show line numbers.