<?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>Code.ge Blog &#187; Apache</title>
	<atom:link href="http://www.code.ge/posts/tag/apache/feed" rel="self" type="application/rss+xml" />
	<link>http://www.code.ge</link>
	<description>ბლოგი ვებ პროგრამირებისა და ტექნოლოგიების შესახებ</description>
	<lastBuildDate>Mon, 03 May 2010 14:38:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Ant, Rhino, YUICompressor &amp; JS Packer</title>
		<link>http://www.code.ge/posts/ant-rhino-yuicompressor-js-packer</link>
		<comments>http://www.code.ge/posts/ant-rhino-yuicompressor-js-packer#comments</comments>
		<pubDate>Mon, 22 Dec 2008 07:06:33 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[Ant]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.code.ge/?p=155</guid>
		<description><![CDATA[დაახლოვებით ერთი წლის წინ ზედაპირულად შევეხე JavaScript ფაილების კომპრესიას. ძველი პოსტის მიხედვით თუ ვიმსჯელებთ არცთუ ისე ცუდი შედეგია. თუმცა რამდენიმე დეტალი მაინც საჭიროებს გადახედვას, კერძოდ კი: JavaScript ფაილების კომპრესიის პროცესი არ არის ავტომატიზებული; ფაილების კომპრესია მთლიანად ეყრდნობა დენ ედვარდსის ე.წ Packer &#8211; ს რომელიც გარკვეულ მიზეზთა გამო საკმაოდ მოუხერხებელია; პირველ რიგში სანამ გადავალთ უშუალოდ ფაილების [...]]]></description>
			<content:encoded><![CDATA[<p>დაახლოვებით ერთი წლის წინ ზედაპირულად შევეხე JavaScript ფაილების კომპრესიას. <a href="http://www.code.ge/apache/mod_deflate-js-css-file-compression">ძველი პოსტის</a> მიხედვით თუ ვიმსჯელებთ არცთუ ისე ცუდი შედეგია. თუმცა რამდენიმე დეტალი მაინც საჭიროებს გადახედვას, კერძოდ კი:</p>
<ul>
<li>JavaScript ფაილების კომპრესიის პროცესი არ არის ავტომატიზებული;</li>
<li>ფაილების კომპრესია მთლიანად ეყრდნობა დენ ედვარდსის ე.წ Packer &#8211; ს რომელიც გარკვეულ მიზეზთა გამო საკმაოდ მოუხერხებელია;</li>
</ul>
<p>პირველ რიგში სანამ გადავალთ უშუალოდ ფაილების კომპრესიის ავტომატიზაციის პროცედურაზე საჭიროა საბოლოო ამოცანის სრულად ჩამოყალიბება.</p>
<p><strong>მიზანი</strong></p>
<ul>
<li>JavaScript ფაილების გაერთიანება და ერთი საბოლოო ფაილის მიღება;</li>
<li>გაერთიანების შედეგად მიღებული ფაილის მინიფიკაცია და ობფუსკაცია;</li>
<li>მინიფიცირებული ფაილის ზომაში კიდევ უფრო მეტად შემცირება base62 კოდირებით;</li>
<li>საბოლოო ფაილის gzip კომპრესია;</li>
</ul>
<p><span id="more-155"></span><br />
პირველ რიგში მანამდე სანამ შევუდგებით JavaScript ფაილების კომპრესიის პროცესს მოვამზადოთ შესაბამისი გარემო, პირველ რიგში თქვენთვის მოსახერხებელ მისამართზე შექმენით კატალოგების შემდეგი სტრუქტურა:</p>
<pre>
project
    tools
    src
    build
</pre>
<p>ჩამოთვლილი პუნქტების რეალიზაციისათვის პოსტის სათაურში ნახსენები უტილიტებს გამოვიყენებთ.</p>
<p>უფრო კონკრეტულად კი მიზნის მისაღწევად დაგვჭირდება:</p>
<ul>
<li><a href="http://ant.apache.org/">Apache Ant</a> &#8211; თუ გიყენიათ JDK მას დამატებითი ინსტალაცია არ ესაჭიროება;</li>
<li>მოზილას <a href="http://www.mozilla.org/rhino/">Rhino &#8211; JavaScript for Java</a>, JavaScript კოდის შესასრულებლად. გადმოწერეთ ბოლო ვერსია გახსენით არქივი და დააკოპირეთ js.jar ფაილი /project/tools კატალოგში;</li>
<li>ჟულიენ ლეკომტეს მიერ შექმნილი <a href="http://www.julienlecomte.net/yuicompressor/">YUICompressor</a> რომელსაც გამოვიყენებთ JavaScript ფაილების მინიფიკაციისა და ობფუსკაციისათვის. გადმოწერეთ ბოლო ვერსია გახსენით არქივი დააკოპირეთ build კატალოგში არსებული yuicompressor-2.x.x.ჯარ ფაილი /project/tools კატალოგში, შეუცვალეთ მას სახელი და დაარქვით yuicompressor.jar;</li>
<li>დენ ედვარდსის <a href="http://dean.edwards.name/packer/">Packer</a> რომლის მეშვეობითაც შევამცირებთ უკვე მინიფიცირებულ ფაილის მოცულობას</li>
<li>ჩემს მიერ დაწერილ პატარა სკრიპტი რომელიც საშულებას მოგვცემს Ant სკრიპტიდან გამოვიძახოთ Packer &#8211; ის pack მეთოდი მინიფიცირებული კოდის base62 კოდირებისათვის. ფაილი აერთიანებს როგორც ჩემს მიერ დაწერილ კოდს, ასევე დენ ედვარდსის Packer &#8211; ს. გადმოწერეთ ფაილი და დააკოპირეთ იგი /project/tools კატალოგში</li>
</ul>
<p>სამუშაო გარემოს დასასრულებლად /project კატალოგში შექმენით ცარიელი build.xml ფაილი.<br />
საბოლოო ჯამში მივიღებთ კატალოგებისა და ფაილების ასეთ სტრუქტურას:</p>
<pre>
project
    tools
        js.jar
        yuicompressor.jar
        pack.js
    src
    build
    build.xml
</pre>
<p>მანამდე სანამ შევუდგებით ფაილების უშუალო კომპრესიას /project/src კატალოგში დააკოპირეთ თქვენთვის სასურველი/საჭირო JavaScript ფაილები. ამ პოსტის წერისას, ტესტირებისათვის გამოვიყენე ორი ფაილი, jquery-1.2.6.js და jQuery &#8211; ს პლაგინი jquery.form.js .</p>
<p>დროა შევუდგეთ Ant სკრიპტის წერას რომლის მეშვეობითაც გავაერთიანებთ ფაილებს, გამოვიძახებთ შესაბამის უტილიტებს საჭირო პარამეტრებით და მივიღებთ საბოლოო შედეგს.</p>
<pre>
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;project name="MyProject" default="build" basedir="."&gt;

    &lt;!-- Source Directory --&gt;
    &lt;property name="src" value="src" /&gt;
    &lt;!-- Build Directory --&gt;
    &lt;property name="build" value="build" /&gt;
    &lt;!-- Tools Directory --&gt;
    &lt;property name="tools" value="tools" /&gt;

    &lt;target name="init"&gt;
        &lt;!-- Cleanup build folder --&gt;
        &lt;delete&gt;
            &lt;fileset dir="${build}" includes="**/*.*"/&gt;
        &lt;/delete&gt;
    &lt;/target&gt;

    &lt;target name="build" depends="init"&gt;
        &lt;!-- Concatenate source files --&gt;
        &lt;concat destfile="${build}/library.js"&gt;
            &lt;filelist dir="${src}" files="jquery-1.2.6.js,jquery.form.js"/&gt;
        &lt;/concat&gt;
        &lt;!-- Minify concatenated file with YUICompressor --&gt;
        &lt;java fork="true" jar="${tools}/yuicompressor.jar"&gt;
            &lt;arg line="-o ${build}/library.min.js ${build}/library.js" /&gt;
        &lt;/java&gt;
        &lt;!-- Pack minified file with Dean Edwards' Packer --&gt;
        &lt;java fork="true" jar="${tools}/js.jar"&gt;
            &lt;arg line="${tools}/pack.js ${build}/library.min.js ${build}/library.pack.js" /&gt;
        &lt;/java&gt;
    &lt;/target&gt;

&lt;/project&gt;
</pre>
<p>ნაჩვენები Ant სკრიპტის დეტალების განხილვა სცილდება ამ პოსტის მიზანს, თუმცა ყველა მნიშნველოვან დირექტივას თანდართული აქვს კომენტარები ზოგადი წარმოდგენის შესაქმნელად. </p>
<p>სკრიპტის შექმნის შემდეგ ტერმინალიდან შედით თქვენი პროექტის კატალოგში და აკრიფეთ შემდეგი ბრძანება:</p>
<pre>
ant
</pre>
<p>პროცესის დასრულების შემდეგ ტერმინალში დაინახავთ დაახლოვებით მსგავს შედეგს:</p>
<pre>
Buildfile: /Users/iosebdzmanashvili/Sites/test/pack/build.xml
init:
build:
     [java] completed...
BUILD SUCCESSFUL
Total time: 17 seconds
</pre>
<p>მაშ ასე ფაილების გაერთიანების, მინიფიკაციის, ობფუსკაციისა და კოდის base62 კოდირებაში გადაყვანის პროცესი დასრულებულია. თუ შეხვალთ /project/build კატალოგში, დაგხვდებათ სამი ფაილი:</p>
<ul>
<li><strong>library.js</strong> &#8211; რომელშიც გაერთიანებულია ზემოთ ნახსენები ორი JS ფაილი. ამ ფაილის ზომა დაახლოვებით 124KB &#8211; ს შეადგენს;</li>
<li><strong>library.min.js</strong> &#8211; YUICompressor &#8211; ის მეშვეობით მინიფიცირებული ფაილი რომლის ზომაც დაახლოვებით 64KB &#8211; ა;</li>
<li><strong>library.pack.js</strong> &#8211; Packer &#8211; ის მეშვეობით base62 კოდირებაში გადაყვანილი ფაილი რომლის ზომაც დაახლოვებით 36KB &#8211; ა;</li>
</ul>
<p>დამერწმუნებით რომ შედეგი თვალსაჩიანოა და დამატებით კომენტარებს არ საჭიროებს, 124KB &#8211; დან საბოლოო ფაილი დავიყვანეთ 36KB &#8211; მდე რაც უდავოდ მნიშვნელოვანი სხვაობაა. თუ ამ ფაილს დამატებით პოსტის დასაწყიში ნახსენები მეთოდით დავამუშავებთ მისი ზომა დაახლოვებით 20KB &#8211; მდე დავა რაც თავისთავად ასევე მნიშვნელოვანია.</p>
<p>რეზიუმეს სახით ასევე მნიშვნელოვანია რამდენიმე დეტალი. თუ ფაილის მინიფიკაციის პროცესს შევასრულებდით მხოლოდ Packer &#8211; ის გამოყენებით, მივიღებდით დაახლოვებით იგივე შედეგს. თუმცა არსებობს ერთი საჩოთირო დეტალი რამაც YUICompressor &#8211; ის ჩართვისაკენ მიბიძგა.</p>
<p>როდესაც ვიყენებთ Packer &#8211; ს, მნიშნველოვანია გავითვალისწინოთ რომ ნებისმიერი ფუნქცია რომელსაც აღვწერთ სხვა ფუნქციისა ან მეთოდის შიგნით უნდა მთავრდებოდეს წერტილ მძიმით &#8220;;&#8221;. თუ ეს პირობა არ არის დაცული Packer &#8211; ის მიერ დაპატარავებული ფაილი უსარგებლო იქნება. ამ პროლემას აგვარებს YUICompressor, რადგან იგი ასეთ ფუნქციებს ავტომატურად ასრულებს წერტილ მძიმით ხოლო შედეგად ვღებულობთ სუფთა, Packer &#8211; ისათვის გამოსადეგ კოდს. მაგალითში ნაჩვენებია ასეთი შემთხვევა:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">function</span> myFunction<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> myPrivateFunction <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #006600; font-style: italic;">//rest of code here</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #006600; font-style: italic;">//აქ აუცილებელია წერტილ მძიმე</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>სამწუხაროდ Packer &#8211; ს არ აქვს იმის უნარი რომ ასეთი მცირე პრობლემები მოაგვაროს თავისით, თუმცა როგორც უკვე აღვნიშნე ამ პრობლემის თავიდან არიდება შესაძლებელია YUICompressor &#8211; ის მეშვეობით.</p>
<p>ასევე ყურადღებას შევაჩერებ ჩემს მიერ დაწერილ პატარა სკრიპტზე რომლის მეშვეობითაც ხდება მინიფიცირებული კოდის base62 კოდირებაში გადაყვანა. სკრიპტი არის Rhino &#8211; ს რამდენიმე სტრიქონი კლიენტი რომლის შესრულებაც შესაძლებელია ტერმინალიდან. მას ესაჭიროება ორი პარამეტრი: 1) საწყისი ფაილი რომლის კოდირებაც გვესაჭიროება; 2) საბოლოო ფაილის სახელი; </p>
<p>Rhino &#8211; ს კლიენტი კითხულობს პირველ პარამეტრად გადაცემული ფაილიდან JavaScript კოდს, იძახებს Packer &#8211; ის pack მეთოდს შესაბამისი პარამეტრებით, და მიღებულ შედეგს ინახავს შესაბამის ფაილში:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">output <span style="color: #339933;">=</span> java.<span style="color: #660066;">io</span>.<span style="color: #660066;">FileWriter</span><span style="color: #009900;">&#40;</span>arguments<span style="color: #009900;">&#91;</span>1<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> &nbsp;<span style="color: #006600; font-style: italic;">//obtain FileWriter object</span><br />
output.<span style="color: #000066; font-weight: bold;">write</span><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; pack<span style="color: #009900;">&#40;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//invoke Dean Edward's packer function</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; readFile<span style="color: #009900;">&#40;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//read input file: http://www.mozilla.org/rhino/shell.html</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arguments<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #006600; font-style: italic;">//input file path</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #CC0000;">62</span><span style="color: #339933;">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//base62 encode</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #CC0000;">0</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//shrink variable names?</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
output.<span style="color: #000066;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000066;">print</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'completed...'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">//Dean Edwrads' Packer code here</span></div></td></tr></tbody></table></div>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/ant-rhino-yuicompressor-js-packer/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mac Os X XAMPP: Tidy &#8211; ს ინსტალაცია PHP-5.2.6 &#8211; სთვის</title>
		<link>http://www.code.ge/posts/mac-os-x-xampp-tidy-installation-for-php-5-2-6</link>
		<comments>http://www.code.ge/posts/mac-os-x-xampp-tidy-installation-for-php-5-2-6#comments</comments>
		<pubDate>Thu, 18 Dec 2008 08:35:50 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.code.ge/?p=154</guid>
		<description><![CDATA[ამ პოსტში მინდა მოგითხროთ პატარა ისტორია Mac OS X &#8211; ზე PHP &#8211; ს რეკომპილაციით მიღებულ &#8220;სიამოვნებასა&#8221; და უსაზღვრო &#8220;კომფორტზე&#8221; რომელიც ბოლო ორი დღის განმავლობაში მივიღე. მაშ ასე, თუ თქვენ იყენებთ XAMPP &#8211; ს და გესაჭიროებათ PHP &#8211; სთვის tidy გაფართოვების დამატება რომელიც სამწუხაროთ XAMPP &#8211; ს არ მოყვება, გაგახარებთ და გეტყვით რომ საკმაოდ სერიოზული [...]]]></description>
			<content:encoded><![CDATA[<p>ამ პოსტში მინდა მოგითხროთ პატარა ისტორია Mac OS X &#8211; ზე PHP &#8211; ს რეკომპილაციით მიღებულ &#8220;სიამოვნებასა&#8221; და უსაზღვრო &#8220;კომფორტზე&#8221; რომელიც ბოლო ორი დღის განმავლობაში მივიღე.</p>
<p>მაშ ასე, თუ თქვენ იყენებთ XAMPP &#8211; ს და გესაჭიროებათ PHP &#8211; სთვის <strong>tidy</strong> გაფართოვების დამატება რომელიც სამწუხაროთ XAMPP &#8211; ს არ მოყვება, გაგახარებთ და გეტყვით რომ საკმაოდ სერიოზული პრობლემის წინაშე დგახართ <img src='http://www.code.ge/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> <span id="more-154"></span></p>
<p>რა არის საჭირო ამ მიზნის მისაღწევად? მივყვეთ ნაბიჯ ნაბიჯ:</p>
<ol>
<li>შეინახეთ ყველა არსებული პროექტი უსაფრთხო ადგილას;</li>
<li>გაანადგუროთ ყველა არსებული PHP ინსტალაცია, ამისათვის ტერმინალში აკრიფეთ შემდეგი ბრძანებები:
<p></p>
<pre>
sudo rm -rf /Applications/xampp
sudo rm -rf /usr/include/php
sudo rm -rf /usr/lib/php
</pre>
</li>
<li>გადმოწეროთ <a href="http://www.apachefriends.org/download.php?xampp-macosx-0.7.4.dmg">XAMPP ის ბოლო ვერსია</a> და დააინსტალირეთ;</li>
<li>გადმოწერეთ <a href="http://www.apachefriends.org/download.php?xampp-macosx-0.7.4-dev.tar.gz">XAMPP &#8211; ის დეველოპერ პაკეტი</a> ნებისმიერ ადგილას, შედით შესაბამის კატალოგში და დააინსტალირეთ შემდეგი ბრძანებით:<br />
</p>
<pre>
sudo tar xvfpz xampp-macosx-0.7.4-dev.tar.gz -C /Applications/xampp
</pre>
</li>
<li>გადმოწერეთ <a href="http://www.php.net/releases/">PHP 5.2.6 &#8211; ის დისტრიბუტივი</a> და გახსენით არქივი ნებისმიერ მისამართზე, მაგ:<br />
</p>
<pre>
/Users/iosebdzmanashvili/Documents/PHP/php-5.2.6
</pre>
</li>
<li>გაუშვით XAMPP, შექმენით ნებისმიერი PHP ფაილი და გამობეჭდეთ phpinfo.
<p>მიღებული რეზულტატიდან დააკოპირეთ და შეინახეთ კონფიგურაციის პარამეტრები, ეს ნაბიჯი აუცილებელია არსებული კონფიგურაციის შესანარჩუნებლად. ორიგინალი დაახლოვებით გამოიყურება ასე:</p>
<p></p>
<pre style="overflow: auto;">
./configure --prefix=/Applications/xampp/xamppfiles --program-suffix=-5.2.6 --libdir=/Applications/xampp/xamppfiles/lib/php/php5 --includedir=/Applications/xampp/xamppfiles/include/php/php5 --with-apxs2=/Applications/xampp/xamppfiles/bin/apxs --with-config-file-path=/Applications/xampp/etc --with-mysql=/Applications/xampp/xamppfiles --disable-debug --enable-bcmath --enable-calendar --enable-ctype --enable-dbase --enable-discard-path --enable-exif --enable-filepro --enable-force-cgi-redirect --enable-ftp --enable-gd-imgstrttf --enable-gd-native-ttf --with-ttf --enable-magic-quotes --enable-memory-limit --enable-safe-mode --enable-shmop --enable-sigchild --enable-sysvsem --enable-sysvshm --enable-track-vars --enable-trans-sid --enable-wddx --enable-yp --with-ftp --with-ncurses=/Applications/xampp/xamppfiles --with-gdbm=/Applications/xampp/xamppfiles --with-jpeg-dir=/Applications/xampp/xamppfiles --with-png-dir=/Applications/xampp/xamppfiles --with-freetype-dir=/Applications/xampp/xamppfiles --without-xpm --with-zlib=yes --with-zlib-dir=/Applications/xampp/xamppfiles --with-openssl=/Applications/xampp/xamppfiles --with-expat-dir=/Applications/xampp/xamppfiles --enable-xslt=/Applications/xampp/xamppfiles --with-xsl=/Applications/xampp/xamppfiles --with-dom=/Applications/xampp/xamppfiles --with-ldap=/Applications/xampp/xamppfiles --with-gd=/Applications/xampp/xamppfiles --with-mysql-sock=/Applications/xampp/xamppfiles/var/mysql/mysql.sock --with-mcrypt=/Applications/xampp/xamppfiles --with-mhash=/Applications/xampp/xamppfiles --enable-sockets --with-curl=/Applications/xampp/xamppfiles --enable-mbregex --enable-zend-multibyte --with-zip=/Applications/xampp/xamppfiles --enable-exif --with-sqlite --with-libxml-dir=/Applications/xampp/xamppfiles --enable-soap --enable-pcntl --enable-dbx --with-mysqli=/Applications/xampp/xamppfiles/bin/mysql_config --with-bz2=/Applications/xampp/xamppfiles --with-ming=shared,/Applications/xampp/xamppfiles --with-pear=/Applications/xampp/xamppfiles/lib/php/pear --with-mssql=/Applications/xampp/xamppfiles --with-imap-dir=/Applications/xampp/xamppfiles --with-imap=/Applications/xampp/xamppfiles --enable-mbstring=all,/usr --with-gettext=/Applications/xampp/xamppfiles --with-pdo-mysql=/Applications/xampp/xamppfiles
</pre>
</li>
</ol>
<p>ახლა იწყება ყველაზე საინტერესო და არასასიამოვნო პროცესი რომლის გარკვევაზეც არცთუ ცოტა დრო დამეხარჯა:</p>
<ol>
<li>გახსენით ფაილი:<br />
</p>
<pre>
/Users/iosebdzmanashvili/Documents/PHP/php-5.2.6/ext/tidy/tidy.c
</pre>
<p>მოძებნეთ გახსნილ ფაილში <strong>#include &#8220;tidy.h&#8221;</strong> და გადაიტანეთ იგი ფაილის დასაწყისში.</p>
</li>
<li>
<strong>tidy</strong> &#8211; ს <strong>xampp</strong> &#8211; ში დასაკოპირებლად ტერმინალში აკრიფეთ შემდეგი ბრძანება:<br />
</p>
<pre style="overflow: auto;">
sudo ditto /usr/include/tidy /Applications/xampp/xamppfiles/include
</pre>
<p>ეს პროცედურა მნიშნველოვანია რადგან PHP &#8211; სთან არსებული კონფლიქტის გამო საჭიროა tidy &#8211; ს ფაილებში ცვლილების შეტანა, ხოლო XAMPP &#8211; ში tidy არ დევს.
</li>
<li>
ახლად დაკოპირებული კატალოგიდან გახსენით ფაილი:<br />
</p>
<pre style="overflow: auto;">
/Applications/xampp/xamppfiles/include/tidy/platform.h
</pre>
<p>და 526 &#8211; ე ხაზიდან 531 ხაზის ჩათვლით არსებული კოდი:<br />
</p>
<pre style="overflow: auto;">
#if !defined(HPUX_OS) &#038;&#038; !defined(CYGWIN_OS) &#038;&#038; !defined(MAC_OS_X) &#038;&#038; !defined(BE_OS) &#038;&#038; !defined(SOLARIS_OS) &#038;&#038; !defined(BSD_BASED_OS) &#038;&#038; !defined(OSF_OS) &#038;&#038; !defined(IRIX_OS) &#038;&#038; !defined(AIX_OS) &#038;&#038; !defined(LINUX_OS)
typedef unsigned int uint;
#endif
#if defined(HPUX_OS) || defined(CYGWIN_OS) || defined(MAC_OS) || defined(BSD_BASED_OS) || defined(_WIN32)
typedef unsigned long ulong;
#endif
</pre>
<p>ჩაანაცვლეთ შემდეგი კოდით რათა თავიდან ავირიდოთ PHP &#8211; სთან არათავსებადობის პრობლემა:<br />
</p>
<pre style="overflow: auto;">
#if !defined(HPUX_OS) &#038;&#038; !defined(CYGWIN_OS) &#038;&#038; !defined(MAC_OS_X) &#038;&#038; !defined(BE_OS) &#038;&#038; !defined(SOLARIS_OS) &#038;&#038; !defined(BSD_BASED_OS) &#038;&#038; !defined(OSF_OS) &#038;&#038; !defined(IRIX_OS) &#038;&#038; !defined(AIX_OS) &#038;&#038; !defined(LINUX_OS)
#undef uint; /* avoid conflict with PHP */
typedef unsigned int uint;
#endif
#if defined(HPUX_OS) || defined(CYGWIN_OS) || defined(MAC_OS) || defined(BSD_BASED_OS) || defined(_WIN32)
#undef ulong; /* avoid conflict with PHP */
typedef unsigned long ulong;
#endif
</pre>
</li>
<li>
შენახულ PHP &#8211; ს კონფიგურაციას დაამატეთ შემდეგი ორი პარამეტრი.</p>
<p>იმ შემთხვევაში <strong>iconv</strong> არ არის თქვენს კონფიგურაციაში, საჭიროა მისი ცხადად მითითება, წინააღმდეგ შემთხვევაში კომპილაცია წარუმატებელი იქნება:<br />
</p>
<pre>
--with-iconv=/Applications/xampp/xamppfiles
</pre>
<p>ასევე მიუთითეთ <strong>tidy</strong> &#8211; ს გასააქტიურებლად საჭირო პარამეტრი:<br />
</p>
<pre>
--with-tidy=/Applications/xampp/xamppfiles
</pre>
</li>
<li>
კონფიგურაციის პარამეტრების მომზადების შემდეგ ტერმინალიდან გადადით PHP &#8211; ს დისტრიბუტივის კატალოგში:<br />
</p>
<pre>
cd /Users/iosebdzmanashvili/Documents/PHP/php-5.2.6
</pre>
<p>და ტერმინალში შეასრულეთ შემდეგი ბრძანება:<br />
</p>
<pre style="overflow: auto;">
./configure --prefix=/Applications/xampp/xamppfiles --program-suffix=-5.2.6 --libdir=/Applications/xampp/xamppfiles/lib/php/php5 --includedir=/Applications/xampp/xamppfiles/include/php/php5 --with-apxs2=/Applications/xampp/xamppfiles/bin/apxs --with-config-file-path=/Applications/xampp/etc --with-mysql=/Applications/xampp/xamppfiles --disable-debug --enable-bcmath --enable-calendar --enable-ctype --enable-dbase --enable-discard-path --enable-exif --enable-filepro --enable-force-cgi-redirect --enable-ftp --enable-gd-imgstrttf --enable-gd-native-ttf --with-ttf --enable-magic-quotes --enable-memory-limit --enable-safe-mode --enable-shmop --enable-sigchild --enable-sysvsem --enable-sysvshm --enable-track-vars --enable-trans-sid --enable-wddx --enable-yp --with-ftp --with-ncurses=/Applications/xampp/xamppfiles --with-gdbm=/Applications/xampp/xamppfiles --with-jpeg-dir=/Applications/xampp/xamppfiles --with-png-dir=/Applications/xampp/xamppfiles --with-freetype-dir=/Applications/xampp/xamppfiles --without-xpm --with-zlib=yes --with-zlib-dir=/Applications/xampp/xamppfiles --with-openssl=/Applications/xampp/xamppfiles --with-expat-dir=/Applications/xampp/xamppfiles --enable-xslt=/Applications/xampp/xamppfiles --with-xsl=/Applications/xampp/xamppfiles --with-dom=/Applications/xampp/xamppfiles --with-ldap=/Applications/xampp/xamppfiles --with-gd=/Applications/xampp/xamppfiles --with-mysql-sock=/Applications/xampp/xamppfiles/var/mysql/mysql.sock --with-mcrypt=/Applications/xampp/xamppfiles --with-mhash=/Applications/xampp/xamppfiles --enable-sockets --with-curl=/Applications/xampp/xamppfiles --enable-mbregex --enable-zend-multibyte --with-zip=/Applications/xampp/xamppfiles --enable-exif --with-sqlite --with-libxml-dir=/Applications/xampp/xamppfiles --enable-soap --enable-pcntl --enable-dbx --with-mysqli=/Applications/xampp/xamppfiles/bin/mysql_config --with-bz2=/Applications/xampp/xamppfiles --with-ming=shared,/Applications/xampp/xamppfiles --with-pear=/Applications/xampp/xamppfiles/lib/php/pear --with-mssql=/Applications/xampp/xamppfiles --with-imap-dir=/Applications/xampp/xamppfiles --with-imap=/Applications/xampp/xamppfiles --enable-mbstring=all,/usr --with-gettext=/Applications/xampp/xamppfiles --with-pdo-mysql=/Applications/xampp/xamppfiles --with-iconv=/Applications/xampp/xamppfiles --with-tidy=/Applications/xampp/xamppfiles
</pre>
</li>
<li>
./configure ოპერაციის დასრულების შემდეგ ტერმინალში აკრიფეთ შემდეგი სამი ბრძანება:<br />
<br />
პროცესის დასრულების შემდეგ:</p>
<pre style="overflow: hidden;">
make clean //გაუგებრობების თავიდან ასაცილებლად
make //აქ შეგიძლიათ ყავა მოიმზადოთ, სიგარეტი მოწიოთ და კურიერს უყუროთ <img src='http://www.code.ge/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  <img src='http://www.code.ge/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />
sudo make install
</pre>
</li>
</ol>
<p>გილოცავთ! ინსტალაცია დასრულებულია <img src='http://www.code.ge/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  გადატვირთეთ Apache და განაგრძეთ მუშაობა <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>P.S.<br />
ფაილების მისამართებში გამოყენებული მომხმარებელის სახელი &#8220;iosebdzmanashvili&#8221; უნდა შეცვალოთ თქვენი მომხმარებლის სახელით <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/mac-os-x-xampp-tidy-installation-for-php-5-2-6/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>mod_deflate: js და css ფაილების კომპრესია</title>
		<link>http://www.code.ge/posts/mod_deflate-js-css-file-compression</link>
		<comments>http://www.code.ge/posts/mod_deflate-js-css-file-compression#comments</comments>
		<pubDate>Thu, 27 Sep 2007 10:27:13 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[Apache]]></category>

		<guid isPermaLink="false">http://www.code.ge/apache/mod_deflate-js-css-file-compression</guid>
		<description><![CDATA[დიდი ხნის პაუზის შემდეგ ვუბრუნდები ბლოგერობას თავისთავად საინტერესო პოსტით(იმედი მაქვს რომ ეს ასეა)&#8230; ჩემი ბოლო ერთი წლის საქმიანობა მჭიდროდ არის დაკავშირებული ე.წ. Client Side დეველოპმენტთან, რაც თავისთავად საკმაოდ ბევრ ნიუანსს მოიცავს. თუმცა ამ შემთხვევაში ყურადღების გამახვილება მინდა CSS და JS(JavaScript) ფაილებზე, მათ ზომებზე და კომპრესიის მეთოდებზე&#8230; პრობლემა თავისთავად ცხადია როდესაც ვმუშაობთ RIA ტიპის საიტებზე/აპლიკაციებზე, რესურსის [...]]]></description>
			<content:encoded><![CDATA[<p>დიდი ხნის პაუზის შემდეგ ვუბრუნდები ბლოგერობას <img src='http://www.code.ge/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  თავისთავად საინტერესო პოსტით(იმედი მაქვს რომ ეს ასეა)&#8230;</p>
<p>ჩემი ბოლო ერთი წლის საქმიანობა მჭიდროდ არის დაკავშირებული ე.წ. Client Side დეველოპმენტთან, რაც თავისთავად საკმაოდ ბევრ ნიუანსს მოიცავს. თუმცა ამ შემთხვევაში ყურადღების გამახვილება მინდა CSS და JS(JavaScript) ფაილებზე, მათ ზომებზე და კომპრესიის მეთოდებზე&#8230;<span id="more-67"></span></p>
<p><strong>პრობლემა</strong><br />
თავისთავად ცხადია როდესაც ვმუშაობთ RIA ტიპის საიტებზე/აპლიკაციებზე, რესურსის ვიზუალური დეტალები მთლიანად გატანილია CSS &#8211; ში და არ არის საკვირველი ის ფაქტი რომ კომპლექსური რესურსისათვის  CSS ფაილების ზომა ხშირად საკმაოდ იზრდება და 25/50 კილობაიტს ან კიდევ უფრო მეტს აღწევს. </p>
<p>უფრო მეტად მნიშვნელოვანია ის ფაქტი რომ ასეთი ტიპის რესურსის შექმნისას გარდავალია საკმაოდ დიდი ოდენობის JavaScript კოდის გამოყენება. არ აქვს არანაირი მნიშვნელობა მას ჩვენით ვწერთ, ვიყენებთ უკვე გამზადებულ ბიბლიოთეკებს, თუ ამ ყველაფერს ერთად. ფაქტი მდგომარეობს იმაში რომ რესურსის მასშტაბურობიდან და ფუნქციონალური დატვირთვიდან გამომდინარე ხშირად JavaScript კოდის რაოდენობა შესაძლოა გასცდეს 200 კილობაიტს.</p>
<p>აღნიშნული დეტალები უარყოფითად აისახება როგორც სერვერზე ასევე კლიენტზე:</p>
<p>1) 200/300 კილობაიტი CSS/JavaScript კოდის ჩატვირთვას საკმაო დრო ესაჭიროება(ცხადია რომ ლოკალურ რესურსებზე ეს დიდად შესამჩნევი არ იქნება, მაგრამ ეს არ არის არგუმენტი);</p>
<p>2) სერვერის ტრაფიკი საგრძნობლად იზრდება. მითუფრო თუ რესურსს ბევრი მომხმარებელი ჰყავს;</p>
<p><strong>გამოსავალი</strong><br />
JavaScript &#8211; ის შემთხვევაში შესაძლოა გამოვიყენოთ <a href="http://dean.edwards.name/packer/">დენ ედვარდსის მიერ შექმნილი ინსტრუმენტი</a>, რომლის მეშვეობითაც არის დაკომპრესირებული ისეთი ცნობილი JavaScript ბიბლიოთეკები, როგორიცაა jQuery და MooTools. ამ ინსტრუმენტის ეფექტურება შესაძლებელია გადაამოწმოთ თავად და დარწმუნდებით რომ შედეგი მართლაც შესანიშნავია, მისი მეშვეობით შესაძლებელია ფაილის მოცულობის მესამედით შემცირება.</p>
<p>ამ ინსტრუმენტის რამდენიმე ენის ვერსია არსებობს მათ შორის PHP5 და PHP4 &#8211; ისთვის, რომლის მეშვეობითაც მარტივად შესაძლებელია პროექტში არსებული ყველა JS ფაილის დაკომპრესირება.</p>
<p>CSS &#8211; ისთვის მსგავს ინსტრუმენტს არ ვიცნობ და სიმართლე ითქვას არც მიძებნია მაგრამ&#8230;</p>
<p>გარდა აღნიშნული გამოსავალისა არსებობს კიდევ ორი(შესაძლო უფრო მეტიც) მეთოდი. ესენია:<br />
1) PHP &#8211; ს მეშვეობით კომპრესია, კერძოდ კი gzip &#8211; ის გამოყენებით, და რომლის განხილვასაც ამ პოსტში არ ვაპირებ რადგან მიმაჩნია რომ არასწორი და არაეფექტური საშუალებაა;<br />
2) Apache &#8211; ს მოდული mod_deflate;</p>
<p>მოდულის მცირე აღწერა:</p>
<blockquote><p>The mod_deflate module provides the DEFLATE output filter that allows output from your server to be compressed before being sent to the client over the network.</p></blockquote>
<p>რაც მოკლედ ნიშნავს იმას რომ კონტენტის კომპრესია მოხდება სერვერზე მანამდე სანამ იგი გამოიგზავნება კლიენტის მხარეს.</p>
<p><strong>გამოყენება</strong><br />
პირველ რიგში ამისათვის საჭიროა რომ ჩატვირთული იყოს Apache &#8211; ს mod_deflate მოდული:</p>
<pre>LoadModule deflate_module modules/mod_deflate.so</pre>
<p>ასევე Mac OS X &#8211; ზე XAMPP &#8211; ს გამოყენების შემთხვევაში მოძებნეთ შემდეგი სტრიქონი: </p>
<pre>AllowOverride AuthConfig</pre>
<p>და გადააკეთეთ იგი შემდეგნაირად:</p>
<pre>AllowOverride all</pre>
<p>ამ ყოველივეს შემდეგ თქვენი აპლიკაციის ძირეულ კატალოგში შექმენით .htaccess ფაილი და ჩაწერეთ მასში შემდეგი კოდი:</p>
<p><strong>მხოლოდ JavaScript ფაილების კომპრესიისათვის</strong></p>
<pre>&lt;Files *.js&gt;
SetOutputFilter DEFLATE
&lt;/Files&gt;</pre>
<p>ან</p>
<p><strong>JS და CSS ფაილების კომპრესიისათვის</strong></p>
<pre>&lt;FilesMatch "\.(css|js)$"&gt;
SetOutputFilter DEFLATE
&lt;/FilesMatch&gt;</pre>
<p>შედეგი შეგიძლიათ გადაამოწმოთ FireBug &#8211; ის მეშვეობით, კერძოდ კი Net->JS ქვეგანყოფილებაში;</p>
<p>ასევე საინტერესოა ის დეტალი რომ, ეს მეთოდი კომპრესიას უკეთებს ზემოთ ხსენებული დენ ედვარდსის ინსტრუმენტით დაკომპრესირებულ ფაილებსაც რაც გაცილებით უკეთეს შედეგს იძლევა <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/mod_deflate-js-css-file-compression/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>mod_security: პრობლემა და სწრაფი გამოსავალი</title>
		<link>http://www.code.ge/posts/mod_security-quick-solution</link>
		<comments>http://www.code.ge/posts/mod_security-quick-solution#comments</comments>
		<pubDate>Sun, 13 May 2007 10:03:06 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[Apache]]></category>

		<guid isPermaLink="false">http://www.code.ge/uncategorized/mod_security-quick-solution</guid>
		<description><![CDATA[ამ ბოლო დროს რამდენჯერმე პრობლემა შემექმნა mod_security &#8211; სთან. ეს არის ერთგვარი ვებ აპლიკაციის ფაირვოლი რომელიც უზრუნველყოფს დამატებით უსაფრთხოებას და ყენდება როგორც Apache ვებ სერვერის მოდული. განმარტება მწარმოებლის საიტიდან: ModSecurity is an embeddable web application firewall. It provides protection from a range of attacks against web applications and allows for HTTP traffic monitoring and real-time [...]]]></description>
			<content:encoded><![CDATA[<p>ამ ბოლო დროს რამდენჯერმე პრობლემა შემექმნა <a href="http://www.modsecurity.org/">mod_security</a> &#8211; სთან. ეს არის ერთგვარი ვებ აპლიკაციის ფაირვოლი რომელიც უზრუნველყოფს დამატებით უსაფრთხოებას და ყენდება როგორც Apache ვებ სერვერის მოდული.</p>
<p><strong>განმარტება მწარმოებლის საიტიდან:</strong></p>
<blockquote><p>ModSecurity is an embeddable web application firewall. It provides protection from a range of attacks against web applications and allows for HTTP traffic monitoring and real-time analysis with no changes to existing infrastructure.</p></blockquote>
<p>ამ მოდულს გააჩნია უამრავი კონფიგურაციის პარამეტრი რაც საგრძნობლად აუმჯობესებს რესურსის უსაფრთხოებას თუმცა მისი კონფიგურაციის ზოგიერთი დეტალი გარკვეულ პრობლემებსაც იწვევს.<span id="more-59"></span></p>
<p>ჩემს შემთხვევაში პრობლემა გამოიხატებოდა იმაში რომ იბლოკებოდა ყველა <strong>iframe</strong> ელემენტი და ასევე იბლოკებოდა ზოგიერთი ფაილი მათი დასახელების გამო (მაგ. filesystem.class.php).</p>
<p>გამომდინარე იქიდან რომ მე არ ვარ სერვერის ადმინისტრატორი და არ მეხება(და ხშირად არც მაინტერესებს) კონფიგურაციის დეტალები, მივაგენი სწრაფ გამოსავალს რომელიც სავსებით საკმარისია იმ მომენტამდე სანამ სერვერის ადმინისტრატორი დახვეწავს კონფიგურაციას.</p>
<p>კერძოდ ამისათვის საჭიროა <strong>.htaccess</strong> ფაილის შექმნა და მასში შემდეგი დირექტივების ჩაწერა:</p>
<pre>&lt;IfModule mod_security.c&gt;
   SecFilterEngine Off
&lt;/IfModule&gt;</pre>
<p>ეს არის და ეს mod_security დაბრკოლებას აღარ წარმოადგენს, თუმცა გაითვალისწინეთ რომ ეს არის ე.წ. dirty გამოსავალი  <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>დამატებითი დეტალებისათვის იხილეთ <a href="http://www.modsecurity.org/documentation/modsecurity-apache/2.1.0/modsecurity2-apache-reference.pdf">ოფიციალური დოკუმენტაცია</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/mod_security-quick-solution/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
