কম্পিউটার

রুবি দিয়ে আপনার কমান্ড-লাইন-ফু লেভেল করুন

কমান্ড লাইনটি সত্যিই আয়ত্ত করতে আপনাকে কয়েক ডজন — শত শত না হলেও — ছোট ইউটিলিটি প্রোগ্রামগুলি আয়ত্ত করতে হবে। এই প্রতিটি জিনিস সামান্য ভিন্নভাবে করে. এটা বেশ অপ্রতিরোধ্য হতে পারে.

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

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

কমান্ড লাইন থেকে রুবি ব্যবহার করা

আমি নিশ্চিত আপনি জানেন যে আপনি কমান্ড লাইন থেকে রুবি প্রোগ্রাম চালাতে পারেন:

$ ruby myprogram.rb

কিন্তু আপনি কি জানেন যে রুবি দ্বারা কার্যকর করার জন্য আপনি কোডে পাইপ করতে পারেন?

$ echo "puts 2+2" | ruby
4

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

$ ruby -e 'puts 2+2'
4

আরে নতুনরা

উপরের উদাহরণগুলি কি বিভ্রান্তিকর? এটি হতে পারে কারণ আপনি পাইপ এবং পুনঃনির্দেশের সাথে পরিচিত নন। একটি ভাল ভূমিকা জন্য এই পোস্ট দেখুন. আমরা নিচে অনেক পাইপ ব্যবহার করা চলুন.

ইনপুট দিয়ে কাজ করা

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

ইনপুট পাওয়ার জন্য আমাদের কাছে দুটি ভাল বিকল্প আছে:কমান্ড-লাইন আর্গুমেন্ট এবং STDIN। আসুন তাদের প্রত্যেকের দিকে নজর দেওয়া যাক।

কমান্ড-লাইন আর্গুমেন্ট

আপনি আপনার স্ক্রিপ্টে যত খুশি কমান্ড-লাইন আর্গুমেন্ট পাঠাতে পারেন। অন্য সব কিছুর পরে তাদের রাখুন:

$ ruby -e '<your code here>' arg1 arg2 arg3 etc

এই আর্গুমেন্টগুলি ARGV এর ভিতরে সংরক্ষিত আছে অ্যারে নীচের উদাহরণে আমি পুরো অ্যারেটি ডাম্প করছি যাতে আপনি এতে কী আছে তা দেখতে পারেন।

$ ruby -e 'puts ARGV.inspect' apples bananas pears oranges
["apples", "bananas", "pears", "oranges"]

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

বোবা উদাহরণ

এক সেকেন্ডের জন্য কল্পনা করুন যে আমি অতি অহংকারী। আমার কাছে সবচেয়ে গুরুত্বপূর্ণ বিষয় হল ওয়েবে আমার নাম কতবার উল্লেখ করা হয়েছে তা জানা। আমরা যে কৌশলগুলি দেখেছি তা ব্যবহার করে যে কোনও ওয়েবপৃষ্ঠার জন্য এটি গণনা করতে আমি সহজেই একটি ওয়ান লাইনার লিখতে পারি৷

$ ruby -e "require 'open-uri'; puts open(ARGV.first).read.scan(/starr/i).count" <url here>

STDIN

কমান্ড-লাইন আর্গুমেন্টগুলি দুর্দান্ত, তবে সেগুলি শুধুমাত্র সংক্ষিপ্ত মানগুলির জন্য ভাল। আপনি এগুলিকে ব্যবহার করতে চাইবেন না - বলুন - মবি ডিকের অসংযত পাঠ্য ইনপুট করুন৷ এর জন্য আমরা STDIN ব্যবহার করতে চাই।

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

এখানে আমি কি বলতে চাচ্ছি. নীচের উদাহরণে আমরা রুবিতে কিছু পাঠ্য পাইপ করছি। আমাদের রুবি স্ক্রিপ্ট এটি STDIN থেকে পড়ছে এবং এটি স্ক্রিনে প্রিন্ট করছে।

echo "bananas!" | ruby -e "puts STDIN.read"
bananas!

cat ব্যবহার করে আমরা সহজেই বেশি পরিমাণ ডেটা ইনপুট করতে পারি . নিচের উদাহরণটি first ব্যবহার করে পাঠ্যের প্রথম কয়েকটি লাইন ধরতে যে কোনো ফাইলে উপলব্ধ পদ্ধতি:

cat moby.txt | ruby -e "puts STDIN.first(3)"
Call me Ishmael. Some years ago--never mind how long precisely--having
little or no money in my purse, and nothing particular to interest me on
shore, I thought I would sail about a little and see the watery part of

বোবা উদাহরণ

এখন যেহেতু আমরা জানি কিভাবে STDIN ব্যবহার করতে হয়, আসুন উপরের থেকে বোবা উদাহরণটি আবার লিখি। ওয়েবপেজ আনতে Ruby ব্যবহার করার পরিবর্তে, আমরা curl ব্যবহার করতে পারি এবং প্যাটার্ন ম্যাচিংয়ের জন্য শুধুমাত্র রুবি ব্যবহার করুন।

curl <MY URL> | ruby -e "puts STDIN.read.scan(/starr/i).size"

সিনট্যাকটিক চিনির সাথে STDIN!

আপনি যখন STDIN এর সাথে কাজ করছেন, তখন ইনপুটের প্রতিটি লাইন লুপ করা খুবই সাধারণ ব্যাপার। কল্পনা করুন যে আমি একটি ডিরেক্টরিতে প্রতিটি ফাইলের জন্য ফাইল এক্সটেনশন পেতে চাই। সাধারণ STDIN লুপ ব্যবহার করে আমি কীভাবে এটি করতে পারি তা এখানে:

ls | ruby -e 'STDIN.each_line { |l| puts l.split(".").last }'
rb
rb
csv

যেহেতু STDIN লুপ খুব সাধারণ, রুবি একটি সংক্ষিপ্ত বিবরণ প্রদান করে। যদি আমরা -n দিয়ে আমাদের স্ক্রিপ্ট চালাই পতাকা, রুবি স্বয়ংক্রিয়ভাবে STDIN প্রতিটি লাইনের উপর লুপ করবে। বর্তমান লাইনটি গ্লোবাল ভেরিয়েবল $_ এ রয়েছে .

তাই আমরা উপরের উদাহরণটি এভাবে আবার লিখতে পারি:

ls | ruby -n -e 'puts $_.split(".").last'

আপনি শর্টহ্যান্ড ব্যবহার করতে চান কিনা তা আপনার উপর নির্ভর করে। যদিও এটি স্পষ্টভাবে বোঝায় যে আপনাকে কম কোড লিখতে হবে, এর মানে হল যে আপনাকে আরও নির্বিচারে তথ্য মনে রাখতে হবে যেমন -n এবং $_ .

আউটপুট দিয়ে কাজ করা

এই ধরনের পরিস্থিতিতে আপনি সাধারণত আপনার আউটপুট STDOUT এ লিখতে চান। এটি আপনাকে সবচেয়ে নমনীয়তা দেবে কারণ এটি আপনাকে অন্যান্য প্রোগ্রামে আউটপুট পাইপ করতে বা প্রয়োজনে ডিস্কে পুনঃনির্দেশিত করতে দেবে৷

ভাল খবর হল যে আপনি একই প্রিন্ট কমান্ডগুলি ব্যবহার করতে পারেন যা আপনি সম্ভবত খুব পরিচিত। যদিও সচেতন হতে হবে তা হল puts একটি নতুন লাইন যোগ করে, যা আপনি যা চান তা হতে পারে বা নাও হতে পারে।

puts "hello world" # sends "hello world\n" to STDOUT
print "hello world" # doesn't add a newline"

এটি সব একসাথে রাখা

হানিব্যাজার মার্কিন যুক্তরাষ্ট্রের ওয়াশিংটন রাজ্যে অবস্থিত। এর অর্থ হল ওয়াশিংটনে বসবাসকারী প্রতিটি অর্থপ্রদানকারী গ্রাহকের জন্য বিক্রয় কর প্রদানের বিশেষাধিকার আমাদের রয়েছে৷

আমি এটিকে কিছুটা সরলীকৃত করেছি, কিন্তু আমাদের কাছে মূলত বছরের প্রতিটি লেনদেনের সাথে একটি CSV ফাইল রয়েছে। এটা এই মত কিছু দেখায়:

1/1/2015,100.00,WA
1/1/2015,50.00,NY

তাই ওয়াশিংটনে সমস্ত লেনদেনের জন্য দ্রুত অঙ্ক পেতে আমি এই মত একটি ওয়ান-লাইনার ব্যবহার করতে পারি:

$ cat cc.csv | ruby -e 'puts STDIN.inject(0) { |sum, x| date, amount, state = x.split(","); state.strip == "WA" ? sum + amount.to_f : sum  }'

মনে রাখবেন যে এটি CSV ফাইল পার্স করার একটি ভয়ঙ্করভাবে ঢালু উপায়। আমি কখনই এই কোডটি বন্যের মধ্যে পাঠাব না। কিন্তু একমুখী সমস্যা সমাধানের জন্য ছোট ছোট প্রোগ্রাম লেখার একটি আনন্দ হল যে আপনি প্রান্তের সমস্ত ক্ষেত্রে উপেক্ষা করতে পারেন। আমি এখানে এটাই করতে যাচ্ছি।


  1. মৌলিক ওওপি নীতিগুলির সাথে আপনার রুবি কোডকে কীভাবে নাটকীয়ভাবে উন্নত করবেন

  2. TCmalloc-এর সাথে রুবির মেমরি বরাদ্দের প্রোফাইলিং

  3. রুবি দিয়ে কীভাবে পার্সার তৈরি করবেন

  4. আইডি ওয়াচডগ দিয়ে আপনার পরিচয় রক্ষা করুন