آموزش نصب و آماده سازی محیط گسترش برنامه های اندروید

اندروید سیستم عاملی است که بسرعت در حال گسترش و توسعه است و همه روزه دستگاههای جدیدی مبتنی بر این سیستم عامل وارد بازار می شوند و برنامه های متنوعی نیز برای این سیستم عامل تولید می شوند، برنامه نویسی اندروید کاریست بسیار ساده تنها کافی است با شیوه های برنامه نویسی جدید آشنا باشید.
در اینجا به آموزش و تضیح مراحل نصب و آماده سازی محیط گسترش برنامه های اندروید می پردازیم. مراحل نصب و راه اندازی در ویندوز ، لینوکس و مک بسیار شبیه به هم می باشند و تنها نام فایل ها یا مسیر تنظیمات کمی متفاوت می باشد، در اینجا حداکثر سعی شده است تا هر سه را پشتیبانی کند.
برای ایجاد برنامه های اندروید شما نیازمند SDK اندروید هستید، پس ابتدا می بایست از لینک زیر SDK پایه ای را دانلود کرده و نصب کنید. ( البته این SDK حاوی فایل های اجرایی آماده بوده و نیازی به نصب ندارند، ولی نسخه ای نسبی برای ویندوز موجود است)


البته باید توجه داشته باشید که ایران جزو کشورهایی است که گوگل برخی از امکانات خود را بروی آنها بسته است و همانطور که می دانید اندروید نیز توسط گوگل پستیبانی و گسترش داده می شود پس در تمام مراحل می بایست گوگل را دور بزنید.
پس از بارگذاری و اکسترک فایل ، درون فولدر ایجاد شده سه فولدر وجو دارد که به ترتیب add-ons , platforms و tools می باشند. همانطور که از اسم این فولدر ها فهمیده می شود add-ons برای افزونه های کاربری ، platforms برای پلتفرم، ورژن های مختلف اندروید ( که در ابتدا هیچ پلتفرم و افزونه ای موجود نمی باشد) و tools نیز برای مدیریت و کنترل SDK و همچنین ابزار هایی همچون شبیه ساز اندروید می باشد.
حال ما SDK پایه ای اندروید را داریم و می بایست یکی از پلتفرم های اندروید را نصب کنیم زیرا همانطور که گفته شد در ابتدا هیچ پلتفرمی در SDK موجود نیست و برای برنامه نویسی می بایست یک پلتفرم را بعنوان پلتفرم هدف خود داشته باشیم تا بتوانیم از ابزار های آن استفاده کرده و فایل اجرایی باسازیم. برای نسب پلتفرم های داخل فولدر tools رفته و فایل android را باز کنید( در مک و لینوکس می توانید این کار را با ترمینال نیز انجام دهید،تر مینال را باز کرده و دستورات زیر را وارد کنید، که در دستور اول بجای path می بایست آدرس فولدر tools را وارد کنید)
1
2
cd path
./android


با اجرای این برنامه صفحه ای باز می شود که بخش میدیرت SDK می باشد و شما می توانید افزونه ها و پلتفرم های مختلف را نصب یا خذف کنید و یا SDK خود را بروز رسانی کنید.

آموزش نصب اندروید

همانطور که گفته شد برای دانلود فایل ها می بایست گوگل را دور بزنیم، در بخش مدیریت مکانی برای تنظیمات پروکسی وجود دارد، به بخش تنظیمات برنامه رفته و server , port خود را در آنجا وارد کنید، سپس گزینه Force https://… sources را انتخاب کنید، انتخاب این گزینه باعث می شود که تمامی انتقال داده ها از طریق http صورت گیرد. تنطیمات را ببندید و از منوی Packages گزینه Reload را انتخاب کنید تا لیست بروز رسانی شود.

آموزش نصب اندروید

پس از بروز رسانی همانطور که مشاهده می کنید لیستی از پلتفرم ها و افزونه های موجود نمایش داده می شود، با انتخاب هر کدام و زدن دکمه Install پکیج مورد نظر شما دانلود و نصب می شود. برای مثال Android 2.1 (API 7) را انتخاب کرده و نصب کنید.
پس از اتمام نصب اگر به فولدر platforms نگاه بیاندازید می بینید که فولدری به نام android-7 وجود دارد.

آموزش نصب اندروید

پس از نصب پلتفرم مورد نظر می بایست یک دستگاه مجازی AVD - Android Virtual Device بسازیم تا بوسیله آن بتوانیم محیط اندروید را شبیه سازی و برنامه های خود را تست کنیم. برای این کار در از منوی Tools در برنامه منیجر گزینه Manage AVDs را انتخاب می کنیم. در پنجره باز شده روی New کلیک کرده و در پنجره جدید در بخش Name نامی برای دستگاه مجازی خود انتخاب می کنیم، سپس در بخش Target پلتفرم مورد نظر خود را انتخاب می کنیم ( که در اینجا Android 2.1 - API level 7 می باشد) و روی گزینه Create AVD کلیک کنید ، اکنون در لیست دستگاه ها نام دستگاه خود را مشاهده می کنید. در صورتی تمایل می توانید با انتخاب دستگاه و کلیک روی Start دستگاه خود را اجرا و مشاهده کنید.

آموزش نصب اندروید


آموزش نصب اندروید

خب تا اینجای کار SDK خود را آماده کرده ایم حال می باید محیط برنامه نویسی خود را آماده کنیم، برای گسترش برنامه های اندروید از eclipse استفاده می شود و شما می بایست این نرم افزار را بروی سیستم خود نصب کنید، به سایت سازنده آن یعنی http://eclipse.org سر بزنید و از آنجا فایل نصب را بارگذاری کنید. ولی تنها نصب eclipse کافی نیست زیرا ماژول های مورد نیاز برای برنامه نویسی اندروید برروی eclipse موجود نیستند ( هرچند پیشنهادی به eclipse داده شده است تا پکیجی جدا برای برنامه نویسان اندروید نیز ایجاد کند، ولی هنوز این پیشنهاد به تصویب مسولان eclipse نرسیده است)، پس می بایست ماژول های مورد نظر را خود به eclipse اضافه کنیم.
برای این کار پس از نصب eclipse آن را باز کرده و از منوی Help گزینه Install New Software را انتخاب کنید، در پنجره ظاهر شده در قسمت بالا سمت راست گزینه Add را انتخاب کرده و در پنجره جدید در بخش Name وارد کنید ADT Plugin و در بخش Location نیز آدرس زیر را وارد کنید:

و OK را بفشارید، پس از لود لیست ماژول های موجود نمایش داده می شود، آنها انتخاب و گزینه Next در پایین را انتخاب کنید، در این مرحله به بررسی پیش نیاز های موجود می پردازد ، پس از لود شما می بایست قوانین را قبول کردا و روی Finish کلیک کنید. پس از اتمام دانلود eclipse را بسته ودوباره باز کنید.

آموزش نصب اندروید

پس از باز کردن دوباره می بایست آدرس SDK خود را وارد کنید برای این کار به بخش تنظیمات eclipse رفته (Windows>Preferences ، در مک نیز eclipse>Preferences) و از لیست سمت چپ Android را انتخاب کنید و در سمت راست روی Browse کلیک کردن و فولدر SDK خود ار انتخاب کنید روی دکمه Apply کلیک کرده و OK، کار تمام است.

آموزش نصب اندروید

حال می توانید از منوی فایل New > Project را انتخاب کرده و یک Android New Project بسازید، یا یکی از برنامه های آماده موجود را اجرا کنید. دی این جا به ساخت یکی از برنامه های آماده و اجرای آن می پردازیم.

آموزش نصب اندروید

XML چیست

‏‫XML مجموعه ای از روش ها برای کدگذاری و تبدیل فایل ها و مدارک ‬به فرمی است که هم برای ماشین و هم برای انسان قابل خواندن باشد.اکس‌ام‌ال توسّط کنسرسیوم وب جهان‌شمول (W3C) در سال ۱۹۹۶ (میلادی) ایجاد شده و پس از آن افراد زیادی به استفاده از آن روی آوردند و گسترده استفاده از XML بسرعت وسیع شد، بطوری که امروزه از XML در بسیاری ا برنامه ها و زبان ها بعنوان یک پایگاه داده و وسیله ای برای تسهیل عمل ذخیره و بازیابی استفاده می شود.
ساختمان کلی XML به شکل یک درخت است‫، بدین شکل که داری یک ریشه ی اصلی می باشد که تمام اطلاعات درون آن نوشته می شوند.‬ XML در واقع شیوه ی ذخیره ی داده ها بشکل یک درخت است.
اگر با مفهوم درخت آشنایی داشته باشید براحتی می توانید XML را تجریه و تحلیل کنید.(در ریاضیات ، گراف همبند بی دور را درخت گویند. درخت، گرافی شاخه ایست که هر گره آن می تواند دارای صفر یا تعدادی فرزند بوده و حداکثر یک پدر داشته باشد.)
به نمونه ی زیر توجه کنید.

