Страницы

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

четверг, 30 мая 2019 г.

развёртывание проекта с помощью git push

имеется:
сервер с git-ом и доступом по протоколу ssh на сервере в каталоге /путь/к/ создано обыкновенное (не-bare) git-хранилище командой git init у пользователя, от имени которого подключаюсь, есть права на запись в этот каталог
требуется:
чтобы при отправке изменений командой git push в любую ветку из локального клона этого хранилища обновлённые файлы тут же появлялись на сервере в рабочем каталоге /путь/к/ именно в том виде, как они представленны в этой самой ветке
да, я знаю про подводные камни. меры приняты.
как настроить хранилище на сервере, чтобы оно работало именно так, как мне требуется?


Ответ

на сервере:
в каталоге /путь/к/ выполните команду:
$ git config receive.denyCurrentBranch ignore в хранилище (/путь/к/.git/) создайте файл /путь/к/.git/hooks/post-update следующего содержания:
#!/bin/sh GIT_WORK_TREE=$(dirname $PWD) git reset --hard $(git rev-parse $1) добавьте этому файлу биты исполнимости:
$ chmod +x /путь/к/.git/hooks/post-update
всё.
теперь можете клонировать это хранилище себе локально:
$ git clone пользователь@сервер:/путь/к/
добавлять файлы, ветки, коммитить и отправлять изменения на сервер командой git push (понятно, что если ветки на сервере ещё не существует, надо будет её указать, например, так: git push origin ветка).

если вдруг понадобится переключиться на другой коммит/ветку без создания нового коммита, то придётся «вручную» на сервере выполнить (в каталоге /путь/к/) git checkout -f ... или git reset --hard ...

навеяно этими вопросами (и ответами к ним) с одной целью — упростить процесс:
Настройка и развертывание проекта c помощью Git Deploy a project using Git push

Как распределить числа из массива js

