Categories
Javascript NodeJS

Using ES7 async/await today with Babel

Let’s take a code snippet that contains the demonstration of async/await — https://gist.github.com/patrickarlt/8c56a789e5f185eb9722 – our objective is to transpile this piece of code to ES5 (current day Javascript) so we can run it with today’s version of NodeJS.

You will notice a command on top of the snippet which no longer works because Babel JS has changed. I am going to describe how we can do it with the latest version of babel as of this writing (6.1.4 (babel-core 6.1.4)).

Install Babel and Plugins

The new Babel depends on individual plugins to transform and parse codes. To transform async functions, we shall use the transform-regenerator plugin. We also need to add the syntax plugin to recognize the async/await syntax. Otherwise Babel won’t recognize those. Apart from that, we also install the ES2015 preset which includes a sane set of plugins for transforming ES6 to ES5. We will keep those so we can use other ES6 goodies.

First we install babel-cli globally:

Here’s our package.json file so you can just do npm install:

Configuring Babel

Here’s the .babelrc file I put in the same directory:

The file tells babel how to transform your code.

Transpile & Run

Once we have installed the dependencies, we can then start transpiling the codes to JS:

You might run into a problem like this:

It’s because we need to include the regenerator run time. The runtime is packed in the babel-polyfill we have already installed. We just need to include it in our source code. So the final github.es6 file would look like this:

Now if we transpile and run again, it should work fine.

Categories
Bangla Data Science

কো-রিলেশন (Correlation), কজেশন (Causation) ও ফেইসবুকের গল্প

স্ট্যাটিস্টিক্স – ১০১ কিংবা বিজনেস রিসার্চ – ১০১ কোর্স গুলোতে একটা প্রশ্ন খুবই কমন – “কো-রিলেশনই কি কজেশন? উদাহরন সহ ব্যখ্যা করো” । কো-রিলেশন থেকে আমরা জানতে পারি দুটো ভ্যারিয়েবল এর মধ্যে কোন “কো-রিলেশনশিপ” আছে কিনা ।

মনে করি num_friends হচ্ছে একজন ব্যক্তির ফেইসবুক ফ্রেন্ডের সংখ্যা আর time_spent হচ্ছে সেই ব্যক্তি দিনে কতটুকু সময় ফেইসবুকে ব্যয় করে । একদিন সময় করে আমি বিজনেস এ্যাডমিনিস্ট্রেশন ডিসিপ্লিনের শিক্ষার্থীদের উপর জরিপ করে এই ডাটা কালেক্ট করি এবং কো-রিলেশন নির্নয় করি । দেখা গেলো এই ভ্যারিয়েবল দুটি পজিটিভলি কো-রিলেটেড । তার মানে যাদের ফেইসবুকে ফ্রেন্ড সংখ্যা বেশী, তারা ফেইসবুকে বেশী সময় কাটায় ।

সমস্যা হলো, এই ঘটনার পিছনে ৩ ধরনের কারন থাকতে পারে:

(১) যাদের ফ্রেন্ড সংখ্যা বেশী, তারা ফ্রেন্ডদের পোস্ট, ছবি, কমেন্ট পড়ার জন্য ফেইসবুকে বেশী সময় ব্যয় করে (“num_friends” causes “time_spent”)

(২) যারা ফেইসবুকে বেশী সময় কাটায় তারা ফটোগ্রাফি গ্রুপ, ফুডিজ গ্রুপ, নিজের ক্লাসের গ্রুপ, ডিসিপ্লিনের গ্রুপ – নানা গ্রুপে মতামত শেয়ার করে । এরফলে সমমনা অনেক মানুষের সাথে বন্ধুত্ব হয় । (“time_spent” causes “num_friends”)

(৩) এরা ফেইসবুকে বেশী সময় কাটান বয়ফ্রেন্ড বা গার্লফ্রেন্ডের সাথে চ্যাট করে আর ফ্রেন্ড এ্যাড করেন ডিসিপ্লিনের সিনিয়র জুনিয়র সবাইকে । (none causes the other)

এখন যেহেতু আমরা নিশ্চিত না এই ৩টি ঘটনার কোনটি ঘটছে । তাই কোরিলেশন মানেই যে কজেশন – এই ধারনা আমাদের নাকচ করে দিতে হয় । এবং এটা আমরা সুন্দর করে পরীক্ষার খাতায় ব্যখ্যা করে নাম্বার পাই । তাই এর বেশী আমাদের চিন্তা করা হয়ে উঠে না ।

