انتقال پروژه ی محلی به گیت هاب

انتقال پروژه ی محلی به گیت هاب.

انتقال پروژه ی محلی به گیت هاب

آماده سازی پروژه محلی برای رهگیری تغییرات:

برای انتقال پروژه ی محلی به گیت هاب ،بعد از این که پروژه ای رو شروع کردیم به هر زبانی و با هر IDE و یا ویرایشگر متنی فرقی نمیکند (IDE هایی مثل نت بینز و یا اکلیپس پلاگین هایی برای کار با گیت دارند اما فرض میکنیم هیچ ابزاری غیر از خط فرمان و گیت در اختیار نداریم). به پوشه پروژه میریم و با دستور git init مخزن آماده میشود. و برای اولین قدم لازم است یکبار  git add . را اجرا کنیم. از این به بعد هر چیزی که تغییر کند قابل رهگیری است. (چون فایل هایی از قبل در پوشه بوده اند و تا زمانی که add نشوند رهگیری ای در کار نخواهد بود.)

آماده سازی مخزن با میزبانی گیت هاب برای آپلود پروژه محلی:

باید یک حساب گیت هاب داشته باشیم. بعد به عنوان یک گزینه کم دردسر در سیستم محلی یک کلید ssh ایجاد میکنیم و آن را در حساب کاربریمان در گیت هاب ثبت میکنیم تا عملیات اهراز هویت در push ها و pull ها و غیره به راحتی انجام شود. سپس یک مخزن جدید بروی گیت هاب ایجاد میکنیم و آدرس آنرا با گزینه ی SSH کپی و با دستور زیر به مخزن محلی اضافه می کنیم.

 

$ git remote add origin git@github:username/someProject.git

و در آخر تغییرات را کامیت و سپس push کنیم.

 

$ git push origin master

مطالب مرتبط با گیت در این آدرس دسته بندی شده اند.

لینک های مرتبط:

اتصال به گیت هاب با SSH (+).

توضیح دستور add  در مستندات گیت (+).

توضیح دستور init در مستندات گیت (+).

حذف فایل ها از یک مخزن در github

حذف فایل ها از یک مخزن در github

حذف فایل ها از یک مخزن در github

 

اگر بخواهیم فایلی رو مثلا “file1.txt” از یک مخزن در github حذف کنیم:

از دستور git rm به این صورت استفاده میکنیم.

git rm file1.txt
git commit -m "remove file1.txt"

و برای حذف یک دایرکتوری و فایل های داخلش :

 

git rm -r directory

و اگر بخواهیم فقط از مخزن حذف بشه و نه کلا از filesystem :

 

git rm --cached file1.txt

و در آخر تغییرات رو به مخزن ریموت push میکنیم.

 

git push origin master 

توضیحات دستور گیت در مستندات git:

Remove files from the index, or from the working tree and the index. git rm will not remove a file from just your working directory. (There is no option to remove a file only from the working tree and yet keep it in the index; use /bin/rm if you want to do that.) The files being removed have to be identical to the tip of the branch, and no updates to their contents can be staged in the index, though that default behavior can be overridden with the -f option. When --cached is given, the staged content has to match either the tip of the branch or the file on disk, allowing the file to be removed from just the index.

 

مطالب مرتبط با گیت در این آدرس دسته بندی شده اند.

 

 

 

 

تولید عدد صحیح تصادفی در یک بازه در جاوا

تولید عدد صحیح تصادفی در یک بازه در جاوا :

برای ایجاد عدد رندم در جاوا از این سه کلاس استفاده میشود.

  1. java.util.Random.nextInt
  2. Math.random
  3. java.util.Random.ints (جاوا ۸)

۱- کلاس Random و متد nextInt یک عدد از ۰ و شامل صفر تا محدوده ای که تعیین کرده ایم برمیگرداند(یعنی شامل خود عدد محدوده نمی شود). برای اینکه عددی در بازه دلخواه داشته باشیم و اعداد min و max را هم شامل شود باید به این صورت:


private static int getRandomNumberInRange(int min, int max) {

	if (min >= max) {
		throw new IllegalArgumentException("max must be greater than min");
	}

	Random r = new Random();
	return r.nextInt((max - min) + 1) + min;
}

برای درک عبارت ( (مکس – مین)+۱ ) + مین  توجه داشته باشید:


//Random().nextInt(int bound) = Random integer from 0 (inclusive) to bound (exclusive)

//۱٫ nextInt(range) = nextInt(max - min)
new Random().nextInt(5);  // [0...4] [min = 0, max = 4]
new Random().nextInt(6);  // [0...5]
new Random().nextInt(7);  // [0...6]
new Random().nextInt(8);  // [0...7]
new Random().nextInt(9);  // [0...8]
new Random().nextInt(10); // [0...9]
new Random().nextInt(11); // [0...10]

//۲٫ To include the last value (max value) = (range + 1)
new Random().nextInt(5 + 1)  // [0...5] [min = 0, max = 5]
new Random().nextInt(6 + 1)  // [0...6]
new Random().nextInt(7 + 1)  // [0...7]
new Random().nextInt(8 + 1)  // [0...8]
new Random().nextInt(9 + 1)  // [0...9]
new Random().nextInt(10 + 1) // [0...10]
new Random().nextInt(11 + 1) // [0...11]

//۳٫ To define a start value (min value) in a range,
//   For example, the range should start from 10 = (range + 1) + min
new Random().nextInt(5 + 1)  + 10 // [0...5]  + 10 = [10...15]
new Random().nextInt(6 + 1)  + 10 // [0...6]  + 10 = [10...16]
new Random().nextInt(7 + 1)  + 10 // [0...7]  + 10 = [10...17]
new Random().nextInt(8 + 1)  + 10 // [0...8]  + 10 = [10...18]
new Random().nextInt(9 + 1)  + 10 // [0...9]  + 10 = [10...19]
new Random().nextInt(10 + 1) + 10 // [0...10] + 10 = [10...20]
new Random().nextInt(11 + 1) + 10 // [0...11] + 10 = [10...21]

// Range = (max - min)
// So, the final formula is ((max - min) + 1) + min

//۴٫ Test [10...30]
// min = 10 , max = 30, range = (max - min)
new Random().nextInt((max - min) + 1) + min
new Random().nextInt((30 - 10) + 1) + 10
new Random().nextInt((20) + 1) + 10
new Random().nextInt(21) + 10    //[0...20] + 10 = [10...30]

//۵٫ Test [15...99]
// min = 15 , max = 99, range = (max - min)
new Random().nextInt((max - min) + 1) + min
new Random().nextInt((99 - 15) + 1) + 15
new Random().nextInt((84) + 1) + 15
new Random().nextInt(85) + 15    //[0...84] + 15 = [15...99]

//Done, understand?

۲-و متد random از کلاس Math یک عدد بین ۰ تا ۱ و از نوع double بر میگرداند:


static double	random()
Returns a double value with a positive sign, greater than or equal to 0.0 and less than 1.0.

 

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


	private static int getRandomNumberInRange(int min, int max) {

		if (min >= max) {
			throw new IllegalArgumentException("max must be greater than min");
		}

		return (int)(Math.random() * ((max - min) + 1)) + min;
	}

۳- در جاوا ۸ متد های جدید به java.util.Random اضافه شده اند. برای این کار از متد ints استفاده میکنیم که یک عدد بین بازه ی min و شامل min و تا max تعیین میشود و چون خود max را شامل نمیشود برای اینکه عددی در بازه دلخواه داشته باشیم و خود اعداد min و max را هم شامل شود باید به این صورت max را بعلاوه یک کنیم:


import java.util.Random;

public class TestRandom {

	public static void main(String[] args) {

		for (int i = 0; i < 10; i++) {
			System.out.println(getRandomNumberInRange(33, 38));
		}

	}

	private static int getRandomNumberInRange(int min, int max) {

		Random r = new Random();
		return r.ints(min, (max + 1)).limit(1).findFirst().getAsInt();

	}

}

 

تولید عدد صحیح تصادفی در یک بازه در جاوا
تولید عدد صحیح تصادفی در یک بازه در جاوا

 

آسیب پذیری تزریق کد

تزریق کد معمولا زمانی اتفاق می افتد که ورودی های نامطمعن و بدون اعتبار سنجی مستقیما در برنامه اجرا شود. یکی از منابع بالقوه ی آسیب پذیریِ تزریق کد استفاده از جاوا اسکریپت در کد جاوا است. بسته javax.script شامل اینترفیس ها و کلاس هایی است که موتورهای اسکریپت جاوا را تعریف می کنند و چارچوبی برای استفاده از آن در کد جاوا است.

مهاجم با سوء استفاده از api این پکیج قادر به اجرای کد های مخرب در سیستم هدف است. این تقریبا مثل SQL injection است.

مثال :

این متد یک رشته به عنوان نام کاربر دریافت و نتیجه را در خروجی چاپ میکند:


private static void evalScript(String firstName) throws ScriptException {
  ScriptEngineManager manager = new ScriptEngineManager();
  ScriptEngine engine = manager.getEngineByName("javascript");
  engine.eval("print('"+ firstName + "')");
}

یک مهاجم می تواند یک نمونه ی مخرب از کد را به عنوان آرگومان به این متد تزریق کند، و مثلا اگر این کد جاوا اسکریپت را به متد evalScript بدهیم ابتدا “dummy” چاپ میشود و بعد در فایل تنظیمات فرضی عبارت “some text” رو نوشته خواهد شد…


dummy\');
var bw = new JavaImporter(java.io.BufferedWriter);
var fw = new JavaImporter(java.io.FileWriter);
with(fw) with(bw) {
   bwr = new BufferedWriter(new FileWriter(\"config.cfg\"));
   bwr.write(\"some text\"); bwr.close();
}
// ;

روش های مقابله:

۱- لیست سفید (Whitelisting):

بهترین روش برای مقابله با این آسیب پذیری استفاده از لیست سفید کاراکتر های مجاز است. کافیه قبل از اجرا بررسی بشه که  کاراکتر غیر مجازی در رشته وجود نداشته باشد:


private static void evalScript(String firstName) throws ScriptException {
  // Allow only alphanumeric and underscore chars in firstName
  // (modify if firstName may also include special characters)
  if (!firstName.matches("[\\w]*")) {
    // String does not match whitelisted characters
    throw new IllegalArgumentException();
  }
 
  ScriptEngineManager manager = new ScriptEngineManager();
  ScriptEngine engine = manager.getEngineByName("javascript");
  engine.eval("print('"+ firstName + "')");
}

۲- جعبه شنی امن (Secure Sandbox):

یک روش جایگزین استفاده از مدیر امنیت (security manager ) برای ایجاد یک جعبه شنی امن است. برنامه باید از اجرای دستورات دلخواه توسط اسکریپت مانند پرس و جو از سیستم فایل محلی جلوگیری کند.


class ACC {
  private static class RestrictedAccessControlContext {
    private static final AccessControlContext INSTANCE;
   
    static {
      INSTANCE = new AccessControlContext(
                   new ProtectionDomain[] {
                     new ProtectionDomain(null, null) // No permissions
                   });
    }
  }
   
  private static void evalScript(final String firstName)
      throws ScriptException {
    ScriptEngineManager manager = new ScriptEngineManager();
    final ScriptEngine engine = manager.getEngineByName("javascript");
    // Restrict permission using the two-argument form of doPrivileged()
    try {
      AccessController.doPrivileged(
        new PrivilegedExceptionAction<0bject>() {
                         
          public Object run() throws ScriptException {
            engine.eval("print('" + firstName + "')");
            return null;
          }
        },
        // From nested class
        RestrictedAccessControlContext.INSTANCE);
                                                                     
    } catch (PrivilegedActionException pae) {
      // Handle error
    }
  }
}

این رویکرد می تواند با لیست سفید برای امنیت بیشتر ترکیب شود.

 

تبدیل رشته به عدد (Convert String to int) در جاوا

تبدیل رشته به عدد (Convert String to int) در جاوا:

در جاوا از Integer.parseInt() برای تبدیل رشته به عدد استفاده میکنیم.

۱٫ Integer.parseInt()

String number = "10";
int result = Integer.parseInt(number);
System.out.println(result);

و یا به جای آن از Integer.valueOf() برای بدست آوردن آبجکت Integer استفاده میکنیم.

۲٫ Integer.valueOf()

 String number = "10";
Integer result = Integer.valueOf(number);
System.out.println(result);

تنها نکته اش اینه که parseInt یک نوع اصلی (int) بر میگرداند و valueOf یک نمونه ی جدید از نوع Integer. و اگر رشته ای که میخواهیم به عدد تبدیل شود یک رشته ی عددی صحیح نباشد کلاس Integer استثنای NumberFormatException خواهد انداخت.

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

تبدیل رشته به عدد (Convert String to int) در جاوا

به دست آوردن مسیر اجرای فایل jar

به دست آوردن مسیر اجرای فایل jar
به دست آوردن مسیر اجرای فایل jar:بعضی وقت ها نیاز داریم به پوشه ای که فایل جار در اون اجرا شده دسترسی داشته باشیم.مثلا شاید لازمه فایل هایی از دیسک خونده یا نوشته بشه و باید این فایل ها در کنار فایل جار باشند و در این صورت نیاز داریم که مسیر دقیق فایل jar در زمان اجرا رو داشته باشیم.

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

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

Blender has stopped working (حل شده)

خرابی بلندر در ویندوز ده Blender has stopped working:

از بلندر ۲٫۷۸ استفاده میکنم ، و چند ماه بدون مشکل کار میکرد. امروز موقع اجرا و قبل از اینکه برنامه شروع بشه متوقف شد و پیام Blender has stopped working رو نشون داد.

خب برای حل این مشکل مثل همیشه اولین کار و سریع ترین راه گوگل کردن بود و نتیجه این بود که در نسخه های قبل هم کاربران بعضی وقت ها این مشکل رو داشتند و در غیر منتظره ترین حالت یکی فقط با نصب QuickTime Player مکشلش حل شده بود! و پیشنهاد های همیشگی و کلیشه ای مثل آپدیت ویندوز و آپدیت درایور گرافیک سیستم و چیز هایی شبیه این که خب من همه اش رو تست کردم و حتی بلندر رو آنیستال کردم و دوباره نصب کردم شاید مشکل حل بشه و نشد و دوباره نسخه ی جدیدی رو نصب کردم یعنی آخرین نسخه رو دانلود کردم با یه اینترنت خیلی خیلی کند و آزار دهنده ۲۷ دقیقه معطل شدم و در عین حال نتیجه مثبتی وجود نداشت….

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

در یک جایی یک دوستی در مورد متغییر محیطی مسیر (PYTHONPATH) چیز هایی نوشته بودند و باعث شد سرنخ هایی به دست بیرام:

If the problem is related to having a PYTHONPATH environment variable set, you can do the following so you don’t have to modify your PYTHONPATH variable. I am running 2.75a and this fixed my problem.

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

-GitStack will not work if a python environment is already installed on your machine.

و دقیقا مشکل از همین جا بود ولی درک نمیکنم چرا اون درست کار میکرد ولی بلندر با مشکل برخورد؟ بهتر بود هشدار رو به این صورت تغییر میدادند :”نصب این برنامه تغییراتی در متغییر  محیطی پایتون به وجود می آورد و ممکن است اجرای بعضی از برنامه ها به این دلیل به مشکل بخورند”.

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

خرابی بلندر در ویندوز ده Blender has stopped working

باگ ها و روش حل.

 

اسکرول ناخواسته موس در ویندوز ده (حل شده)

مسئله (اسکرول ناخواسته):

بعد از آپدیت ویندوز ده در ۲۲/۰۸/۲۰۱۷ بدون اینکه چیزی رو تغییر بدم موس الکی برای خودش و به صورت اسکرول ناخواسته در دو جهت افقی و عمودی اسکرول میکرد.

جاهایی مثل کنترل پنل و کم و زیاد کردن حجم صدا و منوی استارت و همچنین در محیط های توسعه ی مجتمع برنامه مثل IDEA و غیره به محض دریافت فکوس اسکرول خودکار اتفاق می افتاد.

اسکرول ناخواسته در ویندوز ده (حل شده)

با فرض اینکه از یک pc  و یک موس بیسیم gigabyte و windows ten استفاده میکردم و جستجو در وب نتیجه ای نداشت و دیگران از راه های مختلفی به نتیجه رسیده بودند که تقریبا همه یشان را تست کردم. مثلا پاسخ Irfan H در سال ۲۰۱۰ که مربوط به مشکلات موس و اسکرول بود بررسی اش کردم در عین حال که با مورد من ارتباط مستقیم نداشت.

راه حل:

درایور mouse رو از طریق device manager یکبار پاک و نصب کردم و ویندوز رو آپدیت کردم .از یک موس دیگه که با سیم و به پورت یو اس بی وصل میشد، برای امتحان استفاده کردم و مشکلی نداشت و بعد از وصل دوباره موس بی سیم قبلی مشکل برطرف شده بود.

 

 

restart برنامه نوشته شده با جاوا

restart برنامه نوشته شده با جاوا : بعضی وقت ها نیاز هست برنامه restart بشه مثلا وقتی که آپدیتی را از اینترنت دریافت میکنه و یا وقتی که یک پلاگین جدید نصب میکنید(البته اگر از OSGI استفاده کنید نیازی به restart نیست) به هر حال هیچ راه ساده ای نیست مگر از دستورات خط فرمان استفاده کنید که در جاوا امکانات خوبی برای این کار وجود داره.

روش کار ساده است باید :

  • باید به برنامه java در jre دسترسی داشته باشید (منظور بودن مسیر جاوا در متغییر محیطی path است) تا بتونید برنامه ای در خط فرمان رو اجرا کنید.
  • باید مسیر jar برنامه رو بدست بیاریم. (در این پست در موردش توضیح داده ام).
  • به عنوان یک دستور خط فرمان و از طریق ProcessBuilder اجرا کنیم:  java -jar app.jar
  • جدا کننده مسیر در ویندوز ” \ ” و در گنو/لینوکس و یونیکس ” /”  است مطمئن ترین روش برای حفظ استقلال از سکو برنامه استفاده از File.separator می باشد.

یه متد که در سایت stackoverflow.com پیدا کردم به درستی این کار انجام میده:


public void restartApplication()
{
  final String javaBin = System.getProperty("java.home") + File.separator + "bin" + File.separator + "java";
  final File currentJar = new File(MyClassInTheJar.class.getProtectionDomain().getCodeSource().getLocation().toURI());

  /* is it a jar file? */
  if(!currentJar.getName().endsWith(".jar"))
    return;

  /* Build command: java -jar application.jar */
  final ArrayList command = new ArrayList();
  command.add(javaBin);
  command.add("-jar");
  command.add(currentJar.getPath());

  final ProcessBuilder builder = new ProcessBuilder(command);
  builder.start();
  System.exit(0);
}
restart برنامه نوشته شده با جاوا
restart برنامه نوشته شده با جاوا

خواندن و نوشتن داده هایی که با utf-8 کد گذاری شده اند

خواندن و نوشتن داده هایی که با utf-8 کد گذاری شده اند.

خواندن و نوشتن داده هایی که با utf-8 کد گذاری شده اند

شاید برای شما هم پیش آمده باشد که بخواهید برنامه متن فارسی در فایلی بنویسد و  ?????? تحویل بگیرید. و یا حتی موقع خواندن متن فارسی از یک فایل با همان علامت های سوال مواجه بشید. این به دلیل نوشته نشدن فایل با شیوه کد گذاری مناسبه و در مورد دوم بهتره  coding خروجی کنسول تون رو UTF-8 تنظیم کنید و دوباره امتحان کنید اگر باز هم مشکل داشت کدتون رو تغییر بدهید. به احتمال زیاد در گنو/لینوکس با این مشکل مواجه نخواهید شد چون پیش فرض utf8 , JDK است حداقل برای من که این طور بود.

خواندن از فایل:


package com.test.file;
 
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
 
public class test {
	public static void main(String[] args){
 
	try {
		File fileDir = new File("/home/username/test.txt");
 
		BufferedReader in = new BufferedReader(
		   new InputStreamReader(
                      new FileInputStream(fileDir), "UTF8"));
 
		String str;
 
		while ((str = in.readLine()) != null) {
		    System.out.println(str);
		}
 
                in.close();
	    } 
	    catch (UnsupportedEncodingException e) 
	    {
			System.out.println(e.getMessage());
	    } 
	    catch (IOException e) 
	    {
			System.out.println(e.getMessage());
	    }
	    catch (Exception e)
	    {
			System.out.println(e.getMessage());
	    }
	}
}

و نوشتن در فایل:


package com.test.file;
 
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
 
public class test {
	public static void main(String[] args){
 
	  try {
		File fileDir = new File("/home/username/test.txt");
 
		Writer out = new BufferedWriter(new OutputStreamWriter(
			new FileOutputStream(fileDir), "UTF8"));
 
		out.append("eng text UTF-8").append("\r\n");
		out.append("متن نمونه فارسی UTF-8").append("\r\n");
 
		out.flush();
		out.close();
 
	    } 
	   catch (UnsupportedEncodingException e) 
	   {
		System.out.println(e.getMessage());
	   } 
	   catch (IOException e) 
	   {
		System.out.println(e.getMessage());
	    }
	   catch (Exception e)
	   {
		System.out.println(e.getMessage());
	   } 
	}	
}

مطالب مرتبط:

توضیحات مربوط به UTF-8 در ویکی پدیا  (+).

Encode String to UTF-8 (+).

مطالب غیر مرتبط به این پست:

تبدیل رشته به عدد در جاوا (+).