...

суббота, 26 апреля 2014 г.

DDoS любого сайта с использованием заметок Facebook


сегодня в 23:02


Полтора месяца назад, chr13 обнаружил способ произвести DDoS любого сайта с помощью Google Spreadsheet, а теперь же он применил такой способ в Facebook Notes. И он сработал!

Способ эксплуатации совершенно такой же, как и в Google Spreadsheet:



  1. Сделайте список «уникальных» «картинок»

    <img src=http://targetname/file?r=1></img>
    <img src=http://targetname/file?r=2></img>
    ...
    <img src=http://targetname/file?r=1000></img>


  2. Создайте заметку через m.facebook.com. Сервис обрежет заметку после какой-то фиксированной длины

  3. Создайте несколько таких заметок под одним или несколькими пользователями. Каждая заметка будет делать 1000+ HTTP-запросов

  4. Откройте все заметки одновременно. Указанный сервер получит гору HTTP-трафика. Тысячи запросов уйдут на сервер в течение пары секунд.



У автора получилось полностью загрузить гигабитный канал на своей VPS. В атаке было задействовано 127 серверов Facebook.

image


Facebook пометил проблему как «Won't fix».


Более подробная информация на сайте автора




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


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Дайджест интересных материалов из мира веб-разработки и IT за последнюю неделю №106 (20 — 26 апреля 2014)

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




Метки лучше разделять запятой. Например: общение, социальные сети, myspace.com, подростки, мердок


или закрыть

This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Создание медиаплощадки средствами Drupal. Задачи и обзор соответствующих модулей и библиотек

Следующая часть эпопеи по созданию медиаплощадки силами Drupal 7.

1. Задачи




Задачи, в общем-то, стоят перед проектом практически такие же, как, наверное, перед любой социалкой — обмен мнениями по тому или иному материалу, личная переписка, оценивание материала, организация мероприятий… ну и другие плюшки, раскрывать которые мне пока не хочется :) Самые базовые функции с соответствующими им модулями будут рассмотрены ниже.

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


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


Ну что ж, !


Разделим условно весь функционал на следующие «бифштексы»:



  1. статьи (персоналий, рецензии, описание проекта)

  2. аудио и видео (аудио- и видеозаписи, конкурсные материалы)

  3. мероприятия (события, конкурсы, фестивали, мастер-классы, открытые занятия)

  4. юзабилити (WYSIWYG, ЧПУ, навигация, гиды по сайту)


Повторюсь — деление условное.


Итак,


2. Модули


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

.


0. База



Кэп подсказывает, что для начала нам как бы нужен непосредственно архив с самим Drupal. Идём и качаем свежую версию. На момент написания статьи это 7.27. Сохраняем в отдельную папочку, которую Кэп создал специально для меня.




Дальше нам нужно дополнительно как минимум два модуля: Views и CCK. Несмотря на то, что оба модуля включены в ядро, понадобится более детальная работа с материалом, результата которой сложно добиться, не имея этих модулей. Собственно, скачиваем их с сайта Drupal. И не забываем про Token!


Лично я предпочёл включить модуль Update manager для более удобной установки модулей и тем.

NB: ещё не успел порядком изучить Drush, но знаю, что вещь полезнейшая. Осталось со временем перейти на него.


Далее идёт разбор списка согласно функционалу.


1. Статьи



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

Какая узловая точка в биографии? Правильно, даты. Топаем на сайт и смотрим на Date. Ага, есть, ставим.


Нам надо сделать так, чтобы в зависимости от того, как мы заполним «карточку» на персону, соответствующим образом формировался заголовок страницы. В этом нам неоценимую услугу окажет Automatic Nodetitles. Ставим.


Дополнительно ставим модуль Image, потому как он пригодится потом везде, где только можно.


Забегая вперёд, скажу, что нам понадобится Node Reference и References, от которого NR зависит. Позже объясню, зачем.


2. Аудио и видео



Здесь всё-таки я остановился на модуле Media. Не забываем поставить зависимости: Chaos Tools и File Entity.

Если с воспроизведением видео всё более или менее понятно, то с аудио несколько сложнее. Случайно наткнулся на интересную библиотеку SoundManager 2. Удобно, стильно, CSS-но. Забираем. К счастью, для библиотеки есть соответствующий модуль — SoundManager2. Ставим.

На всякий случай ставим себе Libraries API — пригодится.


У нас сеть социальная, поэтому мы хотим, чтобы нам дали право голоса! Хорошо, идём и ставим эти модули: Voting API, Fivestar и Vote Up/Down.


3. Мероприятия



Едем дальше. Нам надо сделать так, чтобы у пользователей была возможность посещать/подписываться на какие-либо мероприятия. Для этого хорошо подойдёт модуль Entity Registration — нам, как правило, нужно знать, кто идёт и сколько всего участников. Ставим.

Возможно, организаторы захотят прикрепить ссылку на страницу мероприятия на том же Timepad, например. Что ж, дадим им такую возможность. Идём и ставим себе модуль Link.


4. Юзабилити



Дабы не обременять пользователей изучением HTML-тегов (поверьте, не у всех музыкантов есть на это время), позволим им воспользоваться каким-нибудь WYSIWYG-редактором. Неважно, что это будет — TinyMCE или CKEditor, хоть все сразу. Чтобы их держать под контролем, поставим модуль Wysiwyg и редактор CKEditor (мой выбор).

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


Понятное дело, что, попав первый раз на сайт, пользователю будет, наверное, не так просто сориентироваться. Было найдено довольно изящное решение вопроса — jQuery-плагин Joyride от ZURB. Скачаем библиотеку, заодно установим для неё соответствующий модуль. Заодно ставим зависимость — Context, если он ещё не установлен.


В основном за ЧПУ отвечает непосредственно Drupal, поэтому там трогать ничего не будем. Будем лишь видоизменять ссылки в зависимости от местонахождения пользователя — для этого ставим Pathauto и Transliteration, чтобы ссылки выглядели чуть более опрятно.


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


Мы хотим, чтобы пользователи имели возможность общаться между собой, посылать друг другу сообщения и так далее. Сказано — сделано, топаем на сайт и забираем отличный модуль Privatemsg.


Итоги




Итак, что у нас в сухом остатке?

Итого: 25 модулей без учёта тех, что встроены в системе, и 2 библиотеки. Возможно, я упустил какие-то зависимости, буду рад, если мне о них напомнят лишний раз :)


Дальше установим всё это хозяйство и настроим его, поэтому будет довольно много картинок. Жду отзывов и комментариев!


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


HD FPV на Raspberry Pi. Работа над ошибками

В предыдущей статье я рассказал о возможности полетов HD FPV на базе Raspberry Pi с организацией вайфай моста с помощью модулей Ubiquiti Bullet M2 HP.



Первый блин вышел комом. Результат эксперимента получился, как говорится: «третий сорт — не брак», с некоторыми серьезными оговорками и «граблями», но основная цель эксперимента была достигнута. Идея получить HD FPV по проводам вайфаю была успешно опробована.

Как я и предполагал, публикация на хабре не только непомерно завышает ЧСВ повышает карму, но и позволяет услышать мнение хабрасообщества и получить очень ценные рекомендации и дельные советы. В комментариях к статье советы были получены, чуть позже осмыслены и третьего дня реализованы.

Что было реализовано, исправлено и дополнено





  • Эксперимент 1. Используемые антенны с круговой поляризацией. «клевер» на земле и на борту.

  • Эксперимент 2. Используемые антенны с линейной поляризацией. На земле секторная 70град х 70град, на борту «штырь».

  • Запись принимаемого видеопотока на земле, для дальнейшего анализа.

  • Борт с полетными «мозгами» Ardupilot 2.0 для стабилизированного полета. В случае потери связи (визуальной, видео, РУ) с бортом, возможность автоматического возврата на базу.

  • Исправлен досадный баг ДНК прошлого эксперимента. Оба вайфай модуля жгли работали на полную мощность 28dBm.


Матчасть




Антенное хозяйство на земле. В зависимости от эксперимента к ВЧ разъему вайфай модуля подключался, либо «клевер», либо секторная антенна.


Борт со «штырем»


Борт с «клевером»


Ардупилот 2.0


Много видео




Тестовый полет на штыревой антенне, на земле секторная.


Тестовый полет на «клеверах»


Результаты оказались на удивление весьма неплохие. Объективно «клевер» отработал лучше, поэтому все дальнейшие тесты проводились на «клеверах».


Тестовые полеты на дальность проводились в двух разрешениях HD 1280x720 и 800x600

1280х720


800x600



За это разрешение прошу не ругать… мол обещано HD, а тут не оно. Исключительно в целях эксперимента. В дальнейшем будут тесты вплоть до 320х200


Радиус уверенного приема перевалил за 700 метров!


Решили протестить Full HD

1920x1080



Результат немного предсказуем, недалече… но РАБОТАЕТ!


Еще тесты на дальность и посадка по монитору. Тут придется поверить на слово… пилот действительно сажал пенолет силой мысли глядя в монитор наземного компьютера.

