13 января 2008

GoogleWeather

Задался недавно целью, написать виджет на рабочий стол, отображающий погоду за окном.
Далеко ходить не стал, решил заюзать веб-сервис от Google.

В итоге написал небольшую прогу на питоне, которая раз в 10 секунд получает текущую температуру, все просто и понятно..

from threading import Timer
from urllib2 import urlopen,quote,URLError
from xml.dom.minidom import parse
import sys

City = "Барнаул"

# Заменяем не ASCII символы на строки вида %xx, где xx - код в utf-8
qCity = quote(City)
uri = "http://www.google.co.uk/ig/api?weather=" + qCity

# Интервал опроса в секундах
interval = 10.0

timer = Timer(0.0,None)

def get_temperature():
try:
intstream = urlopen(uri)
except URLError, ex:
print "Ошибка при установке соединения."
sys.exit(0)

xmltree = parse(intstream)
# достаем текущие погодные условия
items = xmltree.getElementsByTagName("current_conditions");
cc_items = items[0].childNodes

temperature = -273

# достаем температуру
for cc_item in cc_items:
if(cc_item.nodeName=="temp_c"):
temperature = cc_item.attributes.getNamedItem("data").nodeValue
break

print temperature

def timer_proc():
global timer
get_temperature()
timer = Timer(interval,timer_proc)
timer.start()

def main():
global timer
timer = Timer(interval,timer_proc)
timer.start()

if __name__ == '__main__':
main()

Скачать код

Далее я переделал это консольное приложение в гуи под GTK. Скачать GTK-версию

Также написал то же самое на Java :) Скачать Java-версию

В итоге посмотрел реализации XML DOM-парсеров в этих языках. Увы в джаве не нашел какого-нибудь встроенного парсера, только голые интерфейсы.. Пришлось выкачивать реализацию от Apache Xerses.

В питоне есть встроенный minidom-парсер, который, имхо, замечательно подходит для такого типа задач..

PS:
У меня возникло несколько вопросов java-девелоперам:
- Есть ли, все-таки, встроенные парсеры?
- Можно ли внешнюю подключаемую библиотеку(jar) включать в итоговый исполняемый java-файл, причем не полностью, а только то, что необходимо? Ибо размер того же Xerses около 1,5 Мб.

Также привожу пример XML, выдаваемого гуглом на запрос погоды:
<?xml version="1.0"?>
<xml_api_reply version="1">
  <weather module_id="0" tab_id="0">
    <forecast_information>
      <city data="город Барнаул, Region of Altai" />
      <postal_code data="Барнаул" />
      <latitude_e6 data="" />
      <longitude_e6 data="" />
      <forecast_date data="2008-01-02" />
      <current_date_time data="2008-01-02 10:00:00 +0000" />
      <unit_system data="SI" />
    </forecast_information>
    <current_conditions>
      <condition data="Storm" />
      <temp_f data="9" />
      <temp_c data="-13" />
      <humidity data="Humidity: 52%" />
      <icon data="/images/weather/storm.gif" />
      <wind_condition data="Wind: SW at 14 km/h" />
    </current_conditions>
    <forecast_conditions>
      <day_of_week data="Today" />
      <low data="-24" />
      <high data="-12" />
      <icon data="/images/weather/storm.gif" />
      <condition data="Storm" />
    </forecast_conditions>
    <forecast_conditions>
      <day_of_week data="Thu" />
      <low data="-34" />
      <high data="-16" />
      <icon data="/images/weather/icy.gif" />
      <condition data="Chance of Ice" />
    </forecast_conditions>
    <forecast_conditions>
      <day_of_week data="Fri" />
      <low data="-31" />
      <high data="-26" />
      <icon data="/images/weather/mostly_sunny.gif" />
      <condition data="Mostly Sunny" />
    </forecast_conditions>
    <forecast_conditions>
      <day_of_week data="Sat" />
      <low data="-19" />
      <high data="-17" />
      <icon data="/images/weather/chance_of_snow.gif" />
      <condition data="Chance of Snow" />
    </forecast_conditions>
  </weather>
</xml_api_reply>

Как видите, кроме текущих погодных условий, гугл выдает предсказания на будущее. Так что продолжение следует...

07 января 2008

Matplotlib

А это решение краевой задачи для уравнения теплопроводности. Симпатично, не правда ли?











Для построения этой поверхности необходимы:
вектор аргументов x vX, вектор аргументов t vT, двумерный массив значений функции vY (y(t,x)).

X,Y = meshgrid(vT,vX) # из двух векторов создаются два двумерных массива
Z = zeros((K, N), float) # двумерный массив из нулей

fig=figure()
ax = p3.Axes3D(fig)

# поверхность
for i in xrange(N):
     for j in xrange(K):
         Z[j,i] = u(X[j,i],Y[j,i])

ax.plot_wireframe(X,Y,Z) # построение поверхности в виде проволочной сетки

ax.set_xlabel('T')
ax.set_ylabel('X')
ax.set_zlabel('U')
show()


При этом кое-что добавилось в инклуды:
from numpy import *
from pylab import *
import math
import matplotlib.axes3d as p3


Поясню, что делает функция meshgrid:
>>> from numpy import *
>>> vX = arange(0,5)
>>> vX
array([0, 1, 2, 3, 4])
>>> vY = arange(0,3)
>>> vY
array([0, 1, 2])
>>> X,Y = meshgrid(vX,vY)
>>> X
array([[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4]])
>>> Y
array([[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1],
[2, 2, 2, 2, 2]])

29 декабря 2007

Вычмат на питоне или using matplotlib

Вот семестр закончился, и теперь появилось время рассказать о том, как и на чем я делал лабораторные работы по численным методам(вычмату).

А делал я их на питоне с использованием некой библиотечки для отрисовки графиков. Правда перед тем, как выбрал именно ее, я поискал в инете похожие разработки под C#, Java, но увы ничего стоящего не нашел(что есно не говорит о том, что их нет).

В итоге я ни капельки не пожалел. Во-первых, питон очень хорошо подходит для написания математических приложений (чего только стоит нативная поддержка комплексных чисел), во-вторых он обладает красивым, понятным синтаксисом :)..

Вот например интерполяция функции многочленом Лагранжа:

















При этом все, что я сделал - непосредственно посчитал значения функции, многочлена и сформировал 3 списка:
funcx - список значений аргумента
funcy - список значений функции
Lny - список значений интерп. многочлена

и два списка для отображения узлов интерполяции
ly - значения аргумента в узлах интерполяции
ly - значения функции в узлах интерполяции

и обратился к функциям модуля pylab библиотечки matplotlib, который отвечает за построение и отображение графиков
# function
plot(funcx, funcy, '-', lw=1)

#interpolation
plot(funcx, Lny, '-',lw=2)

# узлы
plot(lx,ly, 'ro', lw=2)

xlabel('X')
ylabel('Y')
title('Lab6')
grid(True)


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

Функции Pylab повторяют функции пакета MatLab и обладают достаточно удобным и интересным синтаксисом параметров. Вот например функция plot. Она строит график по двум входным спискам - списку аргументов и значений, но есть еще параметры для настройки отображения самого графика: 'ro' - красные кружочки, '-' - просто линия, '--' - штриховая линия и т.д. Очень наглядно, никаких вам констант и бинарных флагов..

Еще пример - решение задачи Коши для диф уравнения методом Рунге-Кутта и Адамса:


Код











# Итак, все что нужно молодому питонисту, чтобы сделать вычмат:

Необходимые пакеты:
NumPy
Matplotlib

Офф:
http://matplotlib.sourceforge.net/

Доки:
http://matplotlib.sourceforge.net/api.pdf
http://matplotlib.sourceforge.net/users_guide_0.91.2svn.pdf

22 декабря 2007

Yoyoing


Йо-йо - что это? Детская игрушка или нечто большее?

Недавно стал обладателем этого девайса (Yomega Fireball) и могу сказать, что йо-йо - это замечательный способ отдохнуть и отвлечься от чего бы то ни было. Очень увлекательная вещь..

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


Хочу отметить, что йо-йо - это одна из тех вещей, которую нужно сначала попробовать, чтобы понять, что это. И не каждый согласится тратить 0,5К рублей на покупку этого сомнительного чуда(сам был среди них.. кстати, спасибо, Илья, что втянул меня в это :) ). Таким людям могу посоветовать найти знакомых ёёеров и попробовать себя в этом виде спорта, либо просто купить эту игрушку(я не пожалел).

Купить йо-йо можно в специализированных интернет-магазинах(несколько ссылок в конце поста). В магазинах своего города я ни разу не встречал их в продаже.

Имхо, йо-йо - это musthave гаджет для любого программиста, ибо заставляет периодически отвлекаться от работы, вставать и разминать конечности (замечательное лекарство от геморра и туннельного синдрома). Плюс к тому, ёё - замечательный подарок, ведь сам никто не купит себе это чудо, не попробовав.


Сейчас ёху таскаю с собой везде: в универ, на работу. Как появляется свободное время и пространство - разворачиваю лупы по коридору или комнате.
Кстати, ёёеров все больше и больше. Цепляет почти каждого, кто хоть раз попробует игрушку в деле. Так что вливайтесь ;)

Ссылки:
http://www.yoyoing.ru/
http://gyroscope.ru/

20 декабря 2007

История одного байта

Решил выложить ссылку на другую интересную статью из цикла "Программерский дZен". Когда-то эта статья впечатлила меня очень сильно.

Всем болеющим/переболевшим ассемблером посвящается..

http://wasm.ru/article.php?article=onebyte

Терафлоповая пустота

Недавно наткнулся на очень интересную статью Деймоса Стренталла в ][акере о будущем человечества, шагающего по пути технологического прогресса, и, как ни грустно, о будущем(да и о настоящем) нашей профессии..

http://www.xakep.ru/post/41289/default.asp

Советую почитать, цепляет очень неплохо, особенно на ночь глядя.. ;)

К разговору "все вы будите писать базы данных.."