گیک فارسی

نوشته های یک گیک فارسی از فعالیت ها ،‌ علاقه مندی ها و نقد هایش

تشکر از بازیکنان و تیمی که همه ایران را خوشحال میکنه

نویسنده:
۸ تیر ۹۴

یکی از چیز هایی که ما باید یاد بگیریم این هست که فقط موقع برد و نتیجه خوب گرفتن به‌به و چه‌چه نکنیم و زمانی که یک تیم خوب و بسیار قابل احترام و دوست‌ داشتنی مثل تیم والیبال ایران داریم که باعث افتخار و خوشحالی مردم کشورمون شده و حالا به هر دلیلی یک بازی خیلی مهم را توی خونه نتیجه نگرفته ، به جای گلایه و دلخوری یاد برد های شیرین بکنیم و امیدوار باشیم در آینده نزدیک دوباره موفق باشه.

والیبال - ایران - لیگ چهانی ۲۰۱۵

من از طرف خودم به خاطر همه تلاش‌ها و زحماتی که تک تک بازیکنان و کادر فنی خوب والیبال ایران کشیدن ازشون تشکر میکنم و امیدوارم در آینده برد های شیرین را تکرار کنند.

به امید درخشش در بازی‌های جام جهانی والیبال

توضیحات مختصر و مفید در مورد خطای Headers Already Sent در PHP

نویسنده:
۴ تیر ۹۴

یکی از متداول ترین پرسش های برنامه نویسان در انجمن‌های PHP در مورد خطای Headers Already Sent هست.PHP به صورت عادی اطلاعات را Buffer نمیکنه ، یعنی خروجی ها را در لحظه ارسال میکنه ، خیلی ساده اگه بخوام بگم ، ارسال ها را به دو دسته تقسیم میکنیم یکی Header ها و دیگری Content یا همون محتوا ،‌Header ها قبل از محتوا ارسال میشن و این یک قرارداد بر اساس HTTP Protocol هست.

headers already sent

PHP وقتی شما اولین مقدار حالا بایت یا کاراکتر یا هر چی را ارسال میکنید ابتدا Header های استاندارد و اونهایی که شما با تابع ()header ارسال کردین را میفرسته و بعدش شروع به ارسال محتوا میکنه. حالا اگه شما بعد از ارسال محتوا تابع ()header را صدا بزنین خیلی طبیعیه که PHP بگه Header ها را ارسال کردم و نمیشه شما Header دیگری بفرستی !

این محتوا بعضی مواقع میتونه یک Space هم باشه یا کاراکتری که به چشم نمیاد مثل BOM که ادیتور ها برای فایل های یونیکد اضافه میکنن یا خطایی که PHP داره در موردش توی خروجی توضیح میده یا ممکنه خود شما بدون اینکه متوجه باشین دارین یک مقداری را با echo یا print ارسال میکنید.
در زمانی که این خطا را میبینید PHP در انتهای توضیح با Output Started At اشاره میکنه که اولین خروجی در چه فایلی و کجاش ارسال شده که میشه با بررسی اون فایل متوجه مشکل شد و اون را رفع کرد. راه دیگه این هست که با یک درخواست Http از یک نرم افزار مثل wget توی لینوکس یا هر چیز متشابه دیگه توی ویندوز بیایم و خروجی را بررسی کنیم و ببینیم داره چی ارسال میشه و بعدش اون مقدار را توی فایل هامون جستجو و مرتفع کنیم.

اگه بخوایم این حالت را نداشته باشیم و رفتاری شبیه به ASP .NET داشته باشیم باید به PHP بگیم خروجی را در لحظه ارسال نکنه و اون را Buffer کنه و در آخر همه را با هم اعم از Header و خروجی ارسال کنه. برای این کار از Output Buffering استفاده میکنیم. برای این کار قبل از شروع کد ها تابع ()ob_start را صدا میزنیم و در آخر هم ()ob_end_flush باعث ارسال اطلاعات به مرورگر کاربر میشه.