800x600


Выводы и ближайшие планы




По сравнению с прошлым экспериментом результат значительно улучшился. Система работает и есть куда летать копать дальше. Вопрос взлетит или не взлетит уже не стоит. Однозначно HD FPV взлетел!

  • Более детально продумать расположение антенны на борту.

  • Протестировать вариант с потолочной антенной линейной поляризации (она уже ожидает на почте).

  • Протестировать работу системы на высоте — это потребует переделки пенолета, т.к. он не шибко силен и в высь забирается очень печально медленно.

  • Опробовать 5.8 ггц модули, тут есть интересное предложение от хабраюзера kunks.

  • Отдельным фронтом работ открываются возможности по реализации OSD — наложение полетной информации на транслируемую картинку. Пилоту уже очень надо наводить борт на цель получать высоту и напряжение бортовой АКБ.

  • Интересно построить GPS треки полетов и совместить их с видео, для более глубоких экспериментов и анализа эффективной дальности.


В наличии уже имеется USB GPS, подключал его к малине, NMEA валит так, что не остановить. В наличии решение с подключением гироскопа MPU-9150 по шине I2C к малине, можно конечно требуемые данные получать с Ardupilot… тут вопрос пока открытый.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


[recovery mode] TI-84+



Обнаружив в моей очередной контрольной энное количество вычислительных ошибок, учитель физики сказал несколько максимально вежливых фраз, которые в вольном переводе на живой великорусский язык звучали бы так:


Чтоб в следующий раз был нормальный графический калькулятор!





В результате набега на ближайший книжный магазин (никаких более релевантных в округе не было) был приобретен TI-84 Plus. После того как все контрольные были написаны, возник вопрос: а что, собственно говоря, этот зверь умеет? Путем гугления выяснилось, что TI-84 Plus — это не только ценный извлекатель квадратных корней но и:


  • Легендарный Zilog Z80,

  • 24 Кб RAM и 480 Кб Flash доступной пользователю,

  • Куча полезных (и не очень) программ, написанных энтузиастами.




Под катом — небольшой обзор калькулятора и довольно-таки корявая игра «роботы» моего написания. Заранее прошу прощения у любителей обнаженки — разобрать калькулятор я не смог, да и побоялся.



TI-84+ — программируемый графический калькулятор с черно-белым экраном 96x64. «Говорит и понимает» © математическую нотацию (дроби вида а над бе, квадратные корни с аргументом под чертой и так далее):



Умеет кучу полезных математических штук, но интереснее с точки зрения Хабра его программируемость.

Программирование


Программировать TI-84+ «из коробки» можно либо на TI BASIC, либо в машинных кодах. TI BASIC — диалект BASICa. Это «структурный», а не «макаронный» диалект. Вместо ключевых слов — токены (по-моему что-то такое было в Спекртумах). Оптимизирован для математических операций, для игр и других приложений подходит так себе, хотя конечно, умеючи можно написать что угодно. Из минусов очень медленный, так как вдобавок к интерпретации, вся математика с плавающей точкой. Из плюсов — программы занимают очень мало места.


Другая возможность — машинные коды. Как правило, собранные ассемблером на компьютере. Соответственно, программы получаются на несколько порядков быстрее и раза в два больше чем соответствующая программа на бейсике. Еще они могут убить калькулятор.


Энтузиастами созданы и другие способы программировать TI-84+. Наиболее значимый, пожалуй, — AXE. Это аналог Си для калькуляторов: язык с Basic-подобным синтаксисом, транслирующийся в машинные коды. Не требует компьютера для написания и компиляции программы (хотя, писать большую программу на калькуляторе — удовольствие на любителя). Использует шестнадцатибитную арифметику, что конечно медленнее нативной восьмибитной.


Программы для TI-84+


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


Пару слов об организации памяти: в калькуляторе есть RAM и FLASH (Archive в терминологии TI). И то и другое организованно в некое подобие файловой системы. Программы и данные можно хранить как в RAM, так и во FLASH. FLASH медленнее, но ее больше. Кроме «программ» и данных во FLASH хранятся «приложения» — от «программ» они отличаются, тем, что распределены по страницам FLASH-памяти и могут занимать больше памяти, чем процессор в состоянии адресовать.


Полезная вещь, которую стоит иметь на калькуляторе — это оболочка, приложение содержащее библиотеки, загрузчик бинарных программ, и графический интерфейс. Лично я пользуюсь Doors CS. Ее плюс в том, что она содержит библиотеки всех популярных оболочек, а минус — в большом размере. Создатели Doors CS попытались сделать интерфейс похожим на Windows, для чего TI-84+ подходит, на мой взгляд, плохо. Впрочем, использовать GUI Door CS необязательно, она автоматический интегрируется в ОС.


Некоторые интересные программы для TI-84+:


«Роботы» на AXE


Погоняв птичку и попрыгав через порталы, я решил сам что-нибудь написать. В качестве языка я выбрал AXE, а в качестве задачи — BSDшных роботов. Получилось коряво: большую часть памяти занимают массивы. Но как сделать компактнее, я так и не придумал.


Программа состоит из пяти «частей»: инициализации, отрисовки, создания нового уровня, «интеллекта» роботов и главного цикла. Отличия от оригинала: игровое поле 23x15 (каждый спрайт 4x4 + бордюр), меньше роботов из-за уменьшения игрового поля, нет подсчета очков.


Инициализация



Скрытый текст


.ROBOTS

.IMAGES
.EMPTY
.ROBOT
.JUNK
.PLAYER
.STONE
.STONE
[000000000000000020702000000000007070700000000000702070000000000020707000000000002070700000000000]->Pic1

.FIELD
Buff(23*15)->Str1
Buff(23*15)->Str2
Buff(23*15)->Str3
1->L



Здесь все просто. Сначала идет заголовок с именем программы, потом шестнадцатиричная строка со спрайтами. AXE поддерживает спрайты 8x8, а у меня — 4x4, так что большая часть этогй стоки — нули. Также, я использовал «пустой» спрайт и повторил спрайт с могилой два раза для упрощения отрисовки.


Дальше инициализируются массивы с игровым полем. Str1 — главное игровое поле, Str2 — вспомогательное, Str3 — копия старого игрового поля для предотвращения ошибок игрока. Переменная L — уровень.


Обратите внимание на особенность синтаксиса AXE (и TI-BASICа): присваивание происходит справа налево.


Создание нового уровня

Скрытый текст


Lbl NEWLVL
Fill(Str1,15*23,0)
L*5->R
For(R)
rand^15->I
rand^23->J
I*23+J+Str1->P
1->{P}
End
rand^23->X
rand^15->Y
3->{Y*23+X+Str1}
Return



Сперва игровое поле обнуляется, затем на нем размещаются роботы (спрайт за номером 1). В оригинале на каждом уровне появлялось по десять роботов, у меня игровое поле меньше, поэтому я выбрал пять. Роботов может быть меньше, чем L*5 из-за наложения, я решил считать это фитчей. Затем выбирается позиция игрока (спрайт номер 3), опять же: в отличии от оригинала, где помереть можно на нулевом ходу, у меня игрок «убивает» робота, если приземлится на него в начале игры.


Отрисовка

Скрытый текст


Lbl DRAW
ClrDraw
VLine(0,0,62)
VLine(94,0,62)
HLine(0,0,94)
HLine(62,0,94)
For(I,0,22)
For(J,0,14)
Pt-On(I*4+1,J*4+2,{J*23+I+Str1}*8+Pic1)
End:End
DispGraph
Return



Здесь, опять же, все просто. Пожалуй, стоит сказать, что двоеточие — разделитель операторов, а Pt-On — отрисовка спрайта. Lbl — метка, от LaBeL. Фигурные скобки в AXE — значение байта по заданному адресу.


Передвижение роботов

Скрытый текст


Lbl STEP
0->R
Fill(Str2,23*15,0)
For(I,0,22):For(J,0,14)
J*23+I->A
{A+Str1}->B
If B=2
2->{A+Str2}:End
If B=1:
R+1->R
(J+SIGN(J,Y))*23+I+SIGN(I,X)+Str2->A
{A}+({A}<2)->{A}
End
End:End
Copy(Str2,Str1,23*15)
Y*23+X+Str1->A
{A}+3->{A}
Return

Lbl SIGN
([r1]<[r2])-([r1]>[r2])
Return



Здесь начинаются грязные хаки. Программа сканирует игровое поле, ища роботов, и передвигает их в сторону игрока. Операции сравнения в AXE возвращают единицу, поэтому {A}+({A}<2)->{A} инкременирует A если и только если А меньше двух. Затем отмечается позиция игрока.


Главный цикл



Скрытый текст


While 1
0->G
NEWLVL()
DRAW()
While R>0
X->M:Y->N
Copy(Str1,Str3,23*15)
If G<200
getKey^^r->G
ReturnIf G=9
G^100->K
End

