среда, 6 июля 2011 г.

Jetbrains Pycharm: полуавтоматическое обновление

В Pycharm есть очень много полезных фич, но лично мне не хватает автоматического обновления. К счастью, это очень просто лечится примерно таким bash-скриптом.

#!/bin/sh

if [ $1 ]
then
    VER=$1
else
    echo "Which version of pycharm ide do you want do download?"
    read VER
fi

NAME=PyCharm-$VER.tar.gz
EXTRACTED=pycharm-$VER

cd ~/bin
wget -c http://download.jetbrains.com/python/$NAME
tar xzf $NAME
unlink pycharm
ln -s $EXTRACTED pycharm

Использование:
sh ./download_pycharm.sh 1.5.2
либо
sh ./download_pycharm.sh

Как видим, скрипт получает от нас номер нужной версии Pycharm, либо сам спрашивает. скачать. Затем, он выкачивает архив, распаковывает и складывает в подкаталог bin нашего домашнего каталога + играет с символическими ссылками, чтобы в ~/bin/pycharm можно было всегда найти свежую версию IDE.

Разумеется, скрипт работает только пока ребята в JetBrains не поменяли структуру каталогов, из которых происходит скачивание.

понедельник, 16 мая 2011 г.

Глобальный 301 редирект на/с "www." версию домена в nginx

Для чего если можно просто указать все версии домена в server_name? Чтоб не слетали куки. А то авторизованный на example.com человек оказывается не авторизован на www.example.com куда его привела скажем ссылка из уведомления о новом ответе на форуме. Это очень раздражает.

Подчтеннейшая публика! Предлагаю Вам вариант универсального редиректа на все виртуальные серваки управляемые целевым nginx'ом.

В общем для мазохистов-любителей длинных имён и прочих эмо есть вариант редиректа с без "www" на "www":

server {
  server_name ~^(?!www\.);
  rewrite ^ http://www.$host$request_uri permanent;
}

да, почему-то принято упоминать, что автор решения Игорь Сысоев.

Для прочих же, кто не стремится нажимать лишние клавиши преобразование из "www" в без "www"

server {
  server_name ~^(?=www\.);
  if ( $host ~* "www.(.*)"){
    set $unwww $1;
  }
  rewrite ^ $scheme://$unwww$request_uri permanent;
}

Автор решения Ваш покорный слуга :)

ВНИМАНИЕ! Всё это дело вставляется в начало блока http файла nginx.conf и не забываем убирать в конфах виртуальных серваков из server_name вариант с/без "www" (убираем то, с чего редиректим), а то не сработает!

среда, 22 декабря 2010 г.

Индивидуальные ssh ключи для разных git проектов

Ситуация - 2 проекта в разных git репозиториях. Скажем один с работы один личный. Допустим тебе срочно нужно подправить что-то в личном проекте, ты находишься на работе а нужно загрузить обновлённые файли в репозиторий. Я пользуюсь сервисом codaset.com который, как известно, "как github только лучше" (в частности предлагает бесплатно 1 приватный проект для разработки с не ограниченным количеством участников и больше места). Соответственно по работе там один акк, а личный - другой и у них разные ssh ключи для доступа (что тоже логично, как мне кажется), рабочий и личный. Личный у меня на флешке на шифрованном виртуальном диске.

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

Выходы есть такие:

среда, 10 ноября 2010 г.

среда, 13 октября 2010 г.

понедельник, 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 рандомных символов.