Category Archive: Без рубрики

Удаление числа из строки

Иногда мы пользуемся трюком, сохраняя числа (ID из базы данных) в строке через запятую.
Например: «1024,15,8,0,55».
И теперь, допустим, какое-то число из этого списка не нужно, и его необходимо убрать из исходной строки. Как это реализовать?

Первый вариант:
1) разбить строку по запятой
2) отфильтровать удаляемое число
3) собрать строку заново

Второй вариант (допустим, удаляем число 55):
1) вырезать из строки подстроки вида: ,55,
2) удаляем подстроки вида 55, и ,55

Реализация 1-го варианта (Java):

String val = "55";
String collect = Arrays.stream(
        "55,1024,55,15,8,0,55".split(","))
        .filter(v -> !v.equals(val))
        .collect(Collectors.joining(","));
System.out.println(collect);//1024,15,8,0

Реализация 2-го варианта (Java):

int del = 55;
String result = "55,1024,55,15,8,0,55"
        .replaceAll("," + del + ",", ",")
        .replaceAll(",?" + del + ",?", "");
System.out.println(result);//1024,15,8,0

Некоторые вещи про закачку файлов

В любом web-проекте в определенное время возникает вопрос как загружать/скачивать файлы. В этой статье рассмотрим важные аспекты этих процедур:

  • Можно загружать файлы не только в виде байт, но и формате base64.
  • Файл загружается на веб-сервер и сохраняется как временный файл
  • При передаче файла на сервер используется кодирование multipart/form-data
  • Из временного файла можно получить оригинальное название файла, байты файла, тип содержимого(ContentType), размер.
  • На основе байтов можно рассчитать хэш. Например, алгоритмом MD5, SHA-1 или SHA-256.
  • Хэш файла может пригодиться при отдаче файла, чтобы проверить целостность.
  • При отдаче файла следует указать HTTP-заголовок Content-Disposition. Параметр inline сообщает браузеру, что файл можно открыть непосредственно в браузере, если конечно позволяет тип файла. Параметр attachment сообщает, что файл должен скачиваться. Также в Content-Disposition передается наименование файла, которое лучше кодировать с помощью URL Encoding.
  • Если в браузере вы хотите отобрать процесс загрузки файла, например, в процентах, то проще всего это сделать через javascript, который может отслеживать кол-во отправленных байтов.

Бинарный алгоритм вычисления НОД

Наибольшим общим делителем (НОД) для двух целых чисел называется наибольший из их общих делителей.
Например: для чисел 8 и 12 наибольший общий делитель равен 4.

Ранее мы уже рассматривали нахождение НОД с помощью Алгоритма Евклида:

long gcd(long a,long b){
	return b == 0 ? a : gcd(b,a % b);		
}

Сейчас рассмотрим Бинарный алгоритм Евклида, который быстрее обычного алгоритма Евклида.
Бинарный алгоритм основан на следующих свойствах НОД:

НОД(2m, 2n) = 2 НОД(m, n),
НОД(2m, 2n+1) = НОД(m, 2n+1),
НОД(-m, n) = НОД(m, n)

Теперь реализуем этот алгоритм на Java:

static int gcd(int m, int n){
    if(m == 0) return n;
    if(n == 0) return m;
    if(n == m) return n;
    if(m == 1) return 1;
    if(n == 1) return 1;
    boolean em = (m & 1) == 0;
    boolean en = (n & 1) == 0;
    if(em && en) return gcd(m >> 1, n >> 1) << 1;
    if(em) return gcd(m >> 1, n);
    if(en) return gcd(m, n >> 1);
    if(n > m) return gcd((n - m) >> 1, m);
    return gcd((m - n) >> 1, n);
}

Для ускорения деления на два используется сдвиг битов на позицию вправо(>> 1), для умножения на два используется сдвиг на позицию влево (<< 1). Проверка четности числа осуществляется проверкой последнего бита числа (m & 1), если выражение равно 0, то число четно, иначе нечетно.

