Страницы

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

воскресенье, 5 января 2020 г.

Обрезать строку в переменной

#linux #регулярные_выражения #bash


Категорически приветствую!
Существует некий скрипт, в переменной которого содержится строка: hello-1.my.domain.local
hello-world-12.two.domain.local hello-7.three.domain.local hello-world-16.my.domain.local

Подскажите пожалуйста наиболее рациональный и правильный способ приведения этой строки
к виду hello-1.my,hello-world-12.two,hello-7.three,hello-world-16.my

Сейчас я делаю это так:

VAR2=`echo $VAR1 | sed 's/.domain.local/,/g;s/ //g;s/,$//'`


Что на мой взгляд отвратительно (хотя бы из-за хардкода .domain.local)
    


Ответы

Ответ 1



Вы можете использовать sed -E 's/(\.[^.]+){2}([ \t]+|$)/,/g; s/,$//' См. демо онлайн. Шаблон (\.[^.]+){2}([ \t]+|$) находит две последовательности ((...){2}) "точка" (\.) + "один и более символов, отличных от точки" ([^.]+), за которым следует один и более пробелов ([ \t]+) или символов табуляции или (|) конец строки ($), и заменяет на запятую. s/,$// необходим для удаления запятой, добавленной в конце строки. Версия с awk: awk 'BEGIN {FS=OFS="."; RS=" "; ORS=","} {NF-=2;print}' | sed 's/,$//' И более продвинутая версия без необходимости в sed: awk 'BEGIN {FS=OFS="."; RS=" "} {NF-=2; l=l $0 ","} END{sub(/,$/, "", l); print l}' См. онлайн-демо. Кратко: BEGIN {FS=OFS="."; RS=" "} - FS=OFS="." задают разделитель полей (символ .) при чтении и записи, а RS=" " задаёт разделитель строк (пробел) {NF-=2; l=l $0 ","} - уменьшаем кол-во полей на 2 для каждой строки и добавляем значение строки к переменной l + запятая END{sub(/,$/, "", l); print l} - в конце удяляем последнюю запятую.

Ответ 2



Раз стоит bash добавлю свой вариант тоже: #!/usr/bin/env bash # file : var-cut.sh var_string="hello-1.my.domain.local hello-world-12.two.domain.local hello-7.three.domain.local hello-world-16.my.domain.local" for split in ${var_string//.domain.local}; do echo $split done | paste -d"," -s - echo echo "${var_string//.domain.local/,}" # end of var-cut.sh вывод ~$ ./var-cut.sh hello-1.my,hello-world-12.two,hello-7.three,hello-world-16.my hello-1.my, hello-world-12.two, hello-7.three, hello-world-16.my,

Формула полета пули в 2d игре

#c #разработка_игр #sdl


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

phy->ownbullets[i].cX += cos(da) * .5 ;
phy->ownbullets[i].cY += sin(da) * .5 ;


где .5 - скорость полета, da - угол, но все равно траектория хаотична. В чем может
быть проблема?

Запись экрана - http://rgho.st/6HkZk2Tpy
    


Ответы

Ответ 1



Функции sin и cos принимают значения в радианах. Если значения угла в градусах, то необходимо перевести их в радианы (умножить на число Пи и разделить на 180 градусов): const double pi = 3.14159265358979323846; phy->ownbullets[i].cX += cos(da * pi / 180) * .5 ; phy->ownbullets[i].cY += sin(da * pi / 180) * .5 ;

Помогите реализовать градиент через css

#css #css3 #градиент


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


Ответы

Ответ 1



body { background: url('https://i.stack.imgur.com/7QFOe.png') no-repeat; padding: 0; margin: 0; } .overfade { margin-top: 55px; height: 50px; width: 1280px; border-left: 1px solid #000; border-right: 1px solid #000; background-image: linear-gradient( to right, rgba(172, 172, 172, 0) 0%, rgba(172, 172, 172, 1) 35%, rgba(172, 172, 172, 1) 65%, rgba(172, 172, 172, 0) 100%), linear-gradient( to right, rgba(236, 234, 238, 1) 0%, rgba(236, 234, 238, 1) 50%, rgba(172, 172, 172, 0) 50%, rgba(172, 172, 172, 0) 100%); background-position: 0px 55%, 0px 0px; background-repeat: no-repeat; background-size: 100% 3px, 100% 55%; }


Ответ 2



в сети есть много сервисом для генерирования градиентов вот например один из них Ultimate CSS Gradient Generator. В редакторе можно сделать что то на подобие такого div { /* Permalink - use to edit and share this gradient: http://colorzilla.com/gradient-editor/#000000+0,000000+10,000000+89,000000+100&0+0,0.65+9,1+89,0+100 */ background: -moz-linear-gradient(left, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.65) 9%, rgba(0, 0, 0, 0.65) 10%, rgba(0, 0, 0, 1) 89%, rgba(0, 0, 0, 0) 100%); /* FF3.6-15 */ background: -webkit-linear-gradient(left, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.65) 9%, rgba(0, 0, 0, 0.65) 10%, rgba(0, 0, 0, 1) 89%, rgba(0, 0, 0, 0) 100%); /* Chrome10-25,Safari5.1-6 */ background: linear-gradient(to right, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.65) 9%, rgba(0, 0, 0, 0.65) 10%, rgba(0, 0, 0, 1) 89%, rgba(0, 0, 0, 0) 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#00000000', endColorstr='#00000000', GradientType=1); /* IE6-9 */ height: 300px; width: 300px; }


Ответ 3



что то такое? background: rgb(226,226,226); /* Old browsers */ background: -moz-linear-gradient(left, rgba(226,226,226,1) 0%, rgba(209,209,209,1) 9%, rgba(209,209,209,1) 9%, rgba(209,209,209,1) 21%, rgba(209,209,209,1) 34%, rgba(254,254,254,1) 66%, rgba(254,254,254,1) 66%); /* FF3.6-15 */ background: -webkit-linear-gradient(left, rgba(226,226,226,1) 0%,rgba(209,209,209,1) 9%,rgba(209,209,209,1) 9%,rgba(209,209,209,1) 21%,rgba(209,209,209,1) 34%,rgba(254,254,254,1) 66%,rgba(254,254,254,1) 66%); /* Chrome10-25,Safari5.1-6 */ background: linear-gradient(to right, rgba(226,226,226,1) 0%,rgba(209,209,209,1) 9%,rgba(209,209,209,1) 9%,rgba(209,209,209,1) 21%,rgba(209,209,209,1) 34%,rgba(254,254,254,1) 66%,rgba(254,254,254,1) 66%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#e2e2e2', endColorstr='#fefefe',GradientType=1 ); /* IE6-9 */

Ответ 4



div { overflow: hidden; } div:before { content: ""; display: block; height: 8px; margin-top: -4px; background: radial-gradient(ellipse at center, silver 0%, transparent 80%); }


Как отловить все клавиши через низкоуровневый хук?

#c_sharp #winapi #клавиатура #keyboardhook


Как отловить в HookCallback все клавиши с проверкой по шифтам и.т.п?
Обычный (Keys) Marshal.ReadInt32 (lParam) просто пишет большими буквами.

public delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
private static readonly LowLevelKeyboardProc _proc = HookCallback;

private static IntPtr _hookID = IntPtr.Zero;

private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
  if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
  {
    try
    {
       Console.WriteLine((Keys)Marshal.ReadInt32(lParam));
    }
    catch (AccessViolationException ex) { Console.WriteLine($"Error: {ex.ToString()}"); }
  }
  return NativeMethods.CallNextHookEx(_hookID, nCode, wParam, lParam);
}


