<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های وصال دانشور</title>
        <link>https://virgool.io/feed/@vessaldaneshvar</link>
        <description>دانشجوی ارشد بهینه سازی، گیک ، فعال در حوزه تحلیل داده ، عاشق دنیای کامپیوتر ها</description>
        <language>fa</language>
        <pubDate>2026-06-16 11:12:04</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/72428/avatar/aRXjrq.png?height=120&amp;width=120</url>
            <title>وصال دانشور</title>
            <link>https://virgool.io/@vessaldaneshvar</link>
        </image>

                    <item>
                <title>رپلیکا دیتابیس - قسمت سوم - پستگرس</title>
                <link>https://virgool.io/@vessaldaneshvar/%D8%B1%D9%BE%D9%84%DB%8C%DA%A9%D8%A7-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-%D9%82%D8%B3%D9%85%D8%AA-%D8%B3%D9%88%D9%85-%D9%BE%D8%B3%D8%AA%DA%AF%D8%B1%D8%B3-eu3n7nc0xfbq</link>
                <description>سلامامیدوارم خوب باشید.اگر پست های قبلی رو ندیدید توصیه میکنم حتما یه سر بزنید که توی درک این پست بهتون کمک بکنه. https://virgool.io/@vessaldaneshvar/%D8%AA%D8%AC%D8%B1%D8%A8%D9%87-%D8%AC%D8%A7%D8%A8%D8%AC%D8%A7%DB%8C%DB%8C-%D9%BE%D8%B3%D8%AA%DA%AF%D8%B1%D8%B3-%D8%A8%D8%A7-%D8%B1%D9%BE%D9%84%DB%8C%DA%A9%D8%A7-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84-ayuvddolvrb1  https://virgool.io/@vessaldaneshvar/%D8%B1%D9%BE%D9%84%DB%8C%DA%A9%D8%A7-%D9%BE%D8%B3%D8%AA%DA%AF%D8%B1%D8%B3-%D9%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%88%D9%85-%D8%AA%D9%81%D8%A7%D9%88%D8%AA-sync-%D9%88-async-szepu7psjp8y مواردی که داخل این پست بررسی میکنیم.اضافه کردن sslسناریوی رفتن و برگشتن از رپلیکا به پرایمریلود بالانساضافه کردن sslگام اول تولید فایل های certificate هست که با openssl میسازیمشون# Generate the root CA key and certificate
openssl genpkey -algorithm RSA -out rootCA.key -pkeyopt rsa_keygen_bits:2048
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 -out rootCA.crt -subj &amp;quot/CN=My Root CA&amp;quot# Generate the server key and CSR (Certificate Signing Request)
openssl genpkey -algorithm RSA -out server.key -pkeyopt rsa_keygen_bits:2048
openssl req -new -key server.key -out server.csr -subj &amp;quot/CN=myserver.com&amp;quot# Sign the server CSR with the root CA certificate to get the server certificate
openssl x509 -req -in server.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out server.crt -days 365 -sha256بعد از ساختن فایل ها باید دسترسی فایل ها رو ادیت بکنیم.ما میخوایم از فایل های rootCA.crt و server.crt و server.key استفاده بکنیم.فایل server.key فقط باید دسترسی خوندن و نوشتن توسط یوزرش رو داشته باشه که میشه کد ۶۰۰ و دو فایل server.crt  و rootCA.crt علاوه بر اون باید دسترسی خوندن توسط بقیه رو هم داشته باشن که کدش میشه ۶۴۴.همچنین ما باید owner فایل ها رو هم درست بکنیم . اگر داخل کانتینتر بخوایم استفاده بکنیم از یوزر postgres چون استفاده میشه باید فایل ها رو برای postgres بکنیم.من این سرتیفیکیت ها رو داخل  پوشه ssl درون /var/lib/postgresql/data قرار میدم.chown -R postgres:postgres /var/lib/postgresql/data/ssl/chmod 600 /var/lib/postgresql/data/ssl/server.keychmod 644 /var/lib/postgresql/data/ssl/server.crt /var/lib/postgresql/data/ssl/rootCA.crtنوبت به تنظیمات postgresql.conf میرسهما باید قسمت ssl رو ویرایش بکنیم.ssl = onssl_cert_file = &#039;/var/lib/postgresql/data/ssl/server.crt&#039;ssl_key_file = &#039;/var/lib/postgresql/data/ssl/server.key&#039;ssl_ca_file = &#039;/var/lib/postgresql/data/ssl/rootCA.crt&#039;ریستارت میکنیمحالا باید تنظیمات رپلیکا رو ادیت بکنیم.باید primary_conninfo  مربوط به رپلیکا رو ویرایش کنیم. اگر از سوییچ -R استفاده کرده بودید این تنظیمات در فایل postgresql.auto.conf ذخیره شده و باید اونجا رو ادیت بکنید.باید پارامتر sslmode و sslrootcert رو اضافه بکنیم. sslmode باید مقدار require رو بگیره و sslrootcert ادرس فایل rootCA.crt که در مرحله قبل ساختیم هستش.خب کارمون اینجا تموم شد . فقط کافیه ریستش بکنیم. اگر مجدد کوئری pg_stat_replication رو بگیریم. خواهیم دید که ادرس فایل و تنظیماتی که گذاشتیم رو نمایش میدهمن اینجا به صورت خلاصه داستان ssl رو توضیح دادم و اگر میخواستم تمام کد هاش رو بزارم تمام توضیحات بخش اول رو باید تکرار میکردم.سناریوی رفتن و برگشتن از رپلیکا به پرایمریتوی پست قبل درباره اینکه چجوری یه سرور رپلیکا رو قابل نوشتن بکنیم و تبدیلش بکنیم به پرایمری صحبت شد. حالا فرض کنید مثلا ما یک سرور پرایمری داریم و دو تا سرور رپلیکا . فرض کنیم سرور پرایمری به مشکل میخوره. ما باید یکی از رپلیکا ها رو جایگزین بکنیم و رپلیکا دوم رو ادرس پرایمری کانکشن رو عوض بکنیم به رپلیکایی که پرایمری شده.حالا فرض کنید سرور پرایمری مجدد در دسترس قرار گرفته ولی الان قابل استفاده نیست چون دیتاش قدیمی شده. اگر تفاوتی بین این سرور ها نباشه کاری که باید بکنیم اینه که سروری که قبلا پرایمری بوده تبدیل به رپلیکا بشه و بقیه سرور ها هم به روال قبل به کارشون ادامه بدن. اگر تفاوتی باشه باید دوباره اون ترکیب قبلی رو درست بکنیم و اول سرور پرایمری رپلیکا میشه و مجدد تبدیلش میکنیم به سرور پرایمری.replica migrationلود بالانسینگبا توجه به یوزکیسی که من توی پست اول گفتم من هیچ وقت نیاز به استفاده همزمان از دیتابیس هام نداشتم ولی زمانی که ما میایم رپلیکا ایجاد میکنیم برای دیتابیس یکی از مهم ترین استفاده هاش همینه که عملیات read توسط رپلیکا ها انجام بشه.بستگی به دیزاین سیستم ممکنه نحوه استفاده از رپلیکا ها متفاوت باشه. مثلا فرض کنید ما بخوایم چند تا اپلیکیشن توی چند تا دیتاسنتر داشته باشیم و به ازای هر دیتاسنتری که اپلیکیشنمون دیپلوی شده یه رپلیکا دیتابیس ساخته باشیم.multi-datacenterتوی حالت بالا قاعدتا ما نیاز نداریم که لود بالانس داشته باشیم فقط ادرس سرور پرایمری رو باید جدا داخل اپلیکیشن هامون تعریف بکنیم که عملیات نوشتن رو به اون سرور بزنیم و برای خوندن از سرور های داخل هر دیتاسنتر استفاده بکنیم.حالا فرض کنید کلا ما یه دیتاسنتر داریم ولی به خاطر حجم زیاد دیتا و همچنین بالابردن دسترسی پذیری رپلیکا اضافه کردیم. توی این سناریو رپلیکا به ما کمک میکنه لود از روی سرور پرایمری برداشته بشه و توزیع بشه بین چند تا سرور.load balancerتوی سناریو بالا ما نیاز به یک لود بالانسر داریم که ترافیک رو پخش بکنه. از haproxy برای اینکار استفاده میکنیم. برای اینکار حتما باید پورت های read و write متفاوت باشه چون تا جایی که میدونم haproxy نمیتونه تفکیک بکنه که چه ریکوئستی باید به پرایمری بری و چه ریکوئستی به رپلیکا.لینک های پایین مفصل در مورد healthcheck  و شرایط مختلف توضیح داده که من شاید توی پست جداگونه مفصل تستشون کردم. https://severalnines.com/blog/postgresql-load-balancing-using-haproxy-keepalived/  https://www.alibabacloud.com/blog/postgresql-haproxy-proxy-for-ha-and-load-balance_597618  https://www.adamzwakk.com/guides/postgres-repl-load-backups/ </description>
                <category>وصال دانشور</category>
                <author>وصال دانشور</author>
                <pubDate>Tue, 17 Sep 2024 19:05:41 +0330</pubDate>
            </item>
                    <item>
                <title>رپلیکا پستگرس - قسمت دوم - تفاوت sync و async</title>
                <link>https://virgool.io/@vessaldaneshvar/%D8%B1%D9%BE%D9%84%DB%8C%DA%A9%D8%A7-%D9%BE%D8%B3%D8%AA%DA%AF%D8%B1%D8%B3-%D9%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%88%D9%85-%D8%AA%D9%81%D8%A7%D9%88%D8%AA-sync-%D9%88-async-szepu7psjp8y</link>
                <description>سلامامیدوارم پست قبلی براتون مفید بوده باشه.اگر مطالعه نکردید از لینک زیر میتونید بهش سر بزنید. https://virgool.io/@vessaldaneshvar/%D8%AA%D8%AC%D8%B1%D8%A8%D9%87-%D8%AC%D8%A7%D8%A8%D8%AC%D8%A7%DB%8C%DB%8C-%D9%BE%D8%B3%D8%AA%DA%AF%D8%B1%D8%B3-%D8%A8%D8%A7-%D8%B1%D9%BE%D9%84%DB%8C%DA%A9%D8%A7-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84-ayuvddolvrb1 ai generated imageدر ادامه پست قبلی توی این قسمت قراره چند تا مورد رو بررسی بکنیم.چجوری از حالت async به حالت sync توی رپلیکا بریمتنظیماتی که برای رپلیکا میشه اعمال کرد و مهم هستش رو بررسی بکنیم.سوییچ از حالت async به syncبرای اینکه دستمون برای تست کردن حالت های مختلف باز باشه من یه رپلیکا دیگه هم اضافه کردمدر واقع الان دو تا سرور رپلیکا داریم و یه سرور پرایمری.اگر دستور زیر رو اجرا بکنمselect * from pg_stat_replication;این نتیجه رو برامون برمیگردونه. pid | usesysid |   usename    | application_name | client_addr | client_hostname | client_port |         backend_start         | backend_xmin |   state   | sent_lsn  | write_lsn | flush_lsn | replay_lsn |    write_lag    |    flush_lag    |   replay_lag    | sync_priority | sync_state |          reply_time-----+----------+--------------+------------------+-------------+-----------------+-------------+-------------------------------+--------------+-----------+-----------+-----------+-----------+------------+-----------------+-----------------+-----------------+---------------+------------+-------------------------------  34 |    16388 | replica_user | rep1             | 172.18.0.3  |                 |       60592 | 2024-06-06 16:50:55.104077+00 |              | streaming | 0/F009500 | 0/F009500 | 0/F009500 | 0/F009500  | 00:00:00.000243 | 00:00:00.00132  | 00:00:00.001379 |             0 | async      | 2024-06-06 16:51:10.16883+00  35 |    16388 | replica_user | rep2             | 172.18.0.4  |                 |       32934 | 2024-06-06 16:51:00.042541+00 |              | streaming | 0/F009500 | 0/F009500 | 0/F009500 | 0/F009500  | 00:00:00.000245 | 00:00:00.001349 | 00:00:00.00141  |             0 | async      | 2024-06-06 16:51:10.168877+00(2 rows)الان اینجا ما دو تا رپلیکا داریم. من برای هر کدوم اسم گذاشتم که هم بتونیم تفکیک بکنیم هم یه مثال از حالتی که میشه این ها رو اولویت بندی کرد داشته باشیم. اسم رپلیکا ها که با application_name مشخص شده rep1 و rep2 هستش.برای نام گذاری هم کافیه توی تنظیمات رپلیکا ها داخل primary_conninfo یه فیلد به نام application_name اضافه بکنیم. اگر چیزی تنظیم نکنیم به صورت دیفالت اسم walreceiver نمایش داده میشه.primary_conninfo = &#039;host=primary-psql port=5432 user=replica_user password=password application_name=rep1&#039;فیلد sync_stateهمانطور که از جدول مشخصه مقدار هر دو رپلیکا برای این ستون async هستشیعنی ابتدا ترنزاکشن ما کامیت میشه و به ما ریسپانس برمیگرده و بعدش لاگش برای رپلیکا ارسال میشه و مقادیر توی رپلیکا هم به روزرسانی میشن. توی این حالت ترنزاکشن ما منتظر رپلیکا نمیمونه و حتی اگر رپلیکا بره پایین یا خیلی latency داشته باشه مشکلی برای سرور پرایمری پیش نمیاد.من برای اینکه خودم تست بکنم که در عمل اگر latency داشته باشیم چه اتفاقی میوفته نیاز به یه ابزار داشتم که بتونم این مورد رو تست کنم. به طور مثال یه delay چند ثانیه روی شبکه ایجاد بکنم که این به صورت واقعی تست بشه.من با دستور زیر روی کل شبکه اون کانتینر میتونم یه تاخیر ایجاد بکنم. به هیچ وجه این دستور رو روی سرور های عملیاتی یا حتی سرور های تست اجرا نکنید. چون واقعا فاجعه افرینه. این فقط برای تست لوکال روی سیستم خودتون به درد میخوره.من از ابزار tc برای اینکار استفاده کردم . به صورت پیشفرض روی ایمیج پستگرس ۱۶ نیستش و اول باید نصبش کنیمapt update
