понедельник, 27 сентября 2010 г.

Python: парсим дату

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

datetime.strptime(sys.argv[1], '%H:%M')


С помощью которого можно сделать, например, простой-простой будильник (простой-простой, потому что будет работать в рамках одной даты, например, с 3 ночи до 7 утра, что бывает достаточно для программиста, админа или еще какого-нибудь гика).

#-*- coding: UTF-8 -*-
import time
import os
import sys
from datetime import datetime

def play():
    command = "totem ~/bin/alarm.pls >/dev/null 2>/dev/null"
    os.popen(command)

def main():
    try:
        while datetime.now().time() < datetime.strptime(sys.argv[1], '%H:%M').time():
            time.sleep(1)
    except:
        print "Invalid hour:minute value!"
    finally:
        play()
        return

if __name__ == "__main__":
    main()

понедельник, 13 сентября 2010 г.

День программиста-2010

Поздравляем программистов всех стран с их профессиональным праздником - днем программиста! Вот вам указ об официальном празднике: "О дне программиста".
Пусть даже разбег дат у нас небольшой - 13 сентября в простой год, о 365 днях, и 12 сентября - в високосный, о 366), мы все равно запасли для вас разные способы узнать, когда же он будет, на таких языках программирования как Python и JavaScript (хотели бы сами получить варианты на хаскелле и каком-нибудь брейнфаке):

python:
from datetime import date, timedelta

def prog_date():
    today = date.today()
    return today.replace(month=1, day=1) + timedelta(256)

if __name__ == '__main__':
    print prog_date()

javascript:
function prog_date() {
    today = new Date();
    today.setMonth(0, 1);
    today.setDate(256);
    return today;
}

* А эту функцию так мы вообще выполним:


четверг, 19 августа 2010 г.

Python и mongodb: забрать значения из курсора

Очень полезной особенностью API Python для MongoDB (pymongo) является то, что мы всегда можем достать значения из ленивого курсора: для этого просто нужно использовать преобразование в list.

from pymongo import Connection

c = Connection()
db = c['database']
print db.users.find()
# выведет курсор MongoDB: 
print list(db.users.find())
# выведет список объектов из базы: [{u'username': u'user', u'visitor': False ... }, ...]

Python: произвольная строка

Часто возникает необходимость сгенерировать строку из случайных символов (например, для того, чтобы задать пароль). Язык Python позволяет сделать это быстро и элегантно:

import string
import random

def randstring(n):
    a = string.ascii_letters + string.digits
    return ''.join([random.choice(a) for i in range(n)])

print randstring(10)

Здесь мы создали и вывели на печать строку из 10 рандомных символов.

понедельник, 9 августа 2010 г.

(Ссылка) Python: конфликты метаклассов

Весьма неплохая статья о разрешении конфликтов метаклассов в Python.


JavaScript, jQuery: обертки

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


function $(id) { 
    return getElementById(id); 
}


Теперь же, когда многие используют библиотеку jQuery, объявление подобной функции может привести к неработоспособности другого кода, так как $ является синонимом для jQuery.

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

Было:


function f(arg1, arg2) {

$('#some_selector')// ...

}

Стало:

function f(arg1,arg2) {
(function($) {
        $('#some_selector')// ... code
    })(jQuery)

}

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

суббота, 7 августа 2010 г.

Python: коварство рефакторинга (об удалении *.pyc файлов)

Python компилирует свои скрипты при первом запуске программы (точнее - при первом импорте из срипта, питон пытается сделать последующие обращения к скрипту чуть быстрее путем компиляции его в файл с расширением .pyc), потом он сначала ищет откомпилированный скрипт и только если его не находит - обращается к исходнику (.py).

Коварство рефакторинга (в частности, в среде разработки  PyCharm от JetBrains) заключается в том, что если вы переименовываете один из модулей (например, old_module -> new_module), то вам необходимо вручную прописать импорты в других модулях. Иначе может получиться довольно забавная ситуация: вы в новом модуле добавляете какой-то функционал, а программа при запуске импортирует .pyc файлы старого модуля, ни сколько не ругается и, разумеется, выполняет старый код.

Удалять старые компилированные файлы можно, например, такой командой:

find -type f -name '*.pyc' -exec rm {} \;

понедельник, 19 июля 2010 г.

Bash: подсчет количества строк

find -type f -name '*.py' -exec cat {} \; | wc -l

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

четверг, 15 июля 2010 г.

Единственное значение из mysql на php в 2 строки

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

Т.е. стандартное (академическое) решение выглядит так:


$sql = mysqli_query("SELECT COUNT(*) FROM `table` WHERE `col`='value';"); // получаем данные
$row = mysqli_fetch_assoc($sql); // получаем строку в массив
echo $row['COUNT(*)']; // используем значение массива
// неудобная переменная, нужно одно значение, а используем массив

// можно присвоить значение новой переменной
$count = $row['COUNT(*)'];

// либо переопределить массив в переменную
$row = $row['COUNT(*)'];

// но это либо дополнительная переменная,
// либо не логичное название переменной,
// либо с самого начала нужно было использовать правильное название...

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


$sql = mysqli_query("SELECT COUNT(*) FROM `table` WHERE `col`='value';"); // получаем данные
list($count) = mysqli_fetch_array($sql); // получаем строку в массив и 
// первое значение сразу присваиваем переменной
echo $count; // используем переменную

ООП вариант сообразите по аналогии...

среда, 14 июля 2010 г.

Bash: оставим только новые файлы (как удалять устаревшие архивы)

В комментариях к одному из предыдущих постов поступило предложение сделать скрипт, который позволил бы время от времени чистить папку с архивами, чтобы в ней оставалось лишь определенное количество файлов (разумеется, самых свежих).
Хинт: Для этих целей можно использовать редактор awk, запустив следующую команду из директории с архивами:
ls -t | awk 'NR>=10 {print;}' /dev/stdin | xargs -i rm {}
ls -t выводит список файлов, сортируя его по времени создания
команда awk NR>=10 {print;} выводит из файла строки, номера которых больше 10. /dev/stdin в качестве имени файла позволяет использовать стандартный поток ввода (что делает ls -t через пайп).
xargs -i rm {} удаляет файлы, имена которых приходят через пайп от awk.
Таким образом, мы оставляем в директории только 10 самых новых файлов.