Совместная работа git и mingw

Возникла задача, как сделать так, чтобы git и mingw работали совместно, и при этом использовался ssh из mingw. Решение пришло довольно быстро.
Если вы установили git, то удалите его из переменной PATH, чтобы mingw не брал все зависимости git для командной строчки.
После этого прописываем git в mingw. Для этого добавляем в конце файла MinGW\msys\1.0\etc\profile  следующую строку:
export PATH=$PATH:/c/Program\ Files\ \(x86\)/Git/bin
Собственно, вот и всё. Дальше запускаем mingw и наслаждаемся работой git.

Как полностью удалить Java 6 и установить Java/JDK 7 на debian (mint)

Столкнулся с проблемой, что обычное apt-get remove openjdk-6-jdk не помогает при попытке удаления ее из коробочной debian. С помощью поиска и опыта обнаружил, что необходимо выполнить следующие команды:
apt-get install openjdk-7-jdk
apt-get remove openjdk-6-jre
apt-get remove openjdk-6-jre-lib
Можно попробовать другой метод:
apt-get autoremove openjdk-6-jre
При этом не забываем, что ваш пользователь должен быть судоером.

Удаление лишних файлов при работе с pdflatex и bibtex в Windows с помощью bat

При работе с pdflatex и bibtex создаются файлы с расширениями *.aux *.log *.blg *.bbl, которые вы после компиляции не будете нигде использовать. Для их удаления можно использовать команду del в командной строке Windows. Я для компиляции статьи с названием paper.tex, который содержит также библиографию в своем составе, использую файл bat со следующим содержанием:
pdflatex paper
bibtex paper
pdflatex paper
pdflatex paper
del *.aux *.log *.blg *.bbl 
Если вы не используете библиографию, то вам не нужно использовать первые две строки этого файла.

Установка TeX Live на Windows

Для установки TeX Live заходим сюда и выбираем пункт download, что перебрасывает нас на страницу загрузки. На ней мы должны выбрать загрузчик для Windows install-tl.exe. Если вы используете *nix, то выбирайте install-tl-unx.tar.gz. Кроме того, для загрузки можно использовать торрент, с помощью которого можно загрузить ISO образ диска.

Далее для Windows запускаем install-tl.exe. Появляется некоторое меню, в котором не сложно разобраться. Я выбрал пункт "Custom", чтобы знать что и куда я устанавливаю. В результате мы приходим к окну показанному на рисунке 1. Если вы хотите что-либо изменить в настройках, то меняйте (новичкам это делать не рекомендуется).


Рисунок 1. Окно установки TeX Live.

После нажатия на кнопку "Установить TeX Live" начнется довольно длительный процесс скачивания пакетов (около 4 ГБ, рисунок 2), поэтому, если у вас медленный интернет, то нужно будет запастись терпением. У меня на это ушло около 40 минут.


Рисунок 2. Процесс установки TeX Live.

После установки вы всегда можете обновить пакеты в TeX Live с помощью менеджера пакетов. Для этого вам нужно будет в командной строке набрать:

tlmgr update --all

String, StringBuffer и StringBuilder: сравнение

Многие думают, что конкатенация строк происходит быстрее всего в классе String с использованием сложения (т.е. операторов + или +=). Сравним быстродействие классов String, StringBuffer и StringBuilder в Java.
public class One {
    public static void main(String[] args) {
        String string = new String("My string test");
        string += " for String class";
    }
}
public class Two {
    public static void main(String[] args) {
        StringBuffer string = new StringBuffer("My string test");
        string.append(" for String class");
    }
}
public class StrBuild {
    public static void main(String[] args) {
        StringBuilder string = new StringBuilder("My string test");
        string.append(" for String class");
    }
}

1 Сравнение байт-кода


Сравниваем байт-код с помощью
javap -c NameOfClass.class
В результате получаем следующий вывод на экран:
Compiled from "One.java"
public class Strings.One {
  public Strings.One();
    Code:
       0: aload_0       
       1: invokespecial #8                  // Method java/lang/Object."":()V
       4: return        

