2011-02-18

Шрифты

Читая один блог, наткнулся на рассуждения о шрифтах, какие лучше для чтения и программирования.
Посмотрев на календарь, увидел, что там 2011 год.
Решил, что, наверное, надо тоже сменить Tahoma и Courier New, на более современные разработки, тем более, что у меня с оказией Vista, а там идут новые секретные шрифты разработки M$.
Calibri, Cambria, Candara, Consolas, Constantia and Corbel - according to Poynter Online, the new ClearType Font Collection incorporates improved Clear Type and OpenType technologies, and a boatload of research, to improve the structure and the clarity of the letter forms. Basically, that means a story will be easier to read because the letters and words won't be as soft and mushy looking.

* Calibri - sans serif, suitable for documents, e-mail, Web design, and magazines
* Cambria - serif, a formal type for business documents, e-mail, and Web design
* Candara - sans serif, with vertical strokes not as reader-friendly perhaps
* Consolas - monospaced, suitable for displaying programming code
* Constantina - serif, very clean and readable, created for use in print or on the screen
* Corbel - sans serif, clean and works as an alternative to Arial, Trebuchet or Verdana
Для разработки в IDE и редакторах (notepad++) поставил Consolas.
Чуть не заболели глаза, стал разбираться - оказывается это шрифты под ClearType (в настройках дисплея), который у меня был выключен, т.к. он превращал Tahoma и Courier New в пытку, а тут видишь наоборот.
После включения сглаживания ClearType Consolas стал выглядеть очень мило и прилично. Из приятных бонусов: 1 не похожа на l(L малое), а у 0 (нуля) есть черточка, как в старые добрые времена.

Для остального долго мучился (вроде и так не так и это не так), выбрал Constantia serif и Corbel sans serif (основной) в Chrome и Constantia/Calibri в FF.
Потратил полдня, пока привыкаю, но в целом вроде мило.

2011-02-11

MySQL links and tips

Links
1. Сам MySQL и документацию (жаль в chm перестали делать) брать здесь:
http://dev.mysql.com/downloads/mysql/


2. Java JDBC Driver:
http://dev.mysql.com/downloads/connector/j/


3. Простая, легкая консоль (я пользуюсь ею для повседневных нужд - это free OS урезная редакция):
http://code.google.com/p/sqlyog/


4. Очень навороченная, крутейшая консоль+enterprise manager+отчеты
(можно в некоторых случаях отчеты делать не в web UI, а используя эту студию):
http://www.devart.com/ru/dbforge/mysql/studio/

Вот список возможностей:
http://www.devart.com/ru/dbforge/mysql/studio/features.html
в частности:
# Генерация отчетов данных
# Построение сводных таблиц

У них, кстати, много ещё вкусного free4personal для cp1251 users:
http://www.devart.com/ru/dbforge/


5. Советую подписаться на MySQL newsletter (на сайте MySQL легко найти)
бывают интересные статьи, советы, новости, интервью с экспертами.


6. Блог о тюнинге MySQL
mysqlperformanceblog.com
Лучше читать записи постарее (в новых много слишком заумного и про их порт).



Performance super mini faq
В my.ini/my.cnf файле конфигурации есть опция innodb_flush_log_at_trx_commit, внимательно почитайте про неё.
innodb_flush_log_at_trx_commit=0  - вполне разумный выбор IMHO


Vars
К сожалению, в запросе MySQL трудно написать сложную программу с if, while и тд, как это можно сделать в t-sql. В MySQL всё должно представлять из себя выражение см на примере if.
Но переменные это что-то! Их не надо муторно объявлять с типом и можно использовать в самых удивительных местах.
Пример (чтобы в Java работало несколько statement; в запросе не забудьте allowMultiQueries=true в JDBC Connection String/URL):

set @a = null; set @b = null; set @c = null;

select @a, @b, @c;-- null, null, null - всё чисто и готово к эксперименту

select 'boo!', @a+@b+@c
FROM (SELECT @a := 1, @b := 2, @c := 3) t; -- boo!, 6 т.е. from отработал раньше

select @a, @b, @c;-- 1,2,3 значения сохранились

select @a, @b, @c from (select @a := @a*10, @b:=@b*20, @c:=@c*30) t;-- 10,40,90 опять from отработал раньше

select @a, @b, @c;-- 10,40,90 и значения сохранились


SqlWatch
Отличная утилита code.google.com/p/sqlwatch !
Ставится как "JDBC proxy", предоставляет широкие возможности для профилирования sql запросов приложения.

JDBC Connection String
Сейчас использую следующий набор опций: jdbc:mysql:///название_БД?connectTimeout=180000&allowMultiQueries=true&cacheServerConfiguration=true&useLocalSessionState=true&zeroDateTimeBehavior=convertToNull&rewriteBatchedStatements=true
 