If K=47
rand^23->X
rand^15->Y
STEP()
DRAW()
If {A}!=3
getKey^^r:Return
End
Else
(K=51)+(K=48)+(K=45)-(K=49)-(K=46)-(K=43)->I
((K>=43) and (K<=45))-((K>=49) and (K<=51))->J

If ((J+Y)<15) and ((J+Y)>=0) and ((I+X)<23) and ((I+X)>=0)
X+I->X:Y+J->Y
Else:0->G
End

STEP()
If {A}!=3
M->X:N->Y
Copy(Str3,Str1,23*15)
0->G
End
End



Собственно, можете наблюдать ухудшение качества кода: главный цикл мне пришлось переписывать три раза (заповедь «делай бекапы» для TI-84+ как никогда актуальна), и под конец я устал. В результате получилось то, что получилось.


Пояснения:


R — количество роботов на игровом поле. Если роботов больше не осталось — значит уровень пройден.


getKey^^r ждет нажатия клавиши, затем возвращает скан-код. Реализуя свой преступный замысел, я использовал тот факт, что модификатор 2nd прибавляет к скан-кодам цифровых клавиш сотню. Таким образом, новая клавиша не считывается если 2nd была нажата — таким образом реализуется повторение. Истинный скан-код сохраняется в переменную G, и если G больше 200, новая команда не считывается.


Скан-код 147 — клавиша «5». В игре это команда телепортации. Телепортация — единственный ход, на котором игра может закончится, поэтому он обрабатывается отдельно.


Скан-коды 43…45, 49…51, 46 и 48 — это цифровые клавиши, по ним игрок двигается. Убить игрока во время движения нельзя, так что состояние игры сохраняется до хода и восстанавливается если игрок с кем-то столкнулся. При этом, G обнуляется.


Как это все выглядит в собранном виде:

Скрытый текст


.ROBOTS

.IMAGES
.EMPTY
.ROBOT
.JUNK
.PLAYER
.STONE
.STONE
[000000000000000020702000000000007070700000000000702070000000000020707000000000002070700000000000]->Pic1

.FIELD
Buff(23*15)->Str1
Buff(23*15)->Str2
Buff(23*15)->Str3
1->L


While 1
0->G
NEWLVL()
DRAW()
While R>0
X->M:Y->N
Copy(Str1,Str3,23*15)
If G<200
getKey^^r->G
ReturnIf G=9
G^100->K
End

If K=47
rand^23->X
rand^15->Y
STEP()
DRAW()
If {A}!=3
getKey^^r:Return
End
Else
(K=51)+(K=48)+(K=45)-(K=49)-(K=46)-(K=43)->I
((K>=43) and (K<=45))-((K>=49) and (K<=51))->J

If ((J+Y)<15) and ((J+Y)>=0) and ((I+X)<23) and ((I+X)>=0)
X+I->X:Y+J->Y
Else:0->G
End

STEP()
If {A}!=3
M->X:N->Y
Copy(Str3,Str1,23*15)
0->G
End
End

DRAW()
End
L+1->L
End
Return








Lbl DRAW
ClrDraw
VLine(0,0,62)
VLine(94,0,62)
HLine(0,0,94)
HLine(62,0,94)
For(I,0,22)
For(J,0,14)
Pt-On(I*4+1,J*4+2,{J*23+I+Str1}*8+Pic1)
End:End
DispGraph
Return

Lbl NEWLVL
Fill(Str1,15*23,0)
L*5->R
For(R)
rand^15->I
rand^23->J
I*23+J+Str1->P
1->{P}
End
rand^23->X
rand^15->Y
3->{Y*23+X+Str1}
Return

Lbl STEP
0->R
Fill(Str2,23*15,0)
For(I,0,22):For(J,0,14)
J*23+I->A
{A+Str1}->B
If B=2
2->{A+Str2}:End
If B=1:
R+1->R
(J+SIGN(J,Y))*23+I+SIGN(I,X)+Str2->A
{A}+({A}<2)->{A}
End
End:End
Copy(Str2,Str1,23*15)
Y*23+X+Str1->A
{A}+3->{A}
Return

Lbl SIGN
([r1]<[r2])-([r1]>[r2])
Return



Спасибо за внимание!

Ссылки:




Специально для тех, кто дочитал:


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


TypeOf — проверка типа сущности в JavaScript

TypeOf javascript library

Начиная какой-то более-менее сложный и комплексный проект с использованием JavaScript, перед разработчиком может встать выбор о том, какую библиотеку\фреймворк использовать. Если речь идет о веб-разработке, то jQuery — это, априори, библиотека №1 — лаконичная, простая, удобная. Но за слепой любовью к ней кроется немало, если и не устаревших, то уж точно таких вещей, которые можно сделать лучше.


Ответвимся к проверкам типов




Вышеупомянутая библиотека имеет статический метод для проверки типов — это jQuery.type. Окунемся в тонкости его работы и, для этого, взглянем на исходный код. Увидим что изначально пришедший аргумент проверяется на null и, при положительном результате, тип аргумента приводится к строке и возвращается. В иных случаях идет проверка средствами языковых конструкций и выполняется сравнительно точная типизация, но минус такого подхода — медлительность из-за вызова метода toString и неточное определение типа, в следствии чего приходится писать дополнительные конструкции, позволяющие «уточнить» тип сущности.



Теперь расскажу о «синей таблетке» — том, что предлагаю я — TypeOf




Основная идея TypeOf — это проверка по конструктору. В исходном коде библиотеки не выполняется никаких методов, а только сверяется конструктор с объектами или же, в нескольких особых случаях, выполняется дополнительная проверка по свойству length для определения массивов, деление по модулю — для float либо нативная языковая функция isNaN — для проверки случаев, когда не удается привести тип к числу.

Например, вы можете делать так:



TypeOf(document.getElementsByTagName('script')).is('node'); // true
TypeOf(document.getElementsByTagName('script')).is('array'); // true




node — это подтип объекта, тип которого — array. Звучит немного запутанно, но JavaScript — язык в котором все — это объект.

Попробую немного прояснить ситуацию и приведу еще один блок кода:



jQuery.type(document.getElementById('demo')).is('node'); // true
jQuery.type(document.getElementById('demo')).is('object'); // true




Разница вышеуказанных примеров заключается в том, что в первом мы получаем массив объектов типа NodeObject, а во втором — лишь один объект этого же типа. Все просто и jQuery так не умеет :)

Самая занятная ситуация касается проверки типа так называемого plainObject. Далее я приведу примеры того, как это проверить с помощью jQuery и TypeOf.



// jQuery
jQuery.isPlainObject({}); // true

// TypeOf
TypeOf({}).is('plain'); // true




А теперь взгляните на то, как проверяется plainObject у jQuery и как это делает TypeOf. Думаю слова излишни.

Подробнее о функции TypeOf и возвращаемом ею объекте




Функция всегда будет возвращать объект, содержащий два свойства: type, subtype и метод: is. По названиям, думаю, не мудрено догадаться о том, что на них возложено. По умолчанию, свойство subtype — это булево значение которое равняется false. Измениться оно может лишь в случаях, когда TypeOf принимает в качестве аргумента число с плавающей точкой, так называемый not-a-number и объект, будь он простым либо содержащим NodeObject объекты.

Методом is вы можете проверить тип, передав ему один из следующих аргументов: NaN, null, bool, node, plain, float, array, string, number, object, function, undefined. В тех случаях, когда проверка будет осуществляться на NaN, float, node или plain метод будет сверять аргумент с подтипом. Важно заметить, что параметр метода — это строка и результатом выполнения, например, следующего кода:



TypeOf(null).is(null);




будет false.

Поддержка браузеров и производительность




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

Демонстрация и репозиторий





  • http://ift.tt/1nvN7ed — тут располагается git-репозиторий проекта и в его описании вы сможете подробно узнать об объекте, возвращаемом функцией TypeOf.

  • http://ift.tt/1k5ZNTY — демонстрация. При попытке открыть страницу в устаревших браузерах будут проблемы из-за отсутствия функционала, используемого только для демонстрации. Чтобы тестировать саму библиотеку в экстремальных условиях, вам необходимо работать с ее исходным кодом напрямую.








С наилучшими пожеланиями,

Сергей Бондаренко, Web Developer в Propeople Ukraine.

This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Светодиодное сердце на микроконтроллере Atmega16, или программирование AVR на языке Pascal

program Love_Machine;

{$NOSHADOW}

{ $WG} {global Warnings off}


//Контроллер ATmega16

//Напряжения питания 3.3 В

Device = mega16, VCC=3.3;

{ $BOOTRST $01C00} {Reset Jump to $01C00}


Import SysTick, TickTimer;


From System Import LongWord;


Define

//Рабочая частота 1 MГц (Внутренняя RC-цепочка)

ProcClock = 1000000; {Hertz}

SysTick = 10; {msec}

StackSize = $0032, iData;

FrameSize = $0032, iData;


TickTimer = Timer1;

