Daily deeds:Windows Phone dev issues, changing common Control Properties in codebehind. :)

আজকের টা বাংলায়! Smile
প্রায়শই যথন উইন্ডোজ ফোনটা নিয়ে গুতোগুতি চলে তখন প্রথমেই কোন কিছু যখন করতে যাই সর্বপ্রথম যে ব্যাপারটা নিয়ে চিন্তা ভাবনা চলে সেটা হচ্ছে XAML. কিন্তু গ্যাঞ্জামটা পাকে তখন যখন আমার মাথায় ডাইন্যামিক কিছু করার ভুত চাপে এবং UI কে C# থেকে Control করবার প্রয়োজন হয়। তখন XAML এর Attribute গুলো কিভাবে এখানে Assign করবো বের করতে বেশ ঝামেলা পোহাতে হয়। যদিও MSDN আছে তাও ভাবলাম, লিখে রাখি, দোষ কি? এখানে XAML এবং C# একসাথে নোট করা আছে, দেখা লাগলে দেখে নিতে পারেন। Smile

সমস্যা: TextBlock এর TextWrapping property
XAML:

<TextBlock x:Name="textBlockWrapped" TextWrapping="Wrap" Text="This should be wrapped."/>

C#:

this.textBlockWrapped.TextWrapping = TextWrapping.Wrap;

সমস্যা: Horizontal Alignment/Vertical Alignment ঠিক করা
XAML:

<Button x:Name="button" Content="Shift" HorizontalAlignment="Left"  VerticalAlignment="Top" Width="63" />

C#:


button.HorizontalAlignment=(HorizontalAlignment)AlignmentX.Left;
button.VerticalAlignment=(VerticalAlignment)AlignmentY.Top

সমস্যা: ScrollBar Visibility ঠিক করা
XAML:


<ScrollViewer x:Name="scrollViewer" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Visible">
<!--some code here...-->
</ScrollViewer>

C#:


this.scrollViewer.HorizontalScrollBarVisibility = ScrollBarVisibility.Visible;
this.scrollViewer.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;

সমস্যা: Font ঠিক করা
XAML:


<TextBlock Text="TextBlock" FontWeight="Bold" FontSize="30" FontFamily="Arial" x:Name="textBlock"/>

C#:


this.textBlock.FontSize = 30;
this.textBlock.FontFamily = new FontFamily("Arial");
this.textBlock.FontWeight = FontWeights.Bold;

যদি Font আগেই embedded হয় তো?

XAML:


<TextBlock Text="TextBlock" FontWeight="Bold" FontSize="30" FontFamily="YourProjectName;component/Fonts/Fonts.zip#Siyam Rupali" x:Name="textBlock"/>

C#:


this.textBlock.FontFamily = new FontFamily("YourProjectName;component/Fonts/Fonts.zip#Siyam Rupali");

সমস্যা: Button অথবা অন্য কোন Control কোন Grid বা Container এ যোগ করা

C#:


Button btn = new Button();
//ContentPanel is the main Grid in MainPage.xaml
this.ContentPanel.Children.Add(btn);

 

সমস্যা: Background পরিবর্তন করা
XAML:


<Button x:Name="button" Content="Change Color" Background="Green"/>

C#:


this.button.Background = new SolidColorBrush(Colors.Green);
this.button.Background = new SolidColorBrush(Color.FromArgb(10,15,100,124));

যদি Backgroundimage দিতে চাই তো?
XAML:

<Button x:Name="button" Content="Image" Width="100" Height="100">
<Button.Background>
<ImageBrush ImageSource="logo.png"/>
</Button.Background>
</Button>

C#:


ImageBrush imageBrush = new ImageBrush();
Uri uri = new Uri("logo.png", UriKind.RelativeOrAbsolute);
imageBrush.ImageSource = new BitmapImage(uri);
this.button.Background = imageBrush;

সমস্যা: Thickness পরিবর্তন করা

XAML:


<Border BorderBrush="Red" x:Name="border" Height="200" Width="200" BorderThickness="5,4,3,2">
<!--Some code here...—>
</Border>

