Free ssl certificate 90 days Let’s Encrypt with auto update ACME client

Воспользуемся бесплатным сертификатом центра сертификации Let’s Encrypt, есть ограничение, сертификат выдается на 90 дней, но центр сертификации поддерживает ACME протокол, что дает возможность обновлять сертификат автоматически. Воспользуемся клиентом Letencrypt.sh is a pure BASH implementation of the ACME protocol used by Lets Encrypt
root@www:/usr/ports # cd /usr/ports/security/letsencrypt.sh
root@www:/usr/ports/security/letsencrypt.sh # make install
====> Compressing man pages (compress-man)
===>  Installing for letsencrypt.sh-0.2.0
===>  Checking if letsencrypt.sh already installed
===>   Registering installation for letsencrypt.sh-0.2.0
Installing letsencrypt.sh-0.2.0...
To use this script you should copy the examples in
/usr/local/etc/letsencrypt.sh/ and at least add a
domain and a contact mail address.

You should also copy the openssl.cnf.sample file in
/usr/local/openssl so you won't get warnings about
it missing.

In order to run the script regularly to update
the certificates add this line to /etc/periodic.conf

weekly_letsencrypt_enable="YES"

Additionally the following parameters can be added to
/etc/periodic.conf

To run the certification renenewal as a different user
weekly_letsencrypt_user="_letsencrypt"
To run a script after the renewal (as root)
weekly_letsencrypt_deployscript="/usr/local/etc/letsencrypt.sh/deploy.sh"
я добавил только одну строчку weekly_letsencrypt_enable=»YES», пусть рутом работает

в domains.txt добавим имена доменов и поддоменов
root@www:/usr/local/etc/letsencrypt.sh # cat domains.txt
mneti.ru www.mneti.ru
в config.sh подправим, это обязательно, папка используется для обмена в процессе аутентификации домена
# Output directory for challenge-tokens to be served by webserver or deployed in HOOK (default: $BASEDIR/.acme-challenges)
#WELLKNOWN="${BASEDIR}/.acme-challenges"
WELLKNOWN="/usr/local/www/nginx-mneti/.well-known/acme-challenge"
Иначе получим ошибку
root@www:/usr/local/etc/letsencrypt.sh # /usr/local/bin/letsencrypt.sh -c
# INFO: Using main config file /usr/local/etc/letsencrypt.sh/config.sh
Processing mneti.ru with alternative names: www.mneti.ru
 + Signing domains...
 + Generating private key...
 + Generating signing request...
 + Requesting challenge for mneti.ru...
 + Requesting challenge for www.mneti.ru...
 + Responding to challenge for mneti.ru...
