<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tuts by Mayeenul Islam</title>
	<atom:link href="https://mayeenulislam.github.io/tuts/feed/" rel="self" type="application/rss+xml" />
	<link>https://mayeenulislam.github.io/tuts/</link>
	<description>Technology Tutorials by Mayeenul Islam</description>
	<lastBuildDate>Sat, 21 Jan 2023 15:24:42 +0000</lastBuildDate>
	<language>bn-BD</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.1.1</generator>

<image>
	<url>https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/08/cropped-tuts-nano-32x32.png</url>
	<title>Tuts by Mayeenul Islam</title>
	<link>https://mayeenulislam.github.io/tuts/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>HTML abbr ট্যাগ, CSS দিয়ে করুন দৃষ্টিনন্দন</title>
		<link>https://mayeenulislam.github.io/tuts/css-tooltip/</link>
		
		<dc:creator><![CDATA[মঈনুল ইসলাম]]></dc:creator>
		<pubDate>Fri, 20 Jan 2023 06:20:17 +0000</pubDate>
				<category><![CDATA[ওয়েব ডিযাইন টিউটোরিয়াল]]></category>
		<category><![CDATA[জ্ঞান-স্তরভিত্তিক টিউটোরিয়াল]]></category>
		<category><![CDATA[মাধ্যমিক স্তরের টিউটোরিয়াল]]></category>
		<category><![CDATA[সিএসএস টিউটোরিয়াল]]></category>
		<guid isPermaLink="false">http://nanodesigns.wordpress.com/?p=210</guid>

					<description><![CDATA[<p> [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/css-tooltip/">HTML abbr ট্যাগ, CSS দিয়ে করুন দৃষ্টিনন্দন</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="aligncenter"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2012/06/tool-tip-nanodesigns.jpg"><img decoding="async" width="574" height="158" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2012/06/tool-tip-nanodesigns.jpg" alt="CSS-tooltip-how-it-works" class="wp-image-213" title="tool-tip-nanodesigns" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2012/06/tool-tip-nanodesigns.jpg 574w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2012/06/tool-tip-nanodesigns-300x83.jpg 300w" sizes="(max-width: 574px) 100vw, 574px" /></a></figure></div>


<p><strong><span lang="BN-BD" style="font-size: 10pt; font-family: 'Siyam Rupali';">জ্ঞানস্তর:</span></strong><span lang="BN-BD" style="font-size: 10pt; font-family: 'Siyam Rupali';"> মাধ্যমিক</span></p>



<p>কোনো একটা লম্বা নামকে সংক্ষিপ্ত করে লেখার দরকার হলো, এজন্য প্রত্যেকটা শব্দের প্রথম অক্ষরগুলো, মানে আদ্যক্ষর নিয়ে, আপনি সেই নামটা তৈরি করলেন, ইংরেজিতে যাকে বলে acronym। যেমন: Bangladesh Agricultural and Rural Development-কে সংক্ষেপে ডাকা হয় BARD বলে; এখানে BARD হলো পুরো নামটার সংক্ষিপ্ত রূপ। ধরা যাক, একটা লেখা লিখছেন, যেখানে বারবার আপনি BARD-ই বলে যাচ্ছেন। কিন্তু একজন পাঠক BARD-এর মানে তো নাও জানতে পারেন। তাই এসব ক্ষেত্রে HTML-এর সহজ একটা কৌশল কাজে লাগানো হয়: <code>&lt;abbr&gt;</code> ট্যাগটি। এর আগে ব্যবহার করা হতো <code>&lt;acronym&gt;</code> ট্যাগটি, যা এখন deprecated বা বাতিল করা হয়েছে।</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/1f6072b6991f5120da7c17f3763454ca">Gist</a>.
</div><figcaption class="wp-element-caption">টুলটিপ দেখানোর জন্য HTML</figcaption></figure>



<p>এই কোডটা ব্যবহার করলে যখনই আপনি GDP কিংবা BARD লেখাটার উপরে মাউস আনবেন, একটু অপেক্ষা করলেই সেখানে একটা বাক্সে দেখাবে BARD-এর মানে, যা আপনি <code>&lt;abbr&gt;</code>-এর title-এ দিয়েছেন। কিন্তু পূর্বনির্ধারিত এই স্টাইলটি অনেকের পছন্দ নাও হতে পারে। সেজন্য নিচের এই CSSটুকু বসিয়ে নিয়ে আপনি আরো দৃষ্টিনন্দন করে নিতে পারেন HTML-এর নিজস্ব টুলটিপকেই। টুলটিপের জন্য অন্য কিছু আবিষ্কার না করে <code>&lt;abbr&gt;</code> ট্যাগ ব্যবহার করাটা Web Accessibility-ও নিশ্চিত করে।</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/1f6072b6991f5120da7c17f3763454ca">Gist</a>.
</div><figcaption class="wp-element-caption">টুলটিপ দেখানোর জন্য CSS</figcaption></figure>



<p>কেমন লাগলো, আর কাজে লাগলো কিনা অবশ্যই জানাতে ভুলবেন না। আর, আরো আরো সিএসএস প্রোপার্টি যোগ করে নতুন নতুন কিছু পরীক্ষা-নিরীক্ষা চালান, একটু opacity প্রয়োগ করে দেখুন… নতুন কিছু বের করতে পারলেও আমাদের সাথে শেয়ার করুন।</p>



<p><strong>&#8211; মঈনুল ইসলাম</strong><br><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f517.png" alt="🔗" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a href="https://mayeenulislam.github.io/" target="_blank" rel="noreferrer noopener">mayeenulislam.github.io</a></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p><span lang="BN-BD" style="font-size: 10pt; line-height: 115%; font-family: 'Siyam Rupali';"><strong>মূলসূত্র:</strong></span> <span lang="BN-BD" style="font-size: 10pt; line-height: 115%; font-family: 'Siyam Rupali';">পোস্টটা লিখতে এর মূল তথ্য গ্রহণ করা হয়েছে </span><span style="font-size: 11pt; line-height: 115%; font-family: 'Calibri', 'sans-serif';"><span lang="BN-BD" style="font-size: 10pt; line-height: 115%; font-family: 'Siyam Rupali';">একটি তৃতীয় পক্ষীয় টিউটোরিয়াল</span></span><span lang="BN-BD" style="font-size: 10pt; line-height: 115%; font-family: 'Siyam Rupali';"> থেকে, যে লিংকটি বর্তমানে লভ্য নয়। তবে সেখানকার কোডগুলো ঝামেলা করে বলে তা সংশোধন ও পরিমার্জন করতে সহায়তা নেয়া হয়েছে সফ্‌টওয়্যার ইঞ্জিনিয়ার অমিত চৌধুরীর। কৃতজ্ঞতা তাই এঁদের প্রতি। মূল লেখাটি অনেক বছর আগে লেখা ছিলো, সেখানকার deprecated কোড সরিয়ে সাম্প্রতিক কোড যোগ করা হয়েছে।</span></p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/css-tooltip/">HTML abbr ট্যাগ, CSS দিয়ে করুন দৃষ্টিনন্দন</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>কিভাবে ফ্রি-তে Let&#8217;s Encrypt ব্যবহার করে SSL Certificate ইস্যু এবং অ্যাক্টিভেট করা যায়</title>
		<link>https://mayeenulislam.github.io/tuts/free-ssl/</link>
					<comments>https://mayeenulislam.github.io/tuts/free-ssl/#respond</comments>
		
		<dc:creator><![CDATA[মঈনুল ইসলাম]]></dc:creator>
		<pubDate>Sat, 23 Mar 2019 06:00:30 +0000</pubDate>
				<category><![CDATA[উচ্চস্তরের টিউটোরিয়াল]]></category>
		<category><![CDATA[ওয়েব ডেভলপমেন্ট টিউটোরিয়াল]]></category>
		<category><![CDATA[জ্ঞান-স্তরভিত্তিক টিউটোরিয়াল]]></category>
		<guid isPermaLink="false">https://mayeenulislam.github.io/tuts/?p=1271</guid>

					<description><![CDATA[<p>কিভাবে Let's Encrypt ব্যবহার করে বিনে পয়সায় ওয়েবসাইটে এসএসএল সার্টিফিকেট ইস্যু এবং অ্যাক্টিভেট করা যায়, এবং HTTP ওয়েবসাইটকে HTTPS-এ বদলে ফেলা যায় তার ধারণা দেয়া হয়েছে।</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/free-ssl/">কিভাবে ফ্রি-তে Let&#8217;s Encrypt ব্যবহার করে SSL Certificate ইস্যু এবং অ্যাক্টিভেট করা যায়</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="has-background" style="background-color:#f9e7b5"><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>থামুন, জেনে নিন</strong><br>এটি একটি পুরোন কৌশল, তবে কার্যকরী। আপনার পক্ষে Certbot দিয়ে SSL Certificate ইস্যু করা সম্ভব হলে, সেটাই সহজতর পদ্ধতি। তবে এখানে Free SSL, Paid SSL ইত্যাদি বিভিন্ন ধারণা নিয়ে বিস্তারিত আলোচনা করা হয়েছে, যা যে-কারো জন্যই কাজে লাগবে।</p>



<p>কিভাবে Let&#8217;s Encrypt ব্যবহার করে বিনে পয়সায় ওয়েবসাইটে এসএসএল সার্টিফিকেট ইস্যু এবং অ্যাক্টিভেট করা যায়, এবং HTTP ওয়েবসাইটকে HTTPS-এ বদলে ফেলা যায় তার ধারণা দেয়া হয়েছে।</p>



<p>মূল ইভেন্টটি টেকনোভিস্তা লিমিটেড-এ ২৪ ফেব্রুয়ারি ২০১৯-এ অনুষ্ঠিত হয়েছিল। পরবর্তীতে সেই বক্তব্যই অডিও আকারে আলাদা করে রেকর্ড করা হয়েছে, যাতে বক্তব্যগুলো ছড়িয়ে দেয়া যায়।</p>



<h3>ভিডিও</h3>



<span id="more-1271"></span>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="কিভাবে ফ্রি-তে Let&#039;s Encrypt ব্যবহার করে SSL Certificate ইস্যু এবং অ্যাক্টিভেট করা যায়" width="720" height="405" src="https://www.youtube.com/embed/bk868eeiN8w?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</div></figure>



<h3>প্রেযেন্টেশন</h3>



<figure class="wp-block-embed is-type-rich is-provider-slideshare wp-block-embed-slideshare"><div class="wp-block-embed__wrapper">
<iframe title="How to Issue and Activate Free SSL using Let&#039;s Encrypt" src="https://www.slideshare.net/slideshow/embed_code/key/v9bWW2yRkpabzA" width="427" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="https://www.slideshare.net/MayeenulIslam/how-to-issue-and-activate-free-ssl-using-lets-encrypt" title="How to Issue and Activate Free SSL using Let&#39;s Encrypt" target="_blank">How to Issue and Activate Free SSL using Let&#39;s Encrypt</a> </strong> from <strong><a href="https://www.slideshare.net/MayeenulIslam" target="_blank">Mayeenul Islam</a></strong> </div>
</div></figure>



<p><strong>&#8211; মঈনুল ইসলাম</strong><br><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f517.png" alt="🔗" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a rel="noreferrer noopener" href="https://mayeenulislam.github.io/" target="_blank">mayeenulislam.github.io</a></p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/free-ssl/">কিভাবে ফ্রি-তে Let&#8217;s Encrypt ব্যবহার করে SSL Certificate ইস্যু এবং অ্যাক্টিভেট করা যায়</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mayeenulislam.github.io/tuts/free-ssl/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ওপেনসোর্স মানে ফ্রি না &#8211; যেভাবে শিখলাম</title>
		<link>https://mayeenulislam.github.io/tuts/open-source-not-free/</link>
					<comments>https://mayeenulislam.github.io/tuts/open-source-not-free/#respond</comments>
		
		<dc:creator><![CDATA[মঈনুল ইসলাম]]></dc:creator>
		<pubDate>Fri, 03 Nov 2017 15:09:43 +0000</pubDate>
				<category><![CDATA[অন্যান্য টিউটোরিয়াল]]></category>
		<guid isPermaLink="false">https://mayeenulislam.github.io/tuts/?p=1165</guid>

					<description><![CDATA[<p>ওপেন সোর্স মানেই মনে হতে পারে যে, সবকিছু ফ্রি। আসলে, ওপেন সোর্স মানেই ফ্রি না - সেটা যেভাবে আমি শিখলাম...</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/open-source-not-free/">ওপেনসোর্স মানে ফ্রি না &#8211; যেভাবে শিখলাম</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>&#8220;ওপেন সোর্স&#8221; (Open Source: উন্মুক্ত সোর্স, মুক্ত সোর্স) মানে হচ্ছে, সোর্সকে উন্মুক্ত করে ছেড়ে দেয়া। কথাটির বিপরীত শব্দ হচ্ছে &#8220;সংরক্ষিত সোর্স&#8221; (Closed Source)।</p>



<blockquote class="wp-block-quote">
<p>ওপেন সোর্স মানে ফ্রি না</p>
</blockquote>



<p>কিংবা</p>



<blockquote class="wp-block-quote">
<p>উন্মুক্ত সোর্স মানে মাগনা না</p>
</blockquote>



<p>কথাটা শুনেছি, বুঝেও ফেলেছি&#8230;</p>



<p>কিন্তু সত্যি বলতে কি, বুঝে ফেলার ভান করলেও, কিংবা বুঝে ফেললেও আসলে কিন্তু কিচ্ছুই বুঝতে পারিনি &#8211; এটা বুঝতে পারলাম, যখন এবিষয়ে কথা বাড়াতে গিয়ে এখানে-ওখানে ধাক্কা খাচ্ছিলাম।</p>



<ul>
<li>উইন্ডোজ একটা সফ্‌টওয়্যার, যা কিনে নিতে হয়, এটা ওপেন সোর্স না। বাংলাদেশের বিজয় কীবোর্ড কিন্তু এরকমই একটা সফ্‌টওয়্যার, যা সংরক্ষিত সোর্স এবং কিনে ব্যবহার করতে হয়।</li>



<li>উবুন্ত‌ু একটা সফ্‌টওয়্যার, যা ফ্রি পাওয়া যায়, মানে মাগনা, আবার এটা ওপেন সোর্স।&nbsp;বাংলাদেশের অভ্র ফোনেটিক কীবোর্ড কিন্তু এরকমই একটা সফ্‌টওয়্যার, যা উন্মুক্ত সোর্স এবং বিনামূল্যও।</li>
</ul>



<p>হিসাবটা এখানে মিলে না, তাই শিখাও হয় না।</p>



<p>অবশেষে লজ্জার মাথা খেয়ে যখন প্রশ্নটা শাবাব ভাইকে (Shabab Mustafa) এক সাক্ষাতে করেই ফেললাম, তখনই আসলে সত্যিকার অর্থে শিখলাম।&nbsp;যা শিখলাম, সেটাকে ভেঙে বলি:</p>



<span id="more-1165"></span>



<p>উইন্ডোজ কিনে নিলেন, এটা এখন আপনার নিজের। করলেন কি, সেখানে কিছু পরিবর্তন করতে চাইলেন। এবার কোডগুলো খুলে দেখলেন, সব বাইনারি&#8230;&nbsp;<em>কাকের ঠ্যাং-বকের ঠ্যাং</em>। অর্থাৎ যা কোড ওরা করেছে, সবই এনক্রিপ্ট (encrypt) করে গুপ্ত ফাইলগুলো পাঠিয়েছে আপনাকে। অর্থাৎ এটা সংরক্ষিত সোর্স (Closed Source)।</p>



<p>কিন্তু উবুন্ত‌ু নিয়ে এসে কিছু বদলে নিতে চাইলে, নিশ্চিন্তে ফাইলগুলো খুলুন। আপনার মনের মতো পরিবর্তন করে নিন, কারণ যা কোড করা হয়েছে, সবই জলজ্যান্ত আপনার সামনে রয়েছে। অর্থাৎ এটা ওপেন সোর্স &#8211; সোর্সগুলো কম্পাইল করে বাইনারি করে ফেলা হয়নি; কিংবা করে ফেললেও অন্য কোথাও মূল ফাইলগুলো আছে, যেখান থেকে তা নিয়ে আপনি পরিবর্তন করে আবার কম্পাইল করে বাইনারি বানিয়ে নিতে পারবেন নিজের মতো।</p>



<p>তাহলে ওপেন সোর্সের ধারণাটা পরিষ্কার এখন।&nbsp;&nbsp;<img src="https://s.w.org/images/core/emoji/14.0.0/72x72/263a.png" alt="☺" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p>এখন যদি কেউ আপনার সামনে &#8220;cost of open source software&#8221; নিয়ে আলোচনা করেন, আপনি তাতে মোটেই আশ্চর্য হবেন না।</p>


<div class="wp-block-image">
<figure class="alignright"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2017/08/meditate.jpg"><img decoding="async" width="300" height="261" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2017/08/meditate-300x261.jpg" alt="Meditate - GNU Open Source License Mascot - nanodesigns" class="wp-image-1171" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2017/08/meditate-300x261.jpg 300w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2017/08/meditate.jpg 600w" sizes="(max-width: 300px) 100vw, 300px" /></a><figcaption class="wp-element-caption">Meditate &#8211; GNU Open Source License Mascot</figcaption></figure></div>


<p>এখন হিসাবটা মিলাই&#8230;</p>



<p>আপনি একটা সফ্‌টওয়্যার বানালেন, কোড সব ওপেন সোর্স, তার মানে, যখনই আপনি বিক্রী করবেন, যার কাছেই করবেন, তিনি সব কোড দেখতে পারবেন। আচ্ছা, তারমানে, <em>ওপেন সোর্স প্রোগ্রাম বিক্রীও করা যায়!</em> যেমন: ওয়ার্ডপ্রেসের জনপ্রিয় অনেক প্রিমিয়াম থিম, প্লাগইন আছে, যেগুলো ব্যবহার করতে হলে কিনে নিতে হয়। যখন কিনে নেয়া হয়, তখন কিন্তু তারা কোনো বাইনারি ফাইল পাঠায় না, তারা যে যে ফাইলে কোড করেছে, সেইসব ফাইল দিয়ে তৈরি প্যাকেজটাই আপনাকে পাঠায়। উদাহরণস্বরূপ WooCommerce একটি ওপেনসোর্স প্লাগইন, যার একটা ফ্রি সংস্করণ আছে, আবার একটা প্রিমিয়াম সংস্করণ আছে, প্রিমিয়াম সংস্করণটি কিনে নিতে হয়। এবং কিনে নেয়া সংস্করণটার সব কোড পড়া যায়, এবং লাইসেন্সের আওতায় থেকে ইচ্ছেমতো বদলেও নেয়া যায়।</p>



<p>আবার ঠিক তেমনি সংরক্ষিত সোর্সের প্রোগ্রামও বিনামূল্যে ছেড়ে দেয়া যায়। আপনি একটি সফ্‌টওয়্যার বানালেন, যা সাধারণ মানুষের খুব উপকারে আসবে, কিন্তু আপনি চান এর যাবতীয় কোড, খুঁটিনাটি আর কেউ না দেখুক, না জানুক &#8211; কোনো পরিবর্তন করতে হলে আপনাকে ডাকুক, কিন্তু সবাই-ই এটি বিনামূল্যে ডাউনলোড করে নিক, কিংবা এ-ওর থেকে ডিভিডিতে কিংবা পেনড্রাইভে করে নিয়ে নিয়ে যাক, ইচ্ছেমতো ব্যবহার করুক, এই উপযোগিতা পাক &#8211; আপনি তখন এর সোর্স সংরক্ষিত রেখে তা বাজারজাত করলেন।</p>



<p>আবার প্রোগ্রামিং ল্যাংগুয়েজটা ওপেন সোর্স হলেও, তা দিয়ে তৈরি সফ্‌টওয়্যারও অনেকসময় সংরক্ষিত সোর্সে ছাড়তে পারেন। অনেক ক্ষেত্রে মূল ল্যাংগুয়েজে সেটা সম্ভব না হলেও, যথাযথ লাইসেন্স দিয়ে সেটাকে নিরাপত্তা দেয়া হয়।<span style="color: #3366ff;"><sup>*</sup></span> অর্থাৎ কেউ সোর্স কোনোভাবে বের করে ফেললেও, তা বদলানোর অধিকার পাবে না &#8211; মর্মে একটা লাইসেন্স করতে হবে, তখন তার ব্যতয় হলে আদালতে লড়ালড়ি করে আপনি তা প্রতিহত করতে পারবেন।</p>



<p>উন্মুক্ত সোর্সের একটা বড় সমস্যা মনে হতে পারে যে, এটা তো মসিবতের জিনিস,&nbsp;<em>আমার কাজ নিয়ে আরেকজন তার নামে চালিয়ে দিলো&#8230;</em>&nbsp;হয়তো&nbsp;<em>আমার</em>&nbsp;মনেই সেটা কাজ করছে বলেই আমি আরেকজনকে সন্দেহ করছি <img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f61c.png" alt="😜" class="wp-smiley" style="height: 1em; max-height: 1em;" />। &#8230;অসুন্দর হলেও অবশ্য বাস্তবে এমনটা হতে দেখা যায় কদাচিৎ। অসাধু মানুষ, ভালো জিনিসটাকে নিয়ে মন্দ করবে, তাই বলে ভালোটা তো আর থেমে থাকবে না। আসলে খুব বেশি&nbsp;<em>গায়ে না লাগলে</em>&nbsp;কেউ তাতে গরজ দেখায় না। কারণ যারা কাজ জানে, তারা চুরি করে না, আর যারা কাজ জানে না, তারাই অন্যেরটা&nbsp;<em>মেরে দেয়ার</em> দুষ্টু চিন্তা করে। আর তাই অন্যেরটা মেরে দিলেও তারা তা যথাযথভাবে প্রকৃত ব্যবহারকারীর কাছে পৌঁছাতে পারে না কিংবা তার কোনো সমস্যাও সমাধান করতে পারে না। ফলে, তারা শেষ পর্যন্ত&nbsp;<em>ধরা খায়</em>। &#8230;কিন্তু মনে রাখবেন, যদি যথাযথ লাইসেন্সে আপনার উন্মুক্ত সোর্স প্রোগ্রামের লাইসেন্স করে নিয়ে থাকেন, তাহলে কিন্তু&#8230;&nbsp;<em>গায়ে যখন লাগবে</em>, তখন বিপৎগামীদের শ্রীঘরের ভাতও খাইয়ে নেয়া যাবে।</p>



<p>ওপেন সোর্স কিংবা সংরক্ষিত সোর্স &#8211; কোনটা আপনি বেছে নিবেন, কেন নিবেন, সে বিষয়ে জানানোর জন্য লেখাটি নয়। শুধুমাত্র, এই বিশ্বাসটুকু দেয়ার জন্য লেখা যে, আমার মতো আর ভুল করবেন না, বুঝেশুনে বিশ্বাস করুন:</p>



<blockquote class="wp-block-quote">
<p>ওপেন সোর্স মানেই ফ্রি নয়</p>
</blockquote>



<p><strong>-মঈনুল ইসলাম<br></strong><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f517.png" alt="🔗" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a rel="noreferrer noopener" href="https://mayeenulislam.github.io/" target="_blank">mayeenulislam.github.io</a></p>



<p>_________________</p>



<h3>উৎস নির্দেশ</h3>



<ul>
<li><a href="https://softwareengineering.stackexchange.com/a/181142/110017" target="_blank" rel="noopener">Am I allowed closed source software with open source code &#8211; Programmers StackExchange</a></li>



<li><a href="https://bn.wikipedia.org/s/3m2j" target="_blank" rel="noopener">Open Source &#8211; Bengali Wikipedia</a></li>



<li>ছবি:&nbsp;<a href="http://www.gnu.org/" target="_blank" rel="nofollow noopener">gnu.org</a></li>
</ul>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/open-source-not-free/">ওপেনসোর্স মানে ফ্রি না &#8211; যেভাবে শিখলাম</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mayeenulislam.github.io/tuts/open-source-not-free/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>গিটহাবে স্ট্যাটিক ডেমো সাইট বানানোর কৌশল</title>
		<link>https://mayeenulislam.github.io/tuts/hosting-github-static-pages/</link>
					<comments>https://mayeenulislam.github.io/tuts/hosting-github-static-pages/#comments</comments>
		
		<dc:creator><![CDATA[মঈনুল ইসলাম]]></dc:creator>
		<pubDate>Wed, 07 Dec 2016 10:12:33 +0000</pubDate>
				<category><![CDATA[গিট টিউটোরিয়াল]]></category>
		<category><![CDATA[গিটহাব টিউটোরিয়াল]]></category>
		<category><![CDATA[গিট]]></category>
		<category><![CDATA[গিটহাব]]></category>
		<guid isPermaLink="false">https://mayeenulislam.github.io/tuts/?p=1085</guid>

					<description><![CDATA[<p> [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/hosting-github-static-pages/">গিটহাবে স্ট্যাটিক ডেমো সাইট বানানোর কৌশল</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>আপনি HTML, CSS, JavaScript দিয়ে একটা অপূর্ব কাজ করে ফেলেছেন। সেটা ছড়িয়ে দেবার জন্য Github-এ একটা রেপোযিটরিও করে ফেলেছেন এবং সেখানে আপলোডও করে দিয়েছেন। লোকজন এখন চাইলেই আপনার রোপোযিটরিটা ফর্ক করতে পারছেন, ক্লোন করতে পারছেন, ডাউনলোডও করতে পারছেন। কিন্তু একটা ব্যাপারে ঠিক মন ভরছে না &#8211; যদি কাজটার একটা ডেমো দেখানো যেত অনলাইনেই? তাহলে তো সোনায় সোহাগা হতো।</p>



<p>আমরা এখানে জানবো: কিভাবে গিটহাবে একটা স্ট্যাটিক ডেমো সাইট তৈরি করা যায়।</p>



<p>একটু বলে রাখি, বারবার স্ট্যাটিক সাইট কথাটা কেন বলছি? স্ট্যাটিক সাইটে সার্ভার সাইড কোনো কোড থাকছে না, পিওর এইচটিএমএল, সিএসএস আর জাভাস্ক্রিপ্ট দিয়ে আপনি সাইটটা তৈরি করছেন, আর দেখাচ্ছেন। কারণ ডাটাবেজ স্টোর করার মতো কোনো জায়গা আমরা পাচ্ছি না।</p>



<h3>যা যা জানা থাকা লাগবে</h3>



<p>অন্তত একটা HTML ফাইল বানানো জানা লাগবে। এছাড়া, যখন যা জানার দরকার পড়বে, একটু ঢু মেরে সেটা জেনে নিলেই চলবে।</p>



<h3>কিভাবে কী করতে হয়?</h3>



<h4>প্রথম ধাপ: গিটহাবে কোড ডিপ্লয়</h4>



<p>কাজটা খুবই সহজ।</p>



<span id="more-1085"></span>



<p> ধরে নিচ্ছি আপনার একটা স্ট্যাটিক সাইট আগে থেকেই বানানো আছে যেখানে একটা <code>index.html</code> আছে। (যেমন <a href="https://github.com/mayeenulislam/tuts-nano-github-pages" target="_blank" rel="noopener">আমরা একটা স্ট্যাটিক সাইট বানিয়ে রেখেছি</a>)</p>



<p>এই ডিরেক্টরিটিকে এবারে একটা গিট রিপো বানিয়ে ফেলি। গিট কিভাবে ব্যবহার করতে হয়, জানা না থাকলে চট করে একটা ঢু মেরে শিখে ফেলা যাক:</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-tuts-by-mayeenul-islam wp-block-embed-tuts-by-mayeenul-islam"><div class="wp-block-embed__wrapper">
<blockquote class="wp-embedded-content" data-secret="LgYPwCO2Ur"><a href="https://mayeenulislam.github.io/tuts/git-basics-1/">গিট ব্যবহারের একেবারে প্রাথমিক জ্ঞান : পর্ব ১</a></blockquote><iframe class="wp-embedded-content" sandbox="allow-scripts" security="restricted" title="&#8220;গিট ব্যবহারের একেবারে প্রাথমিক জ্ঞান : পর্ব ১&#8221; &#8212; Tuts by Mayeenul Islam" src="https://mayeenulislam.github.io/tuts/git-basics-1/embed/#?secret=droFqhee0M#?secret=LgYPwCO2Ur" data-secret="LgYPwCO2Ur" width="600" height="338" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
</div></figure>



<p>এবারে git bash-এ কমান্ড লিখি:</p>



<pre class="wp-block-preformatted">git init
git add -A
git commit -m "Initial Commit"</pre>



<p>এবারে গিটহাবে প্রোজেক্টটা তুলে দিতে হলে গিটহাবে গিয়ে একটা ফাঁকা রিপো তৈরি করে নিই: New Repository-তে গিয়ে শুধু একটা নাম দেই, আর কিচ্ছু দেয়া লাগবে না। এবারে Create Repository-তে ক্লিক করলে আপনাকে ইন্সট্রাকশন দিবে কী করা লাগবে। সেখান থেকে এই লাইনটা লেখা যাক গিট ব্যাশ-এ:</p>



<pre class="wp-block-preformatted">git remote add origin https://github.com/{username}/{repository-path}.git</pre>



<p>বুঝতেই পারছেন, এখানে <code>{username}</code> আর <code>{repository-path}</code> আপনার পাথ আর ইউযারনেম দিয়ে পূরণ করবেন। এতে গিটহাবের ঐ রিপোযিটোরিটা আমরা রিমোট হিসেবে যোগ হয়ে যাবে। ব্যাস, এবার আপনার কোডগুলো গিটহাবে তুলে দিন:</p>



<pre class="wp-block-preformatted">git push origin master</pre>



<h4>শেষ ধাপ: গিট পেজ তৈরি করা</h4>



<h5><strong>পদ্ধতি ১ : মাস্টার ব্রাঞ্চকেই ব্যবহার করা</strong></h5>


<div class="wp-block-image">
<figure class="alignright"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/11/github-pages-setup.png"><img decoding="async" width="300" height="180" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/11/github-pages-setup-300x180.png" alt="গিটহাব প্যাজেস সেটিংসমূহ" class="wp-image-1090" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/11/github-pages-setup-300x180.png 300w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/11/github-pages-setup.png 750w" sizes="(max-width: 300px) 100vw, 300px" /></a><figcaption class="wp-element-caption">গিটহাব প্যাজেস সেটিংসমূহ</figcaption></figure></div>


<p>যেহেতু আমরা আমাদের <code>master</code> ব্রাঞ্চে যা যা আছে, সেটাকেই Demo আকারে দেখাতে চাচ্ছি, আমাদের জন্য কাজটা খুব সহজ। গিটহাবে আপনার রেপোযিটোরি&#8217;র Settings পাতায় যান (ইউআরএলটা এরকম হবে: <code>https://github.com/{username}/{repository-name}/settings</code>)</p>



<p>এবারে নিচের দিকে Github Pages ব্লকের Source অংশের None লেখা ড্রপডাউন থেকে বাছাই করে দিন <code>master branch</code>। তারপর Save বোতাম চাপুন। কাজ শেষ।</p>



<p>আপনার Demo সাইটটা আপনার <code>master</code> ব্রাঞ্চের তথ্য (<code>index.html</code>) নিয়ে তৈরি হয়ে গেছে। দেখা যাবে এরকম একটা পাথে:</p>



<pre class="wp-block-preformatted">https://{username}.github.io/{repository-name}/</pre>



<p>কাজ শেষ। <img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<h5><strong>পদ্ধতি ২ : ব্রাঞ্চ করে নেয়া</strong></h5>



<p>যদি আপনি চান যে, ডেমো পাতাটা সম্পূর্ণ অন্যভাবে করতে, মূল কোডের সাথে মিল না রাখতে, কিংবা কিছুটা ভিন্ন রাখতে, তাহলে আলাদা একটি ব্রাঞ্চ তৈরি করে সেখানে দেখিয়ে দেয়াটাই উত্তম হবে। এমতাবস্থায় আমরা গিট রিপোযিটোরিতে একটা ব্রাঞ্চ তৈরি করবো। যদি গিটে ব্রাঞ্চিং কিভাবে করতে হয়, জানা না থাকে, চট করে শিখে নেয়া যাক:</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-tuts-by-mayeenul-islam wp-block-embed-tuts-by-mayeenul-islam"><div class="wp-block-embed__wrapper">
<blockquote class="wp-embedded-content" data-secret="LfhDqJLVlD"><a href="https://mayeenulislam.github.io/tuts/git-branching/">গিট দিয়ে ভার্ষন নিয়ন্ত্রণ &#8211; git branch</a></blockquote><iframe class="wp-embedded-content" sandbox="allow-scripts" security="restricted" title="&#8220;গিট দিয়ে ভার্ষন নিয়ন্ত্রণ &#8211; git branch&#8221; &#8212; Tuts by Mayeenul Islam" src="https://mayeenulislam.github.io/tuts/git-branching/embed/#?secret=Z5YeYl9Tvd#?secret=LfhDqJLVlD" data-secret="LfhDqJLVlD" width="600" height="338" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
</div></figure>



<p>এই ব্রাঞ্চটা দিয়ে গিটহাবে Git Pages কাজ করে, আর ব্রাঞ্চের নামটাও নির্ধারিত <code>gh-pages</code>। সুতরাং চট করে গিট ব্যাশে লিখে ফেলুন:</p>



<pre class="wp-block-preformatted">git checkout -b gh-pages</pre>



<p>হলো কী &#8211; <code>gh-pages</code> নামে একটা গিট ব্রাঞ্চ তৈরি হয়ে গেলো আর আমরা সেই ব্রাঞ্চে চলেও এলাম। যদি গিট ব্রাঞ্চ আমরা বুঝে থাকি, তাহলে জানি, <code>master</code> ব্রাঞ্চে যা আছে এই নতুন ব্রাঞ্চেও এখন তা তা আছে। অর্থাৎ আমাদের <code>index.html</code> ফাইলটাও এখানে আছে। এই ব্রাঞ্চে আপনি যেমন যেমন চাচ্ছেন, তেমন তেমন ইচ্ছেমতো পরিবর্তন করে নিন, আপনার ডেমো সাইটটা। তারপর গিট অ্যাড আর গিট কমিট করে গিট পুশ করে দিন নতুন ব্রাঞ্চটা:</p>



<pre class="wp-block-preformatted">git push origin gh-pages</pre>



<p>এটা স্বয়ংক্রীয়ভাবেই নিম্নোক্ত পাথে আপনার ডেমো সাইটটা তৈরি করে দিবে:</p>



<pre class="wp-block-preformatted">https://{username}.github.io/{repository-name}/</pre>



<h4>বাড়তি তথ্য</h4>



<ul>
<li>ডেমো সাইটের জন্য <code>gh-pages</code> ব্রাঞ্চটা যে বাধ্যতামূলক (ম্যান্ডেটরি) না, সেটা আশা করি বুঝে ফেলেছেন। সেক্ষেত্রে যে ব্রাঞ্চ থেকেই ডেমো দেখান না কেন, তা Settings পাতায় বাছাই করে দিলেই কাজ শেষ।</li>



<li>আপনি যদি চান নিজস্ব ডোমেইন থেকেও ডেমো পাতাটি দেখা যাক, যেমন: example.com লিখে এন্টার করলেও যেন এই সাইটটা দেখা যাকে, তাহলে সেটাও করতে পারবেন: Custom domain অংশে <code>http://example.com/</code> লিখে দিতে হবে। কিন্তু শর্ত হচ্ছে ঐ ডোমেইনের CNAME রেকর্ডে বলে দিতে হবে যে, এই হোস্টটা ব্রাউজ করতে হবে।</li>



<li>আপনি যদি <a href="https://jekyllrb.com/" target="_blank" rel="noopener">Jekyll^</a> কিংবা অন্য কোনো স্ট্যাটিক সাইট জেনারেটরে অভ্যস্থ হন, তাহলে নিশ্চিন্তে আপনি সেসব সাইটও গিটহাব পেজেস-এ ডিপ্লয় করতে পারেন। এছাড়া গিটহাবেই Automatic Page Generator রয়েছে, সেটা দিয়েও আপনি Markdown সিনট্যাক্সে আপনার স্ট্যাটিক সাইট বানিয়ে নিতে পারেন।</li>
</ul>



<h4>উপসংহার</h4>



<p>সুতরাং আশা করি এখন থেকে আপনার করা HTML, CSS, JavaScript-এর স্ট্যাটিক কাজগুলোর একটা ডেমো আমরা অনায়াসে দেখতে পারবো ইনশাল্লাহ।</p>



<p>আমাদের স্ট্যাটিক সাইটের ডেমোটা দেখা যাক:</p>



<p><a href="https://mayeenulislam.github.io/tuts-nano-github-pages/">https://mayeenulislam.github.io/tuts-nano-github-pages/</a></p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/hosting-github-static-pages/">গিটহাবে স্ট্যাটিক ডেমো সাইট বানানোর কৌশল</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mayeenulislam.github.io/tuts/hosting-github-static-pages/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>অ্যাডমিন প্যানেলে নিজস্ব $wp_query&#8217;র জন্য পেজিনেশন</title>
		<link>https://mayeenulislam.github.io/tuts/custom-pagination-admin-panel-wp-query/</link>
					<comments>https://mayeenulislam.github.io/tuts/custom-pagination-admin-panel-wp-query/#respond</comments>
		
		<dc:creator><![CDATA[মঈনুল ইসলাম]]></dc:creator>
		<pubDate>Wed, 01 Jun 2016 13:44:21 +0000</pubDate>
				<category><![CDATA[ওয়ার্ডপ্রেস টিউটোরিয়াল]]></category>
		<category><![CDATA[ওয়েব ডেভলপমেন্ট টিউটোরিয়াল]]></category>
		<category><![CDATA[জ্ঞান-স্তরভিত্তিক টিউটোরিয়াল]]></category>
		<category><![CDATA[থিম টিউটোরিয়াল]]></category>
		<category><![CDATA[প্রাথমিক স্তরের টিউটোরিয়াল]]></category>
		<category><![CDATA[প্লাগইন টিউটোরিয়াল]]></category>
		<guid isPermaLink="false">https://mayeenulislam.github.io/tuts/?p=1027</guid>

					<description><![CDATA[<p> [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/custom-pagination-admin-panel-wp-query/">অ্যাডমিন প্যানেলে নিজস্ব $wp_query&#8217;র জন্য পেজিনেশন</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>অ্যাডমিন প্যানেলে একটা পাতায় (menu_page কিংবা submenu_page হতে পারে) একটা <code>WP_Query()</code> চালিয়ে কিছু তথ্য নিয়ে এসেছি। টেবিল আকারে তথ্যগুলো দেখিয়েছিও। এবং পেজিনেশনও করেছি। কিন্তু লক্ষ করলাম, পেজিনেশন কাজ করছে না। অনুসন্ধান করে দেখলাম Christine Cooper-ও একই সমস্যায় পড়েছিলেন এবং তিনি একটা সমাধানও বের করেছেন Milo&#8217;র পরামর্শকে কাজে লাগিয়ে। সমাধানটা দারুণ, এবং আমার সমস্যারও সমাধান দিলো। কিন্তু আরো কিছু বিষয়ের দরকার হয়ে পড়েছিল, তাই আমি সেটাতে আরো কাজ করে আপনাদের জন্য হাজির করলাম একটু গোছানো একটা সমাধান হিসেবে। আপনারা এটাকে আরো গুছিয়ে নিতে পারেন নিজের মতো করে।</p>



<h3>আসলে কী হচ্ছে, কেন হচ্ছে?</h3>



<p>এই ব্যাপারটা আগে জানা দরকার। কপি-পেস্ট সবাই করতে পারে, কোড বুঝে নিয়ে তা ব্যবহার করাটাই প্রকৃত প্রোগ্রামারের কাজ হওয়া উচিত। যা জানা গেল, তা হলো,</p>



<span id="more-1027"></span>



<p> আমাদের পাতায় কোনো <code>$wp_query</code> অবজেক্ট লোড হচ্ছে না। সেকারণে Query argument-ও যোগ হচ্ছে না ইউআরএল-এ। তাই আমাদের বহুল পরিচিত পেজিনেশন সংক্রান্ত কন্ডিশনাল:</p>



<p><code>$paged = get_query_var('paged') ? get_query_var('paged') : 1;</code></p>



<p>এখানে কাজ করছে না, কারণ <code>get_query_var()</code> আসলে কিছু পাচ্ছে না (কুয়েরি আর্গুমেন্ট তো যোগই হচ্ছে না, পাবে কিভাবে)। সেজন্য ইউআরএল-এ <code>&amp;paged</code> প্যারামিটারের ভ্যালু পাবার জন্য আমরা <code>$_GET</code> মেথড ব্যবহার করতে বাধ্য হচ্ছি, যেমনটা Milo শিখালেন।</p>



<p>এবারে সব পেজিনেশনের জন্য যেমন কিছু ছোটখাটো বিষয় বানিয়ে নেয়া লাগে এখানেও তাই করা হচ্ছে, আমরা বলে নিচ্ছি:</p>



<p><code>$nextpage = $paged + 1;</code></p>



<p>আর আমরা আগের পাতা দেখানোর জন্য তৈরি করেছি:</p>



<p><code>$prevpage = max( ($paged - 1), 0 );</code></p>



<p>খুব সোজা, পরের পাতা মানে ১ যোগ, আর আগের পাতা মানে ১ বিয়োগ। কিন্তু এভাবে যাতে নেগেটিভ মানে না চলে যায়, তাই আমরা পিএইচপি&#8217;র <code>max()</code> ফাংশন ব্যবহার করেছি।</p>



<p>ধরা যাক আমাদের কুয়েরিটা এরকম:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/2b7fd2d092bca527e521eb51079dfc72">Gist</a>.
</div></figure>



<p>এখানে আমরা posts_per_page প্যারামিটারে ওয়ার্ডপ্রেসের নিজস্ব Settings &gt; Reading-এ সেট করা পাতা-প্রতি পোস্টের সংখ্যা ব্যবহার করছি। আমরা তাই বারবার কুয়েরি না করে ফাংশনেও এই সংখ্যাটা নিয়ে নিচ্ছি। যদি আপনার ক্ষেত্রে ব্যতিক্রম কিছু থেকে থাকে, আপনি চাইলে পেজিনেশন <code>$posts_per_page = 5</code> এরকম করে আপনার ভ্যালুও পাস করে দিতে পারেন। যদি ফাংশনে <code>$items_per_page</code>-এ কোনো ভ্যালু না দেয়া হয়, তাহলে আমরা ওয়ার্ডপ্রেসের ডিফল্টটা গ্রহণ করেছি ফলব্যাক হিসেবে। লক্ষ রাখুন, <code>$paged</code> প্যারামিটারে <code>get_query_var()</code>-এর বদলে <code>$_GET</code> মেথড ব্যবহার করেছি।</p>



<p>এবারে এই হচ্ছে আমাদের পেজিনেশন ফাংশন:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/2b7fd2d092bca527e521eb51079dfc72">Gist</a>.
</div></figure>



<p>আর, এই ফাংশনকে আমরা এভাবে ব্যবহার করতে পারবো:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/2b7fd2d092bca527e521eb51079dfc72">Gist</a>.
</div></figure>



<p>এখানে আমাদের মতো করে আমরা পেজিনেশন প্যারামিটারগুলো পাঠাতে পারছি। এবং সর্বোপরি, আমরা কততম পাতায় আছি, Next Page, Previous Page, Last Page, First Page ইত্যাদি বোতামও পাচ্ছি, প্যাজিনেশনকে প্রয়োজনমতো ব্যবহার করার জন্য।</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/06/admin-page-wp-query-custom-pagination-tutsnano.png"><img decoding="async" width="1024" height="435" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/06/admin-page-wp-query-custom-pagination-tutsnano-1024x435.png" alt="অ্যাডমিন পাতায় $wp_query'র জন্য নিজস্ব পেজিনেশন" class="wp-image-1041" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/06/admin-page-wp-query-custom-pagination-tutsnano-1024x435.png 1024w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/06/admin-page-wp-query-custom-pagination-tutsnano-300x127.png 300w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/06/admin-page-wp-query-custom-pagination-tutsnano-768x326.png 768w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/06/admin-page-wp-query-custom-pagination-tutsnano.png 1111w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">অ্যাডমিন পাতায় $wp_query&#8217;র জন্য নিজস্ব পেজিনেশন</figcaption></figure></div>


<p>সুতরাং, বুঝে নিয়ে ব্যবহার করতে নেই মানা। কোনো ভুল থাকলে জানানোর অনুরোধ। আর ভালো লাগলো কিনা, কিংবা আসল কথা, কাজে লাগলো কিনা, নিচে মন্তব্য করে জানাতে ভুলবেন না। আর কাজে লাগলে, শেয়ার করে সবাইকে জানাতেও ভুলবেন না।</p>



<p><strong>মঈনুল ইসলাম</strong><br><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f517.png" alt="🔗" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a rel="noreferrer noopener" href="https://mayeenulislam.github.io/" target="_blank">mayeenulislam.github.io</a></p>



<p><span style="color: #999999;">_____________________________</span></p>



<h3>কৃতজ্ঞতা</h3>



<p>কৃতজ্ঞতা জানাচ্ছি <span class="pl-s1"><span class="pl-c">Christine Cooper</span></span> এবং Milo-কে, তাঁদের দেয়া <a href="http://wordpress.stackexchange.com/a/175649/22728">পরামর্শ আর স্নিপেটের^</a> উপর ভিত্তি করে এখানে একটা কার্যোপযোগী মার্জিত সংস্করণ যোগ করা হয়েছে মাত্র।</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/custom-pagination-admin-panel-wp-query/">অ্যাডমিন প্যানেলে নিজস্ব $wp_query&#8217;র জন্য পেজিনেশন</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mayeenulislam.github.io/tuts/custom-pagination-admin-panel-wp-query/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>কোড স্নিপেট: পাবলিক আইপি ঠিকানা ফিল্টার করে কন্টেন্ট দেখান</title>
		<link>https://mayeenulislam.github.io/tuts/filtering-public-ip-address/</link>
					<comments>https://mayeenulislam.github.io/tuts/filtering-public-ip-address/#respond</comments>
		
		<dc:creator><![CDATA[মঈনুল ইসলাম]]></dc:creator>
		<pubDate>Fri, 25 Mar 2016 17:27:10 +0000</pubDate>
				<category><![CDATA[ওয়ার্ডপ্রেস টিউটোরিয়াল]]></category>
		<category><![CDATA[ওয়েব ডেভলপমেন্ট টিউটোরিয়াল]]></category>
		<category><![CDATA[পিএইচপি টিউটোরিয়াল]]></category>
		<guid isPermaLink="false">https://mayeenulislam.github.io/tuts/?p=1016</guid>

					<description><![CDATA[<p> [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/filtering-public-ip-address/">কোড স্নিপেট: পাবলিক আইপি ঠিকানা ফিল্টার করে কন্টেন্ট দেখান</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>কেউ একজন গুগল অ্যাডসেন্স অ্যাকাউন্ট অনুমোদিত হবার পর, নিজেদের সাইটে সক্রিয় করেছেন। কিন্তু তিনদিনের মাথায় &#8216;ইনভ্যালিড ক্লিক&#8217;-এর কারণে তাঁর অ্যাকাউন্টটা আজীবনের জন্য রহিত (ব্যান) হয়ে যায়। কারণ হিসেবে তাঁরা যা <em>আন্দাজ</em> করছেন যে, <em>হয়তো</em> নিজেদের একই পাবলিক আইপি ঠিকানা থেকে একাধিক ক্লিকই হয়তো তাঁদের অ্যাকাউন্টটা ব্যান করে দিয়েছে। এটা হতে পারে, যখন একই ইন্টারনেট সংযোগ ব্যবহার করে একাধিক কম্পিউটার দিয়ে একাধিক ব্যবহারকারী ইন্টারনেট ব্যবহার করেন। তখন গুগল ঐ ব্যক্তিদের ক্লিককে সেই ব্যক্তিরই ক্লিক বলে ধরে নেবে, যিনি অ্যাডসেন্স অ্যাকাউন্টটা তৈরি করেছেন &#8211; সোজা বাংলায় তিনি [নিজে না করলেও ঘটনাটা এরকম দাঁড়াবে] নিজেই নিজের বিজ্ঞাপনে ক্লিক করেছেন।</p>



<p>আচ্ছা, এটা একটা ঘটনা হতে পারে, কিন্তু এরকম অনেক ঘটনাই দেখা দিতে&nbsp;পারে, যখন আপনি কোনো কোনো কন্টেন্ট নির্দিষ্ট কিছু আইপি ঠিকানার ব্যবহারকারীদের দেখাতে চান না। এই কোড স্নিপেটটি (<em>তাবিজ!</em> 🙂 ) আপনাকে রক্ষা করবে ইনশাল্লাহ:</p>



<span id="more-1016"></span>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/6310d09474196feb1749">Gist</a>.
</div></figure>



<p>পিএইচপি দিয়ে আইপি ট্র্যাক করার ফাংশনের বহু সংস্করণ আছে, আমি আসলে এই ফাংশনটাকে অধিকাংশ সময় কার্যকরী পেয়েছি (মাঝে মাঝে অবশ্য ব্যর্থও হয়)। আর, এরই সাথে আরেকটা ফাংশন বানিয়ে নিয়েছি&nbsp;যার ভিতরে অ্যারে আকারে আমরা যেসব আইপি বাধা দিতে চাচ্ছি সেগুলো উল্লেখ করে দিয়েছি (একটি থাকলে একটি, একাধিক হলে একাধিক)। ফাংশনটি&nbsp;বাধা দেয়া (ব্লক করা) এক/একাধিক আইপি ঠিকানার মধ্যে ভিযিটকারীর আইপি ঠিকানা মিলিয়ে দেখবে, যদি মিলে যায়, তাহলে&nbsp;<code>false</code>&nbsp;রিটার্ন করবে, আর না মিললে উল্টোটা।</p>



<p>আর ফাংশনটা এভাবে ব্যবহার করা যাবে:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/6310d09474196feb1749">Gist</a>.
</div></figure>



<h3>ওয়ার্ডপ্রেসে ব্যবহারবিধি</h3>



<ul>
<li>থিমের জন্য: আপনি ফাংশন দুটোকে থিমের&nbsp;<code>functions.php</code>-তে বসিয়ে নিয়ে থিমের সর্বত্র ব্যবহার করতে পারবেন।</li>



<li>প্লাগইনের জন্য: আপনি ফাংশন দুটোকে প্লাগইনের যেকোনো ফাইলে&nbsp;বসিয়ে নিয়ে প্লাগইন এমনকি থিমের&nbsp;সর্বত্র ব্যবহার করতে পারবেন।</li>
</ul>



<p>&#8211; <strong>মঈনুল ইসলাম</strong><br><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f517.png" alt="🔗" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a rel="noreferrer noopener" href="https://mayeenulislam.github.io/" target="_blank">mayeenulislam.github.io</a></p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/filtering-public-ip-address/">কোড স্নিপেট: পাবলিক আইপি ঠিকানা ফিল্টার করে কন্টেন্ট দেখান</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mayeenulislam.github.io/tuts/filtering-public-ip-address/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>কিভাবে গিটহাবে প্রোজেক্ট রিলিয করতে হয়</title>
		<link>https://mayeenulislam.github.io/tuts/releasing-github-project/</link>
					<comments>https://mayeenulislam.github.io/tuts/releasing-github-project/#respond</comments>
		
		<dc:creator><![CDATA[মঈনুল ইসলাম]]></dc:creator>
		<pubDate>Thu, 17 Mar 2016 07:58:35 +0000</pubDate>
				<category><![CDATA[অন্যান্য টিউটোরিয়াল]]></category>
		<category><![CDATA[জ্ঞান-স্তরভিত্তিক টিউটোরিয়াল]]></category>
		<category><![CDATA[প্রাথমিক স্তরের টিউটোরিয়াল]]></category>
		<guid isPermaLink="false">https://mayeenulislam.github.io/tuts/?p=995</guid>

					<description><![CDATA[<p> [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/releasing-github-project/">কিভাবে গিটহাবে প্রোজেক্ট রিলিয করতে হয়</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Github.com আমাদেরকে সামাজিকভাবে কোডিং করার একটা ধারণা দেয়। এই সাইট ব্যবহার করে আমরা বন্ধু, সহকর্মী, গুরু এমনকি অজানা কারো সাথেও সামাজিকভাবে কোড করতে পারি। অধিকাংশ গিটহাব প্রোজেক্টই উন্মুক্ত সোর্সের, কারণ প্রোজেক্টগুলো প্রাথমিকভাবেই জনসমক্ষে উন্মুক্ত। তবে আপনি প্রাইভেট রেপোযিটোরিও তৈরি করতে পারেন, কিন্তু সেগুলো বিনামূল্য নয়। উন্মুক্ত কিংবা প্রাইভেট &#8211; যাই হোক, গিটহাবে তোলা অধিকাংশ গুছিয়ে নেয়া পণ্যও এর ডেভলপার কিংবা মালিক <em>রিলিয</em> করেন না। তাই আজকে আমরা দেখার চেষ্টা করবো, কিভাবে গিটহাব প্রোজেক্টকে রিলিয করতে হয়।</p>



<p>ধরা যাক, আপনার গিটহাব রেপোযিটোরিটাই আপনার প্রোজেক্ট। এবং আপনি এখন এর 1.0.0 সংস্করণের কাজ করছেন। আরো কয়েকজনও কমিট করছেন এই রেপোযিটোরিতে। এবারে আপনারা সবাই ঠিক করলেন এই প্রোজেক্টটির 1.0.0 সংস্করণটি রিলিয করবেন। তো এপর্যায়ে আপনারা আপনাদের কমিট করা শেষ করলেন এবং রিলিযের জন্য প্রস্তুতি নিলেন।</p>



<h3>রিলিয দেয়ার গিট পদ্ধতি</h3>



<p>git ব্যবহার করে প্রোডাক্ট রিলিয দেয়ার পদ্ধতি হচ্ছে <code>git tag</code>। কমান্ডলাইনে (git bash ব্যবহার করে) কাজটা করার উপায় হচ্ছে:</p>



<pre class="wp-block-preformatted">git tag -a v1.0.0 -m "First Release"</pre>



<p>এতে যেটা হবে সর্বশেষ কমিটে <code>v1.0.0</code> ট্যাগটি জুড়ে যাবে। এবারে কমান্ডলাইনে ট্যাগ পুশ করে দিলেই গিটহাবে একটা ট্যাগ তৈরি হয়ে যাবে।</p>



<pre class="wp-block-preformatted">git push -u origin --tags</pre>



<p>কিন্তু এতে রিলিয নোট লেখা হবে না।&nbsp;তাই ট্যাগ তৈরি এবং রিলিয দেয়ার জন্য গিটহাব-এ রয়েছে রিলিয ফিচার:</p>



<h3>কিভাবে রিলিয করতে হয়</h3>



<span id="more-995"></span>



<p><code>https://github.com/username/repo</code>&nbsp;সাধারণত এইরকমই হয় গিটহাবে রেপোযিটোরির লিংক। তো আপনার রেপোযিটোরিতে&nbsp;<kbd>releases</kbd>&nbsp;লিংকে ক্লিক করুন।</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-release-link-tutsnano.png" rel="attachment wp-att-998"><img decoding="async" width="600" height="41" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-release-link-tutsnano.png" alt="গিটহাবে 'releases' লিংকে ক্লিক করুন" class="wp-image-998" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-release-link-tutsnano.png 600w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-release-link-tutsnano-300x21.png 300w" sizes="(max-width: 600px) 100vw, 600px" /></a><figcaption class="wp-element-caption">গিটহাবে &#8216;releases&#8217; লিংকে ক্লিক করুন</figcaption></figure></div>


<p>রিলিযেয পাতায় Create a new Release&nbsp;বোতামে ক্লিক করুন।</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-create-new-release-tutsnano.png" rel="attachment wp-att-999"><img decoding="async" width="503" height="246" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-create-new-release-tutsnano.png" alt="রিলিয পর্দায় 'Create a new release' বোতামে ক্লিক করুন" class="wp-image-999" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-create-new-release-tutsnano.png 503w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-create-new-release-tutsnano-300x147.png 300w" sizes="(max-width: 503px) 100vw, 503px" /></a><figcaption class="wp-element-caption">রিলিয পর্দায় &#8216;Create a new release&#8217; বোতামে ক্লিক করুন</figcaption></figure></div>


<p>রিলিয নোট পাতায় রিলিয নোট লিখে শেষ করুন।</p>


<div class="wp-block-image">
<figure class="alignright"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-fill-up-release-note-tutsnano.png" rel="attachment wp-att-1000"><img decoding="async" width="300" height="270" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-fill-up-release-note-tutsnano-300x270.png" alt="রিলিয নোট লিখুন" class="wp-image-1000" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-fill-up-release-note-tutsnano-300x270.png 300w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-fill-up-release-note-tutsnano.png 600w" sizes="(max-width: 300px) 100vw, 300px" /></a><figcaption class="wp-element-caption">রিলিয নোট লিখুন</figcaption></figure></div>


<p><strong>&#8220;Tag version&#8221;</strong> হলো সংস্করণের নাম্বার, অর্থাৎ যে সংস্করণটি রিলিয করতে যাচ্ছেন আপনি, আমাদের ক্ষেত্রে যেমন ব্যাপারটা হলো 1.0.0। <strong>&#8220;Release title&#8221;</strong>&nbsp;যেকোনো কিছু&nbsp;হতে পারে, আপনি যা দিয়ে এই রিলিযটাকে সূচিত করতে চান আরকি। উদাহরণ হিসেবে বলা যায়, ওয়ার্ডপ্রেস তাদের রিলিযগুলো একেকজন জ্যায শিল্পীর নামানুসারে করে থাকে, তো আপনার ক্ষেত্রে এটা যেকোনো কিছু হতে পারে। আমরা নাম দিতে পারি &#8220;প্রথম রিলিয&#8221;, কিংবা &#8220;প্রাথমিক রিলিয&#8221;, কিংবা &#8220;আন্তর্জাতিক রিলিয&#8221; ইত্যাদি যেকোনো কিছুই।</p>



<p><strong>বিবরণ</strong>&nbsp;অংশে মার্কডাউন দিয়ে রিলিয সম্পর্কে বিস্তারিত লিখতে পারবেন। কিন্তু রিলিযের ফিচার সংশ্লিষ্ট তথ্যাদি দিয়ে যথোপযুক্ত রিলিয নোটই লিখতে উৎসাহিত করা হচ্ছে।&nbsp;আপনি প্রাকদর্শনও দেখতে পারবেন।</p>



<p>এটা যদি আপনার প্রাক-রিলিয হয়ে থাকে, যা আসলে আনুষ্ঠানিক কোনো রিলিয না, কিংবা [মোটামুটি প্রস্তুতই], পরীক্ষা করার জন্য, কিংবা ডেভলপমেন্ট পরখ করার জন্য ইত্যাদি ক্ষেত্রে, আপনি চাইলে:</p>



<blockquote class="wp-block-quote">
<p>This is a pre-release checkbox.</p>
</blockquote>



<p>লেখা চেকবাক্সটি&nbsp;চেক করে দিতে পারেন।</p>



<p>আপনি এই মুহূর্তে প্রকাশ করতে চাচ্ছেন না? চাইলে, রিলিযের তথ্যগুলো খসড়া আকারে সংরক্ষণ করেও রেখে দিতে পারেন।&nbsp;কিংবা চাইলেই এক ক্লিকে প্রকাশও করে ফেলতে পারেন। আপনার রিলিয যেকোনো সময় সম্পাদনা কিংবা হালনাগাদও করতে পারেন।তো, আপনার রেপোযিটোরি/প্রোজেক্ট এখন প্রকাশিত।</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-released-tutsnano.png" rel="attachment wp-att-1001"><img decoding="async" width="300" height="236" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-released-tutsnano-300x236.png" alt="সংস্করণটি গিটহাবে রিলিয দেয়া হয়েছে" class="wp-image-1001" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-released-tutsnano-300x236.png 300w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-released-tutsnano.png 504w" sizes="(max-width: 300px) 100vw, 300px" /></a><figcaption class="wp-element-caption">সংস্করণটি গিটহাবে রিলিয দেয়া হয়েছে</figcaption></figure></div>


<h4><strong>বাইনারি ফাইল যোগ</strong></h4>



<p>রিলিয নোটে বাইনারি ফাইল আবার কী জিনিস? ধরা যাক, আপনার রিলিযে একটা এক্সেকিউটেবল ফাইল রয়েছে, সেক্ষেত্রে আপনি চাইলে সেটাকে এই স্থানে যোগ করে দিতে পারেন, শ্রেফ টেনে ছেড়ে দিয়ে&#8230;। ধরা যাক, আপনি খুবই সাধারণ একটা পিএইচপি কিংবা এইচটিএমএল/সিএসএস প্রোজেক্ট রিলিয দিতে চান, সেক্ষেত্রে শ্রেফ ফাইলগুলো কমপ্রেস করে এখানে যোগ করে দিতে পারেন।</p>



<p>সত্যি বলতে কি, এটা আপনার প্রোজেক্টের ঐ ভার্ষনের ফাইলগুলো, যেখানে অবাঞ্ছিত ফাইল কিংবা কোনো অবাঞ্ছিত কোড নেই।</p>



<p>তো, কিভাবে একটা বাইনারি ফাইল বানানো যায়? আসলে, সেটা আপনার প্রোজেক্টের ধরণই নির্ধারণ করে দিবে। স্ক্রিপ্টিং ল্যাঙ্গুয়েজের (যেমন: পিএইচপি) কোনো প্রোজেক্টের ক্ষেত্রে আমার পছন্দ হলো রেপোযিটোরির বিদ্যমান অবস্থার (যা আসলে আপনার রিলিয পাবার উপযুক্ত কোডের সংকলন) একটা যিপ সংস্করণ নামিয়ে নেয়া। এই কাজটা গিটহাবে খুব সহজে করা যায়, রেপোযিটোরির ডান দিকের &#8220;Download Zip&#8221; বোতামে ক্লিক করে খুব সহজে পুরো রেপোযিটোরি কমপ্রেস্‌ড অবস্থায় নামিয়ে নেয়া যায়।</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-download-the-zip-tutsnano.png" rel="attachment wp-att-1002"><img decoding="async" width="996" height="40" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-download-the-zip-tutsnano.png" alt="রেপোযিটোরিটা যিপ আকারে নামিয়ে নিন" class="wp-image-1002" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-download-the-zip-tutsnano.png 996w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-download-the-zip-tutsnano-300x12.png 300w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-download-the-zip-tutsnano-768x31.png 768w" sizes="(max-width: 996px) 100vw, 996px" /></a><figcaption class="wp-element-caption">রেপোযিটোরিটা যিপ আকারে নামিয়ে নিন</figcaption></figure></div>


<p>এভাবে ডাউনলোড করলে আপনার রেপোযিটোরির সব গিট রিভিশন ইতিহাস বাদ দিয়ে আপনার প্রোজেক্টটা তার সর্বনিম্ন ফাইল আকারে নেমে আসে। আপনি চাইলে এথেকেও ডেভলপমেন্ট সংক্রান্ত অতিরিক্ত ফাইলসমূহ কিংবা ফোল্ডার ডিলিট করে নিতে পারেন।</p>



<p>তো, রেপোযিটোরিটা খুব সহজে ডাউনলোড করে নিন, আর <code>.zip</code>&nbsp;ফাইলটা আপনার রিলিযের সাথের বাইনারি ফাইল হিসেবে যোগ করে দিন। আমরা এবারে আমাদের আগে প্রকাশ করা রিলিযটাকেই সম্পাদনা করে দেখাচ্ছি:</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-attach-binaries-tutsnano.png" rel="attachment wp-att-1003"><img decoding="async" width="600" height="118" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-attach-binaries-tutsnano.png" alt="রিলিযের সাথে বাইনারি ফাইলসমূহ যোগ করুন" class="wp-image-1003" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-attach-binaries-tutsnano.png 600w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-attach-binaries-tutsnano-300x59.png 300w" sizes="(max-width: 600px) 100vw, 600px" /></a><figcaption class="wp-element-caption">রিলিযের সাথে বাইনারি ফাইলসমূহ যোগ করুন</figcaption></figure></div>


<p>পরখ করে দেখার জন্য আমরা এবারে এটাকে&nbsp;<em>Pre-release</em>&nbsp;চেকবাক্সে ক্লিক করে প্রাকরিলিয বানিয়ে নিলাম।</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-released-prerelease-tutsnano.png" rel="attachment wp-att-1004"><img decoding="async" width="300" height="268" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-released-prerelease-tutsnano-300x268.png" alt="রিলিযটাকে প্রাকরিলিয করে দেখা যাক" class="wp-image-1004" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-released-prerelease-tutsnano-300x268.png 300w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-released-prerelease-tutsnano.png 486w" sizes="(max-width: 300px) 100vw, 300px" /></a><figcaption class="wp-element-caption">রিলিযটাকে প্রাকরিলিয করে দেখা যাক</figcaption></figure></div>


<p>আমরা আমাদের <code>xyz.zip</code> বাইনারি ফাইলটা যোগ করেছি, এবং খুব সহজেই আমাদের ব্যবহারকারীদের কাছে এই zip ফাইলের পাথটা ছড়িয়ে দিতে পারি, যাতে তাঁরা ডাউনলোড করে নিতে পারেন আমাদের রিলিয করা পণ্যটি। এই পাথটা মোটামুটি এরকম হয়:</p>



<pre class="wp-block-preformatted">https://github.com/username/repo/releases/download/1.0.0/xyz.zip</pre>



<h4><strong>বাইনারিগুলো কেন</strong></h4>



<p>বাইনারি ফাইল ছাড়াও যেকেউই আপনার রিলিয করা সংস্করণটা খুব সহজেই ডাউনলোড করতে পারেন &#8220;<strong>Source Code</strong>&nbsp;(zip)&#8221;-এ ক্লিক করেই। কিন্তু এই যিপ ফাইলটা ডাউনলোড করলে:</p>



<ul>
<li>আপনার ব্যবহারকারীদের কাছে অপ্রয়োজনীয়ভাবেই গিট রিভিশনের ইতিহাসগুলোও চলে যায়</li>



<li>আর, আপনি চাইলেও, কোনো রিলিয ঠিক কতবার ডাউনলোড হলো, তার কোনো সংখ্যাও আপনি পাবেন না</li>
</ul>



<p>হ্যা, শুধুমাত্র একটা বাইনারি ফাইলই আপনার রিলিযের <strong>ডাউনলোডের পরিমাণ</strong>&nbsp;জানান দিতে সক্ষম।</p>



<h3>ডাউনলোডের হিসাব পান</h3>



<p>আপনি যদি আপনার গিটহাবের রেপোযিটোরির এপিআই ইউআরএল ব্রাউয করেন, তাহলে আপনি আপনার রিলিযের আদ্যোপান্ত JSON আকারে দেখতে পাবেন (শুধুমাত্র ব্যবহারকারী নাম আর রেপোযিটরির নামটা বদলে নিতে হবে):</p>



<pre class="wp-block-preformatted">https://api.github.com/repos/[username]/[repo-name]/releases</pre>



<p>এবং আমরা জানি, জেকুয়েরির&nbsp;<code>getJSON</code>&nbsp;মেথড কাজে লাগিয়ে, আমরা আমাদের রিলিযের ডাউনলোডের সংখ্যা খুব সহজেই পেতে পারি।</p>



<pre class="wp-block-preformatted">$.getJSON("https://api.github.com/repos/someone/kauwa-kala/releases").done(function (json) {
&nbsp;&nbsp;&nbsp; var release = json[0];
&nbsp;&nbsp;&nbsp; console.log(release);
&nbsp;&nbsp;&nbsp; console.log(release.assets[0].download_count);
});</pre>



<h3>ইতি কথা</h3>



<p>তো, আপনার প্রোগ্রাম, প্রোজেক্ট কিংবা রেপোযিটোরি খুব সহজেই গিটহাবে রিলিয করতে পারেন, এবং রিলিযপ্রতি আপনার পণ্যের ডাউনলোডের পরিমাণও জানতে পারেন। সুতরাং, গিটহাবে শ্রেফ রেপোযিটোরিই নয়, আপনার গুছিয়ে আনা রেপোযিটোরিটি পণ্য আকারে রিলিযও করতে থাকুন। <img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p><strong>&#8211; মঈনুল ইসলাম</strong><br><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f517.png" alt="🔗" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a rel="noreferrer noopener" href="https://mayeenulislam.github.io/" target="_blank">mayeenulislam.github.io</a></p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/releasing-github-project/">কিভাবে গিটহাবে প্রোজেক্ট রিলিয করতে হয়</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mayeenulislam.github.io/tuts/releasing-github-project/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ওয়ার্ডপ্রেস মাল্টিসাইটে নিজস্ব সাইনআপ পাতা তৈরির কৌশল</title>
		<link>https://mayeenulislam.github.io/tuts/custom-signup-wordpress-multisite/</link>
					<comments>https://mayeenulislam.github.io/tuts/custom-signup-wordpress-multisite/#comments</comments>
		
		<dc:creator><![CDATA[মঈনুল ইসলাম]]></dc:creator>
		<pubDate>Tue, 01 Mar 2016 17:14:57 +0000</pubDate>
				<category><![CDATA[ওয়ার্ডপ্রেস টিউটোরিয়াল]]></category>
		<category><![CDATA[ওয়েব ডেভলপমেন্ট টিউটোরিয়াল]]></category>
		<category><![CDATA[জ্ঞান-স্তরভিত্তিক টিউটোরিয়াল]]></category>
		<category><![CDATA[থিম টিউটোরিয়াল]]></category>
		<category><![CDATA[প্লাগইন টিউটোরিয়াল]]></category>
		<category><![CDATA[মাধ্যমিক স্তরের টিউটোরিয়াল]]></category>
		<category><![CDATA[মাল্টিসাইট টিউটোরিয়াল]]></category>
		<guid isPermaLink="false">https://mayeenulislam.github.io/tuts/?p=894</guid>

					<description><![CDATA[<p> [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/custom-signup-wordpress-multisite/">ওয়ার্ডপ্রেস মাল্টিসাইটে নিজস্ব সাইনআপ পাতা তৈরির কৌশল</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="has-text-align-center has-background" style="background-color:#c2ecdb">A brief <strong>English version </strong>of this article is available at this <a rel="noreferrer noopener" href="http://wordpress.stackexchange.com/q/219271/22728" target="_blank">WordPress Development StackExchange thread</a></p>



<p>ওয়ার্ডপ্রেসে আমরা সচরাচর একক সাইট পরিচালনা করি, অর্থাৎ সেখানে একটা ইন্সটলেশনে একটাই সাইট চলে। কিন্তু ওয়ার্ডপ্রেস তার একটা ইন্সটলেশনে একাধিক সাইট চালানোরও একটা সুযোগ দিয়ে রেখেছে, আর তা হলো ওয়ার্ডপ্রেস মাল্টিসাইট। প্রথমদিকে ওয়ার্ডপ্রেস মাল্টিসাইট WordPress MU নামে কাজ শুরু করলেও তা পরবর্তিতে ওয়ার্ডপ্রেস কোর-এ অন্তর্ভুক্ত করা হয়। এবং বলা যায়, সবচেয়ে বড় ওয়ার্ডপ্রেস মাল্টিসাইট ইন্সটলেশন হচ্ছে WordPress.com, যেখানে আপনি চাইলেই বিনামূল্যে একটা ব্লগ খুলে ফেলতে পারেন।</p>



<p>ওয়ার্ডপ্রেস মাল্টিসাইট তুলনামূলক কম জনপ্রিয় এবং এর রিসোর্সও কম পাওয়া যায়, কারণ এর ব্যবহারকারী কম। আবার, যেহেতু মাল্টিসাইটের আর্কিটেকচার ভিন্ন, তাই অনেক প্লাগইনই ওয়ার্ডপ্রেস মাল্টিসাইটে চলে না। কিংবা হয়তো&nbsp;অধিকাংশ মানুষই এই ভিন্ন আর্কিটেকচারের সুযোগটা নিতে জানেন না। আপনার একাধিক ভাষায় ওয়েবসাইট দরকার, সাবডোমেইন কিংবা সাবফোল্ডার করে সেখানে একাধিক ওয়ার্ডপ্রেস ইন্সটল করেই আপনি কাজ সেরে ফেলছেন &#8211; এরকম ঘটনা অহরহ ঘটে। কিন্তু যিনি এই সুবিধাটা সম্পর্কে ওয়াকিবহাল, এবং চ্যালেঞ্জটা নিতে আগ্রহী, তিনি আসলে সুযোগটা নিতে চান, এবং তখনই ওয়ার্ডপ্রেসের মাল্টিসাইট বা একই ওয়ার্ডপ্রেসে একাধিক আলাদা সত্ত্বার সাইটের জন্ম হয়।</p>



<p>যাহোক, এবারে মূল কথায় আসা যাক-</p>



<h3>মাল্টিসাইটের রেজিস্ট্রেশন পাতা</h3>



<p>কিন্তু ওয়ার্ডপ্রেসে মাল্টিসাইট ইন্সটল করা হলে খুব বিরক্তি উদ্রেক করে যে ব্যাপারটা, তা হলো এর ব্যবহারকারী রেজিস্ট্রেশন পাতাটা। সাধারণত ওয়ার্ডপ্রেস সিঙ্গেল সাইটের রেজিস্ট্রেশন পাতাটা পাওয়া যায় এই ঠিকানায়:</p>



<pre class="wp-block-preformatted">https://example.com/wp-login.php?action=register</pre>



<p>আপনি যদি একটা ওয়ার্ডপ্রেস ইন্সটলেশন ফোল্ডার খুলে দেখেন, তাহলে রুট ফোল্ডারেই (অর্থাৎ যেখানে সাধারণত <code>wp-config.php</code> ফাইলটা থাকে) <code>wp-login.php</code> নামে একটা ফাইল দেখবেন, এটাই সেটা।</p>



<p>কিন্তু ওয়ার্ডপ্রেস মাল্টিসাইট এই পাতা থেকে রেজিস্ট্রেশন করে না। মাল্টিসাইট ইন্সটল করা হলে তখন রেজিস্ট্রেশন পাতা হয় এই ঠিকানায়:</p>



<pre class="wp-block-preformatted">https://example.com/wp-signup.php</pre>



<p>যেখানে এইমাত্র <code>wp-login.php</code> ফাইলটা দেখেছেন, সেখানেই আপনি <code>wp-signup.php</code> ফাইলটাও পাবেন। যখনই আপনি &#8220;নিবন্ধন&#8221; (Register/ Sign up) লেখা কোনো লিংকে ক্লিক করবেন, ওয়ার্ডপ্রেস মাল্টিসাইট আপনাকে এই সাদামাটা পাতাটায় নিয়ে আসবে, যা অনেকেই পছন্দ করেন না।</p>



<p>এই পাতাটা অপছন্দ করার কারণগুলোর মধ্যে অন্যতম হলো এর মধ্যে কোনো স্টাইল করা থাকে না। আর দ্বিতীয়ত হলো, এই পাতায় যা যা ত্রুটি কিংবা সফলতার বার্তা দেখায়, সেগুলোকে ফিল্টার করে বদলে নেয়া যায় না। এজন্যই বিকল্প খোঁজা&#8230;</p>



<p>আজকে আমরা এই পাতাটিকে পাল্টে ফেলে নিজস্ব একটি সাইনআপ পাতা এর জায়গায় বসিয়ে দিতে হয় কিভাবে, তা-ই দেখবো। মনে রাখতে হবে, এজন্য আমরা যে কাজগুলো করছি না:</p>



<ul>
<li>আমরা <code>.htaccess</code> ফাইলে কোনো হাত দিচ্ছি না,</li>



<li>আমরা আলাদা কোনো প্লাগইন ব্যবহার করছি না, এবং</li>



<li>অতি অবশ্যই আমরা ওয়ার্ডপ্রেসের কোনো কোর ফাইলে হাত দিচ্ছি না</li>
</ul>



<span id="more-894"></span>



<h3>নিজস্ব সাইনআপ পাতা</h3>



<p>এই জ্ঞানার্জনে প্রাথমিকভাবে সহায়তা নিয়েছিলাম নিচের দুটি পাতার:</p>



<ol>
<li><a href="https://www.chriswiegman.com/2010/02/using-a-custom-wp-signup-page-with-wordpress-mu/" target="_blank" rel="noopener">Using a Custom wp-signup Page With WordPress MU^</a> &#8211; <em>Chris Wiegman</em></li>



<li><a href="https://wordpress.org/support/topic/individual-mu-registration-page-possible?replies=7#post-1711143" target="_blank" rel="noopener">individual MU Registration Page possible?^</a> &#8211; <em>David Sader</em></li>
</ol>



<p>কিন্তু এই দুটো রিসোর্স সম্পূর্ণ ছিল না, এবং কোনো কোনো ক্ষেত্রে তাতে ত্রুটি (bug) ছিল। তাই এসময় আমাকে আন্তরিকতার সাথে সহায়তা করেছেন কিংবা সত্যি বলতে কি পথ দেখিয়েছেন জার্মানির <a href="https://twitter.com/thefuxia" target="_blank" rel="noopener">@thefuxia</a> (Thomas Scholz) এবং অচেনা&nbsp;majick।</p>



<p>এই আলোচনার আগে ধরে নিচ্ছি আপনাদের ওয়ার্ডপ্রেস ইন্সটলেশনে:</p>



<ul>
<li>মাল্টিসাইট ইন্সটল করা রয়েছে,</li>



<li>সার্ভারে mod_rewrite মড্যুল সক্রিয় আছে, এবং</li>



<li>আপনার ওয়ার্ডপ্রেসের পার্মালিংক ডিফল্ট বা পূর্বনির্ধারিত পার্মালিক নয়</li>
</ul>



<h4><strong>ধাপ ১: নিজস্ব সাইনআপ পাতাটা তৈরি</strong></h4>



<p>চাকা একবার আবিষ্কার হয়ে গেছে, কেন আবার আবিষ্কার করবো? তাই আমরা ওয়ার্ডপ্রেস কোর থেকে <code>wp-signup.php</code> পাতাটা কপি করে আমাদের থিমের (কিংবা চাইল্ড থিমের) ভিতরে রাখি। এটার নামটা পাল্টে ফেলি যাতে স্বকীয়তা প্রকাশ পায়, ধরা যাক দিলাম: <code>signup.php</code>।</p>



<p>এবারে ফাইলটা কোনো টেক্সট এডিটরে খুলি: এই ফাইলে উপরের দিকে দুটো ফাইল লোড করা আছে, লাইন দুটো হলো:</p>



<pre class="wp-block-preformatted">require( dirname(__FILE__) . '/wp-load.php' );</pre>



<p>এবং</p>



<pre class="wp-block-preformatted">require( dirname( __FILE__ ) . '/wp-blog-header.php' );</pre>



<p>এই লাইন দুটো বন্ধ করে দেয়া যাক, মানে কমেন্ট আউট করে দেই। ফলে লাইন দুটো হয়ে গেল:</p>



<pre class="wp-block-preformatted">// require( dirname(__FILE__) . '/wp-load.php' );</pre>



<p>এবং</p>



<pre class="wp-block-preformatted">// require( dirname( __FILE__ ) . '/wp-blog-header.php' );</pre>



<p>কেন বন্ধ করলাম? &#8230;কারণ হলো, এতক্ষণ <code>wp-signup.php</code> ফাইলটা রুট থেকে লোড হচ্ছিল (থিম লোড হবারও আগে), তখনও ওয়ার্ডপ্রেসের কোনো ফাংশন লোড হয়নি। আর এখন এটাকে থিমের ভিতরে নিয়ে আসার মানে হচ্ছে, থিম যখন লোড হবে তখন এটার অস্তিত্ব প্রকাশ পাবে, এর আগে না। আর থিম যখন লোড হবে তখন ওয়ার্ডপ্রেসের <code>wp-load.php</code> আর <code>wp-blog-header.php</code> দুটো ফাইলই লোড হয়ে যাবে। সুতরাং আবারও ফাইল দুটো লোড করা মানেই পুণর্বার কাজ করা (repeat), এবং কখনও Repeat করা যাবে না (DRY &#8211; Don&#8217;t Repeat Yourself)।</p>



<p>এই ফাইলের আরো দুটো লাইন আছে:</p>



<pre class="wp-block-preformatted">get_header( 'wp-signup' );</pre>



<p>এবং, একেবারে নিচে:</p>



<pre class="wp-block-preformatted">get_footer( 'wp-signup' );</pre>



<p>এই লাইন দুটোকে বদলে আমাদের থিমের হেডার কিংবা নিজস্ব কোনো ব্যতিক্রম হেডার কল করে দেয়া যেতে পারে। আমি আমার থিমে, সাইনআপ পাতার জন্য আলাদা একটি হেডার বানিয়েছি (<code>header-null.php</code>), তাই আমি সেটা যোগ করেছি এপর্যায়ে। তাই, আমার ক্ষেত্রে ব্যাপারটা ছিল:</p>



<pre class="wp-block-preformatted">get_header( 'null' ); //instead of get_header( 'wp-signup' );</pre>



<p>এবং</p>



<pre class="wp-block-preformatted">get_footer( 'null' ); //instead of get_footer( 'wp-signup' );</pre>



<p>ব্যস, আমাদের নিজস্ব সাইনআপ পাতা কিন্তু প্রস্তুত। এবারে এই ফাইলটাকে জায়গামতো কল করিয়ে দিলেই <em>কেল্লা ফতে</em>।</p>



<h4><strong>ধাপ ২: এমইউ প্লাগইন তৈরি</strong></h4>



<p><a href="https://codex.wordpress.org/Must_Use_Plugins" target="_blank" rel="noopener">MU Plugin</a>, এতক্ষণে বুঝে গেছি নিশ্চয়ই, এটা মাল্টিসাইটের সাথে সম্পর্কিত। আসলে এটা মাল্টিসাইটের সাথে সম্পর্কিত ছিল। পরবর্তিতে এর <a href="https://core.trac.wordpress.org/changeset/10737" target="_blank" rel="noopener">প্রয়োজন এখন আর তেমন একটা হয় না</a> বললেই চলে। আর এখানে MU মানে Multisite না, বরং Must Use, অর্থাৎ মাল্টিসাইটের সকল সাইটে আবশ্যকীয়ভাবে এই কোডগুলো লোড করার জন্যই MU Plugin ব্যবহার করা হতো। &#8230;সুতরাং, এখানে আমরা যে কোডগুলো ব্যবহার করবো, সেগুলো নিজস্ব কোনো সাধারণ প্লাগইনে বসিয়ে নিলেও কাজ করবে।</p>



<p>আমরা আমাদের মাল্টিসাইট ইন্সটলেশনের <code>wp-content/</code> ডিরেক্টরির (ফোল্ডার) ভিতরে একটা ডিরেক্টরি তৈরি করি, নাম হবে &#8216;<code>mu-plugins</code>&#8216; (যদি আমরা মাস্ট ইউয প্লাগইনের পাথ বদলে <em>না</em> থাকি)। এবারে এই ডিরেক্টরির ভিতরে একটা ফাইল তৈরি করি, যেকোনো নাম দিয়ে, ধরা যাক দিলাম, <code>mu-signup.php</code>। এবারে এই ফাইলটার মধ্যে লিখি:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/3e332efd44a3388034c3">Gist</a>.
</div></figure>



<p>কোডগুলো বুঝে নেয়া যাক, প্রথম ফাংশনটা <code>wp_signup_location</code> ফিল্টার হুকে হুক করে আসলে যা করছে, তা হলো, ওয়ার্ডপ্রেসের নিজস্ব সাইনআপের যে ইউআরএল প্রথমে আমরা বলেছিলাম, সেটাকে বদলে, আমাদের নিজস্ব যে পাথে আমরা আমাদের সাইনআপ পাতা তৈরি করতে যাচ্ছি, সেখানে ঘুরিয়ে দিবো। যেমন: লগইন পাতার নিচে যে <kbd>Register</kbd> লিংকটা আছে, সেখানে ক্লিক করলে যেন সে আমাদের নিজস্ব সাইনআপ পাতায় নিয়ে আসে, সেটা তাকে বলে দিলাম। এটা আমরা লিখেছি 12 নম্বর লাইনে যে, ওয়ার্ডপ্রেস নেটওয়ার্ক সাইটের ইউআরএল-এর পরেই signup বসালে ইউআরএল যা হবে, সেটাকেই আমাদের মাল্টিসাইটের সাইনআপ ইউআরএল হিসেবে বুঝে নিবে:</p>



<pre class="wp-block-preformatted">https://example.com/signup</pre>



<p>আর দ্বিতীয় ফাংশনটা হচ্ছে একটা <code>wp_redirect()</code>। কেউ যদি মাল্টিসাইটের নিজস্ব সাইনআপ ইউআরএল পাতার লিংক (<code>/wp-signup.php</code>) টাইপ করে, তাকেও যেন ঐ পাতা থেকে সরিয়ে আমাদের নিজস্ব সাইনআপ পাতায় (<code>/signup</code>) নিয়ে আসে। অনেকেই এই কাজটুকু <code>.htaccess</code> ফাইল এডিট করে, করে থাকেন (যেমন ক্রিস-এর প্রথম লিংকটাতে দেখতে পাবেন)। কিন্তু আমরা এই কাজটার জন্য <code>.htaccess</code> এডিট করার ঝামেলায় যাইনি।</p>



<p>অর্থাৎ, এপর্যন্ত করা হয়ে গেলে, লোকজন, ওয়ার্ডপ্রেসের পূর্বনির্ধারিত সাইনআপ পাতা না দেখে, আমাদের নিজস্ব ইউআরএল-এ চলে আসবে &#8211; এতটুকু আমরা করে ফেলেছি। (<img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f44f.png" alt="👏" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>হাততালি</em>)</p>



<p>বাকিটুকু আমরা দুভাবে করতে পারি:</p>



<ol>
<li>সহজ পদ্ধতি: পেজ টেমপ্লেট তৈরি করে</li>



<li>ঘাঁটাঘাঁটি পদ্ধতি: রিরাইট এন্ডপয়েন্ট তৈরি করে</li>
</ol>



<p>পছন্দটা আপনার, আপনি কিভাবে করতে চান&#8230; তবে দুটোই করা যাবে না। যেকোনো একটা।</p>



<h4><strong>ধাপ ৩: সহজ পদ্ধতি: পেজ টেমপ্লেট তৈরি:</strong></h4>



<p>আমরা থিমের ভিতরে যে <code>signup.php</code> ফাইলটা [ওয়ার্ডপ্রেস কোর থেকে কপি করে] বানিয়েছিলাম, সেটা টেক্সট এডিটরে খুলে এক্কেবারে উপরে আমরা কিছু কথা লিখি, যাতে এটা একটা <a href="https://developer.wordpress.org/themes/template-files-section/page-template-files/#creating-custom-page-templates-for-global-use" target="_blank" rel="noopener">পেজ টেমপ্লেট^</a> হয়ে যায়:</p>



<pre class="wp-block-preformatted">&lt;?php
/**
* Template name: tuts nano signup
*/</pre>



<p>পাতার এক্কেবারে উপরে একটা পিএইচপি শুরুর ট্যাগ দিয়ে শুরু হয়েছে, সেটার ঠিক পরেই এই কথাটা লিখে দেয়া যাক। আপনাদের যা ইচ্ছা নাম দিতে পারেন, তবে বোধগম্য এবং অবিরোধপূর্ণ নাম দিবেন আশা করি। সংরক্ষণ করুন ফাইলটা।</p>



<p>এবারে, ওয়ার্ডপ্রেসের অ্যাডমিন প্যানেলে একটা পাতা তৈরি করি, যার নাম দিই Signup এবং slug হিসেবে দিই <code>signup</code>। এবারে পেজ টেমপ্লেট হিসেবে মাত্র তৈরি করা tuts nano signup [কিংবা আপনাদের দেয়া নামের] টেমপ্লেটটা বাছাই করে দিন। পাতাটা সংরক্ষণ করুন।</p>



<p>কাজ শেষ। 🙂</p>



<p><strong>ধাপ ৩: ঘাঁটাঘাঁটি পদ্ধতি: রিরাইট এন্ডপয়েন্ট তৈরি:</strong></p>



<p>বলেছি যেকোনো একটা পদ্ধতি করতে। যদি &#8216;সহজ পদ্ধতি&#8217; করে ফেলেন, তাহলে আগের অবস্থায় ফেরত যান, যা করেছেন মুছে ফেলুন, এবারে এই পদ্ধতিতে করে দেখা যাক:</p>



<p>একাজে আমাদেরকে সহায়তা করতে পারবে এই ডিবাগিং প্লাগইনটি:</p>



<ul>
<li><a href="https://wordpress.org/plugins/rewrite-rules-inspector/" target="_blank" rel="noopener"><strong>Rewrite Rules Inspector</strong>^</a> &#8211; WordPress.org Plugins, <em>Daniel Bachhuber</em> and his team</li>
</ul>



<p>ইন্সটল করে সক্রিয় করে নেয়া যেতে পারে। না করলেও ক্ষতি নেই। কিন্তু কী ঘটছে, কিভাবে ঘটছে, দেখলেই না শেখা হয়&#8230;। এবারে আমাদের থিমের <code>functions.php</code>-তে এই কোডগুলো বসিয়ে নেয়া যাক:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/3e332efd44a3388034c3">Gist</a>.
</div></figure>



<p>প্রথম ফাংশনটা দিয়ে আমরা একটা এন্ডপয়েন্ট যোগ করছি, মানে ইউআরএল-এর শেষে একটা লেজ যোগ করছি। এই লেজটাতো হাতে লিখেই যোগ করা যায়, যেমন: <code>example.com/kauwa</code>; হ্যা, ঠিক, কিন্তু আসলে এই লেজ, সেই লেজ না। এই লেজটা ডায়নামিকভাবে প্রোগ্রামের মাধ্যমে কাজ করবে &#8211; ওয়ার্ডপ্রেসের কাছে এর একটা অর্থ থাকবে। আমরা যে লেজটা যোগ করেছি, তা হলো: signup। অর্থাৎ, আমাদের ডোমেইন নামের শেষে লেজটা যোগ হয়ে ডায়নামিক ইউআরএলটা হবে:</p>



<pre class="wp-block-preformatted">https://example.com/signup</pre>



<p>যেহেতু রিরাইট র&#x200d;্যুল ফ্লাশ না করলে নতুন মান নিবে না, তাই হাসিন হায়দার&nbsp;ভাইয়ের অনুকরণে, আমরা একবার, হ্যা, একবার রিরাইট র&#x200d;্যুলটা ফ্লাশ করেছি। এটা ম্যানুয়ালিও করা যায়, সেটা পরে বলছি।</p>



<p>এবারে দ্বিতীয় ফাংশনটা দিয়ে আমরা বলে দিচ্ছি যে, যখন তোমার ইউআরএল থেকে query_variable হিসেবে &#8216;signup&#8217; পাবে, তখন যে টেমপ্লেট তুমি দেখাবে বলে ঠিক করেছিলে, সেটার বদলে তুমি আমাদের বলে দেয়া টেমপ্লেটটা দেখাবে। এবং আমরা, ঐ যে, প্রথমে কোর থেকে কপি করে ফাইলটা তৈরি করেছিলাম, সেই ফাইলটার পাথ, ফাংশনটার ভিতরে দেখিয়ে দিয়েছি।</p>



<p>ব্যস, কাজ শেষ। আমরা, পূর্বনির্ধারিত পাতা থেকে ব্যবহারকারীদের আমাদের পাতায় রিডিরেক্ট করে নিয়ে এসেছি। ওয়ার্ডপ্রেসের নিবন্ধন ইউআরএল বদলে দিয়েছি। আমাদের কাঙ্ক্ষিত প্যারামিটার (লেজ) যোগ করেছি। এবং সেই লেজে গেলে যে আমাদের তৈরি করা ফাইলটা দেখাবে তাও বলে দিয়েছি। সুতরাং এবারে পরীক্ষা করে দেখাই যায়, কী করেছি আমরা। ব্রাউযারে টাইপ করুন আপনার নির্ধারিত সাইনআপ পাতার ইউআরএল:</p>



<pre class="wp-block-preformatted">https://example.com/signup</pre>



<p>দুঃখিত! কাজ করছে না। হয় 404 টেমপ্লেট দেখাচ্ছে, নয়তো প্রথম পাতায় নিয়ে গেছে। কেন হচ্ছে এমন? সব তো ঠিকই আছে। আপনি ঠিকই <code>/signup</code> লেজও যোগ করেছেন।</p>



<p><span style="text-decoration: underline;"><strong>রিরাইট র&#x200d;্যুল্‌স ফ্ল্যাশ করা:</strong></span> এই অবস্থায় দেখা না যাওয়ার একটা কারণ হতে পারে আপনার রিরাইট র&#x200d;্যুল্‌স ফ্লাশ করা হয়নি। এজন্য যেটা করতে হবে, যে প্লাগইনটা ইন্সটল করতে বলেছিলাম, সেটাতে গেলেই উপরে ডানে <kbd>Flush Rules</kbd> বোতাম চেপে কাজটা করা যায়। আর যদি প্লাগইনটা ইন্সটল না করে থাকেন, সেক্ষেত্রে Settings » Permalinks-এ গিয়ে কোনো পরিবর্তন না করে একবার সংরক্ষণ বোতাম চাপুন।</p>



<p>তবু দেখা যাচ্ছে না, তাই না? লেজের পরে আরেকটা লেজ লাগালে কী হয়, দেখি তো? লিখলাম: <code>example.com/signup/asd</code>, এবং নিমিষেই আমাদের কাঙ্ক্ষিত টেমপ্লেটটা লোড হয়ে গেল।</p>



<p>সমস্যাটা আসলে অন্য জায়গায়, এবং একটা সমস্যা ঠিকই আছে।</p>



<p><span style="text-decoration: underline;"><strong>ঐচ্ছিক:</strong></span> পরীক্ষা করার জন্য, দ্বিতীয় ফাংশনটার ভিতরে <code>if(!is_admin()) {</code> লেখাটার ঠিক আগে লিখুন: <code>echo get_query_var('signup');</code> এবং ফাইলটা সংরক্ষণ করে এসে রিফ্রেশ করে দেখুন তো কিছু দেখা যায় কিনা ব্রাউযারে। টেমপ্লেটটার উপরে asd লেখাটা দেখাচ্ছে। এর মানে, <code>?signup=asd</code> ভ্যালুটা দেখাচ্ছে। যদি আমরা <code>asd</code> মুছে ফেলি, তাহলে আবারও 404 কিংবা প্রথম পাতা দেখাচ্ছে এবং কোনো লেখা ইকো হচ্ছে না। অর্থাৎ query_variable-টা কোনো মান পাচ্ছে না। <em>echo &#8230;</em> লেখাটুকু মুছে ফেলি, আমাদের পরীক্ষা শেষ।</p>



<p>কারণটা হলো:</p>



<blockquote class="wp-block-quote">
<p>যেহেতু <code>add_rewrite_endpoint()</code> তার প্যারামিটারের মান প্রত্যাশা করছে, অথচ আমরা কোনো মান দিচ্ছি না, সে আসলে <code>null</code>&nbsp;মানকে&nbsp;<code>false</code> হিসেবে ধরে নিচ্ছে। অবস্থাটা দাঁড়াচ্ছে: <code>example.com?signup=false</code>। এমতাবস্থায় কোনো টেমপ্লেট লোড করার প্রশ্নই উঠে না। এই সমস্যাটার সমাধান করতে আমাদেরকে <code>request</code>-এ হুক করে ওর জন্য একটা মান সেট করে দিয়ে আসতে হবে। (<a href="https://www.pmg.com/blog/a-mostly-complete-guide-to-the-wordpress-rewrite-api/" target="_blank" rel="noopener">ব্যাখ্যার উৎস^</a>)</p>
</blockquote>



<p>Thomas Scholz বলছেন, এটা ওয়ার্ডপ্রেসের রিরাইট এপিআই-এর একটা ত্রুটি (bug)।</p>



<p>যাহোক, এর সমাধানও আছে। সমাধান, যেমনটা ক্রিস্টোফার ড্যাভিস বলেছেন, এর সমাধান করতে নিচের কোডটুকু <code>functions.php</code>-তে যোগ করে নিতে হবে, এতে মানটা আর <code>false</code> আসবে না, বরং <code>true</code> আসবে:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/3e332efd44a3388034c3">Gist</a>.
</div></figure>



<p>&#8230;এবং আমাদের কাঙ্ক্ষিত টেমপ্লেটও লোড হবে।</p>



<h4><strong>ধাপ ৪: বার্তাগুলো দেখানোর ব্যবস্থা</strong></h4>



<p>সব সুন্দর মতো হয়ে গেলেও আরো একটা ছোট্ট কাজ বাকি আছে। আপনি যখন এই সাইনআপ ফর্মে কোনো কিছু না লিখে <kbd>পরবর্তি</kbd> (<kbd>next</kbd>)&nbsp;বোতামে ক্লিক করবেন, তখন কিন্তু সাইনআপও হবে না আবার কোনো ত্রুটি বার্তাও দেখাবে না। এর কারণ, ফর্মটা সাবমিট হচ্ছে <code>wp-signup.php</code> পাতায়, আর সেখানেই ত্রুটি বার্তা দেখাচ্ছে, আর আমরা সেখান থেকে <code>wp_redirect()</code> চালিয়ে ব্যবহারকারীকে আমাদের পাতায় ঘুরিয়ে আনছি, ফলে ত্রুটি বার্তাগুলো হারিয়ে যাচ্ছে।</p>



<p>খুব ছোট্ট একটা ফিক্স দরকার। আমরা যে <code>signup.php</code> ফাইলটা বানিয়েছিলাম নিজের মতো করে, সেই ফাইলটাতে থাকা তিনটা <code>&lt;form&gt;</code> ট্যাগের সাবমিশন অ্যাকশন অংশটা বদলে দিতে হবে। ফাইলের মধ্যে অনুসন্ধান করতে পারেন:&nbsp;<code>action="wp-signup.php"</code> লিখে। তাহলে ফর্ম ট্যাগগুলোর <code>action="wp-signup.php"</code>-এর জায়গায় লিখা যাক:</p>



<pre class="wp-block-preformatted">action=""</pre>



<p>অথবা লেখা যাক:</p>



<pre class="wp-block-preformatted">action="&lt;?php echo esc_url($_SERVER['REQUEST_URI']); ?&gt;"</pre>



<p>ব্যস। কাজ শেষ। এতে আমাদের ফর্মটা এই পাতায়ই সাবমিট হবে এবং ত্রুটি কিংবা সফলতার বার্তাও সে অনুযায়ী দেখাবে। আমাদের কাজ শেষ এবং আমরা সফল।</p>



<h3><strong>স্ক্রিপ্ট&nbsp;যোগ করা</strong></h3>



<p>ওয়ার্ডপ্রেসের পূর্বনির্ধারিত সাইন-আপ পাতা বদলানোর মূল কারণই হলো এর চেহারা। তাই এই নতুন তৈরি পাতায় কিছু স্টাইলিং দেয়া লাগতেই পারে কিংবা কোনো জাভাস্ক্রিপ্ট ভ্যালিডেশন দেয়া লাগতে পারে। সেজন্য ওয়ার্ডপ্রেসের ফ্রন্ট এন্ডে যেভাবে স্টাইলশিট কিংবা স্ক্রিপ্ট যোগ করি আমরা, সেভাবেই স্টাইল করা যেতে পারে। কিংবা সরাসরি ফ্রন্টএন্ডের স্টাইলশিটেও (<code>style.css</code>) স্টাইল করা যেতে পারে। খুবই সহজ:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/3e332efd44a3388034c3">Gist</a>.
</div></figure>



<p>এবারে আপনার স্টাইলশীটে (<code>nanotuts-signup-styles.css</code>) নিজের মতো করে স্টাইল করুন। আপনি বুঝবেন, তবু বলে রাখছি: কন্টেইনারের ক্লাস&nbsp;<code>.mu_register</code> &nbsp;আর ফর্মের আইডি হচ্ছে <code>#setupform</code>। এছাড়া আমাদের তৈরিকৃত <code>signup.php</code> পাতায়&nbsp;<code>wpmu_signup_stylesheet()</code> ফাংশনে দেখবেন কিছু ইন্টার্নাল সিএসএস করা। সেগুলো, প্রয়োজনমতো কাটছাঁট করতেই পারেন এখন।</p>



<p>এবারে এগুলো ধরে&nbsp;অন্তর্বর্তি এলিমেন্টগুলোর জন্য স্টাইল করে নিলেই সব ফকফকা। 🙂</p>



<h3>প্লাগইন না থিম</h3>



<p>আমরা পুরো ব্যাপারটা প্লাগইন আর থিমের একটা ভজকট করেছি। আপনি চাইলে পুরো ব্যাপারটা একটা নিজস্ব প্লাগইনে করে ফেলতে পারেন। কিংবা এমনও হতে পারে, এই জ্ঞানটুকু কাজে লাগিয়ে, বুদ্ধি করে একটা পূর্ণাঙ্গ ডায়নামিক প্লাগইনই বানিয়ে ফেললেন, আর ক&#8217;দিন বাদে আমরা আর এতো বড় নিবন্ধ না দেখিয়ে মানুষকে বলবো, অমুক ভাই/বোন-এর তমুক প্লাগইনটা ইনস্টল করে নেন, <em>সাফা খিরখিরা</em>!&nbsp;<img src="https://s.w.org/images/core/emoji/14.0.0/72x72/270c.png" alt="✌" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<h3>কৃতজ্ঞতা</h3>



<p>আবারও বলছি, এইটুকুতে পথনির্দেশ করার জন্য Thomas Scholz, majick, Chris Wiegman, David Sader, Chris Davis, হাসিন হায়দার ভাই-সহ অন্যান্য সকলের আকুন্ঠ কৃতজ্ঞতা স্মরণ করছি।</p>



<p>এই লেখাটির সংক্ষিপ্ত সংস্করণ ইংরেজিতে পাওয়া যাবে <a href="http://wordpress.stackexchange.com/q/219271/22728" target="_blank" rel="noopener">WordPress Development StackExchange ওয়েবসাইটের এই থ্রেডে^</a>।</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/custom-signup-wordpress-multisite/">ওয়ার্ডপ্রেস মাল্টিসাইটে নিজস্ব সাইনআপ পাতা তৈরির কৌশল</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mayeenulislam.github.io/tuts/custom-signup-wordpress-multisite/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>গিট দিয়ে ভার্ষন নিয়ন্ত্রণ &#8211; git branch</title>
		<link>https://mayeenulislam.github.io/tuts/git-branching/</link>
					<comments>https://mayeenulislam.github.io/tuts/git-branching/#comments</comments>
		
		<dc:creator><![CDATA[মঈনুল ইসলাম]]></dc:creator>
		<pubDate>Sun, 21 Feb 2016 15:45:12 +0000</pubDate>
				<category><![CDATA[গিট টিউটোরিয়াল]]></category>
		<category><![CDATA[জ্ঞান-স্তরভিত্তিক টিউটোরিয়াল]]></category>
		<category><![CDATA[মাধ্যমিক স্তরের টিউটোরিয়াল]]></category>
		<category><![CDATA[গিট]]></category>
		<category><![CDATA[গিট ব্যবহারের কৌশল]]></category>
		<category><![CDATA[গিটহাব]]></category>
		<guid isPermaLink="false">https://mayeenulislam.github.io/tuts/?p=850</guid>

					<description><![CDATA[<p>গিট দিয়ে ভার্ষন নিয়ন্ত্রণ যখন জেনে গেছি, তখন গিট দিয়ে ব্রাঞ্চ বা শাখা তৈরি করার সহজ কিন্তু অপূর্ব আর শক্তিশালী ফিচারটা জেনে নেয়া যায়ই... স্বাগতম</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/git-branching/">গিট দিয়ে ভার্ষন নিয়ন্ত্রণ &#8211; git branch</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>গিট নিয়ে ভয়-ভীতি আমরা এবারে কাটিয়ে উঠেছি। এখন সময় এসেছে এর নতুন নতুন ফিচার জানার। তাই এই ধারাবাহিক আলোচনাকে &#8220;একেবারে প্রাথমিক জ্ঞান&#8221; আর বলছি না, বরং গিট নিয়ে খেলাধুলা বলা যেতে পারে। কিন্তু যারা এখনও গিট নিয়ে ভয়-ভীতি কিংবা দোটানার মধ্যে আছেন, এবারে তাদেরকে অনুরোধ করবো আমাদের পূর্বতন দুটো টিউটোরিয়াল দেখে নেয়ার জন্য, আগে (কথা দিচ্ছি এর চেয়ে সহজ করে কেউ বলবে না কখনও):</p>



<ul>
<li><a href="https://mayeenulislam.github.io/tuts/git-basics-1/" target="_blank" rel="noreferrer noopener">গিট ব্যবহারের একেবারে প্রাথমিক জ্ঞান : পর্ব ১</a>, এবং</li>



<li><a href="https://mayeenulislam.github.io/tuts/git-basics-2/" target="_blank" rel="noreferrer noopener">গিট ব্যবহারের একেবারে প্রাথমিক জ্ঞান : পর্ব ২</a></li>
</ul>



<p>এবারে আমরা জানি গিট কাকে বলে, কত প্রকার, কী কী 🙂 । তাই আজকে আমরা আলোচনা করছি গিট ব্রাঞ্চিং নিয়ে।</p>



<p>অন্যান্য ভার্ষন নিয়ন্ত্রণ সফ্‌টওয়্যারের সাথে গিট-এর পার্থক্য করতে গেলে অনেককেই বলতে শুনি যে, গিটে ব্রাঞ্চিং যথেষ্ট cheap। এই cheap কথাটার&nbsp;মানে যেমন স্বল্প খরচসাপেক্ষ, তেমনি এর দ্বারা বোঝায় এটা যথেষ্ট সহজ, দ্রুত এবং ঝামেলাহীনও। স্বস্তা, কারণ খুব অল্প রিসোর্স ব্যবহার করেই গিট ব্রাঞ্চিং করা যায় অগণিত।</p>



<p>কী এই গিট ব্রাঞ্চিং? ব্রাঞ্চ শব্দটা শুনলেই ব্যাংকের ব্রাঞ্চের কথা মনে হয় না? ঠিকই আছে। ব্রাঞ্চিং সেরকমইতো।&nbsp;এবারে একটা ঘটনা দেখা যাক:</p>


<div class="wp-block-image">
<figure class="alignright"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/git-branching.jpg" rel="attachment wp-att-853"><img decoding="async" width="200" height="300" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/git-branching-200x300.jpg" alt="গিট-এ ব্রাঞ্চিং-এর সহজ চিত্র" class="wp-image-853" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/git-branching-200x300.jpg 200w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/git-branching.jpg 668w" sizes="(max-width: 200px) 100vw, 200px" /></a><figcaption class="wp-element-caption">গিট-এ ব্রাঞ্চিং-এর সহজ চিত্র</figcaption></figure></div>


<p>আমি <strong>মূল রাস্তা</strong> ধরে হাঁটছি। আমার সাথে <strong>২জন</strong>&nbsp;বন্ধু আছেন।</p>



<p>আমি মূল রাস্তা ধরে আরো এক মাইল এগোলাম, এবারে আমার সাথে আরো ২জন&nbsp;বন্ধু যোগ দিলেন।&nbsp;অর্থাৎ মোট বন্ধুর সংখ্যা&nbsp;<strong>৪জন</strong>।</p>



<p>এবারে আমি রাস্তা বদল করলাম। <strong>ডানের গলি</strong>তে ঢুকে গেলাম। এই গলিতে আমি আরো ২জন&nbsp;বন্ধু জুটিয়ে নিলাম। মোট বন্ধু: [আগের] ৪জন + [নতুন] ২জন = <strong>৬জন</strong>।</p>



<p>আরো এক মাইল এগোলাম, আরো ৪জন&nbsp;বন্ধু জুটিয়ে&nbsp;নিলাম, মোট বন্ধু&nbsp;হলেন ৬+৪=<strong>১০জন</strong>।</p>



<p>এমন সময় হঠাৎ, পথে আপনার সাথে দেখা। আপনি জিজ্ঞেস করলেন, আপনি এই রাস্তায় কেন? আপনার মূল রাস্তা কোথায়? আমি বললাম, সেটাতো ফেলে এসেছি। আপনি বললেন, বাহ, দারুণ! ১০জন বন্ধু নিয়ে পথ চলছেন!&nbsp;<strong>মূল রাস্তা</strong>তে&nbsp;আপনার কয় জন বন্ধু&nbsp;ছিলেন? বললাম, ৪জন। কেন, ১০জন নয় কেন? কারণ, বাকি ৬জন যে আমি <strong>ডানের গলি</strong>তে পেয়েছি।</p>



<p>হ্যা, ব্রাঞ্চিং-এর ক্ষেত্রে এই ব্যাপারটাই ঘটে। যতক্ষণ পর্যন্ত আপনি মূল রাস্তা ধরে হাঁটছেন, ততক্ষণ পর্যন্ত যা ঘটেছে, গলিপথে বা শাখা পথে ঢোকার সময় শাখা পথ কিন্তু ততটুকুর খবরই জানে। আর গলিপথে ঢুকে আপনি কতটুকু এগিয়েছেন, কী করেছেন, মূল পথ কিন্তু তার খবর জানে না।</p>



<p>স্বস্তাশ্রেণীর&nbsp;একটা উদাহরণ হয়ে গেল, তবু এটা বুঝলে ব্রাঞ্চিং-এর কিছুটা ধারণা পাওয়া যাবে। &#8230;কথা না বাড়িয়ে এবারে হাত নোংরা করা যাক&#8230;</p>



<p></p>



<span id="more-850"></span>



<h3>গিট ব্রাঞ্চ তৈরি করা</h3>



<p>নিজের কম্পিউটারে&nbsp;একটা ডিরেক্টরি (ফোল্ডার)&nbsp;তৈরি করি test নামে। এই ডিরেক্টরিতে ১টা&nbsp;ফাইল তৈরি করি <code>index.html</code> এবং সেই ফাইলে কিছু একটা লিখে দিই।&nbsp;যা ইচ্ছা লিখতে না চাইলে নিচের মতো লিখে একটা ভ্যালিড HTML ফাইল বানিয়ে নেয়া যেতে পারে:</p>



<pre class="wp-block-preformatted">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
   &lt;head&gt;
      &lt;meta charset="UTF-8"&gt;
      &lt;title&gt;Testing Git Branching&lt;/title&gt;
   &lt;/head&gt;
   &lt;body&gt;
      &lt;h1&gt;Testing Git Branching&lt;/h1&gt;
   &lt;/body&gt;
&lt;/html&gt;</pre>


<div class="wp-block-image">
<figure class="alignright"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/git-init-and-first-commit.png" rel="attachment wp-att-856"><img decoding="async" width="300" height="221" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/git-init-and-first-commit-300x221.png" alt=" গিট রেপোযিটরি তৈরি এবং প্রথম কমিট করা" class="wp-image-856" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/git-init-and-first-commit-300x221.png 300w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/git-init-and-first-commit-768x567.png 768w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/git-init-and-first-commit.png 810w" sizes="(max-width: 300px) 100vw, 300px" /></a><figcaption class="wp-element-caption"><strong>পর্দাদৃশ্য ১:</strong> গিট রেপোযিটরি তৈরি এবং প্রথম কমিট করা</figcaption></figure></div>


<p>ব্রাউযারে <code>index.html</code> ফাইলটা খুললে দেখা যাবে, সাদা দৃশ্যপটে কালো লেখা স্পষ্ট দেখা যাচ্ছে। এবারে সেই ডিরেক্টরি-পাথে git bash চালু করি (মাউসের ডান বোতামে git bash here চেপে &#8211; <a href="https://mayeenulislam.github.io/tuts/git-basics-2/" target="_blank" rel="noreferrer noopener">বিস্তারিত</a>)। যেহেতু এটা শ্রেফ একটা ডিরেক্টরি, তাই একে আগে গিট রেপোযিটোরিতে রূপান্তর করি: ব্যাশ-এ লিখি: <code>git init</code>। ব্যস, আমাদের ১টা ফাইলসমৃদ্ধ ডিরেক্টরিটা একটা গিট রেপোযিটোরিতে বদলে গেলো। আমরা এবারে আমাদের প্রথম commit করি, মানে আক্ষরিক অর্থে ভার্ষন নিয়ন্ত্রণ শুরু করি&#8230;। (দেখুন <strong>পর্দাদৃশ্য ১</strong>)</p>



<p>ভালো করে খেয়াল করে দেখুন, ঠিক প্রথম লাইনটার পরে পরের লাইনগুলোতে কোনো বিশেষ কিছু আপনার চোখে পড়ছে কিনা&#8230; &#8216;<strong><span style="color: #00ccff;">(master)</span></strong>&#8216; কথাটা যোগ হয়েছে প্রথম লাইনের পরে, এবং সেটা প্রতিবারই আপনার সাথে সাথে চলছে।</p>



<p>কী এই master?</p>



<h4><strong>কমান্ড: <code>git branch</code></strong></h4>



<p>কমান্ড দিই:</p>



<pre class="wp-block-preformatted">$ git branch</pre>



<p>অর্থাৎ, আমরা গিটকে বললাম, গিট তোমার ব্রাঞ্চের খবর জানাও। এবারে সে আমাদের দেখাবে:</p>



<pre class="wp-block-preformatted">* master</pre>



<p>আবারো সেই master।&nbsp;মানে সে জানালো, তোমার ব্রাঞ্চ বা শাখা হচ্ছে master। ঠিকইতো আছে, এখনও তো আমি মূল রাস্তায় আছি। তো আমাকে যদি কেউ জিজ্ঞেস করে, কোন রাস্তায়? আমি বলবো, মূল রাস্তায় (master)&nbsp;&#8211;&nbsp;এর বাইরে তো কিছু বলার প্রশ্নই উঠে না, তাই না?</p>



<p>এবারে চলুন আমরা ব্রাঞ্চ তৈরি করে দেখি&#8230; ধরা যাক, আমরা ঠিক করলাম, এবারে আমরা এই প্রোজেক্টে কিছু স্টাইলিং যোগ করবো। কিন্তু মূল প্রোজেক্টটাতে সেই স্টাইলিং নিবো কি নিবো না, তা এখনও সিদ্ধান্ত নিতে পারিনি আমরা। হয়তো, এমন হতে পারে, স্টাইল ছাড়াই প্রোজেক্টটা আমাদের ঠিকই আছে। কিন্তু স্টাইল করলে কেমন লাগবে, সেটা একটু পরখ করে দেখতেও চাচ্ছি। যদি ভালো লেগে যায়, তাহলে কাজে লাগালেও লাগাতে পারি আমরা। &#8230;তো এরকম অবস্থায় আমরা style নামে একটা ব্রাঞ্চ তৈরির সিদ্ধান্ত নিয়েছি।</p>



<h4><strong>কমান্ড: <code>git branch &lt;branch-name&gt;</code></strong></h4>



<p>ব্যাশে লিখলাম:</p>



<pre class="wp-block-preformatted">$ git branch style</pre>


<div class="wp-block-image">
<figure class="alignright"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/git-branching.png" rel="attachment wp-att-865"><img decoding="async" width="300" height="211" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/git-branching-300x211.png" alt="পর্দাদৃশ্য ২: গিট ব্রাঞ্চিং" class="wp-image-865" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/git-branching-300x211.png 300w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/git-branching.png 675w" sizes="(max-width: 300px) 100vw, 300px" /></a><figcaption class="wp-element-caption"><strong>পর্দাদৃশ্য ২:</strong> গিট ব্রাঞ্চিং</figcaption></figure></div>


<p>সে আমাদের কিছু না বললেও আসলে style নামে একটা ব্রাঞ্চ তৈরি করা শেষ। আপনার নামের ডানদিকে, এখনও দেখুন (master) কথাটাই আছে, তার মানে আমরা এখনও master ব্রাঞ্চেই রয়েছি। কিন্তু আমাদেরতো নতুন খোলা style ব্রাঞ্চে কাজ করার কথা। আসুন তবে নতুন পথ ধরি&#8230;</p>



<h3>গিট ব্রাঞ্চ অদলবদল</h3>



<h4><strong>কমান্ড: <code>git checkout&nbsp;&lt;branch-name&gt;</code></strong></h4>



<p>ব্যাশে লিখি:</p>



<pre class="wp-block-preformatted">$ git checkout style</pre>



<p class="has-background" style="background-color:#c2ecdb"><strong>টিপ্‌স:</strong><br>ব্রাঞ্চ তৈরি আর বদল করার জন্য দুটো কমান্ড শিখেছি। শর্টকাটে একটা কমান্ড দিয়েও কাজটা করা যায়, লিখতে হবে:<br><code>git checkout -b &lt;branch-name&gt;</code></p>



<p>সে বলছে, হ্যা, style ব্রাঞ্চে বদলে নিয়েছি। আমরা কিন্তু এবারে নতুন রাস্তায় উঠে গেছি। নতুন রাস্তাকে যদি জিজ্ঞেস করি, তোমার কাছে&nbsp;কয়টা ফাইল আছে? বলবে, ১টা (<code>index.html</code>)। তোমার কাছে কয়টা commit রেকর্ড আছে?&nbsp;বলবে, ১টা। আমরা যে আসলেই master ব্রাঞ্চ থেকে বদলে style ব্রাঞ্চে চলে এসেছি, সেটা আমরা এবারে নিজের নামের ডানদিকে দেখতেও পাচ্ছি, (master) নামটা বদলে &#8216;<strong><span style="color: #00ccff;">(style)</span></strong>&#8216; হয়ে গেছে। তবু আমরা একটু যাচাই করে দেখলাম:</p>



<pre class="wp-block-preformatted">$ git branch
  master
* style</pre>



<p>আশা করি বুঝে গেছি যে, ঐ স্টারটা (asterisk &#8211; <code>*</code>) আসলে আমাদের দেখায় আমার সক্রীয় ব্রাঞ্চ কোনটা।</p>



<p>এবারে আমাদের ডিরেক্টরিতে (ফোল্ডারে)&nbsp;একটা ফাইল তৈরি করলাম, <code>style.css</code> এবং তাতে লিখলাম:</p>



<pre class="wp-block-preformatted">body{
&nbsp; &nbsp;background-color: black;
&nbsp; &nbsp;color: white;
}
</pre>



<p>আর <code>index.html</code> ফাইলটা খুলে স্টাইলশিটটা লিংক&nbsp;করে দিলাম, <code>&lt;title&gt;</code> ট্যাগের ঠিক নিচেই লিখলাম:</p>



<p><code>&lt;link rel="stylesheet" href="style.css"&gt;</code></p>



<p>ব্যস, আমাদের সাইটে একটা দারুণ স্টাইলিং করা হয়ে গেল 🙂 ।</p>


<div class="wp-block-image">
<figure class="alignright"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/working-on-git-branch.png" rel="attachment wp-att-864"><img decoding="async" width="300" height="235" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/working-on-git-branch-300x235.png" alt="পর্দাদৃশ্য ৩: গিট ব্রাঞ্চে কাজ করা" class="wp-image-864" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/working-on-git-branch-300x235.png 300w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/working-on-git-branch-768x602.png 768w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/working-on-git-branch.png 810w" sizes="(max-width: 300px) 100vw, 300px" /></a><figcaption class="wp-element-caption"><strong>পর্দাদৃশ্য ৩:</strong> গিট ব্রাঞ্চে কাজ করা</figcaption></figure></div>


<p>এবারে ব্যাশে <code>git status</code> জানতে চাইলে দেখাবে <code>index.html</code> পরিবর্তন হয়েছে, আর <code>style.css</code> নতুন যোগ হয়েছে, তাই untracked। আমরা সব পরিবর্তনকে স্টেজ করে তারপর আরেকটা কমিট করি (ধরা যাক, কমিট বার্তা দিয়েছি: &#8220;styles added&#8221;)। এবারে গিটের লগ (কমান্ড: <code>git log</code>) পরখ করলে দেখা যাবে দুটো কমিট হয়েছে:</p>



<ul>
<li>একটা কমিট হয়েছিল master ব্রাঞ্চে থাকা অবস্থায় (বার্তা: &#8220;Initial Commit&#8221;)</li>



<li>আরেকটা কমিট এইমাত্র করলাম, style ব্রাঞ্চে থাকা অবস্থায় (বার্তা: &#8220;styles added&#8221;)</li>
</ul>



<p>আমরা যা শিখেছিলাম, সব মিলে গেল। মূল রাস্তা পর্যন্ত যা যা হয়েছিল, সব শাখা রাস্তায় এসেছে। আর শাখা রাস্তায়ও নতুন বন্ধু জুটিয়ে নিয়েছি (নতুন ফাইল কিংবা নতুন লাইন কিংবা পরিবর্তিত লাইন)। ব্রাউযারে <code>index.html</code> ফাইলটা খুললে দেখা যাবে, কালো দৃশ্যপটে সাদা লেখা স্পষ্ট দেখা যাচ্ছে।</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>আসল মজাটা এখনও শুরু হয়নি। আসল মজাটা দেখা যাবে, যদি আমরা এখন আবার master ব্রাঞ্চে ফিরে যাই। ব্যাশ খুলে লিখলাম:</p>



<pre class="wp-block-preformatted">$ git checkout master</pre>



<p>master ব্রাঞ্চে নিয়ে চলো। সে বরাবরের মতোই বলবে:</p>



<pre class="wp-block-preformatted">Switched to branch 'master'</pre>



<p>হ্যা, master ব্রাঞ্চে, মানে মূল রাস্তায় ফিরে এসেছি। এবারে ডিরেক্টরিটা (ফোল্ডার) খুলে একটু দেখুন তো&#8230;</p>



<p><span style="color: #ff6600;"><em>অ্যাবরাক্যাডাবরা! ছুহ মন্তর ছুহ, যাদু মন্তর ছুহ!</em></span></p>



<p>আমাদের <code>style.css</code> হাওয়ায় মিলিয়ে গেছে। শুধু তা-ই নয়, <code>index.html</code> ফাইলটা খুলে দেখুন, স্টাইলশিটটা লিংক করেছিলেন যে লাইন লিখে, সেই লাইনটিও নেই। কী মনে করে ব্রাউযার খুলে দেখলেন, কালো রঙের ব্যাকগ্রাউন্ডও হাওয়া। মাথায় হাত:&nbsp;<em>হায়, হায়! আমার এতো কষ্টের কোড সব মুছে ফেললো গিট!</em></p>



<p>না বৎস, ধৈর্য্যই ধর্ম্ম!</p>



<p>গিট একেবারে ঠিক কাজটিই করেছে। আপনি গিটকে জিজ্ঞেস করেছেন, গিট তোমার মূল রাস্তার খবর বলো। সে বলছে, ১টা ফাইল, আর ১০ লাইনের কোড। বাকি যা যা যোগ করেছিলেন এই রেপোযিটোরিতে, সব করেছেন নতুন রাস্তায় গিয়ে। পরে যে রাস্তা যোগ হয়েছে, আগের রাস্তা তার খবর কী করে রাখবে? তাই সে আসলে নতুন রাস্তার খবর জানে না। &#8230;শান্ত হোন, আপনার কোড হারিয়ে যায়নি। আপনার কোড এখনও নতুন রাস্তায় আছে ঠিকই। আবারও যদি নতুন রাস্তায় ঘুরতে যান, ঠিকই সবকিছু ঠিকঠাক পাবেন, সেখানকার বন্ধুদেরও পাবেন। ব্যাশে লিখুন:</p>



<pre class="wp-block-preformatted">$ git checkout style</pre>



<p>দেখুন তো সব ফিরে এসেছে কিনা? &#8230;এবার একটু প্রাণ খুলে হাসুন 😀 ।</p>



<p>আমি যখন প্রথম ব্যাপারটা লক্ষ করেছিলাম, আমি ব্যাশটাকে একপাশে এমনভাবে সরিয়ে রেখেছিলাম, যাতে মনিটরের আরেক পাশে ডিরেক্টরিটাও দেখতে পারি। তারপর ব্রাঞ্চ থেকে ব্রাঞ্চে একটু চেকআউট করে এই মজার দৃশ্য দেখেছিলাম মন ভরে। দারুণ লেগেছিল ব্যাপারটা আমার কাছে। 🙂</p>



<p>ব্যস, ব্রাঞ্চিং শেখা শেষ।</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3>গিট ব্রাঞ্চ মিশিয়ে&nbsp;নেয়া</h3>



<p>এবারে যদি আপনার style ব্রাঞ্চে করা স্টাইলগুলো দেখে আপনার মন পরিবর্তন করেন, চিন্তা করেন যে, <em>নাহ্‌! ভালোইতো লাগছে কালো ব্যাকগ্রাউন্ডটা</em> (নতুন রাস্তার বন্ধুরা তো ভালো মানুষই)। এক কাজ করি না কেন, মুল প্রজেক্টেই নিয়ে আসি না কেন (মূল রাস্তায়ই নিয়ে আসি বন্ধুদের)? যেই ভাবা, সেই কাজ। আপনি এবারে আপনার style ব্রাঞ্চটিকে master ব্রাঞ্চের সাথে মিলিয়ে নিবেন (merge করবেন)।</p>



<h4><strong>কমান্ড: <code>git merge&nbsp;&lt;branch-name&gt;</code></strong></h4>



<p>গাছের একটা ডাল কাটবেন, তো সেটা কি ডালে বসে কাটবেন, নাকি গাছের কান্ডে বসে কাটবেন?&nbsp;&#8230;তো সেজন্যই আগে কান্ডে ফিরে আসুন (মানে যে ব্রাঞ্চের মধ্যে অন্য ব্রাঞ্চটাকে মিলিয়ে নিতে চলেছেন)। আর তারপর ডালটার বিহিত করুন (master ব্রাঞ্চে style ব্রাঞ্চটা মার্জ্‌ করুন):</p>



<pre class="wp-block-preformatted">$ git checkout master
$ git merge style</pre>



<p>এতে সে দেখাবে: <em>এই হয়েছে, সেই হয়েছে, তোমার দুটো ব্রাঞ্চ মার্জ করে ফেলেছি।</em> অর্থাৎ style ব্রাঞ্চে যা যা করেছিলে, এখন তা হুবহু master ব্রাঞ্চেও যোগ/বিয়োগ করে মিলিয়ে নিয়েছি। তোমার সবকিছু রেডি। ব্যাশে লক্ষ করুন, আপনি এখন master ব্রাঞ্চে আছেন। ডিরেক্টরিতে লক্ষ করুন, style.css ফাইলটা দেখা যাচ্ছে। এই অবস্থায় আপনি ব্রাউযার রিলোড করে দেখুন, আপনার ওয়েবসাইট কালো ব্যাকগ্রাউন্ডে সাদা লেখা দেখাচ্ছে।</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3>গিট ব্রাঞ্চ&nbsp;রিমোটে তোলা</h3>



<p>যদি আপনি আপনার রেপোযিটরিটা সার্ভারে কোথাও ব্যাকআপ রাখেন, হতে পারে সেটা github, gitlab, bitbucket, meat ইত্যাদি আপনার নিজস্ব git সার্ভার কিংবা শ্রেফ কোনো শেয়ার্ড রেপোযিটরি। আমরা বোধহয় আলাদা করে গিট রিমোট যোগ করা দেখিনি। খুবই মামুলি কাজ, আমরা এবারে সেটা করে নিই। ধরা যাক, আমাদের গিটহাবে একটা রেপোযিটরি আছে test নামে, তার পাথটা নিলাম, তারপর ব্যাশে লিখলাম:</p>



<pre class="wp-block-preformatted">$ <span class="user-select-contain">git remote add origin <span class="js-git-clone-help-text">https://github.com/mayeenulislam/test.git</span></span></pre>



<p>ব্যস, তাতেই হয়ে গেল। origin নামে আমাদের একটা রিমোট যোগ হয়ে গেল, অর্থাৎ একটা সার্ভার কানেক্ট করে ফেললাম আমরা আমাদের এই রেপোযিটরিতে। এবারে আমরা চাচ্ছি, আমাদের style ব্রাঞ্চটা [মার্জ করি বা না করি], সেটা সার্ভারেও তুলে দিতে।</p>



<h4><strong>কমান্ড: <code>git push&nbsp;&lt;remote-name&gt; &lt;branch-name&gt;</code></strong></h4>



<p>ব্যাশে লিখতে হবে, সেই পুরোন জানা কমান্ডটি, ধাক্কা দিয়ে তুলে দাও:</p>



<pre class="wp-block-preformatted"><span class="user-select-contain">$ git push origin master</span>
$ git push origin style</pre>



<p>প্রথমে&nbsp;আমরা master ব্রাঞ্চটাকে ধাক্কা দিয়ে তুলে তারপর style ব্রাঞ্চটাকে ধাক্কা দিয়ে তুলে দিচ্ছি। (ইউযারনেম, পাসওয়ার্ড চাইলে দিয়ে দিতে হবে)</p>



<p>ব্রাঞ্চগুলোকে একবার পরখ করে দেখে নেয়া যেতে পারে:</p>



<pre class="wp-block-preformatted"><span class="user-select-contain">$ git branch --all</span>
* master
  style
  remotes/origin/master
  remotes/origin/style</pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3>গিট ব্রাঞ্চ&nbsp;মুছে ফেলা</h3>



<p>যেহেতু আমাদের style ব্রাঞ্চের কাজটা আমরা মূল ব্রাঞ্চে (master) মিশিয়ে নিয়েছি, আর ঐ ব্রাঞ্চ নিয়ে কাজ করারও ইচ্ছে নেই, তাই এখন আমরা চাইলে ব্রাঞ্চটা মুছে ফেলতে পারি। নতুন রাস্তার বন্ধুরা যদি আমার রাস্তায় চলে আসে, নাইবা থাকলো সে নতুন রাস্তা। 🙂</p>



<h4><strong>কমান্ড: <code>git branch -d&nbsp;&lt;branch-name&gt;</code></strong></h4>



<p>মুছে ফেলার কাজটা খুব সোজা, কান্ডে থাকা অবস্থায় কিন্তু ডাল কাটতে হবে, অর্থাৎ master ব্রাঞ্চে থাকা অবস্থায় শাখা মুছে ফেলার কমান্ড দিতে হবে:</p>



<p class="has-background" style="background-color:#c2ecdb"><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>সতর্ক থাকুন:</strong><br>ব্রাঞ্চ ডিলিট করার জন্য -d লেখাটা নিরাপদ। এতে সে মার্জ করতে না পারলেও কারণ দেখাবে। আর যদি আমরা -d না লিখে -D লিখতাম, তাহলে কিন্তু সে জোর করে ব্রাঞ্চটা ডিলিট করে দিত।</p>



<pre class="wp-block-preformatted">$ git branch -d style</pre>



<p>অর্থাৎ, গিট, style ব্রাঞ্চটাকে মুছে ফেলো তো। এতে সে লোকাল রেপোযিটরি থেকে style ব্রাঞ্চটা মুছে ফেলবে। পরখ করে দেখে নিতে পারেন:</p>



<pre class="wp-block-preformatted"><span class="user-select-contain">$ git branch --all</span>
* master
  remotes/origin/master
  remotes/origin/style</pre>



<p>আমরা যেহেতু style ব্রাঞ্চটাকে master ব্রাঞ্চে মার্জ করেই ফেলেছি, সেটাকে তাহলে আর সার্ভারে তুলে দেখানোর কোনো মানেই ছিল না। ভুয়া একটা কাজ করেছি। কিন্তু তবু শিখে রাখলাম, মার্জ করি বা না করি, উভয় অবস্থায়ই ব্রাঞ্চকে রিমোটে তুলে রাখা যায়। কিন্তু এইমাত্র আমরা লোকাল style ব্রাঞ্চটাকে মুছে ফেলেছি। সার্ভারেরটা কিন্তু এখনও আছে। সেটা কিভাবে মুছবো?</p>



<p>সার্ভারের style ব্রাঞ্চটা মুছে ফেলা খুব সোজা। শুধু লোকালের style ব্রাঞ্চটা সার্ভারে একটু কেরামতি করি তুলে দিলেই হলো।</p>



<h4><strong>কমান্ড: <code>git push &lt;remote-name&gt;&nbsp;:&lt;branch-name&gt;</code></strong></h4>



<p>তাহলে আমাদের origin রিমোট থেকে style ব্রাঞ্চটি মুছে ফেলতে লিখতে হবে:</p>



<pre class="wp-block-preformatted">$ git push origin :style</pre>



<p>ব্রাঞ্চের নামের আগে কোলন (<code>:</code>) খেয়াল করবেন কিন্তু। এটা হচ্ছে <code>true</code>&#8216;র প্রতীক।</p>



<p class="has-background" style="background-color:#c2ecdb"><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>সতর্কতা</strong><br>গিট ব্রাঞ্চিং ব্যবহার করার সময় খুব সতর্ক থাকতে হয় আপনি আসলে&nbsp;<em>কোন</em>&nbsp;ব্রাঞ্চে কাজ করছেন। ধরা যাক আপনি একটা ফিচার ব্রাঞ্চ খুলে কাজ করছিলেন, অথচ সপ্তা’খানেক পরে ভুলে গেলেন সেটা। আপনি অন্য কোনো কাজ ভুলে, এই ব্রাঞ্চে করে যাচ্ছেন অনবরত। অনেকদিন কাজ করার পর মনে পড়লো, হায় হায়, এটা কী করলাম, এই কাজ তো এই ব্রাঞ্চে করার কথা ছিল না। এই এত্তোগুলো কমিট তো এই ব্রাঞ্চে করার কথা ছিল না। তখন হয়তো ফেরা যাবে, কিন্তু সেটা যে বন্ধুর পথ হবে, সেটা আন্দাজ করা যায়।<br><br>এজন্য, যে এডিটর/আইডিই আপনি ব্যবহার করছেন, তাতে গিট ইন্টেগ্রেড করা গেলে খুব কাজের হয়। আর যদি তা না করা যায়, তাহলে প্রতিবার কাজে নামার আগে ব্যাশ খুলে ব্রাঞ্চটা দেখে নেয়ার অভ্যাস করতে পারেন।</p>



<p class="has-background has-small-font-size" style="background-color:#c2ecdb"><strong>আমার অভিজ্ঞতা:</strong><br>যারা আমার মতো LESS বা Sass দিয়ে সিএসএস করেন, তারা কোনো না কোনো কম্পাইলার ব্যবহার করে থাকেন। এই কম্পাইলারগুলো যদি সেটআপ করা থাকে যে স্বয়ংক্রীয়ভাবে কম্পাইল হবে, তাহলে এগুলো ফাইলের modified টাইমস্ট্যাম্পের দিকে খেয়াল রাখে। যদি এধরণের কম্পাইলার সক্রীয় থাকে আর আপনি কম্পাইল করে একটা মিনিফাইড সিএসএস ফাইল তৈরি করে থাকেন, তাহলে ব্রাঞ্চ থেকে ব্রাঞ্চে অদলবদল হবার সময় সে মনে করে ফাইলটা বদলেছে, সাথে সাথে সে একটা কম্পাইল্‌ড সংস্করণ তৈরি করে। এটা ব্রাঞ্চ থেকে ব্রাঞ্চে দৌঁড়াদৌঁড়ির সময় খুবই বিশ্রী রকমের ঝামেলা তৈরি করে। এই ঝামেলা এড়াতে আমি ব্রাঞ্চ বদলের আগে কম্পাইলারটা সাময়িক বন্ধ করে নিই। …আপনাদের কাছে ভালো কোনো সমাধান থাকলে, তা মন্তব্য করে জানালে খুব উপকার হবে।</p>



<h3>পরিশেষ</h3>



<p>ব্যস, গিট ব্রাঞ্চিং-এর প্রাথমিক আলোচনা শেষ। এবারে এই জ্ঞানকে আরো বাড়িয়ে নিতে হবে। <a href="https://www.youtube.com/watch?v=ZDR433b0HJY" target="_blank" rel="nofollow noopener">স্কট চ্যাকনের যে ভিডিও ইন্ট্রোটা দিয়েছিলাম গত পর্বে</a>, তাতে ব্রাঞ্চিং বিষয়ে আলোচনা আছে বিস্তারিত। এই আলোচনা আর কিছু অনুশীলনের পরে ঐ ভিডিওটা রীতিমতো চক্ষু-খুলে-দেয়া&#8217;র মতো হবে, কথা দিচ্ছি।</p>



<p>ব্রাঞ্চিং-এ গেলে কিংবা একাধিক ডেভলপার মিলে কাজ করতে গেলে সবচেয়ে বড় যে সমস্যাটার সম্মুখিন সবাই হয়, তা হলো merge conflict বা মেশানোতে&nbsp;সংঘর্ষ। এই মার্জ কনফ্লিক্ট, কলেবোরেট করে, মানে একাধিক ডেভলপার মিলে ঝামেলা না করে কাজ করা বিষয়ে আরেকটা আলোচনার জোর দাবি রাখে। আগামী কোনো পর্বে সেটা নিয়ে আলোচনা করার আশা রাখি, ইনশাল্লাহ। সেদিন আমরা সহজে বোধগম্য কোনো গিট মডেল নিয়ে আলোচনা করতে পারি, যা আমাদের কাজকে আরো ঝামেলাহীন করে কলেবোরেটিভ কোড করতে সহায়তা করবে।</p>



<h3>আরো গভীরে জানা যাক:</h3>



<ol>
<li><a href="https://git-scm.com/book/en/v2/Git-Branching-Branch-Management" target="_blank" rel="nofollow noopener">Git Branching &#8211; Branch Management &#8211; Git^</a> &#8211; Scott Chacon-এর বই</li>



<li><a href="http://makandracards.com/makandra/621-git-delete-a-branch-local-or-remote" target="_blank" rel="nofollow noopener">Git: Delete a branch (local or remote)^</a> &#8211; Tobias Kraze</li>



<li><a href="http://stackoverflow.com/q/24582319/1743124" target="_blank" rel="nofollow noopener">Branching and merging best practices in Git^</a> &#8211; StackOverflow</li>
</ol>



<p><small>প্রচ্ছদের ছবি:&nbsp;chloepettersson.com থেকে নেয়া ছবি ও অন্যান্য গিট ব্রাঞ্চিং মডেলের মন্তাজ।</small></p>



<p><strong>হালনাগাদ:</strong> ৩১ জানুয়ারি ২০১৭</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/git-branching/">গিট দিয়ে ভার্ষন নিয়ন্ত্রণ &#8211; git branch</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mayeenulislam.github.io/tuts/git-branching/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>ওয়ার্ডপ্রেস সাইটকে গতিশীল করতে gZip Compression চালু করার পদ্ধতি</title>
		<link>https://mayeenulislam.github.io/tuts/gzip-compression-wordpress/</link>
					<comments>https://mayeenulislam.github.io/tuts/gzip-compression-wordpress/#comments</comments>
		
		<dc:creator><![CDATA[মঈনুল ইসলাম]]></dc:creator>
		<pubDate>Sat, 10 Oct 2015 16:26:14 +0000</pubDate>
				<category><![CDATA[ওয়ার্ডপ্রেস টিউটোরিয়াল]]></category>
		<category><![CDATA[জ্ঞান-স্তরভিত্তিক টিউটোরিয়াল]]></category>
		<category><![CDATA[মাধ্যমিক স্তরের টিউটোরিয়াল]]></category>
		<guid isPermaLink="false">https://mayeenulislam.github.io/tuts/?p=738</guid>

					<description><![CDATA[<p> [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/gzip-compression-wordpress/">ওয়ার্ডপ্রেস সাইটকে গতিশীল করতে gZip Compression চালু করার পদ্ধতি</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>ওয়ার্ডপ্রেস সাইট যারা পরিচালনা করেন, তাদের অনেকেই সাইটের গতি বৃদ্ধির নানান কৌশল জানতে চান। সত্যিকার অর্থে গতি বৃদ্ধির ব্যাপারটা অনেক কিছুর সাথে সম্পর্কযুক্ত, যেমন:</p>



<ul>
<li>আপনি যে থিম ব্যবহার করছেন, তার কোডের মান কেমন?</li>



<li>আপনি যে প্লাগইনগুলো ব্যবহার করছেন, তার কোডের মান কেমন?</li>



<li>আপনি যে সার্ভারে সাইট হোস্ট করেছেন, তার মান/গতি কেমন?</li>



<li>কিংবা আপনি যে তথ্য আপনার সাইটে রাখছেন, তা কতটা অপটিমাইজ্‌ড, মানে প্রয়োজনানুগ গুছিয়ে রাখা?</li>



<li>কিংবা আপনার সাইটে যেসব থার্ড পার্টি রিসোর্স ব্যবহার করেছেন, সেগুলো কতটা গতিশীল?</li>
</ul>



<p>&#8230;ইত্যাদি বহু কিছু। এসব বিষয়গুলো নিশ্চিত করার পরও অনেক সময় সাইটের গতি আশানুরূপ পাওয়া যায় না। আপনি যদি তখন Google-এর PageSpeed Insights, GTmetrix কিংবা Yahoo!&#8217;র YSlow ব্যবহার করে পরখ করে থাকেন, তাহলে দেখবেন, সেখানে আপনাকে বলা হচ্ছে, &#8220;Enable Compression&#8221; (কম্প্রেশন&nbsp;সক্রীয় করুন)।</p>



<h3 id="এটা খায় না মাথায় দেয়">এটা খায় না মাথায় দেয়</h3>



<p>আপনি যখন একটা ওয়েবসাইটের ঠিকানা&nbsp;লিখে এন্টার চাপেন, আপনি তখন আসলে সার্ভারকে বলেন, অমুক সাইটের তথ্যগুলো পাঠাও তো&#8230;। সার্ভার তখন সেই সাইটের তথ্যগুলো আপনাকে পাঠাতে থাকে। 10 মেগাবাইট ডাটা থাকলে, সে 10 মেগাবাইট ডাটা আপনাকে পাঠিয়ে দেয়, আপনি তখন সাইটটা দেখতে পারেন। যদি gZip Compression চালু করা থাকে, তাহলে যা ঘটবে: আপনি সার্ভারকে বলবেন, সাইটের ডাটা পাঠাও&#8230; সে তখন দেখবে সাইটে 10 মেগাবাইট ডাটা আছে, সে সেটাকে কম্প্রেস করবে, মানে যিপ&nbsp;করবে, মানে গুটিয়ে নিবে, এতে ডাটার আকার কমে আসবে মাত্র 3 মেগাবাইটে, অর্থাৎ সার্ভার তখন আপনার ব্রাউযারে পাঠাবে 10 মেগাবাইটের বদলে মাত্র 3 মেগাবাইট&#8230; কতটা দ্রুত হয়ে যাবে সাইট বুঝতেই পারছেন। বাকি কাজটা হবে এবার আপনার ব্রাউযারে&#8230; ব্রাউযার সেই কম্প্রেস করা&nbsp;ফাইলটা পেয়ে সেটাকে আনকম্প্রেস/ডিকম্প্রেস করবে, মানে আনযিপ করবে, পোটলা খুলবে, তারপর আপনাকে সাইটটা দেখিয়ে দিবে। &#8230;এভাবে gZip কম্প্রেশন আপনার সাইট পেজের আকার ৭০% পর্যন্ত কমিয়ে আনতে পারে।</p>



<h3 id="কিভাবে কম্প্রেশন সক্রীয় করতে হয়">কিভাবে কম্প্রেশন সক্রীয় করতে হয়</h3>



<span id="more-738"></span>



<p>আমি সাধারণত Apache সার্ভার ব্যবহার করি, তাই <strong>আমার জানা সমাধানগুলো অ্যাপাচি সার্ভার-কেন্দ্রীক</strong>।</p>



<p><span style="text-decoration: underline;"><strong>জ্ঞাত পদ্ধতি ১:</strong></span>&nbsp;প্রথমদিকে মহা ফ্যাসাদে পড়লাম, কমপ্রেশন সক্রীয় করার উপায় পাচ্ছিলাম না। এমন সময় এক ব্লগে লেখা দেখলাম: ওয়ার্ডপ্রেস সাইটের অ্যাডমিন প্যানেলে লুকানো একটা সেটিং আছে: ব্রাউযারে লিখুন: <code>.../wp-admin/options.php</code> &#8211; মানে, সাইটের অ্যাডমিন প্যানেলে থেকে <code>options.php</code> পাতায় যান। এখানে&nbsp;gzipcompression নামে একটা অপশন আছে, সেটার মান <code>0</code> থেকে বদলে <code>1</code> করে দিতে হবে, মানে <code>false</code> থেকে <code>true</code> করে দিতে হবে। কিন্তু এটা ব্যবহার করে আমি কোনো সমাধান পেলাম না। আপনাদের কারো উপকার হলে, এটাই একাজে সবচেয়ে সহজ সমাধান।</p>



<p><span style="text-decoration: underline;"><strong>জ্ঞাত পদ্ধতি ২:</strong></span> পরে ওয়ার্ডপ্রেস ডেভলপমেন্ট স্ট্যাকএক্সচেঞ্জে আলোচনা করে বের করে আনলাম এর কার্যকরী পদ্ধতি: আমাকে Toscho (Thomas Scholz) জানালেন: <code>php.ini</code> ফাইলে&nbsp;<code>zlib.output_compression = On</code> চালু করলেই তা হয়ে যায়।</p>



<p>যেহেতু আমি শেয়ার্ড সার্ভার ব্যবহার করছিলাম, তাই এটাও পরখ করে দেখা হয়নি।</p>



<p><span style="text-decoration: underline;"><strong>সক্রীয় পদ্ধতি ৩:</strong></span>&nbsp;তারপর আরেকদিন আলোচনায় Rarst (Andrey “Rarst” Savchenko) আমাকে জানালেন এর <code>.htaccess</code> পদ্ধতির কথা। তিনি আমাকে অ্যাপাচি&#8217;র <a href="https://github.com/h5bp/server-configs-apache/blob/33350e37e8f9b6fa1366edf0c57adaf71df34759/dist/.htaccess#L579-L641" target="_blank" rel="noopener">কোড স্নিপেট^</a>ই সরাসরি শেয়ার করলেন। সময়ের আবর্তে এই পাতায় অনেক পরিবর্তন আসছে, আসবে। তাই লাইন নম্বর ধরে কোডটা দিলে আজ এক জায়গায় কাল আরেক জায়গায় চলে যাবে। তাই আমি শুধু প্রয়োজনীয় অংশটুকু আলাদা করে নিলাম এখানে:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/a82b62102b636b159da2">Gist</a>.
</div></figure>



<p>যেটা করতে হবে, আপনার ওয়ার্ডপ্রেস সাইটের <code>.htaccess</code> ফাইলটা সম্পাদনা মোডে খুলুন (ফাইলটা ওয়ার্ডপ্রেসের র&#x200d;্যুটেই থাকে)। যদি <code>.htaccess</code> ফাইল না থাকে, ঠিক এই নাম দিয়ে একটা ফাইল তৈরি করে নিন। আগে থেকে থাকা ফাইলে কিছু কোড থাকবে, সেগুলো আগে একটা জায়গায় কপি করে <strong>ব্যাকআপ নিয়ে রাখুন</strong>। সেখানেই সবার নিচে এই কোডটুকু বসিয়ে নিন।</p>



<p>ব্যস, কাজ শেষ।</p>



<h3 id="যাচাই করুন">যাচাই করুন</h3>



<p>এবারে আসলেই সাইটে gZip কম্প্রেশন চালু হয়েছে কিনা যাচাই করে নিন <a href="http://redbot.org/" target="_blank" rel="noopener">RedBot^</a> থেকে, কিংবা <a href="https://gtmetrix.com/" target="_blank" rel="noopener">GTmetrix^</a> থেকে। আপনার সাইটের URL লিখে সাবমিট করুন, দেখিয়ে দিবে gZip কম্প্রেশন চালু হয়েছে কিনা, এবং কতটুকু গতিবৃদ্ধি পেল তাতে।</p>



<h3 id="মুদ্রার উল্টো পিঠ">মুদ্রার উল্টো পিঠ</h3>



<p>আমরা বলেছিলাম সার্ভার আমাদের ব্রাউযারে কম্প্রেস করা ফাইলটা পাঠাবে। কিন্তু আমাদের ব্রাউযার যদি জানেই না কিভাবে কম্প্রেস করা ফাইলকে ডিকম্প্রেস করতে হয়, তখন? পুরোন ব্রাউযারগুলোতে এই সমস্যা ছিল। এখন আর এটা বোধহয় সমস্যা না। তাছাড়া, যত বড় কম্প্রেস ফাইল, তত বেশি CPU-এর ব্যবহার। সুতরাং এই পারফর্মেন্স পাওয়ার পিছনে আপনার সার্ভারের সিপিইউ-এর ব্যবহারও বাড়ছে। আরো জানা যাবে <a href="https://web.archive.org/web/20180607220016/https://devcentral.f5.com/articles/i-am-wondering-why-not-all-websites-enabling-this-great-feature-gzip" target="_blank" rel="noopener">Lori MacVittie-এর এই ব্লগ (আর্কাইভ থেকে)^</a> থেকে।</p>



<p>তাই মনে রাখবেন, যদি কোনো সমস্যা হয়, তাহলে আপনার <code>.htaccess</code>, যা ব্যাকআপ রেখেছিলেন, তা থেকে <code>.htaccess</code> আবার আগের মতো করে নিন। আপনার ভুলের দায়ে আমাকে জড়ালে খুব কষ্ট পাবো তখন। 🙂&nbsp;শুভ হোক!</p>



<p><strong>-মঈনুল ইসলাম</strong><br><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f517.png" alt="🔗" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a rel="noreferrer noopener" href="https://mayeenulislam.github.io/" target="_blank">mayeenulislam.github.io</a></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p><span style="text-decoration: underline; color: #808080;"><strong>বাড়তি পঠন</strong></span></p>



<ul>
<li><span style="color: #808080;"><a style="color: #808080;" href="https://gtmetrix.com/enable-gzip-compression.html" target="_blank" rel="noopener">PageSpeed: Enable gZip Compression^</a> &#8211; GTmetrix</span></li>
</ul>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/gzip-compression-wordpress/">ওয়ার্ডপ্রেস সাইটকে গতিশীল করতে gZip Compression চালু করার পদ্ধতি</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mayeenulislam.github.io/tuts/gzip-compression-wordpress/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
	</channel>
</rss>