//Задержка переключения системного

//в милисекундах

Define_USR SysLED_Delay = 500;


Implementation


{$IDATA}


{--------------------------------------------------------------}

{ Type Declarations }


type


{--------------------------------------------------------------}

{ Const Declarations }


const


TimeCount: Byte = 70;


MOutBits_L1:array[0..7] of Byte = (


$00,

$00,

$00,

$00,


$00,

$00,

$00,

$ff

);


MOutBits_L2:array[0..7] of Byte = (


$00,

$00,

$00,

$00,


$00,

$00,

$ff,

$ff

);


MOutBits_L3:array[0..7] of Byte = (

$00,

$00,

$00,

$00,


$00,

$ff,

$ff,

$ff

);


MOutBits_L4:array[0..7] of Byte = (


$00,

$00,

$00,

$00,


$ff,

$ff,

$ff,

$ff

);


MOutBits_L5:array[0..7] of Byte = (


$00,

$00,

$00,

$ff,


$ff,

$ff,

$ff,

$ff

);


MOutBits_L6:array[0..7] of Byte = (


$00,

$00,

$ff,

$ff,


$ff,

$ff,

$ff,

$ff

);


MOutBits_L7:array[0..7] of Byte = (


$00,

$ff,

$ff,

$ff,


$ff,

$ff,

$ff,

$ff

);


{*

MOutBits: array[0..24] of LongWord =(

%010000000000000101,

%010000000000000101,

%010000000000000101,

%010000000000000101,

%010000000000000101,


%010000000000000001,

%010000000000000001,

%010000000000000001,

%010000000000000001,

%010000000000000001,


%010000000000000001,

%010000000000000001,

%010000000000000001,

%010000000000000001,

%010000000000000001,


%000000000000000101,

%000000000000000101,

%000000000000000101,

%000000000000000101,

%000000000000000101,


%000000000000000001,

%000000000000000001,

%000000000000000001,

%000000000000000001,

%000000000000000001


);

*}


{--------------------------------------------------------------}

{ Var Declarations }

{$IDATA}

var


OutBitsIndex: Byte;


St_Level: Byte;

St_Timer: Byte;


PortDataA: Byte;

PortDataC: Byte;

PortDataD: Byte;

ShiftCounter: Byte;


TimerTickCounter: LongWord;


{--------------------------------------------------------------}

{ functions }


//Функци инициализации

//портов ввода-вывода

procedure InitPorts;

begin

//Первый сегмент сердца ( 8 светодиодов)

//Порт на вывод

DDRA:= %11111111;

//Записать нули

PortA:= %00000000;


//Второй сегмент сердца

//Порт на вывод

DDRC:= %11111111;

//Записать нули

PortC:= %00000000;


//Третий сегмент сердца ()

//Два вывода порта на вывод

DDRD:= %00000011;

//Записать нули

PortD:= %00000000;


//системный двухцветный светодиод (2 ножки)

//Порт на вывод

DDRB:= %00000011;


end InitPorts;


//Индикация красным

procedure SysLED_Red;

begin

//Подтянуть к единице 1-й вывод

//порта B

incl(PortB,1);

//Подтянуть к нулю 0-й вывод

//порта B

excl(PortB,0);

end SysLED_Red;


//Индикация зеленым

procedure SysLED_Green;

begin

//Подтянуть к единице 0-й вывод

//порта B

incl(PortB,0);

//Подтянуть к нулю 1-й вывод

//порта B

excl(PortB,1);

end SysLED_Green;


//Переключение индикации

//зеленный-красный

procedure SysLED_SwColor;

begin

//Зажечь красный

SysLED_Red;

//Задержка

mDelay(Word(SysLED_Delay));

//Зажечь зеленый

SysLED_Green;

//Задержка

mDelay(Word(SysLED_Delay));

end SysLED_SwColor;


//Обработчик прерывания программного таймера

procedure onTickTimer; //(SaveAllRegs);

begin

//SysLED_SwColor;

case St_Timer of

0:

toggle(PortA,0);

toggle(PortA,1);

toggle(PortA,2);

toggle(PortA,3);

toggle(PortA,4);

toggle(PortA,5);

toggle(PortA,6);

toggle(PortA,7);


toggle(PortC,0);

toggle(PortC,1);

toggle(PortC,2);

toggle(PortC,3);

toggle(PortC,4);

toggle(PortC,5);

toggle(PortC,6);

toggle(PortC,7);


toggle(PortD,0);

toggle(PortD,1);

|

1:

PortDataA := PortDataA ror 1;

PortA := PortDataA;

PortDataC := PortDataC ror 1;

PortC := PortDataC;

PortDataD := PortDataD ror 1;

PortD := PortDataD;

|

2:


// PortDataC := PortDataC ror 1;

// PortC := PortDataC;

// PortDataD := PortDataD ror 1;

// PortD := PortDataD;


if (ShiftCounter = 0) or (ShiftCounter = 18)

then

PortD := $00;

ShiftCounter := 0;

PortDataA := $01;

PortA := PortDataA;

inc(ShiftCounter);


elsif (ShiftCounter < 8) and (ShiftCounter > 0)

then

PortDataA := PortDataA rol 1;

PortA := PortDataA;

inc(ShiftCounter);


elsif (ShiftCounter = 8)

then

PortA := $00;

PortDataC := $01;

PortC := PortDataC;

inc(ShiftCounter);


elsif (ShiftCounter > 8) and (ShiftCounter < 16)

then


PortDataC := PortDataC rol 1;

PortC := PortDataC;

inc(ShiftCounter);


elsif (ShiftCounter = 16)

then

PortC := $00;

PortDataD := $01;

PortD := PortDataD;

inc(ShiftCounter);


elsif (ShiftCounter > 16) and (ShiftCounter < 18)

then

PortDataD := PortDataD rol 1;

PortD := PortDataD;

inc(ShiftCounter);

endif;


|

3:

inc(TimerTickCounter);


if ( ( TimerTickCounter mod TimeCount ) = 0 )

then


inc(St_Level);


if ( St_Level >= 16)

then

St_Level := 1;

endif;


endif;


case St_Level of

0:

PortA := $00;

PortC := $00;

PortD := $00;

|

1:

PortA := MOutBits_L1[OutBitsIndex];

PortC := MOutBits_L1[OutBitsIndex];

PortD := MOutBits_L1[OutBitsIndex];

|

2:

PortA := MOutBits_L2[OutBitsIndex];

PortC := MOutBits_L2[OutBitsIndex];

PortD := MOutBits_L2[OutBitsIndex];

|

3:

PortA := MOutBits_L3[OutBitsIndex];

PortC := MOutBits_L3[OutBitsIndex];

PortD := MOutBits_L3[OutBitsIndex];

|

4:

PortA := MOutBits_L4[OutBitsIndex];

PortC := MOutBits_L4[OutBitsIndex];

PortD := MOutBits_L4[OutBitsIndex];

|

5:

PortA := MOutBits_L5[OutBitsIndex];

PortC := MOutBits_L5[OutBitsIndex];

PortD := MOutBits_L5[OutBitsIndex];

|

6:

PortA := MOutBits_L6[OutBitsIndex];

PortC := MOutBits_L6[OutBitsIndex];

PortD := MOutBits_L6[OutBitsIndex];

|

7:

PortA := MOutBits_L7[OutBitsIndex];

PortC := MOutBits_L7[OutBitsIndex];

PortD := MOutBits_L7[OutBitsIndex];

|

8:

PortA := $FF;

PortC := $FF;

PortD := $FF;

|

9:

PortA := MOutBits_L7[OutBitsIndex];

PortC := MOutBits_L7[OutBitsIndex];

PortD := MOutBits_L7[OutBitsIndex];

|

10:

PortA := MOutBits_L6[OutBitsIndex];

PortC := MOutBits_L6[OutBitsIndex];

PortD := MOutBits_L6[OutBitsIndex];

|

11:

PortA := MOutBits_L5[OutBitsIndex];

PortC := MOutBits_L5[OutBitsIndex];

PortD := MOutBits_L5[OutBitsIndex];

|

12:

PortA := MOutBits_L4[OutBitsIndex];

PortC := MOutBits_L4[OutBitsIndex];

PortD := MOutBits_L4[OutBitsIndex];

|

13:

PortA := MOutBits_L3[OutBitsIndex];

PortC := MOutBits_L3[OutBitsIndex];

PortD := MOutBits_L3[OutBitsIndex];

|

14:

PortA := MOutBits_L2[OutBitsIndex];

PortC := MOutBits_L2[OutBitsIndex];

PortD := MOutBits_L2[OutBitsIndex];

|

15:

PortA := MOutBits_L1[OutBitsIndex];

PortC := MOutBits_L1[OutBitsIndex];

PortD := MOutBits_L1[OutBitsIndex];

|

endcase;


inc( OutBitsIndex );


if OutBitsIndex >= 8

then

OutBitsIndex := 0;

endif;

|

endcase;


end;

{--------------------------------------------------------------}