2011-02-09

Займемся самолечением

Важно! Предупреждение! Я не доктор и от медицины далек. Если вы заболели, лучше обратиться к врачу. Диагноз ставит врач. Лечение назначает врач (внимательно изучите, что он вам назначил).
Антибиотики назначает только врач! Не занимайтесь самолечением!

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

Коллеги просто напугали своими обширными познаниями в медицине на уровне "солнце вращается вокруг земли".
Решил изложить, что я знаю о креветках и отправлять всех читать этот пост.

Итак, горькая правда состоит в том, что современная медицина не умеет лечить большинство вирусных инфекций (перечитайте ещё раз).

Организм заболевшего человека через некоторое время САМ обучается бороться с проникнувшим вирусом и побеждает его.
Очень важно, что температура, которая бывает при этом – это помощник организма
(она в т.ч. убивает вирусы), показатель того, что организм борется.


Всё "лечение", которое даёт в данном случае медицина сводится к тому, чтобы снять интоксикацию, симптомы или осложнения = ПОСЛЕДСТВИЯ.

Так любимые многими антибиотики НЕ воздействуют на вирусы!
Они убивают бактерии, в том числе полезные, нанося при этом серьезный удар по организму.
Их назначают в том случае, если, например, после гриппа у вас развилась бактериальная ангина.
Пить их нужно, в крайнем случае, если осложнение таки появилось и оно серьезное.
Назначает прием антибиотиков и их конкретный тип - только врач! (Внимательно изучите назначение, если оно из книжек времен Брежнева - обсудите с врачем более современные и щадащие средства!)

Существенным прорывом науки в борьбе в вирусами являются прививки: это (всё сложнее, но для простоты) убитые или ослабленные вирусы. Организм учится определять и убивать их в тренировочном режиме, после чего в боевом это происходит быстрее.
При этом они не дают 100% гарантии и сами могут приводить к осложнениям ;-)

80% так называемых лекарств в аптеках - это вообще не лекарства, а препараты для снятия симптомов заболевания т.е. вы болеете, заражаете коллег, но выглядите внешне почти здоровым (всякие терафлю и тд).
Пользы от их применения нет вообще никакой. Т.к. они зачастую только вредят, например, снижая температуру.

Что делать, если заболели?
1.    заболев лежать, много пить (вода, чай с травами, шиповником), есть много витамина С, много спать.
2.    по возможности (до 38-39 градусов) не сбивать температуру
3.    не жрать без необходимости антибиотики
4.    чистить нос Coclean
5.    капать в нос Гриппферон
6.    пить Ремантадин (римантадин)
7.    пить настойку Эхиноцеии Пурпурной и Арбидол



Что делать, чтобы минимизировать риск заболевания?
Тренировать собственные защитные функции организма.
1.    прививка
2.    закаливание, например, контрастный душ (и кожа подтянется)
3.    зарядка / физические нагрузки
4.    прогулки на свежем воздухе
5.    чистить нос Coclean
6.    капать в нос Гриппферон (профилактические дозы)
7.    пить настойку Эхиноцеии и Арбидол  (профилактические дозы)
8.    чистка организма

2011-01-19

Технологические планы на 2011

  • Изучить и начать использовать mercurial.selenic.com (Hg)
  • Изучить и начать использовать maven.apache.org
  • Перейти с Log4j на давно изученный logback.qos.ch
  • Хорошенько сравнить mybatis со Spring JDBC + мои доработки - использовать победителя
  • Улучшить знание CSS
  • Улучшить знание JavaScript
  • IDEA 10 и только ручки
  • StAX (и углублять JAXB)
  • Активнее использовать  JBoss HornetQ (может есть MQ лучше? RabbitMQ и ActiveMQ не впечатлили)
  • Активнее использовать Ehcache (вкусное в 2.4, попробовать распределенный) + Spring 3.1 cache abstraction

2010-12-19

My Spring config style

Не понимаю фанатов Guice. Голый DI без классов удобной интеграции и XML ;-)

Если очень хочется обойтись вообще без XML в Spring:

org.springframework.web.context.support.AnnotationConfigWebApplicationContext

Кстати, в javadoc к нему: "Note: In case of multiple @Configuration classes, later @Bean definitions will override ones defined in earlier loaded files. This can be leveraged to deliberately override certain bean definitions via an extra Configuration class"

То же самое в org.springframework.context.support.ClassPathXmlApplicationContext: In case of multiple config locations, later bean definitions will override ones defined in earlier loaded files. This can be leveraged to deliberately override certain bean definitions via an extra XML file…


Я конфигурирую Spring так:

- org.springframework.web.context.support.XmlWebApplicationContext 

- конфигурируется в web.xml
 
    org.springframework.web.context.ContextLoaderListener
 



- всё что требует гибкой настройки находится в Spring XML.

- всё что окружение-зависимо в .conf файлах читаемых org.springframework.beans.factory.config.PropertyPlaceholderConfigurer

- включены аннотации , наиболее активно используются @Autowired, @Required

- очевидные, однозначные вещи конфигурируются через @Component, @Service, @Repositary (т.е. в XML не присутствуют) через:



IDEA проверяет правильность конфига и соотвествие его Java коду. Получаем замену скриптовым языкам с проверкой на этапе написания/компиляции.

PS: интересная презентация о следующих версиях Spring 3.1, 3.2
http://www.infoq.com/presentations/Spring-3.0-3.1-3.2

PPS: с оказией прошу поддежать включение поддержки JavaScript (rhino) в поставку Spring
https://jira.springframework.org/browse/SPR-1933
свежая версия https://jira.springframework.org/secure/attachment/16144/org.springframework.scripting.rhino_100205.zip

в комментариях есть примеры работы: многопоточной, с передачей объектов из приложения и тд - сказка!
Сейчас со Spring поставляются bsh, JRuby, Groovy - кому первые два нужны неясно.

2010-12-03

Java NG

В продолжение "хотелок" в Java.

Я считаю, что язык надо упрощать, а не усложнять (как это делает Scala).
Список пожеланий, что хотелось бы улучшить, добавить:
(в тексте [] используются для простого html == меньше больше)

1. добавить всё что есть в Project Coin: small language changes
много мелких синтаксических сахарков, делающих код более простым и наглядным.
В частности 'array getter/setter': v = myList[i]; mymap["key1"] = value == компилятор подставляет вызов get и put соответственно.
Если методов get/put/set не находится, то можно использовать любые другие проаннотированные @ArrayProperty


2. всё что есть в проекте Google Guava http://code.google.com/p/guava-libraries/
плюс статические и fallback методы у интерфейсов т.е. "перенос" максимум кода из статических методов в instance методы (mySet.filter(..), map1.transform, etc).
Пояснение про fallback: это статические методы в интерфейсе вида T filter (Set this, Filter _) - если у instance метода filter(Filter) нет,
то используется fallback метод из интерфейса.
myset.filter(myfilter).transform(myfunc) выглядит нагляднее и лучше работает с автокомплитом в отличии от transform(filter(myset, myfilter), myfunc)


3. возможность не писать ";" там где IDE и компилятор справятся без ; т.е. сделать точку с запятой более опциональной
Например: после и перед } , после )


4. простые замыкания (а не предлагаемый ужас), например: #{тело метода } или #(аргумент1, арг2, ){ тело } + именование параметров по умолчанию _ / _0, _1, _2, etc.
Последнее выражение в теле замыкания == return это выражение.
Также простое указание метода реализующего тело замыкания #this.имяМетода или #имяМетода или #другойОбъект.имяМетода (примеры ниже).

Примеры использования:

new Thread(#{log.info("hello!")}).start() == new Thread(new Runnable(){@Override public void run () { log.info("hello!"); }}).start()

mySet.filter(#{_ != null}) ==  mySet.filter(new Predicate[SomeType](){ @Override public void boolean apply (@Nullable SomeType _) { return _ != null; }});

vs текущее Iterables.filter(mySet, ....многобукв);

list.sort(#(a,b){a-b})  задание читателю ;-)

"ссылка на метод"
new Button("Нажми меня",    #myThisButtonClickListener) где в том же объекте объявлен реализующий тело интерфейса listener-а метод

public void myThisButtonClickListener (Button.ClickEvent event) {
    final Window subw = new Window("суб-окошечко");
    getMainWindow().addWindow(subw);
    ...
}

== new Button("Нажми меня",    #{myThisButtonClickListener(_)})

Многие уже сейчас реализуют это через reflection т.е. можно указать объект (this в данном случае) и имя метода в виде строки "myThisButtonClickListener"


5. конструкцию let[def/val/var], для тел методов, которая бы сама выводила тип переменной _в левую сторону_ vs текущая тенденция
выводить в правую (diamond operator и все эти Джошуа Блоковские static list, newMap и тд).
Пример использования.
let myvar = new ConcurrentHashMap[ТУТ БОЛЬШОЙ СПИСОК С Generics]()
final let s = "hello"
далее по коду работать с этими переменными как с обычными типизированными

for (let i : mybiggenericmap.entrySet()) {
  let k = i.key;
  for (let j = k; j<MAX; j++) {


6. авто свойства: если у класса есть getter getFoo(), то можно обращаться a = obj.foo, а если есть setter setFoo(T value), то obj.foo = v1. Внутри самого класса обращение к foo должно работать с переменной T foo, а this.foo - с getters/setter.
Автобилдеры?  myedit.width = 80, hight = 16, styleName = "sexy, main", value = 42;


7. массивы implements Iterable (можно будет применять filter, transform) и for работающий по Iterable/Iterator/Enumeration т.е. всеядный for, а не только массив и Iterable как сейчас.
Кроме того станут возможными унифицированные API: public double sum(Iterable collectionOrArray) .


8. полезные идеи из JavaFX (полный отказ от чистого JavaFX - это хорошо)
У JavaFX 2.0 очень трезвый и разумный roadmap http://javafx.com/roadmap/
Очень рекомендую на него поглядеть, много вкусного.

9. JRebel встроенный в JVM. JRebel хорошо, а out-of-box он бы imho дал такой синергетический эффект, что здорово бы улучшил индустрию.
Самый сильный козырь скриптовых языков быстрый цикл редактирование-тестирование в web, с JRebel этот козырь получили бы все языки JVM.



10. /regexp Pattern/ прямая поддержка в Java коде т.е. данная конструкция должна выглядеть как скомпилированный Pattern.



11. === безопасный вызов equals т.е.: a = b  - присваивание, a == b - сравнение ссылок и простых типов, left === b - сравнение объектов (и простых типов):  if (left == b) {  return true;  } if (left == null || b == null) { return false;  }  return left.equals(b);


Это сделало бы язык проще и уменьшило бы количество действительно ненужного кода, не превращая язык в Perl.

2010-10-26

Редкоиспользуемые, но полезные ссылки

Генератор "брендов".
"наш сервис поможет вам придумать уникальное название для вашей фирмы. Ваш новый бренд сразу заявит о вас, как о современной, инновационной и интеллектуальной компании"
http://www.brendogenerator.ru/


S как доллар
"многие люди ломают голову, как правильно диктовать адреса сайтов и электронной почты. Мы сделали сайт, который раз и навсегда ставит точку в этом вопросе.

Сайт «Эс как доллар» — верный помощник секретаря, менеджера и бухгалтера"

http://www.skakdollar.ru/


Давай я поищу в Google за тебя

http://lmgtfy.com/


2010-07-25

Java NG

Сейчас много говорят о новых языках работающих в JVM: Groovy, Scala, Clojure, JavaScript (Rhino), etc.

Мне нравятся Clojure и Rhino, остальные попахивают over-engineering'ом или "только для гиков/держать подальше от production".
Т.е. я не против "пусть цветут все цветы", но реальной замены Java пока нет и не наблюдается (очень серьезный конкурент это C# - активно развивается, но развивается IMHO по принципу "запихнем в язык всё что увидим").

Развивать Java надо (Sun развивал Java медленно, медленнее его разве что Borland с Delphi), но не пихая туда всё подряд, не усложняя язык, а наоборот упрощая.

Мой список пожеланий выглядит так:

1. всё что есть в проекте Coin
2. всё что есть в проекте Guava
3. простые замыкания (а не предлагаемый ужас), например: #{тело метода } или #(аргумент1, арг2, ){ тело }. Пример использования: new Thread(#{log.info("hello!"); }).start();
4. конструкцию let, для тел методов, которая бы сама выводила тип переменной. Пример: let myvar = new ConcurrentHashMap<Integer, Set<MyType>>(10); или final let s = "hello"; далее по коду работать с этими переменными как с обычными типизированными
5. авто свойства: если у класса есть getter getFoo(), то можно обращаться a = obj.foo, а если есть setter setFoo(T value), то obj.foo = v1. Внутри самого класса обращение к foo должно работать с переменной T foo, а this.foo - с getters/setter.
6. (мелочи) массивы implements Iterable и for each работающий по Iterable/Iterator/Enumeration

Это сделало бы язык проще и уменьшило бы количество действительно ненужного кода, не превращая язык в Perl.

2009-10-22

Sysinternals Junction

Открыл для себя утилиту Junction от Sysinternals.

http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx
http://download.sysinternals.com/Files/Junction.zip

Замечательная штука!
Для пользователя это полный аналог linux hardlinks.

Lifehack: Минздрав has you Neo

Вчера мне потребовалось купить обычной марганцовки.

Поход в аптеку открыл новость, что свободная продажа марганцовки в России запрещена - только по рецепту врача в муниципальной аптеке.

Я подумал и взломал систему:

В аптеках продаются наборы походных аптечек для «Мамы и ребенка» и «Авто».

В нескольких из них была обнаружена марганцовка.

Я купил самую дешевую аптечку (это оказалась «Мама и ребёнок» - её остальное содержимое в хозяйстве пригодится).


Стоимость аптечки ~ 200 руб., т.е. в несколько раз дороже пакетика марганцовки, но за удовольствие обмануть систему приходится платить.