The Video is available in HD
মাঝে মাঝেই এমন হয় যে মাইসিকুয়েলের রুট পাসওয়ার্ড খুজেঁ পাওয়া যাচ্ছে না । বেশীরভাগ ক্ষেত্রেই দেখা যায় সার্ভার প্রথমবার সেটাপ করার সময় বেশ শক্ত পোক্ত রুট পাসওয়ার্ড সেট করা হয়, এরপর নিজের এ্যাপ্লিকেশন এর জন্য নতুন মাইসিকুয়েল ইউজার তৈরি করে নেই । রুট পাসওয়ার্ডটা কোথাও নোট করে না রাখলে পরবর্তীতে ওটা আর মনে করতে পারি না । এরকম পরিস্থিতিতে রুট ইউজারের পাসওয়ার্ডটা রিসেট করা ছাড়া কোন উপায় থাকে না ।
এই ব্লগ পোস্টে আমরা দেখবো কিভাবে আমরা সহজেই উবুন্টুতে মাইসিকুয়েলের পাসওয়ার্ড রিসেট করে নিতে পারি । যদিও উবুন্টুর জন্য কমান্ড গুলো লেখা, এগুলো ডেবিয়ান লিনাক্সেও কাজ করার কথা । আর অন্য কোন ডিস্ট্রোর ক্ষেত্রে সামান্য পরিবর্তন করা লাগতে পারে ।
রুট পাসওয়ার্ড রিসেট করতে গেলে আমাদের প্রথমেই মাইসিকুয়েল এর সার্ভিস বন্ধ করতে হবে । উবুন্টুর জন্য:
1 |
sudo service mysql stop |
অথবা, ডেবিয়ান এবং উবুন্টু দুটোতেই কাজ করবে এই কমান্ডটি:
1 |
sudo /etc/init.d/mysql stop |
এবার আমাদের যেটা করতে হবে তা হলো মাইসিকুয়েল এর পাসওয়ার্ড চেক করা হয় যেই টেবিলটা থেকে, সেটিকে স্কিপ করে মাইসিকুয়েল চালু করা। এটা স্কিপ করলে মাইসিকুয়েল আর পাসওয়ার্ড চেক করবে না আগের মত করে। ফলে মাইসিকুয়েল এ আমরা রুট এ্যাকাউন্ট এ এ্যাক্সেস করতে পারবো কোন পাসওয়ার্ড ছাড়াই ।
1 |
sudo mysqld --skip-grant-tables & |
এইবার এই কমান্ডটি রান করি:
1 |
mysql -u root mysql |
এই কমান্ডটি মাইসিকুয়েল সার্ভারে কানেক্ট করবে এবং mysql ডাটাবেইজটি ব্যবহার করার জন্য সিলেক্ট করবে ।
এইবার পাসওয়ার্ড পরিবর্তন করার পালা । এটার জন্য আমরা এই মাইসিকুয়েল কুয়েরিটা চালাবো:
1 |
UPDATE user SET Password=PASSWORD('NEW_PASSWORD') WHERE User='root'; FLUSH PRIVILEGES; exit; |
এই কুয়েরি আমাদের রুট ইউজারের জন্য নতুন পাসওয়ার্ড (এক্ষেত্রে NEW_PASSWORD) এ্যাসাইন করবে, প্রিভিলেজ ফ্লাশ করবে (সহজ ভাষায় পার্মিশন রিলোড করবে) এবং মাইসিকুয়েল সার্ভার থেকে ডিসকানেক্ট করবে ।
আমরা মাইসিকুয়েলের পার্মিশন চেক কে ফাকি দিয়ে রুট ইউজারের জন্য নতুন পাসওয়ার্ড সেট করে দিয়েছি । এখন আমরা নরমালি মাইসিকুয়েল সার্ভার চালালেই নতুন পাসওয়ার্ড কাজ করবে । এজন্য আমরা আমাদের একটু আগে রান করা mysqld প্রসেসটি টার্মিনেট করে মাইসিকুয়েল রিস্টার্ট দিবো ।
1 2 |
sudo killall mysqld sudo service mysql start |
ব্যাস, এখন আমাদের নতুন সেট করে দেওয়া পাসওয়ার্ডই কাজ করবে!
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.
Let’s first install the Redis server:
1 |
sudo apt-get install 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:
1 |
pip install celery-with-redis |
And then install django-celery package:
1 |
pip install django-celery |
Add “djcelery” to your installed apps list:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', 'app', 'djcelery', # Must be added to the INSTALLED_APPS 'south', ) |
Modify your main app’s settings.py file to add the celery specific settings:
1 2 3 4 5 6 7 8 |
import djcelery djcelery.setup_loader() BROKER_URL = 'redis://localhost:6379/0' CELERY_RESULT_BACKEND = 'redis://localhost:6379/0' CELERY_ACCEPT_CONTENT = ['json'] CELERY_TASK_SERIALIZER = 'json' CELERY_RESULT_SERIALIZER = 'json' |
Now, inside your main application directory (the directory in which settings.py is located), create a file named “celery.py” with these contents:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
from __future__ import absolute_import import os from celery import Celery from django.conf import settings # set the default Django settings module for the 'celery' program. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings') app = Celery('project') # Using a string here means the worker will not have to # pickle the object when using Windows. app.config_from_object('django.conf:settings') app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) |
The above codes do a few things:
Also let’s modify the “__init__.py” file in the same directory to make the celery app available more easily:
1 2 |
from __future__ import absolute_import from .celery import app as celery_app |
This would allow us to use the same app instance for shared tasks across reusable django apps.
Now let’s create a tasks.py file in one of our INSTALLED_APPS and add these contents:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
from project import celery_app from time import sleep @celery_app.task() def UploadTask(message): # Update the state. The meta data is available in task.info dicttionary # The meta data is useful to store relevant information to the task # Here we are storing the upload progress in the meta. UploadTask.update_state(state='PROGRESS', meta={'progress': 0}) sleep(30) UploadTask.update_state(state='PROGRESS', meta={'progress': 30}) sleep(30) return message def get_task_status(task_id): # If you have a task_id, this is how you query that task task = UploadTask.AsyncResult(task_id) status = task.status progress = 0 if status == u'SUCCESS': progress = 100 elif status == u'FAILURE': progress = 0 elif status == 'PROGRESS': progress = task.info['progress'] return {'status': status, 'progress': progress} |
Now we have defined our own celery app, we have our tasks. It’s now time to launch the workers and start adding tasks.
Before we can start processing tasks, we have to launch the celery daemon first. This is how we do it:
1 |
celery worker --app=project.celery:app --loglevel=INFO |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
$ python manage.py shell [snipped] >>> from app.tasks import * # Please notice the "delay" method, which is a handy shortcut to apply_async. # It allows us to call the task with exactly the same parameters # as the original function. If you need more custom options, use apply_async. >>> t = UploadTask.delay("hello world!") # t is now a AsyncResult object. t.id is the task id for the task # you can directly use t to query the task. say - t.status >>> get_task_status(t.id) {'status': u'PROGRESS', 'progress': 0} #(After 35 secs delay) >>> get_task_status(t.id) {'status': u'PROGRESS', 'progress': 30} #(After waiting for another 35 secs or so) >>> get_task_status(t.id) {'status': u'SUCCESS', 'progress': 100} |
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.