Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2012-04-28

Can you use Google Maps imagery in an ArcGIS Silverlight Viewer?

Казалось бы, что мешает использовать гуглокарты во вьювере карт от ведущего производителя ПО для ГИС? В смысле, раз уж есть такой красивый ArcGIS Silverlight Viewer и он умеет показывать тайловые карты, причем тайловая схема нагло содрана приведена к гуглевой, то почему бы ему не показывать гуглокарты?

Нельзя патамушта. Нелегально это.

Now for the legal answer. In short, no. You cannot access Google Maps imagery outside of an interface (read: APIs) provided by Google. This is mentioned in an online FAQ which references an item in the terms of service. The last statement in the terms of service appears to suggest that direct access to map tiles outside of an API is possible via an explicit agreement. In an email conversation with Thor Mitchell, Product Manager for the Google Maps API, he clarified these terms by stating that such agreements are rare and "they are generally limited to embedded device partnerships such as in-car navigation systems and in-flight entertainment systems." Thor also reminded me that the URL format to access Google tiles is an undocumented interface, so it can change at any time. And Google maintains a team that identifies and contacts application developers that use Google tiles (and services) in an unsupported way. If you try, you will likely be asked to stop, followed by more punitive measures if ignored.


Так что же, никак? Да нет, если очень хочется, то можно.

You'll need to use the Google Static Maps API. Essentially it generates snapshots of Google map tiles at an extent, image size, and scale level that matches the Google Maps tiling scheme.


В общем, полезная статья. Там и пример кода есть, реализующий Layer class для вьювера. В общем, хоть и корявым образом, но использовать гуглокарты в ArcGIS Silverlight Viewer можно.

2012-04-26

Веб-картография

Сегодня обнаружился любопытный эффект (даже не столько любопытный, сколько поганенький, и не эффект а дефект).
Есть такой вьювер для карт — ArcGIS Viewer for Silverlight (вот ненавижу такие названия, должен быть короткий и удобный коденейм). Красивый, местами удобный, расширяемый. Мы его используем. Так сегодня он был пойман с поличным — нёс отсебятину.

Вообще, технология довольно проста. Где-то на сервере лежит куча растровых картинок — тайлов, которые складываясь вместе дают на экране красивое изображение местности. Задача клиентского софта (и ArcGIS Viewer for Silverlight в частности) сводится к вытягиванию с сервера нужных в данный момент картинок, после чего сложить их вместе и вывести на экран. Ну все знают гуглокарты или яндекскарты.

Так этот, не побоюсь этих слов, ArcGIS Viewer for Silverlight, не может вывести растровую картинку 1:1 (пиксел картинки в пиксел экрана). Он эти картинки масштабирует! То сожмет, то растянет, собака страшная.

Поскольку лучше один раз увидеть, чем сто раз услышать, я подготовил анимированную гифку (писк моды — на гуглодрайве!). Гифка более мегабайта и все время моргает, поэтому прямо на страницу не стал ставить.
В картинке два кадра, один показывает изображение правильно, 1:1, другой показывает растянутое изображение. Растянутое — это ArcGIS Viewer for Silverlight.
По сцылке открывается гугловьювер, который дополнительно сжимает картинку, поэтому лучше всего щелкануть ПКМ на изображении и выбрать «View image» (или как там в вашем браузере).

У меня еще есть анимашка (не стал выкладывать), где этот вьювер не растягивает а сжимает картинку. Логика его действий непостижима, чего еще от него ждать — неясно.

Собственно, что я хотел сказать? Отстой этот ваш Сильверлайт Вьювер, дорогие товарищи из ESRI.


UPD

Я нашел решение проблемы. Как оказалось, это не бага, это фича. Глубоко в недрах вьювера есть параметр
MapApplication.Current.Map.SnapToLevels
если задать его
MapApplication.Current.Map.SnapToLevels = true;
то вьювер перестает заниматься отсебятиной.

Олдскульный Zope Product 2 egg

Не корысти ради а токмо волею пославшей мя жены! © Ильф и Петров.

В продолжение темы «Заготовка Zope Product» и, если точнее, в продолжение подтемы «Тестирование/отладка Zope Product». Некоторые детали нынешнего поста раскрываются в подробностях там, раньше.

Тенденция, однако. Я по наивности своей полагал, что заворачивать Zope Product в яйцо (egg) придется еще не скоро. Ошибся. Нынче настали такие времена, когда яйцепоклонники победили со всей очевидностью. Во всяком случае в теме Zope/Plone.

Такой факт — начиная с Zope 2.12.8 пропала возможность запускать
zopectl test
Теперь, чтобы автоматизировать тестирование своего продукта, надо заворачивать продукт в яйцо и добавлять zc.recipe.testrunner в билдаут. Иначе, разумеется, можно. Но не нужно.

Что поделать, яйцо, так яйцо, тестировать-то надо. В конце концов, делов-то: раз — сделать яйцо, два — поправить билдаут для включения этого яйца. Понеслась. Брюки продукты превращаются ... в egg.

Сперва добудем инструменты — paster & zopeskel.

Чтобы сделать яйцо, нужен paster. Рекомендуют получить его через билдаут, хотя можно и через virtualenv организовать.
Добавил в C:\d\Zope\zope213\buildout.cfg
строки про zopeskel & paster, получилось так
[buildout]
parts =
  zopeskel
  paster
  instance
extends = http://download.zope.org/Zope2/index/2.13.13/versions.cfg

[zopeskel]
recipe = zc.recipe.egg
eggs =
  ZopeSkel<2.99

[paster]
recipe = zc.recipe.egg
eggs =
  PasteScript
  ZopeSkel<2.99

[instance]
recipe = zc.recipe.egg
eggs =
  Zope2
  Products.ZSQLMethods
interpreter = zopepy
scripts = runzope zopectl
initialization =
  import sys
  sys.argv[1:1] = ['-C', r'${buildout:directory}\etc\zope.conf']
и запустил перестройку
C:\d\Zope>call setenv.cmd
C:\d\Zope>cd zope213
C:\d\Zope\zope213>bin\buildout.exe
как и обещали (collective-docs.readthedocs.org/en/latest/tutorials/paste), появились команды
c:\d\Zope\zope213\bin\paster.exe
c:\d\Zope\zope213\bin\zopeskel.exe

Дополнительно стОит заметить, что в доках рекомендуют конфиг писать немного иначе. К примеру, секция zopeskel изначально выглядела так
...
[zopeskel]
recipe = zc.recipe.egg
eggs =
        ZopeSkel<2.99
        zopeskel.dexterity
        ${instance:eggs}
