Страницы

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

пятница, 16 ноября 2018 г.

Как своему приложению android дать возможность переноситься на SD-карту?

Не секрет, что некоторые приложения можно переносить на карту памяти, а некоторые нет. Проверив свои программы, я обнаружил, что они не имеют такой возможности. Что нужно сделать что бы она появилась?


Ответ

Нужно в манифесте указать значение android:installLocation
...
доступные варианты : auto- на усмотрение системы internalOnly - только во внутренюю память preferExternal - по возможности на SD-карту
подробнее смотрите офф.справку

Что лучше использовать для парсинга XAML?

Недавно прочел, что для парсинга html не рекомендуют использовать регулярные выражения, так как есть специальная библиотека. Ну и вот вопрос: есть ли что-то лучше регулярных выражений для парсинга XAML? Дополнительная информация:
Пишу на языке C# Желательно чтобы инструмент работал со строкой, а не с файлом. Цель: поиск повторяющейся разметки, сокращение ее объема и перестановка атрибутов.


Ответ

Если вам нужно детальное управление синтаксисом, то используйте парсеры XML: новый System.Xml.Linq.XDocument, старый System.Xml.XmlDocument
XAML — надмножество XML вместе со всеми пронстранствами и имён и прочим, поэтому любой парсер XML справится с XAML. Учтите, что в этом случае вы получите markup extension в виде простой строчки, а маппингом типов придётся заниматься вручную, если он вам понадобится. Если вам нужно глубокое понимание структуры (вместе с markup extension, маппингом на реальные типы и прочими надстройками XAML над базовым XML), то используйте парсер XAML: System.Xaml.XamlServices
Вы потеряете контроль над синтаксисом (если вы сериализуете не исключительно ваши классы), но у вас будет полностью распарсенное в объекты дерево, которое можно модифицировать и впоследствии сериализовать.
Если вам нужна кросс-платформенность, то учтите, что парсер XAML в Mono не поддерживает все возможности (читать: ущербен до невозможности и абсолютно бесполезен), а на разных виндовых платформах свои отдельные парсеры диалектов XAML (читать: парсить можно только XAML родом из родной платформы). При этом в CoreCLR парсер XAML тоже, вроде, не намечается.

Tomcat долго запускается (17 минут)

Арендовал VPS, Ubuntu 14.04, установил туда Tomcat 8. В первый раз запустился нормально. Ура. Выключил. Включил. Не отвечает на запросы. Мучился довольно долго, в итоге просто написал
/opt/tomcat/bin/catalina.sh run
и стал дальше сёрфить инет. Спустя 17 минут он заработал! Я получил вот такой вывод в консоли: http://pastebin.com/WHZv9ssy
Как видно шаг
01-May-2015 22:13:02.183 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /opt/tomcat/webapps/ROOT
длился 17 минут! Что это может быть такое? В какую сторону копать?
Дополнение: Судя по статистике сервера, в это время не было повышенной нагрузки на процессор, занятой оперативки было 170 из 1024 мб, никаких дисковых операций не совершалось.


Ответ

Собственно, нашёл решение. Нужно заменить в файле
$JAVA_PATH/jre/lib/security/java.security
строку
securerandom.source=file:/dev/urandom
на строку
securerandom.source=file:/dev/./urandom
Оригинал ответа тут: https://stackoverflow.com/questions/26431922/tomcat7-starts-too-late-on-ubuntu-14-04-x64-digitalocean

Получить результат из функции в Bash

Есть функция main, которая обращается за результатом к функции Checker. При выполнении скрипта, никаких сообщений из Cheker не выводится и не пишется "Все ОК", хотя файлы существуют и имеют права на чтение. Что я делаю не так?
#!/bin/bash file1="$1" file2="$2" main() { if [ "$(checker)" == "true" ] then echo "Все ОК" fi } checker() { flag="" if [ -f "$file1" ] && [ -f "$file2" ] then echo "Файлы существуют" if [ -r "$file1" ] && [ -r "$file2" ] then echo "Файлы могут быть прочитаны" flag="true" else echo "Один из файлов не может быть прочитан" flag= "false" fi
else echo "Один из файлов не существует" flag="false" fi
echo "$flag"
} main


Ответ

Из двух функций сделайте одну с проверкой по $flag Откройте для себя return [N] вместо flag

Ломаются цвета в консоли при работе с git

