Good Programming in a Nutshell

The Term “Good Programming” – in a nutshell

Nowadays the term Programming is becoming very popular! Specially among those who are involved in any profession related to Computer Science or, Web Development & Design. Most of them do programming more or less everyday! But, not everyone who code is a good programmer!

One of the biggest reason behind this is to be a good programmer you need to follow good coding practices. It should become your second nature. Good coding practices require efforts & most of the time it takes years to adopt them properly! In some startup or in companies with fast paced environment time is pretty scarce, and developers don’t have the luxury to spend their time on learning best practices as they are always chasing deadlines! Interesting thing is, sometime bad buggy, unorganized codes seem to be good enough to get things moving which plays a negative role of discouraging people to improve their coding. This often leads to a giant legacy code base full of patches & workarounds. For example, it is quite common to see company still maintaining a large code base of 10 years old just because it still works!
And the maintainers of those code bases usually spend fair amount of time roaming from one desk to others, scratching their heads or even biting their nails (gross & unhygienic) The struggles of these code maintainers continues until the code becomes obsolete and no longer maintainable!

You might be wondering is it really true? Well lets talk about one of the tech giant called ‘Facebook’ When they launched for the first time in 2004. It was purely based on PHP. With the gain of popularity code base also had a growth spurt! It became extremely difficult for them to get rid of PHP and move on to some other stacks or, trending frameworks of that time (for example Django). To stop the growth spurt and make the code more maintainable the facebook team had to invent a programming language named ‘Hack‘. Surely, they had to spend a lot of time to invent hack on top of PHP that wraps php with security features & some cool properties of functional programming. The biggest plus point was that hack was compatible with PHP. Hence, the whole php codebase didn’t become useless right away

So it seems like spending those extra hours did pay off to Facebook!

When I got my first laptop, I used to type with my two index fingers by looking at keyboards all the time. My Typing speed was around 10-15 words per min. Then after a lot of practice in next few months I reached 35-40 words per minute. After that the gain of speed reduced drastically. I could get my work done with this speed but, it was extremely hard to reach a speed of 50 words per minute (dark rooms were nightmares)!

Then one day I decided to bring an end to this. So started to practice touch typing. The beginning days were extremely painful, my speed dropped to 5-10 words per min. To type 10 words I had to press backspace 1000 times. And, way too time consuming! I keep on trying and learned the basics key positions within next month. Slowly the number of backspaces reduced and, so do the struggles, I started to gain speed and accuracy!

Even though you might find the above story irrelevant to the current context but the fact is almost identical with learning best practices in programming. In early days, you will have to struggle a lot and invest days and hours from your busy schedule. But, eventually you will see the improvement. Ultimately it will make a great difference as you will become more productive.

So, How to recognize Good Code?

The answer is quite simple! Take a look at the following picture:

It means you can get a sense of your code quality as soon as your co developers or, colleagues start to review/use your codes. Sometimes going through your old code base might have the similar effect. Don’t get frustrated after finding out you don’t even understand a thing about the purpose of your code or, why you have wrote it such a way! This type of frustration is quite common among the developers and you are not alone! Better worry if you don’t find any improvement when you review a six month old code again. If such thing happens then there should be two cases either you didn’t improve a single bit or, you are already a legendary programmer.

Okay! Lets get back to the original question ‘how to recognize good code?’ Good code will have the following properties:

  • Elegant and Carefully Written Code – Good Code will be fascinating to read. It will read as if it is crafted like a beautiful novel. It will make you feel the pampers and cares that someone put on it.
  • Focused Coding – This is also important for Good coding practice. Each and every part of a good code such as functions, classes or, modules etc will be focused on a single specific goal, it will accomplish it gracefully!
  • Test – A good code will always bear some good test codes with it that run and check vital parts of that particular code!
  • No Repetition – The code will have no duplication! It will be based on the DRY principle i.e. Don’t repeat yourself.
  • Simple & Optimal – The code will be minimal. It will do exactly what it needs to do in the most optimal way no more no less!
  • Less or No Comments– Wise Programmers say Good code doesn’t require any comments! When you look at good code to find out how do they do a particular thing it will seems like they did it in the most obvious way!