  public static void main(java.lang.String[]);
    Code:
       0: new           #16                 // class java/lang/String
       3: dup           
       4: ldc           #18                 // String My string test
       6: invokespecial #20                 // Method java/lang/String."":(Ljava/lang/String;)V
       9: astore_1      
      10: new           #23                 // class java/lang/StringBuilder
      13: dup           
      14: aload_1       
      15: invokestatic  #25                 // Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
      18: invokespecial #29                 // Method java/lang/StringBuilder."":(Ljava/lang/String;)V
      21: ldc           #30                 // String  for String class
      23: invokevirtual #32                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      26: invokevirtual #36                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      29: astore_1      
      30: return        
}
Compiled from "Two.java"
public class Strings.Two {
  public Strings.Two();
    Code:
       0: aload_0       
       1: invokespecial #8                  // Method java/lang/Object."":()V
       4: return        

  public static void main(java.lang.String[]);
    Code:
       0: new           #16                 // class java/lang/StringBuffer
       3: dup           
       4: ldc           #18                 // String My string test
       6: invokespecial #20                 // Method java/lang/StringBuffer."":(Ljava/lang/String;)V
       9: astore_1      
      10: aload_1       
      11: ldc           #23                 // String  for String class
      13: invokevirtual #25                 // Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;
      16: pop           
      17: return        
}
Compiled from "StrBuild.java"
public class Strings.StrBuild {
  public Strings.StrBuild();
    Code:
       0: aload_0       
       1: invokespecial #8                  // Method java/lang/Object."":()V
       4: return        

  public static void main(java.lang.String[]);
    Code:
       0: new           #16                 // class java/lang/StringBuilder
       3: dup           
       4: ldc           #18                 // String My string test
       6: invokespecial #20                 // Method java/lang/StringBuilder."":(Ljava/lang/String;)V
       9: astore_1      
      10: aload_1       
      11: ldc           #23                 // String  for String class
      13: invokevirtual #25                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      16: pop           
      17: return        
}
Здесь видно, что байт-код StringBuffer и StringBuilder оказался почти в два раза короче, чем для String.

2 Время выполнения


Для оценки быстродействия двух классов был использован следующий алгоритм:
public class Three {
    public static String concatWithString() {
        String t = "Cat";
        for (int i = 0; i < 100000; i++) {
            t += "Dog";
        }
        return t;
    }

    public static String concatWithStringBuffer() {
        StringBuffer sb = new StringBuffer("Cat");
        for (int i = 0; i < 100000; i++) {
            sb.append("Dog");
        }
        return sb.toString();
    }

    public static String concatWithStringBuilder() {
        StringBuilder sb = new StringBuilder("Cat");
        for (int i = 0; i < 100000; i++) {
            sb.append("Dog");
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        concatWithString();
        System.out.println("Concat with String took: " + (System.currentTimeMillis() - start) + "ms");
        start = System.currentTimeMillis();
        concatWithStringBuffer();
        System.out.println("Concat with StringBuffer took: " + (System.currentTimeMillis() - start) + "ms");
        start = System.currentTimeMillis();
        concatWithStringBuilder();
        System.out.println("Concat with StringBuilder took: " + (System.currentTimeMillis() - start) + "ms");
    }
}
В результате я получил следующие значения:
Concat with String took: 12478ms
Concat with StringBuffer took: 6ms
Concat with StringBuilder took: 4ms
Используя полученные результаты и документацию можно сделать следующие выводы
1) String является неизменяемым объектом (immutable), в то время как StringBuffer и StringBuilder являются изменяемыми объектами (mutable).
2) Используйте String вам требуется неизменяемый объект, Stringbuffer - если требуется изменяемый и потокобезопасность, StringBuilder изменяемый и не требуется обеспечивать безопасность потоков.