Sublime3. Install in Ubuntu

1. Install sublime text 3:

sudo add-apt-repository ppa:webupd8team/sublime-text-3
sudo apt-get update
sudo apt-get install sublime-text-installer

2. Apply updates. From the official website, the latest version as of writing is build 3143 (13 September 2017):

2.1 Download build:

# for 64-bit OS

curl https://download.sublimetext.com/sublime_text_3_build_3143_x64.tar.bz2 | tar vxj

# for 32-bit OS
 

curl https://download.sublimetext.com/sublime_text_3_build_3143_x32.tar.bz2 | tar vxj

2.2 Overwrite your old installation:

sudo cp -rf sublime_text_3/. /opt/sublime_text

2.3 Remove the download

rm -rf sublime_text_3*


Notation: If you need to delete sublime just run:

sudo apt-get remove sublime-text-installer

Neo4j. Installation and remote access with shell client

Ниже приведено небольшое руководство по разворачиванию Neo4j версии 3.2.1 в среде Ubuntu 14.04 LTS в качестве сервера, с которым можно поиграться :)

1. Перед установкой Neo4j убедитесь в том, что у вас установлена java8. Если требуется установка, тогда можно воспользоваться с помощью Webup8 Oracle Java8 Installer. Выполните следующие команды:

sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer

Если у вас возникают проблемы из-за наличия прокси в вашей сети, тогда необходимо установить следующие переменные среды:

export http_proxy=http://username:password@host:port/
export https_proxy=https://username:password@host:port/

И снова выполнить приведенные выше команды:

sudo -E add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer

2. Установка Neo4j

cd ~
wget -O - http://debian.neo4j.org/neotechnology.gpg.key >> key.pgp
sudo apt-key add key.pgp
echo 'deb http://debian.neo4j.org/repo stable/' | sudo tee -a /etc/apt/sources.list.d/neo4j.list > /dev/null
sudo apt-get update
sudo apt-get install neo4j

sudo service neo4jsudo (stop|start|restart|status)

После этого вы можете подключиться к базе данных через http протокол по адресу http://localhost:7474/browser/. Для первоначально входа надо использовать пользователя - neo4j с паролем - neo4j. После успешного подключения вам будет предложено изменить пароль.

3. Для возможности подключаться к Neo4j в качестве сервера с других хостов, необходимо в файле настройки neo4f.conf раскомментировать следующие строчки:

# With default configuration Neo4j only accepts local connections.
# To accept non-local connections, uncomment this line:
dbms.connectors.default_listen_address=0.0.0.0

# Enable a remote shell server which Neo4j Shell clients can log in to.
dbms.shell.enabled=true

# The network interface IP the shell will listen on (use 0.0.0.0 for all interfaces).
dbms.shell.host=0.0.0.0

# The port the shell will listen on, default is 1337.
dbms.shell.port=1337

Далее перезагрузите Neo4j. Теперь попробуем подключиться к серверу в среде Windows в качестве клиента (не забываем о наличии java8). Для этого воспользуемся инструментами, которые входят в поставку Neo4j. Cкачайте исходник в виде zip-архив. После распаковки в разделе /bin можно будет найти необходимую оболочку в виде батника. Далее откройте командное окно и попробуйте подключиться к Neo4j серверу:

cd .../Neo4j/bin/
cypher-shell -a bolt://<ip-address-of-neo4j-server>:7678 -u neo4j -p <password>


Всем успехов :)

Emacs. Light PHP IDE

Как известно, про возможности emacs в сети интернета информации достаточно, но вот найти какие-либо подробные инструкции по настройке данных возможностей сложновато.

В одной из своих статей в своем блоге Ben Simon поделился рецептом настройки Emacs под PHP - Emacs + PHP - A Modern and (Far More Complete) Recipe. Я решил проверить этот рецепт на деле. Как оказалось, рецепт действенный.

1. Установка MELPA
MELPA - это репозиторий различных по функциональности пакетов, которые Вы можете устанавливать в свой редактор. Для этого перейдите в настройку пакетов

