Категория: Компьютеры

Заметки о программировании и на околокомпьютерные темы

Вложенные категории: Игры, Delphi

Биткоины

Прочитав кучу историй на реддите, я теперь убеждён, что биткоины – самое быстро дорожающее средство где-нибудь ошибиться и потерять все свои деньги :)

У человека был brainwallet (кошелёк, который генерируется из одной фразы). Он вбил пароль, скачал кошелёк, перевёл из него 12 коинов кому-то, а файлы затем удалил. Потерял 88 биткоинов: транзакции в BTC совершаются с блоками, и в его случае блок был 100 коинов. Сдача в 88 коинов ради безопасности идёт на новый адрес, приватный ключ к которому создаётся в файле кошелька. Который был удалён.

Другой человек знал об этой проблеме и заранее создал 100 адресов для сдачи. Приватные ключи ко всем забэкапил, кошелёк зашифровал. В какой-то момент гипс снимают, клиент уезжает, кошелёк полетел и ему нужны данные из бэкапа, он лезет туда, и выясняется, что в момент шифрования кошелёк заново генерирует ключи для сдачи. То есть, сохранённые ключи недействительны.

Третья история вообще грустная. Человек решил купить наушники на крейгслисте. Нашёл продавца в своём районе, договорились встретиться, купить за наличку, и тут он видит у него внизу подписано “также принимаю биткоины”. Решает купить за них.
Приходят в кафе, садятся, продавец даёт наушники посмотреть, человек доволен, спрашивает адрес кошелька, переводит на него 80 баксов (0.8 биткоина). Как только сеть подтверждает транзакцию, продавец встаёт, забирает наушники и идёт к выходу.
“Стой, а наушники?”
“Моя цена – $80, не хочешь платить – не надо.”
“Ах ты… Я в полицию обращусь!” – хочет сказать покупатель, и тут понимает. Что записали камеры наблюдения? Двое пришли, сели, один дал другому посмотреть наушники, потом забрал и ушёл. 80 баксов? Какие 80 баксов? “Товарищ полицейский, я заплатил ему 0.8 виртуальных монет, за которые не отвечает ни одно государство и ни одна фирма”?
Ну хорошо, пусть полицейский готов поверить в виртуальные монеты. Где доказательства, что эти монеты были уплочены? “Вот, я перевёл их на адрес 1b3674e8cd…” – “А это правда его адрес?” И ничего не докажешь, сеть же анонимная.

HOWTO: Add your own feed reader to Opera’s default list

By default, when you click on an RSS feed icon, Opera displays feed contents in some basic format and allows you to subscribe to it with either the built-in reader or some of the popular ones.

But with the recent end of life of Google Reader many will switch to other, less popular readers, or perhaps even install one on their own server.

To add a feed reader to Opera's default reader list, edit feedreaders.ini in "Program Files\Opera\defaults" folder. The format is obvious. There doesn't seem to be an option for a per-user feed reader list.

For instance, if you're using Tiny Tiny RSS, the subscription URL is per faq:

http://your.domain.com/path-to-ttrss/public.php?op=subscribe&feed_url=%s

The code to add to feedreaders.ini will be:

[TinyRSS]
ID=20
URL=http://your.domain.com/path-to-ttrss/public.php?op=subscribe&feed_url=%s

О ненадёжности сервисов в интернете и о собственном сервере

В последнее время от программ, которые хранят файлы на локальном компьютере, все понемногу переходят к т.н. “облачным сервисам”, когда данные хранятся в интернет и доступны отовсюду через браузер. С одной стороны, это удобно – за каждым компьютером работаешь как за домашним, всё под рукой. С другой стороны, смерть Google Reader ещё раз напомнила, что даже крупная всеми любимая компания не обязательно будет хранить наши файлы вечно.

А это значит – нет ощущения надёжности. Файлами на своём компьютере я могу распоряжаться как захочу: захочется – так и всю жизнь буду хранить. А в интернете всё устаревает и удаляется. Хостеры картинок закрываются, удаляют картинки, к которым не было обращений месяц, сервисы сворачиваются, прогорают. Блоги закрываются, их содержимое остаётся только в моих фидах в Google Reader, потом закрывается сам ридер, и содержимое теряется навсегда – его даже скачать неоткуда.

Мне это не нравится. Я люблю настроить один раз – и чтобы работало столько, сколько мне нужно.