apt install iproute2tc qdisc add dev eth0 root netem delay 3sمن این دستور رو روی رپلیکا اولم اجرا کردم. توی حالت async وقتی یک دستور insert روی سرور پرایمری اجرا میکنیم بدون مکث ریسپانس برمیگرده. برای دیدن میزان تایم هم میتونیم تایمینگ رو با دستور زیر توی شل پستگرس فعال بکنیم&gt; \timing
Timing is on.به طور مثال من یه جدول به نام تست ایجاد کردم که فقط یه ستون به نام ایدی داره و یه مقدار داخلش میریزم و تایمش رو محاسبه میکنم. نتیجه در حالت async :‌insert into test values(1); INSERT 0 1
Time: 2.015 msاین نتیجه رو اینجا داشته باشید تا بعدا بهش برگردیم.کانفیگ سرور پرایمریبرای سوییچ از حالت async به sync ما نیاز به تغییر دادن کانفیگ های رپلیکا نداریم و تمام تنظیمات داخل سرور پرایمری اعمال میشه.راحت ترین حالتاول از راحت ترین راه شروع میکنیم. توی این حالت صرفا یکی از سرور های رپلیکا sync میشه که اولویت بندی هم نداره کافیه داخل فایل postgresq.conf تنظیمات synchronous_standby_names رو ویرایش میکنیم. برای synchronous_standby_names مقدار * رو میزاریم.#synchronous_standby_names = &#039;&#039;synchronous_standby_names = &#039;*&#039;پرایمری رو ریستارت میکنیم. الان باید یکی از دو رپلیکا به حالت سینک رفته باشه.مجدد جدول pg_stat_replication رو فراخوانی میکنیمpid | usesysid |   usename    | application_name | client_addr | client_hostname | client_port |         backend_start         | backend_xmin |   state   | sent_lsn  | write_lsn | flush_lsn | replay_lsn |    write_lag    |    flush_lag    |   replay_lag    | sync_priority | sync_state |          reply_time-----+----------+--------------+------------------+-------------+-----------------+-------------+-------------------------------+--------------+-----------+-----------+-----------+-----------+------------+-----------------+-----------------+-----------------+---------------+------------+-------------------------------39 |    16388 | replica_user | rep1             | 172.18.0.3  |                 |       58742 | 2024-06-06 17:58:29.023912+00 |              | streaming | 0/F00BED0 | 0/F00BED0 | 0/F00BED0 | 0/F00BED0  | 00:00:00.000149 | 00:00:00.000149 | 00:00:00.000149 |             1 | potential  | 2024-06-06 17:58:29.034197+0040 |    16388 | replica_user | rep2             | 172.18.0.4  |                 |       35490 | 2024-06-06 17:58:29.024248+00 |              | streaming | 0/F00BED0 | 0/F00BED0 | 0/F00BED0 | 0/F00BED0  | 00:00:00.000119 | 00:00:00.000119 | 00:00:00.000119 |             1 | sync       | 2024-06-06 17:58:29.034154+00(2 rows)همانطور که از جدول بالا مشخصه مقدار sync_state تغییر کرد. تو این حالت الان برای رپلیکا دوم مقدار sync نوشته شده. یعنی بعد از این که ترنزاکشن ما کامیت میشه. لاگش باید به سرور رپلیکا ۲ بره و بعد تاییدش برای ما میاد. رپلیکا یک هم به صورت async اپدیت میشه ولی مقدارش potential هستش و اگر رپلیکا دوم خاموش شد ازش به عنوان رپلیکا سینک استفاده میشه.یه نکته مهمی هم که در مورد این فرایند باید بدونید اینه که وقتی میگیم منتظر میمونه به این معنیه که اگر تا یک زمان طولانی نتونه بفرسته صرفا پندینگ میمونه و در عمل جدول اپدیت شده و رول بک نمیکنه (‌به صورت پیشفرض)تعیین حداقل تعداد سینک رپلیکایه مقدار کانفیگی که داشتیم رو میتونیم پیچیده تر بکنیم. توی این حالت ما تعیین میکنیم حداقل چند رپلیکا باید سینک اپدیت بشه و متد و اولویت هاشون رو تعیین میکنیم.synchronous_standby_names = &#039;FIRST 2 (rep1, rep2, rep3)&#039;توی مثال بالا منظور اینه که حداقل دو تا سینک رپلیکیشن باید داشته باشی. یعنی توی هر ترنزاکشن منتظر میمونیم دیتا رو به دو رپلیکا که توی لیست بالا هستن بفرستیم.بر خلاف حالت قبل که اسم رپلیکا براش مهم نبود. توی این حالت باید دقیق مشخص بکنیم که اولویت رپلیکا ها به چه صورته و کدومشون سینک هستند. الان برای ما مثال ما هر دو رپلیکا سینک هست و اگر هر کدوم بره پایین منتظر میمونه بیاد بالا تا دیتا رو براش بفرسته.خب بریم سراغ اون مبحث زمان بندی که بالا مطرح کردم. نتیجه توی حالتی که ما هیچ تاخیری روی شبکه ایجاد نکردیم :‌postgres=# insert into test values(2);INSERT 0 1
Time: 5.647 msنتیجه روی حالتی که روی rep1 تاخیر سه ثانیه گذاشتیم.postgres=# insert into test values(3);INSERT 0 1
Time: 3006.457 ms (00:03.006)نتیجه روی حالتی که rep1 سه ثانیه تاخیر و rep2 چهار ثانیه تاخیر داره (درخواست همزمان میره و منتظر میمونه جفتشون اپدیت بشن که میشه ماکسیموم تاخیر بین رپلیکا ها)postgres=# insert into test values(4);INSERT 0 1
Time: 4006.963 ms (00:04.007)وقتی از متد FIRST استفاده میکنیم داریم اولویت بندی میکنیم. یه متد دیگه هم وجود داره به نام ANY که همینکار رو انجام میده بدون اولویت بندی.تو این حالت الان sync_priority برای rep1 یک هستش و rep2 دو هستش و توی حالت ANY جفتش یک هست.تنظیم synchronous_commitدر ابتدای این مقاله اشاره کوچکی به اینکه وقتی رپلیکا در دسترس نباشه کردم و گفتم پرایمری منتظر میمونه که اطلاعات رو به رپلیکا در حالت سینک بفرسته و بعد ریسپانس روبه ما برگردونه و همچنین توی حالت پیشفرض رول بک نمیکنه اگر نتونه اطلاعات رو بفرسته.حالا اینجا تنظیماتی داریم که به ما امکان مدیریت این حالات رو میده و میشه تنظیم کرد تحت چه شرایطی ترنزاکشن انجام بشه یا انجام نشهمقادیری که میتوان به عنوان مقدار این فیلد ها ست کرد به صورت زیر است.on (default)remote_writeremote_applyofflocalدر حالت اول بعد از این که wal_log به رپلیکا فرستاده میشه و اون روی دیسک ذخیره میکنه ترنزاکشن ما هم تایید میشه. اگر بخوایم ریسک از بین رفتن یکپارچگی داده ها رو به جون بخریم میتونیم این رو بزاریم روی حالت off یا remote_apply . توی حالت remote_apply صرفا اگر دیتا ارسال بشه به رپلیکا (تو بافرش ذخیره کنه)‌ جواب به ما برمیگرده و نیازی نیست توی دیسک بنویسهممنون که همراه بودید.در پست بعدی در مورد دو تا موضوع مهم صحبت میکنیم.سناریویی که رپلیکا رو تبدیل به پرایمری میکنیم و دوباره میخوایم برگردیم به همون ترکیب قبلیایجاد لود بالانس برای اینکه درخواست ها بتونن توی این سه تا سرور پخش بشنایجاد ssl برای حفظ امنیت داده ها برای جابجایی بین چند دیتاسنتر</description>
                <category>وصال دانشور</category>
                <author>وصال دانشور</author>
                <pubDate>Fri, 02 Aug 2024 13:54:58 +0330</pubDate>
            </item>
                    <item>
                <title>تجربه جابجایی پستگرس با رپلیکا - قسمت اول</title>
                <link>https://virgool.io/@vessaldaneshvar/%D8%AA%D8%AC%D8%B1%D8%A8%D9%87-%D8%AC%D8%A7%D8%A8%D8%AC%D8%A7%DB%8C%DB%8C-%D9%BE%D8%B3%D8%AA%DA%AF%D8%B1%D8%B3-%D8%A8%D8%A7-%D8%B1%D9%BE%D9%84%DB%8C%DA%A9%D8%A7-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84-ayuvddolvrb1</link>
                <description>سلامبعد از مدت ها با یه تجربه نسبتا سخت در بخش کار با دیتابیس ها یه مطلب چند قسمتی اماده کردم.بی مقدمه میرم سر اصل مطلب. قراره در مورد دو تا دیتابیس influxdb و postgres بنویسم و تجربه کار باهاشون رو برای بحث های HA و رپلیکا بهتون بگم.ai-generated db replicaبرای این که پست خیلی حوصله سر بر و خسته کننده نباشه اول میریم سراغ پیاده سازی یه رپلیکیشن ساده از پستگرس. دلیلی که من این پستو مینویسم اینه که توی نسخه های جدیدتر پستگرس مدل رپلیکیشن عوض شده و من خودم مطلب خوب راجبش حتی به زبان انگلیسی پیدا نکردم و دوست داشتم تجربه ای که داشتم رو در اختیارتون بزارم.در ادامه در مورد تئوری و مقدماتش هم مینویسم و مدل های مختلفی که میشه انجامش داد رو هم میگم.اول بریم سراغ اینکه چرا پایگاه داده ما نیاز به رپلیکیشن پیدا کرد. ما به صورت عادی از رپلیکیشن دیتابیس برای سرویس هامون استفاده نمیکنیم و این در واقع یک سولوشن موقت برای یه مشکل جابجایی سریع بود. ما بحث down time برامون خیلی مهم بود و توی یک فرصت خیلی محدود مجبور بودیم زیر ساختمونو جابجا کنیم.ما چند تا راه حل داشتیم. یکی از راه حل ها این بود که سرور مبدا رو خاموش بکنیم و دیسک رو کامل منتقل بکنیم و سرور مقصد رو روشن بکنیم که این حداقل چند ساعت زمان میبرد و البته ریسک این هم وجود داشت که پروسه جابجایی به هر دلیلی به مشکل بخوره و عملا فقط ما چند ساعت سیستممون پایین بود و کمکی بهمون نشده بود.یه راه حل بهتر این بود که ما فقط بکاپ دیتابیس رو داشته باشیم و اون قاعدتا خیلی سریع تر جابجا میشه و بکاپ رو ریستور بکنیم و این هم حدودا نیم ساعت زمان میبرد.شاید با خودتون فکر کنید که خب نیم ساعت که چیزی نیست ولی دو تا نکته مهم وجود داره . برای بعضی کسب و کار ها نیم ساعت خیلی مهمه و نکته دیگه اینه که فقط این سرویس نیست . ما بخش های دیگه و اجزای دیگه ای از سرویس هامون هم وجود داشتن که اگر با این رویکرد میخواستیم جابجاشون کنیم در نهایت یک روز کامل مجبور بودیم سیستممون رو خاموش کنیم یا یه اختلال ناخوشاید داشته باشیم.من دنبال یه راه حل بهتر بودم که اصلا down time نداشته باشیم. قبلا با بحث های رپلیکیشن یه اشنایی مختصر داشتم ولی هیچ وقت به صورت جدی این کار رو انجام نداده بودم و مجبور شدم که توی این فرصت کوتاه و پر استرس این کار رو انجام بدم.برای بحث رپلیکیشن نسخه پستگرسی که ازش استفاده میکنید خیلی مهمه و تغییرات جدی توی نسخه های مختلف داشته.اول از همه باید ببینیم که رپلیکیشنی که من استفاده کردم چجوری کار میکنه. به دیاگرام دقت کنیدstream async postgres replicaهمونطور که میبینید تمام درخواست های write باید به primary بره ولی برای read محدودیتی نداریم. به هر دو سرور میتونیم درخواست بزنیمالبته چون مدل async رو داریم اجرا میکنیم ممکنه رپلیکا دیرتر اپدیت بشه.این مدل برای کاری که من میخواستم انجام بدم خوب بود. چون من نمیخواستم هیچ رایتی روی رپلیکا انجام بدم تا زمانی که سرور پرایمری رو خاموش بکنم و از طرفی تاخیر اپدیت شدن هم برام اهمیتی نداشت(در حد اینکه رپلیکا تبدیل به پرایمری بشه و سرویس ها اپدیت بشن)خب بریم سراغ اینکه این کار رو چجوری باید انجام بدیم. من چون تو بستر داکر این کار رو میخواستم بکنم چالش هایی که احتمال داره با داکر داشته باشید هم بهتون میگم و فرض میکنیم که دو تا کانتینر به نام های primary-psql , replica-psql داریم. خب اولین کاری که باید انجام بدیم باز کردن دسترسی های سرور پرایمری هستش. و تنظیم یک یوزر با رول replica که بتونه از سرور پرایمری دیتا بگیره.با فرض اینکه primary-psql یک کانتینر در حال اجرا هستش یوزر ریپلیکا رو براش میسازیم و پالیسیش رو تغییر میدیم.#/bin/bash
docker exec -it primary-psql bash
#inside docker container
## run postgres shell
psql -U postgres
## create replica user
CREATE ROLE replica_user WITH REPLICATION LOGIN ENCRYPTED PASSWORD &#039;REPLICADIFFICULTPASSWORD&#039;;برای تغییر در فایل pg_hba.conf چون داخل کانتینتر ویرایشگر متنی نداریم از خارج کانتینتر فایلی که داخل والیومی که برای دیتای پستگرس ساخته شده رو ادیت میکنیم. فرض کنید اسم والیوم من primary-psql-data باشه. اگر روی سیستم خودتون برای تست این کار رو انجام میدید میتونید از قابلیت های داکر دسکتاپ استفاده بکنید.sudo vim /var/lib/docker/volumes/primary-psql-data/_data/pg_hba.confخط پایین رو به این فایل اضافه میکنیم. هدف از اینکار اینه که دسترسی استریم کردن دیتا رو به یوزری که الان ساختیم اضافه بکنیم.host replication replica_user 0.0.0.0/0 md5کانتینر primary-psql رو ریستارت میکنیم.حالا باید بریم سراغ کانتینر رپلیکا. فرض کنید یه کانتینر در حال اجرا به نام secondary-psql داریم. اول باید کانتینر رو استاپ بکنیم چون قراره پوشه /var/lib/postgresql/data رو با base_backup از نو بسازیم و یک فایل به نام standby.signal در دایرکتوری /var/lib/postgresql/data ایجاد بکنیم. البته برای فایل standby.signal میتونیم از سوییچ R استفاده بکنیم که خودش اتوماتیک این فایل رو بسازه. ولی در کل باید حواسمون باشه که این فایل حتما وجود داشته باشه.در مورد سوییچ R این نکته رو هم اضافه بکنم که توی فایل postgresql.auto.conf میاد و اطلاعات کانکت شدن رو هم اضافه میکنه و نیازی نیست دیگه دستی اینو توی فایل postgresql.conf تغییرش بدیم.docker stop secondary-psql
docker run --rm --volume postgres_secondary-psql-data:/secondary-data --network=postgres_default -it postgres:15 bashpg_basebackup -D /secondary-data -P -R -h primary-psql -U replica_user -W
# Enter replica_user password (REPLICADIFFICULTPASSWORD)
touch /secondary-data/standby.signal (run above command without -R switch)
exitاگر از سوییچ -R استفاده نکردیم باید یک سری تغییرات روی این فایل ها بدیم و کانتینر رو ران بکنیمفایل postgresql.conf رو باید ادیت بکنیم و primary_conninfo رو ویرایش بکنیم.# primary_conninfo = &#039;&#039;
primary_conninfo = &#039;host=primary-psql port=5432 user=replica_user password=REPLICADIFFICULTPASSWORD&#039;خب الان باید کانتینتر رپلیکا رو استارت بکنیم.docker start secondary-psqlبرای این که مطمئن بشیم رپلیکا تونسته به پرایمری وصل بشه میتونیم از دستور زیر داخل کانتینتر پرایمری استفاده بکنیم.select * from pg_stat_replication;اگر هیچ سطری وجود نداشته باشه یعنی سرور رپلیکا نتونسته وصل بشه اما اگر یک سطر مطابق با اطلاعات سرور رپلیکا وجود داشته باشه فرایند درست انجام شده.pid | usesysid |   usename    | application_name | client_addr | client_hostname | client_port |         backend_start         | backend_xmin |   state   | sent_lsn  | write_lsn | flush_lsn | replay_lsn |   
 write_lag    |    flush_lag    |   replay_lag    | sync_priority | sync_state |          reply_time          -----+----------+--------------+------------------+-------------+-----------------+-------------+-------------------------------+--------------+-----------+-----------+-----------+-----------+------------+-----------------+-----------------+-----------------+---------------+------------+------------------------------34 |    16388 | replica_user | walreceiver      | 172.18.0.2  |                 |       37088 | 2024-05-31 08:24:12.693549+00 |              | streaming | 0/B000850 | 0/B000850 | 0/B000850 | 0/B000850  | 00:00:00.000284 | 00:00:00.003262 | 00:00:00.003376 |         0 | async      | 2024-05-31 08:57:14.61691+00همچنین داخل سرور رپلیکا هم میتونیم چک بکنیم که برای اتصال به سرور پرایمری داره از چه کانفیگ هایی استفاده میکنه. با دستور زیر میتونیم چک بکنیم.select * from pg_stat_wal_receiver;pid |  status   | receive_start_lsn | receive_start_tli | written_lsn | flushed_lsn | received_tli |     last_msg_send_time       |     last_msg_receipt_time     | latest_end_lsn |        latest_end_time       | slot_name | sender_host  | sender_port |                                                                                                          conninfo                                                                                                                                                                        -----+-----------+-------------------+-------------------+-------------+-------------+--------------+-------------------------------+------------------------------+----------------+-------------------------------+-----------+--------------+-------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------38 | streaming | 0/F000000         |                 1 | 0/F000C40   | 0/F000C40   |            1 | 2024-06-06 15:56:28.035265+00 | 2024-06-06 15:56:28.035474+00 | 0/F000C40      | 2024-06-06 15:54:57.999413+00 |           | primary-psql |        5432 | user=replica_user password=******** channel_binding=prefer dbname=replication host=primary-psql port=5432 fallback_application_name=walreceiver sslmode=prefer sslcompression=0 sslcertmode=allow sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres gssdelegation=0 target_session_attrs=any load_balance_hosts=disable(1 row)خب تا اینجا ما الان دو تا کانتینر داریم که دیتاهاشون به صورت async سینک میشه.این برای نیاز من میتونم بگم اوکی بوده. چون خودم قرار بود سرور پرایمری رو خاموش کنم و سریع بین دیتابیس ها سوییچ بکنم. قاعدتا من توی این یه سری پست ها نمیخوام فقط به حالتی که خودم انجام داده بودم بسنده بکنم و میخوام یه کنجکاوی درباره روش های دیگری که میشد انجام داد انجام بدم و سعی بکنم عمق دانشم توی این حوزه رو بیشتر بکنم.سوییچ کردن از سرور پرایمری به سرور رپلیکابرای چک کردن این که الان توی حالت رپلیکا هستیم یا نه میتونیم از دستور زیر استفاده بکنیم.SELECT pg_is_in_recovery();
