Страницы

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

пятница, 20 марта 2020 г.

Выдаёт ошибки в Git

#git #github


Я начал знакомство с Git. Я создаю репозиторий для отслеживания изменений в своём
проекте. следующим образом.

 git init 
 git config --global user.name "Your Name" (вписал, что надо)
 git config --global user.email you@example.com


Дальше создал файл  .gitignore, отобразил и зафиксировал все изменения.
Потом перешёл к созданию коммита для отправки.

git commit -m "My first commit ever"


Дальше связал локальный репозиторий с гитхабовским

git remote add origin https://github.com/MK/my-first-app.git


Но, когда я хочу отправить локальный коммит в репозиторий на гитхаб

git push origin master


Выдаёт это:

Fatal: HttpRequestException encountered.
Username for 'https://github.com': MK
Password for 'https://MK@github.com':
To https://github.com/Mk/my-first-app.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://github.com/Mk/my-first-app.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.


Что делать и как быть я не знаю, прошу помочь.
    


Ответы

Ответ 1



Если репозиторий на Github свежесозданный, и никем кроме вас не использвался - то скорее всего при создании репозитория вы нажали что-то вроде Initialize with readme прямо в интерфейсе гитхаба. Это добавило в ваш репозиторий на гитхабе стандартный коммит, которого локально у вас нет. Проверьте историю коммитов на гитхабе, если там один шаблонный коммит - просто перепишите его принудительным пушем: git push -f origin master Если там есть нешаблонные коммиты - выясняйте, откуда они там взялись :)

Ответ 2



делай git pull origin master прежде чем делать git push.... всегда делай сначала pull, и только потом push

Ответ 3



Если у вас уже есть удаленный репозиторий, то вместо пары git init, git remote add лучше делать git clone. А в сложившейся ситуации у вас два варианта: Выполнить слияние (о чем написано в тексте сообщения об ошибке) Удалить историю в одном из репозиториев

Разворачивание таблиц

#sql #interbase


Есть три таблицы


main (id, f1, f2, f3, ...)
detail (id, main_id)
sub_detail (id, param, val)


Связь main -> detail один ко многим, detail -> sub_detail один к одному (по полям id)

На выходе нужно получить таблицу с полями

main_id, f1, f2, f3, value1, value2, value3

где valueN это значение поля val из таблицы sub_detail для записи с param = N. Не
все valueN могут присутствовать в базе.

Базовый запрос выглядит так

SELECT
  m.id AS main_id,
  m.f1,
  m.f2,
  m.f3,
  s1.val AS value1,
  s2.val AS value2,
  s3.val AS value3
FROM
  main m
  LEFT JOIN detail d ON (
    d.main_id = m.id
  )
  LEFT JOIN sub_detail s1 ON (
    s1.id = d.id AND
    s1.param = 1
  )
  LEFT JOIN sub_detail s2 ON (
    s2.id = d.id AND
    s2.param = 2
  )
  LEFT JOIN sub_detail s3 ON (
    s3.id = d.id AND
    s3.param = 3
  )
WHERE
  m.id = 1;


Но он вместо одной записи возвращает столько записей, сколько есть дочерних записей
в detail.

Поставить группировку по main.id и вытаскивать MAX(s.val) я не могу, т.к. в запросе
есть еще поля f1, f2

Есть вариант на основании detail и sub_detail построить view

CREATE VIEW vw_detail (
  main_id,
  param,
  val
) AS
SELECT
  d.main_id,
  s.param,
  s.val
FROM
  detail d
  JOIN sub_detail s ON (
    d.id = s.id
  )


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

SELECT
  m.id AS main_id,
  m.f1,
  m.f2,
  m.f3,
  s1.val AS value1,
  s2.val AS value2,
  s3.val AS value3
FROM
  main m
  LEFT JOIN vw_detail s1 ON (
    s1.main_id = m.id AND
    s1.param = 1
  )
  LEFT JOIN vw_detail s2 ON (
    s2.main_id = m.id AND
    s2.param = 2
  )
  LEFT JOIN vw_detail s3 ON (
    s3.main_id = m.id AND
    s3.param = 3
  )
WHERE
  m.id = 1;


но в Interbase есть старый баг из-за которого при вызове LEFT JOIN view начинают
игнорироваться индексы и происходит полное сканирование таблицы. А писать JOIN vw_detail
нельзя, потому что некоторые (или даже все) параметры могут отсутствовать.

Пробовал писать так

CREATE VIEW vw_values (
  main_id,
  value1,
  value2,
  value3
) AS
SELECT
  m.id,
  MAX(s1.val),
  MAX(s2.val),
  MAX(s3.val),
FROM
  main m
  LEFT JOIN detail d ON (
    d.main_id = m.id
  )
  LEFT JOIN sub_detail s1 ON (
    s1.id = d.id AND
    s1.param = 1
  )
  LEFT JOIN sub_detail s2 ON (
    s2.id = d.id AND
    s2.param = 2
  )
  LEFT JOIN sub_detail s3 ON (
    s3.id = d.id AND
    s3.param = 3
  )
GROUP BY
  m.id;


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

SELECT
  m.id AS main_id,
  m.f1,
  m.f2,
  m.f3,
  v.value1,
  v.value2,
  v.value3
FROM
  main m
  JOIN vw_values v ON (
    v.main_id = m.id
  )
WHERE
  m.id = 1;


но тогда вначале идет построение VIEW с группировкой, а потом накладывание условия
v.main_id = m.id. План получается дикий.

Вариант заменить vw_values селективной процедурой тоже не подходит. Т.к. основной
запрос выполняется в другой view, а синтаксис Interbase не позволяет внутри view использовать
процедуры

P.S. Вариант перейти на Firebird не предлагать

Ссылка на DB Fiddle.
    


Ответы

Ответ 1



SELECT m.id AS main_id, m.f1, m.f2, m.f3, MAX(s1.val) AS value1, MAX(s2.val) AS value2, MAX(s3.val) AS value3 FROM main m LEFT JOIN detail d ON ( d.main_id = m.id ) LEFT JOIN sub_detail s1 ON ( s1.id = d.id AND s1.param = 1 ) LEFT JOIN sub_detail s2 ON ( s2.id = d.id AND s2.param = 2 ) LEFT JOIN sub_detail s3 ON ( s3.id = d.id AND s3.param = 3 ) WHERE m.id = 1 GROUP BY m.id, m.f1, m.f2, m.f3 fiddle

Ответ 2



Денормализовал таблицу detail и скопировал туда поле param. После чего запрос переписался в такой вид SELECT m.id AS main_id, m.f1, m.f2, m.f3, s1.val AS value1, s2.val AS value2, s3.val AS value3 FROM main m LEFT JOIN detail d1 ON ( d1.main_id = m.id AND d1.param = 1 ) LEFT JOIN sub_detail s1 ON ( s1.id = d1.id ) LEFT JOIN detail d2 ON ( d2.main_id = m.id AND d2.param = 2 ) LEFT JOIN sub_detail s2 ON ( s2.id = d2.id ) LEFT JOIN detail d3 ON ( d3.main_id = m.id AND d3.param = 3 ) LEFT JOIN sub_detail s3 ON ( s3.id = d3.id ) WHERE m.id = 1; Если кто подскажет решение без денормализации - буду рад Update Причем поля detail.main_id и detail.param должны входить в общий индекс. Если завести два отдельных, то хоть и план строится с использованием индексов, но выполнение очень долгое

Постепенный вывод всех перестановок через генератор

#python_3x #python_37 #перестановка


Необходимо с момощью генератора вывести все перестановки списка в виде строки, начиная
с первого элемента и до их (неопределённого) полного количества. Пример:

arr = ['1','2','3']
for perm in all_perms():
    print(perm)


Должно вывести:

1
2
3
11
12
13
14
21
22
23
24
31
32
33
34
41
42
43
44
123
(и так далее)


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


Ответы

Ответ 1



Это не перестановки, а размещения с повторениями. import itertools def f(seq): for n in range(1, len(seq) + 1): yield from itertools.product(seq, repeat=n) for row in f('123'): print(''.join(row)) 1 2 3 11 12 13 21 22 23 31 32 33 111 112 ...

Вычисление чётного факториала

#javascript #html #алгоритм #функции


Не понимаю, почему выскакивает ошибка и как с ней справиться. Пример вычисления факториала
6!! = 6*4*2*1 = 48



    function doubleFactorial(n) {
        return (n !== 1) ? n * doubleFactorial(n - 2) : 1;
    }
    console.log(doubleFactorial(6));
    console.log(doubleFactorial(7));



    


Ответы

Ответ 1



function doubleFactorial(n) { return (n > 1) ? n * doubleFactorial(n - 2) : 1; } console.log(doubleFactorial(6)); console.log(doubleFactorial(7));

Короткий синоним для HEAD текущей ветки на origin?

#git