И вот что я думаю. Любой хороший сервис должен поставляться не в виде “одного сайта на всех”, а как веб-движок. Чтобы любой мог установить его на свой сервер и пользоваться – хоть один, хоть с товарищами. Вот какими должны быть приложения будущего.

  • Отличный пример – Википедия. Хотя у неё существует “главный сайт”, но любой может скачать исходный код, запустить на своём личном сервере и держать его там, пока не надоест.
  • Другой отличный пример – WordPress. Сайт Diary.ru, на котором я пишу эти строки, однажды закроется или благодаря дурацким решениям станет неудобным – например, знали вы, что теперь u-mail за прошлый год нельзя прочесть, нужно заказывать его возврат из архива? Однажды так будет и с записями. Но копия моего блога у меня на сайте будет доступна столько, сколько я захочу.
  • Третий отличный пример – системы контроля версий: свн, меркуриал, гит. Да, полно сайтов, которые предоставляют хостинг для СВН, но если такой сайт однажды закроется – не составляет никаких проблем поднять сервер меркуриала у себя на хостинге и закачать всю историю разработки программы туда. Вы ничего не потеряете.

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

Например, нужен открытый движок наподобие Google Reader. Очень нужен сервер синхронизации вроде Dropbox или, ещё лучше, SpiderOak (с шифрованием). Нужно взять за правило никогда не хостить картинки на стороне, даже на удобном imgur, а всегда класть их на своём сервере. Нужны стандарты предоставления профиля и обмена друзяшечками (кажется, это кто-то разрабатывал), чтобы вбив свой сайт и введя пароль в сотовом телефоне, можно было оттуда, а не из фейсбука или вконтакта, получить список своих друзей с их телефонами и свежими аватарками.

Вот над чем надо работать, а появлению новых фич в Google Plus я отныне официально прекращаю радоваться. Долой централизацию, даёшь личные сервера.

UPD. Вот самая полная статья, перечисляющая замены Гугл-ридеру. В том числе несколько движков для установки на собственном сервере.
Пока установил себе Tiny Tiny RSS, импортировал туда фиды из гугла без проблем. Посмотрим, насколько с ним удобно. Очень хорошо, что движков несколько – за оставшиеся пару месяцев можно будет выбрать лучший, с которым потом жить.

Гугл закрывает Google Reader.

У меня только одна реакция:
“What the fuck? Why?”

“Бла-бла им пользуется слишком мало людей. Сложно поддерживать”.

1. Мало? Посмотрите, какой поднялся шум.
2. Офигительно сложно поддерживать продукт, в котором ничего не меняют уже несколько лет и который ни с чем не связан. Работает себе и работает.
3. И как же “свободная и открытая инфраструктура”, а, Гугл? Мало людей пользуются RSS – отлично, так мы его вообще похороним. Пусть через Фейсбук новости смотрят, там всё свободно и открыто.

Ад и отчаяние.

Петиция не закрывать ридер, на которую никто не обратит внимания.
Лучшие альтернативы Google Reader, которые всё равно уже будут не такими удобными.

RIP Opera. Your html rendering was too beautiful for this world.

Опера отказывается от движка Престо, переходит на Вебкит (движок Хром), и по слухам, не только на движок, а вообще на сборку Хромиум в другом скине, вот и всё.

Все существующие расширения продолжат работать, сообщает Opera Software, они будут автоматически конвертированы. Слово “конвертированы” выдаёт, насколько Опера перестанет быть Оперой. Если бы менялся только движок, не составляло бы труда добавить поддержку десятка нужных объектов, чтобы расширения работали как прежде. Но Опера, похоже, выпустит под старым названием совершенно посторонний браузер.

Мне тут говорили, что померла – и пофигу.

Вы, ламеры, пользующиеся медленным и неудобным Файрфоксом! Я же вас же теперь задолбаю жалобами на то, какое это изделие добра. Ни нормальных вкладок, ни боковых панелей, ни управляемых панелек Speed Dial. Как вы живёте без того, чтобы видеть на Speed Dial свою карму с различных сайтов? Как обходитесь без встроенного почтового клиента? На веб-интерфейс гмыла ходите, лол, как секретарши? В Фоксе, в расширяемом Фоксе, где “есть всё, что захочешь”, почтовый плагин всего один, и тот – огрызок по сравнению с M2, а ведь М2 никогда не казался таким уж функциональным.

А уж если сравнивать отзывчивость и лёгкость Оперы и тягучесть, непроворотливость Фокса – плакать хочется. На кого ты нас покидаешь, Опера? Где теперь взять такой браузер, который бы был удобным?

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

Про паскаль

Если считать, что паскаль вымирает, то вымирать он умудряется с огоньком. У нас есть Delphi, который при всех проблемах управления постоянно вводит крутые возможности в язык. Он компилируется под win-x32, win-x64 и маки. Есть FreePascal, которые поддерживает большую часть вводимых Дельфи фич и компилируется подо всё на свете, в том числе под linux-x32, linux-x64 и native-android (с помощью этой штуки компилятор FPC можно встроить в интерфейс дельфи, если не нравится Lazarus). И есть Oxygene, который компилируется под .NET, Android и iPhone, и тоже вводит в язык много крутого. (И в нём вместо VCL используются нативные формы каждой платформы, типа Windows Forms).