1
2
3
4
5
6
7
8
9
10
11
<‬Library‪>‬
<Book>
<Name>Introduction to Programming Using Java</Name>
<Author>David J. Eck</Author>
</Book>
<Book>
<Name>Dive Into Python</Name>
<Author>Mark Pilgrim</Author>
</Book>
‪</‬Library‪>

مثال فوق نمایشگر یک لیست کتاب است که دارای ۲ کتاب می باشد که هرکتاب دارای مشخصاتی مثل نام کتاب و نام نویسنده ی آن می باشد. اگر به آن دقت کنید Library ریشه ‌و Book ها مثل فرزندان آن هستند، که هرکدام از فرزندانش خپذ نیز دارای دو فرزند Name و Author می باشند.
شکل کلی آن بصورت زیر است


در آمدی بر XML

فایل های XML ممکن است با تعریف برخی اطلاعات در مورد خودشان آغاز شوند.

1
2
<?xml version="1.0" encoding="UTF-8" ?>

برای ایجاد تگ ها در XML کافیست نام مورد نظر را بین دو علامت <> بنویسیم ‪<‬Tag‪>‬
تگ ها در سه نوع آغازی ‪<‬Tag‪>‬، پایانی ‪</‬Tag‪>‬ و تگ های تهی(بدون زیر شاخه) ‪<‬Tag‪/>‬ هستند.
المنت ها بخش های منتطقی از مدرک هستند که با یک تگ آغازی شروع و با یک تگ پایانی با همان نام خاتمه می یابند و یا فقط شامل یک تک تهی می باشند. بین تگ های آغازی و پایانی میتوان المنت های دیگری نیز موجود باشند که به آنها المنت های فرزند می گویند.

1
2
<Greeting>Hello, world.</Greeting>

ویژگی ها در XML نشانه هایی هستند شامل جفت نام/ارزش که می توانند در تگ های آغازی و تهی وجود داشته باشند. در مثال زیر المنت img دارای دو ویژگی‫ src و alt ‬میباشد :

1
2
<img src="madonna.jpg" alt='by Raphael'/>

مثالی دیگر : <step number="3">Connect A to B.</step> که در آن نام ویژگی number و ارزش یا مقدار آن 3 می باشد.
مثال:
در زیر مثالی ساده خواهیم نوشت که یک مدرک XML کامل می باشد.

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8" ?>
<painting>
<img src="madonna.jpg" alt='Foligno Madonna, by Raphael'/>
<caption>This is Raphael's "Foligno" Madonna, painted in
<date>1511</date>–<date>1512</date>.
</caption>
</painting>

در مثال فوق ۵ المنت painting‪,‬ img‪,‬ caption و دو date وجود دارد که date ها فرزند caption هستند که آن نیز فرزند المنت ریشه یعنی painting است. img دارای دو ویژگی src و alt می باشد.
برای درک بیشتر به این مثال توجه کنید.
فرض کنید شما فروشنده ی تلفن همراه هستید و می خواهید لیستی از گوشی های موجود در مغازه خود تهیه کنید. فرض کنید شما ۵ عدد تلفن همراه در مغازه دارید لیست خود را این چنین تهیه می کنید.

1
2
3
4
5
6
Mobiles‬
1
2
3
4
5

هر تلفن دارای شماره سریال مخصوص به خود می باشد ‪که ما با ‬‫**‬** نشان می دهیم.

1
2
3
4
5
6
‫Mobiles‬
1 ID:‫********‬**
2 ID:‫********‬**
3 ID:‫********‬**
4 ID:‫********‬**
5 ID:‫********‬**

هر کدام توسط شرکت خاصی ساخته شده و نامی دارند.‏

1
2
3
4
5
6
Mobiles‬
1 ID:‫********‬** name:iPhone product:apple
2 ID:‫********‬** name:V3X product:motorolla
3 ID:‫********‬** name:N96 product:nokia
4 ID:‫********‬** name:P1i product:sony ericsson
5 ID:‫********‬** name:1100 product:nokia

می توان مشخصات دیگر را نیز به این لیست افزود. این لیست همان فرم ساده ی یک مدرک XML است، همانظور که می بینید لیستی از تلفن ها که هرکدام دارای خوصیت های خود هستند که بصورت مرتب نوشته شده اند و این همان روشی است که در XML بکار میرود. مدرک زیر فرم XML لیست بالاست

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<mobile-list>
<mobile id="‫********‬**">
<name>iPhone</name>
<product>Apple</product>
</mobile>
<mobile id="‫********‬**">
<name>V3X</name>
<product>Motorolla</product>
</mobile>
<mobile id="‫********‬**">
<name>N96</name>
<product>Nokia</product>
</mobile>
<mobile id="‫********‬**">
<name>P1i</name>
<product>Sony Ericsson</product>
</mobile>
<mobile id="‫********‬**">
<name>1100</name>
<product>Nokia</product>
</mobile>
</mobile-list>

مدرک فوق نیز همان لیست تلفن هاست، این لیست شامل ۵ تلفن است که هرکدام دارای سریال مخصوص و نام و شرکت سازنده می باشند.

