<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های Ramin Mehraninejad (raminpix)</title><link>https://virgool.ir/feed/@raminpix</link><description>توسعه‌دهنده نرم‌افزار و علاقه‌مند به هوانوردی، کیهان‌شناسی، نوشتن و کشف ناشناخته‌ها...</description><language>fa</language><pubDate>2026-11-11 16:39:32</pubDate><image><url>https://files.virgool.ir/upload/users/18576/avatar/DqUbZC.png</url><title>Ramin Mehraninejad (raminpix)</title><link>https://virgool.ir/@raminpix</link></image><item><title>کاوشگر 755 - فصل دوم - قسمت 3</title><link>https://virgool.ir/@raminpix/کاوشگر-755-فصل-دوم-قسمت-3-xzo1vk3qovjk</link><description>تمام وجودش در Star-Ship-1 شده بود کار روی ماژول انتقال اطلاعات. در شروع کار این فکر مدام در ذهنش می آمد که باید پاسخ مناسبی به اعتماد دوباره همکاران و فرمانده Max بده و از اینکه بخش مهمی از ساخت تلسکوپ Deep Sight بهش محول شده سربلند بیرون بیاد. بخاطر همین بیشتر زمانش رو به کار انفرادی روی ماژول اختصاص داده بود و سعی می کرد از پس تمامی چالش ها به تنهایی بربیاد. شاید پرسش و کمک گرفتن از دوستانش براش سخت بود، شاید هم غرورش بهش اجازه نمی داد! مدت ها از زمان تکمیل ماژول گذشته بود و موعد تست های اولیه در آزمایشگاه تست های اولیه فرا رسید.همه چیز به نظرش مناسب می رسید. طبق تست هایی که کرده بود، تمامی بخش های داخلی ماژول به خوبی و بطور کاملا هماهنگ با هم کار می کردند.طبق برنامه قرار شد صبح روز دوشنبه تست ها انجام بشه! لحظه شماری می کرد، مثل همیشه هم هیجان داشت و هم ترس! هیجان از خلق یک چیز جدید و ترس از شکست!!!بلاخره روز موعود فرا رسید. به همراه دوستانش و فرمانده Max برای انجام تست های ماژول وارد آزمایشگاه شدند. طبق برنامه قرار بود تست های مختلف توسط کاوشگر Nightingale انجام بشه و بعد از تایید برای اتصال به Deep Sight آماده بشه.&#34;خب 755 ماژول برای تست آماده هست؟&#34; با شنیدن پرسش Nightingale، صدایش را صاف کرد و گفت: &#34;بله! طبق برنامه! همه چیز آماده! ماژول روشن! اتصالات برقرار و نمایشگر کنترل فعال!&#34;کاوشگر Nightingale که مدت ها بود روی پروژه Deep Sight کار می کرد، از تبهر خاصی در تست ماژول های مختلف برخوردار بود و به همین خاطر فرمانده Max مسئولیت تست نهایی ماژول ها پیش از اتصال به تلسکوپ را به Nightingale سپرده بود.مدت زمانی گذشت و تست ها یکی پس از دیگری انجام می شد و طبق روال رایج تقریبا تست های برنامه ریزی شده رو به اتمام بود.&#34;فکر کنم دیگه تموم!&#34; این رو با خودش زمزمه کرد که ناگهان نمایشگر کنترل وجود اشکالی در یکی از بخش های ماژول را نشان داد. صدای Alarm وجود اشکال سکوت آزمایشگاه را شکست. همه دوستان اش به همراه فرمانده Max که تا چند لحظه قبل خیلی آرام نظاره گر فرآیند تست بودند ناگهان به حالت نیم خیز و هوشیار تغییر حالت دادند.کاوشگر Nightingale دوباره تستی که با اشکال روبرو شده بود را انجام داد! همچنان نمایشگر وجود اشکال را در ماژول نشان می داد. انگار دنیا روی سر 755 خراب شده بود! چیزی که مثل یه شبح دنبالش بود یعنی شکست آزمایش! حالا بهش حمله ور شده بود! با خودش فکر کرد یعنی کجا رو اشتباه کرده بود؟! &#34;همه چیز که درست بود! من بارها همه چیز بررسی کرده بودم! کار می کرد...&#34;فرمانده Max و تمامی دوستانش به او و Nightingale نگاه می کردند و منتظر یک واکنش از طرف 755 بودند.کاوشگر Nightingale خیلی سریع و کوتاه گفت: &#34;تست شماره 235 از بخش 3B، تست مرتبط با منبع انرژی ذخیره (Standby Power Source - SRS) آیا تست SRS را قبلا انجام داده بودی 755؟&#34;755 که بخاطر این اتفاق انگار ذهنش متوقف شده بود، بی اختیار گفت: &#34;نمی دانم!&#34;ناگهان همهمه ای بر پا شد و خود 755 هم از جوابی که داده بود متعجب شد و به خاطر همین بلافاصله گفت: &#34;یک لحظه لطفا! دارم بررسی می کنم!&#34;به سرعت سراغ قسمت ثبت تست های انجام شده در کامپیوتر متصل به ماژول رفت و گفت &#34;بله 235 اما از بخش 3A! چیزی به اسم 3B اینجا وجود نداره!&#34;کاوشگر Nightingale با شنیدن این جمله بلافاصله پاسخ داد: &#34;آه! حتما فراموش کردی از آخرین دستورالعمل های تست SRS استفاده کنی! آنها در ضمیمه شماره 5 هستند!&#34;و 755 در پاسخ گفت: &#34;ضمیمه شماره 5؟! من همچنین چیزی ندارم!&#34;و Nightingale به سرعت گفت: &#34;همه از ضمیمه شماره 5 اطلاع دارند!&#34;فرمانده Max که بحث بین 755 و Nightingale رو می دید، سعی کرد اوضاع را آرام کنه: &#34;رفع مشکل مرتبط با SRS خیلی طول نمی کشه! می تونیم پس فردا دوباره تست ها را انجام بدیم!&#34;فرمانده Max به 755 زمانی برای جبران این مشکل داده بود، اما 755 از شرایطی که پیش اومده بود به شدت عصبانی و دل زده شده بود و با خودش فکر می کرد: &#34;چرا هیچ کس در مورد دستورالعمل به این مهمی به من چیزی نگفته! چرا؟! چرا؟! چرا؟!&#34;با این افکار به سرعت ماژول و وسایلش را برداشت و از آزمایشگاه خارج شد.روز خوبی رو شروع نکرده بود و بقیه روز هم تمرکز لازم برای پیدا کردن مشکل SRS نداشت!به خاطر همین تصمیم گرفت فردا کارش را با انرژی بیشتری شروع کنه! به این امید که بتونه هرچه سریعتر اشکال را برطرف کنه و برای انجام تست مجدد به فرمانده Max و کاوشگر Nightingale اطلاع بده!قبلی: کاوشگر 755 - فصل دوم - قسمت 2</description><category>Ramin Mehraninejad (raminpix)</category><author>Ramin Mehraninejad (raminpix)</author><pubDate>Sun, 05 Jun 2022 20:52:45 +0430</pubDate></item><item><title>کاوشگر 755 - فصل دوم - قسمت 2</title><link>https://virgool.ir/@raminpix/کاوشگر-755-فصل-دوم-قسمت-2-adn4ouuz1wac</link><description>در همان حالی که مشغول تماشای منظره سیاره مادر بود، صدایی او را به خود آورد. کاپیتان Islander، برای اتصال ماژول جدیدی به تلسکوپ Deep Sight به کمک 755 نیاز داشت. او و کاپیتان Islander خاطرات زیادی از گذشته داشتند. از زمانی که 755 به عنوان یک کاوشگر تازه کار به دژ فضایی Star-Ship-1 آمده بود و تحت نظر کاپیتان Islander کار می کرد تا زمانی که قصد ترک Star-Ship-1 را به مقصد سیاره جدید داشت.در واقع بخشی از بهترین خاطرات 755 مربوط به دوران حضورش در Star-Ship-1 بود.مثل  گذشته خیلی سریع مشغول شدند و بعد از چند ساعت کار و انجام تست های مختلف ماژول بصورت کامل بر روی تلسکوپ Deep Sight نصب شد.چند دقیقه بعد از نصب ماژول جدید، فرمانده Max او را فراخواند. طرح اولیه ساخت ماژولی مهم که بخش حساسی از Deep Sight را تشکیل می داد. این ماژول وظیفه انتقال داده های دریافتی از آنتن های رادیویی تلسکوپ به هسته اصلی پردازشگر تلسکوپ را داشت.  او و فرمانده Max طرح را بررسی کردند و  در نهایت قرار شد 755 به همراه کاوشگر nightingale، طرح اولیه را برای نصب بر روی Deep Sight تکمیل کنند.با خودش فکر می کرد که آیا از پس چنین پروژه ای برخواهد آمد یا نه. و این اولین چالش جدی اش پس از ورود دوباره به Star-Ship-1 بود.قبلی: کاوشگر 755 - فصل دوم - قسمت 1بعدی: کاوشگر 755 - فصل دوم - قسمت 3</description><category>Ramin Mehraninejad (raminpix)</category><author>Ramin Mehraninejad (raminpix)</author><pubDate>Fri, 17 Dec 2021 01:21:15 +0330</pubDate></item><item><title>کاوشگر 755 - فصل دوم - قسمت 1</title><link>https://virgool.ir/@raminpix/کاوشگر-755-فصل-دوم-قسمت-اول-nklsuzckrdgk</link><description>بعد از یک سفر طولانی به Star-Ship-1 رسید. در هنگام وارد به دژ فضایی Star-Ship-1 خاطرات گذشته اش دوباره برایش مرور شد. زمانی نه چندان دور، به همراه دوستانش در Star-Ship-1 به عنوان کاوشگر دوربرد کار می کرد. خاطرات اش از Star-Ship-1 بخش جدایی ناپذیر وجودش بود...برای چند لحظه از زمان حال جدا شده بود، اما تکان های سفینه موقع اتصال به Star-Ship-1 او را متوجه خودش کرد. نفسی از اعماق وجودش کشید و با خودش گفت: &#34;دوباره Star-Ship-1 !!!&#34;. فکر می کرد زمان به عقب برگشته. خیلی از دوستان و همکارانش هنوز در آن دژ فضایی بزرگ و قدیمی مشغول به کار بودند. کاپیتان Max، که حالا به درجه فرماندهی کاوشگران دوربرد رسیده بود منتظر ورودش بود. همینطور دوست و مربی قدیمی اش کاپیتان Islander.همه چیز جالب و هیجان انگیز بود. خیلی از کاوشگران جوان و تازه کاری که در زمان خروج 755 از Star-Ship-1 وارد دژ شده بودند حالا به کاوشگران ارشدی تبدیل شده بودند که حرف های زیادی برای گفتن داشتند. خیلی های دیگر هم همزمان با 755 دژ را ترک بودند و هیچ وقت برنگشته بودند. اولین چیزی که از خودش پرسید این بود که برای چه دلیلی توسط فرماندهی ارشد ناوگان فضایی، مستقیما به Star-Ship-1 فراخوانی شده!سوالی که بلافاصله بعد از ورودش به ارشه فرماندهی دژ، از طرف آدمیرال EagleEye - دستیار اصلی فرماندهی ارشد ناوگان فضایی که خودش شخصا پیشنهاد حضور 755 در Star-Ship-1 را داده بود پاسخ داده شد.&#34;ما از شما خواستیم به اینجا بیاید تا در ساختن تلسکوپ جدید Deep Sight که برای اکتشاف فضای عمیق (Deep Space) استفاده خواهد شد به ما کمک کنید.&#34;&#34;این باعث افتخار من هست.&#34;و با این مکالمه کوتاه، کاوشگر 755 رسما به پروژه استقرار تلسکوپ فضایی Deep Sight ملحق شد. برخلاف روال های مرسوم و تشریفات رسمی خیلی سریع به واحد اصلی ساخت و استقرار تلکسوپ وارد شد. جایی که کاوشگران مشغول ساختن Deep Sight بودند. فرمانده Max که حالا مسئولیت این پروژه را بر عهده داشت به همراه دوستان قدیمی از 755 استقبال گرمی کردند. حضور کاپیتان Islander، کاوشگر  nightingale و بقیه کاوشگران مثل روزهای گذشته لحظات خوبی را برایش تداعی می کرد.مثل همیشه از پنجره های دژ فضایی تصویر سیاره مادر و درخشش خورشید دیده میشد. همانطور که از پنجره مشغول تماشای سیاره مادر بود، به حضور خودش در Star-Ship-1 فکر می کرد. همه چیز هیجان انگیز و مثل یک خواب بود. گویی راه جدیدی او را به حرکت فرا می‌خواند.قبلی: کاوشگر 755 - فصل اول - قسمت 18بعدی: کاوشگر 755 - فصل دوم - قسمت 2</description><category>Ramin Mehraninejad (raminpix)</category><author>Ramin Mehraninejad (raminpix)</author><pubDate>Tue, 07 Dec 2021 01:42:11 +0330</pubDate></item><item><title>بررسی Sequence pre allocation  در JPA (پیاده‌سازی‌های Hibernate و EclipseLink)</title><link>https://virgool.ir/javacup/بررسی-sequence-pre-allocation-در-jpa-پیاده-سازی-های-hibernate-و-eclipselink-uwzux2n11xj2</link><description>در JPA برای تولید مقدار خودکار (GeneratedValue) مورد استفاده در فیلد‌های Identifier استراتژی‌های مختلفی وجود دارد. در اینجا قصد داریم استراتژی Sequence را در JPA (پیاده‌سازی‌های EclipseLink و Hibernate) و با استفاده از دیتابیس Oracle که دارای مکانیزم تولید Sequence می‌باشد بررسی کنیم.فرض کنید قصد داریم نام افراد را در جدول PERSON در دیتابیس Oracle ذخیره کنیم:create table PERSON&#xA;(&#xA;    ID   NUMBER(19) not null&#xA;        primary key,&#xA;    NAME VARCHAR2(255 char)&#xA;)همانطور که مشاهده می‌شود Primary Key جدول Person فیلد ID از نوع عددی می‌باشد. و قصد داریم فیلد ID را توسط GeneratedValue و با استفاده از Sequence مقداردهی کنیم.همچنین Entity بنام Person که دارای دو فیلد Id و name می‌باشد نیز وجود دارد:@Table&#xA;@Entity&#xA;public class Person implements Serializable {&#xA;&#xA;    @Id&#xA;    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = &#xA;     &#34;personSequenceGenerator&#34;)&#xA;     @SequenceGenerator(name = &#34;personSequenceGenerator&#34;, sequenceName = &#xA;     &#34;SEQ_PERSON&#34;, allocationSize = 50)&#xA;     private Long id;&#xA;&#xA;   private String name;&#xA;&#xA;// Getters and Setters...&#xA;  }در زمان عملیات Insert فیلد Id از  SequenceGenerator بنام personSequenceGenerator مقدار می‌گیرد که personSequenceGenerator نیز خود از SEQ_PERSON که یک Sequence تعریف شده در دیتابیس Oracle می‌باشد استفاده می‌کند:ایجاد Sequence (SEQ_PERSON) در دیتابیس Oracle:create sequence SEQ_PERSON&#xA;   start with 50&#xA;   increment by 50&#xA;   maxvalue 1000000نکته حائز اهمیت این است که در این مثال مقدار allocationSize مربوط به Sequence تعریف شده در Entity برابر 50 (مقدار پیش فرض در JPA) و مقدار افزایش Sequence تولید شده (increment by) نیز برابر allocationSize یعنی 50 می‌باشد.علت این امر نحوه تخصیص Sequence توسط JPA و بهینه سازی آن با استفاده از pre-allocation در زمان Insert رکورد در جدول می‌باشد.در واقع در حالت ساده (بدون استفاده از JPA و یا عدم استفاده از بهینه‌سازی تخصیص Sequence در JPA) برای دسترسی به مقدار Sequence و استفاده از آن نیازمند دریافت مقدار جدید Sequence هستیم. یعنی به ازای هر بار Insert باید مقدار جدید Sequence را دریافت کنیم:select SEQ_PERSON.nextval from dual;اما چنانچه با توجه به تعدد عملیات Insert در لحظه، بخواهیم به حالت بهینه‌ای این کار را انجام دهیم نیازمند مکانیزمی هستیم که علاوه بر عدم اختصاص Sequence تکراری، تعداد مراجعات به دیتابیس را برای دریافت مقدار جدید Sequence کاهش دهد. یعنی به تعبیری باید یک Cache در سمت Application از مقادیر Sequence داشته باشیم تا در زمان نیاز به دریافت Sequence جدید ابتدا به Cache موجود در Application مراجعه کنیم.خوشبختانه این موضوع توسط JPA پوشش داده شده است و پیاده‌سازی‌های مختلف نظیر EclipseLink و Hibernate نیز از آن پشتیبانی می‌کنند.پس بهتر است ببینیم EclipseLink و Hibernate در عمل چطور این بهینه سازی را انجام می‌دهند.فریم‌ورک‌های EclipseLink و Hibernate (در حالت پیش‌فرض)، با استفاده از مکانیزم pre-allocation تعداد مراجعه به دیتابیس را برای دریافت مقدار جدید sequence کاهش می‌دهند. این مقدار در پارامتر allocationSize در تعریف Sequence در ORM قابل تغییر است. (پیش فرض: 50)اگر مستندات مربوط به allocation-size را بررسی کنیم این تعریف را خواهیم دید:allocationSizepublic abstract int allocationSize(Optional) The amount to increment by when allocating sequence numbers from the sequence.Default:50توضیحات فوق شاید کمی گمراه کننده باشد، اما بصورت کلی اتفاقی که می‌افتد این است که ORM ابتدا یک بازه معتبر از مقادیر Sequence مورد نظر را ایجاد و در زمان Insert از این بازه استفاده می‌کند و پس از اتمام مقادیر مجددا بازه جدیدی از Sequence ها را ایجاد و مورد استفاده قرار می‌دهد و بدین ترتیب در مراجعه به دیتابیس برای دریافت Sequence صرفه جویی قابل توجهی انجام می دهد.همانطور که در مثال بالا دیدیم، مقدار allocation-size در Entity و increment by در Sequence یکسان و برابر مقدار 50 می باشد.بدین‌ ترتیب EclipseLink و Hibernate، در زمان insert ابتدا یک بار برای دریافت مقدار جدید Sequence به دیتابیس مراجعه می‌کنند:select SEQ_PERSON.nextval from dualکه این query در بار اول مقدار 50 را برمی‌گرداند.سپس با استفاده از فرمول زیر مقادیر sequence را تعیین می‌کنند (Cache از مقادیر Sequence ایجاد می‌کند):nextval = SEQ.nextval = 50 &#xA;First Sequence = nextval - allocation_size + 1 = 50 - 50 + 1 = 1&#xA;Last Sequence = nextval = 50بر این ‌اساس مقدار شروع Sequence تخصیصی به فیلد id با محاسبه انجام شده (50-50+1) برابر عدد 1 می‌شود.و برای بهبود کارایی و عدم مراجعه به دیتابیس در insert های بعدی از مقدار شروع (First Sequence) تا مقدار پایانی (Last Sequence)، مقدار Sequence توسط ORM (بدون مراجعه به دیتابیس) یک به یک افزایش و مورد استفاده قرار می‌گیرد.مثلا در EclipseLink: &lt;sequencing preallocation for SEQ_PERSON: objects: 50 , first: 1, last: 50&gt;زمانی که مقدار Sequence به عدد 50 رسید، ORM مجدد به دیتابیس مراجعه می‌کند تا nextvalue را دریافت کند:select SEQ_PERSON.nextval from dualکه این بار این query مقدار 100 را بر می‌گرداند.حال مجدد همین روال تکرار می‌شود:nextval = 100&#xA;First Sequence = 100 - 50 + 1 = 51&#xA;Last Sequence = 100در واقع ORM در زمان insert، تا زمانی که به مقدار Last Sequence (در این مرحله عدد 100) نرسیده باشد به دیتابیس مراجعه نخواهد کرد.یعنی به ازای هر 50 عملیات insert تنها یک مراجعه به دیتابیس برای دریافت nextvalue از sequence مورد نظر می‌شود که بهبود قابل توجهی در کارایی خواهد بود!و نکته دیگر اینکه چنانچه Application، در حین insert نمودن رکوردها و پیش از رسیدن به مقدار Last Sequence به هر علتی Restart شود، به دلیل از بین رفتن مقدار Last Sequence، مجددا First Sequence و Last Sequence را محاسبه و استفاده می‌کند.که این امر طبیعتا فاصله ای را در مقادیر sequence مورد استفاده ایجاد می‌کند:Application Starts Running:&#xA;select SEQ_PERSON.nextval from dual&#xA;nextval = 50&#xA;First Sequence = 50 - 50 + 1 = 1&#xA;Last Sequence= nextval = 50&#xA;--------------------------------------------------------&#xA;insert into person (id, name) values (1, &#34;Ali&#34;)&#xA;...&#xA;...&#xA;...&#xA;...&#xA;insert into person (id, name) values (23, &#34;Ramin&#34;)&#xA;(Next Value for id: 24)&#xA;--------------------------------------------------------&#xA;Application Restarts:&#xA;select SEQ_PERSON.nextval from dual&#xA;nextval = 100&#xA;First Sequence = 100 - 50 + 1 = 51&#xA;Last Sequence = nextval  = 100&#xA;insert into person (id, name) values (51, &#34;Reza&#34;)&#xA;....در آخر باید این نکته را هم ذکر کنیم که JPA بصورت کلی مکانیزم بهینه‌سازی تخصیص Sequence را تعریف کرده و نحوه اجرای آن را به پیاده‌سازی‌ها واگذار کرده که ما در اینجا روش پیش فرض مورد استفاده در پیاده‌سازی‌های EclipseLink و Hibernate را بررسی کردیم. در Hibernate به این روش Pooled Optimizer گفته می‌شود. برای اطلاعات بیشتر و سایر روش های مورد استفاده در Hibernate می توانید مقالات زیر را مطالعه کنید:Hibernate Pooled and Pooled-Lo OptimizerHibernate Hi/Lo Algorithm</description><category>Ramin Mehraninejad (raminpix)</category><author>Ramin Mehraninejad (raminpix)</author><pubDate>Tue, 09 Feb 2021 16:15:58 +0330</pubDate></item><item><title>تنها در سیاره - 18</title><link>https://virgool.ir/@raminpix/تنها-در-سیاره-18-ikstfrvofpvm</link><description>مدت ها بود که مشغول ساختن اقامتگاه بود و تنها چیزی که دلخوشی روزهای تکراری اش بود ساختن همین اقامتگاه بود.  هر روز که وظایف ماموریتش را به انجام می رسوند و گزارش همواره بی جواب اش (!) را ارسال می کرد، از سفینه بیرون می رفت و روی قسمت های مختلف اقامتگاه کار می کرد. تقریبا اقامتگاه آماده استفاده شده بود. خودش را تصور می کرد که اولین ساکن اقامتگاه شده!!! برایش خیلی هیجان انگیز بود و دائم از این افکار و پیشرفت کارش انرژی می گرفت. فکر می کرد اگر اسمش را روی سردر ورودی حک  کنه و مختصات اقامتگاه را در فهرست دسترسی کیهانی ثبت کند، هر سفینه ای که قصد فرود روی سیاره رو داشته باشه از این اقامتگاه استفاده خواهد کرد. با این افکار هر روز بیدار می شد و هر شب می خوابید.یک روز که مثل همیشه مشغول انجام وظایف ماموریتش بود بعد از ارسال گزارش، درست زمانی که می خواست از سفینه خارج بشه، پیامی عجیب دریافت کرد.این دومین باری بود که در کل مدت ماموریتش در سیاره پیام دریافت می کرد... بار اول زمانی بود که قصد ترک سیاره برای رسیدن به Star-Ship-1 داشت. با خودش فکر می کرد شاید این پیام هم مشابه پیام اول باشد، شاید هم در مورد گزارشات ارسالی نکته ای وجود داشت. بلاخره پیام را خواند:از: فرماندهی ارشد ناوگان فضاییبه: کاوشگر 755ارجحیت: آنیموضوع: ماموریت به Star-Ship-1باورش نمی شد، ماموریتی به Star-Ship-1، آن هم درست زمانی که با ماندن در سیاره کنار آمده بود... و اقامتگاهی که ساختنش رو به اتمام بود...مدتها پیش قصد رفتن به Star-Ship-1 داشت که از طرف مرکز عملیات دستوری مبنی بر توقف و ماندن در سیاره گرفته بود... اما این بار از فرماندهی ارشد ناوگان فضایی، و آن هم بصورت آنی به Star-Ship-1 فرا خوانده شده بود...باید هر چه سریعتر آماده رفتن از سیاره و پیوستن به Star-Ship-1 می شد.هنوز باورش نمی شد، حس عجیبی داشت، هم خوشحال بود و هم متعجب و از اینکه چیزی را که ساختنش رو به اتمام بود باید ناتمام رها می کرد، ناراحت!اما با هر حس و حالی باید می رفت... دیگر روزها و شب ها را به تنهایی سپری نمی کرد. و این یعنی افرادی در Star-Ship-1 انتظار ورود کاوشگر 755 را می کشیدند.پایان فصل اولقبلی: تنها در سیاره - 17بعدی: کاوشگر 755 - فصل دوم - قسمت اول</description><category>Ramin Mehraninejad (raminpix)</category><author>Ramin Mehraninejad (raminpix)</author><pubDate>Thu, 21 Jan 2021 01:06:15 +0330</pubDate></item><item><title>مدیریت Dependency ها در جاوا - قسمت دوم: Apache Maven</title><link>https://virgool.ir/coderlife/مدیریت-dependency-ها-در-جاوا-قسمت-دوم-apache-maven-udzvo0ayo8kt</link><description>« پست بروز رسانی شده »همانطور که دیدیم مدیریت کتابخانه های مورد نیاز (Dependency ها) در فرآیند توسعه نرم افزارهای مبتنی بر Java می تواند به کار پیچیده ای بدل شود. با استفاده از ابزارهایی نظیر Apache Maven این امر و بطور کلی مدیریت چرخه تولید و انتشار پروژه های Java ساده تر می شود.در این پست قصد داریم ابتدا مروری بر ساختار و نحوه کار Maven داشته باشیم و سپس مراحل ایجاد پروژه string-to-excel را با استفاده از Apache Maven به انجام برسانیم و از مزیت این ابزار در مدیریت Dependency ها و Build پروژه استفاده کنیم.داستان Mavenابزار Maven که خود قبلا بخشی از پروژه Jakarta Turbine بوده با هدف ساده سازی فرآیند Build این پروژه بوجود آمده و نسل قبل از آن را می توان Apache Ant دانست که پیش از Maven با امکان تعریف Task های مختلف فرایند Build را میسر می کرد و هنوز هم در برخی پروژه های Java و حتی زبان های دیگر از آن استفاده می شود. اما مدلی که Maven در مدیریت Build و Dependency ها ارائه داد به مراتب ساده تر بود و بنابراین باعث شد دیگر نیازی به ذخیره dependency های مورد نیاز پروژه (مثل jar file ها) در Version Control ها (CVS، SVN و GIT) نباشد و فقط یک یا چند فایل XML (بنام pom.xml) برای مدیریت چرخه Build در هر پروژه نگهداری شود. با اینکار علاوه بر کاهش چشمگیر حجم پروژه ها در Version Control ها، امکان استفاده مشترک از dependency های موجود در Maven Repository در چند پروژه هم به آسانی فراهم می شود. ساختار Mavenابزار Maven بطور کلی دارای سه جزء اصلی است:پوشه نصب maven: شامل فایل های اجرایی و تنظیمات اصلی Maven (فایل settings.xml)پوشه repository : پوشه Repository شامل تمامی dependency های دریافت شده از Remote Repository های Maven بر روی اینترنت و یا شبکه داخلی. (مسیر پیش فرض Home Directory کاربر. مثل: C:\Users\Ramin Mehrani\.m2\repository). در زمان اجرای فرآیند build، ابزار Maven بصورت خودکار dependency های مورد نیاز پروژه را از سرورهای اینترنتی و یا Mirror های تعریف شده دریافت و برای استفاده پروژه در حال build و سایر پروژه ها در Local Repository ذخیره می کند.فایل pom.xml یا Project Object Model: به ازای هر پروژه Java که با استفاده از Maven آن را مدیریت می کنیم یک فایل pom.xml در شاخه اصلی پروژه وجود دارد. فایل pom.xml شامل مشخصات پروژه و dependency ها، فرآیند build و artifact خروجی پروژه (مثلا خروجی jar یا war پروژه) و همه چیزهایی که در زمان توسعه پروژه به آنها نیاز داریم می شود.مشخص کردن مسیر Local Repository در فایل settings.xmlگفتیم Maven تمامی Dependency های دریافت شده را برای استفاده پروژه های مختلف درون Local Repository ذخیره می کند. با توجه به اینکه استفاده مستمر از maven باعث افزایش حجم فایل های ذخیره شده در Local Repository می شود این امکان وجود دارد که مسیر پیش فرض Local Repo را تغییر و آن را در جایی که فضای بیشتری برای ذخیره سازی دارد قرار داد. نکته: مسیر پیش فرض Local Repository در Maven، شاخه m2. در Home Directory کاربر می باشد. مثال:C:\Users\Ramin Mehrani\.m2مسیر مورد نظر Local Repository را در فایل settings.xml مشخص کنیم:&lt;settings xmlns=&#34;http://maven.apache.org/SETTINGS/1.0.0&#34;&#xA;xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34;&#xA;xsi:schemaLocation=&#34;http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd&#34;&gt;&#xA;&lt;!-- localRepository&#xA;The path to the local repository maven will use to store artifacts. &#xA;Default: ${user.home}/.m2/repository&#xA;&lt;localRepository&gt;/path/to/local/repo&lt;/localRepository&gt;&#xA;--&gt;&#xA;....همانطوری که مشاهده می کنیم مسیر پیش فرض در شاخه home کاربر می باشد. برای تغییر آن تنها کاری که باید انجام شود این است که خط پر رنگ مشخص شده را از حال comment خارج کنیم و مسیر مورد نظرمان را در آن قرار دهیم:&lt;settings xmlns=&#34;http://maven.apache.org/SETTINGS/1.0.0&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:schemaLocation=&#34;http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd&#34;&gt;&#xA;...&#xA;&lt;localRepository&gt;D:/Development/maven-repo&lt;/localRepository&gt;&#xA;.....ساختار پروژه های مبتنی بر Maven:ابزار Maven بصورت پیش فرض برای ساختار پروژه ها از الگوهایی پیروی می کند که بر اساس آنها source file ها را شناسایی و پروژه را compile و test و package می کند. عملا وجود این الگوها باعث استاندارد شدن ساختار پروژه ها می شود و صرفه جویی در زمان و هزینه توسعه پروژه ها را به همراه دارد.بطور معمول ساختار پروژه های Java ایجاد شده با Maven چیزی شبیه این ساختار می باشد:my-app&#xA;|-- pom.xml&#xA;`-- src&#xA;    |-- main&#xA;    |   `-- java&#xA;    |       `-- com&#xA;    |           `-- mycompany&#xA;    |               `-- app&#xA;    |                   `-- App.java&#xA;    `-- test&#xA;        `-- java&#xA;            `-- com&#xA;                `-- mycompany&#xA;                    `-- app&#xA;                        `-- AppTest.javaهمانطور که در بالا می بینیم در شاخه اصلی پروژه فایل pom.xml و در کنار آن، شاخه src قرار دارد که شامل دو شاخه java برای کد های اصلی و شاخه test برای کد های test پروژه می باشد. درون هر یک از این شاخه ها بر اساس package های پروژه فایل های .java قرار دارند. (در مثال بالا فایل App.java در com/mycompany/app قرار دارد.فایل pom.xmlفایل pom.xml (که برای استفاده از Maven باید در شاخه اصلی هر پروژه Java وجود داشته باشد) دارای بخش هایی برای معرفی پروژه (شامل نام، نسخه و ... پروژه) و همچنین مشخص کردن dependency های مورد استفاده در پروژه و نسخه آنها (مثلا jar file مربوط به Apache POI نسخه 4.1.2) و تنظیمات مربوط به compile، آماده سازی artifact خروجی و اجرای پروژه می باشد.نکته: با توجه به ماهیت pluggable بودن Maven، اکثر امکانات و قابلیت های این ابزار بصورت plugin قابل استفاده است و این plugin ها در فایل pom.xml تعریف می شوند.ساختار فایل pom.xmlفایل pom.xml بطور کلی دارای ساختاری بشکل زیر است:&lt;project xmlns=&#34;http://maven.apache.org/POM/4.0.0&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34;  xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&gt;&#xA;  &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;&#xA;&#xA;  &lt;groupId&gt;com.mycompany.app&lt;/groupId&gt;&#xA;  &lt;artifactId&gt;string-to-excel&lt;/artifactId&gt;&#xA;  &lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;&#xA;  &lt;name&gt;String to Excel Converter&lt;/name&gt;&#xA;&#xA;  &lt;url&gt;http://www.myprojectwebsite.com&lt;/url&gt;&#xA;&#xA;  &lt;properties&gt;&#xA;      &lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt;&#xA;      &lt;maven.compiler.source&gt;1.8&lt;/maven.compiler.source&gt;&#xA;      &lt;maven.compiler.target&gt;1.8&lt;/maven.compiler.target&gt;&#xA;      &lt;my-junit-version&gt;4.11&lt;/my-junit-version&gt;&#xA;  &lt;/properties&gt;&#xA;&#xA;  &#x9;&lt;dependencies&gt;&#xA;&#x9;&#x9;&lt;dependency&gt;&#xA;&#x9;&#x9;&#x9;&lt;groupId&gt;org.apache.poi&lt;/groupId&gt;&#xA;&#x9;&#x9;&#x9;&lt;artifactId&gt;poi&lt;/artifactId&gt;&#xA;&#x9;&#x9;&#x9;&lt;version&gt;4.1.2&lt;/version&gt;&#xA;&#x9;&#x9;&lt;/dependency&gt;&#xA;&#xA;&#x9;&#x9;&lt;dependency&gt;&#xA;&#x9;&#x9;&#x9;&lt;groupId&gt;junit&lt;/groupId&gt;&#xA;&#x9;&#x9;&#x9;&lt;artifactId&gt;junit&lt;/artifactId&gt;&#xA;&#x9;&#x9;&#x9;&lt;version&gt;${my-junit-version}&lt;/version&gt;&#xA;&#x9;&#x9;&#x9;&lt;scope&gt;test&lt;/scope&gt;&#xA;&#x9;&#x9;&lt;/dependency&gt;&#xA;&#x9;&lt;/dependencies&gt;&#xA;&#xA;  &lt;build&gt;&#xA;&#x9;&#x9;&lt;pluginManagement&gt;&#xA;&#x9;&#x9;&#x9;&lt;plugins&gt;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;plugin&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;artifactId&gt;maven-clean-plugin&lt;/artifactId&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;version&gt;3.1.0&lt;/version&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;/plugin&gt;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;plugin&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;version&gt;3.8.0&lt;/version&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;/plugin&gt;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;plugin&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;artifactId&gt;maven-jar-plugin&lt;/artifactId&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;version&gt;3.0.2&lt;/version&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;/plugin&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;plugin&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;artifactId&gt;maven-install-plugin&lt;/artifactId&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;version&gt;2.5.2&lt;/version&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;/plugin&gt;&#xA;&#x9;&#x9;&#x9;  &lt;!-- Other Maven Plugins ... --&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&lt;/plugins&gt;&#xA;&#x9;&#x9;&lt;/pluginManagement&gt;&#xA;&#x9;&lt;/build&gt;&#xA;&lt;/project&gt;نسخه POM: فایل pom.xml خود دارای نسخه می باشد که حتما باید در تگ modelVersion مشخص شود و به ندرت تغییر می کند.آیتم groupId: برای تعریف نام شخص/سازمان و یا قسمتی که پروژه را ایجاد کرده استفاده می شود و معمولا بر اساس نام domain ایجاد کننده پروژه می باشد. (مثال: io.virgool برای پروژه های پلتفرم virool.io). لازم به ذکر است groupId به عنوان یک شناسه یکتا برای تمامی artifact های مشترک از یک گروه استفاده می شود.آیتم artifactId: نام پروژه ما خواهد بود! (مثل weblog).آیتم version: نسخه ای از نرم افزار است که قرار است تولید و package شود. (این ویژگی امکان اختصاص نسخه به پروژه را فراهم می کند.)آیتم URL: همانطور که از اسم آن پیداست آدرس وب سایت پروژه می باشد. (مثال: https://www.virgool.io)قسمت properties: شامل تعریف property های مختلفی از جمله encoding فایل های پروژه، نسخه جاوا مورد استفاده در پروژه و امکانی برای تعریف property های جدید (با نام دلخواه) می باشد.مثال: در pom.xml بالا برای تعریف نسخه junit از property جدید &lt;my-junit-version&gt; استفاده شده و در قسمت dependency از property تعریف شده با فرمت {my-junit-version}$ استفاده شده است.قسمت dependencies: شامل تعریف تمامی dependency های پروژه می باشد. این قسمت که ساختاری مشابه قسمت معرفی پروژه دارد، این امکان را فراهم می کند که با مشخص کردن groupId و artifactId و version کتابخانه مورد نظر را در پروژه استفاده کنیم. (با اجرای دستورات Maven نظیر maven compile، ابتدا dependency های تعریف شده در این قسمت در Local Repository دانلود تا در compile و package نمودن پروژه استفاده می شود.)به عنوان مثال اگر بخواهیم کتابخانه apache-poi نسخه 4.1.2 را که در پست قبلی از آن استفاده کردیم به پروژه خود اضافه کنیم می بایست در قسمت dependencies آن را اضافه کنیم:&lt;dependencies&gt;&#xA;    &lt;dependency&gt; &#x9;&#x9;&#x9;&#xA;        &lt;groupId&gt;org.apache.poi&lt;/groupId&gt; &#x9;&#x9;&#x9;&#xA;        &lt;artifactId&gt;poi&lt;/artifactId&gt; &#x9;&#x9;&#x9;&#xA;        &lt;version&gt;4.1.2&lt;/version&gt; &#x9;&#x9;&#xA;  &lt;/dependency&gt;&#xA;&lt;!-- Other Dependencies --&gt;نکته ای که در این اینجا باید به آن اشاره کنیم، scope مربوط به dependency ها است. بصورت پیش فرض (و در صورت عدم درج) scope هر dependency برابر مقدار compile می باشد که معنای آن این است که dependency مورد نظر در زمان compile و test و package و runtime وجود دارد.چنانچه مثل فایل pom.xml بالا، scope را برابر test قرار دهیم، dependency مورد نظر تنها در زمان test استفاده شده و در زمان package نمودن پروژه همراه آن نخواهد بود.همچنین اگر scope را برابر provided قرار دهیم، انتظار داریم در زمان runtime (اجرای برنامه) dependency مورد نظر توسط محیط اجرا برای application در دسترس باشد. (مثلا در Application Server وجود داشته باشد.)قسمت build: شامل پیکربندی فرآیند build و همچنین تعریف plugin های Maven مورد استفاده در پروژه برای انجام فعالیت هایی نظیر compile و test و package می باشد.برای هر plugin هم همانند dependency ها می بایست groupId و artifactId و version تعریف شود که البته groupId بصورت پیش فرض و در صورت عدم درج org.apache.maven.plugins خواهد بود.نکته: تعریف version برای plugin ها باعث می شود که همواره build پروژه بر اساس روند یکسانی انجام شود و در صورتی که رفتار plugin ها در نسخه های بعدی تغییر کرد بر روی build پروژه ما تاثیری نداشته باشد.ایجاد پروژه string-to-excel با استفاده از Mavenحالا که با ساختار کلی Maven آشنا شدیم می توانیم نحوه ایجاد پروژه string-to-excel را که در پست قبلی بدون استفاده از Maven ایجاد کردیم این بار با استفاده از این ابزار ایجاد کنیم.قبل از اینکه پروژه را ایجاد کنیم اگر هنوز Maven را نصب نکرده اید این پست را مشاهده کنید.قدم اول: ایجاد ساختار پروژه و فایل pom.xmlفرض کنید قصد داریم برای شرکت فرضی mycompany که Domain آن company.com است اپلیکیشن String to Excel Converter را با استفاده از ابزار Maven ایجاد کنیم.شاید به نظر این طور بیاید که ایجاد پروژه مبتنی بر Maven کمی سخت باشد. خوشبختانه Maven با استفاده از مکانیزم archetype، این کار را هم برای ما ساده کرده است. در واقع archetype امکان تولید پروژه بر اساس Template های از پیش تعریف شده را فراهم می کند.نکته: این امکان وجود دارد که template های جدیدی را نیز به عنوان archetype تعریف و استفاده کنیم. (البته در اکثر پروژه ها archetype های موجود در Maven جوابگوی نیاز ما برای ایجاد پروژه می باشد و نیازی به ایجاد archetype جدیدی نیست.)در اینجا قصد داریم پروژه string-to-excel را با استفاده از Maven ایجاد و توسعه دهیم، بنابراین از maven-archetype-quickstart استفاده می کنیم. برای اینکار دستور زیر را در command prompt اجرا می کنیم:mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=string-to-excel -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=falseاین دستور ضمن ایجاد شاخه پروژه (هم نام artifactId)، فایل pom.xml و شاخه های مربوط به کد اصلی پروژه و test را نیز تولید می کند:└───string-to-excel&#xA;    └───src&#xA;        ├───main&#xA;        │   └───java&#xA;        │       └───com&#xA;        │           └───mycompany&#xA;        └───test&#xA;            └───java&#xA;                └───com&#xA;                    └───mycompanyقدم دوم: تنظیمات Maven در Eclipse IDEدر حال حاضر Eclipse IDE برای Java با پلاگین Maven منتشر می شود. اما در اینجا قصد داریم نحوه استفاده از Maven که قبلا آن را نصب و پیکربندی کردیم را در Eclipse IDE مرور کنیم. در واقع می خواهیم در Eclipse IDE از Maven بصورت External استفاده کنیم!برای دسترسی به تنظیمات Eclipse IDE می بایست از Window « Preferences را انتخاب و سپس در قسمت جستجو maven را وارد کنیم:و با انتخاب گزینه Installation به قسمت تنظیمات نصب Maven در Eclipse وارد شویم:تنظیمات نصب Maven در Eclipse IDEهمانطور که می بینیم Maven بصورت Embedded (داخلی) همراه Eclipse IDE وجود دارد و به عنوان گزینه پیش فرض نیز انتخاب شده است. و اگر گزینه User Settings را از قسمت سمت چپ انتخاب کنیم، مسیر فایل settings.xml مربوط به Embedded Maven و Repository تعریف شده در فایل settings.xml را خواهیم یافت.تنظیمات مرتبط با Maven در Eclipse IDEدر این قسمت امکان تعریف یک فایل settings.xml بصورت Global (سراسری) و هم بصورت اختصاصی کاربر (User Settings) قابل تنظیم است و همانطور که قبلا دیدم Local Repository هم بر اساس تنظیمات Global و User مشخص می شود.معرفی Maven نصب شده به Eclipse IDEدر قسمت Installations باید با استفاده از گزینه Add، مسیر نصب maven را مشخص کنیم:معرفی مسیر نصب maven در تنظمیات Eclipse IDEسپس در لیست نمایش داده شده آن را انتخاب می کنیم:انتخاب Maven نصب شده در Eclipse IDEو در قسمت User Settings (منو سمت چپ)، مسیر فایل Settings.xml را در قسمت User Settings مشخص می کنیم:مشخص کردن مسیر Settings.xml در قسمت User Settingsبا این کار Local Repository به مسیری که قبلا در فایل settings.xml مشخص کرده ایم تغییر می یابد.قدم سوم: وارد نمودن پروژه در Eclipse IDEبعد از انجام تنظیمات مربوط به Maven در Eclipse، می توانیم پروژه string-to-excel را که با استفاده از Maven ایجاد کرده ایم را از طریق File » Import » Existing Maven Projects به Eclipse وارد (Import) نماییم::با انتخاب شاخه پروژه (string-to-excel)، پروژه توسط Eclipse بعنوان یک پروژه Maven شناسایی می شود:قدم سوم: تعریف property ها و dependency های لازم در pom.xmlقبل از اینکه شروع به نوشتن کد برنامه کنیم لازم است pom.xml پروژه را برای معرفی dependency های مورد نیاز و تعریف property ها تغییر دهیم.تغییر نسخه JDK:&lt;properties&gt;&#xA;    &lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt;&#xA;    &lt;maven.compiler.source&gt;1.8&lt;/maven.compiler.source&gt;&#xA;    &lt;maven.compiler.target&gt;1.8&lt;/maven.compiler.target&gt;&#xA;&lt;/properties&gt;با توجه به اینکه قصد داریم از Apache POI نسخه 3.1.4 استفاده کنیم لازم است این dependency در فایل pom.xml تعریف کنیم. پس همانطور که در بالا دیدیم این dependency ها را بصورت زیر به قسمت dependencies اضافه می کنیم:&lt;dependencies&gt;&#xA;&#x9;&lt;dependency&gt;&#xA;&#x9;&#x9;&lt;groupId&gt;org.apache.poi&lt;/groupId&gt;&#xA;&#x9;&#x9;&lt;artifactId&gt;poi&lt;/artifactId&gt;&#xA;&#x9;&#x9;&lt;version&gt;4.1.2&lt;/version&gt;&#xA;&#x9;&lt;/dependency&gt;&#xA;        &lt;dependency&gt;&#xA;                &lt;groupId&gt;org.apache.poi&lt;/groupId&gt;&#xA;                &lt;artifactId&gt;poi-ooxml&lt;/artifactId&gt;&#xA;               &lt;version&gt;4.1.2&lt;/version&gt;&#xA;      &lt;/dependency&gt;&#xA;&lt;/dependencies&gt;با این کار عملا Dependency مربوط به Apache POI با استفاده از Maven به پروژه ما اضافه شده و در زمان build پروژه اگر این Dependency در Local Repository وجود نداشته باشد، به آن اضافه می شود.قدم چهارم: نوشتن کد و اجرای برنامهکد برنامه را مشابه پست قبلی در کلاس App که این بار توسط Maven در package com.mycompany.app ایجاد شده می نویسیم:import java.io.FileOutputStream;&#xA;import java.io.IOException;&#xA;import org.apache.poi.ss.usermodel.Cell;&#xA;import org.apache.poi.ss.usermodel.Row;&#xA;import org.apache.poi.ss.usermodel.Sheet;&#xA;import org.apache.poi.xssf.streaming.SXSSFWorkbook;public class App {&#xA;&#x9;public static void main(String[] args) throws IOException {&#xA;&#x9;&#x9;FileOutputStream out = new FileOutputStream(&#34;d:\\workbook.xlsx&#34;);&#xA;&#x9;&#x9;SXSSFWorkbook workbook = new SXSSFWorkbook();&#xA;&#x9;&#x9;Sheet sh = workbook.createSheet();&#xA;&#x9;&#x9;Row row = sh.createRow(0);&#xA;&#x9;&#x9;Cell cell = row.createCell(0);&#xA;&#x9;&#x9;cell.setCellValue(&#34;Viva Excel&#34;);&#xA;&#x9;&#x9;workbook.write(out);&#xA;&#x9;&#x9;out.close();&#xA;                System.out.println(&#34;DONE !&#34;);&#xA;&#x9;}&#xA;}برای اجرای پروژه روش های مختلفی وجود دارد:اجرای main method برنامه با استفاده از گزینه Run در Eclipse: بر روی فایل App.java، کلیک راست و سپس گزینه Run As « Java Application را انتخاب می کنیم:اجرای برنامه در Eclipse IDEاجرای برنامه توسط Maven:برای این کار باید ابتدا پلاگین اجرای Java را به pom.xml اضافه کنیم:&lt;plugins&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;plugin&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;artifactId&gt;exec-maven-plugin&lt;/artifactId&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;version&gt;1.4.0&lt;/version&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;configuration&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;mainClass&gt;com.mycompany.app.App&lt;/mainClass&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;/configuration&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;/plugin&gt;&#xA;.....و با استفاده از Run Configuration در Eclipse، اجرای برنامه توسط maven را پیکربندی کنیم:در قسمت Name، نام مورد نظر را وارد می کنیم: (مثلا Run String to Excel).در قسمت Base Directory، با استفاده از گزینه Workspace پروژه را انتخاب می کنیم و در قسمت Goals هم به maven می گوییم چه کارهایی را به چه ترتیبی انجام دهد:ابتدا clean (همه فایل ها و پوشه های خروجی را پاک کند)، سپس compile کند و در نهایت برنامه را اجرا کند: (exec:java)تنظمیمات Run Configuration برای اجرای برنامه توسط Maven در Eclipseو در نهایت با انتخاب گزینه Run، برنامه اجرا خواهد شد:اجرای برنامه توسط Maven در Eclipse IDEایجاد Executable JAR file (فایل JAR قابل اجرا) توسط Maven:برای اینکه بتوانیم پروژه را بصورت مستقل از IDE و Maven و با صرفا با دستوری مثل دستور زیر اجرا کنیم لازم است دو پیش نیاز وجود دارد: java -jar string-to-excel.jar ایجاد فایل Executable JAR که برای این امکان می بایست با استفاده از Maven فایل JAR قابل تولید کنیم. (لازم است کلاس جاوایی که حاوی متد main برنامه هست مشخص شود)قرار دادن همه Dependency های پروژه (مثل JAR فایل Apache POI مورد استفاده در این پروژه) در فایل JAR تولید شده در مرحله اول. البته ذکر این نکته لازم است که بدون قرار دادن Dependency ها نیز امکان ایجاد و اجرای Executable JAR وجود دارد، اما نیاز است Dependency های پروژه در classpath در زمان اجرا قابل دسترسی باشند. (مثل زمان اجرای پروژه های تحت وب در Application Server ها و یا مشخص نمودن مسیر dependency ها در زمان اجرا با استفده از سوییچ classpath.)با استفاده از پلاگین Assembly در Maven، امکان تولید انواع artifact ها نظیر (JAR، WAR، EAR و ...) وجود دارد که ما در حال حاضر برای تولید Executable JAR with Dependencies از آن استفاده می کنیم.برای این کار لازم است این پلاگین را به pom.xml اضافه کنیم و Configuration لازم برای ایجاد Executable JAR و قرار دادن Dependency ها را انجام دهیم:&lt;plugin&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;artifactId&gt;maven-assembly-plugin&lt;/artifactId&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;executions&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;execution&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;phase&gt;package&lt;/phase&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;goals&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;goal&gt;single&lt;/goal&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;/goals&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;/execution&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;/executions&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;configuration&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;descriptorRefs&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;descriptorRef&gt;jar-with-dependencies&lt;/descriptorRef&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;/descriptorRefs&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;archive&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;manifest&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;mainClass&gt;com.mycompany.app.App&lt;/mainClass&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;/manifest&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;/archive&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;/configuration&gt;&#xA;&#x9;&#x9;&#x9;&lt;/plugin&gt;همانطور که مشاهده می شود، در این پلاگین در قسمت configuration، برای قرار دادن Dependency ها از jar-with-dependencies و برای مشخص نمودن کلاس جاوایی که حاوی متد main می باشد از mainClass در manifest استفاده شده است. در واقع فایل MANIFEST.MF در مسیر META-INF در فایل JAR نهایی ایجاد می شود که مسیر mainClass تعیین شده در قسمت configuration را در خود دارد:Manifest-Version: 1.0&#xA;Archiver-Version: Plexus Archiver&#xA;Created-By: Apache Maven&#xA;Built-By: Ramin Mehrani&#xA;Build-Jdk: 14.0.1&#xA;Main-Class: com.mycompany.app.Appنکته دیگری که وجود دارد این است که پلاگین assembly فرآیند ایجاد JAR را در فاز package انجام می دهد. (مطابق تعریفی که در قسمت execution انجام دادیم.) پس اگر این phase را اجرا کنیم می توانیم به خروجی مورد نظر (Executable JAR file with dependencies) دست پیدا کنیم: mvn clean packageو یا در Eclipse IDE همانند ایجاد Run Configuration برای compile و اجرای برنامه این بار یک Configuration جدید برای Package نمودن پروژه ایجاد می کنیم:تعریف Run Configuration برای Package نمودن JAR در Eclipse IDEو اگر پوشه target پروژه را مشاهده کنیم دو فایل JAR قابل اجرا وجود دارد:string-to-excel-1.0-SNAPSHOT.jar&#xA;string-to-excel-1.0-SNAPSHOT-jar-with-dependencies.jarکه فایل اول JAR قابل اجرا اما بدون dependency ها و فایل دوم همانطور که از نام آن مشخص است فایل JAR قابل اجرا شامل dependency های پروژه می باشد که می توان با دستور زیر آن را اجرا کرد: java -jar string-to-excel-1.0-SNAPSHOT-jar-with-dependencies.jarسورس بروز رسانی شده پروژه در GitHub.</description><category>Ramin Mehraninejad (raminpix)</category><author>Ramin Mehraninejad (raminpix)</author><pubDate>Thu, 01 Oct 2020 14:41:41 +0330</pubDate></item><item><title>مدیریت Dependency ها در جاوا - قسمت اول: دنیای بدون Maven</title><link>https://virgool.ir/@raminpix/مدیریت-dependency-ها-در-جاوا-قسمت-اول-دنیای-بدون-maven-fwfqixbskjmo</link><description>در پست قبلی نحوه نصب و استفاده اولیه از Apache Maven را بررسی کردیم. در این پست قصد داریم جزئیات بیشتری از این ابزار و همچنین نکاتی از پیکربندی (configuration) که به ما در بهبود و نگهداری محیط توسعه نرم افزار کمک می کند را بررسی کنیم.دنیای بدون Maven...فرض کنید قصد داریم نرم افزار Java تولید کنیم که یک رشته متن را درون سلولی از Sheet فایل Microsoft Excel (با پسوند xlsx) ذخیره کند و برای این منظور می خواهیم از کتابخانه Apache POI استفاده کنیم.ابتدا پروژه ای با نام string-to-excel در Eclipse IDE ایجاد می کنیم (نصب و ایجاد پروژه در Eclipse IDE).برای اینکه کار هر چه ساده تر انجام بشه و به اصل موضوع (یعنی مدیریت Dependency ها) بپردازیم، کلاسی شامل متد اجرایی main ایجاد می کنیم که کد برنامه را برای استفاده از Apache POI در آن بنویسیم. (مثلا کلاسی بنام App)ایجاد کلاسی با نام App و افزودن متد main به آن خوب همانطور که در بالا گفتیم قرار هست از کتابخانه Apache POI برای تولید فایل Excel و ذخیره رشته در سلول یک Sheet استفاده کنیم.در اینجا باید JAR file های مورد نیاز Apache POI را به Classpath پروژه اضافه کنیم تا بتوانیم از این کتابخانه در زمان compile و runtime (اجرای برنامه) استفاده کنیم.پس، نسخه جدید (در حال حاضر 4.1.2) POI را دانلود می کنیم و بعد از unzip کردن، فایل های jar زیر را که در شاخه اصلی و ooxml-lib قرار دارند را در شاخه پروژه کپی می کنیم:poi-4.1.2.jar&#xA;poi-ooxml-4.1.2.jar&#xA;poi-ooxml-schemas-4.1.2.jar&#xA;ooxml-lib\xmlbeans-3.1.0.jar&#xA;ooxml-lib\curvesapi-1.06.jar&#xA;می توانیم پوشه ای بنام lib در شاخه پروژه ایجاد کنیم و فایل ها را در آن کپی کنیم.ذکر این نکته لازم است که کتابخانه Apache POI نیازمند jar file های دیگری از جمله ، commons-collection، commons-logging و ... می باشد. وجود این jar file ها در کنار poi برای استفاده از آن ضروری می باشد. بنابراین باید محتویات پوشه lib موجود در شاخه poi-4.1.2 را نیز در پوشه lib پروژه خود اضافه کنیم:حالا باید برای Eclipse IDE مشخص کنیم که در زمان نوشتن کد، compile و runtime از این jar file ها که در شاخه lib پروژه هستند استفاده کند. نکته: برای شناسایی پوشه lib توسط Eclipse باید ابتدا بر روی پروژه در قسمت Package Explorer کلیک راست و گزینه Refresh را انتخاب کنیم.معرفی شاخه lib پروژه به Eclipseبرای این کار روی عنوان پروژه در قسمت Package Explorer کلیک راست می کنیم، سپس Properties را انتخاب می کنیم و بعد قسمت Java Build Path و در سمت راست Libraries را انتخاب می کنیم:برای معرفی jar file ها (قرار دادن آنها در Classpath) در Eclipse روش های مختلفی وجود دارد که ما در اینجا از گزینه Add JARs... استفاده می کنیم. روی Classpath کلیک می کنیم و سپس گزینه Add JARs... و در پنجره باز شده از lib پروژه تمامی jar  ها را select و OK می کنیم:در نهایت باید لیستی از jar های اضافه شده به Classpath را داشته باشیم:با انتخاب Apply and Close و بازگشت به Package Explorer می توانیم لیست jar file های اضافه شده به پروژه را مشاهده کنیم:حالا امکان استفاده از API کتابخانه Apache POI وجود دارد و می توان با در زمان نوشتن کد برنامه، Compile و Runtime از امکانات Apache POI برای ایجاد یک فایل Excel و نوشتن یک رشته در یک سلول آن استفاده کرد:import java.io.FileOutputStream;&#xA;import java.io.IOException;&#xA;import org.apache.poi.ss.usermodel.Cell;&#xA;import org.apache.poi.ss.usermodel.Row;&#xA;import org.apache.poi.ss.usermodel.Sheet;&#xA;import org.apache.poi.xssf.streaming.SXSSFWorkbook;&#xA;public class App {&#xA;&#x9;public static void main(String[] args) throws IOException {&#xA;&#x9;&#x9;FileOutputStream out = new FileOutputStream(&#34;d:\\workbook.xlsx&#34;);&#xA;&#x9;&#x9;SXSSFWorkbook workbook = new SXSSFWorkbook();&#xA;&#x9;&#x9;Sheet sh = workbook.createSheet();&#xA;&#x9;&#x9;Row row = sh.createRow(0);&#xA;&#x9;&#x9;Cell cell = row.createCell(0);&#xA;&#x9;&#x9;cell.setCellValue(&#34;Viva Excel&#34;);&#xA;&#x9;&#x9;workbook.write(out);&#xA;&#x9;&#x9;out.close();&#xA;&#x9;}&#xA;}نتیجه گیری: دنیا با Maven جای بهتری هست...مراحل فوق که شامل ایجاد پروژه در Eclipse، دانلود Apache POI، کپی کردن jar file های مورد نیاز در پروژه و معرفی آنها به Classpath در Eclipse می باشد همه بصورت دستی انجام شده است. و اگر به عنوان مثال در پروژه قصد اضافه کردن یک کتابخانه جدید داشته باشیم، باید jar file ها را در شاخه lib پروژه کپی و مجددا به Eclipse معرفی کنیم و اگر این کتابخانه ها از jar های مشترکی استفاده کنند کار کمی پیچیده می شود. یکی از مواردی که مدیریت آن در پروژه بدون استفاده از ابزاری نظیر Maven دشوار می شود، مدیریت dependency های مشترک چندین کتابخانه هست. تصور کنید در پروژه ای از چندین کتابخانه استفاده می کنیم که هر کدام به نسخه ای از commons-logging نیاز دارند و تداخل نسخه های مختلف اجتناب ناپذیر است! اینجا جایی هست که ابزار Maven (که قبلا آن را معرفی کردیم) به ما کمک می کند.در واقع مهم ترین ویژگی Maven سهولت مدیریت کتابخانه های مورد نیاز (Dependency ها) در چرخه تولید و انتشار نرم افزارهای مبتنی بر Java می باشد.در پست بعدی قصد داریم مراحل فوق را با استفاده از Maven به انجام برسانیم و با امکانات و مزایای این ابزار بیشتر آشنا می شویم.</description><category>Ramin Mehraninejad (raminpix)</category><author>Ramin Mehraninejad (raminpix)</author><pubDate>Sat, 19 Sep 2020 17:23:53 +0430</pubDate></item><item><title>توسعه نرم افزار مبتنی بر Java: نصب Eclipse IDE و ایجاد پروژه</title><link>https://virgool.ir/@raminpix/نصب-و-ایجاد-پروژه-java-در-eclipse-ide-lpg0jodxtjkk</link><description>برای نوشتن برنامه و تولید پروژه ها در زبان Java نیاز به محیط توسعه (IDE) هست که علاوه بر تسهیل فرآیند کدنویسی، در مدیریت چرخه تولید نرم افزار (شامل Test، Compile و تولید خروجی قابل اجرا) به ما کمک کند و کارهای تکراری که نیاز به اجرای دستورات مختلفی برای Compile و اجرای Test ها و یا اجرای برنامه را دارد برای ما انجام می دهد.از بین ابزارهای مختلف و محبوبی که در این زمینه وجود دارد Eclipse IDE که نرم افزاری Open Source و مورد حمایت بنیان Eclipse هست را انتخاب کردیم. این IDE علاوه بر زبان و پلتفرم Java، امکان برنامه نویسی و تولید نرم افزار به زبان های دیگری نظیر ++C و PHP و JavaScript و ... را هم فراهم می کند که ما در اینجا از نسخه مربوط به Java این IDE استفاده می کنیم.پیش نیازبرای اجرای Eclipse نصب Java Runtime Enivronment - JRE نیاز است. هر چند به دلیل استفاده از امکانات Java Development Kit توصیه می شود که JDK را بر روی سیستم خود نصب کنید.قدم اول: نصب Eclipse IDEبرای نصب Eclipse، ابتدا باید آن را از اینجا دانلود کنید. در حال حاضر Eclipse - Java دارای دو نسخه می باشد:Eclipse IDE for Java DevelopersEclipse IDE for Enterprise Java Developersنسخه Eclipse IDE for Java Developers، شامل امکانات اصلی برای تولید نرم افزار به زبان Java و نسخه Eclipse IDE for Enterprise Java Developers که علاوه بر امکانات نسخه قبلی امکان تولید نرم افزارهای Enterprise و Web-based را هم فراهم می کند.ما Eclipse IDE for Java Developers (نسخه فعلی eclipse-java-2020-06-R) برای ویندوز 64 بیتی را که دارای امکانات اصلی بوده و جوابگوی نیاز ما هست انتخاب می کنیم.پس از دانلود و unzip کردن فایل، پوشه eclipse را در مسیر دلخواه کپی می کنیم. مثلا:D:\Developmentاگر مثل من نیاز پیدا می کنید که از نسخه های مختلف Eclipse استفاده کنید، نام پوشه eclipse را به نام کامل آن تغییر دهید. مثلا:D:\Development\eclipse-java-2020-06-Rبا اجرای فایل eclipse.exe، نرم افزار Eclipse اجرا شده و محل ایجاد workspace را نشان می دهد.انتخاب workspace در eclipseتوضیح اینکه Eclipse تنظیمات مربوط به محیط توسعه را در این پوشه نگهداری می کند. برای عدم نمایش این صفحه در دفعات بعدی Use this as the default and do not ask again را انتخاب و دکمه Launch را کلیک می کنیم. (همواره امکان تغییر و ایجاد workspace از منوی File » Switch Workspace وجود دارد.)eclipse - برای اولین بارقدم دوم: ایجاد اولین پروژه Java در Eclipseبرای ایجاد پروژه روش های مختلف وجود دارد:ایجاد پروژه Maven از طریق Command Line و Import آن به Eclipse.ایجاد پروژه Java در Eclipse.برای ایجاد پروژه Java در Eclipse (بدون استفاده از ابزار Maven)، لازم است که از منوی File » New، گزینه Java Project را انتخاب کنیم.ایجاد پروژه Java در Eclipse نام پروژه را در قسمت Project Name وارد می کنیم. اگر قصد داریم پروژه را در مسیر workspace که قبلا و در زمان اجرای eclipse آن را مشخص کردیم ذخیره کنیم گزینه Use default location را در حالت انتخاب شده باقی می گذاریم، اما اگر قصد داریم پروژه را در مسیر دیگری ذخیره کنیم این گزینه را غیر فعال و در قسمت Location مسیر مورد نظر برای ذخیره پروژه را انتخاب می کنیم.انتخاب JRE و تنظیمات نسخه Compiler برای Java در Eclipse:بصورت پیش فرض Eclipse نسخه Java نصب شده روی سیستم را شناسایی و آن را انتخاب می کند. اما گاهی ممکن است ما بر روی یک سیستم چند نسخه از JDK و JRE را داشته باشیم که این می تواند گاهی چالش بر انگیز باشد.به این خاطر در قسمت JRE، ابتدا گزینه Configure JREs را انتخاب تا تنظیمات مربوط به Compiler و اجرای پروژه را مشخص کنیم.تنظیمات Compiler و JRE در Eclipseبرای معرفی JDK در قسمت Installed JREs ابتدا گزینه Add و سپس Standard VM و گزینه Next را انتخاب می کنیم.انتخاب پوشه در تنظمیات Eclipse -JREحالا در قسمت JRE Home مسیر نصب JDK را انتخاب می کنیم. مثال:D:\Java\jdk-14.0.1نحوه اضافه نمودن JDK به Eclipseپس از طی مراحل فوق JDK به عنوان یکی از گزینه های قابل انتخاب به لیست Installed JREs اضافه می شود و فقط لازم است که JDK نصب شده مورد نظر را انتخاب کنیم:انتخاب JDK نصب شده بعنوان runtime environment در Eclipseپس از این مرحله لازم است تنظیمات Compiler را هم مطابق با نسخه JDK نصب شده انتخاب کنیم.برای این کار کافی است ابتدا قسمت Compiler را انتخاب و پس از آن از Compiler compliance level نسخه مورد نظر را انتخاب کنیم. (مثال: 14)تنظیمات compiler در Eclipseو در نهایت Apply and Close.نکته: انجام این تنظیمات در اکثر مواقع فقط یک بار انجام می شود و تا زمانی که نیاز به نسخه متفاوتی از JDK نداشته باشیم، فقط در زمان ایجاد پروژه جدید لازم است JDK مورد نظر را برای پروژه انتخاب کنیم:انتخاب JRE برای پروژه Javaبخش بعدی Project Layout هست که ساختار شاخه های مربوط به پروژه در آن قرار دارد و در اکثر مواقع نیاز به تغییر آن نیست و می توانیم از حالت پیش فرض استفاده کنیم.اگر توسعه چندین پروژه تحت عنوان یک مجموعه را داشته باشیم می بایست از Working Set استفاده کنیم که در حال حاضر که فقط یک پروژه داریم به آن نیازی نیست.برای ایجاد پروژه گزینه Finish را انتخاب می کنیم!پروژه Java ایجاد شده در Eclipseقدم سوم: ایجاد اولین کلاس و اجرای برنامهبرای ایجاد کلاس، کافی است بر روی src کلیک راست کنیم و گزینه New » Class را انتخاب و برای کلاس مورد نظر نام آن را (مثلا MyClass) وارد کنیم:ایجاد Class جدید در Eclipse و در نهایت می توانیم با نوشتن method اجرایی main، در خروجی Hello World معروف را ببینیم:public class MyClass {&#xA;     public static void main(String args[]) {&#xA;             System.out.println(&#34;Hello World!!!!&#34;);&#xA;     }&#xA;}</description><category>Ramin Mehraninejad (raminpix)</category><author>Ramin Mehraninejad (raminpix)</author><pubDate>Sat, 12 Sep 2020 12:03:54 +0430</pubDate></item><item><title>تنها در سیاره - 17</title><link>https://virgool.ir/@raminpix/تنها-در-سیاره-17-spf232xxhc28</link><description>انتخاب هاش رو مرور کرد و تصمیم گرفت بمونه! با این که می دونست تنها موندن در سیاره سخت تر از رفتن و ساختن رویاهش در جایی مثل Star-Ship-1 بود اما تصمیم گرفت بمونه و با تمام سختی هایی که داشت رویاهاشو بسازه! سعی کرد با خودش رو راست باشه و واقعیت ها رو بپذیره!&#34; خب... قطعا نمی تونم خیلی سریع پیش برم، چون باید کارهای روتین ماموریت انجام بدم! بعلاوه جو سیاره هم همیشه شرایطش پایدار نیست! - پس نباید انتظار داشته باشم همه چیز خوب و سریع پیش بره! ولی اگه بتونم این سیاره رو به جای بهتری تبدیل کنم حتما اتفاقات بزرگی میافته!&#34;رفت سراغ موشکی که قرار بود باهاش به Star-Ship-1 بره. نگاهی بهش انداخت و با خودش فکر کرد.وسایلشو برداشت و برگشت به سفینه. دفترچه اش رو باز کرد و نوشت:&#34;ساختن اقامتگاه جدید در سیاره!&#34;طرحش خیلی بلند پروازانه به نظر می رسید اما نمی تونست کنار بذارتش! با وجود تمام روتین ها و وظایفی که بعنوان یک کاوشگر در سیاره باید انجام می داد تصمیم گرفت اقامتگاهی در سیاره بسازه تا برای خودش و شاید کسانی که بعدا به سیاره می آمدند جای مناسبی باشه!بعدی: تنها در سیاره - 18قبلی: تنها در سیاره - 16</description><category>Ramin Mehraninejad (raminpix)</category><author>Ramin Mehraninejad (raminpix)</author><pubDate>Mon, 10 Aug 2020 17:00:23 +0430</pubDate></item><item><title>تنها در سیاره - 16</title><link>https://virgool.ir/@raminpix/تنها-در-سیاره-16-gmqbhtednfum</link><description>باورش نمی شد که مدتهاست در سیاره تنها مانده و حتی پیام جدیدی هم از مرکز عملیات دریافت نکرده بود. بخاطر گردش سیاره و طولانی شدن فاصله اش با Star-Ship-1 حتی رسیدن به اون هم سخت و تقریبا ناممکن شده بود.حتی یک بار سعی کرده بود با Star-Ship-1 تماس برقرار کنه و پیام امیدوار کننده ای دریافت کرده بود... اونها منتظر ورودش بودن اما طبق آخرین پیامی که از مرکز عملیات دریافت کرده بود به جای رفتن در سیاره ماند.با خودش فکر می کرد که آیا کار درستی کرده یا نه؟!آیا باید به Star-Ship-1 می رفت؟! یا حضورش در سیاره طبق برنامه ماموریت و پیام دریافتی عجیب از مرکز عملیات درست بود؟!در این مدت اما اتفاقات دیگه ای هم افتاده بود...سعی کرده بود خودش و مدت زمان سپری شده اش رو مرور کنه:جستجو در سطح سیاره.بررسی جو سیاره.ارسال گزارش طبق دستورالعمل.سعی در برقراری ارتباط با مرکز عملیات.مرور گذشته.خاطرات و اتفاقات گذشته انگار براش دوباره تازه شده بود و رویاهایی که داشت رو مرور کرده بود.انگار این درنگ و توقف بر روی سیاره باعث شده بود دوباره رویاهاش براش اهمیت پیدا کنه.ولی چطور می تونست به رویاهاش برسه در صورتی که تنها بود و در سیاره ای ناشناخته!تصمیم گرفت انتخاب هاش رو مرور کنه:&#34;بمونم و تا دریافت دستور بعدی از مرکز عملیات طبق برنامه ماموریتم رو انجام بدم&#34;&#34;ریسک رفتن به Star-Ship-1 بپذیرم و به سمت اون پرواز کنم، با اینکه رسیدن بهش خیلی بعیده!&#34;&#34;با سوختی که دارم از سیاره پرواز کنم و به سمت نزدیک ترین سیاره حرکت کنم، در این صورت باید توضیح مناسبی برای مرکز عملیات داشته باشم! به هر حال تمام تجهیزات و امکانات رو اونها بهم دادن و من باید ماموریت طبق طرح اونها جلو می بردم! بعلاوه ممکنه هیچی پیدا نکنم و برای همیشه روی اون سیاره تنها بمونم!&#34;&#34;ببینم روی این سیاره دیگه چه چیزهایی ممکنه پیدا بشه! من که روبات و سفینه خیالی دوران نوجوانیم رو پیدا کردم، شاید بتونم چیزهای دیگه هم پیدا کنم، اما این کار زمانم رو برای رسیدن احتمالی به Star-Ship-1 کاملا از بین می بره، اما شاید رویاهامو بتونم همیجا بسازم!&#34;همینطور که داشت به آهنگ Lost Stars گوش می داد این افکار در ذهنش مثل اسلاید های جلسات تصمیم گیری حرکت می کردن!بعدی: تنها در سیاره - 17قبلی: تنها در سیاره - 15</description><category>Ramin Mehraninejad (raminpix)</category><author>Ramin Mehraninejad (raminpix)</author><pubDate>Sat, 20 Jun 2020 18:18:37 +0430</pubDate></item><item><title>کوله پشتی من برای سال 1399</title><link>https://virgool.ir/@raminpix/کوله-پشتی-من-برای-سال-1399-castgmjv7pza</link><description>برای همه روشن هست که سالی که سال 98 سال پر چالشی بوده و از ابتدای سال تا همین الان هم اتفاقات سختی افتاده که لازم به مرور و تکرارشان نیست! برای من که دنبال یادگیری هستم و سعی می کنم از اتفاقاتی که رخ میده درسی بگیرم، سال 98 درس های مهمی داشته که ارزش گذاشتن در کوله پشتی سال 99 دارن.اولین درسی که گرفتم اینه که واقعا زندگی خیلی خیلی کوتاه تر از چیزی هست که به نظر میرسه و شاید هیچ وقت فرصت جبرانی نباشه. بنابراین:سعی می کنم عملکرد، رفتارها و واکنش هایی که در مواجهه با اتفاقات مختلف داشتم را در بازه های زمانی کوتاه (حداقل هفته ای یک بار) مشاهده و بازنگری کنم تا شناخت بهتری از خودم داشته باشم و اگر نیاز باشه چیزی را اصلاح کنم سریع تر متوجه بشم!یعنی حداقل هفته ای یک بار و شاید هم بیشتر ببینم چه رفتارهایی داشتم، چه اتفاقاتی برام افتاده من چه واکنشی داشتم. کجاها خوب عمل کردم و کجاها خوب عمل نکردم و یا بهتر می تونستم عمل کنم! حداقل اینطوری هم خودمو بهتر می شناسم و هم اگر بنا بر جبران و یا اصلاح رفتاری باشه سر نخ های خوبی برای شروع کار دستم هست.مطلب بعدی که در سال 98 یاد گرفتم و سعی می کنم در کوله سال 99 همراهم باشه این هست که:سعی می کنم پرونده کارهایی که باز بوده و برای مدت ها نا تمام بودن ببندم و به انجام برسونم.این کار حداقل دو تا مزیت مهم داره:انرژی فکری که صرف پرداختن به این موضوع میشه آزاد میشه.از انجام این کارها اعتماد به نفس می گیریم برای کارهای بعدی.درس بعدی:سعی می کنم نسبت به دغدغه های مهمی که در واقع محصول سیستم ارزش های شخصیم هست نگاه کلی داشته باشم تا احیانا با پرداختن به یک بخش از بخش های دیگه غافل نشم و ارزشی فدای ارزش دیگه نشه.یعنی حفظ تعادل نسبی بین چیزهایی که دارم عمرم صرفشون میکنم (مثل کار، خانواده، تفریح، دوستان، رشد شخصی، ...)عملا با این کار احساس رضایت بیشتری از زندگی خواهم داشت و قطب نمای حرکتم همیشه در دستم هست.اما حالا بریم سر وقت چیزهایی که نباید در کوله پشتی 99 بذارمشون و عملا کوله ام سنگین نکنم.احتمالا اسم کتاب هنر ظریف رهایی از دغدغه ها شنیدید. کتابی نوشته مارک منسون که سعی می کنه به ما بفهمونه &#34;به چه چیزهایی اهمیت بدهیم، و چگونه به چیز‌هایی که هیچ اهمیتی ندارند، اهمیت ندهیم.&#34; یکی از چیزهایی که سعی می کنم از کوله سال 99 خودم خارج کنم این هست که دیگران چه فکر و قضاوتی در مورد تصمیمات من خواهند داشت. البته اصلا منظورم این نیست که نباید از دیگران مشورت گرفت و یا از تجربیات افراد استفاده نکنیم.اما نکته اینجاست که در مقابل قضاوت ها مقاوم باشیم. قبول دارم شاید در ابتدا کار سختی باشه اما ارزش داره! تصمیماتی در زمینه انتخاب شغل، شریک زندگی و حتی مسائل جزئی تر مثل خریدن یک وسیله و یا رفتن یا نرفتن به یک جلسه کاری و یا مهمانی از جمله مواردی هستن که همیشه قضاوت دیگران را به همراه داره اما اگر اعتقاد به درستی تصمیمی که گرفتیم داریم نیازی نیست نگرانی از بابت قضاوت دیگران داشته باشیم.درس بعدی که گرفتم و اتفاقا بی ارتباط با درس قبلی هم نیست اینکه:سعی کنم خودم هم کمتر در مورد دیگران قضاوت کنم. این کار علاوه بر ایجاد نگرشی (به احتمال خیلی زیاد) غلط و یا سطحی، بطور کلی هم می تونه باعث ایجاد یک جور بدبینی به مسائل و اتفاقات بشه و این مسئله دائم خودشو تقویت می کنه.به قول یکی از همکارانم شاید اگر ما در موقعیت اون شخص قرار داشتیم همان کار را می کردیم. پس سعی می کنم کمتر قضاوت کنم و تا جای ممکن قضاوت خودمو به بعد موکول کنم.خب حالا نوبت شما هست که اگر تمایل دارید از تجربیات مختلفی که در سال گذشته داشتید بگید و اینکه فکر می کنید چه چیزهایی خوبه برای جا دادن در کوله پشتی سال 99 و چه چیزهایی رو بهتره از کوله مون خارج کنیم.Image source: pinterest.comسلامت و پایدار باشید.</description><category>Ramin Mehraninejad (raminpix)</category><author>Ramin Mehraninejad (raminpix)</author><pubDate>Wed, 18 Mar 2020 12:03:29 +0330</pubDate></item><item><title>تنها در سیاره - 15</title><link>https://virgool.ir/@raminpix/تنها-در-سیاره-15-fh1yqkunmc0a</link><description>مدت ها گذشته بود... سعی داشت از حافظه کامپیوتر قدیمی داخل موشک چیزی پیدا کنه اما چیزی پیدا نکرده بود.نه پیامی از مرکز عملیات دریافت کرده بود و نه چیزی جدیدی در سیاره اتفاق افتاده بود. همه چیز مثل قبل بود.... بجز یک چیز.... انگار چیزی درونش می گفت باید اونجا را به مقصد جدیدی ترک کنه! این که کجا و به چه سمتی مبهم بود. بعلاوه اینکه طبق دستورالعمل چنین اجازه ای نداشت و بدون هماهنگی مرکز عملیات نباید محل استقرارشو ترک می کرد.اما اون تصمیمشو گرفته بود. میخواست حرکت کنه و به دنیای جدید وارد بشه! انگار سیاره ناشناخته دیگه جایی برای جستجو و کنکاش نبود.&#34;سفینه من که سوخت کافی نداره ! البته چه فرقی می کنه مقصدم که مشخص نیست !!! &#34; در این فکر بود که ایده ای به ذهنش رسید.. &#34; می تونم با اون موشک برم!!!! حتما برنامه سفر در اون موشک تعبیه شده! چون حداقل خودم هم اینطوری تصور کرده بودمش ... &#34; خودشو به موشک رسوند. سعی کرد سیستم ها رو روشن کنه. &#34;یه سیستم ناوبری با مختصات فضایی آشنا! &#34;&#34;انگار مختصات فضایی ایستگاه Star-ship-1 هست! - عجب ... جایی که فضانورد شدم !&#34;&#34;خب پس اون ایستگاه فضایی قدیمی ... شاید از اونجا بتونم دوباره ماموریت جدید برم .... شاید بتونم دوباره چیزهای جدیدی کشف کنم !&#34;&#34;پس هدف مشخص شد: Star-Ship-1 ! &#34;خیلی سریع دست به کار شد. سوخت باقی مونده سفینه خودشو به موشک منتقل کرد و اون کامپیوتر قدیمی، دفترچه خاطراتش، داده های جمع آوری شده، وسایل شخصی و قاب عکس روی دیوار اتاق استراحت خدمه...همه چیز محیا شده بود...سعی کرد برای آخرین بار با مرکز عملیات تماس بگیره. همین که دستگاه روشن کرد یه پیام عجیب دریافت کرد... زمان ارسال پیام از مرکز عملیات مشخص نبود.اما متن پیام این بود: &#34;همان جا بمان!&#34;قبلی: تنها در سیاره - 14بعدی: تنها در سیاره - 16</description><category>Ramin Mehraninejad (raminpix)</category><author>Ramin Mehraninejad (raminpix)</author><pubDate>Thu, 23 Jan 2020 13:28:31 +0330</pubDate></item><item><title>تنها در سیاره - 14</title><link>https://virgool.ir/@raminpix/تنها-در-سیاره-14-hqixzotwlsv4</link><description>بعد از انتقال کمودور 64 به سفینه متوجه شد که سال ساخت کامپیوتر دقیقا مشابه سال ساخت کمودور 64 دوران نوجوانی خودش در سیاره مادر هست. حس عجیبی داشت... انگار تمامی خاطرات دوران کودکی و نوجوانی اش همزمان با او به سیاره ناشناخته سفر کرده بودند...&#34; یعنی چی؟؟؟ این موشک کاوشگر، این ربات و این کامپیوتر این جا چی کار می کنن؟ اصلا چرا چیزی که من فقط در تصوراتم خلقش کرده بودم باید اینجا باشه ! اونهم دقیقا به همون شکل !!؟؟؟ &#34;فکرش به جایی نمی رسید... گزارش ماموریت را برای مرکز فرماندهی عملیات فرستاد:&#34; از کاوشگر 755 به مرکز عملیات: امروز در موقعیت ... سفینه حامل ربات را پیدا کردم. داخل سفینه یک کامپیوتر کمودور 64 قدیمی هم وجود داشت. اما ظاهرا حافظه کامپیوتر برنامه LOAD شده ای نداره... &#34;از اینکه ردی از مبدا پرتاب موشک پیدا نکرده بود کمی عصبانی شده بود. احساس می کرد هر چقدر که بیشتر جستجو کرده با ابهامات و پرسش های بی جواب بیشتری هم روبرو شده...به اتاق استراحت خدمه رفت و دفتر خاطراتش را برداشت و نوشت: ابهامات جدید...موقع خواب با خودش فکر می کرد با پیدا کردن اون کامپیوتر و خواندن حافظه اش حتما میفهمه مبدا پرتاب موشک کجاست اما ظاهرا اون کامپیوتر چیزی به جز برنامه پیش فرض BASIC در حافظه اش نداشت.خوابش نمی برد.... سعی کرد دوباره همه چیز را در ذهنش مرور کنه!&#34;ربات تخیلی من که حالا کاملا به واقعیت تبدیل شده! موشک تخیلی من که الان روی خاک سیاره فرود داومده و  کمودور 64 که در خیالاتم درون موشک جا داده بودم که الان همینجاست...&#34;&#34;چیزهایی که در گذشته فقط تصور کرده بودم روی یک سیاره جدید و کاملا ناشناخته به واقعیت تبدیل شدن؟!!!&#34;&#34; نمی فهمم... چرا الان... چرا اینجا ... &#34;با این افکار به خواب رفت ...بعدی: تنها در سیاره - 15قبلی: تنها در سیاره - 13</description><category>Ramin Mehraninejad (raminpix)</category><author>Ramin Mehraninejad (raminpix)</author><pubDate>Sat, 12 Oct 2019 01:53:31 +0330</pubDate></item><item><title>تجربه من در مهاجرت از MySQL به SQL Server - قسمت دم</title><link>https://virgool.ir/@raminpix/تجربه-من-در-مهاجرت-از-mysql-به-sql-server-قسمت-دم-bjut57xmifhs</link><description>Microsoft SQL Server Migration Assistant for MySQL v8.4.0در قسمت قبل توضیح دادم که بعد از چهار سال استفاده از MySQL تصمیم گرفتیم به SQL Server مهاجرت کنیم و برای این کار نیاز بود تا مطمئن بشیم تمامی Table ها، View ها، Function ها و در کل تمام Objectهایی که در MySQL ایجاد کرده بودیم به درستی به SQL Server منتقل بشه.بعد از کمی جستجو فهمیدیم که Microsoft ابزاری داره که برای Migration از دیتابیس های مختلف از جمله MySQL به SQL Server استفاده میشه. (کلی خوشحال شدیم!) و بلافاصله این ابزار (Migration Assistant) را دانلود و نصب کردیم.محیط نرم افزار SQL Server Migration Assistant for MySQLاین را بگم که این نرم افزار محیط ساده ای داره و کار کردن باهاش راحته.در قدم اول باید پروژه ای ایجاد کنیم که شامل تمامی mapping ها و meta-data ها و چیزهایی که Migration Assistant برای انتقال Schema ها و داده ها و ... نیاز داره.بعدش نوبت به تعریف Connection ها میرسه. یک Connection برای MySQL و یکی هم SQL Server.نکته ای که وجود داره انتخاب Database مقصد در SQL Server هست که ما برای این کار یک Database خالی ایجاد کردیم به اسم NEWDB و در قسمت Database اتصال به SQL Server مشخص کردیم.استراتژی که داشتیم این بود که تمامی Schema های تعریف شده در MySQL به این Database جدید در SQL Server منتقل بشه.یعنی بطور مثال: SELECT * FROM MySCHEMA.MyTABLE در MySQL تبدیل میشه به:SELECT * FROM NEWDB.MySCHEMA.MyTABLEدر SQL Server.بعد از اتصال به MySQL، ابتدا باید مشخص کنیم که Schema ها یا بطور دقیق تر Object ها باید Load بشه.در قسمت MySQL Metadata Explorer امکان انتخاب Object هایی که قرار هست به SQL Server منتقل بشه وجود داره.ما بعد از انجام چند بار تست روی یکی دوتا جدول و یک Function تصمیم گرفتیم کل Schema هایی که داشتیم منتقل کنیم، و بعد از اینکه فهمیدیم اوضاع خوبه همه Schema های مورد نظرمون رو انتخاب کردیم.قدم بعدی هم اینه که Database مقصد را در SQL Server Metadata Explorer تعیین کنیم.پس تا اینجای کار مشخص کردیم که چه Object هایی از MySQL قرار هست به SQL Server منتقل بشه.فرآیند Migration در این ابزار شامل دو بخش اصلی میشه:عملیات Convert: معادل هر Object (شامل Table، Function و ...) که در MySQL ایجاد شده باید در SQL Server هم ایجاد بشه. (برای این کار از گزینه Convert Schema استفاده می کنیم. (البته باید روی قسمت MySQL Metadata Explorer کلیک کرده باشیم)نکته ای که وجود داره اینه که باید معادل schema و جداولی که در MySQL وجود داره در SQL Server هم ایجاد بشه، پس نیاز هست که SQL Server با MySQL همگام (Synchronize) بشن که گزینه Synchronize with Database در قسمت SQL Server Metadata Explorer اینکار را انجام میده.عملیات Data Migration: که دیتا از جداول مبدا در MySQL به مقصد (SQL Server) منتقل میکنه. (گزینه Migrate Data) در قسمت MySQL Metadata Explorer !بعد از اتمام عملیات Data Migration که بسته به حجم جداول میتونه زمان بر باشه گزارشی از تعداد جداول منتقل شده و جداولی که در زمان انتقال خطا داشتند یا بصورت منتقل نشدن (Partially Migrated) نمایش داده میشه که امکان ذخیره با فرمت CSV داره.ما کل پوشه پروژه Migration و گزارش عملیات را در Source Control خودمون ذخیره کردیم تا اگر لازم شد بعدا بتونیم بهش رجوع کنیم.نکته دیگه ای که وجود داشت این بود که در زمان انتقال Function ها، بعضی Function های ما با خطا منتقل شدن (شرح خطا در بدنه Function ها نوشته شده بود) که به دلیل عدم Convert بعضی دستورات در زمان Convert توسط این ابزار بود که باید خودمون بازنویسی می کردیم. مثل:M2SS0210: Conversion of  Regexp or Rlike  Operators is not supported.منظورش اینه که نتونسته Regexp رو Convert کنه!یا:M2SS0235: MySQL does not support UNSIGNED INTEGER datatype during CAST/CONVERT همینطور در بعضی Function ها هم با وجود اینکه Convert انجام شده بود اما نتیجه اجرای Function درست نبود که نیاز به تغییرات جزئی داشت.نتیجه گیریکل پروسه مهاجرت با شرایطی که اول کار توضیح دادم شامل این روند شد:برنامه ریزی برای مشخص کردن کارهایی که باید انجام میدادیم و همینطور شناسایی ریسک ها و پیچیدگی هاخانه تکانی قبل از حرکت! (حذف جداول بلا استفاده، انتقال برخی جداول به Schema های دیگه و ...)ذخیره تمامی Function های نوشته شده روی MySQL در Source Control.اجرای عملیات Convert و  Data Migration با استفاده از SQL Server Migration Assistant. (البته قبلش بصورت تستی چند جدول و Function منتقل کردیم!)اصلاح Function هایی که Convert آنها به درستی انجام نشده بود.اطمینان از صحت عملکرد و تست مجدد همه Function ها.اصلاح Query های Ad hoc و اصلاح Query های مورد استفاده در Application ها.در کل باید بگم که این تغییر با وجود اینکه شخصا به MySQL علاقه دارم خوب بود و باعث شد کلی مطلب جدید یاد بگیریم و بتونیم از این به بعد از امکانات SQL Server هم بیشتر استفاده کنیم.</description><category>Ramin Mehraninejad (raminpix)</category><author>Ramin Mehraninejad (raminpix)</author><pubDate>Wed, 04 Sep 2019 19:59:59 +0430</pubDate></item><item><title>تجربه من در مهاجرت از MySQL به SQL Server - قسمت اول</title><link>https://virgool.ir/@raminpix/تجربه-من-و-نکات-مهم-در-مهاجرت-از-mysql-به-sql-server-قسمت-اول-xs1hpmfjqb4v</link><description>مقدمه داستانچهار سال پیش که نسخه 5.5 دیتابیس MySQL نصب کردم تا برای کانورت و تجمیع اطلاعات نرم افزار Legacy که مبتنی بر FoxPro بود ازش استفاده کنم اصلا فکر نمی کردم که این روند برای چهار سال دیگه هم ادامه پیدا کنه و MySQL موقتی ما به یک دیتابیس گزارش گیری و تحلیلی با کلی Function پیاده سازی شده و جداول مختلف تبدیل بشه و هر روز ازش استفاده بشه.اما بلاخره زمان آن فرا رسید که سیستم Legacy جاش رو بده به سیستم جدیدی که از دیتابیس Microsoft SQL Server استفاده می کرد و ما در Integration با داده های موجود در SQL Server دچار چالش شدیم و با وجود اینکه چند سالی بود روی MySQL کارهای مختلفی انجام داده بودیم و حتی نرم افزار و Script های مختلفی بر اساس این دیتابیس نوشته بودیم نیاز به تغییر احساس شد.خلاصه که بعد از ارزیابی شرایط تصمیم گرفتیم طبق یک برنامه ریزی کلی از MySQL نسخه 5.5.21 به Microsoft SQL Server نسخه 2014 (که موجود بود و چند Database مختلف هم داشت) مهاجرت کنیم و تمام جداول و index های تعریف شده در آنها و Function هایی که نوشته بودیم را به SQL Server منتقل کنیم.ویژگی های مسئلهبرخی از جداول ما به لحاظ تعداد رکورد تا حدود 2 میلیون رکورد را در خود ذخیره کرده بودن و نوع داده عمدتا VARCHAR و INT و FLOAT بود و خبری از BLOB و یا انواع داده ای خاص نبود.ما برای انجام برخی محاسبات مثل تبدیل تاریخ به تعداد روز و ... و یا Text Normalizing(برای بهبود جستجو در متن) Function هایی نوشته بودیم که لازم بود در SQL Server هم port بشن.خوشبختانه! ما constraint خاصی برای foreign key ها نداشتیم و از این بابت نگرانی(ریسک) خاصی وجود نداشت.در مورد Application هایی که به MySQL متصل می شدن هم همه بر اساس Java و یا Python نوشته شده بودن و تغییرات لازم برای استفاده از SQL Server در آنها پیچیدگی زیادی نداشت.تصویر کلیکل کار به چهار بخش عمده تقسیم می شد:حذف جداول بلا استفاده و سازماندهی مجدد (جابجایی) جداول میان Schema های موجود و یا Schema جدید.انتقال Schema و جداول موجود در آنها به Database مقصد در SQL Server.بازنویسی مجدد Function های پیاده سازی شده در MySQL بر اساس Syntax و قواعد SQL Server.اعمال تغییرات لازم در Query های Ad hoc و همچنین Application های مبتنی بر MySQL و استفاده از بانک اطلاعاتی SQL Server.قبل از بستن چمدانهاقبل از مهاجرت نیاز داشتیم تا جداولی که بصورت موقت در MySQL ایجاد شده بودند پاک کنیم و یک سری از جداول را هم بر اساس سال (تاریخ) در Schema های متناظر آنها قرار بدیم. (یعنی یک خانه تکانی قبل از شروع سفر!)همینطور باید می فهمیدیم جابجایی جداول در Schema ها چقدر روی Query های موردی (یا همان Ad-hoc) و Application هایی که از ساختار فعلی جداول و Schema ها استفاده می کردن اثر خواهد داشت. پس شروع کردیم چند نمونه از Query های قبلی را در ساختار جدید که بصورت تستی آماده کرده بودیم اجرا کنیم و تغییراتی که باید در Query ها اعمال میشد را شناسایی کردیم. (نکته ای که وجود داشت این بود که چون تعداد Query های Ad hoc نسبتا زیاد بودن تصمیم گرفتیم موارد پر کاربرد را در ابتدا و بقیه را فراخور نیاز اصلاح کنیم!)در مورد Application ها هم تغییراتی که لازم بود در Query ها اعمال کنیم تا با ساختار جدید همچنان اجرا بشن مشخص شد.برای انتقال دسته ای جداول میان Schema های مختلف هم کار را با نوشتن یک Script جمع و جور در Python که لیست جداول و schema مبدا و مقصد را از یک فایل Excel میخواند و جداول را در MySQL منتقل می کرد انجام دادیم.اینجا بود که در واقع فرآیند آماده سازی داده ها برای انتقال به SQL Server انجام شد.قسمت دوم - استفاده از ابزار SQL Server Migration Assistant for MySQL </description><category>Ramin Mehraninejad (raminpix)</category><author>Ramin Mehraninejad (raminpix)</author><pubDate>Sun, 01 Sep 2019 19:32:13 +0430</pubDate></item><item><title>تنها در سیاره - ۱۳</title><link>https://virgool.ir/@raminpix/تنها-در-سیاره-۱۳-t3lenfj1huxn</link><description>مدتی بود خود را در سفینه مشغول تهیه گزارش از جو سیاره کرده بود. اما بلاخره تصمیم گرفت از سفینه خارج شود و ادامه کاوش را در پیش بگیرد. جستجو برای یافتن موشک حامل ربات و یا هر نشانه ی دیگری...&#34;لباس فضایی... اکسیژن ۱۰۰٪... سیاره نورد... شارژ باتری کامل... خوب ظاهرا همه چیز مرتبه!&#34;سعی کرد با مختصاتی که از محل پیدا کردن ربات داشت دوباره به جستجو منطقه بپردازه. مدتی گذشته بود و کم کم داشت ناامید می شد که در امتداد افق نقطه ای تیره رنگ نمایان شد. وقتی نزدیک تر شد دوباره همان چیزهایی که در دوران نوجوانی در ذهنش خلق کرده بود جلوی چشمانش ظاهر شد. &#34;موشک عمود نشین با قابلیت استفاده مجدد!&#34; انگار دوباره چیزی از تصورات گذشته اش را می دید! یادش می آمد که وقتی نوجوان بود قصد ساخت موشکی را داشت که با فرود عمودی روی سطح سیاره ها و استفاده مجدد امکان سفر و جستجو در سیارات ناشناخته را به او بدهد و ... الان آن موشک دقیقا روبرویش قرار داشت. سعی کرد از در اصلی که در پایین کلاهک موشک قرار داشت وارد قسمتی که برای سزنشین (در ذهنش) طراحی شده بود بشود. &#34;جالبه! دقیقا همان طوری که تصورش را کرده بودم! پس الان باید حتما یک کامپیوتر کمودور ۶۴ هم اینجا باشه !!! بله !!! دقیقا مطابق طرح اولیه موشک!!!&#34;باورش سخت بود. اما دقیقا یک کمودر ۶۴ که زمانی در تصوراتش به عنوان کامپیوتر مرکزی در موشک خیالی اش قرار داده بود در آنجا وجود داشت و حتی روی صفحه مانیتور هم نوشته شده بود: READY.&#34;پس حتما حافظه این کامپیوتر اطلاعاتی از مبدا پرتاب باید داشته باشه! باید ببرمش داخل سفینه !&#34;قبلی: تنها در سیاره - 12بعدی: تنها در سیاره - 14</description><category>Ramin Mehraninejad (raminpix)</category><author>Ramin Mehraninejad (raminpix)</author><pubDate>Sun, 14 Apr 2019 20:12:31 +0430</pubDate></item><item><title>تنها در سیاره - 12</title><link>https://virgool.ir/@raminpix/تنها-در-سیاره-12-yv85bqhx2xlv</link><description>بعد از ارسال گزارش ماموریت تصمیم گرفت بفهمد این ربات از کجا آمده و ماموریتش در این سیاره چیست.&#34; جالبه ... همان طوری که خیال پردازی کرده بودم حتی یه اتصال Serial هم داره &#34;برای دستیابی به اطلاعات موجود در حافظه ربات از پورت Serial سفینه به ربات متصل شد.&#34; خوب پس اگه مثل طرح خیالی من باشه باید یه جایی برای نگهداری مشخصات و وقایع هم داشته باشه ! &#34;روی صفحه مانیتور سفینه اطلاعاتی از مشخصات ربات و سازنده آن نمایان شد.&#34; باورم نمیشه !!!! - یعنی سازنده ربات من هستم؟!!!! این امکان نداره... من فقط تصور ساختن رباتی مثل این رو داشتم!!! &#34;کاملا شوکه شده بود و توجیهی برای این وضعیت نداشت! دوست داشت همه این ها فقط رویایی باشد...سعی کرد بفهمد از عمر فعالیت ربات چقدر گذشته است و وقتی زمان اولین فعالیت ربات را به تاریخ سیاره مادر تبدیل کرد فهمید که ربات درست در دوره نوجوانی او ساخته شده!حالا بیشتر از قبل درمانده شده بود. از جایش بلند شد و شروع به راه رفتن سریع کرد. سعی کرد فکر کند و تمام فرضیه های ممکن را در ذهنش بسازد...&#34; یعنی یکی دقیقا مثل من این ربات را ساخته ؟!!! دقیقا در زمانی که من تصور ساختن آن را می کردم ؟!! &#34;چیزی که به ذهنش رسید این بود که حتما این ربات توسط یک موشک و یا سفینه به این سیاره رسیده و تصمیم گرفت اطلاعات زمان اولین حرکت ربات روی سیاره را تشخیص دهد.&#34; جالبه همزمان با من به این سیاره رسیده! یعنی درست وقتی من فرود آمدم و از سفینه پیاده شدم این ربات هم شروع به حرکت کرده ! &#34;تصمیمش را برای یافتن سفینه حامل ربات گرفته بود... اما تا شارژ کامل سیاره نورد و اکسیژن لباس فضایی باید تا فردا صبر می کرد...قبلی: تنها در سیاره - 11بعدی:‌ تنها در سیاره - 13</description><category>Ramin Mehraninejad (raminpix)</category><author>Ramin Mehraninejad (raminpix)</author><pubDate>Wed, 28 Nov 2018 15:52:24 +0330</pubDate></item><item><title>تنها در سیاره - 11</title><link>https://virgool.ir/@raminpix/تنها-در-سیاره-11-jtdxhdzpijge</link><description>سوار بر سیاره نورد مسیر روی خاک سیاره را دنبال کرد. مدتی کمی گذشته بود که ناگهان نقطه ای نورانی در سمت چپ افق دیدش نمایان شد. برای لحظه ای نفسش در سینه حبس شد. نمی دانست وقتی به آن نقطه نورانی برسد با چه چیزی روبرو خواهد شد!&#34; خطرناکه؟!!! موجود فضایی؟!!! از سیاره مادر فرستاده شده؟!!! &#34;نقطه نورانی رفته رفته واضح تر می شد. چشمانش را دائم می بست و دوباره باز می کرد تا تصویر پیش رویش را وضح تر ببیند.&#34;  یه ربات ! اما اینجا چه کار می کنه؟! چطوری آمده؟!! ماموریتش چیه؟!! &#34;از سیاره نورد پیاده شد و آرام آرام به سمت ربات رفت. وقتی نزدیک تر رسید و خوب نگاه کرد احساس کرد ربات را قبلا جایی دیده است...&#34; باورم نمیشه !! انگار این رباتی هست که قرار بود یه روی بسازمش !!! &#34;ربات کاملا همان چیزی بود که وقتی در سیاره مادر دوران نوجوانی خود را می گذراند قصد ساختنش را داشت.با نزدیک تر شدن او ربات به سمتش چرخید. همان جا ایستاد. ربات کمی جلوتر آمد و انگار می خواست با او ارتباط برقرار کند.سعی کرد به ربات نزدیک تر شود و لمسش کند. یک صفحه مانیتور کوچک پشت ربات قرار داشت که وضعیت انرژی باقی مانده و چیزهای دیگر را نشان می داد...&#34; انگار داره خاموش میشه ! دقیقا مثل طرح بات خودم ! یه اتصال برای شارژ هم داره ! &#34;. از پیدا کردن موجودی آشنا خوشحال شده بود! ترسش ریخته بود... بنابراین تصمیم گرفت ربات را به سفینه ببرد. در راه برگشت دائم سوال های قبلی در ذهنش نقش می بست. &#34; چطوری آمده؟!! ماموریتش چیه؟!! &#34;به سفینه رسید و از در انتقال بار ربات را وارد قسمت قرنطینه سفینه کرد.با ابزار های مخصوص به ارزیابی و اسکن ربات مشغول شد. &#34; ظاهرا که آلودگی نداره &#34;نشست و به ربات خیره شد... &#34; از کجا آمده ؟!! چطوری دقیقا مشابه چیزی هست که قرار بود یه روزی بسازم!!! یعنی یه نفر دقیقا ایده ای مثل ایده من داشته ؟!! &#34;برای ارسال گزارش ماموریت به  عرشه پرواز سفینه رفت:&#34;   از کاوشگر 755 به مرکز فرماندهی عملیات. امروز یک ربات در موقعیت  ... پیدا کردم. برای بررسی بیشتر به قرنطینه سفینه منتقل کردمش ... &#34;بعدی: تنها در سیاره - 12قبلی: تنها در سیاره - 10</description><category>Ramin Mehraninejad (raminpix)</category><author>Ramin Mehraninejad (raminpix)</author><pubDate>Wed, 28 Nov 2018 12:35:10 +0330</pubDate></item><item><title>تنها در سیاره - 10</title><link>https://virgool.ir/@raminpix/تنها-در-سیاره-10-bhsyiq3kasog</link><description>صبح شده بود و او مطابق معمول روزش را با صرف صبحانه و مرور برنامه ماموریت شروع کرد. طبق برنامه برای یک کاوش دو ساعته با خودرو سیاره نورد از سفینه خارج شد. تصمیم گرفت مسیرش را عوض کند و به منطقه جدیدی برای جستجو برود. در راه افکارش هم مثل همیشه با او به حرکت درآمد... در مورد اینکه آیا آن چیزی که برایش به این سیاره آمده است را پیدا می کند... آیا ماموریت او با دستاوردی مشخص به پایان می رسد... آیا پیام ها و گزارش هایش به سیاره مادر و یا هر جای دیگری رسیده است...همچنان با این افکار در حرکت بود اما ناگهان چیزی روی خاک سیاره نظرش را جلب کرد. سیاره نورد را متوقف کرد، پیاده شد و نگاهی به سطح زیر پایش کرد... باورش برایش سخت بود... اما ردی از حرکت یک وسیله متحرک بر روی خاک سیاره نقش بسته بود!&#34; امکان نداره !... اینجا قبلا هیچ سفینه ی سرنشین دار یا بی سرنشینی فرستاده نشده !!! &#34;مطمئن بود که آن وسیله ناشناس از سیاره مادر فرستاده نشده.تصمیم گرفت رد روی زمین را دنبال کند...بعدی: تنها در سیاره - 11قبلی: تنها در سیاره - 9</description><category>Ramin Mehraninejad (raminpix)</category><author>Ramin Mehraninejad (raminpix)</author><pubDate>Mon, 26 Nov 2018 16:27:56 +0330</pubDate></item><item><title>توسعه نرم افزار مبتنی بر Java: نصب Apache Maven</title><link>https://virgool.ir/@raminpix/توسعه-نرم-افزار-مبتنی-بر-java-نصب-apache-maven-jtirazbkqedd</link><description>بطور کلی برای Build پروژه های جاوا نیاز به معرفی Dependency ها (کتابخانه های jar مورد استفاده در پروژه های جاوا) به کامپایلر زبان و همچنین مشخص نمودن نحوه ایجاد بسته (Package) خروجی نهایی (مثل jar، war و ...) بر اساس نوع پروژه (web، standalone و ...) داریم. و طبیعتا مثل خیلی از چالش های مهندسی نرم افزار با بزرگ شدن و پیچیده شدن پروژه مدیریت این امور نیز پیچیده تر و سخت تر خواهد شد.یکی از ابزار های مهم و کاربردی در فرآیند توسعه پروژه های جاوا Apache Maven است. بطور خلاصه این ابزار با هدف ساده سازی فرآیند Build و مدیریت Dependency ها  ایجاد شده و در حال حاضر از محبوبیت بالایی در میان توسعه دهندگان جاوا برخوردار است. مراحل نصب Apache Maven در Windows 7پیش نیاز: نصب بودن Java JDK. دریافت Apache Maven. بعد از دریافت Maven فایل آن را در مسیری که میخواهیم در آن نصب انجام شود Extract می کنیم. مثل:d:\development\ apache-maven3. مقدار دهی متغیر محیطی PATH برای شناسایی مسیر فایل های اجرایی maven:برای سهولت استفاده از Maven و اجرای آن از طریق Command Line نیاز است مسیر فایل های اجرایی maven را در متغیر محیطی PATH که شامل مسیر فایل های اجرایی قابل دسترس در Command Line می باشد ذخیره کنیم. برای این منظور System Properties را از طریق Start -&gt; Control Panel -&gt; System اجرا می کنیم و سپس گزینه Advanced system settings و در نهایت Environment Variables را انتخاب می کنیم:نحوه دسترسی به تنظمیات متغیر های محیطی (Environment Variables) در Windows 7سپس در صورتی که بخواهیم فایل های اجرایی maven برای کلیه کاربران سیستم عامل از طریق Command Line قابل اجرا باشد در قسمت System Variables و اگر بخواهیم فقط برای کاربری خودمان قابل اجرا باشد در قسمت User Variables متغیر PATH را پیدا و Edit می کنیم و در انتهای مقدار آن مسیر زیر را وارد می کنیم:;d:\development\apache-maven\binمقدار دهی متغیر PATH موجود در User Variablesکارکتر ; برای جدا سازی مقادیر متغیر PATH در سیستم عامل Windows به کار می رود.4. بررسی نسخه maven از طریق command line: در مرحله آخر و پس از مقدار دهی متغیر PATH برای اطمینان از نصب صحیح maven در Command Line دستور زیر را اجرا می کنیم:mvn --version</description><category>Ramin Mehraninejad (raminpix)</category><author>Ramin Mehraninejad (raminpix)</author><pubDate>Thu, 22 Nov 2018 15:28:32 +0330</pubDate></item></channel></rss>