M-x customize-group RET package

В окне настроек перейдите в раздел Package Archives и укажите репозиторий
с именем "melpa" и URL адресом "http://melpa.org/packages"

 

Нажатием State сохраняем для последующих сессий

2. Установка режима PHP Mode

Для этого перейдите в список доступных пакетов

M-x list-packages

Перед выдачей полного списка Emacs обратиться в прописанные репозитории, в частности - MELPA, и подгрузит список пакетов


Здесь стоит отметить, что если у Вас стоит прокси, то пакеты могут не подгрузиться, для этого
необходимо в config-файле (~/.emacs) прописать следующую команду

(setq url-proxy-services
       '(("no_proxy" . "^\\(localhost\\|10.*\\)")
         ("http" . "proxy_address:proxy_port")
         ("https" . "proxy_address:proxy_port")))

Далее среди списка найдите пакет php-mode (Для быстроты воспользуйтесь командой C-s)


Далее нажмите RET находясь на строке и выполните установку данного пакета.
Можно установить пакет и иначе, для это достаточно выполнить

M-x package-install RET php-mode

3. Установка Web-Mode.el

Во время веб разработки порой приходиться работать с html, css и javascript на уровне одного исходника, то не совсем правильно использовать режим php-mode. Для этого случая предлагается использовать режим web-mode

M-x package-install RET web-mode

4. Добавление автоматического переключения между режимами php-mode и web-mode

Так как каждый из этих режимов имеет свои нюансы, то удобнее назначить shirt-cat
для переключения этих режимов. Хотя можно оставить все как есть и в мини-буфере задавать
текущий режим нажатием M-x php-mode или M-x web-mode.
Для реализации shirt-cat можно воспользоваться следующим кодом

(defun toggle-php-flavor-mode ()
  (interactive)
  "Toggle mode between PHP & Web-Mode Helper modes"
  (cond ((string= mode-name "PHP")
         (web-mode))
        ((string= mode-name "Web")
         (php-mode))))

