بدست آوردن کشور یک آدرس IP به کمک MySQL

سلام :)

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

IP چیست؟

به نقل از صفحه «نشانی پروتکل اینترنت» در ویکی پدیا، دانشنامه آزاد:

نشانی پروتکل اینترنت (Internet Protocol Address) یا به اختصار نشانی آی‌پی (IP Address) نشانی‌ عددی است که به هریک از دستگاه ها و رایانه‌های متصل به شبکه ی رایانه ای که بر مبنای نمایه TCP/IP (از جمله اینترنت) کار می‌کند، اختصاص داده می‌شوند. پیام‌هایی که دیگر رایانه‌ها برای این رایانه می‌فرستند با این نشانه ی عددی همراه است و راه یاب های شبکه آن را مانند «نشانی گیرنده» در نامه‌های پستی تعبیر می‌کنند، تا بالاخره پیام به رابط شبکه رایانه مورد نظر برسد.

جدول پایگاه داده

من اطلاعات مربوط به محدوده آدرس های آی پی و کشور مرتبط با آنها در جدولی با نام ip_location ذخیره کرده ام. برای ایجاد این جدول دستور زیر را در خط فرمان MySQL وارد نمایید:

CREATE TABLE `ip_location` (
  `from_ip` int(15) DEFAULT NULL,
  `to_ip` int(15) DEFAULT NULL,
  `country` varchar(32) DEFAULT NULL,
  KEY `from_ip` (`from_ip`,`country`),
  KEY `to_ip` (`to_ip`,`country`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

مرحله بعد وارد کردن فهرست کشورها و محدوده آی پی های آن هاست. برای سادگی کار من یک خروجی (Dump) از دستور ایجاد جدول ip_location و اطلاعات موجود در آن تهیه کرده ام.
دریافت ip_location.sql با حجم 165KB
در صورتی که آشنایی با وارد کردن (import) چنین فایل هایی ندارید، پیشنهاد می کنم مطلب «راهنمای وارد کردن(import) و صادر کردن(export) در MySQL» را مطالعه کنید.

تابع getIpCountry

مرحله بعد تعریف تابعی برای محاسبه آدرس ۳۲ بیتی هر آی پی و مقایسه آن با محدوده های موجود در جدول ip_location است. برای تعریف این تابع دستورات زیر را در خط فرمان MySQL وارد کنید:

DELIMITER $$
CREATE FUNCTION getIpCountry(ip varchar(15)) RETURNS varchar(64)
BEGIN
 declare a tinyint unsigned;
 declare b tinyint unsigned;
 declare c tinyint unsigned;
 declare d tinyint unsigned;
 declare total bigint;
 declare result varchar(64);
 select substring_index(ip, '.', 1 ) into a;
 select substring_index(substring_index(ip , '.', 2 ),'.',-1) into b;
 select substring_index(substring_index(ip , '.', -2 ),'.',1) into c;
 select substring_index(ip, '.', -1 ) into d;
 set total := (a*256*256*256) + (b*256*256) + (c*256) + d;
 select SQL_CACHE country into result from ip_location where total between from_ip and to_ip limit 1;
 if (result is null) or (result = '') then
 set result := 'unknown';
 end if;
 return result;
 END$$
DELIMITER ;

بدست آوردن کشور

برای مشاهده کشور مرتبط با هر آی پی کافیست تا با استفاده از دستور SELECT تابع getIpCountry را فراخوانی نماییم. مانند:

mysql> SELECT getIpCountry('79.175.165.171');
+--------------------------------+
| getIpCountry('79.175.165.171') |
+--------------------------------+
| IRAN (ISLAMIC REPUBLIC OF)     |
+--------------------------------+
1 row in set (0.03 sec)

mysql> SELECT getIpCountry('4.2.2.4');
+-------------------------+
| getIpCountry('4.2.2.4') |
+-------------------------+
| UNITED STATES           |
+-------------------------+
1 row in set (0.00 sec)

ایده استفاده

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

پی نوشت

• این مطلب فقط برای آدرس های آی پی نسخه ۴ قابل استفاده است.

موفق باشید 8)

شروع کار با Google Maps API

سلام :)
خیلی از ما با سرویس نقشه های گوگل (Google Maps) آشنا هستیم. این سرویس در ویکی پدیا اینگونه تعریف شده است:

