• Как называются "составляющие" URL-а отделенные друг от друга слэшем?

    @m-haritonov
    Если не ошибаюсь, то "path segment".
    A path consists of a sequence of path segments separated by a slash
    ("/") character.

    https://tools.ietf.org/html/rfc3986#page-23
    Ответ написан
    Комментировать
  • Проблема с созданием rewiterule

    @m-haritonov
    RewriteEngine on
    
    RewriteCond %{QUERY_STRING} ^(do=.*)$
    RewriteRule .* /%1?
    
    RewriteRule ^(.*?)&tag[0-9]+=(.*)$ /$1-$2 [N]
    RewriteRule ^do=(.*?)-(.*)$ /$1/$2 [R=302,L]

    Обращение к URL адресу:
    /?do=servers&tag1=50_craft&tag2=active_admins&tag3=airdrop&tag4=no_sleepers&tag5=oxide&tag6=sethome&tag7=tpa

    Приведёт к перенаправлению на:
    /servers/50_craft-active_admins-airdrop-no_sleepers-oxide-sethome-tpa
    Ответ написан
    31 комментарий
  • Перенос inline блоков парами

    @m-haritonov
    @iiil меня опередил:
    <!DOCTYPE html>
    <html>
        <head>
    		<style>
    			div {
    				display: inline-block;
    			}
    			
    			div>div {
    				display: inline-block;
    				width: 100px;
    				height: 100px;
    				background: #ccc;
    			}
    		</style>
        </head>
        <body>
    		<div>
    		   <div>1</div>
    		   <div>2</div>
    		</div>
    		<div>
    		   <div>3</div>
    		   <div>4</div>
    		</div>
    		<div>
    		   <div>5</div>
    		   <div>6</div>
    		</div>
    		<div>
    		   <div>7</div>
    		   <div>8</div>
    		</div>
    		<div>
    		   <div>9</div>
    		   <div>10</div>
    		</div>
    		<div>
    		   <div>11</div>
    		   <div>12</div>
    		</div>
        </body>
    </html>


    UPDATE: более изящный вариант:
    <!DOCTYPE html>
    <html>
        <head>
    		<style>
    			* { margin: 0; padding: 0; }
    			
    			ul { list-style: none; text-align: center; }
    			
    			ul>li {
    				float: left;
    				width: 100px;
    				height: 100px;
    				background: #000;
    			}
    			
    			ul>li:nth-child(odd) {
    				margin-right: 100px;
    				background: #999;
    			}
    			
    			ul>li:nth-child(even) {
    				margin-left: -100px;
    				background: #eee;
    			}
    		</style>
        </head>
        <body>
    		<ul>
    			<li>1</li>
    			<li>2</li>
    			<li>3</li>
    			<li>4</li>
    			<li>5</li>
    			<li>6</li>
    			<li>7</li>
    			<li>8</li>
    			<li>9</li>
    			<li>10</li>
    		</ul>
        </body>
    </html>

    Селектор ":nth-child" в IE доступен лишь начиная с версии 9.0, поэтому, если требуется поддержка более ранних версий IE, можно заменить его добавлением в CSS классов "odd" и "even" при генерации HTML кода.
    Ответ написан
    5 комментариев
  • Переадресация с домена на субдомен, как реализовать на .htaccess?

    @m-haritonov
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^domen.ru$
    RewriteRule ^(.*)$ http://subdomen.domen.ru/$1 [R=301,L]


    Строчку с RewriteCond можно убрать, если требуется проводить редирект для всех запросов, поступающих на обработку данному .htaccess файлу.
    Ответ написан
    Комментировать
  • В чем проблема при установке PHP APC (mac)?

    @m-haritonov
    Если версия PHP >= 5.5.0, то возможно он конфликтует с акселератором opcache, который поставляется вместе с PHP начиная с версии 5.5.0.

    UPDATE: похоже, что разработка APC прекращена и с версией php 5.5 он не совместим: stackoverflow.com/questions/9611676/is-apc-compati...
    Ответ написан
  • Как изменить вид url сайта php?

    @m-haritonov
    Вообще, эта задача из двух частей:
    1. Получение URL адреса.
    2. Вывод HTML страницы с правильными URL адресами.

    Пример.

    Код для mod-rewrite, перенаправляющий все запросы в файл content.php:
    RewriteEngine on
    RewriteRule .* content.php


    Файл content.php:
    <?php
    // Эту часть кода можно реализовать и через mod-rewrite
    $parts = explode('/', substr($_SERVER['REQUEST_URI'], 0, strpos($_SERVER['REQUEST_URI'], '?')));
    $_GET['page'] = $parts[2];
    $_GET['id'] = $parts[3];
    ?>
    <html>
    <head>
    	<meta http-equiv="content-type" content="text/html; charset=utf-8" />
    	<title></title>
    </head>
    <body>
    	<?php /*
    	А код, отвечающий за то, ссылки на какие URL адреса будут в сгенерированной HTML странице, нужно размещать именно в PHP скрипте.
    
    	Либо использовать какой-нибудь модуль apache (например, mod_ext_filter), который будет заменять ссылки в отдаваемой пользователю HTML странице на нужные (а в PHP скрипте выводить ссылки вида "?page=news&id=5").
    	*/ ?>
    	<ul>
    		<li><a href="/page/<?=htmlspecialchars($_GET['page'])?>/<?=htmlspecialchars($_GET['id'])?>">Ссылка на текущую страницу</a></li>
    		<li><a href="/page/news/10">Ссылка на новость номер 10</a></li>
    	</ul>
    </body>
    </html>
    Ответ написан
    Комментировать
  • Каким образом вы изучаете исходный код?

    @m-haritonov
    1. Узнаю в рамках какой систему будет запускаться программа, исходный код которой я изучаю.
    2. Узнаю как происходит запуск программ в данной системе (ищу точки возможного входа в программу).
    3. Прослеживаю пути следования данных, которые поступают в точки входа программы.
    4. Ищу точки выхода программы (грубо говоря — участки кода, которые выполняют действия, выходящие за пределы изменения оперативной памяти программы (запись данных в постоянную память (файл на жёстком диске, база данных и т.п.), передача данных по сети, вывод данных в выходной поток и т.п.)).
    Ответ написан
    Комментировать
  • Как спроектировать модуль отдел, в котором были бы сотрудники отдела + краткое описание отдела под ZF2?

    @m-haritonov
    Мне видятся следующие варианты:
    1. Написать приложение в виде одного модуля.
    2. Написать приложение в виде двух модулей, каждый из которых требует обязательного наличия другого модуля.
    3. Написать приложение в виде двух модулей, каждый из которых может работать как самостоятельно, так и в связке с другим модулем (если таковой установлен в систему).

    Первый и второй вариант практически равнозначны (никакой монструозности в первом варианте не будет, если проектированию структуры приложения уделить столько же внимания, сколько и во втором случае).

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

    Третий вариант, соответственно, увеличит затраты на разработку из-за написания дополнительного кода (надо будет писать код как для ситуации, когда один модуль работает в паре с другим, так и для ситуации, когда один модуль работает изолированно от другого).

    Вообще, если из условия задачи исходит, что эти два модуля будут работать в паре и только в паре (т.е. изначально полная изолированность не закладывается), то разделять подобное приложение на модули, на мой взгляд, смысла нет.
    Ответ написан
    1 комментарий
  • Как защитить сайт от прямого перехода?

    @m-haritonov
    <!DOCTYPE html>
    <html>
    <head>
    	<meta http-equiv="content-type" content="text/html; charset=utf-8" />
    	<title></title>
    	<script type="text/javascript">
    		if (window.top === window)
    			window.top.location = 'http://vk.com/app123456';
    	</script>
    </head>
    <body>
    test
    </body>
    </html>
    Ответ написан
    1 комментарий
  • Таблицы many-to-many и админка?

    @m-haritonov
    Вместо <select multiple> можно использовать множество checkbox'ов:
    <form action="?" method="post">
    	<ul>
    		<li><label><input type="checkbox" name="goods[]" value="132"  /> Товар 1</label></li>
    		<li><label><input type="checkbox" name="goods[]" value="234"  /> Товар 2</label></li>
    		<li><label><input type="checkbox" name="goods[]" value="465"  /> Товар 3</label></li>
    	</ul>
    	
    	<button type="submit">Отправить</button>
    </form>
    
    <pre>
    <?php
    var_dump(@$_POST['goods']); // При выборе первых двух галочек будет содержать: array(132, 234)
    ?>
    </pre>
    Ответ написан
  • Как снизить нагрузку php скрипта?

    @m-haritonov
    <?php
    for ($i = 0; $i <= 100000000; $i++)
    {
    	// Данная задержка у меня на данном примере снижает
    	// загруженность процессора с показателя в 99.9% до 68%
    	if ($i % 50 == 0)
    		usleep(1);
    }
    Ответ написан
    Комментировать
  • Комбинация физической (реальной) кнопки и программы?

    @m-haritonov
    За обработку нажатий клавиш в Вашем случае отвечает JavaScript, а не PHP (т.к. именно JavaScript выполняется на компьютере клиента). Думаю, Вам стоит написать JavaScript обработчики, которые по нажатию определённых комбинаций клавиш клавиатуры (скажем, Ctrl+1 и Ctrl+2) выполняли бы требуемые действия (выбор варианта ответа и отправка формы). А две физические кнопки при нажатии просто посылали бы в браузер коды, соответствующие нажатию на клавиатуре Ctrl+1 и Ctrl+2.

    Пример JavaScript кода для обработки нажатий клавиш:
    <!DOCTYPE html>
    <html>
    	<head>
    		<script type="text/javascript">
    			document.addEventListener('keydown', function(e){
    				// Ctrl+1
    				if (e.ctrlKey && e.which === 49)
    				{
    					alert('Выбор следующего ответа');
    				}
    			});
    			
    			document.addEventListener('keydown', function(e){
    				// Ctrl+2
    				if (e.ctrlKey && e.which === 50)
    				{
    					alert('Отправка формы с выбранным ответом');
    				}
    			});
    		</script>
    	</head>
    	<body>
    	</body>
    </html>
    Ответ написан
    Комментировать
  • С помощью чего строится карта сайта в студии Лебедева?

    @m-haritonov
    Вообще, подобный вид диаграмм называется "диаграмма связей" или "интеллект карта" ("mind map"). Программ довольно много. О том, какую из программ используют в студии Лебедева, думаю, стоит спросить у них.
    Ответ написан
    Комментировать
  • Как вырасти из верстальщика в JS-программиста?

    @m-haritonov
    Думаю для этого Вам стоит изучить модель работы браузера и протокола HTTP, понять какое место в этой модели занимает JavaScript (а также HTML и CSS) и, собственно, изучить стандарт языка и окружение, в котором JavaScript работает в браузере (DOM и т.п.).

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

    В общем грубую модель работы HTTP и браузера можно описать нижеследующим образом.

    Один компьютер (сервер) посылает другому компьютеру (клиенту), в ответ на его запрос, набор данных (HTTP заголовки ответа и тело HTTP ответа: HTML, CSS, JavaScript код). Все эти данные могут быть сгенерированы динамически (например, с помощью PHP), но на работу браузера это не влияет (т.к. он получает лишь сгенерированный, статический набор данных).

    Далее клиент (браузер), получив набор данных от сервера, начинает последовательно просматривать эти данные (для того, чтобы вывести их пользователю на экран в графическом виде).

    Сначала он просматривает заголовки HTTP ответа, а затем приступает к просмотру и выводу тела HTTP ответа (в заголовках ответа содержится, в частности, указание на то, какие данные находятся в теле запроса и, соответственно, как их выводить).

    В случае, если тип данных будет "text/plain" (т.е. обычный текст), то браузер выведет его на экран как обычный текст (без всякого форматирования и анализа: не будет искать в нём HTML теги, не будет искать участки JavaScript кода и затем исполнять их и т.п.).

    В случае же, если тип данных будет "text/html" (т.е. HTML страница), то браузер не просто выведет на экран тело ответа и исходном виде, а будет искать в нём специальные символы, которые сами выводиться не будут, а будут изменять формат вывода связанного с ними текста.

    Например.

    Если браузер встречает в просматриваемом тексте HTML тег, то на экран будет выведен содержащийся в теге текст, выделенный в соответствии с договорённостью (между разработчиками браузера и разработчиками HTML страниц) о форме вывода данного тега.

    Если браузер встречает участок с CSS кодом (тег , например), то он переключается в режим разбора CSS кода и сохраняет результат разбора у себя в памяти, чтобы затем выделять текст во встречающихся тегах уже в соответствии с правилами, содержащимися в этом участке CSS кода.

    Если браузер встречает участок JavaScript кода, то он переключается в режим разбора JavaScript кода и действует уже в соответствии с новыми правилами (правилами разбора JavaScript, а не HTML кода). Например, если в JavaScript коде встречается инструкция, для вывода текста прямо сейчас ("document.write"), то на экран пользователя выведется результат выполнения этой инструкции. А, если встречается инструкция для объявления функции, то браузер прямо сейчас ничего на экран выводить не будет, а сохранит эту функцию для дальнейшего использования (например, эта функция может быть вызвана, когда произойдёт какое-либо событие).

    Т.е. браузер является бесконечно работающим процессом, который выводит что-то на экран пользователя (т.к. именно отобразить страницу пользователю является его целью) как при первой загрузке страницы так и при возникновении каких-либо событий уже после загрузки страницы (клик мыши, исполнение JavaScript кода, который содержался в функции, которая вызывалась при первой загрузке и продолжала бесконечно вызывать сама себя через определённый промежуток времени и т.п.).
    Ответ написан
    Комментировать
  • Кто-нибудь сталкивался с блокировкой от билайна? Как решили?

    @m-haritonov
    Суды общей юрисдикции обязаны публиковать вступившие в силу решения в интернете. Если не ошибаюсь, то вот Ваше дело на сайте Армавирского суда (ответчиком, как можно увидеть из краткой сводки, является «ИП А.Р., ООО „ИТ“, ООО „СИТИ-ТЕЛЕКОМ“», а истцом — прокурор). Только страница с решением не открывается, «Dynamic SQL Error». :( Попробуйте написать администратору их сайта, может починит оперативно. :)
    Ответ написан
    4 комментария
  • Идеальная структура файлов и каталогов для архива проектов

    @m-haritonov
    Абстрактной идеальной структуры не существует, т.к. структура зависит от различных критериев (смысловое содержание, заказчик, тип файла, время получения от заказчика и т.п.), которые в свою очередь зависят от рабочего процесса, который используется в группе разработчиков. На основе этих критериев файлы и организуются в структуру. Притом, список критериев не обязательно единый для всех файлов.

    Как хранить все? По проектам в папках, дальше по направлениям или по числам?

    Проведите аудит всех файлов, чтобы выявить список уже используемых и требуемых (но ещё не используемых) критериев. Затем, учитывая модель работы каждого из разработчиков и потребности пользователей выберите нужные критерии так, чтобы они не вызывали раздражения у разработчиков при заполнении, но и позволяли находить информацию с адекватной степенью точности (т.е. не стоит углубляться в детализацию структуры и заставлять разработчиков заполнять у каждого файла тучу критериев ради моментального поиска нужного файла, выполняемого раз в несколько месяцев, но и чтобы при поиске нужного файла пришлось просматривать вручную лишь ограниченный участок иерархии файлов).

    Для группы проектов можно использовать иерархию (например, в случае проектов одной крупной компании, объединённых общим стилем). В этом случае будьте готовы к тому, что структуру файлов придётся перестраивать в случае изменения структуры компании или при возникновении несоответствия создаваемых материалов структуре компании (чтобы этого избежать, можно сразу использовать в качестве названий подпроектов названия, отстранённые от конкретных названий фирм и более соответствующие структуре создаваемых материалов).

    Устаревшие файлы можно периодически складывать в папку «архив», которую создавать в той же папке, что и архивируемый файл (т.е. создавать свою папку «архив» в каждой из папок структуры файлов).

    Что делать если в одном проекте отдельно разрабатывали лого, отдельно спустя полгода сайт, а потом отдельно еще какие-то мелочи?

    Объединить все эти материалы в один проект с общим названием, в котором уже создать подпапки «сайт», «лого», «фирменный стить», «печатная продукция» и т.п. В качестве общего названия можно использовать название фирмы, домена и т.п., при необходимости добавляя к каждому названию префикс, используя написание с большой буквы и т.п. средства для указания на то, что название этой папки является названием проекта.

    Не пугайтесь, если объединение будет масштабным (однако задумайтесь над целесообразностью выбранного момента объединения, если итоговая структура ещё туманна или планируются дополнительные изменения).

    Как быть если одни и те же материалы используются в нескольких проектах?

    Поместить такие материалы в отдельный проект с «пространным» названием (например, «общее», «другое», «библиотека» и т.п.). Притом, такая папка с общими файлами не обязательно должна быть одна. В случае, если внутри одного проекта используется иерархия из подпроектов, то такие «пространные» папки могут быть на любом уровне.

    Пример структуры:

    общее/
    	архив/
    		резные узоры (03.09.2012).psd
    		резные узоры (12.03.2012).psd
    		резные узоры (10.11.2012).psd
    	резные узоры.psd
    ООО Пульс/
    	сайт/
    		главная страница.psd
    		внутренняя страница.psd
    	печатная продукция/
    		новогодняя акция 2013 (10x25).psd
    	фирменный стиль/
    		визитка.psd
    	материалы от заказчика/
    		11.02.2013/
    			фото директора.png
    		16.03.2013/
    			фото бухгалтера.png
    			фото администратора.png
    ОАО ТелеСистемы/
    	общее/
    		диалоговое окно.psd
    		всплывающая подсказка.psd
    	Ритейл/
    		сайт/
    		печатная продукция/
    
    	Интранет/
    		сайт/
    

    P.S.: в качестве названий папок, естественно, можете использовать и английские названия (archive, general, library и т.п.).
    P.P.S.: я рассматривал организацию материалов исключительно на основе файлов и директорий.
    Ответ написан
    5 комментариев
  • Гайд по именованию коммитов?

    @m-haritonov
    Как мне кажется, многое зависит от того, кто именно будет пользоваться комментариями (разработчики программы, пользователи и т.п.) и как именно, отчего и будет зависеть уровень абстрактности комментария и его содержание.

    Оптимальным, на мой взгляд, является написание комментария как краткого описания изменений с позиции собственного видения смысла вносимых изменений, руководствуясь при этом фактически произведёнными изменениями (т.е. не «улетать» слишком высоко в абстракции при описании изменений) и исходить из того, что комментарии предназначены для разработчиков. Если исправляется орфографическая ошибка, то в комментарии следует указать, что «исправлена орфографическая ошибка», если изменены несколько участков кода ради общей логики, то следует описать что именно за логика подразумевается (т.е. дать именно описание общей, абстрактной логики, а не перечислять изменённые методы, классы и т.п.).

    В случае Вашего примера, думаю, следовало написать что-то вроде «Убран лишний вызов функции getCharset в CurlResult::fetch» (чтобы были ясны Ваши намерения; Вы же убрали вызов так как он лишний (о чём потом даже написали в своём посте — «просто лишний раз дергал метод»), а не ради исправления какой-то ошибки).

    Что касается использования в комментарии названий сущностей из программного кода (имён методов, классов, пространств имён и т.п.), которые были изменены, то, на мой взгляд, следует пытаться находить баланс между желанием конкретизировать область изменений и размером комментария (т.е. я за присутствие в комментарии указания на область изменений, просто конкретизация будет варьироваться от названия конкретных сущностей из программного кода до обобщённых названий). Так, например, вместо комментария «добавлена поддержка рекурсивного удаления файлов» я бы предпочёл комментарий «добавлена поддержка рекурсивного удаления файлов в функции removeDirectory»), а вместо комментария «добавлена поддержка событий в классах Plugin1, Plugin2, Plugin3» предпочёл бы «добавлена поддержка событий в плагинах».

    Ещё можно попробовать настроить программу просмотра таким образом, чтобы она в начале комментария выводила общий для всех изменённых файлов путь (поможет, если в программе соблюдается соответствие между именем файла и программной сущности, содержащейся в нём).
    Ответ написан
    Комментировать
  • Как узнать текст выражения, на котором eval() закончился с фатальной ошибкой?

    @m-haritonov
    Можете попробовать использовать PECL расширение runkit, если есть возможность его установки на сервер. В частности, runkit предоставляет класс Runkit_Sandbox, предоставляющий возможность запуска кода в изолированных условиях (в отдельно выделенной области памяти). См. метод Runkit_Sandbox::eval() в примерах в документации к классу. Также в runkit есть метод runkit_lint — аналог системного вызова «php -l file», но принимающий в качестве аргумента строку с кодом, а не путь к файлу.
    Ответ написан
    Комментировать
  • Вырезать битые символы из юникод XML

    @m-haritonov
    … сообщение удалено (написал не в ту ветку)...
    Ответ написан
    Комментировать