برخی کاربردهای XML
‏‫XML کاربرد های فراوانی در دنیای امروز دارد و از آن در ایجاد زبان های دیگر مورد استفاده قرار می گیرد، زبان هایی مثل RSS, Atom, SOAP و XHTML ‬، همچنین برنامه های همچون Microsoft Word ، Open Office و iWork برای ذخیره سازی اسناد متنی مورد استفاده قرار می گیرد.
مدرک زیر مثالی از یک مدرک RSS می باشد.همانطور که می بینید rss المنت ریشه ی این درخت است و تنها دارای یک فرزند به نام channel می باشد، channel نیز دارای فرزندهایی می باشد که محتوای اصلی یک فایل RSS را تولید می کنند، مثلا المنت title که عنوان فایل را مشخص می کند. المنت های item نیز که خود دارای فرزندانی هستند موضوعات موجود را نشان می دهند.
RSS یا فید فایل هایی هستند حاوی چکیده مطلاب ارسالی در یک سایت با بلاگ، که به شما این امکان را می دهند که از اخبار و ارسال های جدید سایت های مورد علاقه خود بدون نیاز به سر زدن به آنها با خبر شوید، فقس کافی است در RSS آن سایت عضو شوید و به این صورت شما از وضعیت سایت با خبر می شوید. RSS یکی از ملموس ترین کاربرد های XML در دنیای یارانه است.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xml:base="http://farnabaz.4paye.ir" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>فرنباز - drupal</title>
<link>http://farnabaz.ir/taxonomy/term/9/0</link>
<description>سیستم مدیریت محتوای دروپال</description>
<language>fa</language>
<item>
<title>راهنما نصب دروپال در لوکال هاست</title>
<link>http://farnabaz.ir/content/%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7-%D9%86%D8%B5%D8%A8-%D8%AF%D8%B1%D9%88%D9%BE%D8%A7%D9%84-%D8%AF%D8%B1-%D9%84%D9%88%DA%A9%D8%A7%D9%84-%D9%87%D8%A7%D8%B3%D8%AA</link>
<description>&lt;p&gt;دروپال یکی از محبوب ترین سایت سازها (سیستم های مدیریت محتوا) موجود می باشد که یه زبان PHP گسترش یافته و قدرت فراوانی در زمینه مدیریت سایت ها و سرویس های تحت وب دارد، سایت های بزرگی همچون ubuntu.com نیز از دروپال بهره می برند.&lt;br /&gt;
نصب ، راه اندازی و گسترش دروپال بسیار ساده می باشد و شما کافی است اندک آشنایی با HTML, CSS و PHP داشته باشید تا بتوانید با دروپال وب سایتی قدرتمند برای خود یا دیگران بسازید.&lt;br /&gt;
در اینجا به تشریح مراحل نصب نصخه 6 دروپال بروی کامپیوتر شخصی می پردازیم.&lt;br /&gt;
نکته: در این آموزش فرض بر این است که شما نرم افزار xampp را نصب کرده و user و password پایگاه داده شما root می باشد.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://farnabaz.ir/content/%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7-%D9%86%D8%B5%D8%A8-%D8%AF%D8%B1%D9%88%D9%BE%D8%A7%D9%84-%D8%AF%D8%B1-%D9%84%D9%88%DA%A9%D8%A7%D9%84-%D9%87%D8%A7%D8%B3%D8%AA&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
<comments>http://farnabaz.ir/content/%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7-%D9%86%D8%B5%D8%A8-%D8%AF%D8%B1%D9%88%D9%BE%D8%A7%D9%84-%D8%AF%D8%B1-%D9%84%D9%88%DA%A9%D8%A7%D9%84-%D9%87%D8%A7%D8%B3%D8%AA#comments</comments>
<category domain="http://farnabaz.ir/category/cms/drupal">drupal</category>
<category domain="http://farnabaz.ir/category/web">Web</category>
<category domain="http://farnabaz.ir/tags/xampp">XAMPP</category>
<category domain="http://farnabaz.ir/tags/%D8%A2%D9%85%D9%88%D8%B2%D8%B4">آموزش</category>
<category domain="http://farnabaz.ir/tags/%D8%AF%D8%B1%D9%88%D9%BE%D8%A7%D9%84">دروپال</category>
<pubDate>Thu, 22 Mar 2012 15:02:07 +0000</pubDate>
<dc:creator>farnabaz</dc:creator>
<guid isPermaLink="false">7 at http://farnabaz.4paye.ir</guid>
</item>
<item>
<title>ایجاد لینک ویرایش سریع کنار نام پست ها در دروپال</title>
<link>http://farnabaz.ir/content/%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-%D9%84%DB%8C%D9%86%DA%A9-%D9%88%DB%8C%D8%B1%D8%A7%DB%8C%D8%B4-%D8%B3%D8%B1%DB%8C%D8%B9-%DA%A9%D9%86%D8%A7%D8%B1-%D9%86%D8%A7%D9%85-%D9%BE%D8%B3%D8%AA-%D9%87%D8%A7-%D8%AF%D8%B1-%D8%AF%D8%B1%D9%88%D9%BE%D8%A7%D9%84</link>
<description>&lt;p&gt;ویرایش پست ها یکی از خسته کننده ترین کارها برای هر مدیر سایتی می باشد، زیرا نیازمند زمان زیادی برای خواندن و ویرایش کردن پست می باشد. حال فرض کنید می خواهید ۱۰ پست را در سایت خود ویرایش کنید، در این صورت مجبور هستید تک تک پست ها را باز کرده به بخش ویرایش رفته و آنها را ویرایش کنید، برای راحتی و سرعت بیشتر براحتی می توان لینکی کمکی کنار عنوان پست ایجاد کرد که با کلیک کردن برروی به بخش ویرایش برویم. راهی ساده و کارا برای ویرایش پست ها.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://farnabaz.ir/content/%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-%D9%84%DB%8C%D9%86%DA%A9-%D9%88%DB%8C%D8%B1%D8%A7%DB%8C%D8%B4-%D8%B3%D8%B1%DB%8C%D8%B9-%DA%A9%D9%86%D8%A7%D8%B1-%D9%86%D8%A7%D9%85-%D9%BE%D8%B3%D8%AA-%D9%87%D8%A7-%D8%AF%D8%B1-%D8%AF%D8%B1%D9%88%D9%BE%D8%A7%D9%84&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
<comments>http://farnabaz.ir/content/%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-%D9%84%DB%8C%D9%86%DA%A9-%D9%88%DB%8C%D8%B1%D8%A7%DB%8C%D8%B4-%D8%B3%D8%B1%DB%8C%D8%B9-%DA%A9%D9%86%D8%A7%D8%B1-%D9%86%D8%A7%D9%85-%D9%BE%D8%B3%D8%AA-%D9%87%D8%A7-%D8%AF%D8%B1-%D8%AF%D8%B1%D9%88%D9%BE%D8%A7%D9%84#comments</comments>
<category domain="http://farnabaz.ir/category/cms">CMS</category>
<category domain="http://farnabaz.ir/category/cms/drupal">drupal</category>
<category domain="http://farnabaz.ir/tags/%D8%AF%D8%B1%D9%88%D9%BE%D8%A7%D9%84">دروپال</category>
<category domain="http://farnabaz.ir/tags/%D8%B3%DB%8C%D8%B3%D8%AA%D9%85-%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA-%D9%85%D8%AD%D8%AA%D9%88%D8%A7">سیستم مدیریت محتوا</category>
<pubDate>Wed, 21 Mar 2012 15:06:08 +0000</pubDate>
<dc:creator>farnabaz</dc:creator>
<guid isPermaLink="false">4 at http://farnabaz.4paye.ir</guid>
</item>
</channel>
</rss>

پیاده سازی الگوریتم فشره سازی هافمن با جاوا

الگوریتم های فراوانی برای فشرده سازی اطلاعات وجود دارد که هریک کاربردی مخصوص خود را دارند، یکی از ماثرترین و کاربردی ترین این ها روش کدهافمن است. کاربرد این روش برای فشرده سازی فایلهای متنی می باشد و وابسته به کاراکترهای موجود در متن می تواند از ۲۰ تا ۹۰ در صد، یک فایل را فشرده کند.‬
در این روش با استفاده از جدول توضیع کاراکترهای موجود در متن، هر کاراکتر را بصورت یک رشته از صفر و یک هر نمایش می دهد.
فرض کنید فایلی شامل صد هزار کاراکتر داریم و می خواهیم آن را با کمترین حجم ذخیره کنیم، ما مشاهده می کنید که توضیع کاراکتر هر در متن مطابق جدول (الف) می باشد، که تنها شامل ۶ نوع کاراکتر بوده و حرف a با تعداد ۴۵۰۰۰ بار تکرار شده.
روش های فراوانی برای نمایش این نوع فایل ها وجود دارد، ما می خواهیم هر کاراکتر را بصورت یک کد باینری یکتا نمایش دهیم. اگر ما از کدهای هم اندازه برای نمایش استفاده کنیم، نیاز به ۳بیت احتیاج داریم تا بتوانیم ۶ کاراکتر را نمایش دهیم.(a=000,b=001,…,f=1100)
این روش نیاز مند ۳۰۰۰۰۰ بیت برای کد کردن این متن می باشد.آیا راه بهتری نیز وجود دارد؟
کددهی با طول های متفادت روش بهتری از کدهای هم اندازه می باشد به صورت که کاراکتری که تکرار بیشتری دارد را با کدی به کوتاه و کم فراوانی ترین کاراکتر را باکدی بلند تر نمایش می دهیم. جدول (الف) اینچنین کدی را نمایش می دهد: رشته ی تک بیتی 0 کاراکتر a و رشته ی ۴ بیتی 1100 کاراکتر f را نمایش می دهد.این کد نیازمند (45 · 1 + 13 · 3 + 12 · 3 + 16 · 3 + 9 · 4 + 5 · 4) · 1,000 = 224,000 بیت برای نمایش فایل است. حدود ۲۵٪ ذخیره سازی می کند.
کدهای پیشوندی:
تمرکز ما بروی کدهایی است که در آن ها هیچ یک پیشوندی از دیگری نیست (برای مثال 0101 پیشوندی از 0101100110011 میباشد ولی 00 پیشوندی از آن نمی باشد.)به این نوع کدها ،کدهای پیشوندی می گویند. می توان نشان داد بهترین راه برای فشرده سازی اطلاعات با کددهی کاراکتری استفاده از کدهای پیشوندی است.
تبدیل کردن بفرم باینری کد فرآیند ساده ایست ، فقط کافیست کد مربوط به هر کارکتر را کنار هم قرار دهیم.برای مثال: برای مثال برای کددهی با طول متفاوت طبق جدول (الف) ما سه کاراکتر abc را بصورت 0.101.100=0101100 کد می کنیم.

abcdef

فراوانی (درصد)4513121695

کددهی هم اندازه000001010011100101

کددهی متغییر010110011111011100

جدول (الف)

کدهای پیشوندی بخاطر سادگی تبدیل آنها مورد قبول هستند.از آنجایی که هیچ کدی پیشوندی از دیگری نیست ،براحتی می توان آنها از به جالت اول خودشان برگرداند، بدین صورت که باشروع ازابتدا هرکدی که مشاهده شد را با کاراکتر متناظرش جایگذاری می کنی و این کار را دوباره از سر می گیریم تا تمام کاراکتر ها ظاهر شوند.برای مثال 001011101 کدی است که بوسیله ی جدول (الف) ایجاد شده و طبق روش فوق آن را می توان بشکل 0.0.101.1101 نوشت و با جایگذاری کاراکترها این کد تبدیل به رشته ی aabe میشود.
برای فشرده سازی یک متن به روش هافمن نیاز به یک روش کددهی داریم (که مناسبترین آنها کددهی پیشوندی است). یک درخت دودویی که برگ های آن نمایانگر یک کاراکتر باشد می تواند چنین کددهی را ایجاد کند، ما آن را به این صورت تعریف می کنیم که کد هر کاراکتر آدرس گره آن از ریشه است بطوری که 0 نشانگر فرزند چپ و 1 نشانگر فرزند راست است. شکل (ب) نشان دهنده دو درخت برای نمونه های نوشته شده در جدول (الف) هستند.


درخت هافمن
شکل (ب)