(global-set-key [f5] 'toggle-php-flavor-mode)

Теперь при нажатии F5 мы будем автоматически переключать данные режимы

5. Настройка авто-дополнения

Для этого воспользуемся пакетом ac-php, который поддерживает дополнение функций и классов. Данный пакет устанавливается из репозитория MELPA, но перед этим необходимо проверить доступность php через командную строку, например так

php --version

Помимо этого необходимо установить cscope. Для unix-систем все очень просто (см. README ac-php), для windows его необходимо отдельно скачать по ссылке, установить и проверить доступность утилиты в командной строке. Иначе пропишите в переменных средах (Компьютер -> Свойства -> Изменить параметры -> Дополнительно -> Переменные среды)


После этого установите пакет ac-php по аналогии с предыдущими пакетами.
Далее, как сказано в инструкции, добавьте код (в Ваш config-файл)

(add-hook 'php-mode-hook
          '(lambda ()
             (require 'company-php)
             (company-mode t)
             (ac-php-core-eldoc-setup) ;; enable eldoc
             (make-local-variable 'company-backends)
             (add-to-list 'company-backends 'company-ac-php-backend)))

Далее создайте файл .ac-php-conf.json в корне Вашего проекта и наберите команду

M-x ac-php-remake-tags-all

Все готово.

Emacs. Proxy

In your emacs config file (~/.emacs) write next command:

(setq url-proxy-services
       '(("no_proxy" . "^\\(localhost\\|10.*\\)")
         ("http" . "proxy_address:proxy_port")
         ("https" . "proxy_address:proxy_port")))

Emacs Hotkeys

FILE
OpenCtrl-X, Ctrl-F 
SaveCtrl-X, Ctrl-S 
Save AsCtrl-X, Ctrl-W 
Save AllCtrl-X, S 
Revert to FileCtrl-X, Ctrl-V 
Revert BufferMeta-X, revert-buffer 
ExitCtrl-X, Ctrl-C 
EDIT
UndoCtrl-_ 
PasteCtrl-Y 
Begin SelectionCtrl-SPC 
DeleteDEL 
Fwd DeleteCtrl-D 
Delete WordMeta-DEL 
Fwd Delete WordMeta-D 
Delete LineCtrl-K 
Delete SelectionCtrl-W 
CURSOR MOVEMENT
 FORWARDBACKWARD
WordMeta-FMeta-B
LineCtrl-ACtrl-E
ParagraphMeta-
PageCtrl-VMeta-V
DocumentMeta-<Meta->
FunctionMeta-Ctrl-AMeta-Control-E
SEARCH
Incremental SearchCtrl-S 
Incremental Search ReverseCtrl-R 
Regexp Inc SearchMeta-Ctrl-S 
Regexp Inc Search ReverseMeta-Ctrl-R 
Interactive Search and ReplaceMeta-% 
Goto Line NumberMeta-X goto-line 
WINDOW
CloseCtrl-X, K 
Next WindowCtrl-X, B 
Choose WindowCtrl-X, Ctrl-B 
MaximizeCtrl-X, 1 
Split HorizontalCtrl-X, 2 
Split VerticalCtrl-X, 3 
Switch Keyboard FocusCtrl-X, O 
Activate Menu BarMeta-` 
REGISTERS
Copy Selection to Names RegisterCtrl-X R S 
Paste Names RegisterCtrl-X R I 
Set BookmarkCtrl-X R SPC 
Jump to BookmarkCtrl-X R J 
FORMATTING
Re-flow ParagraphMeta-Q 
Indent SelectionMeta-Control-\ 
Uppercase WordMeta-U 
Lowercase WordMeta-L 
Capitalize WordMeta-C 
Uppercase SelectionCtrl-X, Ctrl-U 
Lowercase SelectionCtrl-X, Ctrl-L 
MACROS
Start RecordingCtrl-X, ( 
Stop RecordingCtrl-X, ) 
Play MacroCtrl-X, E

PLSQL. Small utility package for grabbing statistical data

Small utility package for grabbing statistical data for getting elapsed time and captured memory (session pga memory):

Oracle. Hash keys

При необходимости хеширования на стороне базы данных вы можете воспользоваться различными способами:

- ORA_HASH, доступно с версии 10.2;

- DBMS_UTILITY.GET_HASH_VALUE, доступно с версии 9.0.1. По функциональности данный метод идентичен предыдущей функции ORA_HASH;

- пакет DBMS_OBFUSCATION_TOOLKIT. С версии 11.2 объявлен как DEPRECATED.

- DBMS_CRYPTO.HASH, доступно с 10 версии;

- STANDARD_HASH, доступно с версии 12.1

Первые два способа, работают одинаково:

select
    1 + ora_hash('some_test_text') as ora_hash_value,
    dbms_utility.get_hash_value('some_test_text', 1, power(2, 31) - 1) as get_hash_value
from dual





Но их использование для целей хеширования некорректно, так как хеш-функция возвращает 32-битное значение и как итог у Вас будут возникать коллизии, например - вероятность встретить два разных значения с одинаковыми хеш ключами среди набора 9300 строк составляет около 1% (источник). Дальше больше. Вывод очевиден. Данные функции могут использоваться и используются за счет этого при разбиении данных по BUCKET-ам (пример).

Остальные способы относятся к криптографическим.

Пакет DBMS_OBFUSCATION_TOOLKIT предоставляет возможность MD5 хеширования:

select
    lower(dbms_obfuscation_toolkit.md5(input => utl_raw.cast_to_raw('qwerty'))) md5hash
from dual





Так как данный пакет объявлен устаревшим, то более правильно использовать пакет DBMS_CRYPTO, а именно его функцию DBMS_CRYPTO.HASH.

Данная функция принимает первым параметром значения следующих типов данных - RAW, BLOB и CLOB, но не VARCHAR2. Вторым параметром передается предустановленная константа, которая определяет алгоритм хеширования. До версии v.12c доступны только следующие константы - HASH_MD4, HASH_MD5 and HASH_SH1. Для новой версии же доступны все остальные константы. Ниже полный список данных констант:

  • HASH_MD4 CONSTANT PLS_INTEGER := 1;
  • HASH_MD5 CONSTANT PLS_INTEGER := 2;
  • HASH_SH1 CONSTANT PLS_INTEGER := 3;
  • HASH_SH256 CONSTANT PLS_INTEGER := 4;
  • HASH_SH384 CONSTANT PLS_INTEGER := 5;
  • HASH_SH512 CONSTANT PLS_INTEGER := 6;

Данные константы недоступны при использовании в SQL, но вместо указания константы можно указать их числовое значение, например - получим хеш ключ для строки 'qwerty':

select
    lower(dbms_crypto.hash(utl_raw.cast_to_raw('qwerty'), 2)) md5hash
from dual





Как было отмечено с версии Oracle 11.2 была введена новая функция STANDARD_HASH. Данная функция поддерживает те же алгоритмы хеширования, что и DBMS_CRYPTO.HASH, но отличается тем, что проще используется в SQL и имеет большую скорость работы.
Первым параметром передается входное значение любого типа данных, за исключением LONG и LOB. Вторым параметром передается тип алгоритма хеширования в строковом виде. По-умолчанию используется значение 'SHA1', к остальным возможным значениям относятся следующие - 'MD5', 'SHA256', 'SHA384' и 'SHA512'.

with
    test_data(n, hash) as (
        select rownum, standard_hash(rownum, 'MD5')
        from dual connect by rownum <= 1000000
    )
select hash, count(*)
from test_data
group by hash
having count(*) > 1

Данный запрос генерирует 1 миллион хеш ключей без коллизий.

В заключение рассмотрим таблицу с оценкой времени выполнения ряда приведенных методов хеширования (источник).


Из таблицы видно, что самой быстрой является функция STANDARD_HASH. Но если у вас версия Oracle не столь нова, тогда в виде альтернативы можно использовать пакет DBMS_CRYPTO с алгоритмом хеширования SHA-1 (160 битов достаточно, чтобы избежать коллизий).

Напоследок приведу пример функции для получения хеш ключей по заданному алгоритму в зависимости от текущей версии Oracle:

create or replace function hash_key(p_string in varchar2, p_algorithm in varchar2) return varchar2 deterministic
is
  l_algorithm varchar2(32767) := upper(trim(p_algorithm));
  l_err_num number := -20000;
  l_err_msg varchar2(50) := 'Given algorithm is not supported';
begin
  -- for 12.1 and higher versions
  $if (dbms_db_version.version = 12 and 
         dbms_db_version.release >= 1) or
           dbms_db_version.version > 12 $then
    
    if l_algorithm in ('MD5', 'SHA1', 'SHA256', 'SHA384', 'SHA512') then
      return standard_hash(p_string, l_algorithm);  
    else
      raise_application_error (l_err_num, l_err_msg);
    end if;    
  
  -- for versions between 10.x and 12.0   
  $elsif dbms_db_version.version >= 10 $then
  
    if l_algorithm = 'SHA1' then
      return dbms_crypto.hash(utl_raw.cast_to_raw(p_string), dbms_crypto.hash_sh1);
    elsif l_algorithm = 'MD5' then
      return dbms_crypto.hash(utl_raw.cast_to_raw(p_string), dbms_crypto.hash_md5);    
    elsif l_algorithm = 'MD4' then
      return dbms_crypto.hash(utl_raw.cast_to_raw(p_string), dbms_crypto.hash_md4);
    else
      raise_application_error (l_err_num, l_err_msg);
    end if;
  
  -- for versions less than 10.x
  $else
    
    if l_algorithm = 'MD5' then
      return dbms_obfuscation_toolkit.md5(input => utl_raw.cast_to_raw(p_string));
    else  
      raise_application_error (l_err_num, l_err_msg);
    end if;    
  
  $end
end;