Задача такая:
var streak = { min: '', max: '', length: '', series: [] }
var allStreaks = []
У меня есть массив чисел:
var arr = [19, 20, 21, 22, 17, 18, 19, 7, 8, 9]
Мне нужно распределить их по массивам чтобы в нем были эти числа в порядке возрастания, и записать все это в таком формате:
[{ min: 19, max: 22, length: 4, series: [19, 20, 21, 22] }, { min: 17, max: 19, length: 3, series: [17, 18, 19] }, { min: 7, max: 9, length: 3, series: [7, 8, 9] }]
В исходном массиве числа идут в том порядке в котором они мне нужны будут (как будто если бы эти числа шли по датам - одно число - один день) Мне нужно отловить сколько "дней" эти числа увеличивались, с какого числа началось и на каком остановилось и потом все сначала. Первые 4 числа массива arr (19 20 21 22) должны создать объект в котором будет записано минимальное число (19), максимальное число (22), сколько всего чисел было записано (4) и собственно сам массив этих чисел [19, 20, 21, 22]. Точно так же со вторым возрастающим стриком с 17 до 19 итд Числа в исходном массиве абсолютно рандомные и нужно отследить эту череду увеличений и как только встречается число меньше предыдущего начать новый массив
На данный момент делаю так:
for (var i = 0; i < arr.length-1; i++) { if (arr[i] < arr[i+1]) { streak.series.push(arr[i]) } else { streak.series.push(arr[i]) //Сохранит последний элемент первого стрика break; } }
Так я успешно получаю первый стрик, однако если мне надо продолжить, то возникают трудности:
for (var i = 0; i < arr.length-1; i++) { if (arr[i] < arr[i+1]) { streak.series.push(arr[i]) } else if ((arr[i] > arr[i-1]) && (arr[i] > arr[i+1])) { streak.series.push(arr[i]) // Это ловит и записывает последний элемент первого стрика, получается steak.series = [19,20,21,22] // но он на этом не останавливается и продолжает записывать все числа исходного массива // так как они потом подходят под первый if (arr[i] < arr[i+1]) // и в результате у меня просто переписывается весь исходный массив } else {continue;} }


Ответ

var arr = [19, 20, 21, 22, 17, 18, 19, 7, 8, 9] var resArr = []; var min = max = length = 0; var tempArr = []; var prev = 0; arr.forEach(function(item) { if(prev > item && prev){ resArr.push({'min':min,'max':max,'length':length, 'series':tempArr}); min = 0; max = 0; tempArr = []; length = 0; } if(item > max) max = item; if(item < min || min == 0) min = item; length++; tempArr.push(item); prev = item; }); resArr.push({'min':min,'max':max,'length':length, 'series':tempArr}); console.log(resArr);

Безопасное деление на ноль

Как определить допустимое значение переменной типа float, используемой в качестве делителя, чтобы избежать ошибки деления на ноль? Достаточно ли сравнить с нулем?
float f; //... if (f != 0.f) 1.f / f;
Здесь похожий вопрос, где VladD ссылается на IEEE-754, где гарантируется:
Если v > 0 и h == 0, то v/h == INFINITY Если v < 0 и h == 0, то v/h == -INFINITY
Что в принципе позволит исключить проверку на ноль перед делением, но с другой стороны, стандарт 6.5.5.5 говорит:
The result of the / operator is the quotient from the division of the first operand by the second; the result of the % operator is the remainder. In both operations, if the value of the second operand is zero, the behavior is undefined
Вопрос в том, безопасно ли делить float с нулями, и если нет, какое должно быть условие проверки, чтобы получить определенный результат.


Ответ

В первую очередь хочу отметить, что для выяснения правил работы с числами с плавающей точкой в c или c++ нужно проверить значения соответствующих констант. Т.е. стандарты языков не гарантируют обязательности наличия этих правил, но имеется возможность узнать поддерживает ли та или иная реализация, например, стандарт IEEE-754 для определенного типа.
В приложении F (IEC 60559 floating-point arithmetic) стандарта языка c четко сказано:
An implementation that defines __STDC_IEC_559__ shall conform to the specifications in this annex.
В c++ можно проверить поддержку IEEE-754 для вещественного типа с помощью такого кода:
std::numeric_limits::is_iec559
True if and only if the type adheres to IEC 559 standard. International Electrotechnical Commission standard 559 is the same as IEEE 754.
Если поддержка обеспечивается, то дальнейшее исследование вопроса нужно производить уже по упомянутому стандарту. Но как показывает практика, ошибка деления на ноль возникает исключительно при делении на ноль, хотя получить бесконечность можно и при делении на отличное от нуля значение:
#include #include #include
int main() { std::feclearexcept(FE_ALL_EXCEPT); float min = std::numeric_limits::min(); volatile float zero = 0.0f; std::cout << 10.f / min << '
'; if(std::fetestexcept(FE_DIVBYZERO)) { std::cout << "division by zero reported
"; } else { std::cout << "division by zero not reported
"; } }
Получим:
inf division by zero not reported
Если заменим min на zero, то уже
inf division by zero reported
Поэтому для себя надо решить, чего же действительно хочется избежать: ошибки деления на ноль или получения бесконечности.
Согласно IEEE-754 п.7.3 исключение типа "деление на ноль" возникает только при действиях на конечных операндах в двух случаях:
деление ненулевого значения на ноль; вычисление логарифма от нуля.

Можно ли рассчитывать идентичные последовательности на основе srand?

Вопрос чисто философского характера:
Можно ли полагаться на базу рандомизации при генерации идентичных последовательностей на разных устройствах?
Например, задав некоторую базу(srand) и cгенерировав 100 чисел, можно ли быть уверенным в том, что именно эти самые числа будут сгенерированы с той же базой на более быстром/медленном по частоте процессора компьютере/телефоне etc..?
P.S В основе вопроса - функция srand из стандартной библиотеки C. P.P.S В разных компиляторах получаются разные последовательности.


Ответ

Нет, нельзя. Реализация srand зависит от используемой стандартной библиотеки языка C - а она на разных компьютерах может отличаться. И даже на одном и том же компьютере она может отличаться. Даже если собирать одним и тем же компилятором.
Если вам требуется переносимый детерминированный генератор псевдослучайных чисел - его лучше написать самостоятельно.

Android как сделать GET запрос

Мне при нажатии на кнопку в MainActivity надо запросить данные Есть специальный адрес по которому они лежать в json представлении
Мне кажется или в java все как то сложно?)
Права для интернета я указал. Все, с кодом проблемы)
URL url = new URL("http://hashcode.ru").openStream()
Тут подчеркивает красным строчку с адресом.... (((


Ответ

public static String doGet(String url) throws Exception {
URL obj = new URL(url); HttpURLConnection connection = (HttpURLConnection) obj.openConnection();
//add reuqest header connection.setRequestMethod("GET"); connection.setRequestProperty("User-Agent", "Mozilla/5.0" ); connection.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); connection.setRequestProperty("Content-Type", "application/json");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream())); String inputLine; StringBuffer response = new StringBuffer();
while ((inputLine = bufferedReader.readLine()) != null) { response.append(inputLine); } bufferedReader.close();
// print result Log.d(TAG,"Response string: " + response.toString());
return response.toString(); }
Использовать можно так:
new AsyncTask() { @Override protected String doInBackground(Void... voids) { String s = ""; try { s = doGet(myURL); } catch (Exception e) { e.printStackTrace(); } return s; }
@Override protected void onPostExecute(final String result) { runOnUiThread(new Runnable() { @Override public void run() { tvRez.setText(result); } }); } }.execute();

Алгоритм ГСЧ генерирующий одинаковые числовые последовательности при одинаковом Seed [закрыт]

В языке есть генератор случайных чисел не привязанный к какому-либо параметру, а надо сделать наоборот.
Сверх сложный не надо, но и совсем простой тоже было бы не желательно.


Ответ

Классический линейный конгруэнтный метод может стать приемлемым решением, если нет требований к криптостойкости.
С учетом специфики JavaScript, проще взять параметры генератора, используемые в стандартной функции minstd_rand из c++11
multiplier = 48271 increment = 0 modulus = 2147483647
В случае умножения multiplier (48271) на максимальное значение seed (2147483646), получается 103661183076066, что меньше максимально возможного безопасного целого числа в JavaScript 9007199254740991
var Random = function(seed) { seed = (seed || 1) % 2147483647; return { next: function() { return seed = seed * 48271 % 2147483647; }, seed: function(s) { seed = s; } }; }; var random = new Random(1); for (var i = 0; i < 1000; i = i + 1) { console.log(random.next()); }
Для сверки результатов можно использовать код на c++11
#include #include
int main() { std::minstd_rand g(1); for (int i = 0; i < 1000; ++i) std::cout << g() << std::endl; }
Ссылка на действующий C++ код. Оба варианта дают в конце последовательности из 1000 итераций одинаковый результат:
... 390639274, 1641974594, 429183498
Как ограничить результат по диапазону, думаю, вы знаете.

Запрет повторного голосования

Здравствуйте. Сделал голосовалку и появилась необходимость запретить повторное голосование. Решил через id пользователя. Для этого создал таблицу и в ней два поля user_id и poll_id. То есть при заходе в голосование ищем в таблице все id текущего голосования, берем id текущего пользователя и если есть совпадения - в данном голосовании уже был этот пользователь, то запрещаем ему голосовать здесь, если id пользователя не совпадает ни с одним id голосования, то даем ему проголосовать и записываем в таблицу id голосования и id пользователя. Скажите пожалуйста я правильно мыслю ? Или нагородил фигни ? И эта таблица ведь должна быть связана с таблицами user и poll ?


Ответ

Вроде получилось, вот код контроллера:
public function actionPoll($id, $user_id, $poll_id) { $single = Poll::getOne($id); $getdata = PollUser::getData($user_id, $poll_id);
$u = Yii::$app->user->id;
if ($u != $getdata->user_id && $id != $getdata->poll_id) {
if ($single->load(Yii::$app->request->post())) {
if ($single->count1) { $single->updateCounters(['count1' => 1]); } if ($single->count2) { $single->updateCounters(['count2' => 1]); } if ($single->count3) { $single->updateCounters(['count3' => 1]); }
Yii::$app->db->createCommand("INSERT INTO poll_user (user_id, poll_id) VALUES ($u, $id)")->execute();
return $this->redirect("/site/poll/?id=$single->id&user_id=$u&poll_id=$single->id"); } } else { return $this->render('pollonlyresult', ['single' => $single, 'getdata' => $getdata]); } return $this->render('poll', ['single' => $single, 'getdata' => $getdata]); }
Берем голосование. Берем данные из проверочной таблицы. Получаем id залогиненого юзера - проверяем на совпадения в проверочной таблице - если нет совпадений, то голосуем и записываем текущего юзера и голосование в таблицу. Редиректим на страницу с результатами. Если же есть совпадения, то сразу редиректим на страницу с результатами. Вроде бы так, большое спасибо всем кто ответил.