کد هافمن:
هافمن الگوریتمی اختراع کرده است که کددهی پیشوندی بهینه ای ایجاد می کند که کد هافمن نام دارد.
در شبه کد زیر فرض بر این است که C مجموعه ای از n کاراکتر و هر کاراکتر c یک شی است دارای تکرار [f[c می باشد. این الگوریتم درخت T را ایجاد می کند که همانند کد مورد نظر است. آن با یک آرایه از |C| برگ آغاز میکند و با انجام 1-|C| عمل ادغام درخت نهایی را تولید می کند. صف اولویت Q که برای مشخص کردن دو برگی که فراوانی کمتری از بقیه دارند برای ادغام آنها مورد استفاده قرار می گیرد، نتیجه ی این ادغام شیی است که فراوانی آن حاصلجمع فراوانی های دو برگ ادغام شده می باشد.

1
2
3
4
5
6
7
8
9
10
HUFFMAN(C)
n ← |C|
Q ← C
for i 1 to n - 1
do allocate a new node z
left[z] ← x ← EXTRACT-MIN (Q)
right[z] ← y ← EXTRACT-MIN (Q)
f [z] ← f [x] + f [y]
INSERT(Q, z)
return EXTRACT-MIN(Q) ▹Return the root of the tree.

‫(به زبان ساده این الگویتم دو برگ با کاراکتری کمتری دارند را به یک گره وصل کرده و آن را به لیست اضافه می کنیم ،این عمل را تازمانی که لیست بیش از یک عضو دارد ادامه می دهیم.)‬
برای مثال ما درخت هافمن بصورت شکل (پ) می باشد که دارای ۶ نوع کاراکتر و صف اپولویت با تعداد عضو اولیه ی ۶ می باشد و ۵ عمل ادغام لازم است تا درخت نهایی حاصل شود، درخت نهایی کد پیشوندی مورد نظر را بدست می دهد که متناظر با آدرس برگ است.
خط ۳ صف اولویت Q را با کاراکتر های موجود در C مقدار دهی می کند. حلقه ی for بین خط های ۴ -۹ پیوسته دو گره که کمترین فراوانی را دارند از صف خارج کرده و دوباره آنها را بوسیله ی یک گره جدید z که حاصل ادغام این دو می باشد وارد لیست می کند. فراوانی گره z برابر مجموع فراوانی گره x وy است (خط ۸) . ‫گره z ، گره x را بعنوان فرزند چپ و گره y را بعنوان گره راست با خود بهمراه دارد.پس از n-1 ادغام یک گره در صف باقی می ماند که ریشه ی ‬درخت نهایی است که در خط ۱۰ بازگردانده می شود.


درخت هافمن
شکل (پ)

پیاده سازی ک هافمن در جاوا:
برای ایجاد درخت هافمن لازم است ابتدا لازم است کلاسی طراحی کنیم تا بتوان از آن بعنوان گره های درخت استفاده کنیم، این کلاس بایستی بتواند یک کراکتر و فراوانی آن را همراه داشته و لینکی به فرزند چپ و فرزند راست خود داشته باشد. همانند کلاس Link که دارای ۴ فیلد و ۳ سازنده می باشد.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Link {
Link left;
Link right;
Character c;
int weight;
public Link(int weight, Character c, Link left, Link right) {
this.weight = weight;
this.c = c;
this.left = left;
this.right = right;
}
public Link(int weight, Character c) {
this.weight = weight;
this.c = c;
this.left = null;
this.right = null;
}
public Link(int weight, Link left, Link right) {
this.weight = weight;
this.c = null;
this.left = left;
this.right = right;
}
}

‎پس از این لازم است فراوانی هر یک از کاراکتر های موجود در فایل را بدست بیاوریم

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public ArrayList<Link> search(FileReader fr, ArrayList<Character> ch) {
HashMap<Character, Integer> hm = new HashMap<Character, Integer>();
char[] tmp = new char[1];
try {
while (fr.ready()) {
fr.read(tmp);
if (hm.containsKey(tmp[0])) {
hm.put(tmp[0], hm.get(tmp[0]) + 1);
} else {
ch.add(tmp[0]);
hm.put(tmp[0], 1);
}
}
} catch (IOException ex) {
Logger.getLogger(Tree.class.getName()).log(Level.SEVERE, null, ex);
}
ArrayList<Link> st = new ArrayList<Link>();
int temp;
for (int i = 0; i < ch.size(); i++) {
temp = hm.get(ch.get(i));
if (st.isEmpty()) {
st.add(new Link(temp, ch.get(i)));
} else {
int j = i;
while (j > 0 && temp < st.get(j - 1).weight) {
j--;
}
st.add(j, new Link(temp, ch.get(i)));
}
}
return st;
}

این متود دارای دو ورودی fr از نوع FileReader و ch که لیستی از نوع کاراکتر است، fr مشخص کننده ی مسیر ورودی فایل مورد نظر و ch آرایه ای است که برای نگه داری نوع کاراکترهای موجود درفایل مورد استفاده قرار می گیرد. hm شیئ از کلاس HashMap که برای نگه داری فراوانی کاراکترها استفاده می شود، آرایه تک عضوی tmp نیز بعنوان بافر برای خواندن متن از فایل تعریف شده است. حلقه ی while تا زمانی که به انتهای فایل نرسیده تکرار می شود و کاراکتر به کاراکتر متن را می خواند و در صورتی که کاراکتر جدیدی مشاهده کند آنرا به لیست ch اضافه می کند در غیر این صورت به فراوانی آن یک واحد می افزاید. حلقه ی for که به تعداد طول لیست ch تکرار می شود و لیست st را بصورت صعودی با گره های اولیه یا همان برگ های درخت مقدار دهی می کند و درنهایت st برگردانده می شود.(st در حقیقت همان صف اولویت است.)
حال می توانیم درخت مورد نظر را ایجاد کنیم.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private Link makeTree(ArrayList<Link> node) {
ArrayList<Link> nodes = node;
Link a, b;
int tmp, i;
while (nodes.size() > 1) {
a = nodes.remove(0);
b = nodes.remove(0);
tmp = a.weight + b.weight;
i = 0;
while (i < nodes.size() && tmp > nodes.get(i).weight) {
i++;
}
nodes.add(i, new Link(a.weight + b.weight, a, b));
}
return nodes.get(0);
}

نحوه ی کار متود makeTree همانند شبه کد درخت هافمن می باشد. این متود دارای یک آرگمان ورددی (node) است که همان لیست برگ هاست، حلقه ی while تا زمانی که درون لیست بیش از یک عضو وجود داشته باشد تکرار می شود و در هر بار تکرار خود دو گرهی که دارای فراوانی کمتری هستند را از لیست خارج کرده و آنها ادغام نموده و دوباره بطوری که ترتیب لیست بهم نخورد وارد آن می کند و در نهایت تنها عضو باقی مانده در لیست که همان ریشه ی درخت است را برمی گرداند.
با بدست آوردن درخت می توانیم کدها از آن استخراج کنیم.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private HashMap<Character, String> hash(Link root, String value,
HashMap<Character, String> has) {
if (root.left == null && root.right == null) {
if (value.equals("")) {
value = "0";
}
has.put(root.c, value);
} else {
if (root.left != null) {
hash(root.left, value + "0", has);
}
if (root.right != null) {
hash(root.right, value + "1", has);
}
}
return has;
}

این متود طبق یک روند بازگشتی کد مربوط به هر کاراکتر را از درخت ساخته شده استخراج می کند‬. این متود دارای سه آرگومان ورودی root که نشانگر ریشه ی درخت است ، value که کد هر کاراکتر را در ذخیره می کند و has که سیستم کددهی نهایی را در خود ذخیره می کند. نحوه ی کار به این صورت است که اگر گرهی که بررسی می شود برگی از درخت باشد (root.left == null && root.right == null) کد متناظر آن (value) را در has ذخیره می کند ، اگر دارای فرزند چپ یا راست باشد تابع را برای هریک از فرزندانش فراخوانی می کند.در آخر نیز has را بر می گرداند.
از کنار هم قرار دادن این کدها رشته ای از 0 و1 ها بوجود می آید که همان کد مورد نظر ماست، برای تبدیل این رشته به مجموعه ای از بایت ها نیاز به فرآیندی شبیه متود زیر داریم.

1
2
3
4
5
6
7
8
public static Byte toByte(String str) {
int io = 0;
for (int i = 0; i < str.length(); i++) {
io += Math.pow(2, i) * Byte.parseByte(str.charAt(str.length() - i - 1) + "");
}
return (byte) io;
}

این متود رشته ی str را که رشته ای به طول ۸ یا کمتر است را به یک بایت تبدیل می کند.
برای برگرداندن بایت به حالت رشته نیز بایستی تک تک بیت های بایت را چک کرده و صفر یا یک بودن آنها را تعیین کنیم،فرض کنید رشته کد تولیدی ما 0101001100 می باشد، برای ذخیره ی این کد به دو بایت حافظه نیاز داریم بایت اول برای ۸ رقم اول و بیت دوم برای دو رقم باقی مانده ، کار تبدیل کردن رشته به بایت کار ساده ایست ولی هنگام تبدیل بایت ها به رشته اگر طول رشته ی اولیه مضربی از ۸ نبوده باشد کار کمی دشوار است ، چون با خواندن آخرین بایت بجای ۸ رقم تعداد کمتری برگرداند برای این نیز نیازمند فرآیند دیگری هستیم. متود to‪_‬String این عمل را انجام میدهد، این متود overload شده و اگر یک رشته بعنوان ورودی به آن داده شود یک رشته بطول ۸ بر می گرداند ولی اگر علاوه بر رشته عددی مثل n را نیز به آن پاس کنیم فقط n رقم (n رقم پایین) بر می گرداند.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static String to_String(Byte byt) {
String tmp = Integer.toBinaryString(byt);
if (tmp.length() > 8) {
tmp = tmp.substring(24);
}
while (tmp.length() < 8) {
tmp = "0" + tmp;
}
return tmp;
}
public static String to_String(Byte byt, int len) {
String tmp = Integer.toBinaryString(byt);
if (tmp.length() > 8) {
tmp = tmp.substring(24);
}
while (tmp.length() < 8) {
tmp = "0" + tmp;
}
return tmp.substring(8 - len);
}

اکنون با کنار هم قرار دادن اینها و جایگذاری کدها به جای کاراکترها، می توانیم یک فایل متنی را فشرده کرده و در فایلی کم حجم تر ذخیره کنیم، فقط لازم است به نکاتی توجه کنیم:
۱- همواره باید تعداد بیت های مفید بایت آخر را در فایل خروجی ذخیره کنیم تا هنگام بازگردانی فایل اشتباهی حاصل نشود.
۲- برای اینکه بخواهیم فایلی که به فرم بایتی ذخیره شده را به فایل متنی بارگردانی کنیم لازم سیستم کددهی اولیه که با آن فایل بایتی را ساخته ایم داشته باشم برای این کار می توانیم به ۲ روش عمل کنیم: الف) سیستم کددهی را بطور مستقیم در فایلی بایتی ذخیره کنیم. ب) هر کاراکتر را با فراوانی آن در فایل بایتی ذخیره کنیم و هنگام بازگردانی دوباره درخت هافمن را ساخته و سیستم کددهی را دوباره بدست آوریم.