У меня есть идея занести список клавиш в List и оттуда как-то делать проверку. 

Но может у Вас есть идеи по лучше?! ( желательно с примером )
    


Ответы

Ответ 1



Как-то так: using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using System.ComponentModel; using System.Windows.Forms; namespace ConsoleApplication1 { class Program { static KeyLogger k; static void Main(string[] args) { k = new KeyLogger(); k.Start(); Console.CancelKeyPress += Console_CancelKeyPress; Console.WriteLine("Started listening for keyboard events..."); Application.Run(); } private static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e) { k.Stop(); Application.Exit(); } } sealed class KeyLogger : IDisposable //отслеживает события клавиатуры с помощью низкоуровневого хука Windows { //объявления типов, констант и функций Windows API delegate IntPtr KeyboardProc(int nCode, IntPtr wParam, IntPtr lParam); const int WH_KEYBOARD_LL = 13; const int HC_ACTION = 0; const int WM_KEYDOWN = 0x0100; const uint VK_CAPITAL = 0x14; [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] static extern IntPtr SetWindowsHookEx(int idHook, KeyboardProc lpfn, IntPtr hInstance, int threadId); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool UnhookWindowsHookEx(IntPtr hhk); [DllImport("kernel32.dll")] private static extern IntPtr LoadLibrary(string dllToLoad); [DllImport("USER32.dll")] public static extern short GetKeyState(int vKey); [DllImport("user32.dll")] public static extern short GetAsyncKeyState(int vKey); [DllImport("user32.dll")] public static extern int ToUnicodeEx( uint wVirtKey, uint wScanCode, byte[] lpKeyState, [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pwszBuff, int cchBuff, uint wFlags, IntPtr dwhkl); [DllImport("user32.dll")] public static extern bool GetKeyboardState(byte[] lpKeyState); [DllImport("user32.dll")] public static extern uint MapVirtualKey( uint uCode, uint uMapType); [DllImport("user32.dll")] public static extern IntPtr GetKeyboardLayout(uint idThread); [DllImport("user32.dll")] public static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId); [DllImport("user32.dll")] public static extern IntPtr GetForegroundWindow(); //преобразование виртуального кода клавиши в его Юникод-представление public static string VKCodeToUnicode(uint vkCode) { StringBuilder buf = new StringBuilder(); byte[] keyboardState = new byte[255]; short x; byte y; for (int i = 0; i < 255; i++) { if (i == VK_CAPITAL) { x = GetKeyState(i); } else { x = GetAsyncKeyState(i); } y = 0; if ((x & 0x8000) != 0) y = (byte)(y | 0x80); if ((x & 0x0001) != 0) y = (byte)(y | 0x01); keyboardState[i] = y; } ToUnicodeEx(vkCode, MapVirtualKey(vkCode, 0), keyboardState, buf, 5, 0, GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), IntPtr.Zero))); return buf.ToString(); } IntPtr _hookID = IntPtr.Zero; //начинает отслеживание событий клавиатуры public void Start() { if (disposed) throw new ObjectDisposedException("KeyLogger"); if (_hookID != IntPtr.Zero) return; _hookID = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookCallback, IntPtr.Zero, 0); if (_hookID == IntPtr.Zero) { int error = Marshal.GetLastWin32Error(); throw new Win32Exception(error, "Failed to install hook! Error: "+ error.ToString()); } } //останавливает отслеживание событий клавиатуры public void Stop() { if (disposed) return; if (_hookID == IntPtr.Zero) return; UnhookWindowsHookEx(_hookID); _hookID = IntPtr.Zero; } //вызывается Windows при нажатии клавиши IntPtr KeyboardHookCallback(int nCode, IntPtr wParam, IntPtr lParam) { if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) { int vkCode = Marshal.ReadInt32(lParam); string s = VKCodeToUnicode((uint)vkCode); Console.Out.WriteLine("Key: " + ((Keys)vkCode).ToString() + "; Character: " + s); } return CallNextHookEx(_hookID, nCode, wParam, lParam); } //так как KeyLogger использует неуправляемый ресурс, реализуем Dispose и Finalize... bool disposed = false; public void Dispose() { if (disposed) return; Stop(); disposed = true; GC.SuppressFinalize(this); } ~KeyLogger() { Dispose(); } } } Известная проблема (Windows 10): если активно консольное окно, всегда распознаются символы раскладки, установленной в момент создания консоли, вместо текущей раскладки. Основано на данных вопросах: GetKeyboardState: определение состояния клавиши Некорректная работа перехватчика нажатых клавиш (кейлоггер) C#

Прозрачный экран на Android эмуляторе

#android #android_studio


начинал знакомиться с Android-studio. Создал пустой проект, но вместо окна приложения
при запуске экран совершенно прозрачный. 
    


Ответы

Ответ 1



Зайдите в настройки эмулятора и у меню Graphics выставьте Software.

с++ использование единиц измерения для указания значений переменных

#cpp #cpp11 #переменные #cpp14 #преобразование_типов


Подскажите, как современный стиль программирования на C++ рекомендует использовать
единицы измерения при указания значений переменных?

Мне совершенно не нравится использование #define, поскольку очень часто теряется
смысловая нагрузка таких переменных, не видная привязка к конкретному классу (где это
может быть использовано), да и просто не очень эстетично

#define _KBps 1024.0


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

class CMyClass
{
public:
    static const double m_Ops;
    static const double m_KOps;
    static const double m_MOps;

// основная начинка класса
};

const double CMyClass::m_Ops = 1;
const double CMyClass::m_KOps = 1000.0;
const double CMyClass::m_MOps = 1000000.0;


CMyClass(2.0 * CMyClass::m_KOps, 1.34 * CMyClass::m_MOps);


Что уже (на мой скромный взгляд) более наглядно и удобно.

Но наверное С++1x  в этом отношении шагнули дальше и можно указывать 

CMyClass(2.0KOps, 1.34MOps);


?

Так ли это (вроде что-то подобное видел)?
И вообще какой подход предпочтителен?
    


Ответы

Ответ 1



См. п. 13.5.8 стандарта - литералы, определенные пользователем. Вот простейший пример: long double operator ""_MOps(long double x) { return x*1e6; } auto main() -> int { cout << 2.0_MOps << endl; }

Не изменяется UID в рантайме golang, как изменить?

#linux #golang


func main() {

    // Выводит 0
    fmt.Println(syscall.Getgid())


    err := syscall.Setuid(1000)
    if err != nil {
        // Выводит operation not supported
        fmt.Println(err)
    }

}


Запускаю через sudo -E go run /path/...
    


Ответы

Ответ 1



tl;dr В Go Setuid () для Linux не реализован. Нужно использовать другие механизмы понижения привилегий. Немного деталей Дело в том, что в Linux потоки реализованы, как «облегчённые» процессы, и системный вызов setuid () устанавливает владельца только текущего потока, а соответствие поведению, описанному в POSIX обеспечивает обёртка над этим вызовом в glibc, которая посылает сигнал всем остальным потокам, вызывающий обработчик, который делает аналогичный системный вызов из каждого потока. Go в своей реализации не использует (и не хочет использовать) libc, а работает напрямую с системными вызовами, поэтому появился баг 1435, в результате которого id менялся только у вызывающего потока, а не у всего процесса. Хорошего решения пока ни кто не придумал, поэтому с Go-1.4 Setuid () заменён на заглушку, просто возвращающую ошибку.

Ответ 2