...
Декстерити я убрал, потому как он мне не нужен. А вот с подключением яиц инстанса (${instance:eggs}) уже интереснее. Если сделать как рекомендуют, перестают работать скрипты запуска Zope. Отваливаются с сообщением
C:\d\Zope\zope213>bin\runzope.exe
Traceback (most recent call last):
  File "C:\d\Zope\zope213\bin\runzope-script.py", line 92, in <module>
    Zope2.Startup.run.run()
  File "c:\d\zope\zope213\eggs\zope2-2.13.13-py2.7.egg\Zope2\Startup\run.py", line 19, in run
    opts = _setconfig()
  File "c:\d\zope\zope213\eggs\zope2-2.13.13-py2.7.egg\Zope2\Startup\run.py", line 50, in _setconfig
    handlers.handleConfig(opts.configroot, opts.confighandlers)
  File "c:\d\zope\zope213\eggs\zope2-2.13.13-py2.7.egg\Zope2\Startup\handlers.py", line 193, in handleConfig
    return multihandler(handlers)
TypeError: 'NoneType' object is not callable
Как я выяснил, это из-за того, что в скриптах запуска пропадают строки
import sys
sys.argv[1:1] = ['-C', r'C:\d\Zope\zope213\etc\zope.conf']
Так что рекомендуемый конфиг я подправил, убрав подключение инстансовых яиц.


ОК, paster и zopeskel у меня есть. Создаю яйцо (weblion.psu.edu/trac/weblion/wiki/EggifyAnExistingProduct).

По инструкции опять не очень хорошо
c:\d\Zope\zope213\bin\paster create -t plone3_theme Products.vcufile
повис...отвис.
bin\paster.exe create -t plone Products.vcufile

Попробую так:
C:\d\Zope\zope213>bin\zopeskel.exe basic_zope Products.vcufile
Говорят, что на вопросы надо отвечать так, чтобы получилось
  namespace_package: Products
  package: vcufile
  zip_safe: False
Но мне таких вопросов не задавали, сессия выглядела вот как
basic_zope: A Zope project
This creates a Zope project without any specific Plone features.
If at any point, you need additional help for a question, you can enter
'?' and press RETURN.
Expert Mode? (What question mode would you like? (easy/expert/all)?) ['easy']:
Version (Version number for project) ['1.0']: 3.0.0
Description (One-line description of the project) ['']: Zope2 Product for huge files chunked upload
Creating directory .\Products.vcufile
c:\d\zope\zope213\eggs\cheetah-2.2.1-py2.7.egg\Cheetah\Compiler.py:1523: UserWarning:
You don't have the C version of NameMapper installed! I'm disabling Cheetah's useStackFrames
option as it is painfully slow with the Python version of NameMapper.
You should get a copy of Cheetah with the compiled C version of NameMapper.
  "\nYou don't have the C version of NameMapper installed! "
Replace 0 bytes with 2 bytes (0/0 lines changed; 1 lines added)
Replace 244 bytes with 2 bytes (6/6 lines changed; 5 lines removed)
и в результате получилось такое
c:\d\Zope\zope213\Products.vcufile
│   Products.vcufile-configure.zcml
│   README.txt
│   setup.py
│
├───docs
│       HISTORY.txt
│
├───Products
│   │   __init__.py
│   │
│   └───vcufile
│           configure.zcml
│           README.txt
│           tests.py
│           zope2.py
│           __init__.py
│
└───Products.vcufile.egg-info
        dependency_links.txt
        entry_points.txt
        namespace_packages.txt
        not-zip-safe
        PKG-INFO
        requires.txt
        SOURCES.txt
        top_level.txt
Согласно руководству по обяичиванию, заменил содержимое папки
c:\d\Zope\zope213\Products.vcufile\Products\vcufile
содержимым своего продукта. Получилось так
c:\d\Zope\zope213\Products.vcufile
│   Products.vcufile-configure.zcml
│   README.txt
│   setup.py
│
├───docs
│       HISTORY.txt
│
├───Products
│   │   vcufile.egg.template.rar
│   │   __init__.py
│   │
│   └───vcufile
│       │   CHANGES.txt
│       │   configure.zcml
│       │   DEPENDENCIES.txt
│       │   HISTORY.txt
│       │   INSTALL.txt
│       │   LICENSE.txt
│       │   README.txt
│       │   TODO.txt
│       │   uploads_const.py
│       │   vcufile.py
│       │   vcufileproduct.py
│       │   VERSION.txt
│       │   __init__.py
│       │
│       ├───help
│       │       VCUFile.stx
│       │
│       ├───static
│       │       vcu.sl.client.js
│       │
│       ├───tests
│       │       testVCUFile.py
│       │       __init__.py
│       │
│       └───wwwvcufile.pngvcufile16.pngvcuFileAdd.dtmlvcuFileEdit.dtmlvcuFileView.zpt
│
└───Products.vcufile.egg-info
        dependency_links.txt
        entry_points.txt
        namespace_packages.txt
        not-zip-safe
        PKG-INFO
        requires.txt
        SOURCES.txt
        top_level.txt
Жирным я выделил свои файлы, остальное нагенерировано роботом.
Как и положено, теперь продукт Zope выполнен в формате egg, что несколько меняет способ его подключения к Zope.


Подключаю Product egg к Zope.

Сперва нужно удалить старый продукт, в виде папки
c:\d\Zope\zope213\Products\vcufile
если она еще не удалена на предыдущем шаге.
Теперь разместить яйцо в разработческой папке
c:\d\Zope\zope213\src\Products.vcufile
Поправить конфиг билдаута
[buildout]
parts =
  zopeskel
  paster
  instance
extends = http://download.zope.org/Zope2/index/2.13.13/versions.cfg
develop =
  src/Products.vcufile

[zopeskel]
recipe = zc.recipe.egg
eggs =
  ZopeSkel<2.99

[paster]
recipe = zc.recipe.egg
eggs =
  PasteScript
  ZopeSkel<2.99

[instance]
recipe = zc.recipe.egg
eggs =
  Zope2
  Products.ZSQLMethods
  Products.vcufile
interpreter = zopepy
scripts = runzope zopectl
initialization =
  import sys
  sys.argv[1:1] = ['-C', r'${buildout:directory}\etc\zope.conf']
и пересобрать
C:\d\Zope\zope213>bin\buildout.exe
Работает, проверил.

Поставленная на сегодня задача выполнена — продукт Zope завернут в яйцо (egg) и подключен к Zope в таком виде.


Теперь можно сделать то, для чего вся эта байда была затеяна — запустить систему тестирования.