گوگل مپس (به انگلیسی: Google Maps، به معنی: نقشه‌های گوگل) یک محصول وب از شرکت گوگل است. در گوگل مپس، نقشه‌های دقیق و کاملی از زمین ارائه می‌گردد. گوگل مپس از فن‌آوری‌هایی چون Tele Atlas استفاده می‌کند.

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

در ادامه شروع کار با Google Maps JavaScript API V3 را با هم بررسی می کنیم.

برای استفاده از این سرویس در وب سایت یا وبلاگ خود، قبل از هر چیز باید کلید لازم برای ارتباط دامنه خود با گوگل را بدست بیاورید. البته این کلید فقط در برخی مواقع ضروری است. دریافت این key با ثبت نام در Google Maps API براحتی از طرف گوگل برای شما نمایش داده می شود.

ساده ترین نوع پیاده سازی (برنامه Hello, World)

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no"/>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
    <style type="text/css">
        html {
            height: 100%
        }
        body {
            height: 100%;
            margin: 0px;
            padding: 0px
        }
        #map_canvas {
            height: 100%
        }
    </style>
    <title>Google Maps JavaScript API v3 Example: Map Simple</title>
    <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
    <script type="text/javascript">
        function initialize() {
            var myLatlng = new google.maps.LatLng(35.695964, 51.417704);
            var myOptions = {
                zoom: 8,
                center: myLatlng,
                mapTypeId: google.maps.MapTypeId.ROADMAP
            }
            var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
        }
    </script>
</head>
<body onload="initialize()">
<div id="map_canvas"></div>
</body>
</html>

کدهای بالا خیلی گویا هستند ولی چند نکته برای توجه وجود دارد:
• با استفاده از <!DOCTYPE html> مشخص کردیم که مرورگر این صفحه را با استانداردهای html5 پردازش کند.
• کدهای مربوط به API را در داخل تگ script قرار دادیم.
• یک div با شناسه “map_canvas” برای نشان دادن نقشه در نظر گرفتیم.
• با استفاده از اتریبیوت onload تگ body، نقشه را initialize یا مقداردهی اولیه کردیم.
اطلاعات بیشتر در Google Maps Javascript API V3 Tutorial ارائه شده است.

همین مراحل برای نمایش نقشه زیر کافیست:

یکی از کارهایی که در حال انجام آن هستم، پیاده سازی مراکز پوشش اینترنت توسط یکی از شرکت های ارائه دهنده خدمات اینترنتیست. نمونه اولیه این کار را در زیر مشاهده می فرمایید:


Opacity: 25%   50%   100%

پیوندها

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

همیشه شاد، و موفق باشید ;)

وارد کردن اطلاعات از فایل به پایگاه داده MySQL

MySQL

سلام

قبلا در مورد انتقال اطلاعات در MySQL توضیح دادم. مطلب امروز در زمینه وارد کردن اطلاعات (import) از یک فایل متنی (txt, csv و …) به پایگاه داده MySQL می باشد. برای وارد کردن اطلاعات از یک فایل به پایگاه داده MySQL از دستور `LOAD DATA INFILE` استفاده می کنیم. شکل کلی این دستور به صورت زیر است:

mysql> LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'
    [REPLACE | IGNORE]
    INTO TABLE tbl_name
    [CHARACTER SET charset_name]
    [{FIELDS | COLUMNS}
        [TERMINATED BY 'string']
        [[OPTIONALLY] ENCLOSED BY 'char']
        [ESCAPED BY 'char']
    ]
    [LINES
        [STARTING BY 'string']
        [TERMINATED BY 'string']
    ]
    [IGNORE number LINES]
    [(col_name_or_user_var,...)]
    [SET col_name = expr,...]

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

mysql> LOAD DATA INFILE 'data.txt' INTO TABLE my_db.my_table;

در صورتی که جداکننده فیلد ها (FIELDS TERMINATED) را مشخص نکنید، MySQL مقدار پیش فرض \t که همان تب (Tab) هست را در نظر می گیرد. همچنین مقدار پیش فرض جداکننده خطوط \n که همان خط جدید (New Line) می باشد را در نظر می گیرد.
نکته
در صورتی که فایل شما دارای کاراکترهای UTF8 می باشد، علاوه بر تعریف جدول my_table با encoding مربوط به UTF8، باید نوع encoding را نیز در دستور LOAD DATE بنویسید. به صورت:

LOAD DATA INFILE 'data.txt' INTO TABLE my_db.my_table  character set UTF8;

در ادامه به بررسی یک مثال عملی در مورد واردکردن اطلاعات یک فایل CSV می پردازیم.