-------------------------------------------------------------
 pg_is_in_recovery------------------- t(1 row)حالا فرض کنید سرور پرایمری ما به هر دلیل مشکل میخوره یا توی سناریویی که من داشتم میخواستم خودم خاموشش بکنم. الان ما دسترسی نوشتن روی سرور رپلیکا رو نداریم و خطا میگیریم. با دستور زیر میتونیم سرور رو تبدیل به سرور پرایمری بکنیم و اگر اینکار رو انجام بدیم دیگه راه برگشت به حالت قبل رو نداریم. در مورد اینکه بعد از اجرا کردن این دستور چه اتفاقی میوفته توی پست های بعدی بیشتر توضیح میدم و روند برگشتنش رو هم بررسی خواهیم کردSELECT pg_promote();قاعدتا این چیزی که بالا نوشتم روش اول و ساده ترین راه بود که میتونستیم توی اون زمان انجام بدیم. دوست دارم در ادامه این سری پست ها درباره ی هر کدوم بیشتر اطلاعات کسب کنم و نتیجه اش رو با شما در میون بزارم.چند نکته:حتما قبل از این که سرور رپلیکا رو ران بکنید یادتون باشه فایل standby.signal رو ساخته باشید چون اگر این فایل نباشه لاگ ها به هم میخوره و باید مجدد base_backup بگیرید.توی پروسه نوشتن این مطلب چند بار من تمام این کانفیگ ها رو چک کردم و خودم با این که چند بار اجرا کرده بودم بازم مشکل خوردم. پس حتما حواستون باشه که یه بار توی محیط تستی چک بکنید کانفیگ هاتون رو و بعدش اقدام به ایجاد رپلیکا بکنید.در پست بعدی میخوام برم سراغ تغییر وضعیت از async به sync و یه مقدار با پارامتر هایی که داره بازی بکنیم و  ببینیم چه اتفاقی توی هر کدوم از حالت ها اتفاق میوفته و چالش هاش چیه.ممنون که تا اینجا همراه بودید. خوشحال میشم اگر سوالی داشتید در کامنت ها بپرسید و یا اشتباهی وجود داشت بهم بگید که اصلاحش بکنم.منابعی که استفاده کردممن زمانی که قرار بود این کار رو انجام بدم از چند منبع که در ادامه اوردم استفاده کردم ولی برای نوشتن این پست رفتم سراغ داک رسمی خود پستگرس که خیلی کامل توضیح داده . لینکشو میزارم حتما یه سر بهش بزنید. https://www.postgresql.org/docs/16/warm-standby.htm  https://medium.com/learning-to-love-postgresql/postgresql-high-availability-lab-promoting-the-replica-switchover-1ba911cedc3c  https://www.server-world.info/en/note?os=CentOS_Stream_9&amp;p=postgresql16&amp;f=5#google_vignette  https://www.crunchydata.com/blog/logical-replication-on-standbys-in-postgres-16  https://hevodata.com/learn/postgres-wal-replication/ </description>
                <category>وصال دانشور</category>
                <author>وصال دانشور</author>
                <pubDate>Sun, 28 Jul 2024 20:08:38 +0330</pubDate>
            </item>
                    <item>
                <title>الگوریتم تشخیص اجتماعات LPA (قسمت پنجم داده کاوی توییتر)</title>
                <link>https://virgool.io/@vessaldaneshvar/%D8%A7%D9%84%DA%AF%D9%88%D8%B1%DB%8C%D8%AA%D9%85-%D8%AA%D8%B4%D8%AE%DB%8C%D8%B5-%D8%A7%D8%AC%D8%AA%D9%85%D8%A7%D8%B9%D8%A7%D8%AA-lpa-%D9%82%D8%B3%D9%85%D8%AA-%D9%BE%D9%86%D8%AC%D9%85-%D8%AF%D8%A7%D8%AF%D9%87-%DA%A9%D8%A7%D9%88%DB%8C-%D8%AA%D9%88%DB%8C%DB%8C%D8%AA%D8%B1-j8ksy82ostpo</link>
                <description>به نام خداسلاماین آخرین پست از پست های مربوط به تحلیل داده است و در این پست الگوریتم تشخیص اجتماع LPA رو بر روی داده ها با استفاده از کتابخانه networkx اعمال میکنیم.اگر پست های قبلی رو نخوندید پیشنهاد میکنم از لینک های پایین دنبال بکنید. باعث میشه درک الگوریتمی که روی داده های اعمال میکنیم بهتر باشه. https://vrgl.ir/TKNSG  https://vrgl.ir/k6WW4  https://vrgl.ir/r7II2  https://vrgl.ir/PxJTF کتابخانه networkxقصد ندارم راجع به کتابخانه networkx مطلب بنویسم، و مقدماتی درباره این که چی هست و چه کمکی به ما میکنه رو براتون میگم و همچنین لینک های داکیومنت و توضیحات بیشتر رو در ادامه خواهم گذاشت. https://networkx.github.io/ اگر در زبان برنامه نویسی پایتون قصد استفاده از گراف و مدل سازی داده ها در قالب گراف و یا هر گونه مسئله ای که به گراف منتهی شود را داشته باشید، بهترین انتخاب networkx خواهد بود. بسیاری از الگوریتم های معروف به خوبی در این کتابخانه پیاده سازی شده اند. البته برای ابعاد بالا انتخاب مناسبی نیست و بیشتر فاز تحقیقاتی دارد و بعید میدونم در عمل در پروژه های سنگین استفاده بشه. ( البته که نمیدونم و شاید هم بشه )در پست قبل به جایی رسیده بودیم که تمامی داده ها رو دریافت کردیم و دیگه با API توییتر کاری نداریم. من یک خروجی از پایگاه داده neo4j گرفتم و در قالب csv ذخیره کردم.از اینجا به بعد پروژه رو روی کولب انجام دادم و لینک کولب رو هم براتون میزارم ( البته بعد از حذف کردن یک سری اطلاعات مهم )در ابتدا باید گراف را در دیتافریم ها وارد کنیم و گراف را با توجه به وزن هر رابطه به گراف وزن دار تبدیل کنیم. اینکار باعث می شود تعداد یال ها کاهش پیدا بکند و رابطه بین هر جفت گراف یکتا شود.در ادامه کد های مربوط به آن آورده شده است. https://gist.github.com/vessaldaneshvar/0ad8c0ec8f4899189408d1cc97b6cc6a در کد های بالا در ابتدا داده ها ایمپورت شده است سپس با استفاده از متد groupby و فانکشن weight_group گراف را وزن دار کرده ایم.در گام بعد باید گراف جهت دار خود را ایجاد بکنیم. برخی از الگوریتم ها و متد ها صرفا بر روی گراف بدون جهت و برخی صرفا بر روی گراف جهت دار اجرا می شوند. بنابراین باید از همان ابتدا نوع گراف را مشخص بکنیم. گراف جهت دار در networkx با کلاس DiGraph ایجاد می شود.در ادامه کد های مربوط به ساختن کلاس آن را مشاهده می کنید. https://gist.github.com/vessaldaneshvar/093fb690caae911d533db8fd5198a8a0 همانطور که توضیح دادم ابتدا یک کلاس از گراف جهت دار ساخته ایم و در ادامه داده هایی که در دیتافریم قرار داشته اند را وارد کلاس کرده ایم.در گام بعدی الگوریتم LPA را اعمال میکنیم و داده ها به چند بخش تقسیم بندی می شوند. در ادامه کد های آن آورده شده است. https://gist.github.com/vessaldaneshvar/65f732abc8a9a86b047edfa75bc15831 بعد از اینکه الگوریتم را بر روی داده ها اعمال کرده ایم نتایج آن را به صورت تعداد اعضای هر گروه مشاهده می کنیم که در ادامه آورده شده است. با توجه به تصویر پایین 3 گروه بزرگ از میان هزار گره پیدا شده است. و باقی گروه ها به شدت کوچک هستند و به طور مثال گروه 22 نفری تماما برای ایران اینترنشنال می باشد.lpa resultبعد از این که از روی تعداد تونستیم گروه ها رو تشخیص بدیم، باید label های مربوط به هر گروه را به دیتا فریم اضافه بکنیم که برای هر سه گروه در کد ها آورده شده است.اما این سه گروه چه افرادی هستند؟دسته اول این تحقیقات که 633 عضو داشت با توجه به مشاهدات مختصر و بر اساس پروفایلشون جزو افراد عادی حساب میکنیم که بیشتر روزمره مینویسن و در مورد سیاست توییت میزنن.دسته دوم که 111 عضو داره افراد فارسی زبان غیر ایرانی هستند که اکثرا افغانستانی بودند. کشف این دسته هم برام جالب بود و شاید با الگوریتم های nlp به خوبی جدا نمی شدند.دسته سوم مربوط به افراد مشهور دولتی هست و برام جالب بود که با توجه به رابطه ها این افراد به خوبی دسته بندی شده اند.اگه فرصت بیشتری داشتم چیکار میکردم؟تحقیق من تقریبا همینجا تموم میشه و من از اینجا به بعد یکم در مورد ایده های گسترش این تحقیق و مواردی که ممکنه جذاب ترش بکنه مینویسم.اولین موضوعی که من رو خیلی ناراحت کرد و باباتش ناراحت هستم این هستش که حجم داده هام به نسبت چیزی که در ابتدا بهش فکر میکردم خیلی پایین تره و در حقیقت جذابیت این تحقیقات رو کم میکنه و کاربردش رو محدود میکنه.مورد اول رو با داشتن تجهیزات و سرور قوی میشه حل کرد و همچنین روی الگوریتم های بیشتری مطالعه کرد و الگوریتم مناسب رو پیدا کرد.دومین چیزی که من قصد داشتم انجام بدم و با تحقیقات فعلی ترکیب بکنم، استفاده از الگوریتم های متن کاوی و دسته بندی کاربرها و مقایسه این ها با هم بود که به دلیل محدودیت های زمانی به زمان دیگری موکول کردم و عملا ار دیتاست 25 گیگی متنی هیچ استفاده ای نکردم.مورد سوم انتشار نتایج تحقیق هستش. یه ضعف بزرگ این تحقیق منتشر نکردن نتایج اون به صورت عمومی هستش. در آینده امیدوارم فرصت بکنم و نتایج این پژوهش رو در گیت هاب به همراه کد ها و نتایجش منتشر بکنم.در نهایت یکی از کارهای جالبی که میشه انجام داد و جزو تحقیقات جامع شناسی هستش اینه که ترند های ایرانی توییتر رو به همراه نتایج این تحقیق ترکیب بکنیم و این که چه گروهی از جامعه چه چیزهایی رو ترند میکنند رو بررسی می کنیم که برای جامع شناس ها به نظرم خیلی جالب خواهد شد و تحقیق به صورت علمی جلو میره و نه صرفا بر اساس حدس و گمان.تشکر ویژهممنون که تو این چند قسمت من رو همراهی کردید و تجربیاتم رو خوندید.</description>
                <category>وصال دانشور</category>
                <author>وصال دانشور</author>
                <pubDate>Sun, 29 Nov 2020 22:26:25 +0330</pubDate>
            </item>
                    <item>
                <title>تجربه استفاده از API توییتر و پایتون ( قسمت چهارم )</title>
                <link>https://virgool.io/@vessaldaneshvar/%D8%AA%D8%AC%D8%B1%D8%A8%D9%87-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-api-%D8%AA%D9%88%DB%8C%DB%8C%D8%AA%D8%B1-%D9%88-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D9%82%D8%B3%D9%85%D8%AA-%DA%86%D9%87%D8%A7%D8%B1%D9%85-dqhyubjaxnbs</link>
                <description>به نام خداهمانطور که در پست های قبلی خوندید من برای پروژه پایانی کارشناسیم، تحلیل داده های توییتر رو دنبال کردم و هدفش هم تشخیص اجتماعات بود. اگر پست های قبلی رو نخوندید من لینکشون رو در ادامه میزارم. خوندن پست های قبلی کمک میکنه یه دورنمایی از پروژه داشته باشید و باعث میشه هنگام خوندن این نوشته ابهام کمتری داشته باشید. https://vrgl.ir/TKNSG  https://vrgl.ir/k6WW4  https://vrgl.ir/r7II2 جمع آوری داده به مرحله ای رسیده بود که من کاربران فارسی زبان رو اطلاعاتشون رو استخراج کرده بودم. من در پست قبل اطلاعاتی که ذخیره کردم رو نگفتم ولی تو کدهایی که گذاشته بودم معلوم بود. اطلاعاتی که جمع آوری کردم شامل آیدی، یوزرنیم، اسم، لوکیشن، تعداد فالوئرها، تعداد دوستان(منظور همون فالوئینگ ها هست)، تعداد توییت هایی که لایک شده، تعداد توییت های منتشر شده(شامل ریتوییتها) و تاریخ ایجاد اکانت بود. اطلاعات زیاد دیگری نیز وجود داشت ولی من ذخیره نکردم و صرفا به همین اطلاعات بسنده کردم.در فاز بعدی جمع آوری داده من قصد داشتم اطلاعات بیشتری از کاربران فارسی زبان جمع آوری بکنم. برای این کار از بین یوزر هایی که جمع آوری شده بود افرادی که فالوئر های بیشتری داشتند رو استخراج کردم و فالوئر های این افراد رو دریافت کردم. کد های مربوط به جمع آوری این اطلاعات رو در ادامه خواهید دید. https://gist.github.com/vessaldaneshvar/6e5248301eb1b11b8d2b50ccf3668159 همانطور که در کد های بالا مشاهده میکنید در ابتدا کتابخانه های مربوط به پایگاه داده ها، Tweepy و ... را ایمپورت میکنیم. توکن ها را از فایل میخوانیم، سپس به پایگاه داده Mysql متصل میشویم و ابجکت های مربوط به API توییتر را میسازیم. من در مرحله قبل اکانت هایی که قصد داشتم فالوئر های آن ها را دریافت بکنم را وارد Mysql کردم. بسیاری از جزئیات و کار هایی که برای این پروژه صورت گرفت است، در پست های تحلیل داده مطرح نکرده ام و مواردی که حس میکردم برای شما مفید هست رو مطرح کردم. به طور مثال کدهای مربوط به انتقال داده ها از Neo4J به SQLSERVER/MySQL مطرح نشده است.در گام بعدی اطلاعات فالوئر های افرادی که آیدی آن ها را در دیتابیس وارد شده دریافت میکنیم. برای انجام این کار در کتابخانه Tweepy یک تابع وجود دارد، این تابع برای دریافت اطلاعاتی استفاده می شود که  نیاز به ارسال بیش از یک درخواست هست. به طور مثال در هر بار ارسال درخواست، آیدی 5 هزار فالوئر دریافت می شود و برای یک فردی که 50 هزار فالوئر دارد این درخواست 10 بار باید ارسال شود و در هر درخواست یک cursor برای ما ارسال می شود تا بتوانیم ادامه داده ها را با فرستادن این آرگومان به سرور دریافت بکنیم. همه ی این موارد در کتابخانه Tweepy با استفاده از تابع Cursor به راحتی صورت می پذیرد و نیاز به پیاده سازی آن ها نیست.من اطلاعات دریافتی رو در یک جدول جدا ذخیره کردم به این صورت که ستون اول جدول مربوط به آیدی ئی است که فالوئر هایش دریافت شده و ستون دوم نیز آیدی فالوئر ها می باشد.جدول رابطه فالوئر و فالوئینگبعد از این که آیدی فالوئر های این افراد را در پایگاه داده ذخیره شد. از داده های MySQL بکاپ تهیه کردم و آن را به کامپیوتر شخصی انتقال دادم و وارد پایگاه داده MSSQL کردم. حجم داده هایی که در این مرحله به دست آمد به شدت بالا بود و با سختی زیاد و در چندین مرحله توانستم این فایل ها را به کامپیوتر شخصی انتقال بدهم. از بین 1000 نفر فردی که لیست فالوئر های آن ها دریافت شده است حدود 40 میلیون آیدی یوزر به دست آمده است که البته بخش زیادی از آن تکراری می باشد. و حدود 7 میلیون یوزر یونیک به دست آمد. قطعا تمام یوزر ها جزو کاربران فارسی زبان نیستند و ما برای این که احتمال وجود کاربران فارسی زبان رو بیشتر بکنیم باید یک قاعده ای برای جداسازی این افراد انتخاب بکنیم.جداسازی کاربران فارسی زبان از میان 7 میلیون یوزرتعداد زیادی از این آیدی ها صرفا یکبار در دیتاست تکرار شده اند و چون کاربران فارسی زبان حداقل چندین اکانت فارسی زبان معروف را دنبال می کنند باید تعداد تکرار ها را مبنایی برای جدا سازی قرار دهیم. فرض اولیه این است که اگر آیدی به دست آمده حداقل 40 بار تکرار شده بود جزو کاربران فارسی زبان است. پس از این که این غربال سازی صورت گرفت حدود 400 هزار یوزر به دست آمد و البته برای برخی از این کاربران صرفا آیدی وجود دارد و اطلاعاتی مانند نام و مواردی مانند این در یک مرحله جداگانه دریافت شد.من این مرحله را چندین بار دیگر نیز تکرار کردم (با توجه به یوزر های جدید اطلاعات بیشتری جمع آوری می شد) ولی به دلیل این که با هر بار انجام دادن این کار درصد خطا برای کاربران فارسی زبان بالا می رود از اضافه کردن بخشی از داده های جمع آوری شده اجتناب کردم. در نهایت از میان 400 میلیون رابطه فالوئر و فالوئینگ که 4000 یوزر اصلی داشت حدود 400 هزار یوزر با اطلاعات کامل وجود داشت.جمع آوری داده های مربوط به فالوئر و فالوئینگ ها، حدود 45 روز به طول انجامید و فرایند سخت و وقت گیری بود. من سعی کردم به ساده ترین شکل ممکن این موارد رو توضیح بدم و بسیاری از نکات قطعا گفته نشده است.محدویت هایی برای پردازش تمام اطلاعاتهمانطور که در اولین پست اشاره کردم، در زمان جمع آوری داده من به تئوری گراف آشنا نبودم و همچنین تا به حال با این حجم از داده روبرو نشده بودم بنابر این در فرایند جمع آوری داده سعی کردم خیلی کامل و جامع این کار رو انجام بدم ولی برای پردازش داده ها با محدودیت های سخت افزاری و زمانی روبرو شدم.برای این تعداد کاربر نه تنها پردازش اطلاعات بسیار زمان بر و وقت گیر است و ممکن است بیشتر از یکسال طول بکشد بلکه شاید نشدنی و غیر ممکن باشد.من با مشورتی که با استاد راهنمام کردم به این نتیجه رسیدم که میتونم بخش کوچکی از داده ها رو برای تحلیل انتخاب کنم و البته چاره دیگری هم نداشتم و باید برای این که بتونم تو فرصت زمان باقی مانده از پروژه پایانیم دفاع بکنم خیلی سریع پروژه رو به اتمام می رسوندم. در نهایت من دوباره از افرادی که فالوئر های بالایی دارند استفاده کردم و از آن ها برای انجام تحلیل استفاده کردم.مانند مرحله قبل که من برای جمع آوری داده از اکانت هایی با فالوئر بالا استفاده کردم این بار نیز از افرادی که فالوئر های بالایی داشتند و همچنین یک سری شرایط دیگر مانند تعداد توییت ها یا تعداد فالوئینگ ها و ... استفاده کردم و 1054 گره را فیلتر کردم.query MSSQLبرای انجام تحلیل و پردازش و محاسبات مربوط به گراف، همانطور که اشاره کردم 1054 گره که مربوط به افرادی هستند که فالوئر های بالایی دارند فیلتر شده است. پس از مشخص شدن گره ها من باید روابط این افراد را در قالب یک گراف مدل سازی می کردم.با توجه به اینکه حجم داده ها به شدت کاهش یافته بود، من دوباره از Neo4j استفاده کردم. روابطی که در این مرحله استخراج خواهیم کرد علاوه بر فالوئر و فالوئینگ ها شامل توییت ها، ریتوییت ها، لایک ها و منشن خواهد بود. در این مرحله بر خلاف مرحله قبل هیچ یوزر جدیدی اضافه نمی شود و روابط صرفا بین نود های موجود ایجاد می شوند.در ادامه کد های مربوط به جمع آوری داده های ارتباطات بین نود ها را مشاهده می کنید. https://gist.github.com/vessaldaneshvar/816568bd5bb7ba649dae4c532670ca9a در فایل اول ابتدا آیدی هایی که در یک فایل خروجی گرفته شده است را وارد پایگاه داده Neo4j می کنیم و به ازای هر نود یک USER با آیدی مشخص می سازیم. در فایل بعدی اقدام به دریافت اطلاعات تکمیلی هر گره می کنیم. با وجود این که این اطلاعات در گام قبل جمع آوری شده بود ولی به دلیل گذر زمان اطلاعات دچار تغییراتی شده بود و بهتر است که به روزرسانی شود و در همین مدت برخی اکانت ها بسته شده بودند و تغییراتی در آن ها رخ داده بود.در فایل سوم که اصلی ترین فایل است، اطلاعاتی نظیر توییت و ریتوییت و منشن ها استخراج شده است. در صورتی که در فهم قسمتی از این فایل ها مشکلی بود حتما در کامنت ها بگید تا بیشتر توضیح بدم.تا اینجا ما یک پایگاه داده با حدود هزار گره و حدود 700 هزار رابطه داریم. که در ادامه تصاویر مربوط به آن در Neo4j را مشاهده می کنید.neo4j - sysinfoدر نود ها ما یک نود USER داریم و در روابط هم Follow , Mentions , Qoute , Reply , Retweet را داریم که در ادامه می بینید.neo4j - node - type relationsبا توجه به این روابط بین هر جفت گره یکتا نیست باید با استفاده از وزن دار کردن گراف، رابطه بین هر جفت گره را یکتا بکنیم. در گام بعد به هر یک از روابط یک نوع وزن می دهیم و این کار را انجام می دهیم. با انجام این کار تعداد روابط کاهش پیدا میکند و همانطور که از تعداد روابط مشخص است انجام تحلیل های گراف در ابعاد بالا به شدت دشوار و نیاز به منابع زیادی دارد.در پست بعد الگوریتم LPA رو روی داده ها اعمال می کنیم و آخرین پست خواهد بود.ممنون که تا به اینجا پست ها رو دنبال کردید. اگر نکته ای وجود داره که نیاز به توضیح بیشتر داره و ابهامی وجود داره، خوشحال میشم در کامنت ها برام بنویسید.</description>
                <category>وصال دانشور</category>
                <author>وصال دانشور</author>
                <pubDate>Mon, 19 Oct 2020 20:24:25 +0330</pubDate>
            </item>
                    <item>
                <title>تجربه Api Twitter با پایتون ( قسمت سوم )</title>
                <link>https://virgool.io/@vessaldaneshvar/%D8%AA%D8%AC%D8%B1%D8%A8%D9%87-api-twitter-%D8%A8%D8%A7-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D9%82%D8%B3%D9%85%D8%AA-%D8%B3%D9%88%D9%85-qdg1bswv5cje</link>
                <description>به نام خدا به جذاب ترین بخش پست های تحلیل داده توییتر رسیدیم و این بخش بیشتر از سایر بخش ها من رو هیجان زده میکنه. امیدوارم بتونم به خوبی تجربیاتم رو منتقل کنم و افرادی که دوست دارند در این زمینه فعالیت بکنند، یک راهنمای خوب داشته باشند.اگر پست های قبلی مربوط به تحلیل داده رو نخوندید میتونید از لینک های زیر دنبال کنید و دورنمایی از پروژه داشته باشید. https://vrgl.ir/TKNSG  https://vrgl.ir/k6WW4 چه روش هایی برای جمع آوری داده وجود داره؟من در ابتدای کار به طور مفصل درباره روش ها جستجو کردم و دنبال ساده ترین روش برای انجام دادن پروژه بودم. بنابر این روش های جمع آوری داده رو در ادامه شرح میدم و دلیل انتخاب کردن هر کدوم رو بهتون میگم.اصولا برای تحلیل داده میتونیم فرایند جمع آوری داده رو به دو بخش تقسیم بندی بکنیم.1 - دیتاست آماده از سایت هایی مانند کگل.2 - جمع آوری داده با توجه به نیازمندی های پروژه.دیتاست آماده ای که مناسب کار من باشه وجود نداشت. بنابر این من باید فرایند جمع آوری داده رو خودم انجام می دادم. برای این کار هم میتونستم از Api رسمی توییتر استفاده بکنم و هم از Crawler ها و کتابخانه های غیر رسمی برای این کار استفاده بکنم. من برای دریافت اطلاعات معتبر و سهولت از Api توییتر استفاده کردم.ثبت نام در پنل توسعه دهندگان توییتر https://developer.twitter.com/en استفاده از Api توییتر باعث میشه برای دریافت اطلاعات سهولت بیشتری داشته باشیم و دقیقا اطلاعاتی که میخوایم رو دریافت بکنیم ولی نحوه گرفتن این Api اصلا کار ساده ای نیست و مثل تلگرام یا فیسبوک به راحتی وارد کردن یک فرم یا ثبت نام در قسمت Api نیست و فرایند دریافت Api اعتبار سنجی میشه و حتما باید دلیل خوبی برای دریافت Api داشته باشید و چندین بار ازتون سوال میشه که دقیقا با این Api چیکار میخواید بکنید. البته چون من حدود یکسال قبل از این که این پروژه رو شروع بکنم، برای کار دیگری این Api رو گرفتم، در زمان صرفه جویی شد.صفحه توسعه دهندگان توییترمن این فرایند رو توضیح نمیدم و فرض میکنیم که تونستیم ثبت نام بکنیم و Api رو بگیریم و پنل توسعه دهندگان برای ما فعال شده است. اگر دوست داشتید درباره نحوه گرفتن Api بیشتر بنویسم، حتما زیر این پست کامنت بزارید، چون فرض من این هست که این فرایند با توجه به داکیومنت های موجود در توییتر نکته مهم و قابل بحثی نداره.در تصویر زیر App هایی که برای دریافت داده استفاده می شود را ساخته ام و دلیل تعداد زیاد آن محدودیت های توییتر برای دریافت داده است و من سعی کردم با استفاده از افزایش تعداد App ها زمان دریافت داده را کوتاه تر بکنم. به ازای هر پنل توسعه دهنده حداکثر 10 App می توان ساخت.پنل توسعه دهندگان توییترروش های متعددی برای Authentication در توییتر وجود دارد، من از ورژن 1.1 استفاده کردم. در این روش پس از ساختن App دو کلید که مخصوص شناسایی هر App است در اختیار ما قرار میگیرد. نام این کلید ها ConsumerKey و ConsumerSecret می باشد. پس از ساختن App باید دسترسی یک اکانت توییتر را به این App ها بدهیم. اگر App ما برای استفاده سوم شخص بود به وسیله آدرس مخصوص App خود و CallBack، توکن برای ما ارسال میشد و ما میتوانستیم دسترسی به آن اکانت را بگیریم، ولی چون تنها اکانتی که من میخواستم در این App رجیستر بشه، اکانت خودم بود ، به راحتی با چند کلیک توکن مربوط به خودم رو دریافت کردم که شامل دو تا کلید به نام های access_token و access_token_secret می شود ، این توکن ها صرفا یکبار ایجاد می شود و قابل بازیابی نیستند.تصویر جزئیات هر App رو در ادامه مشاهده میکنید.جزئیات هر Appبعد از این که 4 تا کلیدی که بالا توضیح دادم رو دریافت کردیم، نوبت میرسه به این که ببینیم چه داده هایی از توییتر رو میخوایم دریافت بکنیم و همچنین Api توییتر چه داده هایی در اختیار ما قرار میده. نکته مهم دیگه ای میخوام بگم اینه که چون من از کتابخونه Tweepy استفاده کردم دیگه نیاز نبود خودم الگوریتم های Ouath 1 رو پیاده سازی بکنم و احرازهویت و  تمام EndPoint ها در این کتابخانه به درستی پیاده سازی شده بود و من از این کتابخانه استفاده کردم.حقیقت مهمی که وجود داره اینه که مبهم ترین قسمت کاری که میخواستم انجام بدم در این مرحله بود، من واقعا نمیدونستم چه داده ای رو باید دریافت بکنم و نمیدونستم حجم داده هایی که باهاشون روبرو هستم چقدر هست. تو این مرحله من خیلی پرس و جو کردم و سایت های زیادی رو سر زدم، یکی از سایت هایی که برای من خیلی مفید بود سایت https://bigdata-ir.com بود، خیلی مفاهیم خوبی درباره گراف ها به زبان فارسی در این سایت وجود داشت و من ایده گرفتم که چه داده هایی رو دریافت بکنم.محدوده ای که من قصد داشتم روش کار بکنم توییت های فارسی بود، بنابر این قبل از هر کاری باید توییت های فارسی رو جدا میکردم و همچنین اکانت های فارسی رو تشخیص میدادم. توییتر به ابزار بسیار خوب برای این کار داره که محدودیتی برای دریافت توییت ها نداره. اسم این ابزار Twitter Streamer است.ابزار Twitter Streamerبرای استفاده از توییتر استریمر ابتدا باید فیلتر هایی برای آن تعیین بکنیم. این فیلتر ها تعیین می کنند که توییت هایی که قصد داریم آن ها را دریافت بکنیم دارای چه خصوصیاتی هستند. به طور مثال فیلتر های مانند زبان، منطقه جغرافیایی، کلماتی که در توییت باید وجود داشته باشد و غیره . پس از تعیین فیلتر های فوق و کانکت شدن به سرور، به محض ایجاد شدن توییت هایی که با فیلتر های ایجاد شده همخوانی داشته باشد، توییت برای ما ارسال خواهد شد. اگر علاقه مند به سازوکار آن هستید می توانید از لینک زیر اطلاعات بیشتری کسب کنید. https://developer.twitter.com/en/docs/twitter-api/v1/tweets/filter-realtime/guides/connecting من برای اینکه مطمئن بشم اطلاعات دریافتی مربوط به توییت های فارسی است، دو فیلتر را اعمال میکنم. فیلتر اول مربوط به کلماتی متداول فارسی مانند [که به از چه در ... ] و فیلتر دوم انتخاب زبان فارسی برای متن توییت ها است.قبل از این که کد های مربوط به این قسمت رو توضیح بدم باید به یک سوال مهم و اساسی پاسخ داده بشه.داده ها رو کجا ذخیره بکنیم؟در حقیقت من از همون ابتدا میدونستم که داده ها رو میخوام با Neo4J هندل بکنم و زبان سایفر رو یاد گرفتم و به شدت هم از قابلیت هاش هیجان زده شده بودم و قابلیت پیاده سازی الگوریتم های مختلف هم روش وجود داره ولی به منابع زیادی نیاز داره.در ابتدا من از Neo4J استفاده می کردم ولی به سرعت به SqlServer/Mysql مهاجرت کردم. کد هایی که در ادامه برای دریافت اطلاعات با استفاده از استریمر توییتر آورده شده مربوط به پایگاه داده Neo4J است و اطلاعات در این پایگاه داده ذخیره شده است. https://gist.github.com/vessaldaneshvar/3474fbbecb1a6d70488e09251b65c023 در ابتدا پکیج های مورد نیاز برای کار با Api توییتر و همچنین پکیج هایی برای کار با پایگاه داده  ایمپورت شده است. در گام بعدی اطلاعات مربوط به اتصال به Neo4J وارد شده است و کلاس اتصال به پایگاه داده ساخته شده است. برای استفاده از استریمر ما نیاز به یک کلاس با دو متد برای حالت های مختلفی که رخ می دهد داریم. متدی برای هندل کردن ارور ها ، همچنین متدی برای هندل کردن داده هایی که برای ما ارسال می شود. در متد هندل کردن ارورها صرفا عملیات با فرستادن false متوقف میشه و اگر به مشکل بخوریم صرفا متوقفش میکنم تا ایراد رو پیدا کنم و خوشبختانه به مشکلی هم نخوردم و این الگوریتم تونست روی سرور حدود دو روز بدون مشکل اجرا بشه و داده جمع آوری بکنه. در متد مربوط به هندل کردن داده که آرگومان ورودی یک رشته با فرمت json می باشد. ابتدا این رشته به یک دیکشنری تبدیل میشه و در هر بار فراخوانی این تابع یک یوزر که توییت فارسی منتشر کرده به پایگاه داده اضافه میشه. ایراد بزرگ این روش اینه که من برای بالاتر رفتن سرعت چک نمیکنم که آیا کاربری با این آیدی در پایگاه داده وجود دارد یا خیر، و برای حل این مشکل در انتها یوزر های تکراری را پاک میکنم.نتایج:بعد از این که script بالا دو روز اجرا شد، دقیقا یادم نیست چند میلیون توییت جمع آوری شده بود ولی در نهایت حدود 250 هزار یوزر یونیک جمع آوری شد. تخمین من از تعداد کاربران فارسی زبان بیشتر از یک میلیون یوزر بود و بنابر این باید فاز دوم جستجو رو شروع میکردم. با توجه به اینکه بازه زمانی دو روزه به شدت برای جمع آوری داده کوتاه است و اگر مدت زمان بیشتری جمع آوری داده انجام شده بود یوزر های بیشتری جمع آوری می شد ولی به دلیل محدودیت های زمانی این امکان وجود نداشت و من باید به روش سریع تری برای انجام این کار اقدام می کردم. نکته مهم دیگه ای که وجود داره اینه که بسیاری از افراد در توییتر فارسی صرفا خواننده هستند و با فاصله زمانی زیادی توییتی منتشر میکنند. بنابر این حتی اگر در یک بازه زمانی یک ماهه اسکریپت را اجرا می کردم شاید تعداد زیادی از افراد جمع آوری نمی شدند.امیدوارم تا به اینجا این مطلب براتون مفید بوده باشه. در پست بعدی به جمع آوری داده های سایر افراد که با احتمال بالایی فارسی زبان هستند می پردازم.ممنون که این پست رو خوندید .</description>
                <category>وصال دانشور</category>
                <author>وصال دانشور</author>
                <pubDate>Sat, 17 Oct 2020 13:00:38 +0330</pubDate>
            </item>
                    <item>
                <title>گراف کاوی - تحلیل داده های توییتر - قسمت دوم</title>
                <link>https://virgool.io/@vessaldaneshvar/%DA%AF%D8%B1%D8%A7%D9%81-%DA%A9%D8%A7%D9%88%DB%8C-%D8%AA%D8%AD%D9%84%DB%8C%D9%84-%D8%AF%D8%A7%D8%AF%D9%87-%D9%87%D8%A7%DB%8C-%D8%AA%D9%88%DB%8C%DB%8C%D8%AA%D8%B1-%D9%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%88%D9%85-qhsxx3qzfvoc</link>
                <description>به نام خداتو پست قبلی مختصر درباره پایان نامه کارشناسی نوشتم و قصد داشتم تو قسمت های بعدی مفصل توضیح بدم که تو هر بخش چیکار کردم.اگر پست قبل رو نخوندید توصیه میکنم حتما بخونید تا یه دورنما از پروژه ای که انجام دادم داشته باشید. https://vrgl.ir/TKNSG رفرنس اصلی این پژوهشگراف کاوی چیست؟گراف کاوی به تعریف خودمونی ، علم بررسی روابط موجود در یک جامعه هست. این یک تعریف خیلی علمی و دقیق از گراف کاوی نیست، من حس کردم به جای تعاریف خشک این مفاهیم رو با مثال شرح بدم.فرض کنید ما یک زمین کشاورزی داریم که با اینترنت اشیا آبیاری میشه و شرایط محیطی این زمین مثل رطوبت، دما، میزان باد و ... با استفاده از سنسور های مختلف سنجیده میشه. یک چالش مهمی که برای طراحی و جاگذاری این سنسورها و تجهیزات وجود داره ، مساحت زیاد زمین کشاورزی هست و نحوه ارتباط گرفتن بین سنسور ها با سرور مرکزی و پردازشگرها و انتقال پیام بین آنها. اینترنت اشیا در فضایی به مساحت یک خانه 80 متری یا دفتر کار 120 متری با تجهیزات قوی چالشی در انتخاب و جاگذاری تجهیزات ندارد. ولی زمانی که ما میخواهیم 10 هکتار زمین را با کمترین هزینه و با صرفه اقتصادی بالا تجهیز کنیم مسئله جاگذاری بسیار مهم و پر اهمیت میشود. گراف می تواند در حل این مسئله به ما کمک کند. به این صورت که به طور مثال هر سنسور دما با توجه به نوع و مدل انتخابی دارای محدویت های فاصله ای در ارتباط و توان انتقال پیام متفاوتی می باشد. میتوان تمام این تجهیزات را در قالب گراف مدل سازی کرد و مدل بهینه برای نحوه جاگذاری و فاصله بین این تجهیزات را به دست آورد. این یک مثال مرتبط از کاربرد این بحث بود و موارد متعددی رو میشه مثال زد که از علم گراف برای بهبود کارایی بشه استفاده کرد .شبکه های اجتماعی و گرافزمانی که شروع به جستجو برای پیدا کردن مسئله مناسب برای داده کاوی داده های توییتر بودم،کتاب هایی که با دو کلمه کلیدی داده کاوی و شبکه های اجتماعی مرتبط بودند رو بخش مقدمه و فصل اولشون رو خوندم. (خوبی کتاب فروشی های انقلاب اینه که میتونی اول مقدمشون رو بخونی و بعد انتخاب کنی که میخوای از چه کتابی استفاده بکنی ) اکثر کتاب هایی که در این زمینه نوشته شده بودند، بخش عمده ای از تحقیقات و مطالعاتشون زیر مجموعه گراف بود، بنابر این یکی از مهم ترین بخش هایی که میتونی که داده های شبکه اجتماعی رو به دانش تبدیل بکنه، مدل سازی شبکه اجتماعی به یک گراف و محاسبه خواص این گراف اولین گام برای تحلیل یک شبکه اجتماعی هست.اَه!! چقدر گراف ، مگه الگوریتم های کلاسیک داده کاوی چه ایرادی داره؟حقیقتی مهمی که وجود داره اینه که من الان دارم در مورد شبکه های اجتماعی صحبت میکنم، منظورم اینه که همه ی مدل های شبکه های اجتماعی، نه فقط توییتر ، نه فقط ویکیپدیا ، نه صرفا شبکه ایمیل ها و ...وقتی داریم خیلی جنرال صحبت میکنیم، عنصر مشترک بین تمام این شبکه ها صرفا گراف هستش. شاید من بخوام یه دسته بندی از آهنگ ها روی داده های اسپاتیفای داشته باشم، شاید با استفاده از بحث یادگیری عمیق بتونم یه دسته بندی با توجه به سیگنال ها و محتوای آهنگ به دست بیارم، اما نکته مهمی که وجود داره این هست که این الگوریتم فقط کاربردش در این مورد خاص هست ولی گراف یه کاربرد عمومی برای دسته بندی گره های شبکه اجتماعی داره.البته گراف محدویت های زیادی هم در پردازش کلان داده داره و وقتی وارد عمل میشیم، به شدت دست ما رو توی پوست گردو میزاره. من میتونستم از ابزار های دیگری برای کلاسترینگ استفاده بکنم ولی حس کردم با تحقیق در زمینه گراف، دانش بیشتری کسب خواهم کرد و علاقه داشتم که درباره این موضوعات تحقیق بکنم.تشخیص اجتماعات در شبکه های اجتماعیبعد از این همه مقدمه، من تازه شروع به نوشتن مسئله ای که قصد حل کردنش رو داشتم میکنم. تشخیص اجتماعات در شبکه اجتماعی توییتر، قصد من این بود که با استفاده از رابطه بین گره ها، گره ها رو دسته بندی بکنم.به طور مثال در حالت ایده آل  اگر تمام مشاغل و صنف ها در توییتر حضور فعال داشتند و این افراد با هم صنف ها و دوستان خود بیشترین ارتباط رو داشتند، در نهایت به ازای هر صنف یک گروه از گره ها وجود داشتند که همه ی آنها مشغول انجام کار مشابهی است. با توجه به این که هیچ یک از شرط های بالا وجود نداره و فضای توییتر بیشتر دارای جو سیاسی هستش و اکثر افراد با هویت های جعلی مشغول فعالیت در این شبکه های اجتماعی هستند، ایده بالا نتایج متفاوتی خواهد داشت.چرا اهمیت داره؟ چطور میتونیم ازش سود ببریم؟همان طور که در بخش قبل اشاره کردم، شرایط توییتر با توجه به فضای روزمره نویسی و فضای سیاسی حاکم و فعالیت افراد با اسامی جعلی به نحوی نیست که بتوان افراد را با توجه به شغل یا شهر یا ... دسته بندی کرد و حتی اگر بتوان چنین چیزی را تشخیص داد، سود آن برای ما چیست؟من به این پژوهش صرفا به عنوان سه واحد درسی برای دریافت مدرک کارشناسی نگاه نکردم و برام خیلی مهم بود که یک پژوهش کاربردی و پر استفاده باشه بنابر این مثالی که بالا برای طبقه بندی افراد مطرح کردم صرفا جهت آشنایی شما با فضای تحقیق بود و گروه بندی مشاغل قطعا هدف این تحقیق نبود. من چندین سال هست که توییتر فارسی رو دنبال میکنم و نسبتا با این فضا آشنا هستم و معمولا توی جریان اتفاقات و طوفان های توییتری یک پیشفرض که از سوی دو طرف وجود داره ربات بودن طرف رقیب هستش و من اینجا به خاطر این که هیچ گونه سوگیری احتمالی از مطلب به وجود نیاد، اسم هیچ جناح سیاسی و هشتگ مرتبطی رو نمیارم و سعی میکنم در فضای خنثی حرکت کنم. توی جریان هشتگ اخیری که اتفاق افتاد من از هر دو جناح تحلیل های بسته ای منتشر می شد و هر دو گروه ادعا هایی درباره اون طوفان توییتری داشتند، من به هر دو بزگرواری که اون تحلیل ها رو روی داده ها انجام داده بودند پیام دادم و متاسفانه هیچ کدوم نه دیتاهاشون رو در اختیار قرار دادند و نه از روش و جزئیات کار صحبت کردند. منظورم از تحلیل بسته اینه که فقط نتایج تحلیل رو منتشر کردند و روش کار رو شرح ندادند.با توجه به توضیحاتی که عرض کردم، هدف من در این تحقیق تشخیص گروه های سیاسی توییتر و ربات های توییتری بود، ابزار این کار هم گراف بود، که میتونستیم فارغ از محتوای توییت ها و اکانت ها، دسته بندی رو انجام بدیم. اهمیت این کار در ارزیابی درست اجتماع و خواسته های افراد در توییتر هست و یک معیار بسیار خوب برای سنجش کل محتوای توییتر فارسی هست. به طور مثال اگر زمانی در توییتر توییتی وایرال شد، یا اگر طوفان توییتری وجود داشت، میتوان به تفکیک ادعا کرد که چه گروه هایی در ایجاد این هشتگ نقش داشتند، چون قبلا افراد دسته بندی شده اند و دیتای دسته بندی شده به صورت پابلیک منتشر شده است. و سود این کار در شنیدن صدای واقعی مردم است.اَه! چقدر حرف میزنی!! برو سر اصل مطلبمن تو این پست قرار بود راجع به گراف کاوی صحبت بکنم ولی کمتر به مفاهیم گراف پرداختم و بیشتر مقدمه گفتم. قطعا کسی که بخواد گراف کاوی رو یاد بگیره میره کتاب و مقاله میخونه و این پست ها تجربه من از چیزهایی که باهاشون دست و پنجه نرم کردمه، در نتیجه من صرفا به صورت تیتر وار این مفاهیم رو مرور خواهم کرد و نه خبری از فرمول هست و نه جزئیات.قطربعد از این که یه گراف تعریف میشه، اولین و ساده ترین مفهومی که محاسبه میشه قطر هستش.خیلی ساده بخوام بگم، اگر عدد a رو به عنوان قطر یک گراف در نظر بگیریم، از بین کوتاهترین مسیر بین تمام زوج گره ها ، بزرگترین عدد قطر یک گراف یا همون a هستش.ماتریس های یک گرافزمانی که داریم یک گراف رو تحلیل می کنیم. فارغ از هدف تحقیق، شاخص های آماری رو مورد ارزیابی قرار میدیم، علاوه بر قطر، ماتریس های گراف نیز جزو شاخص های آماری محسوب می شوند. این ماتریس ها خواص گراف رو خیلی راحت تر میتونند استخراج کنند و در واقع ما یک گراف رو تبدیل به یک ماتریس کردیم که محاسبات روی اون راحت تر بشه. البته چون من از کتابخونه networkx استفاده کردم این تحلیل ها رو انجام ندادم و مستقیم رفتم سر اصل مطلب.الگوریتم تشخیص اجتماعاتبرای تشخیص اجتماعات روش های متنوع و رویکرد های مختلفی وجود داره و با توجه به کتابی که دست من بود، حدود 40 صفحه مطلب راجع بهش نوشته شده و چون کتاب قدیمی مال سال 2011 بود ، الگوریتم های زیادی هم اصلا صحبتی ازش نشده بود و این سرفصل خیلی گسترده است و اگر بخوایم مفصل راجع بهش توضیح بدیم، میشه چندین کتاب صرفا در مورد این الگوریتم ها نوشت، ولی من صرفا سه تا الگوریتم رو اسمشون رو میگم که یکی از این ها رو هم پیاده سازی کردم، اگر در آینده فرصت شد، درباره این الگوریتم ها یک پست بلاگ مجزا خواهم نوشت. الگوریتم ها : الگوریتم گیروان نیومن که تقریبا معروف ترین الگوریتم هست، الگوریتم ژائو ژانگ، الگوریتم لووائین، این سه الگوریتمی که گفتم برای کلان داده ها اصلا مناسب نیست و پیچیدگی محاسباتی بالایی داره، الگوریتمی که من استفاده کردم الگوریتم LPA بود که یکی از الگوریتم های مقیاس پذیر است. البته روش های بهبود یافته ای نیز برای این الگوریتم وجود داره ولی به دلیل مدل سازی با استفاده از networkx، محدودیت هایی برای اجرای الگوریتم مطلوب داشتم.چون این پست طولانی شد و شاید خوندنش براتون خسته کننده باشه، من سایر مطالب این حوزه رو خیلی تیتروار میگم و دربارشون توضیحی نمیدم. در این پژوهش از مفاهیمی که بالا توضیح دادم استفاده شده ولی مفاهیمی که در ادامه به صورت تیتروار میگم برای علاقه مندان این حوزه هستش.قدم زن های تصادفی (Random Walker)فرگشت در شبکه های اجتماعی الگوریتم های تاثیر اجتماعیالگوریتم های مکانیابی خبرهپیش گویی لینکمصورسازی شبکه های اجتماعیبرچسب زنی و کاربردهای آنجمع بندیمن در این پست به طور خلاصه یه کاربرد از گراف کاوی رو گفتم، اهمیت این موضوعات رو مطرح کردم و نهایتا مختصری درباره گراف ها نوشتم. هدف این پست آشنایی با گراف بود و قصد آموزش دادن نداشتم و سواد زیادی هم در این زمینه ندارم که بخوام دربارش بنویسم. تو قسمت بعدی درباره API توییتر خواهم نوشت و وارد فضای کد نویسی خواهیم شد که به نظرم از این دو پستی اولیه به شدت جذاب تر خواهد بود.</description>
                <category>وصال دانشور</category>
                <author>وصال دانشور</author>
                <pubDate>Tue, 13 Oct 2020 10:11:06 +0330</pubDate>
            </item>
                    <item>
                <title>تحلیل داده های توییتر - مقدمه</title>
                <link>https://virgool.io/@vessaldaneshvar/%D8%AA%D8%AD%D9%84%DB%8C%D9%84-%D8%AF%D8%A7%D8%AF%D9%87-%D9%87%D8%A7%DB%8C-%D8%AA%D9%88%DB%8C%DB%8C%D8%AA%D8%B1-%D9%85%D9%82%D8%AF%D9%85%D9%87-dizgjabztly3</link>
                <description>به نام خداسلامپروژه پایانی کارشناسیتو این پست میخوام راجع به پروژه پایانی مقطع لیسانس که 18 شهریور 1399 دفاع کردم توضیح بدم.دلیل این که حدود پنج ماه هست پست نذاشتم این هست که ، خیلی فشرده درگیر پروژه پایانی بودم و اصلا فرصت نوشتن رو نداشتم. برای توضیح جامع و کامل پروژه پایانیم فکر کنم نیاز به 5 6 تا پست 10 دقیقه ای باشه.موضوع پروژه پایانی من تحلیل داده های توییتر با الگوریتم های داده کاوی هستش.خب عنوان پایان نامه خیلی گنگ و نامفهومه ، اولا توییتر هزار مدل داده داره. دوما هزار مدل الگوریتم برای داده کاوی وجود داره. دلیل اینکه عنوان پایان نامه من انقدر گنگ و نامفهومه این هستش که وقتی شروع کردم فقط می دونستم که میخوام درباره داده کاوی باشه چون هم زمان زیادی برای یادگیریش صرف کردم و هم علاقه زیادی نسبت بهش دارم. و به همین دلیل دنبال چند تا موضوع مرتبط با داده کاوی گشتم ، از بین چند تا موضوعی که انتخاب کرده بودم ، داده های توییتر رو استاد راهنما انتخاب کرد. و تحقیق و کاری که روی داده های توییتر انجام دادم بعد انتخاب عنوان پایان نامه بود. از طرفی هم میترسیدم که عنوان پروژه ام رو چیزی بذارم که نتونم انجامش بدم به خاطر همین یه عنوان جنرال برای پایان نامه انتخاب کردم که راه گریزی داشته باشم. ولی الان که تکمیل شده و دفاع کردم، میتونم عنوان بهتری براش انتخاب بکنم : تشخیص اجتماعات توییتر فارسی با استفاده از رابطه میان کاربرها با استفاده از الگوریتم های گراف کاویدورنمامن تو این پست ابتدا مقدمات بحث رو مطرح میکنم و توی پست های بعدی درباره قسمت های مختلف پروژه مفصل تر شرح میدم.مرور ادبیاتسخت ترین قسمت پایان نامه من مربوط میشه به نوشتن مرور ادبیات ، از طرفی بحث گراف خیلی بحث گسترده ای هست و تقریبا اکثر افراد هیچ پیشینه ذهنی راجع بهش ندارند ، حتی بچه هایی که تو دانشگاه مهندسی میخونن هم بیشترین چیزی که ازش میدونند مربوط میشه به فصل اول کتاب گسسته چهارم دبیرستان. بنابر این هم خودم باید دربارش خیلی میخوندم و هم به نحوی نگارشش رو انجام می دادم که قابل فهم باشه. تو پست بعدی که درباره مرور ادبیات میخوام بنویسم، از پایه درباره گراف ها خیلی خوانا و قابل فهم مینویسم ( به زبون خودمونی) و کمتر شبیه پایان نامه که پر از رفرنس و خشکه توضیح میدم. توی مرور ادبیات یه بخشی هم درباره توییتر توضیح میدم که خب به نظرم توی این پست ها لازم نیست و توضیح  واضحاته.من برای مرور ادبیات یک کتاب خوندم، حدودا 5 6 تا مقاله و تعداد زیادی پست بلاگ. که خب سخت ترین قسمتش همون کتاب بود و هم حجم بالایی داشت و هم ترجمه خوبی نداشت و از حوصله خارج بود.کتابی که من خوندم تحلیل شبکه های اجتماعی (د. مهدی اسماعیلی، نیازدانش) بود. که ترجمه کتاب Social Network Data Analytics هستش .کتاب Social Network Data Analyticsجمع آوری دادهیکی از بخش های پر چالش پروژه بحث جمع آوری داده های توییتر بود که من قبل از این که مباحث تئوری رو شروع بکنم شروع به جمع آوری داده کردم و توی پستی که راجع به جمع آوری داده خواهم نوشت میگم روش بهینه جمع آوری داده چی بود و چه اشتباهاتی در حین جمع آوری داده مرتکب شدم. البته برای من جذاب ترین قسمت انجام این پروژه مربوط به همین قسمت هستش و خیلی خوشحالم که این پروژه رو انجام دادم و به شدت باعث شد تجربه ام نسبت به کار با بیگ دیتا بالا بره و حس کردم که چقدر نیاز دارم آپاچی هدوپ رو یاد بگیرم.در این قسمت مفصل راجع به Api توییتر خواهم نوشت، از مشکلاتی که برای فعال سازی اکانت توسعه دهنده داشتم تا محدودیت های EndPoint ها و جمع آوری رابطه بین افراد و توییت ها .همینطور درباره پایگاه داده های گرافی مفصل مطلب خواهم نوشت و تجربه ای که در عمل از Neo4j , MongoDB , SQL Server  داشتم رو بیان خواهم کرد .پایگاه داده neo4jدر انتها باید بگم که زبان برنامه نویسی که برای جمع آوری داده و مدلسازی ازش استفاده کردم پایتون هست و از کتابخونه tweepy استفاده کردم. و برای جمع آوری داده از یه سرور مجازی ضعیف استفاده کردم (در واقع یه ابرک از سروریوس آروان گرفتم) که مشکلات فیلترینگ و همچنین حجم بالای داده رو بر طرف بکنم.کتابخانه tweepyمدلسازی داده هامن هم مثل اکثر افرادی که تو حوزه داده کاوی مشغول هستند، برای تمیز کردن داده ها و پیش پردازش ها از دیتافریم پانداس استفاده میکنم ولی این ابزار برای مقدمات کار و پیش پردازش ها مناسب هستند و الگوریتم های گراف کاوی رو نمیتونیم توی مجموعه scipy پیدا بکنیم و از یه کتابخونه مجزا برای تحلیل های مرتبط با گراف استفاده میشه. پایتون یه کتابخونه برای گراف داره به اسم networkx که بهترین کتابخونه پایتونی برای گراف هستش و من هم برای اجرای الگوریتم ها از این کتابخونه استفاده کردم. که اخیرا هم روی یکی از ایشوهاش پول ریکوئست فرستادم networkxترسیم داده ها رسم گراف و روابط بینشون تو ابعاد بالا به سادگی رسم داده های یک نمودار x-y نیست و پیچیدگی زیادی داره. بنابراین من از یه ابزار مجزا برای این کار استفاده کردم که تصویرش رو اول پست به عنوان دورنما دیدید. Graphistry به نظر من بهترین ابزار برای ترسیم گراف ها هستش و اگر گراف با ابعاد بالا دارید ، این سرویس برای این ایجاد شده. البته بسیاری از امکاناتش هزینه بالایی داره.graphistryسخن پایانیمن تو این پست یک مقدماتی رو مطرح کردم و در پست های آینده درباره هر کدوم به تفصیل خواهم نوشت (البته اگر تنبلی نکنم). کد های مربوط به جمع آوری داده و نوت بوک های ژوپیتری که برای تحلیل داده نوشتم رو روی گیت هاب قرار خواهم داد. احتمالا یه سایت هم برای آموزش مفاهیم گراف کاوی درست میکنم چون که محتوای فارسی برای تحلیل شبکه های اجتماعی کمتر توی وب فارسی وجود داره و من تنها چیز مناسبی که پیدا کردم مربوط به آموزش های این سایت بود.</description>
                <category>وصال دانشور</category>
                <author>وصال دانشور</author>
                <pubDate>Sat, 03 Oct 2020 21:34:36 +0330</pubDate>
            </item>
                    <item>
                <title>اولین مسئله تمام دوره های یادگیری ماشین : تشخیص قیمت خانه</title>
                <link>https://virgool.io/@vessaldaneshvar/%D8%A7%D9%88%D9%84%DB%8C%D9%86-%D9%85%D8%B3%D8%A6%D9%84%D9%87-%D8%AA%D9%85%D8%A7%D9%85-%D8%AF%D9%88%D8%B1%D9%87-%D9%87%D8%A7%DB%8C-%DB%8C%D8%A7%D8%AF%DA%AF%DB%8C%D8%B1%DB%8C-%D9%85%D8%A7%D8%B4%DB%8C%D9%86-%D8%AA%D8%B4%D8%AE%DB%8C%D8%B5-%D9%82%DB%8C%D9%85%D8%AA-%D8%AE%D8%A7%D9%86%D9%87-u4nlwuzlu7au</link>
                <description>به نام خدافکر کنم تو کل جهان اپیدمی شده که بعد از توضیح دادن رگرسیون خطی به عنوان اولین حوزه کاربرد ، تشخیص قیمت خونه رو مثال بزنند .house_predictionمنم میخوام به عنوان اولین بلاگ پستی که قراره درباره داده کاوی توش بنویسم ، یه دیتاست معقولی رو معرفی بکنم و سعی بکنم باهاش کار بکنم.اگه حقیقت رو بخواید ، اینجا بیشتر شبیه بوم نقاشی منه و دوست دارم مسیر پیشرفتم رو ذره ذره ثبت بکنم و البته الان چند تا پست درفت شده هم دارم درباره امنیت و تحلیل داده که یکم پیچیده تر هستند.سعی میکنم این سری پست هایی که درباره تحلیل داده میخوام بنویسم یه روند صعودی از نظر پیچیدگی داشته باشه.خیلی وقت ها ما مفاهیم زیادی را وارد مغزمون میکنیم و اصطلاحا یادمیگیریم ولی تا وقتی که خودمون دست به کار نشیم تو ذهنمون ثبت نمیشه . اگر این ثبت شدن همراه با بازخورد باشه ، به مراتب اثرش برای تو ذهن موندن بیشتر میشه . ویرگول برای من دقیقا مصداق همین موضوعه و ثبت میکنم و بازخورد میگیرم و رشدم رو مشاهده میکنم و این باعث میشه که هم انگیزه طی کردن این مسیر که حدودا از یک سال پیش شروع کردم بیشتر بشه و هم افرادی که تازه کارند به منابع بهتری دست پیدا بکنند . و مهمتر از همه اینکه به سمت کاربرد نزدیک بشیم و از فضاهای انتزاعی دور بشیم و کاری رو بکنیم که بیشترین ارزش افزوده رو داشته باشه.گاهی ما با موضوعاتی مواجه میشیم که از لحاظ پیچیدگی در رده بالایی قراردارند ولی حقیقتی که وجود داره اینه که موضوعات پیچیده قابل تفکیک به موضوعات ساده هستند و اگر بتوانیم مسائل ساده را به خوبی حل بکنیم ، قطعا از پس حل مسائل پیچیده نیز برخواهیم آمد . و مسئله ای مانند پردازش تصویر همان رگرسیون لجستیک با ابعاد بالاتر است و پیچیدگی طولی پیدا کرده و نه عرضی.من سعی کنیم از مفاهیم ساده شروع بکنم و با فیچر های کم شروع بکنیم و توی همین پست بتونیم فیچر هامون رو بیشتر بکنیم ( اگه مطلب خیلی طولانی بشه منتشر میکنم و نمیتونم دوباره فیچر های جدید رو امتحان بکنم )همزمان با این نوشته در کولب ، نوت بوکش رو هم اجرا میکنم و کد ها رو به اشتراک میذارم. و انتهای نوشته لینکش رو میذارم.بریم سراغ دیتاست!!معرفی دیتاستمن همیشه به اولین جایی که برای پیدا کردن دیتاست سر میزنم کگل هستش و اغلب میتونم دیتاستی که میخوام رو پیدا بکنم و حتی سرچ کردن تو کگل از سرچ کردن تو گوگل هم نتایج بهتری داره.بنابر عادت همیشگی ، تو کگل سرچ کردم و یه دیتاست خوب پیداکردم و لینکشو پایین میزارم . https://www.kaggle.com/shree1992/housedata تو این دیتاست فعلا برای سادگی ما از 5 تا فیچر که خودمون هم ارتباط منطقی بینشون رو میدونیم شروع خواهیم کرد و اگر دیدیم مدلمون دقت کافی رو نداره میریم سراغ فیچر های بیشتر و ترکیب کردن و ...توضیح درباره ارتباط منطقی : منظورم از ارتباط منطقی یه ارتباطی مثل افزایش مساحت منجر به افزایش قیمت میشود ، حقیقت اینه که تو خیلی مسائل اصلا ارتباطات قابل کشف نیست مثلا نمیتونیم بگیم لزوما اگر مقدار ستون 15 سطر 45 عکسی که داریم بررسی میکنیم بیشتر باشه ، احتمال وجود گربه تو اون عکس بالامیره ( قبول دارم مثالی که زدم خیلی انتزاعی و دور از ذهن بود ولی مفهوم رو کاملا میرسونه و در آموزش اتفاقا این روش خیلی مرسومه) و اتفاقا بیشترین کاربرد داده کاوی زمانی هست که ما نمیتونیم ارتباطات منطقی پیدا بکنیم و همه چیز ضمنی بیان میشه.خب ما طبق روش کریسپ میخوایم بریم جلو.در واقع این روش یکی از معروفترین متدولوژی های مدیریت پروژه های داده کاوی هستش. و اگه قصد داشته باشیم در یک سازمان ، یک محصول مبتنی بر داده طراحی و اجرا بکنیم ، یکی از الزامات موفق انجام دادنش داشتن یک متدولوژیه . و انتخاب این متدولوژی هاتون هم به شدت بستگی به پروژه داره.و اگه بیشتر بخواید درباره این متدولوژی ها بدونید کافیه سرچ کنید : Data Science Project Management Methodologiesروش Crisp-DMروش crisp در واقع سلسله مراتب انجام دادن یک پروژه داده کاوی رو برای ما به صورت سیستماتیک تشریح میکنه. و منم چون مدل معروفیه اینجا آوردمش. و حقیقت اینه که حتی اگه کسی به ما نمیگفت که اینجوری کار بکنید ، شاید همینجوری کار میکردیم. ولی کار سیستماتیک خیلی مهمه. اغلب باعث میشه نتیجه های بهتری بگیریم.و لینک ویکیپدیاش رو هم میزارم که اگه خواستید کامل تر بدونید دربارش بخونید. https://en.wikipedia.org/wiki/Cross-industry_standard_process_for_data_mining 1 - فهم بیزینس و کسب و کارما تو مرحله اول باید یک مسئله مشخص و دقیقی داشته باشیم و بخوایم از ابزار های داده کاوی برای حلش استفاده بکنیم.متاسفانه این روز ها خیلی ها چون ابزار ها رو بلدند و روی مفاهیم و کاربرد هاش مطالعه ندارند حس میکنند داده کاوی بی فایده است.به نظر من اگر این مرحله رو خیلی کم روش وقت بگذارید یه پروژه ای تحویل میدید که قطعا با روش های ساده تری میشد حلش کرد و یا این که مسئله اصلی و دغدغه اون سازمان نیست .و شما عملا هزینه و وقتتون رو تلف کردید. و خیلی شبیه طراحی بیزینس مدل ها برای شروع کسب و کاره . حتما باید از یه مدل ذهنی به یک نوشته تبدیل بشه.برای مسئله ما شاید بشه توی یک خط خلاصش کرد ولی توی پروژه واقعی شامل خیلی چیزها میشه.ما میخوایم قیمت خونه های جدید رو از روی قیمت خونه هایی که تو دیتاستمون هست و ترین کردیم  ، تخمین بزنیم. کاری که یک متخصص معامله املاک توی 5 سال یاد میگیره رو میخوایم تو 3 دقیقه به کامپیوترمون یاد بدیم.2 - فهمیدن داده هاتوی این مرحله ما بیشتر دست به کد میشیم و داده ها رو نگاه میکنیم و سعی میکنیم که بفهمیم ویژگی هایی که برای مدل سازی مهم هستند چی هستند.اول داده ها رو وارد دیتافریممون میکنیم و یه نگاه بهشون میندازیم.حتی اگر دیتاستمون در حدود گیگ هستش معمولا یه بخشی از داده ها رو با پانداس بررسی میکنیم چون دستورات sql یه مقدار برای ابتدای کار پیچیده هستش.import pandas as pd