Почему-то при работе с git в *nix-like консоли ломаются цвета: весь текст выводится дефолтным цветом, а строки, которые должны быть цветными, оказываются обрамлены кодами цветов:
ESC[33mcommit 53f26c1fa4dc4f66df6a0fd01677bb3f7d1da12dESC[m
При этом цветной вывод ls --color, например, работает нормально.
Проблема воспроизводится в некоторых дистрибутивах Linux и во FreeBSD. Как быть?


Ответ

Причина проблемы в том, что вывод git отображается посредством системной утилиты less, которая по умолчанию не умеет работать с ANSI-последовательностями, обозначающими границы цветного выделения текста в консоли (точнее, посредством того, что находится в переменной окружения $PAGER).
Чтобы less отображал цветные строки, нужно добавить к его вызову ключ -R
-R or --RAW-CONTROL-CHARS Like -r, but only ANSI "color" escape sequences are output in "raw" form. Unlike -r, the screen appearance is maintained correctly in most cases. ANSI "color" escape sequences are sequences of the form:
ESC [ ... m
where the "..." is zero or more color specification characters
Данный флаг можно добавлять непосредственно к вызову less или в содержимое переменной окружения $LESS. Во втором случае $PAGER останется неизменным, но искомый эффект будет достигнут, так как less считает из окружения "свою" переменную $LESS и добавит к себе флаг -R прозрачно.
Итого, проблему можно решить следующими способами:
Либо передавать нужный флаг через окружение каждый раз непосредственно перед вызовом git
$ LESS=-R git log
Данный метод - наименее "инвазивный" и ничего не меняет в настройках git и системы. Либо объявив флаг для less в общесистемное окружение через глобальный конфиг вашего shell-а: например, в случае bash, внеся следующую строчку в ~/.bash_profile
export LESS=-R Либо отказаться от использования git-ом общесистемного $PAGER, прописав вызов less в явном виде в конфиг git-а:
$ git config --global core.pager "less -R"
Этот метод позволяет не беспокоиться о том, что при изменении системных настроек изменится поведение git. Впрочем, можно и глобально переопределить $PAGER, снабдив вызов less произвольным набором флагов (см. man less): например, в случае bash, внеся следующую строчку в ~/.bash_profile
export PAGER='env LESS_IS_MORE=1 less -FRX'
Этот метод затронет вывод не только git, но и многих других "длинных" команд, например того же man

Не работают label при динамическом добавлении input?

Почему-то не работают элементы label, добавляемые вместе с инпутами динамически (пробовал для инпутов типа radio и checkbox). При этом итоговая разметка аналогична разметке в "статическом" варианте (когда элементы сразу прописаны в HTML), но в статическом варианте всё работает (label кликабельны, и при клике на них выбирается соответствующий инпут).
Проблема наблюдается в Opera 11, в Firefox 38, Chrome 37.
Пытался не использовать при добавлении элементов innerHTML, работая с методами DOM - не помогло.
При правке через отладчик, допустим, атрибутов name, ничего не изменяется. При этом в "статическом" варианте всё работает даже если поменять через отладчик тип элементов с checkbox на radio, и сменить имена (сделав имя единым, чтобы связать радиопереключатели в группу). Что я делаю не правильно?
P.S. Атрибут for, разумеется, указан в обоих случаях. В JS использовал свойство htmlFor во втором варианте.
UPD: исходный код
function selectQuestion(index) {
// Удаление старого содержимого...
for (var i = 0; i < questions[index].answers.length; i++) { var ans = document.createElement('div') ans.className = 'answer' var str = questions[i].multiple == '1' ? 'ans' + (i+1) : 'ans' ans.innerHTML = '' ans.innerHTML += '' document.getElementById('question_answers').appendChild(ans) } var answer = questions[index].selected if (answer != '') { var a = document.getElementById('question_answers').getElementsByTagName('input') for (var i = 0; i < questions[index].answers.length; i++) { if (answer.charAt(i) < a.length) a[parseInt(answer.charAt(i))-1].checked = true } } }
UPD2: HTML код (при котором label не работают)


Ответ

Согласно W3Schools, атрибуту for в качестве значения нужно передавать идентификатор (id) элемента.
Пример того, что даже в статичном варианте это не работает с name (браузер - Opera 30.0):

А вариант с id работает:

Упрощенный (для теста) JS-код для проверки работоспособности динамически добавленных


Почему не работает git clone при подключении к репозиторию по putty?

Сервер с centos подключается к репозиторию bitbucket по ssh-rsa ключам. Если это делать непосредственно под root'ом на этой машине, то git clone проходит успешно. Если подключиться к машине по putty и попробовать склонировать репозиторий под рутом, появляется сообщение об отказе в правах. Почему так происходит? Как сгенерировать ключи, по которым можно будет работать с гитом под putty?
Permission denied (publickey). fatal: Could not read from remote repository.
Please make sure you have the correct access rights and the repository exists.


Ответ

ни в коем случае не надо «работать под root-ом». подключаетесь к машине вы, надеюсь, под именем «рядового» пользователя, вот от его имени и надо работать, получая root-овые привилегии лишь для выполнения административных задач. git clone и тому подобные команды оперируют приватным ключом (в вашем случае — из файла id_rsa), хранящимся в каталоге .ssh/ в домашнем каталоге пользователя, от имени которого выполняется команда. для пользователя root это обычно каталог /root/.ssh/. для «рядового» пользователя это обычно /home/пользователь/.ssh/ вам надо скопировать файл (в вашем случае /root/.ssh/id_rsa) в каталог «рядового» пользователя /home/пользователь/.ssh/. если такого каталога нет, создайте его (от имени пользователя). если каталог уже существует, эта команда не сделают ничего:
$ mkdir -p ~/.ssh
если такой каталог уже существовал и в нём уже были файлы id_rsa и id_rsa.pub, на всякий случай переименуйте их (вдруг они нужны для доступа куда-нибудь ещё):
$ mv ~/.ssh/id_rsa{,.backup}; mv ~/.ssh/id_rsa.pub{,.backup}
теперь копируем файлы и изменяем их владельца (операция осуществляется от имени root-а, ведь у «рядовых» пользователей нет доступа к его домашнему каталогу):
# cp /root/.ssh/id_rsa{,.pub} /home/пользователь/.ssh/ # chown -R пользователь /home/пользователь/.ssh/
дальше (уже от имени пользователя) сто́ит [пере]установить права на каталог и его содержимое:
$ chmod -R u+w,go= ~/.ssh если проделанные операции не помогли, и при выполнении git clone от имени пользователя (при подключении с помощью putty) возникает та же самая ошибка, в первую очередь проверьте значение переменной окружения HOME
$ echo $HOME
она должна содержать домашний каталог пользователя (обычно: /home/пользователь). именно на значение этой переменной и «опираются» программы (тот же git) при поиске файлов: если в этой переменной хранится что-то отличное от домашнего каталога, то, например, каталог .ssh (и файлы в нём) будут разыскиваться совсем не там, где следует.
дополнение по поводу использования нестандартного имени (или местоположения) файла с секретным ключом.
например, файл с секретным ключом называется ~/.ssh/id_rsa.vtoroj. тогда для использования именно этого ключа при подключении к серверу bitbucket.org можно добавить в конец файла ~/.ssh/config такие строки:
host bitbucket.org identityfile ~/.ssh/id_rsa.vtoroj

RecyclerView Adapter отображение элементов при быстром скролинге

У меня такая проблема: при быстром скролинге данные клонируются с одних элементов в другие. Извините за большие картинки. На первом фото есть первый элемент с текстом "Новый ПРАЙС!!". Как видите, в нем нет картинки.

На втором фото, есть элемент с картинкой игры нхл15

Но при быстрой прокрутке списке вниз а потом вверх в первом(в текущем случае в первом, а в общем каждый раз куда попадет) элементе появляется картинка со второго фото

Для отображение данных в RecyclerView я использую RecyclerView.Adapter
Код адаптера
public class PostAdapter extends RecyclerView.Adapter {
private RecyclerView listView; VKList posts; Context context;
PostAdapter(VKList p , Context context){ this.posts = p; this.context = context; mInflater = LayoutInflater.from(context); }
private LayoutInflater mInflater; public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = mInflater.inflate(R.layout.simple_list_item_1, viewGroup, false); ViewHolder h = new ViewHolder(v); return h; }
public void onBindViewHolder(final ViewHolder h, final int i) { final VKApiPost post = this.posts.get(i);
h.id.setText("#" + Integer.toString(post.id));
h.date.setText(new SimpleDateFormat("d MMM yyyy 'в' HH:mm", new Locale("ru")) .format(new Date(post.date * 1000L)));
if (post.text != "") { h.content.setVisibility(View.VISIBLE); h.content.setText(post.text); }else{ h.content.setVisibility(View.GONE); }
h.likeCount.setOnClickListener(new View.OnClickListener() { private boolean stateChanged;
public void onClick(View view) { if (stateChanged) { // reset background to default; h.likeCount.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_post_btn_like_up, 0); h.likeCount.setTextColor(Color.DKGRAY); } else { h.likeCount.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_post_btn_like_selected, 0); h.likeCount.setTextColor(Color.BLUE); } stateChanged = !stateChanged; } });
h.comment.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) { Intent commentActivity = new Intent(context, CommentsActivity.class); commentActivity.putExtra("post", post); context.startActivity(commentActivity); } });
if(!post.user_likes) { h.likeCount.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_post_btn_like_up, 0); h.likeCount.setTextColor(Color.DKGRAY); } else { h.likeCount.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_post_btn_like_selected, 0); h.likeCount.setTextColor(Color.BLUE); }
if(post.likes_count == 0) h.likeCount.setText(""); else { h.likeCount.setText(post.likes_count + " "); }
for(int j = 0; j < post.attachments.size(); j++){
VKAttachments.VKApiAttachment att = post.attachments.get(j); String type = att.getType(); if(type == "audio") {
} else if(type == "doc"){ try { h.docLayout.setVisibility(View.VISIBLE);
VKApiDocument doc = (VKApiDocument) att;
h.docName.setText(doc.title); if (doc.size % 1024 != 0) { h.docInfo.setText("Документ " + Long.toString(doc.size / 1024 + 1) + " кб"); } else { h.docInfo.setText("Документ " + Long.toString(doc.size / 1024) + " кб"); } } catch (Exception e){
} } else if(type == "photo"){ VKApiPhoto photo = (VKApiPhoto)att; h.photo.setVisibility(View.VISIBLE);
Picasso.with(this.context).load(photo.photo_604).into(h.photo); } } }
@Override public int getItemCount() { return this.posts.size(); }
@Override public void onAttachedToRecyclerView(RecyclerView recyclerView) { super.onAttachedToRecyclerView(recyclerView); }
static class ViewHolder extends RecyclerView.ViewHolder{ TextView id; TextView date; TextView content; ResizableImageView photo; CardView cv; RecyclerView audios;
TextView likeCount;
TextView docName; TextView docInfo; LinearLayout docLayout;
Button comment;
ViewHolder(View itemView){ super(itemView); cv = (CardView)itemView.findViewById(R.id.cv); id = (TextView)itemView.findViewById(R.id.postId); content = (TextView)itemView.findViewById(R.id.postContent); photo = (ResizableImageView)itemView.findViewById(R.id.postImage); date = (TextView)itemView.findViewById(R.id.postDate); audios = (RecyclerView) itemView.findViewById(R.id.postAudioList); comment = (Button) itemView.findViewById(R.id.btnComment); likeCount = (TextView) itemView.findViewById(R.id.likeCount);
docLayout = (LinearLayout) itemView.findViewById(R.id.HLRelativeLayout1); docName = (TextView) itemView.findViewById(R.id.docs_item_title); docInfo = (TextView) itemView.findViewById(R.id.docs_item_info); } } }
Может кто то сталкивался с данной проблемой?


Ответ

При прокрутке вниз создаются новые вьюхи, выполняется onCreateViewHolder() и onBindViewHolder(). Ушедшие при скролле за экран вьюхи не уничтожаются, а перемещаются в пул объектов RecycledViewPool. Затем, при скролле вверх, либо при дальнейшем скролле вниз, новые вьюхи уже не создаются, а используются ранее освобожденные. Вьюха берётся из RecycledViewPool и вызывается только onBindViewHolder(). В вашем onBindViewHolder() в некоторых случаях не инициализируется h.photo, поэтому там показывается старое значение.
В onBindViewHolder() нужно всегда полностью инициализировать все элементы, которые могут изменяться. Т.е. нужно добавить h.photo.setVisibility(View.GONE) куда-нибудь в начало onBindViewHolder(), либо дальше в условиях.

Оператор case не работает с большими числами?

Я определяю типы графических файлов по их заголовкам, например:
var stream : TFileStream; buff : int64; … stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyRead); stream.Read(buff, sizeof(buff)); stream.Free; case (buff and $FFFFFFFF) of $E0FFD8FF : result := 'JPEG IMAGE'; $E2FFD8FF : result := 'JPEG CANNON EOS JPEG FILE'; …
Используя http://www.filesignatures.net/index.php?page=all&order=EXT&alpha=P Но когда я подставляю сигнатуру для «*.*png» - $0A1A0A0D474E5089 (в 8 байт) в case
case buff of $0A1A0A0D474E5089 : result := 'PNG'; end
у меня ошибка:
Constant expression violates subrange bounds
Как быть в этом случае?


