Сообщения

Сообщения за Ноябрь, 2017

Git игнор файла локально

git update-index --assume-unchanged [<file>...]

Настройка драйверов WiFi Broadcom в Opensuse

По этой инструкции я устанавливал себе драйвер для вай-фай
https://ru.opensuse.org/SDB:Broadcom_Bcm43xx

Я выбирал инструкцию по broadcom-wl

Установка Eclipse Che

Очень удобная IDE Eclipse Che которую можно развернуть например на тестовом сервере, чтобы в любом месте работать со своими проектами через интернет без особых затрат трафика.

Eclipse Che имеет веб интерфейс.

Документация: https://www.eclipse.org/che/docs/setup/getting-started/

Чтобы установить эту IDE на ubuntu 16.04 я обошелся всего 2-мя командами.

1. sudo apt install docker.io
2. docker run -it --rm -v /var/run/docker.sock:/var/run/docker.sock -v ~/EclipseChe:/data eclipse/che start

2 команда запускает Eclipse Che и если запуск в первый раз, то заодно и скачает все что нужно для запуска.

Крон посмотреть все задачи

Для пользователя
crontab -u userName -lДля рутаcrontab -l Настройка дневных задачcd/etc/cron.daily/ls-lcat filename

Установка утилиты yandex disk для ubuntu

Команда для установки:

echo"deb http://repo.yandex.ru/yandex-disk/deb/ stable main" | sudo tee -a /etc/apt/sources.list.d/yandex.list > /dev/null && wget http://repo.yandex.ru/yandex-disk/YANDEX-DISK-KEY.GPG -O- | sudo apt-key add - && sudo apt-getupdate && sudo apt-get install -y yandex-diskМастер настройки $ yandex-disk setupМануал по использованиюhttps://yandex.ru/support/disk/cli-clients.html#cli-install

Как избавиться от мерцания моделей в AngularJS

Если для Вас важно, чтобы не высвечивались строки отображения моделей, вроде {{mymodel}} в процессе загрузки страницы есть очень простой способ это предотвратить, вместо этого синтаксиса используйте:

<spanng-bind="mymodel"></span> И ничего лишнего не будет выведено!

также для устранения мерцания в определенном контексте можно использовать директиву ng-cloack

Как построить RestFull контроллер в Yii2

Все CRUD операции для RestFull контроллера уже предусмотрены разработчиками Yii. Находятся они в классе yii\rest\ActiveController. То есть для того, чтобы Вы могли создать свой Rest контроллер Вы должны просто унаследовать этот класс вместо обычного yii\web\Controller , а также Вы должны передать обязательное свойство public $modelClass, которое должно хранить полное имя класса модели ActiveRecord, с которой будет работать этот CRUD контроллер.
Пример:

<?phpnamespaceapp\controllers; useyii\rest\ActiveController; classTaskRestControllerextendsActiveController{ // указываем класс модели, который будет использоватьсяpublic$modelClass = 'app\models\Task'; publicfunctionbehaviors(){ return \yii\helpers\ArrayHelper::merge(parent::behaviors(), [ 'corsFilter' => [ 'class' => \yii\filters\Cors::className(), ], ]); } } Также в примере применен фильтр, ко…

Отправка пост запроса AngularJS

Недавно столкнулся с проблемой, что у меня не отправлялся пост запрос из приложения AngularJS. Был следующий код у меня:
var req = { method: 'POST', url: 'http://url', headers: { 'Content-Type': undefined }, data: {test: 'test'} }; $http(req).success(function(data){ console.log(data); }); Дело в том, что я только взялся за Angular и этот код впринципе взят из книги, мне сразу показалось странным, что content-type undefined. После замены content-type, все стало работать!

var req = { method: 'POST', url: 'http://url', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, data: {test: 'test'} …

Инверсия зависимостей на примере Yii2

По началу хотел здесь написать о контейнере внедрения зависимостей в Yii2, но немного почитав понял, что гораздо важнее не умение использовать конкретную реализацию контейнера внедрения зависимостей, которая предложена разработчиками Yii2, а уметь применять принцип инверсии зависимостей в совокупности с принципом программирования по контракту.
Зачем это нужно? У меня есть знакомый, который постоянно мне задает этот вопрос "А зачем все это нужно?". В данном случае принцип инверсии зависимостей необходим для создания слабого зацепления (англ.loose coupling). То есть в вашем коде не будет жесткой зависимости от каких-либо конкретных объектов, потому что логика вашей программы будет завязана на использовании интерфейсов( их же я называю и контрактами ), в случае если объект "Хочет" работать с другим вашим классом, который реализует бизнес-логику, то этот объект должен будет принять правила интерфейса(контракта).
Рассмотрим пример создадим таблицу Users
CR…

Метод тыка для удаления расширений через composer в Yii2

Удаление расширешний через composer можно назвать интуитивно понятным, я задал себе этот вопрос и сам же на него и ответил не прибегая к поиску в Google.
Для удаления ненужного расширения просто удаляем строку этого расширения из файла composer.json и запускаем уже известную команду.
composer update В результате будет получен такой красноречивый ответ от composer
Loading composer repositories with package information Updating dependencies(including require-dev) - Removing mozarcik/yii-datepicker(dev-master 13acaa5) Writing lock file Generating autoload files Это все, так просто!

Метод тыка при установке расширений через composer вместе с Yii2

Хочу рассказать о моем подходе к использованию composer вместе с Yii2 с применение метода "Тыка".
Это кончено очень большой недостаток, что у меня не хватило терпения прочитать документацию по Composer, но я обязательно когда нибудь заполню этот пробел. А сейчас работаем с composer на уровне подготовки "ниже плинтуса"!
Берем любой свой рабочий проект на yii2, рабочий нужен именно для того, чтобы видеть какие проблемы будут вначале, и научиться их преодолевать.
Я для примера разверну basic шаблон приложения на своем localhost. Так как я чайник я просто скачаю архив с сайта yiiframework.com распакую его и выполню инициализацию.
Установка через командную строку Хотя нет решил в первый раз попробовать не качать архив а все таки установить через composer, для этого ввел команду
composer globalrequire"fxp/composer-asset-plugin:~1.1.1" Дальше ввел команду для создания нового проекта Yii2
composer create-project yiisoft/yii2-app-basic basic 2.0.7 Важн…

Где храниться свойство adminEmail

Мне пришлось настраивать форму контакта на сайте с Yii2 и как обычно я посмотрел в исходник SiteController.php базового шаблона Yii2. Увидел я там следующий код:
publicfunctionactionContact(){ $model = new ContactForm(); if ($model->load(Yii::$app->request->post()) && $model->contact(<b>Yii::$app->params['adminEmail']</b>)) { Yii::$app->session->setFlash('contactFormSubmitted'); return$this->refresh(); } return$this->render('contact', compact('model')); } Значит Yii по-умолчанию берет email администратора из конфигов, первым делом я зашел в web.php конфиг, но к сожалению там я не нашел параметра adminEmail, оказалось что этот параметр сохранен в params.php
Конечно эту настройку можно найти очень быстро, но иногда даже такие простые вещи могут поставить в тупик!

Абстракция для выполнения запросов к серверу jquery

Для выполнения запросов на сервер на мой взгляд лучше сразу ввести хоть какой-нибудь слой абстракции, но не использовать стандартный $.ajax метод jquery.
В моем случае я использую вот такой объект:
ServerSinchronizator = { endPoints: { "common": "/json/" }, availableActions: { "data": { method: "GET", url: "" }, "userLogin": { method: "POST", url: "?action=login" }, "useBonuses": { method: "POST", url: "?action=use_bonus" }, "useCertificate": { method: "POST", url: "?action=use_certificate" }, "sendOrder": { method: "POST", url: "?action=new_order" }, "cartAdd": { method: "POST", url: "?action=add" }, "cartUpdate":…

Простой шаблонизатор для js приложений

Очень простая функция для выполнения шаблонизации есть вот здесь.
Посмотреть пример онлайн
Пример функции шаблонизатора:
(function(){ var cache = {}; this.tmpl = functiontmpl(str, data){ var fn = !/\W/.test(str) ? cache[str] = cache[str] || tmpl(document.getElementById(str).innerHTML) : newFunction("obj", "var p=[],print=function(){p.push.apply(p,arguments);};" + "with(obj){p.push('" + str .replace(/[\r\t\n]/g, " ") .split("<%").join("\t") .replace(/((^|%>)[^\t]*)'/g, "$1\r") .replace(/\t=(.*?)%>/g, "',$1,'") .split("\t").join("');") .split("%>").join("p.push('") .split("\r").join("\\'") + "');}return p.join('');"); return data ? fn( data ) : fn; }; })…

Git Flow полный push на сервер

При работе с git flow часто возникает необходимость слить мастер и девелоп и отправить все изменения на сервер..

Для того, чтобы не писать все команды по отдельность можно сделать простой скрипт (super-push.sh):


#!/usr/bin/bash git checkout master git merge develop git checkout develop git merge master git push origin master git push origin develop git push --tags Этот BASH скрипт поможет вам слить master и develop и отправить все изменения из этих веток на сервер плюс еще и отправить все ваши тэги.
Важно не забыть поставить скрипту права на исполнение

$ sudo chmod a+x super-push.sh И все можно пушить все сразу из вашего репозитория примерно вот так:
$ ./super-push.sh

Изменить кодировку всех файлов в директории

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

find . -name "*.js" -exec iconv -f UTF-8 -t CP1251 {} -o ./{} \; Здесь все достаточно просто find находит все файлы по переданной маске и для каждого выполняет команду iconv результат сохраняется относительно текущей директории в которой была запущена команда.

Конкатенация html в NODEjs вторая попытка

У меня уже были функции, с помощью которых можно объединить несколько HTML файлов c помощью nodejs, но та функция не поддерживала запуск без вотчера.. Теперь есть поддержка простого запуска этой функции на дирректорию
var fs = require('fs'), path = require('path'); gulp.task("concatHtml", function(){<p> concatHtml('./pages/'); });</p> functionconcatHtml(event){ var isDir, clearFileName; fs.stat(event, function(err, stats){ var filesToConcat = []; isDir = stats.isDirectory(); if (isDir) { fs.readdir(event, function(err, files){ files.forEach(function(file){ clearFileName = path.basename(file); filesToConcat.push(clearFileName); }); realConcat(filesToConcat); }) } else { clearFileName = path.basename(event.path); filesToConcat.push(clearFileName); …

BASH скрипт для транслитерации текущего каталога на латинице

Полезный скрипт, который может выполнить транслитирацию файлов и папок текущего каталога на латиницу.
#!/bin/bash# Перекодирует рекурсивно в текущем каталоге имена# файлов и каталогов в транслит.# shopt встроенная команда оболочки. Управляет опциями оболочки.# Если в каталоге нет ни одного файла, соответствующего шаблону,# то за имя файла принимается сам шаблон.# Ключ nullglob исправляет эту ситуациюshopt-s nullglob # Перебираем все файлы в текущем каталогеfor NAME in * ; do# sed-ом заменяем символы кирилицы на символы латиницы TRS=`echo$NAME | sed "y/абвгдезийклмнопрстуфхцы/abvgdezijklmnoprstufxcy/"` TRS=`echo$TRS | sed "y/АБВГДЕЗИЙКЛМНОПРСТУФХЦЫ/ABVGDEZIJKLMNOPRSTUFXCY/"` TRS=${TRS//ч/ch}; TRS=${TRS//Ч/CH} TRS=${TRS//ш/sh}; TRS=${TRS//Ш/SH} TRS=${TRS//ё/jo}; TRS=${TRS//Ё/JO} TRS=${TRS//ж/zh}; TRS=${TRS//Ж/ZH} TRS=${TRS//щ/sh\'}; TRS=${TRS///SH\'} TRS=${TRS//э/je}; TRS=${TRS//Э/JE} TRS=${TRS//ю/ju}; TRS=${TRS//Ю/JU} TRS=${TRS//я/ja}; TRS=${TRS//…

Использование памяти в PHP

В последнее время начал задумываться об использовании памяти в тех ЯП, которыми пользуюсь.
По PHP нашел вот такую статью по использвоанию памяти. Очень понравилась эта статья.
Дальше некоторые данные по использованию памяти разными конструкциями языка PHP.
Скалярная переменная 76 байт $a = array(); 164 байта class A { } $a = new A(); 184 байта $a = new stdClass(); 272 байта цикл foreach Увеличивает потребление памяти, с каждой итерацией, видимо сохраняя значения каждой итерации в промежуточные внутренние структуры, но после завершения цикла, эта память будет освобождена. Понравился пример, в котором значение в цикле foreach передается по ссылке и при удалении ключа и значения на каждой итерации цикла мы не теряем память.
foreach ($aas$k=>&$v) { $a[$k] = someBigValue(); $v = someBigValue();unset($k, $v); echo'In FOREACH cycle.'.PHP_EOL; memoryUsage(memory_get_usage(), $base_memory_usage); } И еще статья по потреблению памяти объектами.

Настройка WebDriverIO для работы с CodeceptionJs

При работе с codeceptionjs я столкнулся с такой проблемой, что если использовать phantomjs в качестве браузера для тестирвоания, то практически невозможно нормально протестировать клики на страницах и прочие вещи, связанные с активными действиями.
Поэтому я решил подробнее изучить проблему и пришел к такому выводу, что вместо phantomjs лучше использовать selenium.
О том как установить и заппускать selenium хорошо написано вот здесь. После того, как вы скачаете selenium вам потрубуется скачать либо chromedriver либо geckodriver(firefox) это уже на ваш вкус.
Я лично скачал драйвер для Google Chrome вот из этого мануала. И положил бинарный файл в свою директорию /usr/bin и начаначил ему соответствующие права на запуск.
$ sudo chmod a+x /usr/bin/chromedriver Для запуска selenium java-версии используется вот такая строка
$ java -jar selenium-server-standalone-2.xx.xxx.jar Это сразу можно поправить с помощью .bashrc прописав алиас вот таким образом:
alias selenium="java -jar se…

Bitrix Проверка принадлежности текущей категории определенному родительскому инфоблоку

Иногда необходимо проверить что какой-либо раздел каталога является потомком какого-то другого раздела, но при этом мы не знаем сколько уровней вложености может разделять две категории.
В таким случая очень сильно помогает концепция вложеных множеств, которую реализует механизм инфоблоков Bitrix.
Основываясь на этих вложеных множествах можно применить вот такой код:
$checkFilterAvailable = function($currentId, $parentId){ $rs = CIBlockSection::GetList( array(), array('ID'=>$parentId) ); $ar = $rs->GetNext(); $rs = CIBlockSection::GetList( array('LEFT_MARGIN'=>'ASC'), array( 'ID' => $currentId, '>LEFT_MARGIN'=>$ar['LEFT_MARGIN'], '<RIGHT_MARGIN'=>$ar['RIGHT_MARGIN'], ) ); if ($rs->GetNext()) { returntrue; } return…

Простенький скрипт для просмотра локальной почты php Apache

В этой статье хочу немного рассказать о том, как я сделал локальный скрипт на PHP с помощью которого можно выполнять обработку почтовых сообщений моих локальных тестовых сайтов.
В результате у меня получился локальный домен, в котором я могу получить конкретное сообщение по адресу http://mail/18 - это будет сообщение номер 18 и получить список сообщений по адресу http://mail/list.
Далее приведу пример своего Г**** кода в котором все смешано, но обработка выполняется так как нужно:
<html><head><metacharset="utf-8"><title>Просмотр сообщения</title></head><bodystyle="background: #ccc"><?php$f = isset($_GET['id']) ? $_GET['id'] : null; $rootDir = '/var/mail/sendmail/new'; $standartPath = $rootDir . '/letter_'; ?><h1style="margin-top: 30px; color: blue; text-align: center"> Самопальный почтовый кл…

Создание приемочных тестов с помощью CodeceptJS

С помощью codecept JS можно выполнять приемочное тестирование
Ссылка на проект.
При запуске codeceptjs может возникнуть ошибка:
/usr/local/lib/node_modules/codeceptjs/lib/config.js:2let fs = require('fs'); ^^^ SyntaxError: Unexpected strict mode reserved word at Module._compile (module.js:439:25) at Object.Module._extensions..js (module.js:474:10) at Module.load (module.js:356:32) Чтобы избавиться от этой проблемы необходимо обновить nodejs.
Инструкция по обновлению nodejs здесь.
Quickstart находится вот тут.
Что делать если объект I пустой? Если в ваших тестах объект I оказался пустым, то это скорее всего значит, что вы не выбрали один из этих вариантов:
? What helpers do you want touse? ❯◉ WebDriverIO ◯ Protractor ◯ SeleniumWebdriver ◯ Nightmare ◯ FileSystem Выбираются они пробелом, после чего нажимается клавиша Enter.
Что делать если тесты говорят что Selenium не запускается? Если вы получили подобную ошибку значит на вашем http://localhost:4444 не запуще…

Пользователи и группы в линукс.

Нашел хорошую и достаточно подробную статью по управлению пользователями и группами в linux, прочитал и оставил здесь на память.
http://www.oldnix.org/users-groups/

Bitrix дополнительные свойства раздела.

Иногда необходимо в битриксе получить значения дополнительных свойств раздела, чтобы вывести их где нибудь на сайте.
Вот эта статья мне очень помогла в этой проблеме http://skarzhinets.com/info/blog/bitriks-dop-svois...
Надеюсь еще кому-нибудь она поможет.
В моем случае получилась вот такая функция:
<?php/* Получить иконки категории */functiongetCategoryIcons($parentSection){ if (empty($parentSection)) returnfalse; /* Данные для списка */$db_list = CIBlockSection::GetList(Array(SORT=>"ASC"), $arFilter = Array( "IBLOCK_ID"=>$parentSection["IBLOCK_ID"], "ID"=>$parentSection["ID"]), true, $arSelect=Array("UF_CATEGORY_ICON") ); /* Вывод списка */while($ar_result = $db_list->GetNext()){ if (!$ar_result["UF_CATEGORY_ICON"]) break; echo'<ul class="category-icons">'; foreach($ar_result["UF_CATEGORY_ICON"] as$PR…

Небольшая записка об использовании утверждений.

Утверждения - это давно всем известная методика управления сложностью программного обеспечения. Но очень не многие программисты действительно серьезно воспринимают этот подход. Почему так происходит? На мой взгляд это связано с тем, что любой нормальный программист не любит писать лишний код, из - за этого можно услышать такие фразы "Утверждения мусорят код" и все в этом духе.
Я люблю утверждения! Все, что я здесь напишу - это мое субъективное мнение, так что если оно не совпало с Вашим, прошу прощения.
Утверждения это совсем не тесты! Очень важно это понимать и не использовать утверждения так же как вы используете тесты, также если вы используете утверждения это совсем не значит, что вам не нужно писать тесты! Для меня утверждения - это способ доказать себе что я получил то что я ожидал получить. Основная польза от утверждений заключается не в том, чтобы доказать работу программы а в том чтобы быть уверенным, что программа не сделает лишних действий.
Ну вроде бы…

Собственный тестовый фреймворк, для тестирования верстки сайта на JS.

В продолжении моих изысканий в создании тестовых фреймворков я сделал расшерение для jQuery в котором можно регистрировать тесты на проверку верстки вашего сайта и в случае нарушения теста результаты проверок будут либо выведены в консоль браузера, либо будут сохранены в переданный php обработчик.
Код получился достаточно крупным, но зато он обрабатывает достаточно много случаев. Со временем код может измениться, поэтому за последними изменениями обращаться на GitHub в мой репозиторий.
(function($){ "use strict"; functionclone(o){ var obj = []; for(var i in o){ obj[i] = o[i]; } return obj; } /** * Помощник для выполнения тестирования * стилей сайта */var th = { testsCount : 0, testsFailed : 0, testsSuccess : 0, testsSkipped : 0, canTest : false, currentElement : null, currentSelector : null, a…