Как сказано в руководстве (collective-docs.readthedocs.org/en/latest/testing_and_debugging/unit_testing) надо подключить zc.testrunner.
Правлю конфиг билдаута
[buildout]
parts =
  zopeskel
  paster
  test
  instance
extends = http://download.zope.org/Zope2/index/2.13.13/versions.cfg
develop =
  src/Products.vcufile

[zopeskel]
recipe = zc.recipe.egg
eggs =
  ZopeSkel<2.99

[paster]
recipe = zc.recipe.egg
eggs =
  PasteScript
  ZopeSkel<2.99

[test]
recipe = zc.recipe.testrunner
defaults = ['--auto-color', '--auto-progress']
eggs =
  ${instance:eggs}

[instance]
recipe = zc.recipe.egg
eggs =
  Zope2
  Products.ZSQLMethods
  Products.vcufile
interpreter = zopepy
scripts = runzope zopectl
initialization =
  import sys
  sys.argv[1:1] = ['-C', r'${buildout:directory}\etc\zope.conf']
после перестройки, как и обещали, появляется утилита
c:\d\Zope\zope213\bin\test.exe

Запускаю (барабанная дробь....)
C:\d\Zope\zope213>bin\test -s Products.vcufile
Running zope.testing.testrunner.layer.UnitTests tests:
  Set up zope.testing.testrunner.layer.UnitTests in 0.000 seconds.
  Running:
  Ran 1 tests with 0 failures and 0 errors in 0.000 seconds.
Tearing down left over layers:
  Tear down zope.testing.testrunner.layer.UnitTests in 0.000 seconds.
Ура, товарищи! Unit tests запустились и отработали.

Вот ради этого события и проделана вся вышеописанная работа — многоэтапная переделка «старорежимного» Zope Product в формат egg.

Чисто для справки, на текущий момент юнит-тесты выглядят так
c:\d\Zope\zope213\src\Products.vcufile\Products\vcufile\tests\__init__.py
# This file is needed to make this a package.

c:\d\Zope\zope213\src\Products.vcufile\Products\vcufile\tests\testVCUFile.py
import os
import unittest

import ZODB # dead goat
import Products.vcufile.tests
from Products.vcufile.vcufileproduct import VCUFileProduct
import App.config

class testVCUFile(unittest.TestCase):

    def setUp(self):
        self._old = App.config.getConfiguration()
        cfg = App.config.DefaultConfiguration()
        cfg.instancehome = os.path.dirname(
            Products.vcufile.tests.__file__)
        App.config.setConfiguration(cfg)

    def tearDown(self):
        App.config.setConfiguration(self._old)

    def testFID(self):
        vf = VCUFileProduct('123', '456')
        self.assertEqual(vf.getFID(), '')
        state = vf.__getstate__()
        vf2 = VCUFileProduct.__basicnew__()
        vf2.__setstate__(state)
        self.assertEqual(vf2.getFID(), '')
        self.failIf(state.has_key('func_defaults'))

def test_suite():
    return unittest.makeSuite(testVCUFile)

def package_home(globals_dict):
    __name__=globals_dict['__name__']
    m=sys.modules[__name__]
    if hasattr(m,'__path__'):
        r=m.__path__[0]
    elif "." in __name__:
        r=sys.modules[__name__.split('.',1)[0]].__path__[0]
    else:
        r=__name__
    return os.path.abspath(r)

if __name__=='__main__':
    unittest.main(defaultTest='test_suite')
Заготовка по шаблону, зато работает.

Вот и сказочке конец, кто дослушал — молодец.

Что было полезно
pypi.python.org/pypi/Zope2/2.12.8 Removed the test command from zopectl. The test.py script it was relying on does no longer exist.

2012-04-25

Zope Product testing/debugging

Можно сказать, тема слабо касается поставленной задачи — разработка продукта Zope. С другой стороны, если все делать правильно, то при разработке следует соблюдать правила TDD. Тесты рулят — юнит, интеграционные , функциональные, системные. Надо — значит надо. Главное начать, дальше само пойдет.

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

но так и не смог сделать первый шаг — запустить прогон тестов на своей конфигурации (Zope 2.13). Отсюда и ноги растут у этого текста.

Так как же запустить тесты моего продукта?

Ну, например так — вручную (жутко неудобно, зато работает).
Запускаем отладочную консоль Zope
call setenv.cmd
pushd %INSTANCE_HOME%
start cmd.exe /k "bin\zopectl debug"
в моем случае setenv.cmd выглядит так
chcp 1251 > nul
set wd=%~dp0
pushd "%wd%"
set INSTANCE_HOME=c:\d\Zope\zope213
set PYTHONPATH=
set path=c:\d\Python27;c:\d\Python27\Scripts;%path%
set proxy=http://proxy.algis.com:3128
set http_proxy=%proxy%
set ftp_proxy=%proxy%
set all_proxy=%proxy%

В отладочной консоли пишем
>>> import runpy
>>> x = runpy.run_module('Products.vcufile.vcufileproduct', run_name='__main__', alter_sys=True)
на выходе видим отчет doctest, ибо в файле vcufileproduct.py я написал запуск доктестов, если файл запущен как скрипт а не используется как модуль
__doc__ = """VCUFile product module.
    The VCUFile Addon works like the Zope File product, but stores
    the uploaded file externally and can upload giant files because of chunked upload.

Doctests for VCU File Zope Product.

Create new object
>>> x = VCUFileProduct('123', '456')
>>> x.id
'123'
>>> x.title
'456'
"""

__version__ = '3.0.0.alpha'

...

if __name__ == "__main__":
    import doctest
    doctest.testmod(verbose=True)
Уже что-то.

Какие еще есть возможности?

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

Итак, как написано (в %INSTANCE_HOME%\eggs\zlog-2.11.1-py2.7.egg\zLOG\__init__.py)
This module exists only for backward compatibility. Any new code
for Zope 2.8 and newer should use the logging module from Python's
standard library directly.
старый, но упоминаемый в доках zLOG.LOG использовать не надо. А надо использовать модуль logging.

Что означает, к примеру, следующие телодвижения для достижения :) В своем модуле добавляем
import logging
logger = logging.getLogger('VCUFile')
...
 def __init__(self, id, filename):
  logger.debug('VCUFileProduct.__init__')
...
Поскольку уровень я задал «дебаг», то в конфиге (%INSTANCE_HOME%\etc\zope.conf) надо поправить настройку журнала, чтобы стало как то так
<eventlog>
  level debug
  <logfile>
    path $INSTANCE/log/event.log
    level info
  </logfile>