Замер времени (Java)

Иногда возникает потребность измерить время работы определенного фрагмента кода в вашем проекте.
Можно, конечно, писать так:

long start = System.currentTimeMillis();
//тут замеряемый код
System.out.println(System.currentTimeMillis() - start);

Но такой подход быстро надоедает. Я выделил замер времени в отдельный класс TimeMeter, теперь можно удобно останавливать несколько раз таймер и измерять время, если нужно измерить промежуточные значения. Можно также использовать несколько экземпляров таймера.
Реализация:

public class TimeMeter {
    private long start;
	private long stop;
 
    public TimeMeter(){
        start = now();
    }
 
    public void stop(){
        stop = now();
    }
 
    @Override
    public String toString() {
        return getDuration() + " msec";
    }
 
    public long getDuration(){
        return (stop == 0 ? now() : stop) - start;
    }
 
    private long now(){
        return System.currentTimeMillis();
    }
}

Самый простой вариант использования:

TimeMeter timeMeter = new TimeMeter();
//тут замеряемый код
System.out.println(timeMeter);

Таймер с несколькими остановками и замерами времени:

TimeMeter timeMeter = new TimeMeter();
//тут замеряемый код 1
timeMeter.stop();
System.out.println(timeMeter);
//тут замеряемый код 2
timeMeter.stop();
System.out.println(timeMeter);

Глобальный и внутренние таймеры:

TimeMeter totalTimeMeter = new TimeMeter();
for (int i = 0; i < 100; i++) {
    TimeMeter timeMeter = new TimeMeter();
    //тут замеряемый код
    System.out.println("time " + i + ": " + timeMeter);
}
System.out.println("total time: " + totalTimeMeter);

p.s. Можете придумать и сделать свою версию, здесь простор для творчества.

Тестовые ссылки с различными файлами

Часто бывает необходимо проверить какой-то функционал по получению файла через web. Мы либо ищем в интернете нужную ссылку, либо размещаем файлы где-то у себя на веб-сервере (который еще нужно поднять :-)).
Сегодня пришла идея сделать страницу, на которой будут размешаться ссылки на тестовые файлы, причем файлы будут храниться на этом же домене, поэтому пока работает этот домен, файлы будут доступны!

… с тестовыми файлами нужно еще определиться, чтобы они были нейтральными

Сортировка по убыванию в Java

На данный момент, к сожалению, в Java нет стандартной функции, которая бы могла сортировать массив из примитивных элементов (например, int[], long[]) по убыванию.
Мы можем сортировать массив примитивов только по возрастанию:

int a[] = {17,4,85};
Arrays.sort(a);
System.out.println(Arrays.toString(a));//[4, 17, 85]

Как выход можно перевести массив примитивов в массив объектов (например, Integer[], Long[], String[]) и сортировать уже его:

Integer a[] = {17,4,85};
Arrays.sort(a,Collections.reverseOrder());
System.out.println(Arrays.toString(a));//[85, 17, 4]

Т.е. вторым параметром функции sort мы передали Collections.reverseOrder(), что обеспечило обратную сортировку.

Викторина на 8 марта

