четверг, 14 июня 2018 г.

How to “break on property change” in a web browser ?

If you need to run a debugger to find a place where some property is changed you can redefine this property as a function and add 'debugger' line


For example:

// There you will be able to find a place
// where 'document.getElementById('qty').value' is changed
(

function(obj){
//    var obj = document.getElementById('qty');

    obj._value = obj.value;

    Object.defineProperty(obj, 'value', {
        get: function () {
            return obj._value;
        },

        set: function (value) {
            debugger; // sets breakpoint
            obj._value = value;
        }
    });
}
)(document.getElementById('qty'))



воскресенье, 13 ноября 2016 г.

How to keep all history of 'apt-get install ..." command ?

I would like to have available all history of software installation on my PC (Ubuntu).
But by default Ubuntu keeps 'apt-get'-logs only for last 12 months. After that time 'logrotate' will delete older logs.

To fix it you should change a file '/etc/logrotate.d/apt':

diff --git a/logrotate.d/apt b/logrotate.d/apt
index 9a6e5d1..3021b99 100644
--- a/logrotate.d/apt
+++ b/logrotate.d/apt
@@ -7,7 +7,7 @@
 }
 
 /var/log/apt/history.log {
-  rotate 12
+  rotate 1200
   monthly
   compress
   missingok


So for now the logs will be kept during 100 years (1200 months)! :)

воскресенье, 2 октября 2016 г.

Load order of Cucumber files from 'support' directory

Hi. I am using Cucumber(Ruby) to make automated testing.
And it was interesting for me to know the order how Cucumber loads files from 'support' directory.

For now I know the answer!
At first 'support/env.rb' is loaded. After that all other files will be loaded in alphabet order.
It's correct for Cucumber 2.4.0.

среда, 31 августа 2016 г.

Секс с настройкой видеодрайвера для корректной работы Xmonad в Ubuntu на ноутбуке с NVidia Quadro K1100M и Intel® HD Graphics 4600

Проблема

На моём ноутбуке (HP ZBook 15) при установке проприетарного драйвера nvidia в Xmonad пропадает очень удобная особенность: возможность независимо отображать выбранный рабочий стол только на одном из выбранных мониторов, включая дисплей ноутбука (при наличии хотя бы одного подключенного монитора)

Цель

Восстановить стандартную возможность в XMonad -- перебрасывать окна с одного монитора/дисплея на другой с помощью горячих клавиш; одновременно можно перебросить окно с одного рабочего стола на другой.

Шаги для решения проблемы

1. Удалить полностью проприетарные драйвера nvidia

apt-get purge nvidia-*

2. Переустановить пакет  xserver-xorg-core

apt-get install --reinstall xserver-xorg-core 

3. Если в директории /usr/lib/x86_64-linux-gnu/xorg/extra-modules есть файл с названием libglx.so.1 , то его надо переименовать/удалить

4. Запустить команду

update-initramfs -u


четверг, 18 августа 2016 г.

Тонкости выполнения бекапов Andoid-прошивок в CWM (ClockWorkMod) для чайников: виды бекапов и их различие

CWM позволяет сохранять бекапы в различных форматах: tar и dup.

При выборе tar-формата данные с разделов "data", "system", "cache", "android_secure" будут сохранены в виде tar-архивов. Причём tar-файлы будут иметь нулевой размер, но также будут созданы файлы ".tar.a", которые и будут содержать архив с данными. Данные с разделов "boot", "recovery", "uboot" сохраняются в виде образов раздела.

Пример содержимого директории с бекапом.

G:\clockworkmod\backup\2012-08-01.00.01.15>dir /b
.android_secure.vfat.tar
.android_secure.vfat.tar.a
boot.img
cache.ext4.tar
cache.ext4.tar.a
data.ext4.tar
data.ext4.tar.a
nandroid.md5
recovery.img
recovery.log
system.ext4.tar
system.ext4.tar.a
uboot.img


При выборе dup-формата, содержимое разделов "data", "system", "cache", "android_secure" будут сохранены в виде списка файлов с указанием, где лежит каждый файл.

Пример

dedupe 2
d 770 0 0 0 0 1343858092 ./lost+found
d 770 1000 2001 1461175811 1343864058 1343864058 ./recovery
f 666 0 0 1343864058 1343864058 1343864058 ./recovery/log 436/b34653797d5feada2d8c5b5f33def321c208c0f5fe7477dcb8edd15a18c1a 4896

