GOOGLE ADS

пятница, 13 мая 2022 г.

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В поле addColumn, где я помещаю параметр удаления, идентификатор возвращает только одну запись, а не конкретный идентификатор каждого столбца.

Вот мой код контроллера

public function fetchData($manifest_no){
$hwb_data = DB::table('hwb')
->join('manifest_records', 'hwb.id', '=', 'manifest_records.hwb_id')
->join('consignees', 'consignees.id', '=', 'hwb.client_id')
->where('manifest_records.manifest_no', $manifest_no)
->get();

return Datatables::of($hwb_data)
->addIndexColumn()
->addColumn('action', function($row){
$idx = $row->id;
$btn = "<a href='javascript:void(0)' id='delete' data-id='$idx' class='edit btn btn-danger btn-sm'>$idx</a>";
return $btn;
})
->rawColumns(['action'])
->make(true);
}

Вот рендеринг Datatable

$(function () {
let table = $('#tableSample').DataTable({
processing: true,
serverSide: true,
ajax: "{{ url("/fetchData/$manifest_no") }}",
columns: [
{data: 'id', name: 'id', 'visible': false},
{data: 'created_at', name: 'created_at'},
{data: 'hwb_no', name: 'hwb_no'},
{data: 's_name', name: 's_name'},
{data: 'c_name', name: 'c_name'},
{data: 'destination', name: 'destination'},
{data: 'dr_no', name: 'dr_no'},
{data: 'commodity', name: 'commodity'},
{data: 'actual_weight', name: 'actual_weight'},
{data: 'tp_cbm', name: 'tp_cbm'},
{data: 'action', name: 'action', orderable: false, searchable: false},
]
});

$("#tableReload").delegate('#delete', 'click', function (e) {
e.preventDefault();
let id = $(this).data('id');
console.log(id);
})
});

Всякий раз, когда я визуализирую данные, я всегда сталкиваюсь с этой проблемой. Кнопка действия всегда имеет значение 2

введите описание изображения здесь


Решение проблемы

Я предполагаю, что вам нужно использовать функцию рендеринга, а не бэкэнд-функцию.

Также попробуйте сбросить $rowи dd перед визуализацией представления, просто чтобы убедиться, что $row имеет правильные значения, которые вы ожидаете!

$(function () {
let table = $('#tableSample').DataTable({
processing: true,
serverSide: true,
ajax: "{{ url("/fetchData/$manifest_no") }}",
columns: [
{data: 'id', name: 'id', 'visible': false},
{data: 'created_at', name: 'created_at'},
{data: 'hwb_no', name: 'hwb_no'},
{data: 's_name', name: 's_name'},
{data: 'c_name', name: 'c_name'},
{data: 'destination', name: 'destination'},
{data: 'dr_no', name: 'dr_no'},
{data: 'commodity', name: 'commodity'},
{data: 'actual_weight', name: 'actual_weight'},
{data: 'tp_cbm', name: 'tp_cbm'},

{ data: 'id',
name: 'action',
orderable: false,
searchable: false,
"render": function ( data, type, row, meta ) {
return '<button class="delete btn btn-danger" data-id="'+ data +'"> Delete </button>'
}},
]
});

});

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

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

введите описание изображения здесь

введите описание изображения здесь


Решение проблемы

Вы можете использовать стек для достижения этой цели. Ниже код имеет ту же идею, что и желаемый результат.

 import 'package:flutter/material.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
const MyApp({Key? key}): super(key: key);

static const String _title = 'Flutter Code Sample';

@override
Widget build(BuildContext context) {
return const MaterialApp(
title: _title,
home: MyStatelessWidget(),
);
}
}

class MyStatelessWidget extends StatelessWidget {
const MyStatelessWidget({Key? key}): super(key: key);

@override
Widget build(BuildContext context) {
return Stack(children: [



Positioned(
top: 0,
left: 0,
right: 0,
child: Container(
color: Colors.green,
height: 150,
width: double.infinity,
child: Center(
child: Container(
height: 30,
width: 100,
color: Colors.green,
),
),
),
), Padding(
padding: const EdgeInsets.all(8.0),
child: ListView(
children: [
const SizedBox(height: 20),
Container(
height: 50,
width: 50,
color: Colors.blue,
),
const SizedBox(height: 20),
Container(
height: 50,
width: 50,
color: Colors.blue,
),
const SizedBox(height: 20),
Container(
height: 50,
width: 50,
color: Colors.blue,
),
const SizedBox(height: 20),
Container(
height: 50,
width: 50,
color: Colors.blue,
),
const SizedBox(height: 20),
Container(
height: 50,
width: 50,
color: Colors.blue,
),
const SizedBox(height: 20),
Container(
height: 50,
width: 50,
color: Colors.blue,
),
const SizedBox(height: 20),
Container(
height: 50,
width: 50,
color: Colors.blue,
),
const SizedBox(height: 20),
Container(
height: 50,
width: 50,
color: Colors.blue,
),
const SizedBox(height: 20),
Container(
height: 50,
width: 50,
color: Colors.blue,
),
const SizedBox(height: 20),
Container(
height: 50,
width: 50,
color: Colors.blue,
),
const SizedBox(height: 20),
Container(
height: 50,
width: 50,
color: Colors.red[300],
),
],
),
),
Positioned(
top: 0,
left: 0,
right: 0,
child: Container(
color: Colors.green,
height: 80,
width: double.infinity,
child: Center(
child: Container(
height: 30,
width: 100,
color: Colors.black,
),
),
),
),
]);

}
}

Как я могу сделать RecyclerView с MVVM

Я пытаюсь сделать recyclerView с помощью mvvm, но в результате получаю пустой recyclerView, помогите, пожалуйста! кт файл:

typeRecy = itemView.findViewById(R.id.typeRecy)
typeRecy.layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
typeRecy.setHasFixedSize(true)
typeVM = ViewModelProvider(this)[TypeViewModel::class.java]
typeVM.typeCard.observe(viewLifecycleOwner, Observer {
typeVM.setList()
typeRecy.adapter = recyclerAdapter(it)
})

видМодель:

class TypeViewModel: ViewModel() {

//
private lateinit var typeList: ArrayList<TypeCard>
lateinit var bgType: Array<Int>
lateinit var nameType: Array<String>
var typeCard = MutableLiveData<ArrayList<TypeCard>>()
fun setList(){
bgType= arrayOf(R.drawable.group_1,R.drawable.group_3,R.drawable.group_4,R.drawable.group_2,R.drawable.group_5,R.drawable.group_8)
nameType= arrayOf("Pizza", "Tacos", "Salads","Burgers","Soups", "Drinks")
typeList = arrayListOf()
putTypeData()
//
}
fun putTypeData() {
for(i in nameType.indices){
val type = TypeCard(nameType[i], bgType[i])
typeList.add(type)
}
typeCard.value = typeList
}

}


Решение проблемы

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

typeRecy = itemView.findViewById(R.id.typeRecy)
typeRecy.layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
typeRecy.setHasFixedSize(true)
val recyclerAdapter = recyclerAdapter(emptyList())
typeRecy.adapter = recyclerAdapter
typeVM = ViewModelProvider(this)[TypeViewModel::class.java]

Во-вторых, вам не нужны две переменные (typeCard и typeList), а только одна из них, которая будет MutableLiveData:

class TypeViewModel: ViewModel() {

val typeCard = MutableLiveData<ArrayList<TypeCard>>()
fun setList() {
arrayOf(
"Pizza" to R.drawable. group_1,
"Tacos" to R.drawable. group_3,
"Salads" to R.drawable. group_4,
"Burgers" to R.drawable. group_2,
"Soups" to R.drawable. group_5,
"Drinks" to R.drawable. group_8
).map { (nameType, backgroundType) ->
TypeCard(nameType, backgroundType)
}.let(typeCard::postValue)
}

}

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


typeRecy = itemView.findViewById(R.id.typeRecy)
typeRecy.layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
typeRecy.setHasFixedSize(true)
val recyclerAdapter = recyclerAdapter(emptyList())
typeRecy.adapter = recyclerAdapter
typeVM = ViewModelProvider(this)[TypeViewModel::class.java]
typeVM.setList()
typeVM.typeCard.observe(viewLifecycleOwner, Observer {
recyclerAdapter.updateList(it)
})

Скомпилируйте папку с файлами .java и заархивируйте ее.

Я пытаюсь понять, как скомпилировать папку с исходными файлами Java. Существует структура папок (корневые папки — org.AppName.i18n и META-INF). В конце концов мне нужно получить Jar с той же структурой, а.java конвертируется в.class. Любые подсказки, как это сделать? Я на Windows.


Решение проблемы

Для этого вы можете использовать Ant: http://ant.apache.org/

Аргумент шаблона зависит от использования/объявления typedef

Как я могу написать using(или typedef) объявление, которое зависит от аргумента шаблона? Я хотел бы добиться чего-то вроде этого:

template<typename T>
class Class
{
// T can be an enum or an integral type
if constexpr (std::is_enum<T>::value) {
using Some_type = std::underlying_type_t<T>;
} else {
using Some_type = T;
}
};

Решение проблемы

Именно std::conditionalдля этого:

template <class T>
class Class
{
using Some_type = typename std::conditional_t<std::is_enum<T>::value, std::underlying_type<T>, std::type_identity<T>>::type;
};

std::type_identityиз С++ 20, который, если у вас его нет, легко воспроизвести самостоятельно:

template< class T >
struct type_identity {
using type = T;
};

Это необходимо, поскольку std::underlying_type<T>::typeне существует, если Tне является перечислением и std::conditionalне может предотвратить выполнение этой оценки.

Add notification to Windows notification center without displaying it on screen

Я создаю приложение Electron с настраиваемой функцией уведомлений, в которой элементы div html5 появляются и исчезают по мере необходимости в бескаркасном прозрачном окне всегда поверх.

Это прекрасно работает, но: мне по-прежнему нравится сам центр уведомлений Windows, и я хотел бы иметь возможность просматривать там прошлые уведомления, фактически не отображая их на экране с API HTML5.

