вторник, 28 июня 2011 г.

Что бы я делал, если бы у меня был миллион или больше

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

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

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

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

Давайте посчитаем. Например, у меня есть $1,000,000. Будем считать, что месячная зарплата любого моего сотрудника $5,000 в месяц. Я набрал в команду следующих людей:

  • Сисадмина, который настраивает сервера для наших серверных приложений
  • Художника, рисующего всякие красивые штуки
  • Дизайнера, который умеет делать понятные интерфейсы и приятные шаблоны
  • Верстальщика, который делает совсем некроссбраузерную вёрстку и идеально верстает только для текущей версии Google Chrome, немного знаком с js
  • Программиста, который хорошо владеет javascript и ActionScript3
  • Программиста, который умеет делать не особо сложные django-проекты, а так же приглядывается к Erlang'у
  • Программиста, который имеет бороду и пишет на С++ хорошо работающие программы под Windows, Linux и Mac
  • Меня, как наблюдающего, помогающего и указывающего
8 человек включая меня (я тоже сотрудник, да). Произведём нехитрые калькуляции:
>>> 1000000 / (5000 * 8) # все эти люди вместе кушают $40k в месяц :)
25
Хотя можно давать им и по $2k. На просторах СНГ этого вполне будет хватать, учитывая то, что средняя зарплата ниже в несколько раз.

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

На одном из уровней игры Portal 2 диктор говорил что-то типа «на самом деле мы просто кидаем наукой в стенку и смотрим, что прилипло». Я хочу делать то же самое, но с разработкой ПО. Реализовывать идеи, которые приходят мне, либо моей команде в голову, насколько безумыми они бы не казались. Главное, чтобы они были хоть немного адекватными.

Хотя скоро я начну реализовывать эти идеи. Сразу же после spawnfest'а. А так же во время его, хехе.

И пусть даже у меня пока нет миллиона, у меня много амбиций, самоуверенности и глупости. Пожелайте мне удачи ;)

четверг, 23 июня 2011 г.

Рекламный движок с биржевым ценообразованием

Бутылк.Ус поделился своей идеей стёбного рекламного движка. Ну и мне пришла забавная идея, тоже по ценообразованию стоимости рекламы. Для того, чтобы понять, о чём я говорю, вам нужно хотя-бы представлять, как работает биржа.

Суть.

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

И вот смотрите. Рекламное место в месяц приносит какое-то количество показов, которые нам нужно продавать заранее, т.к. если на месте не окажется рекламы, то этот показ бесполезен, для конечного рекламодателя. Т.е. мы, как владелец площадки производим некий скоропортящийся продукт, который, тем не менее можем продавать.

Почему бы не устроить продажу этого товара в виде биржи? Например, смотря на своё среднее кол-во показов рекламной строки Daos я вижу, что 1 мой показ стоит 4 копейки. Я захожу в админку, настраиваю продажу показов блоками по 100 штук, и выставляю на биржу 100 блоков (т.е. 10 тысяч показов) по разным ценам, начиная от 4 рублей за 100 показов и заканчивая 10 рублями за сотню:

10.00 50
07.00 25
05.00 15
04.00 10

Рекламодатель, зайдя на страницу системы может сразу же купить 25 сотен показов по 4 рубля за сотню (итого 100 рублей за 2500 показов), либо их плюс ещё сколько-нибудь по 5 рублей и так далее.

Но, если рекламодателя цена не устраивает и он не готов заплатить столько, то он может предложить свою цену. Вместе с другими предложениями может выйти так:

10.00 50
07.00 25
05.00 15
04.00 10
03.50 20
03.00 25
02.00 75
01.00 100

Владелец площадки же может продать некое кол-во блоков по цене, установленной рекламодателем, если никто не хочет покупать показы по установленной им цене.

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

Таким образом цена может понижаться (если владелец площадки продаёт показы по установленной рекламодателями цене), либо повышаться (если рекламодатель сам выкупает показы, предложенные веб-мастером).

CUBRID it! Programming Contest

Узнал с Хабра о одном конкурсе. Призы мне понравились, фотоаппарат бы не помешал :). Хотя особо не рассчитывая на победу я особо не заморачивался и решил всё банально и просто.

Сначала я хотел реализовывать свой алгоритм на PHP, но, к сожалению, PHP-модуль CUBRID не хотел устанавливаться. Поэтому я решил использовать Java. Хотя я писал на этом языке всего 2 раза в жизни, это не было особой проблемой.

Итак, задание следующее:
Given all the tables in a database (but only the user tables, not also the system tables), determine:
  • The value which occurs the most times.
  • The number of occurrences for the value found above.
Т.е. нам нужно глянуть все таблицы в базе данных и определить наиболее часто повторяющееся значение.

Я тестировал своё приложение на базе данных demodb, которая поставляется вместе с CUBRID'ом.

Итак, я немного подумав, понял, для того, чтобы найти повторяющийся элемент в столбце мы можем использовать group by statement. Для подсчёта количества повторов же — метод агрегации sum.

Выглядит мой запрос следующим образом:
select nation_code,sum(1) as "cnt" from "athlete" group by nation_code order by "cnt" desc;
Теперь нужно выполнить ещё одно условие задания:
...and it is “non-numeric”! (“non-numeric” means that the respective value does not contain only digits – it must contain at least one non-digit character; for example, “1298” is “numeric”, but “12,98” is “non-numeric” ( and also “12.98” ), because it contains the “,” character ; same goes for “-100” – it is considered “non-numeric” as well, because of the “-” sign).
Столбцы могут быть разных типов, поэтому приведём их к типу varchar(255):
select cast(nation_code as VARCHAR(255)),sum(1) as "cnt" from "athlete" group by nation_code order by "cnt" desc;
Теперь нам нужно проверить, есть ли в приведённой строке символы, отличные от цифр. К сожалению, в CUBRID LIKE "%[^0-9]%" не работает. Поэтому мне пришлось искать другой путь сделать это.

