Продолжаю играться с Java API для LiveJournal который сам и пишу. Вот одно из применений.
Люди из одинаковых городов представлены одним маркером.
География моих френдов так сказать.
Продолжаю играться с Java API для LiveJournal который сам и пишу. Вот одно из применений.
Люди из одинаковых городов представлены одним маркером.
География моих френдов так сказать.
В общей сложности, убил 8 часов на борьбу с юникодом, в Java, Ant, MySQL JDBC, MySQL4, MySQL5. Поборол в конце концов.
Но что забавно - всё началось с юзера под названием “Pruszcz Gdański”.
Шлю тебе, неизвестный Принц из Гданська, горячий привет!
Pruszcz Gdański
Вот тут живет проект который якобы ” по мэппингам или по классам автоматом сделает WEB-интерфейс для редактирования, добавления, удаления итд.”
Надо посмотреть…
Ещё раз убедился, что почти всё что может потребоваться человеку можно купить на ebay программисту можно найти на Sourceforge
Вот например LiveJournal Java API тут
Справедливость восторжествовала, как всегда впрочем. Намедни господин
совершенно справедливо указал, что зря я не люблю встроенную имплементацию JAXP в 1.4 и, что Xalan уже включен в J2SE 1.4, а я просто готовить его не умею. И действительно как оказалось, Xalan содержит классы для XPath, только они называются по другому и вообще всё немножко не так, как в JDOM, и работает медленее. Зато никаких новый jar-ов не надо.
Встроенный Xalan (код после оптимизации по скорости с прекомпиленными выражениями) :
minusOneExpression = new XPath("/game/principal/@noBid='true'", null, null, XPath.SELECT); XObject containsLateBid = minusOneExpression.execute(new XPathContext(), doc.getFirstChild(), null); containsLateBid.bool()
JDom:
noBidExpression = XPath.newInstance("/game/principal/@noBid='true'"); Boolean result = (Boolean) noBidExpression.selectSingleNode(doc); result.booleanValue()
Следует ли говорить, что в 1.5 всё ещё более по третьему?
Sun по этому поводу пишет следующее:
“…In J2SE 1.4, the fact that JAXP was built into the Java platform was a mixed blessing. On the one hand, an application could rely on that fact that it was there. On the other, most applications needed features and bug fixes that were available in later versions. But adding new libarires had no effect, because internal classes always take precedence over the classpath…”
Что то с памятью моей стало…
Я больше не буду использовать JAXP в 1.4 Я больше не буду использовать JAXP в 1.4 Я больше не буду использовать JAXP в 1.4 Я больше не буду использовать JAXP в 1.4 Я больше не буду использовать JAXP в 1.4
Сегодня сделал такую простую машину состояний, так вроде оно называется. Что называется, попробуйте немножко лиспа
Зачем это нужно - если есть набор правил, и нужно согласно с этими правилами что-то делать то либо нужно писать многоуровневый IF-ELSE-IF-ELSE либо сделать FSM.
Многоэтажные конструкции IF-ELSE-IF-ELSE просто писать, но сложно читать. И упаси боже через неделю придется покопаться в правилах. FSM легко определить и легко потом читать изменять, но нужен тот собственный черный ящик который будет правила исполнять. Кстати по правилам легко генерировать картинки (слева), ещё более упрощая понимание. Вычленил свой код а крохотную библиотечку, сначала думал может статейку какую написать простенькую, а сейчас уже остыл, может и не надо это никому.
Вместо “мяса” реализации логики тут везде null
Node countTimeOutStatementNode = new StatementNodeAdaptor("countTimeout", "orderCheck", null);
Node countOrderFailureStatementNode = new StatementNodeAdaptor("countOrderFailure"
Интересная/забавная идея: автоматически анализировать блог человека что бы понять что он за человек. Как полезный побочный эффект можно сравнивать измерения за последовательные временные интервалы и смотреть как человек меняется. Конечно, это не точный психологический портрет но всё же, всё же…
читать и смотреть здесь
Nice and simple code to do Fuzzy String Matching by
import java.util.ArrayList; public class LetterPairSimilarity { /** * @return lexical similarity value in the range [0,1] */ public static double compareStrings(String str1, String str2) { ArrayList pairs1 = wordLetterPairs(str1.toUpperCase()); ArrayList pairs2 = wordLetterPairs(str2.toUpperCase()); int intersection = 0; int union = pairs1.size() + pairs2.size(); for (int i = 0; i < pairs1.size(); i++) { Object pair1 = pairs1.get(i); for (int j = 0; j < pairs2.size(); j++) { Object pair2 = pairs2.get(j); if (pair1.equals(pair2)) { intersection++; pairs2.remove(j); break; } } } return (2.0 * intersection) / union; } /** * @return an ArrayList of 2-character Strings. */ private static ArrayList wordLetterPairs(String str) { ArrayList allPairs = new ArrayList(); // Tokenize the string and put the tokens/words into an array String[] words = str.split("s"); // For each word for (int w = 0; w < words.length; w++) { // Find the pairs of characters String[] pairsInWord = letterPairs(words[w]); for (int p = 0; p < pairsInWord.length; p++) { allPairs.add(pairsInWord[p]); } } return allPairs; } /** * @return an array of adjacent letter pairs contained in the input string */ private static String[] letterPairs(String str) { int numPairs = str.length() - 1; String[] pairs = new String[numPairs]; for (int i = 0; i < numPairs; i++) { pairs[i] = str.substring(i, i + 2); } return pairs; } }
JUG notes: