FileZilla shortcut

В своей работе веб-программистом мне часто приходится использовать FTP клиент и обычно доступы к серверам приходят в стандартном URI формате ftp://user:password@server:port/, сохранять пароли на рабочей машине не принято из соображений безопасности, поэтому приходилось каждый раз копировать все строчки отдельно, а это не доставляет никакой радости, тем более можно нечаянно забыть выделить нужные символы в пароле и пытаться безуспешно подключится, тратя своё драгоценное время.

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

Следуя linux way, у меня родился скрипт, исполнение которого я повесил на сочетания клавиш shift + ctrl + f

#!/bin/sh
xclip -selection "primary" -o | xargs filezilla &

Команда xclip с заданными аргументами копирует выделенный фрагмент текста из буфера обмена X Window System в стандартный поток ввода, который в дальнейшем как аргумент передается на запуск FTP клиента FileZilla.

Выражаясь проще, для открытия нужного FTP достаточно выделить строчку с URI и нажать shift + ctrl + f.

STM32L-DISCOVERY + FDD

Всё что нужно знать о Floppy Disk Drive:

Для того что бы подключить STM32L-DISCOVERY к FDD тебе понадобиться 4 провода и 2 джампера.

Android – Volley Library Example

Вольный перевод одноименной статьи Paresh Mayani.

Я уверен вы, еще не слышали слово "Volley", это библиотека, представленная на Google I/O 2013 Ficus Kirkpatrick.

Для чего библиотека Volley?

Volley это библиотека, которая делает сетевые приложения для Android проще и, самое главное, быстрее.

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

Легальное скачивание музыки из "Вконтакте"

Прямая авторизация
Доверенные приложения могут получить неограниченный по времени access_token для доступа к API, передав логин и пароль пользователя... Доступ к этому типу авторизации может быть получен только после предварительного согласования с администрацией ВКонтакте.

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

Лучшие практики MVC

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

  1. Модель
  2. Представление
  3. Контроллер

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

Предположим, что веб-приложение состоит из нескольких подприложений, таких как:

  • front end: часть сайта, которую видят обычные пользователи;
  • back end: административная часть сайта, позволяющая управлять приложением. Доступ к ней обычно ограничен;
  • консоль: приложение, состоящее из набора консольных команд, запускаемых в окне терминала вручную или по расписанию;
  • API: предоставляет сторонним приложениям интерфейсы для интеграции с вашим приложением.

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

1. Модель

Модели представляют внутреннюю структуру данных приложения. Они часто являются общими для нескольких подприложений. Например, модель LoginForm может быть использована как в пользовательской, так и в административной части приложения. Модель News может использоваться консольными командами, API и front/back частями приложения. Поэтому модели

  • должны содержать свойства, представляющие конкретные данные;

  • должны включать в себя бизнес-логику (например, правила валидации), чтобы убедиться в том, что данные соответствуют предъявленным требованиям;

  • могут содержать код для работы с данными. К примеру, модель SearchForm, помимо хранения поисковых данных, может содержать метод search, который этот поиск осуществляет.

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

  • Создать модель NewsBase, содержащую только код, общий для подприложений (пользовательской и административной частей).

  • В каждом подприложении создать модель News, наследуемую от NewsBase и определить в ней специфичные для подприложения методы.

Таким образом, если применить это к рассмотренному выше примеру, необходимо добавить модель News с методом getLatestNews в пользовательскую часть и ещё одну модель News с методом getDeletedNews в административную часть.

В общем случае, модели не должны напрямую взаимодействовать с пользователем. То есть:

  • не должны использовать $_GET, $_POST или другие подобные переменные, напрямую получаемые из запроса пользователя, так как модели могут использоваться в совершенно других подприложениях (например, в модульных тестах или API), в которых эти переменные недоступны. Все переменные, относящиеся к запросу пользователя, должны обрабатываться в контроллере;

  • не должны генерировать HTML или другой код представления, так как он может изменяться в зависимости от нужд пользователя (то есть, пользовательская часть и административная часть могут показывать новости в совершенно разном формате). Такой код должен генерироваться в представлениях.

2. Представление

Представления отвечают за отображение моделей в необходимом пользователю формате. В общем случае представления

  • должны, главным образом, содержать разметку, такую как HTML, и простой PHP код, используемый для обхода, форматирования и отображения данных;

  • не должны напрямую обращаться к базе данных. Этим должны заниматься модели;

  • не должны напрямую обращаться к $_GET, $_POST и другим переменным, получаемым из запроса пользователя. Эту задачу должен выполнять контроллер. Представления должны использоваться только для оформления данных, полученных от контроллера и модели;

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

3. Контроллер

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

  • может обращаться к $_GET, $_POST и другим переменным PHP, получаемым из запроса пользователя;

  • может создавать экземпляры моделей и управлять ими. К примеру, в типичном действии обновления модели контроллер может сначала создать экземпляр модели, затем заполнить его данными из $_POST и, в случае успешного сохранения модели, перенаправить браузер пользователя на страницу созданной модели. Стоит отметить, что само сохранение модели должно быть реализовано в классе модели, а не в контроллере;

  • не должен содержать SQL-запросы. Их лучше держать в моделях;

  • не должен содержать HTML и другую разметку. Её стоит вынести в представления.

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

Как узнать, что ваш PHP сайт был взломан

Вольный перевод статьи Greg Freeman "How to Tell if Your PHP Site has been Hacked or Compromised"

Сайт моего друга недавно был взломан, на нем была запущена старая версия IP.Board, в которой есть уязвимость локального внедрения кода (local file inclusion). Этот пост не будет посвящен IP.Board или другому php коду, он покажет, как найти потенциально вредоносный php код на ваших серверах. Наконец, покажу пример того, что злоумышленники могут загрузить на взломанный сайт.

Проверьте логи доступа

Что бы с чего-то начать, я бы хотел поделиться некоторыми записями из журнала доступа (access log) взломанного сайта моего друга.

IPREMOVED - - [01/Mar/2013:06:16:48 -0600] "POST /uploads/monthly_10_2012/view.php HTTP/1.1" 200 36 "-" "Mozilla/5.0"
IPREMOVED - - [01/Mar/2013:06:12:58 -0600] "POST /public/style_images/master/profile/blog.php HTTP/1.1" 200 36 "-" "Mozilla/5.0"
Необходимо часто проверять журналы доступа на сервере, однако если вы не будете осторожны, URL такие как выше, которые на первый взгляд выглядят безобидно, могут пройти прямо мимо вас.

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

Рассмотрим подробнее приведенные выше строки журнала, ничего не цепляет вас?

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

Mint-X-Dark icons

Установил девушке на нетбук Linux Mint.
Понравилась тема оформления Mint-X-Dark, но оказалось, что стандартных иконок в ней нет. В результате черные иконки на черном смотрятся очень паршиво.

Как говориться выход найдется всегда:
find . -iname "*.png" -type f -printf "%f\0" | xargs -0 -I {} convert {} -negate {}
Качайте архив Mint-X-Dark actions icons, и копируйте файлы от root-а в папку /usr/share/icnos
сюда туда →