f 640 0 0 1461175811 1343864058 1343864058 ./recovery/last_log 436/b34653797d5feada2d8c5b5f33def321c208c0f5fe7477dcb8edd15a18c1a 4896


Сами файлы лежат в директории "/clockworkmod/blobs/"

Формат dup-позволяет уменьшить размер бекапа, за счёт того, что повторяющиеся файлы в разделах "data", "system", "cache", "android_secure" будут сохранены только один раз.


Пример директории, содержащей бекап в формате dup.


G:\clockworkmod\backup\2012-08-01.23.34.48>dir /b
.android_secure.vfat.dup
boot.img
cache.ext4.dup
data.ext4.dup
nandroid.md5
recovery.img

system.ext4.dup


Мораль

Если вы используете dup-формат, то при копировании бекапов с флешки на компьютер копируйте целиком всю директорию "/clockworkmod", а не только директории с бекапами.

среда, 17 августа 2016 г.

How to install drivers for Newman N1 (MTK6577) on Windows 7 ?

I have an old smartphone Newman N1 which is built on MTK6577 chipset.
I have decided to learn how to flash a new ROM on Android device and I have chosen Newman N1 for my experiments.

But I was very confused due to impossibility to find a correct driver which will give me a possibility to work with smartphone through ADB (Android Debug Bridge) tool.

After a long time it was found a working solution.
I am using Windows 7 so all next instuctions are correct and will work only for Windows 7.

Steps.
1. Connect your smartphone to your PC through USB cable. Smartphone should be switched on.
2. Open "Device Manager" to see how a new device will be found. I found an unknown device with name "MTK "MT65xx Android device".
3. Choose "Update driver" and select manual update. 
4. Open the list of all devices and select "Android device" vendor. After that select "Andoid Composite ADB Interface" device.

I did not describe which exactly driver I installed because I did it too much times so I don't know how this driver was installed on my PC.

I hope this instruction will help you. Maybe I will write more details about this trouble.

Resources
1. http://forum.xda-developers.com/fire-hd/general/guide-install-windows-adb-drivers-fire-t3189000

понедельник, 30 мая 2016 г.

AutoSave: a good SublimeText plugin for autosaving your files

During a long time of using PhpStorm/RubyMine and other IDEs  I have got used to using autosave feature when I editing files.

But now I am using SublimeText and it does not do this by default.
But it can be easily fixed by installing 'AutoSave' plugin.

Steps to do.
1. Install autosave plugin using PackageControl or any other way.
2. Switch on 'autosave' feature by entering command 'Toggle AutoSave: all files' after pressing 'Ctrl-Shift-p' key.


суббота, 28 мая 2016 г.

Как добавить в Blogger возможность красиво вставлять код на различных языках?

Нашёл возможность, как более-менее красиво оформлять код в Blogger.

В большинстве случаев мне бы хватило минимальной возможности написать текст с отступом и шрифтом Courier New, но, ###, возможности отступа в стандартном редакторе почему-то нет. Или я слепой! :(

В общем я нашёл инструмент под названием code-prettify:
https://github.com/google/code-prettify
В нём можно выбирать темы оформления.

Для моего (тёмного) блога мне по душе пришлась следующая конфигурация.

<script src='https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js?skin=sons-of-obsidian'/>

Данную строку нужно добавить в раздел HEAD шаблона в настройках редактирования кода шаблона: Шаблон -> Изменить HTML.

Для того, чтобы некий текст обернуть в красивое оформление, нужно обернуть его тегами
<pre class="prettyprint lang-sh"> ... </pre>

где "lang-sh" означает язык, на котором написан фрагмент кода, в данном случае это shell.

Список поддерживаемых языков можно посмотреть на страничке проекта.


Начало работы с RubyOnRails -- Rails для чайников

Я решил, что пора уже разобраться с RubyOnRails.

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


С чего начать ?

Я пока остановился на "Ruby on Rails Tutorial. Изучение Rails на Примерах", Майкл Хартл.

Данная книга доступна онлайн на русском языке по следующей ссылке:
http://railstutorial.ru/chapters/4_0/beginning

Там же можно найти и англоязычную версию.


Приятные полезности после установки rvm, rails, bundler

 

Автоматический выбор нужного gemset при работе в shell, когда переходишь в директорию с разрабатываемым приложением.

