بهترین شروع برای درک اینکه کامپیوترها چطور «فکر می کنن»: مقدمه بصری بر یادگیری ماشین

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

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

لینوکس در این ماه ۲۵ ساله شد، بیشترین روند؟ نیاز به توسعه دهندگانی که به خاطر برنامه‌نویسی کرنل به شرکت‌ها برن

/jaz/Linuxstillit06.tif

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

سال‌های سال است که تعداد توسعه دهندگان مستقل (فردی/بدون حقوق) لینوکس با کاهشی پایدار مواجه بوده. در ۲۰۱۲ این عدد ۱۴.۶ درصد بود، در ۲۰۱۳ برابر ۱۳.۶ درصد و در ۲۰۱۴ تعداد توسعه دهندگان مستقل به ۱۱.۸ رسید. اما حالا این عدد روی ۷.۷ درصد ایستاده. این سقوط دائمی دلایل متنوعی داره اما حتما منطقی‌ترین دلیل ساده‌ترین اونها است: توسعه‌دهندگان کرنل کم هستن و هر کسی که بتونه نشون بده کد نوشته شده توسط خودش می تونه به کرنل برسه، در پیدا کردن شغل هم مشکلی نخواهد داشت.

در گزارش این ماه به بیش از ۴۰۰ شرکت اشاره شده که با نوشتن کد برای کرنل سعی می کنن وضع خودشون در بازار رو بهتر کنن. شرکت‌هایی مثل اینتل، ردهت، سامسونگ، سوزه، گوگل، ای ام د، تگزاس اینسترومنتز، اوراکل، هواوی، فیسبوک، سیسکو و غیره.

linux-companies-640x371

در این دوره ۹ ورژن جدید کرنل منتشر شده و عدد اصلی ورژن از ۳ به ۴ تغییر کرده که نشون دهنده هیچ چیز خاصی هم نیست و فقط نشون دهنده این است که هر کرنل جدید تغییراتی داره که دیگه تفاوت خاصی بین عدد اصلی و عدد کوچیک رو لازم نمی‌کنه.

در صورتی که می‌خواین با لینوکس آشنا بشین از اینجا شروع کنین و اگر علاقمند هستین که توسعه کرنل رو شروع کنین، مطمئن بشین که لینوکس رو به خوبی بلدین، کتاب سیستم‌عامل رو بخونین و در برنامه نویسی سی بسیار خوب باشین و در نهایت درک کنین که کرنل لینوکس چه بخش‌هایی داره و این اجزا چطوری با هم کار می‌کنن که برای همه اینها کتاب‌های مستقل هست.

فایل نتایج نظر سنجی گسترده از وضعیت کار، زندگی و شیوه زیست برنامه‌نویسان و مدیر سیستم‌های ایران ۱۳۹۴

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

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

nemooneha

یا مثلا این که مربوط به حقوق است.

hoghoogh

می‌بینیم که بودن در یک شرکت دولتی حقوق دائمی و متوسط داره ولی مثلا استارتاپ ها با حقوق های کم شروع می کنن و توشون می شه به حقوق های زیاد رسید یا شرکت های تولید نرم افزار امن ترین جا برای گرفتن حداکثر حقوق ها هستن و منطقا یک نفر که خودش رو حرفه ای می دونه باید بین سه تا چهار میلیون حقوق بگیره.

rezayat1

rezaya2

دو تا نمودار رضایت هم جالب هستن. می تونین ببینن تجربه کاری در کجاها باعث رضایت شغلی بالاتر می شه و …

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

جاوا، زبان برنامه نویسی سال ۲۰۱۵

toibe

معیار TIOBE هر ماه رده بندی‌ای از محبوب‌ترین زبان‌ها و در آخر هر سال یک زبان برنامه نویسی سال معرفی می‌کنه. برنده عنوان زبان برنامه نویسی سال ۲۰۱۵، جاوا است؛ به خاطر رشد خیلی زیادش در این سال. امسال جاوا به شکل اعجاب آوری ۵.۹۴٪ رشد داشته که برای یک زبون قدیمی بسیار عجیبه. تعقیب کنندگان بعدی رشد ویژوال بیسیک دات نت و پایتون هستن. همچنین جاوا وی بک‌اند و اندروید هم سریعا در حال رشده و همه اینها باعث شده شاخص تیوب(؟) جایزه امسالش رو درست مثل ده سال قبل، به جاوا بده.

