from selenium.webdriver.common import keys from pyvirtualdisplay import Display import os from selenium import webdriver chromedriver = "/usr/local/bin/chromedriver" os.environ["webdriver.chrome.driver"] = chromedriver display = Display(visible=0, size=(1024,768)) display.start() br = webdriver.Chrome(chromedriver) br.get("http://ya.ru")
четверг, 9 марта 2017 г.
Running headless chrome with selenium python driver
среда, 8 января 2014 г.
md5sum - индикатор прогресса, он же progress bar
Иногда очень хочется, чтобы md5sum выводил какой-то индикатор прогресса.
У него нет такой встроенной возможности, однако unix-way заключается в том, чтобы все программы делали своё дело, пусть небольшое, но хорошо.
Поэтому для этой цели используем pv.
В Debian/Ubuntu/Mint можно установить командой:
В CentOS/Fedora/RHEL:
pv filename | md5sum
В итоге получаем наглядный прогресс-бар и примерную оценку оставшегося времени:
У него нет такой встроенной возможности, однако unix-way заключается в том, чтобы все программы делали своё дело, пусть небольшое, но хорошо.
Поэтому для этой цели используем pv.
В Debian/Ubuntu/Mint можно установить командой:
sudo aptitude install pv
В CentOS/Fedora/RHEL:
sudo yum install pvИ потом просто вместо:
md5sum filenameзапускаем
pv filename | md5sum
В итоге получаем наглядный прогресс-бар и примерную оценку оставшегося времени:
$ pv downloaded_2012-05.tar | md5sum
14.1GB 0:04:16 [54.1MB/s] [====> ] 20% ETA 0:16:55
вторник, 7 января 2014 г.
PHP - встроенный веб-сервер и .htaccess
Как известно, в PHP 5.4 и PHP5.5 появился встроенный веб-сервер, который сильно ускоряет разработку. Не надо ставить apache2, nginx, php-fpm и так далее.
Однако, он не поддерживает работу с .htaccess. Из-за чего возникают проблемы.
Например, если у вас в URL есть точки, например:
/site/page/1.json
То PHP будет искать такой файл на диске, а не обрабатывать запрос вашим index.php (как бы он сделал в случае с запросом вида /site/page/1).
Эту проблему легко решить, используя routing скрипт. Например, можно создать routing.php с содержанием вида:
explode нужен для того, чтобы, если есть файл вида 23.css, а запрос шёл вида 23.css?x=1, то php всё-таки постарался бы отдать статический файл.
А после этого запускаем php с указанием этого файла:
php -S 8080 -t /var/www/sitedir routing.php
Однако, он не поддерживает работу с .htaccess. Из-за чего возникают проблемы.
Например, если у вас в URL есть точки, например:
/site/page/1.json
То PHP будет искать такой файл на диске, а не обрабатывать запрос вашим index.php (как бы он сделал в случае с запросом вида /site/page/1).
Эту проблему легко решить, используя routing скрипт. Например, можно создать routing.php с содержанием вида:
<?php if (file_exists(__DIR__ . '/' . explode('?', $_SERVER['REQUEST_URI'], 2)[0])) { return false; // serve the requested resource as-is. } else { include_once 'index.php'; }Он проверяет наличие файла, и если такого файла нет - отдает запрос на работу вашему index.php.
explode нужен для того, чтобы, если есть файл вида 23.css, а запрос шёл вида 23.css?x=1, то php всё-таки постарался бы отдать статический файл.
А после этого запускаем php с указанием этого файла:
php -S 8080 -t /var/www/sitedir routing.php
пятница, 20 декабря 2013 г.
Python 3.3, Django 1.6 - def __unicode__(self) не работает, в админке выводятся [table name] object
Столкнулся с тем, что в Python3.3 и Django 1.6 в админке, не смотря на использование метода __unicode__(self) в классах моделей, не выводится имя модели. Например:
Оказывается, в Python 3 вместо метода __unicode__ отныне используется __str__.
Поэтому, заменяем __unicode__ на __str__:
class Person(models.Model): name = models.CharField(max_length=100) def __unicode__(self): return self.nameВ таком случае в админке выводилось Person object вместо name.
Оказывается, в Python 3 вместо метода __unicode__ отныне используется __str__.
Поэтому, заменяем __unicode__ на __str__:
class Person(models.Model): name = models.CharField(max_length=100) def __str__(self): return self.nameИ вуаля, в админке выводятся нормальные имена персон:-)
среда, 18 декабря 2013 г.
Perl - сложение строк (конкатенация)
В языке Perl (5) для сложения строк используется оператор ".", то есть обычная точка.
Выглядит это так:
Результат следующий:
Выглядит это так:
#!/usr/bin/perl my $a = "Двадцать"; my $b = " негритят"; my $c = $a . $b; print "$c\n";
Результат следующий:
> perl test.pl Двадцать негритятВот и всё, всё очень просто.
вторник, 17 декабря 2013 г.
Exim - моя подборка полезных команд Exim (exim4). Роутинг, работа с очередью, статус и так далее.
1. Проверяем, что нет ошибок в файле (файлах) конфигурации Exim, то есть что всё верно настроено (валидация конфига, короче):
# exim -bVВ выводе можно найти версию Exim, то, что он поддерживает и имя конфигурационного файла, который был проверен.
Exim version 4.80 #2 built 02-Jan-2013 18:59:17
Copyright (c) University of Cambridge, 1995 - 2012
(c) The Exim Maintainers and contributors in ACKNOWLEDGMENTS file, 2007 - 2012
Berkeley DB: Berkeley DB 5.1.29: (October 25, 2011)
Support for: crypteq iconv() IPv6 PAM Perl Expand_dlfunc GnuTLS move_frozen_messages Content_Scanning DKIM Old_Demime
Lookups (built-in): lsearch wildlsearch nwildlsearch iplsearch cdb dbm dbmjz dbmnz dnsdb dsearch ldap ldapdn ldapm mysql nis nis0 passwd pgsql sqlite
Authenticators: cram_md5 cyrus_sasl dovecot plaintext spa
Routers: accept dnslookup ipliteral iplookup manualroute queryprogram redirect
Transports: appendfile/maildir/mailstore/mbx autoreply lmtp pipe smtp
Fixed never_users: 0
Size of off_t: 8
Configuration file is /var/lib/exim4/config.autogenerated
2. Валидация email адреса:
# exim -bv scukonick@gmail.com
scukonick@gmail.com verified
3. Отправка письма и отладка этой отправки
Используйте эту команду, чтобы отправить с помощью Exim письмо на определённый адрес и получить подробную информацию по тому, как Exim обработал это письмо (курсивом выделен текст письма, его надо вбить самому):# exim -v scukonick@gmail.com
LOG: MAIN
cwd=/etc/exim4 3 args: exim -v scukonick@gmail.com
Subject: test
Hey, my message
.
LOG: MAIN
<= root@aptrack.co U=root P=local S=312 T="test"
root@m5:/etc/exim4# LOG: MAIN
cwd=/var/spool/exim4 4 args: /usr/sbin/exim4 -v -Mc 1VpioC-00036Q-NT
delivering 1VpioC-00036Q-NT
Connecting to gmail-smtp-in.l.google.com [2a00:1450:400c:c05::1b]:25 ... connected
SMTP<< 220 mx.google.com ESMTP fb7si2984260wjc.173 - gsmtp
SMTP>> EHLO mydomain.com
SMTP<< 250-mx.google.com at your service, [2a00:1a48:7806:117:fc8f:1b4a:ff08:4c93]
250-SIZE 35882577
250-8BITMIME
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-PIPELINING
250 CHUNKING
SMTP>> STARTTLS
SMTP<< 220 2.0.0 Ready to start TLS
SMTP>> EHLO mydomain.com
SMTP<< 250-mx.google.com at your service, [2a00:1a48:7806:117:fc8f:1b4a:ff08:4c93]
250-SIZE 35882577
250-8BITMIME
250-ENHANCEDSTATUSCODES
250-PIPELINING
250 CHUNKING
SMTP>> MAIL FROM:SIZE=1345
SMTP>> RCPT TO:
SMTP>> DATA
SMTP<< 250 2.1.0 OK fb7si2984260wjc.173 - gsmtp
SMTP<< 250 2.1.5 OK fb7si2984260wjc.173 - gsmtp
SMTP<< 354 Go ahead fb7si2984260wjc.173 - gsmtp
SMTP>> writing message and terminating "."
SMTP<< 250 2.0.0 OK 1386526199 fb7si2984260wjc.173 - gsmtp
SMTP>> QUIT
LOG: MAIN
=> scukonick@gmail.com F=P= R=outgoing_alerts T=remote_smtp S=325 H=gmail-smtp-in.l.google.com [2a00:1450:400c:c05::1b]:25 X=TLS1.2:RSA_ARCFOUR_SHA1:128 CV=no DN="C=US,ST=California,L=Mountain View,O=Google Inc,CN=mx.google.com" C="250 2.0.0 OK 1386526199 fb7si2984260wjc.173 - gsmtp" QT=12s DT=0s
LOG: MAIN
Completed QT=12s
4. Проверка роутинга письма (простая)
Проверяем, куда, через какие acl, роутеры, транспорты и т.д. пройдет письмо. При этом само письмо не будет отправлено.# exim -bt scukonick@gmail.comВидно, что будет использован router outgoing_alerts, транспорт remote_smtp.Разумеется, в вашем конкретном случае роутер и транспорт могут быть (и скорее всего будут) другими.
scukonick@gmail.com
router = outgoing_alerts, transport = remote_smtp
host gmail-smtp-in.l.google.com [2a00:1450:400c:c05::1a] MX=5
host gmail-smtp-in.l.google.com [173.194.66.26] MX=5
host alt1.gmail-smtp-in.l.google.com [2a00:1450:400c:c05::1b] MX=10
host alt1.gmail-smtp-in.l.google.com [173.194.70.27] MX=10
host alt2.gmail-smtp-in.l.google.com [2a00:1450:4008:c01::1a] MX=20
host alt2.gmail-smtp-in.l.google.com [173.194.69.27] MX=20
host alt3.gmail-smtp-in.l.google.com [74.125.143.26] MX=30
host alt4.gmail-smtp-in.l.google.com [173.194.79.26] MX=40
5. Проверка роутинга письма с дебагом
Точно такая же проверка, как предыдущая, однако будет выведена куча дополнительной информации. То, что дополнительно будет выводиться, настраивается в параметре -d. Значения можно посмотреть в man exim, секция про параметр -d. Например, -d+all - выведет всё, что только можно.
# exim -bt -d+all scukonick@gmail.comЯ тут даже не буду приводить вывод этой команды, потому что он ну уж очень большой. Однако это команда весьма полезна, когда вы пытаетесь разобраться, почему письмо отправляется куда-то вообще не туда и не тому:-)
Полезные команды MySQL
Моя подборка полезных команд для MySQL.
Узнать размер базы данных
SELECT table_schema "DB Name", Round(Sum(data_length + index_length) / 1024 / 1024, 1) "DB Size in MB" FROM information_schema.tables GROUP BY table_schema ORDER BY Round(Sum(data_length + index_length) / 1024 / 1024, 1) DESC;
Выводим 15 наиболее фрагментированных таблиц
SELECT CONCAT(TABLE_SCHEMA, ":",TABLE_NAME) AS TABLENAME, ROUND(DATA_FREE * 100/ DATA_LENGTH,1) AS FRAG_PERCENTAGE FROM information_schema.tables ORDER BY FRAG_PERCENTAGE DESC LIMIT 15;
где FRAG_PERCENTAGE - соотношение свободного места в таблице к занятному.
Стоит заметить, что этот метод не работает, когда вы используете InnoDB таблицы без включенной опции innodb_file_per_table. Когда эта опция выключена, все таблицы innodb хранятся в одном файле: /var/lib/mysql/ibdata1. В таком случае результат будет одинаков для всех таблиц. Дефрагментация в данном случае тоже поможет, все таблицы и индексы будут упорядочены в этом файле, однако файл ibdata1 всё равно будет занимать столько же места, сколько и до дефрагментации (просто свободное место в нём будет упорядочено и аккуратно размечено:) ).
Чтобы можно было получать адекватные значение по каждой InnoDB таблице, надо выполнить следующее:
- Сделать дамп всех баз
- Включить опцию innodb_file_per_table
- Удалить файл /var/lib/mysql/ibdata1
- Залить обратно дамп
Ниже более интересная команда:
Выводим 15 наиболее фрагментированных таблиц, их размер и движок
SELECT CONCAT(TABLE_SCHEMA, ":",TABLE_NAME) AS TABLENAME, ROUND(DATA_FREE * 100/ DATA_LENGTH,1) AS FRAG_PERCENTAGE, ENGINE , (DATA_LENGTH+INDEX_LENGTH)/(1024*1024) AS "SIZE (MB)" FROM information_schema.tables ORDER BY FRAG_PERCENTAGE DESC LIMIT 15;
Дефрагментируем таблицы
Для этого достаточно выполнить команду:
OPTIMIZE TABLE tablenameгде tablename - название дефрагментированной таблицы. Стоит заметить, что для InnoDB таблиц OPTIMIZE TABLE - всего лишь обертка для ALTER TABLE tablename ENGINE="INNODB", которая перестраивает таблицу и оптимизирует индексы.
Подписаться на:
Сообщения (Atom)