Если вы создаётё отдельный gemset для всех гемов своего приложения, то очень удобно, когда вы заходите в директорию своего приложения и не прилагаете никаких усилий по переключению с дефолтного гемсета на тот, в который были установлены все гемы, необходимые для вашего приложения.

Этого можно добиться, создав файлы с названиями ".ruby-version" и ".ruby-gemset".
Ниже привожу пример содержания данных файлов.

.ruby-version
ruby-2.2.5
где, "ruby-2.2.5" -- это название версии  Ruby, которая установлена с помощью rvm и используется вашим приложением.

.ruby-gemset
learning_rails

где "learning_rails" -- это название гемсета, на который должен переключиться rvm после открытия директории, в которой находятся эти файлы.

UPD: нашёл вариант, когда эти 2 файла можно не создавать ,а вместо этого дописать строку в файл 'Gemfile', например

#ruby-gemset=learning_rails 


среда, 18 мая 2016 г.

How to update Java plugin after upgrading Mozilla Firefox to version 46 in Ubuntu 14.04 ?

I have upgraded my Firefox and after running Firefox I have found a notice that Java plugin has to be upgraded too.

So there are steps to do it.

1. Install the latest (at the moment) version of Java 8
sudo apt-get install oracle-java8-installer

2. Update alternatives
sudo update-alternatives --config mozilla-javaplugin.so

вторник, 30 декабря 2014 г.

Skype's sound in Ubuntu 14.04 (virtual device)

Слава пингвинам!

Я наконец-то успешно разрешил проблему с Skype на Ubuntu 14.04: не было звука; в 'Options -> Sound Devices' в выпадающих списках отображалось только устройство под названием "Virtual device".

Ранее было выявлено, что имеется некая проблема с PulseAudio. Но предыдущие попытки найти решение были неудачными.

Но вот мне повезло!

Всё просто! Т.к. Skype -- 32-разрядный, то ему нужна 32-разрядная версия PulseAudio.

Для этого устанавливаем пакет:

sudo apt-get install libpulse0:i386

пятница, 26 декабря 2014 г.

Capistrano 2 (для чайников)

Собственно осознал то, что я до конца не понимал, в каком порядке работают таски в Capistrano 2.
Задался вопросом ликвидировать этот пробел в своих знаниях.

И вот что получилось.

Дефолтный таск в указанном namespace


Когда вы запускаете 

cap deploy

то это имеется в виду, что вы запукаете

cap <namespace>:<task>

Если task, не указан, то будет использоваться дефолтный таск в указанном namespace


Стандартный порядок запуска тасков


Смотрим ссылку [1].
Читаем описание по ссылке [2].

От себя добавлю немного цитат из исходного кода Capistrano:

namespace :deploy do
  task :default do
    update
    restart
  end
  task :update do
    transaction do
      update_code
      create_symlink
    end
  end

end

Про миграции в БД


В Capistrano имеется таска deploy:migrate. Она не запускается в стандартном потоке. Ее нужно запускать отдельно. 
Вывод: я привязывал запуск миграций к таске deploy:update:

after 'deploy:update', 'project:migrations'

Думаю, что это неправильно и что лучше переопределить deploy:migrate, где описать все действия, связанные с миграциями и очисткой разноообразных кешей.


Также в Capistrano имеется таска deploy:migrations для "ленивых" :) :

  task :migrations do
    set :migrate_target, :latest
    update_code
    migrate
    create_symlink
    restart
  end

Но тут надо обратить внимание на то, что нет транзакции, если сравнивать с deploy:update


Ссылки на ресурсы:

понедельник, 15 декабря 2014 г.

Error when you run JMeter 2.12 : "Could not initialise key store java.io.IOException (Permission denied)"


I was surprised when I had run JMeter using 'jmeter' command and I could not use 'HTTP Test script recorder' to record some scenario.