Часто нужно смотреть хеш коммита для своей ветки на удалённой машине.
Например, если я нахожусь на ветке
feature/123/very-long-name-here, мне приходится писать:


$ git rev-parse 'origin/feature/123/very-long-name-here'



А хотелось бы что-то короче, типа:


$ git rev-parse 'origin/CURRENT_HEAD'



Пробовал origin/HEAD и origin/ORIG_HEAD, не
работают:


fatal: ambiguous argument 'origin/HEAD': unknown revision or path not in the working
tree.
Use '--' to separate paths from revisions, like this:
'git  [...] -- [...]'

    


Ответы

Ответ 1



Если хочется увидеть SHA-коммит той ветки в origin, которую track-ает (отслеживает изменения в origin) твоя текущая ветка, то это команда git rev-parse @{upstream} Если требуется получить в консольке название отслеживаемой ветки, то это команда git rev-parse --symbolic-full-name @{upstream}

Целесообразность фабричного метода

#c_sharp #net


Допустим, есть некоторая иерархия классов, где каждый последующий класс наследуется
от предыдущего.

Мне хотелось бы, что бы каждый класс имел свой статический метод Parse, который бы
принимал строку и возвращал построенный объект.

Как я понимаю, переопределить статический метод в классах потомках нельзя, а можно
только через перекрытие с и спользованием new...

Так вот, вот вопрос в том, правильно ли это делать через статический метод или есть
какой-то другой вариант?
    


Ответы

Ответ 1



Попробую ответить, отталкиваясь от термина Фабричный метод, который вы использовали. Предположим, что у вас есть некая сложная иерархия: interface IType; class Type : IType; class SecondType : Type; class ThirdType : IType; Вы ходите иметь возможность делегировать инстанцирование объекта, пользуясь всеми преимуществами полиморфизма, чтобы создать что-то вроде такого класса: class TypeProcessor where T : IType { public void Process(string input) { var someObject = T.Parse(input); Console.WriteLine(this.ProcessInternal(someObject)); } protected string virtual ProcessInternal(T value) { return value.ToString(); } } Такой код не будет работать, потому что static методы не наследуются, да и для такого не предназначены. Зато мы можем сделать прямо так, как предполагалось в этом шаблоне проектирования изначально, а именно - создать абстрактную фабрику (или интерфейс фабрики) и фабрики-наследников для конкретных типов: interface ITypeFactory where T : IType { T Parse(string input); } class TypeFactory : ITypeFactory where T : IType { public virtual Type Parse(string input) { ... } } class SecondTypeFactory : TypeFactory { public override Type Parse(string input) { ... } } class ThirdTypeFactory : ITypeFactory { public ThirdType Parse(string input) { ... } } Соответственно в нашем классе TypeProcessor произойдут изменения: class TypeProcessor where T : IType { private readonly ITypeFactory factory; TypeProcessor(ITypeFactory factory) { this.factory = factory; } public void Process(string input) { var someObject = this.factory.Parse(input); Console.WriteLine(this.ProcessInternal(someObject)); } protected string virtual ProcessInternal(T value) { return value.ToString(); } } Собственно, об этом и говорит паттерн Фабричный метод (можно посмотреть картинку на wiki). Есть Creator для общего типа и ConcreteCreator, который создает объекты конкретного типа. В дополнение приведу статью, где автор рассуждает на тему использования статики в C#.

Task завершается через 15 минут работы

#c_sharp


Написал программу которая должна раз в секунду проверять ping до двух серверов.
Проблема в том, что примерно через 15 минут таски перестают выполняться.
В выводе вижу такое:

Ping: 87.250.250.242 Status: Success Time: 17.10.2019 15:18:51
Ping: 8.8.8.8 Status: Success Time: 17.10.2019 15:18:52
Ping: 87.250.250.242 Status: Success Time: 17.10.2019 15:18:52
Поток 0x65f0 завершился с кодом 0 (0x0).
Поток 0x324 завершился с кодом 0 (0x0).
Поток 0x46c4 завершился с кодом 0 (0x0).
Поток 0x5fac завершился с кодом 0 (0x0).
Поток 0x4b00 завершился с кодом 0 (0x0).


Ну и естественно таски никакие исключения не кидают. Хотя вроде должны работать постоянно.

