Lady Java!
Месяц: Август 2010
Нужно было поставить Oracle XE на Windows XP (RU).
Все нормально качается с официального сайта.
Установка супер-простая (по сравнению с обычной установкой оракла).
Пользователь по-умолчанию: system
SID по-умолчанию: XE
Панель управления доступна через на порту 8080.
Админка работает, SQLPlus подключается и уже казалось, что счастье так близко.
Если вы попытаетесь подключиться через JDBC, напоритесь на эпохальный баг с NLS.
Достаточно в Google вбить: oracle xe nls и вы увидите огромное множество советов по решению этой проблемы.
Вариантов уйма: править в реестре, менять локаль, выполнять магические команды в оракле, использовать специальный jdbc-драйвера от другой версии.
Все это конечно очень весело, но мне интересно, когда-нибудь Oracle подправит это баг или нет?… Это же ужасно.
For в Scala
Цикл for в Scala.
for ( i < - 1 to 10) { println(i) } |
Что получится в итоге? Здесь все понятно. На консоль будут выведены числа от 1 до 10 включительно.
Как это работает? Здесь немножко сложнее…
Число 1 — это Int, будет неявно преобразован компилятором в тип RichInt.
У RichInt есть метод to(end:Int), который возвращает объект класса Inclusive, который наследуется от класса Range.
Такие объекты замечательны тем, что позволяют нам пробежаться по некоторому диапазону целых чисел с определенным шагом.
То есть наш цикл, аналогичен следующему примеру:
for ( i < - 1.to(10) ) { println(i) } |
Кстати, если вы хотите увеличить шаг до двух, вы можете воспользоваться методом to(end: Int, step: Int). Например:
for ( i < - 1 to (10,2) ) { println(i) } |
Идем дальше.
Оператор < - является генератором, который присваивает переменной i по-очереди значения из интервала [1,10] с шагом 1.
Как работает этот генератор для цикла for ?
Согласно спецификации языка, происходит следующее:
The translation scheme is as follows. In a first step, every generator p < -e, where p is not irrefutable (§8.1) for the type of e is replaced by
p < - e.withFilter { case p => true; case _ => false }
Then, the following rules are applied repeatedly until all comprehensions have been
eliminated.
• A for comprehensionfor (p < -e ) yield e0
is translated toe.map { case p => e0 }
.
• A for loopfor (p < - e ) e0
is translated toe.foreach { case p => e0 }
.
…
Таким образом наш цикл, преобразуется к виду:
(1 to 10).foreach { case i => println(i) } |
Где для для каждого i выполняется println(i).
Все просто и без императивщины.
Небольшое объявление
Благодаря моему бывшему шефу в аспирантуре и кафедре информатики МФТИ, в следующем учебном году в осеннем семестре будет преподаваться семестровый курс по выбору «ПРАКТИКУМ ПО ПРОГРАММИРОВАНИЮ НА JAVA И SCALA». Кому интересно — приходите.