How to write ‘Good Code’?

Now that we know the properties of Good code, we will jump write into the introduction of Good Coding practices. To start writing good codes we will have to build a habit of doing the following:

Writing Meaningful Variable Names

The name of the variable should tell what it supposed to do. The name should be short but explicit. For example, checkout the following code snippet:

s = 60000
m = 12
y = s * m 

Now take a look at the following example:

salary = 60000
month = 12
yearly_income = salary * month 

which one is more readable? If you carefully analyze both codes, both are somewhat identical in structure even the operators used in both codes are same! Only difference is the name of the variables। Now, lets look at another variation of the first code:

s = 60000 // Salary of the user
m = 12 // number of months
y = s * m  // calculated yearly income

This variation is better than the initial iteration. But, the problem is still same! Lets say, you are using the same variable again after somewhere say 299 number lines below. The reader of the code will have to scroll up to check what these variables s, m and y do! Either they will have to memorize these variables with the context or, you will have to write another comment to make it clear for your reader. You can utilize this idea to improve your coding. When coding if you find a situation where you have to write a comment for your variable pause for some moments and brain storm and refactor your variable name with a better one that don’t require any comments! Trust me it will save you and your fellow readers hours!

Function Name – Most important property of function is to do one thing and do it well! So, the function name must have a verb accompanied with a noun. Example:  delete_user(), make_payment() etc.

Class Name – Unlike function names class names should be noun, instead of verb. Use of proper noun is better than any other nouns. Example: AbstractUser But, it is better to avoid generic names such as – Manager, Info etc.

Beware of the naming inconsistency! Inconsistent naming is worse than anything else! Lets say you are designing an API. And, you are using some common words such as: create, update, delete etc. in some of parts. Again, in some other parts you are using words add, modify, remove in the same api. Then the users of your API will go nuts as they will have to go through the api doc over and over just to find the appropriate names i.e. whether to use create, or add or … So, just stick with one common word throughout the whole code base.

More about Functions

Before starting to write a function, Keep in mind that function needs to be small and tidy. It is applicable for all the inner loops or if else blocks within the function। It could contain another function call but, bottom line it need not exceed a few line. Another thing is function should do one thing and do it well! If you see that, your function is multi tasking say using more than 3 arguments Then you should immediately try to make it more concise or split to multiple small functions!

You should take this article with a pinch of salt! The most important thing about good coding practices is to be consistent so that the reader of your code can understand what your code do. Also, There are tons of other ways to improve your coding skills with good programming practices. But, that is the topic of another day!
Stay tuned…

Author:

Wasi Mohammed Abdullah

Thinker, Day Dreamer, Python Enthusiast, Javascript Admirer,
An Introvert with Exception!

CEO, Founder 
Dreamcatcher IT
twitter: twitter.com/wasi0013
facebook: fb.me/WasiMohammedAbdullah

কিভাবে পাইথনের বেসিকস শিখবো?

বেসিক থেকে ইন্টারমিডিয়েট লেভেলের পাইথন প্রোগ্রামার হিসেবে নিজেকে গড়ে তোলা

শুরুতেই বলে রাখি, কোন প্রোগ্রামিং ল্যাঙ্গুয়েজ আয়ত্ত করা সোজা কথা না। কারণ, আমি নিশ্চিতভাবেই বলতে পারি, প্রোগ্রামিং এর বিভিন্ন নতুন কনসেপ্ট গুলো বুঝে আত্মস্থ করা এবং সেটাকে কাজে লাগানো অনেক কঠিন, এটাই স্বাভাবিক তা না হলে আপনি অবশ্যই গিফটেড ;)। যদি সি এস ই বা কম্পিউটার সায়েন্স রিলেটেড সাবজেক্ট ব্যাকগ্রাউন্ড না থাকে তাহলে তো কথাই নাই শেখার পথটুকু আরো দুর্গম/কঠিন বৈকি। কিন্তু তবুও,

যেহেতু আপনি পাইথন সম্পর্কিত এই আর্টিকেল পড়ছেন সেহেতু, ধরে নিচ্ছি পাইথন শিখতে চাওয়ার আগ্রহ বা কৌতূহল আপনার আছে, আর সে কৌতূহলের  জন্যেই অভিবাদন জানাচ্ছি!

পাইথন প্রোগ্রামিং জগতে আপনাকে স্বাগতম!

পাইথন নিঃসন্দেহে অসাধারণ একটি প্রোগ্রামিং ল্যাঙ্গুয়েজ। শিখতেও যেমন মজা তেমন কাজ করেও আরাম। আমার অত্যন্ত প্রিয় এই প্রোগ্রামিং ল্যাঙ্গুয়েজ কর্মক্ষেত্রেও আমার প্রাইমারী ল্যাঙ্গুয়েজ! 🙂 পাইথন সারাবিশ্বের অন্যতম জনপ্রিয় এবং বেস্ট পেইড প্রোগ্রামিং ল্যাঙ্গুয়েজ

পাইথন শিখতে আগ্রহী কিন্তু কিভাবে শুরু করবো? 

আর্টিকেল

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

যদি ইংরেজীতে সাছন্দ্য বোধ করেন তবে, মিডিয়ামে প্রকাশিত এই আর্টিকেলটি আপনার জন্যে রিকমেন্ডেডঃ

পি ডি এফ/অনলাইন বুকস

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

  • Automate the Boring Stuff with Python: Practical Programming for Total Beginners
    এই বইটি আমার খুবই ভালো লাগে। কারণ, বইয়ের উদাহরণগুলো প্রজেক্ট এর মতোই! ফলে, একটা একটা স্টেপ বা, প্রজেেেক্ট শেষ করেই প্রাপ্তির স্বাদ পাওয়া যায়। যেমন, স্ক্রিপ্ট এর মাধ্যমে বিভিন্ন ওয়েবসাইট ভিজিট করা ও ওয়েবসাইট এর বিভিন্ন এলেমেন্ট এর সাথে ইন্টারেক্ট করা ইত্যাদি ।
  • Fluent Python
    এই বইটির বিশেষত্ব হলো পাইথনের স্পেশাল ফিচার গুলো কে খুব ভালোভাবেই কভার করেছে। পাইথনিক ভাবে কোড লেখার উপরে গুরুত্ব দেয়ার কারণে বইটি আরও আকর্ষণীয় হয়ে উঠেছে। ফলে, আপনার যদি অন্য প্রোগ্রামিং ল্যাঙ্গুয়েজ থেকে শেখা প্যাটার্ন গুলো ভুলে গিয়ে সুন্দর পাইথনিক কোড লিখার নিয়মাবলী জানতে পারবেন।
  • Python Cookbook
    এই বইটা রেসাইপে ভরপুর। কি নেই এই বইয়ে? প্রজেক্ট বেইজড এই বইয়ে সকল মৌলিক বিষয়গুলোর সাথে সাথে, সচরাচর করা কাজগুলো যেমন ডাটা প্রসেসিং বা নেটওয়ার্ক প্রোগ্রামিং সহ নানাবিদ টপিকসে আলোচনা করা হয়েছে। এডভান্সড লেভেলের টপিক যেমন মেটা প্রোগ্রামিং ও কভার করার কারণে বলা চলে, আগের বইগুলো থেকে এটা একটু এডভান্সড বৈকি। তবে নিঃসন্দেহে বিগিনার জন্যে অনেক কিছুই শেখার আছে এই বইয়ে!
  • Pro Python
    আরেকটা এডভান্সড বই। পাইথনের বেস্ট প্র্যাক্টিস জানার জন্যে এই বইয়ের বিকল্প আরেকটি বই খুঁজে পাওয়া দুস্কর। আপনার পাইথন স্কিলকে প্রফেশনাল লেভেলে নিতে চাইলে, বইটি পড়ে ফেলুুুন। 

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

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

এছাড়াও স্মার্ট ফোনে পি ডি এফ ডাউনলোড করে রাখলে সেটা, বিভিন্ন অবসরে কিংবা ট্রাফিক জ্যামে বই পড়তে কাজে লাগে! 
 

চর্চা 

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

বিশেষ করে শুরুর দিকে এটা ভালো কাজে লাগবে। তাছাড়া দেখা যাবে, কোড রান করতে গিয়ে অনেক প্রব্লেম এর সম্মুখীন হচ্ছেন, সেগুলো সমাধান করতে গিয়ে নতুন অনেক কিছুই জানা হবে।   

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

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

Author:

Wasi Mohammed Abdullah

Thinker, Day Dreamer, Python Enthusiast, Javascript Admirer,
An Introvert with Exception!

CEO, Founder 
Dreamcatcher IT
twitter: twitter.com/wasi0013
facebook: fb.me/WasiMohammedAbdullah

Classic 2048 - 4x4 Board Game

Classic 2048 Game Tips & Tricks

ক্ল্যাসিক ২০৪৮ গেইম টিপস ও ট্রিকস 

আজকে আমি ২০৪৮ গেইম এর এন্ড্রয়েড সংস্করণ এর প্রথম ভার্সন রিলিজ দিয়েছি নাম – CLASSIC 2048

Image result for get it on google play

২০৪৮ গেইম – মূলতঃ  ৪ x ৪ বোর্ডের একটি গেইম যেটা জোড় সংখ্যার যোগফলের উপর ভিত্তি করে তৈরি করা হয়েছে। খেলার শুরুতে টাইলসের নাম্বার থাকে ২ পরবর্তীতে একই সংখ্যার টাইলস গুলো কে একত্র করে করে বড় বেজোড় সংখ্যা গুলো তৈরি করা যায়। তবে একত্র করার রুল কিন্তু একটাই শুধুমাত্র সেইম নাম্বার এর টাইলসকেই একত্র করা যাবে। এরকম একত্র করে করে ২০৪৮ সংখ্যার একটি টাইলস বানাতে পারলেই কেল্লাফতে!

তবে, আমার রিলিজ করা গেইমটি ২০৪৮ টাইলস এর পরেও খেলা চালিয়ে যাওয়ার ব্যবস্থা রেখেছি। আর মুভ ফিরিয়ে নেয়ার কোন ব্যবস্থা রাখা হচ্ছে না। যাতে করে স্কোরের স্বচ্ছতা বজায় থাকে। ২০৪৮ গেইম এর হিস্টোরি কিন্তু বেশীদিনের না। ইতালির একজন গেইম ডেভেলপার এইতো সেদিন( ২০১৪ সালের দিকে) এই গেইমটি আবিষ্কার করেন। তিনি জাভাস্ক্রিপট আর সি এস এস দিয়েই গেইম এর ডেমো বানিয়ে সবাই কে তাক লাগিয়ে দেন!

গেইমটির এডিক্টিভ বৈশিষ্ট্যের কারণই হলো সহজ গেইম প্লে। সিমপ্লি সোয়াইপ আপ, ডাউন, লেফট ও রাইট করে করেই গেইমে মোটামুটি অনেক দূর যাওয়া যায়। গেইমটিতে হাই স্কোর করার জন্যে কিছু টিপস এবং ট্রিকস আপনাদের সামনে এই আর্টিকেলে তুলে ধরবো।

কর্নার গেইম!

Screenshot from 2018-11-11 01-54-44যে কোন একটি কর্নারকে টার্গেট করে, ওই কর্নারে বোর্ডের সবচেয়ে বড় টাইলসকে মুভ করে এই স্ট্রাটেজি কাজে লাগাতে পারেন। আমি সাধারণত নিচের যে কোন একটা কর্নারকে টার্গেট করে এর পরে ছোট থেকে বড় ক্রমানুসারে সাজানোর চেষ্টা করি। এইটা খুবই কাজে দেয় তবে, একটা জিনিস মাথায় রাখতে হবে তা হলো কোন ক্রমেই যাতে সবচেয়ে বড় সংখ্যার টাইলসটি যাতে কর্নার থেকে সরে না যায়। গেলে মহা বিপদ এবং বেশীর ভাগ ক্ষেত্রে রিকোভার করা আর পসিবল হয় না

তাই, ‘সবসময় চেষ্টা করতে হবে একদম কর্নারের টাইলস এ সবচেয়ে বড় সংখ্যাটি যেন স্থির থাকে।’ 

প্রটেক্ট কর্নার

আগেই যেটা বললাম শুধু মাত্র এদিক ঐদিকে সোয়াইপ করে আপনি হয়ত হাইয়েস্ট ২৫৬ রিচ করতে পারবেন। কিন্তু ২০৪৮ রিচ করা অনেক কঠিন হবে। কর্নার টাইলসের হাইয়েস্ট ভ্যালু এর টাইলস কে প্রটেক্ট করার আরেকটা টেকনিক হলো এর আশে পাশের টাইলস গুলোকে ও বড় করে তোলা। তখন, ওই কর্নার পিসের মুভ করার পসিবলিটি কমে যায়।

তাড়াহুড়ো না করা

অনেক সময় আমরা অবচেতন মনেই অনেক তাড়াহুড়ো করা শুরু করে দিই। এই গেইমের সোয়াইপ জেস্টার তাড়াহুড়ো করার প্রবণতা কে আরও বাড়িয়ে দেয়। বেশীর ভাগ ক্ষেত্রেই তাড়াহুড়োর কারণে অনেক ভালো ফরমেশন ও মুহূর্তে নষ্ট হয়ে যেতে পারে। তাই, ঠাণ্ডা মাথায় ধীরে সুস্থে খেলাটাই বুদ্ধিমত্তার পরিচায়ক।

শেষ রো ফিলাপ করে রাখা

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

বড় নাম্বার কে তাড়া না করা

সবসময় বড় নাম্বার কে তাড়া করে বেশিদূর জাওয়া পসিবল না। আপনাকে অবশ্যই সামগ্রিকভাবে চিন্তা করতে হবে। একটু প্ল্যানিং করে খেললেই খুব সহজেই ১০২৪ + স্কোর করে এমনকি ২০৪৮ রিচ করে ফেলতে পারেন। তাই, বড় নাম্বার কে তাড়া না করে সুন্দর ভাবে গেইম প্ল্যান সেটআপ করে নিবেন।

এক সাথে অনেক গুলো টাইলস মিলানো

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

এছাড়াও, আপনার যদি কোন টিপস বা ট্রিকস থাকে তাহলে কমেন্টে জানাতে পারেন। 😉

সবশেষে, গেইম খেলার আমন্ত্রণ রইলো। নিচের লিংক থেকে গেইমটি আপনার এন্ড্রয়েড ডিভাইসে ইন্সটল করে ফিডব্যাক জানাতে ভুলবেন না।

https://play.google.com/store/apps/details?id=com.wasi0013.classic2048

 

Classic 2048 – Game Play (Winning Strategy)

How to run Multiple Terminal Sessions on Linux VPS Server

maxresdefault

In this article, I will introduce you with one of the handy tool for your vps servers. It is an extremely useful app for maintaining multiple terminal sessions through just one window! This Command Line Utility is called Screen.

You may think of it as a Manager who manages different terminal sessions for you using shell. You don’t even need a X Server to run it!

How to Install Screen?

You can install it by typing the following commands:

sudo apt update 
sudo apt install screen

The above command should work on distros like Ubuntu 16.04 LTS, Xubuntu or, debian etc. If you have a different distro find appropriate installation information for it.

Common Commands of Screen

Try running the following command after successful installation:

screen

The output of the above command will be oddly surprising! You will see some texts about screen and you will be in terminal again!

Actually, the screen is running now! you can verify it by pressing `​ctrl+a ?` the output will be:

                       Screen key bindings, page 1 of 2.

                       Command key:  ^A   Literal ^A:  a

  break       ^B b         license     ,            removebuf   =         
  clear       C            lockscreen  ^X x         reset       Z         
  colon       :            log         H            screen      ^C c      
  copy        ^[ [         login       L            select      '         
  detach      ^D d         meta        a            silence     _         
  digraph     ^V           monitor     M            split       S         
  displays    *            next        ^@ ^N sp n   suspend     ^Z z      
  dumptermcap .            number      N            time        ^T t      
  fit         F            only        Q            title       A         
  flow        ^F f         other       ^A           vbell       ^G        
  focus       ^I           pow_break   B            version     v         
  hardcopy    h            pow_detach  D            width       W         
  help        ?            prev        ^H ^P p ^?   windows     ^W w      
  history     { }          quit        \            wrap        ^R r      
  info        i            readbuf     <            writebuf    >         
  kill        K k          redisplay   ^L l         xoff        ^S s      
  lastmsg     ^M m         remove      X            xon         ^Q q      

                  [Press Space for next page; Return to end.]


well, ctrl+a is a shortcut for different screen commands and the above output lists all of them! Feel free to explore all of them, as they will be quite handy!

I really liked this digital ocean’s tutorial of Screen commands. Read it if you want to learn the basics of screen

Helpful Resources:

Author:

Wasi Mohammed Abdullah

Thinker, Day Dreamer, Python Enthusiast, Javascript Admirer,
An Introvert with Exception!

CEO, Founder 
Dreamcatcher IT
twitter: twitter.com/wasi0013
facebook: fb.me/WasiMohammedAbdullah

How to create a .torrent file to share files or directories with a self hosted Private Tracker in Linux

What is Torrent File?

Torrent File contains metadata of file system and directories that you want to distribute using the BitTorrent File Distribution System. Along with the meta data it also contains list of trackers. The Network location of trackers are noted in the tracker list.

According to wikipedia:

BitTorrent tracker is a special type of server, one that assists in the communication between peers using the BitTorrent protocol. In peer-to-peer file sharing, a software client on an end-user PC requests a file, and portions of the requested file residing on peer machines are sent to the client, and then reassembled into a full copy of the requested file. The “tracker” server keeps track of where file copies reside on peer machines, which ones are available at time of the client request, and helps coordinate efficient transmission and reassembly of the copied file. Clients that have already begun downloading a file communicate with the tracker periodically to negotiate faster file transfer with new peers, and provide network performance statistics; however, after the initial peer-to-peer file download is started, peer-to-peer communication can continue without the connection to a tracker.

Alright, now that we know about torrent file and trackers lets just jump right into it 🙂

You will need:

  • A Computer to use it as a server. A LINUX based VPS Server is recommended though.  You can get one from Linode. It is quite cheap and very stable (around 5$ per month)
    Use my referral to get free credits:
    https://www.linode.com/?r=00453cca3ebd20582030ca874fbdd626a88b66cd
  • For this tutorial I’m gonna use Ubuntu 16.04 LTS, but you can choose any debian based distro and it should work.
  • Idea of Basic Linux commands & file structure

Setting up a VPS on Linode

You can use the Linode Promo code: DOCS10 to get 10$ credit on a new account! Linode’s documentation is great! It will get you started in minutes. Once you complete this return to this article.
Note: It is always a good idea to secure your vps server as much as possible. So, use a strong password for the root user and, optionally you can install packages like fail2ban, ufw etc.  You can also follow this instructions if you like.

Install Dependencies

Once, you are done with initial vps setup. Follow the following instructions to install the necessary packages for creating our own torrent tracker. Here we will be using bittornado & ctorrent for creating tracker and torrent file respectively. We will also use screen command to run multiple terminal sessions. To install all of them you can run the following command:

apt install bittornado ctorrent screen

Start the tracker

Now that, we have screen installed, we can create a new screen terminal session by running the command:

screen

You will be redirected to a new terminal prompt. You can check out the various screen commands by pressing ctrl+A ? (press ‘enter’ or, hit ‘return’ to exit the help menu)

In the new screen session, you can start your tracker by running the following commands:

mkdir ~/.bttrack
bttrack --port 6969 --dfile ~/.bttrack/dstate --logfile ~/.bttrack/tracker.log --nat_check 0 --scrape_allowed full

The first command will create a new hidden directory in your home folder called ​bttrack and the second command will start your own private torrent tracker!

Detach the screen session by pressing ctrl+A d

It will switch you back to the terminal and keep the tracker running in background screen terminal session which you can resume later if you wish.

Upload your File/Directory to VPS

You will have to upload the file/directory that you wish to share using .torrent file on your vps, In order to seed it from your vps using your private tracker. There are numerous ways to upload files on vps, I prefer ssh though.

If you have enabled ssh login to your server from your local computer. You can share your file with a single scp command from your local computer:

scp -r <source_file_path_of_your_local_directory>  <user>@<ip_address>:<destination_file_path>

example from my local computer I typed:

scp -r  ~/Desktop/MyFile/torrent_this.mp4 root@127.000.000.001:/MyFile/torrent_this.mp4

Here I’m uploading my ​ torrent_this.mp4 file to my vps using ssh. Note that, my username is root and ip address is 127.000.00.001 you will have to put your  username & ip address instead of those.

Creating .torrent file using ctorrent

So far, we have enabled our tracker and uploaded the file we wished to share using torrent. Now, lets make the .torrent file using ctorrent, the command is quite simple!

ctorrent -t -u "http://YOUR_SERVER_IP:6969/announce" -s torrent_file_name.torrent file_or_folder_for_torrent

It will create a .torrent file in the current directory! Voila!

Seed your .torrent file

to seed your .torrent file. Just run the command screen from the torrent file/directory location and run the command:

screen ctorrent torrent_file_name.torrent

It will start to seed your torrent file.  Press ctrl+A d to detach the screen session and keep seeding in background. Now you can distribute your .torrent file.

People will be able to download it and seed it using any torrent client!

 

Python Nested List Comprehension for…in goes from left to right!

The Confusion

Scenario: You were asked to write the equivalent list comprehension of the following code:
for i in range(6):
    for j in range(i):
        j
Before, starting with the above one we try the simplest one:
t = []
for i in range(6):
   t.append(i**2)
We already know the syntax of list comprehension is as follows: expression for expr in sequence1 So, for the above code we write:
 [i**2 for  i in range(6)]
You might have already started to smell the confusion, didn’t you? If not Read on… 🙂 Now, if I ask you to write the list comprehension for the first example code, you might end up with the following:
[ j for j in range(i) for i in range(6)]
when you execute the above code: Surprise, surprise! You will get a  NameError instead!
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'i' is not defined

What went wrong?

The nested fors in the list comprehension are evaluated from left to right. So, the correct list comprehension is:
[j for i in range(6) for j in range(i)]
In  the official documentation they explained it thoroughly!
List comprehensions have the form:
 [ expression for expr in sequence1
              for expr2 in sequence2 ...
              for exprN in sequenceN
              if condition ]
The for…in clauses contain the sequences to be iterated over. The sequences do not have to be the same length, because they are not iterated over in parallel, but from left to right; this is explained more clearly in the following paragraphs. The elements of the generated list will be the successive values of expression. The final if clause is optional; if present, expression is only evaluated and added to the result if condition is true. To make the semantics very clear, a list comprehension is equivalent to the following Python code:
for expr1 in sequence1:
    for expr2 in sequence2:
    ...
        for exprN in sequenceN:
             if (condition):
                  # Append the value of
                  # the expression to the
                  # resulting list.
  credit: https://stackoverflow.com/questions/52565893/nameerror-in-python-nested-for-loops-of-list-comprehension

Hello World! – A Brief History of Time

A few days ago, I answered a question on Quora. I thought it worth sharing! Let me walk you through those first few years of my programming career! Its been a lot of fun!

When did I Start Programming?

I started coding from 2012. It was the year when I enrolled for my Bachelors on Premier University Chittagong My first Computer was a Pentium III desktop with a 15 inch CRT monitor, 80 GB HD and, 512 MB Ram. I used to call it Ancient Karl. I have upgraded it with a brand new mother board, Dual Core CPU, 160 GB HD & 1 GB ram later!

What was My First Programming Language?

I Started with C & a few week later Python. After 1.5 hrs of wrestle, I successfully compiled my first C Program. I didn’t pay attention how things work and jumped right into coding (the way we play video games without reading instruction 😛 ) I was also way too noob for googling solutions for programming problems back then! Hence, I was going through folders of Turbo C to find the proper header (i.e stdio.h). After trying all headers starting with S, I finally managed to run my Hello World Program!

My First Interaction with Linux

There was a guy in my university who used to boot on a different OS from a USB stick on those University desktops! It was kinda cool. Although, I was a introvert so couldn’t ask him about it. Later we became friend and, he told me all about it, It was Ubuntu.  He was very fond of Python.

When I installed Ubuntu 12.04 LTS for the first time on my computer. I found python IDLE so amazing! I fall in love with python at first sight. Linux became my primary OS and, python my primary Language ever since.

Competitive Programming

I was introduced with SPOJ at February 14, 2014. I used to like it a lot because, it was the only platform that I knew that time that supports python based problem solving. I started to solve acm programming problems using C++, C & Python.

C++ & C were tough nuts to crack. Yet, used to solve 1 or 2 programs a day. After that, explored Javascript basics along with Java. I quit Java after writing my first applet (Hello World)

Various Projects & Programming Languages that I explored

I switched to C# for developing desktop application. It was cumbersome for me to make desktop app connected via online db. Hence, focused on web programming using PHP (with MYSQL). I didn’t like PHP Syntax was searching for alternatives from Day 1, found a brand new web framework Meteor (it was 0.7 or 0.8) that time. Exploring it learnt a bit more of JS. Never gave up practicing python in the mean time, as it was part of my daily life. Python was so easy and, always resonated my inner thoughts quite well. I used to use python codes more like algorithm/ building blocks. Wrote my first Meteor app Also, met a creepy Language named brainfuck that time which had only 8 commands! Yet, I found it so fascinating wrote a tutorial about it in my native language. I believe brainfuck changed my perspective and developed a new sense of coding. I felt that my thought process has changed!

Instead of solving problems, I started to look for multiple solutions to one problem

Enjoyed matrix manipulation on MATLAB, but found numpy (Python Module) more convenient for me. For text processing I used to be a fan of AWK & SED along with grep. Android devices caught my attention when I enrolled for a National 500 apps Application Developer Trainer Program!

Learnt many new things of Java. Used to code on eclipse that time. Wrote some android apps and, got selected as ICT Certified Trainer among the trainees. Wrote One of my brain teaser app. Meanwhile, started to explore phaser.js another Javascript Framework. Made Flappy Bird clone using that framework. And, another game. I was exploring Django (Python Framework) that time. Functional programming seemed interesting as well, hence ended up learning clisp basics. I started to write more and more python codes and, small django apps.

Another favorite pet project of mine is my Phaser-Piano. You can try it online!

I have played some musics on the app and uploaded them on sound cloud just to have some fun with it!

Feel free to check the full playlist here!


Author:

Wasi Mohammed Abdullah

Thinker, Day Dreamer, Python Enthusiast, Javascript Admirer,
An Introvert with Exception!

CEO, Founder 
Dreamcatcher IT
twitter: twitter.com/wasi0013
facebook: fb.me/WasiMohammedAbdullah