برگرفته از:

Introduction to Algorithms, Second Edition

راهنما نصب دروپال در لوکال هاست

دروپال یکی از محبوب ترین سایت سازها (سیستم های مدیریت محتوا) موجود می باشد که یه زبان PHP گسترش یافته و قدرت فراوانی در زمینه مدیریت سایت ها و سرویس های تحت وب دارد، سایت های بزرگی همچون ubuntu.com نیز از دروپال بهره می برند.
نصب ، راه اندازی و گسترش دروپال بسیار ساده می باشد و شما کافی است اندک آشنایی با HTML, CSS و PHP داشته باشید تا بتوانید با دروپال وب سایتی قدرتمند برای خود یا دیگران بسازید.
در اینجا به تشریح مراحل نصب نصخه 6 دروپال بروی کامپیوتر شخصی می پردازیم.
نکته: در این آموزش فرض بر این است که شما نرم افزار xampp را نصب کرده و user و password پایگاه داده شما root می باشد.
فایل نصب دروپال را از آدرس زیر دانلود کرده و آن را درفولدر htdocs درون برنامه xampp کپی کرده و همانجا extract می کنیم.


پس از باز کردن فایل زیپ فولدر وارد فولدر drupal-6.22/sites/default شده و فولدری به نام files درون آن ایجاد می کنیم. درون این فولدر فایلی به نام default.settings.php وجود دارد، یک کپی از این فایل ساخته و نام فایل کپی شده را settings.php می گذاریم.

حال دروپال آماده نصب است، مرورگر خود را باز کرده و به آدرس http://127.0.0.1/drupal-6.22 میرویم، می بینیم که صفحه اولیه نصب دروپال نمایش داده می شود. (توجه داشته باشید که سرور xampp در حال اجرا باشد)

با انتخاب لینک Install Drupal in English نصب دروپال آغاز می شود:


آموزش نصب دروپال

در این مرحله می بایست یک پایگاه داده جهت ذخیره سازی داده های دروپال مشخص کنیم بدین منظور صفحه ای جدید باز کرده و به آدرس http://127.0.0.1/phpmyadmin می رویم در صفحه باز شده در فرم Create new database نام مورد نظر خود را برای پایگاه داده وارد کرده و دکمه ی Create را انتخاب می کنیم.


آموزش نصب دروپال

سپس در فرم نصب دروپال database name را وارد می کنیم، همان نامی که برای پایگاه داده انتخاب کردیم.
Database username و database password را root و root وارد می کنیم. در قسمت Advanced option تنظیماتی وجود دارد. در صورتی که بخواهیم به پایگاه داده ای بر روی یک سرور خارجی وصل شویم می بایست دو بخش اول را تغییر دهیم، یعنی database host و database port.
Table prefix به ما این امکان را می دهد که برای جداول پایگاه داده هود پیشوند انتخاب کنیم، این امکان باعث افزایش امنیت شده و هکرها نمی توانند براحتی نام جداول پایگاه داده شما را پیدا کنند.
پس از اتمام روی گزینه Save and Continue کلیک می کنیم و به مرحله بعد می رویم.


آموزش نصب دروپال

در این مرحله نام وب سایت ، آدرس پست الکترونیکی سایت ، نام کاربری مدیر سایت، آدرس پست الکترونیکی ادمین و رمز عبور مدیر سایت را وارد می کنیم. در بخش Server settings نیز زمان سرور (فاصله از ساعت معیار) ، بروز رسانی خودکار و clean بودن یا نبودن آدرس های دروپال را مشخص می کنیم.
در دروپال بصورت پیش فرض آدرس ها بصورت site.com/?q=/content/address نمایش داده می شوند، clean urls به شما این امکان را می دهد که آدرس ها را بصورت تمیزتر و ساده تر نمایش دهید، یعنی اگر clean url فعال باشد همان آدرس فوق بصورت site.com/content/address نمایش داده می شود که ساده تر و تمیزتر می باشد.
پس از تکمیل روی گزینه Save and Continue کلیک می کنیم و به مرحله بعد می رویم و بروی گزینه your new site کلیک می کنیم و کار تمام است و صفحه نخست دروپال نمایش داده می شود.

درآمدی بر گرافیک در جاوا - کتابخانه Swing

کتابخانه ی Swing جاوا یکی از قدرتمندترین ابزارهای ایجاد واسط گرافیکی (GUI) برای برنامه های شماست، این ابزار قدرتمند به شما این امکان را میدهد تا براحتی رابط گرافیکی مناسب و دلخواه برای برنامه های خود بسازید.

ایجاد یک محیط گرافیکی با استفاده از این کتابخانه ، تفاوت چندانی با نوشتن یک برنامه ی ساده در جاوا ندارد، شما براحتی می توانید با استفاده از کلاس های موجود در کتابخانه ی Swing پنجره ای شبیه آنچه هرروز در ویندوز می بینید بسازید.



ایجاد یک فریم خالی:

برای ایجاد یک فریم به دو صورت می توان عمل کرد، که این دو روش فقط در جزئیات با هم متفاوت هستند . روش کلی کار در هر دو حالت یکی است.

روش اول: در این روش مستقیما از کلاس JFrame (یکی از کلاس های موجود در کتابخانه Swing)، شئ ساخته و تمام کارهای خود را روی آن انجام می دهیم.

1
2
JFrame myFrame = new JFrame();