На 8 марта в нашей IT-компании решили одним из конкурсов сделать викторину, порыскав в интернете, я составил 20 вопросов:

  1. Самая древняя профессия
    Ответ: Показать ответ
  2. У человека на двух руках 10 пальцев! Сколько пальцев на 10-ти руках?
    Ответ: Показать ответ
  3. Назовите три русский женских имени не заканчивающихся ни на А, ни на Я
    Ответ: Показать ответ
  4. Как звали первого программиста?
    Ответ: Показать ответ
  5. Кто ходит сидя?
    Ответ: Показать ответ
  6. Чего нет в женской сумочке?
    Ответ: Показать ответ
  7. Что можно приготовить, но съесть нельзя?
    Ответ: Показать ответ
  8. Что получиться если объединить Microsoft и iPhone?
    Ответ: Показать ответ
  9. Какое колесо не крутится при правом развороте?
    Ответ: Показать ответ
  10. Что не войдет в самую большую кастрюлю?
    Ответ: Показать ответ
  11. А и Б сидели на трубе. А уехал за границу, Б чихнул и лёг в больницу. Что осталось на трубе?
    Ответ: Показать ответ
  12. Винни-пух — поросёнок или кабан?
    Ответ: Показать ответ
  13. Сколько грамм весит снаряженный пистолет Макарова:
    Ответ: Показать ответ
  14. Что такое мультифора?
    Ответ: Показать ответ
  15. Что такое «Паста ГОИ»
    Ответ: Показать ответ
  16. Что такое «Метчик» и «Лерка»
    Ответ: Показать ответ
  17. Планета супермена
    Ответ: Показать ответ
  18. Седьмая планета от Солнца
    Ответ: Показать ответ
  19. Самое большое озеро на Земле
    Ответ: Показать ответ
  20. Назовите максимально длинное слово, в котором не повторяется ни одна буква
    Ответ: Показать ответ

Баянаул 2014

Статья о том, как добраться с Астаны до Баянаула своим ходом и вернуться обратно.
Боровое уже наскучило, поэтому решили съездить в Баянаул.
Природа там ни чем не уступает боровому, но нас сразу предупредили, что ждать комфорта не стоит.

Решили поехать в будний день. Купили билеты на автобус через сайт http://saparzhai.kz на 11 августа до Экибастуза. Отправление автобуса было в 09:20 утра. Взрослый билет обошелся в 2000 тенге + 50 тенге комиссии.
Примерно через 5 часов мы оказались в незнакомом нам Экибастузе. Зашли на вокзал, чтобы узнать, когда будет автобус до Жасыбая. Да-да, именно до Жасыбая, а Баянаул находится по пути. Но речь не об этом, а о том, что автобус до Жасыбая ходит только утром. Мы хотели узнать: как еще можно добраться и где стоят таксисты. Но сотрудница, зная, что следующий автобус только утром, ничего не подсказала, сославшись на то, что такси не относится к вокзалу. В итоге пошли за территорию вокзала искать такси…
tax
Выйдя с территории вокзал, сразу же стол таксёрик, который зарядил 15 тысяч тенге до Жасыбая.
Мы были в шоке… Потом решили пройти чуть дальше, там под деревом сидели два мужика-зазывалы. Они сказали по 2500 с каждого и сразу поедем. Это нас очень устроило. Нас проводили через дорогу, где нас передали другому таксисту. Но поехали мы не сразу, а немного подождали, пока наберется людей в машину. В итоге набралось нас — двое, парень и женщина. Так и поехали.
По дороге встречались угольные разрезы. Очень часто захватывало дух, но не из-за угольных разрезов, а из-за резких спусков после подъема, дорога вообще волнистая.
По пути заехали в Баянаул,оставили там женщин и поехали дальне в Жасыбай. Дальше была даже немного серпантинная дорога. Заранее мы не договаривались о месте нашей остановки, решили на месте осмотреться. Добравшись до Жасыбая, в первую очередь водитель отвез парня-попутчика в какую-то зону отдыха, окрашенную в розовые тона. Несмотря на будние дни, там было очень много людно, что не очень понравилось нам. Но до воды, т.к. озера было рукой подать. Решили не ехать туда, где планировали искать место остановки, а искать место у воды, чтобы выйти и сразу в воду. Водитель нам попался очень хороший (Баха — сын Аллаха, как он сам себя назвал), созвонился со знакомыми, узнать о наличии мест, и мы отправились в зону отдыха «Березовая роща».
Там нас встретили, проводили до женщины, которая показала номер. Вообще до это нас предупреждали, что не стоит ждать комфорта, и в тех зонах отдыха, что мы смотрели по интеренету туалет и душ были общими. А тут номер и в нем есть туалет и душ. Что очень порадовало. Номер обошелся в 9000 за сутки, мы взяли на два дня. Мы хотели посмотреть номера за 6000, но нам сказали, что они с подселением, и мы не стали смотреть, а оплатив 18 тыс. остались в этом номере. Номер был на первом этаже, в номере был телевизор, по-моему даже холодильник. Устроившись и переодевшись мы пошли на пляж. Как видно на картинке ниже — пляж недалеко:
room
Что касается магазинов: магазин на территории зоны отдыха есть, но пока мы там были, он всё время был закрыт. Пару раз мы сходили за водой до этих магазинчиков:
long-road
Но на следующий день мы нашли более короткий путь — по пляжу, но в одном месте нужно на корточках проползти под забором:
short-road

