یاداشت های کوتاه یک برنامه نویس

طبقه بندی موضوعی

۲۱ مطلب با کلمه‌ی کلیدی «java» ثبت شده است

۰۲
بهمن

من عاشق جاوا هستم

چون کار ها رو خیلی راحت کرده مثلا این تصویر رو ببینید:

برای یک کاری لازمش داشتم ، حوصله اش را نداشتم که وقت بگذارم و در ابزاری مثل فتوشاپ یا گیمپ یه همچین چیزی رو با دقت یک پیکسل رسم کنم.

فکرش رو کنید باید از خطوط راهنما استفاده میکردم و یک تصویر 1000 در 50 پیکسلی که در صفحه نمایش من با توجه به رزولوشن ، 370 واحد از خط کش فتوشاپ بود ، به بیست قسمت مساوی تقسیم کنم بعد از 100 تا منهای 100 درجه بندی کنم چقدر وقت میبرد.

میانبر زدم

یک نمونه ی عمودی اش را به گرافیست گروه سپردم تا رسم اش کند اما اون طور که میخواستم نشد. پس میانبر زدم  و کلا سه دقیقه وقت برد از نوشتن کد تا خروجی تصویر. به این دلیله که من عاشق جاوا هستم.

package paint;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;

/**
 *
 * @author yn
 */
public class paint{

    static BufferedImage buffImage = null;
    static Graphics2D g2;

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        init();
        draw_line();

        write();

    }

    public static void init() {
        buffImage = new BufferedImage(1000, 50, BufferedImage.TYPE_INT_ARGB);
        g2 = buffImage.createGraphics();
    }

    public static void draw_line() {
        g2.setStroke(new BasicStroke(2));
        g2.setColor(Color.green);
        g2.drawLine(0, 25, 1000, 25);

        int c = 100;
        for (int i = 0; i <= 1000; i += 50) {
            g2.drawLine(i, 30, i, 20);

            if (i == 0) {
                g2.drawString(c + "", i + 2, 15);
            } else if (i == 1000) {
                g2.drawString(c + "", i - 25, 15);
            } else {
                g2.drawString(c + "", i - 5, 15);
            }

            c -= 10;
        }
    }


    public static void write() {
        try {
            File outputfile = new File("saved.png");
            ImageIO.write(buffImage, "png", outputfile);

        } catch (Exception e) {
            System.out.println(e);
        }
    }

}

  • younes RayanFar
۲۵
دی

وقتی که از nfity-gui به دلایلی دل سرد شدم به lemur فکر میکردم.

اما خب فونتی که برای نیفتی و جی ام ئی درست کار میکرد در lemur خوب نشون نمیداد و پایین تر می افتاد پس لازم بود در مورد کارایی برنامه ای که نوشتم تجدید نظر کنم و دوباره برم سراغ مستندات bitmapFonts ... 

اصلاحش کردم

هیچ راهی وجود نداشت که با قبلی ادامه بدم و در lemur هم دسترسی به خصوصیات متن مثل فاصله از بالا وجود نداشت و موقعیت متن بر طبق لایه تعیین میشد. لازم بود فونت ساز رو اصلاح کنم که در هر سه ابزار به خوبی نمایش داده شود (lemur - nifty- jme gui node) و این کار رو کردم.

لینک نسخه ی اصلاح شده برای lemur 

  • younes RayanFar
۲۳
دی

nfity gui یک ابزار بدرد نخور است.

خستم کرده لامصب ...

اصلا حرف آدمی زاد حالیش نیست هر گوشه اش یک ایراد داره....

مثلا یک نمونه اش کیفیت بسیار بسیار پایین رندر تصاویر برای image Icon ها در hud است.

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

هیچ راهی برای ادامه وجود ندارد ، به همین دلیل لازم  است در hud از گزینه ی دیگری استفاده کنم.

https://github.com/jMonkeyEngine-Contributions/Lemur

  • younes RayanFar
۲۷
تیر

یه زمانی دوست داشتم خزنده ی خودمو بنویسم .....