C#:


this.border.BorderThickness = new Thickness(5, 4, 3, 2);
this.border.BorderThickness = new Thickness(5);
Advertisements

Daily Deeds: Windows Phone Data Encryption

Well, its nothing new to be said. I was sticking my head on a encrypted sms sender app and was definitely looking for some encryption system over the internet. The thing is I knew a way around on C# as I used it way before. So, I looked it u[ and suddenly it hit me that may be that solution might not work on the silverlight core on Windows Phone 7.5. Just as it turned out I was right. So, I hooked up again on MSDN, found a blog of Rob Tiffany describing a system and I used to make my app! Smile

As I said, daily deed is a daily feed of my lookups, so don’t expect much without codes. Smile

Here’s how I encrypted the data


AesManaged aes = null;
MemoryStream memoryStream = null;
CryptoStream cryptoStream = null;
try
{

Rfc2898DeriveBytes rfc2898 = new Rfc2898DeriveBytes(password, Encoding.UTF8.GetBytes(salt), 10000);

//Create AES algorithm
aes = new AesManaged();
aes.Key = rfc2898.GetBytes(32);
//IV derived from byte array with 16 pseudo-random key bytes
aes.IV = rfc2898.GetBytes(16);

//Create Memory and Crypto Streams
memoryStream = new MemoryStream();
cryptoStream = new CryptoStream(memoryStream, aes.CreateEncryptor(), CryptoStreamMode.Write);

//Encrypt Data
byte[] data = Encoding.UTF8.GetBytes(dataToEncrypt);
cryptoStream.Write(data, 0, data.Length);
cryptoStream.FlushFinalBlock();

//Return Base 64 String
return Convert.ToBase64String(memoryStream.ToArray());
}
finally
{
if (cryptoStream != null)
cryptoStream.Close();

if (memoryStream != null)
memoryStream.Close();

if (aes != null)
aes.Clear();
}
}

Points to be remembered here:

    • AES is used here to encrypt and decrypt a message.
    • Salt is needed with the password to get things done and it needs at least 8 characters
    • Anybody can set the iteration at any value, minimum 1000 is preferred.
    • Use same password for encryption and decryption.
    • Code sample is taken from the respective blog. Smile

And the decryption is as followed:


public string Decrypt(string dataToDecrypt, string password, string salt)
{
AesManaged aes = null;
MemoryStream memoryStream = null;

try
{
Rfc2898DeriveBytes rfc2898 = new Rfc2898DeriveBytes(password, Encoding.UTF8.GetBytes(salt), 10000);

aes = new AesManaged();

aes.Key = rfc2898.GetBytes(32);
aes.IV = rfc2898.GetBytes(16);

//Create Memory and Crypto Streams
memoryStream = new MemoryStream();
CryptoStream cryptoStream = new CryptoStream(memoryStream, aes.CreateDecryptor(), CryptoStreamMode.Write);

//Decrypt Data
byte[] data = Convert.FromBase64String(dataToDecrypt);
cryptoStream.Write(data, 0, data.Length);
cryptoStream.FlushFinalBlock();

//Return Decrypted String
byte[] decryptBytes = memoryStream.ToArray();

//Dispose
if (cryptoStream != null)
cryptoStream.Dispose();

//Retval
return Encoding.UTF8.GetString(decryptBytes, 0, decryptBytes.Length);
}
finally
{
if (memoryStream != null)
memoryStream.Dispose();

if (aes != null)
aes.Clear();
}
}

And Voila! With a SmsComposerTask, my simple app looks like:
onetwothree

This is meant to be a share of my daily experience feed. So, take it easy! Hope it helps! Ciao!

Daily Deeds: Using CookieContainer in WebClient Class

Recently I decided to put stuff out on web that I actually face everyday in my part-time endeavors. I would like to keep these precise so I can write these fast enough. Smile

First of all, I’m a noob so kindly go easy on me. The point I’m putting out here is found when I was doing a pretty simple job of writing a method that checks whether a web url is valid or not. Easy at it seems the only nightmare was getting “too many automatic redirection” exception when the site seems okay in browser. I used firebug/fiddler to debug the HTTP get request  And voila! Here is the solution.

The most probable reason of this problem might be these:

1. You might need to set webRequest.AllowAutoRedirect = false where webRequest is a HttpWebRequest object

2. You might be getting redirected just because your request is missing a cookie container.

But the problem arises when Im using the WebClient class, what would I do? The solution is I’m gonna override the WebClient class and get the inner HttpWebRequest Object to make some subtle changes along with allotting a CookieContainer object. Smile

So, here’s the overridden class looks like:


public class WebClientEx : WebClient
{

private readonly CookieContainer m_container = new CookieContainer();
protected override WebRequest GetWebRequest(Uri address)
{
WebRequest request = base.GetWebRequest(address);
HttpWebRequest webRequest = request as HttpWebRequest;
if (webRequest != null)
{
webRequest.CookieContainer = m_container;
webRequest.AllowAutoRedirect = false;
}
return request;
}
}

And using the new class is never harder than this, Smile


using (var client = new WebClientEx())
{

// fine, no content downloaded
try
{
client.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:16.0) Gecko/20100101 Firefox/16.0";
client.Headers[HttpRequestHeader.Accept] = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";

string s1 = client.DownloadString(url);

return url+" "+"exists";
}
catch (Exception ex)
{

return url+" has exception :"+ ex.Message;
}
}

And voila! It works! Hope this helps to those people who spends days on stackoverflow like me Smile

ডিজাইন প্যাটার্নের শুরু হোক বাংলায় – Facade

ডিজাইন প্যাটার্ন নিয়ে বকবক করার সিদ্ধান্ত নেয়ার পেছনে কারণ অনেক। অদ্ভুত হলেও সত্য সি.এস.ই. গ্র্যাজুয়েট দের এই বস্তুটা কারিকুলাম এ নাই। OOP শিখিয়ে এটা না শিখানো ঠিক কতটা যক্তিযুক্ত আমি জানিনা।
কথা নাই বার্তা নাই Facade নিয়ে হঠাং ব্লগবক শুরু করার যৌক্তিক কারণ না থাকলেও ঐতিহাসিক কারণ বিদ্যমান। জীবনে এক মহাপুরুষ (নাম বলা যাবেনা :P) এর সাথে সাক্ষাৎ আমার হয়েছিলো। তার মুখেই প্রথম এটার নাম শোনা। তখনো বুঝিনাই উনি কি বলছিলেন। আজ বুঝলাম, তা্ই লিখতে বসা আর কি।
আমার এই টিউটোরিয়াল পড়ার আগে আপনার কি কি জানা দরকার দেখে নিন:

১. OOP এর উপর সাধারন ধারনা। ডিজাইন প্যাটার্ন কি তার সম্পর্কে হালকার উপর ঝাপসা থাকলেই চলবে। এগুলো এখন বলতে ইচ্ছুক নই। সি শার্পের গোড়া থেকে যে সিরিজটা শুরু করবো সেটায় চোখ রাখলেই হবে। 😀

২. সি শার্প এর উপর কাজ চালানোর মতো জ্ঞান, অন্য কোন ল্যাংগুয়েজ জানলেই হবে। সিনট্যাক্স থেকে স্ট্রাকচার আন্দাজ করতে পারলেই চলবে।

৩. আমার ব্লগবক সহ্য করার ধৈর্য।

তো শুরু করা যাক। এই টিউটোরিয়াল সম্পূর্নই বাংলায় তার কারণ বাংলায় কোন কিছু বোঝা বাঙালির জন্যে সোজা। আর তেমন কোন কারণ নাই। আমার কোড গুলো নেট থেকেই সংগৃহীত। কপিরাইটে ফাঁসাবেন না ভাই..

আগে বলি কেন Facade দরকার। একটা টিমে একজন ক্যাপ্টেন থাকে যার কাজ বাকিরা কে কি করবে বলে দেয়া, সবার নিয়ন্ত্রণ রাখা, দায়ভার স্বীকার করা। মানে সহজ বাংলা কথায় সব শরীরে ঘাড়ের উপর একটা মাথা থাকবেই। যদি এমন কোন সিস্টেম দাঁড় করানো যায় যেটা সবার খেয়াল রাখবে। এমন একটা ক্লাস যেটা সবার খেয়াল রাখবে । সব সিস্টেমের মন ভালো করে দেবে (বেশি হয়ে গেলো রে :P)

Facade এ যেটা হয় সেটা হচ্ছে একটা class বাকি সব subsystem কে control করে। গুলিয়ে যাচ্ছে এই তো? আচ্ছা সহজ করে বলি। মনে করুন আপনার একটি ফুড শপ আছে। ফুড শপের তিনটি আলাদা টাইপের বার্গারের শেফ তিন জন (হে হে, মাথা খারাপ হইলে যা হয় আর কি)। আপনি বসে আছ্নে ফুড কোর্টের অর্ডার টার্মিনালে। লোকজন তাহলে অবশ্যই আপনার কাছে এসেই খাবার চাইবে। আপনি ভালো করেই জানেন কোন বার্গারের শেফ কে। সুতরাং আপনার জন্য খুবই সোজা ঠিক করা কোন অর্ডার কোন শেফের কাছে যাবে। এই সহজ ব্যাপারটুকু যদি আপনি বুঝে থাকেন জেনে রাখুন প্রোগ্রামিং জানুন আর নাই জানুন আপনি Facade ঠিকই বুঝে গেছেন। সেই হিসেবে আপনি এখানে Facade এবং আপনার তিন শেফ হচ্ছে আপনার Subsystem.

অনেক ব্লগবক করলাম। কাজের কথায় আসি। তাহলে কোড শুরু করা যাক।

প্রশ্ন হতে পারে আমি কাকে দিয়ে শুরু করবো। আসলে সত্যি বলতে আমিও জানিনা্। আমি সহজ ভাষায় একজন Duct tape কোডার। দেখি সফল হতে পারি কিনা সবাইকে কিছু বোঝাতে। UML দেখানো উচিত ছিলো। আর না হয় না্ই গেলাম ওইদিকে। যাদের টার্গেট করে এই লাইনগুলো লিখছি তারা বুঝলেই আমি খুশি। 😀

তো একটা facade based system তৈরী করতে হলে আপনার লাগছে একটি Facade class এবং এক বা একাধিক Subsystem । আজকের উদাহরণের জন্য আমি ব্যবহার করছি একটি সি শার্প কনসোল অ্যাপ্লিকেশন। যেহেতু প্রথম টিটু লিখছি সি শার্পের জন্য আমি কিঞ্চিৎ অপ্রস্তুত। আশা করি পরবর্তীতে আরো ভালো উদাহরন উপহার দিতে পারবো। আজকের টিউটোরিয়ালের জন্য:

Facade : FoodShopManager

SubSystems: Chef_ChickenBurger, Chef_VegiBurger

প্রথমে আসুন সাবসিস্টেম গুলো চিনে নেই। মনে করুন আপনার ফুড শপে দুইজন Chef । একজন Chicken Burger এর জন্য আর অপরজন Vegi Burger এর জন্য। মনে করুন আপনার দুই শেফের জন্য দুইটি Subsystem তৈরী হয়েছে। এদের দুটি দেখতে নিচের মতো:

Class Chef_ChickenBurger হবে এরকম:


internal class Chef_ChickenBurger
 {
 internal string OrderRecieved()
 {
 return "Order recieved of Chicken Burger\n";
 }

internal string MakeBunsReady()
 {
 return "Making Buns Ready\n";
 }

internal string HereGoesTheChicken()
 {
 return "Chicken is in, awesomeness inside\n";
 }

internal string PerpareDressings()
 {
 return "The burger looks beautiful\n";
 }

internal string ReadyToServe()
 {
 return "Chicken burger is ready to serve\n";
 }
 }

আসলেই হাস্যকর, যাই হোক বুঝতে পারলেই হলো। মেথডগুলো শুধুমাত্র কাজ বোঝানোর জন্যই। তাহলে Chef_VegiBurger  হবে দেখতে এরকম:

 internal class Chef_VegiBurger
 {
 internal string OrderRecieved()
 {
 return "Order recieved of Vegitable Burger\n";
 }

internal string SliceAndDiceTomatoes()
 {
 return "Slicing and Dicing Tomatoes\n";
 }

internal string PrepareTheVegi()
 {
 return "The Vegi burger is on the way...blah blah\n";
 }

 internal string ReadyToServe()
 {
 return "Vegi Burger is ready to serve\n";
 }
 }

দুটো Subsystem তাহলে আমাদের পাওয়া শেষ। এবার আসি Facade এ। আগেই বলেছি ফুডশপের ম্যানেজার ই হচ্ছেন Facade। তাহলে..

public static class FoodShopManager
 {
 static Chef_ChickenBurger chef_ChickenBurger=new Chef_ChickenBurger();
 static Chef_VegiBurger chef_VegiBurger=new Chef_VegiBurger();

public static void OrderChickenBurger()
 {
 Console.WriteLine(chef_ChickenBurger.OrderRecieved() +
 chef_ChickenBurger.MakeBunsReady() +
 chef_ChickenBurger.HereGoesTheChicken() +
 chef_ChickenBurger.PerpareDressings()+
 chef_ChickenBurger.ReadyToServe());

}

public static void OrderVegiBurger()
 {
 Console.WriteLine(chef_VegiBurger.OrderRecieved() +
 chef_VegiBurger.SliceAndDiceTomatoes() +
 chef_VegiBurger.PrepareTheVegi() +
 chef_VegiBurger.ReadyToServe());
 }
 }

আসল কথাগুলো এখানেই, লক্ষ্য করে দেখুন, Facade Class টিতে আপনার দুজন শেফ এর ই দুটি Static Object তৈরী করা হয়েছে। এটি অবশ্য জরুরী নয়, পুরোটাই অনেকাংশে আপনার উপর নির্ভর করছে কি করে Structure টা দাঁড় করাবেন, মূল বিষয় ঠিক থাকাই বাঞ্ছনীয়।

আমরা এখানে দুটো ডামি মেথড দাঁড় করিয়েছি। একটি OrderChickenBurger এবং অপরটি OrderVegiBurger। দুটো মেথডের নামই আপনাকে বলে দেবে এদের কাজ। (আমার মতো একটু আধটু খেতে ভালোবাসলে আর কিছুই বলা লাগবেনা)।

খেয়াল করে দেখুন, Facade ক্লাসটি নিজেই তার Subsystem এর অবজেক্টগুলোর (chef_VegiBurger এবং chef_ChickenBurger ) মেথড নিজের মেথডের ভেতর থেকে Invoke করেছে। Subsystem গুলোকে আলাদা কোন Control দেয়নি। অবশ্য একটি Subsystem কে আপনি আবার অন্য একটি Subsystem গ্রুপের Facade হিসেবে ব্যবহার করতে পারেন।

তাহলে একটি Facade ই যখন Subsystem গুলোর সবকিছু দেখছে তখন Main এ শুধুমাত্র Facade এর মেথড গুলো Invoke করলেই আশা করি ঝামেলা মিটে যাবে। আসলেই তাই!


static void Main(string[] args)
{
FoodShopManager.OrderChickenBurger();
FoodShopManager.OrderVegiBurger();

Console.ReadKey();
}

দেখতেই পাচ্ছেন Main এ শুধুমাত্র Facade ক্লাসটির মেথড দুটিই Invoke করা হয়েছে। একটি Facade ক্লাসই সকল Subsystem এর সবকিছু নিয়ন্ত্রন করছে।

আজ তাহলে এটুকুই। Facade নিয়ে আরো একদিন লিখবো ঠিক করলাম মাত্র। আর ভালো কথা, চাইলে ঘুরে আসতে পারেন আমার ভালো বন্ধু অমিতের ব্লগ – Singleton Pattern এর আইডিয়া যদি পেতে চান।