{ Main Program }

{$IDATA}

//Код выполняемый сразу после Reset'a

begin

//Инициализировать порты ввода/вывода

InitPorts;

//Настроить программный таймер

// Период = 1 мс

// Частота = 1 кГц

TickTimerTime(1000);

// Запустить таймер

TickTimerStart;


// Остановить таймер

TickTimerStop;


//Разрешить прерывания

EnableInts;


{

//Последовательное включение

//светодиодов c секундным интервалом

incl(PortA,0);

mDelay(1000);

incl(PortA,1);

mDelay(1000);

incl(PortA,2);

mDelay(1000);

incl(PortA,3);

mDelay(1000);

incl(PortA,4);

mDelay(1000);

incl(PortA,5);

mDelay(1000);

incl(PortA,6);

mDelay(1000);

incl(PortA,7);

mDelay(1000);

incl(PortC,0);

mDelay(1000);

incl(PortC,1);

mDelay(1000);

incl(PortC,2);

mDelay(1000);

incl(PortC,3);

mDelay(1000);

incl(PortC,4);

mDelay(1000);

incl(PortC,5);

mDelay(1000);

incl(PortC,6);

mDelay(1000);

incl(PortC,7);

mDelay(1000);

incl(PortD,0);

mDelay(1000);

incl(PortD,1);

mDelay(1000);


//Переход в первый режим таймера (Toggle)

St_Timer := 0;


//Период 200 мс

TickTimerTime(200000);

// Запустить таймер

TickTimerStart;

//Задержка 2 секунды

mDelay(2000);


//Период 150 мс

TickTimerTime(150000);

// Запустить таймер

TickTimerStart;

mDelay(2000);


// Остановить таймер

TickTimerStop;

//Период 100 мс

TickTimerTime(100000);

// Запустить таймер

TickTimerStart;

//Задержка 2 секунды

mDelay(2000);


// Остановить таймер

TickTimerStop;

//Период 50 мс

TickTimerTime(50000);

// Запустить таймер

TickTimerStart;

//Задержка 2 секунды

mDelay(2000);


// Остановить таймер

TickTimerStop;

//Период 25 мс

TickTimerTime(25000);

// Запустить таймер

TickTimerStart;

//Задержка 2 секунды

mDelay(2000);


}

// Остановить таймер

TickTimerStop;


PortDataA := $AA;

PortDataC := $AA;

PortDataD := $AA;


//Переход во второй режим (Shift Inv)

St_Timer := 1;


//Период 200 мс

TickTimerTime(200000);

// Запустить таймер

TickTimerStart;


//Задержка 5 секунд

mDelay(2000);


// Остановить таймер

TickTimerStop;


PortA := $00;

PortC := $00;

PortD := $00;


PortDataA := $00;

PortDataC := $00;

PortDataD := $00;


ShiftCounter := 0;


//Переход во второй режим (Shift One)

St_Timer := 2;


//Период 200 мс

TickTimerTime(200000);

// Запустить таймер

TickTimerStart;


//Задержка 5 секунд

mDelay(5000);


// Остановить таймер

TickTimerStop;

//Переход в третий режим таймера (PWM)

St_Timer := 3;

// Частота = 1 кГц

TickTimerTime(1000);

// Запустить таймер

TickTimerStart;


//Основной цикл

loop


//inc(St_Level);

//if ( St_Level >= 9)

//then

// St_Level := 0;

//endif;

//mDelay(200);


//SysLED_SwColor;


// incl(PortC,1);

// mDelay(1);

endloop;

end Love_Machine.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


[Перевод] Программирование и стриптиз


сегодня в 20:07



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






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


В Европе и США тема сексизма очень болезненна, и таких шуток там не признают. Кроме того, вторжение программирование столь инородной вещи, как стриптиз, у многих вызывает не улыбку, а недоумение и возмущение.




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


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Как раскрутить свою группу Вконтакте (бесплатно, без регистрации и смс)



Меня зовут Сергей, и я пишу игры. Это подразумевает много работы, которую непросто сделать, если не впасть в состояние потока. А для потока нужна музыка. Причём не абы какая, а специфическая: в ней должно быть достаточно жизни, чтобы мозг не засыпал, и она должна быть не настолько энергичной, чтобы отвлекать.

В наушниках в очередной раз играл Jeremy Soule (композитор, написавший великолепные саундтреки играм серии The Elder Scrolls, Guild Wars, Icewing Dale и десяткам другим), и понял, что саундтреки к играм это именно то, что нужно. Я стал искать сайты, которые мне бы могли предложить онлайн-прослушивание игровых композиторов. Проведя за этим делом долгие пятнадцать минут, я пришёл к выводу, что искать музыку для себя мне придётся каждый день самому, т.к. никто такие специфические вкусы удовлетворять не решился.


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


Сначала в группу неспешно записались мои друзья и знакомые со схожими интересами: было достаточно сделать репост из группы на свою стену.

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




Несмотря на то, что это некоммерческая группа, я рассматриваю задачу её раскрутки как маркетинговую, поэтому и использую соответствующую терминологию.


1. Знайте свою целевую аудиторию (ЦА)




Поймите, кто будет заходить в вашу группу. Если после минутных раздумий, вы описываете сами себя, значит, подумали плохо. Своим увлечением, из которого растёт тематика группы, вы можете внести себя к какому-то сообществу. Так вот если вы тридцатилетний женатый мужчина с одним ребёнком и ипотекой, любите бекон и бабочек, то это не значит, что в вашей группе «Бекон как путь к спасению» должны быть лишь тридцатилетние женатые мужчины, которые любят бабочек. Все кто любят бекон — ваша ЦА. При этом, если через полмесяца вам пишет фанат бекона со словами «А давай ещё будем выкладывать элитные сигары! Я тогда буду ещё большим фанатом» — вам стоит задумываться, не отпугнёт ли это изменение всех, кто уже есть, в первую очередь.

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

Вкратце: ограничьтесь какой-то чётко очерченной аудиторией.

2. Контент решает всё




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

Вредный совет: пригласите десять тысяч человек в группу с одним сообщением вида «Мы открылись!».

Как надо делать: регулярно наполняйте свою группу тем, ради чего она создана. Если вы не знаете, зачем её создали — подумайте пару дней и удаляйте.

3. Покупные пользователи хуже настоящих

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

Вредный совет: купите себе «инсталлов» в сообществе «ДЁШИВА РАСКРУТЕМ ГРУППУ», желательно в течение одного дня и на пару своих зарплат.

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


4. Пишите о том, что нравится




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

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

Вкратце: расслабьтесь и получайте удовольствие.

5. Регулярно добавляйте новости




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

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

Вкратце: дайте вашим подписчикам чувство стабильности в бушующем океане информации

6. Избегайте большого количества новостей в короткий период времени




Бывают такие моменты в жизни, когда вы натыкаетесь на золотую жилу: отличный исполнитель с десятками прекрасных альбомов, сборник книг, тематическая википедия — и в вас появляется желание вывалить всё это на дражайших подписчиков. Остановитесь! Во-первых, недосказанность это хорошо. Когда человек ждёт вторую часть чего-либо, ему куда сложнее забыть про существование вашей группы. Во-вторых, слишком много активности в вашей группе приведёт к захламлению лент ваших подписчиков, а значит — приравняется к назойливому флуду. Выкладывайте не торопясь, раз в час. Интриговать подписчиков лучше, чем раздражать.

Вредный совет: выкладывайте 50 новостей по одной картинке каждые 3 минуты, в течение месяца не возвращайтесь к группе

Вкратце: разбивайте контент на кусочки и давайте подписчикам время его переварить

7. Статистика — ваш друг




В статистике группы есть очень много полезных инструментов: уникальные посетители, просмотры, распределение по возрасту, полу, географии, приход и уход подписчиков, охват аудитории и количество обратной связи. Мало? Освойте сперва это. Смотрите на графике, думайте, кто и что любит, старайтесь угодить не только себе, но и тем, кто к вам приходит.

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

Вкратце: смотрите на графики, первое время этого вполне достаточно

8. Избегайте купленных репостов




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

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

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

9. Стройте теории и уточняйте их постоянно




Это совет, который может побить все другие советы при правильном использовании (кроме пункта 2, пожалуй). После того, как вы сможете читать простые вещи по графикам статистики группы (в группе про сладости не особо интересуются автозапчастями) — пред вами предстанет прекрасный мир гипотез. Вам нужно сделать следующее:

1)Сказать себе, что нужно сделать лучше. Например, увеличить количество новых посетителей в день в два раза

2)Создать гипотезу: достичь этого я смогу, увеличив количество новостей в два раза.

3)Проверяете гипотезу в течение необходимого времени, обычно недели вполне хватает: меньше же недельные колебания будут сильно влиять на метрики. Вы просто не поймёте, наткнулись ли вы на отличную тему, либо в понедельник музыка нужна людям сильнее, чем в среду. Гипотеза либо подтверждается, и тогда вы достигаете своей цели, либо, гораздо чаще, опровергается — и лишаетесь очередного заблуждения насчёт раскрутки вашей группы.

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

