dotzero

↑ ↑ ↓ ↓ ← → ← → B A Start

Pad - pastebin без стероидов

В то время когда к интернету подключена каждая кофеварка, sharing небольших текстовых данных между MacOS и Linux или между iPhone и Windows все еще превращается в «танцы с бубнами». Можно конечно отправить письмо самому себе, как в средневековье. А если получатель кто-то другой, то на сцену выходит Pastebin со своими непомерными требованиями к заголовкам, типу контента, уровню видимости и капчей. Можно попроще?

Встречайте Pad — сервис где не нужно ничего заполнять, выбираешь ссылку и вставляешь текст в textarea и открываешь ссылку на другом устройстве. Сервис, как сейчас принято, написан на Go, а для стораджа используется BoltDb, это такая встраиваемая key/value база данных. Завернуто это, как полагается, в Docker, куда уж без него. Исходники можно посмотреть на Github.

Скачать все из CloudApp

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

Your CloudApp account is changing on April 2. Most importantly, all free accounts will have a drop limit of 10 drops per month.

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

А пока CloudApp не придумали очередной эксперимент по ограничению, решил вытянуть весь архив файлов которые когда-либо загружал через них. Для этих целей написал небольшой скрипт на Python, который скачивает все файлы с оригинальными названиями. Забрать можно на GIST.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import time
import json
import urllib
import urllib2
from dateutil.parser import parse

USERNAME = "mail@gmail.com"
PASSWORD = "superpass"


def request(url):
    # Digest Authentication
    authhandler = urllib2.HTTPDigestAuthHandler()
    authhandler.add_password('Application', url, USERNAME, PASSWORD)
    opener = urllib2.build_opener(authhandler)
    opener.addheaders = [('Accept', 'application/json')]
    urllib2.install_opener(opener)

    response = urllib2.urlopen(url)
    if response.getcode() == 200:
        body = json.loads(response.read())
        if len(body):
            return body

    return False


def download(url, created_at):
    if not url:
        return False

    try:
        print 'Source: %s' % url
        filename = url.split('/')[-1]
        filename = urllib.unquote(filename.encode('utf-8')).decode('utf-8')

        # if a file exists add created_at
        if os.path.isfile(filename):
            filename = '%s-%s' % (created_at, filename)

        print 'Downloading... %s' % filename
        urllib.urlretrieve(url, filename)
        os.utime(filename, (created_at, created_at))
    except IOError:
        download(url)
    except LookupError:
        pass


if __name__ == "__main__":
    page = 0
    result = True
    while result:
        page = page + 1
        result = request('http://my.cl.ly/items?per_page=100&page=' + str(page))

        if not result:
            break

        for n in result:
            source_url = n.get(u'source_url')
            created_at = int(time.mktime(parse(n.get(u'updated_at')).timetuple()))
            # print json.dumps(n, sort_keys=True, indent=4)
            download(source_url, created_at)

PSR-0/1/2. Русская версия

PSR – это аббревиатура от Proposing a Standards Recommendation (предлагаемые рекомендации стандартов), которые были разработаны группой PHP Framework Interoperability Group, известная как PHP-FIG. В число участников поддерживающих стандарты входят такие известные проекты как : phpBB, PEAR, Doctrine, Composer, Propel, CakePHP, Symfony, phpDocumentor, Zend и т.д.

На данный момент принято четыре стандарта, три из которых я решил перевести на русский язык:

  • PSR-0 Обязательные требования, которые должны соблюдаться в автозагрузчике.
  • PSR-1 Основной стандарт написания кода.
  • PSR-2 Руководство Оформления Кода.

Перевод еще местами сыроват, поэтому буду рад любым правкам, исправлениям и дополнениям.

Удаление файлов в CloudApp

Совершенно неожиданно мой аккаунт на CloudApp сообщил о том, что закончилось бесплатное место. Для удаления накопившегося мусора я полез в личный кабинет и каково было мое удивление когда я там не обнаружил, не только кнопки удалить все, но даже кнопки выделить все на странице, для последующего удаления. Не долго думая накидал UserScript, который добавляет кнопку Select All на страницу c файлами.

Готовую версию можно скачать на GIST, работает в Chrome и Firefox.

cloudapp.user.js

// ==UserScript==
// @name         CloupApp Select all
// @match        http://my.cl.ly/*
// @author       dotzero
// @description  Add Select All button to CloudApp web interface
// ==/UserScript==

function main() {
    $('#toolbar').prepend('<li><a class="button" href="#" id="selall">Select all</a></li>');
    $('#selall').on("click", function(event){
        event.preventDefault();
        $('#listing').find('input:checkbox').click();
    });
}

function insert(callback) {
    var script = document.createElement("script");
    script.textContent = "(" + callback.toString() + ")();";
    document.body.appendChild(script);
}

insert(main);

Результат

CloudApp Select All

Сокращатель ссылок на Node и Redis

Началось с того, что я решил попробовать Redis в каком-нить проекте, а поскольку давно планировал сделать собственную сокращалку ссылок, то решил именно ее и написать. Связка NodeJS + Redis вообще показалась наиболее легко реализуемой. Закончилось тем что помимо Redis написал еще и реализацию для MongoDB.

Не буду вдаваться в подробности сравнения MongoDB и Redis, на эту тему итак уже написано куча статей (Comparing MongoDB And Redis Part 1 и Part 2. Для реализации сокращалки Redis’а хватает за глаза, он вообще более дружественен и прост в реализации к такого рода задачам.

Скачать мой Node Url Shortener можно на Github.

Для установки надо подтянуть дополнительные пакеты из npm. Прежде всего это ExpressJS, а также пакет для работы с Redis или MongoDB.

git clone https://github.com/dotzero/node-url-shortener nus
cd nus
npm install

Далее надо отредактировать файл ./config.js и запустить app.js через NodeJS. Планирую пользовать исключительно через API, поэтому с веб-интерфейсом особо не заморачивался. Реализация API почти такая же как у goo.gl.

Для сокращения ссылок:

GET /api/v1/shorten/?long_url=http://www.google.com

JSON ответ

{
  status_code: 200
  status_txt: "OK"
  hash: "Mw"
  url: "http://localhost/Mw"
  long_url: "http://www.google.com"
}

И для разворачивания коротких ссылок

GET /api/v1/expand/?short_url=http://localhost/Mw