Я пытался:

  • Поиск в HTML5 API для возможности не показывать уведомление или сразу.hide() его: не повезло. Единственный близкий метод —.close(), и он также удаляет уведомление из центра.

  • Изучая такие пакеты, как node-notifier, ни одна из используемых зависимостей уведомлений не предлагает способ полностью скрыть уведомление.

  • Хотя я упомянул Node, я также приму любой API/привязку более низкого уровня, который позволит мне это сделать.

    Заранее спасибо.


    Решение проблемы

    С помощью @treckstar в комментариях я нашел способ сделать то, что хотел, используя:

  • NodeRT

  • Атрибут ToastNotification.SuppressPopup _

  • Несмотря на несколько проблем со сборкой NodeRT и использованием электронной перестройки, вот работающий PoC:

    const { XmlDocument } = require('@nodert-win10-rs4/windows.data.xml.dom');
    const {
    ToastNotification,
    ToastNotificationManager
    } = require('@nodert-win10-rs4/windows.ui.notifications');
    const localImage = path.join(__dirname, 'icon.png');
    const template = `
    <toast launch="app-defined-string">
    <visual>
    <binding template="ToastGeneric">
    <image id="1" placement="appLogoOverride" hint-crop="circle" src="${localImage}"/>
    </binding>
    </visual>
    </toast>
    `;
    const xml = new XmlDocument();
    xml.loadXml(template);
    const toast = new ToastNotification(xml);
    const notifier = ToastNotificationManager.createToastNotifier("com.myapp.testnotif");
    toast.suppressPopup = true;
    notifier.show(toast);

    Пусть это поможет тому, кто столкнется с той же очень конкретной проблемой.

    Teamcity — CI/CD — iOS — xcodebuild — подписывание — сертификат подписи «Разработка iOS» не найден

    У меня Teamcity установлен с агентом на MAC. Когда я пытаюсь создать проект iOS, у меня возникает эта ошибка:

    error: No signing certificate "iOS Development" found: No "iOS Development" signing certificate matching team ID "#######" with a private key was found. (in target 'App' from project 'App').

    Я использую эту командную строку:

    /Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -workspace ios/App/App.xcworkspace -scheme App clean build

    Я проверил команду в терминале прямо на Mac, и она работает! Мои сертификаты находятся в связке ключей в сеансе пользователя, который запускает агент Teamcity.

    Я попытался поместить сертификат в другую цепочку для ключей и предоставить доступ к процессу, который выполняется Teamcity, с помощью этой команды:

    security unlock-keychain -p [password] ~/Library/Keychains/teamcity.keychain-db

    Любые идеи?


    Решение проблемы

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

    Показывать данные из таблицы, даже если данных нет

    У меня есть 3 таблицы:введите описание изображения здесь

    Данные в Companiaтаблице:

    введите описание изображения здесь

    Данные в Periodoтаблице:

    введите описание изображения здесь

    Данные в VAC_PERIODOCIAтаблице:

    введите описание изображения здесь

    Я хочу показать все компании ( COMPANIA) и значение в ( vac_aplicaстолбце) при поиске Periodo, независимо от того, зарегистрированы они или нет.

    Я пробовал это:

    SELECT
    COMPANIA.CIA_CLAVE, COMPANIA.CIA_NOM,
    CASE
    WHEN VAC_PERIODOCIA.VAC_APLICA IS NULL
    THEN 'N'
    ELSE 'Y'
    END VAC_APLICA
    FROM
    COMPANIA
    LEFT JOIN
    VAC_PERIODOCIA ON COMPANIA.CIA_CLAVE = VAC_PERIODOCIA.CIA_CLAVE
    WHERE
    VAC_PERIODOCIA.PERIODO = '2018 - 2019'

    Результат:

    введите описание изображения здесь

    Я хочу вот что:

    введите описание изображения здесь


    Решение проблемы

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

    Я не говорю по-испански, поэтому могу только предположить, что VAC_PERIODICA — это Periodo. В этом случае вам нужно переместить то, что у вас есть в условии, в предложение соединения. Как это

    SELECT COMPANIA.CIA_CLAVE,COMPANIA.CIA_NOM,
    CASE
    WHEN Periodo.valor IS NULL THEN 'N'
    ELSE 'Y'
    END VAC_APLICA
    FROM Compania
    LEFT JOIN Periodo
    ON COMPANIA.CIA_CLAVE = Periodo.valor
    AND Periodo.PERIODO = '2018 - 2019'
    order by 1

    dbfiddle

    Матричное умножение собственной матрицы для подмножества столбцов








    Решение проблемы

    Использование симметрии

    Вы можете воспользоваться тем, что результирующая матрица будет симметричной, например:

    Mat sub_mat = subset_cols(mat, idx); // From your original post
    Mat a = Mat::Zero(numRows, numRows);
    a.selfadjointView<Eigen::Lower>().rankUpdate(sub_mat); // (1)
    a.triangularView<Eigen::Upper>() = a.transpose(); // (2)

    Линия (1)будет вычисляться a += sub_mat * sub_mat.transpose()только для нижней части. (2)затем запишет нижнюю часть в верхнюю часть. Также смотрите документацию ( здесь и здесь ). Конечно, если вы можете жить только с нижней частью, шаг (2) можно пропустить.

    Для матрицы 100x100000 matя получаю ускорение примерно в 1 раз.

  • ~ 1,1x при 10 столбцах,

  • ~ 1,5x при 100 столбцах,

  • ~1,7x при использовании 1000 столбцов

  • как в Windows с использованием MSVC, так и в Linux с использованием clang с полной оптимизацией и AVX.

    Включение распараллеливания

    Еще один способ ускорить вычисления — включить распараллеливание путем компиляции с OpenMP. Эйген позаботится обо всем остальном. Однако приведенный выше код, использующий симметрию, не выигрывает от этого. Но исходный код

    Eigen::MatrixXd sub_mat = subset_cols(mat, idx);
    Eigen::MatrixXd a = sub_mat * sub_mat.transpose();

    делает.

    Для матрицы 100x100000 matс помощью clang в Linux, работающей с 4 потоками (на 4 реальных ядрах) и по сравнению с одним потоком, я получаю ускорение примерно в 1 раз.

  • ~1.0x при использовании 10 столбцов, т.е. никакого ускорения.

  • ~ 1,8x при 100 столбцах

  • ~ 2,0x при использовании 1000 столбцов

  • Другими словами, 4 ядра или более превосходят симметричный метод, показанный выше, за исключением очень небольшого количества столбцов. Использование только 2 ядер всегда было медленнее. Обратите внимание, что использование SMT ухудшало производительность в моих тестах, иногда заметно.

    Другие примечания

    Я уже писал это в комментарии, но для полноты картины:
    Eigen::Mapне получится, потому что шаги не равноудалены. Использование нарезки дает мне примерно на 10% лучшую производительность, чем ваш метод копирования в Linux с clang и gcc, но несколько хуже на MSVC. Кроме того, как вы заметили, он недоступен в ветке Eigen 3.3. Существует собственный способ имитировать его, но в моих тестах он всегда работал хуже. Кроме того, в моих тестах он не экономил память по сравнению с методом копирования.

    Я думаю, что трудно превзойти сам метод копирования в отношении производительности, потому что собственные матрицы по умолчанию являются основными по столбцам, а это означает, что копирование нескольких столбцов довольно дешево. Более того, не зная подробностей, я подозреваю, что Eigen может затем применить всю мощь своей оптимизации к полной матрице, чтобы вычислить продукт и транспонировать, не имея дело с представлениями или чем-то подобным. Это может дать Eigen больше шансов для векторизации или кэширования.

    Кроме того, следует не только включить оптимизации, но и использовать максимально возможный набор инструкций. Включение AVX в моих тестах улучшило производительность примерно в 1,5 раза. К сожалению, я не могу протестировать AVX512.

    Получить весь контент консоли в файл

    Я пытаюсь получить все журналы консоли в файл.

    Я нашел такие сообщения. Я тестировал это: содержимое не отображается с помощью NSLog (он отображается с печатью), но данные не записываются в файл, ни NSLog, ни данные для печати.

    Когда приложение закрывается, я закрываю файл.

    Я сделал следующее:

    var file: UnsafeMutablePointer<FILE>?
    func logAll() {
    let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory,.userDomainMask, true)
    let filename = "/\(Date().timeIntervalSinceReferenceDate).log"
    let logFilePath = paths[0].appending(filename)
    file = freopen(logFilePath.cString(using:.ascii), "a+", stderr)
    }
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    logAll()
    /// rest of the code
    }
    func applicationWillTerminate(_ application: UIApplication) {
    if let file = file {
    fclose(file)
    }
    }

    Что мне здесь не хватает?


    Решение проблемы

    Хорошо, у меня есть это.

    Есть 3 стандартных файла: stdinиstdoutstderr

    Поскольку я просто пробовал с отпечатками, я этого не видел, но обычные отпечатки хранятся в stdoutфайле. Позже, пытаясь в проекте с большим количеством библиотек, кажется (firebase, например), журналы хранятся в файлах stderr.

    Итак, вместо того, чтобы открывать только один файл, мне нужно просто открыть 3 файла, чтобы получить все журналы.

    Единственный недостаток в том, что у меня нет способа получить правильный порядок

    Не удается отправить XMLHttpRequest

    Я пытаюсь удалить данные с помощью vanilla javascript ajax. После отправки POST-запроса со значением идентификатора в файл php. Каждый раз в консоли пишет "ошибка".

    HTML

    <div class="deleteButton" onclick="showAllert(this)" id="1">
    <i class="fa-solid fa-trash-can fa-2x" style="color:#A81E22" title="delete"></i>
    </div>

    ЯВАСКРИПТ

    <script>
    function showAllert(a) {
    // sent delete request
    var dataId = a.getAttribute("id");
    var dataId = parseInt(dataId);
    var xhr = new XMLHttpRequest();
    xhr.open('POST', 'includes/vehicles/del-veh.php', true);
    // xhr.responseType = 'json';
    xhr.onload = () => {
    if(xhr.status === 200) {
    console.log(xhr.response);
    location.reload();
    }else {
    console.log("There was a problem");
    }
    }
    var data = JSON.stringify({id: dataId});
    xhr.send(data);

    }
    </script>

    PHP

    <?php
    //Connection statement
    require_once('../../Connections/ukcd.php');
    $data = json_decode(file_get_contents('php://input'), true);
    if(!empty($data["id"])) {
    // Required variables
    $vehid = $data['id'];
    echo "success";
    }else {
    echo "error";
    }
    //AUTOEXECUTE METHOD
    $delveh = $ukcd->prepare('DELETE FROM a_ukcd_client_vehicles WHERE clientveh_id =?');
    $result = $ukcd->execute($delveh, $vehid);

    Решение проблемы

    Отправьте данные POST в формате urlencoded:

    <script>
    function showAllert(a) {
    // sent delete request
    var dataId = a.getAttribute("id");
    var dataId = parseInt(dataId);
    var xhr = new XMLHttpRequest();
    xhr.open('POST', 'includes/vehicles/del-veh.php', true);
    // xhr.responseType = 'json';
    xhr.onload = () => {
    if(xhr.status === 200) {
    console.log(xhr.response);
    location.reload();
    }else {
    console.log("There was a problem");
    }
    }
    // var data = JSON.stringify({id: dataId});
    xhr.send(`id=${dataId}`);

    }
    </script>

    И в вашем PHP-скрипте:

    <?php
    //Connection statement
    require_once('../../Connections/ukcd.php');
    $id= $_POST['id'];
    if(!empty($id)) {
    // Required variables
    $vehid = $id;
    echo "success";
    }else {
    echo "error";
    }
    //AUTOEXECUTE METHOD
    $delveh = $ukcd->prepare('DELETE FROM a_ukcd_client_vehicles WHERE clientveh_id =?');
    $result = $ukcd->execute($delveh, $vehid);

    четверг, 12 мая 2022 г.

    Можно ли иметь более одного сервера OAUTH2 в quarkus?

    Можно легко определить сервер OAUTH2 на основе документации quarkus.

    quarkus.oauth2.client-id=XXXX
    quarkus.oauth2.client-secret=YYYY
    quarkus.oauth2.introspection-url=https://example.com/oauth2/...

    Как мне настроить quarkus, если я должен предоставить пользователям возможность выбирать своего собственного провайдера OAUTH2 (github, gitlab, что угодно)?


    Решение проблемы

    Одним из решений может быть запуск отдельных экземпляров Quarkus для каждого поставщика OAuth2.

    Если вам нужно, чтобы все запросы отправлялись по одному и тому же пути и порту, можно создать экземпляр посредника для обработки запросов и отправки их в соответствующий экземпляр с выбранным провайдером OAuth2.

    Несколько возвращаемых значений для указания успеха/неудачи.

    Мне интересно получить отзывы об этой технике, которую я откуда-то взял.

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

    По сути, метод включает в себя возврат true в случае успеха и что- то, что соответствует false в случае неудачи. Вот пример, чтобы показать, что я имею в виду:

    define ('DUPLICATE_USERNAME', false);
    define ('DATABASE_ERROR', 0);
    define ('INSUFFICIENT_DETAILS', 0.0);
    define ('OK', true);
    function createUser($username) {
    // create the user and return the appropriate constant from the above
    }

    Прелесть этого в том, что в вашем вызывающем коде, если вам все равно, ПОЧЕМУ создание пользователя не удалось, вы можете написать простой и читаемый код:

    if (createUser('fred')) {
    // yay, it worked!
    } else {
    // aww, it didn't work.
    }

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

    $status = createUser('fred');
    if ($status) {
    // yay, it worked!
    } else if ($status === DUPLICATE_USERNAME) {
    // tell the user about it and get them to try again.
    } else {
    // aww, it didn't work. log it and show a generic error message? whatever.
    }

    На мой взгляд, преимущества этого заключаются в том, что это нормальное ожидание, что успешное выполнение такой функции вернет true, а неудача вернет false.

    Недостатком является то, что вы можете иметь только 7 "error" return values: false, 0, 0.0, "0", null, "", and (object) null.если вы забудете использовать проверку личности, вы можете неправильно выполнить свою программу. Кто-то еще сказал мне, что использование таких констант, как, enumгде все они приравниваются к false, является "ick".

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


    Решение проблемы

    Я согласен с другими, которые заявили, что это немного на стороне WTFy. Если это четко задокументированная функциональность, то это не проблема, но я думаю, что было бы безопаснее выбрать альтернативный путь возврата 0 для успеха и целых чисел для кодов ошибок. Если вам не нравится эта идея или идея глобальной переменной последней ошибки, рассмотрите возможность переопределения вашей функции как:

    function createUser($username, &$error)

    Затем вы можете использовать:

    if (createUser('fred', $error)) {
    echo 'success';
    }
    else {
    echo $error;
    }

    Внутри createUser просто заполните $error любой ошибкой, с которой вы столкнулись, и она будет доступна за пределами области действия функции благодаря ссылке.

    как я могу установить случайный цвет для текстовой области?

    Привет, я хочу сделать своего рода проверку типов. поэтому, когда вы помещаете какой-либо текст в поле ввода, этот текст появляется в текстовой области. Я хочу установить случайный цвет текста для текстовой области. Я использовал этот код:


    let letters = document.querySelector('#txt').innerHTML.split('');
    let quote = document.querySelector('#author').innerHTML.split('');
    // Converts integer to hex
    const colToHex = (c) => {
    // Hack so colors are bright enough
    let color = (c < 75)? c + 75: c
    let hex = color.toString(16);
    return hex.length == 1? "0" + hex: hex;
    }
    // uses colToHex to concatenate
    // a full 6 digit hex code
    const rgbToHex = (r,g,b) => {
    return "#" + colToHex(r) + colToHex(g) + colToHex(b);
    }
    // Returns three random 0-255 integers
    const getRandomColor = () => {
    return rgbToHex(
    Math.floor(Math.random() * 255),
    Math.floor(Math.random() * 255),
    Math.floor(Math.random() * 255));
    }
    // This is the prototype function
    // that changes the color of each
    // letter by wrapping it in a span
    // element.
    Array.prototype.randomColor = function() {
    let html = '';
    this.map( (letter) => {
    let color = getRandomColor();
    html +=
    "<span style=\"color:" + color + "\">"
    + letter +
    "</span>";
    })
    return html;
    };
    // Set the text
    document.querySelector('#txt').innerHTML = letters.randomColor();
    document.querySelector('#author').innerHTML = quote.randomColor();

    но это не работает... Есть ли какие-либо решения..? С Уважением.


    Решение проблемы

    В соответствии с вашим требованием цвет каждой буквы не может отображаться в текстовой области, потому что вы не можете использовать теги html внутри текстовой области, но можете отображать в div со contenteditable="true"свойством.


    function myFunction(){
    document.getElementById("myDiv").innerHTML = "";
    let inputValue = document.getElementById("myInput").value
    let splitValue = inputValue.split("");
    splitValue.forEach((element)=>{
    let text = element;
    let result = text.fontcolor(getRandomColor());
    document.getElementById("myDiv").innerHTML += result
    })
    }
    function getRandomColor() {
    var letters = '0123456789ABCDEF';
    var color = '#';
    for (var i = 0; i < 6; i++) {
    color += letters[Math.floor(Math.random() * 16)];
    }
    return color;
    }
    .divTextArea {
    border: 1px solid black;
    min-width: 175px;
    min-height: 100px;
    max-width: max-content;
    max-height: max-content;
    margin-top: 5px;
    border-radius: 3px;
    }
    <input id="myInput" type="text" onchange="myFunction()">
    <div class="divTextArea" contenteditable="true" id="myDiv"></div>

    Связывание 64-битного NASM с MinGW-64 вызывает ошибку «Формат файла не распознан»

    Я пытаюсь собрать и связать 64-битную программу NASM в Windows, используя MinGW-64bit, с помощью следующей пакетной команды:

    nasm -f win64 HelloWorld.asm && "C:\Program Files (x86)\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw32\bin\gcc.exe" HelloWorld.obj -o HelloWorld.exe

    Но я получаю эту ошибку:

    HelloWorld.obj: file not recognized: File format not recognized
    collect2.exe: error: ld returned 1 exit status

    Как я могу это исправить?


    Решение проблемы

    Получается, что, хотя я скачал и установил MinGW-64, у меня все равно появилась 32-битная версия, потому что при установке я выбрал опцию i686. Я переустановил с опцией «x86-64», и это решило проблему.

    Можно ли вводить байты PDF прямо в PyPDF2 вместо того, чтобы сначала создавать файл PDF

    Я использую Linux; печать необработанных данных на порт 9100 возвращает тип «байты». Мне было интересно, можно ли перейти от этого прямо к PyPDF2, вместо того, чтобы сначала создавать файл PDF и использовать метод PdfFileReader?

    Спасибо за ваше время.


    Решение проблемы

    PyPDF2.PdfFileReader()определяет свой первый параметр как:


    поток — объект File или объект, который поддерживает стандартные методы чтения и поиска, аналогичные объекту File. Также может быть строкой, представляющей путь к файлу PDF.


    Таким образом, вы можете передавать ему любые данные, если к ним можно получить доступ как к файловому потоку. Идеальный кандидат для этого io.BytesIO(). Запишите на него полученные необработанные байты, затем вернитесь к 0, передайте объект, PyPDF2.PdfFileReader()и все готово.

    как я могу решить эту проблему при продаже моего сайта для публикации [закрыто]







    Закрыто. Этот вопрос нуждается в деталях или ясности. В настоящее время ответы не принимаются.


    Решение проблемы

    Как решить проблему 500 — внутренняя ошибка сервера?

    Решение ниже описывает, что необходимо сделать для разработчиков программного обеспечения. Если вы обычный пользователь и сталкиваетесь с ошибкой 500 — внутренняя ошибка сервера на веб-сайте, то это ошибка на стороне сервера, поэтому вы не можете решить эту ошибку. Владелец сайта должен исправить ошибку.

    Как решить 500 - Внутренняя ошибка сервера?

    500 — внутренняя ошибка сервера — это распространенное сообщение об ошибке на веб-сайтах, работающих на IIS.

    На самом деле ошибка 500 — внутренняя ошибка сервера — это закрытое сообщение об ошибке. Другими словами, если ошибка есть, то она скрыта с точки зрения безопасности. В этих возможных ошибках web.config он предотвращает печать на экране строк, которые не должны видеть пользователи, а строки, которые должны оставаться скрытыми в коде, не обслуживаются для всех пользователей из-за ошибки.

    Чтобы устранить ошибку 500 — Внутренняя ошибка сервера, в первую очередь необходимо вывести на экран сведения об ошибке через файл web.config.

    Чтобы вывести сведения об ошибке на экран, отредактируйте файл web.config следующим образом:

    Если вы используете IIS 6;

    <configuration>
    <system.web>
    <customErrors mode="Off"/>
    </system.web>
    </configuration>

    Если вы используете IIS 7, IIS 7.5, IIS 8.5;

    <configuration>
    <system.webServer>
    <httpErrors errorMode="Detailed" />
    </system.webServer>
    <system.web>
    <customErrors mode="Off"/>
    </system.web>
    </configuration>

    Отредактируйте файл web.config следующим образом. После этого процесса сообщение об ошибке, которое появится на экране, изменится следующим образом:

    HTTP Error 500.19 - Internal Server Error
    The requested page cannot be accessed because the related configuration data for the page is invalid.
    Detailed Error Information:
    Module DefaultDocumentModule
    Notification ExecuteRequestHandler
    Handler StaticFile
    Error Code 0x800700b7
    Config Error Cannot add duplicate collection entry of type 'add' with unique key attribute 'value' set to 'index.aspx'
    Config File \\?\D:\vhosts\example.net\httpdocs\web.config
    Requested URL http://www.example.net:80/
    Physical Path D:\vhosts\example.net\httpdocs
    Logon Method Anonymous
    Logon User Anonymous
    Config Source:
    93: <files>
    94: <add value="index.aspx" />
    95: </files>

    Ошибка в этом сообщении об ошибке связана с недопустимой конфигурацией в файле web.config. Строка, вызвавшая ошибку, отображается в разделе источника конфигурации. Редактирование этой строки решит проблему.

    500 — внутренняя ошибка сервера — закрытое сообщение об ошибке. Чтобы устранить ошибку, необходимо отобразить подробное сообщение об учетной записи и принять соответствующие меры.

    Например, если вашему приложению требуется.Net Framework 4, а ваша конфигурация —.Net Framework 2.0, вы все равно увидите 500 — внутренняя ошибка сервера. Когда вы откроете сведения об ошибке, вы увидите совершенно другое сообщение об ошибке, подобное этому:

    Server Error in '/' Application.
    Configuration Error
    Description: An error occurred during the processing of a configuration file required to service this request. Please review the specific error details below and modify your configuration file appropriately.
    Parser Error Message: Unrecognized attribute 'targetFramework'. Note that attribute names are case-sensitive.
    Source Error:
    An application error occurred on the server. The current custom error settings for this application prevent the details of the application error from being viewed remotely (for security reasons). It could, however, be viewed by browsers running on the local server machine.
    Source File: D:\vhosts\example.net\httpdocs\web.config Line: 42
    Version Information: Microsoft.NET Framework Version:2.0.50727.8009; ASP.NET Version:2.0.50727.8015

    Как видно из приведенных выше примеров, для устранения ошибки 500 — внутренняя ошибка сервера первым шагом должно быть открытие сведений об ошибке через файл web.config, а затем следует выполнить подход в соответствии с полученной ошибкой.

    Маркер не показывает @react-google-maps/api на локальном хосте next.js

    Я знаю, что есть похожие вопросы на этот... но никто не ответил на мой вопрос

    Я пытаюсь добавить маркер на свою карту Google, но он не отображается, когда я запускаю проект локально (он отлично работает, когда я работаю на своем сайте).

    Вот мой компонент

    import { React, useMemo } from "react";
    import { GoogleMap, Marker, useJsApiLoader } from "@react-google-maps/api";
    import MapContainerStyles from "./styles/MapContainerStyles";
    const Map = () => {
    const { isLoaded } = useJsApiLoader({
    googleMapsApiKey: API_KEY,
    });
    const center = useMemo(() => ({ lat: -30.292038, lng: 153.118896 }), []);
    const onLoad = (marker) => {
    console.log("marker: ", marker);
    };
    const options = {
    mapTypeControl: false,
    streetViewControl: false,
    fullscreenControl: false,
    };
    if (!isLoaded) return <div>Loading...</div>;
    return (
    <GoogleMap zoom={15} options={options} center={center} mapContainerClassName="map-container">
    <Marker onLoad={onLoad} position={center} />
    </GoogleMap>
    );
    };
    export default Map;

    Журналы консоли для маркеров onLoad возвращают следующее

    введите описание изображения здесь

    В консоли ошибок нет

    Я просмотрел несколько ресурсов, и кажется, что я все делаю правильно... но маркер просто не отображается

    любая помощь будет оценена


    Решение проблемы

    У меня была такая же проблема при использовании@react-google-maps/api@2.10.2

    Чтобы решить проблему, я понизился до@react-google-maps/api@2.7.0

    Идентификация пользователя OPC UA

    Я пытаюсь подключиться к серверу OPC-UA, используя установленные мной учетные данные.

    //пользователь

    var user = new UserIdentity("admin", "admin");

    //сессия

    var session = Session.Create(config, new ConfiguredEndpoint(null, selectedEndpoint, EndpointConfiguration.Create(config)), false, "", (uint)6000, user, null).GetAwaiter().GetResult();

    Я всегда получаю ошибку:


    Не удалось подключиться Сертификат не является доверенным.


    Когда я вхожу анонимно, это работает.

    Что я делаю не так?


    Решение проблемы

    Чтобы использовать имя пользователя и пароль в OPC UA, они должны быть зашифрованы во время передачи. Это шифрование выполняется с использованием сертификата X.509. Поэтому вам необходимо обмениваться и доверять сертификатам X.509 с сервером OPC UA, даже если вы не шифруете оставшуюся часть сеанса.

    Проверьте свой API, чтобы узнать, как это сделать. Ваш сертификат также должен быть доверенным на сервере.

    Проверка типа Python 2d список

    Как ввести проверку для 2d-списка? Я знаю, что проверка типа списка 1d в параметре функций будет:

    apples = list(["granny smith","fiji"])
    foo(apples)
    def foo(fruits:list):
    print("Typed check passed")

    Но как это сделать для 2d-списка?

    board=list([list([1,2]),list([3,4])])
    bar(board)
    def bar(board:list:list): # My Guess Attempt
    print("Type check passed")

    Решение проблемы

    Вы можете использовать общие конкретные коллекции:

    # for python >= 3.9
    def bar(list[list[int]]):
    ...
    # for older versions:
    from typing import List
    def bar(List[List[int]]):
    ...

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

    Head First Java-Page 192 (Смешанные сообщения)

    Я пытаюсь задать пример вопроса из Head First Java:

    Вопрос, который я пытаюсь

    Я набрал его, как на netbeans. Создание 3 классов как classA, classB, classC и метод Main как смешанный класс. В классе, смешанном с я получаю сообщение об ошибке, может ли кто-нибудь объяснить мне, почему это происходит и как это решить?

    public class classA {
    int ivar =7;
    void m1(){
    System.out.println("A's m1, ");
    }
    void m2(){
    System.out.println("A's m2, "); }
    void m3(){
    System.out.println("A's m3, ");
    }
    }
    public class classB extends classA {
    void m1(){
    System.out.println("B's m1, ");
    }
    }
    public class classC extends classB {
    void m3(){
    System.out.println("C's m3, "+(ivar + 6));}
    }
    public class Mixed2 {
    public static void main(String[] args) {
    a=new A();
    //Error Cant find symbol,Symbol:Variable a location:class mixed 2
    b=new B(); //Same error above and below
    c=new C();
    a2=new C();
    }
    }

    Решение проблемы

    да, вы можете напечатать все это в одном классе. Пожалуйста, взгляните на приведенный ниже код. Поскольку вы все еще изучаете его лучше всего, вы печатаете его как есть, не пытаясь что-то изменить, что можно сделать позже, когда вы освоите язык. Удачного обучения!.

    public class mixedsample {
    public static void main(String[] args) {
    A a=new A();
    B b=new B();
    C c=new C();
    A a2=new C();
    /* b.m1();
    c.m2();
    a.m3();
    Answer=B's,m1,A's,m2,A's,m3*/
    /* c.m1();
    c.m2();
    c.m3();
    A's,m1,A's,m2,A's,m3 */
    /* a.m1();
    b.m2();
    c.m3();
    A's,m1,A's,m2,A's,m3 */
    /* a2.m1();
    a2.m2();
    a2.m3();
    A's,m1A's,m2,A's,m3 */
    }
    }
    class A{
    int ivar=7;
    void m1(){
    System.out.println("A's,m1 ");
    }
    void m2(){
    System.out.println("A's,m2 ");
    }
    void m3(){
    System.out.println("A's,m3 ");
    }
    }
    class B extends A {
    void m1(){
    System.out.println("B's,m1 ");
    }
    }
    class C extends B{
    void m1(){
    System.out.println("A's,m1 ");
    }
    }

    Как я могу отправить запрос на извлечение через командную строку в Bitbucket?

    Мне нужно отправить много запросов на включение, поэтому я бы предпочел использовать командную строку bash, а не веб-интерфейс битбакета.

    Пример использования:$ git-req username

    Вот такой скрипт для Github: http://pastebin.com/F9n3nPuu

    Есть ли такой для Bitbucket?


    Решение проблемы

    Bitbucket с RESTful API 2.0 поддерживает управление запросами на вытягивание без интерфейса. В CLI вы можете запросить его с помощью CURL. Эта старая версия документации содержит более подробные сведения об интерфейсе.

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

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

    $ curl --user s3m3n:bbpassword https://bitbucket.org/api/2.0/repositories/s3m3n/reponame/pullrequests/4

    Взамен я получаю JSON с полной информацией о моем запросе на включение № 4 (дважды введите свое имя пользователя, пароль и reponame в команде).

    Создайте новый запрос на вытягивание с RESTClient

    Чтобы создать новый запрос на вытягивание, нам нужно предоставить много данных с помощью команды POST, как это выглядит в моем RESTClient:

    RESTКлиент Firefox

    После запуска Bitbucket сразу показывает запрос на извлечение:

    Скриншот Bitbucket

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

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

    $ curl -X POST -H "Content-Type: application/json" -u s3m3n:bbpassword https://bitbucket.org/api/2.0/repositories/s3m3n/reponame/pullrequests -d '{ "title": "Merge some branches", "description": "stackoverflow example", "source": { "branch": { "name": "choose branch to merge with" }, "repository": { "full_name": "s3m3n/reponame" } }, "destination": { "branch": { "name": "choose branch that is getting changes" } }, "reviewers": [ { "username": "some other user needed to review changes" } ], "close_source_branch": false }'

    Браузерный инструмент REST(прекращено)

    Если вы хотите протестировать все возможные методы API, перейдите к инструменту браузера REST Bitbucket. Он покажет вам все возможные запросы при возврате данных вашего реального репо.

    Как отфильтровать массив объектов по дате

    У меня есть массив объектов, которые мне нужно отфильтровать и вернуть только самые близкие к сегодняшнему дню объекты. Проблема, с которой я сталкиваюсь, заключается в том, что она возвращает дату в июне, а не в мае. вот код, который я использую:

    const findClosest = (data, accessor, target = Date.now()) =>
    data.reduce((prev, curr) => {
    const a = Math.abs(accessor(curr).getTime() - target);
    const b = Math.abs(accessor(prev).getTime() - target);
    return a - b < 0? curr: prev;
    });
    const getClosestFromDate = (array, key, date) => {
    let arr = array.filter((e) => e[key] == date);
    return arr;
    };
    const sampleData = [{
    "max_retries_reached": 0,
    "next_charge_scheduled_at": "2022-06-23T00:00:00",
    },
    {
    "max_retries_reached": 0,
    "next_charge_scheduled_at": "2022-06-23T00:00:00",
    },
    {
    "is_swappable": true,
    "max_retries_reached": 0,
    "next_charge_scheduled_at": "2022-06-23T00:00:00",
    },
    {
    "max_retries_reached": 0,
    "next_charge_scheduled_at": "2022-06-23T00:00:00",
    },
    {
    "next_charge_scheduled_at": "2022-05-23T00:00:00",
    "order_day_of_month": null,
    },
    {
    "max_retries_reached": 0,
    "next_charge_scheduled_at": "2022-07-23T00:00:00",
    "order_day_of_month": null,
    },
    {
    "max_retries_reached": 0,
    "next_charge_scheduled_at": "2022-05-23T00:00:00",
    "order_day_of_month": null,
    },
    {
    "max_retries_reached": 0,
    "next_charge_scheduled_at": "2022-05-23T00:00:00",
    "order_day_of_month": null,
    },
    {
    "next_charge_scheduled_at": "2022-07-23T00:00:00",
    "order_day_of_month": null,
    },
    ];
    const processDateString = (dateString) => {
    let date = new Date(dateString);
    let year = date.getFullYear();
    let month = date.getMonth();
    console.log(date.toString());
    return new Date(year, month + 1, date);
    };
    const closest = findClosest(sampleData, ({
    next_charge_scheduled_at
    }) => processDateString(next_charge_scheduled_at), "2022-05-10T03:03:42");
    console.log(closest.next_charge_scheduled_at);
    console.log(getClosestFromDate(sampleData, "next_charge_scheduled_at", closest.next_charge_scheduled_at));

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


    Решение проблемы

    Вы слишком усложнили себе жизнь:

    (Я пересмотрел свой ответ после прочтения последнего комментария ОП.)

    Const acc— это утилита function(obj), которая захватывает next_charge_scheduled_atсвойство obj, превращает его в dateобъект и затем возвращает его .getTime()значение.

    findClosest(sampleData,acc)возвращает единственный объект данного sampleDataмассива, ближайший к целевому времени ( Date.now()). Затем я сохраняю .getTime()значение этого элемента в константе closestи снова использую его для фильтрации исходного входного массива:


    const sampleData = [{
    "max_retries_reached": 0,
    "next_charge_scheduled_at": "2022-06-23T00:00:00",
    },
    {
    "max_retries_reached": 0,
    "next_charge_scheduled_at": "2022-06-23T00:00:00",
    },
    {
    "is_swappable": true,
    "max_retries_reached": 0,
    "next_charge_scheduled_at": "2022-06-23T00:00:00",
    },
    {
    "max_retries_reached": 0,
    "next_charge_scheduled_at": "2022-06-23T00:00:00",
    },
    {
    "next_charge_scheduled_at": "2022-05-23T00:00:00",
    "order_day_of_month": null,
    },
    {
    "max_retries_reached": 0,
    "next_charge_scheduled_at": "2022-07-23T00:00:00",
    "order_day_of_month": null,
    },
    {
    "max_retries_reached": 0,
    "next_charge_scheduled_at": "2022-05-23T00:00:00",
    "order_day_of_month": null,
    },
    {
    "max_retries_reached": 0,
    "next_charge_scheduled_at": "2022-05-23T00:00:00",
    "order_day_of_month": null,
    },
    {
    "next_charge_scheduled_at": "2022-07-23T00:00:00",
    "order_day_of_month": null,
    },
    ];
    const
    findClosest = (data, accessor, target = Date.now()) =>
    data.reduce((prev, curr) => {
    const a = Math.abs(accessor(curr) - target);
    const b = Math.abs(accessor(prev) - target);
    return a - b < 0? curr: prev;
    }),
    acc=obj=>new Date(obj.next_charge_scheduled_at).getTime(),
    closest=acc(findClosest(sampleData,acc));

    console.log(sampleData.filter(d=>acc(d)===closest));

    среда, 11 мая 2022 г.

    Как исправить ModuleNotFoundError: в pyinstaller нет модуля с именем «reportlab.graphics.barcode.code93»?

    Я конвертирую файл python в.exe с помощью pyinstaller v5.0.1, но я получил эту ошибку при запуске exe-файла:

    ModuleNotFoundError: No module named 'reportlab.graphics.barcode.code93'

    Обратите внимание, что файл python работает отлично, и я даже не использую code93 в своем коде.


    Решение проблемы

    Я исправил эту проблему, добавив импорт для всех этих библиотек, даже если я их не использую:

    from reportlab.graphics.barcode import code93
    from reportlab.graphics.barcode import code39
    from reportlab.graphics.barcode import usps
    from reportlab.graphics.barcode import usps4s
    from reportlab.graphics.barcode import ecc200datamatrix

    Сопоставление и сравнение объектов Rego

    Я пытаюсь сопоставить ключ домена («домен»: «example.com») из заданного ввода и возвращаю ошибку, если значения не идентичны. Это то, о чем я думал до сих пор, но я не могу сопоставить ключ домена, поэтому тесты терпят неудачу. Любой совет будет принят во внимание.

    Политика ОРА:

    package main
    import data.config
    default warning_mode = []
    warning_mode = config.warn_mode { config.warn_mode }
    array_contains(arr, elem) {
    arr[_] = elem
    }
    exception[rules] {
    rules:= config.exceptions.rules
    }
    deny_missing_config[msg] {
    not config
    msg:= "Missing configuration file"
    }
    ## Main
    aws_ses_dkim[a] {
    a:= input.resource_changes[_]
    a.type == "aws_ses_domain_dkim"
    }
    aws_ses_domain[e] {
    e:= input.resource_changes[_]
    e.type == "aws_ses_domain_identity"
    }
    ses_missing_dkim[msg] {
    a:= aws_ses_dkim[_]
    e:= aws_ses_domain[_]
    walk(a, [["values", "domain"], x])
    walk(e, [["values", "domain"], y])
    err:= x - y
    not err == set()
    msg:= sprintf("Placeholder error", [err, a.address, e.address])
    }
    ## Test Cases
    deny_ses_missing_dkim[msg]{
    not array_contains(warning_mode, "ses_missing_dkim")
    ses_missing_dkim[_]!= []
    msg:= ses_missing_dkim[_]
    }
    warn_ses_missing_dkim[msg]{
    array_contains(warning_mode, "ses_missing_dkim")
    ses_missing_dkim[_]!= []
    msg:= ses_missing_dkim[_]
    }
    test_ses_missing_dkim_invalid {
    i:= data.mock.invalid_ses_dkim
    r1:= warn_ses_missing_dkim with input as i with data.config.warn_mode as []
    count(r1) == 0
    r2:= warn_ses_missing_dkim with input as i with data.config.warn_mode as ["ses_missing_dkim"]
    count(r2) == 1
    r3:= deny_ses_missing_dkim with input as i with data.config.warn_mode as []
    count(r3) == 1
    r4:= deny_ses_missing_dkim with input as i with data.config.warn_mode as ["ses_missing_dkim"]
    count(r4) == 0
    count(r1) + count(r2) == 1
    count(r3) + count(r4) == 1
    }
    test_ses_missing_dkim_valid {
    i:= data.mock.ses_dkim
    r1:= warn_ses_missing_dkim with input as i with data.config.warn_mode as []
    r2:= warn_ses_missing_dkim with input as i with data.config.warn_mode as ["ses_missing_dkim"]
    r3:= deny_ses_missing_dkim with input as i with data.config.warn_mode as []
    r4:= deny_ses_missing_dkim with input as i with data.config.warn_mode as ["ses_missing_dkim"]
    count(r1) + count(r2) + count(r3) + count(r4) == 0
    }

    Ввод (терраформ JSON):

    "resource_changes":[
    {
    "address":"aws_ses_domain_dkim.example",
    "mode":"managed",
    "type":"aws_ses_domain_dkim",
    "name":"example",
    "provider_name":"registry.terraform.io/hashicorp/aws",
    "schema_version":0,
    "values":{
    "domain":"example.com"
    },
    "sensitive_values":{
    "dkim_tokens":[

    ]
    }
    },
    {
    "address":"aws_ses_domain_identity.example",
    "mode":"managed",
    "type":"aws_ses_domain_identity",
    "name":"example",
    "provider_name":"registry.terraform.io/hashicorp/aws",
    "schema_version":0,
    "values":{
    "domain":"example.com"
    },
    "sensitive_values":{

    }
    }
    ]

    Решение проблемы

    Значения xи y, полученные walkфункцией, будут строками, поэтому они err:= x - sне будут работать. Если вам нужен набор значений, вы можете обернуть walkвызов в понимание набора, чтобы получить набор всех значений:

    ses_missing_dkim[msg] {
    a:= aws_ses_dkim[_]
    e:= aws_ses_domain[_]
    xs:= {x | walk(a, [["values", "domain"], x])}
    ys:= {y | walk(e, [["values", "domain"], y])}

    err:= xs - ys
    not err == set()

    msg:= sprintf("Placeholder error", [err, a.address, e.address])
    }

    Вам, вероятно, здесь это не нужно walk, так как значения всегда находятся на известном пути.

    Microsoft Teams: список всех чатов независимо от пользователей

    Мы хотели бы добиться интеграции eDiscovery, которая может отслеживать все прошлые и новые сообщения чата и канала.

    Но мы заметили, что с делегированными разрешениями приложение может перечислять только чаты, участником которых является пользователь (администратор или нет); в то время как с разрешениями приложений конечная точка списка чатов не поддерживается.

    Просматривая сайт, мы видим этот вопрос: Как получить чаты MS Teams другого пользователя с помощью Microsoft Graph API?

    Что указывает на то, что это невозможно. Но его вопрос немного отличался от нашего, и это было около года назад. Итак, я хотел бы подтвердить:


    1. Можно ли перечислить ВСЕ чаты в тенанте? Если да, то как?

    2. Если в настоящее время он не поддерживается, есть ли дорожная карта или график его поддержки?

    3. Кажется, связанный вопрос касался выдачи себя за пользователя и списка его/ее чатов. Он все еще не поддерживается?


    Спасибо!


    Решение проблемы

    В настоящее время он находится в нашем отставании, но по нему нет ETA. Вы можете создать подписку и получать все сообщения чата в организации

    Преобразование VARCHAR с операндом деления в INT

    Mam VARCHAR, który zwróci wartość podobną do „40/4".

    Czy istnieje sposób na przekonwertowanie tego VARCHAR na INT. Próbowałem rzucać, ale to nie działa.

    Próbka:

    Declare @test varchar(6) = '40/4'
    Select cast (@test as int) * 4

    Oczekiwane: 40

    Rzeczywisty:


    Konwersja nie powiodła się podczas konwertowania wartości varchar „40/4" na typ danych int


    Uwaga: Wartość 40/4pochodzi z wiadomości zapisanej w jednym z systemów i nie można jej zmienić.

    Doceń wszelką pomoc w tym zakresie.


    Rozwiązanie problemu

    CAST/ CONVERTnie zadziała, ponieważ '40/4'nie jest liczbą, tylko ciągiem reprezentującym wyrażenie matematyczne.

    Jednym ze sposobów rozwiązania tego jest użycie dynamicznego SQL, np.

    declare @test varchar(6) = '40/4';
    declare @sql nvarchar(max) = 'select ' + @test + ' * 4';
    exec sp_executesql @sql;

    Zwroty: 40

    SAS назначает группу и накапливает

    У меня есть набор данных, в котором есть столбцы Event и Time. Мне нужно создать столбцы Group и Cumulative. Что мне нужно измерить, так это продолжительность события «Event1_Stop», пока не появится «Event1_Start». Последняя группа должна суммировать время, означающее, что остановка продолжается, а начало события не введено. Мой образец данных:

    data have;
    length Event $15;
    input Event $ Time;
    datalines;
    Event3_Start 0.2
    Event2_Start 0.4
    Event2_Stop 0.2
    Event1_Stop 0.2
    Event3_Start 0
    Event4_Start 0.5
    Event3_Stop 0.2
    Event1_Start 0
    Event4_Stop 0
    Event4_Stop 0
    Event1_Stop 0.3
    Event3_Start 0.3
    Event1_Start 0
    Event3_Start 0.4
    Event3_Stop 0
    Event1_Stop 0.2
    Event3_Start 0.2
    Event2_Start 0.4
    run;

    Результирующий набор данных, который мне нужно получить:

    data have;
    length Event $15;
    input Event $ Time Group Cumulative;
    datalines;
    Event3_Start 0.2 0 0
    Event2_Start 0.4 0 0
    Event2_Stop 0.2 0 0
    Event1_Stop 0.2 1 0.9
    Event3_Start 0 1 0
    Event4_Start 0.5 1 0
    Event3_Stop 0.2 1 0
    Event1_Start 0 0 0
    Event4_Stop 0 0 0
    Event4_Stop 0 0 0
    Event1_Stop 0.3 2 0.6
    Event3_Start 0.3 2 0
    Event1_Start 0 0 0
    Event3_Start 0.4 0 0
    Event3_Stop 0 0 0
    Event1_Stop 0.2 3 0.8
    Event3_Start 0.2 3 0
    Event2_Start 0.4 3 0
    run;

    Спасибо за ваши предложения. С уважением.


    Решение проблемы

    Спасибо @mkeintz на форуме SAS за решение:

    data stop_to_start (keep=group cumulative);
    set have end=end_of_have;
    group+(event='Event1_Stop');
    if event='Event1_Stop' then cumulative=0;
    cumulative+time;
    if end_of_have or event='Event1_Start';
    run;
    data want;
    set have;
    if _n_=1 or event='Event1_Start' then group=0;
    cumulative=0;
    if event='Event1_Stop' then set stop_to_start;
    run;

    Запрос PostgreSQL к Supabase Query

    ¿Cómo puedo hacer una vez de estas consultas de PostgreSQL en supabase? Traté de leer supabase doc pero no funciona

    select rooms.id as room_id, members.id as member_id, user_id from rooms
    inner join members
    on rooms.id = members.room_id
    where rooms.id = members.room_id
    and user_id = 1

    O

    select room_id, user_id, members.id from members
    inner join rooms
    on rooms.id = members.room_id
    where members.user_id = 1

    Solución del problema

    Puede consultar una tabla externa utilizando el cliente Supabase, pero solo si hay una clave externa configurada:

    Supabase select (): consultar tablas extranjeras

    Como se indica en los comentarios, puede crear un viewpara este propósito:

    Crear vista

    O puede crear una función PosgreSQL y llamarla con Supabase.rpc():

    Как заменить разные значения в растре?

    если у меня есть этот растр

    r1 <- raster(nrow=10, ncol=10)
    vv=c(1:5,1:5,1:5,1:5,1:5,1:5,1:5,1:5,1:5,1:5,1:5,1:5,1:5,1:5,1:5,1:5,1:5,1:5,1:5,1:5)
    values(r1) <- vv

    Как это сделать:

    replace by
    3 1
    5 2
    2 3
    4 5
    1 4

    я знаю, что мы можем сделать

    r1[r1==3]=1 but then it will problematic with values already = 1 (that I need to replace by 4!!

    Решение проблемы

    В этом конкретном случае (где текущие значения представляют собой непрерывные целые числа с низким значением, начинающиеся с 1), вы можете использовать текущие значения в качестве индексов вектора замены:

    r1[] <- c(4, 3, 1, 5, 2)[r1@data@values]

    Более общее решение, если у вас есть и то и другое, replaceи byопределено,

    r1[] <- by[match(r1@data@values, replace)]

    E-mails non reçus même si l'activité SendGrid affiche Livré

    J'ai créé Azure Logic App avec déclencheur de récurrence, puis utilisé le connecteur SendGrid pour envoyer des e-mails à plusieurs membres de l'équipe.

    Je n'ai reçu aucun e-mail même si les actions de l'application logique ont été exécutées avec succès. Après cela, j'ai vérifié l'état de l'activité de messagerie du compte SendGrid, il a le statut " Livré " pour l'adresse e-mail mentionnée dans l'action SendGrid.

    Remarque: j'ai ajouté à la liste blanche l'adresse IP sortante de mon application logique dans SendGrid IP Address Management.


    Solution du problème

    Twilio SendGrid développeur évangéliste ici.

    Je ne sais pas comment Azure Logic Apps déclenche les e-mails avec SendGrid, mais si un e-mail n'est pas envoyé, il ne devrait pas recevoir le statut "Livré".

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

    Попробуйте настроить один из этих методов подтверждения, а затем повторите попытку отправки электронных писем.

    Почему Calcite меняет GROUP_CONCAT на LISTAGG?

    Я построил, RelNodeиспользуя следующий SQL:

    SELECT GROUP_CONCAT(ename ORDER BY ename DESC SEPARATOR 'a') FROM emp

    и я использовал RelToSqlConverterдля преобразования его в SQL. Я получаю этот SQL:

    SELECT LISTAGG(`ename`, 'a') WITHIN GROUP (ORDER BY `ename` IS NULL DESC, `ename` DESC) FROM `emp`

    Но я хочу получить GROUP_CONCATне LISTAGG.


    Решение проблемы

    Проверьте https://issues.apache.org/jira/browse/CALCITE-4349


    GROUP_CONCAT аналогичен LISTAGG (см. CALCITE-2754) (а также BigQuery и > STRING_AGG PostgreSQL, см. CALCITE-4335). Например, запрос

    SELECT deptno, GROUP_CONCAT(ename ORDER BY empno SEPARATOR ';')
    FROM Emp
    GROUP BY deptno

    эквивалентен (и в алгебре Кальцита был бы обессахарен)

    SELECT deptno, LISTAGG(ename, ';') WITHIN GROUP (ORDER BY empno)
    FROM Emp
    GROUP BY deptno

    Spark: чтение файла, только если путь существует

    Я пытаюсь прочитать файлы, присутствующие на Sequenceпутях в scala. Ниже приведен пример (псевдо) кода:

    val paths = Seq[String] //Seq of paths
    val dataframe = spark.read.parquet(paths: _*)

    Теперь в приведенном выше порядке одни пути существуют, а другие нет. Есть ли способ игнорировать отсутствующие пути при чтении parquetфайлов (чтобы избежать org.apache.spark.sql.AnalysisException: Path does not exist)?

    Я попробовал следующее, и, похоже, это работает, но в конце концов я дважды прочитал один и тот же путь, которого хотел бы избежать:

    val filteredPaths = paths.filter(p => Try(spark.read.parquet(p)).isSuccess)

    Я проверил optionsметод, DataFrameReaderно, похоже, нет такой опции, как ignore_if_missing.

    Кроме того, эти пути могут быть hdfsлибо s3( Seqэто передается как аргумент метода), и при чтении я не знаю, можно s3ли hdfsиспользовать путь s3или hdfsконкретный API для проверки существования.


    Решение

    Вы можете отфильтровать ненужные файлы, как в ответе @Psidom. В Spark лучший способ сделать это — использовать внутреннюю конфигурацию Spark для Hadoop. Учитывая, что переменная сеанса Spark называется «spark», вы можете сделать:

    import org.apache.hadoop.fs.FileSystem
    import org.apache.hadoop.fs.Path
    val hadoopfs: FileSystem = FileSystem.get(spark.sparkContext.hadoopConfiguration)
    def testDirExist(path: String): Boolean = {
    val p = new Path(path)
    hadoopfs.exists(p) && hadoopfs.getFileStatus(p).isDirectory
    }
    val filteredPaths = paths.filter(p => testDirExists(p))
    val dataframe = spark.read.parquet(filteredPaths: _*)

    Что было бы эквивалентом этого T-SQL в Postgres

    Я хочу запустить это либо в интерактивном режиме из psql, либо из кода.

    create proc recent_orders_by_region
    as
    select top(3) * from view_orders where region = 'NA' order by order_date desc
    select top(3) * from view_orders where region = 'WE' order by order_date desc
    select top(3) * from view_orders where region = 'EE' order by order_date desc

    Решение проблемы

    Вы можете использовать rank() over (), но помните, что порядок должен быть уникальным, иначе RANK присвоит один и тот же номер нескольким строкам в группе.

    Запрос с примерами данных


    SELECT a.* FROM (
    SELECT *,
    rank() OVER (
    PARTITION BY region
    ORDER BY order_date DESC,ident DESC
    )
    FROM (
    values
    (1, current_date, 'NA'),(2, current_date-1, 'NA'),
    (3, current_date-1, 'NA'),(4, current_date-4, 'NA'),
    (5, current_date, 'NA1'),(6, current_date-1, 'NA1'),
    (7, current_date-1, 'NA1'),(8, current_date-4, 'NA1')
    ) view_orders (ident, order_date, region)
    ) a WHERE RANK <=3

    identпредназначен только для демонстрационных целей и должен быть заменен реальным столбцом из view_ordersтаблицы

    PostgreSql Эквивалент sqlplus -S имя пользователя/пароль \@lock?

    Что будет эквивалентом Postgres для следующего:

    sqlplus -S username/password \@lock.

    Кроме того, что здесь означает @lock?


    Решение проблемы

    Я не знаю PostgreSQL, но как Oracle вы здесь:

    Эта команда означает, что

  • вы подключитесь к инструменту командной строки Oracle под названием SQL * Plus (имя исполняемого файла sqlplus)

  • в беззвучном режиме ( -sесть)

  • укажите имя пользователя и пароль

  • и запустите скрипт.SQL с именем lock(я понятия не имею, что он делает, вам придется открыть его в любом текстовом редакторе и посмотреть)

  • Теперь, как кто-то устанавливает соединение с PostgreSQL и выполняет скрипт.SQL, я не знаю, но, читая онлайн-документацию, это может быть

    psql -U username -d database_name -a -f lock

    Регулярное выражение начинается с символа @

    Wie suche ich in regulären Ausdrücken nach Übereinstimmungen, die mit einem @-Symbol beginnen? Das Symbol darf nicht mitten in einem Wort stehen (Link in einer E-Mail-Adresse).

    Zum Beispiel eine Zeichenfolge, die so aussieht:

    @someone's email is blah@gmail.com and @someoneelse wants to send an email.

    Der Ausdruck, den ich verwenden würde, ist/^@[\w]/g

    Es sollte zurückkehren:

    @someone's

    @someoneelse

    Der von mir verwendete Ausdruck scheint nicht zu funktionieren.


    Lösung des Problems

    Sie können verwenden, \Bwas eine Nicht-Wort-Grenze ist und die negierte Version von ist \b.

    var s = "@someone's email is blah@gmail.com and @someoneelse wants to send an email.",
    r = s.match(/\B@\S+/g);
    console.log(r); //=> [ '@someone\'s', '@someoneelse' ]

    Проверьте, существует ли FontStretch для определенного семейства шрифтов.

    В моем инструменте есть несколько функций редактирования текста, которые позволяют пользователю выбирать свойства текущего шрифта, включая FontStretch. Я пытаюсь использовать конвертер, чтобы проверить, доступны ли определенные значения FontStretch, создав TypeFace с FontFamily и FontStretch. К сожалению, даже если FontStretch не поддерживается (и возвращается к одному из других значений), он все равно сообщает, что шрифт был создан с указанным мною FontStretch. Вот код, который у меня есть для этого теста:

    private static bool IsFontStretchAvailable(FontFamily font, FontStretch stretch)
    {
    Typeface testFont = new Typeface(font, FontStyles.Normal, FontWeights.Normal, stretch);
    return (0 == FontStretch.Compare(stretch, testFont.Stretch));
    }

    Это всегда так, несмотря ни на что. Есть ли способ определить, какие значения FontStretch являются допустимыми? Я знаю, что есть способы использовать FontStretch с LayoutTransform, которые я также могу поддерживать в будущем, но я хочу использовать шрифты FontStretch, когда это возможно, поскольку я думаю, что в некоторых случаях это может дать лучший визуальный результат.


    Решение проблемы

    Кажется, лучший способ — проверить коллекцию Fonts.SystemFonts, которая представляет собой полный список допустимых шрифтов TypeFaces. Вот код этого теста:

    Typeface testFont = Fonts.SystemTypefaces.FirstOrDefault(x => x.FontFamily.Equals(font) && x.Stretch.Equals(stretch));
    return testFont!= null;

    Это делает то, что я хочу, но я, вероятно, в конечном итоге использую Fonts.SystemFonts для создания собственного словаря FontFamilies с допустимыми весами и размерами для каждого, чтобы выполнять поиск вместо этого поиска. Если у кого-то есть лучший метод, пожалуйста, дайте мне знать.

    Jak uzyskać odpowiedź od nodemailer za pomocą funkcji netlify?

    Я использую функции netlify для отправки электронной почты из внешнего интерфейса, и он отлично работает... так как он отправляет электронную почту.

    Однако на стороне клиента (браузера) я не могу получить никакого ответа. Мне нужен базовый ответ, который позволил бы мне сделать, if (status==="success") displayMessage()но я не могу получить никакого ответа в браузере.

    Я получаю это сообщение Uncaught (in promise) SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data. Однако при отправке запроса через POSTMAN я получаю ответ «Электронное письмо отправлено успешно», которое является основной частью ответа обратного вызова.

    Вот функция, которую я использую в.netlify/functions/sendMail.

    const nodemailer = require("nodemailer");
    exports.handler = function (event, context, callback) {
    const mailConfig = {
    host: "smtp.mailgun.org",
    port: 465,
    secure: true,
    auth: {
    user: process.env.MAILGUN_USER,
    pass: process.env.MAILGUN_PASSWORD,
    },
    };
    const transporter = nodemailer.createTransport(mailConfig);
    transporter.verify((error, success) => {
    if (error) {
    console.log(error);
    } else {
    console.log("Ready to send emails");
    }
    });
    const messageData = JSON.parse(event.body);
    const { email, name, mobile, message, subject, recipient } = messageData;
    console.log(messageData);
    const mailOptions = {
    from: email,
    to: recipient,
    subject: subject,
    text: message,
    };
    transporter.sendMail(mailOptions, (error, success) => {
    if (error) {
    console.log(error);
    callback(error);
    } else {
    console.log("email sent");
    callback(null, {
    statusCode: 200,
    body: "Email sent successfully",
    });
    }
    });
    };

    и на стороне клиента у меня есть это

    const form = document.querySelector("#message");
    const submitMessage = (event) => {
    event.preventDefault();
    const formData = new FormData(form);
    formData.append("recipient", "testing@gmail.com");
    formData.append("subject", "Submission from website");
    const messageData = Object.fromEntries(formData);
    console.log(messageData);
    const url = ".netlify/functions/sendMail";
    const options = {
    method: "POST",
    headers: {
    "Content-Type": "application/json",
    },
    body: JSON.stringify(messageData),
    };
    fetch(url, options)
    .then((response) => response.json())
    .then((data) => console.log(data));
    };
    form.addEventListener("submit", submitMessage);

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

    Может ли кто-нибудь посоветовать мне, что я делаю неправильно здесь?


    Решение проблемы

    Я понял, что я делал неправильно, и вот решение, если кто-то еще столкнется с теми же проблемами.

    В обратном вызове функции netlify я отправлял тело в виде текста

    callback(null, {
    statusCode: 200,
    body: "Email sent successfully",
    });

    но в запросе на выборку на стороне клиента я рассматривал его как json

    fetch(url, options)
    .then((response) => response.json())
    .then((data) => console.log(data));

    Таким образом, в основном я мог бы либо использовать a response.text()вместо response.json()запроса на выборку, либо использовать JSON.stringifyи возвращать объект JSON из обратного вызова. Я предпочел JSON.stringifyвариант, как показано ниже для обратного вызова

    callback(null, {
    statusCode: 200,
    body: JSON.stringify({
    status: "success",
    message: "Email sent successfully",
    }),
    });

    Выбирать предыдущую строку каждый час в пандах

    Я пытаюсь получить ближайшую предыдущую точку данных каждый час в кадре данных pandas. Например:

    time value
    0 14:59:58 15
    1 15:00:10 20
    2 15:57:42 14
    3 16:00:30 9

    вернется

    time value
    0 15:00:00 15
    1 16:00:00 14

    т.е. строки 0 и 2 исходного фрейма данных. Как мне это сделать? Спасибо!


    Решение проблемы

    Со следующим игрушечным фреймом данных:

    import pandas as pd
    df = pd.DataFrame(
    {"time": ["14:59:58", "15:00:10", "15:57:42", "16:00:30"], "value": [15, 20, 14, 9]}
    )

    Вот один из способов сделать это:

    # Setup
    df["time"] = pd.to_datetime(df["time"], format="%H:%M:%S")
    temp_df = pd.DataFrame(df["time"].dt.round("H").drop_duplicates()).assign(value=pd.NA)
    # Add round hours to df, find nearest data points and drop previous hours
    new_df = (
    pd.concat([df, temp_df])
    .sort_values(by="time")
    .fillna(method="ffill")
    .pipe(lambda df_: df_[~df_["time"].isin(df["time"])])
    .reset_index(drop=True)
    )
    # Cleanup
    new_df["time"] = new_df["time"].dt.time
    print(new_df)
    # Output
    time value
    0 15:00:00 15
    1 16:00:00 14

    Dapper SQL-вызов, возвращающий значения NULL и 0

    Работайте с Dapper, чтобы выполнять вызовы SQL и сопоставлять их с объектами. У меня проблема с вызовом SQL Dapper, который неправильно соответствует классу С#.

    Используйте ASP.NET Core API и получите контроллер и класс.

    Класс контроллера

    public class DapperController: Controller
    {
    private const string connectionString = @"";
    [HttpGet("")]
    public async Task<IActionResult> Index()
    {
    var sql = @"SELECT product_name, model_year,list_price
    FROM [production].[products]";
    using (SqlConnection connection = new SqlConnection(connectionString)) {
    connection.Open();
    var product = await connection.QueryAsync<Products>(sql);
    return Ok(product);
    }
    }
    }

    Класс продукта

    public class Products
    {
    [JsonPropertyName("product_name")]
    public string ProductName { get; set; }
    [JsonPropertyName("model_year")]
    public int ModelYear { get; set; }
    [JsonPropertyName("list_price")]
    public double ListPrice { get; set; }
    }

    Получите следующие данные, но они неверны, поскольку база данных содержит данные

    [
    {
    "product_name": null,
    "model_year": 0,
    "list_price": 0
    },
    {
    "product_name": null,
    "model_year": 0,
    "list_price": 0
    }
    ]

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

    [
    {
    "product_name": "Trek 820 - 2016",
    "model_year": 2016,
    "list_price": 379.99
    },
    {
    "product_name": "Ritchey Timberwolf Frameset - 2016",
    "model_year": 2016,
    "list_price": 749.99
    }
    ]

    Решение проблемы


    Я не знаю, что я делаю неправильно


    Потому JsonPropertyNameчто это для сериализации Json вместо Dapper ORM

    поэтому нам может потребоваться изменить свойство класса, как показано ниже, или @Yong Shun, например, изменить псевдоним сценария, который соответствует вашему свойству С# (с учетом регистра)

    public class Products
    {
    public string product_name { get; set; }
    public int model_year { get; set; }
    public double list_price { get; set; }
    }

    Я думаю, нам может понадобиться использовать наш клиент в качестве ссылки вместоColumnAttributeJsonPropertyName

    Наша карта клиента должна быть реализованаSqlMapper.ITypeMap

    public class Products
    {
    [Column("product_name")]
    public string ProductName { get; set; }
    [Column("model_year")]
    public int ModelYear { get; set; }
    [Column("list_price")]
    public double ListPrice { get; set; }
    }

    Также здесь есть ссылка на версию 2: атрибуты [столбца] и [таблицы] #722, сопровождающий dapper обсуждает атрибуты сопоставления столбцов для dapper.

    вторник, 10 мая 2022 г.

    Наука о данных: как найти закономерности и корреляции в двух наборах данных в python

    У меня есть два больших набора данных. Скажем, несколько тысяч строк для набора данных V с 18 столбцами. Мне нужно найти корреляции между отдельными строками (например, строка V125 аналогична строке V569 в 18 столбцах). Но так как он большой, я не знаю, как его отфильтровать после. Другая проблема заключается в том, что у меня есть набор данных B (разная информация в моих 18 столбцах), и я хотел бы найти аналогичную закономерность между двумя наборами данных (например, строки V55 и строки B985 похожи, V3 присутствует только в том случае, если присутствует B45 и т. д...). Есть ли способ узнать? Я открыт для любых решений. PS: это мой первый вопрос, поэтому дайте мне знать, если его нужно отредактировать, или я не понимаю. Спасибо за любую помощь.


    Решение проблемы

    Строка V125 — это значение, возможно, вы имели в виду строку 125. Если две строки одинаковы, вы можете использовать функцию дублирования для панд или найти их в главном меню в Excel. Что касается второго вопроса, это можно сделать с помощью bash или терминала Windows для больших наборов данных, но проще всего будет объединить два набора данных. Для наборов данных из нескольких тысяч строк это очень быстро. Если вы используете кадр данных pandas, вы можете использовать функцию добавления, чтобы объединить их и найти дубликаты.

    «JsonConvert» неоднозначен в пространстве имен «Newtonsoft.Json».

    Я получаю эту ошибку, хотя в проекте установлена ​​​​только версия (13.0.1)

    Любые идеи?

    Ошибки:

    1>C:\Users\boruc\source\Workspaces\BinaNew3\BinaNewWebApp\admin\SiteSettings.aspx.vb(36,20): error BC30560: 'JsonConvert' is ambiguous in the namespace 'Newtonsoft.Json'.

    1> C:\Users\boruc\source\Workspaces\BinaNew3\BinaNewWebApp\Old_App_Code\EmailService.vb(26,33): ошибка BC30560: «JsonConvert» неоднозначен в пространстве имен «Newtonsoft.Json».

    Код

    Imports Newtonsoft
    Dim jStr = Json.JsonConvert.SerializeObject(nEmailSetting)

    Вот снимок проводника объектов, показывающий 2 ссылки на Newtonsoft

    введите описание изображения здесь


    Решение проблемы

    1- вам следует перестроить решение после удаления старой версии Newtonsoft.Json.

    2- измените эту строку кода с:

    Dim jStr = Json.JsonConvert.SerializeObject(nEmailSetting)

    к

    Dim jStr = JsonConvert.SerializeObject(nEmailSetting)

    3- ваша IDE даст вам подсказку, чтобы импортировать правильное пространство имен, которым является Newtonsoft.Json.

    Могу ли я создать ветку git, которая использует .astro, а основная ветка — нет?

    У меня есть личный сайт, использующий ванильный HTML и CSS. Я хочу перейти на.astro. Я не хочу создавать совершенно новое репо, просто копировать и вставлять файлы в репо после того, как это будет сделано.

    Я хотел бы создать ветку «dev», а затем, когда я закончу, объединиться с мастером. Это возможно? иметь ветку dev, которая использует.astro, в то время как основная ветка - vanilla?


    Решение проблемы

    Gitна самом деле не заботится о вашем коде/языке/фреймворке. Он просто заботится об именах файлов и их содержимом.

    Совершенно нормально создать ветку, содержимое которой отличается от mainветки, а затем объединить обратно.

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

    У меня есть два дива.
    введите описание изображения здесь
    При изменении размера браузера div 2 будет находиться внизу, а div one — вверху, что-то вроде изображения ниже.
    введите описание изображения здесь

    Я хочу, чтобы div 1 шел внизу, а div 2 - вверху, в основном противоположное тому, что он делает. Я знаю, что могу просто поместить div 2 вверху в html, но я хочу, чтобы div 1 оставался слева.

    Текущий код:


    .div1 {
    width: 55%;
    height: 80vh;
    display: inline-block;
    margin-right: 1.5vh;
    min-width: 50vh;
    }
    .div2 {
    width: 50vh;
    height: 80vh;
    display: inline-block;
    }
    <div class="div1">
    </div>
    <div class="div2">
    </div>

    Решение проблемы

    Самый простой способ - создать родительский контейнер как display: flex;и использовать flex-wrap: wrap-reverse;:


    .div1 {
    width: 55%;
    height: 80vh;
    display: inline-block;
    margin-right: 1.5vh;
    min-width: 50vh;
    background-color: blue;
    }
    .div2 {
    width: 50vh;
    height: 80vh;
    display: inline-block;
    background-color: red;
    }
    .container
    {
    display: flex;
    flex-wrap: wrap-reverse;
    /* ignore below */
    resize: both;
    overflow: hidden;
    border: 1px solid black;
    padding: 1em;
    }
    <div class="container">
    <div class="div1">
    </div>
    <div class="div2">
    </div>
    resize me
    </div>

    Как обрезать журнал Tomcat Catalina.out до 3 месяцев назад

    Моя компания хочет, чтобы мы сохранили журналы за последние 3 месяца. Catalina.out становится слишком большим на сервере Linux (Red Hat). Как я могу удалить все в журнале, кроме последних 3 месяцев в ОДНОМ файле catalina.out.


    Решение проблемы

    У меня было требование, немного похожее на ваш случай. Вот как я справился с требованием.

    Добавьте следующие команды Linux в Cron Scheduler.

    grepтребуемая отметка даты, т.е. 2022-05-07, и запись в новый файл

    grep "2022-05-07" > 2022_05_07.log // write lines which matches the data stamp
    wc -l 2022_05_07.log // outputs how many lines captured

    Очистите журнал catalina.outфайла, не останавливаясь tomcat, с помощью команды ниже.

    sudo cat /dev/null > /opt/tomcat/apache-tomcat-9.0.37/logs/catalina.out

    Обратите внимание, что не рекомендуется удалять во catalina.outвремя tomcatработы.

    Он будет продолжать вести журнал, catalina.outкоторый уже удален ( ссылка на файл удерживается tomcat ), поэтому пространство не будет освобождено. Таким образом, вам нужно будет разорвать, чтобы освободить место restart.tomcat

    Что и где стек и куча?

    Книги по языкам программирования объясняют, что типы значений создаются в стеке, а ссылочные типы создаются в куче, но не объясняют, что это за две вещи. Я не читал четкого объяснения этого. Я понимаю, что такое стек. Но,

  • Где и какие они (физически в памяти реального компьютера)?

  • В какой степени они контролируются операционной системой или средой выполнения языка?

  • Каков их масштаб?

  • Чем определяется размер каждого из них?

  • Что делает человека быстрее?


  • Решение проблемы

    Стек — это память, выделенная в качестве рабочего пространства для потока выполнения. При вызове функции в верхней части стека резервируется блок для локальных переменных и некоторых учетных данных. Когда эта функция возвращается, блок становится неиспользуемым и может быть использован при следующем вызове функции. Стек всегда резервируется в порядке LIFO (последний пришел — первый вышел); последний зарезервированный блок всегда является следующим освобождаемым блоком. Это упрощает отслеживание стека; освобождение блока из стека — это не что иное, как корректировка одного указателя.

    Куча — это память, отведенная для динамического распределения. В отличие от стека, для выделения и освобождения блоков из кучи не существует обязательного шаблона; вы можете выделить блок в любое время и освободить его в любое время. Это значительно усложняет отслеживание того, какие части кучи выделены или свободны в любой момент времени; существует множество настраиваемых распределителей кучи, позволяющих настроить производительность кучи для различных шаблонов использования.

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

    Чтобы ответить на ваши вопросы напрямую:


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


    ОС выделяет стек для каждого потока системного уровня при создании потока. Обычно среда выполнения языка вызывает ОС для выделения кучи для приложения.


    Каков их масштаб?


    Стек привязан к потоку, поэтому, когда поток выходит, стек восстанавливается. Куча обычно выделяется средой выполнения при запуске приложения и освобождается, когда приложение (технически процесс) завершает работу.


    Чем определяется размер каждого из них?


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


    Что делает человека быстрее?


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

    Наглядная демонстрация:

    Источник изображения: vikashazrati.wordpress.com

    Проблема с примером карты React: карта заменяется, а не добавляется к списку карт в другом столбце

    Я настойчиво работал над этой проблемой, цель которой состоит в том, чтобы перетащить карточку из «Столбца 1» и скопировать ее в другой столбец, скажем, «Столбец 2». Теперь, когда моя первая карта перетаскивается и помещается в «Столбец 2», карта соответственно добавляется в этот столбец, но когда я перетаскиваю другую карту и помещаю ее в «Столбец 2» вместо добавления, она просто заменяет существующую карту собой. Я отлаживаю состояние, но проблема все еще сохраняется. Я не понял, что я здесь делаю не так?

    Вот мой код

    // Card Component
    function Card({ id, text, isDrag }) {
    const [, drag] = useDrag(() => ({
    type: "bp-card",
    item: () => {
    return { id, text}
    },
    collect: monitor => ({
    isDragging:!!monitor.isDragging(),
    }),
    canDrag: () => isDrag
    }));
    return (
    <div
    className='card'
    ref={drag}
    style={{
    cursor: isDrag? 'pointer': 'no-drop'
    }}
    >
    {text}
    </div>
    )
    }
    // Column Component
    function Column({ title, children, onCardDropped }) {
    const [, drop] = useDrop(() => ({
    accept: "bp-card",
    drop: item => {
    onCardDropped(item);
    }
    }));
    return (
    <div className="flex-item" ref={title === 'Column 2'? drop: null}>
    <p>{title}</p>
    {children.length > 0 && children.map(({ id, text, isDrag }) => (
    <Card
    key={id}
    id={id}
    text={text}
    isDrag={isDrag}
    />
    ))}
    </div>
    )
    }
    // Main App
    function App() {
    const [cards] = useState([
    { id: 1, text: 'Card 1', isDrag: true },
    { id: 2, text: 'Card 2', isDrag: true },
    ]);
    const [columns, setColumns] = useState([
    {
    id: 1,
    title: 'Column 1',
    children: cards
    },
    {
    id: 2,
    title: 'Column 2',
    children: []
    },
    ]);
    const onCardDropped = ({ id, text }) => {
    // let card = null;
    const targetColumnId = 2;
    const transformedColumns = columns.map(column => {
    if (column.id === targetColumnId) {
    return {
    ...column,
    children: [
    ...column.children,
    { id, text }
    ]
    }
    }
    return column;
    });
    setColumns(transformedColumns);
    }
    return (
    <DndProvider backend={HTML5Backend}>
    <div className='flex-container'>
    {columns.map((column) => (
    <Column
    key={column.id}
    title={column.title}
    children={column.children}
    onCardDropped={onCardDropped}
    />
    ))}
    </div>
    </DndProvider>
    );
    }

    Любая помощь высоко ценится. Спасибо.


    Решение проблемы

    Вам нужно учитывать предыдущее состояние, используя обратный вызов метода set state. Он начинает работать после изменения, onCardDroppedкак показано ниже.

    const onCardDropped = ({ id, text }) => {
    // let card = null;
    const targetColumnId = 2;
    setColumns((prevColumns) =>
    prevColumns.map((column) => {
    if (column.id === targetColumnId) {
    return {
    ...column,
    children: [...column.children, { id, text }]
    };
    }
    return column;
    })
    );
    };

    Всегда полезно использовать состояние из метода обратного вызова, а не напрямую использовать объект состояния, который может быть устаревшим.

    Рабочая демонстрация

    Изменить cool-dew-8zl3s9

    Laravel Datatable addColumn returns ID of one record only

    Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...