Skip to main content

Posts

Stan Lee on Spiderman

If you have an idea that you genuienely think it good dotn't let some idiot talk you out of it. Now that doesn't mean that every wild notion you come up with is gonna be genius. But if there is something that you feel is good, something you want to do, something that means someting to you, try  to do it. Because I think you can only do your best work if you doing what you want to do. And if you are doing it the way you think it should be done. Just do your thing. Do as well as you... That's the important thing. Don't shirk! Whatever you do, give it your best short. You will be glad you did. @ Stan Lee
  Good becomes great, bad becomes worse. A strong man who has known power all his life can lose respect for that power, but a weak man knows the value of strength and knows compression

[Python] *args vs **Kwargs

পাইথনে ফাংশন আর্গুমেন্ট *args ও **kwargs আমরা মাঝে মাঝেই পাইথনের ফাংশনের প্যারামিটার হিসাবে *args, ** kwargs কে দেখতে পাই । তো এগুলো আসলে কি ? এবং এগুলো কিভাবে কাজ করে ? এই দুইটা বুঝতে হলে প্রথমে আমাদের আর্গুমেন্ট কি সেটা বুঝতে হবে । আর্গুমেন্ট কোন ফাংশন কল করার সময় আমার ফাংশনে যে ভেলু pass করি করি সেটা কে বলা হয় আর্গুমেন্ট । পাইথনে দুই ধরনের আর্গুমেন্ট আছে, Keyword Argument. Positional Argument. Keyword Argument যে সকল আর্গুমেন্টের সাথে তার আইডেন্টিফায়ার থাকে সেসব আর্গুমেন্ট কে keyword argument বলে । উদাহরণ দিলে পরিষ্কার হয়ে যাবে। মনে করেন আমাদের এইরকম একটা ফাংশন আছে, উপরে আমরা ৪ নং লাইনে ফাংশন কল করার সময় যে দুইটা আর্গুমেন্ট pass করলাম সেটাকে বলা হয় keyword argument. এখানে name = 'Arif' এ name এবং age = 24 এর age আর্গুমেন্ট দুইটির আইডেন্টিফায়ার । কারণ name, age দিয়ে আমরা আলাদা ভাবে দুইটা আর্গুমেন্টকে আইডেন্টিফাই করতে পারছি । Positional Argument যে আর্গুমেন্ট গুলো keyword argument না সেগুলো কে positional argument বলে । এই ধরনের আর্গুমেন্টের কোন আইডেন্টি...

পাইথনে জেনারেটর ও তার খুঁটিনাটি বিষয়

এখানে আমরা দেখব যে পাইথনে জেনারেটর বিষয়টা কি । আমরা কিভাবে জেনারেটর বানাতে পারি । জেনারেটর এক্সপ্রেশন কি ? আমাদের কেন ও কি অবস্থায় জেনারেটর ব্যবহার করা দরকার । তো শুরু করা যাক । জেনারেটর কি ? পাইথনে iterator তৈরি করার সবচেয়ে সহজ উপয় হল জেনারেটর । সাধারণ ভাবে বলতে গেলে জেনারেটর একটা ফাংশন যেটা একটা iterator অবজেক্ট রিটার্ন করে । যেটাকে পরে আমরা iterate করতে পারি । এবং যেটা কেবল মাত্র একবারই iterate করা যাবে । এখন প্রশ্ন হল এই জেনারেটর কিভাবে বানানো যায় ? জেনারেটর বানানো খুব সহজ । আমরা সাধারণ ফাংশন যেভাবে লিখি ঠিক সেভাবেই আমরা জেনারেটর বানাতে পারি । কিন্তু এখানে return স্টেটমেন্টের পরিবর্তে yield স্টেটমেন্ট থাকবে । যদি কোন একটা ফাংশনে অন্তত একটা yield স্টেটমেন্ট থাকে তবে সেটা কে আমরা জেনারেটর বলতে পারি । তবে একটা জেনারেটরে একাধিক yield স্টেটমেন্ট থাকতে পারে । yield এবং return দুইটাই ফাংশন থেকে কোন ভেলু রিটার্ন করে কিন্তু দুইটার মধ্যে পার্থক্য হল return স্টেটমেন্ট একটা ফাংশন কে পুরাপুরি terminate করে ফেলে । কিন্তু yield ফাংশন কে terminate না করে ফাংশনকে pauses করে রাখ...

পাইথনে মডিউল এবং প্যাকেজ কিভাবে কাজ করে ?

