Страницы

Поиск по вопросам

среда, 10 апреля 2019 г.

Как в JS передать в функцию опцинальный параметр являющийся фунцкцией?

Как правильно объявить функцию updateParam() чтобы параметр successCallback был опционален?
Тоесть чтобы обы следующих вызова функции были корректны:
1.
updateParam("myName", "myValue");
2.
updateParam("myName", "myValue", function(){ console.log("Callback"); });
Моя функция:
function updateParam(parameterName, value, successCallback) { $.ajax({ type: 'POST', url: 'index.php?c=params&a=updateParam', ///.... success: function (data) { var response = $.parseJSON(data); if (response != true) { console.log(data); ShowError(); }else{ successCallback(); } } }); }
UPDATE: Интересует есть ли способ декларирования фунции с опциональным параметром, а не простая проверка существует ли объект. Либо же, в крайнем случае, проверка является ли этот объект функцией.


Ответ

В ES2015 можно использовать параметры по умолчанию
function updateParam(parameterName, value, successCallback=function(){}) {
Важно: данный метод помогает только если параметр не будет передан при вызове. Но он никак не поможет, если в функцию будет передан параметр не ожидаемого типа.

что такое неделимая операция семафора?

"Неделимая операция - это операция, которая не может быть прервана." Непонятно это объяснение. Могли бы вы осветить более развернуто этот момент и если возможно с примером кода.


Ответ

Два параллельных потока выполнения представляете? Нет никаких гарантий, кто что и когда делает. Вплоть до того, что вы выполняете присваивание типа
long long x = f(y);
где long long - 8 байт, а запись при этом идет по 4 байта - пишется одно слово, затем второе. Так вот, параллельное выполнение не гарантирует не только что никто не вклинится между вычислением функции и присвоением результата, но что даже такое сохранение будет выполнено без вмешательства другого потока. И если есть
Поток 1 Поток 2 x = 0xFFFF0000; x = 0xABCD1234;
то в результате может оказаться, что x не равно ни первому значению, ни второму, а, скажем, x == 0xFFFF1234. Специально привел пример понеприятнее.
А неделимая операция - во время выполнения которой переключение между потоками гарантированно не произойдет.
Так более-менее понятно?
Семафор - есть такой std::mutex, и если вы выполнили для него lock(), то пока не будет выполнен unlock(), все прочие операции lock() заставляют поток ожидать.
std::mutex m;
Поток 1 Поток 2 m.lock(); m.lock(); x = 0xFFFF0000; x = 0xABCD1234; m.unlock(); m.unlock();
Тут вы гарантируете, что как бы причудливо не переплетались эти потоки, но x не примет какого-то непонятного значения, а будет либо 0xFFFF0000, если первым захватил мьютекс второй поток, либо 0xABCD1234 - если первый. Т.е., например, первый поток пришел первым, вызвал lock(). Пришел второй поток, вызвал lock() - и остановился в ожидании, пока мьютекс не будет освобожден. Первый поток выполнил присваивание, вызвал unlock() и пошел дальше. И только теперь вызов lock() вторым потоком завершится, и он сможет выполнять свое присваивание.
Примерно так...

Как укоротить метод? с#

Как можно укоротить этот метод? В зависимости от входящего значения он отмечает чекбоксы.
private void CheckB(int i) { switch (i) { case 0: c1.Checked = true; return; case 1: c2.Checked = true; return; case 2: c3.Checked = true; return; case 3: c4.Checked = true; return; case 4: c5.Checked = true; return; case 5: c6.Checked = true; return; case 6: c7.Checked = true; return; case 7: c8.Checked = true; return; case 8: c9.Checked = true; return; case 9: c10.Checked = true; return; case 10: c11.Checked = true; return; case 11: c12.Checked = true; return; }


Ответ

Можно поместить чекбоксы в массив:
private readonly CheckBox[] checkBoxes;
В конструкторе (после InitializeComponent();) создаем массив:
checkBoxes = new[] { c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12 };
Тогда ваш метод будет выглядеть так:
private void CheckB(int i) { if (i >= 0 && i < checkBoxes.Length) checkBoxes[i].Checked = true; }

Поиск файла с наименьшим количеством слов

Как найти и вывести на экран имя файла с наименьшим количеством слов в файле?


Ответ

Зайдите из консоли в каталог с файлами и выполните данную команду:
ls --file-type | grep -v '/$' | xargs wc -w | sort -g | head -n 1 | awk '{print $2}'

Как ограничить RAM для всех и вся?

Как ограничить RAM для всех и вся в ОС Linux?
elementary OS 0.3.2 Freya => Built on Ubuntu 14.04
К примеру, у меня установленно 6гб оперативной памяти, мне необходимо установить лимит, дальше которого не подняться. К примеру, я установил лимит в 4гб, для ОС это должно быть максимальным.
В Windows подобное устанавливается в MSconfig. К сожалению о аналогах в Linux мне ничего не известно.


Ответ

если вам на самом деле необходимо ограничить именно программу linux в использовании оперативной памяти, то следует передать ей в качестве параметра (при загрузке):
mem=желаемый_размер
например:
mem=4G

инструкция по передаче доп. параметров программе linux на примере дистрибутива ubuntu

обновление в связи с уточнением в комментарии.
последний сектор памяти поврежден
тогда вам, вероятно, лучше зарезервировать нужный блок памяти. это можно сделать с помощью параметра (при загрузке):
memmap=nn[KMG]$ss[KMG]
означающего: зарезервировать nn (кило-, мега-, гига-) байт памяти, начиная с адреса ss (кило-, мега-, гига-) байт.
пример — исключить использование памяти с 0x18690000 по 0x1869ffff:
memmap=64K$0x18690000
или
memmap=0x10000$0x18690000

Java: наследование контркуктора

Объясните дураку(в основном работаю с php), почему при наследовании исключений, не наследуются все конструкторы.
Кейс №1 Есть класс расширяющий исключения(без конструктора)
package test.exceptions; public class StatusException extends Exception { final public static String STATUS_NOT_EXIST = "Status: not exist"; }
Есть код выкидывающий исключение:
public static void test() throws StatusException { String message= StatusException.STATUS_NOT_EXIST; throw new StatusException(message); }
При компиляции получаю ошибку о несоответствие сигнатур конструкторов
Error:(26, 15) java: constructor StatusException in class test.exceptions.StatusException cannot be applied to given types; required: no arguments found: java.lang.String reason: actual and formal argument lists differ in length
Кейс №2 Исключение с конструктором принимающим String
package test.exceptions; public class StatusException extends Exception { final public static String STATUS_NOT_EXIST = "Status: not exist";
public StatusException(String message) { super(message); } }
Код выкидывающий исключение:
public static void test() throws StatusException { String message= StatusException.STATUS_NOT_EXIST; throw new StatusException(); }
Ошибка
Error:(24, 15) java: constructor StatusException in class test.exceptions.StatusException cannot be applied to given types; required: java.lang.String found: no arguments reason: actual and formal argument lists differ in length


Ответ

Конструкторы не наследуются. Касательно первого примера - вы должны явно создать конструктор с параметром:
public class StatusException extends Exception {
final public static String STATUS_NOT_EXIST = "Status: not exist";
public StatusException(String message) { super(message); }
}
Касательно второго примера. Если явно не задан ни один конструктор, то по умолчанию создается пустой конструктор без параметров. То есть в первом примере у вас будет неявно создан такой конструктор. Если же явно определен хотя бы один конструктор, то конструктор без параметров следует так же явно указать. Следовательно, для второго примера нужно так:
public class StatusException extends Exception { final public static String STATUS_NOT_EXIST = "Status: not exist";
public StatusException(String message) { super(message); }
public StatusException() { //nothing or call super } }

Golang пакет time возвращение времени на русском

Здравствуйте, подскажите как правильно реализовать дату и время на русском в go?


Ответ

Дата и время на русском это с месяцами/днями недели словами или просто в привычном формате?
Если просто в ДД.ММ.ГГГГ ЧЧ:ММ:СС, то можно так
fmt.Println(time.Now().Format("02.01.2006 15:04:05"))
В отличие от php, c и т.п. в стандартном пакете Go символы форматирования это не буквы со спец-символами, а образцы. Например 02 это день месяца с ведущим нулём, 01 - номер месяца с ведущим нулём. Просто 2 это день месяца без ведущего нуля и т.п. В результате формат времени выглядит как представление даты 2006-01-02T15:04:05.999999999Z07:00 в том формате как вам нужно.
Образцы можно посмотреть в константах пакета time https://golang.org/pkg/time/#pkg-constants

Как сделать, чтобы анимация не останавливалась

Есть такая анимация:
android:duration="100" android:fillBefore="false" android:fromXScale="1.0" android:fromYScale="1.0" android:pivotX="50%" android:pivotY="50%" android:startOffset="0" android:toXScale="0.9" android:interpolator="@android:anim/decelerate_interpolator" android:toYScale="0.9" />
Как работает: объект сначала уменьшается,а потом возвращается в исходное состояние. (объект-ImageView)
В коде обращаюсь так:
anim= AnimationUtils.loadAnimation(getContext(),R.anim.clickbutton);
и вызываю так:
public boolean onTouch(View v, MotionEvent event) {
v.startAnimation(anim); switch (v.getId()) { case R.id.b1: { stopPlayerIfNeeded(); playSample(soundsRawResIds[0]); } break;
Все работает как часы, но хотелось бы, чтобы после нажатия анимация "постоянно работала" т.е нажал я на case R.id.b1 - выполнилось действие, но анимация продолжала работать до того момента, пока не выбрал другой R.id.* и т.к далее
///////////////////////////////////////// как в этом случае остановить анимацию?сейчас так: выбрал R.id.b1: все запустилось и работает, выбрал R.id.b2: запустилась анимация но и на R.id.b1: продолжает выполняться анимация,а нужно остановить
for (int j = 0; j < arr_imageB.length; j++) { arr_imageB[j].setOnTouchListener(new View.OnTouchListener() {
@Override public boolean onTouch(View v, MotionEvent event) {
v.startAnimation(anim); switch (v.getId()) { case R.id.b1: {
stopPlayerIfNeeded(); playSample(soundsRawResIds[0]);
}
break; case R.id.b2:
{ stopPlayerIfNeeded(); playSample(soundsRawResIds[1]);
}
break; case R.id.b3: { stopPlayerIfNeeded(); playSample(soundsRawResIds[2]);
}
break; case R.id.b4: { stopPlayerIfNeeded(); playSample(soundsRawResIds[3]); }
break; case R.id.b5: { stopPlayerIfNeeded(); playSample(soundsRawResIds[4]); } break; case R.id.b6: { stopPlayerIfNeeded(); playSample(soundsRawResIds[5]);
}
break; case R.id.b7: { stopPlayerIfNeeded(); playSample(soundsRawResIds[6]);
} break; }


Ответ

Если анимация лежит в то атрибут android:repeatCount="infinite" должен работать

Подскажите регулярки для строки содержащей больше 1-2 слов?

Подскажите пожалуйста регулярки:
"строка содержит более одного слова" "строка содержит более двух слов"


Ответ

Да тупо в лоб.
строка содержит более одного слова
/\w+\s+\w+/
строка содержит более двух слов
/\w+\s+\w+\s+\w+/
При условии, что разделителем между словами считаем именно \s (то есть знаки препинания не учитываем).

Загрузка картинок из ссылки

Есть список, в каждом элементе должна быть картинка. Картинки в виде http ссылок.
Неужели нет способа подгрузить картинки в основном потоке, не заморачиваясь с созданием новых потоков?


Ответ

Конечно же есть! для этого можете воспользоваться библиотекой Picasso
Необходимо добавить ее к проекту записью в градл файл:
compile 'com.squareup.picasso:picasso:2.5.2'
Использовать очень просто
Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);

Android - как отправлять запрос с периодичностью 10 секунд на сервер? [закрыт]

Как отправлять запрос с периодичностью 10 секунд на сервер? Я использую библиотеку okhttp, скиньте пример, пожалуйста.


Ответ

Timer timer = new Timer(); TimerTask timerTask = new TimerTask() { @Override public void run() { //Тут идёт запрос в сеть } } timer.schedule(timerTask, 0, 10000);

CS:GO получить сылку на файл .dem

Нужно получить ссылку файл в формате .dem по коду демо (как пример код CSGO-OyjY3-pPKCF-cmpHJ-wdohh-CY5dK)
Нужная ссылка выглядит так http://replay124.valve.net/730/003072985384448163905_0699089210.dem.bz2 , но как по коду демо получить значения:
003072985384448163905 0699089210 124
Хотелось бы сделать на PHP но можно и на NodeJS, но не нашёл ничего на эту тему в интернете.
Up: В самой игре демо можно скачать по внутреней консоли игры командой csgo_download_match код демо например csgo_download_match CSGO-pj5MV-zyzpa-PaHVb-tFUwV-HGXbD, но всеравно как оно расшифровывет в ссылку остаётся загадкой


Ответ

Ваша проблема уже решена, более того, есть библиотека для nodejs https://www.npmjs.com/package/csgo А вот и код, который расшифровывает ваш код:
var scDecoder = new csgo.SharecodeDecoder("CSGO-U6MWi-hYFWJ-opPwD-JciHm-qOijD"); console.log(scDecoder.decode());
В репе есть более полный пример, используйте его.
--
Внутриигровой загрузчик использует функцию CMsgGCCStrike15_v2_MatchListRequestFullGameInfo из внутренней библиотеки NetHook2.dll
UPD: Вот метод,который использует эти функции, даже называется также https://github.com/joshuaferrara/node-csgo/blob/master/handlers/match.js#L77

Проверка на нахождение в enum. Java

Как проверить нахождение константы в enum'e, которая соответствует введенной строке с консоли?


Ответ

Для enum-а:
enum Foo { VALUE1, VALUE2 }
Проверить есть ли в нем значение переменной inputString
String inputString = ... boolean exists = true; try { Foo.valueOf(inputString); } catch (IllegalArgumentException e) { exists = false; }
для строки inputString = "VALUE1" переменная exist будет true

Как открыть стороннее приложение из своего приложения?

Мне нужно использовать стороннее приложение в своем проекте(просмотр 3d моделей). Можно ли как то допустим при нажатии на кнопку в своем приложении открывать нужное мне приложение? Может как то программно запускать его исполняющий файл?


Ответ

В итоге я сделал это так
public void reeee(View view) { String path = "/storage/emulated/0/Android/data/com.example.android.camera2basic.demo/files/default/AvatarModelDir/Anna.dae"; File file = new File(path);
//checking if the File exists if(file.exists()) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(file), "application/octet-stream");
boolean result = isIntentAvailable(getApplicationContext(), intent);
if (result){ startActivity(intent); } } }
public static boolean isIntentAvailable(Context context, Intent intent) { List list = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); return !list.isEmpty(); }
Указывая путь к файлу который нужно открыть и правильный тип MIME (в моем случае это application/octet-stream) у меня все работает

Android - как правильно добавлять картинку на button

Имеется png картинка и цель - добавить её на button. Проблема в том, что если добавляю через @android:background кнопки, то картинка становится с лесенками (как будто антиалиазинг выключен), либо становится мутной. Если использую разметку ниже, то вообще картинка не показывается, остаются только границы на button.




Имеются предоположения, что неправильно добавляю png в проект. Добавляю через res->new->image asset
Исправил, теперь всё работает




Картинку перемещаю вручную в папку res/drawable-hdpi Только есть небольшая проблема, что селектор android:state_pressed="true" всё равно отказывается работать


Ответ

По описанию проблема в том, что нет ресурса с достаточным качеством картинки. Либо ресурс с соответствующим квалификатором отсутствует вовсе (например res/drawable-xxhdpi/), либо хранящееся в нем изображение имеет низкое качество - собственный размер в пикселях мал для данного разрешения или достаточный размер, но неудачный скалинг, то есть размер нормальный, но в результате обработки по увеличению получилась хрень вместо четкой картинки. Так, для экрана плотностью XXHDPI (~480dp) изображение для стандартной иконки (размер 48x48dp) должно иметь абсолютные геометрические размеры 144x144 пикселя с содержимым соответствующего качества (подробнее смотрите офф.документацию).
В первом случае недостающие ресурсы нужно создать, во втором посмотреть, что там за изображения вообще лежат и привести их в соответствие.
PS: селектор у вас составлен неверно. В конце селектора должен быть айтем для вида по умолчанию, который не имеет никаких стейтов (в вашем случае вместо должен быть просто и располагаться самым последним в иерархии айтемов. Выбор айтема в селекторе производится по следующему алгоритму: проверяется условие стейта первого айтема, если совпадает, то он выводится и селектор заканчивает работу, иначе переходит ко второму айтем и проверяет его условие и так далее, если ни одно из условий не выполняется последним выполняется айтем без условий, который содержит, как правило, нормальный вид (состояние без всяких нажатий, фокусов, селекторов и тд). Картинку в селекторе не видно, потому что ее закрывает shape - фигуры не прозрачные по умолчанию. Смотрите, например этот ответ (вторая часть) по созданию вида из наложения картинки и шейпа.

Как отсортировать текстовый список файлов по расширению?

Есть файл log.txt. В этом файле содержится громадный список файлов и расширений, где каждое новое название начинается с новой строчки, приблизительно вот так:
1.jpg common.pdf script.sh Justin Bieber - Baby.mp3
Нужно перекинуть весь список в еще один файл, в котором список файлов будет упорядочен по расширению


Ответ

можно, например, воспользоваться программой sort, передав ей две опции:
указание использовать в качестве разделителя полей точку: -t. указание сортировать по второму полю: -k 2

$ sort -t. -k 2 исходный-файл > отсортированный-файл

уточнения: так называемые «расширения» файла пришли к нам из файловой системы fat16 (а в неё — из файловой системы для операционной системы cp/m), где это были отдельные сущности. с тех пор данное понятие присутствует лишь по традиции и довольно условно.
в операционных системах же системах unix и их «наследниках» (bsd, gnu и т.п.) этого понятия не существовало изначально: имя файла, например, file.tar.gz, — это цельная сущность, в ней нет никаких «расширений». да, строку .tar.gz можно считать «суффиксом» в имени файла. или даже двумя суффиксами: tar и gz
потому мой ответ и содержит предложение выделить в имени файла первую точку, подразумевая, что после неё и находится суффикс имени файла, или, в традиционно-устаревшей терминологии — «расширение».

если же всё-таки требуется сортировка по самому последнему суффиксу в имени файла, т.е., чтобы файл с именем a.z.a был раньше файла с именем a.b, то можно, например, воспользоваться такой конструкцией (она будет корректно работать при наличии любых символов в исходном файле, и вертикальной черты, и символа табуляции):
$ rev исходный-файл | sed -r 's/^([^.]+).*/&\t\1/' | rev | sort | cut -f 2- > отсортированный-файл

Пятиугольная кнопка

Здравствуйте. Весь день бьюсь над этой кнопкой. Пробовал делать уголок с помощью border - не работает градиент. Пробовал поворачивать див на 45 градусов - угол стрелки получается 90 градусов, а на картинке угол тупой. Пробовал рисовать на SVG - не знаю, как сделать круглые углы. Подскажите как это сделать?


Если видели где-нибудь похожую кнопку - поделитесь ссылкой на страничку.


Ответ

*{ box-sizing: border-box; } .btn{ display: inline-block; padding: 16px 30px; color: #fff; border: 1px solid #4A803C; position: relative; border-radius: 3px; background: rgb(74,168,28); /* Old browsers */ background: -moz-linear-gradient(top, rgba(74,168,28,1) 0%, rgba(63,155,19,1) 100%, rgba(56,146,12,1) 100%); /* FF3.6-15 */ background: -webkit-linear-gradient(top, rgba(74,168,28,1) 0%,rgba(63,155,19,1) 100%,rgba(56,146,12,1) 100%); /* Chrome10-25,Safari5.1-6 */ background: linear-gradient(to bottom, rgba(74,168,28,1) 0%,rgba(63,155,19,1) 100%,rgba(56,146,12,1) 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#4aa81c', endColorstr='#38920c',GradientType=0 ); } .btn > span{ position:relative; z-index: 1; } .btn:after { content: ""; width: 35px; height: 35px; display: block; position: absolute; top: 7px; right: -18px; border: 1px solid #4A803C; border-left: none; border-bottom: none; border-radius: 3px; -webkit-transform: rotateY(45deg) rotate(47deg) skew(5deg); transform: rotateY(45deg) rotate(47deg) skew(5deg); background-image: -moz-linear-gradient( 143deg, rgb(74,168,28) 0%, rgb(63,155,19) 100%); background-image: -webkit-linear-gradient( 143deg, rgb(74,168,28) 0%, rgb(63,155,19) 100%); background-image: -ms-linear-gradient( 143deg, rgb(74,168,28) 0%, rgb(63,155,19) 100%); background-image: linear-gradient( 143deg, rgb(74,168,28) 0%, rgb(63,155,19) 100%); } .btn:hover{ background: rgb(56,146,12); /* Old browsers */ background: -moz-linear-gradient(top, rgba(56,146,12,1) 0%, rgba(63,155,19,1) 0%, rgba(74,168,28,1) 100%); /* FF3.6-15 */ background: -webkit-linear-gradient(top, rgba(56,146,12,1) 0%,rgba(63,155,19,1) 0%,rgba(74,168,28,1) 100%); /* Chrome10-25,Safari5.1-6 */ background: linear-gradient(to bottom, rgba(56,146,12,1) 0%,rgba(63,155,19,1) 0%,rgba(74,168,28,1) 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#38920c', endColorstr='#4aa81c',GradientType=0 ); } .btn:hover:after{ background-image: -moz-linear-gradient( -47deg, rgb(74,168,28) 0%, rgb(63,155,19) 100%); background-image: -webkit-linear-gradient( -47deg, rgb(74,168,28) 0%, rgb(63,155,19) 100%); background-image: -ms-linear-gradient( -47deg, rgb(74,168,28) 0%, rgb(63,155,19) 100%); background-image: linear-gradient( -47deg, rgb(74,168,28) 0%, rgb(63,155,19) 100%); } Умножитель матрицы
Fiddle

bash script для создания папок

Есть множество папок dir1, dir2, dir3 и тд, общее количество - 100-200, к примеру. Нужен скрипт, который создаст около них папки типа dir1fold, dir2fold, dir3fold(грубо говоря, берётся название предыдущей папки и добавляется префикс fold) и, в идеале, перенесёт каждый dir в свой dirfold


Ответ

for dir in *; do if [ -d "$dir" ]; then newdir="${dir}fold" mkdir "$newdir" mv "$dir" "$newdir" fi done

Сделать ссылку кликабельной

Нужно сделать преобразователь вставленных урлов в кликабельные ссылки, причём даже без http://. Выходит что попало, так как не дружу с регулярками, вот код:
$text = 'Тестик test.ru http://test.ru'; $text = preg_replace('`(http(?:s)?://\w+[^\s\[\]\<]+)`i', '$1', $text); $text= preg_replace('/[a-zA-Z0-9]+\.(ru|com|net)/i', '$1', $text); echo $text;


Ответ

$text = 'Тестик 1.test.ru 2.test.ru ok 3.https://test.ru'; $patt = array( '%\b(?]*)%i', '%\b(?]*>)(?![^<>]*)%i' ); $repl = array( '$1', '$0' ); $text = preg_replace($patt, $repl, $text); echo $text;
Здесь:
\b - граница слова, тут нужна для захвата всего слова (например test), а не его части (est);
(?);
(?(?![^<>]*) - исключает захват ссылки из тега A (например от сюда test.ru ok);
(?!["\'][^<>]*>) - исключает захват ссылки из тега A (например от сюда ).
P.S. Данное решение все равно не учитывает всех нюансов ;)
UPD Вариант с более сложными регулярками, приближенными к RFC 1738
$text = 'Тестик 1. abc.test.ru 2.
http://test.ru ok 3. https://test.ru/search?search_id=975080714'; $patt = array( '%\b(?https?://|www\.)([\p{L}\p{N}]+[\p{L}\p{N}\-]*\.(?:[\p{L}\p{N}\-]+\.)*[\p{L}\p{N}]{2,})(?::\d+)?(?:(?:(?:/[\p{L}\p{N}$_\.\+!\*\'\(\),\%;:@&=-]+)+|/)(?:\?[\p{L}\p{N}$_\.\+!\*\'\(\),\%;:@&=-]+)?(?:#[^\s\<\>]+)?)?(?![^<]*+)%u', '%\b(?]+)?|\b)(?![^<]*+)%u' ); $repl = array( '$1', '$1' ); $text = preg_replace($patt, $repl, $text); echo $text;

Как сделать переход на другое активти без возможности перехода на старое?

К примеру есть активти1 , активити2 и активити3, к примеру я сначала перешел на активити2 а от туда на активити3, но потом мне захотелось перейти с активити3 на активити1, я делаю переход, но если я нажму кнопку назад то меня с активити1 перебросит на активити3 обратно, как избежать этого перехода ?


Ответ

во втором activity после startActivity вызывайте finish(), В третьем активити вместо startActivity, вызывайте finish(). Тогда такой ситуации не повторится.

Узнать количество членов enum

Как узнать количество членов enum?
Пусть в классе задаю enum: enum a{a1,a2,a3,a4,a5};, а в другом классе есть метод, который перебирает значения вектора по членам a с помощью for(int...). Но если я потом увеличу количество членов a, то придется менять это и в методе. И хотелось бы задавать размер вектора от размера a
Или узнать какой элемент последний.


Ответ

Узнать кол-во констант в перечислении не представляется возможным. Если вы используете проход по циклу, то может быть достаточно просто задать константу, говорящую о максимальном размере. Ну, или если всё же хочется иметь именованные константы, то можно в enum задать последний элемент как aMax
enum A { a1, a2, a3 ... , aMax };
Цикл в таком случае будет выглядеть так:
for( A v = a1; v < aMax; ++v ) { ... }
Добавлю, что вся эта схема работает, только при отсутствии разрывов в значениях перечисления. Например:
enum A { a1, a2 = 100, a3 ... , aMax };
породит проблему отсутствия значений в диапазоне [1..99]. Т.е. цикл должен как-то это учитывать, а не идти обычным инкрементом.

Для чего нужен код (хэштег) в конце сайта?

Последнее время заметил код (или хэштег) в адресной строке в конце многих сайтов. К примеру: https://site.ru/blablabla/#.V49UWuLLfK4
Причем при каждом обновлении страницы он меняется, а ссылка работает и без него. Особенно этим грешит medium.com. Для чего это нужно и как это сделать?
Только не пишите про якори. Это не они.


Ответ

Эта часть URL называется "идентификатор фрагмента" (fragment identifier). Кусок URL, извлечь смысл из которого должен клиент, а не сервер. Поэтому, запрашивая документ по HTTP, клиент может эту часть в запросе даже не передавать (возможно, даже обязан не передавать, но надо глянуть в стандарт). Это семантически и высокоуровнево.
Поначалу (и уже довольно давно) эта часть использовалась только для якорей в браузерах. Сервер возвращает весь документ, а клиент смотрит в фрагмент, ищет соответствующий якорь и проскролливает вид до него исключительно ради удобства пользователя. Это вы знаете.
С распространением JavaScript к этой части появился доступ не только у браузера, но и у произвольного кода, присланного сервером. И эта часть стала неплохим местом для хранения небольшого кусочка клиентских данных, о которых серверу знать необязательно, а клиент как-то может отреагировать. Для чего? Ну, для всего, что умеет JavaScript, нужно только применить воображение.

Сейчас это применяется для хранения состояния в небольших SPA прямо внутри ссылки. Это необязательно должен быть именно SPA, это может быть любое браузерное приложение на JS, возможно даже размещённое на нескольких страницах. Просто это короткий термин и понятно о чём.
Ссылку клиент А может послать клиенту Б какими-то своими способами, и, открыв её, можно увидеть приложение точно в том же состоянии, в каком оно было у клиента А. Пример: Coriolis.io, инструмент для обмена сборками кораблей в Elite: Dangerous
Ещё вариация — хранение не всего состояния приложения, а только той части, которая может быть полезна другим пользователям.
Например, роутинг. URL вида http://site.com/#/thing/42 Он осуществлялся в основном через фрагментную часть. Это пока не было HTML5 History API. Теперь есть. И теперь когда сервер можно научить понимать любые URL, можно писать SPA, меняющие "текущий URL" в пределах одной страницы без подобных костылей. AngularJS без "HTML5 mode" работает таким образом. Когда программируемой серверной части нет (или её лень настроить, что бывает), это единственный способ клиентского роутинга, который не ломает получающиеся ссылки: ведь фрагментную часть сервер игнорирует.
Или обмен токенами. Некогда было засилье мессенджеров, работающих через WebRTC, и через фрагментный кусок образовывались комнаты. SPA ищет там токен комнаты, если не находит — генерирует случайный и добавляет его туда. Пользователю остаётся только скинуть ссылку. Перешедшие по ней попадут в SPA, а JS-клиент в нём увидит токен и сразу попросится в указанную комнату, попав к тому, кто ссылку скинул.

Разделение строки в массив

Подскажите как решить задачу, мне нужно разбить строку в массив:
$s = "бла бла бла Сила+5 бла бла бла Ловкость+12 бла бла бла Шанс-2";
разделителем я хотел сделать пробел которому предшествует цифры:
$a = preg_split("/\d+\s+/", $s);
но так я отсекаю сами числа которые мне нужны.
бла бла бла Сила+ бла бла бла Ловкость+ бла бла бла Шанс-


Ответ

Можно воспользоваться ретроспективной проверкой
"; print_r($a);

проверка введённого пользователем пин-кода

Хочу чтобы функция возвращала true если пользователь ввёл 4 или 6 цифр. И false во всех остальных случаях. Ввёл буквы, больше символов и т.д.
validatePIN("1234") === true validatePIN("12345") === false validatePIN("a234") === false
Код функции:
function validatePIN (pin) { //return true or false if (pin.length == 4) { return true; } else if (pin.length == 6) { return true; }
return false;
}
Как мне грамотно организовать проверку, того что в строке нет символов, кроме цифр от 1 до 9.
Решение с помощью регулярного выражения:
^(\d{4}|\d{6})$
П.с. если кто знает покажите как сделать без RegExp


Ответ

Ну если без регулярок, то вот так:
function validatePIN(pin) { var i = pin.length; if (i != 4 && i != 6) { return false; } while (i--) { if (pin[i] < '0' || pin[i] > '9') { return false; } } return true; } console.log('should be true:'); console.log(validatePIN('1234')); console.log(validatePIN('0129')); console.log(validatePIN('123456')); console.log('should be false:'); console.log(validatePIN('12345')); console.log(validatePIN('a234')); console.log(validatePIN('123a')); console.log(validatePIN('-123')); console.log(validatePIN('1.23')); console.log(validatePIN('0x99')); console.log(validatePIN('0:29')); console.log(validatePIN('0/29'));

Почему сравнения возвращают различные результаты?

static bool Compare0() { return new byte() == new byte(); }
static bool Compare1() { return new byte[0] == new byte[0]; }
static void Main() { Console.WriteLine(Compare0()); Console.WriteLine(Compare1());
Console.ReadKey(); }
Почему Compare0() возвращает True, а Compare1() - False?


Ответ

Конструкция new byte() создает экземпляр типа byte, проинициализированный нулем. byte -- это структура, а следовательно, это значимый тип. По умолчанию все значимые типы сравниваются по значению. Поскольку два экземпляра проинициализированы одинаковым значением, Compare0() возвращает True
Конструкция new byte[0] создает пустой массив типа byte. Массив -- это ссылочный тип. По умолчанию экземпляры ссылочных типов равны, только если их ссылки равны, т.е. экземпляры указывают на один и тот же объект. Поскольку два экземпляра массива -- это два разных объекта в памяти, Compare1() возвращает False
Подробнее о значимых и ссылочных типах можно почитать в этом ответе

Передача двух массивов в поток

Имеется 2 структуры (2 динамических массива), в каждой свой набор данных. Появилась потребность перенести одну из функций в поток с помощью pthread_create (функцию change).
Не могу понять, как можно передать ссылки на эти 2 структуры в данную функцию (в потоке), чтобы в ней я смог провести какие-нибудь операции у данных структур и с этими изменениями я мог дальше работать в основной программе?
Спасибо.
Пример программы.
#include #include #include #include #include #include
struct strc { char str[60]; int uid; struct strc *prev; };
struct param { struct stack *elma; struct stack *elmb; };
struct stack *add(struct stack **base, char *line,int uid) { struct stack *element=(struct stack*)malloc(sizeof(struct stack)); element->prev=*base; strcpy(element->data,line); element->uid=uid; return element; }
int search(struct stack *base,char *str) { while (base!=NULL) {if (strcmp(base->data,str)==0) return base->uid; base=base->prev;} return 0; }
void * change(void *arg) { struct param *data=arg;
*data.elma=add(data.elma,"chips",5); *data.elmb=add(data.elmb,"volvo",2); }
int main() { int uid; pthread_t thread; struct strc *elma=NULL; struct strc *elmb=NULL; struct param *arg;
arg->elma=elma; arg->elmb=elmb;
if (pthread_create(&thread, NULL, change, &arg) != 0) {return -1;}
uid=search(elma,"chips"); printf("%i",uid); uid=search(elmb,"volvo"); printf("%i",uid); }


Ответ

Поправил Ваш пример до работоспособного состояния.
#include #include #include #include #include #include
#include
struct stack { char data[60]; int uid; struct stack *prev; };
struct param { struct stack **elma; struct stack **elmb; };
struct stack *add(struct stack **base, char *line,int uid) { struct stack *element=(struct stack*)malloc(sizeof(struct stack)); element->prev=*base; strcpy(element->data,line); element->uid=uid; return element; }
int search(struct stack *base,char *str) { while (base!=NULL) { if (strcmp(base->data,str)==0) return base->uid; base=base->prev; } return 0; }
void * change(void *arg) { struct param *data=arg;
*(data->elma) = add(data->elma, "chips", 5); *(data->elmb) = add(data->elmb, "volvo", 2); *(data->elma) = add(data->elma, "flips", 15); *(data->elmb) = add(data->elmb, "ford", 21);
}
int main() { int uid; pthread_t thread; struct stack *elma=NULL; struct stack *elmb=NULL; struct param arg;
arg.elma=&elma; arg.elmb=&elmb;
if (pthread_create(&thread, NULL, change, &arg) != 0) exit((puts("Can't create thread"), 1));
// тут делаете что-то полезное, \ пока не понадобятся данные из change()
if (pthread_join(thread, 0)) exit((puts("Can't join"), 2));
uid=search(elma,"chips"); printf("chips: %i
",uid); uid=search(elmb,"volvo"); printf("volvo: %i
",uid); uid=search(elma,"flips"); printf("flips: %i
",uid); uid=search(elmb,"bmw"); printf("bmw: %i
",uid); }
По сути, заменил передачу в change() указателей на "стеки" на передачу адресов этих указателей (структура param), поскольку в main Вы явно используете elma и elmb для обращения к search() и добавил вызов pthread_join для ожидания завершения заполнения "стеков" (естественно, добавил #include ).
avp@wubu:hashcode$ gcc pt.c -lpthread && ./a.out chips: 5 volvo: 2 flips: 15 bmw: 0 avp@wubu:hashcode$

Проход по алфавиту Python

Можно ли как-то инкрементировать символ латинского алфавита? Нужно пройтись по алфавиту в Python, либо по числу получать какой-то определенный символ, есть такие функции?


Ответ

Получение символа по его номеру из Unicode:
>>> chr(65) 'A' >>> chr(122) 'z' >>> print(chr(128522)) 😊
(в Python 2 лучше вместо chr использовать unichr)
Получение номера из Unicode по символу:
>>> ord('A') 65 >>> ord('z') 122 >>> ord('😊') 128522
Заранее заготовленные строки с латинскими (и не только) символами есть в модуле string
>>> import string >>> string.ascii_uppercase 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' >>> string.ascii_lowercase 'abcdefghijklmnopqrstuvwxyz' >>> string.ascii_letters 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
По этим строкам можно проходиться циклом:
for c in string.ascii_letters: print(c)
Во всяких генераторных выражениях и условиях, разумеется, тоже:
>>> import string >>> s = 'fooУБРАТЬbarОТСЮДАbazНЕЛАТИНСКОЕ' >>> s2 = ''.join(c for c in s if c in string.ascii_letters) >>> print(s2) foobarbaz

HTML тег осуждается или его можно использовать?

HTML тег осуждается, или его можно использовать? И где вообще самая достоверная информация?
Или лучше вообще использовать стили вместо тегов, где это можно?


Ответ

Использование спецификацией не осуждается. Это вполне себе стандартный тег, который можно, и нужно использовать. Самая достоверная информация - в спецификации-рекомендации, опубликованной на W3C и в их wiki. Остальное - порой отсебятина авторов.
А вот , кстати говоря, как раз устарел и был исключен из стандарта - вместо него теперь нужно использовать или (в зависимости от ситуации)

Представить число в виде суммы последовательных слагаемых

Есть переменная a, а может быть любым числом. Допустим a = rand()%10+1; И надо найти все возможные варианты сложения. Представить целое число a в виде суммы как минимум двух последовательных натуральных чисел.
Например:
10 = 1 + 2 + 3 + 4 24 = 7 + 8 + 9
Помогите найти и придумать алгоритм поиска. Спасибо.


Ответ

Смотрите, всё не так сложно. Это простое диофантово уравнение.
Вспомним формулу суммы арифметической прогрессии (у нас разность d = 1, n — неизвестное количество слагаемых, a_1 — неизвестное первое слагаемое):
S = n * (2 * a_1 + (n - 1)) / 2
Отсюда 2S делится на n
Дальше легко найти кандидатуры на n перебором как делители 2S. Например, для S = 10 это будут 2, 4, 5, 10, 20, n = 1 отбрасываем, у нас должно быть больше одного слагаемого. Для каждого из них находим 2S / n = 2 * a_1 + (n - 1), а потом и a_1 (у нас получится соответственно 4.5, 1, 0, -3.5, -9). Отбрасываем дробные результаты, и получаем ответы:
1 + 2 + 3 + 4 0 + 1 + 2 + 3 + 4 -9 + -8 + -7 + -6 + -5 + -4 + -3 + -2 + -1 + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10
Если нужно только натуральные числа, оставляем только варианты с a_1 > 0, это будет
1 + 2 + 3 + 4

Асимптотическая сложность: простейшее разложение на множители перебором до корня O(sqrt(n)), проверка каждого кандидата O(1).

ArrayList как узнать индекс элемента если известно значение?

Можно ли в java узнать индекс элемента в ArrayList, если известно значение?
При нажатии на пункт списка показывает значения
@Override public int getItemCount() { return mFilteredCheeses.size(); }
public void filter(String query) { mFilteredCheeses = new ArrayList<>(); for (String cheese : mDefaultCheeses) { if(cheese.toLowerCase().contains(query.toLowerCase())) { mFilteredCheeses.add(cheese); } } notifyDataSetChanged(); }
А есть ли возможность узнать индекс элемента, например со значением Макс?


Ответ

Есть у ArrayList метод indexOf - он как раз ищет подходящий элемент и выводит его индекс.
ArrayList test = new ArrayList<>(); test.add("yo"); test.add("yo2"); System.out.println(test.indexOf("yo2")); // Выведет: 1
Если в списке несколько одинаковых значений, то выведет индекс первого попавшегося.

При передаче массива строк в функцию строки равны NULL

Есть непонятная проблема по передача массива строк в функцию на языке Си.
Вызывающий код:
char str[33][40]; CreateCSV((char**)str);
Функция:
void CreateCSV(char** str) { char strData[]= {'"','Д','А','Т','А','"',';','\0'};
if(str[0x00] != NULL) strcpy (str[0x00], strData); else Console("СтрокаЗаголовка[0x00] == NULL"); }
Почему у меня str[0x00] == NULL? Ведь я явно создал 33 строки и зарезервировал по 40 символов под каждую.


Ответ

Если в кратце - используйте одинаковый прототип для объявления переменной и для параметров в функции и для strData. Это не самый красивый вариант, но он сработает
Вот как будет выглядеть Ваша программа:
#include #include
void CreateCSV(char str[33][40]) { char strData[33][40]= {"\"","D","A","T","A","\"",";","\0"};
if(str != NULL) memcpy (str, strData, sizeof(strData)); else printf ("error
"); }
int main (void) { char str[33][40] = {'\0'}; int i=0;
CreateCSV(str);
for (i=0; i<33; i++) printf ("%s
", str[i]);
return 0; }
Обратите внимание на сл. нюансы - я использовал функцию копирования памяти а не строк "memcpy". И проверял на NULL имя str без указания сдвига. Это связано с тем, как язык Си представляет и обрабатывает многомерные массивы. Также при заполнении strData использовал двойные кавычки, иначе компилятор соединял буквы в одну строку, а не трактовал их как ряд строк с 1 буквой в каждой строчке.

Если в деталях и особенностях физики языка Си: Массивы объявленные как
char str[33][40];
и как
char str**;
это совершенно разные вещи.
char str[33][40]; - трактуеться как длинный одномерный массив глде все строки слеплены в одну одна-за-другой. Что-то ввиде "строка 1 \0\0\0\0\0...\0 строка 2 \0\0\0\0\0...\0 ....... строка 33 \0\0\0\0\0...\0 " и размер такого массива будет равер 33*40*sizeof(char)=33*40*1=1320.
При объявлении такого массива, компилятор выделяет 1320 байт в стеке, и трактует переменную 'str' как указатель на эту длинную строку.
char str;** - это массив указателей на одномерные строки. Воспринимаеться компилятором как {*pointer_to_str1, *pointer_to_str2, ... *pointer_to_str33}, при этом сами строки лежат вне этого массива. Размер такого массива будет равен 33*sizeof(char*) = 33*4 = 132/
При объявлении такого массива, компилятор проводит несколько операций. Сначала компилятор выделит 33 независимых строки в стеке , затем создаст массив указателей и заполняет его указателями на эти 33 независимые строки.
Вот как будет выглядеть Ваша программа если strData объявить как char**:
#include #include
void CreateCSV(char str[33][40]) { char *strData[33] = {"\"","D","A","T","A","\"",";","\0"};
if(str != NULL) { int i=0; for (i=0; i<33; i++) if (strData[i] != NULL) strncpy (str[i], strData[i], 40); } else printf ("error
"); }
int main (void) { char str[33][40] = {'\0'}; int i=0; CreateCSV(str); for (i=0; i<33; i++) printf ("%s
", str[i]); return 0; }
PS оба примера проверены на gcc

Сравнение скорости загрузки серверного шрифта и google-шрифта

На англоязычном стаке задавал вопрос о проблемах подключения шрифта через @font-face.
Один из ответов советовал, что нужно подключать гугл-шрифт - это надежный и более быстрый способ подключения шрифта.
В этом я сомневаюсь, так как мы зависим от стороннего ресурса - расстояния до него, скорости работы и доступности. Возможно, я чего-то не знаю, подскажите, пожалуйста


Ответ

Для начала, стандартные плюсы и минусы CDN:
+ Используется многими сайтами, поэтому весьма вероятно, что будет взято из кэша браузера, что позволит сэкономить на количестве запросов к серверу и объёме загружаемых данных. + Снижает нагрузку на сервер, поскольку ресурс теперь отдаётся не им, а сторонним (в данном случае гугловским) сервером. + Позволяет увеличить число потоков одновременной загрузки. Браузеры используют ограничение - не более 8 потоков загрузки на один домен. Но CDN принадлежит другому домену, поэтому получается 8 потоков на твой сайт и ещё по 8 на каждый чужой домен.
Минусы, в основном, сводятся к зависимости от стороннего ресурса:
− Если он по какой-то причине недоступен, то у тебя на сайте шрифта не будет. Для скриптов часто делается фоллбек. − Если CDN вдруг начнёт отдавать что-то другое, пользователи увидят результат раньше тебя. Для собственного сервера ведь ты сначала проверишь, что изменилось и только потом изменённые файлы окажутся у пользователей. Пример такой проблемы: Как загрузить шрифт Roboto v15? ? Теперь есть два сайта, которые можно пытаться взломать. Впрочем, не думаю. что это актуально для шрифтов, да и у гугловских серверов должна быть надёжная защита. Но в случае подмены скрипта все сайты, использующие его, окажутся под угрозой. Хотя, от этого в некоторой мере помогает перманентное кэширование - клиенты, у которых файл уже есть в кэше, на сервер за ним даже не пойдут. − Если свой сервер находится в локальной/корпоративной сети, то скорость доступа к нему выше, чем к CDN. Кроме того, с ним можно работать даже если интернет недоступен.
Теперь что касается именно шрифтов:
? Гуглошрифты позволяют указать набор интересующих тебя символов, что позволит сократить объём файлов шрифта. С другой стороны, чем более хитрый набор ты укажешь, тем меньше вероятность, что нужный файл уже будет в кэше браузера. + Скорее всего, гуглошрифты уже оптимизированы под использование на веб-сайтах. Не могу сказать, как именно, но на 90% уверен, что если это возможно, то они об этом позаботились.

Почему argv[0] выдаёт полный путь к скрипту? (Python)

Выполняю упражнения из LearnPythonTheHardWay. Везде, где используется argv, у автора первый аргумент содержит имя файла скрипта (например, "ex14.py"), у меня же выдаётся полный путь к этому файлу - "D:_MyCode\Python\LPTHW\ex14.py" (запускаю из cmd). От чего это зависит? Что и где нужно изменить, чтобы argv[0] содержала просто имя скрипта?


Ответ

От чего это зависит?
Документация для python