Проверил, что работает на macos x и linux x64 при помощи вызова CGO. package main import ( "log" "syscall" ) /* #include #include */ import ( "C" ) func main() { myGid := 100 myUid := 100 if syscall.Getuid() == 0 { cerr, errno := C.setgid(C.gid_t(myGid)) if cerr != 0 { log.Fatalln("Error setting gid as %d, error: %d", myGid, errno) } cerr, errno = C.setuid(C.uid_t(myUid)) if cerr != 0 { log.Fatalln("Error setting UID as %d due to error:", myUid, errno) } } log.Printf("My uid is %d, my gid is %d", syscall.Getuid(), syscall.Getgid()) } Если нужен для портов, то setcap cap_net_bind_service=+ep имяexe

Помогите нарисовать canvas!

#javascript #html #css


Просьба помочь нарисовать canvas. Необходимо после сделать анимацию отрисовки этого
canvas при скролле. JS код для скролла написала, а вот canvas вообще не знаю.
    


Ответы

Ответ 1



window.onload = function() { var canvas = document.getElementById('canvas'); var ctx = canvas.getContext('2d'); ctx.fillStyle = '#ccc000' var p = new Path2D("M 87.309014,9.6815981 C 109.3243,60.00378 146.75974,79.485664 184.54955,98.258795 125.13447,108.87839 113.83075,141.06513 112.2624,177.61602 93.824599,138.22508 67.495779,104.40427 15.021869,89.038824 57.034865,79.449738 79.550768,51.510449 87.309014,9.6815981 Z"); ctx.stroke(p); ctx.fill(p); }

Ответ 2



Пользуясь Вашим советом я получила следующие данные: image/svg+xml

Ответ 3



Я пошла иным путем. line { position: absolute; height: 436px; width: 480px; bottom: -218px; left: -166px; -ms-transform: rotate(17deg); transform: rotate(17deg); stroke-dashoffset: 2000; stroke-dasharray: 2000; stroke-width: 20; transition: stroke-dashoffset 10s; z-index: -1; overflow: hidden; &:before { content: ''; width: 275px; height: 270px; background-color: $color_white; border-radius: 100% 0; position: absolute; z-index: 2; -ms-transform: rotate(-24deg); transform: rotate(-23deg); left: -119px; bottom: 127px; } &:after { content: ''; width: 255px; height: 297px; background-color: $color_white; border-radius: 100% 0; position: absolute; z-index: 1; -ms-transform: rotate(-24deg); transform: rotate(-7deg); left: 200px; bottom: 11px; } &_icon { height: 500px; width: 350px; padding-left: 32px; position: relative; z-index: 1; stroke: $color_btn; stroke-width: 250; } } И сделала анимацию с помощью stroke-dashoffset: 0;

Как сделать правильную архитектуру БД при множественных связях в pivot-таблице?

#php #laravel #relation


В базе данных есть следующие таблицы:


users (id, name, surname)
teams (id, name)
roles (id, name)
permissions (id, name)
team_role_permission (team_id, role_id, permission_id)
team_user (user_id, team_id, role_id)


Не понимаю, как именно я должен описать отношения в таблице team_role_permission
и team_user. В обычных отношениях laravel нет возможности создать many-to-many отношение
с 3 полями. Если говорить про практику, то мне нужно иметь лишь 3 описанных отношения в БД:


В каких командах играет игрок и какова его роль в каждой из них (метод teams в модели
User/Player)
Какие игроки состоят в команде и каковы их роли (метод players в модели Team)


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


Ответы

Ответ 1



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

Ответ 2



Начнем по порядку: "В каких командах (team_id) играет игрок (user_id) и какова его роль(role_id) в каждой из них (метод teams в модели User/Player)" Для этого существует team_user (user_id, team_id, role_id). Понятней было бы в таком порядке team_id, user_id, role_id. "Какие игроки (user_id) состоят в команде (team_id) и каковы их роли (role_id) (метод players в модели Team)" Данный вопрос покрывает та же связь team_user (user_id, team_id, role_id). "Таблица team_role_permission нужна, поскольку в каждой команде (team_id) создатель (?) может кастомно выбирать роли (role_id) для каждой роли(role_id) пользователей (user_id)." Возможно имелось ввиду "выбирать роли (role_id) для каждого пользователя (user_id)", тогда team_role_permission не нужна. Точнее нужна только для связи команды с permission. Но, если все таки имелось ввиду то, что написано, тогда должна существовать связь "создатель", team_id, user_id, role_id, role_id. По сути это подмена роли другой ролью, что в общем не очень хорошо. Если у одного игрока может быть несколько ролей в одной команде тогда связь team_user следовало бы разбить на две: team_user (team_id, user_id) и team_user__role(team_user_id, role_id).

Не выводится текст из spring bean

#java #spring


Пытаюсь освоить Spring. Делаю все по видео Spring Потрошитель, но на экран ничего
не выходит. Вроде бин класса InjectRandomIntAnnotationBeanPostProcessor просто игнорируется.

Просьба подсказать в чем проблема?

Сам бин:

public class TerminatorQuoter implements Quoter {
private String message;

@InjectRandomInt(min = 2, max = 7)
private int repeat;

public void setMessage(String message) {
    this.message = message;
}

public void sayQuote() {
    for (int i = 0; i < repeat; i++) {
        System.out.println("message = s" + message);
    }
}


Аннотация:

@Retention(RetentionPolicy.RUNTIME)
public @interface InjectRandomInt {
int min();
int max();
}


BeanPostProcessor:

public class InjectRandomIntAnnotationBeanPostProcessor implements BeanPostProcessor {
public Object postProcessBeforeInitialization(Object bean, String beanName) throws
BeansException {
    Field[] fields = bean.getClass().getFields();
    for (Field field : fields) {
        InjectRandomInt injectRandomInt = field.getAnnotation(InjectRandomInt.class);
        if (injectRandomInt != null){
            int min = injectRandomInt.min();
            int max = injectRandomInt.max();
            Random random = new Random();
            int randomInt = min + random.nextInt(max - min);
            field.setAccessible(true);
            ReflectionUtils.setField(field, bean, randomInt);
        }
    }
    return bean;
}

public Object postProcessAfterInitialization(Object bean, String beanName) throws
BeansException {
    return bean;
}


XML:





    





Main.java (собственно откуда текст и не выходит):

public class Main {

public static void main(String[] args) {
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("context.xml");
    context.getBean(TerminatorQuoter.class).sayQuote();
}

    


Ответы

Ответ 1



Вызов bean.getClass().getFields(); возвращает лишь public поля. Замените этот вызов на bean.getClass().getDeclaredFields();.

Почему округление до сотых при помощи ROUND() в MySQL округляет вниз?

#mysql #sql


Выполняю запрос к БД MySQL, чтобы получить проценты за платеж:

select cp.id,
    cp.percent,
    round(cp.percent, 2)
from payment cp
where cp.id = 4118098
    and month(cp.payment_date) = 9


Выдаёт:



Вопрос: почему округление до сотых округляет вниз, хотя на конце цифра 5? 

При этом запрос select round(75.725, 2) округляет всё корректно - до 75.73.
Тип столбца percent в таблице как double.
    


Ответы

Ответ 1



почему округление до сотых округляет вниз, хотя на конце цифра 5? Тип столбца percent в таблице как double. Тип DOUBLE относится к т.н. "неточным" типам данных - т.е. используемое для его хранения двоичное представление не в точности равно введённому, а лишь максимально близко к нему. Как итог - печально известные 0,1000000001 или 0,0999999999 вместо введённого изначально 0,1. И false при сравнении такого значения с непосредственно заданным в виде литерала значением 0,1. В соответствии с документацией для таких типов данных For approximate-value numbers, the result depends on the C library. On many systems, this means that ROUND() uses the “round to nearest even” rule: A value with a fractional part exactly halfway between two integers is rounded to the nearest even integer. или, если по-русски, "результат округления зависит от используемой библиотеки функций, во многих случаях выполняется округление к ближайшему чётному" (т.н. "бухгалтерское" округление). Для того, чтобы получить округление "половина - вверх", необходимо привести сначала имеющееся значение к "точному" числовому типу, т.е. желаемое округление можно было бы получить так: SELECT ROUND(CAST(cp.percent AS DECIMAL(6,3)), 2) Однако приведение типа само по себе требует округления (помним, что исходное значение-то у нас неточное!), а потому есть смысл сразу выполнять приведение к нужному конечному типу, т.е. с нужным количеством десятичных знаков. И окончательный вариант будет выглядеть как SELECT CAST(cp.percent AS DECIMAL(5,2)) При этом запрос select round(75.725, 2) округляет всё корректно - до 75.73. В данном случае константа-литерал сразу создаётся с типом DECIMAL. Потому и округление работает, как указано в той же документации: For exact-value numbers, ROUND() uses the “round half away from zero” or “round toward nearest” rule: A value with a fractional part of .5 or greater is rounded up to the next integer if positive or down to the next integer if negative. (In other words, it is rounded away from zero.) A value with a fractional part less than .5 is rounded down to the next integer if positive or up to the next integer if negative. или, если по-русски, "округление к ближайшему целому в направлении от нуля", т.е. положительные - вверх, а отрицательные - вниз. PS. Обратите внимание - функции преобразования типа CAST() и CONVERT() вообще не предусматривают приведения числа к неточному числовому типу.

Замена повторяющихся символов с помощью регулярных выражений

#c_sharp #регулярные_выражения


Возможно ли заменить в слове все повторяющиеся символы одним с помощью регулярного
выражения?
Максимум повторений символа равно двум.
Разобрался как удалить заранее известный символ (например s{2}), но по аналогии сделать
не вышло.



Пример:

Input: success, book, read

Output: suces, bok, read 
    


Ответы

Ответ 1



using System; using System.Text.RegularExpressions; public class Test { public static void Main() { Console.WriteLine(Regex.Replace("success", @"(.)\1+", "$1")); } }

Switch и двойное условие? Массив и его заполнение?

#java


1) Как сделать в обычном примере двойное условие в switch? Перепробовал всё что можно.

В этом примере ругается компилятор.

public class Ivan {
    public static void main(String[] args) {
        int a = 5, b = 10;

        switch(a, b){
            case 5:
            case 10:
                System.out.println("Правильно");
                break;
            case 6:
            case 11:
                System.out.println("Неправильно");
                break;
            default:
                System.out.println("Потеря потерь");
                break;
        }
    }
}


2) Можно ли в массив с размером 10 элементов через цикл заполнить в него значения
в каждый элемент? Если да, то как?

3)Можно ли сделать так, чтобы массив содержал и строки и целые числа и дробные допустим.
Если да, то как?