Ответ

Как сказано в документации, ограничение 32 бита: http://docwiki.embarcadero.com/RADStudio/XE3/en/Declarations_and_Statements#Case_Statements
any expression of an ordinal type smaller than 32 bits (string types and ordinals larger than 32 bits are invalid)
Выход - делать приведение к 32 битам или писать в блоке else
case (buff and $FFFFFFFF) of $E0FFD8FF: Result := 'JPEG IMAGE'; $E2FFD8FF: Result := 'JPEG CANNON EOS JPEG FILE'; $474E5089: if buff shr 32 = $0A1A0A0D then Result := 'PNG'; // <-- вариант номер 1 else if buff = $0A1A0A0D474E5089 then // <-- вариант номер 2 Result := 'PNG'; end;

Как написать программу без libc?

Вот хочу написать программу которая просто запустится и завершится без ошибки сегментации.
Если я просто пишу функцию int _start() { return 0;} то получаю ошибку сегментации, насколько я понял в гугле то надо правильно завершить программу(пару строчек на ассемблере) но какие должны быть строчки для arm(я с arm ноутбука)?


Ответ

test.c
void _start() { asm( "mov r0, #0;" /* кладем в r0 0 -- код выхода */ "mov r7, #1;" /* кладем в r7 1 -- номер системного вызова exit */ "swi 0" /* системный вызов Linux */ ); }
Компиляция и выполнение:
$ gcc -nostdlib test.c -o test $ ./test