Вредный совет: доверьтесь интуиции, вы всё знаете сами.

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


10. Оставьте ссылку на хабре




Вредный совет: безапелляционно оставьте ссылку в конце статьи, вот так — Эльфийская таверна

Ой.

This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Почему на StackOverflow столько ненависти в последнее время?


сегодня в 18:02


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

В целом, пишет Mysticial, на StackOverflow есть четыре группы пользователей:



  1. «Смотрители», для которых важно поддерживать сайт в хорошем виде с качественным контентом.

  2. «Хелп-вампиры», которые захламляют сайт плохими/повторными вопросами, им нужно только получить ответ на свой вопрос, и больше ничего.

  3. «Ботоотвечатели», которые отвечают на всё, что только могут (иногда, даже если не знают ответа)

  4. Те, кому всё пофиг.






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

  • 2 и 3 любят друг друга. Им следовало бы пожениться.

  • 1 ненавидит 2, потому что те захламляют сайт, так что вопрос с хорошими ответами невозможно найти.

  • 1 ненавидит 3, потому что они поощряют 2 к дальнейшим действиям в том же духе.

  • 2 ненавидит 1, потому что 1 постоянно минусуют/закрывают/удаляют/ругают их сообщения.

  • 3 ненавидит 1, потому что те продолжают закрывать/удалять вопросы, на которые они любят отвечать.

  • 1 и 3 имеют все права модерации, но только 1 заботится об их применении.

  • 4 сидит в сторонке и жуёт попкорн

  • 1 ненавидит 4, потому что те не помогают.


В комментариях к этой записи на StackOverflow опубликована даже картинка, которая иллюстрирует все эти болезненные взаимоотношения.



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




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


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Список всевозможных методов монетизации мобильных игр

Вы связаны с разработкой игр? Маркетингом игр? Сколько статей о монетизации игр вы прочли в последнее время? Лично я – очень много. Статьи, видео, слайды, аналитические обзоры и т.д. Конечно, понятно и очевидно, что никто не скажет вам супер-секрета успешной монетизации. Просто потому, что его нет и не может быть. Просто потому что, во-первых, плохую игру не спасет ни одна монетизация, а во-вторых, все игры разные.

Статья ниже – это список всевозможных монетизационных механик, которые встречались мне в играх, статьях и других источниках. Вместо того чтобы разбирать конкретные игры, я хочу перечислить как можно больше способов монетизации с небольшими комментариями.

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




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


Скидки:

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

1. Если ваша игра платная – скидка непосредственно на игру

2. Скидки при первой покупке внутри игры или на протяжении ограниченного периода после регистрации пользователя в игре.

3. Сезонные скидки и скидки на праздники, ограниченные по времени, желательно с таймером для пущего эффекта.

4. Скидки на покупку большого объема товаров и скидки на паки.


Boosts, power ups, ускорения и т.д.

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

1. Бусты могут быть доступны не сразу. Разблокировка буста является достижением в некоторых играх и становится наградой для пользователя.

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

3. К категории бустов можно причислить подсказки, которые тоже можно продавать.

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


Социальные механики и Мультиплеер

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

2. Бонус за ФБ логин. Выгодно и вам и игрокам.

3. Чтобы скооперироваться с другими игроками, вступить в клан и т.д. пользователю могут потребоваться специальные игровые предметы или взносы.


Ежедневные/еженедельные события

1. Ежедневный квест – это виральность вашей игры + доп. возможности по монетизации. Сделайте награду за квест настолько привлекательной и желанной, чтобы пользователю было выгодно потратить деньги на ресурсы именно сегодня.

2. Ежедневный бонус, становится уже классическим атрибутом множества игр. Может быть выполнен в форме рулетки, слота, мини-игры, mystery box и т.д. Возможность выигрыша супер-приза делает ежедневный бонус очень долгожданным, некоторые разработчики предусматривают возможность дополнительного «кручения барабана» за деньги.

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

4. Еженедельные турниры и рейтинги, обнуляющиеся и обновляющиеся каждую неделю соответственно. Сокращают разницу между новичками и матерыми игроками, неплохая постановка цели в краткосрочной перспективе.


Временные события (limited time events)

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

1. Во время временных ивентов игрок получает уникальные награды и предметы.

2. Количество опыта и ресурсов, получаемого во время временного ивента, увеличивается в несколько раз.


Уровни

1. Если в вашей игре есть уровни – добавьте классификацию успешно пройденных уровней на 1,2 или 3 звезды. В таком случае вы можете провоцировать условия, когда пользователю нужно пройти определенные уровни на 3 звезды.

2. 1-ый уровень или обучение могут давать награду по итогу успешного прохождения. Особенно актуально в качестве награды дать пользователю платный boost или power up, который он впоследствии опробует.

3. Посещение магазина и покупка контента за премиум-валюту в процессе обучения. Говорят, что так вы приучаете пользователя тратить. Кроме того, вы можете быть уверены, что игрок знает, где расположена кнопка магазина. Хотя лично мне, как пользователю, не нравится такой элемент обучения.


Контент

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

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

3. Премиум аккаунты. Здесь и премиум контент, и эксклюзивные возможности и т.д. Только не забывайте о балансе сил между платящими (премиумными) и не платящими игроками и постарайтесь сохранять равные условия игры для обеих сторон. Пробный премиум аккаунт может выступать в качестве редкого ежедневного бонуса, награды за ограниченный ивент, или как подарок на праздник либо особую дату, например, годовщину регистрации в игре.


Энергия и другие ограничители.

1. Кол-во жизней, запас сил, ограниченное кол-во строителей – все это энергетические механики, не дающие пользователю «перегреться» в рамках игровой сессии. Если игроку очень хочется, он покупает дополнительную энергию, просит ее у друзей или, конечно, переводит время на устройстве.

2. Явные или скрытые, так называемые пейволы, дойдя до которых игрок должен либо заплатить, либо выполнить сложное условие (собрать редкие ресурсы, уровень, который невозможно пройти без power upов и т.д.), либо просить друзей о помощи. Довольно суровый способ монетизации.

3. Ускорение может относиться к бустам, но давайте обратим на него внимание еще раз. Как только игрок сталкивается с длительным процессом в игре, например стройкой, ремонтом, тренировкой, созреванием и т.д. вы можете и должны предложить ему ускоренный вариант за умеренную плату. Плата за время – один из наиболее прогрессивных и распространенных подходов к монетизации F2P игр.


Декоративные элементы украшения

1. Для персонажей продавайте костюмы, в том числе и праздничные, аксессуары, игрушки и т.д. Украшения для городов и ферм, тюнинг для машин и все, что придумаете.

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

3. Декоративные элементы могут идти в придачу к другим покупкам, делая их более привлекательными и выгодными.

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


Очевидное:

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

2. Продажа внутриигровой валюты.

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


Как не нужно делать.

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

2. За премиум контент не должно быть стыдно. Постарайтесь, чтобы премиумным контентом хотелось гордиться.


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

Помните что в основе многих успешных игр – возможность выбора короткой либо долгой игровой сессии, во многих играх важно социальное взаимодействие и соперничество, не забывайте, что с течением времени и прогрессом игрока геймплей и структура игры для него могут и должны совершенствоваться и усложняться, игрок должен видеть свой прогресс! И уж, конечно, не забывайте о качественной, интересной (пусть и для своей целевой аудитории) игре, рассчитанной на долгий игровой процесс.

Я надеюсь, статья будет полезна ребятам, которые самостоятельно разрабатывают игры и не всегда знакомы с многочисленными существующими моделями и решениями по монетизации. Статья не претендует на звание всеобъемлющего справочника. Кроме того, прошу прощения за лексику, английские слова и отсутствие картинок. Указывайте в комментариях пропущенные механики, и я добавлю их в список. Если вам показалось, что отрывок материала соответствует какому-то хорошему источнику, я с радостью добавлю ссылку на него в статье.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


[Из песочницы] Я vs openSUSE

Здравствуйте, уважаемые члены сообщества Habrahabr! В этой заметке я бы хотел рассказать о своих впечатлениях, связанных с попыткой моего возвращения к openSUSE.

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





Это уже второй мой подход к «снаряду». Первый был несколько лет назад, и был он как бы удачным. Только, на тот момент у меня не было нормального доступа в интернет. Да и с видеочипом ATI были некоторые проблемы. Вот и решил отложить дальнейшее знакомство до лучших времён, заменив его на AgiliaLinux, не помню, какой версии. А когда настали лучшие времена, я решил попробовать Linux Mint, на тот момент 13, с рабочим столом Mate. Так он с тех пор у меня и прижился. И стоял бы он и дальше, да вчера до того мне захотелось посмотреть на что-то новое, что я не выдержал, и установил openSUSE 13.1.