بررسی یک مثال عملی

فرض کنید فایلی به نام ip-list.csv با محتوای زیر دارید:

"1.0.0.0","1.0.0.255","16777216","16777471","AU","Australia"
"1.0.1.0","1.0.3.255","16777472","16778239","CN","China"
"1.0.4.0","1.0.7.255","16778240","16779263","AU","Australia"
"1.0.8.0","1.0.15.255","16779264","16781311","CN","China"
"1.0.16.0","1.0.31.255","16781312","16785407","JP","Japan"
"1.0.32.0","1.0.63.255","16785408","16793599","CN","China"
"1.0.64.0","1.0.127.255","16793600","16809983","JP","Japan"
"1.0.128.0","1.0.255.255","16809984","16842751","TH","Thailand"
"1.1.0.0","1.1.0.255","16842752","16843007","CN","China"
"1.1.1.0","1.1.1.255","16843008","16843263","AU","Australia"
"1.1.2.0","1.1.63.255","16843264","16859135","CN","China"
"1.1.64.0","1.1.127.255","16859136","16875519","JP","Japan"

این فایل تعدادی آی‌پی و کشور متناظر با آن‌ها را نمایش می دهد. برای وارد کردن این اطلاعات به پایگاه داده MySQL ابتدا باید جدولی مناسب با این داده‌ها بسازیم. برای آشنایی با انتخاب نوع مناسب داده می توانید به مطلب انواع داده در MySQL مراجعه نمایید. دستور زیر یک جدول به نام geoip ایجاد می کند:

mysql> CREATE TABLE `geoip` (
  `begin_ip` varchar(15) NOT NULL,
  `end_ip` varchar(15) NOT NULL,
  `begin_num` int(11) unsigned NOT NULL,
  `end_num` int(11) unsigned NOT NULL,
  `country` char(2) NOT NULL,
  `name` varchar(50) NOT NULL
) ENGINE=MyISAM;

دستور زیر این اطلاعات را از فایل ip-list.csv به جدول geoip وارد می‌کند. در صورت نیاز باید آدرس صحیح فایل را نیز در کنار نام آن درج کنید.

mysql> LOAD DATA INFILE 'ip-list.csv'
 INTO TABLE geoip
 FIELDS TERMINATED BY "," ENCLOSED BY '"';

Query OK, 12 rows affected (0.23 sec)
Records: 12  Deleted: 0  Skipped: 0  Warnings: 0

در دستور بالا مشخص کرده ایم که ستون‌ها با “,” جدا شده و محتوای هر ستون نیز در داخل دو " قرار دارد.

منابع

پی نوشت

  • متاسفانه بخش توسعه پایگاه داده MySQL با استناد به قانون جرایم رایانه ای فیلتر شده است. امیدوارم مسئولین تفکر و تعقل بیشتری نسبت به فیلتر کردن سایت ها داشته باشند.
  • این مطلب به بهانه فیلتر شدن بخش توسعه پایگاه داده MySQL نوشته شده است.

شاد باشید

خزنده وب (Web Crawler)

سلام :)

مطلب امروز ضمن آشنا کردن شما با Web crawler و معماری آن، سورس خزنده وب ساده ای به زبان جاوا را ارائه می دهد.

خزنده وب که بیشتر ما آن را با عنوان Web crawler می شناسیم به برنامه کامپیوتری اطلاق می شود که World Wide Web (وب جهان گستر) را به صورت مرتب و سلسله مراتبی بازدید کرده و اطلاعات آن را مورد پردازش قرار می دهد. از Web crawler ها با عناوین دیگری مانند ants, automatic indexers, bots, Web spiders و Web robots نیز یاد می شود.

کاربرد ها

۱- موتورهای جستجو

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

۲- مدیریت فنی وب سایت

مدیریت فنی وب سایت بخشی از کار این خزنده هاست که شامل یافتن لینک های شکسته (Broken Link) ، اعتبار سنجی (Validation) کدهای HTML، فایل های CSS و … می باشد.

۳- جمع آوری اطلاعات خاص

کاربرد دیگر خزنده های  وب جمع آوری اطلاعات خاصی مانند آدرس های ایمیل است. معمولا هدف از اینکار ارسال هرزنامه (spam) می باشد. برای جلوگیری از ثبت آدرس ایمیل توسط این خزنده ها، می توانید آدرس ایمیل خود را به صورت saeidREMOVEME AT جیمیل و یا موارد مشابه دیگر بنویسید.