</eventlog>
отладочные сообщения будут вываливаться на консоль, в файл пойдут только сообщения уровня «инфо».

В итоге, в консоли я увидел
2012-04-24 21:54:38 DEBUG VCUFile VCUFileProduct.__init__
при создании нового объекта. От этой печки и пляшем дальше.

К сожалению, сегодня времени не хватило на выяснение рабочего способа запуска юнит-тестов автоматом. По инструкции оно должно срабатывать при запуске
zopectl test …
а на деле так не выходит.

Потом как нибудь продолжим.

2012-04-24

Звериный оскал

Вообще-то говорят «звериный оскал капитализма», типа штамп такой, большевистский. А мне тут показали звериный оскал похуизма.

Сто лет назад (12 марта, если верить цитате), я воспользовался любезным приглашением «помочь улучшить работу» портала госуслуг. У меня система не принимала анкету на замену водительского удостоверения и я накатал телегу в суппорт. Потом то да это, лицензию я заменил, толку от портала не заметив, о чем и доложил общественности.

И вот, сегодня, 23 апреля, мне прислали отчет о работе над ошибками. Какая прелесть (привожу полностью вместе с текстом моей заявы):

Уважаемый пользователь!
По Вашему обращению сообщаем: на данный момент услуга "Получение международного водительского удостоверения" работает корректно.
Рекомендуем воспользоваться данной услугой повторно.
Благодарим за обращение на Единый портал государственных и муниципальных услуг.
Анализ поступающих вопросов и предложений помогает нам улучшать работу Портала.

С уважением,
Служба поддержки пользователей
Единого портала государственных и муниципальных услуг.
Центр телефонного обслуживания: 8(800)100-70 -10http://gosuslugi.ru



12.03.2012 17:06 - Администрация сайта gosuslugi.ru написал(а):
Тема обращения: Личный кабинет. Технические ошибки при работе
Здравствуйте. Второй день подряд я пытаюсь отправить заявление на замену водительского удостоверения. Безуспешно. Я заполняю анкету, дохожу до пункта "отправить" и после отправки стабильно получаю сообщение "портал временно недоступен, приносим извинения за неудобство". Нечто в этом духе. Что не так? Когда я смогу уже подать заявление? Благодарю за внимание. Информация о пользователе: Браузер: Mozilla/5.0 (Windows NT 5.2) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.79 Safari/535.11 IP: 127.0.0.1


Хочется отметить сразу несколько моментов. Во-первых — оперативность. Двух месяцев не прошло. Во вторых точность. Мне сообщают о получении международного удостоверения, хотя я упоминал замену драйверской лицензии. В третьих, доброжелательность приглашения воспользоваться услугой повторно, несмотря на то, что я уж несколько недель как с новыми «правами». А если учесть, что именно эта портальная услуга никак не помогает права заменить, предложение расценивается как особо ценное.

Все это очень инновационно и электронно, да. Прям даже не знаю, то ли продолжить переписку с этими роботами, то ли сочинить донос прямо Государю? У нас ведь "ручное управление", да?

2012-04-23

Гражданская мышцА

Это мы, мышицы © «Кот Леопольд».
Любопытная точка зрения на протестные движения в России:

On the other hand, I support the protests because I think civil action is a muscle which, in Russia, needs to be built up after being forced to atrophy for seventy years under Communism. I think the Russian police need some practice in dealing with civil protest on a sub-absolute basis, and the authorities need to get into the habit of taking account of public opinion before it “goes absolute” and revolution or violence threatens.


Перевожу для незнаек:

С другой стороны, я поддерживаю протесты (речь о Химкинском лесе), потому как я думаю, что гражданские действия (действия гражданина) это типа мышцы, которая в России атрофировалась за 70 лет большевицкой власти и нуждается в прокачке после этого. Я думаю, Российская полиция нуждается в определенной практике по взаимодействию с гражданскими протестами на базе не-абсолютизма (это отдельная тема, автор заметил, что в России склонны к абсолютизму, как минимум в речах), и руководству надо приобретать привычку брать в рассмотрение мнение общества до того как «грянет гром» (тут опять про абсолютизм) и возникнет угроза переворота или насилия.

То есть, автор считает наши протесты и прочие «болотинги» хорошей практикой, как для населения, так и для властей. Упражнениями по развитию гражданского общества. Не зависимо от результатов этих протестов.

Трудно не согласиться.

2012-04-22

Билли

У нас событие. Наконец-то, и пяти лет не прошло, мы обставили «кабинет» стеллажами. При заселении как-то сразу решили, что в кабинете у нас будут стеллажи, но понадобилось четыре года, чтобы задуманное воплотилось. Лень — страшная сила, почти такая же страшная, как красота :)

Стеллажи брали в ИКЕА.

Что меня восхитило, так это как ИКЕА дерет деньжищи за дрова. Не я первый, не я последний восхищаемся изяществу бизнес-модели. Мы забрали со склада около 150 килограмм ровно нарезанных досочек, просверленных в нужных местах, плюс мешочек с шурупчиками/гвоздиками. Сами сложили эти досочки в нечтно коробоподобное, называемое стеллажами, сами разместили в комнате. Все сами, только досочки за нас попилили и посверлили. Даже не досочки а прессованный с клеем винни пух (опилки). А заплатили мы за эти дрова тыщу баксов.

Видимо, стеллажи эти — сильно дизайновая вещь, ибо при поточном производстве себестоимость этих дров — баксов двести максимум. Но, следует отметить особо, аккуратность и точность изготовления дощечек на очень хорошем уровне. Собирается все без кувалды и чьей-то матери. Легко. У отечественных изготовителей мебели я такого качества пока не встречал.

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


2012-04-19

Erlang

Достаточно утилитарный, достаточно элитарный.

Erlang is named after A. K. Erlang. It is sometimes thought that its name is an abbreviation of Ericsson Language, owing to its origin inside Ericsson. According to Bjarne Däcker, who headed the Computer Science Lab at the time, this duality is intentional.

Есть хорошая, годная статья про Эрланг (Erlang). Введение в тему для тех, кто «да, да, я слышал, это круто и здорово, может в моем проекте будет полезно?». Хотя лично мне кажется, что тем, кому может быть реально полезен Эрланг, про него рассказывать уже не надо (они и так уже в теме). Во всяком случае, им рассказывать надо не так поверхностно.