Также мы не стали далеко идти в горы, а чисто символически сходили в ближайшие горы:
island
Вот такой вид там открывается:
Jpeg
Если смотреть с берега, то кажется, что озеро куда-то сворачивает за горы. Но с горы уже видно, что перед нами полуостров, это потом уже вернувшить в Астану, я увидел на карте, что это остров. И назвается этот остров — «Остров влюбленных». Если бы мы знали раньше, что это остров, то прокатились бы до острова на катамаранах. А вообще люди на катамаранах плыли не к острову, а чуть поближе, к месту, где было не так глубоко, что даже было видно с высоты желтоватую воду. Возможно, в этом месте из воды выступали камни. Стоит немного рассказать о воде. Вода чистая, берег песчанный, дно тебя не засасывает, как в Боровом. Нужно довольно далеко отойти от берега, чтобы стало глубоко. Нырять с разбегу — не советую, так как на дне лежат большие камни. Да и плавать нужно осторожно, чтобы не наплыть на камень. Местами встречаются водоросли, поэтому приходилось смотреть в воду и высматривать камни и водоросли.
Людей тут очень мало, кто любит уединение — здесь понравиться.
Питание. По пути на пляж у нас была столовая, в которой можно было позавтракать, пообедать и поужинать, но в строго определенные для этого время. На территории есть мангал, но мясо нужно привозить с собой. Чтобы покушать шашлык и попить пиво также нужно идти в сторону трассы.

Теперь о возвращении. В день отъезда позвонили Бахи, он нашел нам попутное такси. Выйдя за территорию и немного пождав, подъехала машина, в которой были уже два пассажира. Я спросил столько с нас возьмут, оказалось еще дешевле 2000 с человека, нас это очень даже устроило и мы поехали в Экибастуз. У нас был поезд, поэтому нас привезли на железнодорожный вокзал. Также мы проголодались, но неудобство небольших городов — это отсутствие мест, где можно покушать, т.к. все питаются дома. По крайней мере, мы не нашли возле вокзала нормального места покушать. В итоге решили пойти в сторону автовокзала и не ошиблись, через дорогу от автовокзала была кафешка, где мы пообедали. Далее вернулись на ж/д вокзал. Было очень тяжело в поезде, т.к. было очень нужно, в нашей секции плацкарта не открывалось окно :(.
Но не смотря на это, поездка удалась на славу 🙂

Музыка для программирования

Музыка для программирования
|| Музыка для кодинга
|| Хакерская музыка
|| Программистский транс

  1. Blue_Stahli_-_Contre_Strike-CS-GO.mp3
  2. DJ-Velocity-Exposure.mp3
  3. dj_slyter_-_kazantip.mp3
  4. glide_-_extasy_(mf_remix).mp3
  5. KaZantip.mp3
  6. Na_igre_2_prodoljenie_-_Gamers.mp3
  7. nobody.one-Trapper.mp3
  8. Quake3track2.mp3
  9. Quake3track5.mp3
  10. RedAlertTrack9.mp3
  11. The_Prodigy_-_Youll_Be_Under_My_Wheels.mp3
  12. TheAlgorithm-Null.mp3
  13. Vibrasphere-ForestFuel.mp3
  14. StreetHacker Music — Traction 4 Heavy