Я только начал изучать JavaScript и прорешивал задачки. И начали попадаться такие задания как:
• Чему равно 2 && 1 && null && 0 && undefined ?
• Чему равно 0 || "" || 2 || undefined || true || falsе ? Как можно сравнивать разные типы данных?
Ответ
&& и || это операции логического И и ИЛИ. На вход они принимают два логических операнда и возвращает результат логического типа В JavaScript нет строгой типизации, поэтому операнды преобразовываются к тому типу, который требуется в выражении. Т.е. в вашем случае все операнды преобразуются в логический тип. Алгоритм преобразования такой: Значение | Преобразуется в...
-----------------|--------------------
undefined, null | false
Числа | Все true, кроме 0, NaN -- false.
Строки | Все true, кроме пустой строки "" -- false
Объекты | Всегда true
Поскольку OO - это шаблон программирования, а не неотъемлемое свойство языка, он должен быть применим и к C. Как пишут ОО-код в C, когда это нужно и когда нельзя задействовать C++?
Ответ
Ну, суть сказали - использовать структуры для хранения контекста конкретных объектов. И передавать соответствующую структуру аргументом в функции. Которые уже будут работать с этой структурой как с классом =3
Пример:
typedef struct { // контекст объекта с чем угодно внутри
int x;
int y;
} nya;
typedef nya * pnya; void nya_construct (pnya this) // конструктор
{
this->x = 0;
this->y = 0;
} void nya_incx (pnya this) // метод 1
{
this->x++;
} void nya_decy (pnya this) // метод 2
{
this->y--;
} int main (void) // использование
{
pnya first = (pnya)malloc(sizeof(nya)); // объект 1
pnya second = (pnya)malloc(sizeof(nya)); // объект 2
nya_construct(first); // конструируем
nya_construct(second);
nya_incx(first); // исполняем метод в контексте объекта 1 free(first); // удаляем. Деструктора нет, его не вызываем
free(second);
}
Ну, в таком духе.
Есть некая фабрика: TBar * foo()
{
return new TBar(); // здесь конструктор TBar бросает исключение
}
Если конструктор TBar бросит исключение, мы получим утечку памяти, выделенной для нового объекта TBar. Верно?
Ответ
Нет, неверно.
Если не рассматривать выделения памяти внутри конструктора TBar, то утечек не будет. В языке C++ объект считается созданным только в тот момент, когда его конструктор завершит выполнение без ошибок. Здесь этого не происходит, поэтому объект никогда не был создан, а, значит, и память под него "как бы" не выделялась. Т.е. компилятор обязан корректно освободить память, в которой будет находится объект, в случае исключения в его конструкторе.
Уже не первый раз встречаюсь с MVC в статьях. Очень интересно было бы узнать побольше об этом. Найти достаточно адекватный источник пока не удалось. Практически каждая статья пытается толковать об этом по своему. Поэтому хочется увидеть названия адекватных книг, ссылки на статьи, возможно хорошее разъяснение темы.
Ответ
Фаулер:
GUI Architectures
Переводы:
Часть 1
Часть 2
Подскажите пожалуйста, в чем разница между @Autowired, @Required и @Resource
Ответ
@Required отмечает свойства бина, которые обязательно должны быть установлены.
@Autowired используется для автоматического внедрения зависимости. Вы отмечаете им некое свойство в бине и Spring сам создаст экземпляр класса, подходящего для этого свойства.
@Resource, в отличие от @Autowired, позволяет передать в качестве зависимости конкретный бин по его имени.
Все достаточно неплохо описано в документации
Пример.
class Foo {
private Bar bar; public void setBar(Bar bar) {
this.bar = bar;
}
}
Если вы хотите, чтобы Spring сам нашел подходящий класс и передал его экземпляр в setBar() проставьте перед методом аннотацию @Autowired
Если вы хотите передать конкретный бин, в качестве параметра setBar(), воспользуйтесь аннотацией @Resource(name="myBarBean")
Если свойство foo обязательно должно заполняться, добавьте аннотацию @Required
В List<> хранятся объекты, которые необходимо отсортировать по нескольким полям одновременно. Подскажите, пожалуйста, как это сделать.
Ответ
Через LINQ запись будет выглядеть даже проще:
IEnumerable result = nonSorted.OrderBy(x => x.value1).ThenBy(x => x.value2);
Если хотите избежать ленивых вычислений, то можно сразу спроектировать результат в IList<>
IList result = nonSorted.OrderBy(x => x.value1).ThenBy(x => x.value2).ToList();
Столкнулся с интересным глюком при хранение сериализованного объекта в SQLite
Есть некий класс который умеет сериализовать и десериализовать объекты. Если взять массив строк например и провести операцию сериализации и обратно, получим как и полагается начальный массив строк. Но если сериализовать массив, сохранить его в базе, достать оттуда то мы уже получаем отличную последовательность байт, соответственно операция десериализации проводится с ошибкой.
String[] anyarraystrings = {"26", "25", "21"};
byte[] bytec = Serilize.serializeObject(anyarraystrings);
cv.put("columnn", bytec);
rowID = db.insert("pro", null, cv);
Cursor c = db.query("pro", null, "_id = ?", new String[] {String.valueOf(rowID)}, null, null, "last_d DESC", "1");
if (c.moveToFirst()){
byte[] bytec2 = c.getBlob(c.getColumnIndex("columnn"));
Log.d(LOG_TAG, "До хранения в бд:" + String.valueOf(bytec));
Log.d(LOG_TAG, "После после хранения в бд:" + String.valueOf(bytec2));
}
Вот вывод лога:
04-16 20:04:27.220: D/myLogs(279): До хранения в бд:[B@44eb6f48
04-16 20:04:27.220: D/myLogs(279): После хранения в бд:[B@44eb8ba0
С чем это может быть связано?
Ответ
Ваши рассуждения ложны. То, что Вы получили разные последовательности байт, ещё не говорит о том, что у Вас разные данные. Сверяйте сами данные.
А то, что Вы выводите в лог - это просто адрес объекта. А он понятное дело может быть различным (и это даже логично, что в данном примере он различный.
Конструкция String.valueOf(bytec) выводит значения адреса переменой, а не содержимое.
Подскажите, имеется ли какой-нибудь простой метод выбора из двух фраз. Например, реализующий такое
Random r = new Random();
string stroka ="стакан";
switch(r.Next(2))
{
case 0:
stroka += " холодный";
break;
case 1:
stroka += " теплый";
break;
}
Этот код слишком грамоздкий, есть ли какое либо сокращение? Например:
функция(стакан {теплый|холодный});
Ответ
Можно крутить как угодно, первое что пришло в голову
string stroka ="стакан";
string[] arr = {"теплый","холодный"};
Console.WriteLine(stroka+" "+arr[new Random().Next(0, arr.Length-1)]);
Если нужно именно функцией, то можно так:
public string ArrayRand(String stroka, String[] arr)
{
return stroka += " "+arr[new Random().Next(0, arr.Length-1)];
}
Здравствуйте. Как можно сделать загрузку изображений со страницы сайта на сервер в определённую папку, и чтобы название файла заносилось в базу данных?
Ответ
Отложим в сторону всякие проверки, их вы сделаете сами и какие хотите (и файл ли это, и доступные расширения файлов, и прочее). Вам надо определиться, с каким именем будете сохранять файл, т.к. если его не переименовать, то может случиться так, что будет загружен файл с таким же именем, как у файла загруженного раньше. Это приведет к перезаписи существующего файла. Для примера, будем задавать новое имя в зависимости с текущей меткой времени Unix. Теперь к сути:
$path = 'path_to_dir/'; // директория для загрузки
$ext = array_pop(explode('.',$_FILES['myfile']['name'])); // расширение
$new_name = time().'.'.$ext; // новое имя с расширением
$full_path = $path.$new_name; // полный путь с новым именем и расширением if($_FILES['myfile']['error'] == 0){
if(move_uploaded_file($_FILES['myfile']['tmp_name'], $full_path)){
// Если файл успешно загружен, то вносим в БД (надеюсь, что вы знаете как)
// Можно сохранить $full_path (полный путь) или просто имя файла - $new_name
}
}
P.S. Поле файла в форме для моего примера, должно иметь атрибут name="myfile". Замените на своё значение, соответственно изменив в глобальной переменной $_FILES['myfile']
Допустим есть функция
$(document).ready(function(){
$('.myclass').click(function(){
}
});
которая вешается на блоки, скажем, с информацией по товару.
Как в эту функцию передать параметр, например код товара? Раньше на чистом js прописывал в каждый блок событие onmouseclick="" и из php подставлял нужный параметр.
Ответ
Можно назначать параметр как атрибут элемента, например data-parameter
contents
и затем в jquery читать его:
$(document).ready(function(){
$('.myclass').click(function(){
console.log(this.getAttribute("data-parameter"));
});
});
У меня есть несколько классов которые создают в конструкторе Thread (запуск производится отдельном методе - Start). Необходимо что бы классы не уничтожались до завершения работы потоков (они не фоновые, достаточно быстро отрабатывают, и желательно дождаться их завершения, а не сразу убивать при завершении приложения).
В связи с этим вопрос, где выполнять ожидание завершения потока (.Join) - в финализаторе (или деструкторе) или Dispose ?
Ответ
Логика неправильная - Dispose по майкрософтовским гаедлайнам должен выполняться за минимально возможное время. То есть выполнять какое-то ожидание завершения операции нужно в юзерском коде, а не в Dispose и, разумеется, не в финалайзере.
Отдельный аргумент против ожидания завершения потока в Dispose - сборщик мусора вполне себе имеет право (и даже разумно делать его таким) быть однопоточным. Соответственно, если вы лепите Wait в Dispose, то на время ожидания завершения потока у вас саспендится сборка мусора, а это очень плохо.
Проанализируйте ваш текущий код - наверняка есть способ инвертировать логику вашего приложения, чтобы работающие потоки не доходили до Dispose. Активнее оперируйте TaskPlanner'ами и сервисами ThreadFactory, введите Producer-Consumer. Хороших решений - масса.
Доброго всем времени суток
На странице есть кое какой объект (картинка, таблица... неважно). При загрузке страницы охота не показывать этот объект, а показать с задержкой с указанным интервалом времени (3 сек). Ну в идеале, что бы еще сам объект появлялся не мгновенно, а скажем 1 секунду. Подскажите, как такое реализовать?
Ответ
Если использовать jQuery, то:
$(function(){ // сработает, когда документ загрузится
$('#someID').delay(3000) // пауза в 3 сек.
.show(1000); // появление элемента в течении 1 сек.
});
Есть блоки кода вычислений блок1, блок2, блок3, блок4,...блок 10, скажем. Скажите, как поступить при использовании их в цикле:
for (i = 0; i <= n; i++) {
блок1;
блок2;
блок3;
блок4;
...
блок10;
}
Или же так оптимально:
for (i = 0; i <= n; i++) {
блок1;
} for (i = 0; i <= n; i++) {
блок2;
} ............. for (i = 0; i <= n; i++) {
блок10;
}
Можете объяснить почему? Мне лично кажется, что первый вариант быстрый и правильный.
Ответ
Ответ скорее не ТС, а @IronVbuf. Начало развернутого комментирования его ответа. Копия моего комментария:
@IronVbif, рассуждения красивые. Время позднее, не хочу (сейчас) все разбирать.
Если правильно понял, в пунктах 4, 5 и 6 Вы склоняетесь к тому, что несколько маленьких циклов (особенно если их тела маленькие) будут производительней одного.
Практический замер (gcc -O3 MinGW (32-bit) Windows 7 64-bit I5-2500 3.3GHz) показал обратное (причем аж в 3 раза для 6 циклов и 10^9 повторов маленьких вычислений (преобразование int->double, double умножение и сложение)
Примерчик (нисколько не претендует на полноту, 5 минут на коленке).
gcc -O3 MinGW (32-bit) Windows 7 64-bit I5-2500 3.3GHz
#include #define incvar(x,y) {x = x + i*y;}
main (int ac, char *av[])
{
double a = 0, b = 0, c = 0, d = 0, e = 0, f = 0;
int i;
if (av[1]) {
printf ("one loop ");
for (i = 0; i < 1000000000; i++) {
incvar(a,1.234);
incvar(b,7.234);
incvar(c,11.234);
incvar(d,111.234);
incvar(e,51.234);
incvar(f,21.234);
}
} else {
printf ("six loops ");
for (i = 0; i < 1000000000; i++)
incvar(a,1.234);
for (i = 0; i < 1000000000; i++)
incvar(b,7.234);
for (i = 0; i < 1000000000; i++)
incvar(c,11.234);
for (i = 0; i < 1000000000; i++)
incvar(d,111.234);
for (i = 0; i < 1000000000; i++)
incvar(e,51.234);
for (i = 0; i < 1000000000; i++)
incvar(f,21.234);
} printf ("%e %e %e %e %e %e ",a,b,c,d,e,f);
} c:/Users/avp/src/cc/hashcode $ gcc -O3 bloloops.c
c:/Users/avp/src/cc/hashcode $ date; ./a; date
Mon Aug 13 23:55:42 2012
six loops
6.170000e+017 3.617000e+018 5.617000e+018 5.561700e+019 2.561700e+019 1.061700e+019
Mon Aug 13 23:56:00 2012
c:/Users/avp/src/cc/hashcode $ date; ./a 1; date
Mon Aug 13 23:56:17 2012
one loop
6.170000e+017 3.617000e+018 5.617000e+018 5.561700e+019 2.561700e+019 1.061700e+019
Mon Aug 13 23:56:23 2012
c:/Users/avp/src/cc/hashcode $
Все желающие приглашаются к экспериментированию (вместо теоретизирования на основе прочитанной литературы) с последующим обсуждением результатов.
UPDATE
Для замера времени исполнения фрагментов программы удобно использовать функцию:
/*
avp время в миллисекундах
*/ #include
#include long long
mtime()
{
struct timeval t; gettimeofday(&t, NULL);
long long mt = (long long)t.tv_sec * 1000 + t.tv_usec / 1000;
return mt;
}
Меряем так:
...
long long mtime(void);
...
long long start = mtime();
// измеряемый код
...
printf ("duration: %lld msec ",mtime()-start);
...
На данный вопрос уже ответили:
Книги и учебные ресурсы по C#
1 ответ
Добрый день.
Необходимо быстро освоить C#, ищется хорошая литература и ресурсы в целом. Необходимости объяснять, что такое ООП, шаблоны проектирования, unit-тестирование, - нет (хорошо знаком с JAVA). Нужно быстро освоить особенности, современные возможности языка и стандартной библиотеки (интерес представляет как ms .net, так и mono). Кто с чего начинал, и кто с чего бы начал?
Спасибо.
Ответ
Про mono
Для того чтоб быстро освоить C#
ООП, Шаблоны
Классические книги по C#/.NET
Объявить класс Dictionary можно так:
var d = new Dictionary
{
{1, "..."},
...
};
Как сделать так, чтобы я мог инициализировать свой класс подобным образом?
List l = new List
{
{...} // Инициализация моего класса
}
Ответ
Чтобы работал такой неявный инициализатор нужно добавить инициализируемому классу метод Add с параметрами, соответствующими тому, что будет в квадратных скобках. Например, если у вас есть класс MyClass, у которого конструктор от двух строк и вы хотите легко инициализировать список таких классов, то придется завести класс для списка:
class MyClassList : List
{
public void Add(string s1, string s2)
{
Add(new MyClass(s1, s2));
}
}
теперь Вы получаете возможность инициализировать свой список так:
List l = new MyClassList()
{ {"a", "b"}, {"c", "d"} };
Хотел бы узнать, canvas может полностью заменить технологию SVG? То есть делать всё то, что умеет SVG?
Ответ
Нет, canvas не может полностью или даже частично заменить технологию SVG. Для любого дочернего объекта SVG можно повесить обработчик событий JavaScript, а для Canvas нельзя. Canvas это растровая графика, а SVG - векторная. И таких отличий еще не мало...
Есть таблица org (name, emp_id). Для каждого возможного значения name, необходимо вывести количество уникальных emp_id. Можно ли это сделать с помощью count() или как ещё?
UPD: Немного расшифрую. Допустим
(name) (emp_id)
apple 85962
apple 14654
intel 14654
intel 14654
В результате необходимо получить что-то вроде
(name) count(emp_id)
apple 2
intel 1
т.е. если emp_id повторяется в разных name, то их необходимо подсчитывать
Ответ
Первая интерпретация вашего вопроса
Для каждого name подсчитать уникальное количество emp_id
SELECT name, COUNT(DISTINCT emp_id) AS qty FROM org
GROUP BY name
Вторая интерпретация, подсчитать так, что бы исключить emp_id встречающиеся у разных name
Для этого пойдем от обратного
подсчитаем количество name у emp_id, то есть нам необходимо исключить из выборки emp_id встречающиеся у нескольких name
SELECT name, COUNT(DISTINCT emp_id) AS qty FROM org
WHERE NOT emp_id IN
(
SELECT emp_id FROM org
GROUP BY emp_id
HAVING COUNT(DISTINCT name) > 1
)
GROUP BY name
Унифицировать или нет дело ваше, смотря что там лежит и как
Добрый вечер. У меня такая проблема... Я изучал php последние полгода. Учил много, знаю много, в том числе ООП и некоторые API. Пора бы создать какой-нибудь проект чтобы закрепить свои знания, но я не знаю как это делать. Например, я могу сделать регистрацию/вход, загрузку файлов, вывод всего этого. Умею парсить XML, генерировать капчи. Но при этом сайт написать я не могу. Дело в том, что если сейчас начать писать сайт, то если и получится, то это будет плохой код. Где-то будут позорные алгоритмы, где-то будет смешной функционал, где-то будет позор полный и т.д. Не подскажите ли мне такой ресурс, видео, книгу и т.п. в котором подробно бы объяснялись именно принципы реализации сайтов, блогов, интернет-магазинов. Заранее спасибо.
Ответ
Сколько много нехороших слов в конце... Вопрос ваш риторический. Дальше у вас 2 пути на мой взгляд, делать первый сайт вам однозначно придётся, особенно если вы хотите этим потом зарабатывать.
Набивать шишки и писать, то о чем вы говорили, потом всё это переписывать и снова писать. Результат - вы будете знать язык, в конце концов у вас будет фактический свой движок.
Освоить фреймворк или даже не один, они частично избавят вас от написания костылей и пользуются спросом у работодателей.
Если вас интересуют методы написания сайта(без фреймворка), то основных тоже два. Либо у вас каждая страница запускает отдельный реальный файл, в котором подключаются необходимые модули. Либо делается редирект на обработчик, который обрабатывает запрос и автоматически подключает всё необходимое. Конечно последний вариант предпочтительнее. Кроме того рекомендую писать страницы отдельными модулями, а не раскладывать всё по
отдельным папкам css, js, ... так будет проще переносить наработки из проекта в проект.
Всем доброго времени суток. Будучи программистом, нередко читаю различную профильную литературу. Подавляющее большинство этих книг написано зарубежными авторами - от признанных классиков вроде Фаулера до гораздо менее известных авторов. Честно говоря, не припомню ни одной по-настоящему хорошей книги, что я читал, написанной российскими авторами. Есть ли вообще достойная литература от отечественного производителя,как вы считаете?
Ответ
Есть, вот например Алгоритмы: Построение, анализ и реализация на языке программирования Си Ворожцов А. В., Винокуров Н. А. потрясающий учебник. В бумажном варианте двухтомник.
Можно ли запускать потоки внутри
try{}?
И что делать, когда
посылается исключение? Ждать
завершения других потоков?
Есть ли в std::thread механизм для останова
всех потоков, ну или конкретные инструменты для решения подобной
проблемы? Или всё вручную придется делать?
try{
// стартуют потоки
}catch(std::exception исключение)
{
std::cout << "...";
} поток1
{
// при вызове ведет к неопределенному поведению.
// может выполнится может нет
throw std::exception(строка);
} поток2
{
throw std::exception(строка);
}
А как мне в главный поток отрапортовать? о том что произошло исключение в потоке1?
Глобальными переменными?
try
{
// стартуют потоки
поток1;
поток2; // здесь вечный цикл
while(true)
{
... основной поток
}; }catch(std::exception исключение)
{
std::cout << "...";
} поток1
{
try{
..
throw std::exception(строка);
..
}
catch(std::exception исключение)
{ }
} поток2
{
try{
..
throw std::exception(строка);
..
}
catch(std::exception исключение)
{
} }
Ответ
Вы не должны смотреть на исключения, как на проблему, с которой нужно "бороться". Исключения -- ваш друг. Это сигнал об ошибке, которую вы должны обработать.
Функцию, реализующую логику потока, можно обернуть в try/catch, если это соответствует вашим целям. Можно ловить ошибки и в других местах.
Заметьте, что try/catch вокруг запуска потоков не ловит исключения, случившиеся в потоке. Вам нужно завести try/catch в самой главной функции потока. (Спасибо @avp, который подметил это.)
По поводу того, что делать, когда произошло исключение в потоке, ответ такой же, как и на вопрос, что делать если вообще произошло исключение. Вы должны поймать исключение, определить, что за ошибка произошла, и отреагировать соответственно этому. Общего рецепта нету и быть не может. Может быть, надо послать центральной логике программы сигнал о том, что программу надо немедленно завершить. Может быть, надо вывести запись в лог и повторить последнюю операцию. Может быть, надо проинформировать пользователя, и переспросить правильные параметры. Может быть, ошибку можно игнорировать.
Останавливать другие потоки за вас никто не сможет, да и неправильно это -- вдруг поток держит lock или находится в середине критической операции? Если надо, остановите потоки самостоятельно. Заметьте, остановка остальных потоков в ответ на исключение очень редко бывает правильным решением.
";
print_r($objects);
Как удалить объекты, которые имеют одинаковые variant->surname и age? Точнее не удалить, а оставить один из них, т.е. чтобы таких одинаковых элементов не было в массиве.
Ответ
отсортировать с помощью ф-ии usort() и собственной ф-ии, сравнивающей по полям variant->surname и age. Тогда объекты с одинаковыми значениями точно будут подряд;
пробежаться array_filter() и ф-ей, сохраняющей статически предыдущие значения variant->surname и age, с тем, чтобы вернуть true только, если значения изменились.
Upd. для ленивых: работающий пример
До сегодняшнего дня ни разу не писал на чистом javascript'e. Но вот приспичило. У сразу же схлопотал ошибку, а что не так - не пойму.
Есть один файл (index.html):
11
И второй файл (script.js):
(function () {
document.getElementById("qwer").innerHTML='44';
})();
В общем скрипт не работает, отладчик пишет "uncaught typeerror: cannot set property of null"
Что же не так? Ведь элемент с id "qwer" существует.
Ответ
В момент исполнения скрипта, документ еще не загрузился до конца.
Первый вариант.
Вам нужно сделать аналог jquery метода $(document).ready().
Например, вызывать свой метод внутри window.onload = function(){};
Учтите, что таким образом функцию на событие можно навесить только один раз. Если мало - нужно сделать свой кроссбраузерный аналог jquery метода bind.
Есть второй вариант. Переместить вызов скрипта в самый низ документа.
Есть число unsigned __int64 есть ли способ в с/с++ получить из него строку битов?
Ответ
например вот так:
unsigned __int64 num = 100;
char buf[64];
_itoa_s(num, buf, 2);
cout << buf;
или даже так (слегка по-извращенски):
unsigned __int64 num = 100; std::string st = "";
while (num)
{
st.insert(0, num & 1 ? "1" : "0");
num >>= 1;
} cout << st.c_str() << endl;
Как воспроизвести звуковой файл из приложения написанного на JAVA для Android, допустим по нажатию кнопки?
public void onclick(View v)
{
//Проиграть музыку(фанфары)
}
Ответ
button.setOnClickListener(new OnClickListener() {
public void onClick(View view) {
new Thread(){
public void run(){
mp = MediaPlayer.create(Test.this, R.raw.mysound);
mp.start();
}.start();
}
});
Привет всем участникам форума! В прошлый раз я задавал вопрос по поводу генерации пилы с использованием СИ на AVR. Кроме @vanyamelikov мне никто не отвечал, поэтому обращаюсь к Вам! Как же мне сгенерировать синусоиду используя ту же схему, что Вы предложили в прошлом ответе
Заранее спасибо.
Ответ
Никаких сложностей это не должно для Вас сотавлять, если Вы смогли повторить предидущий пример.
Начну поэтапно, и попробую дать более менее развернутый ответ!
1. Собираем следующую схему.
На выше приведенной схеме я расположил три кнопки.
При нажатии на первую Вы увидите полупилообразный сигнал, на вторую вожделенную Вами синусоиду(многие из желания сэкономить ресурсы МК сначала создают таблицу массив с уже рассчитанными величинами для синуса, и далее по очередности вызываю каждое значение, с целью не утруждать МК вычислениями, а некоторые МК не умеют попросту умножать!).
При нажатии на третью кнопку Вы увидите очертания города Нью-Йорк или Сидней.
Так перейдем к программе, она ниже! Если возникнет вопрос что такое PINC.0 - это примитивная обработка прерываний на МК(порт на котором сидит кнопка настроен на вход), так вот при подаче на него 5В то есть лог 1, он сгнализирует нам об этом. Некоторые делают так: PINC.0 == 1, но это в нашем случае ни к чему, так как и так сработает. Программа ниже: #include
#include
#include void main(void) {
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0xFF;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
MCUCSR=0x00;
TIMSK=0x00;
UCSRB=0x00;
ACSR=0x80;
SFIOR=0x00;
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x83;
SPCR=0x00;
TWCR=0x00; while (1) {
int i;
if (PINC.0) {
for(i = 0; i <255; i++) {
PORTB = i;
}
}
else if(PINC.1) {
for(i = 0; i <255; i++) {
PORTB = 127 + 127 * sin(3.14 * i * 0.007843);
}
}
else if(PINC.2) {
for(i = 0; i <255; i++) {
PORTB = 127 + 127 * tan(3.14 * i * 0.007843);
}
}
}
}
И так посмотрим, что же у нас получилось: 1) Полупилообразный сигнал
2) ВОЖДЕЛЕННАЯ СИНУСОИДА
3) Очертания прекрасных городов!
А ниже Вы видите как же он пошагово выстраивает ту или иную кривую!
Необходимо реализовать на C++ такой массив, например размерности 4 (с индексами 0 1 2 3), чтобы в дальнейшем при обращении к несуществующему элементу 4 программа выдавала значение с индексом 0. Как это реализовать с условием ясно — нужно выразить доступ к элементам с помощью формулы. Возможно некорректно поставлен вопрос, но в итоге нужна заготовка программы, которая должна создать двумерный массив, замкнутый по всем концам (как в фигуре Тор), для того, чтобы в дальнейшем реализовать определение покрытий для карты Карно.
Ответ
Для неотрицательных значений: const int SIZE = 4;
int a[SIZE];
for(int i=0;i<15;i++) cout << a[i%SIZE] << " ";
% — остаток от деления, значения 0,1,2,3,0,1,2,3,0,... Для отрицательных значений: ряд чисел которые мы должны преобразовать: -5,-4,-3,-2,-1,0,1,2,3,4,5... Что мы должны получить (для SIZE=4): 3,0,1,2,3,0,1,2,3,0,1... Вышеуказанный способ нам выдаст следующие значения: -1,0,-3,-2,-1,0,1,2,3,0,1... Мы можем ко всем этим значениям прибавить SIZE, и тогда у нас все значения будут положительными, и вторично берем по модулю: for(int i=-5;i<=5;i++)
{
j=( (i%SIZE) + SIZE )%SIZE;
cout << a[j] << " ";
}
Для упрощения понимания кода:
чтобы в коде часто не встречались непонятные формулы, используйте функцию (или макрос), которая будет преобразовывать индексы. Например макрос: #define GetIndex(_index,_size) ( ( (_index%_size) + _size )%_size )
Для двумерного случая: const int X_SIZE = 4;
const int Y_SIZE = 10;
int a[X_SIZE][Y_SIZE];
cin >> x >> y;
cout << a[GetIndex(x,X_SIZE)][GetIndex(y,Y_SIZE)];
Добрый день! Есть такой скрипт, который скрывает форму-блок, а при клике на ссылку показывает её, вопрос в том как сделать показ скрытого блока плавным, чтобы после клика форма-блок плавно разъезжалась, нужно желательно то что есть модифицировать, без привлечения библиотек. Вот то, что есть сейчас:
function toggleInformer()
{
// ищем нужный нам тег информера
var elm = document.getElementById("informer"); // если тег найден, обрабатываем его
if(elm)
{
// меняем видимость элемента на противоположную
if(elm.style.display == "block")
{
elm.style.display = "none";
document.getElementById("button").innerHTML= '+ развернуть ↓';
}
else
{
elm.style.display = "block";
document.getElementById("button").innerHTML= '- спрятать ↑'; } }
}
и html
Понятно, что на аппаратном уровне это достижимо.
Возможно ли сделать это на программном уровне: изменив драйвер системного таймера или вроде того?
Ответ
Ну, если менять исходник ОС (или библиотеки, которую использует эта программа), то запросто.
Только все остальные программы тоже "замедлятся" в 10 раз.
При вставке очередной записи в таблицу, по определенным причинам она может не вставиться (например на колонке стоит ограничение уникальности и данный запрос его нарушает) но тем не менее колонка id в которой установлено свойство AUTO_INCREMENT увеличивается. Можно ли как-то это поведения изменить?
Ответ
Не стоит использовать значения, сгенерированные механизмом AUTO_INCREMENT, для создания неразрывных последовательностей. Его основная задача - создания уникальных значений. Разрывы в последовательностях сгенерированных чисел является штатной ситуацией. Более того, она необходима для целостности базы данных. Например, если у вас есть таблица статей с AUTO_INCREMENT-идентификаторами. Такой идентификатор часто используется в ссылке на статью. Если вы удалите статью, произойдет разрыв последовательности. Заполнять эту последовательность нельзя ни в коем случае, даже если вы убрали все ссылки на нее в пределах базы данных, на старую статью могут быт ссылки из сети Интернет. Поэтому старые статьи будут вести на страницу с новым текстом, что приведет к нарушению целостности данных. Этот пример не совсем в контексте вашего вопроса, однако, создавая механизмы обхода разрывов в AUTO_INCREMENT, вы двигаетесь в сторону нарушения целостности данных. В большой системе отслеживать ошибки будет очень трудно. Для надежности будущей системы, лучше принять AUTO_INCREMENT как есть: разрыв - значит разрыв. Если система вырастет до больших объемов поддерживать ее будет проще и дешевле. Если же вам требуется неразрывная нумерация статей, лучше для этого предусмотреть отдельное поле, не завязанное на механизм AUTO_INCREMENT - у него другие задачи.
Посоветуйте хорошие книги по паттернам, желательно болле обобщенные.
Спасибо
Ответ
Есть еще хорошая книга Р. С. Мартина и М. Мартина
«Принципы, паттерны и методики гибкой разработки на языке C#».
Прекрасная книга. В ней описываются SOLID - основные принципы объектно-ориентированного проектирования, которые лежат во основе многих паттернов (еще есть более старое издание Р.Мартин, "Быстрая разработка программного обеспечения", то же самое, но с примерами на языке Java).
Еще книги по проектированию и паттернам:
Руководство Microsoft по проектированию архитектуры приложений.
Гамма и др. "Приёмы объектно-ориентированного проектирования. Паттерны проектирования".
Гранд М. Шаблоны проектирования в Java
Влиссидес Д. - Применение шаблонов проектирования. Дополн. штрихи
Здесь можно найти описание паттернов тестирования (в контексте TDD):
Кент Бек, "Экстремальное программирование. Разработка через тестирование".
Грэхем Ли, Разработка через тестирование для iOS
Здесь можно почитать про паттерны, наиболее часто используемые в проектировании интерпрайз приложений:
Мартин Фаулер, Архитектура корпоративных программных приложений (книга содержит описание паттернов, которые можно применять при проектировании back-end'а в вебапликациях)
Хоп, Шаблоны интеграции корпоративных приложений
Необходимо изображение отобразить в явно заданном цветовом спектре.
В моем случае иконка полностью черная, а хотелось бы, скажем, получить красную или оранжевую.
Яндекс преимущественно выдавал -webkit-filter, но я так и не понял как его применить в данном случае.
Спасибо!
Ответ
Если кому нужно кроссбраузерное решение, то вот код
.fimg {
position: relative;
/* Нужно, чтобы абсолютно позиционированные дочерние элементы позиционировались относительно края родителя. */
display: inline-block;
}
.fimg img,
.filter {
width: 150px;
height: 150px;
}
.filter {
top: 0px;
left: 0px;
/* Принудительно размещаем фильтр прямо над изображением. */
z-index: 1;
/* Фильтр расположен на один уровень выше изображения. */
position: absolute;
/* Абсолютно позиционированный элемент. Поскольку позиционирование родителя задано как relative, позиция фильтра задаётся относительно края родителя. */
background-color: rgba(254, 128, 128, .29);
/* Первые три числа -- десятичное значение цвета в RGB, четвёртое -- прозрачность, в сотых, от 0 (полностью прозрачен) до 1 (полностью непрозрачен). Запись .29 аналогична 0.29. */
}
Мне надо просто слить репозиторий, без инициализции гита, без истории изменений, без веток. Просто папки и файлы. Как это сделать? Проблема состоит в следующем: если делать git clone, то мы выкачиваем ее и всю историю и по сути инициализируем гит. Если сделать git init, git add remote ..., git pull - тоже инициализируем гит в директории. Других способов я не знаю.
Ответ
Вариант А: мелкое (неглубокое, shallow) клонирование, а затем убрать все .git*. Это клонирует репо без истории:
git clone --depth=1 git@github.com:xxx/yyy.git
Вариант Б: git archive. Это сольёт файлы репо в ZIP'е:
git archive --format zip --remote=git@github.com:xxx/yyy.git HEAD
Я не знаю как правильно сказать, но как сделать свойство, которое было бы не видно внешне, но было бы видно методам установленных через прототип? Вот типа -
var Class = function(){
var _array = []; // приватное или протектед свойство
}; Class.prototype.method = function(){
// как обратиться здесь к _array?
};
Возможно такое сделать из коробки?
Ответ
Средства языка такого, насколько я знаю, не предоставляют. Поэтому javascript-еры договорились, что все свойства которые начинаются со знака нижнего подчеркивания '_' являются приватными. В вашем случае:
var Class = function(){
this._array = []; // приватное или протектед свойство
}; Class.prototype.method = function(){
// как обратиться здесь к _array?
this._array }; var instance = new Class(); instance._array.push('string') // но мы то знаем, что так делать нельзя
Update
Появилась идея. Шифровать имя свойства и делать его enumerable. Костыль:
var prive = function (that, propName, newValue) {
var decodeStr = function (str) {
return Array.prototype.map.call(
str,
function (char, i) {
return String.fromCharCode(str.charCodeAt(i)-5)
}).join('');
},
decodedPropName = decodeStr(propName);
if (arguments.length >= 3) {
// set private property
Object.defineProperty(that, decodedPropName, {
enumerable: false,
writable: true,
value: newValue,
});
} else {
//get private property
return that[decodedPropName];
}
}
Демонстрация
Есть указатель на объект, и он указывает на выделенную память через new. Можно спокойно вызывать для него delete? А если он не указывает на созданный в динамической памяти объект, то delete ошибку выполнения не вызовет? Как проверить, что объект указывает на выделенный участок который можно удалить? Просто если if(object != null) или (object) и потом аж вызывать delete? Или delete и сам может определить, есть ли что-то для удаления или нет?
Ответ
Если указатель указывает на объект, выделенный при помощи new, и для него ещё ни разу не был вызван delete, то вызывать delete можно. Также можно вызывать delete по нулевому указателю (сколько угодно раз).
В любом другом случае — нельзя.
Ответственность за соблюдение этого условия лежит на программисте, ни компилятор, ни runtime-библиотека за вас этого не проверят.
Хуже того, несоблюдение этого условия есть undefined behaviour: программа считается необратимо сломанной, и может вылететь, а может (что гораздо хуже) не вылететь, а работать как будто бы всё в порядке.
Обычно помогает простой принцип: если вы сами выделили объект, вам его и удалять. Если к вам он пришёл со стороны, как правило ответственность за удаление лежит на том, кто его создавал.
Но возможны и исключения, когда вместе с объектом вам передаётся и обязанность его удалить. Смотрите документацию функций, которые вы вызываете.
С другой стороны, в современном C++ работа с «сырыми» указателями происходит довольно редко. Обычно между частями программы передаётся «умный» указатель (например, shared_ptr), при этом проблема снимается, поскольку объект по указателю автоматически удаляется, когда нужно.
Начал писать игру на андроид, уже есть кое-что. Но это кое-что нормально работает только на моём собственном телефоне и на эмуляторе на компе, а на остальных устройствах то одно не работает, то другое. Хотя ничего сложного в игре не используется, и тестил на норм. андроид-телефонах. Подскажите, что делать или как искать в Интернете эту проблему? В Интернете не могу найти почему-то.
UPD: РЕБЯТ!!! Я умею искать ошибки и исправлять их, просто я думал, что можно соблюдать какие-то советы, рекомендации и так далее, чтобы приложение работало без багов на 97% телефонов, а не тестировать (или сделать автоматизацию тестирования) на огромном количестве телефонов, учитывая, что при количестве кода, например, в десятки тысяч строк, этих багов может оказаться крайне много на различных телефонах, которых тоже крайне много!!!
Ответ
чтобы приложение работало без багов на 97% телефонов, а не тестировать
Бог с Вами, сударь!
Без тестирования нельзя, основные ошибки выловишь сам, а тестировать на огромном количестве телефонов будешь по баг-репортам, так все живут.
Есть правила, которые лишь помогают избежать критичных ошибок, но не более.
Это что-то типа "Комментируй правильно код, т.е. юзай JavaDoc или аналоги" и "Избегай конструкции %something%, ибо опасна она и непредсказуема!".
Хочу узнать номер телефона, использую стандартный метод, но возвращает null:
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
Ответ
В интернетах говорят, что это единственный способ. Который работает не всегда. Говорят, что работает только в тех случаях, когда номер телефона записан в сим-карте. Если не записан (например, операторский телефон, который без симки работает, и т. п.) - номер получить не удастся. Буду рад ошибаться...
Или по-другому как перебрать все элементы массива в Javascript? Что-то вроде foreach(array as value)
Ответ
Есть несколько вариантов, в зависимости от ваших задач. Начнём с простого: var a = ["a", "b", "c"];
a.forEach(function(entry) {
console.log(entry);
});
Немного более старомодный вариант: var index;
var a = ["a", "b", "c"];
for (index = 0; index < a.length; ++index) {
console.log(a[index]);
}
Кроме того, есть собственно for-in. Может использоваться, например, для разреженных (sparsed) массивов: Примитивный, но не совсем верный вариант: for (var key in data) {
key;//ключ
data[key];//значение
}
Более правильно: var key;
var a = [];
a[0] = "a";
a[10] = "b";
a[10000] = "c";
for (key in a) {
if (a.hasOwnProperty(key) &&
/^0$|^[1-9]\d*$/.test(key) &&
key <= 4294967294
) {
console.log(a[key]);
}
}
В EcmaScript6 в виде предложения (draft) добавлена ещё конструкция for-of var val;
var a = ["a", "b", "c"];
for (val of a) {
console.log(val);
}
Собственно, по большому счёту, for-of это просто правильный for-in, не требующий дополнительных проверок как в примере выше. Принципиальные же отличия в деталях можно узнать из предложения (англ.). Подробнее:
https://stackoverflow.com/questions/9329446/for-each-over-an-array-in-javascript (англ.) — очень подробный ответ на вопрос с детальным рассмотрением всех возможных вариантов
http://habrahabr.ru/post/247857/ (рус.) — дословный перевод вышеназванного ответа на русский язык
Что предпочесть для вывода длины массива: передать в переменную int x = arr.Lenth, и уже потом сделать strText.Append(x); или обойтись без промежуточных этапов: strText.Append(arr.Lenth);
Проблема, если правильно понимаю, связана с уничтожением объектов сборщиком мусора. В первом случае в памяти останется только переменная х, во-втором - до момента вывода arr.Length массив будет находится в памяти.
Или нет?
Ответ
Вы бы сперва обозначили скоупы, в которых у вас находятся arr и вызов strText.Append()
Предположим, они находятся внутри одно скоупа. Есть один важный постулат о работе сборщика мусора:
Время сборки объектов недетерминировано и зависит от реализации CLR
Этому есть куча причин, в которые для ответа вдаваться не нужно. Главное, что из этого постулата вытекает следующее: все потуги рассудить, какой вариант лучше, в общем-то бесполезны. void Foo()
{
int arr = new int[5];
int x = arr.Length;
// какой-то длинный код
strText.Append(x); // в этом месте память из-под arr еще может быть не освобождена!
}
Десктопная CLR, как правило, убирает объекты еще до выхода из скоупа, как только они становятся не нужны, поэтому теоретически переменная x имеет смысл.
Если переменные arr и вызов strText.Append() находятся в разных скоупах, время между заполнением массива и вызовом метода сильно неопределенное и на момент вызова метода массив уже давно не нужен, тогда сохранение длины массива тоже теоретически имеет смысл. Чуть больший, чем в первом случае :).
Почему теоретически? Во всех рассуждения об оптимизациях нужно руководствоваться только практикой. Как говорил классик: "Преждевременная оптимизация -- корень всех зол". Поэтому подобные вещи стоит принимать во внимание только когда "припрет": приложение начнет потреблять много памяти, процесс начнет много времени проводить в GC и т.д. Вот тогда берем в руки профайлер, смотрим на неоптимальные участки кода и вносим исправления. А до тех пор подобные вопросы имеют чисто теоретическую направленность.
Хочу воспользоваться библиотекой jsoncpp.
Скачал с github, поставил с помощью cmake, как указано в документации.
Только вот не могу ничего скомпилировать.
Пример из документации вылетает с ошибками компиляции: #include Json::Value root; // starts as "null"; will contain the root value after parsing
std::cin >> root; // Get the value of the member of root named 'my-encoding', return 'UTF-32' if there is no
// such member.
std::string my_encoding = root.get("my-encoding", "UTF-32" ).asString(); // Get the value of the member of root named 'my-plug-ins'; return a 'null' value if
// there is no such member.
const Json::Value my_plugins = root["my-plug-ins"];
for ( int index = 0; index < my_plugins.size(); ++index ) // Iterates over the sequence elements.
yourib::loadPlugIn( my_plugins[index].asString() ); yourlib::setIndentLength( root["my-indent"].get("length", 3).asInt() );
yourlib::setIndentUseSpace( root["my-indent"].get("use_space", true).asBool() ); // ...
// At application shutdown to make the new configuration document:
// Since Json::Value has implicit constructor for all value types, it is not
// necessary to explicitly construct the Json::Value object:
root["encoding"] = yourlib::getCurrentEncoding();
root["indent"]["length"] = yourlib::getCurrentIndentLength();
root["indent"]["use_space"] = yourlib::getCurrentIndentUseSpace(); // Make a new JSON document with the new configuration. Preserve original comments.
std::cout << root << " ";
Ошибки: a.cpp:18:4: error: ‘yourib’ has not been declared
yourib::loadPlugIn( my_plugins[index].asString() );
^
a.cpp:20:1: error: ‘yourlib’ has not been declared
yourlib::setIndentLength( root["my-indent"].get("length", 3).asInt() );
^
a.cpp:21:1: error: ‘yourlib’ has not been declared
yourlib::setIndentUseSpace( root["my-indent"].get("use_space", true).asBool() );
^
a.cpp:27:20: error: ‘yourlib’ has not been declared
root["encoding"] = yourlib::getCurrentEncoding();
^
a.cpp:28:28: error: ‘yourlib’ has not been declared
root["indent"]["length"] = yourlib::getCurrentIndentLength();
^
a.cpp:29:31: error: ‘yourlib’ has not been declared
root["indent"]["use_space"] = yourlib::getCurrentIndentUseSpace();
^
Компилятор: MinGW В сети не нашёл детального объяснения использования данной библиотеки.
Прошу, поделитесь опытом: как скомпилировать данный пример? UPDATE Если всё запихнуть в метод и сделать некоторые замены, то количество ошибок вообще зашкаливает: #include
#include int main(){
Json::Value root;
std::cin >> root;
std::string my_encoding = root.get("my-encoding", "UTF-32" ).asString(); const Json::Value my_plugins = root["my-plug-ins"];
root["encoding"] = "cp1251";
//std::cout << root << " ";
return 0;
}
Часть ошибок: /usr/include/c++/4.8/istream:222:7: note: no known conversion for argument 1 from ‘Json::Value’ to ‘long double&’
/usr/include/c++/4.8/istream:235:7: note: std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(void*&) [with _CharT = char; _Traits = std::char_traits; std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream]
operator>>(void*& __p)
^
/usr/include/c++/4.8/istream:235:7: note: no known conversion for argument 1 from ‘Json::Value’ to ‘void*&’
/usr/include/c++/4.8/istream:259:7: note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>::__streambuf_type*) [with _CharT = char; _Traits = std::char_traits; std::basic_istream<_CharT, _Traits>::__streambuf_type = std::basic_streambuf]
operator>>(__streambuf_type* __sb);
^
/usr/include/c++/4.8/istream:259:7: note: no known conversion for argument 1 from ‘Json::Value’ to ‘std::basic_istream::__streambuf_type* {aka std::basic_streambuf*}’
/usr/include/c++/4.8/istream:779:5: note: template std::basic_istream& std::operator>>(std::basic_istream&, signed char*)
operator>>(basic_istream& __in, signed char* __s)
^
/usr/include/c++/4.8/istream:779:5: note: template argument deduction/substitution failed:
a.cpp:6:14: note: cannot convert ‘root’ (type ‘Json::Value’) to type ‘signed char*’
std::cin >> root;
^
In file included from /usr/include/c++/4.8/iostream:40:0,
from a.cpp:2:
/usr/include/c++/4.8/istream:774:5: note: template std::basic_istream& std::operator>>(std::basic_istream&, unsigned char*)
operator>>(basic_istream& __in, unsigned char* __s)
^
/usr/include/c++/4.8/istream:774:5: note: template argument deduction/substitution failed:
a.cpp:6:14: note: cannot convert ‘root’ (type ‘Json::Value’) to type ‘unsigned char*’
std::cin >> root;
^
In file included from /usr/include/c++/4.8/iostream:40:0,
from a.cpp:2:
/usr/include/c++/4.8/istream:732:5: note: template std::basic_istream& std::operator>>(std::basic_istream&, signed char&)
operator>>(basic_istream& __in, signed char& __c)
^
/usr/include/c++/4.8/istream:732:5: note: template argument deduction/substitution failed:
a.cpp:6:14: note: cannot convert ‘root’ (type ‘Json::Value’) to type ‘signed char&’
std::cin >> root;
^
In file included from /usr/include/c++/4.8/iostream:40:0,
from a.cpp:2:
/usr/include/c++/4.8/istream:727:5: note: template std::basic_istream& std::operator>>(std::basic_istream&, unsigned char&)
operator>>(basic_istream& __in, unsigned char& __c)
^
/usr/include/c++/4.8/istream:727:5: note: template argument deduction/substitution failed:
a.cpp:6:14: note: cannot convert ‘root’ (type ‘Json::Value’) to type ‘unsigned char&’
std::cin >> root;
^
In file included from /usr/include/c++/4.8/istream:882:0,
from /usr/include/c++/4.8/iostream:40,
from a.cpp:2:
/usr/include/c++/4.8/bits/istream.tcc:923:5: note: template std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&, _CharT&)
operator>>(basic_istream<_CharT, _Traits>& __in, _CharT& __c)
^
/usr/include/c++/4.8/bits/istream.tcc:923:5: note: template argument deduction/substitution failed:
a.cpp:6:14: note: deduced conflicting types for parameter ‘_CharT’ (‘char’ and ‘Json::Value’)
std::cin >> root;
^
In file included from /usr/include/c++/4.8/istream:882:0,
from /usr/include/c++/4.8/iostream:40,
from a.cpp:2:
/usr/include/c++/4.8/bits/istream.tcc:955:5: note: template std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&, _CharT2*)
operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s)
^
/usr/include/c++/4.8/bits/istream.tcc:955:5: note: template argument deduction/substitution failed:
a.cpp:6:14: note: mismatched types ‘_CharT2*’ and ‘Json::Value’
std::cin >> root;
^
In file included from /usr/include/c++/4.8/string:53:0,
from /usr/include/json/value.h:12,
from a.cpp:1:
/usr/include/c++/4.8/bits/basic_string.tcc:996:5: note: template std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&, std::basic_string<_CharT, _Traits, _Alloc>&)
operator>>(basic_istream<_CharT, _Traits>& __in,
^
/usr/include/c++/4.8/bits/basic_string.tcc:996:5: note: template argument deduction/substitution failed:
a.cpp:6:14: note: ‘Json::Value’ is not derived from ‘std::basic_string<_CharT, _Traits, _Alloc>’
std::cin >> root;
Ответ
Наконец-то удалось заставить работать эту библиотеку. Я пользовался GCC версии 4.8.4 и Python 2.7.6. Нужно скачать библиотеку с официального GitHub репозитория и разархивировать куда-нибудь. Затем в в терминале перейти в получившуюся директорию и запустить: python amalgamate.py
После того, как увидите сообщение Source succesfully amalagated в этой папке появится новая директория dist. Там есть файлы библиотеки, которые нам понадобятся. Содержимое папки dist можно свободно перемещать куда-угодно. Структура у неё следующая : dist
|-- json
| |-- json-forwards.h
| `-- json.h
`-- jsoncpp.cpp
В качестве примера можно использовать этот код: #include
#include int main(){ Json::Value root; // starts as "null"; will contain the root value after parsing root["encoding"] = "UTF-8";
root["indent"]["length"] = "Some text";
root["indent"]["use_space"] = "Some user_space text"; std::cout << root << " ";
return 0;
}
Сохраняем этот код в файл с названием a.cpp (можно любое другое) и кладём его рядом с файлом jsoncpp.cpp. А теперь из командной строки выполняем: g++ a.cpp jsoncpp.cpp -std=c++11
При успешной компиляции никакого вывода в консоль тут быть не должно. После этого выполняем: ./a.out
и видим результат: {
"encoding" : "UTF-8",
"indent" :
{
"length" : "Some text",
"use_space" : "Some user_space text"
}
}
Спасибо большое @VladD за помощь в этом запутанном деле.
Есть строка "612345". HEX-editor преобразует ее в следующий массив: {36 31 32 33 34 35 36}. Я хочу добавить эти значения (т.е. 36,31,...36) в массив байтов: byte[] t = {0x36, 0x31, 0x32 ... 0x36}
только не хардкорно, а программно Я добился того, что в строке уже есть HEX-значения: "36 31 32 33 34 35 36" теперь надо как-то добавить перед каждым "0х" и добавить в массив. Подскажите, как это сделать!
Ответ
Так должно сработать: var s = "36 31 32 33 34 35 36";
var bytes = s.Split(' ').Select(_ => int.Parse(_, NumberStyles.HexNumber));
Создал, наконец, свой первый проект. Начитался кучу информации по защите сайта (sql-инъекции и т.д., и т.п.). Но я понимаю, что в сети не рассматриваются все нюансы по защите, поэтому я создал шуточный клон сайта, залил на сервер и пытаюсь найти дыры в безопасности. Пока безуспешно - стоит строгая проверка на url-адрес, админка скрыта в таинственной папке))) Вопрос очевиден - я хочу понять, есть ли возможность взломать сайт, открыть структуру папок и попасть в админку. Уважаемые программисты, помогите, пожалуйста!
Я прописал в .htaccess вывод любых предупреждений и ошибок, поэтому буду премного благодарен за взлом собственного сайта! Фишка в том, что весь проект написан собственноручно в Коделобстере без использования готовых шаблонов. P.S. Для админ-части аутентификация написана собственноручно, пожалуйста, взломайте и ее. Попыток входа - 3. Сейчас я увеличу до 20. Псевдосайт - http://mars.fh38095o.bget.ru/ P.P.S. Кто действительно заинтересуется и покажет, что невозможно найти ссылку на админку, я скину url в личку.
Ответ
Я не знаю, что такое "коделобстер" но, судя по всему, 'то какая-то платформа для создания уязвимых сайтов. Выкладывать на проверку код со столь хрестоматийной SQL инъекцией должно быть стыдно. Ну и просить протестировать на безопасность игрушечный сайт, в котором всего 5 таблиц (block_pages,category,feedback,simple_pages,temple) и нет практически никакой информации - это как бы смешно. Ты бы еще выложил программу Hello world и попросил ее взломать. Что там ломать? Зачем? Кому нужен этот сайт?
Если бы, скажем, сайт хранил номера кредиток, то они бы уже уплыли, как эти глубокомысленные вопросы из таблицы feedback: alert('hello'); hello
ddddddd dddd ddddddddddd dddddddddddddddd dd dddd ddddddddd ddd dddddddd dd dddddd dddddddddddd ddddddddd ddddddddddd dd dddd dddddddddddd dd ddd ddddddd dddddddddd dddddddddddd ddd dd dddd dddddddd dddd ddddd dddd ddddddd d dddd dddddddd
ра дывал п у дм жчсдялыпыа
adfasdf asadf adf asdf asdf adf
asdfasdfasfdasdfagfsdghsdbcxasdf
Опять же, интерфейса к этой таблице на сайте нет. То есть, в последний момент автор забоялся, и прикрутил вместо нее к сайту Disqus. Очень, очень остроумный способ тестирования. Судя по тому, что в комментариях автор путает XSS с SQL инъекцией (собираясь защищаться от первой с помощью "stmt"), а "скрытая админка" почитается им как верх хитроумия в защите сайта, то ему просто рано выклыдывать что-либо на тестирование. По поводу намека на дыры.
Дело в том, что никакие намеки здесь не нужны.
Все, что тебе нужно знать - это то, что была SQL инъекция. Ну так об этом было сказано безо всяких намеков, открытым текстом. А вот какая конкретно - для защиты знать не нужно, от слова "совсем".
Фишка в том, что для обеспечения защиты про дыры знать не нужно. Защита от атак иррелевантна самим атакам.
Про то что нужно для защиты - написано было во всех учебниках (ну, кроме устаревших): надо, чтобы любые переменные попадали в запрос не напрямую, а через плейсхолдеры. Вот это и надо было делать.
Ты об этом знал (как следует из твоих комментариев, когда ты собрался XSS лечить через "stmt"), но не придавал значения. Вот теперь, после того как ты закрыл эту дыру, надеюсь, будешь придавать. И опять же, сам видишь - чтобы закрыть дыру тебе не понадобилось узнавать, как был произведен взлом. Чтобы строить защиту, надо уметь строить, а не ломать. "Намекать на дыры" бесполезно. Здесь смысл не в том, чтобы залатать одну конкретную, а в том, чтобы все запросы без исключения выполнялись по единому безопасному принципу. И тогда хакер пусть хоть в лепешку разобьётся, но ни одной дыры не найдёт. По поводу XSS.
Ситуация довольно забавная.
Действительно, где-то в недрах сайта режется, почему-то, прямой слеш.
Но, разумеется, это не может помещать, и XSS можно внедрить и без слеша. Но тут уже, увы, на твою защиту встают браузеры, которые научились отфильтровывать такие явные XSS-через-запрос за горе-программистов. Но опять же, надеяться на браузер - это значит гарантированно налететь на инъекцию. Такие вещи надо делать самому. Причем делать, опять же, не "как бог на душу положит", а сис-те-ма-ти-чес-ки! Вот ты вырезал теги в фидбеке и успокоился. А в идентификаторе страницы - нет. А здесь должна быть та же система, что и с SQL инъекциями - не надо сидеть и думать, где знадо защищаться, а где не надо. Защищаться надо везде! В защите от XSS аналогом плейсхолдеров в SQL может являться шаблонизатор с автоискейпингом. То есть, мы можем считать себя в безопасности, если
Любой, абсолютно любой вывод производится только через шаблонизатор.
По умолчанию шаблонизатор форматирует ВСЕ выводимые переменные. И только те, для которых указано явно, что они должны выводиться как есть - выводятся как есть.
Таким шаблонизатором, в частности, является Twig Да, и еще одно замечание. Код or die("Ошибка в запросе $zapros");
это просто подарок взломщику. Скажем, если бы его не было, то я бы просто не взялся ломать - это потребовало бы куда больше времени, а время - деньги.
Судя по всему, ты прямо в коде обращаешься к функциям mysqli. Этого делать тоже не надо, но к безопасности это отношения не имеет, а для практики сойдёт. Но эти свои чудовищные or die() постирай все до единого. Вместо этого перед коннектом к mysql напиши одну строчку, mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
Интересует вопрос подобной реализации, например: есть картинка на html странице, как мне загрузить её в приложение и показать в ImageView? В программировании новичок, может подскажете ресурсы и либы?
Ответ
Хороший пример с наследованием загрузчика картинки от AsyncTask и определением своего метода doInBackground(), взятый с английского SO, который взял его с Android Developers, который уже его убрал. Сам AsyncTask представляет собой реализацию короткого асинхронного запроса для основного GUI потока без необходимости самому ковырятся с потоками. // Показать картинку
new DownloadImageTask((ImageView) findViewById(R.id.imageView1))
.execute("http://java.sogeti.nl/JavaBlog/wp-content/uploads/2009/04/android_icon_256.png");
} public void onClick(View v) {
startActivity(new Intent(this, IndexActivity.class));
finish(); } private class DownloadImageTask extends AsyncTask {
ImageView bmImage; public DownloadImageTask(ImageView bmImage) {
this.bmImage = bmImage;
} protected Bitmap doInBackground(String... urls) {
String urldisplay = urls[0];
Bitmap mIcon11 = null;
try {
InputStream in = new java.net.URL(urldisplay).openStream();
mIcon11 = BitmapFactory.decodeStream(in);
} catch (Exception e) {
Log.e("Ошибка передачи изображения", e.getMessage());
e.printStackTrace();
}
return mIcon11;
} protected void onPostExecute(Bitmap result) {
bmImage.setImageBitmap(result);
}
}
И в манифесте для приложения нужно конечно же разрешить загрузку: Если нужно быстро и без всякой асинхронности, обработки ошибок и.т.д.: URL newurl = new URL(image_location_url);
mIcon_val = BitmapFactory.decodeStream(newurl.openConnection() .getInputStream());
myImageView.setImageBitmap(mIcon_val);
Для совсем ленивых однострочник на Picasso Picasso.with(context).load(myImageURL).into(imageView);
В нижеприведённом коде вторая функция не выполняется, будто бы её там вообще нет. Ума не приложу, в чём дело. Использую Dev-C++ 4.9.9.2. int main()
{
int a;
a=30;
printf("%d
",a);
system("PAUSE");
return a;
} int kek()
{
int b;
b=40;
printf("%d
",b);
system("PAUSE");
return 0;
}
Ответ
Точкой входа в программу является функция main. Она вызывается при запуске вашей программы.
В C функция main без параметров должна быть объявлена как int main( void )
{
//...
}
Из стандарта C (5.1.2.2.1 Program startup): 1 The function called at program startup is named main. The
implementation declares no prototype for this function. It shall be
defined with a return type of int and with no parameters:
int main(void) { /* ... */ }
Все остальные функции получают управление только лишь, если они вызываются в вашей программе. Если вы используете библиотечные функции, то вы должны включить в программу заголовки, где эти функции объявляются. Ваша программа могла бы выглядеть следующим образом: #include
#include int kek(); int main( void )
{
int a;
a=30; printf("%d
",a); kek(); system("PAUSE");
return a;
} int kek()
{
int b;
b=40; printf("%d
Необходимо реализовать пузырьковую сортировку для массива. При этом массив инициализируется с помощью:
пустого конструктора, при вызове которого генерируется массив с random значениями
конструктора, который на вход принимает длину и массив
Метод для генерации рэндом массива: public static int[] arrayCreator() {
int arr[] = new int[5];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) ((Math.random() * 5));
}
return arr;
}
public void arrayPrint(int arr[]) {
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
Пузырьковая сортировка: public void bubbleSort(int arr[]) {
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int t = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = t;
}
}
}
}
Класс и конструтор: public class Starter { private static int arr[]; public static void main(String[] args) {
int array[] = {1, 9, 6, -2, 12};
Starter starter = new Starter();
starter.arrayPrint(arr);
starter.bubbleSort(arr);
System.out.println("Array after sorting: ");
starter.arrayPrint(arr);
} Starter() {
int arr[] = arrayCreator();
} Starter(int length, int array[]) {
int arr[] = array;
}
При создании обьекта starter конструктор не вызывается, массив не инициализуется. Дальше NullPointerException
Ответ
В конструкторах класса вы инициализируете локальные массивы вместо массива - члена класса. Starter() {
int arr[] = arrayCreator();
^^^^^^^^^
} Starter(int length, int array[]) {
int arr[] = array;
^^^^^^^^^
}
Вам надо инициализировать член класса, а не объявлять в конструкторах локальные массивы. Также это плохая идея делать массив статическим членом класса. Каждый объект класса должен иметь свой член класса в виде массива. Кроме того непонятно, почему вы используете магическое число 5 в функции генерации массива со случайными значениями public static int[] arrayCreator() {
int arr[] = new int[5];
^^^^^^^^^^
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) ((Math.random() * 5));
}
return arr;
}
Было бы более логично, если бы в эту функцию передавался аргумент, который указывал бы, какова должна быть размерность массива. Например, public static int[] arrayCreator( int n ) {
int arr[] = new int[n];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) ((Math.random() * 5));
}
return arr;
}
Также если эти функции создания массивов используются только в конструкторах, то лучше объявить их с классом доступа private. Дополнительно можно написать еще одну public функцию типа reset, которая устанавливает новые случайные значения для элементов массива. Также совершенно не ясно, почему не статическая функция член класса arrayPrint имеет параметр тогда, как она должна распечатывать массив своего объекта public void arrayPrint(int arr[]) {
^^^^^^^^^^^^^^^^^^^^^
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
лучше было бы определить ее как public void arrayPrint() {
^^^^^^^^^^^^
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
и соответственно вызывать без аргумента. Обратите внимание, что объявленный в функции main массив int array[] = {1, 9, 6, -2, 12};
нигде не используется. Что касается вашей функции пузырьковой сортировки, то она будет выполнять циклы и проход по всему массиву, даже если массив уже отсортирован. Вы можете посмотреть ответ на аналогичный вопрос, чтобы сделать сортировку более эффективной. Хотя в том вопросе требуется отсортировать массив по убыванию, тем не мене это только сказывается на том, какой оператор логического отношения будет использовать. А в целом показан алгоритм сортировки, уменьшающий число проходов по массиву.
Появился файл с невозможным именем,который стоит не проиндексированным Удалить его невозможно - путь к нему не существующий. Как избавиться от этой аномалии? Cначала старался не обращать внимания, но за несколько дней уже начало раздражать. Подскажите, как разобраться.
Ответ
путь к нему не существующий
я думаю, файл такой всё-таки существует. в каталоге upload и называется он: $ echo "arrow - \320\272\320\276\320\277\320\270\321\217.png" | sed 's/\\/\\\\0/g' | xargs echo -e
arrow - копия.png
файл этот не входит в репозиторий — он untracked (неотслеживаемый), поэтому пытаться применить к нему git rm ... или что-то подобное — бессмысленно. если он вам не нужен, его имеет смысл удалить (программой rm). если у вас проблемы с отображением/вводом в кодировке utf8, можете воспользоваться вот этим советом, только вместо cd воспользуйтесь: сначала ls, а затем, когда убедитесь, что указываете на нужный файл, и rm
совет: пробелы в именах файлов/каталогов для обращения к ним в командной строке надо экранировать обратным слэшем. например: $ rm arrow\ -\ копия.png
дополнение по умолчанию программа git отображает символы юникода в именах файлов в виде quoted string (как в вопросе). отключается такое преобразование изменением конфигурации (вероятно, начиная с версии 1.7.10): $ git config [--global] core.quotepath off
Нужно написать класс AsciiCharSequence, который реализует хранение последовательности ASCII-символов в массиве байт. По сравнению с классом String, хранящим каждый символ как char, AsciiCharSequence будет занимать меньше памяти. Класс AsciiCharSequence должен:
реализовывать интерфейс java.lang.CharSequence
иметь конструктор, принимающий массив байт;
определять методы length(), charAt(), subSequence() и toString()
Ну вот я почти написал: public class AsciiCharSequence implements CharSequence { byte[] a1; public AsciiCharSequence(byte[] a){ //Конструктор класса
a = this.a1;
} @Override
public String toString() { //Переопределение toString()
return "AsciiCharSequence{" +
"a1=" + Arrays.toString(a1) +
'}';
} @Override
public int length(){
return a1.length;
}; //Переопределение length() @Override
public char charAt(int index){ //Переопределение charAt()
char t000 = (char)a1[index];
return t000;
} @Override
public CharSequence subSequence(int start, int end){ //Переопределение subSequence()
CharSequence buf[] = new CharSequence[end - start]; for(int i=start; i<=end;i++)
{
byte t = a1[i-start];
buf[i]=(CharSequence)t;
}
return buf[end -start];
}
}
Самый проблемный участок = Переопределение subSequence(). Это последние 12 строчек с конца. Проблема такая: я никак не могу написать код, чтобы метод возвращал корректный тип (CharSequence?). Если алгоритм формирования массива более-менее понятен, то преобразование массива byte[] в CharSequence совсем не ясен. Сам метод должен применяться на массив символов и возвращать массив символов с индексами лежащими от start до end. К примеру, String s0 = "Вова и Дима козлы";
s0.subSequence(14,16)
Должен возвращать "злы".
Ответ
Можно переписать класс в таком виде: public class AsciiCharSequence implements CharSequence {
private byte[] data; public AsciiCharSequence(byte[] data) {
this.data = data;
} @Override
public int length() {
return data.length;
} @Override
public char charAt(int index) {
return (char) (data[index] & 0xff);
} @Override
public CharSequence subSequence(int start, int end) {
int length = end - start;
byte[] bytes = new byte[length];
for (int i = 0, j = start; i < length; i++, j++) {
bytes[i] = data[j];
}
return new AsciiCharSequence(bytes);
} @Override
public String toString() {
return new String(data);
}
}
Дернуто с гитхаба.
Автор - Михаил Валейко.
Читаю учебник. Понятно что без скобок - это запись в определенный регистр, а со скобками? Пример кода: MOV DX, 0Ah
MOV DX, [0Ah]
MOV DX, BX
MOV DX, [BX]
MOV [BX], DX
MOV BX, DX
Ответ
Как я понимаю, данная команда MOV DX, 0Ah
заносит непосредственное значение 0Ah в регистр DX В то время как данная команда MOV DX, [0Ah]
заносит в регистр DX значение, хранящееся со смещением 0Ah в сегменте данных, адресуемым регистром DS. То есть загружает в регистр DX значение, хранящееся по адресу DS:0Ah То же самое верно и для этих команд MOV DX, BX
MOV DX, [BX]
В первой команде MOV DX, BX
значение из регистра BX загружается в регистр DX В то время как во второй команде MOV DX, [BX]
значение хранящееся по адресу DS:BX загружается в регистр DX
Есть простой класс: public class Person {
private int age;
private String name; public Person(int age, String name) {
this.age = age;
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public String toString() {
return "Person [age=" + age + ", name=" + name + "]";
} }
Есть еще один класс: public class Item {
private K key;
private P person;
public Item(K key, P person) {
this.key = key;
this.person = person;
}
public K getKey() {
return key;
}
public void setKey(K key) {
this.key = key;
}
public P getPerson() {
return person;
}
public void setPerson(P person) {
this.person = person;
}
@Override
public String toString() {
return "Item [key=" + key + ", person=" + person + "]";
}
}
ГДЕ ПРАВДА??? И сама реализация классов: public class Main {
public static void main(String[] args) { Set> set = new HashSet>(); set.add(new Item(1, new Person(23, "gogo")));
set.add(new Item(2, new Person(42, "niko")));
set.add(new Item(3, new Person(32, "toto"))); Iterator> iter = set.iterator(); while (iter.hasNext()) {
System.out.println(iter.next()); } Map map = new HashMap(); map.put(1, new Person(12, "anton"));
map.put(2, new Person(42, "valera"));
map.put(3, new Person(41, "vova")); Iterator iter1 = map.entrySet().iterator(); while (iter1.hasNext()) {
System.out.println(iter1.next());
} }
}
Ответ
Это принципиально разные структуры данных и используются они для разных целей. Set - это множество, то самое математическое множество. И соответственно использовать его надо как множество, т.е. хранить набор уникальных элементов. Map - это ассоциированный массив, который хранит пары ключ-значение, где ключ должен быть уникальным, а значение нет. Соответственно выбор правильной структуры надо делать на основе того какие действия над этими данными вы собираетесь делать. Если только хранить набор уникальных значений и проверять, что такое значение уже есть в структуре данных, то это Set. Если вам необходимо периодически искать значение по ключу(например по ИД), то это Map Если же вам надо хранить просто список объектов и периодически проходить по всем элементам этого списка(как в ваших примерах), то надо использовать List Относительно вопроса о временах операций, есть такие замечательные ссылки, где все хорошо описано для Java: https://github.com/benblack86/java-snippets/blob/master/resources/java_collections.pdf для Абстракций: http://bigocheatsheet.com/ Все они приведены в терминах Big-O нотаций, что это в принципе такое, можно почитать тут
Встретился такой код: function res(a, b, t, c){
if(a.length == 0 && b.length == 0 && !c)
return t;
var l = parseInt(a.pop() || '0') + parseInt(b.pop() || '0') + (c || 0);
return res(a, b, l + (t || ""), l > 9? 1:0);
} function add(a, b) {
return res(a.toString().split(""), b.toString().split(""), "").toString();
}
Судя по всему, код реализует сложение «длинных» целых (функция res() – вспомогательная). Но, похоже, делает это с ошибками. Например, для add(5,5) результат 110, вместо ожидаемого 10, хотя для add(2,3) получается правильный: 5 Я не могу понять, как этот код работает, и где может быть ошибка. Объясните, пожалуйста, доступно.
Ответ
Здесь происходит поразрядное сложение. Таким способом можно складывать как угодно большие числа, не только ограниченные максимально допустимым значением, для js это 1.79E+308, поэтому это называется длинной арифметикой. Поскольку обыкновенные числа ограничены, результат выдаётся в виде строки. Для начала рассмотрим функцию add function add(a, b) {
return res(a.toString().split(""), b.toString().split(""), "").toString();
}
Предположительно она принимает числа, но может принимать и строку с цифрами. В ней происходит вот что. Сначала, если a не было строкой, оно превращается в строку. Затем при помощи функции split разбивается на массив из отдельных цифр. То же происходит со вторым слагаемым — b. Затем вызывается функция res, которая и будет вычислять наш ответ. Поскольку число может быть как угодно длинное, то ответ мы будем собирать по одной цифре, в виде строки. Начальное значение строки-ответа "", на каждом рекурсивном вызове res мы будем вычислять по одной цифре. Дальше вызывается функция res с начальными параметрами, запускает рекурсию. Теперь по функции res: данная функция как раз и производит сложение. Практически обыкновенное, привычное школьное сложение в столбик.
Если немного переименовать параметры: function res(a, b, result, carry) {
У нас слагаемые a и b, промежуточный результат в result, перенос из предыдущего разряда в carry Если и левое, и правое слагаемое пустое, и нет переноса, то результат готов, его и возвращаем. if(a.length == 0 && b.length == 0 && !carry)
return result;
Вынесем сложные выражения в локальную переменную для простоты. Мы собираемся получить младшую цифру каждого из слагаемых, и убрать эту цифру из дальнейшего рассмотрения. Для этого мы пользуемся функцией pop, которая убирает последний элемент массива, отдаёт нам его. var left = parseInt(a.pop() || '0', 10);
var right = parseInt(b.pop() || '0',10);
То есть, для массива ['9', '8', '7'] функция pop() вернёт '7', а от массива останется лишь ['9', '8'] Если массив на самом деле был пустой, функция вернёт undefined. Тут-то нам и пригодится трюк с || '0': если результат был цифрой, она при этом не испортится, а вот undefined превратится в '0'! Полученную цифру-строку мы превратили в число при помощи parseInt Дальше мы складываем левую и правую цифры, и не забываем добавить перенос: var l = left + right + (carry || 0);
Если перенос не указан, при помощи того же трюка превращаем его в 0 Осталось вызвать функцию рекурсивно, чтобы она провела ту же операцию со старшими разрядами. Только нужно пересчитать новый перенос: return res(a, b, l + (result || ""), l > 9? 1:0);
}
Но, как правильно заметил @Ni55aN, данная функция не всегда корректно работает. Нужно немного изменить ее.
Добавить основание, например 10. Дело в том, что мы складываем по одной цифре. Но мы можем, по идее, и складывать большими кусками. Это была бы оптимизация.
Затем, у нас баг: мы к результату добавляем часть, не «откусив» от неё перенесённый старший разряд. Это неправильно, надо убирать лишнее.
Для случая двух слагаемых перенос не больше 1, но если мы захотим обобщить код на случай большего числа слагаемых, точное значение нужно будет вычислять.
Напишем точное вычисление «на вырост». function res(a, b, result, carry, base) {
if(a.length == 0 && b.length == 0 && !carry)
return result; //берем младшие разряды
var left = parseInt(a.pop() || '0', 10);
var right = parseInt(b.pop() || '0', 10); //складываем и добавляем перебор с прошлой итерации
var l = left + right + (carry || 0); //вызываем для следующих разрядов, правильно вычисляя добавленную цифру и цифру переноса
return res(a, b, l % base + (result || ""), Math.floor(l/base), base);
} function add(a, b) {
return res(a.toString().split(""), b.toString().split(""), "","",10).toString();
}
Ещё одна мелочь: мы накапливаем результат в параметре, чтобы можно было вызвать функцию рекурсивно в конце самой функции. Это так называемая хвостовая рекурсия, её многие компиляторы умеют эффективно обрабатывать, не занимая стек. Пример:
$(function() {
$('#left,#right').change(function(){
var left = $('#left').val().trim();
var right = $('#right').val().trim();
console.log(left,right,isNaN(left),isNaN(right));
if(isNaN(left) || isNaN(right)) return;
$('#sum').html(add(left,right));
});
function res(a, b, result, carry, base) {
if (a.length == 0 && b.length == 0 && !carry)
return result;
//берем младшие разряды
var left = parseInt(a.pop() || '0', 10);
var right = parseInt(b.pop() || '0', 10);
//складываем и добавляем перебор с прошлой итерации
var l = left + right + (carry || 0);
//вызываем для следующих разрядов
return res(a, b, l % base + (result || ""), Math.floor(l / base), base);
}
function add(a, b) {
return res(a.toString().split(""), b.toString().split(""), "", "", 10).toString();
}
});
left:
right:
sum:
Довольно часто в коде можно увидеть строки типа char cdigit = '8';
int idigit = cdigit - '0';
Реже, но также встречается char letter = 'd';
int letter_number = letter - 'a';
Открываем Страуструпа "Язык прогрммирования С++" специальное издание, "Бином-Пресс", 2008. Цитата (стр 110):
Небезопасно считать, ... что символы алфавита непрерывны (в стандарте EBCDIC между i и j имеется разрыв)
У Кернигана и Ритчи вышеприведенный код (по крайней мере по цифрам) встречается регулярно. Собственно вопрос по цифрам: обязательно ли корректен код idigit = cdigit - '0'?
Ответ
В стандарте C++ §2.3/4 гласит:
In both the source and execution basic character sets, the value of each character after 0 in the above list of decimal digits shall be one greater than the value of the previous.
то есть
В обоих наборе символов исходного текста и времени выполнения, значение каждого символа после 0 в приведённом выше списку десятичных цифр должно быть на единицу больше предыдущего.
(перевод мой). Приведённый в §2.3/1 набор цифр таков:
0 1 2 3 4 5 6 7 8 9
Это гарантирует последовательность значений кодов цифр.
В MS SQL есть инструмент генерации скриптов базы (правый клик на базе, затем Tasks -> Generate Scripts -> all tables + в настройках advanced заменить Types of data to script с Schema only на Data only). Я пользуюсь этим инструментом, чтобы сделать резервную копию базы с продакшн сервера: это appharbor, я не могу сделать бекап локально и забрать файл с сервера. А можно ли запускать этот инструмент автоматически, программным способом, например из c#? Хочу перейти к регулярным резервным копиям по расписанию, а не делать изредка по настроению копии "на всякий случай". На сервере стоит SQL Server 2008 R2.
Ответ
Генерация скрипта - не самый удобный вариант для экспорта базы вместе с данными. Есть утилита sqlpackage, которая позволяет экспортировать/импортировать базу в формате bacpac. Это стандартный способ для импорта/экспорта баз для Azure SQL, где нет прямого доступа к серверу: sqlpackage.exe /Action:Export /ssn:tcp:.database.windows.net,1433 /sdn: /su: /sp: /tf: /p:Storage=File
Соответствующие пункты в контекстном меню в SMSS - Import / Export Data Tier Application. Для импорта используется bulk insert, что в разы быстрее простой построчной вставки.
Никак немогу заставить скрипт добавлять переменную окружения в Ubuntu. #!/bin/bash if [ "$(lsmod | grep nouveau)" > /dev/null ]
then
export QT_XCB_FORCE_SOFTWARE_OPENGL=1
echo "test" fi
Если вручную писать в терминале export QT_XCB_FORCE_SOFTWARE_OPENGL=1
все работает как нужно, и от юзера и от рута. Но скрипт не добавляет переменную даже при ручном запуске, вывод env
не содержит нужную переменную. Пробовал делать: export QT_XCB_FORCE_SOFTWARE_OPENGL="1"
Но ничего не меняется. Права на скрипт 777.
Жестко добавить в /etc/environment не могу в силу определенных причин, так как сборка конфигурируется под разное железо и если использовать переменную export QT_XCB_FORCE_SOFTWARE_OPENGL там где не используются драйверы nouveau то софт приложение будет падать.
Ответ
Дело в том, что bash создает а при выходе из скрипта уничтожает копию environment
запустите . вашскрит.sh и все получится.
PS: здесь похожий вопрос