Category Archive: Java

Перемешивание букв в словах

Не имеет значения в каком порядке расположены буквы в слове ...
По рзелульаттам илссеовадний одонго анлигйсокго унвиертисета, не иеемт занчнеия, в кокам пряокде рсапожолены бкувы в солве. Галвоне, чотбы преавя и пслоендяя бквуы блыи на мсете. Осатьлыне бкувы мгоут селдовтаь в плоонм бсепордяке, все рвано ткест чтаитсея без побрелм. Пичрионй эгото ялвятеся то, что мы не чиатем кдаужю бкуву по отдльенотси, а все солво цликеом:))
Сегодня я приведу примеры реализации таких перемешиваний букв в словах. Первая реализация будет на языке Java, а вторая реализаций будет на JavaScript. Реализация на Java Цель: создать метод turn, который принимает строку, а возвращает строку со словами, в которых перемешаны все буквы, кроме первой и последней. Например, turn("По результатам исследований") вернет следующий текст: "По рзлуаьаттем иаслсеодинвй" Необходимо подключить следующие пакеты для работы с регулярными выражениями:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
Самое главное - регулярное выражение. \p{L} - означает unicode символ {4,} - задает количество от 4 до бесконечности
//регулярное выражение поиска unicode-последовательности из более 3-х символов
static final Pattern p = Pattern.compile("\\p{L}{4,}");
Реализация функции turn:
//функция принимает строку в обычном виде,
//а возвращает в перемешанном
static String turn(String str){
	//разбор строки
	Matcher m = p.matcher(str);
	//обработанные данные будем добавлять в переменную sb
	StringBuilder sb = new StringBuilder();
	//перебираем все фрагменты, которые нужно перемешать
	while(m.find()){
		//создаем массив из номеров позиций букв в массиве,
		//которые нужно перемешать
		int size = m.end() - m.start() - 2;
		int[] a = new int[size];
		int ndx = 0;
		for(int j = m.start() + 1;j < m.end() - 1;j++){
			a[ndx++] = j;
		}		
		//просто копируем все символы, которые не нужно перемешивать
		for(int i=sb.length();i<=m.start();i++){
			sb.append(str.substring(i, i+1));
		}
		//перемешиванием массив
		mix(a);
		
		//добавляем в переменную sb перемешанные буквы
		for(int el : a){
			sb.append(str.substring(el, el + 1));
		}
	}	
	//добавляем последние символы, которые перемешивать не нужно
	for(int i=sb.length();i

Ниже приведена функция перемешивания массива:
//функция перемешивания массива
static void mix(int[] arr){
	for(int i=0;i

Реализация на JavaScript
Из-за особенностей JavaScript реализация будет немного отличаться.
JavaScript поддерживает регулярные выражения, но не поддерживаются класс unicode-символов, а нам нужен класс символов \p{L}.
Для решения этой проблемы будем использовать плагин XRegExp.
Скачаем плагин с официального сайта http://xregexp.com/plugins/ или отсюда

Подключаем плагин к странице:

Регулярное выражение создается с помощью функции XRegExp, в которую первым параметром передаем шаблон регулярного выражения(описание шаблона см.выше), а вторым параметром флаг g, означающий поиск всех совпадений.
var exp = XRegExp('\\p{L}{4,}','g');
В реализации функции turn есть несколько ньюансов: 1) Вместо ресурсозатратной операции конкатенации(склеивания) строк мы будет добавлять символы в массив с помощью метода push. В конце мы сольем все элементы массива с помощью функции join, которая параметром принимает разделитель между элементами, а в нашем случае это пустая строка. 2) В JavaScript при использовании такого синтаксиса: for(el in arr), в переменную el кладется не элемент массива, а ключ. Чтобы получить элемент нужно получить его из массива по ключу: arr[el].
//функция принимает строку в обычном виде,
//а возвращает в перемешанном
function turn(text){
	//обработанные данные будем добавлять в массив res
	var res = [];	
	//перебираем все фрагменты, которые нужно перемешать
	while(match = exp.exec(text)){	
		//создаем массив из номеров позиций букв в массиве,
		//которые нужно перемешать
		var first = match.index + 1;
		var last = match.index + match.toString().length - 2;
		var arr = [];
		for(i=first;i<=last;i++){
			arr.push(i);
		}
		
		fix(arr);//перемешиванием массив
		
		//просто копируем все символы, которые не нужно перемешивать
		for(i=res.length;i<=match.index;i++){
			res.push(text.substring(i,i+1));
		}
		
		//добавляем перемешанные символы
		for(el in arr){
			var ndx = arr[el];
			res.push(text.substring(ndx,ndx+1));
		}	
	}
	//добавляем последние символы, которые не нужно перемешивать
	for(i=res.length;i

Код перемешивания элементов массива:
//функция перемешивания массива
function fix(arr){
	for(i=0;i

Готовую реализацию можно увидеть на странице: Перемешивание букв в словах (Пример)            

Как прописать системную переменную JAVA_HOME

Для начала проверим прописана ли системная переменная JAVA_HOME у вас в Windows.

В командной строке наберите:

echo %JAVA_HOME%

Как быстро вызвать командную строку? Нажмите Win+R. И в окне "Выполнить" наберите команду "cmd"

Если будет выведен следующий результат: "%JAVA_HOME%", значит системная переменная не установлена.

Приступим к настройке. Откройте свойства компьютера, для этого на значке "Мой компьютер" ("Компьютер") вызовите контекстное меню и выберите пункт "Свойства". Зайдите в "Дополнительные параметры системы" ("Дополнительно"). Нажмите кнопку "Переменные среды...". Во второй таблице под названием "Системные переменные" нажмите кнопку "Создать". set-java-home

В окне "Новая системная переменная" в поле "Имя переменной" укажите "JAVA_HOME" и в поле "Значение переменной" укажите путь к JDK или JRE (В чем разница JDK и JRE?). Чтобы не было опечаток, лучше скопируйте этот путь. Нажмите "OK", в окне "Переменные среды" также нажмите "OK". Переменная JAVA_HOME создана!

Для проверки перезапустите командную строку и снова набери команду:

echo %JAVA_HOME%

Должен появиться путь к вашей JDK или JRE (в данном примере указан путь к JDK): C:\Program Files\Java\jdk1.6.0_43

В чем разница JDK и JRE

JDK [Java Development Kit] - Набор инструментов для разработки на Java, сюда входить компилятор языка - javac JRE [Java Runtime Environment] - минимальная реализация виртуальной машины, необходимая для исполнения Java-приложений, без компилятора и других средств разработки. Другими словами JDK в основном используется в разработке, и для работы IDE (интегрированных сред разработки) нужен именно JDK. JRE - это всего лишь исполняемая среда, благодаря которой можно запустить приложение созданное на java.

Установка JDK (Windows)

JDK(Java Development Kit) - это пакет для разработки приложений на языке Java Скачать JDK можно с сайта Oracle, которому теперь принадлежит Java. 1) Открываем сайт oracle.com 2) Выбирает раздел Downloads 3) Нажимаем ссылку Java for Developers В таблице Java Platform, Standard Edition найдите последнее обновление для Java 6, у меня это Java SE 6 Update 43 (можно скачать и 7-ю версию, но 6-й версией меньше проблем). В столбце JDK нажмите кнопку Download download jdk Перед тем как что-то скачать, нужно согласиться с лицензионным соглашением, выбрав опцию "Accept License Agreement". jdk-version Нам нужно выбрать версию для Windows и определиться с разрядностью: Если у вас 32-разрядный Windows(x86), то вам подойдет только 32 разрядная версия Java; Если у вас 64-разрядкая Windows(x64), то можете выбрать 32 или 64-разрядкую Java. Но хочу отметить, что 64-разрядная Java более производительная и поддерживает большее кол-во оперативной памяти. Я выберу 64-битную версию (x64) - jdk-6u43-windows-x64.exe. Запускаем файл jdk-6u43-windows-x64.exe. В окне приветствия просто нажмите "Next" welcome-jdk-installation Директорию установки можно оставить без изменения и нажать "Next" jdk-install-path Дождитесь окончания копирование файлов ... Также установщик спросит куда устанавливать JRE (Java Runtime Environment - минимальная реализация виртуальной машины, необходимая для исполнения Java-приложений, без компилятора и других средств разработки). Директорию установки JRE также можно оставить без изменения. Нажмите "Next" jre-install-path В окне успешного завершения установки нажмите кнопку "Finish" installation-complete Теперь проверим доступность java. В командной строке наберите команду: java -version Должны вывестись следующие строки: java version "1.6.0_43" Java(TM) SE Runtime Environment (build 1.6.0_43-b01) Java HotSpot(TM) 64-Bit Server VM (build 20.14-b01, mixed mode) Также желательно прописать системную переменную %JAVA_HOME%. Установка и настройка JDK окончена!

Возможные проблемы с MySQL

  1. Просто установить MySQL мало, нужно его еще  донастроить. Самое главное - нужно не забыть про настройку max_allowed_packet (максимально разрешенный размер пакета). Например, если max_allowed_packet равен 1 мегабает, то в один прекрасный день вы не сможет записать данные размером более 1 мегабайта. Появится ошибка вида: Packet for query is too large (27545659 > 1048576) Теперь о том, как увеличить max_allowed_packet.
    Для windows: В файле my.ini после строки[mysqld]пропишите следующее значение max_allowed_packet=512M Не забудьте перегрузить службу MySQL!
    Для redhat: В файле /etc/my.cnf в блок [mysqld] пропишите следующий параметр max_allowed_packet = 512M Не забудьте перегрузить сервиc mysqld!
    service mysqld restart
    

  2. При создании базы данных сразу же указывайте кодировку UTF-8, иначе в linux-системах, будет проблема с юникодными символами:
    CREATE DATABASE your_database DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci

  3. Проблема с кодировкой при подключении к базе данных. Допустим, у нас есть строка подключения с указанием кодировки UTF8: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF8 Та же строка из-за экранирования символов в xml документе будет выглядеть так: jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF8 Если вы нечайно возьмете строку экранированную для xml с &amp; ошибки не возникнет, но кодировка не установиться. Вместо кириллицы будут вопросительные знаки. В windows проблема c кодировкой может и не возникнет, но в unix и linux обязательно возникнет.
  4. Может возникнуть проблема с внешними ключами (foreign key). Очень важно следить какой движок у ваших таблиц. У связанных таблиц движок должен быть InnoDB. Если у одной таблицы движок InnoDB, а у другой MyISAM, внешний ключ будет создан, но вы не сможете вставить данные в столбец с Foreign Key. Как это исправить: 1) Нужно поменять движок у существующих таблиц. Для каждой таблицы выполните запрос:
    ALTER TABLE название_таблицы ENGINE=InnoDB;
    
    Чтобы вычислить таблицы с движок отличным от InnoDB выполните запрос:
    SELECT    
        TABLE_NAME,
        ENGINE,
        CONCAT(CONCAT('ALTER TABLE ',TABLE_NAME),' ENGINE=InnoDB;')
    FROM
        INFORMATION_SCHEMA.TABLES
    WHERE
        TABLE_SCHEMA=DATABASE() AND ENGINE <> 'InnoDB'
    
    Результатом будет: название таблицы, текущий движок таблицы и уже сформированный запрос на изменение движка на InnoDB. Вам остается выбрать запросы для тех таблиц, у которых вы хотите поменять движок. 2) Как можно проконтролировать создание таблиц именно с движком InnoDB. Во-первых, можно при создании таблицы явно указать движок InnoDB. Во-вторых, можно установить движок InnoDB по умолчанию. Для этого в файлах my.ini (для windows) и my.cnf (для linux) в секции [mysqld] сделайте следующую настройку:
    default-storage-engine=innodb
    

  5. MySQL по умолчанию хранить таблицы (innodb) в одном файле. Причем размер этого файла никогда не уменьшается, т.е. если он достиг одного уровня, и вы удалили некоторые данные, MySQL не отдаст это свободное пространство. Это может быть критично при дефиците свободного места на диске. Чтобы решить эту проблему нужно перед созданием базы данных добавить в конфигурационный файл опцию:
    innodb_file_per_table=1
    
    После установки этой опции каждая таблица будет храниться в отдельном файле. Это также может быть полезно при ограничении на размер файла в операционной системе. Для начала лучше потренироваться на тестовой базе данных, а потом пробовать на боевой, сняв перед этим резервную копию.