نمیدونید تجربه کار کردن با پروتکل http برای من چقدر آزار دهنده بود. مخصوصا وقتی طرف سرور با کد 304 یا 301 یا 302 ریداریرکت میکرد! با رفتار های بسیار عجبی که برنامه ی سمت سرور از خودش نشون میداد ، احتمال اینکه توسعه دهنده اش حتی یکبار هم مستندات http رو نخونده باشه بالا میبرد..... از اون بدتر قابلیت auto redirect کتابخانه ی استاندارد net تو جاوا بود که کارش رو درست انجام نمیداد و از نسخه ی فکر کنم 1.6 به بعد متد غیر فعال کردنش هم منسخوخ کرده بودند اما قابل استفاده بود. (کنترل اسپیس نت بینز آی دی عی کمک کرد پیداش کنم).

برای کار کردن با پروتکل http فکر میکنم این خیلی عالی باشه : http://javalite.io/http

من و خودم

عاشق داده کاوی و مشخصا وب کاوی هستم اما وقت ندارم :(

نمیدونم اما یه حسی بهم میگه این ها یعنی (مجازی سازی -داده کاوی - پردازش تصویر - شبکه ی عصبی - یادگیری ماشین- پردازش زبان طبیعی) بهم مربوطه. شاید ایده ای دارم و حتی خودم نمیدونم قراره چی بسازم .......

حداقل ده سال برای خودم کار تراشیدم .....

 

  • younes RayanFar
۲۲
خرداد

وقتی سعی داشتم با ابزار کپی کتاب خونه Apache IO فایلی رو از جایی به جای دیگه کپی کنم متوجه شدم فایل مقصد با فایل منبع مطابقت نداره و کمی کوچکترشده است (در حد چند ده کیلوبایت).

  • اولا باید در نظر داشته باشید که بر طبق امضای این متد باید آرگمان ها از نوع  InputStream  و OutputStream  باشند:
CopyUtils.copy(InputStream input ,OutputStream output);
  • دوما باید به سلسله مراتب کلاس های ارث برده از in/outputStream توجه کنید. در حالی که کلاس FileInputStream کلاس InputStream رو گسترش داده و در ضمن BufferedInputStream کلاس FilterInputStream گسترش میده و کلاس FilterInputStream کلاس InputStream گسترش میده پس :
FileInputStream instanceof InputStream  = true
BufferedInputStream instanceof InputStream  = true

و با توجه به تفاوت هایی که در پیاده سازی متد های read() و write() در کلاس های bufferedInputStream و FileInputStream وجود داره اگر یک نمونه از کلاس bufferedInputStream رو به عنوان آرگومان ورودی به متد Copy بدهیم فایل مقصد از فایل منبع کوچک تر خواهد شد. پس در این حالت بهتره از FileInputStream استفاده کنیم. 

  • younes RayanFar
۲۲
خرداد

سوالات متداول در مورد  nifty gui و JME 3 .

1- چطور اندازه عرض و ارتفاع یک عنصر (Element) را در nifty تغییر دهیم؟

 اول باید به عنصر مورد نظر دسترسی داشته باشیم :

Element image = nifty.getCurrentScreen().findElementById("ImageTagId");

بعد از متد های زیر برای تغییر عرض و ارتفاع عنصر مذکور استفاده می کنیم :

image.setConstraintWidth(new SizeValue("size in % or px"));
image.setConstriantHeight(new SizeValue("size in % or px"));

و در آخر لازمه که عناصر زیر مجموعه ی عنصر والد رو layout کنیم و با اجرای این متد تغییرات قابل مشاهده خواهند بود...

image.getParent().layoutElements(); 

2- چطور تصاویر تگ image رو به صورت داینامیک تغییر دهیم؟

اول باید یک نمونه از NiftyImage داشته باشیم (حواستون باشه این رشته به یک تصویر در assets.jar اشاره میکند نه به آدرس فایل بر روی هارد دیسک مگر اینکه یک داریرکتوری رو به assetManager اضافه کرده باشیم ) پس :

NiftyImage img = nifty.createImage("Interface/Gui/image.jpg", false);

وباید به تگ image دسترسی داشته باشیم:

Element imageEle = nifty.getCurrentScreen().findElementById("ImageTagId");

بعد میتونیم با این روش تصویر مورد نظرمون رو نمایش بدهیم:

imageEle.getRenderer(ImageRenderer.class).setImage(img);

3- چطور متن یک تگ text به صورت داینامیک و پویا تغییر دهیم؟

برای تغییر متن لازمه که اول به تگ text دسترسی داشته باشیم.

Element textEle = nifty.getCurrentScreen().findElementById("txtID");

بعد با روش زیر متن رو تغییر میدهیم:

textEle.getRenderer(TextRenderer.class).setText("hello world!");

4- چطور یک دایرکتوری را در حین اجرا به assets بازی ای که با JME3 توسعه داده شده است اضافه کنیم؟

باید با متد  registerLocator دایرکتوری مورد نظر رو به assetManager اضافه کنیم. (به FileLocator.class توجه کنید)

path="C:\users\someOne\dir\";
app.getAssetManager().registerLocator(path, FileLocator.class);

و هر وقت لازم بود میتونید با اسم فایل و AssetManager به فایل مورد نظر دسترسی داشته باشید

(این لیست بعدا تکمیل میشه ......)

  • younes RayanFar
۰۳
خرداد

بیشتر وقت ها فراموش میکنم الان 2016 است و خیلی وقته نسخه 8 جاوا منتشر شده .

امکانات جدید جاوا 8 واقعا دوست داشتنی و جالبه ، چیزایی مثل لامبدا (Lambda ) خیلی مفید هستند کار هایی رو سریعتر و دلنشین تر میکنند. 

بعضی وقتا ساختمان های داده ی نسخه 1.7 جاوا و مزیت ها شو رو فراموش میکنم وسعی میکنم با کمک آرایه ها با مسعله روبرو بشم.  چرا؟ چون کتاب هایی که قبلا خوندم ملکه ی ذهنم شده (درسته پنج ، شش سال بیشتر نیست که با جاوا آشنا شدم ولی کتاب هایی قدیمی و مال سال های 2005 ,و جاوا 6 سال نشر 2008 که از یک دوست به من به ارث رسیده (سرطان جدیه لطفا سیگار نکشید) هنوزم جایه دیپلمات نشینی توی قفسه ی کتاب هام داره و هر چند وقت یکبار خونده میشه ) و این کتاب های جدید هنوز رعیتم حساب نمیشه ، شاید دوست داشتن کتابی که چند صد صفحه است و خوندنش یکی دو ماه طول میکشه مثل دوست یا همراهیه که مسیر طولانی با هم گذروندیم و جدایی ازش سخته و خاطره اش موندگار تره .......  . باید بیشتر تمرین کنم تا بروز تر کد بزنم. تمیز و سریع و با کامنت گذاری های بجا ، شاید سوادم داره نم میکشه...

بازم جایه شکرش باقیه که سازگاری رو به عقب جاوا با من مشکل نداره وگرنه اول جوونی باید از دور خارج میشدم و میرفتم بین اسقاطیا .... یک جاوا نویسی که دوست نداره جاوا 1.6 رو رها کنه یکی که متولد 97 ولی دوست داره زمان به عقب برگرده به سال های 1980 و 1990 با یک کامپیوتر خفن و یک خط فرمان حرف گوش کن .......

قبلا فکر میکردم هر چیزی تاریخ مصرف داره حتی خاطرات خوب و بد ! اما حالا تو یه محدوده ی زمانی گیر کردم  انگار گذشته ای که قبل از به دنیا اومدنم گذشته برای من لذت بخشه و باید تجربه اش کنم انگار خیلی دیر به دنیا اومدم و ..... .نکنه نیاز به یه روان کاو  دارم چون اصلا عادی نیست حتما باید برسیش کنم.

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

System.out.println(Arrays.toString(variableName));
for (String next : variableName) {
System.out.println(next);
}

درست است که دندان اسب پیشکش را نباید شمرد.... اما لپ تاپ باید به دهن بزی شیرین بیاید.

آقای برادری که همیشه به فکر من هستی لطفا یک لپتاپ ضعیف و قدیمی برای من تهیه کن یک چیزی که لا اقل درایور هایش برای لینوکس موجود باشه ، ایسوس vx با ویندوز ده به چه کار من می آید...... سه و نیم گیگ آپدیت امنیتی و وصله برای برنامه های مختلف اونم تو کمتر از چند ماه بعد از انتشار ویندوز ده آزاردهنده نیست؟

و کیفیت 4k برای یک صفحه نمایش 15 اینچی؟ نمیدونم هدف سازنده ی این مدل چی بوده چی بوده میخواستند از فضای تبلیغاتی موجود سوء استفاده کنند و پول بیشتری در بیارند؟  این کیفیت حداقل مانیتوری 17 تا 22 اینچی نیاز داره! اینقدر که منو ها تو برنامه های غیر محلی مثل بلندر و نت بینز ریز شده باید یا ابزار maginifier فعال کنم و مثل پدر بزرگ ها از ذره بین استفاده کنیم و یا دقت تصویر را روی دو برابر Hd تنظیم کنیم.

باطری ای که ادعا کرده اند 6 ساعت دروغ محض است یک ساعت و پنجاه دقیقه بیشتر دوام نمی آورد ........

اصلا من کامپیوتر رومیزی دوست داشتنی خودم را میخواهم......

  • younes RayanFar
۰۱
خرداد

برای سیستم پلاگین نیاز پیدا کردم تا محتویات یک پوشه رو مرور کنم یعنی فایل هاشو لیست کنم بعد باید تشخیص میدادم کدام یک فایل جار هستند. راحت ترین گزینه اینه که نام های دریافتی از آرایه listFiles دایرکتوری والد رو به دو قسمت نام و پسوند تقسیم کنم.

خب مشکل اینه که متد تقسیم رشته درست کار نمیکنه مثلا کد زیر :

        File pluginSDir = new File(pathToPluginDir);
        File[] list = pluginsDir.listFiles();

        for (int i = 0; i < list.length; i++) {

            if (list[i].isFile() && !list[i].isHidden()) {
                String name = list[i].getName();
                String extension = name.split(".")[1];

                System.out.println(" file in plug dir => [" + list[i].getName() + "] ( " + extension + " )");
            }

        }

چرا ؟!

چون تازه گی ها یه قانونی کشف کردم که میگه چیز های بسیار پیش پا افتاده بعضی وقتا میتونند بسیار مهلک باشند. 

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

به عنوان یک پیش نهاد برای اینکه از این جور مشکلات پیش نیاد بهتره مستندات کیت توسعه جاوا رو به آی دی عی اضافه کنیم . تا بدونیم پارامتر های ورودی و نوع خروجی یک متد چه چیزی باید باشه.

  • younes RayanFar
۲۲
ارديبهشت

اگر در حین کار با nifty و اضافه کردن یک کلاس به عنوان اسکرین  کنترولر با خطای زیر مواجه شدید :

Missing ScreenController for screen [start] using DefaultScreenController() instead but this might not be what you want.

این موارد رو چک کنید:

۱. باید کلاسی که به عنوان کنترولر به تگ screen و در مشخصه controller مشخص کردیم حتما اینترفیس  ScreenController رو پیاده سازی کرده باشد.

۲.کلاس کنترلر حتما بایدیک constructor خالی داشته باشد. بهتره اگر قرار است از این کلاس به صورت دینامیک برای مدیریت رویداد های یک screen دیگر استفاده شود constructor را اورلود کنیم.

۳. باید مشخصه controller در تگ screen و در فایل XMl به صورت حروف کوچک باشد در غیر این صورت کار نخواهد کرد.

  • younes RayanFar
۲۷
فروردين

در پست و در ادامه پست قبلی  لیست ابزار های توسعه ی جاوا که همراه JDK  نصب می شوند رو تکمیل میکنم.

  • younes RayanFar