حال بایستی اندازه ی فریمی که ساخته ایم را مشخص کنیم ، برای این کار از متود setSize کلاس JFrame استفاده می کنیم.<br />
1
2
3
4
int frameWidth = 400;
int frameHeight = 400;
myFrame.setSize( frameWidth , frameHeight );
در جاوا بطور پیش فرض هیچ عملی (Action) برای دکمه ی خروج کناری پنجره ها در نظر نمی گیرد، پس ما بایستی خود، عمل خروج را برای این دکمه تعریف بکنیم. برای این منظور ما ساده ترین راه را پیش میگیریم. با افزودن خط زیر به برنامه ی خود ،با فشرده شدن دکمه ی خروج بالای فریم برنامه ی شما نیز خاتمه می یابد.<br />
1
2
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
با استفاده از متود setTitle می توانید عنوان فریم پنجره ی خود را تغییر دهید.<br />
1
2
myFrame.setTitle( "Swing Tutorial" );
برای مشاهده ی این فریم باید آن را فعال کنیم ، برای این منظور از متود SetVisible استفاده کرده و آرگومان آن را مقدار true قرار می دهیم.<br />
1
2
myFrame.setVisible( true );
کد ما در نهایت کلاسی به این شکل خواهیم داشت:<br /> <br />
1
2
3
4
5
6
7
8
9
10
11
12
public class TestFrame{
public static void main(String args[]){
JFrame myFrame = new JFrame();
int frameWidth = 400;
int frameHeight = 400;
myFrame.setSize( frameWidth , frameHeight );
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myFrame.setTitle( "Swing Tutorial" );
myFrame.setVisible( true );
}
}
با این کار ما یک فریم خالی با اندازه ی ۴۰۰&times;۴۰۰ ایجاد کرده ایم که می تواند متن ، تصویر یا دیگر اطلاعات ما را در خود بگنجاند، برای قرار دادن دکمه ها و&hellip; کافیست کد های مربوط را قبل از فعال کردن فریم بنویسیم.<br /> روش دوم:در این روش کلاسی طراحی خواهیم کرد که از JFrame ارث بری داشته باشد و سپس کلیه ی عملیات خود را در این کلاس انجام می دهیم و در نهایت در متود main از این کلاس شئ میسازیم.<br /> در حقیقت این کلاس همان JFrame است که ما آن را بطور دلخواه شخصی سازی کرده ایم.<br />
1
2
3
4
5
6
7
8
9
10
11
12
public class MyFrame extends JFrame{
public MyFrame(){
this.setSize( 400 , 400 );
this.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
this.setTitle( "Swing Tutorial" );
this.setVisible( true );
}
public static void main(String[] args){
new MyFrame();
}
}
روش دوم راه مناسب تری برای ایجاد گرافیک در جاوا است ، هرچند استفاده از روش اول نیز کاملا صحیح می باشد.<br /> <br /> کنترل گرها:(Layout Managers)<br /> کلاس هایی هستند که وظیفه ی کنترل موقیت، اندازه و هم ترازی و جلو گیری از برهم کنش و روی هم افتادن اجزا را برعهده دارند. جاوا کنترل گرها را از انواع ساده ای همچون FlowLayout , BoxLayout و GridLayout و انواع ویژه که کاربرد خاصی دارند همچون BorderLayout و CardLayout تا کنترل کننده های قابل انعطافی همچون GridBagLayout را برای تنظیم اجزا فراهم می کند.<br /> FlowLayout<br /> برای تنطیم مولفه ها در ردیف های افقی مورد استفاده قرار می گیرد، با استفاده از FlowLayout مولفه ها بصورت خودکار در یک ردیف قرار می گیرد و در صورت نیاز ده ردیف های بعدی منتقل می شوند<br />
1
2
setLayout(new FlowLayout());
GridLayout<br /> برای تنطیم مولفه ها در ردیف و ستون های هم اندازه و منظم مورد استفاده قرار می گیرد.<br />
1
2
setLayout(new GridLayout(rows, cols, x-spacing, y-spacing));
BorderLayout<br /> مولفه ها را حداکثر در پنج ناحیه : شمال، جنوب ،شرق ،غرب و مرکز تراز می کند.<br />
1
2
3
setLayout(new BorderLayout());
add( Component , BorderLayout.CENTER);
<br /> مولفه ها:(Components)<br /> کتابخانه Swing شامل کلاس هایی است که تمام نیازهای شما را برای ایجاد محیط دلخواه خودتان رفع میکند،اینها مولفه های اصلی فریم ها ی شما می باشند.<br /> javax.swing.JLabel<br /> فضایی برای نمایش متن های کوچک ، عکس یا هر دو ایجاد میکند، از Label فقط برای نمایش اطلاعات استفاده می شود و نمی توان از طریق آنها از کاربر ورودی گرفت.<br /> شما می توانید نحوه ی نمایش متن و تصویر با استفاده تراز بندی افقی(Horizontal Alignment) و عمودی(Vertical Alignment) تنظیم کنید، همچنین شما می توانید با استفاده از متود setIconTextDap فاصله ی بین تصویر و متن رو بر حسب پیکسل تعیین کنید.(این فاصله بطور پیش فرض ۴ پیکسل می باشد)<br />
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import java.awt.*;
import javax.swing.*;
public class JLabelDemo extends JFrame {
public JLabelDemo() {
JLabel Label1 = new JLabel("A Simple Label");
JLabel Label2 = new JLabel("A Label with LEFT alignment", JLabel.LEFT);
JLabel Label3 = new JLabel("A Label with CENTER alignment",
JLabel.CENTER);
JLabel Label4 = new JLabel("A Label with RIGHT alignment", JLabel.RIGHT);
JLabel Label5 = new JLabel("A Label with LEADING alignment",
JLabel.LEADING);
JLabel Label6 = new JLabel("A Label with TRAILING alignment",
JLabel.TRAILING);
JLabel Label7 = new JLabel();
this.setLayout(new GridLayout(7, 1));
this.add(Label1);
this.add(Label2);
this.add(Label3);
this.add(Label4);
this.add(Label5);
this.add(Label6);
this.add(Label7);
this.setBackground(Color.yellow);
Label7.setHorizontalAlignment(JLabel.CENTER);
Label7.setForeground(Color.blue);
Label7.setText("Text added with setText");
this.setSize(400, 400);
this.setVisible(true);
}
public static void main(String[] args) {
new JLabelDemo();
}
}

JLabelDemo



javax.swing.JButton

‎ دکمه ها همانطوری که شما تصور می کنید، مولفه هایی هستند که کابر می تواند با فشار دادن آنها جزئیات برنامه را تغییر دهد، دکمه ها می توانند هم متن و هم تصویر را نمایش دهند.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.awt.*;
import javax.swing.*;
public class JButtonDemo {
public static void main(String[] a) {
JFrame f = new JFrame("JButton Demo");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton b = new JButton("This is a JButton");
f.getContentPane().add(b);
f.setSize(200,100);
f.setVisible(true);
}
}



JButtonDemo

javax.swing.JCheckBox

چک باکس مولفه ای است که دو حالت انتخاب شده و نشده دارد.

چک باکس کنترل گری است که به شما این امکان را میدهد که بیش از یک ویژگی را در یک زمان انتخاب کنید.

