Ситуация - 2 проекта в разных git репозиториях. Скажем один с работы один личный. Допустим тебе срочно нужно подправить что-то в личном проекте, ты находишься на работе а нужно загрузить обновлённые файли в репозиторий. Я пользуюсь сервисом codaset.com который, как известно, "как github только лучше" (в частности предлагает бесплатно 1 приватный проект для разработки с не ограниченным количеством участников и больше места). Соответственно по работе там один акк, а личный - другой и у них разные ssh ключи для доступа (что тоже логично, как мне кажется), рабочий и личный. Личный у меня на флешке на шифрованном виртуальном диске.
Проблема в том, что пытаясь залепить push в репу из личного проекта система подхватывает рабочий публичный ключ (т.к. она уже работала с этим сервером) и соответсвенно не пускает меня с левым ключём в частный репозиторий.
Выходы есть такие:
среда, 22 декабря 2010 г.
среда, 10 ноября 2010 г.
Рандомный цвет в js
rand_color = function() { return '#' + (Math.round(Math.random() * Math.pow(2, 24))).toString(16); }
вторник, 19 октября 2010 г.
среда, 13 октября 2010 г.
ссылка: mongodb основы map/reduce
Map-Reduce Basics: очень неплохая статья об агрегировании данных в MongoDB с помощью map/reduce.
понедельник, 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:
javascript:
* А эту функцию так мы вообще выполним:
Пусть даже разбег дат у нас небольшой - 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 позволяет сделать это быстро и элегантно:
Здесь мы создали и вывели на печать строку из 10 рандомных символов.
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: обертки
Когда-то можно было пользоваться такой функцией без всякого сомнения:
Теперь же, когда многие используют библиотеку jQuery, объявление подобной функции может привести к неработоспособности другого кода, так как $ является синонимом для jQuery.
В таком случае можно либо явно указывать 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 файлы старого модуля, ни сколько не ругается и, разумеется, выполняет старый код.
Удалять старые компилированные файлы можно, например, такой командой:
Коварство рефакторинга (в частности, в среде разработки 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, запустив следующую команду из директории с архивами:
команда awk NR>=10 {print;} выводит из файла строки, номера которых больше 10. /dev/stdin в качестве имени файла позволяет использовать стандартный поток ввода (что делает ls -t через пайп).
xargs -i rm {} удаляет файлы, имена которых приходят через пайп от awk.
Таким образом, мы оставляем в директории только 10 самых новых файлов.
Хинт: Для этих целей можно использовать редактор 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 самых новых файлов.
понедельник, 12 июля 2010 г.
Bash: быстрый бэкап
Если вам нужно периодически делать бэкапы тех или иных директорий, вы можете воспользоваться date для формирования имени:
tar -czf ~/archived_folder_`date +'%Y%m%d_%H%M'`.tar.gz ./working_folder/
Данная команда создает в домашней папке архив arсhived_folder (с добавлением года, месяца, дня и времени: archived_folder_20100712_1242.tar.gz) из папки working_folder (в текущей директории).
воскресенье, 11 июля 2010 г.
Возвращаемые значения 1С SOAP в PHP
В SOAP как и в других нормальных программерских технологиях есть значения передаваемые и возвращаемые. Так вот, если Ваш 1С кодер есть Вам мозг и утверждает, что нужно передавать в SOAP переменную (или ссылку на неё) в которой будет возвращаться значение - не верьте ему. На самом деле возвращаемое значение/я идёт/ут дополнительными массивами/объектами в возвращаемом результате вызова SOAP метода.
Недавний пример. 1Сник заявляет, что нужно вызывать метод
CheckBalances(OrderData, TradeBalances)
при этом TradeBalances это пустая переменная в которой будет возвращаться результат (вообще в PHP реализации SOAP не понятно как передать ссылку на переменную в именованном массиве, да и вообще странно это...). На самом деле оказалось надо так:
CheckBalances(OrderData)
а TradeBalances возвращается следующим элементом массива в возвращаемом результирующем объекте SOAP. Типа:
$SOAPresult = $SOAPclient->CheckBalances(OrderData);
и результат
Недавний пример. 1Сник заявляет, что нужно вызывать метод
CheckBalances(OrderData, TradeBalances)
при этом TradeBalances это пустая переменная в которой будет возвращаться результат (вообще в PHP реализации SOAP не понятно как передать ссылку на переменную в именованном массиве, да и вообще странно это...). На самом деле оказалось надо так:
CheckBalances(OrderData)
а TradeBalances возвращается следующим элементом массива в возвращаемом результирующем объекте SOAP. Типа:
$SOAPresult = $SOAPclient->CheckBalances(OrderData);
и результат
stdClass Object
(
[return] => stdClass Object
(
[success] =>
[message] =>
)
[TradeBalances] => stdClass Object
(
...
)
)
суббота, 10 июля 2010 г.
JavaScript: быстрый просмотр кода функции/метода
Часто веб-разработчику приходится искать ту или иную JavaScript-функцию на сайте (например, чтобы понять, как работает доставшийся ему в наследство код и исправить). Учитывая, что функции пишутся в разных файлах и вставляются в страницу с помощью этот процесс может оказаться весьма хлопотным.
хинт:
Вариант 1: любой браузер умеет скачивать "веб-страницу полностью". Можно воспользоваться этой фичей и потом произвести поиск нужной функции в соответствующей папке, в которой содержатся файлы, относящиеся к скачанной веб-странице.
плюсы:
хинт:
Вариант 1: любой браузер умеет скачивать "веб-страницу полностью". Можно воспользоваться этой фичей и потом произвести поиск нужной функции в соответствующей папке, в которой содержатся файлы, относящиеся к скачанной веб-странице.
плюсы:
- поддерживается любым браузером
- как только вы найдете функцию, вы можете сразу приступить к ее правке
минусы:
- браузер может не скачать то, что лежит за пределами сайта (и правильно сделает: зачем ему скачивать, например, код яндексовой баннерки)
- это все равно не так быстро, как следующий способ:)
Вариант 2: в браузерах Google Chrome и Firefox (+firebug) есть возможность работать с консолью JavaScript. Надо зайти в эту консоль и набрать имя (но не просто вызвать ее: то есть набирать func_name вместо func_name()) нужной функции.
пример использования консоли Google Chrome для быстрого просмотра исходного кода функции showOrHideDateFields |
плюсы:
- это достаточно быстро
- вы можете таким образом просмотреть (и вызвать) любую функцию, которая загружена в память, а не только те, которые выкачаются.
минусы:
- браузер должен поддерживать консоль JavaScript (Google Chrome точно пожжерживает)
- все равно непонятно, где лежит код этой функции:)
Bash: циклы
Признаться, для опытных программистов это вещи вполне очевидные, но эту статью я пишу во многом и для себя, потому что то у меня то и дело вылетает из головы, как надо писать циклы на bash.
Итак, получить список файлов, а потом что-нибудь с ними сотворить одной стокой - это, конечно, хорошо, но иногда программеру или администратору не удается достаточно лаконично выразить свои мысли и приходится использовать циклы.
Например, что-то вроде этого.
или этого:
Разумеется, такие команды как ls и find прекрасно могут передать свой вывод через пайп и вместо циклов очень часто можно использовать xargs (либо аргумент -exec в случае с find).
Здесь есть весьма неплохой учебник по bash: http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html
глава о циклах: http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-7.html
Итак, получить список файлов, а потом что-нибудь с ними сотворить одной стокой - это, конечно, хорошо, но иногда программеру или администратору не удается достаточно лаконично выразить свои мысли и приходится использовать циклы.
Например, что-то вроде этого.
#!/bin/bash FOO=(file1 file2 file3) for ((i=0;i<${#FOO};i++)); do some_command ${FOO[${i}]}; done
или этого:
for i in `ls`; do some_command $i; done
Разумеется, такие команды как ls и find прекрасно могут передать свой вывод через пайп и вместо циклов очень часто можно использовать xargs (либо аргумент -exec в случае с find).
Здесь есть весьма неплохой учебник по bash: http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html
глава о циклах: http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-7.html
пятница, 9 июля 2010 г.
bash: удаление пустых папок
Простой и элегантный способ удалить пустые вложенные папки в текущем каталоге linux/*nix:
find -depth -type d -empty -exec rmdir {} \;
четверг, 8 июля 2010 г.
grep: список файлов и всё
У grep'а есть ключ -l, который позволяет просто вывести список файлов, в которых встречается искомая фраза без излишнего цитирования.
Другой полезный ключ -v позволяет «перевернуть» паттерн.
Хинт:
Другой полезный ключ -v позволяет «перевернуть» паттерн.
Хинт:
grep -Rl Москва ./* | grep -v svnЭта команда выдает список файлов во всех вложенных директориях, в которых встречается слово «Москва» кроме файлов, в путях которых есть «svn».
Рефакторинг: Мартин Фаулер
Упомянутый в предыдущей статье термин «код с душком» использовал Мартин Фаулер в своей книге «Рефакторинг. Улучшение существующего кода» (аннотация и краткое содержание на RSDN). Verba movent, exempla trahunt.Слова побуждают, примеры — влекут. Именно такой принцип использует автор, и примеры на Java являются прекрасной демонстрацией подходам к рефакторингу, изложенным в книге.
Пробный шар: поиск неугодного вызова метода с помощью perl
Иногда нет возможности запустить дебаггер и понять, где именно происходит вызов того или иного метода.
Например, в одном проекте есть метод на php, который должен выдавать пользователю “ошибку 404”:
//class some_class {
funciton notFound($reason=”no reason”) {
//…
echo $reason;
//…
}
//…
echo $reason;
//…
}
И есть пара сотен мест, где метод вызван без параметра (и выдает ‘no reason’). Как быть, если надо найти, где вызывается этот метод?
Хинт: можно заменить все вызовы метода без параметров - notFound() на вызовы notFound со случайным числом в качестве параметра (например: notFound(321653)) потом посмотреть на это число в браузере и спокойно найти его, например, с помощью команды grep.
Замену вызовов метода notFound() на notFound(random int) нам поможет сделать такой скрипт на перле:
#!/usr/bin/perl # my $file = $ARGV[0]; open FILE, $file or die "failed to open $file\n"; my $text = join("", <FILE>); close FILE; $text =~ s/notFound\(\)/'notFound(' . int(rand() * 1000000) . ')'/ge; open (FILE, ">$file") or die "failed to write to $file\n"; print FILE $text; close(FILE);запуск:
chmod +x ./script.pl
find /path/to/project -type f -name *.php -exec ./script.pl {} \;
find /path/to/project -type f -name *.php -exec ./script.pl {} \;
затем - поиск grep’ом:
grep -R “ваше заветное число” /path/to/project/*
так вы найдете строку, которая, возможно, портит вам жизнь
grep -R “ваше заветное число” /path/to/project/*
так вы найдете строку, которая, возможно, портит вам жизнь
ps: Если вам приходится аналогичными способами работать с кодом, это свидетельствует о весьма тяжелом состоянии вашего проекта (тэг “код с душком”). Подумайте о рефакторинге, но если проект рефакторингу не подлежит, то иногда перл и средства командной строки вам помогут))
Что это?
Бывает программируешь-программируешь или администрируешь-администрируешь и как напишешь полезный скрипт, который может не только тебе, но и другим помочь программировать или администрировать. Так не выкидывай же его! Отправляй на code-hints.ns-keip.ru!
Подписаться на:
Сообщения (Atom)