df = pd.read_csv(&#039;data.csv&#039;)
df.head()مثلا صرفا یک لیست از اعداد رو هیچ وقت نمیشه از توش نکته مهمی استخراج کرد ولی اگر به ما میگن این اعداد سری زمانی یک سهام هستش ، اونوقت خیلی کار ها میشه باهاش کرد.البته بحث جمع آوری داده ها هم میشه توی این بخش گنجوند ولی چون ما داده هامون آماده است بیشتر باید بریم بفهمیم که هر ستون معنی دقیقش چیه . مثلا توی همین داده های ما یه ستون به اسم floor وجود داره که خب دو مفهوم داره ، یکی این که ساختمون چند طبقه است و یک مفهوم دیگه این که خونه تو طبقه چندم آپارتمانه . باید حواسمون باشه که خوب بفهمیم که داده ها دارند به ما چی میگن.موارد مربوط به خونه نسبتا واضحه و من 4 تا فیچر رو به صورت خطی ابتدا مدل میکنم و بعد برای بهتر شدن مدل رو غیر خطی میکنم و فیچر های بیشتری بهش اضافه میکنم.لیست فیچرهایی که میخوام تو مدل اولیه استفاده بکنم : floor , bedrooms , bathtooms , sqft_living , yr_built هست که کاملا واضحه به ما دارند چی میگن . به ترتیب تعداد طبقات و اتاق و حمام و مساحت و سال ساخت رو دارند بیان می کنند.3 - آماده سازی داده هامن الان میخوام یه مدل با رگرسیون خطی ترین بکنم ، که التبه درست تر بود که قبل از این که بخوایم مدل رو بسازیم بخوایم هر فیچر رو بررسی بکنیم و تاثیرش روی قیمت رو بسنجیم و همبستگی رو حساب بکنیم و مواردی از این دست ولی چون دیتاست ما خیلی تمیزه ، نکته خاصی از توش در نمیاد و منم سعی میکنم این پست رو جوری بنویسم که خوانندگانش حوصلشون سر نره و این موارد رو توی نوت بوک کولب لحاظ خواهم کرد.ولی یه مورد که حتما باید انجام بدم ، اینه که داده ها رو نرمال بکنم. و همرو بیارم توی بازه مشخصی که همه داده ها تاثیر یکسانی بزارن و فقط وزن ها نشون دهنده تاثیر هر پارامتر برای تخمین باشه و به روش های متعددی این کار انجام میشه. من در اینجا از روش min-max استفاده میکنم که فرمولش به صورت زیره :min-max-methodبرای نرمال کردن داده ها من فیچر ها رو توی متغیر x میریزم و بعد x رو نرمال میکنم.x = df[&#039;bathrooms&#039;,&#039;bedrooms&#039;,&#039;floors&#039;,&#039;sqft_living&#039;].copy()
x.head()input-datafrom sklearn.preprocessing import minmax_scale
x_scale = minmax_scale(x)
x_scale.head()normalize-data4 - مدل سازیبرای این که پست خیلی طولانی نشه من خیلی سریع با sklearn مدلمون رو میسازم ، ولی حتما تو پست های بعدی رگرسیون رو کامل توضیح میدم و فرمول هاش رو هم ذکر میکنم.from sklearn.linear_model import LinearRegressionmodel = LinearRegression()model.fit(x_scale,y)من متغیر x رو نرمال کردم و داخل متغیر x_scale ریختم و از اون برای مدل سازی استفاده کردم.ما مدلمون رو ساختیم ولی حقیقتا مدل خیلی رو هوا جواب میده بنابر این تو قسمت های بعدی در مورد ارزیابی مدل های پیش بینی صحبت میکنم و همچنین سعی میکنم مدل فعلی رو بهبود بدم.برای اینکه ورودی بدیم و خروجی بگیریم هم میتونیم از دستور زیر استفاده بکنیم.model.predict(input)امیدوارم خسته کننده نبوده باشه.این پست خیلی جذاب نبود ولی سعی میکنم دیتاست های جالب تر و جذاب تری رو برای پست های بعدی آماده بکنم.این هم لینک کولب که تمام کد ها و ویژوال ها رو توش ببینید و احتمالا پستی که میخوام فیچر اضافه بکنم و روابط غیر خطی رو هم پوشش بدیم رو ادامه همین بنویسم. https://colab.research.google.com/drive/1U0pdSPzIUeP5cUF6ax7cmMh_4RpEKQtq?usp=sharing ممنون که تا اینجا خوندید.</description>
                <category>وصال دانشور</category>
                <author>وصال دانشور</author>
                <pubDate>Sun, 17 May 2020 20:35:43 +0430</pubDate>
            </item>
                    <item>
                <title>پیوند فلسفه و یادگیری ماشین - چرایی حل مسئله با داده کاوی</title>
                <link>https://virgool.io/@vessaldaneshvar/%D9%BE%DB%8C%D9%88%D9%86%D8%AF-%D9%81%D9%84%D8%B3%D9%81%D9%87-%D9%88-%DB%8C%D8%A7%D8%AF%DA%AF%DB%8C%D8%B1%DB%8C-%D9%85%D8%A7%D8%B4%DB%8C%D9%86-%DA%86%D8%B1%D8%A7%DB%8C%DB%8C-%D8%AD%D9%84-%D9%85%D8%B3%D8%A6%D9%84%D9%87-%D8%A8%D8%A7-%D8%AF%D8%A7%D8%AF%D9%87-%DA%A9%D8%A7%D9%88%DB%8C-eojvwkokjmmz</link>
                <description>به نام خدامن به عنوان کسی که حدودا یکساله به صورت جدی حوزه یادگیری ماشین رو دنبال میکنم و شغل مرتبط با این موضوع داشتم . همیشه یک سری سوالاتی برام گنگ و مبهم بوده و بعضا توی مسیر یادگیری دلسرد میشدم.این اولین پست من درباره تحلیل داده هستش و چون مطالعاتی تو این حوزه داشتم و فعالیت مستمر دارم ، علاوه بر این که دوست دارم چیز هایی که یاد میگیرم رو با بقیه به اشتراک بذارم . یک مشکلی که خودم دارم رو هم حل میکنم، این مشکل مربوط به فراموش کردن چیز هایی که یادگرفتم هستش.با نوشتن بیشتر تو ذهنم تثبیت میشه و همچنین اگر خواستم مرور بکنم ، متنی که با معیار های ذهنی خودم نوشته شده احتمالا بیشترین کمک رو بهم میکنه و از رفرنس ها بیشتر بهم کمک خواهد کرد ، بنابر این تصمیم گرفتم اولین پست مرتبط با داده رو بنویسم.برای خالی نبودن عریضه ، از depositphotos دزدیدم :((چرا باید از چرایی حرف بزنیم؟بعد از این که تصمیم گرفتم اولین پست مرتبط با داده کاوی رو بنویسم ، دو تا حوزه جذاب تو ذهنم بود و قسمت زیادیش رو هم نوشتم ولی ماجرا این بود که با ابزار هایی که بلد بودم و قاعده هایی که مشخص بود یک کار هائی میکردم و نهایتا یه مدل ترین شده داشتم و تمام. ولی درباره اینکه چرا و کجا باید استفاده بشه حرف هام مختصر بود و حس کردم قبل از این که با ابزار ها کار بکنم باید بگم چرا ؟چرا؟ چرا؟مهم تر از این که تکنیک و ابزار رو بلد باشی اینه که بدونی باید باهاش چیکار بکنی و حوزه کاربرد رو توش پیدا بکنی خیلی مهم تر از روش کاره و به نظرم الان داده کاوی چون علاقه مندان زیادی پیداکرده ، مسائلی که میتونن رَوش حل های متفاوت و بهتری داشته باشندبا ابزار داده کاوی حل میشه و شاید روش های به مراتب بهتری برای حل مسئله مورد نظر وجود داشته باشه ولی چون داده کاوی ترنده ، همه میخوان از این ابزار استفاده بکنند.به قول قدیمیا گره ای که با دست باز میشه رو با دندون باز نمیکنن.اجازه بدید این مثال مسخره ای که هزاران بار درباره ابزارها شنیدید رو دوباره بازگو بکنم ، چاقو یک ابزاره و یک فردی میتونه باهاش جون یک نفر رو نجات بده و یک فرد دیگه میتونه بهش آسیب برسونه و پیداکردن فلسفه زندگی به شدت مهم تر از بلد بودن ابزار هاست.جدی نگیرید!!تمام این چیز هایی که مینویسم ، بیشتر جنبه فلسفی داره و تکنیکال نیست ، بنابر این علاوه بر این که یک سال تجربه تو حوزه به این وسعت کمه برای اظهار نظر کردن و ممکنه نظرم عوض بشه ، این موضوع مهمه که هیچ متری برای درست یا غلط بودن حرف هام وجود نداره و دلیل این نوشته اینه که یک چرایی تو ذهن شما شکل بگیره و برید بیشتر روش تحقیق بکنید . و البته که خیلی خوشحال میشم که نظراتتون رو هم بدونم.از داده کاوی چرا باید استفاده بکنیم؟بدون شک داده کاوی ابزار قدرتمندیه که مسائلی که تا به امروز برای ما حل نشدن رو میتونه حل بکنه. دلیلش هم بیگ دیتا و حجم زیادی از داده هایی که وجود دارند هست . ما از داده کاوی استفاده میکنیم که مسائلی که هیچوقت جوابی براشون نداشتیم رو پیدا بکنیم و شاید حتی مسائلی رو مطرح بکنیم که چون تا به حال ابزار حل اون مسئله وجود نداشت به فکرمون خطور نکرده بود . اما این روزها از این ابزار داره برای کاربرد هایی استفاده میشه که مدت زمانی از حل اون مسئله گذشته و میشه گفت بهترین روش حل براش مطرح شده و ما نیاز نداریم که بخوایم چرخ رو از اول اختراع بکنیم .البته من منظورم تحقیقات دانشگاهی نیست ، بلکه پروژه های صنعتی که هزینه و زمان زیادی روی این موضوع دارند صرف میکنند . تحقیقات دانشگاهی اتفاقا خوبه چون ما قبل از این که هزینه زیادی بکنیم میتونیم بفهمیم کدوم روش بهتره .نکته دومی که حتما باید بهش توجه بکنیم اینه که یه سود و زیان سرانگشتی قبل از انجام پروژه باید داشته باشیم .  به طور مثال :ما یک مسئله ای داریم ، و اتفاقا بهترین ابزار حل این مسئله داده کاویه بدون هیچ شکی. ولی داده کاوی به ما کمک نمیکنه چون که هزینه هایی که ما برای توسعه پرداخت میکنیم رو جبران نمیکنه و اگه هیچ کاری نکنیم اتفاقا سود بیشتری میکنیم.من بر خلاف خیلی ها که فکر میکنند داده کاوی به دلیل حجم داده های زیادی که به واسطه انقلاب دیجیتالی به وجود اومده در حال گسترشه حس میکنم بیگ دیتا دلیلش نیست و میل ما انسان ها برای متفاوت بودنه که این ابزار رو داره توسعه میده ، به طور مثال : فرض کنید یک ایمیل از یک فروشگاه اینترنتی دریافت کردید و شما رو با اسم خطاب قرارداده و علایقتون و کالاهایی که قبلا بازدید کردید رو هم براتون لیست کرده ، قطعا اگر شما ندونید این کارها توسط کامپیوتر ها انجام میشه ، میزان هیجان دریافت این ایمیل خیلی بیشتر خواهد بود و دلیلش هم این میل ذاتیه انسانه که دوست داره شناخته بشه و با بقیه فرق بکنه.اگر ما با کل انسان های این کره خاکی صحبت بکنیم و بهشون بگیم &quot;من میدونم ; تو با بقیه فرق داری&quot; احتمالا   70 درصدشون قصه دلشون باز میشه و شروع میکنند به گفتن اینکه ، &quot;آره هیچکس منو درک نمیکنه و ...&quot; که خب این مسئله غیر ممکنه ولی میل به متفاوت بودن باعث میشه انسان ها حس بکنند با بقیه فرق دارند.قطعا یه بخشی از رشد داده کاوی مخصوصا توی بیزینس هایی که از پایه هوش مصنوعی نیستند مربوط میشه به ایجاد حس تمایز کردن توی مشتریاشون ، مثل مغازه داری که وارد مغازش میشید و شما رو به اسم میشناسه و شما هم حس راحتی بیشتری باهاش میکنید و بیشتر خرید هاتون رو از اون میکنید. اگه این اتفاق تو مارکت های انلاین هم بیوفته یعنی داده کاوی تونسته موفق بشه.(مثل سیستم های ریکامندر)مثال بزنیم مبحث جا بیوفته  :))من میخوام 2 تا مثال کوتاه بزنم که درک کنید که از چی نگرانم و چرا حس میکنم داره در مورد داده کاوی اغراق میشه. و این اغراق شدن نه تنها به متخصصین اون حوزه لطمه وارد میکنه بلکه باعث میشه حوزه های کاربردی واقعی اون حوزه هم زیر سوال بره و معتقدم همیشه واقع بینی بیشترین کمک رو میکنه.مثال اولیک کسب و کار 10 نفره رو فرض کنید که خرده فروشی آنلاین هستش و نسبتا هم موفقه و سود خالص 50 میلیونی در ماه داره با توجه به تبلیغاتی که شنیده ، حس میکنه که داده کاوی میتونه بهش کمک بکنه. و یک متخصص داده کاوی رو استخدام میکنه . من حس میکنم این کار غلطه به دو دلیل : دلیل اول : قطعا یک تیم داده کاوی 5 نفره میتونه 10 برابر یک فرد متخصص بازدهی داشته باشه و کار تیمی به شدت توش پر رنگه و از این بابت تنها بودن تو فرایند کاوی دشواره. واقعا سخته که یه ادم بخواد تمام ابعاد اون کسب و کار رو بخواد به شکل یک مدل داده مبنا در بیاره و شاید مدیر مجموعه که از اول اون مجموعه رو شکل داده ، بتونه بدون نیاز به مفاهیم داده کاوی  و تنها با ابزار های مارکتینگ این رشد رو ایجاد بکنه و برون سپاری کردن مسائل داده کاوی توی مجموعه هایی که به این شکل هستند و هسته اصلی کسب و کارشون مرتبط با داده کاوی و هوش مصنوعی نیستش و نسبتا کوچک هستند بهترین راه حل هستش که اتفاقا گروه سکان هم داره یک پلتفرم برای این شرکت ها ایجاد میکنه که یک بازی برد برد رو ایجاد میکنه.دلیل دوم : حتی اگر فرض بکنیم اون متخصص داده کاوی میتونه سود خالص 50 میلیونی ما رو به 70 میلیون افزایش بده باز هم باید توجه بکنیم که متخصص های داده کاوی حقوق های بالائی دریافت میکنند و ریسک بالائی برای کسب و کار داره.مثال دومیک کارخونه که کارش تولید بلور و شیشه هستش و تعداد زیادی کارمند داره و قطعا سود خالص ماهانه اش تو اوردر چند ده میلیارده و شاید فکر کنید داشتن حتی یک تیم متخصص داده کاوی براش هزینه ای نداشته باشه و بودنش  بهتر از نبودنشه اما به نظر من اگه بدون هدف انجام بشه ، اتفاقا نتایج بدی داره.نتیجه بدش اینه که مجبوره به آدم هایی که دقیقا نمیدونند دارند چیکار میکنند حقوق های بالایی بده و حسادت بقیه اعضای مجموعه ، خسارت بدی میزنه. و ما بقی مجموعه شاید وقتی همچنین چیزی رو ببیند  انگیزشون رو از دست بدند و کارشون رو خوب انجام بدند.راه درستش اینه که بیاد چالش ها و مشکلاتش رو مطرح بکنه و یک چلنج بزاره ، که من همچنین مشکلی دارم و هر کی حل بکنه درصدی از سود انجام این کار رو بهش میدیم. اینجوری هم انگیزه افراد حفظ میشه و هم اینکه میدونن دقیقا دارند چیکار میکنند . بی هدفی و تعریف نکردن دقیق مسئله آفت بزرگیه .دقیقا مثل کاری که اخیرا datadays شریف انجام داد ، مسئله تپسل مطرح شد و متخصص ها اومدند سعی کردند مشکل رو حل بکنند.سخن پایانیهمه چیزهایی که نوشتم بدیهیه ولی متاسفانه همین چیزهای واضح و بدیهی به هزار و یک دلیل غلط انجام میشه.من توی پست های بعدی خیلی تکنیکالی روش های داده کاوی رو توضیح میدم و سعی میکنم حوزه های کاربردی که جذابه رو مطرح بکنم و با یک دیتاست پابلیک یک مدل ترین بکنم. خودم هم مباحث فنی رو بیشتر دوست دارم ولی به نظرم این پست با زبان قاصر من از همه ی اون پست ها مهم تره.قضاوت با خودتون.ممنون که تا به اینجا خوندید ، شاد باشید.</description>
                <category>وصال دانشور</category>
                <author>وصال دانشور</author>
                <pubDate>Thu, 14 May 2020 17:26:32 +0430</pubDate>
            </item>
                    <item>
                <title>تجربه من از GRAPH API INSTAGRAM (قسمت چهارم)</title>
                <link>https://virgool.io/@vessaldaneshvar/api-instagram-s4-orndhpopthwc</link>
                <description>به نام خداسلامسعی میکنم این پست ، قسمت آخر کار با Graph API Instagram باشه .تو پست قبلی به اینجا رسیده بودم که پیجمون رو ساختیم ، بیزینس پیجمون رو هم ساختیم و به اکانت اینستاگرام اضافش کردیم و همچنین اپی که تو دولوپر فیسبوک ساختیم رو هم به بیزینس پیج اضافه کردیم . http://vrgl.ir/6Jnwv تو قسمت قبلی یه کامنت داشتم ، با این مضمون که درباره این موضوع تو وب فارسی چیزی پیدا نکرده ، فارغ از این موضوع که خیلی خوشحال شدم از اینکه شاید چیز هایی که مینویسم به درد یکی بخوره ، یه توصیه برای این عزیز دارم :سعی کن داکیومنت های رسمی رو بخونی و زبانتو قوی بکنی.چون قطعا هزار تا موضوع دیگه وجود داره ، که شاید بهش نیاز داشته باشی ولی دربارش توی وب فارسی نتونی چیزی پیدا بکنی.اما الان وقتش رسیده بریم سراغ Graph API Explorer و بهش دسترسی های مورد نیاز اینستاگرام رو بدیم .من لیست این دسترسی ها رو از لیستی که خودم اضافه کردم ، بهتون میگم و این شاید با داکیومنت رسمی متفاوت باشه و من یه سری دسترسی های الکی بهش اضافه کرده باشم.لیست دسترسی هایی که باید اضافه بکنید تو تصویر پایین معلومه .permissionبعد از اینکه دسترسی های بالا رو بهش دادیم میتونیم از سه طریق اکسس توکن بگیریم .من از یوزر اکسس توکن استفاده کردم ، البته خیلی قاعدتا نباید با هم فرقی داشته باشند .فکر کنم اگه از پیج توکن استفاده بکنید براتون بهتره ، چون پیج های مختلفتون با هم قاطی نمیشن .بعد از اینکه اقدام بکنید و روی دکمه Get Access Token  بزنید ، یه صفحه باز میشه که احتمالا رمز فیسبوک و روی یه سری دکمه باید کلیک بکنید و تمام .اگر هم نیاز داشتید که تصویری ببینید میتونید از این لینک کمک بگیرید . https://developers.facebook.com/docs/instagram-api/getting-started بعد از اینکه اکسس توکنتون رو گرفتید نوبت به این میرسه که بریم سراغ کوئری ها .اولین کوئری : mememeتو اولین کوئری که نوشتیم me اطلاعات و اسممون و همچنین id رو برمیگردونه . از اون قسمت کناری سمت چپ ما فیلد هایی که فعال هستش رو میتونیم ببینیم و اضافه بکنیم.الان ما باید ایدی اینستاگرام بیزینس اکانتمون رو پیدا کنیم که تو کوئری بعدی اکانت هامون رو چک میکنیم  و بعدش میریم سراغ ایدی اینستاگرام .دومین کوئری : me/accountsaccountsبعد از اینکه این کوئری رو نوشتیم ، لیست تمام اپ ها و بیزینس هایی که اضافه کردیم میاد ، که فعلا ما باهاشون کاری نداریم.ما باید توی این فیلد قرمز کناری instagram رو سرچ کنیم و instagram_business_account رو انتخاب کنیم و سابمیت کنیم که میشه کوئری سوم . این کوئری دوم رو نوشتم برای این که اگر چند تا اپ و یا صفحه داشتیم از اینجا اطلاعتشون رو چک کنیم و بتونیم با کوئری بعدی تطابق بدیم .کوئری سوم : me/accounts?fields=instagram_business_accountinstagram business accountخب تقریبا به چیزی که میخواستیم رسیدیم و اون بیضی آبی که کشیدیم ، چیزی که میخواستیم رو بهمون میده .اون عدده مثل یک لینک میمونه . دو تا کار میتونیم بکنیم . کپیش بکنیم و توی اون قسمت بالا پیست بکنیم و راه بهتر این که روش کلیک بکنیم .تو مرحله بعد من چند تا کوئری ساده میگیرم و نشونتون میدم که همه ی پست ها و استوری هاتون رو میتونید ببینید و یا مثلا اینسایت ها و کامنت ها و ....این که چجوری مدیریتش بکنید رو خودتون قطعا میتونید و یا اینکه دیتا پست بکنید و کامنت بزارید و  ...instagram business idخب بعد از اینکه روی اون عدد بیزینس اینستاگرام اکانت کلیک کردید ، صفحه بالا باز میشه . میتونیم از قسمت کناری سمت چپ فیلد هامون رو اضافه بکنیم . که من چند مورد رو اضافه میکنم و تصویرش رو در پایین میبینیم .follower following mediaتو تصویر بالا تعداد فالور ها و فالوینگ ها و همچنین ایدی پست ها رو به ما برگردوند .که با کلیک روی هر پست میتونیم تعداد لایک هاش ، اینسایت هاش و کامنت ها و ... رو ببینیم .با کلیک روی Get Code میتونیم انواع روش های مختلف برای گرفتن دیتا با ابزار های مختلف برنامه نویسی رو ببینیم . تو این سری پست های Graph API Instagram سعی کردم تا حدی بحث رو پیش ببرم که یه نقطه شروعی باشه و همچنین چند تا مثال خلاصه زده باشم و از اینجا به بعدش رو باید از روی داکیومنت های رسمی پیش برید .همچنین من چون یه اسکریپت برای جمع آوری داده به زبان پایتون نوشتم ، اون رو احتمالا بعد از اینکه دیتاهای خصوصی رو ازش جدا کردم ،لینک گیتهابشو تو کامنت های همین پست بزارم و اگر بعدا کسی مراجعه کرد بتونه خیلی بهتر ازش استفاده بکنه .ممنون از توجه تون .اگه سوالی بود در کامنت ها جواب خواهم داد. </description>
                <category>وصال دانشور</category>
                <author>وصال دانشور</author>
                <pubDate>Fri, 06 Mar 2020 14:02:07 +0330</pubDate>
            </item>
                    <item>
                <title>تجربه من از GRAPH API INSTAGRAM (قسمت سوم)</title>
                <link>https://virgool.io/@vessaldaneshvar/instaram-api-s3-nkwuxbkvxydh</link>
                <description>به نام خداسلامتو قسمت قبلی رسیدیم به اینجایی که یه app توی فیسبوک دولوپر ساختیم .ادامه میدیم و امیدوارم تو این قسمت تموم بشه. http://vrgl.ir/Go5Ni واقعیت اینه که اگر به درستی اکانت فیسبوکتون رو به اینستاگرام متصل کرده باشید و اکانتتون رو بیزینس کرده باشید میتونید راحت اسکرول کنید و قسمت کمی از ماجرا باقی میمونه ولی بزرگترین اشکال و گیری که برای خود من هم به وجود اومد ، دقیقا همینجا بود و باید این قسمت رو توضیح بدم.یه موضوعی که وجود داره و ممکنه یه مقدار من دستم تو توضیح این قسمت بسته باشه بحث حریم خصوصی و امنیت هستش و مجبورم کمتر تصویر بزارم و خلاصه تر توضیح بدم.اگر هنوز بیزینس اکانت درست نکردید ، میتونید به تنظیماتش تو اینستاگرام دست نزنید و ابتدا بیاید یه پیج بیزینس تو فیسبوک بسازید.create pageبعد از اینکه روی get started کلیک کردید ، باید اسم پیج و نوع بیزینستون رو مشخص کنید .create pageروی continue کلیک میکنیم .قسمت بعدی عکس میخواد که من skip میکنم .add profile - create pageadd cover - create pageبعد از اینکه روی skip کلیک کردید ، وارد پیجی که ساختیم میشیم.سپس روی setting کلیک میکنیم.manage pageوقتی تنظیمات صفحه رو باز میکنیم . قسمت های مختلفی داره که میتونید پیج رو مدیریت کنید ولی ما فعلا با قسمت instagram کار داریم .connect accountinstagram loginبعد لاگین میکنید و میتونید پیج اینستاگرام رو به پیج فیسبوک اضافه کنید. و همینجا یک دکمه وجود داره که میتونید اکانتتون رو بیزینس بکنید .این صفحه رو بازنگه میداریم و میریم سراغ بخش دولوپر فیسبوک با آدرس :https://developers.facebook.com/وارد اپی که ساختیم میشیم .choice appبعد باید APP ID رو از بالای صفحه ی زیر برداریم و به پیج اضافه بکنیم .app idوارد business setting  میشویم : business settingسپس روی Apps  کلیک میکنیم .صفحه ای مانند صفحه زیر باز می شود و روی Add کلیک میکنیم .Appsبعد از اینکه روی add کلیک میکنید چند روش برای اضافه کردن توصیه میکند که من با استفاده از App ID آن را اضافه میکنم ولی شما میتوانید روش های مختلفی را تست کنید. و به دلیل سادگی برای این قسمت عکسی نمیزارم .همچنین در همین قسمت میتونیم از تب اینستاگرام میتونیم چک بکنیم که واقعا یوزر نیم دلخواهمون اضافه شده یا نه ؟میتونیم این پنجره رو ببندیم و بریم سراغ قسمت دولوپراز منوی Tools ، بر روی Graph API Explorer کلیک میکنیم . و وارد صفحه ای مانند صفحه زیر میشویم .حالا باید یه سری دسترسی به این اپ اضافه بکنیم و اکسس توکن بگیریم.به نظرم طولانی شده و من هم خسته شدم.این رو منتشر میکنم و دفعه بعد احتمالا آخریش رو مینویسم.ممنون از توجه شما.</description>
                <category>وصال دانشور</category>
                <author>وصال دانشور</author>
                <pubDate>Wed, 04 Mar 2020 16:46:42 +0330</pubDate>
            </item>
                    <item>
                <title>تجربه من از GRAPH API INSTAGRAM (قسمت دوم)</title>
                <link>https://virgool.io/@vessaldaneshvar/%D8%AA%D8%AC%D8%B1%D8%A8%D9%87-%D9%85%D9%86-%D8%A7%D8%B2-graph-api-instagram-%D9%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%88%D9%85-dshzpkzhanmp</link>
                <description>به نام خداسلامdeveloper facebookتو قسمت اول این پست توضیحات مختصری درباره سرویس Graph API Instagram  نوشتم و آخر نوشته ، از اینکه توی فیسبوک ثبت نام بکنیم گفتم و این توضیح رو دادم که اگر بخواید از این سرویس استفاده بکنید حتما باید bussiness account داشته باشید. که خب کار سختی هم نیست و حتی اگر هم اکانتتون بیزینس نباشه ، توی همین فرایند فیسبوک خودش پیشنهاد میده . http://vrgl.ir/CTc8X البته من توصیه می کنم قبلش برید مفصل تحقیق بکنید که دچار مشکل نشید و قاعدتا برای بیزینس کردن اکانتتون یک سری قواعد و قوانینی مثل تعداد فالور ها و دنگ و فنگ های این شکلی وجود داره که من خیلی نمیخوام دربارش صحبت بکنم.گام اول :ابتدا در اکانت فیسبوکی که اینستاگرام خود را به آن اضافه کردید ، لاگین بکنید.facebook_loginگام دوم :وارد سایت زیر شوید. https://developers.facebook.com/ پس از این که وارد سایت شدید و لاگین کردید مطابق صفحه زیر بر روی Get Started کلیک کنید.loginpageget startedبر روی next کلیک کرده و ادامه دهید.started for developerبهترین توصیف از خودتون رو بزنید که البته اهمیت زیادی هم نداره و بیشتر جنبه تحقیقاتی داره.describe of youسپس بر روی create first app کلیک کنید .firstappسپس اسم app (دلخواه) رو وارد کنید و روی create App ID کلیک کنید.create appپس از این مرحله وارد قسمت اصلی فرایند میشیم و تا به حال تونستیم محیط کار رو آماده بکنیم تا بتونیم ازش استفاده بکنیم.زمانی که خودم داشتم جست و جو میکردم که چجوری بتونم از این سرویس ها استفاده بکنم واقعا تا حد خیلی زیادی گیج بودم و برام گنگ بود ، و دلیلش این بود که نمی دونستم از چه مسیری وارد بشم .امیدوارم این مطالب بتونه کمکتون بکنه که کمتر گیج بشید .app toolsاگر تمام مراحل بالا را به درستی پشت سر گذاشته باشید ( من سعی کردم در حالت incognito تمام مراحل را در یک اکانت جدید تست کنم تا شما به مشکل بر نخورید ) وارد صفحه اصلی که برای مدیریت app ساخته شده میشیم.وقتی وارد صفحه بالا میشیم ، دریایی از امکاناتی که فیسبوک در اختیار دولوپر ها قرار داده رو میبینیم ، و باهاش میتونیم app هامون رو مانتیور کنیم و اگر میخواید ازشون استفاده بکنید بهتره برید خیلی دقیق داکیومنت هاشون رو بخونید و با سعی و خطا جلو نرید ، چون احتمالا یا به جواب نمیرسید یا خیلی دیر به جواب میرسید . و خسته میشید و فکر میکنید که نمیتونید به جواب برسید .من قبل از این که از فیسبوک استفاده بکنم ، به نظرم خیلی جالب نبود و سخت گیری های بیش از حد داشت ، ولی بعد از استفاده فهمیدم چه غولیه (شاید حتی بزرگتر از گوگل) و امکانات عجیبی داره که شاید ما کمتر بیست درصدشو تو اینستاگرام تجربه میکنیم.من اینجا سعی میکنم قسمتی که مربوط به اینستاگرام هست رو توضیح بدم.ابتدا داکیومنت رسمی که خود فیسبوک منتشر کرده رو لینکش رو براتون میزارم . https://developers.facebook.com/docs/instagram-api/ تو این داکیومنت هم اشاره شده که ابتدا به موارد زیر نیاز داریم : 1 - اینستاگرام bussiness account2 - صفحه فیسبوک متصل به اکانت اینستاگرام3 - فیسبوک دولوپر اکانت 4 - انجام تنظیمات مربوط به app در دولوپر فیسبوکما تا به اینجا تمام موارد بالا رو انجام داده ایم .نوبت به ایجاد یک پیج در فیسبوک( متفاوت با اکانت هستش ) برای متصل کردن آن به app می رسد.در قسمت بعدی که احتمالا قسمت آخر خواهد بود ، پیج ایجاد خواهیم کرد و اپی را به آن اضافه میکنیم و چندین کوئری می گیریم و تمام .( مطمئن باشید به این راحتی ها تمام نخواهد شد :) )ممنون از توجه شما.</description>
                <category>وصال دانشور</category>
                <author>وصال دانشور</author>
                <pubDate>Mon, 02 Mar 2020 22:55:39 +0330</pubDate>
            </item>
                    <item>
                <title>تجربه من از  GRAPH API INSTAGRAM (قسمت اول)</title>
                <link>https://virgool.io/@vessaldaneshvar/graphapi-s1-kvbg8kcgjl0f</link>
                <description>به نام خداسلاممیخوام تو این پست از تجربه کار کردن با GRAPH API INSTAGRAM بگم.قبل از این که شروع کنم باید بگم که امکاناتش چیه ؟ و همچنین یه توضیح مختصر درباره GRAPH API  ها بنویسم چون که فیسبوک از این تکنولوژی استفاده کرده .برای خالی نبودن عریضه ( قطعا از وب کپی شده.)لیست چیزهایی که دربارش تو این سری پست ها حرف میزنم :امکانات Graph API INSTAGRAMاما GraphQL API ها چی هستند و چه فرقی با REST دارند ؟چرا مستقیم نرفتم سراغ اینستاگراماز کجا شروع کنیم ؟ساخت app در facebook developerاضافه کردن app به pageاضافه کردن bussiness account به پیجپیداکردن id مربوط به پیج خودمونکوئری تست زدن تو محیط فیسبوکگرفتن extend access tokenو ...امکانات Graph API INSTAGRAMاینجا نمیخوام تمام امکاناتش رو لیست کنم و اگه بخواید میتونید برید به صفحه معرفیش (لینک پایین ) و با دقت و جزئیات کافی تک تک موارد رو بررسی کنید. ( شاید خودم تو قسمت های بعدی رفتم سراغشون و چند تا پست دیگه نوشتم.) https://developers.facebook.com/docs/instagram-api/ من میخوام از تجربه ای که داشتم بگم و اینکه همیشه شروع کردنش از همه سخت تره و مدام به خطاهایی که نمیدونید منبعش چیه برمیخورید .و لازم نیست توضیح بدم تمام امکاناتش چیه و خیلی مختصر میتونیم شروع کنیم . و این نوشته بیشتر راهنمایی میکنه که از کجا شروع بکنیم و قاعده کار چیه. و قاعدتا کسی که ازش استفاده میکنه میتونه راهشو پیدا بکنه و چیزی که میخواد رو بدست بیاره.با توجه به این که فیلد کاری من تو حوزه داده هستش و تو استارتاپی که فعالیت میکنم ، نیاز داشتم اطلاعات اینستاگرام رو به صورت اتوماتیک دریافت کنم ، اطلاعاتی مثل لایک و کامنت و یه سری فیلد دیگه که مرتبط با بحث های دیجیتال مارکتینگه و جلوتر دقیقا معرفیش میکنم ، این نیاز رو ایجاد کرد که برم سراغ API  های اینستاگرام و درنهایت چون اینستاگرام زیر مجموعه فیسبوکه از فیسبوک سر در آوردم.و اما GraphQL API ها چی هستند و چه فرقی با REST دارند ؟قبل از این که بخوام توضیح بدم این شکل رو ببینید.GraphQL API VS REST APIاز لحاظ استفاده کردن هر دو سرویس با یه دستور ساده پایتونی مثل زیر قابل استفاده هستند و تفاوتش تو این هستش که توی گراف ما دقیقا دیتایی رو دریافت میکنیم که از سرور درخواست میکنیم و دیتای اضافی برای ما نمیفرسته ، که البته توی رست هم این رو میشه مدیریت کرد ولی پیچیدگی بیشتری داره.unuix : 
curl -i -X GET \
 &amp;quothttps://graph.facebook.com/v6.0/me/accounts&amp;quot
python : 
requests.get( &amp;quothttps://graph.facebook.com/v6.0/me/accounts&amp;quot)و شاید اگه تفاوت بین این ها رو نمیدونستیم هم راحت میتونستیم ازشون استفاده بکنیم. ولی همیشه یادگرفتن چیزهای جدید بهتره. و سعی کنید چیز هایی بیشتری بدونید.و در آخر هم برای توضیحات بیشتر لینکی که تو صفحه اول سرچ گوگل بالا میاد و داکیومنت خوب و قوی برای استفاده از این تکنولوژی که خود فیسبوک توسعه داده میزارم. https://graphql.org/ چرا مستقیم نرفتم سراغ اینستاگرامInstagram APIبه دلایلی که توی عکس بالا می بینید مجبور شدم برم سراغ فیسبوک.البته اون موقعی که من شروع کردم ، سرویس اینستاگرام کامل بسته نشده بود ولی اخطار داده بود که تا فلان تاریخ میبندیمش و من از خیرش گذشتم و مستقیم رفتم سراغ فیسبوک.همچنین این نکته رو هم باید بگم که داکیومنت های فیسبوک واقعا خیلی بهتر از اینستاگرام بود.چرا سراغ کتابخونه های آماده ای که برای اینستاگرام وجود داشت نرفتی ؟من با پایتون کار میکنم که به نظرم جزو گزینه های خوب برای کارهای مربوط به تحلیل داده هستش و وقتی داشتم درباره اطلاعات اینستاگرام سرچ میکردم ، به چند کتابخونه پایتونی غیر استاندارد (شرکت سازنده ننوشته) برخورد کردم ولی ترجیح دادم استفاده نکنم ، اما دلیلش :مهمترین دلیلش اینه که معمولا داکیومنت های تر و تمیزی ندارند و اصولا باید برم کل کد رو بخونم تا متوجه بشم که چجوری باید باهاش کار بکنم.این کتابخونه ها چون استاندارد نیستند و هیچ تضمینی برای این که از روش درستی که مورد تائید اینستاگرام هستش استفاده بکنه و ممکنه به هردلیلی اکانتمون بسته بشه که قاعدتا به هیچ عنوان قابل پذیرش نیستش.و دلیل دیگه ای که داشتم این بود که ممکنه هر لحظه این سیستم از کار بیوفته ولی معمولا سرویس های استاندارد ، کیفیتشون تضمین شده هستش و قبل از هر تغییری چندین بار اطلاع رسانی میکنند .و البته امنیت هم مهم هستش ، ولی با توجه به متن باز بودن نگرانی کمی داشتم.از کجا شروع کنیم :قاعدتا اولین کاری که باید انجام بدید اینه که یه اکانت فیسبوک بسازید.facebook registerیه نکته ای رو همین الان اشاره کنم و اون هم این هستش که اکانت اینستاگرام ما business account  هست و لازمه برای استفاده از Graph API Instagram  حتما اکانتتون رو بیزینس کرده باشید.و اگه بیزینس نباشه شاید بخواید برید سراغ Instagram Basic Display API .ادامشو توی قسمت دوم مینویسم.</description>
                <category>وصال دانشور</category>
                <author>وصال دانشور</author>
                <pubDate>Sun, 01 Mar 2020 20:27:20 +0330</pubDate>
            </item>
            </channel>
</rss>