Как известно, Ubuntu и его браться/сёстры могут загружаться и устанавливаться из iso-образа, лежащего на флешке или на винчестере. А может ли openSUSE сделать то же самое? Думаю, надо попробовать. Не получится, значит не судьба. И пытаться не буду.

Итак, недолгие поиски в интернете привели меня на эту страницу. Недолго думая, я примонтировал образ свежескачанного дистрибутива, забрал с него файл grub.cfg и внёс следующие исправления (выделены жирным шрифтом):



menuentry 'Installation' --class opensuse --class gnu-linux --class gnu --class os {

set gfxpayload=keep

loopback loop /openSUSE-13.1-DVD-x86_64.iso

echo 'Loading kernel ...'

linuxefi (loop)/boot/x86_64/loader/linux install=hd:////openSUSE-13.1-DVD-x86_64.iso

echo 'Loading initial ramdisk ...'

initrdefi (loop)/boot/x86_64/loader/initrd

}





Этот файл вместе с iso-образом я положил на флешку, в корневой каталог, переименовав его в grub-suse.cfg. Ранее я установил на эту же флешку grub2-efi, хотя, как показала практика, делать это не обязательно, если на винчестере уже есть grub2. Как бы там ни было, перезагружаюсь. Появляется меню grub2. Нажатием [Esc] перехожу в командную строку и пишу следующее:

set root=(hd1,1)

insmod /path/to/grub2_modules/loopback.mod

configfile /grub-suse.cfg





Появляется меню. Выбираю первый пункт и, о чудо, загрузка пошла! И мало того, что пошла! Инсталлятор нормально загрузился и так же нормально установил систему. Спустя некоторое непродолжительное время, компьютер перезагрузился в свежеустановленную систему. Апплет обновления показал, что система хочет обновиться. Ну что ж, пусть обновляется. Только для обновления я дал команду sudo zypper up в терминале. А то апплет на панели задач малоинформативен. После обновления подключил Packman и поставил кодеки, сделав для себя несколько открытий, как это правильно делается.

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

Во первых общее впечатление о KDE какое-то гнетущее. Было время, когда я считал, что KDE – это единственный полноценный рабочий стол, а остальное всё – просто жалкие поделки. Но пожив сначала с AgiliaLinux, а потом и с Linux Mint, я привык сначала к GNOME2, ну а в Mate вообще влюбился. Среда очень проста, быстра, не перегружена красивостями и излишествами. На её фоне, KDE выглядит чем-то большим, чересчур блестящим и довольно тяжеловесным. Пока не установил драйверы от AMD, вентилятор на процессоре периодически то раскручивался, то останавливался.


Описанная выше проблема – это, в общем-то, и не проблема. Это всего лишь дело привычки. А вот проблемы начали появляться несколько позже. Выполняя простые действия, типа сворачивания окон или переключения между ними, иногда экран превращался в нечто непотребное. Изображение выглядело как свалка из треугольников. Перемещая мышь по столу, вся эта куча треугольников шевелилась и ничего разобрать в этой мешанине не представлялось возможным. Помогало только переключение на первую системную консоль с последующей командой sudo /etc/init.d/xdm restart. Столкнувшись с такой проблемой раз пять, я просто выключил визуальные эффекты. Теперь проблем нет, но нет и чего-то такого этакого, непривычного. Ну да ладно. Главное, всё работает, и без грубых перезагрузок.


Затем проявлась проблема с IPTV. Просто не показывает и всё тут, хотя все необходимые кодеки есть. Проблема крылась в брандмауэре. Дело в том, что в openSUSE он по умолчанию активен. И, кроме всего прочего, гасит все широковещательные рассылки. Что ж, открываем /var/log/firewall, читаем последние строки, находим в них широковещательный адрес и вставляем его в список пользовательских правил брандмауэра. В итоге всё работает.


Пока это вроде бы все проблемы. И как видно, проблемы эти решаемы. Но просты они не для новичка. Не зная, куда копать, можно быстро разочароваться в системе. Взять хотя бы установку кодеков. В сети есть множество описаний процесса, но мало где хоть что-то говорится о «смене поставщика». Поначалу, предложение обновить пакеты со сменой поставщика, вызывало у меня сомнения и боязнь сломать систему. Уже потом я обнаружил, что можно зайти в GUI zypper'а (до этого я пользовался командной строкой – привычка) и выбрать нужную мне версию. При этом, зависимые пакеты будут также заменены на пакеты от этого же поставщика.


Система установлена. С пакетами проблем нет. Видео, аудио и ТВ работают. Казалось бы, пользуйся и радуйся! Но, постоянно гложет какое-то непонятное чувство. Постоянно присутствует желание не ждать Mint'а 17, а прямо сейчас вернуть 16-й, снеся openSUSE. При этом, что-то останавливает. Что ж, поживём – решим, что делать дальше…


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


[Из песочницы] Создание медиаплощадки средствами CMS Drupal

Всем привет!

Этот пост — первый из серии постов о создании мультимедийного/музыкального проекта на базе CMS/CMF Drupal. Так получилось, что этот пост также претендовал на получение инвайта. C'est la vie.


0. Преамбула




Итак, почему я приступаю к созданию такого проекта? Потому что сейчас профессиональному музыканту сложно


  1. начать выступать (нет сценического опыта)

  2. найти новые, «незаезженные» произведения (это очень ценится в профильных учреждениях)

  3. послушать/посмотреть записи других выступлений (необходимо для выработки собственной манеры исполнения)


Ну, а поскольку целевая аудитория — это всё-таки молодёжь (хотя и золотая тоже ого-го!), то проект реализовать предполагается посредством Интернета. Сразу оговорюсь — я не программист, поэтому сочетание «программный вывод полей» для меня пока ещё равнозначно вызову Вельзевула.


Отмечу — относительно недавно увидел, что моя идея нашла частичную реализацию в «чужой» соцсети Splayn. По ряду причин этот вариант меня не устроил — дальше я объясню, почему.



1. Выбор CMS




Да простит меня Drupal, но я ему умудрялся периодически изменять с самыми разными движками. В разное время мною были опробованы/осмотрены/эксгумированы следующие CMS (список неполный, мог что-то упустить):


  1. LiveStreet

  2. Joomla

  3. Oxwall

  4. Dolphin

  5. NING

  6. InstantCMS

  7. SantaFox

  8. BuddyPress

  9. Fruml

  10. ModX

  11. SocialEngine

  12. Facebook Clone (или как-то иначе)


Я не профессионал, но на возможность углубленного изучения каждого из них это, по-моему, никак не влияет.

Каждый из этих движков является очень перспективным в своей стезе, но ни в одном я не нашёл тех преимуществ, которые нашёл в Drupal:



  • безопасность

  • расширяемость

  • масштабируемость


2. Splayn




КонкурентИнтересный проект, который первым сумел реализовать бОльшую часть того, что задумывалось лично мною. Здесь тебе и музыка, и видео, и ноты, и афиши, и мероприятия, и рецензии… Но лично меня не устраивает несколько параметров, над которыми я и сам, честно говоря, задумался:


  1. отсутствие основной навигации на внутренних страницах

  2. опять музыкальные инструменты!

  3. «удобности»


1. Навигация



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



Я не осуждаю оформление — видно, что сделано с душой и с головой. Но мне, например, хотелось бы, чтобы при посещении сайта не было ощущения «академичности», как будто ты попал в музей, где ничего нельзя трогать. Мне хочется, чтобы пользователю было где отдохнуть вечером после занятий или утром перед занятиями. Чтобы никто не чувствовал себя скованно, находясь на сайте.
3. Юзабилити



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

С другой стороны, здесь есть, чему поучиться:



  • профиль пользователя

  • скорость работы сайта (вероятно, работает на Perl)

  • компоновка элементов на странице




и многое другое. Уверен, что найдётся и масса других плюсов, но правильно говорят в народе: взялся за гуж — не говори, что не дюж!

Продолжение, а именно подборка модулей и библиотек — в следующих постах.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


[Из песочницы] USB счетчик электроэнергии постоянного тока

В данной статье представляется разработка USB-счетчика электроэнергии постоянного тока.

image