1
2
3
4
5
6
7
8
9
10
11
12
13
import javax.swing.*;
public class JCheckboxDemo {
public static void main(String[] args){
JFrame frame = new JFrame("JCheck Box Demo");
JCheckBox chk = new JCheckBox("This is the JCheckBox");
frame.add(chk);
frame.setSize(200, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}



JCheckboxDemo

javax.swing.JTextField

‎فضایی برای نمایش و ویرایش متن های تک خطی ایجاد می کند.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import javax.swing.*;
public class TextFieldTest extends JFrame{
public TextFieldTest(){
JTextField tf = new JTextField();
add(tf);
tf.setText("This ia a TextField");
setSize(200, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
new TextFieldTest();
}
}



JTextFieldDemo

javax.swing.JTextArea

‎فضایی برای نمایش و ویرایش متن های چند خطی ایجاد می کند، شما می توانید با استفاده از متود های مختلف موجود در این کلاس متن را از کابر دریافت ، ویرایش کرده و نمایش دهید.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.awt.*;
import javax.swing.*;
public class TextAreaTest extends JFrame{
public TextAreaTest(){
JTextArea ta = new JTextArea("First text");
ta.append("Appended text");
ta.setForeground(Color.green);
add(ta);
setSize(200, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
new TextAreaTest();
}
}



JTextAreaDemo

مستند سازی در جاوا

کامنت ها یا توضیحات موجود در بین کدهای جاوا توضیجاتی هستند در مورد نحوه ی پیاده سازی کدها، توضیحاتی که خواننده آن قطعه بکمک آن می تواند از چگونگی عملکرد آن اطلاع حاصل می کند. در جاوا نوع دیگری از کامنت ها وجود دارند که به عنوان کامنت های مستند (Documentation Comments) شناخته میشوند که توضیحاتی هستند برای استفاده کننده کد شما، تا بداند متود یا کلاس یا فیلد شما چه وظیفه ای دارد و چه کاری را به چه نحو انجام می دهد . توضیحات مستند، توضیحات همانند عادی هستند که بجای / با **/ شروع می شوند و با / خاتمه می یابند و برخلاف توضیحات معمولی دارای ساختار خاصی می باشند. توضیحات مستند مستقیما قبل از کلاس، اینترفیس، متود، یا فیلد می آیند و حاوی مستنداتی در مورد آن کلاس، اینترفیس، متود یا فیلد هستند. در مستندها می توان از کدهای ساده ی HTML و تعدادی تگ های خاص برای کارهای خاص استفاده کرد.





ساختار توضیحات مستند



توضیحات آغازی : بدنه ی یک مستند بایستی با جمله ای خلاصه در مورد کلاس، اینترفیس، متود یا فیلد آغاز گردد.این جمله ممکن است بتنهایی بعنوان خلاصه نمایش داده شود پس بایستی مستقل باشد. مستند میتواند با هر تعداد جمله یا عبارت مربوط ادامه پیدا کند.



توضیحات خاص : پس از آن مستند می تواند حاوی پاراگراف هایی باشد که هر کدام با واژه ای خاص مانند :@author , @param یا @returns آغاز می شوند و حاوی اطلاعات خاصی در مورد کلاس، اینترفیس، متود یا فیلد هستند.

- همانظور که قبلا گفیتم در تو ضیحات ابتدایی می توان از برخی از تگ های ساده ی HTML استقاده کرد.مثل <I> برای تاکید، <CODE> برای اسم کلاس، اینترفیس، متود یا فیلد و <PRE> برای نمونه کدهای چند خطی. همچنین می تواند شامل تگ های <P> برای ایجاد پاراگراف جدید و <UL>, <LI> و تگ های وابسته برای نمایش لیست ها و ساختارهای مشابه باشند. در مستند نباید از تگ هایی مثل <H2> یا <HR> باشند.

- از بکار بردن تگ <A> برای ایجاد لینک خودداری کنید و بجای آن از تگ {link@} استفاده کنید که برخلاف دیگر تگ های ویژه می تواند در هر جایی آن را به کار برد. تگ {link@} به شما این امکان ایجاد لینک به کلاسها، اینترفیس ها متودها و فیلد ها را بدون دانستن ساختار HTML میدهد.



تگ های ویژه



همانطور که پیش از این نیز گفتیم در مستند ها می توان از تگ های ویژه ای استفاده کرد که هرکدام از آنها با @ آغاز می شوند. این تگ ها به شما این امکان را می دهند که اطلاعات خاصی را بصورت استاندارد نمایش دهید.



@author name



برای نمایش اسم نویسنده بکار می رود.این تگ بایستی برای هر کلاس یا اینترفیس استفاده شود، ولی نباید این تگ را برای یک متود یا فیلد بصورت مجزا بکار برد. اگر کلاسی دارای چندین نویسنده باشد از چندین تگ در سطر های مجزا استفاده نمایید.


1
2
3
@author David Flanagan
@author Paula Ferguson


اسامی نویسندگان را بترتیب و نویسنده اصلی را در اول بنویسید، اگر نویسنده ی نامشخص باشد می توانید از unascribed استفاده کنید.



@version text



این تگ شامل متنی مشخص است.

1
2
@version 1.32, 08/26/99


این تگ بایستی برای هر کلاس و اینترفیسی بکار رود ولی نمی تواند برای متودها یا فیلدها بکار رود.



@param parameter-name description



پارامتر های مشخص شده را با توضیحات آنها در بخش Parameters متود مورد نظر نمایش میدهد. مستند های متود ها با سازنده ها باید شامل یک تک @param برای هر پارامتر ورودی باشند. ای تگ ها باید به همان ترتیب ورودی های متود نوشته شده باشند. این تگ نمی تواند برای کلاس، اینترفیس یا فیلد بکار رود.

1
2
3
@param o the object to insert
@param index the position to insert it at


@return description



بخش Returns را که حاوی توضیحات مشخص شده است را اضافه می کند. این تگ باید برای هر متودی بکار رود مگر اینکه متود void بوده یا سازنده باشد. این تگ نباید برای کلاس، اینترفیس یا فیلد بکار رود.

1
2
3
4
@‬return `true` if the insertion is successful, or
‏ `false` if the list already contains the
‏ specified object.


@exception full-classname description



بخش Throws را که حاوی exception و توضیح مشخص شده است را به مستند اضافه می کند. این تگ بایستی برای هر exception چک شده در شرط throws در متود یا سازنده نوشته شود. بعنوان مثال:

1
2
3
@‬exception java.io.FileNotFoundException
‏ If the specified file could not be found


از این تگ می توان برای exception هایی که چک نشده اند ولی احتمال وقوع انها وجود دارند نیز استفاده کرد. اگر متودی بیش از یک exception بتواند ایجاد کند برای هر یک از آنها یک تگ نوشته وآنها را بترتیب الفبا مرتب کنید. این تگ نمی تواند برای کلاس، اینترفیس یا فیلد بکار رود. تگ @throws نیز همانند تگ @exception است.



@throws full-classname description



این تگ مانند تگ @exception میباشد. در نسخه ی ۱.۲ جاوا طراحی شده.



@see reference



این تگ مرجع های مشخص شده را در بخش See Also به مستند شما اضافه میکند. reference می تواند در مدل های مختلفی داشته باشد. اگر با quote character (علامت " ' ") آغاز شود به معنی نام کتاب یا دیگر متن های مرجع می باشد. اگر با < آغاز شود این تگ همانند تگ <a> در HTML عمل کرده به لینکی به مرجع شما خواهد بود.

اگر reference با " ' " با " < " آغاز نشود این تگ به فرم کلی زیر است

1
2
@see feature label


که در این صورت متن label نمایش داده شده و با feature مشخص شده اشاره می کند، اگر label نوشته نشود اسم feature بجای ان نمایش داده می شود.

feature می تواند به یک پکیج، کلاس، اینترفیس، متود، سازنده یا فیلد اشاره کند با استفاده از فرم های زیر:



pkgname

ارجاع به پکیج یاد نوشته شده

1
2
@see java.lang.reflect


pkgname.classname

ارجاع به یک کلاس یا اینترفیس با اسم کامل (اسم پکیج ها) آن.

1
2
@see java.util.List


classname

ارجاع به یک کلاس یا اینترفیس بدون مشخص کردن پکیج آن

1
2
@see List


جاوا خودبخود دنبال این کلاس در بین پکیج ها یا کلاس های import شده می گردد.

classneme#methodname

ارجاع به یک متود یا سازنده در در یک کلاس مشخص شده.

1
2
3
@see java.io.InputStream#reset
@see inputStream#close


این روش مبهم است اگر متود مورد نظر overload شده باشد یا کلای دارای فیلدی به این اسم باشد

classname#methodname(paramtypes)

ارجاع به یک متود یا سازنده با مشخص کردن نوع ورودی های آن، این مدل زمانی مفید است که مرجع ما یک متود overload شده باشد.

1
2
‪@‬see InputStream‪#‬read‪(‬byte‪[],‬ int‪,‬ int‪)


#methodname

ارجاع به یک متود overload نشده یا سازنده در کلاس با اینترفیس فعلی یا کلاس های شامل یا در سوپرکلاس ها و سوپر اینترفیس های کلاس یا اینترفیس فعلی.

1
2
@see #setBackgroundColor


#methodname(paramtypes)

ارجاع به یک متود یا سازنده در کلاس با اینترفیس فعلی یا کلاس های شامل یا در سوپرکلاس ها و سوپر اینترفیس های کلاس یا اینترفیس فعلی ، با این فرم می تواند به یک متود overload شده نیز ارجاع داد.

1
2
@see #setPosition(int, int)


classname#fieldname

ارجاع به یک فیلد در کلاس مشخص شده

1
2
@see java.io.BufferredInputStream#buf


#fieldname

ارجاع به یک فیلد در کلاس با اینترفیس فعلی یا کلاس های شامل یا در سوپرکلاس ها و سوپر اینترفیس های کلاس یا اینترفیس فعلی.

1
2
@see #x


{@link reference}



این تگ همانند تگ @see کار می کند با این تفاوت که میتواند در همه جا بکار برده شود و محدود به جای خاصی نیست.از این تگ می توان در توضیحات ابتدایی و یا حتی در تگ های @param، @returns ، @exception ،@deprecated استفاده کرد. اکولاد ها برای مشخص کردن این تگ الزامی هستند.

1
2
3
4
@‬param regexp The regular expression to search for. This string
‏ argument must follow the syntax rules described for
‏ {‪@‬link RegExpParser}.


@deprecated explanation



از نسخه ی ۱.۱ جاوا این تگ نشان دهنده ی کلاس، اینترفیس، متود یا فیلدی است که استفاده از آن توصیه نمی شود . این تگ متن explanation را در بخش Deprecated در مستند شما نمایش میدهد. این متن باید مشخص کند که چه زمانی استفاده از کلاس یا اعضای آن توصیه نمی شود و در صورت امکان جایگزینی برای آن معرفی کرده و لینکی به آن موجود باشد.

1
2
3
@‬deprecated As of Version 3.0, this method is replaced
‏ by {‪@‬link #setColor}.


هر چند کامنت ها هنگام کامپایل از دید کامدایلر در نظر گرفته نمی شوند ولی در صورت وجود این تگ کامپایلر کلاس را توصیه نشده علامت گذاری میکند. این باعث ی شود تا به کاربرانی که از این کلاس استفاده می کنند هشدار داده شود.



@since version



مشخص می کند چه زمانی کلاس، اینترفیس، متود یا فیلد چه زمانی به مجموعه افزوده شده است. version مشخص کننده ی شماره ی ورژن با مشخصه ی آن است.

1
2
@since JNUT 3.0


هر کلاس یا اینترفیس می بایست دارای تگ @since باشد و هر متودی که بعد از گسترش اولیه ی کلاس به افزوده می شود نیز باید دارای این تگ باشد.



و چهار تگ دیگر که از توضیح آنان می گذریم.


1
2
3
4
5
@‬serial description
‏‪@‬serialField name type description
‏‪@‬serialData description
‏‪@‬beaninfo info




مستند سازی برای پکیج ها


کامنت های مستند برای کلاس ها، اینترفیس ها، متودها، سازنده ها و فیلد ها در بین کد های جاوا و دقیقا قبل از تعریف آنها نوشته می شوند. javadoc همچنین می تواند مستندات خلاصه پکیج ها را خوانده و نمایش دهد. اگر پکیجی در یک فولدر تعریف شده باشد نه در یک فایل سورس کد، javadoc دنبال مستند پکیج در فایل package.html در فولدر حاوی سورس کد های کلاس های موجود در پکیج می گردد.

‏package.html باید شامل مستندهای پکیج با استفاده از کدهای ساده ی HTML باشد. همچنین می تواند شامل تگ های @see , @link, @deprecated و @since باشد. چون package.html فایل سورس کد جاوا نیست پس برای تعریف مستند نیازی به کامنت های جاوا نیست (نباید بین / و */ قرار بگیرد) و همچنین در تگ های @see و @link باید نام کلاس را بصورت کامل (همراه با نام پکیج ها ) نوشت.

به منظور تعریف package.html برای هر پکیج ، شما می توانید از مستندسازی سطح بالا برای پکیج های متعدد استفاده کنید . با تعریف overview.html در ریشه ی درخت پکیج ها.



کامنت مستند سازنده کلاس FileInputStream

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
* Creates a `FileInputStream` by
* opening a connection to an actual file,
* the file named by the path name `name`
* in the file system. A new `FileDescriptor`
* object is created to represent this file
* connection.
* <p>
* First, if there is a security
* manager, its `checkRead` method
* is called with the `name` argument
* as its argument.
* <p>
* If the named file does not exist, is a directory rather than a regular
* file, or for some other reason cannot be opened for reading then a
* `FileNotFoundException` is thrown.
*
* @param name the system-dependent file name.
* @exception FileNotFoundException if the file does not exist,
* is a directory rather than a regular file,
* or for some other reason cannot be opened for
* reading.
* @exception SecurityException if a security manager exists and its
* `checkRead` method denies read access
* to the file.
* @see java.lang.SecurityManager#checkRead(java.lang.String)
*/
public FileInputStream(String name) throws FileNotFoundException {
this(name != null ? new File(name) : null);
}


برگرفته از:

JAVA in a NUTSHELL Third Edition. by David Flanagan

ایجاد لینک ویرایش سریع کنار نام پست ها در دروپال

ویرایش پست ها یکی از خسته کننده ترین کارها برای هر مدیر سایتی می باشد، زیرا نیازمند زمان زیادی برای خواندن و ویرایش کردن پست می باشد. حال فرض کنید می خواهید ۱۰ پست را در سایت خود ویرایش کنید، در این صورت مجبور هستید تک تک پست ها را باز کرده به بخش ویرایش رفته و آنها را ویرایش کنید، برای راحتی و سرعت بیشتر براحتی می توان لینکی کمکی کنار عنوان پست ایجاد کرد که با کلیک کردن برروی به بخش ویرایش برویم. راهی ساده و کارا برای ویرایش پست ها.
برای این کار ما از سیستم قالب بندی دروپال کمک می گیریم، به فولدر قالب های سایت خود در آدری sites/all/themes رفته و وارد فولدر قالب خود شوید، اگر دقت کنید فایلی به نام node.tpl.php در این فولدر مشاهده می کنید. آن را ویرایش کرده و متن زیر را در آن بیابید:

1
2
3
4
<?php if ($page == 0): ?>
<h2 class="title"><a href="<?php print $node_url; ?>" title="<?php print $title; ?>"><?php print $title; ?></a></h2>
<?php endif; ?>

ممکن است کد فوق در فایل شما کمی متفاوت باشد، دلیل آن تفاوت در کد هایی است که قالب های مختلف استفاده می کنند، اگر چنین بود دنبال بخش title در فایل بگردید و کد زیر را بالای آن اضافه کنید

1
2
3
4
<?php if (user_access('administer nodes')): ?>
<?php print l('Edit', 'node/' . $node->nid . '/edit'); ?>
<?php endif; ?>

فایل را دخیره کرده و سری به سایت بزنید می بینید که لینکی با عنوان Edit درست بالای نام پستتان نمایش داده می شود که با کلیل روی آن به بخش ویرایش آن فرستاده می شوید.
جال کد را بررسی کنیم:
سطر اول کد بررسی می کند که آیا کاربری که در حال مشاهده وست می باشد دسترسی به بخش ویرایش دارد یا خیر و در صورت وجود دسترسی سطر های بعدی اجرا می شوند.( تابع user_access دسترسی کاربر به یک سطح دسترسی خاص را بررسی می کند) پس نگران نباشید نمایش لینک برای کاربران نباشید زیرا در صورتی که شما به کاربری اجازه ویرایش نداده اید این لینک برای وی نمایش داده نمی شود.
سطر دوم نیز بااستفاده از تابع تعریف شده در دروپال یعنی l لینکی ایجاد می کنید که به بخش ویرایش اشاره می کند.
سطر آخر نیز پایان کننده شرط موجود در سطر اول می باشد.
بدین صورت ساده و راحت لینکی سریع برای ویرایش مطالب سایت خود خواهید داشت.


لینک ویرایش سریع در دروپال

ارجاع لینک آیکون سایت به مکانی دیگر بوسیله فایل .htaccess

فاو آیکون ها تصاویر کوچکی هستند که در گوشه نوار آدرس مرورگر های نمایش داده می شوند و یکی از اجزا جدایی ناپذیر سایت های امروزی می باشند.




اگر شما بخواهید سایت خود آیکون تعریف کنید، ساده ترین راه تغییر ایجاد تگ link درون head صفحه مورد نظر می باشد. مثل کد زیر:
1
<link rel="shortcut icon" href="/images/favicon.ico" type="image/x-icon">


با این کار مرورگر ها آیکون سایت شما را درست تشخیص داده و نمایش می دهند (همانند عکس نخست) ولی اگر آیکون شما در جایی غیر از ریشه سایت شما باشد یعنی آدرس ایکون شما چیزی غیر از http://site.com/favicon.ico باشد، موتور جست جو ها، شبکه های اجتماعی و سایت های دیگر (هنگام لینک کردن سایت شما) آیکون شما را تشخیص نداده و نمایش نمی دهند، به تصویر زیر توجه کنید.



همانطور که مشاهده می کنید آیکون نمایش داده نشده است، برای تصحیح این کار خطا می بایست آیکون ما در دایرکتوری اصلی سایت و با نام favicon.ico ذخیره شود. ولی اگر دوست نداشتید چنین باشد یا با استفاده از سیستم های مدیریت محتوا چند سایت ساخته بودید که در صورت قرار دادن آیکون در ریشه تمام سایت ها از آن استفاده می کردند چه باید کرد. برای حل ای مشکل می توان از فایل htacces موجود در هاست استفاده کرد.
htaccess فایلی است در ریشه هاست شما که شما بوسیله آن می توانید کنترلی بر تنظیمات سایت خود همانند کنترل دسترسی دایرکتوری های سایت و پذیرش یا لغو دسترسی یک IP خاص به سایت انجام دهید.یکی از کنترل هایی که بوسیله این فایل می توان انجام داد تنظیم آدرس ها و ارجاع آنهاست، که قصد ما در اینجا ارجاع آدرس آیکون به یک آدرس دیگر است. نحوه کار بدین طور است که در صورت درخواست آیکون از ریشه سایت شما درخواست کننده به آدرس دیگری ارجاع داده می شود تا ایکون را از آن مکان دریافت کند.

1
2
3
RewriteEngine ON
RewriteCond %{HTTP_HOST} ^farnabaz\.4paye\.ir
RewriteRule ^favicon.ico$ /images/favicon.ico [L]

با وارد کردن کد فوق در فایل htaccess در هنگام در خواست آدرس http://farnabaz.ir/favicon.ico درخواست کننده به آدرس http://farnabaz.ir/images/favicon.ico ارجاع داده می شود و آیکون مورد نظر شما نمایش داده می شود.

و در نهایت موتور جست جو ها و دیگر سایت ها آیکون سایت شما را بدرست نمایش می دهند.



سرآغاز

بالاخره بعد مدتها که قصد داشتم بلاگی درست کنم، اینجا رو تاسیس کردم.
این اولین پستی که اینجا می زارم ، اولین پست تو اولین روز سال ۹۱، همونطور هم که از شکلش معلومه قرار نیست توش چیزای عشقولانه بنویسم :دی قراره مطالب و آموخته های خودم اینجا بنویسم، اگه نظری ایده ای چیزی داشتین دریغ نکنین.