<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های farhoud mojahedzadeh</title><link>https://virgool.ir/feed/@farhoud.m7</link><description></description><language>fa</language><pubDate>2026-11-12 08:25:12</pubDate><image><url>https://files.virgool.ir/upload/users/84762/avatar/avatar.png</url><title>farhoud mojahedzadeh</title><link>https://virgool.ir/@farhoud.m7</link></image><item><title>گراف دیتابیس Neo4j (نگاه کلی قسمت دوم)</title><link>https://virgool.ir/@farhoud.m7/گراف-دیتابیس-neo4j-نگاه-کلی-قسمت-دوم-lrsybgatg54w</link><description>قسمت های قبل:مقدمهنگاه کلی (قسمت اول)ما تا اینجا با دو عبارت CREATE و RETURN از عبارت های cypher یه آشنایی اولیه پیدا کردیم و یک ‌node برای فیلم ماتریکس ایجاد کردیم حالا می‌خوایم node ساخته شده را پیداش کنیم و بازیگرهای فیلم را ایجاد کنیم و فیلم وصلشون کنیم.جا داره اینجا با یه همراه خوبه دیگه آشناتون کنم:Neo4j Cypher Reference Cardمرجع جمع و جور cypher که بیشتر قابلیت های  cypher  رو دمه دستتون گذاشته. من خودم به شخصه وقتی با neo4j کار دارم این همیشه تو یکی از تب هام بازه.من مدلمون رو یکباره دیگه اینجا میزارم و بعد میریم سراغ ادامه داستان.Graph Domain Modelعبارتی که برای پیدا کردن node ها و relation ها در cypher استفاده خواهیم کرد: MATCH (variable :LABEL :ANOTHER_LABEL [{key: expected_value}]) [WHERE exp]برای نمونه:MATCH (m :Movie {title:&#39;The Matrix&#39;}) RETURN mعبارت MATCH کارش پیدا کردن الگوی گراف بعد از خودشه. در cypher  بالا ما از neo4j میخوایم که یک الگوی گراف درای یک node منتصب به متغیر m که لیبل :Movie دارد و key: value دارد به صورد title: &#39;The Matrix&#39;  را پیدا کند. و متغیر m را برگردان.MATCH (m :Movie)  WHERE m.title=&#39;The Matrix&#39; RETURN m الگوی گراف درای یک node که منتصب به متغیر m است و  لیبل :Movie دارد در صورتی که (WHERE)m.title و &#39;The Matrix&#39;  مساوی باشند را برگردان. نکته: در صورتی که متغیر node یا relation باشد می‌توان با . به property های آن دسترسی پیدا کرد (m.release)خوب اگه دستورات بالا رو مثل من اجرا کرده باشید احتمالا یه جوابی به صورت بالا گرفتین که تعداد نود هایی که برگردونده شدن با تعداد باری که دستور ساخت را در قسمت قبل اجرا کردین برابر هستش.حالا که یه مقداری با دستور MATCH آشنا شدیم میریم که بازیگرهای فیلم ماتریکس رو بسازیم و به فیلم وصل کنیم.// This is Comment&#xA;// First Part&#xA;MATCH (TheMatrix :Movie {title:&#39;The Matrix&#39;})&#xA;&#xA;//Second Part&#xA;CREATE (Keanu:Person {name:&#39;Keanu Reeves&#39;, born:1964})&#xA;CREATE (Carrie:Person {name:&#39;Carrie-Anne Moss&#39;, born:1967})&#xA;CREATE (Laurence:Person {name:&#39;Laurence Fishburne&#39;, born:1961})&#xA;CREATE (Hugo:Person {name:&#39;Hugo Weaving&#39;, born:1960})&#xA;CREATE (LillyW:Person {name:&#39;Lilly Wachowski&#39;, born:1967})&#xA;CREATE (LanaW:Person {name:&#39;Lana Wachowski&#39;, born:1965})&#xA;CREATE (JoelS:Person {name:&#39;Joel Silver&#39;, born:1952})&#xA;&#xA;// 3th Part &#xA;CREATE&#xA;(Keanu)-[:ACTED_IN {roles:[&#39;Neo&#39;]}]-&gt;(TheMatrix),&#xA;(Carrie)-[:ACTED_IN {roles:[&#39;Trinity&#39;]}]-&gt;(TheMatrix),&#xA;(Laurence)-[:ACTED_IN {roles:[&#39;Morpheus&#39;]}]-&gt;(TheMatrix),&#xA;(Hugo)-[:ACTED_IN {roles:[&#39;Agent Smith&#39;]}]-&gt;(TheMatrix)&#xA;&#xA;// back to back &#xA;CREATE (Emil:Person {name:&#34;Emil Eifrem&#34;, born:1978})&#xA;CREATE (Emil)-[:ACTED_IN {roles:[&#34;Emil&#34;]}]-&gt;(TheMatrix)&#xA;&#xA;RETURN TheMatrix, Keanu, Carrie, Laurence, Hugo&#xA;اول node فیلم که label اش :Movie و title اش &#39;The Matrix&#39; بود رو پیدا کنیمدوم برای بازیگرهامون node بسازیمسوم  relation های بین فیلم و بازیگرها رو بسازیم و وصل کنیم.در مورد قسمت اول و دوم صحبت کردیم. در قسمت سوم برای اولین بار با عبارت -[ :ACTED_IN]- آشنا میشیم. در CYPHER (رابطه) relation به صورت -[]- نمایش داده میشه و جهت گراف هم با &gt; یا &lt; یا در صورت عدم وجود relation دو طرفه مشخص میشه. :label و {key: value, ...  } هم مثل node هستند. که در موردشون صحبت کردیم.نکته: property ها میتوانند از جنس list که به صورت  ([1,2,3]) باشند. roles در cypher بالا ار جنس list است.خوب تو این قسمت روش ساخت رابطه رو با cypher به شما نشون دادم و موفق شدیم فیلم The Matrix رو فعلا در دیتابیسمون ذخیره کنیم.همونطور که می‌بینید اگه بیشتر از یه بار دستورات قسمت قبل رو اجرا کرده باشید کلی node و رابطه تکراری ایجاد کردید. ولی نگرانش نباشید من تو قسمت بعدی جریان اجرای cypher رو بیشتر توضیح میدم و trace میکنم. تا متوجه دلیل node و relation ها بشید.کنجکاویی: با استفاده از عبارت Match بازیگرهایی رو پیدا کنید که در فیلم ماتریکس بیشتر از 25 سال داشتند. Neo4j Cypher Reference Cardاگه سوال یا مشکلی داشتین حتما داخل کامنت ها بپرسید.</description><category>farhoud mojahedzadeh</category><author>farhoud mojahedzadeh</author><pubDate>Sat, 18 Jan 2020 18:48:19 +0330</pubDate></item><item><title>گراف دیتابیس Neo4j (نمای کلی قسمت اول)</title><link>https://virgool.ir/@farhoud.m7/گراف-دیتابیس-neo4j-نمای-کلی-قسمت-اول-zc2v78fadhfs</link><description>قسمت ها:مقدمهگراف تشکیل شده یکسری راس و یکسری یال که یال‌ها راس های مارو به هم وصل می‌کنن. بار اینکه دیتا مون رو مدل کنیم اون رو باید به شکل گراف مدلش کنیم (مدل کردن رو بیشتر توضیح خواهم داد ولی فعلا با من پیش بیاید تا یه نمای کلی از گراف و neo4j نشونتون بدم و بعدا در تمامی مفاهیم عمیق تر میشیم) مثل وقتی بخوایم یه گراف واسه فیلم و بازیگرها و کارگردانها داشته باشیم میتونیم اونو به این صورت نشون بدیم.گراف ۱ـ۱در Neo4j به راس، node و به یال‌، relation میگن (من هم قصد ندارم از اینجا به بعد ترجمشون کنم). node و relation هر دو داری یک یا چند label هستند که با : شروع میشن مثل :Actor, :Person و یکسری ویژگی property به صورت key: value مثل name: Jonathan, birthday: datetime(&#34;2019-01-01T00:00:00&#34;)و relation به صورت خاص دارای جهت می‌باشد.با این توضیحات من مدل گراف رو کاملتر می‌کنم:خوب الان که دیگه Neo4j میخوایم. اگه قسمت قبل رو خوندید من لینک دانلود و راه اندازی رو گذاشتم حالا اگه نخوندید:به صفحه دانلودش Neo4j برید و دانلودش کنید.بعد نصبش کنید.حالا داخل مرورگرتون http://127.0.0.1:7474 را باز کنید.یوزر و پسورد پیشفرض noe4j هستش.از اینجا به این محیط دشبورد میگیم.زبانی که ما با Neo4j حرف میزنیم cypher هستش و بیشتر شبیه ascii-art میمونه تا زبان. (البته دسته کم نگیریدش غولیه واسه خودش)می‌خوایم گراف بالا را در neo4j بسازیم برای اینکار وارد دشبورد بشید و متن زیر را در command line input وارد کنید:CREATE (TheMatrix :Movie {title:&#39;The Matrix&#39;, released:1999, tagline:&#39;Welcome to the Real World&#39;})&#xA;RETURN TheMatrixاین صحنه رو اصولا باید ببیند:در cypher یک Node به صورت زیر بیان میشه :(variable :label {key:value})عبارت CREATE برای ایجاد node جدید استفاده میشه که گراف بعد از خودش رو سعی میکنه بسازه.پس در خط اول ما با استفاده از cypher از neo4j میخوایم که:یک node جدید بسازد با label ی :Movie با property های &#39;title: &#39;The Matrix و ...و node ساخته شده رو در متغیر TheMatrix بریزد.همونطور که میبنید neo4j چیزی به اسم schema ندارد و شما آزادید هر جور دلتون می‌خواد هرچی می‌خواین بسازین. همینجا فقط اشاره می‌کنم که property ها در neo4j داری type هستند که ما تا الان با یک Number برای release و دوتا String  برای title و tagline روبه رو شدیم که cypher خودش تشخیص میده. (type های بیشتری وجود داره و در آینده میگم براتون.)عبارت RETURN هرچی سمت راستش باشه رو برمی‌گردونه. که در خط دوم تو دشبورد باعث نمایش محتوایات متغیر TheMatrix که یه نود توشه میشه! در قسمت بعد سعی می‌کنیم نودی که برای فیلم The Matrix ساختیم رو پیدا کنیم و بازیگر‌هاشو بسازیم و بهش وصل کنیم.</description><category>farhoud mojahedzadeh</category><author>farhoud mojahedzadeh</author><pubDate>Tue, 07 Jan 2020 20:27:04 +0330</pubDate></item><item><title>آنچه اشتباه پیش رفت! (نگاه کلی و توجیحات :دی)</title><link>https://virgool.ir/@farhoud.m7/آنچه-اشتباه-پیش-رفت-نگاه-کلی-و-توجیحات-دی-lufz5ir4htyx</link><description>خوب بزرگترین اشتباهات من در طول این چندین سال تا اینجا باعث شده که ۳ تا از بچه هام (پروژه هام) بعد از من یتیم بشن و بعد چند وقت بمیرن و این یه جورایی درناکه! من همیشه پروژه هارو در زمان درست رسوندم و تحویل دادم ولی یه چیزی باعث میشه بعد از این که اون شرکت رو ترک میکنم بچمو نتونن جمع کنن و خوب میمیره!اولین و بزرگترین مسئله نداشتن طراحی درست درمون!خوب وقتی از دانشگاه آزاد میای بیرون احتمالا خیلی بلد باشی uml و use case بلدی بکشی و وقتی جزو استارت‌آپی باشی که توانایی مالی یه طراح رو نداره اونوقت مجبوری از خلاقیتت استفاده کنی و تمامی چرخ ‌ها رو دوباره اختراع کنی مخصوصا اگه زبان اولت جاوا اسکریپت و تایپ اسکریپت باشه! بعد بشینی ۳-۴ تا کتاب بخونی و بفهمی که وای چقدر اشتباه کردی ولی وقتی یه تصمیمی رو در طراحی گرفتی و یه چیزی رو پیاده کردی اصولا راه برگشتی نیست ! (اینو همیشه به خاطر داشته باشید حتی اگه جونیور هستین شما طراحین هستین و کدتون یه راه حل که دارین طراحیش می‌کنید.)خوب حالا از بیسوادی من که بگذریم یه مشکل بزرگ تر وجود داره و اینکه OO (object oriented)  داره به آخرای راه میرسه. چون در طول این مدت که در حال استفاده بوده اکثر قول هایی که میده رو نمی‌تونه انجام بده (ارث‌بری و پلیمورفیسم و قابلیت استفاده مجدد). اکثرا خروجی این طراحی پر از کد بویلر (اضافه) تکراری هستش و تقریبا قابلیت resue را نخواهد داشت. مسئله دیگه این هست که با پیشرفت CPU ها قابلیت اجرای موازی (parallelism, concurrency ) خیلی مورد توجه قرار گرفته که OO در این زمینه هم ضعیف عمل می‌کنه (خدا وکیلی تا حالا هر بار سعی کردم از مولتی تردینگ یا مولتی پراسس استفاده کنم هزار بار خودمو لعنت کردم). هیچ وقت از دیتابیس برای دیزاین شروع نکنید چون یه جایی میرسه که متوجه می‌شید کلی از بیزنس وارد دیتا بیس شده و تغییرات خیلی سخت و زمان بر میشن به شخصه یه دفعه مجبور شدم ۷۶ تا کووری رو به خاطر یک نیازمندی جدید عوض کنم !معماری ماکروسرویس ممکنه خیلی جذاب باشه ولی اگه درست دیزاین نشه ممکنه یه منولیت خیلی بهتر باشه! به شخصه آخرین پروژه که نوشتم بر اساس ماکروسرویس بود ولی در آخر فهمیدم که یک مونولیت درست کردم که با داکر پوسته ماکروسرویس تنش کردم!راه حلی که من بهش رسیدم: Domain Driven Design با اسانس Reactive Functional.  با این راه حل هم می‌تونم مشکلاتی که بالا گفتم رو کاور کنم و هم مدل و کدی هماهنگ و گویا تولید کنم ! تا شاید بچه‌هام زندگی طولانی تری داشته باشن! (بیشتر در موردش خواهم نوشت).</description><category>farhoud mojahedzadeh</category><author>farhoud mojahedzadeh</author><pubDate>Wed, 01 Jan 2020 22:15:59 +0330</pubDate></item><item><title>گراف دیتابیس Neo4j (مقدمه)</title><link>https://virgool.ir/@farhoud.m7/گراف-دیتابیس-neo4j-مقدمه-iivbsapzxhgk</link><description>گراف یکی از روش‌های ذخیره و بازیابی اطلاعات هستش که چند سالی میشه خیلی محبوب شده و در خیلی از اینترپرایس ها دارن ازش استفاده می‌کنند مخصوصا در شبکه های اجتماعی و هوش مصنوعی.مهمترین مزیت گراف به نظر من این است که داده در مرحله ذخیره و بازیابی شباهت بیشتری به دنیای واقعی داره.  ساختار گراف، موجودت و روابطشون رو به راحتی در خودش جا میده و تقریبا هرچیزی رو میشه با گراف مدل کرد. در مقایسه با روش‌هایی مثل SQL که داده رو مجبوریم normalize کنیم یا منگو که مجبوریم داده را denormalize کنیم.یکی از پیشتازان و بهترین پیاده سازی هایی که از این سیستم دخیره و بازیابی وجود داره دیتابیس  Neo4j هستش. جدید ماکروسافت هم به sql server قابلیت گراف رو اضافه کرده که زیاد مورد پسند من نبود و به شخصه باهاش کار نکردم. درایور آفیشیال Neo4j  تقریبا واسه اکثر زبان‌ها برنامه نویسی وجود داره  و اگه هم نداشته باشه میتونید با اینترفیس REST باهاش کار کنید.این دیتابیس زبان مخصوص به خودش داره به اسم Cypher که برای ذخیره و بازیابی اطلاعات میشه ازش استفاده کرد.دیتابیس Neo4j یک رابطه کاربری تحت وب برای اجرای دستورات Cypher  و نمایش گراف و کلی کار باحال دیگه داره و چند نمونه داده آماده که من برای آموزش از همون ها استفاده خواهم کرد.دیتابیس Neo4j را با جاوا نشوتن و بر اساس JVM هستش (اگه براتون مهمه!) و برای نصب Neo4j کافیه به این لینک برید و دانلودش کنید و نصبش کنید.در قسمت بعدی با نمونه داده فیلم که خیلی شبیه داده های IMDB هست شروع می‌کنیم به آموزش ‌گراف و Cypher .</description><category>farhoud mojahedzadeh</category><author>farhoud mojahedzadeh</author><pubDate>Tue, 31 Dec 2019 19:10:35 +0330</pubDate></item><item><title>آنچه اشتباه پیش رفت! (قسمت مقدمه)</title><link>https://virgool.ir/@farhoud.m7/آنچه-اشتباه-پیش-رفت-قسمت-مقدمه-aulh7ydf3yke</link><description>من فرهود مجاهدزاده هستم و تقریبا ۴ سال میشه که به صورت حرفه‌ای وارد صنعت نرم افزار شدم و در هر مرحله از این دوره‌ی حرفه‌ای اشتباهاتی کردم که بیشتر از یک دهه قبل مردم انجام داده بودند و در موردش کتاب نوشته بودند ولی خوب من نمی‌دونستم! الان که دارم می‌خونم و بیشتر می‌فهمم می‌خوام اشتباهاتم رو اینجا بگم و در مورد مسائل تکنیکال روشی که الان فکر می‌کنم صحیح هست و تکنولوژی هایی که در این فرآیند باهاشون آشنا شدم رو به صورت فارسی با تو تقسیم کنم تا این ۲ سال سربازی تموم بشه!من نوشتن برام سخته و این اولین نوشته من خواهد بود. پس لطفا اگر خوندید و دوست داشتید به من فید بک بدید و برای حفظ حریم شخصی دیگران تمامی اسم ها و شرکت ها خیالی خواهند بود.همه چیز در مورد حرفه فعلی من از معمای لینوکس و آرزوی هکر شدن شروع شد.اولین کار حرفه‌ای  من در این زمینه یه استارت آپ بود که نزدیک ۵ سال پیش می‌خواست سرویس PAS و SAS بده.استارت آپ بعدی سرویس نوبت دهی پزشکان بود که نزدیک به یک سال کل سرویس رو بازنویسی کردیم.ستارت آپ بعدی شرکت بیگ دیتا بود که کار من کرال سایت های خبری و نشون دادن یه سری پارمتر بود.و بعد از اون (خسته از بی‌پولی و دربه‌دری) کارمند شدم، در یک شرکت هواپیمایی به عنوان مهندس نرم افزار در تیم هوش مصنوعی مشغول کار شدم.خلاصه بزرگترین اشتباهات من:طراحی نا مشخص و انقلابی (آشفته و پر از ندونم کاری) یا گوگل محور.علاقه شدید به استفاده از تکنولوژی جدید به جای حل مشکلات بیزنسی.عدم در نظر گرفتن سایز بازار ایران و تلاش برای رقابت با تورم و سود بانکی و رانت .مفاهیم و تکنولوژی هایی که در چندین سال با هاشون آشنا شدم و می‌خوام باتون به اشتراک بزارم:طراحی domain driven design یا به اختصار DDDبرنامه نویسی فانکشنالگراف دیتابیس Neo4jموتور جستجوی ElasticSearchزبان های برنامه نویسی که با اونها کار کردم و ممکنه در موردشون بنویسم:js-es6, type-script, python, java, scalaدر اولین مرحله که استارت آپ کلاد بود خیلی خلاصه می‌خوام براتون بگم که هیچ وقت سعی نکنید نرم افزاری در سطح دیتا سنتر (Open Stack)را  روی 3 تا لپ تاپ بیارید بالا. و بعد یه ماژول beta بهش اضافه کنید تا به مشتری دمو بدید. چون نمیشه فقط آبروتون میره !از دید بیزنسی هم استارت آپی که فاندرش داره میره رو عضوش نشید وقت تلف کردن خواهد بود.</description><category>farhoud mojahedzadeh</category><author>farhoud mojahedzadeh</author><pubDate>Sat, 28 Dec 2019 18:01:55 +0330</pubDate></item></channel></rss>