به طور کلی Output Buffering را فقط زمانی توصیه میکنم که واقعاً قصد دخل و تصرف در محتوا قبل از ارسال به کاربر را داشته باشین و در غیر این صورت روش معمول کفایت میکنه و بهتره با کمی صبر و بررسی مشکل ارسال Header را بررسی کنید.

معرفی و نظر من در مورد سریال Halt And Catch Fire

نویسنده:
۲۸ خرداد ۹۴

من خیلی کم پیش میاد که وقتم را بیش از حد برای دیدن یک سریال بگذارم اما وقتی اولین قسمت سریال Halt And Catch Fire را دیدم خیلی لذت بردم و همه ۱۰ قسمتش را در کمتر از ۳ یا ۴ روز دیدم و الان که دارم این پست را مینویسم آخرین قسمت فصل اول را تموم کردم.

سریال Halt And Catch Fire

اگه به کامپیوتر ،‌ سخت افزار ، برنامه نویسی ، تجارت ،‌ خلاقیت و درام تلویزیونی علاقه‌مند هستین بدون شک باید این سریال را ببینین. سریال در فضای پیشرفت شرکت های بزرگ کامپیوتری مثل IBM ، Apple و Microsoft در دهه ۸۰ قرن بیستم سیر میکنه و مشکلاتی که این شرکت ها در تکامل سخت‌افزار ، نرم‌افزار و رسیدن به یک محصول سریعتر و ارزان‌تر داشتن را به تصویر میکشه که البته داستان زندگی اشخاص ، روابط اونها و پیشامد های دراماتیک هم به جذابیت سریال کمک میکنه.

سریال محصول شرکت AMC ، تولید کننده سریال های موفقی مثل Mad Men و The Walking Dead هستش و با توجه به تجربه موفق AMC در به تصویر کشیدن دنیای تبلیغات در دهه ۶۰ میلادی با سریال Mad Men یک تجربه موفق دیگه این بار در دنیای کامپیوتر و در دهه ۸۰ رقم زده و شما خودتون را توی اون سال‌ها با حال و هوای خاص خودش خواهید دید.

نقش اول سریال را Lee Pace بازی میکنه که معروف ترین هنرپیشه سریال هست و مهمترین نقشی که ازش به یاد دارم Maked Bandit در فیلم The Fall هستش اما باقی هنرپیشه ها را کلاً نمیشناختم. البته این موضوع اصلاً مهم نیست چون John Ham را کسی قبل از Mad Men نمیشناخت ولی با بازی خوبش تونست یک شخصیت منحصر به فرد برای خودش بسازه. البته انقدر که دنیای کامپیوتر این سریال را جذاب میکنه هنرپیشه هاش خیلی نقشی ندارن. به طور کلی شاید هر کسی از سریال خوشش نیاد اما خیلی خیلی بعیده کسی در زمینه کامپیوتر فعالیت داشته باشه و از این سریال لذت نبره.

چگونگی پیمایش و نمایش داده‌ها با فرمت والد و فرزندی یا همون درختی در PHP

نویسنده:
۲۱ خرداد ۹۴

یکی از سؤالات با فراوانی زیاد که توی انجمن‌ها و گوشه کنار اینترنت بهش بر خوردم بحث داده‌های والد و فرزندی یا همون ساختار های درختی بوده. با وجود اینکه توی خیلی از دروس دانشگاهی همین ایران در مورد ساختار های درختی و روش‌های پیمایش اون ها بحث میشه و تمرین و سؤال امتحانی ازشون میاد ولی خیلی از فارغ التحصیلان رشته نرم‌افزار دقیقاً نمیدونن ساختار های درختی چه کاربردی دارن ، البته خیلی هم جای سؤال نیست وقتی مثال‌ها و تمرین‌هایی که توی کلاس حل میشه با کاربردهای اصلی که توی دنیای واقعی وجود داره خیلی خیلی فاصله داره.

ساختار والد و فرزند

