Страницы

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

воскресенье, 15 декабря 2019 г.

Способ расширения/наследование/декорирования 2D массива

#c_sharp #c_sharp_70


Существует ли какой-либо способ расширить встроенный прямоугольный массив в c#?
Например:

public class Array2D:????
{
    private T[,] _data;

    public Array2D(T[,] vals)
    {
        _data = vals;
    }

    public IEnumerable Row( int iRow)
    {
        return _data.Cast().Select((t, j) => _data[iRow, j]);
    } 
}

    


Ответы

Ответ 1



Использовать методы расширения? public static class TwoDimensionalArrayExtensions { public static IEnumerable Row(this T[,] array, int iRow) { if (array == null) { throw new ArgumentNullException(nameof(array)); } if (iRow < array.GetLowerBound(0) && iRow > array.GetUpperBound(0)) { throw new ArgumentOutOfRangeException(nameof(iRow)); } for (int columnIndex = array.GetLowerBound(1); columnIndex <= array.GetUpperBound(1); columnIndex++) { yield return array[iRow, columnIndex]; } } } Использование: static void Main(string[] args) { var array = new int[2, 2] { { 1, 2 }, { 3, 4 } }; foreach (var value in array.Row(0)) { Console.WriteLine(value); } }

Доступ к структуре через unsigned char

#cpp #language_lawyer


Пусть есть структура S следующего вида:

    struct S 
    {
        short a;
        char b;
    };


И размер sizeof(short) равен 2, а размер sizeof(S) равен 4 (т.е. в структуре есть
один padding byte).

Вопрос 1. Является ли корректным с точки зрения стандарта языка такой код:

    S st;

    st.a = 0; st.b = 0;
    unsigned char *p = reinterpret_cast(&st);
    for (size_t i = 0; i != sizeof(st); ++i)
        unsigned int tmp = p[i];


Вопрос 2. Если код корректен, то гарантируется ли, что в ситуации, когда указатель
p указывает на padding byte структуры S, в переменную tmp будет записано некоторое
целочисленное значение из отрезка [0; UCHAR_MAX] или допускаются какое-нибудь менее
очевидное поведение, например, генерация исключения.



Дополнение.   

Действительно, если есть объект тривиально-копируемого типа T, то составляющие его
байты могут быть безопасно скопированы (например, с помощью memcpy) в массив char,
unsigned char или std::byte (и обратно). Также можно скопировать некоторый объект тривиально-копируемого
типа в другой объект этого же типа (с помощью того же самого memcpy, например.)

Однако, в пункте 11.6/12 (n4659) есть занятный пример:

    unsigned char c;
    unsigned char d = c; // OK, d has an indeterminate value
    int e = d; // undefined behavior


Не является ли мой пример, в некотором смысле, эквивалентом этого примера из стандарта?
    


Ответы

Ответ 1



1) Да, каст к char* и unsigned char* разрешен (а каст к другим типам запрещен правилами aliasing) 2) Нет для int. Паддинг можно читать-писать (иначе memcpy сломался бы). Однако, стандарт разрешает читать indeterminate value типа [unsigned] char в присваиваниях где левая стророна это l-value типа [unsigned] char, но запрещает присваивать например int. (При этом неясно, считается ли что паддинг может иметь indeterminate value)

Отсортировать SQL выдачу

#mysql #sql


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

SELECT * FROM `content` WHERE `text` LIKE "%hi%" AND `text` LIKE "%bro%"


Надо сделать так, что бы выдача была по убыванию ( то бишь там где больше всего bro
и hi - самое первое, где меньше всего - самое последнее ). Заранее спасибо!
    


Ответы

Ответ 1



SELECT *, (length(text) - length(replace(text,'hi','')) / 2) + (length(text) - length(replace(text,'bro','')) / 3) AS OrderField FROM content WHERE text LIKE "%hi%" AND text LIKE "%bro%" ORDER BY OrderField

Как создать гибкую схему таблиц для хранения сообщений из разных чатов?

#mysql #data_structures


Помогите пожалуйста разобраться в следующей ситуации:

Есть два вида API где хранятся истории сообщений, это Zopim и Chat2Desc(импортировать
в Postman) . Пока эти два но могут потом и другие появится.

И моя ДБ с таблицей users:

Table users
id , email, phone, ...


В Zopim пользователи идентифицируются через email, a в Chat2Desc через телефон. Для
меня эти два поля важны, какой бы чат  не был и сколько бы их не было.

То есть если я получаю емайл либо телефон пользователя в сообщениях, то делаю запрос
в свою базу (table users) для идентифицирования своего пользователя.

Да и в принципе даже структура чатов не важна, я данные как нибудь да выберу.А вот
как их правильно сохранить , да так чтоб у меня была одна структура для всех .

И вот что я придумал:


Разъяснение:

Таблица chats (Данные для чата) :


client_id   - указывает на id таблицы chat_clients
duration    - длительность чата
system_type - хранит имя чата (Zopim, Chat2Desc, ... )
created_at  - дата создания 


Таблица chat_clients (сведений об пользователей которые были в чате):