نحوه کار

به صورت عمومی نحوه کار Web crawler ها به این صورت است که ابتدا لیستی از URL ها (آدرس های وب) که به عنوان seed شناخته می شوند را برای بازدید پردازش می کنند. هنگام پردازش این آدرس ها، لیست لینک ها و آدرس های موجود در صفحات آن ها را گردآوری کرده و به لیست ابتدایی اضافه می کنند. بقیه اطلاعات را نیز با توجه به نیاز و هدف خود ذخیره  و پردازش می نمایند.

معماری خزنده وب

خزنده وب بخش اصلی و مرکزی هر موتور جستجویی را تشکیل می دهد. به همین جهت الگوریتم و معماری آن ها به شدت مخفی نگه داشته می شود. با این وجود معماری سطح بالای (High-level architecture) آن به شکل زیر می باشد:

معماری سطح بالای یک خزنده وب استاندارد (عکس از ویکی پدیا)

عادی کردن آدرس (URL normalization)

منظور از عادی کردن آدرس، یکی کردن آدرس هایی می باشد که دارای خروجی یکسانی هستند. هدف از این کار جلوگیری از جمع آوری اطلاعات یکسان از چندین URL می باشد. URL normalization با نام URL canonicalization نیز شناخته می شود که همان فرآیند تغییر آدرس برای استاندارد شدن می باشد.

مراحل فرایند عادی کردن آدرس

• تبدیل آدرس به حروف کوچک

HTTP://www.Example.com/ → http://www.example.com/

• افزودن / به آدرس در صورت نیاز

http://www.example.com → http://www.example.com/

• حذف آدرس ایندکس دایرکتوری

http://www.example.com/default.asp → http://www.example.com/
http://www.example.com/a/index.html → http://www.example.com/a/

• بزرگ کردن حروف encode شده یا همان حروف بعد از علامت ٪

http://www.example.com/a%c2%b1b → http://www.example.com/a%C2%B1b

• حذف بخش زاید

http://www.example.com/bar.html#section1 → http://www.example.com/bar.html

• حذف و تبدیل آی پی به دامنه

http://208.77.188.166/ → http://www.example.com/

• اعمال محدودیت بر روی پروتکل ها مانند تبدیل https به http

https://www.example.com/ → http://www.example.com/

• حذف پورت پیش فرض (پورت ۸۰ به صورت پیش فرض برای http می باشد)

http://www.example.com:80/bar.html → http://www.example.com/bar.html

• حذف / های تکراری

http://www.example.com:80/bar.html → http://www.example.com/bar.html

• حذف . ها (dot-segments)

http://www.example.com/../a/b/../c/./d.html → http://www.example.com/a/c/d.html

• حذف www از اول دامنه

http://www.example.com/ → http://example.com/

• مرتب کردن متغییرهای صفحه فعال

http://www.example.com/display?lang=en&article=fred
 → http://www.example.com/display?article=fred〈=en

• حذف متغییرهای اختیاری از query-string

http://www.example.com/display?id=123&fakefoo=fakebar
 → http://www.example.com/display?id=123

• حذف متغییرهای پیش فرض از query-string

http://www.example.com/display?id=&sort=ascending
 → http://www.example.com/display

• حذف علامت ? هنگامی که query-string خالی باشد

http://www.example.com/display? → http://www.example.com/display

• استانداردکردن encoding کاراکترها

http://www.example.com/display?category=foo/bar+baz
 → http://www.example.com/display?category=foo%2Fbar%20baz

شناسایی خزنده وب

خزنده های وب معمولا با استفاده از فیلد User-agent داده HTTP request خود را معرفی می کنند. شما با استفاده از لاگ وب سرور خود می توانید لیست این Web crawler های را مشاهده کنید. فیلد User agent ممکن است شامل URL ای باشد که به سایت سازنده خزنده اشاره می کند.

Spambot ها و سایر خزنده های مخرب معمولا فیلد User agent را به صورت غیر واقعی با اطلاعاتی مانند نام یک مرورگر پر می کنند.

فایل robots.txt

این فایل برای دادن اطلاعات اولیه در زمینه وب سایت مورد پردازش به خزنده های وب استفاده می گردد. به عنوان مثال با این فایل می توانید دسترسی خزنده های وب به بعضی زیر شاخه ها محدود کنید. دستورات زیر در فایل robots.txt از دسترسی خزنده ها به دایرکتوری /tmp/ جلوگیری می کند:

User-agent: *
Disallow: /tmp/

* فایل robots.txt یک استاندارد می باشد. به همین جهت خزنده وب (معمولا خزنده مخرب) می تواند آن را نادیده بگیرد.

معروف ترین خزنده های وب

در زیر لیست معروف ترین خزنده های وب را مشاهده می کنید:

معروف ترین خزنده های متن باز

سورس خزنده وب به زبان جاوا

سایت sun در سال ۱۹۹۸ مقاله ای آموزشی با عنوان “Writing a Web Crawler in the Java Programming Language” را ارائه داد. در آن مقاله ضمن توضیح دادن Web crawler سورس برنامه آن نیز در اختیار عموم قرار گرفت. البته این برنامه خیلی ساده و در مرحله ابتدایی می باشد. شما باید با توجه به نیازهای خود آن را تغییر داده و مورد استفاده قرار دهید.

• دانلود سورس خزنده وب به زبان جاوا (لینک کمکی)

کاربرد خزنده وب برای من

برای سایت هایی که از نرم افزار های آماده مثل وردپرس استفاده نشده است و نیاز به موتور جستجو احساس می شد، با استفاده از خزنده ای که نوشتم، اطلاعات کل وب سایت مورد نظر را در داخل یک جدول در پایگاه داده ذخیره کردم. سپس توابعی برای جستجو بهینه بر روی داده ها در MySQL نوشتم و با استفاده از آن ها بخش جستجوی وب سایت مورد نظر را راه اندازی کردم. نمونه این جستجو ها در سایت های زیر فعال می باشد:

• داتک تله کام

• ارتباطات فرادانش سامان

منابع

موفق باشید ;)

انتقال اطلاعات در MySQL

سلام :)

یکی از مراحل انتقال اطلاعات یک پروژه مربوط به انتقال پایگاه های داده می باشد. برای اینکار روش های مختلفی وجود دارد ولی همه آنها ۲ مرحله مشابه دارند، Import و Export کردن. مرحله export کردن را می توان به عنوان درست کردن نسخه پشتیبان نیز در نظر گرفت.
با فرض اینکه پایگاه داده مورد استفاده MySQL می باشد، می توانید از دستورات زیر استفاده کنید:

Export

دستور mysqldump برای گرفتن خروجی از پایگاه داده استفاده می شود. به عنوان مثال:

$ mysqldump -umy_user -p -R my_database > export.sql

دستور بالا محتویات پایگاه داده my_database به همراه روتین های آن (پارامتر R) را در فایل export.sql ذخیره می کند.
در صورتی که پایگاه داده شما بر روی سرور قرار دارد می توانید با استفاده از پارامتر h و کاربر خودتان بر روی سرور مستقیم و بدون نیاز به ftp و ssh نسخه پشتیبان تهیه کنید:

$ mysqldump -umy_server_user -p -hserver_host -R my_database > export.sql

Import

برای وارد کردن اطلاعات از دستور mysql استفاده می کنیم:

$ mysql -umy_user -p my_database < export.sql

* به جهت علامت > توجه کنید.

ترکیب کردن Export و Import

برای ترکیب کردن این دو دستور از | استفاده می کنیم:

$ mysqldump -umy_user_1 -pmy_pass_1 -R my_database \
 | mysql -umy_user_2 -pmy_pass_2 my_database

*حداقل یکی از رمز عبورهای بالا (my_pass_1 یا my_pass_2) را باید وارد کنید.
البته Import کردن مستقیم از دستور Export خیلی جالب نیست. این دستور بیشتر زمانی کاربرد دارد که بخواهید یکی از جدول های پایگاه داده خود را بروز رسانی کنید:

$ mysqldump -umy_user -pmy_pass_1 -R my_database my_table \
 | mysql -umy_user -pmy_pass_2  my_database

دستور بالا ساختار و محتویات جدول my_table را بروزرسانی می کنید.

کاربرد دیگر ترکیب کردن Export و Import تهیه نسخه کاملا مشابه از پایگاه داده می باشد. دستورات زیر یک نسخه کاملا مشابه از پایگاه داده my_database با نام my_database_2 بر روی پایگاه داده ایجاد می کنید:

$ mysqladmin -umy_user -p create my_database_2
$ mysqldump -umy_user_1 -pmy_pass_1 -R my_database \
 | mysql -umy_user_2 -pmy_pass_2  my_database_2

برای اطلاعات بیشتر به لینک های زیر مراجعه کنید:

موفق باشید