<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;C08DQ3Y7eip7ImA9WhRVF0Q.&quot;"><id>tag:blogger.com,1999:blog-7093676993132865793</id><updated>2012-01-17T11:17:52.802+02:00</updated><category term="cooking" /><category term="logging" /><category term="solr" /><category term="thesis" /><category term="rmi" /><category term="podcast" /><category term="jazz" /><category term="tools" /><category term="Sting" /><category term="encoding" /><category term="perl" /><category term="competition" /><category term="dblp" /><category term="wsdl" /><category term="conference" /><category term="syntax" /><category term="paradigm shift" /><category term="feature request" /><category term="chrome" /><category term="software development" /><category term="c#" /><category term="creativity" /><category term="it" /><category term="firefox" /><category term="phd" /><category term="MT" /><category term="spam" /><category term="giza++" /><category term="video" /><category term="finnish" /><category term="CPS'09" /><category term="physics" /><category term="semantics" /><category term="eclipse" /><category term="nerdcamp" /><category term="c++" /><category term="travelling" /><category term="friends" /><category term="xml" /><category term="hackday" /><category term="visualization" /><category term="math" /><category term="NLP" /><category term="scala" /><category term="java" /><category term="cygwin" /><category term="students" /><category term="programming" /><category term="jsp" /><category term="com" /><category term="xslt" /><category term="oop" /><category term="morphoanalysis" /><category term="b2b" /><category term="ideas" /><category term="pizza" /><category term="Google" /><category term="FLAR" /><category term="gui" /><category term="vb" /><category term="regex" /><category term="machine translation" /><category term="cgi" /><category term="wisdom" /><category term="search" /><category term="human brain" /><category term="IR" /><category term="image processing" /><category term="gmail" /><category term="university" /><title>Finland transmits, that...</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://dmitrykan.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://dmitrykan.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>D_K</name><uri>http://www.blogger.com/profile/18154816739397439235</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>104</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/blogspot/vKAZT" /><feedburner:info uri="blogspot/vkazt" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;C08GSXk-eyp7ImA9WhRVF0Q.&quot;"><id>tag:blogger.com,1999:blog-7093676993132865793.post-9135914801233858889</id><published>2012-01-16T18:44:00.000+02:00</published><updated>2012-01-17T11:17:08.753+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-17T11:17:08.753+02:00</app:edited><title>My experience with airBaltic</title><content type="html">UPD: Please read the entire post. I will not remove the story line written originally, because this is exactly what has happened. However airBaltic contacted me on the phone themselves and told about positive resolution of the case. Please read on.&lt;br /&gt;
&lt;br /&gt;
Original story:&lt;br /&gt;
-----&lt;br /&gt;
First of all, I would like to assure you that I'm not the best at blaming, meaning I simply don't like doing it publicly. It's probably unfair to only publicly blame an air operator and never praise them. But that's how it works. A happy customer doesn't compile an entire blog post about how cool it was to fly with a certain operator. "If I'm happy, I stay silent" principle. But believe me, if the case I'll tell you here about would resolve positively, I wouldn't hesitate to blog about it. &lt;br /&gt;
&lt;br /&gt;
Here is the case. We planned a 3 days trip to Moscow from Helsinki and back together with my wife. Using skyscanner we've found the cheapest option: fly with airBaltic via Riga. Quick friend survey, all's good, settled. I went online and started my ticket search last Saturday. The cheapest option was to depart on 16:25. Chosen that, prepared to pay. After double-checking dates and times it struck me: nope, no good, departure set to 8:25. Cancelled search, started all over. First question here: is it bad luck or bad system? You choose.&lt;br /&gt;
Re-ran my search, all is good, paid 531 euros. But when I printed the travel receipt, this time it REALLY struck me: the return flight date was set to one month later! Another bad luck or system fault? This time I'm inclined to choose the second option. No problems, calling to the Finnish office. "On the weekends office is closed". I decided to call first thing next Monday morning. This is my first mistake and I admit it: should have called to Latvia and pay some euro and a half a minute to change the date.&lt;br /&gt;
&lt;br /&gt;
Calling first thing Monday morning: young lady's voice, I described her the problem. She refused to change the date without an additional fee. I have asked her to connect me to her manager. After a couple of minutes (yeah-yeah, customer is on the first place), manager's voice: teaching and preaching me how I should have used their system. "On every page of multi-page ticket booking process, you can look on your right and check the departure and return flight dates and times." All right, thanks! But look, attempted I to explain the system fault: "Unless you really travel back in one month,there is no way to choose that different month without extra movements. No does the system suggest you the best return flights from in a month period!" This was simply noise for her and she continued teaching me how to use the system. I asked her to give me her manager / director. Guess what was the answer: "This is not possible". "Why?". "I'm sorry, but this is not possible." Being a customer, I'm pretty sure, I can talk to almost any worker of the company, who stays in the customer relations line. This time it is your fault, airBaltic.&lt;br /&gt;
&lt;br /&gt;
"I would like to change the return flight date back to what it should be". But the lady tought me another time: "This is only possible if you pay 150 euros. You should have called us on Saturday and explained the problem." Which I did! And the Finnish office was closed. Is this really my problem now? I doubt it. Because, it is YOUR REPRESENTATIVE, airBaltic! What if I wouldn't have an opportunity to call abroad (yes, Riga is abroad to me) and pay for an international call? And if it didn't work, make sure to take my call on Monday morning seriously, attend to it and make an exception or a good men deal. What on Earth does this rule "if you called after two days, it cannot be changed without a fee" policy mean? Do you want to keep a customer or loose it? What do you loose by changing the month standing away date? Afraid not to find any cusomer during an entire month?&lt;br /&gt;
&lt;br /&gt;
"And if I cancel the entire trip, what sum can be refunded?" "You get 76 euros back". Excellent.&lt;br /&gt;
&lt;br /&gt;
Without further ramblings, I would like to publicly thank airBaltic for 531 euros worth "stay at home and don't travel with us" service. It has really taught me not to use your services. Ever.&lt;br /&gt;
Everything seems to be mortal in this wolrd, and airBaltic's serivce will die as well. But by making this type of "friendly" customer service and policies you only bring the end faster.&lt;br /&gt;
&lt;br /&gt;
Good luck and enjoy 531-76 euros for not taking us where we wanted.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
UPDATE to the story: airBaltic continues working on the case, here is what they posted on twitter: @DmitryKan Dmitry, your case is not closed. Please give us a bit more time and colleagues will come back to you.&lt;br /&gt;
&lt;br /&gt;
UPDATE 2: The case has been resolved. I have received a call from airBaltic, where they said that the return flight date was changed without an extra fee. I don't know was it a result of my social media activity since yesterday evening, but airBaltic service was extremely fast and accurate this time. Since all the posts I have done on the Internet about airBaltic link here, the landed people will read these updates as well. Thank you, airBaltic.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7093676993132865793-9135914801233858889?l=dmitrykan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8OFFlHwhnoSUo36AAgti_gk-b8I/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8OFFlHwhnoSUo36AAgti_gk-b8I/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8OFFlHwhnoSUo36AAgti_gk-b8I/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8OFFlHwhnoSUo36AAgti_gk-b8I/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vKAZT/~4/QUKfuk0eoQw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dmitrykan.blogspot.com/feeds/9135914801233858889/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7093676993132865793&amp;postID=9135914801233858889" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/9135914801233858889?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/9135914801233858889?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vKAZT/~3/QUKfuk0eoQw/my-experience-with-airbaltic.html" title="My experience with airBaltic" /><author><name>D_K</name><uri>http://www.blogger.com/profile/18154816739397439235</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>5</thr:total><feedburner:origLink>http://dmitrykan.blogspot.com/2012/01/my-experience-with-airbaltic.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0EDQXg4cCp7ImA9WhRTGE4.&quot;"><id>tag:blogger.com,1999:blog-7093676993132865793.post-8426354601402402928</id><published>2011-11-09T12:15:00.000+02:00</published><updated>2011-11-09T13:54:30.638+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-09T13:54:30.638+02:00</app:edited><title>axis2: serialization and deserialization of wsdl2java generated objects</title><content type="html">Using axis2's wsdl2java tool and a third-party wsdl I have generated service stub and supporting classes (data holders). Since there was a need to do post-processing of loaded data from a service, there was a need to serialize one of the data holder objects.&lt;br /&gt;
&lt;br /&gt;
Questions that I had and posted on &lt;a href="http://stackoverflow.com/questions/8061712/axis2-serialization-of-wsdl2java-generated-objects"&gt;stackoverflow.com&lt;/a&gt; were:&lt;br /&gt;
&lt;br /&gt;
1) is there a standard axis2 tool / approach that can be used for the purpose?&lt;br /&gt;
&lt;br /&gt;
2) since the data holder class does not implement Serializable interface what would be the easiest way of serializing the object into xml format with the ability to restore the original object?&lt;br /&gt;
&lt;br /&gt;
Data binding option was used (-d jaxbri) and each field of the class in question is annotated with @XmlElement tag, e.g.:&lt;br /&gt;
&lt;br /&gt;
@XmlElement(name = "ID", required = true)&lt;br /&gt;
protected String id;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here is how I solved it:&lt;br /&gt;
&lt;br /&gt;
1. axis2 generated java classes set (client side) had an object called ObjectFactory. Majority of its methods create JAXBElement objects with values of fields of the class holder&lt;br /&gt;
2. I had to implement a serializable wrapper class ASerializable for the class holder, such that it uses the ObjectFactory to create the JAXBElement objects for all the fields.&lt;br /&gt;
3. some external code uses the wrapper class to create an serializable object and writes it to the output stream.&lt;br /&gt;
4. on the receiving end:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="java"&gt;ASerializable aSerializable;
        A a;
        aSerializable= (ASerializable)in.readObject();
        a.setID((String)aSerializable.getID().getValue());
&lt;/pre&gt;&lt;br /&gt;
It still looks like extra work for the pre-annotated class serialization, but better than serializing into some text format and manual type checking during deserialization.&lt;br /&gt;
Some good intro into serialization with java can be found &lt;a href="http://java.sun.com/developer/technicalArticles/Programming/serialization/"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7093676993132865793-8426354601402402928?l=dmitrykan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/QvuyPr4l0YKsBIbeDY23wiov9oI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QvuyPr4l0YKsBIbeDY23wiov9oI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/QvuyPr4l0YKsBIbeDY23wiov9oI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QvuyPr4l0YKsBIbeDY23wiov9oI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vKAZT/~4/OcE_xDFLfCo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dmitrykan.blogspot.com/feeds/8426354601402402928/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7093676993132865793&amp;postID=8426354601402402928" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/8426354601402402928?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/8426354601402402928?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vKAZT/~3/OcE_xDFLfCo/axis2-serialization-and-deserialization.html" title="axis2: serialization and deserialization of wsdl2java generated objects" /><author><name>D_K</name><uri>http://www.blogger.com/profile/18154816739397439235</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://dmitrykan.blogspot.com/2011/11/axis2-serialization-and-deserialization.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIGQHszeCp7ImA9WhdaEko.&quot;"><id>tag:blogger.com,1999:blog-7093676993132865793.post-4350406795817109018</id><published>2011-10-01T18:21:00.003+03:00</published><updated>2011-10-22T11:52:01.580+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-22T11:52:01.580+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="dblp" /><category scheme="http://www.blogger.com/atom/ns#" term="conference" /><title>First international publication</title><content type="html">&lt;h2&gt;Celebration!&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;Had my first international publication shown on the &lt;a href="http://www.informatik.uni-trier.de/~ley/db/indices/a-tree/k/Kan:Dmitry.html"&gt;DBLP&lt;/a&gt;. Somehow it was something I wanted to achieve as an intermediate goal in the academic career. In a way this gives some visibility to what I have been doing for around 4 years. I mean NLP (Natural Language Processing) and Machine Translation more precisely. Before going international, I've had 5 publications in the Russian scientific journals and conferences.&lt;br /&gt;&lt;br /&gt;On the same ICSOFT'11 conference where this publication has been presented in a form of poster, I had an honor to serve as knowledge-based systems track chair. Both presenting my work and leading the session were exciting. I wanted also to say thanks to the ICSOFT's organizing committee for giving me the participant's grant, that made my participation possible. Special thanks to Sergio Brissos.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;ICSOFT 2011 Conference&lt;/h2&gt;&lt;br /&gt;ICSOFT is strictly not an NLP conference. However, it has a knowledge-based track, where rather relevant NLP related topics are listed:&lt;br /&gt;&lt;br /&gt;Ontology Engineering&lt;br /&gt;Decision Support Systems&lt;br /&gt;Intelligent Problem Solving&lt;br /&gt;Expert Systems&lt;br /&gt;Reasoning Techniques&lt;br /&gt;Knowledge Acquisition&lt;br /&gt;Knowledge Mining&lt;br /&gt;Machine Learning&lt;br /&gt;Natural Language Processing&lt;br /&gt;Human-Machine Cooperation&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Two publications I remembered&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;From these, ontology engineering articles were strong. One of them (Barbara Furletti, Franco Turini: Mining Influence Rules out of Ontologies, see &lt;a href="http://www.informatik.uni-trier.de/~ley/db/conf/icsoft/icsoft2011-2.html"&gt;here&lt;/a&gt;) was about mining ontology and reasoning rules from the oldest Italian bank's data. This sounds exceptional to me, when some (even old) commercial data is given away to researchers.&lt;br /&gt;&lt;br /&gt;Another, non-directly related to NLP, article I remembered was by Manolya Kavakli et al (Manolya Kavakli, Tarashankar Rudra, Manning Li: An Embodied Conversational Agent for Counselling Aborigines - Mr. Warnanggal.), where one of the challenges is providing health assistance to the Australlian aborigines via a computer based system, not very motivated people, poor, stealing food and other things. Another challenge is dealing with about 500 languages, that these aborigines speak. Here is a potential for interesting NLP problems.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Why would I recommend going to a conference not directly related to your research topic?&lt;/h2&gt;&lt;br /&gt;As a pre-word, I should mention, that in a way whatever we do in the NLP is materialized in the form of programming code. Therefore our work qualifies to a software engineering conference as well as to an NLP one.&lt;br /&gt;&lt;br /&gt;Going to a strictly SW conference can give you the following benefits:&lt;br /&gt;* concrete questions of you work in the light of software development practices. Some NLP researchers may think it is not very important to make their SW configurable, re-usable or performant. In the end of the day, this matters a lot, especially if you plan to implement you work into industrial level solution&lt;br /&gt;&lt;br /&gt;* if you do a poster presentation, people can give you good insights into the quality of your poster and what can be improved. There were two extreme cases on the conference: one with the entire article text being pasted into the poster and another one with a couple of boxes and an arrow between them. The audience has reacted in an expected way: the first poster did not draw almost any attention, while the second had gathered the majority of the audience.&lt;br /&gt;&lt;br /&gt;* you can pause and reflect a little bit: are you doing something valuable? Do you like what you do?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A couple of words about Spain, where ICSOFT'11 happened. +45 is something I have experienced for the first time; visiting royal palace Alcázar of Seville was extremely interesting and of course partying with conference peers over Spanish wine and tapas made the event memorable.&lt;br /&gt;&lt;br /&gt;Enjoy you research life and publish your work as soon as possible.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7093676993132865793-4350406795817109018?l=dmitrykan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/uR-i73sHhQmMwibkOSNyqpLVvc0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uR-i73sHhQmMwibkOSNyqpLVvc0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/uR-i73sHhQmMwibkOSNyqpLVvc0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uR-i73sHhQmMwibkOSNyqpLVvc0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vKAZT/~4/3r8n966RjaY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dmitrykan.blogspot.com/feeds/4350406795817109018/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7093676993132865793&amp;postID=4350406795817109018" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/4350406795817109018?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/4350406795817109018?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vKAZT/~3/3r8n966RjaY/first-international-publication.html" title="First international publication" /><author><name>D_K</name><uri>http://www.blogger.com/profile/18154816739397439235</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://dmitrykan.blogspot.com/2011/10/first-international-publication.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0AGQX85eyp7ImA9WhdXFEg.&quot;"><id>tag:blogger.com,1999:blog-7093676993132865793.post-157013368172357495</id><published>2011-08-27T14:18:00.017+03:00</published><updated>2011-08-27T18:42:00.123+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-27T18:42:00.123+03:00</app:edited><title>Оценка системы машинного перевода</title><content type="html">Есть система машинного перевода с русского на английский.
&lt;br /&gt;Нужно сделать &lt;span style="font-style:italic;"&gt;&lt;span style="font-weight:bold;"&gt;ручную оценку&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&lt;/span&gt;&lt;/span&gt; работы системы.
&lt;br /&gt;
&lt;br /&gt;Целевая аудитория: все, кто хочет сделать машинные переводчики лучше (примеры: translate.google.com, translate.ru) и люди, интересующиеся прикладной лингвистикой (Natural Language Processing). &lt;span style="font-style:italic;"&gt;Умение программировать&lt;/span&gt; &lt;span style="font-weight:bold;"&gt;НЕ&lt;/span&gt; &lt;span style="font-style:italic;"&gt;требуется&lt;/span&gt;.
&lt;br /&gt;
&lt;br /&gt;Связь: dmitry.kan[+AT+]gmail.com, twitter: DmitryKan
&lt;br /&gt;
&lt;br /&gt;Задача: получить у меня пакет предложений (объём: сколько возьмётесь). 
&lt;br /&gt;
&lt;br /&gt;В пакете: предложения на русском языке и их переводы экспертом на английский язык.
&lt;br /&gt;
&lt;br /&gt;Прогнать предложения на русском через систему. Просмотреть вручную их переводы на английский язык.
&lt;br /&gt;
&lt;br /&gt;Составить список слов, которые не были найдены (это просто: не найденные слова будут выведены на русском). Послать мне список слов, я добавлю их в систему машинного перевода.
&lt;br /&gt;
&lt;br /&gt;На выходе от вас три группы предложений из пакета:
&lt;br /&gt;1. хорошо перевелись
&lt;br /&gt;2. приемлемо перевелись (понятно по английской фразе, что было в русской)
&lt;br /&gt;3. плохо перевелись (непонятно по английской фразе, что было в русской)
&lt;br /&gt;
&lt;br /&gt;Работа волонтёрская. Начальный бонус: статья со мной в соавторстве на конференции либо в журнале, если вам это интересно. Если нет -- всяческий пиар вам.
&lt;br /&gt;
&lt;br /&gt;Дальше: если сработаемся, предложу Вам работу в лингвистических проектах (умение программировать обязательно).
&lt;br /&gt;
&lt;br /&gt;Ссылки для интересующихся
&lt;br /&gt;[1] &lt;a href="http://www.slideshare.net/dmitrykan/icsoft-2011-51cr"&gt;http://www.slideshare.net/dmitrykan/icsoft-2011-51cr&lt;/a&gt;
&lt;br /&gt;[2] &lt;a href="http://www.slideshare.net/dmitrykan/automatic-build-of-semantic-translational-dictionary"&gt;http://www.slideshare.net/dmitrykan/automatic-build-of-semantic-translational-dictionary&lt;/a&gt;
&lt;br /&gt;[3] &lt;a href="http://ufal.mff.cuni.cz/umc/"&gt;http://ufal.mff.cuni.cz/umc/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7093676993132865793-157013368172357495?l=dmitrykan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/uLg9FouLWKgP-sdJFHQQXcvDv44/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uLg9FouLWKgP-sdJFHQQXcvDv44/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/uLg9FouLWKgP-sdJFHQQXcvDv44/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uLg9FouLWKgP-sdJFHQQXcvDv44/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vKAZT/~4/Pne3KuMm2XU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dmitrykan.blogspot.com/feeds/157013368172357495/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7093676993132865793&amp;postID=157013368172357495" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/157013368172357495?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/157013368172357495?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vKAZT/~3/Pne3KuMm2XU/blog-post.html" title="Оценка системы машинного перевода" /><author><name>D_K</name><uri>http://www.blogger.com/profile/18154816739397439235</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://dmitrykan.blogspot.com/2011/08/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0AFRXs-fSp7ImA9WhdXFE4.&quot;"><id>tag:blogger.com,1999:blog-7093676993132865793.post-218421544070831372</id><published>2011-08-27T11:57:00.003+03:00</published><updated>2011-08-27T12:01:54.555+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-27T12:01:54.555+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="students" /><category scheme="http://www.blogger.com/atom/ns#" term="machine translation" /><title>interested in rule based machine translation (rbmt)? / Интересуетесь машинным переводом на правилах?</title><content type="html">I'm looking for students and activists of rule-based machine translation to help me in the evaluation of my machine translation system from Russian into English. Details in the e-mail: dmitry.kan[+AT+]gmail.com (substitute characters from [ fro ] with @).
&lt;br /&gt;
&lt;br /&gt;Я ищу студентов и активистов машинного перевода на правилах для оценки моей системы машинного перевода с русского на английский. Детали по почте: dmitry.kan[+AT+]gmail.com (замените символы с [ по ] знаком @).
&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7093676993132865793-218421544070831372?l=dmitrykan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Nt0vs6tJz9SZFn134wRvY0RBJ1M/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Nt0vs6tJz9SZFn134wRvY0RBJ1M/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Nt0vs6tJz9SZFn134wRvY0RBJ1M/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Nt0vs6tJz9SZFn134wRvY0RBJ1M/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vKAZT/~4/2c9TwJh1Kr8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dmitrykan.blogspot.com/feeds/218421544070831372/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7093676993132865793&amp;postID=218421544070831372" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/218421544070831372?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/218421544070831372?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vKAZT/~3/2c9TwJh1Kr8/interested-in-rule-based-machine.html" title="interested in rule based machine translation (rbmt)? / Интересуетесь машинным переводом на правилах?" /><author><name>D_K</name><uri>http://www.blogger.com/profile/18154816739397439235</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://dmitrykan.blogspot.com/2011/08/interested-in-rule-based-machine.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkENR3c9eip7ImA9WhdTFk8.&quot;"><id>tag:blogger.com,1999:blog-7093676993132865793.post-4066752618686358989</id><published>2011-07-14T10:21:00.003+03:00</published><updated>2011-07-14T10:31:36.962+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-14T10:31:36.962+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="conference" /><category scheme="http://www.blogger.com/atom/ns#" term="machine translation" /><category scheme="http://www.blogger.com/atom/ns#" term="semantics" /><title>Interested in machine translation between Russian and English?</title><content type="html">Then mark August 15-19 2011 in your calendars. &lt;a href="http://romip.ru/edbt-russir2011/"&gt;Web of Data'11&lt;/a&gt; has accepted my poster on machine translation with semantic features, the full paper title is:&lt;br /&gt;&lt;br /&gt;Semantic Feature Machine Translation System for Information Retrieval&lt;br /&gt;&lt;br /&gt;Some details on the work from another poster, accepted to &lt;a href="http://icsoft.org"&gt;ICSOFT'11&lt;/a&gt; can be checked here:&lt;br /&gt;&lt;br /&gt;&lt;div style="width:477px" id="__ss_8580232"&gt; &lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/dmitrykan/poster-method-for-an-automatic-generation-of-a-semantic" title="Poster: Method for an automatic generation of a semantic-level contextual translational dictionary" target="_blank"&gt;Poster: Method for an automatic generation of a semantic-level contextual translational dictionary&lt;/a&gt;&lt;/strong&gt; &lt;iframe src="http://www.slideshare.net/slideshow/embed_code/8580232" width="477" height="510" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"&gt;&lt;/iframe&gt; &lt;div style="padding:5px 0 12px"&gt; View more documents from &lt;a href="http://www.slideshare.net/dmitrykan" target="_blank"&gt;Dmitry Kan&lt;/a&gt; &lt;/div&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7093676993132865793-4066752618686358989?l=dmitrykan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/J5oZS2Leq6H_qcR9t2bPLm7npw4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/J5oZS2Leq6H_qcR9t2bPLm7npw4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/J5oZS2Leq6H_qcR9t2bPLm7npw4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/J5oZS2Leq6H_qcR9t2bPLm7npw4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vKAZT/~4/jP708n4MYd4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dmitrykan.blogspot.com/feeds/4066752618686358989/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7093676993132865793&amp;postID=4066752618686358989" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/4066752618686358989?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/4066752618686358989?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vKAZT/~3/jP708n4MYd4/interested-in-machine-translation.html" title="Interested in machine translation between Russian and English?" /><author><name>D_K</name><uri>http://www.blogger.com/profile/18154816739397439235</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://dmitrykan.blogspot.com/2011/07/interested-in-machine-translation.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcCQXs_eyp7ImA9WhdTE08.&quot;"><id>tag:blogger.com,1999:blog-7093676993132865793.post-200274808069499504</id><published>2011-07-10T21:33:00.002+03:00</published><updated>2011-07-10T21:37:40.543+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-10T21:37:40.543+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="morphoanalysis" /><category scheme="http://www.blogger.com/atom/ns#" term="c#" /><category scheme="http://www.blogger.com/atom/ns#" term="com" /><title>Пример кода, интегрирующего AOT морфологический лемматайзер в C#</title><content type="html">АОТ предлагает свой лемматайзер для русского и английского языка на сайте www.aot.ru. Если Вам нужно интегрировать их COM внутри проекта на C#, читайте ниже.&lt;br /&gt;&lt;br /&gt;После установки библиотеки при помощи Setup.exe, загрузите Lemmatizer.dll в C# проект. Скопируйте следующий метод или его тело, например, в main-class:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="c#"&gt;&lt;br /&gt;private static void initAOTMorphoanalyzer()&lt;br /&gt;{&lt;br /&gt; LEMMATIZERLib.ILemmatizer lemmatizerRu = new LEMMATIZERLib.LemmatizerRussian();&lt;br /&gt; lemmatizerRu.LoadDictionariesRegistry();&lt;br /&gt; LEMMATIZERLib.IParadigmCollection piParadigmCollection = lemmatizerRu.CreateParadigmCollectionFromForm("мыла", 0, 0);&lt;br /&gt;&lt;br /&gt; Console.Out.WriteLine(piParadigmCollection.Count);       &lt;br /&gt;&lt;br /&gt;    for (int j=0; j &lt; piParadigmCollection.Count; j++)&lt;br /&gt;    {&lt;br /&gt;     object[] args = { j };     &lt;br /&gt;&lt;br /&gt;     Type paradigmCollectionType = piParadigmCollection.GetType();&lt;br /&gt;&lt;br /&gt;     if (paradigmCollectionType != null)&lt;br /&gt;     {&lt;br /&gt;      object Item = paradigmCollectionType.InvokeMember("Item", BindingFlags.GetProperty, null, piParadigmCollection, args);&lt;br /&gt;      Type itemType = Item.GetType();&lt;br /&gt;      if (itemType != null)&lt;br /&gt;      {&lt;br /&gt;       object Norm = itemType.InvokeMember("Norm", BindingFlags.GetProperty, null, Item, null);&lt;br /&gt;       Console.Out.WriteLine(Norm);&lt;br /&gt;      }&lt;br /&gt;      else&lt;br /&gt;       Console.Out.WriteLine("itemType is null");&lt;br /&gt;     }&lt;br /&gt;     else&lt;br /&gt;      Console.Out.WriteLine("paradigmCollectionType is null");&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Результат:&lt;br /&gt;2&lt;br /&gt;МЫЛО&lt;br /&gt;МЫТЬ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7093676993132865793-200274808069499504?l=dmitrykan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/A7LYsEEJU_naey0u5ARjmRpXlpg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/A7LYsEEJU_naey0u5ARjmRpXlpg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/A7LYsEEJU_naey0u5ARjmRpXlpg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/A7LYsEEJU_naey0u5ARjmRpXlpg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vKAZT/~4/4AIbkezjzq4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dmitrykan.blogspot.com/feeds/200274808069499504/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7093676993132865793&amp;postID=200274808069499504" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/200274808069499504?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/200274808069499504?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vKAZT/~3/4AIbkezjzq4/aot-c.html" title="Пример кода, интегрирующего AOT морфологический лемматайзер в C#" /><author><name>D_K</name><uri>http://www.blogger.com/profile/18154816739397439235</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://dmitrykan.blogspot.com/2011/07/aot-c.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcBQXg6fip7ImA9WhdTE08.&quot;"><id>tag:blogger.com,1999:blog-7093676993132865793.post-2134010980114891420</id><published>2011-07-10T21:22:00.005+03:00</published><updated>2011-07-10T21:37:30.616+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-10T21:37:30.616+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="morphoanalysis" /><category scheme="http://www.blogger.com/atom/ns#" term="c#" /><category scheme="http://www.blogger.com/atom/ns#" term="com" /><title>COM test example for C#: AOT lemmatizer</title><content type="html">I will post this both in English and Russian for more people's benefit.&lt;br /&gt;&lt;br /&gt;There is a Russian / English lemmatizer from AOT (www.aot.ru). If you need to use the COM that AOT provides inside C#, read on. Load the lemmatizer.dll inside your C# project. Insert the following method or its body inside your code, for example main class:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="c#"&gt;&lt;br /&gt;private static void initAOTMorphoanalyzer()&lt;br /&gt;{&lt;br /&gt; LEMMATIZERLib.ILemmatizer lemmatizerRu = new LEMMATIZERLib.LemmatizerRussian();&lt;br /&gt; lemmatizerRu.LoadDictionariesRegistry();&lt;br /&gt; LEMMATIZERLib.IParadigmCollection piParadigmCollection = lemmatizerRu.CreateParadigmCollectionFromForm("мыла", 0, 0);&lt;br /&gt;&lt;br /&gt; Console.Out.WriteLine(piParadigmCollection.Count);       &lt;br /&gt;&lt;br /&gt;    for (int j=0; j &lt; piParadigmCollection.Count; j++)&lt;br /&gt;    {&lt;br /&gt;     object[] args = { j };     &lt;br /&gt;&lt;br /&gt;     Type paradigmCollectionType = piParadigmCollection.GetType();&lt;br /&gt;&lt;br /&gt;     if (paradigmCollectionType != null)&lt;br /&gt;     {&lt;br /&gt;      object Item = paradigmCollectionType.InvokeMember("Item", BindingFlags.GetProperty, null, piParadigmCollection, args);&lt;br /&gt;      Type itemType = Item.GetType();&lt;br /&gt;      if (itemType != null)&lt;br /&gt;      {&lt;br /&gt;       object Norm = itemType.InvokeMember("Norm", BindingFlags.GetProperty, null, Item, null);&lt;br /&gt;       Console.Out.WriteLine(Norm);&lt;br /&gt;      }&lt;br /&gt;      else&lt;br /&gt;       Console.Out.WriteLine("itemType is null");&lt;br /&gt;     }&lt;br /&gt;     else&lt;br /&gt;      Console.Out.WriteLine("paradigmCollectionType is null");&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Output:&lt;br /&gt;2&lt;br /&gt;МЫЛО&lt;br /&gt;МЫТЬ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7093676993132865793-2134010980114891420?l=dmitrykan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/J1FIsfX2HTsuM1-uxE0zaFFu_4A/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/J1FIsfX2HTsuM1-uxE0zaFFu_4A/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/J1FIsfX2HTsuM1-uxE0zaFFu_4A/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/J1FIsfX2HTsuM1-uxE0zaFFu_4A/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vKAZT/~4/JE7Y2SVRFcw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dmitrykan.blogspot.com/feeds/2134010980114891420/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7093676993132865793&amp;postID=2134010980114891420" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/2134010980114891420?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/2134010980114891420?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vKAZT/~3/JE7Y2SVRFcw/com-test-example-for-c-aot-lemmatizer.html" title="COM test example for C#: AOT lemmatizer" /><author><name>D_K</name><uri>http://www.blogger.com/profile/18154816739397439235</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://dmitrykan.blogspot.com/2011/07/com-test-example-for-c-aot-lemmatizer.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MMRn46eip7ImA9WhZUFUg.&quot;"><id>tag:blogger.com,1999:blog-7093676993132865793.post-7987888367915651298</id><published>2011-06-08T21:53:00.003+03:00</published><updated>2011-06-08T21:58:07.012+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-08T21:58:07.012+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="scala" /><title>Amazed by Scala #1: objects and compilation</title><content type="html">7 minutes and here is an object, that can be compiled into java classes:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;import scala.actors._&lt;br /&gt;import Actor._&lt;br /&gt;&lt;br /&gt;object TopStock {&lt;br /&gt; val symbols = List( "AAPL", "GOOG", "IBM", "MSFT")&lt;br /&gt; val receiver = self&lt;br /&gt; val year = 2008&lt;br /&gt; &lt;br /&gt;  def main(args: Array[String]) = {&lt;br /&gt; symbols.foreach { symbol =&gt;&lt;br /&gt;   actor { receiver ! getYearEndClosing(symbol, year) }&lt;br /&gt; }&lt;br /&gt;  &lt;br /&gt; val (topStock, highestPrice) = getTopStock(symbols.length)&lt;br /&gt; printf("Top stock of %d is %s closing at price %f\n", year, topStock, highestPrice)&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt; def getYearEndClosing(symbol : String, year : Int) = {&lt;br /&gt;   val url = "http://ichart.finance.yahoo.com/table.csv?s="+ &lt;br /&gt;   symbol + "&amp;a=11&amp;b=01&amp;c=" + year + "&amp;d=11&amp;e=31&amp;f=" + year+&lt;br /&gt;             "&amp;g=m"&lt;br /&gt;   &lt;br /&gt;   val data = io.Source.fromURL(url).mkString&lt;br /&gt;   val price = data.split("\n")(1).split(",")(4).toDouble&lt;br /&gt;   (symbol, price)&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; def getTopStock(count : Int) : (String, Double) = {&lt;br /&gt;   (1 to count).foldLeft("", 0.0) { (previousHigh, index) =&gt;&lt;br /&gt;  receiveWithin(10000) {&lt;br /&gt;    case (symbol : String, price : Double) =&gt;&lt;br /&gt;   if (price &gt; previousHigh._2) (symbol, price) else previousHigh&lt;br /&gt;  }&lt;br /&gt;   }&lt;br /&gt; }  &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Saved in TopStock.scala. Compiled with&lt;br /&gt;&lt;br /&gt;&gt; scalac TopStock.scala&lt;br /&gt;&lt;br /&gt;ran with&lt;br /&gt;&lt;br /&gt;&gt; scala TopStock&lt;br /&gt;&lt;br /&gt;Top stock of 2008 is GOOG closing at price 307,650000&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7093676993132865793-7987888367915651298?l=dmitrykan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Xe6J2sDoScRgmoGT_EgGiKY8ia4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Xe6J2sDoScRgmoGT_EgGiKY8ia4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Xe6J2sDoScRgmoGT_EgGiKY8ia4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Xe6J2sDoScRgmoGT_EgGiKY8ia4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vKAZT/~4/CLpKK8L9JDk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dmitrykan.blogspot.com/feeds/7987888367915651298/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7093676993132865793&amp;postID=7987888367915651298" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/7987888367915651298?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/7987888367915651298?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vKAZT/~3/CLpKK8L9JDk/amazed-by-scala-1-objects-and.html" title="Amazed by Scala #1: objects and compilation" /><author><name>D_K</name><uri>http://www.blogger.com/profile/18154816739397439235</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://dmitrykan.blogspot.com/2011/06/amazed-by-scala-1-objects-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IFQn4zcCp7ImA9WhZUFUg.&quot;"><id>tag:blogger.com,1999:blog-7093676993132865793.post-3496640103349795921</id><published>2011-06-08T20:21:00.010+03:00</published><updated>2011-06-08T21:58:33.088+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-08T21:58:33.088+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="scala" /><title>Amazed by Scala</title><content type="html">Top stock of 2008 is GOOG closing at price 307,650000 among (AAPL, GOOG, IBM, MSFT). Amazed by simplicity, clarity and beauty of the following code in Scala from &lt;a href="http://www.amazon.com/Programming-Scala-Multi-Core-Complexity-Programmers/dp/193435631X"&gt;this book&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;import scala.actors._&lt;br /&gt;import Actor._&lt;br /&gt;&lt;br /&gt;val symbols = List( "AAPL", "GOOG", "IBM", "MSFT")&lt;br /&gt;val receiver = self&lt;br /&gt;val year = 2008&lt;br /&gt;&lt;br /&gt;symbols.foreach { symbol =&gt;&lt;br /&gt;  actor { receiver ! getYearEndClosing(symbol, year) }&lt;br /&gt;}&lt;br /&gt;  &lt;br /&gt;val (topStock, highestPrice) = getTopStock(symbols.length)&lt;br /&gt;&lt;br /&gt;printf("Top stock of %d is %s closing at price %f\n", year,&lt;br /&gt;           topStock, highestPrice)&lt;br /&gt;&lt;br /&gt;def getYearEndClosing(symbol : String, year : Int) = {&lt;br /&gt; val url = "http://ichart.finance.yahoo.com/table.csv?s="+ &lt;br /&gt; symbol + "&amp;a=11&amp;b=01&amp;c=" + year + "&amp;d=11&amp;e=31&amp;f=" + year+&lt;br /&gt;       "&amp;g=m"&lt;br /&gt;  &lt;br /&gt; val data = io.Source.fromURL(url).mkString&lt;br /&gt; val price = data.split("\n")(1).split(",")(4).toDouble&lt;br /&gt; (symbol, price)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;def getTopStock(count : Int) : (String, Double) = {&lt;br /&gt; (1 to count).foldLeft("", 0.0) { (previousHigh, index) =&gt;&lt;br /&gt;    receiveWithin(10000) {&lt;br /&gt;  case (symbol : String, price : Double) =&gt;&lt;br /&gt;    if (price &gt; previousHigh._2) (symbol, price) else&lt;br /&gt;             previousHigh&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7093676993132865793-3496640103349795921?l=dmitrykan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/zpdv8PmGSwy0JXI2CjIolaB2VJ8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zpdv8PmGSwy0JXI2CjIolaB2VJ8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/zpdv8PmGSwy0JXI2CjIolaB2VJ8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zpdv8PmGSwy0JXI2CjIolaB2VJ8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vKAZT/~4/JvoP62cyyvw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dmitrykan.blogspot.com/feeds/3496640103349795921/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7093676993132865793&amp;postID=3496640103349795921" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/3496640103349795921?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/3496640103349795921?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vKAZT/~3/JvoP62cyyvw/amazed-by-scala.html" title="Amazed by Scala" /><author><name>D_K</name><uri>http://www.blogger.com/profile/18154816739397439235</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://dmitrykan.blogspot.com/2011/06/amazed-by-scala.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QCQ3w6fSp7ImA9WhZVE00.&quot;"><id>tag:blogger.com,1999:blog-7093676993132865793.post-4234993336256614856</id><published>2011-05-25T08:25:00.003+03:00</published><updated>2011-05-25T08:29:22.215+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-25T08:29:22.215+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><title>StackOverflow</title><content type="html">Do you know the famous resource &lt;a href="http://stackoverflow.com"&gt;http://stackoverflow.com&lt;/a&gt; by Joel Spolsky and team? Here is my own definition of stackoverflow in Java:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;private static void log(String logStatement) {&lt;br /&gt;   log(logStatement);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7093676993132865793-4234993336256614856?l=dmitrykan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/M1znCycib8uqgFvS1tT485OFSJ8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/M1znCycib8uqgFvS1tT485OFSJ8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/M1znCycib8uqgFvS1tT485OFSJ8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/M1znCycib8uqgFvS1tT485OFSJ8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vKAZT/~4/jpjGHES4dX8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dmitrykan.blogspot.com/feeds/4234993336256614856/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7093676993132865793&amp;postID=4234993336256614856" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/4234993336256614856?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/4234993336256614856?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vKAZT/~3/jpjGHES4dX8/stackoverflow.html" title="StackOverflow" /><author><name>D_K</name><uri>http://www.blogger.com/profile/18154816739397439235</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://dmitrykan.blogspot.com/2011/05/stackoverflow.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcMQXs5fSp7ImA9WhZXE08.&quot;"><id>tag:blogger.com,1999:blog-7093676993132865793.post-536578862398484695</id><published>2011-05-02T10:56:00.001+03:00</published><updated>2011-05-02T10:58:00.525+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-02T10:58:00.525+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="xml" /><category scheme="http://www.blogger.com/atom/ns#" term="chrome" /><title>XML in Chrome</title><content type="html">Tired of (manual) XML rendering in Google Chrome?&lt;br /&gt;Try this:&lt;br /&gt;&lt;a href="https://chrome.google.com/extensions/detail/gbammbheopgpmaagmckhpjbfgdfkpadb?hl=en#"&gt;XML Tree&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7093676993132865793-536578862398484695?l=dmitrykan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2qFE7AfdXaUm7qfpJDifqcJz0J8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2qFE7AfdXaUm7qfpJDifqcJz0J8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/2qFE7AfdXaUm7qfpJDifqcJz0J8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2qFE7AfdXaUm7qfpJDifqcJz0J8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vKAZT/~4/kJkaCou8Rn8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dmitrykan.blogspot.com/feeds/536578862398484695/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7093676993132865793&amp;postID=536578862398484695" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/536578862398484695?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/536578862398484695?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vKAZT/~3/kJkaCou8Rn8/xml-in-chrome.html" title="XML in Chrome" /><author><name>D_K</name><uri>http://www.blogger.com/profile/18154816739397439235</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://dmitrykan.blogspot.com/2011/05/xml-in-chrome.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UMQnY_eyp7ImA9WhZQF0s.&quot;"><id>tag:blogger.com,1999:blog-7093676993132865793.post-7759197573699439648</id><published>2011-04-25T22:54:00.001+03:00</published><updated>2011-04-25T22:54:43.843+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-25T22:54:43.843+03:00</app:edited><title>NoSQL, Apache SOLR and Apache Hadoop</title><content type="html">Check out this SlideShare Presentation -- talk for NёrdCamp April 23, 2011: &lt;div style="width:425px" id="__ss_7714510"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/dmitrykan/nosql-apache-solr-and-apache-hadoop" title="NoSQL, Apache SOLR and Apache Hadoop"&gt;NoSQL, Apache SOLR and Apache Hadoop&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse7714510" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=apachesolrapachehadoopdmitrykan-110423092537-phpapp02&amp;stripped_title=nosql-apache-solr-and-apache-hadoop&amp;userName=dmitrykan" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse7714510" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=apachesolrapachehadoopdmitrykan-110423092537-phpapp02&amp;stripped_title=nosql-apache-solr-and-apache-hadoop&amp;userName=dmitrykan" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/dmitrykan"&gt;Dmitry Kan&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7093676993132865793-7759197573699439648?l=dmitrykan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/y_vikMjB-Oy7T_IpUKo0Q8AEvM0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/y_vikMjB-Oy7T_IpUKo0Q8AEvM0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/y_vikMjB-Oy7T_IpUKo0Q8AEvM0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/y_vikMjB-Oy7T_IpUKo0Q8AEvM0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vKAZT/~4/jzbaZ8rWuEU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dmitrykan.blogspot.com/feeds/7759197573699439648/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7093676993132865793&amp;postID=7759197573699439648" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/7759197573699439648?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/7759197573699439648?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vKAZT/~3/jzbaZ8rWuEU/nosql-apache-solr-and-apache-hadoop.html" title="NoSQL, Apache SOLR and Apache Hadoop" /><author><name>D_K</name><uri>http://www.blogger.com/profile/18154816739397439235</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://dmitrykan.blogspot.com/2011/04/nosql-apache-solr-and-apache-hadoop.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIHQn4_fCp7ImA9WhZQEk4.&quot;"><id>tag:blogger.com,1999:blog-7093676993132865793.post-4258297437709325134</id><published>2011-04-19T20:04:00.004+03:00</published><updated>2011-04-19T20:18:53.044+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-19T20:18:53.044+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="creativity" /><category scheme="http://www.blogger.com/atom/ns#" term="nerdcamp" /><title>NerdCamp</title><content type="html">&lt;a href="https://sites.google.com/site/itindustryintro/schedule/neerdcamp"&gt;NerdCamp&lt;/a&gt; is coming and I'm going to present on Apache technologies, specifically on Apache Solr and a bit on Apache Hadoop. If you are into all this and like creative thinking, want to create a start-up and will come around Saint-Petersburg this weekend, you should definitely come to NerdCamp!&lt;br /&gt;&lt;br /&gt;Confirmed Key Participants&lt;br /&gt;&lt;br /&gt;    Yury Lifshits, Sergey Poduzov, Alexander Shtuchkin,&lt;br /&gt;    Vladimir Gorovoy, Nikolay Vyahhi, Vladimir Aluferov, Yakov Sirotkin and myself&lt;br /&gt;&lt;br /&gt;The &lt;a href="https://docs.google.com/present/view?id=ddc4z9f6_147gxk9nf54"&gt;preliminary program&lt;/a&gt; has juicy topics among which are:&lt;br /&gt;How the Web will Transform Education by Yury Lifshits,&lt;br /&gt;Geo Information Systems Around Us by Aleksander Klechikov,&lt;br /&gt;Software Development for little ones by Yakov Sirotkin,&lt;br /&gt;Introducing NoSQL: Apache SOLR and Hadoop by Dmitry Kan,&lt;br /&gt;Introducing Cloud Services by Dmitry Petrov,&lt;br /&gt;Nature of Enterpreneurship Craft, Lifestyle or Science by Alexey Baranov,&lt;br /&gt;How to grow places for smart people -- workshop &lt;br /&gt;&lt;br /&gt;and &lt;a href="https://sites.google.com/site/itindustryintro/schedule/neerdcamp/co-located"&gt;more&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7093676993132865793-4258297437709325134?l=dmitrykan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/bnPFRi2TENJfh8T_iTY4UhYoego/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bnPFRi2TENJfh8T_iTY4UhYoego/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/bnPFRi2TENJfh8T_iTY4UhYoego/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bnPFRi2TENJfh8T_iTY4UhYoego/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vKAZT/~4/8jMRaxK9_AE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dmitrykan.blogspot.com/feeds/4258297437709325134/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7093676993132865793&amp;postID=4258297437709325134" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/4258297437709325134?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/4258297437709325134?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vKAZT/~3/8jMRaxK9_AE/nerdcamp.html" title="NerdCamp" /><author><name>D_K</name><uri>http://www.blogger.com/profile/18154816739397439235</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://dmitrykan.blogspot.com/2011/04/nerdcamp.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YDRHk_fip7ImA9WhZSEEo.&quot;"><id>tag:blogger.com,1999:blog-7093676993132865793.post-8445510092457920182</id><published>2011-03-25T20:52:00.000+02:00</published><updated>2011-03-25T20:52:55.746+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-25T20:52:55.746+02:00</app:edited><title>Angry Birds -pelaaja: DK</title><content type="html">&lt;a href="http://angrybirds.nokia.fi/profiili/dk?sms_ss=blogger&amp;amp;at_xt=4d8ce458735b26d4%2C0"&gt;Angry Birds -pelaaja: DK&lt;/a&gt;: "DK on kertakaikkisen kyllästynyt sikailuun! Seuraa hänen edesottamuksiaan Angry Birdsin SM-kisoissa ja tule itsekin mukaan."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7093676993132865793-8445510092457920182?l=dmitrykan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/FhsaFfMPl-G7CND_Z9QvOdbGbYM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FhsaFfMPl-G7CND_Z9QvOdbGbYM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/FhsaFfMPl-G7CND_Z9QvOdbGbYM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FhsaFfMPl-G7CND_Z9QvOdbGbYM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vKAZT/~4/H3YURf413s0" height="1" width="1"/&gt;</content><link rel="related" href="http://angrybirds.nokia.fi/profiili/dk?sms_ss=blogger&amp;at_xt=4d8ce458735b26d4%2C0" title="Angry Birds -pelaaja: DK" /><link rel="replies" type="application/atom+xml" href="http://dmitrykan.blogspot.com/feeds/8445510092457920182/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7093676993132865793&amp;postID=8445510092457920182" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/8445510092457920182?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/8445510092457920182?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vKAZT/~3/H3YURf413s0/angry-birds-pelaaja-dk.html" title="Angry Birds -pelaaja: DK" /><author><name>D_K</name><uri>http://www.blogger.com/profile/18154816739397439235</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://dmitrykan.blogspot.com/2011/03/angry-birds-pelaaja-dk.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEIHR389eyp7ImA9WhZTF00.&quot;"><id>tag:blogger.com,1999:blog-7093676993132865793.post-5047321768636450164</id><published>2011-03-21T11:48:00.004+02:00</published><updated>2011-03-21T12:15:36.163+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-21T12:15:36.163+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="solr" /><title>concert of components?</title><content type="html">"ZooKeeper: Because coordinating distributed systems is a Zoo"&lt;br /&gt;&lt;br /&gt;This post is short and not useful in that it doesn't give you any code snippets or technical recommendations. I would like just to cite the SolrCloud's &lt;a href="http://wiki.apache.org/solr/SolrCloud"&gt;wiki&lt;/a&gt;. The SolrCloud is "the set of Solr features that take Solr's distributed search to the next level, enabling and simplifying the creation and use of Solr clusters." They use &lt;a href="http://hadoop.apache.org/zookeeper/"&gt;Apache ZooKeeper&lt;/a&gt; project (a subproject of &lt;a href="http://hadoop.apache.org/"&gt;Hadoop&lt;/a&gt;) as a distributed system of keeping cluster of SOLRs state updates. In a distributed system every component can potentially crash, yet the system is expected to provide it's service to its users. If a single SOLR crashes, its replica will take over, but if ZooKeeper crashes, the system will still continue serving the user requests, but no updates of the system are visible to the system (sounds interesting, I know). To improve that, this is what is possible:&lt;br /&gt;&lt;br /&gt;"Running multiple zookeeper servers in concert (a zookeeper ensemble) allows for high availability of the zookeeper service. Every zookeeper server needs to know about every other zookeeper server in the ensemble, and a majority of servers are needed to provide service. For example, a zookeeper ensemble of 3 servers allows any one to fail with the remaining 2 constituting a majority to continue providing service. 5 zookeeper servers are needed to allow for the failure of up to 2 servers at a time."&lt;br /&gt;&lt;br /&gt;So, if you have a big zoo with variety of animals in it, make sure you have 5 zoo keepers for at least 3 of them take care of your pigs and elephants, when 2 others got stuck somewhere else.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7093676993132865793-5047321768636450164?l=dmitrykan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/9_ARxIVW5EWMwgjFRzlEpe0AlGI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9_ARxIVW5EWMwgjFRzlEpe0AlGI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/9_ARxIVW5EWMwgjFRzlEpe0AlGI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9_ARxIVW5EWMwgjFRzlEpe0AlGI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vKAZT/~4/LCg-M3iBglI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dmitrykan.blogspot.com/feeds/5047321768636450164/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7093676993132865793&amp;postID=5047321768636450164" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/5047321768636450164?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/5047321768636450164?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vKAZT/~3/LCg-M3iBglI/concert-of-components.html" title="concert of components?" /><author><name>D_K</name><uri>http://www.blogger.com/profile/18154816739397439235</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://dmitrykan.blogspot.com/2011/03/concert-of-components.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4CSXo5cCp7ImA9Wx9UEE8.&quot;"><id>tag:blogger.com,1999:blog-7093676993132865793.post-7780257650471491966</id><published>2011-01-29T14:34:00.011+02:00</published><updated>2011-02-06T23:32:48.428+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-06T23:32:48.428+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="solr" /><category scheme="http://www.blogger.com/atom/ns#" term="logging" /><title>SOLR: speed up batch posting</title><content type="html">If you are familiar with the &lt;a href="http://lucene.apache.org/solr/"&gt;Apache SOLR&lt;/a&gt; and deal with index worth of millions documents, it becomes quite important to be able to (re-)index fast. There are &lt;a href="http://www.elevatedcode.com/articles/2009/01/14/speeding-up-solr-indexing/"&gt;various techniques&lt;/a&gt; as to what to tweak for the indexing go faster. Another simple way to speed up your (batch) indexing without changing your SOLR schema is to modify logging.&lt;br /&gt;&lt;br /&gt;Apparently, when deployed under Tomcat, SOLR logs each and every update request during POSTing process. Experience shows, that heavy http operation is done faster, when logging is minimal.&lt;br /&gt;&lt;br /&gt;SOLR (as of 1.4 at least) has &lt;a href="http://wiki.apache.org/solr/SolrAdminGUI"&gt;admin GUI&lt;/a&gt; which serves as a central information hub for the given SOLR core. Among other useful features, it has a page where one can set up logging levels of different SOLR components. In default SOLR installation you can access the page via http://localhost:8983/solr/admin/logging. By default, the logging levels amount mainly to INFO, which permits logging of all the select/update requests (imagine 1 million of such log entries for batch reindexing).&lt;br /&gt;&lt;br /&gt;It would be handy to be able to automatically change the logging levels to, say, WARNING before batch POSTing and back to INFO after that. solr/admin/logging is declared as servlet in web.xml of the corresponding SOLR core:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;  &lt;servlet&gt;&lt;br /&gt;    &lt;servlet-name&gt;Logging&lt;/servlet-name&gt;&lt;br /&gt;    &lt;servlet-class&gt;org.apache.solr.servlet.LogLevelSelection&lt;/servlet-class&gt;&lt;br /&gt;  &lt;/servlet&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;All the components which allow changing their logging levels are listed on the page http://localhost:8983/solr/admin/logging. Using curl we can send a post request to the servlet and set the desired levels. It is reasonable to implement a function, which takes logging level and url of SOLR core as parameters (choose your own favourite language, this is done in Perl):&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="perl"&gt;&lt;br /&gt;sub setSolrLogLevel&lt;br /&gt;{&lt;br /&gt; my ($url, $level) = @_;&lt;br /&gt;&lt;br /&gt;    print "setting logging level to $level\n";&lt;br /&gt;    my $res = system("curl --user user:pass -d \"submit=set&amp;root=$level&amp;fi=$level" .&lt;br /&gt;"&amp;fi.alphasense=$level&amp;fi.alphasense.solr=$level&amp;fi.alphasense.solr.query=$level" .&lt;br /&gt;"&amp;fi.alphasense.solr.query.AlphaSenseQParserPlugin=$level&amp;httpclient=$level&amp;httpclient.wire=$level&amp;httpclient.wire.content=$level&amp;httpclient.wire.header=$level&amp;javax=$level&amp;javax.management=$level&amp;javax.management.mbeanserver=$level&amp;org=$level&amp;org.apache=$level&amp;org.apache.catalina=$level&amp;org.apache.catalina.core=$level&amp;org.apache.catalina.core.ContainerBase=$level&amp;org.apache.catalina.core.ContainerBase.%5BCatalina%5D=$level&amp;org.apache.catalina.core.ContainerBase.%5BCatalina%5D.%5Blocalhost%5D=$level&amp;org.apache.catalina.core.ContainerBase.%5BCatalina%5D.%5Blocalhost%5D.%5B%2Fsolrtopic%5D=$level&amp;org.apache.catalina.core.ContainerBase.%5BCatalina%5D.%5Blocalhost%5D.%5B%2Fsolrtopic%5D.%5BLogging%5D=$level&amp;org.apache.catalina.core.ContainerBase.%5BCatalina%5D.%5Blocalhost%5D.%5B%2Fsolrtopic%5D.%5BSolrServer%5D=$level&amp;org.apache.catalina.core.ContainerBase.%5BCatalina%5D.%5Blocalhost%5D.%5B%2Fsolrtopic%5D.%5BSolrUpdate%5D=$level&amp;org.apache.catalina.core.ContainerBase.%5BCatalina%5D.%5Blocalhost%5D.%5B%2Fsolrtopic%5D.%5Bdefault%5D=$level&amp;org.apache.catalina.core.ContainerBase.%5BCatalina%5D.%5Blocalhost%5D.%5B%2Fsolrtopic%5D.%5Bjsp%5D=$level&amp;org.apache.catalina.core.ContainerBase.%5BCatalina%5D.%5Blocalhost%5D.%5B%2Fsolrtopic%5D.%5Bping%5D=$level&amp;org.apache.catalina.session=$level&amp;org.apache.catalina.session.ManagerBase=$level&amp;org.apache.commons=$level&amp;org.apache.commons.digester=$level&amp;org.apache.commons.digester.Digester=$level&amp;org.apache.commons.digester.Digester.sax=$level&amp;org.apache.commons.httpclient=$level&amp;org.apache.commons.httpclient.ChunkedInputStream=$level&amp;org.apache.commons.httpclient.HeaderElement=$level&amp;org.apache.commons.httpclient.HttpClient=$level&amp;org.apache.commons.httpclient.HttpConnection=$level&amp;org.apache.commons.httpclient.HttpMethodBase=$level&amp;org.apache.commons.httpclient.HttpMethodDirector=$level&amp;org.apache.commons.httpclient.HttpParser=$level&amp;org.apache.commons.httpclient.HttpState=$level&amp;org.apache.commons.httpclient.MultiThreadedHttpConnectionManager=$level&amp;org.apache.commons.httpclient.SimpleHttpConnectionManager=$level&amp;org.apache.commons.httpclient.auth=$level&amp;org.apache.commons.httpclient.auth.AuthChallengeProcessor=$level&amp;org.apache.commons.httpclient.cookie=$level&amp;org.apache.commons.httpclient.cookie.CookiePolicy=$level&amp;org.apache.commons.httpclient.cookie.CookieSpec=$level&amp;org.apache.commons.httpclient.methods=$level&amp;org.apache.commons.httpclient.methods.EntityEnclosingMethod=$level&amp;org.apache.commons.httpclient.methods.ExpectContinueMethod=$level&amp;org.apache.commons.httpclient.methods.PostMethod=$level&amp;org.apache.commons.httpclient.params=$level&amp;org.apache.commons.httpclient.params.DefaultHttpParams=$level&amp;org.apache.commons.httpclient.params.HttpMethodParams=$level&amp;org.apache.commons.httpclient.util=$level&amp;org.apache.commons.httpclient.util.EncodingUtil=$level&amp;org.apache.commons.httpclient.util.ExceptionUtil=$level&amp;org.apache.commons.httpclient.util.IdleConnectionHandler=$level&amp;org.apache.jasper=$level&amp;org.apache.jasper.EmbeddedServletOptions=$level&amp;org.apache.jasper.JspCompilationContext=$level&amp;org.apache.jasper.compiler=$level&amp;org.apache.jasper.compiler.Compiler=$level&amp;org.apache.jasper.compiler.JspConfig=$level&amp;org.apache.jasper.compiler.JspRuntimeContext=$level&amp;org.apache.jasper.compiler.TldLocationsCache=$level&amp;org.apache.jasper.servlet=$level&amp;org.apache.jasper.servlet.JspServlet=$level&amp;org.apache.jasper.servlet.JspServletWrapper=$level&amp;org.apache.solr=$level&amp;org.apache.solr.analysis=$level&amp;org.apache.solr.analysis.BaseTokenFilterFactory=$level&amp;org.apache.solr.analysis.BaseTokenizerFactory=$level&amp;org.apache.solr.client=$level&amp;org.apache.solr.client.solrj=$level&amp;org.apache.solr.client.solrj.impl=$level&amp;org.apache.solr.client.solrj.impl.CommonsHttpSolrServer=$level&amp;org.apache.solr.common=$level&amp;org.apache.solr.common.util=$level&amp;org.apache.solr.common.util.ConcurrentLRUCache=$level&amp;org.apache.solr.core=$level&amp;org.apache.solr.core.Config=$level&amp;org.apache.solr.core.CoreContainer=$level&amp;org.apache.solr.core.JmxMonitoredMap=$level&amp;org.apache.solr.core.RequestHandlers=$level&amp;org.apache.solr.core.SolrConfig=$level&amp;org.apache.solr.core.SolrCore=$level&amp;org.apache.solr.core.SolrResourceLoader=$level&amp;org.apache.solr.handler=$level&amp;org.apache.solr.handler.AnalysisRequestHandler=$level&amp;org.apache.solr.handler.XmlUpdateRequestHandler=$level&amp;org.apache.solr.handler.admin=$level&amp;org.apache.solr.handler.admin.LukeRequestHandler=$level&amp;org.apache.solr.handler.admin.SystemInfoHandler=$level&amp;org.apache.solr.handler.component=$level&amp;org.apache.solr.handler.component.QueryElevationComponent=$level&amp;org.apache.solr.handler.component.SearchHandler=$level&amp;org.apache.solr.handler.component.SpellCheckComponent=$level&amp;org.apache.solr.highlight=$level&amp;org.apache.solr.highlight.SolrHighlighter=$level&amp;org.apache.solr.request=$level&amp;org.apache.solr.request.BinaryResponseWriter=$level&amp;org.apache.solr.request.XSLTResponseWriter=$level&amp;org.apache.solr.schema=$level&amp;org.apache.solr.schema.FieldType=$level&amp;org.apache.solr.schema.IndexSchema=$level&amp;org.apache.solr.search=$level&amp;org.apache.solr.search.SolrIndexSearcher=$level&amp;org.apache.solr.servlet=$level&amp;org.apache.solr.servlet.LogLevelSelection=$level&amp;org.apache.solr.servlet.SolrDispatchFilter=$level&amp;org.apache.solr.servlet.SolrRequestParsers=$level&amp;org.apache.solr.servlet.SolrServlet=$level&amp;org.apache.solr.servlet.SolrUpdateServlet=$level&amp;org.apache.solr.spelling=$level&amp;org.apache.solr.spelling.AbstractLuceneSpellChecker=$level&amp;org.apache.solr.spelling.FileBasedSpellChecker=$level&amp;org.apache.solr.spelling.IndexBasedSpellChecker=$level&amp;org.apache.solr.update=$level&amp;org.apache.solr.update.SolrIndexConfig=$level&amp;org.apache.solr.update.UpdateHandler=$level&amp;org.apache.solr.util=$level&amp;org.apache.solr.util.SolrPluginUtils=$level&amp;org.apache.solr.util.plugin=$level&amp;org.apache.solr.util.plugin.AbstractPluginLoader=$level\" $url");&lt;br /&gt;    print "Result code:$res\n";&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;There you go. Call setSolrLogLevel("http://localhost:8983/solr/admin/logging", "WARNING"); before the batch POSTing and setSolrLogLevel("http://localhost:8983/solr/admin/logging", "INFO"); after the batch POSTing has finished.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7093676993132865793-7780257650471491966?l=dmitrykan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/7FLvgLg0WXqns1-R8Af8vxe_k5I/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7FLvgLg0WXqns1-R8Af8vxe_k5I/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/7FLvgLg0WXqns1-R8Af8vxe_k5I/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7FLvgLg0WXqns1-R8Af8vxe_k5I/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vKAZT/~4/N6puzWqBXDI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dmitrykan.blogspot.com/feeds/7780257650471491966/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7093676993132865793&amp;postID=7780257650471491966" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/7780257650471491966?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/7780257650471491966?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vKAZT/~3/N6puzWqBXDI/solr-speed-up-batch-posting.html" title="SOLR: speed up batch posting" /><author><name>D_K</name><uri>http://www.blogger.com/profile/18154816739397439235</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://dmitrykan.blogspot.com/2011/01/solr-speed-up-batch-posting.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QMSXw9eSp7ImA9Wx9TEUo.&quot;"><id>tag:blogger.com,1999:blog-7093676993132865793.post-263022403167422678</id><published>2010-11-19T15:54:00.004+02:00</published><updated>2010-11-19T16:03:08.261+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-19T16:03:08.261+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="oop" /><title>"OOPness" in Java</title><content type="html">Optimisation in my code has led me to a code refactoring, where several methods with return values became one. Since I could not use "pass by reference" feature for all my parameters (primitives and objects as collections) I had to come up with an inner class for holding all return parameters.&lt;br /&gt;&lt;br /&gt;So by not supporting "pass by reference" feature Java makes your code even more OOP-ish. Even though the topic can be well known, &lt;a href="http://www.yoda.arachsys.com/java/passing.html"&gt;this&lt;/a&gt; article helps to put things together and make a memory refresh.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7093676993132865793-263022403167422678?l=dmitrykan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/1rEHTVTpJGCs7r1m95l5XV-wEJ8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1rEHTVTpJGCs7r1m95l5XV-wEJ8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/1rEHTVTpJGCs7r1m95l5XV-wEJ8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1rEHTVTpJGCs7r1m95l5XV-wEJ8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vKAZT/~4/_K4a1VhDM4Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dmitrykan.blogspot.com/feeds/263022403167422678/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7093676993132865793&amp;postID=263022403167422678" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/263022403167422678?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/263022403167422678?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vKAZT/~3/_K4a1VhDM4Y/oopness-in-java.html" title="&quot;OOPness&quot; in Java" /><author><name>D_K</name><uri>http://www.blogger.com/profile/18154816739397439235</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://dmitrykan.blogspot.com/2010/11/oopness-in-java.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkAAQ3s-cSp7ImA9WhZaGEo.&quot;"><id>tag:blogger.com,1999:blog-7093676993132865793.post-4788559307559255322</id><published>2010-11-03T14:27:00.004+02:00</published><updated>2011-07-05T17:05:42.559+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-05T17:05:42.559+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="regex" /><title>Successive replacement in regular expressions (java)</title><content type="html">Actually not sure, how often people out there do the successive replacement in a target text having a regular expression pattern, but Java has rather neat solution for it. I'm publishing it here, because I know, that esp. younger developers can re-invent a wheel here and have longer debugging sessions.&lt;br /&gt;&lt;br /&gt;So the task is like this: you have a text T, like "cat-1 dog-1 cat-1 elephant-1 cat-2 dog-2 cat-3".&lt;br /&gt;Suppose we want to change numerals attached to the words "cat" to their word representations: "1" to "one", "2" to "two".&lt;br /&gt;&lt;br /&gt;One straightforward way would be to match all "cat-([0-9])+" subsequences and then run replace operation on T.&lt;br /&gt;&lt;br /&gt;So the code would look something like this:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;String T = "cat-1 dog-1 cat-1 elephant-1 cat-2 dog-2 cat-3";&lt;br /&gt;Pattern catPattern = Pattern.compile("cat-([0-9]+)");&lt;br /&gt;Matcher catMatcher = catPattern.matcher(T);&lt;br /&gt;Map numToWord = new HashMap();&lt;br /&gt;numToWord.add("1", "one");&lt;br /&gt;numToWord.add("2", "two");&lt;br /&gt;numToWord.add("3", "three"); // ...&lt;br /&gt;while (catMatcher.find())&lt;br /&gt;{&lt;br /&gt;    T = T.replaceFirst(catMatcher.group(1), numToWord.get(catMatcher.group(1)));&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This code produces:&lt;br /&gt;&lt;br /&gt;cat-one dog-one cat-1 elephant-1 cat-two dog-2 cat-three&lt;br /&gt;&lt;br /&gt;Which is missing one substitution. Ok, let's use replaceAll instead and make sure we touch only cats:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;{&lt;br /&gt;    T = T.replaceAll("cat-" + catMatcher.group(1), "cat-" + numToWord.get(catMatcher.group(1)));&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;which produces what we want:&lt;br /&gt;&lt;br /&gt;cat-one dog-1 cat-one elephant-1 cat-two dog-2 cat-three&lt;br /&gt;&lt;br /&gt;But now what happens inside the loop is logically out of sync with the loop condition: we iterate over matches, but call replaceAll (probably not efficient either, as replaceAll will be attempted even when not needed anymore, for duplicate matches).&lt;br /&gt;&lt;br /&gt;Any more elegant and correct solution?&lt;br /&gt;&lt;br /&gt;Yes! It is called Matcher.appendReplacement&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;  Pattern catPattern = Pattern.compile("cat-([0-9]+)");&lt;br /&gt;  Matcher catMatcher = catPattern.matcher(T);&lt;br /&gt;  Map&lt;String, String&gt; numToWord = new HashMap&lt;String, String&gt;();&lt;br /&gt;  numToWord.put("1", "one");&lt;br /&gt;  numToWord.put("2", "two");&lt;br /&gt;  numToWord.put("3", "three"); // ...&lt;br /&gt;  &lt;br /&gt;  StringBuffer sb = new StringBuffer();&lt;br /&gt;  &lt;br /&gt;  while (catMatcher.find())&lt;br /&gt;  {&lt;br /&gt;   System.out.println("Match:" + catMatcher.group(1));&lt;br /&gt;   catMatcher.appendReplacement(sb, "cat-" + numToWord.get(catMatcher.group(1)));&lt;br /&gt;  }&lt;br /&gt;  catMatcher.appendTail(sb);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;now sb.toString() contains:&lt;br /&gt;&lt;br /&gt;cat-one dog-1 cat-one elephant-1 cat-two dog-2 cat-three&lt;br /&gt;&lt;br /&gt;If you append System.out.println(sb.toString()); inside the while loop, you will also see, that replacements happen in sync with the while loop's state, so that what is inside the loop and what while loops over are in sync.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7093676993132865793-4788559307559255322?l=dmitrykan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZuAAeW0xXs3mCnhX0ObMZVUaEsQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZuAAeW0xXs3mCnhX0ObMZVUaEsQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ZuAAeW0xXs3mCnhX0ObMZVUaEsQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZuAAeW0xXs3mCnhX0ObMZVUaEsQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vKAZT/~4/UrmZQD8oy9w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dmitrykan.blogspot.com/feeds/4788559307559255322/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7093676993132865793&amp;postID=4788559307559255322" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/4788559307559255322?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/4788559307559255322?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vKAZT/~3/UrmZQD8oy9w/successive-replacement-in-regular.html" title="Successive replacement in regular expressions (java)" /><author><name>D_K</name><uri>http://www.blogger.com/profile/18154816739397439235</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://dmitrykan.blogspot.com/2010/11/successive-replacement-in-regular.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUYGQX87eCp7ImA9Wx5RFE0.&quot;"><id>tag:blogger.com,1999:blog-7093676993132865793.post-8257903250648015615</id><published>2010-08-21T15:43:00.006+03:00</published><updated>2010-08-21T18:05:20.100+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-21T18:05:20.100+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="rmi" /><category scheme="http://www.blogger.com/atom/ns#" term="b2b" /><category scheme="http://www.blogger.com/atom/ns#" term="wsdl" /><title>B2B: what is WSDL (simple explanation)</title><content type="html">Just for those wondering around what is WSDL file or technology in the area of Business 2 Business (when companies speak to each other automatically over the network): you can think of it as a declaration of the client-server conversation. In this case one B (server) provides some functionality (like taking square roots of big numbers) and another B (client) has a lot of these numbers and needs square roots of them.&lt;br /&gt;&lt;br /&gt;So the server declares a method (which is in fact a &lt;span style="font-style:italic;"&gt;remote method&lt;/span&gt;):&lt;br /&gt;&lt;br /&gt;Double squareRoot(Double number)&lt;br /&gt;&lt;br /&gt;in its WSDL file. The client side then takes this file and generates the client side code, which handles the protocol of communication and remote method invocation automatically. What client needs is simply to implement a business logic around this invocation, like a web page with a text field for the number or the entire hardware with touch screen display.&lt;br /&gt;&lt;br /&gt;In general the input and return types of remote methods can be simple and complex -- in fact as complex and "proprietary" as you need, because the entire WSDL file is nothing but xml as well as the messages being sent over the network.&lt;br /&gt;&lt;br /&gt;One of the libraries used in the industry is &lt;a href="http://ws.apache.org/axis/"&gt;Axis&lt;/a&gt; and &lt;a href="http://ws.apache.org/axis2/"&gt;Axis2&lt;/a&gt;. Using the library you can generate the java code from wsdl for you client (and even generate wsdl from your java code for you server).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7093676993132865793-8257903250648015615?l=dmitrykan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/cmcLikpO9AHAELNVolCfjJ_7SV4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cmcLikpO9AHAELNVolCfjJ_7SV4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/cmcLikpO9AHAELNVolCfjJ_7SV4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cmcLikpO9AHAELNVolCfjJ_7SV4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vKAZT/~4/yWt0gzyssmg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dmitrykan.blogspot.com/feeds/8257903250648015615/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7093676993132865793&amp;postID=8257903250648015615" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/8257903250648015615?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/8257903250648015615?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vKAZT/~3/yWt0gzyssmg/b2b-what-is-wsdl-simple-explanation.html" title="B2B: what is WSDL (simple explanation)" /><author><name>D_K</name><uri>http://www.blogger.com/profile/18154816739397439235</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://dmitrykan.blogspot.com/2010/08/b2b-what-is-wsdl-simple-explanation.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UCRXc8cSp7ImA9Wx5REEk.&quot;"><id>tag:blogger.com,1999:blog-7093676993132865793.post-1151485475382036510</id><published>2010-08-17T15:38:00.004+03:00</published><updated>2010-08-17T15:47:44.979+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-17T15:47:44.979+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="regex" /><title>Zero-witdth negative lookahead group: example</title><content type="html">Suppose you have to split a comma separated string in java where meaningful parts are separated by continious spaces, say from 2 to infinity. But the problem is that sometimes a meaningfull part (like a person name) contains 2 spaces. You want to exclude such cases and retain the name's parts together. Example:&lt;br /&gt;&lt;br /&gt;name1[one_space]surname1[two_spaces]age&lt;br /&gt;surname2[two_spaces]surname2[two_spaces]age&lt;br /&gt;&lt;br /&gt;In this example it is easy to solve the problem with zero-width negative lookahead group (?!\\w), because age is always supposed to be numeric. So the final code will be something like this:&lt;br /&gt;&lt;br /&gt;String s = current_string.split("\\s{2}(?!\\w)");&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7093676993132865793-1151485475382036510?l=dmitrykan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/UOYniCq58h-a8NTWzpPQMtlu08s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UOYniCq58h-a8NTWzpPQMtlu08s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/UOYniCq58h-a8NTWzpPQMtlu08s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UOYniCq58h-a8NTWzpPQMtlu08s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vKAZT/~4/MUXb3JlSzSE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dmitrykan.blogspot.com/feeds/1151485475382036510/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7093676993132865793&amp;postID=1151485475382036510" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/1151485475382036510?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/1151485475382036510?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vKAZT/~3/MUXb3JlSzSE/zero-witdth-negative-lookahead-group.html" title="Zero-witdth negative lookahead group: example" /><author><name>D_K</name><uri>http://www.blogger.com/profile/18154816739397439235</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://dmitrykan.blogspot.com/2010/08/zero-witdth-negative-lookahead-group.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkANQX0ycSp7ImA9WxFUGUU.&quot;"><id>tag:blogger.com,1999:blog-7093676993132865793.post-467960989765781056</id><published>2010-07-01T11:40:00.004+03:00</published><updated>2010-07-01T13:39:50.399+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-01T13:39:50.399+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="travelling" /><title>Парижские впечатления</title><content type="html">Вернулся из второй поездки в Париж. Вот сейчас, уже по возвращению, я подумал: в Париже все отдыхают. Или это только видимость? Как бы там ни было, отдыхать там легко. Понравилось кататься на public велосипедах!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7093676993132865793-467960989765781056?l=dmitrykan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/eSrUPG0XkjRnKnsBYgTgH37JqLw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eSrUPG0XkjRnKnsBYgTgH37JqLw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/eSrUPG0XkjRnKnsBYgTgH37JqLw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eSrUPG0XkjRnKnsBYgTgH37JqLw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vKAZT/~4/VuTXEBxEfZQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dmitrykan.blogspot.com/feeds/467960989765781056/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7093676993132865793&amp;postID=467960989765781056" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/467960989765781056?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/467960989765781056?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vKAZT/~3/VuTXEBxEfZQ/blog-post.html" title="Парижские впечатления" /><author><name>D_K</name><uri>http://www.blogger.com/profile/18154816739397439235</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://dmitrykan.blogspot.com/2010/07/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YBQXY8eyp7ImA9WxFRE0s.&quot;"><id>tag:blogger.com,1999:blog-7093676993132865793.post-8436001251007978938</id><published>2010-04-27T13:23:00.004+03:00</published><updated>2010-04-27T13:45:50.873+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-27T13:45:50.873+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="perl" /><title>Dumper and sorting of keys</title><content type="html">When you use Dumper for debugging via comfortable logging data structures by reference, you can additionally apply sorting to the output. Say, you have a hash addressed by $hash_ref reference. If you need to output the hash contents, but have its keys sorted, you can do:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="perl"&gt;&lt;br /&gt;use strict;&lt;br /&gt;use Data::Dumper;&lt;br /&gt;&lt;br /&gt;$hash_ref = generate your hash here&lt;br /&gt;&lt;br /&gt;$Data::Dumper::Sortkeys = \&amp;my_filter;&lt;br /&gt;print Dumper($hash_ref), "\n";&lt;br /&gt;&lt;br /&gt;sub my_filter {&lt;br /&gt; my ($hash) = @_;&lt;br /&gt; # return an array ref containing the hash keys to dump&lt;br /&gt; # in the order that you want them to be dumped&lt;br /&gt;        return [&lt;br /&gt;            sort {$a &lt;=&gt; $b} keys %$hash&lt;br /&gt;        ];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7093676993132865793-8436001251007978938?l=dmitrykan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/c-QwheVARI0aL4LXjq2nX5iCMZU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/c-QwheVARI0aL4LXjq2nX5iCMZU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/c-QwheVARI0aL4LXjq2nX5iCMZU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/c-QwheVARI0aL4LXjq2nX5iCMZU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vKAZT/~4/BeAWzMq-X10" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dmitrykan.blogspot.com/feeds/8436001251007978938/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7093676993132865793&amp;postID=8436001251007978938" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/8436001251007978938?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/8436001251007978938?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vKAZT/~3/BeAWzMq-X10/dumper-and-sorting-of-keys.html" title="Dumper and sorting of keys" /><author><name>D_K</name><uri>http://www.blogger.com/profile/18154816739397439235</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://dmitrykan.blogspot.com/2010/04/dumper-and-sorting-of-keys.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMFRHoyfyp7ImA9WxFQEEg.&quot;"><id>tag:blogger.com,1999:blog-7093676993132865793.post-2767783612828246730</id><published>2010-04-21T07:49:00.005+03:00</published><updated>2010-05-05T13:46:55.497+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-05T13:46:55.497+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="math" /><title>Сходимость</title><content type="html">Код программы аппроксимирует решение задачи. Сходимость кода к решению осуществляется посредством связки "изменение кода"-"компиляция/интерпретация"-"запуск". Получается что-то вроде временного ряда: код может не сходиться неделю и сойтись за один день. Если код не сходится, стоит посмотреть на саму концепцию в решении / задачу / компилятор.&lt;br /&gt;&lt;br /&gt;Всё это к тому, что полезно преподавать программирование, рассматривающее программу как целостную математическую схему, а не только как набор алгоритмов, приёмов и дизайна.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7093676993132865793-2767783612828246730?l=dmitrykan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/wOB57VbmLCFbUBFD_B29xc-vLTY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wOB57VbmLCFbUBFD_B29xc-vLTY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/wOB57VbmLCFbUBFD_B29xc-vLTY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wOB57VbmLCFbUBFD_B29xc-vLTY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vKAZT/~4/a2Zc0TLoY-8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dmitrykan.blogspot.com/feeds/2767783612828246730/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7093676993132865793&amp;postID=2767783612828246730" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/2767783612828246730?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/2767783612828246730?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vKAZT/~3/a2Zc0TLoY-8/blog-post.html" title="Сходимость" /><author><name>D_K</name><uri>http://www.blogger.com/profile/18154816739397439235</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://dmitrykan.blogspot.com/2010/04/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQDQns_cCp7ImA9WxFSF0k.&quot;"><id>tag:blogger.com,1999:blog-7093676993132865793.post-212048372343184572</id><published>2010-04-20T10:24:00.001+03:00</published><updated>2010-04-20T10:26:13.548+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-20T10:26:13.548+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="c++" /><category scheme="http://www.blogger.com/atom/ns#" term="finnish" /><title>Finnish is like C++</title><content type="html">, because it is highly typed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7093676993132865793-212048372343184572?l=dmitrykan.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/slNhA-cATrorNTBOsl9CKPeTElQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/slNhA-cATrorNTBOsl9CKPeTElQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/slNhA-cATrorNTBOsl9CKPeTElQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/slNhA-cATrorNTBOsl9CKPeTElQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/vKAZT/~4/8OQt83aaNII" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dmitrykan.blogspot.com/feeds/212048372343184572/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7093676993132865793&amp;postID=212048372343184572" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/212048372343184572?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7093676993132865793/posts/default/212048372343184572?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/vKAZT/~3/8OQt83aaNII/finnish-is-like-c.html" title="Finnish is like C++" /><author><name>D_K</name><uri>http://www.blogger.com/profile/18154816739397439235</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://dmitrykan.blogspot.com/2010/04/finnish-is-like-c.html</feedburner:origLink></entry></feed>