Создание ZIP-архива программно

Здравствуйте! Уже несколько дней мучаюсь с проблемой: Мне нужно программно создать архив, и поместить в него файлы из массива. Использовал cледующий код:
private static final int BUFFER = 80000;
public void zip(String[] _files, String zipFileName) { try { BufferedInputStream origin = null; FileOutputStream dest = new FileOutputStream(zipFileName); ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream( dest)); byte data[] = new byte[BUFFER];
for (int i = 0; i < _files.length; i++) { Log.v("Compress", "Adding: " + _files[i]); FileInputStream fi = new FileInputStream(_files[i]); origin = new BufferedInputStream(fi, BUFFER);
ZipEntry entry = new ZipEntry(_files[i].substring(_files[i].lastIndexOf("/") + 1)); out.putNextEntry(entry); int count;
while ((count = origin.read(data, 0, BUFFER)) != -1) { out.write(data, 0, count); } origin.close(); }
out.close(); } catch (Exception e) { e.printStackTrace(); } }
Вроде все идет хорошо, архив на месте, но: Сам архив должен весить порядка 15 МБ, а весит всего 10,56 МБ, и архиватор говорит: "Архив поврежден". Возможно, конечно, вес сокращен из-за сжатия, но почему архиватор отказывается открывать его, и как убрать сжатие? Подскажите, пожалуйста. Заранее спасибо!


Ответ

Проблема у вас в том, что вы обрабатываете не все исключения и закрываете выходной поток не в секции finally, вот так примерно должен выглядеть рабочий код
private static final int BUFFER = 80000;
public void zip(String[] files, String zipFileName) { ZipOutputStream out = null; try { out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFileName))); byte data[] = new byte[BUFFER]; for (int i = 0; i < files.length; i++) { processFile(out, data, files[i]); } } catch (IOException e) { e.printStackTrace(); } finally { close(out); } }
private void processFile(ZipOutputStream out, byte[] data, String file) { BufferedInputStream origin = null; try { origin = new BufferedInputStream(new FileInputStream(file), BUFFER); ZipEntry entry = new ZipEntry(file.substring(file.lastIndexOf("/") + 1)); out.putNextEntry(entry); int count; while ((count = origin.read(data, 0, BUFFER)) != -1) { out.write(data, 0, count); } } catch (IOException e) { e.printStackTrace(); } finally { close(origin); } }
private void close(Closeable closeable){ if (null != closeable){ try { closeable.close(); } catch (IOException ignored) { } } }

Изменение внешнего вида выбранного TreeViewItem

Здравствуйте, имею в своём приложении собственный обозреватель папок. В целом он функционирует хорошо, но есть один недочёт: если нажать на тот, или иной TreeViewItem, то он обводиться стандартным и не красивым синим прямоугольником. Как это можно изменить? Надо заменить этот прямоугольник чем-то...


Ответ

Элементы TreeView неявно (или явно, если ваш код это указывает) кладутся в TreeViewItem. Визуализация выбранных элементов/элементов с фокусом делается в TreeViewItem'е. То есть, вам нужно переопределить, как он выглядит.
Насколько я понимаю, для этого вам нужно поменять его стиль (ItemContainerStyle), причём целиком. Кажется, нет возможности подменять лишь часть стиля. Вот здесь дан код, как этот стиль определён по умолчанию. (Ищите Style TargetType="controls:TreeViewItem".) Определение реально большое, но правильное.
Его можно переопределить например так, как описано здесь (хотя техника немного устарела: вместо триггеров нужно бы использовать VisualState). Или вы можете базироваться на стиле по умолчанию, и подменить нужные части.

Как правильно установить Git на OS X

С установкой Git на OS X есть проблема: он уже установлен в системе и просто так его не обновить. При каждом обновлении ОС устанавливает его заново.
Например, на момент написания этого вопроса, актуальной версией Git является 2.5.1. А в OS X Yosemite зашит 2.3.2.
При установке новой версии через Homebrew она все равно остается недоступной.


Ответ

Установка «с нуля»
Устанавливаем Git, например через Homebrew
$ brew install git Проверяем текущую версию Git
$ git --version git version 2.4.9 (Apple Git-60)
Если вы видите "Apple Git", значит используется старая версия. Проверим, где установлена используемая версия Git.
$ which git /usr/bin/git
Точно, эта версия ставится вместе с системой. А та, которая нам нужна, и которая установлена homebrew, находится в /usr/local/bin/git. Почему выбирается не она? Вероятнее всего потому, что путь к ней находится дальше в переменной окружения $PATH
echo $PATH Меняем $PATH
В переменной $PATH хранятся пути к папкам, разделённые двоеточиями. Когда вы хотите запустить какую-то программу по имени (а не по полному пути), поиск происходит во всех этих папках по очереди, слева направо. Переменная задаётся в файле ~/.bashrc (или ~/.zshrc и т.п., в зависимости от используемой оболочки). Откройте его и найдите примерно такую строку:
export PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin"
Поставьте /usr/local/bin раньше, чем /usr/bin
export PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
Перезапустите оболочку:
bash $ git --version git version 2.10.1
$ which git /usr/local/bin/git
Ура, работает!

Как отфильтровать данные и поставить условие на date

Есть запрос такого вида
Сущность.where(calendars: {date: "1.07.2015"}).count
Мне возвращает количество записей с значением "1.07.2015" в поле date. Но мне надо запрашивать именно 7й месяц (или любой другой). Как отфильтровать и поставить условие на date?
Вот код самой миграции
create_table :calendar do |t| t.belongs_to :user, index: true t.belongs_to :days_info, index: true t.datetime :date t.timestamps end


Ответ

Попробуйте так:
What.where(calendars: {date: '1.07.2015'.to_date...'1.07.2015'.to_date + 1.month}).count

Почему тип дженрика нужно указывать второй раз при использовании {{}}?

Почему так можно:
ArrayList list = new ArrayList();
А так нельзя:
ArrayList list = new ArrayList(){{ add(0); }};
Почему так сделали?


Ответ