Какой-нибудь_общий_тип array[] = {1, "Hello", 12.5}; 


Заранее благодарю вас добрые люди!
    


Ответы

Ответ 1



Ответ на первый вопрос: Да, можно. switch(a) { case 1: //если а = 1 switch(b) { case 1: System.out.println("1"); break; } break; case 2: если a = 2 switch(b) { case 1: System.out.println("1"); break; } } Но данный оператор для этого не используется. Для этого есть if. Ответ на второй вопрос: Да, можно. int a = 0; for(int i; i < mass.length; i++) { mass[i] = a++; } Ответ на трети вопрос: Да, можно. Для этого следует написать: Object mass[] = {1, "4", new NewClass(){}, 1.28}; //где NewClass - воображаемый анонимный класс, объявляемый с помощью интерфейса (просто пример)

CSS: Обводка картинки волной

#css #svg #изображения #border




Добрый день, подскажите, как реализовать вот это на css, имеется картинка-квадрат,
нужно сделать такую вот обводку волнами
    


Ответы

Ответ 1



Но как закруглить эти острые углы не знаю но как пример покажу чуть чуть по другому но в div в песочнице

val или fun в Kotlin

#kotlin #lambda


Недавно начал писать на языке Kotlin и у меня возникло много вопросов о fun and val,
например, чем отличаются эти два случая:   


val handleMessage (Message) -> Unit = { message -> 
    /* do something here */ 
}  

fun handleMessage(message : Message){
    /* do something here*/
}



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

P.S. Я знаю что val immutable и обычно его используют для того, чтобы хранить данные
    


Ответы

Ответ 1



Большое спасибо @Grundy за помощь в поисках ответа. val handleMessage : (Message) -> Unit{ message -> /* do something */ } данный код создает новый класс: class A : (Message) -> Unit { override fun invoke(message : Message) { /* do something*/ } } Т.е. при обращении к лямбда выражению у нас создается новый класс и вызывается метод invoke с заданным параметром. В случае fun: fun handleMessage(message: Message){ /* do something*/ } данный код компилируется в следующий java-код: public class ExampleClass{ void handleMessage(Message message){ /* do something */ } } Итог: 1. fun - обыкновенная функция, которая превращается в обычный метод, в то время как val создает новый класс и вызывает его метод invoke с переданными параметрами. 2. Если вы пишите на Android, стоит избегать использования val лямбда выражений

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

#c_sharp #visual_studio


У меня есть класс и приватный конструктор, как создать если модификатор доступа не
позволяет? 
    


Ответы

Ответ 1



C# -- полный код консольного приложения https://ideone.com/89wUFX using System; namespace TestConsoleApp { class Program { public static void Main(string[] args) { Type type = typeof(Foo); Foo f = (Foo)Activator.CreateInstance(type, true); Console.ReadKey(); } } class Foo { private Foo() { Console.WriteLine("Private Constructor forefer!"); } } } Так что ответ на твой вопрос: var f = (SomeClass)Activator.CreateInstance(typeof(SomeClass), true); (SomeClass) приводим результат создаваемого обьекта к нашему классу.. Activator.CreateInstance -- Мы создаем инстанс класса через универсальный метод, через который мы можем создавать инстанс ЛЮБОГО обьекта. Что-то вроде "фабрики". typeof(SomeClass) - берем тип самого класса и высылаем как первый входной параметр метода CreateInstance(). true-- второй входной булийный параметр. Он отвечает за то, какой из конструкторов нужно использовать. Фолс = только публичный, Тру = может создавать инстанс как публичный так и приватный. Не пробовал, но... скорее всего он предпочитает приватный, если возможно. Можешь убедится сам.

Вычислить скользящее среднее

#python #pandas #машинное_обучение #dataframe #numpy


Есть датафрейм вида.

Id  Sequence
3   1,3,13...
7   1,2,1,...
8   1,2,4,...
11  1,8,25...
13  1,111,..


Где id - номер последовательности, sequence - последовательность с некоторой закономерностью.
Общая задача - угадать следующее число последовательности. Но сейчас я пока разбираюсь
со следующим:

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

Id  3   7   8   11  13  15  16  18  20  21  ... 227677  227679  227680  227681  227682
 227683  227684  227686  227689  227690
0   1   1   1   1   1   1   840 1   4   1   ... 12  1   1   7   1   0   0   0   2   5
1   3   2   2   8   111 1   1320    2   6   2   ... 50  1   6   7   0   0   -1  1   3   7
2   13  1   4   25  12211   1   1680    7   8   1   ... 113 2   45  3   1   4   -1
 9   3   179


То есть траспонировали датафрейм. Теперь следующая проблема

Метод для вычисления скользящей средней:

def moving_average(series, n):
    return np.average(series[-n:])

moving_average(dftrain[3], 24)


Здесь я подаю пока что только 1 столбец для теста, хотя на самом деле вызов должен
быть в цикле for для каждого существующего столбца. Так вот
В последовательности имеются Слишком большие числа, поэтому необходимо отсечь из
каждого столбца все числа, которые больше скажем некоторого X. Также проблема в том,
что в столбцах значения None, метод не может сложить два None числа, я пытался заменить
None на 0, но по-моему это неверно

dftrain.replace(None, 0)


Для тех кому мало данных. Данная тема является продолжением этой (Тык)

Вопроса 2. Как исключить большие числа из стобцов и как избавиться с проблемой с
None. Чтобы метод скользящее среднее отработал нормально
    


Ответы

Ответ 1



Чтобы заменить числа состоящие из более чем 12 цифр на бесконечность, а строковые значения None на NaN (Not a Number): import pandas as pd def strip_big_nums(col, maxlen=12): return pd.to_numeric(np.where(col.str.len() > maxlen, 'inf', col), errors='coerce') train = pd.read_csv(r'C:\download\train.csv', sep=",", index_col=['Id']) r = train['Sequence'].str.split(',', expand=True) r = r.apply(lambda col: strip_big_nums(col, 12)) получилось: In [8]: r Out[8]: 0 1 2 3 4 5 6 7 ... 340 341 342 343 344 345 346 347 Id ... 3 1.0 3.0 13.0 87.0 1053.0 2.857600e+04 2.141733e+06 5.081471e+08 ... NaN NaN NaN NaN NaN NaN NaN NaN 7 1.0 2.0 1.0 5.0 5.0 1.000000e+00 1.100000e+01 1.600000e+01 ... NaN NaN NaN NaN NaN NaN NaN NaN 8 1.0 2.0 4.0 5.0 8.0 1.000000e+01 1.600000e+01 2.000000e+01 ... NaN NaN NaN NaN NaN NaN NaN NaN 11 1.0 8.0 25.0 83.0 274.0 2.275000e+03 1.322240e+05 1.060067e+06 ... NaN NaN NaN NaN NaN NaN NaN NaN 13 1.0 111.0 12211.0 1343211.0 147753211.0 1.625285e+10 inf inf ... NaN NaN NaN NaN NaN NaN NaN NaN 15 1.0 1.0 1.0 1.0 1.0 1.000000e+00 1.000000e+00 1.000000e+00 ... NaN NaN NaN NaN NaN NaN NaN NaN 16 840.0 1320.0 1680.0 2520.0 3192.0 3.432000e+03 4.920000e+03 5.208000e+03 ... NaN NaN NaN NaN NaN NaN NaN NaN ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 227681 7.0 7.0 3.0 2.0 3.0 9.000000e+00 5.000000e+00 4.000000e+00 ... NaN NaN NaN NaN NaN NaN NaN NaN 227682 1.0 0.0 1.0 0.0 0.0 0.000000e+00 0.000000e+00 0.000000e+00 ... NaN NaN NaN NaN NaN NaN NaN NaN 227683 0.0 0.0 4.0 1198.0 1829388.0 2.379604e+10 inf inf ... NaN NaN NaN NaN NaN NaN NaN NaN 227684 0.0 -1.0 -1.0 -1.0 -1.0 1.032430e+07 inf inf ... NaN NaN NaN NaN NaN NaN NaN NaN 227686 0.0 1.0 9.0 85.0 801.0 7.549000e+03 7.114500e+04 6.705010e+05 ... NaN NaN NaN NaN NaN NaN NaN NaN 227689 2.0 3.0 3.0 4.0 6.0 4.000000e+00 5.000000e+00 1.000000e+01 ... NaN NaN NaN NaN NaN NaN NaN NaN 227690 5.0 7.0 179.0 229.0 439.0 5.570000e+02 6.113000e+03 2.239990e+05 ... NaN NaN NaN NaN NaN NaN NaN NaN [113845 rows x 348 columns] далее данный DF можно транспонировать: In [9]: r.T Out[9]: Id 3 7 8 11 13 15 16 ... 227681 227682 227683 227684 227686 227689 227690 0 1.0 1.0 1.0 1.0 1.000000e+00 1.0 840.0 ... 7.0 1.0 0.000000e+00 0.000000e+00 0.0 2.0 5.0 1 3.0 2.0 2.0 8.0 1.110000e+02 1.0 1320.0 ... 7.0 0.0 0.000000e+00 -1.000000e+00 1.0 3.0 7.0 2 13.0 1.0 4.0 25.0 1.221100e+04 1.0 1680.0 ... 3.0 1.0 4.000000e+00 -1.000000e+00 9.0 3.0 179.0 3 87.0 5.0 5.0 83.0 1.343211e+06 1.0 2520.0 ... 2.0 0.0 1.198000e+03 -1.000000e+00 85.0 4.0 229.0 4 1053.0 5.0 8.0 274.0 1.477532e+08 1.0 3192.0 ... 3.0 0.0 1.829388e+06 -1.000000e+00 801.0 6.0 439.0 5 28576.0 1.0 10.0 2275.0 1.625285e+10 1.0 3432.0 ... 9.0 0.0 2.379604e+10 1.032430e+07 7549.0 4.0 557.0 6 2141733.0 11.0 16.0 132224.0 inf 1.0 4920.0 ... 5.0 0.0 inf inf 71145.0 5.0 6113.0 .. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 341 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN 342 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN 343 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN 344 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN 345 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN 346 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN 347 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN [348 rows x 113845 columns]

Как добавить новую запись в DataFrame?

#python #python_3x #python_2x #pandas #dataframe


Есть следующий pandas DataFrame: 

df = pd.DataFrame(columns=['labels', 'texts'])


Как добавить новую запись в этот DataFrame?
    


Ответы

Ответ 1



Эффективнее собрать все данные в список списков и создать DataFrame целиком: df = pd.DataFrame(data, columns=['labels', 'texts']) Чтобы добавить одну строку: df.loc[len(df)] = [label, text]

Как сделать некоторые пункты QComboBox временно недоступными для выбора

#cpp #qt5


коллеги!
Среда IDE QT Creator 5.10. У меня такой вопрос. Есть QComboBox, у которого много
пунктов. В зависимости от смены режимов некоторые пункты должны становиться недоступными
для выбора, но нельзя просто стереть текущий набор пунктов и заполнить только разрешёнными.
Надо сделать чтобы недоступные пункты остались, но изменили цвет на серый и стали недоступными
для выбора пользователем. Необходимо чтобы номера разрешённых пунктов выпадающего меню
не изменялись потому что выбор пунктов и смену режимов может выполнять не только пользователь,
но и управляемая система, а у неё номера фиксированные.
Пример:

QStringList interlivingPSK;
interlivingPSK << "1: Zero"
               << "2: Ultra Short"
               << "3: Very Short"
               << "4: Short"
               << "5: Medium"
               << "6: Long"
               << "7: Very Long";
ui->comboBoxInterleaverPSK->addItems(interlivingPSK);
ui->comboBoxInterleaverPSK->setCurrentIndex(4);


Как, например, "загрэить" пункты 2, 3, 5, 7 ?
    


Ответы

Ответ 1



Обратитесь к модели QComboBox и через нее сделайте элементы неактивными: QStandardItemModel* model = (QStandardItemModel*) ui->comboBoxInterleaverPSK->model(); model->item(1)->setEnabled(false); model->item(2)->setEnabled(false); model->item(4)->setEnabled(false); model->item(6)->setEnabled(false);

Импортированные стили в ReactJS

#css #reactjs


Делаю приложение на ReactJS.

Есть два "модуля" - Admin, Operator.

У каждого модуля свои стили. Есть конечно общие стили. С этим проблем нет.
Но вот есть стили которые относятся к модулю. 
Я их импортирую в компоненте страницы модуля (к примеру LoginPage), к примеру так:

import '../../style/page/auth/style.css';
import '../../style/page/auth/media.css';
import '../../style/page/auth/custom.css';


Но вот проблема в том что все стили, со всех страниц и модулей вставляются в head
страницы. И стили будут перебиваться.

Как это пофиксить? что бы в head вставлялись стили только для нужного модуля.

в index.js у меня есть роутер:


    
        
        
        
    


    


Ответы

Ответ 1



Никак. Вы правильно заметили что все стили при компиляции проекта созданного c помощью create-react-app объединяются и помещаются в Следуйте каким-то конвенциям при написании стилей, например БЭМ чтобы избежать перезаписи стилей. Альтернативным решением является создание собственной кофигурации на Webpack, но я бы не советовал такой подход, потому что в данном случае он является скорее "костылем" нежели решением. create-react-app + конвенция для стилей = Best Practice

Анимация растровой картинки самолёта вдоль svg пути

#css #css3 #html5 #svg #анимация


Для реализации сценки полета самолёта с Дедом морозом на борту я нашел два растровых
изображения :  

Наряженная ёлочка в зимнем лесу 

 

и изображение Деда Мороза с подарками в самолёте

 

В векторном редакторе я нарисовал траекторию движения самолёта и совместил её с растровым
изображением ёлки.   

  

Код трассы полёта самолёта: 





	  





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


Ответы

Ответ 1



Добавляем растровую картинку зимнего леса в векторный редактор и рисуем путь повторяющий, заданную трассу полёта самолёта Узловые точки добавляем инструментом - рисовать кривые Безье(на рисунке цифра 1 ) Выделяем узлы делаем их автоматически сглаженными. Рычагами управления узловых точек корректируем форму кривой. Сохраняем в файл svg и берем из него формулу патча. Создаем новый файл svg в который копируем полученный патч трассы самолёта и с помощью тегов добавляем изображения. Добавляем команды анимации перемещения самолёта вдоль трассы и анимацию увеличения самолёта по мере приближения к концу пути: многократный повтор Добавляем в команды анимации - repeatCount="indefinite"


Эффект рождественских огней

#css #css3 #html5 #анимация


Я пытаюсь создать рождественские огни (в январе), используя CSS  -webkit-animation
свойства. 

Для этого я использую это изображение: 

  

Я пробовал: 

@-webkit-keyframes lights {
    0% {
        background-position:0px;
    } 100% {
        background-position:0 -69px;
    }
}

#lights {
    width:100%;
    height:69px;
    background:url(https://mysterybrand.net/assets/images/new-year/live-drop-gardland.png);
    -webkit-animation: lights 1s infinite;
}


Чего я хочу добиться: я хочу постоянно менять background position, чтобы казалось,
что свет выключается и включается.  

Почему мой код не меняет background position, а анимирует изображение?

Надеюсь, кто-нибудь может мне помочь.  
    


Ответы

Ответ 1



Вы можете рассмотреть steps()1, чтобы получить необходимый эффект, и отрегулировать позиции, как показано ниже. Обратите внимание на начальное значение, потому что 0 не совпадает с 0 0: @keyframes lights { 0% { /*Two zeros, not one !!*/ /*[0] is equivalent to [0 50%] and will create a different animation */ background-position:0 0; } 100% { background-position:0 -138px; } } #lights { height:69px; background:url(https://mysterybrand.net/assets/images/new-year/live-drop-gardland.png); animation: lights 1s infinite steps(2); }
Или сделайте это так: @keyframes lights { 0%,50% { background-position:0 0; /*Two zeros, not one !!*/ } 50.1%,100% { background-position:0 -69px; } } #lights { height:69px; background:url(https://mysterybrand.net/assets/images/new-year/live-drop-gardland.png); animation: lights 1s infinite; }
Подробнее о том, как использовать steps(): https://stackoverflow.com/a/51843473/8620333

Не работает IntelliSense для C# в VScode под GNU\Linux

#c_sharp #linux #visual_studio_code #mono #intellisense


Расширение установлено, проект создан через dotnet 2.2.102. Monodevelop также установлен.
Из логов OmniSharp понял, что он не может найти msbuilder. Нашёл, установил, но не
помогло. Два дня пытаюсь найти решение, нагугленные решения не помогают, ни установка
ранней версии плагина, ни переустановка VSC, ни установка MSBuilder.
Ошибки те же, IntelliSense не работает.
Вот логи от OmniSharp: 

System.TypeLoadException: Could not load type of field 'OmniSharp.MSBuild.ProjectManager:_queue'
(9) due to: Could not load file or assembly 'System.Threading.Tasks.Dataflow, Version=4.5.24.0,
Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies.
  at (wrapper managed-to-native) System.RuntimeTypeHandle.is_subclass_of(intptr,intptr)
  at System.RuntimeTypeHandle.IsSubclassOf (System.RuntimeType childType, System.RuntimeType
baseType) [0x00016] in :0 
  at System.RuntimeType.IsSubclassOf (System.Type type) [0x00020] in :0 
  at System.RuntimeType.IsValueTypeImpl () [0x00026] in :0 
  at System.Type.get_IsValueType () [0x00000] in :0 
  at System.Type.get_IsClass () [0x0000b] in :0 
  at System.Composition.TypedParts.Discovery.TypeInspector.InspectTypeForPart (System.Reflection.TypeInfo
type, System.Composition.TypedParts.Discovery.DiscoveredPart& part) [0x0000b] in <9aac21a4a3f24063b2b8b59143acddfc>:0 
  at System.Composition.TypedParts.TypedPartExportDescriptorProvider..ctor (System.Collections.Generic.IEnumerable`1[T]
types, System.Composition.Convention.AttributedModelProvider attributeContext) [0x00037]
in <9aac21a4a3f24063b2b8b59143acddfc>:0 
  at System.Composition.Hosting.ContainerConfiguration.CreateContainer () [0x00042]
in <9aac21a4a3f24063b2b8b59143acddfc>:0 
  at OmniSharp.CompositionHostBuilder.Build () [0x00191] in :0 
  at OmniSharp.Stdio.Host..ctor (System.IO.TextReader input, OmniSharp.Stdio.Services.ISharedTextWriter
writer, OmniSharp.IOmniSharpEnvironment environment, Microsoft.Extensions.Configuration.IConfiguration
configuration, System.IServiceProvider serviceProvider, OmniSharp.CompositionHostBuilder
compositionHostBuilder, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory,
System.Threading.CancellationTokenSource cancellationTokenSource) [0x0007e] in :0 
  at OmniSharp.Stdio.Driver.Program+<>c__DisplayClass0_0.
b__1 () [0x00116] in <93ea459c1f92407098a355199aa33d94>:0 at OmniSharp.CommandLineApplication+<>c__DisplayClass11_0.b__0 () [0x0000b] in :0 at Microsoft.Extensions.CommandLineUtils.CommandLineApplication.Execute (System.String[] args) [0x0035b] in :0 at OmniSharp.CommandLineApplication.Execute (System.Collections.Generic.IEnumerable`1[T] args) [0x00042] in :0 at OmniSharp.Stdio.Driver.Program+<>c__DisplayClass0_1.
b__0 () [0x00028] in <93ea459c1f92407098a355199aa33d94>:0 at OmniSharp.HostHelpers.Start (System.Func`1[TResult] action) [0x0001c] in :0


Ответы

Ответ 1



Нашёлся ответ. Мне подсказали, что в настройках VSC (File->Preferences->Settings) есть пункт Omnisharp Use Global Mono, нужно выставить значение "never", после чего перезапустить среду. Всё работает.

Justify content start если строка не заполнена

#html #css #css3 #вёрстка #flexbox


При работе с Flexbox наткнулся на такую проблему. Как-то не получается решить его
без изобретения нового велосипеда.

Вот сам пример.



.flex {
  display: flex;
  justify-content: space-between;
  flex-wrap: wrap;
}

.child {
  width: 24%;
  height: 50px;
  background: red;
  margin-bottom: 20px;
  color: white;
}
last element
Вот, в примере, последний элемент с надписью last element хочу чтобы был слева, там, где тот же элемент предыдущей строки. То есть если строка не заполнена, то элементы позиционировать слева. Может кто-то поможет разобраться с этой проблемой.


Ответы

Ответ 1



Если вы хотите, чтобы элементы шли один за другим с одинаковыми промежутками — не обязательно использовать justify-content: space-between. В вашем примере элементы, шириной 24% расположены по 4 в ряд и равномерно распределены между границами flex-контейнера. Т.е. три отступа между ними — это 4% ширины контейнера. Дело за малым — добавить отступ справа у всех элементов, кроме каждого четвёртого. .flex { display: flex; flex-wrap: wrap; } .child { width: 24%; height: 50px; background: red; color: white; margin: 0 calc(4% / 3) 20px 0; } .child:nth-child(4n+4) { margin-right: 0; }
last element


В чем ошибка алгоритма?

#c


Алгоритм должен возвращать двумерный массив с разделенной по пробелу строкой (тот
же split(" ") из Python). 

#include 
#include 
#include 

// Добавление char в конец массива char
void append(char* needed, char to_append) {
    int length = strlen(needed);
    needed[length] = to_append;
    needed[length+1] = '\0';
}


char** split(char* input) {
    int space_count = 0;

    // Считаем пробелы
    for (int i = 0; i < strlen(input); i++) {
        if (input[i] == ' ') {
            space_count++;
        }
    }

    // Указатель на указатель на char.
    char **splitted_input;
    // Выделяем память под массивы char
    splitted_input = (char**) malloc((space_count+1) * sizeof(*splitted_input));

    // Хранилище для текущей строки (перед пробелом)
    char word[100] = "";
    int current = 0;

    for (int i = 0; i < strlen(input); i++) {
        if (input[i] == ' ') {
            printf("NEW: [%d] = %s\n", current, word);
            splitted_input[current] = word;
            current++;
            // Обнуляем весь массив
            memset(word, 0, sizeof(word));
            continue;
        }

        // Если не пробел, то добавляем в конец word новый символ
        append(word, input[i]);
    }


    printf("NEW: [%d] = %s\n\n", current, word);
    // Добавляем текущую строку
    splitted_input[current] = word;

    for (int i = 0; i < space_count+1; i++) {
        printf("%s\n", splitted_input[i]);
    }


    // Еще не имею понятия, как здесь лучше освободить память splitted_input
    return splitted_input;
}



int main() {
    char input[20] = "hi everyone";

    char** need = split(input);

    return 0;
}


Выводит:

NEW: [0] = hi
NEW: [1] = everyone

everyone
everyone


Не понимаю, почему splitted_input[0] тоже равняется everyone
    


Ответы

Ответ 1



Непосредственный ответ на вопрос: они оба указывают на один и тот же word. Другая проблема: из функции возвращается массив с указателями на локальную переменную. Решение. Для splitted_input[current] выделяйте память на новую строку, куда копируйте содержимое word: splitted_input[current] = strdup(word);

Ответ 2



splitted_input[current] = word; На каждой итерации цикла указатель splitted_input[current] ставится на один и тот же массив word. Разумеется будет выводиться одна и та же строка, если все указатели указывают в одно и то же место.

Получить адрес файла с помощью ярлыка (.lnk) в JAVA

#java


Есть ярлык на папку (.lnk), мне нужно, чтобы программа с помощью этого ярлыка получила
адрес папки, на которую ярлык указывает. Как это можно сделать?
    


Ответы

Ответ 1



Если хочется угореть по хардкору - вот официальная спецификация формата LNK от Microsoft. Читаете, осознаёте, пишете прасер. Если же угорать не охота, то можно использовать опыт наших зарубежных коллег, коллективный разум которых породил сразу несколько вариантов парсеров файлов LNK.

Ответ 2



Задачу получилось выполнить с помощью данного кода: https://github.com/DmitriiShamrikov/mslinks

Объединить два приложения в Google Play

#android #google_play


У меня два приложения, оба распространяются бесплатно. В процессе развития пришел
к тому, что функционал первого приложения "влился" во второе. Хотелось бы остановить
развитие первого проекта (закрыв его в GP), а аудиторию перевести на второе. Это возможно
технически или организационно?
    


Ответы

Ответ 1



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

Сделать текст с заглавной буквы

#html #css


Подскажите, как сделать текст с заглавной буквы? Есть текст на сайте, но он по умолчанию
капс лок, надо как-то сделать его capitalize. Капеиталайз работает, когда текст изначально
мелкий, а как сделать то же самое, когда он уже большой (то, что он большой нельзя
изменить)



p{
 text-transform:capitalize!IMPORTANT;   
}

LOREM IPSUM


Ответы

Ответ 1



Если вам нужно непосредственно "с заглавной буквы", то можно воспользоваться псевдоэлементом :first-letter: p { text-transform: lowercase; } p:first-letter { text-transform: uppercase; }

ТЕКСТ БОЛЬШУЩИЙ, БОЛЬШОЙ ТЕКСТ.



Ответ 2



Можно так: function titleCase(str) { var splitStr = str.toLowerCase().split(' '); for (var i = 0; i < splitStr.length; i++) { splitStr[i] = splitStr[i].charAt(0).toUpperCase() + splitStr[i].substring(1); } return splitStr.join(' '); } document.querySelector("p").textContent = titleCase(document.querySelector("p").textContent);

LOREM IPSUM DOLOR SIT AMET



Определения макросов

#c #динамические_массивы #макросы #макрос


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


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


В методичке ничего не написано кроме пояснений про #define, #if и т.д. Хотелось бы
иметь хоть какое-то представление, о чем речь идет)
    


Ответы

Ответ 1



Похоже, что от вас хотят что-то вроде int total = 0; int mallocs = 0; int frees = 0; #define malloc(s) (mallocs++, total += (s), malloc((s))) #define free(s) (frees++, free((s))) int main(int argc, const char * argv[]) { char * c = malloc(200); char * v = malloc(2000); free(c); printf("Alloc %d bytes in %d mallocs; frees: %d times\n", total, mallocs,frees); }

Открытие activity в отдельном окне

#java #android


Как сделать что бы новая activity открывалась не по верх другой, а как бы в новом
окне, т.е чтобы при нажатии на кнопку последних программ пользователь видел и новую
активити и ее родителя? Например в приложении почта mail.ru когда нажимаешь на итем
новое сообщение, ты можешь что то написать(но не отправлять), затем вернуться в основное
приложение и что то сделать там, а потом снова продолжить писать текст сообщения, к
тому же можно так делать много раз и в истории программ будет много этих активити с
новыми сообщениями


    


Ответы

Ответ 1



UPD: Может кому то будет полезно. Только api>21(android 5.0) intent.addFlags(FLAG_ACTIVITY_NEW_DOCUMENT); // что бы активити запустилась в новом окне // если нужно что бы каждый раз активити была в новом окне, то еще и: intent.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK); // каждый запуск в новом окне Можно так же прописать для Activity эти параметры в манифесте, подробнее developer.android.com/guide/components/activities/recents.html

Задача на рекурсию про лесенку из кубиков [закрыт]

#cpp #рекурсия


        
             
                
                    
                        
                            Закрыт. Этот вопрос необходимо уточнить или дополнить
подробностями. Ответы на него в данный момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Добавьте больше подробностей
и уточните проблему, отредактировав это сообщение.
                        
                        Закрыт 10 месяцев назад.
                                                                                
           
                
        
Эта тема не вопрос, а работающее решение данной задачи в рекурсивном виде и оно ищет
максимальную высоту лесенки, ничего больше.
Как заметили в комментариях можно решить эту задачу через арифметическую прогрессию.
Лесенкой называется набор кубиков, в котором каждый верхний слой содержит кубиков
меньше, чем в предыдущем. Требуется написать программу вычисляющую число лесенок из
N кубиков.
Очень долго искал в интернете какой-то адекватно работающий вариант и все же решил
сделать сам и помочь кому-то со схожей проблемой. Публикую решение ниже.
Для тех, кто хочет разобраться. Сначала самым первым слоем является только один кубик,
в последующих итерациях создаётся слой длины больший на 1, чем предыдущий. И так до
тех пор, пока не достигается результат.

int layersCount = 1;

int Stairs(int n, int previousLayer)
{

    int thisLayer=0;
    while (thisLayer - previousLayer !=1 && n - (thisLayer + previousLayer)>0)
        thisLayer++;

    if (thisLayer - previousLayer == 1) layersCount += 1;
    if (n - thisLayer-previousLayer > 0)
        return Stairs(n - previousLayer, thisLayer);
    else
        return layersCount;

}

int main()
{
    int n;
    std::cin >> n;

    std::cout << Stairs(n,1);
}

    


Ответы

Ответ 1



Округленное вниз положительное решение квадратного уравнения: (k + 1) * k / 2 = n k = floor((-1 + sqrt(1 + 8 * n)) / 2) (Привет от маленького Гаусса.)

Ответ 2



Задачи "ищет максимальную высоту лесенки" и "число лесенок из N кубиков" - разные. Отвечу на вторую, т.к. про неё написано "требуется найти", и приведена более-менее чёткая формулировка: Лесенкой называется набор кубиков, в котором каждый верхний слой содержит кубиков меньше, чем в предыдущем. Требуется написать программу, вычисляющую число лесенок из N кубиков. Это число разбиений (partitions) N на различные слагаемые (1, 1, 2, 2, 3, 4, 5, 6, 8, 10, 12, 15, 18, 22..) import functools @functools.lru_cache(maxsize=None) #простейшая мемоизация def growparts(n, last): if n == 0: return 1 result = 0 for i in range(last + 1, n + 1): result += growparts(n - i, i) return result for k in range(15): print(k, growparts(k, 0))

Чтение и запись членов union

#cpp #c #language_lawyer


Никак не могу найти однозначный ответ на следующий вопрос.

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

Например:

typedef union u_color_pack
{
    uint8_t b[4];
    uint32_t raw;
} color_pack;

// …

uint8_t color_check(const uint32_t _raw)
{
    color_pack color;
    color.raw = _raw;
    if (color.b[0] == 0)
    {
        return 0;
    } 
    return 1;
}


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

Так вот, проблема в том, что некоторые говорят, что нельзя читать из union-а данные
типа A, если перед этим в union были записаны данные типа B.

Одни говорят, что такая ситуация является неопределенным поведением. Другие - что
это поведение, определяемое реализацией.

Что по этой проблеме говорят стандарты C и C++? Отличается ли то, что они говорят?
    


Ответы

Ответ 1



Задача обращатся по одному адресу к данным и как к целой структуре и как к массиву байт - очень часто-встречаемая задача. из комментариев от VTT, что б избежать UB следует делать так. uint8_t color_check(const uint32_t _raw) { uint_8_t * b = reinterpret_cast(&raw) if (b[0] == 0) { return 0; } return 1; } Не следует делать через union - т.к. UB -оптимизатор предполагает что за одну "итерацию" юнион использует одну ветвь, и при включеном оптимизаторе нового поколения программа может отработать не верно. Через каст без указания типа каста. ((char*)&_raw)[0] - можно поймать UB. Про порядок байт - порядок байт может меняться, только если используются нестандартные платформы, т.е. если вы предполагаете, что код будет работать на платформах отличных от intel x86/x64-совместимых (или там AMD). Для ускорения вычислений - делают предопределение #define и назначают значение предпроцессору, например #ifdef litte_indian // Прямой порядок #else // Обратный порядок #endif Теперь касательно стандартов. На счёт UB https://habr.com/ru/post/216189/ п 1.3.12 Неопределенное поведение (undefined behavior)– поведение, которое может возникать в результате использования ошибочных программных конструкций или некорректных данных, на которые Международный Стандарт не налагает никаких требований. Неопределенное поведение также может возникать в ситуациях, не описанных в Стандарте явно. На счёт использования union, стандарт с не оговаривает как правильно использовать юнион, а стандарт c++ вам уже ответили VTT п 12.3 В с++ union в любой момент времени может быть активно не более одного поля. За исключением доступа к общей подструктуре standard-layout объектов, доступ к неактивным полям является неопределенным поведением. В общем случае для обращения к неактивному полю сначала следует вручную вызвать деструктор активного поля, затем вызвать placement new поля, которое требуется сделать активным.

Ответ 2



В С++ в union в любой момент времени может быть активно не более одного поля. За исключением доступа к общей подструктуре standard-layout объектов, доступ к неактивным полям является неопределенным поведением. В общем случае для обращения к неактивному полю сначала следует вручную вызвать деструктор активного поля, затем вызвать placement new поля, которое требуется сделать активным. 12.3 Unions [class.union] 1 In a union, a non-static data member is active if its name refers to an object whose lifetime has begun and has not ended (6.8). At most one of the non-static data members of an object of union type can be active at any time, that is, the value of at most one of the non-static data members can be stored in a union at any time. [Note: One special guarantee is made in order to simplify the use of unions: If a standard-layout union contains several standard-layout structs that share a common initial sequence (12.2), and if a non-static data member of an object of this standard-layout union type is active and is one of the standard-layout structs, it is permitted to inspect the common initial sequence of any of the standard-layout struct members; see 12.2. —end note ]

Добавить стрелку к SVG анимации линии

#css #css3 #svg #css_animation #svg_animation


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

Вот пример того, что я пытаюсь сделать:  https://stackoverflow.com/a/45548957/7394871     



.shape svg {
  width:100%;
  height: auto;
}
.outline {
  stroke-dasharray: 32050;
  animation: dash 2s linear forwards;
  stroke-linejoin: round;
}

@keyframes dash {
  from {
    stroke-dashoffset: 32050;
  }
  to {
    stroke-dashoffset: 0;
  }
}


Ответы

Ответ 1



Вы не можете анимировать маркер используя stroke-dasharray. Так как местоположение черты - пробела перемещается вдоль пути, но сам путь не перемещается, поэтому маркер, который находится на конце линии не будет перемещаться. @Michael Mullany Но вы можете заменить маркер треугольником и заставить его двигаться по тому же пути, который анимирован. Для этого используйте команду animateMotion , где id ="border" - анимируемый путь Анимации stroke-dashoffset и animateMotion имеют одинаковую продолжительность, и поэтому будет казаться, что треугольник движется одновременно с линией. .shape svg { width:100%; height: auto; } .outline { stroke-dasharray: 3253; animation: dash 7s linear forwards; stroke-linejoin: round; } @keyframes dash { from { stroke-dashoffset: 3253; } to { stroke-dashoffset: 0; } }