2014/12/15 12:49:13 WARN  - jmeter.protocol.http.proxy.ProxyControl: Could not open expected file or certificate is not valid /opt/apache-jmeter-2.12/bin/proxyserver.jks /opt/apache-jmeter-2.12/bin/proxyserver.jks (No such file or directory) 
2014/12/15 12:49:13 INFO  - jmeter.protocol.http.proxy.ProxyControl: Generating standard keypair in /opt/apache-jmeter-2.12/bin/proxyserver.jks 
2014/12/15 12:49:14 ERROR - jmeter.protocol.http.proxy.ProxyControl: Could not initialise key store java.io.IOException:   >> keytool error: java.io.FileNotFoundException: proxyserver.jks (Permission denied) <<
Command failed, code: 1
'keytool -genkeypair -alias :jmeter: -dname "cn=JMeter Proxy (DO NOT TRUST)" -keyalg RSA -keystore proxyserver.jks -storepass {redacted} -keypass {redacted} -validity 7'



To solve this trouble I have found that JMeter can be run with the following parameters (JMeter was installed into '/opt/apache-jmeter-2.12' directory on my machine):

export JVM_ARGS=-Dproxy.cert.directory=`readlink -f ~`; /opt/apache-jmeter-2.12/bin/jmeter

вторник, 25 марта 2014 г.

Rspec, nested example groups and RTFM

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

А сегодня я открыл автотесты Cucumber и наткнулся на интереснейший пример: вложенные describe-блоки. А также несколько блоков "it {...}" идущих один за другим.

Пример можно посмотреть тут:
https://github.com/cucumber/cucumber/blob/master/spec/cucumber/formatter/html_spec.rb

 Это просто чудесно!

Вот и статейка интересная на эту же тему:
http://blog.codefront.net/2007/12/30/why-i-love-rspec-nested-example-groups/


Я совсем не специалист в Руби на данный момент, системно Руби никогда не изучал (только по мере необходимости), поэтому "мануалов" по RSpec дотошно не читал. А надо бы )))
Собственно как и любые мануалы. А в вселенной, где существуют автоматизированные тесты, они (тесты) дают очень много интересной информации.

В общем надо по утрам повторять мантры "RTFM" and "RTFT" (read the f***ing tests) :)

Осталось только привести свой образ жизни в такой, когда будет время по утрам для "пения" мантр. :-D

пятница, 12 июля 2013 г.

'cucumber --expand' and Jenkins junit reports

It seems like if you run cucumber with parameter '--expand' on Jenkins then 'Publish JUnit test result report' won't work at all.

I am absolutely sure that there is a reason why Jenkins does not show test results if '--expand' was added .

четверг, 11 июля 2013 г.

How to realize inheritance of 'class methods' of modules in Ruby



# This script shows how to call parent method in module A from the method in module B that is overwritten.
# Output of calling:

#This is D
#Calling D.b
#
#this is A.ClassMethodsA.b
#Called from:D.b
#
#this is A.ClassMethodsA.a_b
#Called from:D.a_b
#
#this is B.ClassMethodsB.b
#Called from:D.b



# if you change the order of calling 'extend' in child module
# def self.included(base)
#   base.extend(ClassMethodsA)
#   base.extend(ClassMethodsB)
# end
#
# the output will be looks like this:

#This is D
#Calling D.b
#
#this is B.ClassMethodsB.b
#Called from:D.b
#
#this is A.ClassMethodsA.b
#Called from:D.b
#
#this is A.ClassMethodsA.a_b
#Called from:D.a_b

module A
  def self.included(base)
    base.extend(A::ClassMethodsA)
  end 

  module ClassMethodsA
    def b
      puts "this is A.ClassMethodsA.b"
      puts 'Called from:' + name + '.' + __method__.to_s
      puts ''
      a_b
      super if defined?(super)
    end
    def a_b
      puts "this is A.ClassMethodsA.a_b"
      puts 'Called from:' + name + '.' + __method__.to_s
      puts ''
    end

  end
end


module B
  module ClassMethodsB
    def b
      puts "this is B.ClassMethodsB.b"
      puts 'Called from:' + name + '.' + __method__.to_s
      puts ''
      super if defined?(super)
    end
  end

  include A
  def self.included(base)
    base.extend(ClassMethodsB)
    base.extend(ClassMethodsA)
  end
end


class D
  include B
  puts 'This is D'
  puts 'Calling D.b'
  puts ''
  b
end


среда, 10 июля 2013 г.

PageObject pattern, мультиязычные сайты и дублирование кода.

(данный текст написан скорее для себя, чем для кого то, но если он окажется Вам полезным, то похлопайте в ладоши :) )

Столкнулся со следующей ситуацией.
Есть 3 сайта с очень похожим функционалом. Можно сказать что "почти" одинаковые. Работают на одной платформе, но нацеленные на разные сегменты рынка.

Похожая ситуация может быть с мультиязычными сайтами. Иногда даже дизайн для разных стран может немного отличаться.

Нужно автоматизировать некоторые регрессионные тесты.

Когда мы используем PageObject pattern, мы описываем структуру страницы, привязываясь к элементам страницы с помощью селекторов.
Но штука в том, что в моем случае для разных сайтов селекторы могут различаться.
Я использую page-object gem (Ruby) для реализации паттерна PageObject. В нем привязка выполняется на этапе создания класса, когда вызываются методы класса, создающие методы экземпляра класса, с помощью которых я могу потом взаимодействовать с элементами страницы

Таким образом мы приходим к тому, что нужно создавать 3 отдельных класса для каждой страницы. Например: SiteOneHomePage, SiteTwoHomePage, SiteThreeHomePage.
В этих классах будет (как мне кажется на данный момент) одинаковый функционал и будут различаться только селекторы.

Создавать 3 почти одинаковых класса не хочется.

Нужно найти варианты, когда не будет дублирования кода класса страницы.

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

Другой вариант, который подходит не только для Руби -- это абстрактный класс HomePage, в котором описан функционал, и классы-наследники SiteOneHomePage, SiteTwoHomePage и т.д., где описываются селекторы.

Но мне все еще это не совсем нравится.
Я использую cucumber поверх page-object для создания красивых отчетов для клиентов.
Если применить сказанное выше, то мы получим нечто следующее:

Feature: change currency (SiteOne, SiteTwo, SiteThree)
  Scenario Outline: Check currency changing on SiteOne site
    Given I open "HomeSiteOne" page on "SiteOne" site
    When I change currency to "<selected_currency>"
    Then Current currency should be "<expected_currency>"
    Examples:
      | selected_currency | expected_currency |
      | USD               | USD               |
      | EUR               | EUR               |
      | AUD               | AUD               |
      | CAD               | CAD               |

  Scenario Outline: Check currency changing on SiteTwo site
    Given I open "HomeSiteTwo" page on "SiteTwo" site
    When I change currency to "<selected_currency>"
    Then Current currency should be "<expected_currency>"
  Examples:
    | selected_currency | expected_currency |
    | USD               | USD               |
    | EUR               | EUR               |
    | AUD               | AUD               |
    | CAD               | CAD               |


Получается тавтология.
Я бы хотел, чтобы название сайта не фигурировало в названии страницы.


вторник, 25 июня 2013 г.

How to use Jenkins with 'SCM Sync configuration' plugin

The next instructions were checked for Ubuntu 12.04.


'SCM Sync configuration' plugin can be used to backup changes of Jenkins configuration after each 'save' action.
The next file is instruction how I did it.


#create_local_jenkins_config_repo.sh


#!/bin/bash

# This script has to be used with 'SCM Sync configuration plugin' of Jenkins
# This script will create '/var/lib/jenkins/jenkins-config-repo' directory
# where Git repo (bare) will be created for storing Jenkins' configs.

# If you want to place remote repository in some other place you should correct some commands in the file
# and in instructions below.
# ALARM. 'jenkins' user should have access rights to do changes in Git repository that specified in 'Repository URL'.

# After running this script go to Jenkins->Manage Jenkins->Configure System->SCM Sync configuration:
# - select 'Git'
# - Set 'Repository URL' = 'file:///var/lib/jenkins/config-backup-repository'
# - Click 'Save' button
# After that run the following commands
# - cd /var/lib/jenkins
# - chown -R jenkins:nogroup scm-sync-configuration  jenkins-config-repo
# - cd scm-sync-configuration/checkoutConfiguration
# - git config user.name "Jenkins"
# - git config user.email "jenkins@localhost"
# Now you will get

cd /var/lib/jenkins

if [ "$?" != "0" ]
then
 echo "Can't change directory to '/var/lib/jenkins'"
 echo $?

 exit 1
fi

mkdir /var/lib/jenkins/jenkins-config-repo

cd jenkins-config-repo
git init --bare
cd ..

mkdir temp_repo
cd temp_repo
git clone /var/lib/jenkins/jenkins-config-repo .
touch README
git add README
git commit -m "First commit"
git push -u origin master
cd ..



понедельник, 24 июня 2013 г.

XPDays Ukraine 2013 is coming...