Fix Apple UK keyboard layout by placing the tilde and backtick key in the correct place

Having your keyboard layout suddenly changed is not a fun experience. Especially if you use the key very frequently whose location has been switched. I recently had the unfortunate experience of having a dead MacBook. But luckily, I got another MacBook from a brother on loan. The problem with this MacBook is that it has UK keyboard layout. I’m not used to the ISO/UK layout. A shorter shift on the left and enter key being in a completely different realm was difficult enough, when I noticed, the (`~) key was not beside 1 which is what I’m used to. But the key was occupied with a key that I think should be retired, especially because, macOS has excellent support for symbols, and (§±) can easily be input with option + 6 and option + + key combination. For these reasons, I was getting super annoyed. And decided to swap out “§” with “`”. After searching for a while, I came across an application named Karabiner.

I knew using this app I could switch the keys, but I didn’t know what the keys are called. So, after a lot of trial and error, I found that § is called, “non_us_blackslash”. So, this blog is basically, for me if I ever need to do this again xD Also, after installing Karabiner the fn key is now called the “globe” key.

In-memory Decompression of gzipped Web-response body Data in Elixir

I was trying to write a web crawler with Elixir and Crawly (A web crawling framework written in Elixir). The website I was trying to crawl had their sitemap gzipped. So, each entry in their main sitemap returned me a file like “sitemap-01.xml.gz” which needed to be gunzipped to get the XML file I was after.

Initially, I thought HTTPoision will handle the decompression. But turns out HTTPoision is just a wrapper around hackney and hackney doesn’t support this. So, I did a few google searches, and being tired, I didn’t use the most effective keywords and ended up with File.stream! which obviously didn’t work. Because, File.stream! needs a file path which should have been a red flag, but I proceeded to go down the rabbit hole anyway.

Then I thought that it might work if I write the response to a file and decompress it with File.stream! but thinking about it gave me the chills, there’ll be a lot of files written, decompressed, and read from. So this wasn’t the solution I was even going to write and try out.

After a whole lot more searches and asking around, I finally found the answer (Huge thanks to Mafinar bhai), which is an Erlang lib called “zlib“. Using this library I could easily get the data I wanted to like the following code block:

response.body
|> :zlib.gunzip()

Now you might be asking why I didn’t use an HTTP client which had compression support like, Tesla? Because, I had HTTPoison free with Crawly, and I didn’t want to explore how to change it to Tesla or Mint due to a deadline. Yes, deadlines are the worst!

Running scheduled tasks in Elixir with Quantum

Quantum is a beautiful and configurable library that allows running scheduled tasks on an Elixir system/application. Even though the documentation may seem adequate to an experienced Elixir/Erlang programmer, being a newcomer it was a bit confusing to me. So, I’m trying my best to explain this so that when I forget, I have a reference…

If you’re future me or a lost soul, continue reading.

What is the problem we’re trying to solve exaclty?

On a software system, there are a few tasks that need scheduled running. Examples of such tasks would be, a database backup that runs everyday at 12 AM. Or, fetching data from some API that updates at 10 PM every day and you just call that API and populate your database. Or, you might need to check the connection with other services each minute. Or. think about renewing your website’s SSL certificate every 3 months. All of these tasks are traditionally handled by the cron jobs of Linux. But we can do better.

Let’s say, you’re deploying your application to 10 different servers. And you run identical scheduled jobs in each server because they are a fleet of identical systems. Yes, you can configure your cron jobs in each of those servers or you can ship your application with its own scheduler and job queue. So that you don’t have to do any extra configuration on an individual server. One less configuration means, one less scope to screw things up. (Don’t ask how many times I’ve messed up crontab in a production server)

Ok, but is shipping a scheduler with my app a good idea?

Well, it depends.

Even though I’m not qualified to talk about how BEAM handles concurrency and schedules the processes, I can link a blog post. Basically, the scheduler process is very light weight and it doesn’t block anything. It’s all handled by the magic we know as BEAM. So, you would barely notice any performace hit shipping a task scheduler with your Elixir application.

Tell me more about that Quantum thing.

According to Quantum‘s documentation Quantum is a “Cron-like job scheduler for Elixir.” Basically it let’s us run our Elixir/Erlang fucntions in a scheduled manner. I’m not going to cover everything about how to utilize this library in your application, you can read their documenation for that. I’ll only cover a few things that I wish I could figure out faster than I was able to when I first used this library.

1. Job format in config.exs file

So, in the Usage section of the documentation they tell you a job format like {"* * * * *", {Heartbeat, :send, []}} but it was really confusing for me to understand what those parameters were. I later figured out that inside the tuple, Heartbeat was the module name, :send is a fucntion inside that Heartbeat module and [] was the argument to that :send fucntion. So the job was bascially calling the Heartbeat.send/0 fucntion. In retrospect, it feels really dumb thinking how much I time I spent figuring this out.

2. You need a TimeZone database

So, like most of us your server timezone might be set to UTC. But you live in Bangladesh and you need to send a daily reminder to your collegues at 10 AM Asia/Dhaka time. Instead of doing the math that Asia/Dhaka time is actually UTC+6, you want to directly type 10 in your job configuration. You look into Quantum’s amazing documentation and find that it has time zone support. Before you jupm and copy the code block for TZ support, becareful and notice that you actually need another module Tzdata and config :elixir, :time_zone_database, Tzdata.TimeZoneDatabase this line in your config.exs file.

Good Bye!

These were the two problems I struggled a bit and spent more time than I should have. So, I’m just documenting them. If you have any other questions, problems or opinions that I’ve not listed here, please put them in the comments or email to me at [email protected] I’d love to hear your experience. I’m alvailable with @m4hi2 handle, almost everywhere. Thanks for reading. 😀

[Solved] “/bin/sh 1 cd can’t cd to //wsl$/….” in JetbrainsIDEs (PyCharm, RubyMine etc.)

So, you’re a developer on Windows (because you want to play games and not rich enough to have multiple machines) and you rely on WSL2 for your development. You were using VScode and living a happy life but people keep pressuring you to give Jetbrains IDEs a try. So, you finally give up explaining why VScode is a great editor and thought of giving Jetbrains stuff a shot. But after installing you can create your remote with WSL but whenever you want to use those IDE features to install the dependencies and manage other things you’re hit with this annoying error:

/bin/sh 1 cd can't cd to //wsl$/home/username/project_dir

The problem with this error is that the solution for this error is actually on the official Jetbrains Documentation but they marked it as an optional step? WTF? Without this crucial step, most of the IDE features are just useless. So to solve this one just have to map (follow the official documentation) the project dir to the Unix directory, like:

//wsl$/home/username/project_dir -> /home/username/project_dir

And the problem should be solved.

Solution: Hosts file parsing error with erlang/elixir on Windows

If you’re encountering the following error:


2020-12-08 01:01:32.768000
args: ["c:/WINDOWS/System32/drivers/etc/hosts",1]
format: "inet_parse:~p:~p: erroneous line, SKIPPED~n"
label: {error_logger,info_msg}
inet_parse:"c:/WINDOWS/System32/drivers/etc/hosts":1: erroneous line, SKIPPED

when running iex --name alice on Windows, you’re not alone. Turns out, the file encoding has to be ASCII for the parsing to work. But some other application like Docker might access the hosts file and change it’s encoding to UTF-8. This usually doesn’t affect day-to-day usage but for some reason, Earlang’s inet_parse doesn’t like this. To solve the above error you have to change the encoding of the host file to ASCII. This can be easily done with a PowerShell Command.

Open a Powershell window with Admin privileges. And execute the following:

Get-Content -Path "C:\Windows\System32\drivers\etc\hosts" | Out-File -FilePath "C:\Windows\System32\drivers\etc\hosts" -Encoding ascii

This should solve the above issue. If this doesn’t help you, please make sure you’re hosts file isn’t corrupted in any other ways.

কি বোর্ড মাউস ছাড়াই রাস্পবেরি পাই সেটাপ করুন

সেই দিন আর নাই যখন রাস্পবেরি পাই ছিল দেশে রূপকথার গল্পের মত। এখন আমরা অনেকেই বিভিন্ন কাজে রাস্পবেরি পাই ব্যবহার করে থাকি। কিন্তু সমস্যাটা বাঁধে এটার সেটাপ নিয়ে। রাস্পবেরি পাই দিয়ে আমরা সাধারণত যে ধরনের কাজ গুলা করে থাকি সেগুলার জন্য এটার সাথে সর্বক্ষণ কিবোর্ড-মাউস এবং মনিটর লাগানো না থাকলেও অনেকই মনে করেই নেন যে কিবোর্ড-মাউস এবং মনিটর সরাসরি পাই এর সাথে কানেক্ট না করে পাই কনফিগার করা যায় না। কিন্তু আসলে বিষয়টা তা না। আমরা চাইলে সরাসরি পাই প্রথম বার বুট হবার আগেই কিছু জিনিস পত্র পাই এর SD কার্ডে কনফিগার করে দেবার মাধ্যমে ssh এক্সেস চালু করার পাশাপাশি চাইলে আপনার ওয়াইফাই নেটওয়ার্কেও কানেক্ট করে ফেলতে পারি। আমি হিসাব করে বলতে পারব‌ো না যে কত মানুষ মাঝ রাতে ফোন দিয় বলেছে সূর্য উঠা মাত্র একটা HDMI to VGA আর প্যাচ কেবল নিয়ে রুমে আয়। আজকে তাই ভাবলাম কিছু জ্ঞান শেয়ার করে মানুষজনের (নিজের) কষ্ট কমাই। কথা না বাড়িয়ে দেখে নেয়া যাক কি করতে হবে:

ধাপ ১: প্রথমে একটি  microSD কার্ডে পছন্দের রাস্পবিয়ান ভার্সন ফ্ল্যাশ করে নিতে হবে। সেজন্য পছন্দের যেকোন ফ্ল্যাশিং মেথড ব্যবহার করতে পারেন।  ফ্ল্যাশ করার পর সেটা কম্পিউটার থেকে খুলে নিয়ে পাই এ লাগানোর দরকার নাই, ২য় ধাপের জন্য আমাদের কার্ড কম্পিউটারের সাথে কানেক্ট করা অবস্থাতেই লাগবে। ঠিকমত ফ্ল্যাশ করা হলে, কার্ডটিতে দুইটি পার্টিশন তৈরী হবে। আমাদের সকল কাজ করতে হবে “boot” নামের পার্টিশনে।

ধাপ ২: এবার SSH এক্সেস চালু করতে হবে। সিকিউরিটির কারনে বাই ডিফল্ট রাস্পবিয়ানে কোন ইন্টারফেইস চালু করা থাকে না, হার্ডওয়ারগুলা ছাড়া। তাই আমাদেরকে SSH এক্সেস চালু করতে হবে। এটার প্রসেসটা খুবই সিম্পল, কিন্তু কিছু জিনিস মাথায় রাখতে হবে। ssh এক্সসে চালু করার জন্য আমাদেরকে ‘boot’ পার্টিশনের রুটে একটা ফাইল তৈরী করতে হবে ‘ssh’ নামে। খেয়াল করার বিষয়টা হচ্ছে ফাইলটার নাম ‘ssh’ ই হতে হবে। ‘ssh.txt’ বা অন্য কিছু হলে কিন্তু কাজ করবে না। ম্যাক বা যেকোন লিনাক্স ডিস্ট্রিবিউশনে touch ssh এই কমান্ড দিয়ে ফাঁকা ফাইলটি তৈরী করতে পারবেন। উইন্ডোজের জন্য আমি VS Code থেকে ফাইল “No Extension” হিসাবে সেভ করে ফলাফল পেয়েছি। আপনি যদি কোন কারনে ফাইলটি তৈরী করতে ব্যর্থ হন, তাহলে এখান থেকে ডাউনলোড করেও কাজ চালাতে পারবেন।

ধাপ ৩: যেহেতু আমরা কম্প্লিটলি ওয়ারলেস সেটাপ করছি তাই আমরা ল্যান কেবলের বদলে সরাসরি আমাদের ওয়ারলেস নেটওয়ার্কে আমাদের পাই কানেক্ট করে ফেলব। কাজটি খুবই সোজা, আমরা শুধুমাত্র একটি কনফিগারেশন ফাইলে আমাদের নেটওয়ার্কের ডিটেইলস বলে দিব এবং ফাইলটি  wpa_supplicant.conf নামে বুট পার্টিশনের রুটে সেইভ করব। এই ফাইলটি রাস্পবিয়ান প্রথম বুট হবার সাথে সাথেই রাস্পবেরি পাইটি আমাদের ওয়ারলেস নেটওয়ার্কে কানেক্ট করে দিবে। ফাইলটির কনটেন্ট নীচের মত:

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=<Insert country code here>
network={
ssid="<Name of your WiFi>"
psk="<Password for your WiFi>"
}

খেয়াল রাখবেন, আপনার SSID এর নাম আর PSK পাসওয়ার্ড, দুইটিই কিন্তু কেস সেন্সিটিভ। যেহেতু আমরা বাংলাদেশে আছি, তাই কান্ট্রিকোড হিসাবে BD বসিয়ে দিন। তাই ছোট হাতের ও বড় হাতের বর্ণ মিলিয়ে ফেলবেন না।

ধাপ ৪: এবার আপনার SD কার্ড টি আপনার রাস্পবেরি পাই এ লাগিয়ে পাওয়ার দিন। আপনার ওয়াইফাই রাউটারের প্যানেলে গেলেই আপনার রাস্পবেরি পাই ডিভাইসটির আইপি দেখতে পারেবন। আপনার পছন্দের ssh  ক্লায়েন্ট যেমন, PuTty বা টার্মিনালের ssh কমান্ড ব্যবহার করে আপনার ডিভাইসে লগিন করতে পারবেন রাউটারের প্যানেল থেকে পাওয়া আইপিটি ব্যবহার করে।

ধাপ ৫: sudo raspi-config কমান্ড চালিয়ে আপনি অনান্য কনফিগারেশন গুলা সম্পন্ন করে ফেলতে পারবেন। চাইলে এখান থেকে VNC সার্ভার চালু করে দিতে পারেন, তাহলে আপনি VNC Viewer ব্যবহার করে ওভার নেটওয়ার্ক গ্রাফিক্যাল ইন্টারফেইসের মাধ্যমেও কাজ করতে পারবেন।

কারও কোন প্রশ্ন থাকলে সেটা কমেন্টে জানাতে পারেন, অন্য কিছু নিয়ে জানার থাকলে সেটাও জানাতে পারেন।

টারমিনাল বা স্ক্রিপ্ট থেকে ডিফল্ট অ্যাপলিকেশনের মাধ্যমে ফাইল ওপেন করার মোটামুটি অব্যর্থ উপায়

আমরা লিনাক্স বেইজড ডিস্ট্রিবিউশন গুলা যারা চালাই তারা অনেকেই টার্মিনাল ব্যবহারে অভ্যস্ত, GUI থাকার পরেও। অধিকাংশ ক্ষেত্রেই আমাদের একাধিক অ্যাপ থাকে একই কাজের জন্য। যেমন, ভিডিও প্লেব্যাকের জন্য VLC ছাড়াও আরও অনেক অ্যাপ থাকাটা অস্বাভাবিক না। এখন আপনি হয়ত বলবেন, আমি তো appname filename.extension এই ফরম্যাটে কমান্ড দিলেই যেকোন অ্যাপলিকেশন দিয়ে ওপেন করতে পারি। হ্যাঁ, তা পারেন। তবে এটার দুইটা সমস্যা আছে।
১। অ্যাপলিকেশন ভেদে আপনি আর ঐ টার্মিনাল উইন্ডোটা ব্যবহার নাও করতে পারেন
২। আপনি যদি কোন স্ক্রিপ্টের মাধ্যমে ওপেন করতে চান তাহলে আপানর স্ক্রিপ্টের ইউজারের কাছে যে ঐ অ্যাপ থাকবে তার কোন গ্যারান্টি নাই।

মূলত দুই নং পয়েন্টটার জন্যই অধিকাংশ সময়ই ঝামেলায় পড়তে হয়। ম্যাকে open নামে একটা কমান্ড দেখে মুগ্ধ হয়ে গেছিলাম। সুন্দর মত MIME Type দেখে ডিফল্ট অ্যাপলিকেশন দিয়ে এই কমান্ডটি ফাইল ওপেন করে ফেলে। এখন প্রশ্ন আসতে পারে, ভাই MIME Type আবার কি? সংক্ষেপে উত্তর দেই আমরা সাধারণত মনে করি একটা ফাইলের মধ্যে কি আছে তা মনে হয় ফাইলের এক্সটেনশন দেখে বুঝা যায়। কিন্তু আসলে বিষয়টা তা না। আমি কোন এক্সটেনশন ছাড়াও ফাইল রাখতে পারি এবং অনেক ক্ষেত্রেই এক্সটেনশন গুলা জাস্ট কন্টেইনার হিসাবেও কাজ করে। ফাইলের ভেতরে আসলে কি ধরনের ডাটা আছে, কোন কম্প্রেশন এলগোরিদম ব্যবহার করা হয়েছে এগুলা আসলে MIME Type দেখে বোঝা যায়। যেমন, একটা ইমেজ ফাইলের MIME Type হতে পারে ‘image/jpeg’, অর্থাৎ, ফাইলটি একটা ইমেজ আর এর কম্প্রেশন অ্যালগোরিদম হচ্ছে jpeg। তো এই প্রতিটা MIME Type এর জন্য আপানর অপারেটিং সিস্টেমের একটা ডেটাবেইজ আছে, যেখানে কোন MIME Type এর ফাইল কোন অ্যাপলিকেশন দিয়ে বাই ডিফল্ট ওপেন করা হবে তার একটা লিস্ট থাকে। সুতরাং আমরা যদি ইউজারের ডিফল্ট অ্যাপলিকেশন দিয়ে ফাইল ওপেন করতে চাই, তাহলে আমাদের এই ডেটাবেইজ থেকে ইনফরমেশন নিয়ে সম্পর্কিত অ্যাপটা কল করতে হবে।

ওকে, থিউরি বুঝা শেষ। খুব পেইনের কাজ মনে হচ্ছে তাই না? আসলে না। এইসব জিনিসপত্র হ্যান্ডেল করার জন্য ডেস্কটপ লিনাক্স ডিস্ট্রিবিউশন গুলাতে xdg-utils নামে একটা প্যাকেজ থাকে (সাধারণত, আমি এখনও এই প্যাকেজ ছাড়া কোন ডিস্ট্রিবিউশন দেখি নাই। আপনার জানা থাকলে অবশ্যই জানাবেন)। এই প্যাকেজের দ্বায়িত্বই হচ্ছে ডেটাবেজ টা ম্যানেজ করা আর ডিফল্ট অ্যাপলিকেশন সেট করা। xdg-utils প্যাকেজের সাথে একটা কমান্ড আছে ‘xdg-open’ এবং আশা করি কাজ বুঝে ফেলেছেন 😉

কমান্ডটির ব্যবহার,
xdg-open filename

ব্যাস, কাজ শেষ। 🙂

মাইম টাইপের ব্যাপরে প্রথমে শিখতে হয়েছিল একটা বিশাল বাঁশ খেয়ে। শিখিয়েছিলেন, লিজেন্ড বাবর ভাই। 🙂

কারও কোন প্রশ্ন বা অন্য কিছু জানার থাকলে কমেন্ট করতে পারেন। অথবা, আমাকে মেইল করতে পারেন [email protected] এ 🙂

Huawei Honor Band 3 এর মনের ভেতর থেকে একটা রিভিউ

যখনই Honor Band 3 এর কথা উঠে, একটা কথা বারবার শুনতে হয়, সেটা হচ্ছে Color Band A2 এর ডিস্প্লে বড়, ফিচার সেটও দুই ব্যান্ডের প্রায় একই তাহলে ১ হাজার টাকা বেশি দিয়ে Honor Band 3 কেন কিনব? উত্তরটা হচ্ছে, Honor Band 3 জল নিরোধোক, এটা পুরা পানিতে চুবিয়ে দিলেও কিছু হবে না এবং এটা পরে সাঁতার দেওয়া যায়। ডিস্প্লে ছোট হওয়াই এটার চার্জও সামান্য বেশি যায়। তবে সেটা চোখে পড়ার মত কোন বিষয় না। দুই ব্যান্ড হাতে দিয়ে ব্যান্ড থ্রি আমার কাছে বেশি আরাম দায়ক মনে হয়েছে। বেশি কথা না বাড়িয়ে ভালমন্দ দিক নিয়ে বলতে চাই। অধিকাংশ জিনিসই দুই ব্যান্ডের জন্য একই হবে। তেমন তফাৎ নাই (সাঁতার আর হার্টরেট সেন্সরের কন্সিস্টেন্সি ছাড়া)।

ভাল দিক:
১। ৫০ মিটার পর্যন্ত পানি নিরোধী হওয়ায় সাঁতার ট্রাক করা যায়
২। হার্টরেট সেন্সরের একুরেসি কতটুক জানি না তবে কন্সিস্টেন্সি ভাল
৩। স্লিপ ট্র্যাকিং পার্ফমেন্স অসাধারন। আপনি সারাদিনে যেকোন সময় ঘুমাতে পারেন। এটা ট্র্যাক করবে, অত্যন্ত দক্ষতার সাথে
৪। এক ঘণ্টা বসে থাকলে ঝাঁকি দিয়ে নড়াচড়া করতে বলে
৫। নাম ও ফোন নম্বর সহ ডিস্প্লে তে নটিফিকেশন আসে, কেও ফোন দিলে
৬। কোন ফোন না ধরতে চাইলে সরাসরি ব্যান্ড থেকেই কল এবর্ট করা যায়, ফোন পকেট থেকে বের করার দরকার নাই
৭। এসএমএস ও অন্যান্য নটিফিকেশন ফুল সো করে, ফলে চাইলে ইংরেজিতে লিখা মেসেজ ব্যান্ডেই পড়ে নেওয়া যায়
৮। রেইজ টু ওয়েক ফিচার টা অস্থির কাজ করে। সামনে আনতেই ডিসপ্লে অন হয়ে যায় আবার সরানো মাত্রই বন্ধ
৯। সারাদিন হার্টরেইট মনিটরিং গ্রাফটা অস্থির লেভেলের ডিটেইলড
১০। সারাদিনে কত টুকু ঘুমানো বা হাঁটা হলো ব্যান্ডে সরাসরি দেখা যায়
১১। ব্যান্ড থেকে সরাসরি বিভিন্ন ট্র্যাকিং (দৌড়, সাঁতার, হার্টরেট) চালু করা যায়। ফোনের দরকার নাই

মন্দ দিক:
১। রোদে ডিস্প্লে দেখতে ভাল কষ্ট হয় (রাজশাহীর রোদ ভাই 🙂 রাস্তা দেখতেও কষ্ট হয়)
২। বাংলা টেক্সট রেন্ডার করতে পারে না। ফলে কেও বাংলায় মেসেজ দিলে বা কারও নাম বাংলায় সেইভ করা থাকলে সেটা দেখা যায় না
৩। অসম্ভব রকমের বাগি সফটওয়ার, এটা নিয়ে বলা শুরু করলে সারাদিনেও শেষ হবে না
৪। চার্জ ৫-৬ দিনের বেশি থাকে না, সব ফিচার ব্যবহার করলে (বিশেষ করে ট্রু স্লিপ ট্র্যাকিং)
৫। সফটওয়ারে ক্লাইম্বিং কাউন্টার থাকলেও আপনি গাছে উঠেন আর এভারেস্টের চুড়ায়, কিচ্ছু কাউন্ট হয় না (এটা সফটওয়ার ইস্যু)
৬। কল রিসিভ করার পরেও ব্যান্ডে মিসড্ কল হিসাবে সো করে এবং নতুন কোন কল আসার আগ পর্যন্ত ঐ মিসড্ কল এলার্ট উঠে থাকে (এটা সব থেকে বেশি বিরক্তিকর)
৭। Health অ্যাপ দিয়ে সরাসরি কানেক্ট না করলে ঘড়ি ১২ ঘণ্টা করা যায় না
৮। Wear অ্যাপ দিয়ে কানেক্ট করলে নটিফিকেশন ভাল মত পাওয়া যায় কিন্তু ঘড়ি ১২ ঘণ্টার করা যায় না
৯। আমার মত চামড়া পাতলা হলে ব্যান্ডটা কেটে বসে যাবে চামড়ায় আর চুলকাতে পারে। তবে এটা অন্য কারও সাথে হয়েছে বলে এখনও শুনি নাই
১০। ডিস্প্লেতে স্ক্র্যাচ পড়ে, যদিও কোথাও স্ক্রাচ রেজিস্টেন্স দাবি করা হয় নাই তারপরও এটা উল্লেখ করা ভাল
১১। দিনের ডেটা দিনে সিঙ্ক না হলে তা হারিয়ে যায়। মানে আপনি সারাদিন ফোন ছাড়া ব্যান্ড ব্যবহার করলে সব ডেটা ব্যান্ডে সেইভ থাকবে তবে অবশ্যই রাত ১১:৫৯ এর মধ্যে ফোন কানেক্ট করে সিঙ্ক করে নিতে হবে

ব্যান্ডের কোন ছবি নাই, দেখতে মন চাইলে গুগল করে দেখেন -_-

আর্ডুইনো দিয়ে AVR MCU প্রোগ্রামিং

আজকে এক ফ্রেন্ডকে AVR MCU দিয়ে প্রযেক্ট ডিপ্লয় করার কথা বললে সে উত্তর হিসাবে বলে যে, “আমি তো AVR প্রোগ্রামিং পারি না।” আমার যেহেতু এই আঙ্গনে কিঞ্চিৎ চলা ফেরা আছে, তাই আমি জানি যে AVR প্রোগ্রামিং ছাড়াই ATtiny13A, ATmega8 টাইপের চিপ গুলা প্রোগ্রাম করা যায়। এর জন্য আর্ডুইনো কোড করার জন্য যতটুকু জ্ঞান দরকার, তা থাকলেই চলে 🙂

মিছা কথা। আসলে আর্ডুইনো কোড করতে যতটুকু জ্ঞান দরকার তারথেকে একটু বেশি জ্ঞান লাগে। যেটুকু বেশি লাগে, সেটুকু নিয়েই লিখতে বসেছি।

 

আচ্ছা, এখন প্রশ্ন হতে পারে ৫০০ টাকা দামের একটা আর্ডুইনো উনো বোর্ডে বসিয়ে দিলেই তো হয়। স্পেশ নিয়ে সমস্যা? তাহলে আর্ডুইনো মাইক্রো দিলেই তো হয়ে যায়। তাহলে কেন মাথা নষ্ট করে স্ট্যান্ডঅ্যালোন মাইক্রোপ্রসেসর প্রোগ্রাম করতে যাব? উত্তরটা হচ্ছে পাওয়ার কনজানম্পশান। আর্ডুইনোতে পাওয়ার লস হবার অনেক কম্পোনেন্ট আছে। যেমন, আর্ডুইনো 3.3 থেকে 9 ভোল্ট পর্যন্ত পাওয়ার করা যায়। মানে বেশ কিছু ভোল্টেজ রেগুলেটর আছে। তার উপর আরও কিছু LED হ্যানত্যান আছে। সুতরাং, ব্যাটারি চালিত কোন প্রযেক্ট ডিপ্লয় করতে হলে MCU এর বিকল্প নাই 🙂

 

যা যা লাগবে:

১। আর্ডুইনো উনো,

২। একটা ১০ মাইক্রো ফ্যারাড ক্যাপাসিটর,

৩। যে MCU টা প্রোগ্রাম করবেন সেটা,

৪। সুবিধা মত জাম্পার ওয়ার ও

৫। বুক ভরা সাহস… (ফাইজলামি করলাম। আমার মত ফেইল করা ছাত্র পারলে যে কেও পারবে)

আচ্ছা, এইবার আসি কাজের কথায়। স্টেপ বাই স্টেপ ফলো করলেই হবে,

বিঃদ্রঃ এক্ষেত্রে আমি Arduino UNO এবং ATmega8A ব্যবহার করে উদাহরণ দিয়েছি। কেন? হাতের কাছে ছিল।  একটা ATTiny13A ও ছিল, কিন্তু পিন কম বলে ব্যবহার একটু সীমিত।

১ম স্টেপ:

এই লিংক থেকে আপনার MCU এর জন্য বোর্ড ফাইলের লিংকটি খুঁজে বের করুন এবং লিংকটি কপি করুন। যেমন, ATmega8A, ATmega328, ATmega88, ATmega168 এর জন্য লিংক হচ্ছে https://mcudude.github.io/MiniCore/package_MCUdude_MiniCore_index.json

২য় স্টেপ:

Arduino IDE ওপেন করে প্রেফারেন্সে যান। অতঃপর Additional Board Manager এর যায়গাতে আপনার কপি করা লিংকটি পেস্ট করুন এবং ওকে ক্লিক করুন।

৩য় স্টেপ:

আর্ডুইনো উনো কানেক্ট করুন এবং Arduino IDE তে File>Example>ArduinoISP>ArduinoISP স্কেচটি ওপেন করুন ও এটি আর্ডুইনো উনোতে আপলোড করুন।

৪র্থ স্টেপ:

আপনার MCU এর ডাটাশীট গুগল করে খুজে বের করুন। একটা MCU কে আর্ডুইনো দিয়ে প্রোগ্রাম করতে আমাদের ছয়টা পিনের দরকার। পিন গুলা হচ্ছে RESET, MISO, MOSI, SCK, VCC আর GND। মানে আমরা মূলত SPI বাসের মাধ্যমে MCU টির সাথে কমিউনিকেট করব এবং প্রোগ্রাম করব। বিস্তারিত চাইলেই লিখা যায় কিন্তু আগে জানতে হবে অডিয়েন্স রেডি কিনা। 😉

নীচের ছবিতে ATmega8A এর জন্য পিন লেআউট তুলে ধরা হল। এখানে দেখলে বুঝা যায়, PIN1 হচ্ছে RESET, PIN7 VCC, PIN8 GND, PIN19 SCK, PIN18 MISO এবং PIN17 MOSI.

৫ম স্টেপ:

এবার আমাদের MCU টিকে আর্ডুইনোর SPI বাসের সাথে কানেক্ট করতে হবে। আমরা যদি ডকুমেন্টেশন দেখি তাহলে বুঝতে পারব আর্ডুইনো উনো এর PIN13 SCK, PIN12 MISO, PIN11 MOSI এবং PIN10 SS. তারমানে দাঁড়াচ্ছে যে আর্ডুইনোর PIN13 কানেক্ট করতে হবে MCU এর SCK পিনে, এক্ষেত্রে ATMega8A এর PIN19 এ। অনুরুপ পিন গুলি কানেক্ট করতে হবে। VCC ও GND পিন কানেক্ট করতে হবে আর্ডুইনোর 5V ও GND পিন এর সাথে। PIN10 এর কাজ ব্যাখ্যা করার ধৈর্য আপাতত নাই এবং এটার বিস্তারিত আলোচনা এই আর্টিকেলের আওয়তামুক্ত বলেই মনে করি। তবে PIN10 কানেক্ট করতে হবে MCU এর রিসেট পিনে। ওহ, ভাল কথা, ১০ মাইক্রো ফ্যারাড ক্যাপাসিটরটার কথা মনে আছে? ওটাকে লাগিয়ে দিন আর্ডুইনোর RESET পিন আর GND পিনের মাঝে…

কানেকশন বুঝতে অসুবিধা হলে, এই লিংকে গেলেই হবে…

 

৬ষ্ঠ স্টেপ:

আচ্ছা, এবার MCU এর কোন পিন স্কেচে কি লিখতে হবে তাতো বুঝতে হবে নাকি? একটু গুগল করলেই পেয়ে যাবেন। না পেলে হিন্টস দেই, ADC গুলি হচ্ছে Analog Pin, PD গুলি Digital Pin আর OC লিখা গুলিতে আছে PWM সুবিধা। এটার জন্য একটা ছবি বানাইতে হবে, অসুবিধা হইলে কমেন্টে জানায়েন, চেষ্টা করব দ্রুত দেবার। জাতির পছন্দের D13 পিন হচ্ছে, ATmega8 এর PIN19 😉

৭ম স্টেপ:

এবার আর্ডুইনোটা পিসিতে কানেক্ট করেন। Arduino IDE এর Tools থেকে Board সিলেক্ট করেন যেটা আপনার বোর্ড, এক্ষেত্রে আমি ATmega8 সিলেক্ট করেছি। আর Programmer সিলেক্ট করেন Arduino ISP. এবার আপনি যেই স্কেচ MCU  তে বার্ন করতে চান, সেটিকে Shift চেপে রাখা অবস্থায় আপলোড করেন বা “Upload using Programmer” অপশন ব্যবহার করেও করতে পারেন। ব্যাস। কাজ শেষ -_-

 

কোন সমস্যা হলে, এখানে কমেন্ট করতে পারেন বা ইমেইল করতে পারেন, [email protected] এ। ফেসবুকেও মেসেজ করতে পারেন।

ধন্যবাদ সময় নিয়ে পড়ার জন্য 🙂