از مهمترین کاربردهایی که این ساختار های والد و فرزندی دارند بخش‌های مربوط به پیمایش وب سایت‌ها هستند که میتونه منوی آبشاری (عمودی یا افقی) یا دسته بندی کالا های یک فروشگاه یا نمایش پوشه و فایل و غیره … باشه. در واقع اگر نیاز داشته باشیم که این منو ها یا دسته بندی ها را به صورت دینامیک ایجاد کنیم و مدیر سایت بتونه توشون دخل و تصرف کنه حتماً باید بدونیم چطور باید اونها را پیمایش کنیم و توی UL/LI لیست ها که مورد نیاز اسکریپت های منو آبشاری و کنترل های درختی هستند استفاده کنیم.

من کل توضیحات پایین را به صورت عملی در قالب یک پایگاه داده Sqlite و فایل سورس برنامه و کنترل درختی jsTree به این پُست ضمیمه کردم که میتونید از اینجا دانلود کنید. اما حتماً توضیحات زیر را بخونید تا متوجه باشین کل کار چطور انجام شده.

به چند روش میشه داده‌های درختی را توی پایگاه داده قرار داد اما متداول ترین اون ها که در این پُست هم با اون کار میکنیم به این شکل هست که جدول داده شامل سه ستون اصلی (شماره رکورد یا همون ID ، نام Node و شماره رکورد یا همون ID والد) هستش. برای پیمایش داده‌ها هم از طریق یک حلقه و تابع بازگشتی عمل میکنیم و داده‌ها را نمایش میدیم.

مهمترین نکته‌ای که در زمان نمایش داده‌ها توی حلقه پیمایش و تابع بازگشتی باید رعایت کنیم این هست که باید تکنیکی را به کار ببریم تا نیاز نباشه برای هر Node و دریافت فرزندانش یک Query به پایگاه داده بزنیم. اگه تعداد والد ها و فرزند ها زیاد باشه این Query های زیاد باعث میشه Performance به شدت پایین بیاد. برای حل این مشکل یکبار همه داده‌ها را با Query از جدول میخونیم و دو آرایه با ایندکس های متفاوت والد و شماره رکورد ایجاد میکنیم. آرایه با ایندکس والد اطلاعات کامل Node خودش را نگه میداره و آرایه با ایندکس شماره رکورد نام Node و والد را نگه میداره. البته آرایه دوم فقط برای محاسبه مسیر یک Node تا ریشه کاربرد داره و میتونید اصلاً ایجادش نکنید.

دو تا ریزه کاری کوچیک دیگه هم توی سورس هست که بهتره اشاره کنم. یکی اینکه توی توابع بازگشتی متغیری که ساختار HTML مربوط به UL/LI (در تابع make_list) و متغیری که نام Node را نگه میداره (در تابع add_path) با Reference داده شده و دومی اینکه در زمان نمایش مسیر از ریشه تا Node مورد نظر چون داریم از پایین به بالا حرکت میکنیم در آخر باید آرایه را Reverse کنیم تا نمایش صحیحی از مسیر داشته باشیم. در مورد نمایش مسیر از ریشه هم طبیعیه که مثلاً باید شماره ID رکورد Node را داشته باشیم.

توجه : منظور از Node کلی هست و میتونه نام منو یا نام دسته باشه.

این یکصدمین پُست من توی این وبلاگ بود و امیدوارم با همت و تلاش بیشتر این روند را ادامه بدم.

پی نوشت : توی نظرات یکی از دوستان میخواست بدونه چطور یک node با تمام زیر شاخه هاش حذف کنیم. خوب کار سختی نیست و کافیه id اون node و زیر شاخه هاش را بدست بیاریم و query مربوط به حذف را بنویسیم :

			function list_child_ids($id,&$arr){
				global $nodes;
				$arr[] = $id;
				foreach($nodes[$id] as $node){
					if (isset($nodes[$node["c_id"]]) && is_array($nodes[$node["c_id"]]))
					list_child_ids($node["c_id"],$arr);
				}
			}
			
			function remove_node_tree($id){
				global $db_path;
				$ids = array();
				list_child_ids($id,$ids);
				
				$db = new SQLite3($db_path);
				$stm = $db->prepare("delete from countrycity where c_id in (".implode(",",$ids).")");
				$stmt->execute();
				$stmt->close();	
				$db->close();			
			}