পাইথন মডিউল এবং প্যাকেজ আজকে আমরা পাইথনের মডিউল ও প্যাকেজ সম্পর্কে জানার চেষ্টা করব । এবং এগুলো কিভাবে কাজ করে সেটা দেখব । আরও জানবো পাইথন কিভাবে তার মডিউল কে খুঁজে বের করে । মডিউল কি ? যেকোনো সিঙ্গেল পাইথন ফাইল কে বলা হয় মডিউল । আমরা যেকোনো পাইথন ফাইল যেটা .py দিয়ে শেষ হয় সেটাকে আমরা যেকোনো পাইথন স্ক্রিপ্ট থেকে import করতে পারি । অনেক বড় প্রোগ্রাম কে ছোট ছোট অংশে ভাগ করার জন্য মডিউল আমাদের কে সাহায্য করে । মনে করি আমাদের arithmatic.py নামে একটা পাইথন ফাইল আছে । ফাইলটি আপনি এখন যে ডিরেক্টরিরে আছে সেই ডিরেক্টরিতেই থাকতে হবে । এবং এটার মধ্যে নিচের জিনিসগুলো আছে । এখন আমি যদি একই ডিরেক্টরিতে থাকি তবে এই arithmatic.py ফাইল কে নিচের মত করে import করতে পারব । এবং এর ফাংশন ও ভারিয়েবল কে ব্যবহার করতে পারব । প্যাকেজ কি ? উপরে আমরা দেখলাম যে আমরা যদি কোন মডিউল কে অন্য একটা মডিউল থেকে import করতে চাই তবে মডিউল গুলো কে একই ডিরেক্টরিতে রাখতে হয় । এটা একটা সমস্যা । এই সমস্যা দূর করার জন্যই মূলত পাকেজিং সিস্টেম । এর মাধ্যমে আমরা আমাদের লেখা বিভিন্ন পাইথন মডিউল কে ভিন্ন ভি...

Eclipse এ PyDev অফলাইনে কিভাবে ইন্সটল করা যায় ?

আমরা যদি Eclipse এ পাইথন ডেভেলপ করতে চাই তবে আমাদের PyDev ইন্সটল প্লাগিন ইন্সটল করা থাকতে হবে । PyDev ইন্সটল করার সবথেকে সহজে উপায় হল Eclipse এর Install New Software অপশন ব্যবহার করে ইন্সটল করা । কিন্তু এইটা মাঝে মাঝে সমস্যা হয় । কাজ করে না । এই জন্য আমরা PyDev প্লাগিন ম্যানুয়ালি ইন্সটল করতে পারব । এবং এটা করার জন্য আমরা যেটা করতে পারি সেটা হল : এই প্লাগিনের সর্বশেষ জিপ ভার্সন টি ডাউনলোড করুন  এখান থেকে জিপ ফাইল টি আনজিপ করুন । আনজিপ করলে আমরা features ও plugins নামে ২ ফাইল পাব  । এই ফাইল ২ টি কপি করে আমরা Eclipse সফটওয়্যারের dropins ফোল্ডারে পেস্ট করে দিব । এখন আমাদের Eclipse যদি চালু করা থাকে তবে Eclipse রিস্টার্ট দিব ।  আমাদের ইন্সটল ঠিক ভাবে হয়েছে কি না সেটা দেখার জন্য আমরা Window -> Preferences এ গিয়ে দেখব PyDev আছে কি না । যদি থাকে তবে এখন আপনি Eclipse এ পাইথনের জন্য কোড লিখতে পারবেন । ধন্যবাদ :)

ইলেকট্রন ফ্রেমওয়ার্কের সাথে SQLite3 ডাটাবেজ কিভাবে কানেক্ট করা যায় ?

