Skip to content

Instantly share code, notes, and snippets.

@b2whats
Last active February 21, 2016 04:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save b2whats/b3611fd12230e7d63501 to your computer and use it in GitHub Desktop.
Save b2whats/b3611fd12230e7d63501 to your computer and use it in GitHub Desktop.
/*eslint-disable no-console, radix*/
import webpack from 'webpack';
import path from 'path';
import writeStats from './writeStats';
import ExtractTextPlugin from 'extract-text-webpack-plugin';
import CleanPlugin from 'clean-webpack-plugin';
import autoprefixer from 'autoprefixer-core';
import webpackStripLoader from 'strip-loader';
import { host, webpackPort, buildDir } from '../config';
const argv = require('minimist')(process.argv.slice(2));
const DEBUG = !argv.production;
const notExclude = [].join('|');
const EXCLUDE_JS = notExclude !== '' ? new RegExp('node_modules/(?!' + notExclude + ')') : new RegExp('node_modules');
const JSX_LOADER = DEBUG ? ['react-hot', 'babel'] : [webpackStripLoader.loader('console.log'), 'babel'];
const CSS_LOADER = ExtractTextPlugin.extract('style', 'css?modules&importLoaders=1&localIdentName=[name]-[local]!postcss');
const AUTOPREFIXER_BROWSERS = [
'Android 2.3',
'Android >= 4',
'Chrome >= 20',
'Firefox >= 24',
'Explorer >= 8',
'iOS >= 6',
'Opera >= 12',
'Safari >= 6'
];
const PLUGINS = [
DEBUG && new webpack.HotModuleReplacementPlugin(),
DEBUG && new webpack.IgnorePlugin(/\.json$/),
!DEBUG && new CleanPlugin(['build'], path.resolve(__dirname, '..')),
!DEBUG && new webpack.DefinePlugin({
'process.env': {
NODE_ENV: JSON.stringify('production')
}
}),
!DEBUG && new webpack.optimize.DedupePlugin(),
!DEBUG && new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
}
}),
new ExtractTextPlugin('[name]-[chunkhash].css', {allChunks: true, disable: DEBUG}),
new webpack.optimize.OccurenceOrderPlugin(),
new webpack.NoErrorsPlugin(),
new webpack.DefinePlugin({
__CLIENT__: true,
__SERVER__: false,
__DEVELOPMENT__: DEBUG ? true : false,
__DEVTOOLS__: false
}),
function write() {
this.plugin('done', stats => {
let type = DEBUG ? 'dev' : 'prod';
writeStats.call(this, stats, type);
});
}
];
const config = {
devtool: DEBUG ? 'eval-source-map' : 'source-map',
entry: {
'main': ['./src/client.js'].concat(!DEBUG ? [] : [
`webpack-dev-server/client?http://${host}:${webpackPort}`,
'webpack/hot/only-dev-server'
])
},
cache: DEBUG,
debug: false,
output: {
path: buildDir,
filename: 'client.js',
publicPath: DEBUG ? `http://${host}:${webpackPort}/webPackDevServer/` : './'
},
module: {
loaders: [
{ test: /\.(jpe?g|png|gif|svg)$/, loader: 'file' },
{ test: /\.jsx?$/, exclude: EXCLUDE_JS, loaders: JSX_LOADER},
{ test: /\.json$/, loader: 'json-loader' },
{ test: /\.css$/, loader: CSS_LOADER }
]
},
postcss: [autoprefixer(AUTOPREFIXER_BROWSERS)],
resolve: {
modulesDirectories: ['src', 'node_modules'],
extensions: ['', '.json', '.js', '.jsx']
},
plugins: PLUGINS.filter(plugin => plugin !== false)
};
export default config;
@b2whats
Copy link
Author

b2whats commented Nov 6, 2015

Иногда пробел в начале строки может обозначаться - неразрывным пробелом. И функция trim работать не будет. Исправляем :
trim($строка,chr(160));

При ручном написании русских символов в строке браузера, некоторые браузеры не кодируют автоматически эту строку и отправляют ее на сервер прямо как есть с русскими символами. На сервере она не будет нормально определяться и будут каракули. Видел это в ИЕ.
Мы через регулярки берем исходную строку и проверяем передана ли она в utf8 если нет то перекодируем
if (!preg_match('//u', $_GET['q'])) {
$_GET['q'] = iconv('Windows-1251', 'utf-8', $_GET['q']);
}

В кодировке UTF8 Это работать не будет, нужно :

chr(194).chr(160)

===Postgres===
/etc/init.d/postgresql status
/etc/init.d/postgresql start
/etc/init.d/postgresql stop

Создать последовательность:

