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

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

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

۱۸
ارديبهشت

در مثال های مستندات JmonkeyEngine در بخش ( Hello Picking) در مورد انتخاب یک geometry با موس چیز هایی گفته شده .....

اما کامل نیست و در یک مورد نیاز واقعی برای من کارایی نداشت، بیشتر اوقات هر مدل از بیشتر از یک geometry تشکیل شده است (مثلا مدل من از چند قسمت دست ،سر ، مو ، لباس ، بدن ، پا ، پوتین و غیره تشکیل شده که هر کدام یک geo در نظر گرفته میشود).و همچنین لازم بود به controller آن دسترسی داشته باشم که فقط والد تمام این ها این کنترلر را داشت نه فرزندان .

پس باید به spatial دسترسی پیدا می کردم  که والد تمام اجزای بدن مدل بود، برای اینکار geo ها را به سمت بالا در سلسله مراتب پدر فرزندی مرور میکنیم تا به یک برابری برسیم .(من برای هر چیز یک داده ی کلید مقدار ثبت میکنم مثلا id و npc را به مدل سربازهایی که توسط کامپیوتر کنترل میشوند نسبت می دهم تا بتوانم در یک حلقه بررسی کنم مورد انتخابی یک مدل از نوع npc است یا نه ؟بعد یک متد از کنترلر را اجرا میکنم تا رفتار مناسب داشته باشد ....)

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

با استفاده از عملگر باقی مانده ی تقسیم (%):

همون طور که در ریاضیات عددی زوج است که باقی مانده ی تقسیم اش بر دو ، صفر باشد. پس به عنوان یک روش با استفاده از % زوج بودن عددی را تعیین میکنیم:

boolean is_even = (n % 2 == 0);

تعیین زوج و فرد با استفاده از عملیات بیتی و عملگر بیتی &:

برای این کار ما به آخرین رقم از مقدار باینری عدد نیاز داریم که با and کردن آن با یک به دست می آید. به این صورت:

number & 1

اگر حاصل یک باشد، عدد فرد است و اگر صفر باشد، عدد زوج است.

برای مثال :

1-پنج فرد است پس: 

0000 0101 & 0000 0001 = 0000 0001

2- و شش زوج است:

0000 0110 & 0000 0001 = 0000 0000

و نمونه کد جاوا :

if( (number&1) == 0){
      system.out.println("even");
   }else{
        system.out.println("odd");
      }

در زیر کاپوت :

همان طور که میدانید عملگر منطقی and (&) دو مقدار دودویی با طول مساوی دریافت کرده و بر روی هر جفت بیت متناظر، عملیات عطف منطقی را انجام می‌دهد. نتیجه وقتی ۱ می‌شود که اولین بیت و دومین بیت هر دو با هم ۱ باشند، در غیر این صورت صفر خواهد بود.

جدول زیر را در نظر بگیرید:

20 21 22 23 24 25 26 27 28 29
1 2 4 8 16 32 64 128 256 512

دو به توان هر عدد صحیح غیر منفی و صفر ، همیشه زوج خواهد بود. (نمی دونم صفر مثبته یا منفی؟)

کمترین ارزش را سمت راست ترین رقم خواهد داشت. و مقدار آن در صورت صحیح بودن یک خواهد بود.

عدد یک در مبنای دو برابر با یک است و به سمت چپ تمامی ارقام صفر خواهند بود و این هیچ تاثیری بر ارزش عدد ندارد. (00000001) .

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

به عبارتی دیگر عطف منطقی با عدد یک، باعث میشود تمام ارقام عدد مورد آزمایش به غیر از آخرین رقم صفر شود و اگر رقم آخر یک باشد نتیجه یک می شود و فرد بودن عدد مورد آزمایش را نتیجه میدهد.

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

تجربه ی زبان پایتون برای من زیاد جالب نبود. تا این که groovy رو کشف کردم. تنها مشکلی که داشت نصاب ناکارامدش بود که متغییر محیطی Groovy_home رو درست ست نمیکنه. سنگین تر بودم اگر فایل زیپ اش رو دانلود میکردم و بعد از آنزیپ متغییر ها رو دستی تنظیم میکردم(نمیدونم کار به این سادگی چه نیازی به installer داره اصلا ؟! ).

چرا groovy  برای من جالبه؟

1-چون نوع متغییر ها رو میتونم مشخص کنم یا با کلمه ی کلیدی def این کار رو به زمان کامپایل بسپارم. در نتیجه کد های کوتاه تری خواهم داشت.

2- چون براکت ها در این زبان وجود دارند و بودن سمی کالن در پایان هر statement اختیاری است. در نتیجه خوانایی رو فدای کوتاهی نکردند ....

3-چون هم به صورت اسکریپت میتونم ازش استفاده کنم و کار های دم دستی و تکراری رو خودکار کنم و هم اینکه قابل کامپایل به بایت کد های جاوا است.

  • younes RayanFar
۰۲
بهمن

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

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

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

فکرش رو کنید باید از خطوط راهنما استفاده میکردم و یک تصویر 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