Его создатели выбирали каждую деталь и особенность реализации так, чтобы сделать его идеальным для решения вполне конкретных телекоммуникационных задач, с которыми они сталкивались в 80-90-х годах. Во многом из-за этого он так и не стал универсальным языком программирования как C++, Python и другие, а так и остался спустя многие годы специализированным инструментом. Сегодня спрос и предложение на специалистов по Erlang на рынке труда относительно малы, что для большинства проектов является основным аргументом против Erlang, хотя порой они и сталкиваются с задачами, где он запросто бы стал тем самым «идеальным инструментом».
...


Хотя статья и называется «Эрланг в интернет-проектах», как раз тема применения Эрланга в конкретных веб-проектах раскрыта слабо. Почти не. А жаль.

Какой вывод можно сделать о применимости Эрланга в вебе? Наверное такой: если вы хотите сделать надежную, производительную, горизонтально масштабируемую многопоточную обработку событий/сообщений — можете сделать это на Эрланг. Но не ждите библиотек, фреймворков и доступных спецов — все будете делать своими ручками.

Сцылки, которые стоит посетить, если хотите знать больше про Эрланг:

2012-04-17

Zope Product static content (resources)

Дополнение к вопросу «как же мне создать Zope Product». В наборе постов я вполне подробно осветил процесс создания продукта Zope. Но одну проблему упустил — статичный контент в продукте. Яваскрипты, файлы стилей (CSS), картинки — как их правильно расположить в продукте и как потом использовать? Исправляю упущение.

Для начала этот дополнительный контент надо правильно назвать. В контексте Zope Product это называется «ресурс». Теперь можно нагуглить ответ на вопрос.

1. Внутри папки продукта надо сделать папку с именем «static». В эту папку поместить нужные ресурсы — файлы CSS, JS, картинки.

2. В папке продукта сделать файл configure.zcml, например такой
<configure xmlns:browser="http://namespaces.zope.org/browser">
    <browser:resourceDirectory
        name="vcufile"
        directory="static"
    />
</configure>
и перезапустить Zope.

3. В страницах использующих эти ресурсы применить урлы вида
/++resource++vcufile/filename
к примеру, так
<script type="text/javascript" src="/++resource++vcufile/vcu.sl.client-20120416.js"></script>
хотя, благодаря механизму Zope Acquisition, можно вместо абсолютных URL использовать относительные. Что дает возможность цеплять разные версии ресурсов.

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

2012-04-16

Space Shuttle

Нынче люди уже не переживают так за космос, как 50—40 лет назад. Потеряли интерес. Странно, ведь способность космоса поражать воображение никуда не делась. А с ростом технологических возможностей поражаться можно не отрывая жопы от кресла.

Обязательно включите максимальное качество — оно того стоит. Это видео снабжено звуком. Можно услышать рёв двигателей, постепенно превращающийся в слабый шум в верхних слоях атмосферы. При входе ступени в атмосферу ясно видно пламя.
Это видео — часть контента, который будет доступен на BluRay-версии фильма Ascent: Commemorating the Space Shuttle, который был сделан в NASA. Он посвящён завершению программы Space Shuttle.


Взрыв одного из этих шаттлов расследовал Ричард Фейнман. Тот самый.

2012-04-14

Real-Time GIS Services

Относительно свежая тема, для ГИС во всяком случае. Веб-приложения реального времени.

Вот, к примеру, карты.яндекс показывающие «пробки» на дорогах. Я код не копал, но мнение имею — там ни разу не реальное время. Изменения в браузер приходят не тогда, когда они проявились на сервере (я уж не говорю — на дороге :), а тогда, когда отработает браузерное событие. Браузер периодически дергает сервер и показывает свежие данные. Это не риалтайм. Риалтаймом это можно было бы назвать, если бы по приходу в БД на сервере описания ДТП, или других обновлений, сервер разослал бы клиентам (браузерам) свежие данные. Хотя, если строго, это тоже не риалтайм. Но в веб-приложениях это называется так.

Так вот, пример ГИС веб-приложения реального времени, сделанного в целях демонстрации и проверки технологий на двух разных платформах (Node.js, Socket.io; ASP.NET MVC, SignalR).

Слово докладчику.

At the 2012 Esri Developer Summit, we gave two talks on building real-time apps – the first used Node.js and Socket.io, and persisted the data to a feature service. The second used ASP.NET MVC and SignalR, and stored the data points in a simple SQL table with x,y values.
...we will show a simple node.js app that uses socket.io to send notifications between clients and the server, as well as sending the point locations to an ArcGIS Server feature service. The desktop client uses the Esri Javascript API, and the mobile version uses Leaflet.js. Both consume ArcGIS Server Map Services.


Чтобы понять в чем фишка, откройте аппликуху в двух разных браузерах и в одном из них добавляйте на карту значки. Вариант на СигналР.

Здорово. Некоторые потребители будут кипятком сцать, ведь раньше они могли такой сервис получать только на тяжелых десктопах. А тут нате, рука на пульсе 24х7 через любой смарт/планшет, был бы доступ в Интернет (почти стихи).

2012-04-13

Черная пятница

На днях произошла бытовая история, которая, на мой взгляд, заслуживает публикации. Назвать ее можно «К чему приводят мечты».

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

Это было необходимое вступление. Пошла история.

Несколько месяцев назад в нашей работе возникла новая тема. Была сформулирована задача, по задаче была отработана технология. Технология сложная, результат на выходе зависит от массы всяких очевидных и не очень условий. По этой технологии стали выполняться работы. Раз работа, два работа, три, четыре, пять... Ой, говорит начальник. Вот эта пятая — дерьмово вышла, не так как надо. А как надо, спрашиваю я. А надо, как в условиях задачи, отвечает он.

Смотрю, проверяю. Задача сформулирована так же как и предыдущие. Технология отработана и не менялась. Все вроде в порядке. Но начальник недоволен. Ругается, фактически. Но из его ругани понять, что не так, не представляется возможным. Что-то не так и все тут. Так что же? Угадай. Вот тут и приходит на ум блондинка из анекдота.

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

Как лечить? Думаю, вполне подойдет научный подход, о котором недавно уже была цитата. Признать что мы чего-то не знаем и не понимаем; думать, анализировать; выдвигать теории; проверять теории практикой. Удачные теории брать на вооружение. Как-то так.

2012-04-12

О демократии

Наступил всемирный День советской космонавтики!
А как раз на днях я дочитал прекрасную книгу про прекрасного человека. «Какое ТЕБЕ дело до того, что думают другие?» Ричард Ф. Фейнман.
Значительную часть этой книги занимает повествование о том, как он, Ричард, работал в президентской комиссии по расследованию гибели шаттла.
Безусловно рекомендую книгу к прочтению, как и «Вы, конечно, шутите, мистер Фейнман!».