CREATE SEQUENCE carmodel.carmodel_id_seq
START WITH 11528

Получить последнее значение последовательности(инкремент):

SELECT nextval ('shipments_ship_id_seq')

Получить текущее значение последовательности(возвращается массив последовательностей)

select * FROM brandcar_id_seq

Получить следующее значение последовательности не перенося инкремент

select last_value FROM brandcar_id_seq

Задать максимальное значение последовательности по максимальному ид

select setval('country_id_seq', (select max(id)+1 from country));

Добавить автоинкремент у колонки

ALTER TABLE carmotor ALTER COLUMN id SET DEFAULT nextval ('carmotor_id_seq');

Сортировать по колонке вне зависимости от регистра букв
order by lower(col_name)

Дамп базы
pg_dump -U toolfinddbman -F p -f dump.tar.gz pgdatabase
-U - пользователь который имеет доступ к базе данных
-F - формат дампа tar.gz
-f - имя дампа
Последним указываем имя базы данных
pg_dump -h localhost -U postgres -F p -t manufacturers -f /tmp/man.sql tool_find_catalog

выкладываем текстовый дамп
cat /tmp/ma.sql | psql -h localhost -U postgres tool_find_catalog

Удаляем старый кластер базы данных
pg_dropcluster --stop 9.1(версия кластера) main(имя кластера, получить можно pg_lsclusters)

Создаем новый кластер
pg_createcluster --locale de_DE.UTF-8 --start 9.3 main

Обновить постгрес
Скачиваем новую версию
apt-get install postgresql-9.3 postgresql-client-9.3
Далее останавливаем работу кластера
service postgresql stop main 9.4

и далее
su -l postgres

/usr/lib/postgresql/9.3/bin/pg_upgrade
-b /usr/lib/postgresql/9.1/bin
-B /usr/lib/postgresql/9.3/bin
-d /var/lib/postgresql/9.1/main
-D /var/lib/postgresql/9.3/main
-o " -c config_file=/etc/postgresql/9.1/main/postgresql.conf "
-O " -c config_file=/etc/postgresql/9.3/main/postgresql.conf "
-c
Если все окей то убираем ключ -с
и выполняем. Локали у кластеров должны при этом совпадать

При создании функций все строковые данные нужно заключать в двойные одинарные кавычки ''ххх''

Что бы сменить тип колонки в базе данных с текстового на числовой нужно :
ALTER TABLE articles
ALTER COLUMN manufacturer TYPE integer -> На какой тип меняем
USING manufacturer::integer; -> Преобразовываем значения

Update таблицы по другой таблице
UPDATE
tof_art_lookup as t1
SET
arl_bra_id = ta.art_sup_id
FROM
tof_art_lookup as tal
LEFT JOIN
tof_articles as ta
ON
tal.arl_art_id = ta.art_id
where t1.arl_id = 2 and t1.arl_id = tal.arl_id
В условии Where обязательно указываем обновляемую таблицу и связываем ее строки с таблицйей из которой берем данные

Поиск по массиву
select * from autorepair where services @> '{3}'::integer[]
select * from autorepair where services @> array[1]
select * from autorepair where 11 = ANY (services);

Обновить JSON поле
SELECT service::text, regexp_replace(service::text, E'("type"[\s]:)([\s"][0-9][\s"])', concat('\1','"fef"'))::json
FROM ag_company;

Поиск по множеству значений
select * from autorepair where services && array[1]

Некая организация left join в массиве
select *,(select string_agg(service,',') from autorepair_service where id in(select * from unnest(services))) from autorepair where services && array[11]

Наименование баз данных
Наименование таблиц.
Порядок слов идет от общего к частному, от сущности к свойствам. Т.е. «Бумага туалетная», вместо «Туалетная бумага», «Огурцы маринованные», а «Паста томатная».
Первое слово это группа таблиц которые могут быть связаны, разделитель подчеркивание, второе слово это название таблицы

Нименование колонок.
Именуем единичным словом, если колонка указывает на связь с другой таблицей то называем ее:
ИмяТаблицы_ИмяСтолбцаДляСвязи, группу к которой принадлежит данная таблица мы опускаем. И так понятно что все связные данные будут пренадлежать таблицам из одной группы. Если же все таки мы должны связать ячейку с данными не из таблицы из одной группы, то в названии в начале через подчеркивание мы пишем эту группу

