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

понедельник, 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);

и результат

stdClass Object
(
    [return] => stdClass Object
        (
            [success] => 
            [message] => 
        )

    [TradeBalances] => stdClass Object
        (
             ...
        )
)

суббота, 10 июля 2010 г.

JavaScript: быстрый просмотр кода функции/метода

Часто веб-разработчику приходится искать ту или иную JavaScript-функцию на сайте (например, чтобы понять, как работает доставшийся ему в наследство код и исправить). Учитывая, что функции пишутся  в разных файлах и вставляются в страницу с помощью этот процесс может оказаться весьма хлопотным.
хинт:
Вариант 1: любой браузер умеет скачивать "веб-страницу полностью". Можно воспользоваться этой фичей и потом произвести поиск нужной функции в соответствующей папке, в которой содержатся файлы, относящиеся к скачанной веб-странице.
плюсы:

  1. поддерживается любым браузером
  2. как только вы найдете функцию, вы можете сразу приступить к ее правке
минусы:
  1. браузер может не скачать то, что лежит за пределами сайта (и правильно сделает: зачем ему скачивать, например, код яндексовой баннерки)
  2. это все равно не так быстро, как следующий способ:)
Вариант 2: в браузерах Google Chrome и Firefox (+firebug) есть возможность работать с консолью JavaScript. Надо зайти в эту консоль и набрать имя (но не просто вызвать ее: то есть набирать func_name вместо func_name()) нужной функции.

пример использования консоли Google Chrome для быстрого просмотра исходного кода функции showOrHideDateFields
плюсы:
  1. это достаточно быстро
  2. вы можете таким образом просмотреть (и вызвать) любую функцию, которая загружена в память, а не только те, которые выкачаются.
минусы:
  1. браузер должен поддерживать консоль JavaScript (Google Chrome точно пожжерживает)
  2. все равно непонятно, где лежит код этой функции:)

Bash: циклы

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

Итак, получить список файлов, а потом что-нибудь с ними сотворить одной стокой - это, конечно, хорошо, но иногда программеру или администратору не удается достаточно лаконично выразить свои мысли и приходится использовать циклы.

Например, что-то вроде этого.

#!/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 позволяет «перевернуть» паттерн.
Хинт: 
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;
//…
}
И есть пара сотен мест, где метод вызван без параметра (и выдает ‘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 {} \;
затем - поиск grep’ом:
grep -R “ваше заветное число” /path/to/project/*
так вы найдете строку, которая, возможно, портит вам жизнь
ps: Если вам приходится аналогичными способами работать с кодом, это свидетельствует о весьма тяжелом состоянии вашего проекта (тэг “код с душком”). Подумайте о рефакторинге, но если проект рефакторингу не подлежит, то иногда перл и средства командной строки вам помогут))

Что это?

Бывает программируешь-программируешь или администрируешь-администрируешь и как напишешь полезный скрипт, который может не только тебе, но и другим помочь программировать или администрировать. Так не выкидывай же его! Отправляй на code-hints.ns-keip.ru!