?

Log in

No account? Create an account

Configuring the Collation for Veps language, fine MySQL
componavt
Veps language have fun characters: č š ž ü ä ö.

We need in the sorting of veps words in MySQL database (UTF-8, Unicode) in accordance with Veps language writing system.

By default, i.e. with the help of utf8_general_ci you can get the following sequence: ä č ö š ü ž. It is not o'key :(

You can change the sort order in accordance with Veps alphabet if you create your own collation rules. These rules should be described in the "C:\Program Files\MySQL\MySQL Server 5.1\share\charsets\Index.xml" in LDML syntax. Voila:

<?xml version='1.0' encoding="utf-8"?>
<charsets max-id="100">
...
<charset name="utf8">
...
<collation name="utf8_veps_ci" id="100"> <!-- 135 by ГОСТ 7.75-97 -->
    <!--settings caseLevel="on"/-->
    <rules>

      <reset>s</reset>
      <p>\u0161</p>    <!-- š 0161 Small "S with caron" -->
      <t>\u0160</t>    <!-- Š 0160 Capital "S with caron" -->
      <p>z</p>
      <t>Z</t>
      <p>\u017E</p>    <!-- ž 017E Small "Z with caron" -->
      <t>\u017D</t>    <!-- Ž 017D Capital "Z with caron" -->

      <reset>v</reset>
      <p>\u00FC</p>    <!-- ü 00FC LATIN SMALL LETTER U WITH DIAERESIS -->
      <t>\u00DC</t>    <!-- Ü 00DC LATIN CAPITAL LETTER U WITH DIAERESIS -->
      <p>\u00E4</p>    <!-- ä 00E4 Small A with an umlaut mark or diaeresis  -->
      <t>\u00C4</t>    <!-- Ä 00C4 Capital A with an umlaut mark or diaeresis  -->
      <p>\u00F6</p>    <!-- ö 00F6 Small "O with diaeresis" -->
      <t>\u00D6</t>    <!-- Ö 00D6 Capital "O with diaeresis" -->

      <p>\u2019</p> <!-- ' 2019 Apostrophe -->

    </rules>
  </collation>

</charset>

Restart MySQL.

Check that your Veps collation in Index.xml is parsed and loaded into MySQL:
mysql> show collation LIKE "%veps%";

+--------------+---------+-----+---------+----------+---------+
| Collation    | Charset | Id  | Default | Compiled | Sortlen |
+--------------+---------+-----+---------+----------+---------+
| utf8_veps_ci | utf8    | 100 |         |          |       8 |
+--------------+---------+-----+---------+----------+---------+
1 row in set (0.25 sec)

Let's check the sorting of letters by this request:
SET NAMES utf8; 
SELECT * FROM (
    SELECT 'c' as l
    UNION ALL
    SELECT 'C' as l
    UNION ALL
    SELECT 'č' as l
    UNION ALL
    SELECT 'Č' as l
    UNION ALL
    SELECT 'D' as l
    UNION ALL
    SELECT 'd' as l
    UNION ALL
    SELECT 'o' as l
    UNION ALL
    SELECT 's' as l
    UNION ALL
    SELECT 'S' as l
    UNION ALL
    SELECT 'š' as l
    UNION ALL
    SELECT 'Š' as l
    UNION ALL
    SELECT 'z' as l
    UNION ALL
    SELECT 'Z' as l
    UNION ALL
    SELECT 'ž' as l
    UNION ALL
    SELECT 'Ž' as l
    UNION ALL
    SELECT 't' as l
    UNION ALL
    SELECT 'u' as l
    UNION ALL
    SELECT 'v' as l
    UNION ALL
    SELECT 'V' as l
    UNION ALL
    SELECT 'ü' as l
    UNION ALL
    SELECT 'Ü' as l
    UNION ALL
    SELECT 'ä' as l
    UNION ALL
    SELECT 'Ä' as l
    UNION ALL
    SELECT 'ö' as l
    UNION ALL
    SELECT 'Ö' as l
    UNION ALL
    SELECT '’' as l) ls
    ORDER BY l COLLATE utf8_veps_ci;

The result with utf8_veps_ci collation is:
c     C     č     Č     D     d     o     s     S     š     Š     Z     z     ž     Ž     t     u     v     V     ü     Ü     ä     Ä     ö     Ö     ’

The previous sorting by utf8_general_ci collation produced:
’     ä     Ä     c     C     č     Č     D     d     o     ö     Ö     s     S     š     Š     t     u     ü     Ü     v     V     Z     ž     Ž     z

Now Veps will be happy :)


References:

“Do not use ORDER BY RAND()” or “How to get random rows from table?”
componavt
Just a good link to bright idea, that I need now:

Anton Titov. SQL / “Do not use ORDER BY RAND()” or “How to get random rows from table?”

Because
SELECT quote FROM quotes ORDER BY RAND() LIMIT 1
is too slow!


Java, JDBC and “memory leaks” (elegant code)
componavt
Several hints to make your Java-SQL code more stable:

Example 1. (Source: Clean up repetitive setup and cleanup Java(JDBC) code / Stack Overflow (see answer of Adam Paynter)
Statement statement = connection.createStatement();
try {
ResultSet results = statement.executeQuery(...);
try {
while (results.next()) {
//handle rows
}
} finally {
results.close();
}
} finally {
statement.close();
}
Example 2. (Source: meta/LPAR. Java, JDBC and “memory leaks”. 2008)
public static void doSomething() {
try {
Connection connection = DriverManager.getConnection(JDBC_URL);
try {
PreparedStatement statement = connection.prepareStatement("SELECT FIRST,LAST FROM PEOPLE WHERE LAST = ?");
try {
statement.setString(1, "Smith");
statement.execute();
ResultSet results = statement.getResultSet();
try {
while (results.next()) {
String first = results.getString(1);
String last = results.getString(2);
logger.info(first + " " + last);
}
} finally {
results.close();
}
} finally {
statement.close();
}
} finally {
connection.close();
}
} catch (SQLException e) {
logger.severe("Failed to get JDBC connection: " + e.getMessage());
}
}

When your program eats to much memory, then you need additional resources. You need to check every line, especially related to SQL objects.

Let's speed up SQLite
componavt
This page is a part of the tutorial "How to convert the Wiktionary parsed database (MySQL) into SQLite file".

The file to be loaded into SQLite is not too big, it is only 931 MB (parsed Wiktionary database).

But the loading into SQLite has been taken more than 30 hours...  Luckily, my computer crashed, so I can rethink - how to speed up the loading of the prepared MySQL dump into SQLite.

Firstly, the synchronization should be turned off.
 $ sqlite3
 PRAGMA synchronous = OFF;
PRAGMA journal_mode
= OFF;
PRAGMA locking_mode
= EXCLUSIVE;
PRAGMA temp_store
= MEMORY;

PRAGMA count_changes = OFF
;
PRAGMA PAGE_SIZE = 4096;
PRAGMA default_cache_size=700000;
PRAGMA cache_size=700000; PRAGMA compile_options;

Check the allocation unit size of a NTFS partition in Vista (PAGE_SIZE):
fsutil fsinfo ntfsinfo c:

Secondly, the text in the SQL dump should be wrapped by the transaction command.
Commit every 50 000 items.

default_cache_size=700000, so each page uses about 1.5K in memory, so it requires 1.05 GB of RAM.

 BEGIN; // before the first INSERT statement
 your super SQL INSERTs...
 COMMIT; // after the last INSERT statement

The perl-script and .bat files (add_transactions.pl and add_transactions.bat) will help to add "BEGIN; COMMIT;" for huge files.

If you have additional indexes - create them only AFTER ALL data is in table


A Lockheed P2V-3 Neptune launches with &quot;jet-assisted take-off (JATO)&quot; from the aircraft carrier USS Midway (CVB-41) probably on 7 April 1949.

Futher Reading
Tags: ,

Регулярные выражения с бубном
componavt
Куски функции с регулярными выражениями стали вести себя странно. Какие-то фантомные ошибки - то проявляется баг, то работает нормально!?...

Обновил NetBeans... Не помогло!
Поставил новый JDK. Та же фигня!!
Убил огромный список переменных во вкладке "Watches"... А-а-а-а!!! Заработало...

Эти переменные копились уже пару месяцев и занимали два экрана. По-видимому, когда NetBeans показывал их мне - компилятор регулярных выражений (RE) рушился... Примерно, так:

Пока соображал, что к чему, наткнулся на интересный сайт с регулярными выражениями: java.util.regex // Example Depot

Число ошибок пропорционально размеру функции
componavt
N( bugs ) = f( function.length )
причём не прямо, а ужасно-пропорционально.

Хорошая функция влезает на один экран монитора, а хороший интерфейс имеет обозримое число кнопок.
Но мониторы бывают разные... иногда монструозные...

Если функция не влезает на один экран, то в ней есть баг. /Опыт/

Число багов не меньше числа экранов, занимаемых функцией. /Подозрение/

А "user-friendly interface" нам только снится. Пример монструозного UI.

Мой вигвам, твой фигвам...
componavt
Понравилась фраза одного испанского хакера:

LEGAL STUFF: Mi casa su casa, but if you get hurt or someone gets hurt from this casa, then it's your casa, not mine.


Нежданная польза
componavt
Когда программисту удаётся извлечь пользу из написанного кода и применить свою программу для дела, то его обычно обуяет нестерпимая гордость за своё детище.



Викиголизация всей страны
componavt
Он переживал за парсеры и системы индексирования, поэтому выражался грамотным, правильным русским языком. Трудности и фразеологизмы безбожно викифицировал.

Spell cheker и этика боролись в голове при чтении писем друзей.

В итоге он устроился в издательство "Наука" и стал лучшим корректором страны.

Так поднимем же бокалы за совершенные произведения искусства. Кстати, обожаю эту скульптуру.

Учите матчасть
componavt
Самоё удовольствие, когда надо написать необходимую функцию, а она уже бац! - есть в API.
Учите матчасть и будете непотопляемы в цейтноте рабочих будней...