assigned_data - те инициалы под которыми пользователи были в чате
is_agent      - (0 | 1): 1 => мой пользователь, 0 => не мой
users_id      - id пользователя. Содержит либо id из таблицы users либо пустой.
bean_module   - неважно (сведение о моём пользователе)
unique_col    - Тут будет либо email (из Zopim) либо телефон (из Chat2Desc, Либо
думаю хранить id таблицы users).Будет гарантировать уникальность значений.


Связка users_id + unique_col уникальна (UNIQUE KEY user_id_unique_col_UQ (user_id,unique_col))

Таблица chat_messages:


text      - текст сообщения.
client_id - указывает на id таблицы chat_clients
chat_id   - указывает на id таблицы chats
file_id   - указывает на id таблицы chat_files
transport - значение будет для Chat2Desc (Viber, WhatsApp ,...), для Zopim ,чтоб
не пустовал , Zopim


Таблица chat_files Сведения о переданных файлах в чате.Aналогичных таблиц может быть
может нет для хранения дополнительной инфы.


  Доп инфо: В дальнейшем собираюсь для каждого пользователя выводит
  историю сообщений.


Вопрос:
Как создать гибкую схему таблиц для хранения сообщений из разных чатов ?

Заранее благодарю.
    


Ответы

Ответ 1



Любые проблемы по созданию БД нужно разбивать на две части: Нужно выделить то, что уже есть. Выделить данность, реальность. То, что вы не можете изменить. То есть, выделить структуру внешних данных. Нужно выделить то, что вы хотите получить. Желаемый вид и форма. У вас в структуре всё в одной куче. И материальное представление, и логический вид. Вам нужно выделить отдельные структуры под хранения данных из каждой отдельной системы чатов, которые вы поддерживаете. Так как структуры от­личаются ключами привязки к пользователям, это должны быть разные структуры. Нет, ко­не­чно, можно всё сделать в одной таблице, но тут вы ничего не приобретёте, но очень про­иг­ра­ете в сложности структуры. Если вам нужно делать уникальный ключ по двум ко­лонкам, то вы что-то делаете не так. Затем нужно выделить то, что вы хотите получить. Значить вам нужна какая-то таблица свя­зки чатов и пользователей, и таблицы связки чатов в основной таблице и чатов в мате­риаль­ных таблицах. Если нужно хранить сообщения в каждом чате для быстрого доступа, то лучше будет это сделать явно, в отдельной таблице, не связанной с материальным пред­став­лением. Так сообщения будут храниться два раза, но вы не будете связаны материальным пред­став­лением после импорта сообщений, и ваш код получения данных из БД будет много проще и надёжней. В современном мире нет смысла пытаться оптимизировать число таблиц в БД: если у вас их будет десять или сотня, само по себе это нисколько не повлияет на скорость работы с БД. Другое дело что сложная для понимания структура БД будет отнимать ваше время и на первоначальную разработку, и на дальнейшую поддержку. Если траты вашего времени можно избежать, то это следует сделать. Сама сложная структура БД может представлять и сложность при масштабировании. Например, шардинг и уникальные индексы идут по разные стороны улицы: вы не можете использовать шардинг одновременно с уникальными индексами. То же можно сказать про скорость вставки записей: уникальные индексы ей не помогают.

Ошибка размерности массива в Python

#python #python_3x #нейронные_сети #numpy #keras


Пишу нейронную сеть для распознавания цифр, вылезла ошибка - не могу разобраться
как изменить размерность массива, код ниже

import numpy as np
from keras.utils import np_utils
from keras.models import model_from_json
from keras.preprocessing import image
import matplotlib.pyplot as plt
%matplotlib inline

json_file = open("fully_mesh_network.json", "r")
loaded_model_json = json_file.read()
json_file.close()
loaded_model = model_from_json(loaded_model_json)
loaded_model.load_weights("fully_mesh_network.h5")

loaded_model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])

img_path = '2.png'
img = image.load_img(img_path, target_size=(28,28), grayscale=True)

x = image.img_to_array(img)
x = 255 - x
x/= 255
x = np.expand_dims(x, axis = 0)

prediction = loaded_model.predict(x)
prediction = np_utils.categorical_probas_to_classes(prediction)
print(prediction)
---------------------------------------------------------------------------

ValueError: Error when checking : expected dense_1_input to have 2 dimensions, but
got array with shape (1, 28, 28, 1)

    


Ответы

Ответ 1



Судя по ошибке ваша модель ожидает 2D массив на входе. попробуйте так: x = x.reshape(28, 28) PS метод np_utils.categorical_probas_to_classes() - отсутствует в современных версиях Keras. Вместо него можно попробовать использовать метод: keras.utils.to_categorical()

Как подгрузить много фотографий (их имена) в массив, чтобы потом использовать в html?

#javascript #html


Имеется HTML, имеется JavaScript, который создает элементы в HTML.

Также имеется куча фотографий, которые будут подгружаться в HTML. 

Подскажите, как можно фотографии автоматически подгрузить, ибо их много? По крайне
мере их названия (путь к ним), чтобы вставить в src?

Нашел как в JavaScript подключить require('fs'), но нельзя ведь в HTML использовать
require.
    