На основе представленной схемы вольтметра и прошивки микроконтроллера PIC18F2550 [http://ift.tt/1inHw1M ] была созданна USB-программа, которая могла бы считать электроэнергию, для цепи с постоянным сопротивлением. Так как счетчики постоянной энергиии редкость и дорого (20-30 тыс. руб. в России и 6-10 тыс. руб. в Китае и Индии) то решили сами сделать счетчик, который подходил бы для наших лабораторных исследований, который в итоге составил цену не дороже 400 руб., по компонентам. Делали счетчик для замеров и сравнения энергии рекуперации в электродвигателях разной конструкции, но одинаковой мощности, также он может быть применим, как измеритель получаемой энергии от ветрогенератора, солнечных батареек и других источников энергии постоянного тока. Написанная программа может считать не только квт*ч, но и вт*ч, вт*с и т.д…


Собранная схема включала делитель напряжения, который одновременно был расчетным сопротивлением (выделено красным)


image


Которое вводилось в USB-программу (выделено красным):


image


Выделено голубым значение множителя напряжения, его перед замерами можно получить по формуле указанной здесь: bit.ly/1oNddey. Либо подобрать по мультиметру, то есть замеряя мультиметром напряжение батарейки, а потом вводить такое значение множителя напряжения, чтобы USB-программа (с помощью нашего счетчика) показывала на этой же батарейке такое же напряжение как на мультиметре.


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


Стоит заметить, что схема в Proteus отличается от схемы, которая выполнена в железе. VCC (красненький проводок USB) будет идти не на 1 ногу, а на 20 ногу PICа. Также в схеме для Proteus не нарисованы 8 и 19 нога, в железе 8 или 19 (по выбору) нужно отвести на землю.


image

image


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


image


Чтобы USB-программа работала нужно чтобы был установлен Framework 4.0 (http://bit.ly/1i3X8f6) или его поздние версии. Если включаем USB-программу на Windows 7, то нужно её включать, как от Администратора.


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


image


В USB-программе также можно поставить шумовой порог напряжения (выделено зеленым), который будет считать за 0 вольт все значения не превышающее выбранное для шумового порога в примере указано 0.05 В.


image


Алгоритм USB-программы для расчета энергии постоянного тока:



USB-программа получает измеренное напряжение от микроконтроллера, потом делит на вводимое сопротивление, получается ток. После, измеряемое напряжение умножается на вводимую величину умножителя напряжения, получается реальное напряжение, которое подается на счетчик до делителя. Это реальное напряжение перемножается с током и интегрируется по времени, получается значение энергии.
Ссылка на USB-программу:

http://ift.tt/1inHw1S

Ссылка на исходники USB-программы си#:

http://ift.tt/1inHtTB

Ссылка на симуляцию схемы в Proteus, и на прошивку контроллера PIC для кварца 20 Mhz:

http://ift.tt/1pBvvzJ

Ссылка на исходники прошивки (asm, c) и прошивка для кварца 4 Mhz:

http://ift.tt/1inHtTD
Разработка USB-программы:

Николай Ерёмин

Ведение проекта:

Юлиан Барышников
Благодарности:



Moty Mizrachi за бескорыстное представление USB-вольтметра на своем сайте, а также советы по переписке.

Роману Веринскому и Виталию Павлову за бескорыстную помощь и советы по пайке и прошивании микроконтроллеров.

Виталию Азарову за бескорыстные советы по формулам и построении схемы для измерения энергии постоянного тока.

Urry за бескорыстную проверку схемы в железе и исправления прошивки на кварц 20 Mhz.

Александре Медяниковой за бескорыстную фотосъемку готовой схемы в железе.

This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Как устроен музыкальный поиск. Лекция в Яндексе

Обычно под музыкальным поиском понимают умение отвечать на текстовые запросы о музыке. Поиск должен понимать, например, что «пятница» – это не всегда день недели, или находить песню по словам «хочешь сладких апельсинов». Но этим задачи музыкального поиска не ограничиваются. Бывает, что нужно распознать песню, которую напел пользователь, или ту, которая играет в кафе. А ещё можно находить общее в композициях, чтобы рекомендовать пользователю музыку на его вкус. Как это делается и какие трудности при этом возникают студентам Малого Шала рассказали Елена Корнилина и Евгений Крофто.

Как устроен текстовый музыкальный поиск




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

Для примера возьмем наименования четырех отечественных исполнителей:



  • Пятница

  • Пицца

  • Кино

  • 30.02

  • Аквариум




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

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



  • TI NAKAYA ODNA00 (Дорн)

  • Sk8 (Нервы)

  • ДоползлиДаподдай (Dёргать)

  • N1nt3nd0

  • Oxxxymiron

  • dom!No

  • P!nk

  • Sk8ter boi (Avril Lavign)




Кроме того, существует множество исполнителей с похожими или даже одинаковыми названиями. Допустим, в поиск пришел запрос [агилера]. На первый взгляд все понятно, пользователь ищет Кристину Агилеру. Но все же остается некоторая вероятность, что пользователю был нужен совсем другой исполнитель – Paco Aguilera.


Очень распространена ситуация с совместным исполнением двух и более исполнителей. Например, песню Can't Remember to Forget You можно отнести сразу к двум исполнительницам: Shakira и Rihanna. Соответственно в базе должна быть предусмотрена возможность добавления объединенных исполнителей.


Еще одна особенность – это региональность. В разных регионах могут встречаться исполнители с одинаковыми наименованиями. Поэтому, нужно учитывать, из какого региона пришел запрос, и выдавать в результатах поиска наиболее популярного в этом регионе исполнителя. Например, исполнительницы с именем Zara есть как в России, так и в Турции. При этом, их аудитории практически не пересекаются.


C названиями треков тоже все на так просто. Очень распространены кавер-версии, когда один исполнитель записывает свою интерпретацию трека другого исполнителя. При этом, кавер-версия может быть даже популярнее оригинала. К примеру, в большинстве случаев по запросу [видели ночь] версия группы Zdob si Zdub будет более релевантной, чем оригинальный трек группы «Кино». Аналогична ситуация и с ремиксами.


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


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


Трудности перевода




Очень часто в разных странах закрепляются различные варианты написания имен исполнителей и композиторов. Поэтому нужно учитывать, что и пользователь может искать по любому из этих вариантов, и в базе могут встречаться разные написания. У имени Петра Ильича Чайковского есть около 140 вариантов написаний. Вот лишь некоторые из них:


  • Пётр Ильич Чаиковский

  • Peter Ilych Tchaikovsky

  • Pyotr Ilyich Tchaikovsky

  • Pyotr Il'ic Ciaikovsky

  • P.I. Tchaikovski

  • Pyotr Il’yich Tchaïkovsky

  • Piotr I. Tchaikovsky

  • Pyotr İlyiç Çaykovski

  • Peter Iljitsch Tschaikowski

  • Pjotr Iljitsch Tschaikowski




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

Анализ аудиосигнала




Помимо метаданных трека и текстов песен в музыкальном поиске можно использовать данный, полученные при помощи анализа непосредственно аудио сигнала. Это позволяет решить сразу несколько задач:


  • Распознавание музыки по фрагменту, записанному на микрофон;

  • Распознавание по напеванию;

  • Поиск нечетких дубликатов;

  • Поиск кавер-версий и ремиксов;

  • Выделение мелодии из полифонического сигнала;

  • Классификация музыки;

  • Автотегирование;

  • Поиск похожих/рекомендации.




Цифровой аудиосигнал можно представить в виде изображения звуковой волны:


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



Чем уже интервалы между точками, тем выше частота дискретизации сигнала, и тем шире частотный диапазон, который можно закодировать таким образом.


Мы видим, что амплитуда колебаний зависит от времени и коррелирует с громкостью звука. А частота колебаний напрямую связана с высотой звука. Как же нам получить информацию о частоте колебаний: преобразовать сигнал из временного домена в частотный? Здесь нам на помощь приходит преобразование Фурье. Оно позволяет разложить периодическую функцию в сумму гармонических с разными частотами. Коэффициенты при слагаемых будут давать нам те частоты, которые мы хотели получить. Однако мы хотим получить спектр нашего сигнала, не теряя его временную составляющую. Для этого применяется оконное преобразование Фурье. По сути, мы делим наш аудиосигнал на короткие отрезки – фреймы – и вместо одного спектра получаем набор спектров – отдельно для каждого фрейма. Сложив их вместе мы получим примерно такую картину:



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


Классификация признаков




Такие спектрограммы лежат используются большинства применяемых в музыкальном поиске методов анализа. И прежде чем двигаться дальше, нам стоит разобраться в том, какие признаки спектрограммы нам могут быть полезны. Классифицировать признаки можно двумя способами. Во-первых, по временному масштабу:


  • Frame-level – признаки, относящиеся к одному столбцу матрицы.

  • Segment-level – признаки, объединяющие несколько фреймов.

  • Global-level – признаки, описывающие весь трек целиком.




Во-вторых, признаки можно классифицировать по уровню представления, т.е. насколько высокоуровневые абстракции и концепты описывают эти признаки.


  • Low-level:


    • Zero Crossing Rate – позволяет неплохо различать музыку и речь;

    • Short-time energy – отражает изменение энергии во времени;

    • Spectral Centroid – центр масс спектра;

    • Spectral Bandwidth – разброс относительно центра масс;

    • Spectral Flatness Measure – характеризует «гладкость» спектра. Помогает отличать сигнал похожий на шум от сигналов с выраженной тональностью.



  • Middle-level:


    • Beat Tracker;

    • Pitch Histogram;

    • Rhythm Patterns.



  • High-level:


    • Музыкальные жанры;

    • Настроение: веселая, грустная, агрессивная, спокойная;

    • Вокальная / Инструментальная;

    • Ощущаемая скорость музыки (медленная, быстрая, средняя);

    • Пол вокалиста






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

This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.