static void Main(string[] args)
    {            
        Run();            
        Console.ReadKey();
    }

    private static void PingTimeout(string srv)
    {
        Console.WriteLine($"Warning! {srv} server timeout, {DateTime.Now}");
    }
    private static async void Run()
    {
        Task allTasks = null;

        try
        {
            Task t1 = Task.Run(() => CheckConnection("8.8.8.8", 1000));
            Task t2 = Task.Run(() => CheckConnection("87.250.250.242", 1000));
            allTasks = Task.WhenAll(t1, t2);
            await allTasks;
        }
        catch(Exception ex)
        {
            Console.WriteLine($"Critical! {ex.Message}");
            Console.WriteLine("IsFaulted: " + allTasks.IsFaulted);
            foreach (var inx in allTasks.Exception.InnerExceptions)
            {
                Console.WriteLine("Внутреннее исключение: " + inx.Message);
            }
        }

    }

    private static void CheckConnection(string srvAddress, int interval)
    {
        TimerCallback timerCallBack = new TimerCallback(PingServer);
        Timer timer = new Timer(timerCallBack, srvAddress, 0, interval);
    }
    private static void PingServer(object obj)
    {
        MyClass instance = new MyClass();
        instance.myEvent += new EventDelegate(PingTimeout);

        string target = (string)obj;
        Ping ping = new Ping();
        int timeout = 1280;
        string data = "sjfhksjfdkjsdjfkjsdfskjdhfksh";
        byte[] buffer = Encoding.ASCII.GetBytes(data);
        PingOptions options = new PingOptions(128, true);
        PingReply pingReply;
        try
        {
            pingReply = ping.Send(target, timeout, buffer, options);

            Debug.WriteLine($"Ping: {pingReply.Address} Status: {pingReply.Status}
Time: {DateTime.Now}");

            switch (pingReply.Status)
            {
                case IPStatus.Success:
                    //Debug.WriteLine($"success {pingReply.Address}");
                    break;
                case IPStatus.TimedOut:
                    instance.InvokeEvent(target);
                    break;
                default:
                    //Debug.WriteLine($"unknown {pingReply.Address}");
                    break;
            }
        }
        catch(Exception ex)
        {
            Console.WriteLine($"Critical! exception {ex.Message} at {DateTime.Now}");
        }            

        ping.Dispose();
    }

    


Ответы

Ответ 1



В вашем коде таски (которые Task) завершаются почти мгновенно, по возврату из CheckConnection. Через некоторое время вызовы PingServer создают достаточно много новых объектов, чтобы триггернулась сборка мусора. На таймеры у вас есть ссылки только из локальных переменных уже завершенного метода, ссылок из корней нет - и сборщик мусора убивает их как недостижимые. Это типовая ошибка, о ней даже в описании класса Timer упомянуто: As long as you are using a Timer, you must keep a reference to it. As with any managed object, a Timer is subject to garbage collection when there are no references to it. The fact that a Timer is still active does not prevent it from being collected.

Приложение не крашится при установке apk на телефон, но крашится если скачать из GPlay

#c_sharp #android #unity3d


Приложение не крашится при установке apk на телефон, но крашится если скачать из GPlay

Залил приложение в Play Market, скачиваю, и на некоторой части телефонов оно крашится.
Тот же самый apk, залитый вручную на телефон(не важно, adb установка или просто закинуть
апк и установить его) - работает корректно. 

Краш происходит в самом начале загрузки движка.Буквально появляется логотип и сразу краш.

Сам краш расшифровке не поддался, addr2line не работает с 64 битными приложениями,
а крашится именно 64 битное апк. 

10-19 19:53:26.343: W/StaticLayout(1498): maxLineHeight should not be -1.  maxLines:1
lineCount:1
10-19 19:53:26.345: W/ExpandableNotificationRow(1498): setActionsBackground,null
== view,mPublicLayout
10-19 19:53:26.357: E/CRASH(2943): signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault
addr 000000767b481ff0
10-19 19:53:26.358: E/CRASH(2943): Build type 'Release', Scripting Backend 'il2cpp',
CPU 'arm64-v8a'
10-19 19:53:26.358: E/CRASH(2943): Build fingerprint: 'HONOR/LLD-L31/HWLLD-H:8.0.0/HONORLLD-L31/132(C10):user/release-keys'
10-19 19:53:26.358: E/CRASH(2943): pid: 2943, tid: 2972, name: UnityMain  >>> com.FreeBacon.Hau <<<
10-19 19:53:26.358: E/CRASH(2943):     sp   000000767b482020  pc   00000076773acf34
 pstate 0000000020000000
10-19 19:53:26.358: E/CRASH(2943): backtrace:
10-19 19:53:26.360: W/ExpandableNotificationRow(1498): setActionsBackground,null
== view,mPublicLayout
10-19 19:53:26.382: W/StaticLayout(1498): maxLineHeight should not be -1.  maxLines:1
lineCount:1
10-19 19:53:26.386: I/chatty(1498): uid=10027(u0_a27) com.android.systemui identical
5 lines
10-19 19:53:26.386: W/StaticLayout(1498): maxLineHeight should not be -1.  maxLines:1
lineCount:1


Если кто сталкивался с таким поведением, подскажите пожалуйста, в чем разница одного
и того же апк скачанного с Play Market и установленного вручную, и посоветуйте способ
расшифровки крашей с 64 битного апк. Заливал в стор и AppBundle и просто Apk, результат
один, лог выше взят с apk
    


Ответы

Ответ 1



В итоге @M.Green порекомендовал использовать некий улучшенный mLogCat, и действительно, логи стали читаемее! В краше стало фигурировать некое vdso, поиск по которым дал вот этот пост https://forum.unity.com/threads/unity-2019-x-il2cpp-crash-on-android-8.673972/ Вкратце, гугл на андроид 8(возможно и на других версиях, но тут проблема подтверждена), хранит данные приложения после удаления. При повторной загрузке приложения из маркета, он пытается использовать что то от старой версии приложения, и часто они не совместимы. Чинится это отключением резервного копирования данных приложения в настройках самого андроида. Мне лично помогло. Также можно добавить в манифест android: allowBackup = "false";

Работа с именованными объектами

#python #pandas #numpy


Для решения задачи комивояжера использую массивы из библиотеки NumPy:

    mat = np.array([[-1., 10., 25., 25., 10.],
                    [1., -1, 10., 15., 2.],
                    [8., 9., -1., 20., 10.],
                    [14., 10., 24., -1., 15.],
                    [10., 8., 25., 27., -1.]])


Столбцы и строки представляют собой именованные точки (города). Алгоритм работы предполагает
периодическое удаление некоторых строк и столбцов. При этом теряется информация об
оставшихся именованных столбцах и строках.
Приходится параллельно вести два вектора (по столбцам и строкам), к которым применяются
аналогичные операции удаления.

Есть ли возможность использовать преимущества библиотеки NumPy (работа с массивами)
и возможности DataFrame из Pandas по ведению именованных столбцов и строк?
    


Ответы

Ответ 1



Собственно Pandas DataFrame и есть набор именованных Numpy векторов (столбцы таблицы). Кроме этого у DataFrame есть индекс - метка или имя каждой строки. Таким образом Pandas DataFrame обеспечивает удобное индексирование как по строкам так и по столбцам. Большинство алгоритмов и функций умеющих работать с Numpy матрицами могут напрямую работать с Pandas DataFrame. Приходится параллельно вести два вектора (по столбцам и строкам), к которым применяются аналогичные операции удаления. Pandas делает это за вас автоматически. Если вам нужен доступ к меткам / именам строк или столбцов то воспользуйтесь атрибутами: df.index или df.columns соответственно.

Что входит в состав .NET?

#net #clr


Можно ли сказать,что в состав .NET входят CLR и классы(FCL).Или там есть что-то ещё?
    


Ответы

Ответ 1



Нет, в состав .NET на самом деле входит больше, чем только CLR и FCL. .NET как технология включает: Спецификацию Common Language Infrastructure (CLI) ECMA-334 (и аналогичную ISO), которая описывает принципы работы CLR, систему управляемых типов, набор инструкций байткода, формат файлов сборок, структуру стандартных библиотек и др. Спецификации языков C# (ECMA-335) и C++/CLI (ECMA-372) Реализации этих спецификаций в виде платформ (.NET Framework, .NET Core) и компиляторов. Прочее ПО, не имеющее прямого отношения к CLI, но все равно являющееся естественной частью разработки под .NET, например .NET Framework SDK для Visual Studio. .NET Framework как программный продукт включает: Исполняющую среду CLR Библиотеку классов Компиляторы C# и VB.NET Систему сборки MSBuild Набор специфических утилит командной строки, вроде aspnet_regiis.exe Прочие служебные компоненты, например Счетчики производительности Правда, MSBuild и компиляторы языков в состав .NET Framework включены устаревшие, на уровне C# 5.0, и в .NET Core от их включения уже отказались - вместо этого компиляторы Roslyn поставляются с Visual Studio и в составе отдельных NuGet-пакетов. Но все равно, и архитектурно и структурно .NET - больше, чем только CLR и FCL.

Как в SVG сделать так, чтобы при использовании use работали градиенты из defs?

#html5 #svg #svg_animation #svg_спрайт


К примеру у меня есть подготовленный документ с SVG-спрайтами, в котором я объявляю
каждую иконку через . Но когда я использую эти иконки через  у меня не
работают градиенты из , как я понял это из-за #shadow-root. 

Как сделать чтобы они заработали?

Пример кода:




  
    
      
      
    
  

      
    
    
    
    
    
    

    




Ответы

Ответ 1



Первая неточность - не указан второй цвет в градиенте, допустим я выбрал stop-color="gold", вы можете выбрать любой другой цвет Лучше не указывать style="display:none", так как применение и так скрывает содержание SVG до вызова его командой Остальное смотрите в моем коде


Ответ 2



В качестве бонуса несколько примеров анимации градиента В основном применяется анимация атрибута offset
Пример заполнения круга с помощью градиента Вращение градиента

Можно ли создать установщик для python прграммы?

#python


Можно ли сделать готовую программу с установщиком и если можно какие есть инструменты
для создания установщика?
    


Ответы

Ответ 1



Если нужен именно установщик под windows аля setup.exe то сначала pyinstaller для генерации всех нативных dll и exe, а затем nsis для создания установщика. В результате получится setup.exe с вашей программой, который при нужных настройках установит программу в нужный каталог, создаст ключи в реестре, сделает ярлыки, создаст uninstall.exe и много чего еще.

Как получить выбранные данные из v-select?

#vuejs #vuetify


У меня есть такой массив: 

my_arr: [{
  name: "Adam",
  surname: "Brown",
}, {
  name: "Bruce",
  surname: "Lee",
}, {
  name: "Erl",
  surname: "Black",
}];


Использую его в v-select, там отображаются только name:




Как мне обратиться к объекту который был выбран в меню?
 Как дальше работать с выбранными данными? Т.е. если выбрала Adam как получить в
готовом массиве Adam Brown?
    


Ответы

Ответ 1



Как мне обратиться к объекту который был выбран в меню? В примере ниже можно обратиться как this.selected. Либо воспользоваться событием input совместно со свойством return-object для получения массива выбранных объектов. // Отключим ненужные для примера // сообщения в консоли. Vue.config.productionTip = false; Vue.config.devtools = false; const vuetify = new Vuetify(); const app = new Vue({ el: '#app', vuetify, data: { // Модель доступных для выбора элементов. people: [{ name: "Adam", surname: "Brown", }, { name: "Bruce", surname: "Lee", }, { name: "Erl", surname: "Black", }], // Модель выбранных элементов. selected: [], }, methods: { onInput(selected) { console.clear(); selected.forEach(function(item) { console.log({ name: item.name, surname: item.surname }); }) } } }); [v-cloak] { display: none; } #app { max-width: 600px; margin: 2.5rem auto; }
Доступные для выбора Выбранные элементы
{{ selected }}


Свой тип данных с границами в C++

#cpp


Мне нужно создать тип данных Percent, который бы хранил в себе только целые числа
от 0 до 100, и чтобы логика была такая:

Percent a;
a = 101; // В a бы клалось не 101, а 100.
a = -5;  // В a клалось бы не -5, а 0.


И так далее.  Как это можно реализовать?
    


Ответы

Ответ 1



На C++ давно не писал, но видимо вам нужно что-то типа: class Percent { uint8_t value; public: const static int MAX_VALUE = 100; const static int MIN_VALUE = 0; Percent(int v) { if (v > MAX_VALUE) { this->value = MAX_VALUE; } else if (v < MIN_VALUE) { this->value = MIN_VALUE; } else { this->value = v; } } operator int() const { return this->value; } }; Percent p = 128; std::cout << p << std::endl; // Output: // 100 p = -5; std::cout << p << std::endl; // Output: // 0

Ответ 2



Небольшой пример: class Procent { public: ... Procent& operator =(int v) { _v = v >= 100? 100: (v < 0? 0: v); return *this; } ... private: int _v; } Остальное аналогично

Мерцание элемента в SVG-картинке

#css #html5 #svg #css_animation #svg_animation


Внутри SVG-файла есть элемент, например ..., внутри него ещё много
всего.
 Как сделать, чтобы opacity у всего содержимого внутри blink постоянно циклично менялось,
например с 0.5 на 1, и опять на 0.5? 
    


Ответы

Ответ 1



SVG анимация Если нужно анимировать все элементы, которые находятся внутри группы, то можно добавить команду анимации перед закрывающим групповым тегом CSS анимация Обратите внимание на то, что одна и та же css анимация animation: fade 800ms infinite; применена к разным группам с разными условиями. Элементы первой группа мерцают постоянно. Элементы второй группы мерцают при наведении. #blink { animation: fade 800ms infinite; } @keyframes fade { 0% { fill-opacity: 0.5; } 12% { fill-opacity: 1; } 100% { fill-opacity: 0.5; } } #circleBlink:hover { animation: fade 0.5s infinite; } Hover me

Программа для отправки смс-сообщений на java [закрыт]

#java


        
             
                
                    
                        
                            Закрыт. Данный вопрос необходимо конкретизировать. Ответы
на него в данный момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Переформулируйте вопрос,
чтобы он был сосредоточен только на одной проблеме, отредактировав его.
                        
                        Закрыт 4 месяца назад.
                                                                                
           
                
        
Нужно написать программу для отправки смс-сообщений с ПК на мобильный телефон. 
Язык программирования : Java.
Какие библиотки нужно для этого использовать?
И вообще какой принцип работы такого рода программ?
    


Ответы

Ответ 1



Если у вас к ПК не подключено специальных устройств с СИМ-картой, то сами вы никак не отправите, но... вы всегда можете приобрести подобную услугу у некоторых провайдеров. Они как правило предоставляют web api: посылаете из программы запрос к специальному сайту, а сервер, обрабатывающий запрос имеет подключенную железку, которая умеет обрабатывать СМСки. Вид API может отличаться и описан в документации провайдера услуги.

Ответ 2



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

Ответ 3



Для отправки SMS используются специальные сервисы по типу: smsc.ru mainsms.ru/ На сайтах подробно описана схема интеграции. Обычно это сводится к вызову API методов через HTTP (REST). Или же, если у сервиса имеется специальное Java API, то достаточно добавить предоставляемую сервисом библиотеку к проекту и дергать нужные методы.

Ответ 4



В данный момент занят такое же проблемой, если есть GSM модем и работать будет на Линуксе есть Sms Server tools 3, очень хорошая программа, отправляет и принимает Sms, на окна тоже можно, а если только на Java есть библиотека для работы с com портом Jssc.

Отобразить данные из двух таблиц

#php #sql


Есть две таблицы sql:
Одна с заказами, а  другая со статусами заказов:


первая таблица:


|id|id_status|
|1 |1        |
|2 |2        |
|3 |3        |



Вторая таблица:


 |id_status|status  |
 |1        |Ожидание| 
 |1        |Ожидание| 
 |2        |Готов   | 
 |2        |Готов   | 
 |3        |Отменен |


Я делаю это так:

    $connection = mysqli_connect('localhost', 'login', 'password', 'namedb');
    $sqldata = mysqli_query($connection, "SELECT * FROM table1 INNER JOIN table2
ON id=1 ");
    $results = array();
    while ($result = mysqli_fetch_array($sqldata)) {
    echo $result['status']; } 


Я хочу получить имя статуса Ожидание если в первой таблице id = 1, но вместо корректного
результата у меня фигня выходит(
    


Ответы

Ответ 1



Поменяйте запрос таким образом, если вы хотите только для id=1 SELECT `table2`.`status` as `status` FROM `table1` LEFT JOIN `table2` using(`id_status`) WHERE `table1.id` = 1 или так, если для всех SELECT `table1`.`id` as `id`, `table2`.`status` as `status` FROM `table1` LEFT JOIN `table2` using(`id_status`)

Ответ 2



Неверный синтаксис запроса SELECT table1.id, table2.status FROM table1 INNER JOIN table2 ON table1.id_status=table2.id_status

Умножить все четные столбцы матрицы А на вектор x в обратном порядке

#python #numpy


Дан вектор x и матрица А. Надо умножить все четные столбцы матрицы А на вектор x
в обратном порядке. Результат записать в новую матрицу и 
найти сумму ее элементечалов. 

import numpy as np
A = np.array([ [2, 1], [2, 2], [4, 3] ])
x = np.array([ [2], [3] ])
b = A.dot(x)
print(b)


Этот код умножает матрицу на вектор. Как переделать код, чтобы соответствовал заданию?
    


Ответы

Ответ 1



Сделаем маску на четные индексы и умножим их на развернутый в обратном порядке вектор m = np.arange(0,A.shape[0],2) A[m].dot(x[::-1]) array([[ 8], [18]])

Ответ 2



Можно воспользоваться срезами: A[::2] @ x[::-1] Результат: array([[ 8], [18]]) Сумма элементов: (A[::2] @ x[::-1]).sum() # 26

Не выводить повторяющиеся значения [MySQL]

#php #mysql


В базе данных есть 5 строк, с полем description(описание). В каждой из строк в поле
description есть хэштег "#istanbul".

В 1-ой строчке - "#istanbul",
Во 2-ой строчке - "#IstanbulNight",
В 3-ей строчке - "#Istanbul",
В 4-ой строчке - "Hello and #WelcomeToIstanbul",
В 5-ой строчке - "My first travel to #Istanbul",

Мне необходимо вывести все строки, у которых в поле description есть в хэштегэ слово
"istanbul". Одинаковые значение не должны повторяться, например:

Должны выводиться только 1, 2, 4 строка, так как 3 и 5 идентичны 1-ой не учитывая
регистр. Необходимо убрать только те сроки, в которых один единственный хэштег "#istanbul"

Мой код:

$GetQUERY = "#istanbul";

SELECT * FROM `".PREFIX."_photos` WHERE description LIKE'%{$GetQUERY}%' ORDER by
`uploaded_date` ASC


Хотел использовать SELECT DISTINCT. Не помогает. Подскажите как решить данную проблему

P.S. я новичок, строго не судить
    


Ответы

Ответ 1



Вот так отберутся строки, в которых есть тег, отсутствующий в предыдущих $arr = [ "#istanbul", "#IstanbulNight", "#Istanbul", "Hello and #WelcomeToIstanbul. You are in #istanbul now", "My first travel to #Istanbul",]; // сюда собираем все найденные теги $prev = []; $r = []; foreach($arr as $x) { if(preg_match_all('~#\w+~', $x, $match)) { // если надо не зависеть от регистра $match[0] = array_map('strtolower', $match[0]); // если все уже были, пойдем дальше if( ! ($d = array_diff($match[0], $prev))) { continue; } // добавим новые, обнаруженные в строке array_push($prev, ...$d); } $r[] = $x; } print_r($r); // [ '#istanbul', '#IstanbulNight', 'Hello and #WelcomeToIstanbul. You are in #istanbul now']

Ответ 2



$query = "SELECT * FROM `".PREFIX."_photos` WHERE description LIKE'%{$GetQUERY}%' ORDER by `uploaded_date` ASC"; $result = $conn1->query($query); while($row = mysqli_fetch_assoc($result)) { $data[]=$row; } $data=array("0"=>"#IstanbulNight", "1"=>"#Istanbul", "2"=>"Hello and #WelcomeToIstanbul", "3"=>"My first travel to #Istanbul", "4"=>"My first travel to #Istanbul, and #GotoIstanbul", "5"=>"#Istanbul"); foreach ($data as $key => $value) { # code... $pos=strpos($value,"#Ist"); if($pos===false){ $big[]=$value; }else{ $nig[]=$value; } } print_r($nig); $result = array_unique($nig); print_r($result);

Как составить список уникальных числовых комбинаций разделённых пробелами

#python #python_3x #список #комбинаторика


Мне нужно составить список уникальных числовых комбинаций которые нужно будет разделить
пробелами через каждый третий символ.
Я нашел такой вариант:

test = list(itertools.combinations('0123456789', 9))


Получается список кортежей: 

[('0', '1', '2', '3', '4', '5', '6', '7', '8'), ('0', '1', '2', '3', '4', '5', '6',
'7', '9') ...


Ума не приложу как его можно превратить в такой список: 

['012 345 678', '012 345 679', '012 345 689', ...


Подскажите пожалуйста какой нибудь способ решить эту задачку?
    


Ответы

Ответ 1



import itertools a = list(itertools.combinations('0123456789', 9)) b =[[''.join(y[i:i+3]) for i in range(0, len(y), 3)] for y in a] res = [' '.join(x) for x in b] print(res) ['012 345 678', '012 345 679', '012 345 689', '012 345 789', '012 346 789', '012 356 789', '012 456 789', '013 456 789', '023 456 789', '123 456 789']

Пирамидальная сортировка на C++

#алгоритм #сортировка #cpp


Приведите пример пирамидальной сортировки (сортировки кучи) на C++.    


Ответы

Ответ 1



Сортировка "кучи" на C++. #include template inline void swap( T & arg1, T & arg2) { T temp = arg1; arg1 = arg2; arg2 = temp; }; template void shiftup(T * a, int size, int indexToShift) { int i = indexToShift; while(i > 1) { if(a[i] < a[i/2]) { swap(a[i], a[i/2]); i /= 2; } else break; } } template void shiftdown(T * a, int size, int indexToShift) { int i = indexToShift; int min; while ( i < size) { if ( i*2 <= size) { if (i*2+1 <= size) { min = a[i*2] < a[i*2+1] ? i*2 : i*2+1; } else min = i*2; if (a[i] > a[min]) { swap(a[i], a[min]); i = min; } else break; } else break; } } template void heap_sort( T * a, int size) { for (int i = 1; i < size; ++i) shiftup(a, size, i); for (int i = size-1; i > 1; i--) { swap(a[1], a[i]); shiftdown(a, i-1, 1); } }

Ответ 2



В С++ уже есть функции для работы с кучей - std::make_heap и std::sort_heap, по этому сортировка кучей реализуется тривиально: template> void heap_sort(RandomAccessIter first, RandomAccessIter last, Compare cmp = Compare{}) { std::make_heap(first, last, cmp); std::sort_heap(first, last, cmp); }

Ошибка при работе с указателями

#c


#include  
#include  
#include 

void main() 
{ 
    int a, *p;

    scanf("%i", a);

    *p = &a;

    printf("%i", p);

    _getch(); 
}
    


Ответы

Ответ 1



#include #include #include void main() { int a = 0; int *p = NULL; scanf("%i", &a); p = &a; printf("%p\n", p); printf("%i\n", *p); _getch(); }

Ответ 2



В чистом виде пример выглядит так: #include void main() { int a, *p; scanf("%i", a); *p = &a; printf("%i", p); } Если собрать его с помощью gcc: $ gcc file.c -o file то компилятор выведет сообщение об предупреждениях: file.c:8: warning: format ‘%i’ expects type ‘int *’, but argument 2 has type ‘int’ file.c:10: warning: assignment makes integer from pointer without a cast file.c:12: warning: format ‘%i’ expects type ‘int’, but argument 2 has type ‘int *’ В них все и дело. Во первых, функции scanf и printf ожидают другой формат данных, отличный от того, который им подается. Во-вторых, адрес переменной присваивается не указателю, а целому, на которое указатель указывает.

Android и NIST Internet Time Servers

#android #java #udp


Подскажите кто знает в чем может быть проблема?
Есть код: 
InetAddress address1 = InetAddress.getByName("nist.netservicesgroup.com");
int server_port = 123;
socket = new DatagramSocket();
byte[] buf = new byte[1024];
socket.setSoTimeout(10000);
DatagramPacket packet = new DatagramPacket(buf, buf.length, address1, server_port);
socket.send(packet);

DatagramPacket packet2 = new DatagramPacket(buf, buf.length);
socket.receive(packet2);

Отправляет на сервер nist.netservicesgroup.com порт 123 запрос. После чего ждет ответ
10 сек. 
Стоит permission android.permission.INTERNET.
Ответ не приходит. Ставил разные порты (13, 37 и 123). Менял разные адреса (список
тут http://tf.nist.gov/tf-cgi/servers.cgi)
Куда, что засунуть и откуда что высунуть чтобы заработало?
Заранее спасибо за полезные ответы.     


Ответы

Ответ 1



К сожалению, я не сталкивался с сокетами в андроиде и не работал с NIST. Из своего опыта с WinSock и сокетами на юникс-системах могу предложить использовать пятизначные порты, а также попробуйте настроить работу через стандартные способы, например через протокол tcp (т.к если назначения не существует, то сообщение просто не уйдет). Также проверьте доступность портов с другой стороны. У меня часто бывало, что сервер был выключен или работал на другом сокете. Незаменимым помощником будет браузер+ping+telnet (последнее я не использовал, но в различной литературе упоминается постоянно).

Ответ 2



вдруг кому пригодится, рабочий код: InetAddress address = InetAddress.getByName("nist.netservicesgroup.com"); int server_port = 37; Socket conn = new Socket(address1, server_port); InputStream in = conn.getInputStream();

Хороший пример GWT UiBinder.. где его найти?

#gwt #java


Ссылочку пожалуйста и пример кода. Спасибо.    


Ответы

Ответ 1



На официальном сайте GWT, там вообще можно найти всю необходимую документацию и уроки с примерами. Конкретно по UIBinder вот урок с примерами: http://code.google.com/intl/ru-RU/webtoolkit/doc/latest/DevGuideUiBinder.html

Ответ 2



Неплохой пример использования UIBinder для MVP-подхода.

IPad и виртуальная машина Java

#ipad #java #ios #jvm


Кто-нибудь слышал об Java-машине на IPad'е? А то уж очень хочется java-код писать
под IPad, а не на Objective C.    


Ответы

Ответ 1



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

Ответ 2



The iPad Guide Does the iPad support Java? No. iPhone OS 3.2 will not support Java. The iPhone does not support Java. Steve Jobs has been quoted as saying "Java's not worth building in. Nobody uses Java anymore. It's this big heavyweight ball and chain." Java fans should not expect Apple to reverse this long-standing decision on the iPad.

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

#c #массивы #память


Я работаю с большим двумерным массивом.
В случае, когда он размером 30 x 200, все считается. При больших объемах программа
вылетает... Мне посоветовали использовать memset(), но что-то не особо помогает...
Может быть у вас есть какие идеи?
#include 
#include 
#include 
#include 

double **B;

int main (int argc, char *argv[])
{ 
    int N, n_A;

    N = 32;
    n_A = 350; /* если сделать n_A = 200, то все работает */
    B = (double **)malloc(N * sizeof(double *));

    for(i = 0; i < N; i++)
    {
        B[i] = (double *)malloc(n_A * sizeof(double));
        memset(B[i], 0, n_A * sizeof(double));
    }

    free(B);

    return 0;
}
    


Ответы

Ответ 1



В целом код правильный, но нужно добавить проверку при выделении памяти: это необходимо, потому что памяти может просто не хватать, и в этом случае программа будет падать, потому что будет происходить запись в несуществующую память. То есть всякий раз, когда происходит вызов malloc, необходимо проверить, что возвращаемое значение не равно NULL. B = (double **)malloc(N * sizeof(double *)); /* Проверить, что память выделена */ if (B != NULL) { for(i = 0; i < N; i++) { B[i] = (double *)malloc(n_A * sizeof(double)); /* Проверить, что память выделена */ if (B[i] != NULL) { memset(B[i], 0, n_A * sizeof(double)); free(B[i]); } } free(B); } Кроме того, нужно не забывать освобождать память, выделяемую malloc внутри цикла, иначе будут утечки.

Ответ 2



Вот это все можно сделать одной строкой double * B; B = (double *) calloc (N * n_A, sizeof(double)); free (B); Вместо вызова кучи функций вы вызываете одну, которая сразу выделяет память под весь массив данных и обнуляет ее. Доступ к данным осуществляется по формуле double a; a = *(B + i * n_A + j); где i - номер строки, j - номер столбца

Ответ 3



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

Как удалить логи SQL Server 2008?

#sql


До 2008 версии у SQL Server была команда Backup database [...] with truncate only.
Но SQL Server 2008 пишет, что эта опция более не поддерживается.
Хорошо. При восстановлении пытаюсь выбрать не все файлы для восстановления, а только
некоторые. Но файл лога, который можно было бы исключить из списка восстанавливаемых
файлов, в списке файлов для восстановления вообще не фигурирует.
Хорошо. При создании резервной копии делаю бэкап не всей базы, а только указанных
файлов, логи пропускаю. Результат: базу из полученного бэкапа не восстановить.
Ладно. Пытаюсь тупо удалить лог. База перестаёт работать.
Ладно. Заменяю файл лога на пустой файл. База перестаёт работать.
Ладно. В настройках базы данных пытаюсь ограничить размер лога. Результат: как только
лог достигает указанного размера, база перестаёт обрабатывать запросы на изменение данных.
В итоге что база, что бэкапы её весят гораздо больше, чем могли бы; нам эти логи
не нужны. Я понимаю, что они нужны самому SQL Server'у для поддержки транзакционности,
но зачем хранить все логи всех операций?
Я бы отказался от SQL Server 2008 и написал бы свой механизм для работы с FileStream
(других возможностей этой версии мы не используем), но начальство не велит.    


Ответы

Ответ 1



Для SQL Server до 2008 версии: USE ИмяБазы BACKUP LOG ИмяБазы WITH TRUNCATE_ONLY DBCC SHRINKFILE( ИмяФайлаЛога, ЖелаемыйРазмер ) С SQL Server 2008 этот метод не работает, поэтому следует использоват другую процедуру: USE ИмяБазы ALTER DATABASE ИмяБазы SET RECOVERY SIMPLE DBCC SHRINKFILE (ИмяФайлаЛога, ЖелаемыйРазмер); ALTER DATABASE ИмяБазы SET RECOVERY FULL

Ответ 2



Попробуйте сначала так BACKUP LOG my_base1 WITH TRUNCATE_ONLY а потом так DBCC SHRINKDATABASE (my_base1,TRUNCATEONLY) но не уверен, с 2008 не работал.

Как программно соединиться, разъединиться через PPPoE (ADSL)?

#adsl #pppoe #c_sharp


Люди, помогите программно подключиться (на C# желательно, но можно и не на нем) к
интернету по PPPoE (ADSL у меня), шарил по нэту везде либо на мсдн, где нет примеров,
либо dotras.codeplex.com (там VPN или только создание подключения - так и не понял),
дайте, пожалуйста хоть какой-нибудь работающий пример, замучался уже...    


Ответы

Ответ 1



На C# в Windows вот так в общем: соединение: System.Diagnostics.Process.Start("rasdial.exe", "название_соединения логин пароль"); разъединение: System.Diagnostics.Process.Start("rasdial.exe", "название_соединения /DISCONNECT");

Ответ 2



DotRas - это лучшее, что есть для C# для работы с PPPoE. Ссылки по теме: PPPOE Dialer с форума DotRAS Starting a RAS Connection с MSDN (WinCE) Введение в RAS c RSDN

Ответ 3



Набрать с DotRas не проблема. Набирает. Вот только почему-то после таймаута разрывает соединение... Пример того как набрать: RasPhoneBook CurrentUserPhoneBook; RasDialer Dialer = new RasDialer(); Init() { CurrentUserPhoneBook = new RasPhoneBook(); CurrentUserPhoneBook.Open(true); foreach (RasEntry re in CurrentUserPhoneBook.Entries) { if (re.Device.DeviceType.Equals(RasDeviceType.PPPoE, StringComparison.InvariantCultureIgnoreCase)) { //сохрани в лист например все пппое записи myPPPoEConnectionList.Add(re); } } } private void Dial(RasEntry re) { // This button will be used to dial the connection. this.Dialer.EntryName = re.Name; this.Dialer.PhoneBookPath = CurrentUserPhoneBook.Path; this.Dialer.Timeout = 20000; this.Dialer.AllowUseStoredCredentials = true; try { // NOTE: The entry MUST be in the phone book before the connection can be dialed. // Begin dialing the connection; this will raise events from the dialer instance. this.pppoeConnectionHandle = this.Dialer.DialAsync(); } catch (Exception ex) { //LogWriteLine(ex.ToString()); } }

Ответ 4



Копайте в сторону RAS. Вот, например, какое-то обсуждение: NET RAS/RASDIAL Structures

Ответ 5



Столкнулся с этой проблемой. Пришлось написать утилиту контроля. Подходит для любого языка. При запуске с параметрами передает в окно, с указанным handle состояние подключения (SendMessage(Hwnd,WM_MBUTTONDOWN,MK_MBUTTON,sValue). А через буфер обмена и IP адрес. Могу поделиться - multisoft@rambler.ru

Принцип и работа CSRF в Django

#django


Люди добрые, объясните на пальцах, каким образом работает и как использовать самому CSRF?
Я думал, что подключил middleware, добавил {% csrf_token %} в каждую post-форму +
подвесил context_instance=RequestContext(request) и все, но это счастье выдает 403
- CSRF verification failed. Уже голову сам себе задурил этой ерундистикой, объясните
мне как нубу, что как и куда :)    


Ответы

Ответ 1



Вроде бы все правильно. А попробуй включить не глобально, а оберни нужную вьюху в декоратор django.views.decorators.csrf.csrf_protect Ну и протестируй.

Ответ 2



Иногда, когда надо просто сделать и думать особо не хочется, а тем более копаться, я делаю просто, как в документации. Конкретно у меня так, во вьюхе: from django.core.context_processors import csrf Затем в самой вьюхе, перед тем как передается словарь в обработчик (у меня это делается через декоратор @render_to('template.html'), делаем так: ctx = { 'a': a, 'b': b, } ctx.update(csrf(request)) return ctx Тем самым дополняем наш словарь ctx, чем то, что нам не особо нужно знать. После этого в форму в шаблоне пишем:
{% csrf_token %} ....
Ну и если любопытно, то смотрим исходник, что за зверь это токой и что реально в html-коде страницы сгенерировалось.

Скриншот окна браузера

#php #imagemagick #javascript #perl


Можно использовать:
php, perl, imagemagick, gd, shell
Нельзя использовать:
Сторонние библиотеки и программы. Нужна именно суть реализации подобного.
Задача:
Сделать скриншот урла по нажатию на кнопку в браузере.
Пример:



Как обустроить frontend я знаю и с этим проблем никаких нет. Вопрос как можно указанными
средствами сделать скриншот с урла.
Идеи вроде поставить vm не подходят, нужно делать все моментально, запрос ушел -
ответ пришел, без особых задержек.
Идеи гугла:

Через shell, используя firefox

bash:
firefox URL
scrot -d 5 OUT.png

Недостатки: если на сервере нет x-ов или прав у юзера нет, то все обломается

Через IE COM

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


Ответы

Ответ 1



Не пойму я, как это вы хотите обойтись без «сторонних библиотек и программ» — самому полностью писать рендерную машину? Но раз ImageMagick вам не сторонний, то полагаю, и webkit-qt тоже сойдет :) Если все-таки есть иксы и можно использовать браузер, то лучше коннектиться к файрфоксу через MozRepl. Если хочется обойтись без иксов (точнее, без рисования на экране), то можно задействовать xvfb или vncserver. Если хочется обойтись без целого браузера, то можно брать какой-нибудь headless движок: phantomjs, watin, htmlunit Вот вам пример для ориентировки: CutyCapt. Удачи.

Как получить значение opacity?

#javascript


В css задано свойство opacity:
#something
{
    opacity: .5;
}

HTML:


Как мне получить значение этого свойства в Javasciprt? Нужен точный ответ того, кто
точно знает.    


Ответы

Ответ 1



function getStyle(el,styleProp) { var x = document.getElementById(el); if (x.currentStyle) var y = x.currentStyle[styleProp]; else if (window.getComputedStyle) var y = document.defaultView.getComputedStyle(x,null).getPropertyValue(styleProp); return y; } alert(getStyle("something", "opacity"));

Ответ 2



Давайте заменим слово f**k на di document.getElementById('di').style.opacity

Ответ 3



$("#something").css("opacity"); Если Вам интересно посмотреть на наиболее полный фрагмент кода, то вот так:

Ответ 4



$(document.body).css("opacity"); Используется библиотека jQuery. Постарайтесь использовать разметку и не использовать неформальную лексику. О том, как использовать разметку здесь.

Загрузка файлов через админку

#django


Добрый день, имеется модель вида
class Image(models.Model):
    image = models.ImageField(..)
    info = models.TextField(..)

т.е. обычное изображение с каким-то описанием. Заливка производится через админку.
Заливать поштучно - не удобно. Можно ли как-то запилить модель и заливать через админку
сразу по несколько изображений, на примере инлайнов? Желательно без подключения сторонних
js-библиотек :)    


Ответы

Ответ 1



Ну сделайте еще одну модель, типа ImageSet, в Image добавьте ForeignKey на неё, и подключив Inline, - можете заливать сразу кучу картинок.

Ответ 2



Я думаю что лучше всего использовать все-таки библиотеки, т.к они написаны хорошо и имеют хорошее время выполнения! Вот что вам понадобится jQuery Multiple File Upload Plugin v1.31 тута (сам плагин) Query Form Plugin v2.18 тута (Плагин для ajax работы с формами.) jQuery BlockUI Plugin v2.14 тута (для ошибок) ну JQuery найдете сами)) Апишки довольно простые, написать не сложно) Как и что делать дальше можно прочитать вот тута

Ответ 3



Вот в этой книге "Django Разработка веб-приложений на Python", в главе - создание галереи, там подробно всё описано и там как рас применяется метод загрузки одновременно нескольких картинок. Качайте книгу и за 10 минут разберётесь с первоисточника.

Получить ID ресурса по имени

#android #java


Можно ли как-то получить ID ресурса из Java-кода, если известно только его имя (имя
файла картинки)? То есть получить доступ к ресурсу, не обращаясь к R классу (R.drawable.filename).    


Ответы

Ответ 1



В классе Resources есть метод public int getIdentifier (String name, String defType, String defPackage) Используется так: fragment.getResources().getIdentifier(filename, "drawable", "my.project.package");

Ответ 2



Это возможно, используя reflection. Я делал так: R.drawable.class.getField("name_of_the_resource").getInt(getResources())

Ответ 3



Насколько я знаю, нет. Все ресурсы должны быть обязательно определены в R классе.

Отправка почтовго сообщения из кода

#golang #sendmail


Может кто знает, как отправить сообщение из кода в Go?    


Ответы

Ответ 1



Примерно так package main import ( "log" "smtp" ) func main() { auth := smtp.PlainAuth("", "some@ya.ru", "password", "smtp.yandex.ru") err := smtp.SendMail("smtp.yandex.ru:25", auth, "from@ya.ru", []string{"to@ya.ru"}, []byte("Текст письма.")) if err != nil { log.Fatal(err) } } Еще примеры здесь: SendingMail.

Сайт Alexa.com

#seo


Собственно занимаясь вопросом, как двигать сайт, обнаружил, что многие сервисы проверяют
как обычно: PR и тИЦ, а так же количество ссылок с Alexa.com. Alexa.com - что это такое,
с чем это едят и есть ли смысл заморачиваться? В планах на будущие посещения из-за
бугра тоже желательны. 
UPD: Просьба писать по делу)    


Ответы

Ответ 1



Alexa собирает данные о посещениях от пользователей, которые установили Alexa Toolbar и формирует статистику. Соответственно на основе переходов между сайтами может накапливать информацию о ссылках. Что касается ссылок, то учитывая, что данные фиксируются только при переходе пользователя, реальной картины ссылочной массы от Alexa получить невозможно. В статистику наверняка не будут попадать ссылки Sape и подобные по одной простой причине — посетители по ним не ходят. есть ли смысл замарачиваться? У Вас стоит Alexa Toolbar? У меня нет. И я не знаю знакомых, кто бы им пользовался. В Рунете, IMHO, Alexa Toolbar не популярен, а значит и смысла нет заморачиваться (морока — разг. утомительная, неприятная работа, суета).

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

#opengl


Есть такая неплохая функция - noise. Но она по непонятным причинам не работает. Может
кому-нибудь известны и другие способы генерации случайных значений?     


Ответы

Ответ 1



Есть четыре шумовые функции, noise1, noise2, noise3 и noise4. Но, они не всегда поддерживаются. По этой причине, обычно используют шумовую текстуру, заранее заготовленную.

Задание пользовательского вида аудио плееру из HTML 5

#html5 #css


Есть ли возможность задавать стили (CSS) аудио плееру HTML5, вручную? А то как-то
не очень вписывается стиль плеера в стиль сайта.    


Ответы

Ответ 1



Внешний вид зависит от браузера. Сейчас нет способа использовать CSS. Но у тэга есть атрибут controls который нужно опустить и далее через JavaScript делать кастомизацию. Вообщем, вот ссылка как пример(отображается два плеера, один по-умолчанию, другой измененный). И ссылка, как автор это сделал.

Подменить функцию Send() своей

#delphi


Требуется вести лог исходящих от программы-клиента пакетов.
Внедряю свою dll в процесс программы-клиента. Адрес оригинальной функции Send в памяти
нахожу (GetModuleHandle->GetProcAddress).
Как можно поставить хук на стандартную функцию Send из Winsock/подменить на свою,
с последующим вызовом оригинальной?
Очень хотелось бы примеры(
Гуглил много и упорно, ничего подходящего не нашёл.
Предпочтительнее всего в моём случае сплайсинг.
Библиотеку advApiHook от MS-REM не предлагать, она сильно устарела и полна глюков.    


Ответы

Ответ 1



Тут описано подробно. Здравствуй читатель. Сегодня я расскажу довольно таки эффективную методику перехвата API функций. Не следует думать, что если мы хотим перехватить API функции, то мы пишем либо троян, вирус и ещё какую-нибудь заразу, с помощью перехвата API функций осуществляются многие защитные механизмы, перехват API функций это довольно-таки нужная и полезная вещь. Для прочтения данной статьи с максимальной пользой обязательны, нужны, как минимум, начальные знания низкоуровневого программирования и хотя бы какие-нибудь знания архитектуры работы Windows. Итак, начнём.    В этой статье я расскажу наиболее действенную методику перехвата API функций — это сплайсинг. Сплайсинг это подмена кода функции. Конечно, есть другой метод перехвата это редактирование таблицы импорта приложения, редактирование таблицы экспорта. Рассказывать буду по порядку.    Когда вы пишете в своём приложении так Function Func1(param:type):restype;stdcall;external ‘libname.dll’; Вы импортируете функцию статически. Адрес функции прописывается в таблице импорта вашего приложения (допустим, что адрес нашей функции $7BC56010). адрес значение …… $00405F56 7BC56010 …… А при вызове функции происходит так Push … push … call dword ptr [$00405F56] Следовательно, для перехвата функции нам надо только подменить значение по адресу $00405F56 на своё, а для вызова оригинальной функции получать адрес функции через GetProcAddress. Но приложение может также получить адрес функции через GetProcAddress и вызывать перехватываемую функцию минуя, перехватчик. Данный метод бесперспективен.    Идём дальше. Что такое сплайсинг? Наша функция находится по адресу $7C80B529 и допустим, что там такой код 7C80B529 8BFF mov edi, edi 7C80B52B 55 push ebp 7C80B52C 8BEC mov ebp, esp 7C80B52E 837D 08 00 cmp dword ptr ss:[ebp+8], 0 Для перехвата функции от нас требуется только переписать начальный код функции, так чтобы он передавал управление нашему обработчику. Для передачи управления нашему обработчику достаточно всего лишь одной инструкции jmp на абсолютный адрес, на адрес нашего обработчика . Эта инструкция займёт всего лишь 5 байт – сам опкод этой инструкции ($E9) и значение для прыжка. Это значение вычисляется так v=0-(s-d) s - Смещение следующей команды d - Требуемый адрес для jmp, т.е. адрес обработчика Если немного переделать эту формулу, то она будет выглядеть так v=d-FunctionAddress-5 Теперь при каждом вызове целевой функции, всегда будет передаваться управление нашему обработчику. А как теперь вызвать оригинальную функцию? При установке перехвата нам надо сохранять первые 5 байт функции. Для вызова оригинала надо восстанавливать начало функции и вызывать ее, потом снова устанавливать перехват. Объявим структуру в которой будем сохранять первые 5 байт функции: PFunctionRestoreData = ^ TFunctionRestoreData; TFunctionRestoreData = packed record Address:Pointer; val1:Byte; val2:DWORD; end; Поле Address фактически в этой структуре не нужен (он просто не к чему), поле нужно только для того чтобы было удобнее снимать перехват. Назовём эту структуру «мост» к старой функции.    Теперь напишем функцию, которая будет устанавливать перехват: function SetCodeHook(ProcAddress, NewProcAddress: pointer; RestoreDATA:PFunctionRestoreData):boolean; var OldProtect, JMPValue:DWORD; begin Result:=False; if not VirtualProtect(ProcAddress,5,PAGE_EXECUTE_READWRITE,OldProtect) then exit; JMPValue := DWORD (NewProcAddress) - DWORD (ProcAddress) - 5; RestoreDATA^.val1:= Byte(ProcAddress^); RestoreDATA^.val2:= DWORD(Pointer(DWORD(ProcAddress)+1)^); RestoreDATA^.Address:=ProcAddress; byte(ProcAddress^):=$E9; DWORD(Pointer(DWORD(ProcAddress)+1)^):=JMPValue; Result:=VirtualProtect(ProcAddress,5,OldProtect,OldProtect); end; Мы сначала устанавливает атрибуты доступа к коду функции, так чтобы можно было его переписывать. Потом вычисляем значение для прыжка. Сначала сохраняем начало функции в запись, потом переписываем начало функции. В конце устанавливаем старые атрибуты доступа.    Теперь напишем функцию, которая будет снимать перехват: function UnHookCodeHook(RestoreDATA:PFunctionRestoreData):Boolean; var ProcAddress:Pointer; OldProtect,JMPValue:DWORD; begin Result:=False; ProcAddress:=RestoreDATA^.Address; if not VirtualProtect(ProcAddress,5,PAGE_EXECUTE_READWRITE,OldProtect) then exit; Byte(ProcAddress^):=RestoreDATA^.val1; DWORD(Pointer(DWORD(ProcAddress)+1)^):=RestoreDATA^.val2; Result:=VirtualProtect(ProcAddress,5,OldProtect,OldProtect); end; Я думаю, что здесь всё понятно — просто восстанавливаем начало перехватываемой функции. Адрес перехватываемой функции берём из структуры указатель, на которую передаётся функции в качестве единственного параметра.    Теперь напишем функцию, которая будет устанавливать перехват по имени функции. function SetProcedureHook(ModuleHandle: HMODULE; ProcedureName : PChar; NewProcedureAddress :Pointer; RestoreDATA : PFunctionRestoreData) :Boolean; var ProcAddress:Pointer; begin ProcAddress:=GetProcAddress(ModuleHandle,ProcedureName); Result:=SetCodeHook(ProcAddress,NewProcedureAddress,RestoreDATA); end;    Едем далее. Описанные выше функции могут перехватывать функции только в текущем процессе. А как нам перехватывать функции в других процессах? Наиболее простой метод это засунуть перехватчик функции в DLL и в коде библиотечной функции устанавливать перехват, если DLL загружается в процесс и снимать перехват, если она выгружается. Тут ещё одна проблема: как заставить другой процесс загрузить нашу DLL. Наиболее простое решение это создание удалённых потоков. Теперь всё по порядку.    Удалённый поток создаётся функцией CreateRemoteThread. HANDLE CreateRemoteThread( HANDLE hProcess, // хендл процесса в котором создаётся поток LPSECURITY_ATTRIBUTES lpThreadAttributes,//атрибуты безопасности DWORD dwStackSize, //размер стека LPTHREAD_START_ROUTINE lpStartAddress,//адрес функции потока LPVOID lpParameter, // параметр для функции DWORD dwCreationFlags, // флаги создания LPDWORD lpThreadId // указатель на переменную, в которой будет сохранён ID потока ); Функция потока должна иметь следующие атрибуты DWORD WINAPI ThreadFunc(PVOID pvPararn) У функции только один параметр –это обычный указатель. Теперь проанализируем ситуацию… Думаем…Шевелим мозгами…Функция LoadLibraryA имеет такие же атрибуты. Она принимает указатель на первый символ имени файла DLL (строка должна кончаться символом #0). Следовательно, функция LoadLibraryA полностью подходит для того, что бы она могла выступать в качестве функции потока. Так как она принимает указатель на строку в своём процессе, нам надо будет записать в память чужого процесса нашу строку и именем файла DLL. Это делается функцией WriteProcessMemory. Вот её описание BOOL WriteProcessMemory( HANDLE hProcess, // хендл процесса LPVOID lpBaseAddress,// адрес по которому надо писать LPVOID lpBuffer, // указатель на буфер DWORD nSize, // количество байт для записи LPDWORD lpNumberOfBytesWritten //количество реально записанных байт ); Адрес функции LoadLibraryA мы получаем с помощью функции GetProcAddress так библиотеки kernel32.dll и ntdll.dll грузятся во все процессы всегда по одним и тем же адресам, следовательно, адрес, полученный в адресном пространстве нашего процесса, будет действителен и адресном пространстве любого другого процесса. Теперь напишем функцию, которая загружает вашу DLL в адресное пространство чужого процесса. function LoadLibrary_Ex(ProcessID:DWORD;LibName:PChar):boolean; var pLL,pDLLPath:Pointer; hProcess,hThr:THandle; LibPathLen,_WR,ThrID:DWORD; begin Result:=False; LibPathLen:=Length(string(LibName)); hProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,ProcessID); if hProcess=0 then exit; pDLLPath:=VirtualAllocEx(hProcess,0,LibPathLen+1,MEM_COMMIT,PAGE_READWRITE); if DWORD(pDLLPath)=0 then exit; pLL:=GetProcAddress(GetModuleHandle(kernel32),'LoadLibraryA'); WriteProcessMemory(hProcess,pDLLPath,LibName,LibPathLen+1,_WR); hThr:=CreateRemoteThread(hProcess,0,0,pLL,pDLLPath,0,ThrID); if hThr=0 then exit; Result:=CloseHandle(hProcess); end; Таким образом, мы загрузили свою DLL в чужой процесс. Вообще, внедрение своего кода в чужие процессы это совсем другая история и требует написания отдельной статьи. Вышеприведённый пример это самый простой способ внедриться в чужой процесс. Обычному процессу не разрешается изменение памяти системных процессов, таких как winlogon.exe, lsass.exe, smss.exe, csrss.exe и др. для этого нужна привилегия SeDebugPrivilege. В приложенных к статье исходниках есть функция EnableDebugPrivilege, которая включает эту привилегию для текущего процесса.    Идём дальше. Теперь у нас мы научились загружать свою DLL в чужой процесс. Но для должного эффекта нам надо перехватывать DLL во всех процессах системы. Но как это сделать. Можно просто перечислять процессы через ToolHelp32 и загружать свою DLL в каждый найденный процесс. Но не приемлемо, так как во вновь созданных процессах функции не будут перехвачены. Но можно каждую секунду перечислять процессы, короче это тоже неприемлемо и очень долгая история. Самый простой метод это воспользоваться тем что предоставляет нам механизм хуков. Когда мы ставим какой-либо глобальный хук с помощью функции SetWindowsHookEx то DLL, в которой находится функция обработчик хука, загружается во все процессы, которые получают сообщения от системы через функции GetMessage и PeekMessage. Каркас DLL с перехватом функций будет выглядеть так примерно так library HideDLL; uses Windows, ExtendedAPIFunctions, apihooktools; {$R *.res} const MutexName='__API_HOOK'; function MsgProc(code:DWORD;wParam,lparam:DWORD):DWORD;stdcall; begin Result:=CallNextHookEx(SH,code,wParam,lparam); end; procedure SetWindowsHook(e:Boolean); stdcall; var M:THandle; begin if e then begin M:=CreateMutex(0,false,MutexName); if GetLastErrorERROR_ALREADY_EXISTS then begin SH:=SetWindowsHookEx(WH_GETMESSAGE,@MsgProc,HInstance,0); MutexHandle:=M; end else CloseHandle(M); end else begin UnhookWindowsHookEx(SH); CloseHandle(MutexHandle); end; end; procedure DLLEntryPoint(dwReason:DWord); begin case dwReason of DLL_PROCESS_ATTACH: begin // StopProcess(GetCurrentProcessId); SetWindowsHook(true); SetProcedureHook(GetModuleHandle('ntdll.dll'),'ZwQuerySystemInformation',@NewSystemFunction,@SystemFunctionBridge); // ResumeProcess(GetCurrentProcessId); end; DLL_PROCESS_DETACH: begin // StopProcess(GetCurrentProcessId); UnHookCodeHook(@SystemFunctionBridge); SetWindowsHook(false); //ResumeProcess(GetCurrentProcessId); end; end; end; begin DllProc:= @DLLEntryPoint; DLLEntryPoint(DLL_PROCESS_ATTACH); end. Чтобы установить перехват на API функции во всех процессах (во всех GUI процессах) достаточно просто загрузить нашу DLL. Достаточно написать вот такой код: LoadLibrary(pchar(ExtractFileDir(Application.ExeName)+'\'+'DLL.dll'));    Также следует помнить одну меру предосторожности при установке и снятии перехвата на функции: надо остановить все остальные потоки текущего процесса, так как во время установки перехвата другой поток может вызывать искомую функцию и это приведёт к непредсказуемым последствиям.    В архиве с исходниками есть заголовочный файл для Delphi (apihooktools.pas), в котором описаны все функции, которые я сегодня использовал и описывал.    Вот, пожалуй, и всё на сегодня. В архиве так же есть пример скрытия процесса lsass.exe. Скачать исходник

Самоудаление через реестр

#delphi


Здравствуйте! 
Вот с сайта откопал, какой путь к реестру нужно, что самоудалить прогу:
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce"
Записи в этом разделе указывают на имена файлов, которые должны выполниться один
раз во время загрузки системы. Для удаления программы, нужно всего лишь добавить запись
с именем файла, который удалит ее или командой del "имя файла"."
Но не могу понять, что делать в Delphi. Вот то, что сам написал:
reg:=TRegistry.Create;

reg.RootKey:=HKEY_LOCAL_MACHINE;

try
reg.OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce',true);
reg.WriteString('del','del "C:\...\Project2.exe"');
reg.CloseKey;
reg.Free;
except
end;
    


Ответы

Ответ 1



Попробуйте слеши продублируйте: вместо \ пишите \\, например так reg.WriteString('del','del ' + StringReplace('"C:\...\Project2.exe"', '\', '\\', [rfReplaceAll]); Уберите try except end и посмотрите какую ошибку выдает - может у вас нет прав на запись в эту ветку. Что записалось в реестр посмотрите. Попробуйте запись в реестр команду вручную и проверьте срабатывает ли он при перезагрузке - этот ключ может быть проигнорирован, если это указано в политике безопасности. Попробуйте писать в реестр такую команду cmd /C del /F /Q "C:\RHDSetup.log"

Ответ 2



Для самоудаления лучше всего использовать bat-файл. :1 del /F /Q "C:\prog.exe" || goto :1 del /F /Q "C:\delete_prog.bat" Генерить и запускать его можно прям из программы. 2-я строка будет пытаться удалить prog.exe пока запущенный процесс программы не отпустит его. После успешного удаления программы 3-я строка удалит сам bat-файл. UPD: Чтобы процесс удаления работал в фоне без окна консоли в панели задач запускать его нужно через ShellExecute(0, 'Open', 'C:\delete_prog.bat', nil, nil, SW_HIDE)

Функция для ввода строк в Python

#python #python_2x


Пробовал использовать input, но она выводит ошибку при вводе строки. Как можно в
консоле вводить строки? Python 2.7.
    


Ответы

Ответ 1



raw_input()

Ответ 2



>>> import sys >>> sys.stdin.readline() asdawda 'asdawda\n'

Ответ 3



>>> x=input("введите число:") введите число:1 >>> print x 1 >>> python 2.7 ни каких проблем

Ответ 4



#по-моему так s = str(input())