Ответы

Ответ 1



Не совсем понятен контекст. На сколько я подозреваю, у вас только фронт-енд. require и библиотека fs - это из Node.js. Предположу, что ваши фото хранятся в папке img, рядом с index.html и вы имеете следующую структуру проекта: . ├── img | ├── image1.png | └── image2.png ├── script.js └── index.html В этом случае, вы можете использовать файлы изображений указав относительный (относительно index.html) путь к ним. Например: name Но в этом случае вам нужно в вашем script.js заранее создать массив с путями ко всем картинкам, чтобы потом в цикле их добавить на страницу. Как я понимаю, в этом и проблема. Чтобы получить имена файлов всех изображений в папке, вам нужно создать сервер на Node.js, потому что это будет работа с файловой системой. А тут уже вариантов реализаций может быть много, но схема будет приблизительно такая: Запускается Node.js сервер, который будет работать как процесс на вашем компьютере; В браузере вы откроете страницу http://localhost, где будет отрисован ваш index.html (сервер отправит этот файл в браузер); Перед отдачей браузеру файла index.html вы можете его модифицировать, и поместить в него заранее массив путей ко всем изображениям. Это обширная тема, и я не могу тут описать все возможные варианты реализаций начиная от установки Node на вашу систему, заканчивая использованием движков html шаблонов, которые (если сказать коротко) расширяют возможности обычного html. Вам следует найти информацию по созданию сервера на Node.js. Например тут: https://learn.javascript.ru/ajax-nodejs https://webref.ru/dev/first-node-app/http-server А после этого, возможно, переформулировать ваш вопрос, и описать результат, который вам нужен.

функция давления кирпича пирамиды

#алгоритм #математика #любой_язык


Есть двумерная пирамида из кирпичей. Вес 1го - 1 кг, давит равномерно на 2 под ним
по 0.5кг.
То есть, если на верхний давит +100 кг, тогда под ним на каждый будет (100+1)/2 кг
- на нижний давит пол веса каждого над ним.

1,0=.5 2,0=.75 2,1=1.5 3,0=.875 3,1=.2.125

Как вычислять давление на любой из них, указывая позицию, например, к4-2, к8-4 ...
к(рядСверху,номерСлева) - как функция с 2 параметрами, возвращающая вес?

Думал, pяд*.5 + (pяд-1)/2 или 1*(c+1) / 2*p + 1*c / 2*p, разные другие варианты,
но никак не могу подобрать точный. (желательно на java)
    


Ответы

Ответ 1



А почему не воспользоваться рекурсией? Значения веса, номер ряда и номер кирпича в ряду вставляйте какие вам надо: public static void main(String[] args) { float weight = 1; //вес кирпча int row = 5; //номер ряда начиная с 1 с верху int num = 3; //номер кирпича слева (или с права, как больше нравится) с 1 System.out.println(pressueOnBrick(row, num, weight)); } //давление на один кирпич public static float pressueOnBrick(int row, int num, float weight) { return pressue(row, num, weight) - weight; //давление оказываемое на один кирпич = полное //давление которое оказывает кирпич минус вес кирпича } //полное давление оказываемое кирпичём (включая свой вес) public static float pressue(int row, int num, float weight) { //в ряду не может быть кирпичей с номером меньше 1 и больше чем номер ряда(число кирпичей в ряду = номеру ряда) if (num < 1 || num > row) { return 0; } //давление которое оказывает кирпич равно сумме веса кирпича и половине веса кирпичей которые давят на него //слева и справа return weight + (pressue(row - 1, num - 1, weight) + pressue(row - 1, num, weight)) / 2; } Валидация вводимых значений на вашей совести.

Ответ 2



#include #include int main() { unsigned ranks{}; std::cin >>ranks; // общее количество рядов double weight{}; std::map loads; unsigned k{1}; for (; k <= ranks; ++k) { loads.insert(std::make_pair(k, weight)); weight = (weight + 1)/2; } std::cout << std::endl << "вводим нужный ряд: " << std::endl; std::cin >> k; std::cout << "нагрузка для кирпичей " << k << " - го ряда: " << loads[k]; return 0; } После обсуждения с goldstar_labs пришел к выводу переписать, поскольку первый вариант верный для двух рядов и для крайных кирпичей #include #include using std::vector; using std::cin; void setValue(const vector& p1, vector& p2) { size_t k = p2.size(); if (k <= 2) return; for (size_t i = 1; i < k - 1; ++i) p2[i] += (p1[i] + 1)/2; } int main() { unsigned ranks{}, k{}; cin >>ranks; // общее количество рядов double w{}; vector< vector > weights; for (unsigned n = 1; n <= ranks; ++n) { vector v(n, w); weights.emplace_back(v); if (n > 2 ) setValue(weights[n - 2], weights[n - 1]); w = (w + 1)/2; } std::cout << std::endl << "вводим нужный ряд: " << std::endl; std::cin >> k; k %= ranks + 1; std::cout << "нагрузки для кирпичей " << k << " - го ряда:\n"; for (double d : weights[k - 1]) std::cout << d << ' '; return 0; } Выводить, думаю вы сами сможете в желаемом формате