В итоге я нашёл функцию TRANSLATE, которая может заменять одни символы в строке на другие. Недолго думая я сделал вот так:
where TRANSLATE(cast(nation_code as VARCHAR(255)), '0123456789','') <> ''
Т.е. сначала любая цифра заменяется на ничего, а затем сравниваем оставшуюся строку. Если она пуста — значит там были только цифры.

Ну и дело остаётся за малым: нужно получить список таблиц в базе данных и узнать какие у неё есть столбцы. Потом по имени столбца и имени таблицы собираем нужный для него запрос и объединяем в цикле с другими запросами при помощи UNION. Полученный громадный запрос нужно немного обработать, сгруппировать значения и ещё раз всё пересчитать:
select t,sum(cnt) as "sum_cnt" from (%s) as rulexec_tbl group by t order by sum_cnt desc;
Где t у меня — столбец значений, cnt — столбец кол-ва "попаданий", %s — громадный запрос.

Затем берём верхний результат, можем проверить его ещё раз, точно ли он не полностью состоит из цифр и записываем результат в таблицу ответов. Done.

Правда есть одна проблема в моём алгоритме. Он не корректно обрабатывает float-тип, который представлен как 0.0e0. Надеюсь такого западла там не будет :).

На моём довольно слабом ноутбуке (1.2 Ghz процессор, 2 Gb оперативки) программа проходится по тестовой базе данных за 5 секунд.

среда, 22 июня 2011 г.

Daos будет удалён

Когда все текущие строки станут старше 38 дней, строки вместе с движком Daos будут удалены.

Спасибо.

воскресенье, 19 июня 2011 г.

Создал аккаунт на stackoverflow

Собственно в теме всё написано :). Меня там можно найти под ником... Rulexec.

Буду пробовать отвечать на вопросы всякие, проверять свои навыки, изучать английский. Вот.

воскресенье, 5 июня 2011 г.

концепт p2p-альтернативы простоплееру

Мне нравится иногда под настроение слушать музыку, думаю всем нравится, а тем кому не нравится, тот просто не нашёл свой стиль. И я слушал её на одном сервисе, именуемом prostopleer.ru (по ссылке мой скромный старый плейлист, я его уже давно не обновлял).

Потом, что естественно, разработчики захотели есть, я бы тоже захотел, с таким то сервисом. Поддержание такой архитектуры требует много сил и денег. Однако я лишь школьник (уже закончил), да и денег лишних совсем нет. Ну а зарабатывать я так и не научился. Ленюсь просто сильно.

Я просто положил в отдельную папку на Dropbox всю музыку, благо у меня её совсем чуть-чуть и забил.

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

Можно даже не встраивать в это приложение плеер, просто сделать его эдаким локальным стриминг-сервером, к которому можно было бы подключиться AIMP'ом, или другим плеером. Много чего можно сделать, вообще.

Я был бы рад, если я, либо не я сделаю это, это же точно круто :). А главное бесплатно, свободно и никто не сможет украсть сервера с «нелегальной» музыкой.

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

Всё чаще задумываюсь о зашифрованных распределённых системах, наверное ситуация в Беларуси на меня так влияет, эхх.

среда, 1 июня 2011 г.

Я хочу придумать велосипед

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

Но иногда таки находятся минуты/часы, чтобы заняться чем-нибудь полезным, хотя хочется только отдыхать и вообще ничего не делать. Я чуточку сломал свой jvisor, поломав колонки и вообще. Но теперь все проекты хранятся в виде xml-файлика, из которого я генерирую html (не каждый раз, когда вы обращаетесь к index.html, нет, только один раз). Я немного усложнил этим себе жизнь, т.к. раньше требовалось только переделать один html файл, а теперь нужно переделать xml файл, а потом ещё и кнопку в админке нажать, ох. Но как-нибудь я себя пересилю и сделаю редактирование прямо из админки.

Ну а теперь о главном. По поводу erlstar я думаю забить, ну их нафиг. «Искра» прошла, уже не особо интересен этот проект. Но, как видите, в самом конце есть странный проектик, который является языком программирования. Я довольно много программирую, а до сих пор не написал собственный компилятор/интерпретатор, чтобы прочувствовать всю эту кухню со всех сторон.

ЯП у меня будет не совсем обычный. У переменных не будет имён, не будет классов, переменную вообще нельзя будет создать «из воздуха». Я даже не знаю, как объяснить мою задумку.

Вот, например, нам нужно найти сумму двух цифр, в обычном языке программирования мы бы сделали что-нибудь типа 1 + 2 или summ(1,2). У меня же нужно будет здорово поизвращаться и знать обратную польскую нотацию:
1,2,+ -> math.
Данная запись у меня обозначает, что аргументы 1, 2 и + передаются в функцию math. Функция возвращает результат, мы можем его вывести на экран, например, так:
1,2,+ -> math -> io:print.
Суть моего языка в том, что каждая функция что-то получает, работает с этим и возвращает новые данные, которые поступают в другую функцию. Ну и так же есть своя "фишка". Есть функция chain:branch, которая «разветвляет» программу. Получается так, что у нас становится сразу несколько цепочек, которые обязательно потом сходятся в одном месте и работа продолжается.

Сложно словами описать, я лучше потом примеры приведу.