ERROR: Challenge is invalid! (returned: invalid) (result: {
  "type": "http-01",
  "status": "invalid",
  "error": {
    "type": "urn:acme:error:unauthorized", 
root@www:/usr/local/etc/letsencrypt.sh # /usr/local/bin/letsencrypt.sh -c
# INFO: Using main config file /usr/local/etc/letsencrypt.sh/config.sh
Processing mneti.ru with alternative names: www.mneti.ru
 + Signing domains...
 + Generating private key...
 + Generating signing request...
 + Requesting challenge for mneti.ru...
 + Requesting challenge for www.mneti.ru...
 + Responding to challenge for mneti.ru...
 + Challenge is valid!
 + Responding to challenge for www.mneti.ru...
 + Challenge is valid!
 + Requesting certificate...
 + Checking certificate...
 + Done!
 + Creating fullchain.pem...
 + Done!
В конфиге виртуального хоста включим ssl, пропишем пути к сертификату и ключу и редирект на https если пришли на http
    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    server {
<------>listen 80;
        listen 443 ssl;

<------>ssl_certificate      /usr/local/etc/letsencrypt.sh/certs/mneti.ru/cert.pem;
<------>ssl_certificate_key  /usr/local/etc/letsencrypt.sh/certs/mneti.ru/privkey.pem;

        server_name  mneti.ru  *.mneti.ru;
<------>access_log /var/log/nginx/mneti.access_log;
        error_log /var/log/nginx/mneti.error_log info;
....
<------>if ($ssl_protocol = "") {
<------>    return 301 https://$server_name$request_uri;
<------>}

        root   /usr/local/www/nginx-mneti;
        index  index.html index.htm index.php;

        location / {
    <-->    try_files $uri $uri/ /index.php;
<------>}

        location ~ \.php$ {
<------>    fastcgi_pass   127.0.0.1:9000;
<------>    fastcgi_index  index.php;
<------>    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
<------>    fastcgi_param  PHP_ADMIN_VALUE "open_basedir=$document_root:/tmp:/var/tmp";
<------>    include        fastcgi_params;
<------>}

    }
Обнаружилась проблемка, часть мобильных браузеров сертификат не признавали, все потому что им нужны промежуточные сертификаты вплоть до корневого, полная цепочка, клиент Letencrypt.sh и об этом позаботился, просто заменим в конфиге нгинкса
# ssl_certificate      /usr/local/etc/letsencrypt.sh/certs/mneti.ru/cert.pem;
ssl_certificate      /usr/local/etc/letsencrypt.sh/certs/mneti.ru/fullchain.pem;

SQL Server 2005 imitate Oracle keep dense_rank

Замена Ораклевого keep dense_rank на SQL Server 2005
select max(m.id),
       m.someId keep (DENSE_RANK FIRST ORDER BY m.UpdateDate desc) 
from MyTable m 
group by m.someId
Исходные данные
id UpdateDate someId
1  20-01-2012 10
2  20-01-2012 10
3  01-01-2012 10
4  10-02-2012 20
5  01-02-2012 20
6  01-04-2012 30
Результат
2 10
4 20
6 30
И конечно это будет работать и на Оракле.
select m.*
from (select *, row_number() over (partition by m.someid ORDER BY m.UpdateDate desc, m.id desc) as seqnum
      from MyTable m
     ) m
where seqnum = 1
Результат,
группировки снаружи не нужно, группировка идет по окну over (partition by m.someid
max(m.id) заменен сортировкой в окне ORDER BY .... m.id DESC
id	UpdateDate	someId	seqnum
2	2012-01-20 00:00:00.000	10	1
4	2012-02-10 00:00:00.000	20	1
6	2012-04-01 00:00:00.000	30	1

IE10,IE11 bug — You must choose an item from the list

Баг в ИЕ10, ИЕ11 получаем сообщение «Необходимо выбрать элемент из списка» если для элемента select установлено свойство required и изначально пустой select будет заполнен с помощью javascript И кликнули в пустой селект ИЛИ сперва попытались отправить пустой список. Усложнение уровня если select будет заполнен единственным option, выбрать его вообще никак не получится. Безымянный93 Решение в коде, «передерним» селект, в ДОМ структуре то селект обозначен как с выбранным элементом.
Или использовать селект с элементом плайсхолдером.

function hack1() {
	var cur = $('#select1').prop('selectedIndex');
	$('#select1').prop('selectedIndex', -1);
	$('#select1').prop('selectedIndex', cur);
}
Тут можно протестировать

css title

Задача, в таблице есть строки с некоторыми стилями флагами, код и js недоступен, только css, нужно проставить title атрибут, некий аналог.

tr.is-foreign:hover td:nth-child(2):before {
 position: absolute;
 background: #fff;
 border: 1px solid grey;
 border-radius: 3px;
 color: #000;
 padding: 4px 6px;
 margin-top: -24px;
 content: "\421\418\20\43D\430\20\0437\430\43C\435\43D\443";
}
 
От "Чужое СИ" взял Unicode Entities, получил  %u0427%u0443%u0436%u043E%u0435%20%u0421%u0418
%u0 заменяем на \, %u на \ получаем значение content
 
Безымянный92

Skipping recall function from a script php

Пропуск повторного вызова функции из скрипта php.
session_id('cron'); //используем именованную сессию, имя файла сессии sess_cron
session_start();
if ($this->session->has(__METHOD__)) {
	$attemptCount = intval($this->session->get('attemptCount-' . __METHOD__));
	$this->session->set('attemptCount-' . __METHOD__, ++$attemptCount);
	printf("Run at: %s\r\n", date('c', intval($this->session->get(__METHOD__))));
	return;
} else {
	$this->session->set(__METHOD__, $_SERVER["REQUEST_TIME_FLOAT"]);
	$this->session->set('attemptCount-' . __METHOD__, 1);
	session_write_close(); // закроем сессию, снимем с нее блокировку иначе следующие скрипты не смогут ничего прочитать и будут ждать в очереди, а нам нужен другой эффект
}

sleep(300); //тут что-то делаем

//снимаем блокировку
session_id('cron');
session_start();
$this->session->remove(__METHOD__);
Безымянный91
если хотим аналог мьютекса, то достаточно только session_id(‘cron’) и все, все скрипты в очереди на ожидание ресурса — файла сессии

Set environment variables for php script

Пример передачи переменной окружения в скрипт php запускаемый из крона, пример для Debiana
root@metrolog:~# uname -a Linux metrolog 3.2.0-4-amd64 #1 SMP Debian 3.2.60-1+deb7u3 x86_64 GNU/Linux root@metrolog:~# crontab -l # Edit this file to introduce tasks to be run by cron. # # Each task to run has to be defined through a single line # indicating with different fields when the task will be run # and what command to run for the task # # To define the time you can provide concrete values for # minute (m), hour (h), day of month (dom), month (mon), # and day of week (dow) or use &#8216;*&#8217; in these fields (for &#8216;any&#8217;).# # Notice that tasks will be started based on the cron&#8217;s system # daemon&#8217;s notion of time and timezones. # # Output of the crontab jobs (including errors) is sent through # email to the user the crontab file belongs to (unless redirected). # # For example, you can run a backup of all your user accounts # at 5 a.m every week with: # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/ # # For more information see the manual pages of crontab(5) and cron(8) # # m h dom mon dow command */5 * * * * /usr/bin/php /var/www/issues/cli/tools/cron.php */1 * * * * export APPLICATION_ENV=production && /usr/bin/php /var/www_dev2/app/cli.php cron test

php анонимная функция с возможностью немедленного выполнения

Аналог анонимной функции JavaScript с немедленным исполнением
(function () { /* do something */ })()

модель рабочего примера, найти первое вхождение, частичное или полное

#php 5.3
$ttttar212 = ['asf',['asd','qwer2'],'qwe'];
$inttttar = 0;
call_user_func(function($cont_act, $ttttar212) use (&$inttttar) {
	foreach ($ttttar212 as $v) {
		if ($cont_act[0] === $v || $cont_act === $v) {
			$inttttar++;
			break;
		}
	}
}, ['qwe','qwer'], $ttttar212);

в действии

// если совпадает с внутренними (с виртуальными) то тоже подсветим
if ($data->active == 0 && isset($data->virtual) && is_array($data->virtual)) {
	call_user_func(function($cont_act, $ttttar) use (&$data) {
		foreach ($ttttar as $v) {
			if ($cont_act[0] === $v || $cont_act === $v) {
				$data->active++;
				break;
			}
		}
	}, [$controllerName, $actionName], $data->virtual);
//	$data->active += (int)in_array($controllerName, $data->virtual);
//	$data->active += (int)in_array([$controllerName,$actionName], $data->virtual);
}

Добавить столбец с not null в таблицу с даными

При попытке:
alter table m_listDocs add contractId int not null

Инструкция ALTER TABLE допускает добавление только тех столбцов, которые могут содержать значения NULL, имеют указанное определение DEFAULT, являются столбцами идентификаторов или временной метки; если ни одно из вышеперечисленных условий не выполнено, для добавления такого столбца таблица должна быть пустой. Не удалось добавить столбец «contractId» в непустую таблицу «m_listDocs», так как она не соответствует этим условиям.

Обходим:
alter table m_listDocs add contractId int
update m_listDocs set contractId = 0
alter table m_listDocs alter column contractId int not null