Приведу пассаж про научную правду и научную практику. Цитата:

На протяжении всех прошлых веков люди пытались постичь смысл жизни. Они осознали, что если бы нашим действиям можно было придать некоторое направление или смысл, то высвободились бы огромные человеческие силы. Таким образом, вопрос о смысле всего этого получал великое множество ответов. Но все эти ответы были бы абсолютно разными, и сторонники одного ответа с ужасом взирали на действия сторонников другого — с ужасом, потому что с той точки зрения, где мнения расходятся, все великие потенциальные возможности человечества направляются в ложный и узко ограниченный тупик. В действительности именно из истории невероятного ужаса, рожденной из ложного убеждения, философы осознали явно бесконечные и удивительные способности людей. Мечта — найти открытый канал.

Так в чем же, тогда, смысл всего этого? Что мы можем сказать, чтобы рассеять тайну существования?

Если учесть все — не только то, что знали древние, но и все, что знаем сегодня мы и что было неизвестно им — то, на мой взгляд, мы должны честно сознаться, что мы не знаем.

Но, признав это, мы, вероятно, обнаружили открытый канал.

Это не новая идея; это идея века разума. Это философия, которая руководила людьми, создавшими демократию, при которой мы живем. Идея о том, что, на самом деле, никто не знал, как управлять правительством, привела к идее о том, что мы должны организовать систему, посредством которой можно развивать, пробовать и, в случае необходимости, отбрасывать новые идеи, привносить другие, еще более новые: по методу проб и ошибок. Этот метод был результатом того, что наука показала себя как успешное предприятие еще в конце восемнадцатого века. Уже тогда социально настроенные люди понимали, что открытость возможностей являет собой возможность и что сомнение и обсуждение необходимы для продвижения в неизвестное. Если мы хотим решить проблему, которую никогда не решали раньше, то мы должны оставить дверь в неизвестное приоткрытой.

Конец цитаты.

Есть мнение, что демократия — это когда открыты возможности проверять теории практикой. Научно.

2012-04-11

Госуслуги, ГИБДД

Раз пошла такая пьянка, режь последний огурец.
Приблизительно такой у меня был внутренний посыл, когда, после успешного прохождения квеста «получи загранпаспорт используя портал госуслуг», я решился пройти еще один квест по получению госуслуг. А именно — я решил обменять свою древнюю драйверскую лицензию (удостоверение водителя) на новую, свежую. И непременно через портал госуслуг. А вдруг и здесь теперь все в шоколаде?

Следует отметить, у меня было отягчающее обстоятельство. Старое удостоверение у меня было очень старым, аж 1988 года! С тех пор ни разу не обновлял. Так что шансы на успех, по моим логическим умозаключениям, были невелики. Как я полагал (да и в интернетах местами утверждали), придется сдавать экзамены, что меня никак не устраивало. Но я решил попробовать — а вдруг срастется?

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

Итак, отчет: как я менял старые «права» на новые. Через портал госуслуг. В начале апреля 2012 года.

Сначала все очевидно, на портале я нашел эту «замену водительского удостоверения» и начал читать, что понаписано в сопроводиловке. Там много всякого, но ключевые сведения такие: список требуемых документов и куда, собственно, их нести. Список документов короткий:
1. паспорт с московской регистрацией (я же в Москве, да);
2. старое водительское удостоверение;
3. медицинская справка нового образца;
4. квитанция о оплате госпошлины в 800 руб.

Следовательно, медсправку и квитанцию надо раздобыть. С медсправкой все достаточно просто — где только их сейчас не делают. Мне медсправка стоила 1500 рублей (порядка того, точно не помню) и 10 минут времени. Контору нашел через Интернет такую, чтобы легко было до них добраться. Очень удобно — ты башляешь, они и фотку сделают и справку нарисуют со всеми наркологами и прочими психиатрами. Собственно, потому и относительно дорого, что они все сами сделали.
Заодно и снабдили копиями лицензий на свою медицинскую деятельность. Сказали, что могут пригодится. Хорошая контора. Хотя я, как настоящий гражданин, должен бы на них настучать, ибо справки они рисуют без медосмотра.

С квитанцией было сложнее (бред, но это так). Как и в случае с загранпаспортом, на портале госуслуг нет ничего похожего на оплату или хоть распечатку платежки. В интернетах реквизиты или форму платежки найти можно, но кто даст гарантию, что деньги пойдут куда надо? Похоже, единственный надежный вариант — ехать в то отделение ГИБДД, куда буду сдавать документы и там брать платежку (или фотать со стенда реквизиты). Но мы не ищем легких путей - я рискнул взять платежку отсюда (avtodoki.ru/receipts/msk) и оплатил ее в Сбербанке. Получилось удачно. Уже потом я узнал, что принимаются только Сбербанковские квитанции.
Кстати, часто пишут, что оплатить пошлину можно через некий терминал, расположенный в отделении ГИБДД — не верьте. Не в каждом отделении есть такой терминал, а где есть — не всегда работает. В том отделении, куда я поехал, терминала нет.

На самом деле, оплата пошлины была предпоследним шагом. До того я две недели пытался заполнить заявление-анкету на портале госуслуг. Не знаю, то ли смеяться, то ли плакать, но при ежедневных попытках я получал один и тот же результат — сообщение вроде такого (не буквально но по смыслу): «простите за неудобство, портал не может обработать запрос». После первой пары попыток я накатал сообщение в суппорт, они ответили, что работают над проблемой. Больше от них я ничего не слышал. Так или иначе, но через две недели после старта, в один прекрасный день, мое заявление портал принял. В качестве результата я получил два документа для распечатки: копию заполненной анкеты/заявления и некий «электронный билет» где было высечено: номер билета, время посещения, адрес посещения. Причем время и адрес я выбрал сам при заполнении анкеты.

Что любопытно — процедура подачи заявления через портал предусматривает ответ от сотрудника ведомства (в данном случае — ГИБДД). В случае с загранпаспортом все отработало четко. А вот ГИБДД никак не прореагировало на заявление. После выдачи мне копии анкеты и «билета» никаких сообщений мне больше не приходило.

Ну не хотят со мной общаться, им же хуже, подумал я и поехал в выбранное время по выбранному адресу. Отделение (Москва, Нагатинская ул., 27, корп. 2) я выбрал недалеко от метро, чтобы удобнее, ибо с недавних пор разрешено обращаться в любое отделение а не по месту регистрации. Правда, что забавно, получилось так, что это отделение и есть «по месту регистрации».

Приехал, зашел в контору, а там... две небольших комнаты, человек 40 народу и душно; 5 окошек из которых два работают, два тоже работают но никому не нужны и одно закрыто. На замену «прав» работает только одно окно и в него очередь человек в 20.

До окна я дошел только через два часа — приемщица документов работает очень неторопливо. Она не требует ксерокопий медсправки — копии она делает сама, для чего не торопясь поднимается, идет в другой конец комнаты к копиру, делает копию, возвращается. Потом одним-двумя пальцами вбивает паспортные данные в компьютер. Потом печатает, дает мне на подпись (челу передо мной перепутала дату рождения). Сюда надо добавить неторопливое изучение поданных мною документов и перебивку их в компьютер. А еще ее отвлекают рядом находящиеся сотрудники (или сама отвлекается). Еще и вопросы задает. В общем, процесс творческий, неторопливый. Ее задача не просто принять документы а принять решение — годятся ли твои документы для дальнейшего движения.

Как ни странно, мои документы оказались абсолютно годны. Я не знаю, зачем нужно чего-то делать на портале госуслуг, потому как ни мимо очереди пройти, ни заранее анкету заполнить ни чего-либо еще сделать невозможно. Факт — обратившись к порталу госуслуг для замены водительского удостоверения я только время потерял. Мог бы на две недели раньше заехать в отделение и точно так же подать документы на замену. Реально понадобились: старые «права», медсправка, паспорт, квитанция из Сбербанка о уплате пошлины. Всё. Сгенерированные порталом доки мне вернули с видом глубокого непонимания — что это я им принес.

После того как мои документы приняли, я еще час просидел в соседней комнате, ожидая команды (через динамики) «имярек — на фото». После чего зашел в комнатку с табличкой «Фото», где меня тут же сфотали и тут же при мне изготовили карточку удостоверения. Свободен.

Кстати, фото на новых «правах» вышло на редкость удачно. Я теперь знаю рецепт, как грамотно сфотаться на документы — предварительно надо три часа промариноваться в очереди.

Итого, выводы.
На данный момент портал госуслуг нах не нужен для замены водительских удостоверений. Процедура приема документов совершенно не оптимизирована (до 10 минут на человека — это отвратительно). Удостоверение меняется за один заход в ГИБДД, если появиться там задолго до конца их рабочего дня. Старые (еще советские) удостоверения меняют на раз и без экзаменов. Пошлину платить надо через Сбербанк по актуальным реквизитам (надежнее узнать реквизиты в самом отделении ГИБДД), но если повезет, можно скачать форму платежки с тырнетов. Медсправка нужна — оригинал, копию лучше сделать, но если очень не хочется, то можно и не делать. Смотрите сами, цена вопроса — два часа в очереди.

Что порадовало — народ в очередях. Спокойный, доброжелательный, цивилизованный. Добавить чуть увеличенное «личное пространство» и будет совсем как в развитых странах.

Уфф, вроде обо всем написал, ничего не забыл. Квест пройден успешно, на ближайшие 10 лет о подобном можно забыть.

Сцылки:

2012-04-10

Экранные клавиатуры

На тот случай, если под рукой нет привычных кнопок, а набрать текст надо. Или если надо на вражеском компе набрать секретный код/текст (кейлоггеры делают не просто так). Или если на клаве стерлись (не видны, не установлены) русские буковки. Да мало ли, короче — экранные клавиатуры / screen keyboards, маленькая подборка:


2012-04-09

Maximized window

Было дело, искал я как в Tkinter развернуть окно на весь экран, программно. В итоге, не найдя встроенных средств, сделал костыль в виде отправки окну сообщения SC_MAXIMIZE. И хотя работает такой костыль только в MS Windows, я тогда на этом и успокоился. Но мир не без добрых людей, не прошло и года, как нашлось нормальное решение, безкостыльное.

Если вкратце, то для винды максимизированное окно делается так:

from Tkinter import *
gui = Tk()
gui.state('zoomed')
И замечено, что на ожидаемое поведение могут влиять такие методы
#gui.overrideredirect(True)
#gui.iconify() # affects zoomed

Кроссплатформенный развернутый пример приведен на форуме, вот ключевой кусок оттуда
from Tkinter import *
root = Tk()
...
if sys.platform != 'linux2':
    root.wm_state('zoomed')
else:
    root.wm_attributes('-zoomed', True)

Я знал, что должно быть нечто эдакое, да искал плохо, очевидно. Да ладно, все что ни делается, все к лучшему. И решение в итоге нашлось, и, пока я делал свой костыль, набрался сеансу сведений о работе с виндовой очередью сообщений.


2012-04-07

CartoDB

Вчера упомянул толкового хостера ГИС услуг, MapBox. А сегодня ему нашлась пара. CartoDB — тоже хостер, тоже предоставляет ГИС услуги. Похож на MapBox ключевыми идеями — в основе опенсорцные продукты, продаются услуги хостинга и подготовки картографических данных и приложений. Есть тарифные планы для «попробовать», бесплатно.

Отличие же в том, что CartoDB сделал своей ключевой фишкой работу с табличными данными, опираясь на мощу PostGIS. Смотрите сами.


PostGIS 2.0 – This long-anticipated major version of PostGIS was announced with advanced features such as raster, topology, and 3D/4D indexing.


2012-04-06

MapBox

Пример толкового ГИС сервиса — MapBox. Предприимчивые ребята взяли опенсорцные кирпичики, добавили своего «клея» и продают хостинг «красивых карт». У них подложки и слои. У них аппликуха для оформления кастомных карт. У них API для создания ГИС аппликух. Берете все это, делаете карту, публикуете на их хостинге... профит. Уж им-то точно :)
Красота.

MapBox has been winning a lot of high-profile converts lately, such as Foursquare. In my opinion, it’s one of the more perfect web mapping solutions, commercial or open-source, to come along in a while. The combination of cartographic engine (Mapnik), tile generation (TileMill) and storage (MBTiles) make MapBox one of the most elegant ways to serve beautiful maps currently available.



The SlashMaps for MapBox module allows you to integrate MapBox's fast and flexible map hosting into your Drupal site. The module creates a /maps page listing all the maps from your MapBox account with a thumbnail preview. Each map page includes a pre-generated embedded map. The module is a one step install and provides the everything you need to fully integrate maps from MapBox into your site.



We have released a new module that drives our FCC.gov/maps page.  Often referred to as open sourcing our code, we are excited to release this for wider audience use and enhancements.


Всем бы госструктурам так — наваяли полезняшку, опенсорцнули.

2012-04-05

+ISO -CD

Вещь, которую просто необходимо положить в «тревожный чемоданчик» каждого админа и эникейщика — Zalman ZM-VE300 или VE200. Я себе купил такую.

Это бокс для переносного HDD, но не простой бокс, а хитрый. Он умеет прикидываться приводом компактных дисков. На коробке есть трехпозиционный джойстик и экранчик. Через это дело можно выбрать любой из предварительно складированных *.ISO файлов и смонтировать его в «привод». Комп увидит CD. Хотите — вирусы гоняйте, хотите — систему устанавливайте. Что хотите, то и делайте. Вещь!

Даже биос можно прошить, если грамотно сделать исошник. Например, так:

1. Качаем образ загрузочной дискетки с DOS. Например http://www.fdos.org/bootdisks/
$ wget http://www.fdos.org/bootdisks/autogen/FDSTD.144.gz
2. Распаковываем (если надо) и монтируем этот образ
$ gunzip FDSTD.144.gz
$ mkdir mnt
$ sudo mount -o loop FDSTD.144 mnt
3. Добавляет нужные утилитки и размонтируем образ
$ sudo cp AFUDOS.exe P5P80014.ROM mnt
$ sudo umount mnt
4. Генерируем загрузочный образ для CD
$ genisoimage -o fdos-boot.iso -b FDSTD.144 FDSTD.144


Или как здесь нарисовано:

This is intended to help all of those wanting a simple method to create a bootable DOS CD-ROM to run a particular DOS program. Note: It is intended for 386 or higher systems (due to CD-ROM drivers). Included is a FreeDOS boot disk image, ISOLINUX, and the the framework to generate ISO images. (A zip compressed 360KB FreeDOS diskette image is provided by default, however the files including BFI (Win32 only) are also included to allow customization if needed.)
To create a bootable CD-ROM, just add your files, edit the CD's volume, and startup file, run included MAKEISO.BAT, and then burn the generated FDOEM.ISO using your normal CD Writing program. Please make sure you distribute
FDOEMCD.source.zip with the ISO image you distribute.
See README.TXT for details, in particular the QUICK USAGE Appendix.
Last modified Sunday February 13, 2005.
FDOEMCD.builder.zip - The framework (needed), 548KB
FDOEMCD.source.zip - Redistributable source (only needed if you intend to redistribute your ISO image or physical CD-ROM) for included FreeDOS and other programs, 1874KB
FDOEMCD.source-tools.zip - Source for programs used to build the ISO image, but not distributed with it (only needed if you intend to redistribute FDOEMCD.builder.zip), 2887KB


Круглые, блестящие, пластиковые, CD из прошлого века — прощайте.

2012-04-04

Пусть сами жрут спам

Есть спрос — есть предложение.
Масса сервисов хочет поиметь наши контакты, чтобы потом пулять в нас рекламой. Есть человеки, которые не хотят, чтобы их засыпали спамом только потому, что они воспользовались теми или иными услугами. Один из этих людей создал Mailinator.

Mailinator is fundamentally quite different from other services. Other services like Gmail or Yahoo allow you to actually send email. You cannot send email from Mailinator. After several hours, all email is auto-deleted. A Mailinator email inbox can be read by anyone. There is no real security here. Mailinator has strict rules about what kind of email it receives. Plain text is best, html is filtered. Images, attachments, and fancy stuff are simply stripped away.
The upside is that Mailinator requires no sign-up. Send email to a name, and the account is created automagically.


Пользоваться им проще пареной свеклы. Допустим, некто требует от вас адрес электропочты, чтобы предоставить некую услугу, а свой ящик светить лишний раз не хочется. Можно, конечно, зарегить еще один ящик в гугеле, мейл.ру или прочих яндексах, если не влом. А если влом, можно просто указать ящик типа vasnake@mailinator.com, и это всё, что нужно сделать! Имя любое, доменов, кроме mailinator, тоже немеряно (см. на главной странице). Пусть шлют на этот адрес, чего хотят. Чтобы посмотреть на присланное, достаточно зайти по сцылке
где видно содержимое ящика.

Вот и вся процедура. Чего уж проще. Конечно, есть оборотная сторона. Любой из миллиардов подключенных к Интернет может с той же легкостью посмотреть содержимое этого ящика. Это надо четко понимать, перед тем как пользоваться мейлинатором.


Особо интересно почитать рассказ автора о его детище

Almost 3.5 years ago I started the Mailinator(tm) service. I got the bulk of the idea from my drunk roommate at the time and the first incarnation took me all of about 3 days to code up. In some senses it was a crazy idea. I imagine many people came up with a similar idea before - make a web-based email service that allowed any incoming email to create an inbox. No sign-up. No personal information. Send email first, check email later.


2012-04-03

Память

Все бывает в первый раз.
Сегодня, впервые с момента моего знакомства в WinRAR, он меня удивил. Я эту замечательную программу знаю только с хорошей стороны, пользуюсь практически ежедневно, и вот, на тебе.
Эта программа отказалась создавать архив, мотивируя тем, что, цитирую «не хватает памяти». Впервые с момента нашего знакомства WinRAR стал очевидно дурковать — у компа 10 гигов оперативы и более 50 гигов свободного места на диске. Ни и разумеется, это случилось тогда, когда промедление смерти подобно, как и бывает в таких случаях. Не только удивил, но и очень, очень он меня огорчил.

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

Теория такая. Те два раза, что WinRAR жаловался на недостаток памяти, я вызывал функцию создания архива через контекстное меню WinExplorer. А тот раз, когда он отработал как положено, функция была вызвана через тулбар родной WinRAR-ской оболочки. Что приводит меня к следующей мысли — памяти не хватало WinExplorer-у, поскольку обработчики контекстного меню обычно реализованы как DLL-ки, работающие в адресном пространстве оболочки. Это, кстати, одна из основных причин падений этой оболочки и, как следствие, недовольства пользователей. И недовольны они обычно виндой а не кривыми поделками, лепящими свои обработчики в контекстные меню WinExplorer. Отвлекся, простите.
Так вот, при создании архива с помощью полноценной программы — WinRAR.exe никаких особых ограничений быть не должно — памяти бери сколько есть в свопе. Что я и наблюдал — памяти хватило всем и еще осталось.

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

Мораль: остерегайтесь поручать серьезную работу обработчикам контекстных меню. Вызывайте обрабатывающий процесс через командную строку, это самое надежное. Да и самое удобное, если работа повторяется.

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) Java (22) humor (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Manager (15) web-browser (15) Никонов (15) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) Klaipeda (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) купи/продай (9) Photo (8) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) serialization (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)