<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های Hamid BP</title><link>https://virgool.ir/feed/@behzadpour.h</link><description>برنامه‌نویس جاوا. سعی می‌کنم هرچه در خلال کار یاد می‌گیرم، اینجا به اشتراک بذارم</description><language>fa</language><pubDate>2026-11-11 11:34:43</pubDate><image><url>https://files.virgool.ir/upload/users/68853/avatar/o55DuA.jpeg</url><title>Hamid BP</title><link>https://virgool.ir/@behzadpour.h</link></image><item><title>راهنمای یکپارچه‌سازی Jenkins ,Bitbucket و Tomcat</title><link>https://virgool.ir/@behzadpour.h/jenkins-bitbucket-tomcat-integration-ppphzi41hdvg</link><description>هدف این مقاله اینه که یاد بگیریم چطور وقتی مجموعه‌ای از تغییرات کد رو push می‌کنیم، نسخه جدید app ما روی server در اصطلاح deploy و آماده استفاده‌ی کاربرها بشه.اینجا (با توجه به امکانات من) از Bitbucket به عنوان source control ، از Jenkins به عنوان ابزار CI/CD و از Apache Tomcat به عنوان application server استفاده کردیم.البته این کار وظیفه‌ی تیم DevOps هست که نقش بسیار مهمی رو در فرآیند توسعه‌ی نرم‌افزار به عهده داره. DevOps در هر سازمان، در واقع کار دو گروه توسعه‌دهنده ها(Developers) و عملیات(Operations) رو ساده می‌کنه.‌اگر هنوز jenkins یا tomcat رو نصب نکردید و برای این کار نیاز به راهنمایی دارید، می‌تونید از مقاله‌های خوبی که قبلا به زبان فارسی نوشته شده‌ن استفاده کنید.مواردی که در این مقاله بررسی می‌کنیم:‌ساخت یک repository در bitbucketاضافه کردن pluginهای مورد نیاز به jenkinsساخت یک job در jenkins ساخت یک hook در bitbucket و اتصال اون به jenkinsتغییر در کد، بررسی build شدن پروژه در jenkins و در نهایت deploy شدن application در tomcat۱ـ ساخت یک repository در bitbucketاگر از bitbucket به صورت آفلاین (در اصطلاح local) استفاده نمی کنید، قبل از هرچیز نیاز به یک Bitbucket account دارید. از طریق لینک زیر می‌تونید یک حساب کاربری و در پی اون یک repository برای خودتون بسازید: https://bitbucket.org/account/signin/ بعد از ساخت حساب کاربری و وارد شدن به اون، Create Repository رو کلیک کنید:طبق تصویر زیر یک repository بسازید و اطلاعات و نام‌های مورد نظر رو پر کنید:حالا در اصطلاح Bitbucket Repo آماده‌ی استفاده‌ست و البته branch پیش‌فرض هم master خواهد بود.من یک پروژه‌ی ساده‌ی spring boot Hello World رو دانلود و به این repository اضافه کردم.۲ـ اضافه کردن pluginهای مورد نیاز به jenkinsبه سرور jenkins که پیش از این نصب و راه‌اندازی شده، login کنید و  از سمت چپ به بخش Manage Jenkins برید: بعد Manage Plugins رو کلیک کنید:حالا pluginهای زیر و جستجو کنید، تیک بزنید و بعد با زدن دکمه Install without restart اونها رو نصب کنید:Bitbucket PluginDeploy to container Plugin۳ـ ساخت یک job در jenkins حالا باید یک job در jenkins بسازیم که اساسا مهمترین و بیشترین وظیفه رو در کل این فرآیند به عهده داره.برای این کار به صفحه اصلی jenkins برید و از سمت چپ گزینه‌ی New Item رو انتخاب کنید:بعد از اینکه یک اسم مناسب برای job در نظر گرفتید، گزینه‌ی FreeStyle Project رو انتخاب کنید و در پایین صفحه، دکمه‌ی OK  رو کلیک کنید:در صفحه پیش رو، به بخش Source Code Management برید و گزینه‌ی Git رو انتخاب کنید:اینجا در قسمت Repository URL آدرس repository خودتون رو که قبلا در bitbucket ایجاد کردید وارد کنید.‌این آدرس در واقع همون آدرسی‌ست که برای clone کردن پروژه استفاده می‌کنید.بعد برای اعتبارسنجی دسترسی، در بخش Credentials با زدن دکمه Add و بعد Jenkins برای ورود اطلاعات نام کاربری و گذرواژه آماده بشید:در صفحه بعد و در محل‌های مربوط، Username و Password دسترسی به repository رو وارد کنید.انتظار داریم که در صورت درست بودن اطلاعات وارد شده، بدون هیچ error یا اخطاری بتونیم به قسمت بعد بریم :حالا در بخش Build Triggers گزینه‌ی Build when a change is pushed to BitBucket رو انتخاب کنید.با این انتخاب در واقع jenkins رو اصطلاحا &#34;گوش به زنگ&#34; می‌کنیم تا هربار با دریافت یک سیگنال از طرف bitbucket مبنی بر push شدن تغییرات جدید، نسخه‌ی جدید رو build کنه و برای app server (در اینجا tomcat) ارسال کنه.ضمنا فراموش نکنید که در قسمت Override Repository URL باید مجددا آدرس repository خودتون رو وارد کنید:حالا به بخش Build میریم و با زدن دکمه Add build step، گزینه‌ی Invoke top-level Maven targets رو انتخاب می کنیم:در قسمت باز شده (Goals) عبارت &#34;clean install&#34; رو وارد می‌کنیم:حالا در بخش Post-build Actions روی دکمه Add post-build Actions کلیک می‌کنیم و در نهایت گزینه‌ی &#34;Deploy war/ear to a container&#34; رو انتخاب می‌کنیم:در این قسمت در بخش Containers و با زدن دکمه Add container، می‌تونیم container مناسب رو(که برای من Tomcat 9.x هست) انتخاب کنیم:بعد مثل مرحله اضافه کردن credentials مربوط به سرور bitbucket، اینجا هم با زدن دکمه Add &gt; Jenkins، اطلاعات Username و Password مربوط به سرور Tomcat رو وارد می‌کنیم. توجه داشته باشید که مشخصات  کاربری رو وارد کنید که حداقل نقش manager-script داشته باشه(اگه manager-gui هم داشته باشه که چه بهتر).بعد در قسمت WAR/EAR files، عبارت **/*.war و در قسمت Context path مسیر publish شدن war/ear fileتون رو وارد کنید:در نهایت با زدن دکمه‌ی Save، این تنظیمات رو ذخیره می‌کنیم:۴ـ ساخت یک hook در bitbucket و اتصال اون به jenkinsحالا باید در bitbucket و در repository که قبلا ساختیم یک hook برای اعلام تغییرات کد به jenkins بسازیم.برای این کار از طریق منوی سمت چپ به صفحه‌ی Repository settings &gt; Webhooks می‌ریم:در این صفحه با زدن دکمه Add webhook یک hook جدید اضافه می‌کنیم. در صفحه باز شده در قسمت Title یک نام برای hook انتخاب می‌کنیم و در قسمت URL آدرس سرور jenkins رو وارد می‌کنیم.توجه کنید که syntax مورد نظر برای وارد کردن URL به شکل زیر هست:IP-address/bitbucket-hook/در نهایت با انتخاب گزینه‌های Active و Skip certificate verification، در بخش Triggers هم گزینه‌ی Push رو انتخاب می‌کنیم و دکمه Save رو کلیک می‌کنیم:۵ـ بررسی عملکرد همگام‌سازی ۵-۱ـ اول به jenkins مراجعه می‌کنیم و بررسی می‌کنیم که آیا ارتباط از jenkins به bitbucket و tomcat برقرار هست یا نه!برای این کار در Jenkins dashboard و برای job تازه ساخته شده‌مون فرمان Build Now رو اجرا می‌کنیم:روند اجرای job رو می‌تونیم در بخش Build History و در قسمت Console Output مشاهده کنیم:اگر همه چیز موفقیت‌آمیز بود نشون‌دهنده‌ی ارتباط صحیح jenkins و bitbucket هست.۵-۲ـ حالا با توجه به آدرس app server به url پروژه مراجعه می‌کنیم تا deploy  شدن پروژه و ارتباط jenkins و tomcat رو بررسی کنیم:حالا به bitbucket می‌ریم و در صفحه‌ی Source فایل HelloWorldController.java رو برای تغییر انتخاب می‌کنیم. من برای تست، جمله‌ی &#34;Hello World&#34; رو تغییر می‌دم و بعد تغییرات رو commit می‌کنم:با بازگشت به jenkins و بررسی output در dashboard صحت عملکرد hook ساخته‌شده رو مشاهده می‌کنیم:و مجددا به url پروژه مراجعه می‌کنیم تا ببینیم تغییرات اعمال شده‌ی ما به درستی deploy شدن یا نه:خب، می‌تونیم بگیم که ما همین الان یک فرآیند ساده‌ی CI/CD رو تکمیل کردیم. یک تغییر در کدمون ایجاد کردیم و بدون دخالت انسانی، این تغییرات در اصطلاح build شدن و نسخه ما ساخته شد و باز بدون دخالت کسی این نسخه روی app server ما deploy شد.مقاله‌های خوب زیادی در اینترنت راجع به مفاهیم devops وجود دارن ولی من سعی کردم یک راهنمای گام به گام برای پیاده سازی یکی از این مفاهیم به طور خیلی ساده بسازم. طبیعتا همین نوشته هم وابسته به ابزارهاییه که من ازشون استفاده کردم ولی فکر می‌کنم می‌تونه یه نمای کلی و دیدگاه مناسبی از چگونگی عملکرد یک فرآیند ci/cd به مخاطب نشون بده.اگر اشکال یا خطایی وجود داره خوشحال می‌شم که بهم اطلاع بدید. </description><category>Hamid BP</category><author>Hamid BP</author><pubDate>Sun, 07 Nov 2021 13:43:16 +0330</pubDate></item><item><title>معرفی ویژگی‌های جدید Java11</title><link>https://virgool.ir/@behzadpour.h/معرفی-ویژگی-های-جدید-java11-cvyidj2frb4g</link><description>معرفی:اگرچه زمان زیادی از ارائه جاوا۱۱ در سپتامبر۲۰۱۸ توسط اوراکل می‌گذره، ولی چون اوراکل پشتیبانی رسمی از جاوا۸ رو در ژانویه ۲۰۱۹ متوقف کرده و این نسخه، اولین نسخه‌ی LTS (Long Term Support) بعدیه، یعنی با وجود معرفی جاوا 16 در مارس۲۰۲۱، هنوز هم نسخه‌ی LTS جدیدی ارائه نشده، و البته اینکه نرم‌افزارهای ما هم قراره به جاوا۱۱ مهاجرت کنن، تصمیم گرفتم تفاوت‌های جاوا۸ و جاوا۱۱ رو بررسی کنم و اینجا هم برای مطالعه و استفاده‌ی دوستان قرار بدم.در این نوشته قصد دارم یک نگاه کوتاه به تغییرات JDK برای ما برنامه‌نویس‌ها داشته باشم و بعد ویژگی‌های جدید، ویژگی‌های حذف شده و تغییرات در جهت افزایش عملکرد در جاوا۱۱ رو مرور کنم.Oracle JDK vs. Open JDKخوبه که بدونین جاوا۱۰ آخرین نسخه‌ی مجانی Oracle JDK بود که می‌تونستیم به صورت تجاری و بدون خرید License ازش استفاده کنیم. البته اوراکل هنوز به ارائه‌ی نسخه‌هایOpen JDK ادامه می‌ده که می‌تونیم اونها رو بدون پرداخت هزینه استفاده کنیم. ضمناً علاوه بر اوراکل، ارائه دهندگان Open JDK دیگری هم وجود دارن که می‌تونیم از نسخه‌های ارائه‌شده اونها هم استفاده کنیم. مثل:AdoptOpenJDK&#x9; &#x9;&#x9;Amazon Corretto&#x9;&#x9;&#x9;Azul ZuluBck2Brwsr&#x9;&#x9;&#x9;&#x9;CACAO&#x9;&#x9;&#x9;&#x9;&#x9;Codename OneDoppioJVM&#x9;&#x9;&#x9;&#x9;Eclipse OpenJ9&#x9;&#x9;&#x9;GraalVM CEHaikuVM&#x9;&#x9;&#x9;&#x9;HotSpot&#x9;&#x9;&#x9;&#x9;        JamigaJamVM&#x9;&#x9;&#x9;&#x9;&#x9;Jelatine JVM&#x9;&#x9;&#x9;JVM.goleJOS&#x9;&#x9;&#x9;&#x9;&#x9;Maxine&#x9;&#x9;&#x9;&#x9;&#x9;Multi-OS EngineRopeVM&#x9;&#x9;&#x9;&#x9;       &#x9;uJVM                                     Jikes RVM (Jikes Research Virtual Machine) https://virgool.io/d/cvyidj2frb4g/%F0%9F%93%B7%D8%B4%D8%B1%D8%AD:Stack%D8%B3%D9%87%D8%B3%D8%B7%D8%AD%DB%8CElasticStack(Beats%D9%88Logstash%D8%AF%D8%B1%DB%8C%DA%A9%D8%B3%D8%B7%D8%AD%D9%82%D8%B1%D8%A7%D8%B1%D8%AF%D8%A7%D8%B1%D9%86%D8%AF) اول: ویژگی‌های جدید جاوا۱۱ برای توسعه‌دهندگان https://virgool.io/p/cvyidj2frb4g/%D8%A7%DB%8C%D9%86%E2%80%8C%D9%87%D8%A7%D8%AA%D8%BA%DB%8C%DB%8C%D8%B1%D8%A7%D8%AAAPI%E2%80%8C%D9%87%D8%A7%DB%8C%D8%B1%D8%A7%DB%8C%D8%AC%D9%88%D9%87%D9%85%DA%86%D9%86%DB%8C%D9%86%DA%86%D9%86%D8%AF%D9%88%DB%8C%DA%98%DA%AF%DB%8C%D9%85%D9%81%DB%8C%D8%AF%D8%AF%DB%8C%DA%AF%D9%87%D8%A8%D8%B1%D8%A7%DB%8C%D8%AA%D9%88%D8%B3%D8%B9%D9%87%E2%80%8C%D8%AF%D9%87%D9%86%D8%AF%DA%AF%D8%A7%D9%86%D9%87%D8%B3%D8%AA%D9%86: ۱- متدهای جدید در کلاس ‌Stringrepeat()همونطور که از اسم‌ش مشخصه، این متد محتوای رشته رو تکرار می‌کنه. در‌واقع این متد یک رشته رو برمی‌گردونه که برابر concat رشته‌ایه که قراره n بار(n به عنوان پارامتر ورودی) تکرار بشه؛ ضمناً اگر رشته خالی باشه یا پارامتر ورودی صفر باشه، یک رشته‌ی خالی رو برمی‌گردونه:@Test&#xA;public void whenRepeatStringTwice_thenGetStringTwice() {&#xA;      String output = &#34;La &#34;.repeat(2) + &#34;Land&#34;&#xA;      is(output).equals(&#34;La La Land&#34;);&#xA;}strip()این متد یک رشته رو با حذف تمام Whitespaceها از ابتدا و انتهای اون بر‌می‌گردونه. این متد زیرمجموعه‌هایی هم با نام‌های ()stripLeading و ()stripTrailing داره که به ترتیب Whitespaceها رو از ابتدا و یا از انتهای رشته حذف می‌کنن.@Test&#xA;public void whenStripString_thenReturnStringWithoutWhitespaces() {&#xA;      is(&#34;\n\t hello \u2005&#34;.strip()).equals(&#34;hello&#34;);&#xA;}این متد بر اساس متد ()Character.isWhitespace مشخص می‌کنه که کاراکتر مورد بررسی   Whitespace هست یا نه. در‌واقع این متد تمام  Whitespaceهای Unicode رو می‌شناسه. این مهم‌ترین تفاوت متدهای ()strip و ()trim هست.isBlank()این متد اگر رشته خالی باشه یا فقط شامل Whitespace &#x9;باشه، مقدار true برمی‌گردونه و در غیراین‌صورت، مقدار false. درست مثل متد ()strip این متد هم تمام Whitespaceهای Unicode رو می‌شناسه.@Test&#xA;public void whenBlankString_thenReturnTrue() { &#xA;      assertTrue(&#34;\n\t\u2005 &#34;.isBlank()); &#xA;}lines()این متد یک Stream از خطوط استخراج شده از یک رشته رو برمی‌گردونه که هر خط در اون رشته توسط کاراکترهای انتهای-خط(&#34;n/&#34; یا &#34;r/&#34; و یا &#34;n/r/&#34; ) از باقی خطوط جدا شده:@Test&#xA;public void whenMultilineString_thenReturnNonEmptyLineCount() {&#xA;      String multilineStr = &#34;This is\n \n a multiline\n string.&#34;&#xA;      long lineCount = multilineStr.lines() .filter(String::isBlank) .count();&#xA;      is(lineCount).equals(3L);&#xA;}در نهایت Stream خروجی، حاوی خطوطیه که به ترتیب در رشته وجود دارن. کاراکترهای انتهای-خط هم از هرخط حذف می‌شن.۲- متدهای جدید در کلاس ‌Filesبا استفاده از متدهای جدید ()readString و ()writeString از کلاس Files، خوندن و نوشتن رشته‌ها در fileها آسون‌تر شده:Path filePath = Files.writeString(Files.createTempFile(tempDir, &#34;demo&#34;, &#34;.txt&#34;), &#34;Sample text&#34;); &#xA;tring fileContent = Files.readString(filePath);&#xA;assertThat(fileContent).isEqualTo(&#34;Sample text&#34;);۳- متد ()toArray در اینترفیس Collectionبه اینترفیس java.util.Collection یک متد جدید با نام ()toArray اضافه شده که می تونه یک IntFunction رو به عنوان generator در ورودی بپذیره. این متد تولید یک آرایه با نوع مناسب رو از یک collection آسون کرده:List&lt;String&gt; sampleList = Arrays.asList(&#34;Java&#34;, &#34;\n \n&#34;, &#34;Kotlin&#34;, &#34; &#34;);&#xA;List withoutBlanks = sampleList.stream()&#xA;        .filter(not(String::isBlank))&#xA;        .collect(Collectors.toList());&#xA;assertThat(withoutBlanks).containsExactly(&#34;Java&#34;, &#34;Kotlin&#34;);۴- متد ()not در اینترفیس Predicateیک متد static با نام ()not به فانکشنال اینترفیس(FunctionalInterface) Predicate اضافه شده که به کمک اون می تونیم predicateهای موجود رو منفی(negate) کنیم. خب در‌واقع ما قبل از جاوا۱۱ با همین متد negate() اینکار رو انجام می‌دادیم، پس اساساً چرا باید این متد جدید بوجود اومده باشه؟! فرض کنید که یک کلاس Person به شکل زیر داشته باشیم:public class Person {&#xA;  private static final int ADULT_AGE = 18;&#xA;  private int age;&#xA; &#xA;  public Person(int age) {&#xA;       this.age = age;&#xA;  }&#xA; &#xA;  public boolean isAdult() {&#xA;       return age &gt;= ADULT_AGE;&#xA;   }&#xA;}و یک لیست به این شکل:List&lt;Person&gt; people = Arrays.asList(&#xA;  new Person(1),&#xA;  new Person(18),&#xA;  new Person(2)&#xA; );و با استفاده از جاوا۸ می خوایم همه افراد بزرگسال رو از لیست بازیابی کنیم. خب این کار به راحتی با قطعه کد زیر قابل انجامه:people.stream()&#xA;    .filter(Person::isAdult)&#xA;    .collect(Collectors.toList());حالا اگر بخوایم همه افراد غیربزرگسالرو بازیابی کنیم چی؟ باید predicateمون رو به این ترتیب منفی کنیم:people.stream()&#xA;    .filter(person -&gt; !person.isAdult())&#xA;    .collect(Collectors.toList());اینجا ما دیگه نمی‌تونیم از method reference استفاده کنیم و خب اینجوری خوانایی کد رو پایین میاریم. یک راه جایگزین هم البته می تونه ساختن یک متد دیگه مثلاً با نام ()isNotAdoult باشه که کد مارو به این شکل تغییر می‌ده:people.stream()&#xA;    .filter(Person::isNotAdult)&#xA;    .collect(Collectors.toList());اما ممکنه ما نخوایم متد جدیدی رو به API خودمون که همین حالا در اختیار مشتریه اضافه کنیم. یا ممکنه اصلاً نتونیم اضافه کنیم چون کلاس Person مال ما یا در اختیار ما نیست.اینجاست که در جاوا۱۱ به جای استفاده از lambda یا اضافه کردن یه متد جدید به کلاس Person می‌تونیم از متد ()Predicate.not استفاده کنیم:people.stream()&#xA;    .filter(not(Person::isAdult))&#xA;    .collect(Collectors.toList());به بیان بهتر درحالیکه not(isBlank) می‌تونه خیلی طبیعی‌تر و قابل‌فهم‌تر از ()isBlank.negate باشه، اما مزیت بزرگترش اینه که ما می‌تونیم از متد ()not با method reference به شکل not(String::isBlank) استفاده کنیم.۵- امکان تعریف local-variable در عبارت‌های Lambda: https://virgool.io/p/cvyidj2frb4g/%D8%B7%D8%A8%D9%82%D8%AA%D8%B9%D8%B1%DB%8C%D9%81%D8%B3%D8%A7%DB%8C%D8%AA%D9%85%D8%B1%D8%AC%D8%B9(https://openjdk.java.net/)%D8%8C%D9%86%D9%88%D8%B9(type)%DB%8C%DA%A9%D8%B9%D8%A8%D8%A7%D8%B1%D8%AALambda%D9%85%D9%85%DA%A9%D9%86%D9%87%D8%A8%D9%87%D8%B5%D9%88%D8%B1%D8%AA%D8%B6%D9%85%D9%86%DB%8C%D8%AA%D8%B9%DB%8C%DB%8C%D9%86%D8%A8%D8%B4%D9%87%D9%88%D8%AF%D8%B1%D8%B2%D9%85%D8%A7%D9%86%D9%84%D8%A7%D8%B2%D9%85%D8%8Ctype%D9%87%D8%A7%DB%8C%D9%BE%D8%A7%D8%B1%D8%A7%D9%85%D8%AA%D8%B1%D9%87%D8%A7%DB%8C%D8%A7%D9%88%D9%86%D8%8C%D8%AA%D9%88%D8%B3%D8%B7%DA%A9%D8%A7%D9%85%D9%BE%D8%A7%DB%8C%D9%84%D8%B1%D8%A7%D8%B3%D8%AA%D9%86%D8%A8%D8%A7%D8%B7%D8%A8%D8%B4%D9%86.%D9%82%D8%A8%D9%84%D8%A7%D9%8B%D8%A7%D8%B2%D8%B9%D8%A8%D8%A7%D8%B1%D8%AA%E2%80%8C%D9%87%D8%A7%DB%8CLambda%D8%A8%D9%87%D8%A7%DB%8C%D9%86%D8%B4%DA%A9%D9%84%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87%D9%85%DB%8C%E2%80%8C%DA%A9%D8%B1%D8%AF%DB%8C%D9%85: (x, y) -&gt; x.process(y)در جاوا۱۰ (Java SE 10) تعریف نوع ضمنی برای متغیرهای محلی(local variables) ممکن شد. به این ترتیب امکان استفاده از var به عنوان type یک متغیرمحلی به جای type واقعی، به وجود اومد. اونجا کامپایلر، type واقعی روبراساس type مقداردهنده‌اولیه‌ی(initializer) موجود در سمت راست، استنباط می‌کرد. مثلا:var x = new Foo();for (var x : xs) { ... }try (var x = ...) { ... } catch …اما هنوز نمی‌تونستیم از local variableها در عبارت‌های Lambda به این صورت استفاده کنیم:(var s1, var s2) -&gt; s1 + s2جاوا۱۱ با پشتیبانی از کد بالا مسأله رو حل کرده وباعث شده استفاده از var در هر دو متغیرمحلی و پارامترهای lambda یکنواخت بشه. مهمترین مزیت این یکنواختی اینه که حالا می‌تونیم از modifireها، به ویژه annotationها، در متغیرهای محلی و عبارت‌های lambda بدون ازدست‌دادنِ خصوصیتِ خلاصه‌نویسی، استفاده کنیم:@Nonnull var x = new Foo();&#xA;(@Nonnull var x, @Nullable var y) -&gt; x.process(y)برای درک بهتر به این مثال نگاه کنین:List&lt;String&gt; sampleList = Arrays.asList(&#34;Java&#34;, &#34;Kotlin&#34;);&#xA; String resultString = sampleList.stream()&#xA;        .map((@NonNull var x) -&gt; x.toUpperCase())&#xA;        .collect(Collectors.joining(&#34;, &#34;));&#xA; assertThat(resultString).isEqualTo(&#34;JAVA, KOTLIN&#34;);۶- معرفی HTTP Client API:این API جدید از پکیج java.net.http در جاوا۹ معرفی شد، و حالا به یک ویژگی استاندارد در جاوا۱۱ تبدیل شده.این API که برای بهبود عملکردِ کلیِ ارسالِ درخواست توسط مشتری و دریافتِ پاسخ از سرور طراحی شده، از هر دو استاندارد HTTP/1.1 و HTTP/2 و همچنین از WebSockets پشتیبانی میکنه.URI uri = URI.create(&#34;http://localhost:8080&#34;);&#xA; HttpClient httpClient = HttpClient.newBuilder()&#xA;        .version(HttpClient.Version.HTTP_2)&#xA;        .connectTimeout(Duration.ofSeconds(20))&#xA;        .build();&#xA; &#xA; HttpRequest httpRequest = HttpRequest.newBuilder()&#xA;        .GET()&#xA;        .uri(uri)&#xA;        .build();&#xA; &#xA; HttpResponse httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());&#xA; &#xA; assertThat(httpResponse.body()).isEqualTo(&#34;Hello from the server!&#34;);۷- کنترل دسترسی Nest-Basedقطعه کد زیر رو در نظر بگیرین:public class Outer {&#xA;  private String name = &#34;I am Outer!!&#34;&#xA; &#xA;  class Inner {&#xA;  public void printName() {&#xA;  System.out.println(name);&#xA;        }&#xA;    }&#xA; }اگر این کلاس رو کامپایل کنیم ، دو کلاس Outer و Outer$Inner ایجاد می‌شن. یعنی از نظر JVM حتی یک کلاس تودرتو هم یک کلاس معمولی با یک نام منحصر به فرده.اگرچه قانون دسترسی JVM اجازه‌ی دسترسی به اعضای private بین کلاسهای مختلف رو نمی‌ده، اما اگر دو کلاس مثل مثال بالا در اصطلاح nested باشن، کامپایلر این دسترسی رو از طریق ساخت یک bridge method با نام  access$000 ایجاد می‌کنه. کلاس‌های بالا بعد از کامپایل به شکل زیر در میان:public class Outer {&#xA;  private String name = &#34;I am Outer!!&#34;&#xA;  String access$000(){&#xA;  return name;&#xA;    }&#xA; }&#xA; &#xA; class Outer$Inner {&#xA;  final Outer obj;&#xA;  public void printName() {&#xA;  System.out.println(obj.access$000());&#xA;    }&#xA; }در جاوا 11 ، کامپایلر جاوا هیچ دسترسی‌ای روبه روش bridge ایجاد نمی‌کنه. بلکه در قانون دسترسی JVM جدید، کنترل دسترسی Nest-Based اجازه‌ی دسترسی private به اعضای Nest رو صادر می‌کنه. در‌واقع در جاوا۱۱ متدهای ()getNestHost(), getNestMembers(), isNestmateOf از کلاس java.lang.Class در reflection API برای این کار معرفی شده‌ن:یک Nest از کلاسها در جاوا۱۱، هم شامل کلاس بیرونی(اصلی) و هم همه‌ی کلاسهای تودرتو ست. یعنی در اصطلاح، همه‌ی این کلاسها باهم NestMate هستند:assertThat(Outer.class.isNestmateOf(Outer.Inner.class)).isTrue();کلاسهای تودرتو ویژگی NestMembers رو دارند، درحالیکه کلاس بیرونی ویژگی NestHost رو داره:assertThat(Outer.Inner.class.getNestHost()).isEqualTo(Outer.class);&#xA;Set&lt;String&gt; nestedMembers = Arrays.stream(Outer.Inner.class.getNestMembers())&#xA;        .map(Class::getName)&#xA;        .collect(Collectors.toSet());&#xA; assertThat(nestedMembers).contains(Outer.class.getName(), Outer.Inner.class.getName());۸- تغییر در اجرای فایلهای جاواتغییر اساسی بعدی در این نسخه، اینه که دیگه نیازی به compile فایلهای جاوا با javac نداریم یعنی به جای این کد:javac HelloWorld.javajava HelloWorldHello Java 8!می‌تونیم مستقیماً با فرمان java، فایل برنامه رو اجرا کنیم:java HelloWorld.javaHello Java 11!دوم: ماژول‌های حذف و یا Deprecate شدهبعضی از ماژول‌ها یا کلاس‌ها در این نسخه حذف یا منسوخ(deprecate) شده‌ن:۱-ماژول‌های JavaEE and Corba:این ماژول‌ها در جاوا۹ deprecate شدن و حالادر جاوا۱۱ بطور کامل حذف شدن. اگر تصمیم دارید به جاوا۱۱ مهاجرت کنید، باید مطمئن بشید که پروژه‌ی شما از هیچ‌یک از بسته‌ها یا ابزارهای زیر استفاده نکرده باشه:Java API for XML-Based Web Services: &#x9;(java.xml.ws) (JAX-WS)Java Architecture for XML Binding: (java.xml.bind) (JAXB)JavaBeans Activation Framework: (java.activation) (JAF)Common Annotations: (java.xml.ws.annotation)Common Object Request Broker Architecture: (java.corba) (CORBA)JavaTransaction &#x9;API: (java.transaction) (JTA)Aggregator module for the six modules above: (java.se.ee )۲- ماژول‌های JMC and JavaFX:این دو ماژول هم دیگر به صورت پیش‌فرض در JDK وجود ندارند. نسخه‌های جداگانه‌ای از این دو (مجموعه ای ازماژول‌ها) خارج از ‌JKD برای دانلود و استفاده موجود هستن.۳- ماژول های Nashorn و Pack200ماژول Nashorn هم که یک JavaScript Engin بود، در کنار Pak200 که برای ‌فشرده‌سازی فایلهای JAR استفاده می‌شد در جاوا۱۱ deprecate شدن.سوم: افزایش کاراییبرخی امکانات برای افزایش عملکرد JDK معرفی شده‌ن:۱- معرفی Dynamic Class-File Constantsجاوا۱۱ فرمت class-file رو برای پشتیبانی از فرم جدید constant-pool با نام CONSTANT_Dynamic توسعه داده. این فرمت، تولید constantها رو به یک روش bootstrap واگذار کرده که البته بیشتر به کار طراحان زبان و برنامه نویسان کامپایلر میخوره.۲- بهینه‌سازی Aarch64 Intrinsics جاوا۱۱ رشته و آرایه Intrinsics رو در پردازنده‌های ARM64 یا AArch64 بهینه کرده. همچنین Intrinsics جدید برای متدهای ()Math.sin() ، Math.cos و ()Match.log پیاده سازی و بهینه شده.برای ما برنامه نویس‌ها استفاده از توابع Intrinsics مشابه استفاده از باقی متدهاست، اما تابع Intrinsics به روش خاصی توسط کامپایلر کنترل می‌شه و از کد CPU architecture-specific assembly برای افزایش عملکرد استفاده می‌کنه.۳- معرفی No-Op Garbage Collectorیک Garbage Collector جدید به نام Epsilon برای استفاده در جاوا۱۱، (البته به صورت آزمایشی) در دسترسه. بهش No-Op (no operations) می‌گیم چون حافظه رو تخصیص می‌ده اما در واقع هیچ زباله‌ای رو جمع نمی‌کنه. بنابراین، Epsilon برای شبیه سازی خطاهای حافظه قابل استفاده ست. بدیهیه که Epsilon برای یک برنامه جاوای معمولی مناسب نیست. اما مواردخاصی وجود دارن که Epsilon می‌تونه در اونجاها مفید باشه:تست عملکرد تست فشار حافظه تست رابط کاربری و VM jobهای بسیار کوتاه مدتبرای فعال کردنش هم باید flagهای زیر رو فعال کنید:-XX:+UnlockExperimentalVMOptions-XX:+UseEpsilonGC۴- ارائه‌ی Flight Recorderدرواقع JFR یک profiling tool هست که می‌تونیم ازش برای جمع آوری داده های یک برنامه‌ی درحالِ اجرایِ جاوا استفاده کنیم. این ابزار قبلاً یک محصول تجاری بود و برای استفاده ازش باید پول پرداخت می‌کردیم که در نسخه فعلی open source شده.چهارم: باقی تغییراتدر جاوا۱۱ تغییرات دیگه‌ای هم معرفی شده‌ن که لازمه مرور بشن:پیاده‌سازی‌های جدید رمزگذاری ChaCha20 و ChaCha20-Poly1305 که جایگزین روشِ ناامنِ RC4 &#x9;شدن.پشتیبانی از توافق‌نامه‌ی رمزنگاری با Curve25519 و Curve448 که&#x9;جایگزینِ طرح ECDH شده.ارتقاء TLS به نسخه ۱.۳ که باعث بهبود امنیت و عملکرد می‌شه.یک low latency garbage collector  به نام ZGC، به عنوان یک ویژگی آزمایشی با زمانِ مکثِ کوتاه معرفی شدهپشتیبانی &#x9;از Unicode10  که characterها، symbolها و emojiهای بیشتری در اختیار ما قرار می‌ده.در پایان:در این مقاله ، سعی کردم با مطالعه‌ی سایت‌های مختلف، برخی از ویژگی های جدید Java 11 رو بررسی کنم. تفاوت‌های  Oracle JDK و Open JDK را شرح دادم و تغییرات APIها و باقی ویژگی‌های مفید development ، performance enhancement ، و deprecated or deleted module روبررسی کردم که امیدوارم مورد استفاده‌ی کسانی که مثل خودم تصمیم به ارتقاء نسخه‌ی JDK دارن قرار بگیره. خوشحالم می کنین اگر اشتباهات احتمالی و یا کمبودهای مقاله رو بهم اطلاع بدین؛ و ممنون که وقت گذاشتین.منابع:https://jdk.java.net/java-se-ri/11https://openjdk.java.net/projects/jdk/11/https://www.baeldung.com/java-11-new-featureshttps://www.baeldung.com/oracle-jdk-vs-openjdkhttps://www.baeldung.com/java-11-string-apihttps://mkyong.com/java/what-is-new-in-java-11/#jep-336-deprecate-the-pack200-tools-and-apihttps://www.journaldev.com/24601/java-11-features#49-jep-321-http-client</description><category>Hamid BP</category><author>Hamid BP</author><pubDate>Tue, 27 Apr 2021 15:11:21 +0430</pubDate></item><item><title>راهنمای نصب و راه‌اندازی Elastic Stack</title><link>https://virgool.ir/@behzadpour.h/elasticstack-tutorial-tbs6cjut2jby</link><description>تذکر: این راهنما برای سیستم عامل‌های بر پایه‌ی لینوکس نوشته شدهپیش‌نیازها:Ubuntu 20.04sudo accesJava11(openJDK11)معرفی:مجموعه‌ی Elastic Stack (در گذشته ELK Stack) مجموعه‌ای از نرم‌افزارهای متن-بازه(open-source) که توسط Elastic تولید و توسعه داده شده و به شما اجازه می‌ده انواع log fi‍leهای تولید شده با هر قالبی توسط هر منبعی رو جمع‌آوری، جستجو، تحلیل و بررسی و در اَشکالِ مختلفِ قابلِ درک، نمایش بدید. روشی که با عنوان &#34;گزارش‌گیری متمرکز&#34; (centralized logging) شناخته می‌شه.روش centralized logging می‌تونه در زمانِ تشخیصِ یک مشکلِ رخ داده در serverها یا applicationها،  با ایجادِ امکانِ جستجو در بین تمام log fileها در یک نقطه‌ی متمرکز، به ما کمک کنه. همچنین امکان شناسایی مشکلاتی رو که بین چندین server گسترش یافته، از طریق یک جستجوی مرتبط بین logهای تولید شده توسط اون‌ها، در یک بازه‌ی زمانی مشخص، برای ما فراهم می‌کنه.مجموعه‌ی Elastic Stack شامل چهار component زیره:ـ Kibana: یک web interface برای جستجو و نمایش گزارشات.ـ Elasticsearch: یک موتورجستجوی توزیع‌شده‌ی RESTful که تمام داده‌های جمع‌آوری شده رو ذخیره می‌کنه.ـ Logstash: جزء پردازش کننده داده‌ها در Elastic Stack که داده‌های ورودی رو پردازش کرده و به Elasticsearch ارسال می‌کنه.ـ Beats: یک حمل‌کننده‌ی داده‌ی (data shipper) سبُک و تک منظوره که می‌تونه داده‌ها رو از صدها و یا هزاران ماشین مختلف به سوی Logstash یا Elasticsearch ارسال کنه.شرح: Stack سه سطحی Elastic Stack (Beats و Logstash در یک سطح قرار دارند)قدم اول: نصب و پیکربندی Elasticsearchاجزاء(componentهای) Elasticsearch در repositoryهای پیش‌فرض Ubuntu موجود نیستند. بنابراین ابتدا باید از طریق دستور apt منابع اونها رو به بسته های سیستم‌عامل اضافه کنیم. لازم به ذکره که تمام بسته های مربوطه، توسط کلید Elasticsearch در اصطلاح sign شده‌ن تا از سیستم شما در برابر کدها یا نرم افزارهای تقلبی محافظت کنن.در ابتدا نیاز داریم با اجرای دستور زیر کلید عمومیِ Elasticsearch GPG رو در APT وارد کنیم:wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -در مرحله بعد لیست منبع Elastic رو به‌ فهرست sources.list.d اضافه می‌کنیم. جایی که APT برای جستجوی منابع جدید به اون مراجعه می‌کنه:echo &#34;deb https://artifacts.elastic.co/packages/7.x/apt stable main&#34; | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.listو بعد با استفاده از دستورات زیر باید repository رو بروزرسانی کرده و نرم‌افزار رو نصب کنیم:sudo apt-get update&#xA;sudo apt-get install elasticsearchحالا Elasticsearch نصب شده و آماده‌ست برای پیکربندی. از اونجایی که فایل پیکربندی یک فایل متنیه، ما از nano text editor برای ویرایش اون استفاده می‌کنیم:sudo nano /etc/elasticsearch/elasticsearch.ymlنکته مهم: از اونجا که فایل پیکربندی از نوع YAML است، در استفاده از جای‌خالی(space) بسیار دقت کنید!!فایل elasticsearch.yml امکانات متنوعی رو برای پیکربندی در اختیار ما قرار می‌ده. مثل تنظیماتی برای gateway, discovery, network, memory, path, node, cluster و .. . بیشتر این گزینه ها از پیش تنظیم شده‌ن ولی ما می‌تونیم بسته به نیازمون اونها رو تغییر بدیم.سرویس Elasticsearch به صورت خودکار آغاز به کار نمی‌کنه، بنابراین باید اون رو به صورت دستی فعال کنیمsudo systemctl enable --now elasticsearch.serviceسرویس Elasticsearch به ترافیک درگاه 9200 توجه می‌کنه. پس برای بررسی صحت راه‌اندازی سرویس این درخواست HTTP رو اجرا می‌کنیم:curl -X GET &#34;localhost:9200&#34;و انتظار می‌ره که چنین پاسخی دریافت کنین:{  &#34;name&#34; : &#34;Elasticsearch&#34;,  &#34;cluster_name&#34; : &#34;elasticsearch&#34;,  &#34;cluster_uuid&#34; : &#34;qqhFHPigQ9e2lk-a7AvLNQ&#34;,  &#34;version&#34; : {    &#34;number&#34; : &#34;7.7.1&#34;,    &#34;build_flavor&#34; : &#34;default&#34;,    &#34;build_type&#34; : &#34;deb&#34;,    &#34;build_hash&#34; : &#34;ef48eb35cf30adf4db14086e8aabd07ef6fb113f&#34;,    &#34;build_date&#34; : &#34;2020-03-26T06:34:37.794943Z&#34;,    &#34;build_snapshot&#34; : false,    &#34;lucene_version&#34; : &#34;8.5.1&#34;,    &#34;minimum_wire_compatibility_version&#34; : &#34;6.8.0&#34;,    &#34;minimum_index_compatibility_version&#34; : &#34;6.0.0-beta1&#34;  },  &#34;tagline&#34; : &#34;You Know, for Search&#34;}قدم دوم: نصب و پیکربندی داشبورد Kibanaبراساس توصیه‌ی رسمی، باید بلافاصله بعد از Elasticsearch، نرم‌افزار Kibana رو نصب کنیم. از این طریق می‌تونیم اطمینان حاصل کنیم که وابستگی‌های componentها با ترتیب درستی اضافه شده و در جای صحیح قرار میگیرن.چون قبلا repository رو بروز کردیم، با استفاده از دستور زیر Kibana رو نصب می‌کنیم:sudo apt install kibanaدر مرحله بعد باید فایل kibana.yml رو در آدرس etc/kibana/kibana.yml/ ویرایش کرده و تغییرات زیر رو اعمال کنیم:server.port: 5601&#xA;server.host: &#34;localhost&#34;&#xA;elasticsearch.host: [&#34;http://localhost:9200&#34;]و در نهایت برای فعالسازی و راه‌اندازی اون، دستورات زیر رو اجرا می‌کنیم:sudo systemctl enable kibana&#xA;sudo systemctl start kibanaو تمام. برای بررسی اولیه‌ی kibana یک ‌browser باز کرده و آدرس http://localhost:5601 رو مشاهده کنید.قدم سوم: نصب و پیکربندی Logstashبا وجود اینکه برای Beats امکان ارسال داده‌ها به Elasticsearch به صورت مستقیم هم وجود داره،‌ اما بسیار معموله که برای پردازش داده‌ها در بین راه، از ‌Logstash استفاده کنیم. این کار به ما این امکان رو می‌ده که در جمع‌آوری داده‌ها از منابع مختلف، انعطاف بیشتری داشته باشیم و بتونیم داده‌ها رو در یک قالب و شکل مشترک منتقل کرده و در نهایت به راحتی اون‌ها رو برای ذخیره در یک پایگاه‌داده‌ی(database) دیگه استخراج کنیم.برای نصب Logstash از دستور زیر استفاده می‌کنیم:sudo apt install logstashبعد از نصب می‌ریم سراغ پیکربندی. فایل‌های پیکربندی Logstash در مسیر etc/logstash/conf.d/ قرار دارند. برای کسب اطلاعات بیشتر در مورد نحوه پیکربندی، می‌تونید صفحه‌ی مرجع پیکربندی Logstash رو که توسط Elastic ارائه شده، با دقت بیشتری مطالعه کنید.نرم‌افزار Logstash قابلیت‌های بسیار زیادی برای سفارشی‌سازی داره. برای درک بیشتر، بهتره Logstash رو یک دنباله‌ی خطی از ماژول‌های پردازشی(pipeline) در نظر بگیرید که از یک سو داده‌ها رو دریافت می‌کنه،‌ با یک یا چند روش اونها رو پردازش می‌کنه و در نهایت محصول رو به مقصد(در اینجا Elasticsearch) ارسال می‌کنه.یک دنباله‌ی پردازشیِ Logstash، دارای حداقل دو مولفه‌ی اجباری ورودی و خروجی(input,output) و یک یا چند مولفه‌ی اختیاری پالایشه(filter). همونطور که از اسامی مشخصه،‌ ماژول input، داده رو از یک منبع دریافت می‌کنه،‌ ماژول‌های filter داده رو پردازش می‌کنن و در نهایت ماژول output داده رو به مقصد می‌فرسته. یک مثال ساده برای پیکربندی logstash می‌تونه مثل زیر باشد:ابتدا یک فایل در مسیر فایل‌های پیکربندی Logstash با نام دلخواه ایجاد می‌کنیم:sudo nano /etc/logstash/conf.d/from-beats-to-elastic.confمقادیر زیر رو در فایل نوشته و ذخیره می‌کنیم:input {&#xA;    beats {&#xA;        port =&gt; &#34;5044&#34;&#xA;    }&#xA;}&#xA;filter {&#xA;    grok {&#xA;        match =&gt; {&#34;message&#34; =&gt; &#34;% COMBINEDAPACHELOG}&#34;}&#xA;    }&#xA;}&#xA;output {&#xA;    stdout {codec =&gt; rubydebug}&#xA;}برای بررسی صحت فایل پیکربندی، می‌تونیم از دستور زیر استفاده کنیم:sudo -u logstash /usr/share/logstash/bin/logstash --path.settings /etc/logstash -tدر صورتی که مشکلی در فایل‌های پیکربندی نباشه، بعد از لحظاتی پیغام زیر مشاهده می‌شه:Config Validation Result: OK. Exiting Logstashو در نهایت، برای فعالسازی و راه‌اندازی اون از دستورات زیر استفاده می‌کنیم:sudo systemctl start logstash&#xA;sudo systemctl enable logstashقدم چهارم: نصب و پیکربندی Beats (در اینجا Filebeat)مجموعه‌ی Elastic Stack از چندین حاملِ‌داده‌ی (data shipper) متنوع با نام Beats، برای جمع‌آوری داده از منابع مختلف و ارسال اون‌ها به Logstash یا Elasticsearch استفاده می‌کنه. انواع Beats را می‌تونید در زیر مشاهده کنید:    ـ Filebeat: جمع‌آوری و انتقال فایل‌های گزارش (log file)    ـ Metricbeat: جمع‌آوری داده‌های اندازه‌ای(metrics) از سیستم‌ها و سرویس‌های شما    ـ Packetbeat: جمع‌آوری و آنالیز داده‌های شبکه    ـ Winlogbeat: جمع‌آوری داده‌های رویدادهای ویندوزی    ـ Auditbeat: جمع‌آوری داده های چارچوب حسابرسی لینوکس(Linux audit framework) و نظارت بر یکپارچگی فایل‌ها     ـ Heartbeat:نظارت بر سرویس‌ها از نظر دردسترس‌بودن با استفاده از یک نوع جستجو و کاوش فعالدر این راهنما ما از Filebeat برای انتقال فایل‌های log به Elastic Stack استفاده می‌کنیم.برای نصب Filebeat از دستور زیر استفاده می‌کنیم:sudo apt install filebeatدر مرحله بعد برای پیکربندی Filebeat فایل filebeat.yml را ویرایش می‌کنیم:sudo nano /etc/filebeat/filebeat.ymlنرم‌افزار Filebeat از خروجی‌های بیشماری پشتیبانی می‌کنه اما ما معمولاً داده‌ها رو یا مستقیماً به سمت Elasticsearch و یا برای پردازش اضافی به سمت Logstash ارسال می‌کنیم. چون در این راهنما ما از Logstash استفاده کردیم، خروجی‌های مربوط به Elasticsearch را غیرفعال کرده و بعد، بخش خروجی‌های Logstash را فعال می‌کنیم.برای این کار باید خطوط بلااستفاده در فایل پیکربندی Filebeat رو comment کرده و خطوط مورد استفاده رو uncomment کنیم:#output.elasticsearch:&#xA;  #hosts: [&#34;localhost:9200&#34;]&#xA;…&#xA;output.logstash:&#xA;  hosts: [&#34;localhost:5044&#34;]عملکرد Filebeat را می‌تونیم با استفاده از ماژول‌های Filebeat بهبود ببخشیم. در این راهنما ما از ماژول system استفاده می‌کنیم که logهای تولید شده توسط system logging service، مربوط به توزیع‌های رایج لینوکس رو جمع‌آوری و تجزیه می‌کند.برای فعال کردن ماژول‌ system از دستور زیر استفاده می‌کنیم:sudo filebeat modules enable systemو برای بررسی فعال شدن ماژول، دستور زیر رو اجرا می‌کنیم:sudo filebeat modules listاگه همه چیز درست پیش رفته باشه باید خروجی زیر رو مشاهده کنیم:Enabled:systemDisabled:apache2auditdelasticsearchicingaiiskafkakibanalogstashmongodbmysqlnginxosquerypostgresqlredistraefik...در مرحله بعد، باید ورودی‌های Filebeat که داده‌ها رو قبل از ارسال از طریق logstash به Elasticsearch تجزیه(parse) می‌کنن تنظیم کنیم.برای این کار دستور زیر را اجرا می کنیم:sudo filebeat setup --pipelines --modules systemحالا باید الگوی شاخص Elasticsearch رو در Filebeat بارگذاری کنیم:sudo filebeat setup --index-management -E output.logstash.enabled=false -E &#39;output.elasticsearch.hosts=[&#34;localhost:9200&#34;]&#39;شاخص Elasticsearch مجموعه اسنادیه که دارای ویژگی‌های مشابه هستن. این شاخص‌ها با یک نام مشخص می‌شن. در لحظه‌ی ایجادِ یک شاخصِ جدید، الگویِ شاخص به طور خودکار بروزرسانی می‌شه.بعد از اجرای دستور بالا خروجی زیر مشاهده می‌شه:Index setup finished.بسته نرم افزاری Filebeat با نمونه داشبوردهای Kibana همراهه که به ما امکان می‌ده داده‌های Filebeat رو در Kibana نمایش بدیم. برای استفاده از این داشبوردها، باید الگویِ شاخص اون‌ها رو ایجاد کرده و داشبوردها رو در Kibana بارگذاری کنیم.با بارگذاری داشبوردها، Filebeat برای بررسیِ اطلاعاتِ نسخه، به Elasticsearch متصل می‌شه. برای بارگذاری داشبورد هنگام فعال بودنِ Logstash ، باید اول خروجیِ Logstash رو غیرفعال کرده و خروجیِ Elasticsearch رو از طریق دستور زیر فعال کنیم:sudo filebeat setup -E output.logstash.enabled=false -E output.elasticsearch.hosts=[&#39;localhost:9200&#39;] -E setup.kibana.host=localhost:5601پس از اجرای دستور باید چنین خروجی رو مشاهده کنیم:Overwriting ILM policy is disabled. Set `setup.ilm.overwrite:true` for enabling.Index setup finished.Loading dashboards (Kibana must be running and reachable)Loaded dashboardsSetting up ML using setup --machine-learning is going to be removed in 8.0.0. Please use the ML app instead.See more: https://www.elastic.co/guide/en/elastic-stack-overview/current/xpack-ml.htmlLoaded machine learning job configurationsLoaded Ingest pipelinesحالا می‌تونیم Filebeat رو راه اندازی و فعال کنیم:sudo systemctl start filebeat&#xA;sudo systemctl enable filebeatبرای بررسی اینکه Elasticsearch واقعاً این داده‌ها رو دریافت می‌کنه، با استفاده از دستور زیر شاخص Filebeat رو جستجو می‌کنیم:curl -XGET &#39;http://localhost:9200/filebeat-*/_search?pretty&#39;و انتظار داریم چنین خروجی‌ای دریافت کنیم:{ {  &#34;took&#34; : 4,  &#34;timed_out&#34; : false,  &#34;_shards&#34; : {    &#34;total&#34; : 2,    &#34;successful&#34; : 2,    &#34;skipped&#34; : 0,    &#34;failed&#34; : 0  },  &#34;hits&#34; : {    &#34;total&#34; : {      &#34;value&#34; : 4040,      &#34;relation&#34; : &#34;eq&#34;    },    &#34;max_score&#34; : 1.0,    &#34;hits&#34; : [      {        &#34;_index&#34; : &#34;filebeat-7.7.1-2020.06.04&#34;,        &#34;_type&#34; : &#34;_doc&#34;,        &#34;_id&#34; : &#34;FiZLgXIB75I8Lxc9ewIH&#34;,        &#34;_score&#34; : 1.0,        &#34;_source&#34; : {          &#34;cloud&#34; : {            &#34;provider&#34; : &#34;digitalocean&#34;,            &#34;instance&#34; : {              &#34;id&#34; : &#34;194878454&#34;            },            &#34;region&#34; : &#34;nyc1&#34;          },          &#34;@timestamp&#34; : &#34;2020-06-04T21:45:03.995Z&#34;,          &#34;agent&#34; : {            &#34;version&#34; : &#34;7.7.1&#34;,            &#34;type&#34; : &#34;filebeat&#34;,            &#34;ephemeral_id&#34; : &#34;cbcefb9a-8d15-4ce4-bad4-962a80371ec0&#34;,            &#34;hostname&#34; : &#34;june-ubuntu-20-04-elasticstack&#34;,            &#34;id&#34; : &#34;fbd5956f-12ab-4227-9782-f8f1a19b7f32&#34;          },...قدم پنجم: کار با داشبورد Kibanaدر یک browser  آدرس http://localhost:5601 رو مشاهده کنید.در صفحه پیش رو، در منویِ Discover، الگویِ شاخصِ از پیش‌تعریف‌شده‌ی *-filebeat رو انتخاب کنید تا داده‌های ارسالی Filebeat رو مشاهده کنید. به طور پیش‌فرض، در اینجا همه‌ی اطلاعاتِ ثبت شده در 15 دقیقه‌ی گذشته رو می‌تونیم ببینیم. در بخش پایینی هم یک هیستوگرام، مربوط به رویدادهای ورود به سیستم و برخی دیگر از پیام‌های ورود به سیستم رو مشاهده می‌کنیم.در اینجا، می تونیم دربین داده‌های log جستجو و مرور کنیم و همچنین داشبورد خودمون رو سفارشی کنیم. با استفاده از پنل سمت چپ می‌تونیم به صفحه داشبورد بریم و داشبورد Filebeat System را جستجو کنیم. در قدم بعد، می تونیم داشبوردهای نمونه‌ای رو که با ماژول سیستم Filebeat سازگار  هستند انتخاب کنیم.در پایان:در این راهنما، سعی کردم با بیان ساده و تا حدودی فنی، به مختصرترین شکل ممکن، تعریف کنم چطور Elastic Stack رو برای جمع‌آوری و تجزیه و تحلیلِ فایل‌های log مربوط به سیستم، نصب و پیکربندی کنید. یادتون باشه که می‌تونید تقریباً هر نوع اطلاعاتِ ورودی به سیستم، یا داده‌های index شده رو با استفاده از Beats به Logstash ارسال کنید، اما اگر داده‌ها با ماژول‌هایِ پالایشِ Logstash، تجزیه و ساختاربندی بشن مفیدتر می‌شن، چون با این کار، داده‌ها به قالبی سازگار و قابل خوندن توسط Elasticsearch تبدیل می‌شن.این راهنما با استفاده از مطالعه‌ی سایت‌های مختلف که در زیر لیست اون‌ها اومده، به همراهِ بهره‌گیری از تجربه‌ی شخصیِ پیاده‌سازیِ Elastic Stack، نوشته شده و ممکنه کامل نباشه یا دارای ایراداتی در نوع پیاده‌سازی یا تنظیمات باشه. خوشحال می‌شم اگر نظری، انتقادی یا پیشنهادی دارید حتماً با من درمیون بذارید.منابع:https://www.elastic.co/https://www.digitalocean.com/community/tutorials/how-to-install-elasticsearch-logstash-and-kibana-elastic-stack-on-ubuntu-20-04https://linuxconfig.org/install-elk-on-ubuntu-20-04-focal-fossa-linuxhttps://phoenixnap.com/kb/how-to-install-elk-stack-on-ubuntuhttps://www.elastic.co/guide/en/logstash/7.0/config-examples.htmlhttps://www.elastic.co/guide/en/logstash/current/configuration-file-structure.htmlhttps://www.elastic.co/guide/en/beats/filebeat/current/logstash-output.htmlhttps://www.elastic.co/guide/en/logstash/current/plugins-inputs-beats.html</description><category>Hamid BP</category><author>Hamid BP</author><pubDate>Thu, 08 Apr 2021 14:45:45 +0430</pubDate></item></channel></rss>