Архив метки: работа

Автоматизированное распознавание простой капчи с помощью Google Docs

По роду деятельности не часто, но сталкиваюсь с капчами. Из-за больших объемов работы многие процессы автоматизированы, среди которых и распознавание капчи — эта стадия осуществляется с помощью сервиса Antigate, который достаточно стабильно работает, и отличается низкой ценой.
Однако на днях попалась интересная новость (ну как новость — с опозданием на пару месяцев) о том, что сервис Google Docs распознает текст, который загоняется на сервис с виде картинок или pdf-документов. Сразу же возникла мысль использования ресурсов Google автоматизированного для распознавания капчи.
Алгоритм работы, осуществляемый в режиме он-лайн в браузере представляется следующим:

1. В процессе работы наталкиваемся на капчу
2. Получаем капчу в виде графического файла с расширением, которое поддерживается сервисом Google Docs. В настоящее время это форматы .jpg, .png, .gif размером не более 2-х мегабайт. Учитывая, что речь идет о капче — лимит размера загружаемой картинки нас не особо волнует.
3. Открываем новую вкладку
3. В ней загружаем картинку на сервис
4. Открываем картинку в виде текстового файла внутри сервиса
5. Получаем данные в виде готового текста
6. Закрываем вкладку с распознанной капчей
7. Используем результат распознавания в работе

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

В результате 10 экспериментов, проведенных по описанной выше схеме (в качестве рабочего решения для тестирования использовался блок, написанный на Zennoposter), установлено, что Google без проблем справляется с простыми числовыми капчами, но практически бесполезен при распознавании капчи, представленной на картинке ниже (верхняя часть — капча — нижняя часть — результат распознавания):
Распознавание капчи с помощью Google Docs

Итог эксперимента прост: продолжаем использовать Antigate далее. 1 бакс за 1000 распознанных капч — вполне нормальная цена, а многопоточность — никто не отменял.

 

Codecademy.com — курс PHP — урок: Иначе (Else)

Привет-привет!
Суровые будни накрыли своими волнами, и вот, с некоторой задержкой, мы продолжаем изучение языка PHP.
Темой сегодняшнего занятия будет оператор ЕСЛИ (Else).
Как всегда — посмотрим, что по этому поводу говорит Codecademy:

Great! We used an if statement to do something if the answer to the condition was yes, or true as we say in PHP.
In addition to doing something when the condition is true, we can do something else if the condition is false. We can do this using an if / else statement:

<?php
  $name = "Edgar";

  if ($name == "Simon") {
    print "I know you!";
  }
  else {
    print "Who are you?";
  }
?>

Just like before, if the condition istrue, then only the code inside the first pair of curly braces will run.Otherwise, the condition is false, so only the code inside the second pair of curly braces after the else keyword will run.

In the example above the condition$name == "Simon" evaluates to falsesince $name is Edgar. Since the condition is false, only the code inside the curly braces after the elsekeyword runs, and prints out Who are you?

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

Оператор Else позволяет использовать конструкции в случае, когда нужно выполнить условие не только в случае истинности или ложности какого-то фактора, но и в обратном. Т.е. в случае 2+2=4 мы выводим сообщение «Верно», а вот если 2+2 вдруг станут равны 5 = выводим несколько иное сообщение. В примере, представленном Академией рассматривается сцена знакомства, когда:

Переменная = Эдгар

Если Переменная = Симон — выводим сообщение — Привет!

Иначе — выводим сообщение: «А ты хто такой ваще?»

На словах все просто, но что покажет практика?

Задание на сегодняшний уроки звучит следующим образом:

Under your if statement on line 12, write an else statement to capture the people who are only buying 5 items or fewer. In their case, use echoto output "You get a 5% discount!"

т.е. нам нужно добавить в код конструкцию, благодаря которой в случае покупки больше 5 позиций покупатель получит скидку в 10%, а в случае покупки меньшего количества товаров — уже 5% скидки, о чем и вывести соответствующее сообщение. Пример сегодняшнего кода: <html> <head> </head> <body> <p> <?php $items = 3; if($items > 5) { echo «You get a 10% discount!»; } ?> </p> </body> </html> Что видно из кода? Начальная переменная = 3. Поставим значение переменной например в 4. После чего делаем проверку: если переменная 4 (а мы в теории можем поставить какое угодно значение переменной) больше 5 — выводим сообщение о получении скидки в 10%. Однако — по условиям задания нам нужно обеспечить скидку в 5% тем, кто купил меньше 5 товаров. Добавляем в код следующую конструкцию: else { echo "You get a 5% discount!"; } получая при этом следующую логику: Если переменная больше 5 - выводится сообщение о скидке в 10%, однако в противном (а это наш случай) случае (переменная меньше 5 - выводится сообщение о скидке в 5%. Условия задачи выполнены, а сам код представлен ниже: <html> <head> </head> <body> <p> <?php $items = 4; if($items > 5) { echo "You get a 10% discount!"; } else { echo "You get a 5% discount!"; } ?> </p> </body> </html>
Кликни на картинку - и она увеличится ;)
Кликни на картинку — и она увеличится 😉

WordPress — отображение виджета на определенной странице

Только что столкнулся с задачей организации вывода содержимого виджета в движке WordPress на определенной странице. В связи с тем, что время — вещь весьма ограниченная, разбираться в кодах не будем — просто рассмотрим плагин Widget Logic, скачать который можно этой ссылке.

Лично для меня плюсом данного плагина в помощи организации отображение виджета на определенной странице явилась простота организации модели поведения вывода — с помощью указаний Conditional Tags (подробнее об этом вы сможете узнать тут) в опциях вывода виджета. Например, на скрине ниже видно, что данный виджет будет отображаться только в категории новостей и на страницах одиночных записей:
отображение виджета на определенной странице

В качестве параметров для примера можно отметить такие:

  • Отображать только на главной странице: is_home()
  • Отображать только на страницах постов: is_single()
  • Отображать только на страницах: is_page()
  • Отображать только на страницах архива (категорий, тэгов и т.д.): is_archive()
  • Отображать на страницах результата поиска: is_search()
  • Отображать на всех страницах, кроме главной: !is_home()
  • Отображать на странице “Blog” или “Contact” : is_page(‘blog’) || is_page(‘contact’)

В случае возникновения вопросов не стесняйтесь задавать их на почту oleksiy@lavrynenko.com

API Yandex переводчик

Для личных нужд сгенерировал не так давно список API специально для Yandex Translate.
На случай, если вы ищите API для Yandex переводчик  — список ниже 😉 Берите на здоровье.
В планах дополнить список, но это уже позже.

trnsl.1.1.20141122T205939Z.b11494a684531fa9.46b9f725724c9d33b2ac45408da28bc259c03575
trnsl.1.1.20141122T212955Z.9f058c0600d31cdd.fa0d92675f4c7a8fe983a024792a4a6d1d240da3
trnsl.1.1.20141122T212955Z.9f058c0600d31cdd.fa0d92675f4c7a8fe983a024792a4a6d1d240da3
trnsl.1.1.20141122T215114Z.a2733df9f9a0676b.92a0d918cb1dde46e4c436f7c119feeb54665ce7
trnsl.1.1.20141122T215232Z.88ed72182220666e.54c07fdf4d313fa5d2ae0852b60111c0d545e0ec
trnsl.1.1.20141122T215408Z.41bfc3d0a123e9c4.26f3fcf2e6609dd3425cd06479496c389a175af6
trnsl.1.1.20141122T221309Z.03e3941e0c95842d.14845f9bdfb1a63c92d98a9898424bb9d7a498de
trnsl.1.1.20141122T221713Z.6e64069176850cf5.6e0a8047171957de6c2ccffa0b30209d212c86b2
trnsl.1.1.20141122T221919Z.c2be2e54634cd1d5.e7b29976a2f207a20ccadb64300d97d84a685e2e
trnsl.1.1.20141122T222911Z.f24646ec12fac560.f7eaa478325036b2c61f6a73ea39019412009485
trnsl.1.1.20141122T224900Z.af0389d255b83fb5.0dec7ea67ecbfca7b23b71d46e764a6835bbeae2
trnsl.1.1.20141122T225550Z.7355466038a9d515.5f591207e2af04249b795fbcb6643314c9a8ebdb
trnsl.1.1.20141122T225804Z.56df9be112260d4d.5f897339fc421e7220bcfd724e01312bebf11251
trnsl.1.1.20141122T230127Z.8a52a3b34d53cff5.33a9d17a187293b56e0957a0735ac387760d9d44
trnsl.1.1.20141122T230351Z.6d6cdc0f8a3d27a7.b0181b97e5ab53b7d0f7f777adaa450bdb44138c
trnsl.1.1.20141122T230616Z.1d64ca451625b543.7a3eec3823594f18524d6fe5c4a74c91ebff1aaa
trnsl.1.1.20141122T231058Z.cddc48558c86a186.029866c45c9bb0fca8d84b16f718d42e63d0804c
trnsl.1.1.20141122T231521Z.afd069226e89ac2b.32ccdad22bc80b4cc3aa9fc2dfbb755bcae8bdbc
trnsl.1.1.20141122T232108Z.ca7e2c03d1e66432.1f8270332e9d6fbd4a651e6309cf0e3f04b3648c
trnsl.1.1.20141122T232750Z.26e49e2ee63c6998.135c1a4bce18427d17e9de0dff65c1307f9886c6
trnsl.1.1.20141122T235745Z.4226df9020248357.2e4bbec6091eec12933f18115030b22297aedbe0
trnsl.1.1.20141123T001119Z.6b89f91f93c01011.0656c27e7224deadd83f86cd9591f6de284e614e
trnsl.1.1.20141123T001332Z.ff87353d0d4f9796.9d2d2d8e8517a847fa7472da126cc1e3ea164b10
trnsl.1.1.20141123T001508Z.c93b9683082a0f10.c0fa1bcc7c6405468621ef0ab7825cc445f7b3a6
trnsl.1.1.20141123T001643Z.a8b4bc882d660a46.6591690f2dca475d980414ccc77bd924abbc5f59
trnsl.1.1.20141123T001812Z.84fb26b9259f7f81.1a5a939ccfcdca6aad0868a95922530f50e7ad18
trnsl.1.1.20141123T002002Z.3f78ce23219e1465.df6127f6ff3c994436ef7953810a5b1617e3729a
trnsl.1.1.20141123T002156Z.7b21abc3a324f822.a2f635970ba2d7b9fb3cc3815a7865e6910a2cad
trnsl.1.1.20141123T002340Z.2611ecba0f781c6c.b69c51344c53ff99342f75f37c25d9b23f7cb69f
trnsl.1.1.20141123T002529Z.417145a2a99f3cca.6b7541014142f4b6ffdd9e7e46aa33cc176266a0