Clojure: Re-running programs from the Lein REPL

I have started playing with Clojure lately and I found the Clojure start up time quite slow. Every time I make a change and re-run using:

I have to wait quite a bit of time.

For quick prototyping, a better approach is to run the repl using:

We run our main function from the repl using (-main). when we make changes – we reload our code and then run the “-main” function again. To follow this approach, we have to make sure that we added [org.clojure/tools.namespace “0.2.7”] to our leiningen dependencies list (add this to the project.clj file inside your project). Then launch the REPL and type these code:

The (refresh) call would reload the changed namespaces and (-main) would run the main function again.

So that works but every time we open the REPL, we have to type the require command in. One of the awesome features of Leiningen is it allows us to load source codes from additional paths based on profiles. We would add a dev profile and load some codes from a different path. These codes will be loaded by leiningen while running the app but won’t be a part of our JAR file.

To add a dev profile, let’s update the “project.clj”:

Now in our project root, if we create a file “startup/user.clj”, Leiningen would load this file on startup.

So we add these code to the “startup/user.clj” file:

Note that the refresh function takes an “:after” option. If we pass a fully qualified function name, it will call that function after reloading the namespace.

Now any time we make changes to our files, we can just call (user/rerun) and it would reload the libraries and execute the “-main” function.

উবুন্টুতে মাইসিকুয়েলের রুট পাসওয়ার্ড রিসেট করা

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

এই ব্লগ পোস্টে আমরা দেখবো কিভাবে আমরা সহজেই উবুন্টুতে মাইসিকুয়েলের পাসওয়ার্ড রিসেট করে নিতে পারি । যদিও উবুন্টুর জন্য কমান্ড গুলো লেখা, এগুলো ডেবিয়ান লিনাক্সেও কাজ করার কথা । আর অন্য কোন ডিস্ট্রোর ক্ষেত্রে সামান্য পরিবর্তন করা লাগতে পারে ।

মাইসিকুয়েল সার্ভিস বন্ধ করা

রুট পাসওয়ার্ড রিসেট করতে গেলে আমাদের প্রথমেই মাইসিকুয়েল এর সার্ভিস বন্ধ করতে হবে । উবুন্টুর জন্য:

অথবা, ডেবিয়ান এবং উবুন্টু দুটোতেই কাজ করবে এই কমান্ডটি:

গ্রান্ট টেবিল ছাড়াই মাইসিকুয়েল রান করা

এবার আমাদের যেটা করতে হবে তা হলো মাইসিকুয়েল এর পাসওয়ার্ড চেক করা হয় যেই টেবিলটা থেকে, সেটিকে স্কিপ করে মাইসিকুয়েল চালু করা। এটা স্কিপ করলে মাইসিকুয়েল আর পাসওয়ার্ড চেক করবে না আগের মত করে। ফলে মাইসিকুয়েল এ আমরা রুট এ্যাকাউন্ট এ এ্যাক্সেস করতে পারবো কোন পাসওয়ার্ড ছাড়াই ।

পাসওয়ার্ড রিসেট করা

এইবার এই কমান্ডটি রান করি:

এই কমান্ডটি মাইসিকুয়েল সার্ভারে কানেক্ট করবে এবং mysql ডাটাবেইজটি ব্যবহার করার জন্য সিলেক্ট করবে ।

এইবার পাসওয়ার্ড পরিবর্তন করার পালা । এটার জন্য আমরা এই মাইসিকুয়েল কুয়েরিটা চালাবো:

এই কুয়েরি আমাদের রুট ইউজারের জন্য নতুন পাসওয়ার্ড (এক্ষেত্রে NEW_PASSWORD) এ্যাসাইন করবে, প্রিভিলেজ ফ্লাশ করবে (সহজ ভাষায় পার্মিশন রিলোড করবে) এবং মাইসিকুয়েল সার্ভার থেকে ডিসকানেক্ট করবে ।

পুনরায় মাইসিকুয়েল স্বাভাবিকভাবে রান করা

আমরা মাইসিকুয়েলের পার্মিশন চেক কে ফাকি দিয়ে রুট ইউজারের জন্য নতুন পাসওয়ার্ড সেট করে দিয়েছি । এখন আমরা নরমালি মাইসিকুয়েল সার্ভার চালালেই নতুন পাসওয়ার্ড কাজ করবে । এজন্য আমরা আমাদের একটু আগে রান করা mysqld প্রসেসটি টার্মিনেট করে মাইসিকুয়েল রিস্টার্ট দিবো ।

ব্যাস, এখন আমাদের নতুন সেট করে দেওয়া পাসওয়ার্ডই কাজ করবে!

Django & Celery – Easy async task processing

So, while developing a web application, there comes a time when we need to process some of the tasks in the background, perhaps asynchronously. For example, your user would upload photos and the app would post them to multiple social networks. We would definitely want to offload the uploading task to some background workers.

Django and Celery makes background task processing a breeze. In this article, we shall see how we can setup Django and Celery to start processing our background tasks. We would use Redis to maintain our task queue.

How does it work?

  • We define some tasks in our application. These tasks are expected to run for a pretty long time.
  • We run the celery workers. Celery knows how to find and load these tasks. The workers keep waiting on us.
  • We add some jobs to the workers queue from our web app. The workers now have something to work on. So they start taking the jobs from the queue and start processing them.
  • We can query the status of the jobs from our web app to know whats happening.
  • The easy to use Python API makes it really simple to use. You don’t need any specialisation or anything in Redis.

Setting Up

Let’s first install the Redis server:

The version that comes from Ubuntu official repo is quite old. You can install the latest version from 3rd party PPAs.

Install Celery with Redis support:

And then install django-celery package:

Configuration

Add “djcelery” to your installed apps list:

Modify your main app’s settings.py file to add the celery specific settings:

Now, inside your main application directory (the directory in which settings.py is located), create a file named “celery.py” with these contents:

The above codes do a few things:

  • It creates our own Celery instance.
  • We ask the celery instance to load necessary configs from our project’s settings file.
  • We make the instance auto discover tasks from our INSTALLED_APPS.

Also let’s modify the “__init__.py” file in the same directory to make the celery app available more easily:

This would allow us to use the same app instance for shared tasks across reusable django apps.

Defining Tasks

Now let’s create a tasks.py file in one of our INSTALLED_APPS and add these contents:

Now we have defined our own celery app, we have our tasks. It’s now time to launch the workers and start adding tasks.

Processing Tasks

Before we can start processing tasks, we have to launch the celery daemon first. This is how we do it:

Here, we tell celery to use the celery instance we defined and configured earlier. Here “project” is the main app, the package that contains our settings.py along with celery.py. The “app” the variable name which holds the celery instance.

Now let’s use the Django shell to add and query jobs:

So as we can see, out task was processed by celery. And we could easily query the status. We would generally use the meta data to store any task related information.

Object Oriented Programming in Python: Bangla Screencast

Video is available in HD

সংযুক্তি – ১

স্ক্রীনকাস্টে প্রাইভেট ভ্যারিয়েবল বা ডাটা হাইডিং এর উদাহরন দেখানোর সময় ক্লাস লেভেল ভ্যারিয়েবল ব্যবহার করা হয়েছে । ইনস্ট্যান্স ভ্যারিয়েবল এর ক্ষেত্রেও একই নিয়ম প্রযোজ্য । এখানে কোড স্যাম্পল দেওয়া হলো:

সংযুক্তি – ২

ক্লাস নির্ভর মেটাক্লাস ইম্প্লিমেন্টেশন এবং একটি কাল্পনিক প্রয়োগ দেখার জন্য এই ভিডিও টি দেখতে পারেন – Python – Metaprogramming