То есть, в общем-то, покрыта вся мыслимая разработка для локальных компилируемых языков. Кроме интерпретируемых языков, единственный язык с таким покрытием – это C/C++. И кстати, если пользоваться только паскалём уровня Delphi 7, стандартной библиотекой вместо винапи, и ограничиться консольным или сервисным приложением, то программу можно будет скомпилить на любом из этих компиляторов. Интересно, пробовал ли кто-нибудь?

Про регэксы

Регэксы – это офигенное средство, не только потому, что с их помощью легко записывать формат строки. Его легко преобразовывать и быстро парсить!

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

Но регэксы ужасны – стоит попытаться написать что-нибудь достаточно сложное, как выясняется, что:
– повторяющийся набор групп матчится только один раз
– наоборот, два одинаковых набора подряд матчатся как разные группы (следовало бы ожидать…)
– группам можно задать имена, но они должны быть уникальными (нафига тогда имена?)
– указать “если есть блок А, должен быть блок Б” крайне сложно, а уж “должен быть блок Б здесь либо чуть позже” вообще нельзя
И так далее.

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

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

Приватный hg-репозиторий в интернете

Задача: поднять для личного hg-репозитория постоянный (приватный) адрес в интернете.

Для публичных репозиториев это легко сделать на Google Code или github или SourceForge. Как быть, если кодом делиться не хочется?

UPD. Инструкция верна, но есть путь проще – см. в конце.

1. Регистрируемся на BitBucket (можно зайти через гугл-аккаунт). Подтверждаем почту, выбираем пароль для доступа к репозиториям.
BitBucket позволяет сделать сколько угодно частных репозиториев, но к каждому доступ не больше пяти человек. Бесплатно.

2. Запускаем командную строчку. Если меркуриал не в %PATH%, делаем cd C:\Program Files\TortoiseHg (например) и set PATH=%CD%;%PATH%.

3. Переходим в папку с репозиторием cd C:\Path\Repo и запускаем hg serve.

Приложение А. Если у компа нет постоянного адреса в интернете, регистрируйтесь на DynDNS и полученные логин с паролем засуньте в рутер – почти все рутеры сейчас умеют сами обновлять DynDNS.

4. Пробросьте порт 8000 на рутере на свой компьютер. Убедитесь, что http://your-pc-name:8000 открывается.

5. В BitBucket сделайте “Импорт репозитория” и укажите этот адрес. Подождите немного. Ура, репозиторий со всеми правками сдублирован на битбакет.

UPD. Как показал в комментариях korrshun, гораздо проще создать пустой репозиторий и сделать из домашнего туда push. Оказывается, в репозиторий меркуриала можно пушить сколько угодно независимых веток 0__0, то есть, можно в один репозиторий слить несколько.

Tell me what I’m going to use it for

For those who didn’t know, there’s a new pascal-based compiler on a market for a while, and a pretty cool one at that. Enter RemObjects Oxygene.

It’s Visual Studio-based, compiles to .NET, Android Java and iPhone Cocoa, resembles Pascal and implements the majority of its cool features like generics. Parts of language are redesigned, some for better, some for worse.

Cool feature. Even the main unit now has the interface/implementation sections.

namespace Application1;
interface
implementation
begin
  Console.WriteLine("The magic happens here.");
end.

Uncool feature. initialization/finalization sections are no more. I guess you can kinda replace them with class constructors, but they were so much better.

Anyway.

The language is indeed pretty fresh, with support even for WinRT while Delphi has yet to convince Microsoft to let everyone else have a part of the cake. Turns out, the only way to do native WinRT applications is through using Microsoft Visual C++ Runtime. Ha-ha, funny joke Microsoft, you.

So I thought about playing with it for a change.
No, I’m not betraying Delphi just yet. It’s still pretty cool, compiling to 64 bit and not being afraid of anything.

But sitting before the empty Oxygene project, I have found myself at loss at what to do.
Okay, it runs. It compiles Hello World, alright.
What next?

Turns out, when you encounter a new language, you have to have a few use cases for it. And since you usually don’t know what this langage can do, it’s better if someone suggests those for you.

Inc(i)

Все знают, что когда перебираешь null-terminated строки, то нужно останавливаться по нулю:

while pc^<>#00 do Inc(pc); //ищем конец строки

Все знают, что когда перебираешь дельфийские строки, нужно останавливаться, когда индекс превысит длину строки:

while (i<Length(s)) and (s[i]=' ') do Inc(i); //пропускаем пробелы

Все знают, что у дельфийских строк в конце всё равно ноль.

 74 00 65 00 73 00 74 00 00 00

Но не всем и не сразу приходит в голову, что длину дельфийской строки тоже часто можно не проверять!
Второй пример можно записать так:

while s[i]=' ' do Inc(i); //пропускаем пробелы

В конце строки ноль, а ноль – это не пробел, поэтому цикл сам собой прервётся.

Где надо быть осторожным – так это при промотке строки назад. В начале строки нуля нет:

while (i>0) and (s[i]=' ') do Dec(i); //пропускаем пробелы в обратную сторону