ডেক্সটপ অ্যাপ্লিকেশন বানানর জন্য ইলেকট্রন খুব সুন্দর একটি ফ্রেমওয়ার্ক । এইটা তে JavaScript, HTML, CSS ব্যবহার করে ডেক্সটপ অ্যাপ্লিকেশন বানানো যায় । package.json, main.js, index.html এই ৩ টা ইলেকট্রনের মুল ফাইল । এবং এইগুলো নিয়েই আপনাকে কাজ করতে হবে । ইলেকট্রন সম্পর্কে জানতে https://electron.atom.io/ ভিজিট করতে পারেন । এখানে আমরা দেখব ইলেকট্রনের সাথে কিভাবে SQLite3 ডাটাবেজ কানেক্ট করা যায় । আমাদের জাভাস্ক্রিপ্টের সাথে SQLite3 কানেক্ট করার জন্য আমাদের sql.js ফাইল ডাউনলোড করা লাগবে । ডাউনলোড লিঙ্ক  https://raw.githubusercontent.com/kripken/sql.js/master/js/sql.js   মনে করি আমাদের data3.sqlite নামে ডাটাবেজ আছে । এবং আমরা আমাদের এই ডাটাবেজ কে কানেক্ট করতে চাই । এই জন্য  আমাদের কোড এ   require() ফাংশনের মধ্যে sql.js ফাইলের সম্পূর্ণ পাথ দিয়ে দিতে হবে এবং readFileSync() ফাংশনের মধ্যে আমাদের ডাটাবেজ ফাইলর সম্পূর্ণ পাথ দিয়ে দিতে হবে । কোড : আরও বিভিন্ন ভাবে আমরা ডাটাবেজের সাথে কানেক্ট করতে পারি । তার জন্য  https://github.com/kripken/sql.js এই ওয়েবসাইট দে...

পাইথনে Yield কিভাবে কাজ করে ?

Yield কি সেটা বোঝার জন্য Generator বোঝা লাগবে । আবার Generator কি সেটা বোঝার জন্য Iterables বুঝতে হবে । কি প্রথমেই মাথা ঘুরে গেল ? আচ্ছা মাথা ঘুরলে ঘুরতে দেন :D  আমরা শুরু করে দেই  । Iterables কি ? আমরা যখন কোন লিস্ট ক্রিয়েট করি । আমরা লিস্টের আইটেম গুলি একটা একটা করে রিড করতে পারি । এটাকেই বলা হচ্ছে iteration code: এখানে my_list হল iterable . যখন আমরা list comprehension ব্যবহার করে কোন লিস্ট ক্রিয়েট করি সেটাও একটা iterable । code : Python এ যেসব জিনিস iterable যেমন: টাপল, লিস্ট, ফাইল, স্ট্রিং, .... ইত্যাদি কে আমরা for .... in ...: দিয়ে রিড করতে পারবো । ডাটা খুব সহজেই রিড করার জন্য এইটা খুব কাজে দেয় । কিন্তু এর একটা সমস্যা আছে । সেটা হল । এইটা সব সময় লিস্টের আইটেম গুলিকে মেমরি তে ষ্টোর করে রাখে । এখন আমাদের সবসময় মেমরি তে লিস্ট আইটেম গুলি সেভ করে নাও রাখা লাগতে পারে । তো এইটা আমরা কি ভাবে সমাধান করবো ? Generators কি ? Generators গুলো হল  একধরনের iterators । কিন্তু আমরা কেবল একবারই generator এ iterate করতে পারি । এর কারণ হল generator সব ভেলু কে মেমরি তে ষ্টোর...

[ UVa ] 336 - A Node Too Far

গ্রাফ টি সবসময় connected নাও থাকতে পারে ।  সোর্স নোড টি মূল গ্রাফে নাও থাকতে পারে । সেই ক্ষেত্রে মূল গ্রাফে যতগুলি নোড আছে সেটা প্রিন্ট করতে হবে ।   TTL এর মান যত দেয়া থাকবে আমরা গ্রাফ কে ততো লেবেল পর্যন্ত সার্চ করে visited মার্ক করবে । এবং মোট নোড থেকে এই visited নোড কে বিয়োগ করে যেটা পাব সেটায় আমাদের প্রিন্ট করতে হবে ।  কোড :

[ UVa ] 750 - 8 Queens Chess Problem

আমরা এই সমস্যা তে যদি প্রথমেরই ৮ টা কুইনের জন্য সাম্ভাব সবগুলি অবস্থা হিসাব করে রাখি এবং পরে যেগুলো আমাদের কে প্রিন্ট করতে বলতেছে সেগুলো প্রিন্ট করি তবে খুব কম সময়ের মধ্যেই আমাদের প্রোগ্রাম রান করবে ।  কোড :

CPP তে map কে তার ভেলু অনুসারে কি ভাবে সর্ট করা যায় ।

