Thursday, June 5, 2014

ম্যাথম্যাটিকার কারিকুরি

যেকোন নতুন প্রযুক্তির প্রকৃত ক্ষমতা যাচাইয়ের অন্যতম গুরুত্বপূর্ণ একটি পদ্ধতি হল এর সমস্যাগুলো আগে চিহ্নিত করা। কম্পিউটার সফটওয়্যারের ক্ষেত্রে এই কথাটি সবার আগে খাটে।
বিশ্ববিদ্যালয়ে পড়াশুনার শুরু থেকেই Mathematica নামক একটি বৈজ্ঞানিক বিশ্লষণ ও গাণিতিক হিসাব নিকাশ করার সফটওয়্যারের সাথে আমার পরিচিতি ঘটে। এবং পড়াশোনার প্রয়োজনেই এই সফটওয়্যারটির সাথে আমার সখ্য গড়ে উঠে। স্বভাববশত এই সফটওয়্যারের সীমাবদ্ধতাগুলো নিয়ে নিরীক্ষা চালাতে গিয়ে আমার কাছে এর সীমাহীন সক্ষমতা ও সম্ভাবনার দ্বার উন্মোচিত হয়। এইরকমই একটি বিষয় নিয়ে আজকে আমি এখানে আলোচনা করবো।
প্রকৃতপক্ষে Mathematica হল একটি অত্যন্ত শক্তিশালী Computer Algebra System(CAS)। বিভিন্ন জটিল গাণিতিক হিসাব নিকাশ, বিশ্লষণ, তুলনা, অনুমান কিংবা বিশাল সংখ্যক ডাটা নিয়ে কাজ করার জন্য এর সাথে রয়েছে অসংখ্য প্যাকেজ। আমরা খুব সহজেই সেইসব প্যাকেজ ব্যবহার করে আমাদের প্রয়োজনীয় কাজ গুলো খুব দ্রুততার আর নির্ভূলতার সাথে করতে পারি। Mathematica ব্যবহারকারিদের কাছে এই বিষয়গুলো খুব পরিচিত। আমি তাই পরিচিত বিষয়গুলোতে না গিয়ে বরং ভিন্ন একটি বিষয় নিয়ে এখানে কথা বলি।
Mathematica 9 এ বিভিন্ন social network নিয়ে কাজ করার জন্য অনেকগুলো নতুন টুলস যুক্ত করা হয়েছে। বিশেষ করে সোশ্যাল নেটওয়ার্ক নিয়ে গবেষণাকারীদের জন্য এই টুলসগুলো অনেক সহায়ক। তবে আমরা এখানে গবেষণা না করলেও এই টুলসগুলো দিয়ে অনেক মজার মজার কাজ করতে পারি। আমি এখানে Mathematica ব্যবহার করে আমার ফেইসবুক এর বন্ধু তালিকা থেকে একটি  Friend Circle Tree তৈরি করবো

এই কাজটি করার জন্য কম্পিউটারে অবশ্যই Mathematica 9 ইন্সটল করা থাকতে হবে এবং কম্পিউটারে ইন্টারনেট কানেকশন থাকতে হবে। বাকি প্রক্রিয়া নিচে বর্ণনা করা হল—
১/ আমাদের প্রথম কাজ হবে ফেইসবুক থেকে আপনার ID’র বিপরীতে একটি access token সংগ্রহ করা। নিরাপত্তার কারণে সবাইকে অনুরোধ করছি এই টোকেনটি কারো সাথে শেয়ার না করার জন্য। এই লিঙ্ক এ গিয়ে আপনার ID’র জন্য একটি access token সংগ্রহ করুন। টোকেনটি কোথাও সেভ করে রাখুন।

২/ এবার আপনার কম্পিউটারে Mathematica 9 ওপেন করুন। নতুন একটি notebook (nb) ফাইল খুলুন। ফাইলটি কোথাও সেভ করুন। উদাহরণ স্বরূপ ফাইলটি যেকোনো একটি নামে আপনার Desktop এ সেভ করতে পারেন।

৩/ এবারে নিচের কোডটি একেবারে হুবহু কপি করে আপনার notebook ফাইলে পেস্ট করুন এবং রান করান। ফাইলটি আবার সেভ করুন।

barprogress[var_, total_] := 
 Row[{ProgressIndicator[var, {0, total}], " ", 
   Row[{NumberForm[100. var/total, {\[Infinity], 2}], "%"}], "% ", 
   var}]
tostring[list_] := 
 StringReplace[ToString[list], {"{" -> "(", "}" -> ")", " " -> ""}]
getData[fList_] := 
 Module[{url, query, friendsData, fListString}, 
  fListString = tostring[fList[[All, 1]]];
  url = "https://api.facebook.com/method/fql.query?access_token=" <> 
    token <> "&query=";
  query = 
   url <> "SELECT uid, name, sex,pic_square FROM user WHERE uid in " <>
     fListString <> "&format=JSON";
  query = StringReplace[query, " " -> "%20"];
  friendsData = Import[query, "JSON"][[All, All, -1]]]
{cName, cPhotoLink, cSex, cCode} = Range[4];
getPairsPart[fList1_, fList2_] := 
 Module[{url, query1, friendsPairs, friendsStr1, firendsStr2}, 
  friendsStr1 = tostring[fList1];
  firendsStr2 = tostring[fList2];
  url = "https://api.facebook.com/method/fql.query?access_token=" <> 
    token <> "&query=";
  query1 = 
   url <> "SELECT uid1, uid2 FROM friend WHERE uid1 in " <> 
    friendsStr1 <> "and uid2 in" <> firendsStr2 <> "&format=JSON";
  query1 = StringReplace[query1, " " -> "%20"];
  friendsPairs = Import[query1, "JSON"];
  friendsPairs = (Sort /@ friendsPairs) // Union]
getList[] := 
 Rule @@@ Import[
    "https://graph.facebook.com/me/friends?access_token=" <> token, 
    "JSON"][[1, 2, All, All, 2]]
getPairs[friendsList_] := 
 Module[{groupsComb, groupsCompLen, maxUsers = 100, friendsPairs, 
   i = 1}, SetSharedVariable[i];
  groupsComb = 
   Partition[friendsList[[All, 1]], maxUsers, maxUsers, 1, {}];
  groupsComb = Subsets[groupsComb, {2}];
  groupsCompLen = Length[groupsComb];
  Print["Extracting Connections"];
  Print[Dynamic@barprogress[i, groupsCompLen]];
  friendsPairs = 
   Flatten[ParallelMap[(i++; getPairsPart @@ #) &, groupsComb], 1];
  friendsPairs = UndirectedEdge @@@ friendsPairs[[All, All, 2]];
  friendsPairs = Union[Sort /@ friendsPairs];
  Print[Row@{"Connections number: ", Length@friendsPairs}];
  friendsPairs]
getPhotos[friendsData_] := 
 Module[{append, friends, photos, page, i = 1, tabImg = {}}, 
  SetSharedVariable[i];
  SetSharedVariable[tabImg];
  Print["Extracting user pictures:"];
  Print[Dynamic@barprogress[i, Length[friendsData]]];
  Print[Dynamic@
    GraphicsGrid[
     If[Length[tabImg] == 0, {{""}}, 
      Partition[tabImg, 10, 10, 1, {}]], ImageSize -> 200]];
  append[data_Image] := 
   Module[{}, If[Length[tabImg] > 100, tabImg = {}];
    AppendTo[tabImg, data];
    data];
  photos = 
   ParallelMap[(i++; {append[Import[#[[cPhotoLink]]]], 
       ToString[#[[cCode]]]}) &, friendsData];
  Print[Row@{"Photo's number: ", Length[photos]}];
  photos]
adjustPhotos[friendsPhotos_, friendsPairs_] := 
 Module[{friends, photosSel, graph, page}, 
  graph = Graph@friendsPairs;
  friends = VertexList@graph;
  page = PageRankCentrality[graph, 0.1];
  page = Rescale[page, {0, Max[page]}, {0.1, 0.9}];
  page = Rule @@@ Transpose[{friends, page}];
  photosSel = Select[friendsPhotos, MemberQ[friends, #[[2]]] &];
  (#[[2]] -> 
      Hyperlink[Magnify[#[[1]], #[[2]]] /. page, 
       "http://www.facebook.com/profile.php?id=" <> #[[2]]]) & /@ 
   photosSel]
createGraph[friendsPairs_, friendsPhotosForVertex_] := 
 Module[{g1, g2, g3, label}, 
  g1 = Graph[friendsPairs, VertexShape -> friendsPhotosForVertex, 
    VertexSize -> 5, EdgeStyle -> Opacity[0]];
  g2 = Graph[friendsPairs, VertexSize -> 0, 
    EdgeStyle -> Thickness[0.0001]];
  label = 
   Graphics[{Style[Text["  Tariqul Dipu\nwww.tariquldipu.net  "], 
      Blue]}, ImageSize -> 100];
  g3 = Show[g2, g1, label, ImageSize -> 3000]]
facebookTree[] := 
 Module[{fbGraph}, SetDirectory[NotebookDirectory[]];
   Print["Extracting friends data"];
   friendsList = getList[];
   friendsData = getData[friendsList];
   friendsPairs = getPairs[friendsList];
   friendsPhotos = getPhotos[friendsData];
   photosForVertice = adjustPhotos[friendsPhotos, friendsPairs];
   Print["Plotting"];
   fbGraph = 
    createGraph[friendsPairs, photosForVertice] Print[
      "Creating PDF"];
   Export["Facebook Tree.pdf", fbGraph];
   Print["Your friend circle tree has been successfully created"];] //
   Quiet


৪/ এবারে নিচের কোডটি কপি করে আপনার nb ফাইলে আগের কোডটির নিচে পেস্ট করুন।
token = "YOUR ACCESS TOKEN";
facebookTree[]  
লক্ষ্য করুন, এখানে YOUR ACCESS TOKEN এর জায়গায় এই তিনটি শব্দ কেটে সেখানে আপনার একটু আগে কপি করা টোকেনটি পেস্ট করুন। ফাইলটি আবার সেভ করুন এবং কোডটি রান করান (shift+enter)


৫/ এবারে দেখুন আপনার ফ্রেন্ড সার্কেল ট্রি টি তৈরি হচ্ছে। ইন্টারনেট এর স্পীড উপর নির্ভর করে এটি তৈরি হতে ১-১০ মিনিট পর্যন্ত লাগতে পারে। এটি তৈরি হওয়ার পর অটোমেটিকভাবে আপনার nb ফাইলটি আগে যে ফোল্ডারে সেভ করেছিলেন ঠিক সেই ফোল্ডারেই Facebook Tree.pdf নামে নতুন একটি ফাইল তৈরি হয়ে যাবে।
ফাইলটি ওপেন করুন এবং আপনার ফেইসবুক বন্ধুদের মধ্যকার সংযোগ নিয়ে বানানো ট্রি টি দেখুন। প্রয়োজনে জুম করেও দেখতে পারেন।


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

No comments:

Post a Comment