<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Elsper &#187; софт</title>
	<atom:link href="http://elsper.ru/category/soft/feed/" rel="self" type="application/rss+xml" />
	<link>http://elsper.ru</link>
	<description>Заработок в интернете, форекс, психология и просто мысли.</description>
	<lastBuildDate>Tue, 01 May 2012 14:32:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Программа поиска релевантных записей в гугле.</title>
		<link>http://elsper.ru/2012/02/programma-poiska-relevantnyx-zapisej-v-gugle/</link>
		<comments>http://elsper.ru/2012/02/programma-poiska-relevantnyx-zapisej-v-gugle/#comments</comments>
		<pubDate>Mon, 27 Feb 2012 20:13:45 +0000</pubDate>
		<dc:creator>Elsper</dc:creator>
				<category><![CDATA[софт]]></category>
		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://elsper.ru/?p=1512</guid>
		<description><![CDATA[Берясь за продвижение сайта бывает полезно оценить, какие страницы сами поисковики считают соответствующими данному запросу и следовательно или двигать эти страницы, или прикладывать усилия для смены целевой страницы. В этой записи я расскажу как определить какие страницы наиболее релевантны определенным запросам. (По мнению гугла) Все просто. В Google есть возможность поиска по сайту. И та [...]]]></description>
			<content:encoded><![CDATA[<p>Берясь за продвижение сайта бывает полезно оценить, какие страницы сами поисковики считают соответствующими данному запросу и следовательно или двигать эти страницы, или прикладывать усилия для смены целевой страницы.</p>
<p>В этой записи я расскажу <strong>как определить какие страницы наиболее релевантны определенным запросам</strong>. (По мнению гугла)</p>
<p><span id="more-1512"></span>Все просто.</p>
<p>В Google есть возможность поиска по сайту. И та страница которая будет иметь наивысшую позицию по запросу и будет считаться самой релевантной.<br />
Для этого в поисковой строке гугла надо ввести &#171;site:домен запрос&#187;.</p>
<p>Ок. Один, два, пять, десять запросов мы проверим&#8230; Но если их двадцать? пятьдесят? сто?<br />
Все вручную?<br />
Вот и я решил проверить запросы одному сайту, а там их 191.. проверил 9 запросов вручную и решил, что легче немного по программировать.<br />
И вот что вышло:<br />
<a href="http://elsper.ru/wp-content/uploads/2012/02/relevator1.jpg"><br />
<img class="aligncenter size-medium wp-image-1515" title="relevator" src="http://elsper.ru/wp-content/uploads/2012/02/relevator1.jpg" alt="" width="600" height="308" /></a></p>
<p>Как ей пользоваться?<br />
1) Указываете домен. Без http://<br />
2) Копируете список ключей. Каждый с новой строки.<br />
3) Нажимаете кнопку &#171;Старт&#187;<br />
4) В файле итог.txt, генерируемом в корне программы, будет список готовых ссылок в формате html</p>
<p>Кроме того есть кнопка &#171;Стоп&#187;, может быть полезной если гугл перестал отдавать данные (Процесс возобновляется кнопкой Старт без каких-либо проблем)<br />
И кнопка &#171;Reset&#187;, позволяющая сбросить все настройки будто прогу только запустили. Удобно если проверять не все ключи, а пачками. Проверил 50, скопировал результат (а то он будет утерян), нажал &#171;reset&#187; и проверяешь следующие.</p>
<p>Прога делает запросы в Google и анализирует три возможных ответа:<br />
Если что-то найдено, то выводит ссылку.<br />
Если ничего не найдено, то пишет &#171;ничего не найдено&#187;.<br />
Если во время работы возникла ошибка, то пишет какой ключ не смогли проверить и пытается еще раз.</p>
<p>Скачать можно по адресу: elsper.ru/relevator.zip<br />
<span style="color: #888888;">Это совершенно некоммерческий скрипт сделанный за один вечер, так что распространяется &#171;как есть&#187; и не гарантируется работоспособность если в гугле что-то поменяется.</span></p>
<p>Если прога вам понравилась, пригодилась, или вы просто хороший человек, то пожалуйста сделайте ретвит, или поставьте на меня ссылочку ))</p>
<p>UPD. Подумал вот. Если будет положительная социальная реакция, то у меня будет вполне ощутимый стимул улучшить ее. Ведь одно дело писать для себя, когда можешь в любой момент влезть в код и что-то поменять, и совсем другое дело когда твой труд востребован десятками других людей.<br />
__<br />
Модификации:<br />
1) Улучшил работу с кодировкой.</p>
<Br>Автор: <a href="http://elsper.ru">Elsper.ru</a> <Br> <br><br>]]></content:encoded>
			<wfw:commentRss>http://elsper.ru/2012/02/programma-poiska-relevantnyx-zapisej-v-gugle/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Скопировать все файлы из дерева в одну папку.</title>
		<link>http://elsper.ru/2011/08/skopirovat-vse-fajly-iz-dereva-v-odnu-papku/</link>
		<comments>http://elsper.ru/2011/08/skopirovat-vse-fajly-iz-dereva-v-odnu-papku/#comments</comments>
		<pubDate>Sun, 28 Aug 2011 17:53:48 +0000</pubDate>
		<dc:creator>Elsper</dc:creator>
				<category><![CDATA[софт]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Скрипты]]></category>

		<guid isPermaLink="false">http://elsper.ru/?p=1357</guid>
		<description><![CDATA[Возникла тут у меня задача обработать 103943 файла расположенных в 2618 папках. И хотя у меня есть процедура для того чтобы получить список всех файлов задача требует чтобы все файлы были в одной папке. Ну раз требует, то сделаем. За основу взял ту же процедуру, что выложил по ссылке выше. Подумав немного получил на выходе: [...]]]></description>
			<content:encoded><![CDATA[<p>Возникла тут у меня задача обработать <span style="color: #003300;">103943</span> файла расположенных в <span style="color: #003300;">2618</span> папках.</p>
<p>И хотя у меня есть <a href="http://elsper.ru/2010/01/delphi-poluchenie-spiska-vsex-fajlov-v-papke-i-ee-podpapkax/">процедура для того чтобы получить список всех файлов</a> задача требует чтобы все файлы были в одной папке.</p>
<p>Ну раз требует, то сделаем. За основу взял ту же процедуру, что выложил по ссылке выше.<br />
Подумав немного получил на выходе:</p>
<p><span id="more-1357"></span><span style="color: #008000;">procedure AllFiles2one( Path,path2: string );</span><br />
<span style="color: #008000;">var</span><br />
<span style="color: #008000;">sRec: TSearchRec;</span><br />
<span style="color: #008000;">isFound: boolean;</span><br />
<span style="color: #008000;">begin</span><br />
<span style="color: #008000;">try</span><br />
<span style="color: #008000;">mkdir(path2); // создаем папку куда все это копируем.</span><br />
<span style="color: #008000;">except</span><br />
<span style="color: #008000;">end;</span><br />
<span style="color: #008000;">isFound := FindFirst( Path + &#8216;\*.*&#8217;, faAnyFile, sRec ) = 0;</span><br />
<span style="color: #008000;">while isFound do</span><br />
<span style="color: #008000;">begin</span><br />
<span style="color: #008000;">if ( sRec.Name &lt;&gt; &#8216;.&#8217; ) and ( sRec.Name &lt;&gt; &#8216;..&#8217; ) then</span><br />
<span style="color: #008000;">begin</span><br />
<span style="color: #008000;">if ( sRec.Attr and faDirectory ) = faDirectory then</span><br />
<span style="color: #008000;">AllFiles2one( Path + &#8216;\&#8217; + sRec.Name, path2) else</span></p>
<p><span style="color: #008000;">begin</span><br />
<span style="color: #008000;">//form1.Caption:=Path + &#8216;\&#8217; + sRec.Name;    // раскомментируйте для того чтобы можно было следить за процессом выполнения. Хотя следить можно просто мониторя вес итоговой папки и сравнивая с начальной.</span><br />
<span style="color: #008000;">CopyFile(Pchar( Path + &#8216;\&#8217; + sRec.Name ), Pchar( Path2 + &#8216;\&#8217; + StringReplace( StringReplace(Path,&#8217;:\&#8217;,'_&#8217;,[]) + &#8216;_&#8217; + sRec.Name,&#8217;\',&#8217;_',[rfReplaceAll] )),true);</span><br />
<span style="color: #008000;">end;</span></p>
<p><span style="color: #008000;">end;</span><br />
<span style="color: #008000;">Application.ProcessMessages;</span><br />
<span style="color: #008000;">isFound := FindNext( sRec ) = 0;</span><br />
<span style="color: #008000;">end;</span><br />
<span style="color: #008000;">FindClose( sRec );</span><br />
<span style="color: #008000;">end;</span></p>
<p>Сначала хотел обрезать путь до файла и так и копировать, но понял что туплю, потому что некоторые файлы могут иметь одно имя, и поэтому в процедуре каждый выходной файл имеет адрес своего пути. Переименовать их в обычные числа вы сможете <a href="http://elsper.ru/2010/11/programma-dlya-izmeneniya-razmera-fotok/">вот этой моей прогой</a>.</p>
<p>Процедура принимает входные данные:</p>
<p>Path &#8212; главный адрес с которого начать читать дерево.</p>
<p>Path2 &#8212; папка куда копировать.</p>
<p>!!ВНИМАНИЕ. ПРОЦЕДУРА <strong>КОПИРУЕТ </strong>ФАЙЛЫ, СЛЕДОВАТЕЛЬНО УЧИТЫВАЙТЕ ЭТО ОБРАБАТЫВАЯ БОЛЬШИЕ КАТАЛОГИ!!</p>
<Br>Автор: <a href="http://elsper.ru">Elsper.ru</a> <Br> <br><br>]]></content:encoded>
			<wfw:commentRss>http://elsper.ru/2011/08/skopirovat-vse-fajly-iz-dereva-v-odnu-papku/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Работа с JPG в Delphi (библиотека GDI+)</title>
		<link>http://elsper.ru/2011/08/rabota-s-jpg-v-delphi-biblioteka-gdi/</link>
		<comments>http://elsper.ru/2011/08/rabota-s-jpg-v-delphi-biblioteka-gdi/#comments</comments>
		<pubDate>Thu, 04 Aug 2011 10:53:59 +0000</pubDate>
		<dc:creator>Elsper</dc:creator>
				<category><![CDATA[Прочее]]></category>
		<category><![CDATA[софт]]></category>
		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://elsper.ru/?p=1307</guid>
		<description><![CDATA[Решил я тут поковыряться в своих прогах, а они отказываются компилиться из за отсутсвия модулей GDIPAPI, GDIPOBJ и GDIPUTIL. Дело в том, что в последних версиях я юзал библиотеку GDI+, которая не установлена ни на одном из обоих ноутов. Ну установил конечно, а вместе с тем решил, что можно ею поделиться с народом. Все же [...]]]></description>
			<content:encoded><![CDATA[<p>Решил я тут поковыряться в своих прогах, а они отказываются компилиться из за отсутсвия модулей <em>GDIPAPI, GDIPOBJ и GDIPUTIL</em>. Дело в том, что в последних версиях я юзал библиотеку GDI+, которая не установлена ни на одном из обоих ноутов.<br />
Ну установил конечно, а вместе с тем решил, что можно ею поделиться с народом.</p>
<p>Все же представляемая по умолчанию работа только с bmp (в делфи 7) явно устарела.</p>
<p>С самого начала выложу библиотеку. <a href="http://elsper.ru/wp-content/D_gdiplus.rar">Скачивайте</a></p>
<p>А теперь пара примеров работы с ней</p>
<p><span id="more-1307"></span>Сразу скажу, чтобы каждый раз не повторяться. В список модулей (uses) приписывайте три модуля GDIPAPI, GDIPOBJ, GDIPUTIL</p>
<p><span style="text-decoration: underline;">Первый пример.</span></p>
<p><em>Самое простое. Преобразование туда и обратно.</em></p>
<p><strong>Преобразование из bmp в jpg</strong></p>
<p><span style="color: #339966;">var</span><br />
<span style="color: #339966;"> encoderClsid: TGUID;</span><br />
<span style="color: #339966;"> Image: TGPImage;</span></p>
<p><span style="color: #339966;">begin</span><br />
<span style="color: #339966;"> Image := TGPImage.Create(&#8216;file.bmp&#8217;);</span><br />
<span style="color: #339966;"> GetEncoderClsid(&#8216;image/jpeg&#8217;, encoderClsid);</span><br />
<span style="color: #339966;"> image.Save(&#8216;file.jpg&#8217;, encoderClsid, nil);</span><br />
<span style="color: #339966;"> image.Free;</span><br />
<span style="color: #339966;"> end.</span></p>
<p><strong>Преобразование из jpg в bmp</strong></p>
<p><span style="color: #339966;">var</span><br />
<span style="color: #339966;"> encoderClsid: TGUID;</span><br />
<span style="color: #339966;"> Image: TGPImage;</span></p>
<p><span style="color: #339966;">begin</span><br />
<span style="color: #339966;"> Image := TGPImage.Create(&#8216;file.jpg&#8217;);</span><br />
<span style="color: #339966;"> GetEncoderClsid(&#8216;image/bmp&#8217;, encoderClsid);</span><br />
<span style="color: #339966;"> image.Save(&#8216;file.bmp&#8217;, encoderClsid, nil);</span><br />
<span style="color: #339966;"> image.Free;</span><br />
<span style="color: #339966;"> end.</span></p>
<p><span style="text-decoration: underline;">Второй пример.</span></p>
<p><em> </em><em>Именно в таком виде я и юзаю эту библиотеку, поэтому большей частью это будет копипаст с моего доргенчика. Хотя и с изменениями. Так что если будут ошибки пишите.<br />
</em></p>
<p><strong>Изменение размера jpg файла с помощью Delphi.</strong></p>
<p><span style="color: #339966;">var</span><br />
<span style="color: #339966;"> in_img, out_img: TGPImage;</span><br />
<span style="color: #339966;"> g: TGPGraphics;</span><br />
<span style="color: #339966;"> out_width, out_height, cou: Integer;</span><br />
<span style="color: #339966;"> sclx:extended;</span><br />
<span style="color: #339966;"> fname:string;</span><br />
<span style="color: #339966;"> encoderClsid: TGUID;</span></p>
<p><span style="color: #339966;">begin</span><br />
<span style="color: #339966;"> try</span><br />
<span style="color: #339966;"> fname:=&#8217;file.jpg&#8217;</span><br />
<span style="color: #339966;"> out_width :=150;</span><br />
<span style="color: #339966;"> out_height :=150;</span><br />
<span style="color: #339966;"> in_img := TGPImage.Create(fname);</span><br />
<span style="color: #339966;"> sclx:=out_width/in_img.GetWidth;</span></p>
<p><span style="color: #339966;">if sclx &lt; 1 then</span><br />
<span style="color: #339966;"> begin</span><br />
<span style="color: #339966;"> out_height :=round(in_img.GetHeight*sclx);</span><br />
<span style="color: #339966;"> out_img :=TGPBitmap.Create(out_width,out_height);</span><br />
<span style="color: #339966;"> g := TGPGraphics.Create(out_img);</span></p>
<p><span style="color: #339966;">if  in_img.GetWidth &gt; in_img.getheight then</span><br />
<span style="color: #339966;"> begin</span><br />
<span style="color: #339966;"> g.DrawImage(in_img, MakeRect(0, 0, out_width, out_height),</span><br />
<span style="color: #339966;"> (in_img.GetWidth-in_img.getheight) div 2, 0, in_img.getheight, in_img.GetHeight, UnitPixel);</span><br />
<span style="color: #339966;"> end  else</span><br />
<span style="color: #339966;"> g.DrawImage(in_img, MakeRect(0, 0, out_width, out_height),</span><br />
<span style="color: #339966;"> 0, (in_img.getheight-in_img.GetWidth) div 2,  in_img.GetWidth, in_img.GetWidth, UnitPixel);</span><br />
<span style="color: #339966;"> g.Destroy;</span><br />
<span style="color: #339966;"> in_img.Free;</span><br />
<span style="color: #339966;"> GetEncoderClsid(&#8216;image/jpeg&#8217;, encoderClsid);</span><br />
<span style="color: #339966;"> out_img.Save(fname, encoderClsid);</span><br />
<span style="color: #339966;"> out_img.free;</span><br />
<span style="color: #339966;"> end;</span></p>
<p><span style="color: #339966;">except end;</span><br />
<span style="color: #339966;"> end.</span></p>
<p>На самом деле этот код не просто изменяет размер, он сохраняет пропорции подгоняя картинку в квадратные рамки 150 на 150 и обрезая лишнее, если какая-то сторона длиннее другой. При чем обрезка идет не с одного конца, а пополам с выступающих краев.</p>
<p>__<br />
Для простого масштабирования нужно рассчитать размеры выходного файла и вместо</p>
<p><span style="color: #339966;">if  in_img.GetWidth &gt; in_img.getheight then</span><br />
<span style="color: #339966;"> begin</span><br />
<span style="color: #339966;"> g.DrawImage(in_img, MakeRect(0, 0, out_width, out_height), (in_img.GetWidth-in_img.getheight) div 2, 0, in_img.getheight, in_img.GetHeight, UnitPixel);</span><br />
<span style="color: #339966;"> end  else</span><br />
<span style="color: #339966;"> g.DrawImage(in_img, MakeRect(0, 0, out_width, out_height), 0, (in_img.getheight-in_img.GetWidth) div 2,  in_img.GetWidth, in_img.GetWidth, UnitPixel);</span></p>
<p>будет достаточно</p>
<p><span style="color: #339966;">g.DrawImage(in_img, MakeRect(0, 0, out_width, out_height), 0, 0, in_img.GetWidth, in_img.GetHeight, UnitPixel);</span></p>
<p>__<br />
Вопросы? Задавай. =)</p>
<Br>Автор: <a href="http://elsper.ru">Elsper.ru</a> <Br> <br><br>]]></content:encoded>
			<wfw:commentRss>http://elsper.ru/2011/08/rabota-s-jpg-v-delphi-biblioteka-gdi/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Скрытая загрузка картинок на PHP</title>
		<link>http://elsper.ru/2011/02/skrytaya-zagruzka-kartinok-na-php/</link>
		<comments>http://elsper.ru/2011/02/skrytaya-zagruzka-kartinok-na-php/#comments</comments>
		<pubDate>Thu, 10 Feb 2011 07:19:07 +0000</pubDate>
		<dc:creator>Elsper</dc:creator>
				<category><![CDATA[софт]]></category>
		<category><![CDATA[Дорвеи]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Скрипты]]></category>

		<guid isPermaLink="false">http://elsper.ru/?p=877</guid>
		<description><![CDATA[Представляю вашему вниманию один очень простой код, который тем не менее открывает не хилые перспективы в использовании картинок в дорвеестроении. &#60;? {$fp = fopen($_SERVER['DOCUMENT_ROOT'].&#8217;/img.php&#8217;, &#8216;w+&#8217;); fwrite($fp, &#8216;&#60;? header(&#171;Content-type: image/gif&#187;);  readfile ($_SERVER["DOCUMENT_ROOT"].&#187;/fotka/1.jpeg&#187;); ?&#62;&#8217;); fclose($fp);} echo  (&#8216;&#60;img src=img.php&#62;&#8217;); ?&#62; Чем этот код так замечателен? 1) Вместо img.php вы можете подсунуть ключ. 2) Вместо $_SERVER["DOCUMENT_ROOT"].&#187;/fotka/1.jpeg&#187; вы можете подставить [...]]]></description>
			<content:encoded><![CDATA[<p>Представляю вашему вниманию один очень простой код, который тем не менее открывает не хилые перспективы в использовании картинок в дорвеестроении.</p>
<p><span style="color: #003300;">&lt;?<br />
{$fp = fopen($_SERVER['DOCUMENT_ROOT'].&#8217;/img.php&#8217;, &#8216;w+&#8217;);<br />
fwrite($fp, &#8216;&lt;? header(&#171;Content-type: image/gif&#187;);  readfile ($_SERVER["DOCUMENT_ROOT"].&#187;/fotka/1.jpeg&#187;); ?&gt;&#8217;);<br />
fclose($fp);}</span></p>
<p><span style="color: #003300;">echo  (&#8216;&lt;img src=img.php&gt;&#8217;);</span></p>
<p><span style="color: #003300;">?&gt;</span></p>
<p>Чем этот код так замечателен?<span id="more-877"></span><br />
1) Вместо img.php вы можете подсунуть ключ.</p>
<p>2) Вместо $_SERVER["DOCUMENT_ROOT"].&#187;/fotka/1.jpeg&#187; вы можете подставить любой путь. Тоесть это может быть путь на сервере как в примере, а может и урл с другого сайта. То есть вам даже хранить файлы не придется.</p>
<p>Но это не все. Подумав еще немного я пришел к такой мысли.<br />
Добавим в .htaccess строчку:</p>
<p><span style="color: #003300;">AddType application/x-httpd-php .jpeg</span></p>
<p>А основной текст исправим на</p>
<p><span style="color: #003300;">&lt;?<br />
{$fp = fopen($_SERVER['DOCUMENT_ROOT'].&#8217;/img.jpeg&#8217;, &#8216;w+&#8217;);<br />
fwrite($fp, &#8216;&lt;? header(&#171;Content-type: image/gif&#187;);  readfile ($_SERVER["DOCUMENT_ROOT"].&#187;/fotka/1.jpeg&#187;); ?&gt;&#8217;);<br />
fclose($fp);}</span></p>
<p><span style="color: #003300;">echo  (&#8216;&lt;img src=img.jpeg&gt;&#8217;);</span></p>
<p><span style="color: #003300;">?&gt;</span></p>
<p>Чувствуете разницу?</p>
<p>Теперь комар носу не подточит! Браузер запрашивает картинку, браузер получает картинку! <img src='http://elsper.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Тоесть этот код позволяет сделать полноценное переименовывание &#171;на лету&#187;. Если у вас картинки имеют имена 1.jpeg, 2.jpeg и т.д., то вы сможете их отдавать как ключ1.jpeg, ключ2.jpeg. Или как в примере при запросе img.jpeg отдает /fotka/1.jpeg</p>
<p>Сюда можно еще прикрутить проверку наличия, чтобы код не выполнять заново каждый раз и не пытался создать уже созданный файл. Надо просто приписать одну строку перед началом кода</p>
<p><span style="color: #003300;">if ( !file_exists($_SERVER['DOCUMENT_ROOT'].&#8217;/wp-content/plugins/elsperpostovoy/plagin_e_postovie.php&#8217;))</span></p>
<p>но это уже детали</p>
<p>__</p>
<p>Офтоп:<br />
Красноярцы, почувствовали землетрясение?<br />
3 бала полтора часа назад было.</p>
<p>____</p>
<p>UPD.</p>
<p>В комментах возникло обсуждение и <a href="http://mrmozg.ru/">Мегамозг</a> предложил отличный вариант. Исправив, мелкие ошибки, выкладываю его тут:</p>
<p>В .htaccess пишем строку</p>
<p><span style="color: #003300;">RewriteRule ^([0-9]+)(.*).jpeg$ /ff.php?im=$1 [L]</span></p>
<p>Если файла до этого момента не было, то не забудьте первым делом написать строку</p>
<p><span style="color: #003300;">RewriteEngine On</span></p>
<p>Далее, в файле ff.php пишем</p>
<p><span style="color: #003300;">&lt;?php<br />
header(&#171;Content-type: image/gif&#187;);<br />
readfile($_SERVER["DOCUMENT_ROOT"].&#8217;/foto/&#8217;.(int)$_GET["im"].&#8217;.jpg&#8217;);<br />
?&gt;</span></p>
<p>Где, &#171;/foto/&#187; это папка с пронумерованными картинками типа .jpg, при желании конечно можно поменять и папку и тип, и сам файл вместо ff.php назвать иначе.</p>
<p>После этих простых действий вы сможете обращаться к файлу по адресу:</p>
<p>сайт.ру/номер файла/транслитирированный ключ.jpeg</p>
<p>Выгода очевидна. Роботы видят что файл называется &#171;транслитирированный ключ.jpeg&#187;, а сервер подсовывает вместо этого файл &#171;адрес на сервере/foto/номер файла.jpg&#187;</p>
<p>Разумеется эти ухищрения имеют смысл, если вам или просто лень заранее переименовывать все файлы, или же если на одном сервере пачка доров и они юзают одну и ту же пачку картинок. Правда в этом случае всеравно придется прикручивать файл соответствий, но думаю это уже не вызовет проблем. Если вызовет, спрашивайте, все объясню.</p>
<Br>Автор: <a href="http://elsper.ru">Elsper.ru</a> <Br> <br><br>]]></content:encoded>
			<wfw:commentRss>http://elsper.ru/2011/02/skrytaya-zagruzka-kartinok-na-php/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Процедура чтобы грабить.</title>
		<link>http://elsper.ru/2011/01/procedura-chtoby-grabit/</link>
		<comments>http://elsper.ru/2011/01/procedura-chtoby-grabit/#comments</comments>
		<pubDate>Sat, 15 Jan 2011 21:18:37 +0000</pubDate>
		<dc:creator>Elsper</dc:creator>
				<category><![CDATA[софт]]></category>
		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://elsper.ru/?p=849</guid>
		<description><![CDATA[Я уже писал ранее как очень легко можно скачать баш. Зачем тогда нужно еще что-то, если тот код работает? Дело в том что иногда страницы не загружаются, сервак там затупит или еще что-то печальное. И парсер виснет, ну или в лучшем случае переходит на следующий адрес. Вот и я с такой проблемой столкнулся. Можно было [...]]]></description>
			<content:encoded><![CDATA[<p>Я уже писал ранее как очень легко можно <a href="http://elsper.ru/2010/07/sparsil-bash/">скачать баш.</a></p>
<p>Зачем тогда нужно еще что-то, если тот код работает?</p>
<p>Дело в том что иногда страницы не загружаются, сервак там затупит или еще что-то печальное. И парсер виснет, ну или в лучшем случае переходит на следующий адрес. Вот и я с такой проблемой столкнулся. Можно было конечно удовлетвориться и тем что скачал, но&#8230;</p>
<p>Я написал полноценную процедуру, которую можно использовать почти &#171;как есть&#187;. Лишь подкорректировав урл и номера страниц. Минус программы в том, что она парсит урлы по шаблону</p>
<p>адрес_сайта_всякие_параметры=1<br />
адрес_сайта_всякие_параметры=2</p>
<p>К счастью основная часть динамических сайтов имеет именно такую структуру, и даже вордпресс со включенным ЧПУ можно парсить по &#171;сайт.рф/?p=номер&#187; (Но там есть свои сложности)</p>
<p>Короче код:</p>
<p><span style="color: #003300;">procedure pars;<br />
var i:integer;<br />
idhttppars:Tidhttp;<br />
spisok,textik:TStringList;<br />
begin</span></p>
<p><span style="color: #003300;">// инициализация<br />
</span></p>
<p><span style="color: #003300;"> textik:= TStringList.Create;<br />
spisok:= TStringList.Create;<br />
idhttp</span><span style="color: #003300;">pars</span><span style="color: #003300;">:=tidhttp.Create(nil);<br />
idhttp</span><span style="color: #003300;">pars</span><span style="color: #003300;">.HandleRedirects:=True;<br />
idhttp</span><span style="color: #003300;">pars</span><span style="color: #003300;">.ReadTimeout := 3000;</span></p>
<p><span style="color: #003300;">if FileExists(&#8216;papka/&#8217;)= false then // Задаем название папки куда будем сохранять скачанные страницы<br />
mkdir(&#8216;papka&#8217;);</span></p>
<p><span style="color: #003300;">for i:=1 to 1000 do // здесь задаем циферки<br />
begin<br />
spisok.Append(inttostr(i));<br />
end;<br />
</span></p>
<p><span style="color: #003300;">// конец инициализайции.</span></p>
<p><span style="color: #003300;">i:=-1;<br />
while i &lt;  spisok.Count-1  do<br />
begin<br />
i:=i+1;<br />
//form1.button1.Caption:= inttostr(i)+&#8217;/'+inttostr(spisok.Count-1); // Это индикатор выполнения. Если хотите подставьте вместо батон1, что нибудь другое и раскомментируйте строку.<br />
application.ProcessMessages;<br />
if FileExists(&#8216;papka/&#8217;+spisok[i]) then<br />
begin<br />
spisok.Delete(i);<br />
i:=i-1;<br />
end<br />
else<br />
begin<br />
try</span></p>
<p><span style="color: #003300;">textik.Text:=idhttppars.Get(&#8216;урл=&#8217;+spisok[i]); // Здесь конструируем адрес страницы<br />
textik.SaveToFile(&#8216;papka/&#8217;+spisok[i]);<br />
except   end;<br />
end;<br />
end;<br />
idhttppars.Free ;<br />
textik.Free;<br />
i:=spisok.Count-1;<br />
//form1.Memo1.Lines:=spisok;  // это один из инструментов отладки и наблюдения за работой процедуры можно удалить, можно наблюдать.<br />
spisok.Free;</span></p>
<p><span style="color: #003300;">if i &lt; 1 then application.Terminate else pars; // в конце парсинга процедура вызывает закрытие проги, если вы этого не хотите, то удалите  вызов application.Terminate</span></p>
<p><span style="color: #003300;">end;</span></p>
<p>Не забудьте добавить в uses модуль IdHTTP, если его там еще нет.</p>
<p>Конечно можно упростить например вынести инициализацию и освобождение в отдельные части, но тогда это удобнее всего делать в классе формы. То есть переменные описать там где описываются общие переменные формы, инициализацию и первичное заполнение массива ( я их даже обозначил для вашего удобства) можно в tform1.FormCreate засунуть. А саму процедуру вызывать например с кнопки и в ней написать:</p>
<p><span style="color: #003300;">pars;<br />
idhttppars.Free ;<br />
textik.Free;<br />
spisok.Free;</span></p>
<p>Соответственно убрав эти три строки из тела процедуры. Но мне захотелость сделать именно в виде автономной процедуры <img src='http://elsper.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<Br>Автор: <a href="http://elsper.ru">Elsper.ru</a> <Br> <br><br>]]></content:encoded>
			<wfw:commentRss>http://elsper.ru/2011/01/procedura-chtoby-grabit/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