بیشترین سقوط امسال مربوط به آبجکتیو سی بوده ( ٪۵.۸۸- )‌ که برنامه نویسی اپلیکیشن‌های سیستم‌های شرکت اپل استفاده می‌شده و قراره با swift جایگزین بشه.

پیش‌بینی می‌شه در سال ۲۰۱۶ جاوا در صدر بمونه و با ارائه پی.اچ.پی. ۷، این زبون هم رشد زیادی بکنه. همچنین جاوااسکریپت و سوئیفت نیز احتمالا در جمع ده زبان خواهند بود و سی و سی پلاس پلاس و سی شارپ و پایتون هم تا حد زیادی جاشون رو حفظ می‌کنن.

منبع

چرا گنو لینوکس رو دوست دارم: پاسخ دادن به اینکه آیا سیستم ما وضعیت عادی داره یا مورد حمله است

ما سروری داریم که تازه تحویلش دادیم ولی هر روز حوالی ظهر با مشکل مواجه می شه. کار اصلی رو پروسه ای انجام می ده که اینجا بهش می گیم A. چندین پروسه A می تونن همزمان بالا باشن و کار کنن و ما گفتیم حداکثر این تعداد باید ۱۰۰ باشه. یعنی در صورت زیاد شدن بار، ۱۰۰ تا A بالا می یان و تقریبا صد برابر بهتر از یک A کار می کنن. یک بررسی سریع نشون می ده که در لحظه بروز مشکل دقیقا ۱۰۰ تا از پروسه A فعاله:

# ps -ef | grep A | wc -l
101

مشخصه دیگه: ps -ef پروسه ها رو نشون می ده، grep A فقط خط هایی که توشون A هست رو جدا می کنه و در نهایت wc -l تعداد خط ها رو می شمره (اگر گفتین چرا به جای ۱۰۰ تا شده صد و یکی؟).

علی الحساب تعداد Aها رو به حداکثر ۱۰۰۰ عدد افزایش می دیم و می ریم سراغ سوالی که مطرحه:

آیا ما مورد حمله هستیم؟ آیا حوالی ظهر سیستمی شروع به کار با سیستم ما می کنه که فشار رو به شکل غیرعادی بالا می بره؟ یا واقعا این شرایط عادی است و اینقدر از این سیستم استفاده می شه؟

ما لاگ هایی به این شکل داریم که حاصل کار A هستن:

127.0.0.1 -  26/Jul/2015:03:48:53 +0430 "POST /index.php?_url=xxxxx" 200 /home/adp/www/xxx/public/index.php 357.489 2048 86.72%
127.0.0.1 -  26/Jul/2015:03:48:58 +0430 "POST /index.php?_url=qqqq" 200 /home/adp/www/xxx/public/index.php 91.281 1280 98.60%
127.0.0.1 -  26/Jul/2015:03:49:32 +0430 "GET /index.php?aaa" 200 /home/adp/www/xxx/public/index.php 373.649 1792 56.20%
127.0.0.1 -  26/Jul/2015:03:50:03 +0430 "HEAD /index.php" 200 /home/adp/www/xxx/public/index.php 43.501 1280 91.95%
127.0.0.1 -  26/Jul/2015:03:55:03 +0430 "HEAD /index.php" 200 /home/adp/www/xxxx/public/index.php 63.519 1280 94.46%

من از چند روز پیش این لاگ ها رو فعال کردم تا همه درخواست ها ذخیره بشن و حالا کافیه بشمرم ببینم چه خبره! اول بذارین همه لاگ هار و به همدیگه بچسبونیم:

jadi@funlife:/tmp/dir$ ls -ltrh 
total 36M
-rw------- 1 jadi jadi 9.2M Jul 22 03:17 www.access.log-20150722
-rw------- 1 jadi jadi 6.0M Jul 23 03:10 www.access.log-20150723
-rw------- 1 jadi jadi 6.4M Jul 24 03:25 www.access.log-20150724
-rw------- 1 jadi jadi 2.5M Jul 25 03:25 www.access.log-20150725
-rw------- 1 jadi jadi 7.4M Jul 26 03:45 www.access.log-20150726
-rw------- 1 jadi jadi 4.2M Jul 26 15:17 www.access.log
jadi@funlife:/tmp/dir$ cat www.access.log-* www.access.log > all.log
jadi@funlife:/tmp/dir$ ls -ltrh 
total 72M
-rw------- 1 jadi jadi 9.2M Jul 22 03:17 www.access.log-20150722
-rw------- 1 jadi jadi 6.0M Jul 23 03:10 www.access.log-20150723
-rw------- 1 jadi jadi 6.4M Jul 24 03:25 www.access.log-20150724
-rw------- 1 jadi jadi 2.5M Jul 25 03:25 www.access.log-20150725
-rw------- 1 jadi jadi 7.4M Jul 26 03:45 www.access.log-20150726
-rw------- 1 jadi jadi 4.2M Jul 26 15:17 www.access.log
-rw-rw-r-- 1 jadi jadi  36M Jul 26 15:30 all.log