আমরা জানি ম্যাপ ডিফল্ট ভাবে তার key অনুসারে অ্যাসেন্ডিং অর্ডারে সর্ট হয় । কিন্তু আমরা যদি key অনুসারে  সর্ট না করে value অনুসারে সর্ট করতে চাই তখন এই কাজটা কি ভাবে করা যায় আজকে আমরা সেটা দেখব ।    সাধারণ ভাবে ম্যাপ কে তার ভেলু অনুসারে সর্ট করা যায় না । ম্যাপ কে তার value অনুসারে সর্ট করার জন্য প্রথমে ম্যাপ  এর সবগুলো element [ key, value ] কে একটা vector এ কপি করে রাখতে হবে । এবং আমাদের কে সেই vector কে সর্ট করতে হবে । মনে করি আমাদের এই রকম একটা ম্যাপ আছে এবং তার মধ্যে এই ভেলুগুলো আছে । 1 2 3 4 5 map < string, int > mp; mp[ "ABC" ] = 10 ; mp[ "DEF" ] = 9 ; mp[ "GHI" ] = 5 ; ম্যাপের এই ডাটা গুলো কে আমরা একটা vector এ কপি করে রাখব । 1 2 3 4 5 6 vector < pair < string, int >> v; for ( auto it = mp.begin(); it != mp.end(); ++ it) { v.push_back( * it); // or we can use // v.push_back(make_pair(it->first, it->second));   } আমাদের ম্যাপের যেহেতু key, value দুইটা ভালু থাকে তাই এই দু...

[ UVa ] 1266 - Magic Square

Magic Square এমন একটি Square যার যেকোনো row, column, diagonal ভেলু গুলো যোগ করলে যোগফল সবসময় একই হবে ।  এই সমস্যা তে আমাদের কে Magic Square এ সাইজ দেয়া থাকবে প্রিন্ট করতে হবে Magic Square টি ।  Siamese (De la Loub`ere) method ব্যবহার করে এই সমস্যার সমাধান করা যায় ।  কোড :

[ UVa ] 11488 - Hyper Prefix Sets

আমাদের প্রথম ইনপুট দেয়া আছে { 0000, 0001, 10101, 010 } . এই সেটের প্রথম ২ টা থেকে ৩ টা করে নিলে আমরা যে Prefix পাব সেটাই আমাদের Prefix goodness . কারণ । ৩ * ২ = ৬ ।  Prefix Tree ব্যবহার করলে খুব সহজেই এই সমস্যা সমাধান করা যায় । কোড :

[ UVa ] 11463 - Commandos

এই সমস্যা টা মিনি-ম্যাক্স টাইপের সমস্যা ।  এই সমস্যা সমাধান করার জন্য প্রথমে আমাদের কে প্রত্যেক বিল্ডিং থেকে প্রত্যেক বিল্ডিং এ যাওয়ার মিনিমাম পাথ বের করতে হবে এই জন্য আমরা Floyd Warshall ব্যবহার করতে পারি ।  এর পর আমাদের কে যে source ও destination দেয়া থাকবে ।  আমরা প্রত্যেক বার source থেকে i হয়ে destination এ যেতে চেষ্টা করবে । যদি আমরা যতগুলি i ব্যবহার করে আমাদের লক্ষ্যে যেতে পারব তাদের মধ্যে যেটা ম্যাক্সিমাম সেটাই আমাদের কে প্রিন্ট করতে হবে ।   কোড :

[ UVa ] 10171 - Meeting Prof. Miguel

এই সমস্যা তে আমাদের কে এমন একটা সিটি বের করতে হবে যে জায়গা তে আমরা প্রফেসারের সাথে দেখা করতে পারব ।  এবং আমাদের খরচ হবে মিনিমাম হবে যদি প্রফেসারে সাথে আমাদের দেখা করা সম্ভব হয় ।  এই জন্য আমরা আমাদের অবস্থান থেকে সবচেয়ে কম খরচে কোথাই  কোথাই যেতে পারি সেটা বের করতে হবে ।  এরপর প্রফেসর তার অবস্থান থেকে সবচেয়ে কম খরচে কোথাই  কোথাই যেতে পারে সেটা বের করতে হবে ।  এখন যে সকল সিটি তে প্রফেসর ও আমরা উভয়ে যেতে পারি সেই সিটি গুলো একটা ভেক্টরে জমা রাখতে হবে ।  ভেক্টরের যে সিটির খরচ সবচেয়ে কম হবে । সেটই আমাদের ও প্রফেসসের মিটিং করা জন্য সবচেয়ে ভাল জায়গা এবং  সেটাই প্রিন্ট করতে হবে । যদি এই রকম একাধিক জায়গা থাকে তবে সবগুলি শহর কে lexicographical order এ প্রিন্ট করতে হবে ।  যদি প্রফেসরের সাথে দেখা করা সম্ভব না হয় তবে প্রিন্ট আমরা You will never meet. প্রিন্ট করব । কোড :