অন্যদিকে ফেইসবুকের বেতনভুক্ত ডাটা সায়েন্টিস্টরা কিন্তু এত সহজে পার পান না । তাদের টার্গেট আমাদের স্টুডেন্টদেরকে বেশী সময় ফেইসবুকে আটকে রাখা, এজন্য এটা নিয়ে তাদের বিশাল মাথা ব্যথা । তারা জানতে চায় বিএ ডিসিপ্লিনের এই কো-রিলেশনের পিছনে আসল ঘটনা কি । তারা ডিসিপ্লিনের স্টুডেন্টদের থেকে র‍্যান্ডম সাবসেট নিয়ে তাদের উপর এক্সপেরিমেন্ট চালায় – তাদের নিউজফিড কাস্টোমাইজ করে ফেলে এবং ২ ধরনের টেস্ট চালায় –

(১) কিছু লোকজনকে ব্যাড এর নেটওয়ার্ক থেকে পোস্ট দেখানো কমিয়ে দেয় । কিছু লোকজনকে বেশী পোস্ট দেখানো শুরু করে ।

(২) কিছু লোকজনকে বেশী বেশী ব্যাড এর সিনিয়র, জুনিয়রদের ফ্রেন্ড রিকুয়েস্ট সাজেস্ট করতে থাকে, কিছু লোকজনকে কমিয়ে দেয় ।

যেহেতু এটি একটি কল্পিত ঘটনা সেহেতু এই টেস্টের ফলাফল আমার জানা নেই । তবে প্রথম এবং দ্বিতীয় টেস্ট থেকে কিছুটা “কনফিডেন্স” পাওয়া যেতে পারে । যদি প্রথম টেস্টে দেখা যায় যে বেশী পোস্ট দেখানোর কারনে লোকজন বেশী সময় কাটাচ্ছে, আর পোস্ট কমিয়ে দেওয়ার কারনে কম সময় কাটাচ্ছে তাহলে আমরা কিছুটা আইডিয়া পাই যে আসলে num_friends causes time_spent অন্যদিকে দ্বিতীয় টেস্ট থেকে আমরা এর উল্টোটা জানতে পারি । আর দুটো টেস্টেই যদি নেগেটিভ রেজাল্ট পাই, তাহলে ফেইসবুকের রিসার্চ টীমের কাজ আরও বেড়ে গেলো । ৩য় কি ঘটনা ঘটতে পারে এটা নিয়ে এখন তাদের চুলচেরা বিশ্লেষন করতে হবে ।

সহজ কথায়, কোরিলেশন নিশ্চিতভাবে কজেশন মিন করে না, তবে টোটাল পপুলেশনের র‍্যান্ডম সাবসেট নিয়ে কিছু টেস্ট করে কোরিলেশনের পাশাপাশি কজেশনও আছে কিনা সে ব্যাপারে আইডিয়া পাওয়া যেতে পারে ।

পুনশ্চ: আমার এই উদাহরন সম্পূর্ন বানোয়াট হলেও ফেইসবুক তার নিউজফিড নিয়ে এক্সেপেরিমেন্ট করেছে এবং সেটার ইথিক্যাল দিক নিয়ে আলোচনা সমালোচনাও হয়েছে অনেক ।

রেফারেন্স: http://www.nytimes.com/2014/06/30/technology/facebook-tinkers-with-users-emotions-in-news-feed-experiment-stirring-outcry.html?_r=1

Categories
Django Python

Django REST Framework: Custom Exception Handler

While using DRF, do you need to handle the exceptions yourselves? Here’s how to do it. First, we need to create an exception handler function like this:

In the exception handler, we get exc which is the exception raised and the context contains the context of the request. However, we didn’t do anything fancy with these. We just called the default exception handler and joined the errors in a flat string. We also added the exception to our response.

Now, we need to tell DRF to call our custom exception handler when it comes across an exception. That is easy:

Open up your settings.py and look for the REST_FRAMEWORK dictionary. Here you need to add the exception handler to the EXCEPTION_HANDLER key. So it should look something like this: