Вспомнил пароль к профильному блогу по программированию, перенес прошлую статью по Scala туда и добавил еще одну - тема в заголовке.
воскресенье, 28 февраля 2010 г.
пятница, 26 февраля 2010 г.
Подведем итоги
Итак, по окончанию срока правления Ющенко в сухом остатке имеем:
За время президентства Ющенко население страны уменьшилось почти на два миллиона человек. Это — абсолютный европейский рекорд!
— Глава государства, который, несмотря на уличающее в коррупционных действиях заключение специальной следственной комиссии парламента (комиссия ВР под руководством Виктора Суслова по банку «Украина»), продолжает без зазрения совести вещать о борьбе с коррупцией.
— Глава европейского государства ХХI века (!), двинувший войска на столицу для разгона парламента.
— Самый дорогой в Европе для налогоплательщика президент парламентской республики: содержание Ющенко стоило украинцам 1 млрд. 620 млн. грн. в год, что больше содержания вместе взятых парламента с 450 депутатами (около 500 млн.), правительства с премьером, вице-премьерами и министрами (около 1 млрд.) и равно затратам на содержание президента Леонида Кучмы почти за 4 года. После свержения Бокассы, Иди Амина и Дювалье ни один правитель мира не позволял себе тратить в бедной стране подобные средства на свое содержание.
— К окончанию правления имеет 14 государственных резиденций — значительно больше, чем у любого европейского монарха. Кстати, если бы не направленный мною депутатский запрос в Генпрокуратуру, была бы и пятнадцатая — Мариинский дворец. В шедевре великого Бартоломео Растрелли уже начали переделку старинной планировки для сооружения под президентское семейство ванных комнат и туалетов.
— Единственный глава государства в Европе (не считая королей), поместивший собственное изображение на деньгах страны: Ющенко «увековечил» себя на монете в 50 грн. На постсоветском пространстве до этого додумался лишь бывший президент Туркменистана Сапармурат Ниязов (Туркменбаши).
— Единственный в Европе глава государства, добивающийся государственного почитания своих родственников. Заслуженного генерала — директора музея Великой Отечественной войны уволили за отказ разместить на День Победы в Зале героев фотографии «любившего хороший немецкий кофе» президентского отца. На постсоветском пространстве лишь Туркменбаши официально присвоил звание Героев Туркменистана покойным родителям.
— Единственный глава страны, воевавшей в рядах Антигитлеровской коалиции, Ющенко награждает государственными наградами гитлеровских офицеров вермахта и СС, агентов спецслужб Третьего рейха, лиц, совершивших преступления против человечности.
— Глава государства, назначающий близких родственников на высокие государственные посты (так, 24-летний племянник стал в 2005-м вице-губернатором одной из крупнейших областей) и награждающий их высокими государственными наградами. Любимого коня, правда, в парламент провести не пытался.
— Единственный в мире глава государства, поставивший не имеющую медицинского образования дочь руководить Национальным институтом рака. Можно порадоваться, что все-таки в операционной она там пока не занята.
— Единственный в демократической Европе государственный лидер, маниакально озабоченный поиском доказательств собственного «высокого происхождения». Целая толпа сервильных псевдоисториков занимается выведением «высочайшей» родословной от последнего кошевого атамана Запорожской Сечи Петра Калнишевского. Еще бы пару лет президентства, и они наверняка бы «нашли свидетельства» о прямом происхождении Ющенко в крайнем случае от Ярослава Мудрого...
— Единственный в мире государственный лидер, пытающийся создать с помощью спецслужбы «национальную церковь».
— Глава государства, дающий образование своим детям в школе, где отечественную историю, родной язык и литературу не преподают даже факультативно. Впрочем, в качестве граждан США (один из бывших друзей Ющенко утверждал, что лично держал в руках американские паспорта семейства) они учат родной язык и историю того отечества.
— Единственный в Украине человек без исторического образования, получивший Государственную премию в области науки за цикл «трудов» по специальным историческим дисциплинам. Каюсь, по просьбе Бориса Евгеньевича Патона, мы с академиком Иваном Курасом включили в 1999 г. не написавшего ни единой строки Ющенко в состав своих соавторов.— Единственный в мире президент, на официальном сайте которого указано, что он дважды академик — «Академии экономических наук Украины, академик Украинской Академии экономической кибернетики». При этом, например, об «Украинской Академии экономической кибернетики» узнать можно только из официальной биографии «мессии», других свидетельств ее существования нет!
— Глава государства, назначавший в ХХI в. министром юстиции, руководителем офиса президента и заместителем руководителя спецслужбы людей, фальсифицировавших документы о получении ими высшего образования. А также присвоивший им почетные звания. Зато все они преданы «идеалам майдана», ставшим индульгенцией на безнаказанное разграбление страны.
— Единственный в мире президент, присвоивший начальнику своей охраны звание генерал-полковника за выдающиеся успехи в демонстрации личной преданности.
— Президент, употребляющий в адрес премьера страны на заседании Совбеза слова и словесные обороты из лексикона, бытующего в ближайшей подворотне.
— Глава государства, разогнавший ГАИ, вследствие чего на дорогах погибли десятки тысяч украинцев.
— Глава государства, удосужившийся ввести уникальную новацию в юриспруденции (касающуюся всего лишь увольнения главы райадминистрации): «РАСПОРЯЖЕНИЕ ПРЕЗИДЕНТА УКРАИНЫ № 161/2009-рп Об отмене Распоряжения Президента Украины от 6 марта 2009 года № 38
Отменить Распоряжение Президента Украины от 6 марта 2009 года № 38 «Об отмене Распоряжения Президента Украины от 13 декабря 2007 года № 292».
— Глава государства, не стесняющийся покупать и публично демонстрировать краденые артефакты «черной археологии». Если бы правоохранители «изучили» собранную Ющенко коллекцию трипольских предметов, она могла бы «потянуть» лет на 5...
— Единственный в мире президент, имеющий к концу правления рейтинг недоверия в 87,4% и — подобно рейхсканцлеру Гитлеру — сетующий на нацию, «недостойную фюрера», заявил о том, что ему стыдно за выбор украинцев.
— Президент, проигравший выборы с наиболее удручающим результатом. До этого сомнительный рекорд принадлежал экс-президенту Словакии Рудольфу Шустеру, занявшему на выборах 2004 года четвертое место и получившему 7,4% голосов. Все-таки сумели «оранжевые» революционеры обогнать Европу. Даже Гитлер имел в конце апреля 1945 г. более высокий уровень поддержки немецкого народа.
— Президент, сам себя назначивший своим указом на должность руководителя музея — «Мистецького арсеналу». Спасибо, что собственным указом не возвел себя в Герои Украины.
— Президент демократической страны (!), на последней в качестве главы государства пресс-конференции заявивший, что не явится на инаугурацию нового руководителя страны, и тут же попросил у этого преемника «подарить ему государственную резиденцию в Конча-Заспе, угрожая в противном случае поселиться на вокзале. Неужели теперь свое поместье в Ново-Безрадичах он превратит в железнодорожную станцию?..
[Scala] Function currying
Вот эта тема меня поначалу сильно озадачила :) Что это такое, в принципе было понятно, не было понятно - а зачем оно мне надо? Итак, каррирование a.k.a function currying - что это? Если у нас есть некая функция с несколькими аргументами, то для получения ее значения нам необходимо передать ей значения всех аргументов. При применении каррирования мы можем передать ей лишь некоторые из них, а в качестве результата получим функцию, принимающую оставшиеся аргументы. И если уже в эту функцию мы передадим остальные аргументы, то получим собственно результат. Названа техника в честь ее изобретателя, Хаскелла Карри. В некоторых случаях это позволяет уменьшить дублирование кода и упростить его переиспользование.
В качестве практического примера позаимствую хороший пример с вычислением налогов, желающие могут ознакомиться с оригиналом на аглицком здесь.
Итак, у нас есть несколько штатов, в которых есть города. В каждом городе существует своя политика налогообложения, где сумма облагается налогом по одной ставке и плюс к этому, определенная ее часть облагается дополнительным налогом по другой ставке:
| Abbr. | State | City | Tax computation |
| TF | Terrafirma | n/a | 2% of the entire value |
| TC | Terracotta | n/a | 6% on the first $1500 |
| CF | Confusion | Gotham | 5% on the entire value plus 4.5% on the first $1000 |
| CF | Confusion | Ocean City | 5% on the entire value plus 3% on the first $1000 |
| CF | Confusion | Hometown | 5% on the entire value plus 1.5% on the first $1000 |
Сначала определим обобщенную функцию вычисления налогов:
def pct(rate: Double, amt: Long) = (rate * amt / 100.0D + 0.5D).toLong //helper function for rounded percentage calculation
def tax(rateA: Double, limit: Long, rateB: Double, amt: Long) = pct (rateA, amt) + pct (rateB, limit min amt)
Теперь определим функции для вычисления налогов в каждом городе без применения каррирования:
def taxTF (amt: Long) = tax(2.0D, 0, 0.0D, amt)
def taxTC (amt: Long) = tax(0.0D, 150000, 6.0D, amt)
def taxGothamCF (amt: Long) = tax(5.0D, 100000, 4.5D, amt)
def taxOceanCityCF (amt: Long) = tax(5.0D, 100000, 3.0D, amt)
def taxHometownCF (amt: Long) = tax(5.0D, 100000, 1.5D, amt)
Дублирование видно сразу - передаются одинаковые аргументы сразу в нескольких местах. К тому же этот код не очень хорошо читаем, сразу и не понятно, что к чему относится. А теперь добавим карри. Общая функция вычисления налогов станет выглядеть так:
def tax = (rateA: Double) => (limit: Long) =>
(rateB: Double) => (amt: Long) =>
pct (rateA, amt) + pct (rateB, limit min amt)
Первые 2 функции вычисления налогов примут вид:
def taxTF = tax( 2.0D)(0)(0.0D)
def taxTC = tax( 0.0D)(150000)(6.0D)
Здесь мы уже отделили мух от котлет - константы передаются в общую функцию, которая вернет нам функцию с одним аргументом. Вроде бы не особо на первый взгляд и необходимая вещь, однако это позволяет писать более структурированный код, где функции будут более специализированы. С остальными тремя все еще интереснее - там первые 2 аргумента дублируются, т.к. для штата процентные ставки и суммы одинаковы. Опрделим функцию налогообложения на уровне штата:
def taxCF = tax(5.0D)(100000)
Теперь черз нее можно выразить города:
def taxGothamCF = taxCF(4.5D)
def taxOceanCityCF = taxCF(3.5D)
def taxHomeTownCF = taxCF(1.0D)
Для города Gotham налог будет таким:
scala> taxGothamCF(9999)
res0: Long = 950
Дублирования нет, каждая функция делает только то, что от нее требуется. Использовать можно например так - определим функцию отчетности:
def report(taxf: (Long => Long), amts: List[Long]) = {
println("Tax on " + amts + " is " + taxf((amts :\ 0L)(_ + _)))
}
val items = List[Long](20000, 40000, 60000, 80000)
scala> report(taxHomeTownCF, items)
Tax on List(20000, 40000, 60000, 80000) is 11000
Что это даёт? В краткосрочной перспективе вобщем-то особенно ничего, но если нужно обеспечить гибкую функциональность, когда требования меняются часто, и нужно быстро и легко вносить изменения в код - то этот приём будет однозначно полезен. Кстати, налогообложение - как раз такая предметная область. Ставки и формулы там меняются весьма часто.
четверг, 25 февраля 2010 г.
Еще о Scala
Краткость - сестра таланта. А программист - ленивое существо :) За что мне понравилась Scala - так это за краткость. Вот если посмотреть на примере - надо посчитать норму вектора. Для тех, кто уже забыл, что это такое - корень из суммы квадратов всех его координат. Пускай вектор у нас представлен списком, каждый элемент которого - соответствующая координата. Ниже 2 реализации - на Java и на Scala:
Java
List<Double> vector = new ArrayList<Double>();
vector.add(-1.0);
vector.add(2.0);
vector.add(3.0);
Double norm = 0.0;
for (Double coord : vector) {
norm+=coord*coord;
}
norm = Math.pow(norm, 0.5);
Scala
val v = -1.0::2.0::3.0::Nil
val norm = Math.sqrt((0.0 /: v)((x, y) => x + y * y))
Разница в обьёмах набранных буков очевидна :) А результат один - корень из 14.
среда, 24 февраля 2010 г.
Россия - Канада: матч века
"Все ждали, что в этой дуэли будет разыграна золотая медаль. Но признайте – так еще лучше. Почему? Дело даже не в ставке в игре. А в цене поражения. Победитель этого матча не будет награжден золотом, но и проигравший не получит серебро, - пишет в своем блоге Франсуа Ганьон, журналист канадской газеты La Presse. - Два лучших игрока мира покажут в этом матче все, на что способны. Но, боюсь, у Кросби не окажется таких хороших помощников, как у Овечкина. Если русские опять используют тройку Семин – Малкин - Овечкин, играть против них будет трудно любому канадскому звену".
"Канада не выигрывала у России на зимних Олимпийских играх 50 лет: эта победная засуха тянется с 1960 года, - напоминает читателям Дэмиэн Кокс из Toronto Star. – Восемь матчей между Россией и Канадой – восемь канадских поражений. Так что никакого давления, джентльмены. Расслабьтесь и дышите глубже".
"Когда до конца победного матча Канады против Германии оставалось три минуты, зрители на трибунах начали петь: "Мы хотим Россию! Мы хотим Россию!" Будьте осторожны. Они тоже хотят этой встречи, - пишет Иан Макинтайр в издании The Vancouver Sun. - Сегодняшний грандиозный матч между Канадой и Россией, Сидни Кросби и Александром Овечкиным, между нами и ими, способен показать поколению, не заставшему Суперсерию 1972 года и старый турнир, называемый Кубком мира, что такое величайшее противостояние в истории хоккея".
Подписаться на:
Сообщения (Atom)