Рекурсивный обход дерева, в запросе до Union составляем начальную строку с которой начинаем обход, после юнион идет запрос который конкатенирует данные в цикле, 3 запросом выводим получившееся дерево. Вариант с выявлением последних пунктов дерева
WITH RECURSIVE tree_r ( id,parent,name,PATH_ID,PATH_NAME, LEVEL, LAST ) AS (
SELECT t1.id,t1.parent,t1.name, CAST (t1.id AS VARCHAR (250)) as PATH_ID,CAST (t1.name AS VARCHAR (250)) as PATH_NAME, 1, CASE WHEN (SELECT count(id) FROM tree where parent = t1.id) > 0 THEN 0 ELSE 1 END as LAST
FROM tree t1 WHERE t1.parent IS NULL
union
SELECT t2.id,t2.parent,t2.name, CAST (tree_r.PATH_ID ||','|| t2.id AS VARCHAR (250)) as PATH_ID,CAST (tree_r.PATH_NAME ||','|| t2.name AS VARCHAR (250)) as PATH_NAME, tree_r.LEVEL + 1, CASE WHEN (SELECT count(id) FROM tree where parent = t2.id) > 0 THEN 0 ELSE 1 END as LAST
FROM tree t2 INNER JOIN tree_r ON (tree_r.id= t2.parent) AND EXISTS (SELECT count(id) FROM tree where parent = t2.id)
)
select * from tree_r order by id asc

===UPSERT ===
WITH upd AS (
UPDATE ag_autoservice
SET brand__id = '{1,6}'
WHERE company__id = 20402
RETURNING company__id
)
INSERT INTO ag_autoservice(company__id, brand__id)
SELECT 20402, '{64}'
WHERE NOT EXISTS (SELECT * FROM upd)

Собираем json в постгресе
given:
serial | name | type
847001 | t15 | GE1043
847002 | t16 | GE1043
847003 | sub-alpha | GESS90

I want to produce:
{ "turbines" :
{
847001 : { "name" : "t15", "type" : "GE1043" },
847002 : { "name" : "t16", "type" : "GE1043" },
847003 : { "name" : "sub-alpha", "type" : "GESS90" }
}
}
select json_build_object("turbines",
json_object_agg(serial, json_build_object("name",name,"type",type)))
from mytable;

INSERT в хранимых процедурах можно описать как общий запрос с помощью WITH и вернуть данные этого инсерта в виде таблицы(двойной инсерт)
WITH ins as (
insert into articles_link (la_ga_id,la_sort,articles_info_id,rel_id) SELECT la_ga_id,la_sort,group_detail,id
....
RETURNING id,la_ga_id,la_sort,articles_info_id,rel_id), ins2 as (
insert into tof_link_la_typ (lat_ga_id,lat_sort,modifications_id,articles_link_id,lat_sup_id) select llt.lat_ga_id,llt.lat_sort,llt.modifications_id,al.id,llt.lat_sup_id from ins al left join tof_link_la_typ llt on llt.articles_link_id =al.rel_id RETURNING lat_id
)
select * from ins2

Данные по выполнению запросов можно взять
http://www.postgresql.org/docs/8.3/static/plpgsql-statements.html

Сбросить пароль пользователя postgres
psql -U postgres
ALTER USER postgres with password 'autogiperpostgres';

=================PHP====================

Статическая переменная класса в двойных кавычках
echo "self::$var"
echo "{self::$var}"
echo "{${self::$var}}" работать не будет.
Единственный верный выход написать статическое свойство в двойных кавычках это передать через вторую переменную название класса.
$class = get_called_class();
echo "$class::$var"
============ MYSQL ============
О первичном ключе
Если делаете поле с auto_increment, то объявляйте его первичным ключом, иначе
Incorrect table definition; there can be only one auto column and it must be defined as a key

Что бы добавить в выборке данные из другой таблицы следует восспользоваться LEFT JOIN
SELECT * FROM company_subscription LEFT JOIN (SELECT DISTINCT(user_id), code FROM company_subscription_codes) AS t_codes ON t_codes.user_id = company_subscription.company_id

Что бы искать строку со специальными символами в таблице, нужно ее экранировать или заключить в двойные кавычки и тогда символы | <> -+= будут частью строки

Вывести материалы за определенную дату
SELECT * FROM table where date_format( col_date , '%Y-%m-%d' ) = '2014-03-16';

Динамический запрос в процедуре mysql
DELIMITER //
CREATE DEFINER=root@% PROCEDURE getCountry(IN locale char(2))
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
SET @Sql = CONCAT('SELECT * FROM country_', locale);
PREPARE getCountrySql FROM @Sql;
EXECUTE getCountrySql;
DEALLOCATE PREPARE getCountrySql;
END
DELIMITER ;

Бенчмарк
SELECT BENCHMARK(100000000,LOCATE('foo','foobar'));

==========Debian=============
Добавить переменную в окружение (временно)
PATH=$PATH:/usr/lib/postgresql/9.3/bin
export PATH
export PGDATA="/var/lib/postgresql/data"