راحت و سر راست. دستور cat که محتوای فایل ها رو نشون می ده، کل فایل ها رو چسبونده به هم تا یک فایل بزرگ به اسم all.log داشته باشیم که هر خطش چنین فرمی داره:

127.0.0.1 -  26/Jul/2015:03:48:53 +0430 "POST /index.php?_url=xxxxx" 200 /home/adp/www/xxx/public/index.php 357.489 2048 86.72%

کافه من تاریخ رو جدا کنم. دستور کات همیشه دوست منه:

jadi@funlife:/tmp/dir$ cut -d' ' -f4 all.log | head
20/Jul/2015:12:03:35
20/Jul/2015:12:03:36
20/Jul/2015:12:03:39
20/Jul/2015:12:03:39

جذاب نیست؟ به سادگی گفتم کات کن با جدا کننده اسپیس و فیلد چهارم رو به من بده ولی حالا فقط چند خط اول رو نشون بده (head). عملا کار تموم شده! کافیه این خطها رو بشمرم؛ البته بعد از حذف کردن ثانیه و دقیقه. برای حذف اینها کافیه شش کاراکتر آخر هر خط رو بردارم یا با همون دستور کات دوباره بگم بر اساس :‌ جدا کنه و فیلد اول و دوم رو به من بده. این راه دوم برای من سر راست تره:

jadi@funlife:/tmp/dir$ cut -d' ' -f4 all.log | cut -d: -f1,2 | head
20/Jul/2015:12
20/Jul/2015:12
20/Jul/2015:12
20/Jul/2015:12
20/Jul/2015:12
20/Jul/2015:12
20/Jul/2015:12
20/Jul/2015:12
20/Jul/2015:12
20/Jul/2015:12

چقدر عالی. دیگه فقط کافیه سورت کنیم و بگیم بشمره. دستور uniq‌ می تونه با سوییچ های مختلف کارهای مختلف کنه. مثلا فقط خط های غیرتکراری بده، فقط خط های تکراری رو بده، از هر خط بیشتر از یکبار نده، بشمره از هر خط چند تا هست و … و البته این دستور وابسته به اینه که ورودی اش مرتب شده باشه. پس:

jadi@funlife:/tmp/dir$ cut -d' ' -f4 all.log | cut -d: -f1,2 | sort -n | uniq -c > data
jadi@funlife:/tmp/dir$ head data
   2795 20/Jul/2015:12
   2363 20/Jul/2015:13
   2383 20/Jul/2015:14
   2251 20/Jul/2015:15
   1796 20/Jul/2015:16
   1599 20/Jul/2015:17
    843 20/Jul/2015:18
    704 20/Jul/2015:20
    765 20/Jul/2015:19
   1039 20/Jul/2015:21

چه کردیم! (: فقط کافیه ترسیمش کنیم:

تعداد درخواست های سرور

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

کشورهایی با بیشترین فارغ التحصیلی مهندسی در سال:‌ ایران سوم

من همیشه فکر می کردم بقال محل از کجا می فهمه من مهندس هستم که بهم می گه «آقای مهندس چه شیری بدم خدمتون» و از اونطرف هم برام عجیب بود که یک آگهی «استخدام مهندس» با چند ده رزومه مواجه می شه که عملا اکثرشون توانایی‌های لازم رو ندارن. امروز فوربس در مطلب کشورهایی با بیشترین فارغ التحصیل مهندسی که عملا فقط یک اینفوگرافی بر اساس داده‌های فروم اقتصاد جهانی است جوابم رو داده: ایران از نظر تعداد فارغ التحصیل مهندسی در رتبه سوم جهان است! بعد از روسیه و آمریکا و البته حضور کشورهایی مثل اندونزی و ویتنام هم در بین ده کشور اول تعداد مهندس‌هایی که سالانه مدرکشون رو می گیرن، قابل توجه است.

تعداد فارغ التحصیلان مهندسی ایران

نقشه‌ای عجیب که بیشترین سرچ‌های گوگل برای «توی کشور X فلان چیز چنده» رو نشون می ده – مال ایران تاسف باره

توی فرهنگ عامه و استریوتایپ‌ها، هر کشور به یک چیز شناخته می‌شه. مثلا خیلی‌ها آلمان رو به آبجو می‌شناسن و چین رو به لوازم الکترونیکی ارزون. توی این ماه سایت فیکسر اومده و توی گوگل چیزی مثل How much * costs in Iran رو برای همه کشورها سرچ کرده و دیده گوگل به جای علامت ستاره، چه پیشنهادی بهش می‌ده. عملا معنی دیگه اینکار اینه که فیکسر درآورده که مردم دنیا معمولا قیمت چه چیزی رو در هر کشوری سرچ می کنن و رسیده به اینکه اکثر مردم دنیا سرچ می کنن که قیمت سوار شدن به میگ در روسیه چقدره، قیمت فحشا توی برزیل چنده و این تیپ چیزها. نتیجه نهایی اینه:

نقش جهان بر اساس خرید چیزها

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

بیگ دیتا

خلاصه حواستون باشه که خارجی‌ها دنبال قیمت کلیه تو ایران هستن، کلیه‌تون رو ارزون نفروشین!

سایت اصلی نقشه‌های تفکیکی بیشتری داره

دوستای من تو لینکدین چیکاره هستن؟ بازنمایی اطلاعات با R

می دونین که من این چند وقت از داده‌ها، زبان برنامه نویسی آر و اینجور چیزها بیشتر می نویسم. هدفم اینه که کارهای جالب روزمره که برای یاد گرفتن بیشتر این چیزها می شه کرد رو باهاتون شریک بشم. یک جور دستگرمی برنامه نویسی ولی مهمتر از اون آماده شدن ذهنی برای اتفاق‌های بزرگی که در دنیای برنامه نویسی در جریان هستن.

در این مجموعه، امروز با الهام از کار مشابه در این فروم (که متاسفانه دیدنش نیازمند ساخت اکانت است با R و بسته تازه منتشر شده ای به اسم Rlinkedin که می تونه این زبون عددی / آماری رو به سایت لیندکین که شبکه اجتماعی بازار کار تخصصی است وصل کنه و به این برسه که دوستان من اکثرا چنین عناوین شغلی ای دارن:

title

اما چطوری؟ برای شروع باید اول بسته Rlinkedin رو نصب کنیم که با توجه به بسته devtools کار راحتی است:

require(devtools)
install_github("mpiccirilli/Rlinkedin")
require(Rlinkedin)

بعد لازمه شناسه خودمون رو به این بسته معرفی کنیم. من روش راحت رو باز می کنم و می گم فقط نیازمند این هستم که این بسته در این لحظه وصل بشه به اکانت من:

in.auth <- inOAuth()

این دستور یک لینک بهم می ده که کافیه تو براوزر بازش کنم و توی لیندکین لاگین کنم. حالا بسته Rlinkedin به لیندکین وصل شده و کار راحته.

در قدم اول همه کانتکت‌هایی که دارم رو توی یک ساختار ذخیره می کنم:

my.connections <- getMyConnections(in.auth)

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

text <- toString(my.connections$title)

و با استفاده از بسته wordcloud و بعد از کمی تمیز کاری (حذف کاما، کوچیک کردن کل حروف و ...) و شمردن تکرار کلمات، ابر کلمات رو می کشم. در ابر کلمات اندازه فونت هر کلمه مرتبط با تعداد تکرار اون کلمه است و در نتیجه مثلا می بینیم که بیشتر دوست‌های من Developer هستن که نکته مثبتی است:

title

و البته معلومه که حالا که اینجا هستیم با خطی مثل

text <- toString(my.connections$industry)

می تونیم حوزه‌ای که افراد مرتبط با من کار می کنن رو هم در بیارم و ابرش رو بکشم که این یکی هم معقول و قابل دفاع است:

industries

اگر خوشتون اومد و روی لینکدین هستین و معقول می دونین، خوشحال می شم پروفایل من روی لینکدین رو روی BIG DATA یا Hadoop یا R یا Data Science یا NewSQL یا هر چیزی که دوست دارین من رو Endorse کنین که البته نمی دونم دقیقا به چه دردم خواهد خورد ولی حداقلش اینه که هی روی MySQL و PHP‌ و شبکه و لینوکس ایندورس نمی شم! خوش[بین] باشین و خندون و از اطلاعات و قشنگی‌شون لذت ببرین.