Используя так называемый double-brace initialization, вы создаёте новый анонимный класс. Когда в Java-7 разрешили опускать аргументы типа в некоторых случаях, одним из исключений, явно прописанным в стандарте, являются как раз анонимные классы:
It is a compile-time error if a class instance creation expression declares an anonymous class using the "<>" form for the class's type arguments.
Тут нет каких-то принципиальных ограничений, просто усложняло вывод типов в компиляторе, потому что есть много частных случаев. Поэтому недоделали. В Java-9 планируют исправить этот момент — смотрите баг JDK-8073593
В заключение скажу, что double-brace initialization — исключительно дурацкий способ инициализации объектов. У него могут быть неожиданные проблемы: от случайного захвата контекста внешнего класса до смены serialVersionID. В вашем случае это вообще не нужно. Пишите так:
List list = new ArrayList<>(Arrays.asList(0));
А если не собираетесь в будущем добавлять и удалять элементы в список, то лучше так:
List list = Arrays.asList(0);
Но даже если б у вас была Map, лучше заведите отдельный метод, фабрику или билдер, который создаёт предопределённые Map, но не делайте double-brace initialization.
В той же девятке, кстати, планируется упростить этот момент — смотрите JDK-8048330. Будет можно писать
List list = List.of(1,2,3,4); Set set = Set.of("aa", "bb", "cc"); Map map = Map.of("aa", 1, "bb", 2, "cc", 3);

Sudo: command not found на некоторых командах

Подскажите почему может не работать команды с sudo, если sudo -s работает?
$ sudo ll sudo: ll: command not found


Ответ

Это может происходить, если ll — псевдоним. Например:
$ which ll ll: aliased to ls -lh
В таком случае sudo не сработает, потому что псевдоним не распознаётся. Выход такой: добавьте в ваш ~/.bashrc (~/.zshrc) строку
alias sudo='sudo '
Теперь сработает:
$ sudo ll Password: total 1240 ...
Дело в том, что для распознавания псевдонима необходимо, чтобы первое слово в выполняемой команде было псевдонимом. Если последний символ значения псевдонима — пробел, то следующее за первым псевдонимом слово также будет проверяться как псевдоним.
Из bash manual
Aliases allow a string to be substituted for a word when it is used as the first word of a simple command. The shell maintains a list of aliases that may be set and unset with the alias and unalias builtin commands. The first word of each simple command, if unquoted, is checked to see if it has an alias. If so, that word is replaced by the text of the alias. The characters ‘/’, ‘$’, ‘`’, ‘=’ and any of the shell metacharacters or quoting characters listed above may not appear in an alias name. The replacement text may contain any valid shell input, including shell metacharacters. The first word of the replacement text is tested for aliases, but a word that is identical to an alias being expanded is not expanded a second time. This means that one may alias ls to "ls -F", for instance, and Bash does not try to recursively expand the replacement text. If the last character of the alias value is a space or tab character, then the next command word following the alias is also checked for alias expansion.
Решение и цитата взяты из этого ответа на Ask Ubuntu: Aliases not available when using sudo
Кстати, не вижу большого смысла применять sudo к команде ls. Это сработает точно так же:
$ sudo ls $ ls -A

Проблема компиляции Cosmos C#

Решил тут написать ОС. Поставил VS 2013 и Cosmos User Kit. Ошибка, я так понимаю, не моя, а Cosmos'а Мой код
using System; using System.Collections.Generic; using System.Text; using Sys = Cosmos.System;
namespace Meduze { public class Kernel : Sys.Kernel { protected override void BeforeRun() { Console.WriteLine("Meduze starting..."); }
protected override void Run() { while(true); } } }
Ошибка:
1>------ Build started: Project: Meduze, Configuration: Debug Any CPU ------ 1>C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets(1697,5): warning MSB3270: There was a mismatch between the processor architecture of the project being built "MSIL" and the processor architecture of the reference "Cosmos.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5ae71220097cb983, processorArchitecture=MSIL", "x86". This mismatch may cause runtime failures. Please consider changing the targeted processor architecture of your project through the Configuration Manager so as to align the processor architectures between your project and references, or take a dependency on references with a processor architecture that matches the targeted processor architecture of your project. 1>C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets(1697,5): warning MSB3270: There was a mismatch between the processor architecture of the project being built "MSIL" and the processor architecture of the reference "Cosmos.Debug.Kernel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5ae71220097cb983, processorArchitecture=MSIL", "x86". This mismatch may cause runtime failures. Please consider changing the targeted processor architecture of your project through the Configuration Manager so as to align the processor architectures between your project and references, or take a dependency on references with a processor architecture that matches the targeted processor architecture of your project. 1>C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets(1697,5): warning MSB3270: There was a mismatch between the processor architecture of the project being built "MSIL" and the processor architecture of the reference "Cosmos.Hardware, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5ae71220097cb983, processorArchitecture=MSIL", "x86". This mismatch may cause runtime failures. Please consider changing the targeted processor architecture of your project through the Configuration Manager so as to align the processor architectures between your project and references, or take a dependency on references with a processor architecture that matches the targeted processor architecture of your project. 1>C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets(1697,5): warning MSB3270: There was a mismatch between the processor architecture of the project being built "MSIL" and the processor architecture of the reference "Cosmos.System, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5ae71220097cb983, processorArchitecture=MSIL", "x86". This mismatch may cause runtime failures. Please consider changing the targeted processor architecture of your project through the Configuration Manager so as to align the processor architectures between your project and references, or take a dependency on references with a processor architecture that matches the targeted processor architecture of your project. 1> Meduze -> c:\users\катя\documents\visual studio 2013\Projects\Meduze\Meduze\bin\Debug\Meduze.dll 2>------ Build started: Project: MeduzeBoot, Configuration: Debug x86 ------ 2> IL2CPU invoked with DebugMode='Source', DebugEnabled='True', TraceAssemblies='{NULL}', IgnoreDebugStub='False' 2> IL2CPU task took 00:00:18.0546475 2>C:\Program Files (x86)\MSBuild\Cosmos\Cosmos.targets(55,5): error : Error occurred while invoking objdump. 2>C:\Program Files (x86)\MSBuild\Cosmos\Cosmos.targets(55,5): error : An error occurred: System.ArgumentNullException: Parameter "message" cannot be null. 2> at Microsoft.Build.Shared.ErrorUtilities.VerifyThrowArgumentNull(Object parameter, String parameterName, String resourceName) 2> at Microsoft.Build.Utilities.TaskLoggingHelper.LogError(String subcategory, String errorCode, String helpKeyword, String file, Int32 lineNumber, Int32 columnNumber, Int32 endLineNumber, Int32 endColumnNumber, String message, Object[] messageArgs) 2> at Cosmos.Build.MSBuild.BaseToolTask.Logs(LogInfo logInfo) in g:\IL2CPU\source2\Build\Cosmos.Build.MSBuild\BaseToolTask.cs:line 175 2> at Cosmos.Build.MSBuild.BaseToolTask.ExecuteTool(String workingDir, String filename, String arguments, String name) in g:\IL2CPU\source2\Build\Cosmos.Build.MSBuild\BaseToolTask.cs:line 127 2> at Cosmos.Build.MSBuild.ExtractMapFromElfFile.RunObjDump() in g:\IL2CPU\source2\Build\Cosmos.Build.MSBuild\ExtractMapFromElfFile.cs:line 174 2> at Cosmos.Build.MSBuild.ExtractMapFromElfFile.Execute() in g:\IL2CPU\source2\Build\Cosmos.Build.MSBuild\ExtractMapFromElfFile.cs:line 68 2>Done building project "MeduzeBoot.Cosmos" -- FAILED. 2> Build has been canceled.
Почему возникает ошибка и как её исправить?


Ответ

Ваш проект лежит в:
c:\users\катя\documents\visual studio 2013\Projects\Meduze\
Попробуйте разместить его в другой директории, так, чтобы путь не содержал кириллицы. Cosmos не поддерживает не ASCII символы в путях.

Git Bash изменить домашний каталог

Установил клиента Git, для изучения и дальнейшего использования был выбран Git Bash, и вроде все работает, но есть один нюанс: Каталог по умолчанию, почему то установлен сетевой диск, хотелось бы его изменить, как это сделать?
OS version: Windows 7 x64;
Git version: 2.6.3-64-bit;


Ответ

Решение было найдено здесь
Необходимо изменить ярлык запуска Git Bash
Вызываем контекстное меню для ярлыка: Клик правой кнопкой мыши по ярлыку, в открывшемся меню выбираем свойства. Устанавливаем необходимый путь: В поле Рабочая папка устанавливаем необходимый путь. Так же мне потребовалось изменить строку запуска: в поле Объект удаляем в конце строки --cd-to-home
Запускаем клиента и убеждаемся в что что команда pwd отдает необходимый нам каталог

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

Ссылка на офф. документацию : https://developers.google.com/admob/android/interstitial
Сделал как там все описано - работает, но только при нажатии кнопки. А как сделать, что бы при каждом запуске приложения отображалась реклама 1 раз?


Ответ

Надо отследить что пользователь открыл приложение, а не (например) повернул. Это можно сделать проверив if(savedInstanceState==null) это аргумент в onCreate методе активити. После её поворота (пересоздания) этот аргумент уже не null и условие выполнено не будет. В этом условии сформировать запрос к AdMob Запустить его и ждать пока реклама не отобразится.
public class MainActivity extends ActionBarActivity { boolean adsAlredyShown = false; InterstitialAd mInterstitialAd;
@Override protected void onCreate(Bundle savedInstanceState) { Log.i("LOG", "onCreate"); super.onCreate(savedInstanceState);
mInterstitialAd = new InterstitialAd(this); mInterstitialAd.setAdUnitId("ca-app-pub-3940256099942544/1033173712"); //идентификатор из доков надо заменить на свой mInterstitialAd.setAdListener(new AdListener() { @Override public void onAdClosed() { Log.i("LOG", "onAdClosed"); }
public void onAdLeftApplication() { Log.i("LOG", "onAdLeftApplication"); }
@Override public void onAdLoaded() { Log.i("LOG", "onAdLoaded"); mInterstitialAd.show(); }
public void onAdFailedToLoad(int errorCode) { Log.e("LOG", "onAdFailedToLoad with errorCode " + errorCode); } @Override public void onAdOpened() { Log.i("LOG", "onAdOpened"); //вызывается в момент отображения рекламы. //и раз она отобразилась ставим флаг в true //чтобы больше её не показывать adsAlredyShown = true; } });
if(savedInstanceState==null) { AdRequest adRequest = new AdRequest.Builder().build(); mInterstitialAd.loadAd(adRequest); } else { adsAlreadyShown = savedInstanceState.getBoolean("AdsAlreadyShown", false); //реклама ещё не показывалась if(!adsAlreadyShown) { AdRequest adRequest = new AdRequest.Builder().build(); mInterstitialAd.loadAd(adRequest); } } }
protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putBoolean("AdsAlreadyShown", adsAlreadyShown); } }

Также, в тот же savedInstanceState можно поместить флаг после показа рекламы и не показывать её пока он true. Этот флаг исчезнет только если активити будет убита системой или вручную методом finish()

array_slice не срабатывает внутри foreach

Проблемный участок кода:
public function create($file) { $file = file($file);
$country = preg_grep('/\((\w+)\)(\s?(\w+)\s?(\w+))/', $file);
foreach ($country as $key => $value) { $this->collection[$value] = array_slice($file, $key, next($country)); } }
Входной файл:
(UK) Great Britan Zelma Belyavskaya Danielle Hughes (PH) Philippines Marione Bayunggan Maria Hadap
Нужный результат:
array [ (UK) Great Britan => [Zelma Belyavskaya, Danielle Hughes], (PH) Philippines => [Marione Bayunggan, Maria Hadap] ]
Текущий результат:
array [ (UK) Great Britan => [], (PH) Philippines => [] ]


Ответ

Вы там намудрили. next вернет первый раз 3, а второй раз ему нечего возвращать - массив кончился. Я бы так делал
$file = [ '(UK) Great Britan', 'Zelma Belyavskaya', 'Danielle Hughes', '(PH) Philippines', 'Marione Bayunggan', 'Maria Hadap' ];
$collection = []; $key = '';
foreach ($file as $value) { if (preg_match('/\((\w+)\)(\s?(\w+)\s?(\w+))/', $value)) { $key = $value; continue; } $collection[$key][] = $value; } print_r($collection);
получим
Array ( [(UK) Great Britan] => Array ( [0] => Zelma Belyavskaya [1] => Danielle Hughes )
[(PH) Philippines] => Array ( [0] => Marione Bayunggan [1] => Maria Hadap )
)

Бинарное дерево

Требуется реализовать бинарное дерево, НО: Обязательное ли условие, чтобы правая крайняя сторона с корня увеличивалась до максимума, а левая крайняя сторона уменьшалась до минимума?(см. на приложенное изображение) Интернет перерыл, но прямым текстом это нигде не написано, но на одних визуализациях это условие выполняется, а на других нет.
Обновлено: Можно ли данную реализацию считать бинарным деревом?


Ответ

Определения
Определение бинарного дерева:(1)
Дерево, в котором каждая вершина имеет не более двух потомков, называется бинарным, в противном случае будем дерево называть произвольным
Определение бинарного дерева поиска:(2)
Будем называть бинарное дерево деревом поиска, если для любой вершины ключ этой вершины не меньше ключа любой вершины левого поддерева и строго меньше ключа любой вершины правого поддерева
Ссылки:
(1) В.Д.Валединский, Ю.Н.Пронкин Вычислительные системы и программирование, Схемы хранения данных (Москва, 2006 г.) стр 67 (2) В.Д.Валединский, Ю.Н.Пронкин Вычислительные системы и программирование, Схемы хранения данных (Москва, 2006 г.) стр 74

Изображение на рисунке терминала является бинарным деревом, но не бинарном деревом поиска, так как нет алфавитного или какого-нибудь другого, заранее обговорённого, порядка

Создание файла в java

Как создавать файл в java, чтобы он стал частью package? Тоесть, находился в одной папке с java файлами? Путь к папке через C:// не подходит, т.к. файл должен создаваться на разных устройствах. И как его прописать впоследствии для открытия?


Ответ

Если я правильно понял ваш вопрос, то вы можете получить путь к папке проекта как
String path = new File("").getAbsolutePath();
и затем просто создавать файлы в папке проекта как
File newFile = new File(path + "\file1.txt");

Проблема с буквой “Й” в UTF-8

Пытаюсь сравнить два файла, оба содержат список файлов/папок, один сделан на маке, другой на linux. diff показывает разницу где ее на первый взгляд нет. Перевод в hex режим показал что одна и та же буква (визуально это й) в одной системе сформировалась след. символом d0b9 а в другой d0b8. Может кто знает почему ? и как сравнивать в таком случае ?


Ответ

Буква "й" может быть кодирована в unicode двумя способами: как один символ - собственно, "й" (Cyrillic Small Letter Short I), и как два символа - "и" (Cyrillic Small Letter I) и Combining Breve ("шляпка"). Это может создавать определённые проблемы при сравнении и поиске текста.
Подробнее можно почитать в этой статье: Хабрахабр: «Й» вам не «и» краткое! О важности нормализации Unicode
В вашем случае можно файл с "разложенной" буквой "й" перед сравнением прогнать через sed с помощью следующей команды:
cat файл | sed "s/\xD0\xB8\xCC\x86/\xD0\xB9/g"
(предложено участником Mike)

Поиск по listView android

Есть задача реализовать поиск по listViev, но данный код адекватно ищет только по первым символам, если ввести символы которые в словах находятся в средине или конце - то он вообще не дает результатов. Если нужно привести дополнительный код - говорите я добавлю.
mInputSearch.addTextChangedListener(new TextWatcher() {
@Override public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { // When user changed the Text ListFragment.this.mAdapter.getFilter().filter(cs); }
@Override public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub }
@Override public void afterTextChanged(Editable arg0) { // TODO Auto-generated method stub } });
ListFragment.java
public class ListFragment extends Fragment {
private ListView mListView; private EditText mInputSearch;
private ArrayList mList; private ArrayAdapter mAdapter;
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
mList = new ArrayList(); fillArray();
mAdapter = new ArrayAdapter(getActivity().getApplicationContext(),R.layout.item_list, mList);
}
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.activity_list, container, false);
mInputSearch = (EditText) v.findViewById(R.id.inputSearch);
mListView = (ListView) v.findViewById(R.id.listView); mListView.setAdapter(mAdapter);
return v; }
@Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState);
mInputSearch.addTextChangedListener(new TextWatcher() {
@Override public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { // When user changed the Text ListFragment.this.mAdapter.getFilter().filter(cs);
}
@Override public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub }
@Override public void afterTextChanged(Editable arg0) { // TODO Auto-generated method stub } }); }
private void fillArray() {
mList.add("Lorem"); mList.add("Ipsum"); mList.add("Dolor"); mList.add("Sit"); mList.add("Amet"); mList.add("Consectetur"); mList.add("Adipiscing"); mList.add("Elit"); mList.add("Fusce"); mList.add("Pharetra"); mList.add("Luctus"); mList.add("Sodales");
Collections.sort(mList); } }


Ответ

Для того, чтоб настроить свой фильтр, нужно решить некую последовательность:
Создать свой custom адаптер. Привязать к нему интерфейс Filterable Настроить метод getFilter() под себя.
Я сделал рабочий пример, для того чтоб вы могли потестить:
Кастомный адаптер:
public class myAdapter extends ArrayAdapter implements Filterable {
private List allModelItemsArray; private List filteredModelItemsArray; private Activity context; private ModelFilter filter; private LayoutInflater inflater;
public myAdapter(Activity context, ArrayList list) { super(context, R.layout.list_item, list); this.context = context; this.allModelItemsArray = new ArrayList(); allModelItemsArray.addAll(list); this.filteredModelItemsArray = new ArrayList(); filteredModelItemsArray.addAll(allModelItemsArray); inflater = context.getLayoutInflater(); getFilter(); } @Override public Filter getFilter() { if (filter == null){ filter = new ModelFilter(); } return filter; } static class ViewHolder { protected TextView text; }
@Override public View getView(int position, View convertView, ViewGroup parent) { View view = null; String m = filteredModelItemsArray.get(position); ViewHolder viewHolder = null; if (convertView == null) {
view = inflater.inflate(R.layout.list_item, null); viewHolder = new ViewHolder(); viewHolder.text = (TextView) view.findViewById(R.id.tvItem); view.setTag(viewHolder); } else { view = convertView; viewHolder = ((ViewHolder) view.getTag()); } viewHolder.text.setText(m); return view; }
private class ModelFilter extends Filter {
@Override protected FilterResults performFiltering(CharSequence constraint) {
constraint = constraint.toString().toLowerCase(); FilterResults result = new FilterResults(); if(constraint.toString().length() > 0) { ArrayList filteredItems = new ArrayList();
for(int i = 0, l = allModelItemsArray.size(); i < l; i++) { String m = allModelItemsArray.get(i); if(m.toLowerCase().contains(constraint)) filteredItems.add(m); } result.count = filteredItems.size(); result.values = filteredItems; } else { synchronized(this) { result.values = allModelItemsArray; result.count = allModelItemsArray.size(); } } return result; }
@SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) {
filteredModelItemsArray = (ArrayList)results.values; notifyDataSetChanged(); clear(); for(int i = 0, l = filteredModelItemsArray.size(); i < l; i++) add(filteredModelItemsArray.get(i)); notifyDataSetInvalidated(); } } }
MainActivity.class
public class MainActivity extends AppCompatActivity { ListView lv; EditText editText; myAdapter adapter;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv); editText = (EditText) findViewById(R.id.editText);
ArrayList values = new ArrayList<>(); for (int i = 0; i < 25; i++) { values.add("Item:" + i); } adapter = new myAdapter(this, values); lv.setAdapter(adapter);
editText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { adapter.getFilter().filter(s.toString()); } }); } }
activity_main.xml



list_item.xml

Как сделать свою библиотеку подключаемой через зависимости gradle

На github часто можно встретить такой код для build.gradle файла -
dependencies { compile 'com.lusfold.spinnerloading:spinnerloading:1.0.0' }
Если добавить эту зависимость в проект, то подключаемая библиотека компилируется автоматически, что очень упрощает процесс её подключения.
Такой вопрос - если я сам создал какую-нибудь библиотеку и выложил её на github, как мне сгенерировать такую же ссылку, чтобы люди (и я, при необходимости повторного использования) могли так же просто подключать мою библиотеку в свои проекты?


Ответ

Во первых подключаемая библиотека не компилируется, она скачивается с maven репозитория уже скомпилированная.
Ну а что бы пользователи смогли пользоваться вашей библиотекой подключая её похожим образом нужно выложить её в публично доступный репозиторий. Как это сделать хорошо описано в этой статье. Там правда немного избыточно, для публикации библиотеки в jCenter шаги 2 и 3 не нужны, они нужны для публикации ещё и в Maven Central.
Есть ещё совсем простой способ именно для GitHub: jitpack.io. Но с ним пользователю придётся добавить, кроме непосредственно строки описывающей зависимость от Вашей библиотеки, ещё и ссылку на репозиторий. В общем у них на сайте всё подробно расписано.

Как добиться подобного?


Суть проблемы: таблицами (или div-ами) добиться разделения колонок так, как на скрине. У границ tr, td могут ли быть отступы от краёв именно по границам? Или можно сверстать это 3-мя div-ами?


Ответ

Таблицу вкладываем в любой блочный элемент с рамкой. Для каждой ячейки, начиная с второй устанавливаем только левую часть границы border-left. Не забываем про border-collapse, иначе разделитель не будет сплошной.
div{ border: 1px solid black; border-radius: 15px; padding: 8px; display: inline-block; } table{ border-collapse: collapse; } th,td{ padding: 5px; text-align: center; border-left: 1px solid black; } th:first-child,td:first-child{ border-left: 0px; //убираем черту слева }
demo

Поиск последовательности в таблице

В БД есть таблица в два столбца с большим количеством записей. Первый столбец - id, второй - числа с плавающей точкой.
Дана последовательность трёх чисел с плавающей точкой. Нужно узнать, встречается ли такая последовательность в БД - допустим с 10 id по 12. Если есть - то нужен id начального числа.
Как это лучше всего сделать с наименьшими энергозатратами? Выбрать в массив вхождения по первому числу и в затем цикле проверить остальные 2? Но записей в ней очень много - такая переборка займёт большое время.
Дополню, чтобы понятней задача была. Вот БД:
4.3422 5.3434 3.3243 4.2453 2.3445 и т.д.
Дана последовательность 3х чисел: 5.3434, 3.3243, 4.2453. Нужно найти эту последовательность в базе данных - есть ли она вообще, а если есть, то вернуть что они находятся в том же порядке со 2 id по 4.


Ответ

Стандартная задача на поиск подпоследовательности в последовательности. Далее два запроса, которые ищут все вхождения подпоследовательности в последовательность:
1) вариант для подпосл. из 3х элементов. работает только если в Id нет пропусков значений.
2) для любых подпоследовательностей.
DECLARE @T1 TABLE(Id INT, Value MONEY) DECLARE @T2 TABLE(Id INT, Value MONEY) INSERT @T1 VALUES (1,1),(2,2),(3,3),(4,4),(5,3), (6,2),(7,3),(8,4),(9,3),(10,2) INSERT @T2 VALUES (1,2),(2,3),(3,4)
--вариант для трёх, работает только если в Id нет пропусков значений. SELECT MIN(T1.Id) Id FROM @T1 T1 JOIN @T2 T2 ON T1.Value = T2.Value GROUP BY T1.Id - T2.Id HAVING COUNT(*) = 3
--более общий вариант, работает с любыми последовательностями SELECT MIN(T1.Id) Id FROM (SELECT ROW_NUMBER()OVER(ORDER BY Id)N,* FROM @T1)T1 JOIN (SELECT ROW_NUMBER()OVER(ORDER BY Id)N,COUNT(*)OVER()C,* FROM @T2)T2 ON T1.Value = T2.Value GROUP BY T1.N - T2.N HAVING COUNT(*)=MAX(C)
UPD: если вы заранее знаете все три значения, то пожалуй лучше встроить конструктор таблицы прямо в запрос. Ещё 2 варианта:
DECLARE @T1 TABLE(Id INT, Value MONEY) INSERT @T1 VALUES (1,1),(2,2),(3,3),(4,4),(5,3), (6,2),(7,3),(8,4),(9,3),(10,2) DECLARE @Param1 MONEY = 2, @Param2 MONEY = 3, @Param3 MONEY = 4
--В столбце Id таблички @T1 нет пропусков: SELECT MIN(T1.Id) Id FROM @T1 T1 JOIN (VALUES(1,@Param1),(2,@Param2),(3,@Param3))T2(Id, Value) ON T1.Value = T2.Value GROUP BY T1.Id - T2.Id HAVING COUNT(*)=3
--В столбце Id таблички @T1 есть пропуски: SELECT MIN(T1.Id) Id FROM (SELECT ROW_NUMBER()OVER(ORDER BY Id)N,* FROM @T1)T1 JOIN (VALUES(1,@Param1),(2,@Param2),(3,@Param3))T2(N, Value) ON T1.Value = T2.Value GROUP BY T1.N - T2.N HAVING COUNT(*)=3