Создать симлинк
ln -s /usr/lib/postgresql/9.3/bin/initdb initdb
chown -h user:group /home/symlink-to-opt-dir

Инициализировать кластер
initdb --locale=ru_RU.UTF-8 --lc-collate=ru_RU.UTF-8 --lc-ctype=ru_RU.UTF-8 --encoding=UTF8 -D /var/lib/postgresql/data

Посмотреть сколько места на диске занимают папки
du --max-depth=1 --si / - косая черта папка в которой смотреть

Посмотреть сколько места на диске
df -aHT

Кто сидит на портах
netstat -tpln | grep "tcp"

Вернуть закрытую через ctrl + z задачу
fg

Установить форвардинг портов без сервера с помощью rinitd
в /etc/rinetd.conf добавить
0.0.0.0 порт 0.0.0.0 порт
порт на локальной машине который слушается, порт куда направляем

Поменять у папки пользователя
sudo chown whoami:whoami -R /home/w/.npm

===========WEB DAV & CURL===============
Подключение
curl --digest -u webdav:documents
Получить файл с сервера -o(output)
curl --digest -u webdav:documents http://doc.toolfind.ru/fff -o /home/s/sandry/sandry.bget.ru/public_html/tool/ddd
Создать новую папку
curl --digest -u webdav:documents -v -X MKCOL http://doc.toolfind.ru/Имя папки
http://italiangrid.github.io/storm/documentation/webdav-guide/3.0.0/

================WORKER Supervisor ===============

обновление конфигов всех приложений, без перезапуска

supervisorctl reread

перезапуск приложений для которых обновился конфиг

supervisorctl update

Управление процессом

/etc/init.d/supervisor stop
/etc/init.d/supervisor start
/etc/init.d/supervisor status

===============SPHINX=====================
подключиться через консоль(Указывать порт что стоит в конфиге в строке listener)
mysql -h 127.0.0.1 -P 9306

==============JAVASCRIPT======================
При присваивании обработчиков событий в виде функций мы должны опускать круглые скобки. Они указывают на то что функция выполняется и возвращает нам значение. Без них, мы передаем тело финкции а нее ее вывод.
Функция должна быть присвоена как sayThanks, а не sayThanks():

document.getElementById('button').onclick = sayThanks;

Если добавить скобки, то sayThanks() — будет уже результат выполнения функции (а так как в ней нет return, то в onclick попадёт undefined). Нам же нужна именно функция.

ssh root@144.76.220.69 'pg_dump -h localhost -U postgres -F p -t
manufacturers tool_find_catalog' > ddd
Сделать дамп с виндоса

==================VirtualBOX=====================
Проброс портов
В самом начале делаем физические адреса нашим машинам и делаем их статическими
Вторым шагом забиваем эти адреса в роутере

=================Ansible===========================

=======================RabbitMQ=============================
Создать очереди через консоль
rabbitmqadmin declare exchange --vhost=/ name=parser type=fanout
rabbitmqadmin declare queue --vhost=Some_Virtual_Host name=some_outgoing_queue durable=true
rabbitmqadmin --vhost=/ declare binding source=parser destination_type=queue destination=parser_price routing_key=price

Создать юзера и установить мэнеджеры
rabbitmqctl add_user example example
rabbitmqctl set_user_tags example administrator
rabbitmqctl set_permissions -p / example "." "." ".*"

rabbitmq-plugins enable rabbitmq_management
wget http://95.213.182.170:15672/cli/rabbitmqadmin
chmod 777 rabbitmqadmin
mv rabbitmqadmin /usr/bin

========Chrome=========
Развернуть все вложенные узлы - Ctrl + Alt + Click

========Vagrant=========
vagrant up
vagrant halt

=======================Npm========================
Установить пакет из git
git://github.com/monstrs/markdown-it-traverse.git

===================Git=========================
git config --global user.email "b2whats@aol.com"
git config --global user.name "W"

Перенести изменения с одной ветки на другую
git stash
git checkout master
git pull
git checkout -b feature/название-твоей-ветки
git stash apply

rebase
https://htmlacademy.ru/blog/27

Добавить в коммит все измененные файлы
git add -u

Удалить папку из гита после коммита
git rm .idea/ -r --cached

@b2whats
Copy link
Author

b2whats commented Feb 21, 2016

============ Vim =============
Включить номера строк
echo "set number" >> ~/.vimrc или разовое использование при редактировании файла :set number

дублировать текущую строку
y+y или Y - скопировать текущую строку
p - вставить после текущей строки
Р - вставить до текущей строку

Отмена предыдущего действия
u
Отменить отмену
ctrl+R

Удалить текущую строку
dd или S но сразу перейти в режим редактирования

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment