Страницы

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

воскресенье, 9 февраля 2020 г.

Вычисление кубического корня в sympy

#python_3x #sympy


Код:

a = simplify('x**(1/3)')
print(a.subs(x, -10).evalf())


Вывод:

1.07721734501594 + 1.86579517236206*I


Почему он с мнимой единицей? Есть же корень кубический из отрицательного числа? Или
я что-то забыл? В чём причина?
    


Ответы

Ответ 1



Эта проблема берётся от того, что и стандартно в python, если попытаться вычислить выражение (-10)**(1/3), то получим, как раз то, что у вас и получается. (Так как вычисляется 1/3 приближенно, а для числа 0.333333 никакого истинного корня нет. В документации к cbrt в sympy также явно указано, какой ответ она считает истинным и какой выдаёт, предупреждая что для отрицательных чисел он может отличаться от того, что вы ожидали. Но вместо возведение в степень (1/3) можно использовать функцию real_root() она как раз делает то, что вам нужно: >>> a = simplify('real_root(x, 3)') ... print(a.subs(x, -10).evalf()) −2.15443469003188 более того метод root может возвращать и другие корни. В качестве третьего параметра он берёт номер корня, который следует вернуть: >>>root(-10, 3, 0).evalf() 1.07721734501594+1.86579517236206i >>>root(-10, 3, 1).evalf() −2.15443469003188 >>>root(-10, 3, 2).evalf() 1.07721734501594−1.86579517236206i

Ответ 2



В том, что этих корней среди комплексных чисел три. И это вправду один из них. Полный список: 1.07721734501594 + 1.86579517236206*I # ваш 1.07721734501594 - 1.86579517236206*I # симметричный относительно оси вещественных -2.154434690031884 # то, что вы искали Комплексные корни из вещественных чисел целой степени 3 и более образуют на комплексной плоскости правильный многоугольник, в данном случае это равносторонний треугольник. См. формулу Муавра. Вам нужно ограничиться вещественными результатами. Чтобы получить все результаты, можно решить уравнение y = x**(1/3), если при этом ещё объявить y как вещественное, то комплексные результаты отвалятся. Но может быть решение и получше, которое я не знаю, т. к. с SymPy не работал.

UHF RFID. Телефоны

#android #авторизация #terminal


Прочел в интернете, а причем тут, что на телефонах с ОС Андроид(2.3 или выше) поддерживается
сканирование RFID меток. Является ли это истиной ? :D. 
Спрошу вот так: Есть телефоны в которых есть RFID считыватель.  
    


Ответы

Ответ 1



В статье по вашей ссылке речь идет о конкретных моделях внешних считывателей RFID-меток, которые взаимодействуют со смартфоном через Bluetooth и Wi-Fi. *Bluetooth and Wi-Fi. BLE support for idChamp RS3, Scanfob® NFC-BB2-BLE and more (Android 4.3+ needed for BLE support) Однако, телефон оснащенный NFC-модулем может считывать некоторые RFID-метки диапазона HF (13.56 МГц, стандарт ISO 14443). UHF RFID метки работают на совершенно других частотах (860—960 МГц). Их вам считать НЕ удастся.

Как в С# разбить строку на две переменные по разделителю?

#c_sharp


Как в С# разбить строку на две переменные по разделителю?
есть строка kek:kek4chanmemamoral Надо обрезать все до : и забить это в первую переменную
, а остальное в вторую:

var 1 = kek; 
var 2 = kek4chanmemamoral;

    


Ответы

Ответ 1



Можно при помощи конструкции string.Split(): string text = "kek:kek2cheburek"; string[] words= text.Split(new char[]{':'}); // new char[] - массив символов-разделителей. Как меня поправили в // комментариях, в данном случае достаточно написать text.Split(':') string first = words[0]; string second = words[1]; Console.WriteLine(first); Console.WriteLine(second); В этом коде мы создаём массив строк words, забиваем его содержимым строки, разбитым знаком ":". Если вставить два двоеточия - будет три элемента, вставь три двоеточия в строку - будет 4 и т.д. Надеюсь понятно расписал.

Ответ 2



Можно при помощи регулярных выражений, но это, лично для меня, более сложный способ, в отличии от цикла и substring. String MyString = "FirstPart:SecondPart"; for (int i=0; i

Прокрутить страницу не на 100px а на 100vh

#javascript #html #jquery #css


Приветствую.

Вопрос:
Как сделать кнопку, которая прокрутит страницу не на определенное количество пикселей,
а на 100vh что равно 100% высоты окна.

Если у блока высота будет 100vh, то он будет растянут на всю высоту блока, какая
бы там высота не была.
    


Ответы

Ответ 1



Вам нужно повесить обработчик событий на button(к примеру). Чтобы при нажатии кнопки, экран прокрутил страницу на высоту страницы, можно написать функцию, где будет: window.scrollBy(0, window.innerHeight); Сама кнопка, примерно так:

Ответ 2



Используя jQuery с плавной прокруткой: $("#scroll").click(function() { $('body').animate({ scrollTop: '+=' + window.innerHeight }, 'slow'); }); .area { height: 200px; margin-top: 10px; background-color: black; }
+= требуется для относительного скроллинга.

Как записать правильно вот такой селектор JavaScript [не jQuery]

#javascript


Хотелось бы записать вот такой селектор:

document.querySelectorAll(".smallinnertable:not(:has(a))");


На jQuery работает, а на чистом JS нет. Такой селектор очень нужен. Спасибо за помощь.
    


Ответы

Ответ 1



Вряд ли что-то есть прям в точности легкое и простое. Ведь даже на Jquery написан хорошенький и хитрый фильтр для селекторов. Поэтому, как вариант, написать что-то самому. Например что-то подобное: function getElementHasNotAnother(selector, filterEl) { var divs = document.querySelectorAll(selector), filter = Array.prototype.filter; return filter.call( divs, function( node ) { return node.querySelectorAll(filterEl).length == 0; }); } var result = getElementHasNotAnother('.smallinnertable', 'a'); /*********** check *************************/ for (var el in result) { console.log(result[el].textContent); }
1231
werjhwer
879879
4 34


Ответ 2



document.querySelectorAll(".smallinnertable:not(:has(a))"); Сначала надо выбрать .smallinnertable, а потом выкинуть из них все те, в которых есть a: console.log( Array.prototype.filter.call( document.querySelectorAll(".smallinnertable"), function (el) { return !el.querySelector("a") } ) )
1231
werjhwer
879879
4 34
На css пока ничего подобного нет, так что только фильтровать. Ну и осторожнее, если селектор внутри has составной.

Как удалить текст между заданным текстом?

#linux #ubuntu #bash


Подскажите, как решить проблему на bash командой sed

есть файлик с содержанием:

бла бла бла
...
/*033cf*/

@include "\x2fhom\x65/mg\x6etep\x6co/m\x67nte\x70lo.\x72u/d\x6fcs/\x6dodu\x6ces/\x6dod_\x65xt_\x6denu\x6dati\x63/js\x2ffav\x69con\x5fd38\x3368.\x69co";

/*033cf*/
...
бла бла бла


Задача удалить все, начинающееся с @include "\x2 и заканчивающиеся ;
    


Ответы

Ответ 1



Если не принципиально использование sed, предлагаю вариант с grep: grep -v '^@include\ "\\x2.*;$' filename grep покажет файл filename, а -v удалит строки, начинающиеся с @include "\x2 и заканчивающиеся ;

Ответ 2



удалить все строки, содержащие фрагмент1, а затем фрагмент2: $ sed -i '/фрагмент1.*фрагмент2/d' файл удалить все строки, начинающиеся с фрагмент1 и заканчивающиеся на фрагмент2 (^ — привязка к началу строки, $ — к концу): $ sed -i '/^фрагмент1.*фрагмент2$/d' файл удалить только части строк, начиная с фрагмент1 и заканчивающиеся на фрагмент2: $ sed -i 's/фрагмент1.*фрагмент2//' файл если внутри фрагментов встречаются символы / или \, перед ними надо добавить символ \.

Не удаётся выполнить ни Add-Migration, ни Update-Database

#entity_framework #migration


Добрый вечер. Суть проблемы в следующем: перестали применяться миграции в EF Code First. 

После внесения изменений пытаюсь выполнить Add-Migration , получаю сообщение:


  Unable to update database to match the current model because there are
  pending changes and automatic migration is disabled. Either write the
  pending model changes to a code-based migration or enable automatic
  migration. Set DbMigrationsConfiguration.AutomaticMigrationsEnabled to
  true to enable automatic migration.


Попытка выполнить Update-Database приводит к той же ошибке. 

По советам в интернете пыталась удалять папку с миграциями и таблицу _MigrationHistory,
делать Build Batch - ничего из этого не помогло.

Пробовала полностью удалить БД и выполнить Update-Database, с нуля БД создается,
но последующие изменения применить уже невозможно - та же ошибка в консоли.

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


Ответы

Ответ 1



Я только один случай знаю из практики, когда можно получить описанную вами ситуацию. Проверил на первом попавшемся проекте, где рабочая база и рабочие миграции. Вот как я ломал: создал в первой попавшейся таблице поле Title1 тут же сделал Add-Migration Asdf1 тут я должен был сделать Update-Database -- но я сделал вид, что я забыл применить миграцию через Update-Database, поэтому в этом шаге ничего не делаем сделал в этой же таблице ещё одно поле Title2 выполняю Add-Migration Asdf2 Вуаля: получаю ровно описанную вами ситуацию: PM> Add-Migration Asdf2 Unable to generate an explicit migration because the following explicit migrations are pending: [201705272231565_Asdf1]. Apply the pending explicit migrations before attempting to generate a new explicit migration. PM> Update-Database Specify the '-Verbose' flag to view the SQL statements being applied to the target database. Applying explicit migrations: [201705272231565_Asdf1]. Applying explicit migration: 201705272231565_Asdf1. Unable to update database to match the current model because there are pending changes and automatic migration is disabled. Either write the pending model changes to a code-based migration or enable automatic migration. Set DbMigrationsConfiguration.AutomaticMigrationsEnabled to true to enable automatic migration. You can use the Add-Migration command to write the pending model changes to a code-based migration. PM> (Выделил полужирным ключевой момент, вольный перевод: не забудьте применить миграцию перед тем как пытаться создавать новую) Как чиню: комментирую поле Title2 жму Update-Database (применяется миграция Asdf1) раскомментирую поле Title2 выполняю Add-Migration Asdf2 выполняю Update-Database Всё работает! Проверьте, у вас возможно такая же ситуация. Меня смущает вот эта часть вопроса: "с нуля БД создается, но последующие изменения применить уже невозможно" -- выходит, вы несколько раз подряд забываете применить миграцию к базе перед созданием новой?

Ответ 2



Благодаря смекалке пользователя A K выяснилось, что выполнению команд мешал класс инициализатора БД и следующие строки: Database.SetInitializer(new DbInitializer()); Database.Initialize(true); Причина в том, что Entity Framework 6 не позволяет использовать инициализаторы (например, DropCreateDatabaseAlways) вместе с миграциями. Более подробно о проблеме: If this initializer is used to create the database then a single entry is added to the __MigrationsHistory table which then renders the database un-usable with migrations (since these initializers don't use your migrations to create the database). This has confused a large number of people in previous releases, so we opted to not automatically create database/schema when migrations is enabled. Источник: тык сюда It looks like EF 6.0 introduces a new rule: "If the DbContext is using an Initializer AND Migrations are configured, throw an exception when building the model". Источник: тык сюда Может, это поможет кому-нибудь, кто, как и я, попал в подобную ситуацию.

Как не потерять локальные изменения, если надо сделать git pull?

#git #git_commit #git_push #git_pull


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


Ответы

Ответ 1



Перед pull можно сделать коммит, или прописать команду git stash, чтобы все изменения сохранились временно в нём, при этом Ваш проект "откатывается" до версии сервера. При неправильном pull можно вызвать ненужный merge, если сделать коммит, при pull все коммиты с сервера просто соединяются с Вашим.

Ответ 2



Разобрался , ничего плохого не произойдет. В самом худшем случае, если свежие изменение затронули ваши файлы, то придется все смержить и запушить уже свои изменения.

Связать результаты <form> с графиком на Google Charts

#javascript #html #google_api #google_chart


Есть простой график на Google Charts:




И есть форма:

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


Ответы

Ответ 1



Вот и вторая реализация на котором не добавляются строки а меняются:
Здесь использованы методы removeRow insertRows. То есть удаляем строку и в место нее добавляем новую с новыми значениями. Фишка кода в том что если в форме input написать существующий номер то строка обновится а если номер больше чем есть на графике то оно добавит новую строку методом addRows. А для пустого графика инициализируй google charts api вот так с нулевыми значениями: data = google.visualization.arrayToDataTable([ ['Time', 'First', 'Second'], ['00', 0, 0], ['01', 0, 0], ['02', 0, 0], ['03', 0, 0] ]);

Ответ 2



Добрый день. Вот мой пример реализации задуманного. Объясняю что я сделал. В Google Charts Есть метод addRows. При клике на submit button формы я вызвал метод addRows и добавил в опции графика новую строку. Но для того что бы оно было видно в графике надо с ново инициализировать график. И что бы старые данные не потерять я сделал переменные в функции drawChart() глобальными. и после каждого клика на submit к старым опциям добавляется новая строка и график инициализируется с ново.


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

#linux #c #сокет


здравствуйте, вот, допустим, есть у меня клиентский сокет... сделали connect, приняли
данные/отправили... а можно ли приконнектится к другому адресу, и так же, как ни в
чем ни бывало, начать обмен с другим совершенно хостом? я так понимаю, параметр SO_REUSEADDR
на это не влияет
    


Ответы

Ответ 1



Именно, опция SO_REUSEADDR используется только для бинда портов и к исходящим подключениям отношения не имеет.

Ответ 2



Опция SO_REUSEADDR используется в одном, крайне редком случае - когда одновременно две (или более программы) используют один сокет. Подробно это описано в гл. 9. "Повышение производительности" книги "Создание сетевых приложений в среде Linux" (Шон Уолтон).

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

#javascript #html #jquery


Glad to see you there!
What is your name?
What do you like?
Tell me :)
JQuery подключен. Прошу помощи ) $( window ).load(function() { document.$('.container').click(function() { var boxes = $('.boxes'); if(boxes.hasClass('showed')){ boxes.style.display = 'none'; boxes.removeClass('showed'); } else { boxes.style.display = 'flex'; boxes.addClass('showed'); } }); });


Ответы

Ответ 1



может так: $(document).on('click', '.container', function() { var boxes = $('.boxes'); var state = $(this).data('state'); state = !state; if (state) boxes.addClass('showed'); else boxes.removeClass('showed'); $(this).data('state', state); }); .boxes { display: none; } .showed { color: red; display: flex; }
click
Glad to see you there!
What is your name?
What do you like?
Tell me :)
Манипуляция только классами. Ну и дополнительная data-state, чтоб знать текущее состояние элементов

Ответ 2



Все как у @АлексейШиманский, только: $(document).on('click', '.container', function() { $('.boxes').toggleClass('showed'); });

Сравнение DateTime через LINQ

#c_sharp #linq


Стыдно, знаю. Не нагуглил. Как вывести всех людей, у которых ДР меньше чем в переменной
defaultDateTimes? Через LINQ

public class Person1
{
    public string Name;
    public DateTime Birthday;
}

class Program
{
  static void Main(string[] args)
  {
    DateTime defaultDateTimes = new DateTime(2000,1,1);

    var people = new List();
    var p1 = new Person1() { Name = "Leslie", Birthday = new DateTime(1983, 9, 4) };
    var p2 = new Person1() { Name = "Chris", Birthday = new DateTime(2001, 6, 19) };
    var p3 = new Person1() { Name = "JP", Birthday = new DateTime(1983, 4, 5) };
  }
}

    


Ответы

Ответ 1



Например, так: DateTime defaultDateTimes = new DateTime(2000, 1, 1); var people = new List() { new Person1() { Name = "Leslie", Birthday = new DateTime(1983, 9, 4) }, new Person1() { Name = "Chris", Birthday = new DateTime(2001, 6, 19) }, new Person1() { Name = "JP", Birthday = new DateTime(1983, 4, 5) } }; var filteredPeople = people.Where(p => p.Birthday < defaultDateTimes); foreach (var p in filteredPeople) Console.WriteLine(p.Name); LINQ предназначено для преобразования данных. Оно умеет, например, отбирать данные из списка (как в вашем случае людей) и преобразовывать их. Выполнять действия с данными (например, вывести имя человека) LINQ не умеет (да и не предназначено для этого). Поэтому в вашей задаче фильтрация данных — дело LINQ, а для вывода нужно использовать обыкновенный цикл foreach.

PHP, Что за конструкция “$a=(array) $b” обозначает

#php


недано начал изучать Php, в скрипте встретил такую конструкцию 

$a=(array) $b


не могу понять что она делает, объясните пожалуйста на пальцах.
    


Ответы

Ответ 1



Это приведение к типу, а именно приведение к типу array переменной $b. Такое может использоваться например в том случае, когда переменная $b содержит данные типа stdClass.

Ответ 2



Это приведение типов. Обычно используется когда вам нужно получить массив, а на вход вам дают бог знает что. function test($b) { $a = (array) $b; foreach ($a as $c) { echo "c=$c\n"; } } С этим приведением типа функцию можно вызывать с одним аргументом так: test(123); И так: test(array(123, 456)); Если же приведение типов не делать, то функция не сработает с ошибкой: PHP Warning: Invalid argument supplied for foreach()

Ответ 3



по поводу скалярных типов данных, если вы сделаете что-то вроде $a = 777; // или $a = 'qwerty'; или $a = true; $array = (array)$a; var_dump($array); то вам вернется массив, который содержит в качестве первого элемента вашу исходную переменную array(1) { [0]=> bool(true) // или int(777) или string(qwerty) }

Правильная скобочная последовательность стек python [дубликат]

#python #стек


        
             
                
                    
                        
                            На этот вопрос уже даны ответы здесь:
                            
                        
                    
                
                        
                            Проверить правильно ли вложены скобки 〈 ( { [ ] } ) 〉в
тексте
                                
                                    (2 ответа)
                                
                        
                                Закрыт 2 года назад.
            
                    
Всем привет, кто может помочь с реализацией проверки на правильность скобочной последовательности
через стек на Python.
Суть проверки я знаю, и просто через условия реализовала, но со стеком не могу понять,
помогите пожалуйста.

def brackets_check(s):
meetings = 0
for c in s:
    if c == '(':
        meetings += 1
    elif c == ')':
        meetings -= 1
        if meetings < 0:
            return False

return meetings == 0

    


Ответы

Ответ 1



А мне понравился этот простой и хитрый алгоритм -- главное чтобы строка в нем не имела символом, кроме ()[]{}, там даже объяснять ничего не нужно: def is_correct_brackets(text): while '()' in text or '[]' in text or '{}' in text: text = text.replace('()', '') text = text.replace('[]', '') text = text.replace('{}', '') # Возвращаем True, если text с пустой строкой return not text print(is_correct_brackets('(((())))')) # True print(is_correct_brackets('(((())')) # False print(is_correct_brackets('())))')) # False print(is_correct_brackets('((((){}[]{}[])))')) # True print(is_correct_brackets('(){}[]{}[])))')) # False print(is_correct_brackets('(){}[]{}[]')) # True

Ответ 2



На самом деле, всё очень просто. Вы идёте от начала строки. Каждый раз, когда встречаете открывающую скобку - кладёте её в стек. Каждый раз, когда встречаете закрывающую - убираете из стека ранее положенную скобку. Если нужно убрать скобку из стека, а их там больше не осталось - последовательность неправильная. Если после разбора строки в стеке остались лишние скобки - последовательность неправильная. Во всех остальных случаях - правильная. Так же можно проверять последовательность, в которой есть разные скобки - круглые, квадратные, фигурные и т.п. Просто к тем проверкам, которые я описал выше, добавляется ещё проверка на то, что забираемая из стека открывающая скобка по форме должна совпадать с той закрывающей, которая у вас сейчас встретилась в строке.

JavaScript - найти ключ зная его значение

#javascript #ооп


Надо найти в объекте ключ, зная только его значение. Я написал код, но он не находит
ключи находящиеся в под-объекте. Вот сам код:

Object.prototype.getKeyByValue = function(value) {
    for(var prop in this) {
        if(this.hasOwnProperty(prop)) {
             if(this[prop] === value)
                 return prop;
        }
    }
}


Первый пример (работает корректно):



Object.prototype.getKeyByValue = function(value) {
  for (var prop in this) {
    if (this.hasOwnProperty(prop)) {
      if (this[prop] === value)
        return prop;
    }
  }
}

var foobar = {
  foo: 4,
  bar: 7
}
document.write(foobar.getKeyByValue(7));




Второй пример (работает не корректно):



Object.prototype.getKeyByValue = function(value) {
  for (var prop in this) {
    if (this.hasOwnProperty(prop)) {
      if (this[prop] === value)
        return prop;
    }
  }
}

var foobar = {
  foo: 4,
  bar: {
    baz: 7
  }
}
document.write(foobar.getKeyByValue(7));




Почему во втором примере не находит значение и как это исправить?
    


Ответы

Ответ 1



Потому что для поиска вглубь нужна рекурсия. Object.prototype.getKeyByValue = function(value, objs) { // защита от циклических ссылок if (!objs) objs = []; for (var prop in this) { if (this.hasOwnProperty(prop)) { if (this[prop] === value) { return prop; } else if (typeof this[prop] === "object" && objs.indexOf(this[prop]) == -1) { objs.push(this[prop]); var res = this[prop].getKeyByValue(value, objs); if (res) return prop + "." + res; //за дополнительные баллы оценки - выведем цепочку названий ключей } } } } var foobar = { foo: 4, bar: { baz: 7 } } console.log(foobar.getKeyByValue(7));

Выгрузить dll из кода dll

#delphi #winapi #dll


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

library Test;

uses Winapi.Windows;

procedure DllMain(Reason: integer);
begin
  if Reason = DLL_PROCESS_ATTACH then
  begin
    // что-то делаем
    FreeLibraryAndExitThread(HInstance, 0); // выгружаемся
  end;
end;

begin
  DllProc := @DllMain;
  DllMain(DLL_PROCESS_ATTACH);
end.


Вероятно, при выгрузке происходит какая-то блокировка, в результате которой иногда
процесс наглухо зависает. Иногда этого не происходит, но корректно закрыть процесс
после этого всё равно не получается.

Пример:
1) Запускам, скажем, калькулятор
2) Внедряем в него эту dll (Process Hacker'ом, например)  

Дальше я смог поймать три типа поведения процесса:
а) Он намертво зависает
б) Перестаёт реагировать на закрытие крестиком
в) При закрытии основного окна остаётся висеть в списке процессов.

Несмотря на то, что dll себя удачно выгружает и даже завершает свой поток — она что-то
портит в процессе.

Если убрать из кода выгрузку, и делать её отдельно — всё работает как надо.

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



UPD1: Если заменить FreeLibraryAndExitThread на FreeLibrary всё становиться ещё хуже:
процесс тут же падает с ошибкой BEX64.
    


Ответы

Ответ 1



DLLMain вызывается системой под общей блокировкой, поэтому существуют значитильные ограничения на выполнение чего-либо внутри этой функции. Warning There are significant limits on what you can safely do in a DLL entry point. See General Best Practices for specific Windows APIs that are unsafe to call in DllMain. If you need anything but the simplest initialization then do that in an initialization function for the DLL. You can require applications to call the initialization function after DllMain has run and before they call any other functions in the DLL. т.е. самый простой способ решить проблему - вызывать отдельную функцию инициализации из этой DLL, которую Вы можете экспортировать наравне со всеми другими функциями и структурами. Посмотрите так же перечень задач, которые нельзя выполнять в DllMain: Call LoadLibrary or LoadLibraryEx (either directly or indirectly). This can cause a deadlock or a crash. Call GetStringTypeA, GetStringTypeEx, or GetStringTypeW (either directly or indirectly). This can cause a deadlock or a crash. Synchronize with other threads. This can cause a deadlock. Acquire a synchronization object that is owned by code that is waiting to acquire the loader lock. This can cause a deadlock. Initialize COM threads by using CoInitializeEx. Under certain conditions, this function can call LoadLibraryEx. Call the registry functions. These functions are implemented in Advapi32.dll. If Advapi32.dll is not initialized before your DLL, the DLL can access uninitialized memory and cause the process to crash. Call CreateProcess. Creating a process can load another DLL. Call ExitThread. Exiting a thread during DLL detach can cause the loader lock to be acquired again, causing a deadlock or a crash. Call CreateThread. Creating a thread can work if you do not synchronize with other threads, but it is risky. Create a named pipe or other named object (Windows 2000 only). In Windows 2000, named objects are provided by the Terminal Services DLL. If this DLL is not initialized, calls to the DLL can cause the process to crash. Use the memory management function from the dynamic C Run-Time (CRT). If the CRT DLL is not initialized, calls to these functions can cause the process to crash. Call functions in User32.dll or Gdi32.dll. Some functions load another DLL, which may not be initialized. Use managed code. И перечень задач, которые разрешены в DllMain: Initialize static data structures and members at compile time. Create and initialize synchronization objects. Allocate memory and initialize dynamic data structures (avoiding the functions listed above.) Set up thread local storage (TLS). Open, read from, and write to files. Call functions in Kernel32.dll (except the functions that are listed above). Set global pointers to NULL, putting off the initialization of dynamic members. In Microsoft Windows Vista™, you can use the one-time initialization functions to ensure that a block of code is executed only once in a multithreaded environment. Подробности можно получить из General Best Practices Другой способ вызвать что-либо в DllMain из запрещенного списка выше: создать в DllMain поток, в котором и выполнить все необходимые действия. Поток обойдет глобальную блокировку уже за пределами DllMain, поэтому в нем можно выполнять код без ограничений. Тут тоже есть некоторые нюансы, подробности - в блоге ms: Does creating a thread from DllMain deadlock or doesn’t it?

Заменить br на новые строки

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


Есть текст как на скриншоте, как в нём заменить теги 
, на новые строки ? (\n)


Ответы

Ответ 1



В принципе, можно попробовать просто оставить только текст: document.querySelector('button').addEventListener('click', function () { var div = document.querySelector('.amessage') div.textContent = div.textContent; }) .amessage { white-space: pre; }
строка 1
строка 2

строка 3


Ответ 2



Воспользуйтесь jQuery методом replaceAll. Примерно так: $('\n').replaceAll('.amessage br'); Живой пример: $('button').click(function () { console.log('html до:\n\n' + $('.amessage').html()); $('\n').replaceAll('.amessage br'); console.log('html после:\n\n' + $('.amessage').html()); });
строка 1
строка 2

строка 3
Если же дана строка, содержащая html элементы, и нужно заменить
в ней, то можно сделать примерно так: let text = `
строка 1
строка 2

строка 3
`; function replaceBrTagsToNewLineChar(text) { let element = $.parseHTML('
' + text + '
'); element = $(element[0]); $('\n').replaceAll(element.find('br')); return element.html(); } console.log('html до:\n\n' + text); console.log('html после:\n\n' + replaceBrTagsToNewLineChar(text));

Как создать модульное android приложение

#java #android #android_studio #gradle #modules


Например, приложение делится на три модуля: Core, Personal, Client; 
В Core определены основные библиотеки и методы которые будут переиспользовать остальные
модули. Personal и Client - это модули со своим набором activity и бизнес логикой.
При авторизации пользователя выбирается, какой модуль использовать. 
Подскажите, как разрешить зависимости между модулями, а так же каким образом может
происходить выбор модуля в зависимости от триггера у пользователя?
    


Ответы

Ответ 1



Создание модуля (библиотеки) Для создания модуля в Android Studio выбираете File > New > New Module Далее есть 2 варианта. Если вы планируете создать «чистую» java-библиотеку, в качестве типа указывайте Java Library, в итоге код такой библиотеки скомпилируется в JAR файл. Это удобно, так как вы сможете использовать ее не только в Android приложениях. Если же вы собираетесь использовать android-специфичные вещи и вам понадобятся классы из пакетов android.*, то создавайте Android Library, которая при компиляции собирается в AAR файл. В данном случае вам понядобится последний вариант. ВАЖНО: В minSDKVersion (файлы build.gradle модулей) приложения должен совпадать или быть больше, чем указанный в модуле библиотеки.Указанные buildToolsVersion должны быть установлены в Android-SDK. Каждый модуль библиотеки генерирует свой класс ресурсов (*.R.class). Когда Android библиотеки добавляются в проект и происходит его сборка, то их ресурсы сливаются, что может привести к конфликтам. Поэтому в документации определены следующие соглашения: Если ID ресурса приложения совпадает с ID ресурса в библиотеке, то используется ресурс приложения Если ID ресурса совпадает в разных библиотеках, то используется ресурс библиотеки, которая указана первой в списке зависимостей (находится выше в блоке dependecies) Для избежания описанных выше конфликтов рекомендуется использовать префикс или другую последовательную схему именования ресурсов, которая будет уникальна для каждого из модулей (или уникальна для всего приложения вцелом) Подключение Android библиотеки Подключаются Android библиотеки как зависимости (если библиотека была создана как отдельный проект в AndroidStudio). Тут есть так же 2 варианта: 1.Либо добавить скомпилированный AAR (или JAR) файл: - File > New Module - Import .JAR/.AAR Package > Next - вводите путь до ARR (или JAR) файла > Finish 2.Либо импортировать библиотеку из исходников: - File > New > Import Module - вводите путь до директории, в которой находятся исходники библиотеки > Finish ВАЖНО: убедиться, что имя Android библиотеки было добавлено в settings.gradle include ':app', ':core', ':personal', ':client' и появилась в блоке dependencies файла build.gradle приложения dependencies { compile project(":core") compile project(":personal") compile project(":client") } Android библиотеки могут содержать в себе ресурсы, другие JAR библиотеки, собственный AndroidManifest.xml. Структура скомпилированной Android библиотеки Скомпилированная Android библиотека представляет собой обычный zip архив с расширением .arr, который содержит следующие обязательные файлы и директории: /AndroidManifest.xml /classes.jar /res/ /R.txt и необязательные: /assets/ /libs/name.jar /jni/abi_name/name.so (где abi_name один из поддерживаемых Android ABIs) /proguard.txt /lint.jar

Вывод информации о процессе

#linux #bash #terminal


Допустим есть процесс firefox(pid 5059)
Как вывести с помощью ps владельца этого процесса, аргументы с которыми был запущен
этот процесс, группу владельца этого процесса и т.д.

ps -eo user, ? , ? | grep firefox 
    


Ответы

Ответ 1



владельца этого процесса, аргументы с которыми был запущен этот процесс, группу владельца этого процесса для процесса номер 5059: $ ps -o user,args,group -p 5059 для процессов, выполняющих файл с именем firefox: $ ps -o user,args,group -C firefox и т.д. см. секцию STANDARD FORMAT SPECIFIERS в man ps.

Ответ 2



Как вариант, если есть права root. ~# find /proc/5059 -type f -print0 2>/dev/null | xargs -0 cat Выведет всю "сырую" информацию о процессе. ~# cat /proc/5059/cmdline Покажет какая команда была запущена в этом процессе, с полным путем до неё. ~# find /proc/[0-9]* -type f -print0 2>/dev/null | xargs -0 grep "firefox" Пройтись по всем процессам и найти файлы, где фигурирует firefox (активное использование философии UNIX). Утилита ps формирует вывод как раз из псевдо файловой системы /proc. ~# strace ps 2>&1 | grep "open" | grep -oP "(?<=open\(\")/[a-z]+/" | sort | uniq -c | sort -nr 584 /proc/ 9 /usr/ 1 /sys/ 1 /etc/ Часто использую в рабочем процессе. ~$ ps aux | grep [f]irefox sharlat+ 2736 1.0 4.5 3659672 735104 tty2 Sl+ Jun29 89:31 /usr/lib64/firefox/firefox To see every process on the system using BSD syntax: ps ax ps axu - grep [f]irefox - хак, убрать из поиска процесс grep. Ссылки https://github.com/Hellseher/cix/blob/master/spices/cix-procps-ng.org http://rus-linux.net/lib.php?name=/MyLDP/proc/fs-proc.html

Определить математически <<средний цвет>> из 2х

#c_sharp #цвета


Имеем 2 цвета, заданы в RGB, по 1 байту на цвет.

Если брать и складывать каждый из цветов, затем делить на 2, то получается на мой
взгляд не совсем верно. Допустим FF0000 и 00FF00 таким образом родят 7F7F00, который
смотрится намного темнее, чем оба его "родителя". Если таким образом считать средний
между FF0000 и FFFF00, то будет FF7F00, который на взгляд явно ближе к FF0000, чем
к FFFF00. На взгляд средний между ними примерно FFAA00.

В каждом пикселе монитора мы имеем 3 субпикселя, питание подаваемое на которые изменяется
от 0 до 255 (некоторых баллов) при данной глубине цвета, если я всё верно понимаю.
Хочу узнать, как можно математически просчитать цвет, который был бы "средним" между
двумя заданными, а именно был бы похож на каждый из них в равной мере, при этом имея
среднюю между ними яркость.
Возможно, есть стандартные библиотеки в средах разработки, которые делают что-то
подобное?



div {
  width: 6em;
  height: 6em;
  display: inline-block;
  font-family: monospace;
  text-indent: -12ch;
  overflow: hidden;
}

div:after {
  content: attr(style);
}



Ответы

Ответ 1



В RGB нельзя высчитать "средний" цвет. Во первых, яркость разных цветов воспринимается глазом по разному - т.е. яркость не "определяется наибольшим значением любого из 3 цветов". В RGB (sRGB) зеленый ярче красного, красный ярче синего. FF0000 по яркости совпадает с 009B00 (справа), а не с вырвиглазным 00FF00 (слева): Во вторых, отсчет яркости не привязан строго к 0, и простое "уполовинивание" значения дает слишком темные цвета. Например, "полуяркий красный" - это, скорее, A60000, а не 7F0000, как можно было бы ожидать. Для правильного смешивания цветов их стоит предварительно перевести в цветовое пространство, отражающее человеческое восприятие, например, Lab color space, и высчитывать среднее уже в этом пространстве. Вот сравнительные результаты для чистых R G и B (сверху - с преобразованием в Lab и усреднением, снизу - с усреднением в RBG). Видно, что усреднение по RGB дает слишком темный результат, а усреднение через Lab - средний по яркости. В C# реализуется достаточно легко, готовые форумы есть по ссылкам на вики выше. Если не хочется вручную вписывать преобразование - возьмите готовую библиотеку: PM> Install-Package ColorMine var color1 = new Rgb() { R = 255 }; var color1Lab = color1.To(); var color2 = new Rgb() { G = 255 }; var color2Lab = color2.To(); var averageLab = new Lab() { L = (color1Lab.L + color2Lab.L) / 2, A = (color1Lab.A + color2Lab.A) / 2, B = (color1Lab.B + color2Lab.B) / 2, }; var averageLabRgb = averageLab.ToRgb();

Ответ 2



Есть две модели смешивания: адитивное и субтрактивное смешение цветов. Можно почитать тут https://creativshik.com/pochemu-vret-monitor/ Адитивное будет так (оно "работает" при световом смешивании лучей, в некоторых графических программах): r = (r1 + r2 ) / 2; g = (b1 + b2 ) / 2; b = (b1 + b2 ) / 2; Cубтрактивное r = // TODO: g = b = Второе "смешивание" цветов похоже на привычное смешивание "акварельных красок" на белом листе. Ещё такое смешивание можно включить в Corel Draw. Адитивное - "приближает" цвета к чёрному. А субтрактивное - к белому. Если стоит задача определить "ближайший" цвет, то используется сумма rgb c коефициентами Q = r * Kr + g* Kg + b*Kb; Где Q- будет "вес" по которому можно определить схожесть. этой формулой переводят изображение в чёрнобелое. Для разных преобразований используют разные коефициенты. Стандартные для ч/б где-то видел - найду запишу. Коефициенты нашёл, вот Y=0.299*R+0.587*G+0.114*B (В.Порев "Компьютерная графика", BHV, 2002г. - страница 41.) Y= 0.2125R + 0.7154G + 0,0721В (Фотошоп ссылка ) При попытке вставить коефициенты - они в формуле сокращаются, т.е. для Y(R=255,G=0,B=0)=76,5 , Y(R=0;G=255;B=0)=150,45. Средний цвет будет (128,128,0), но и средняя яркость будет тоже средней - 113,48. Если вы хотите "поднять" яркость до max(Y(цвет1),Y(цвет2)) то вы можете пересчитать цвет, учитывая формулу приведённую выше. Если у вас задача "не потерять яркость", тогда ставим задачу - сохранить максимальную яркость. Y(Red=255) = 76,5 Y(Green=255) = 150,45, Y=(Red+Green) = 113,48; t = Ymax / Y = 150,45/113,48 = 1,325 Тогда (адитивное смешение): r` = (r1 + r2)*t/2 = (255 + 0)*1,325/2 = 170 g` = (g1 + g2)*t/2 = (0 + 255)*1,325/2 = 170 b` = (b1 + b2)*t/2 = (0 + 0)*1,325 / 2 = 0 Y(R=170,G=170,B=0) = 150,45 Для субтрактивного смешения можно написать аналогичную формулу. Можно так же в цикле прибавлять еденицу - выйдет похожее значение (R=169,G=127,B=42). Внизу пример, сначала R (255,0,0), потом результат "затемнённый" R+G (128,128,0), Потом скорректированый по яркости (170,170,0), потом сделаный инкрементом (169,127,42). Потом зеленый (0,255,0) И последнее, ставьте проверки что б компонента не выходила за пределы [0,255], если меньше 0 то присваивать 0, если более 255 то ставить 255.

Как заранее подгрузить бэкграунды?

#javascript #html #css


Есть код:



function changingBg(delay = 3000) {
  let changingBgBlock = document.querySelector('.section-block_bg-change');
  let i = 0;
  let backgrounds = [
    "background: url('http://res.cloudinary.com/dk0qq/image/upload/v1499688478/Chahning-bg/bg-2.jpg')
no-repeat; background-size: cover; background-position: 50% 0;",
    "background: url('http://res.cloudinary.com/dk0qq/image/upload/v1499688478/Chahning-bg/bg-1.jpg')
no-repeat; background-size: cover; background-position: 50% 0;",
    "background: url('http://res.cloudinary.com/dk0qq/image/upload/v1499688478/Chahning-bg/bg-4.jpg')
no-repeat; background-size: cover; background-position: 50% 0;",
    "background: url('http://res.cloudinary.com/dk0qq/image/upload/v1499688477/Chahning-bg/bg-3.jpg')
no-repeat; background-size: cover; background-position: 50% 0;"
  ];
  setInterval(function() {
    if (i == backgrounds.length - 1) {
      i = 0;
    }
    console.log(backgrounds[i]);
    changingBgBlock.style.cssText = backgrounds[i];
    i++;
  }, delay)
}
changingBg();
html,
body {
  width: 100%;
  height: 100%;
  min-height: 100%;
}

.section-block_bg-change {
  -webkit-transition-duration: 1s;
  transition-duration: 1s;
  width: 100%;
  min-height: 100%;
}
https://codepen.io/dima_bur/pen/mwQrNX Фон у блока должен меняться плавно, но это происходит только после прохождения первого цикла, когда все изображения уже подгрузятся. Подскажите, как сделать так, чтобы изображения менялись плавно с самого начала?


Ответы

Ответ 1



Попробуйте заранее прогрузить Ваши изображения на JS (выполните этот код в начале страницы): new Image().src = 'http://res.cloudinary.com/dk0qq/image/upload/v1499688478/Chahning-bg/bg-2.jpg'; new Image().src = 'http://res.cloudinary.com/dk0qq/image/upload/v1499688478/Chahning-bg/bg-1.jpg'; new Image().src = 'http://res.cloudinary.com/dk0qq/image/upload/v1499688478/Chahning-bg/bg-4.jpg'; new Image().src = 'http://res.cloudinary.com/dk0qq/image/upload/v1499688477/Chahning-bg/bg-3.jpg';

Ответ 2



Добавьте все эти изображения в скрытый блок - тогда они будут грузиться вместе с самой странцией. function changingBg(delay = 3000) { let changingBgBlock = document.querySelector('.section-block_bg-change'); let i = 0; let backgrounds = [ "background: url('http://res.cloudinary.com/dk0qq/image/upload/v1499688478/Chahning-bg/bg-2.jpg') no-repeat", "background: url('http://res.cloudinary.com/dk0qq/image/upload/v1499688478/Chahning-bg/bg-1.jpg') no-repeat;", "background: url('http://res.cloudinary.com/dk0qq/image/upload/v1499688478/Chahning-bg/bg-4.jpg') no-repeat;", "background: url('http://res.cloudinary.com/dk0qq/image/upload/v1499688477/Chahning-bg/bg-3.jpg') no-repeat;" ]; setInterval(function() { if (i == backgrounds.length - 1) { i = 0; } console.log(backgrounds[i]); changingBgBlock.style.cssText = backgrounds[i]; i++; }, delay) } changingBg(); html, body { width: 100%; height: 100%; min-height: 100%; } .section-block_bg-change { -webkit-transition-duration: 1s; transition-duration: 1s; width: 100%; min-height: 100%; background-size: cover!important; background-position: 50% 0!important; } .imgprldr { position:absolute; left:-9999px; top:-9999px; opacity:0px; visibility:hidden; width:0px; height:0px; overflow:hidden; }


Ответ 3



Пока что это решение не очень кроссбраузерное, но зато оно единственное не является хаком — это использование . Как и с любым другим элементом , для preload можно использовать атрибут media и подгружать ресурсы для, например, определенных разрешений экрана. Smashing magazine article: Preload: What Is It Good For? Browser support: 53.36% worldwide.

Удаление drawable-ресурсов

#android #android_drawable #android_resources


Когда происходит удаление drawable-ресурсов (when packaging an APK - при сборке APK
или при установке APK на конкретное устройство?) и почему mipmap-ресурсы при этом не
удаляются? 


  while drawable resources might be removed when packaging an APK, such
  as for the Gradle for Android split system for making density-specific
  editions of an app, mipmap resources are left alone, apparently


P.S.
И что значит "Android split system"? 
    


Ответы

Ответ 1



Когда происходит удаление drawable-ресурсов (when packaging an APK - при сборке APK или при установке APK на конкретное устройство?) Удаление ресурсов происходит на этапе сборки проекта (ведь цель этого – уменьшить размер APK). Исключить ресурсы можно с помощью оператора exclude, например: exclude "ldpi", "xxhdpi", "xxxhdpi" и почему mipmap-ресурсы при этом не удаляются? В этом и есть вся фишка mipmap-ресурсов. Далее процитирую свой ответ: Зачем нужен mipmap? Для корректного отображения изображений на дисплеях с различными DPI в Android были введены квалификаторы (например, mdpi, hdpi). Чтобы изображения корректно выглядели на всех устройствах, необходимо разместить эти изображения со всеми доступными квалификаторами (в соответствующих разрешениях). Размещение изображений в различных разрешениях влечет за собой увеличение размера приложения. Допустим, Вы знаете, что у Боба такое-то значение DPI, а у Алисы – некоторое другое. Чтобы уменьшить размер приложения, Вы можете отдельно собрать приложение для Боба и отдельно для Алисы, включая изображения только в необходимом разрешении. При сборке проекта Вы можете исключить ненужные изображения (с помощью соответствующей конфигурации Gradle), например: exclude "ldpi", "xxhdpi", "xxxhdpi" Вроде бы все хорошо: исключены ненужные изображения и размер приложения уменьшен. Однако не все так гладко. Некоторые изображения могут быть отображены в разрешениях, которые не соответствуют тому, в котором Вы оставили эти изображения в проекте. Пример – иконка приложения, в некоторых лаунчерах она может быть увеличена. Так как иконка приложения у Вас в единственном разрешении (как и все другие изображения), то она будет увеличена и произойдет т.н. пикселизация – изображение будут размыто (при большом апскейле будут заметны квадратики). Вот тут-то и приходит на помощь mipmap – изображения, размещенные там, не будут исключены. То есть если Вы укажите в Gradle: exclude "ldpi", "xxhdpi", "xxxhdpi" то соответствующие изображения из drawable будут исключены, а из mipmap – нет. Android split system – условное название совокупности конструкций, которые используется для разделения ресурсов для APK.

Как передать “text” в C используя Makefile

#c #makefile #препроцессор


Есть фаил BoardConfig.mk
В нем есть команда

TARGET_BOARD_PLATFORM := mt6572


Мы берём это значение в Android.mk так

init_options += -Dold_kernel=$(TARGET_BOARD_PLATFORM)


и передаем его в init.cpp

{ "ro.boot.hardware",   "ro.hardware",   old_kernel, },


В итоге мы имеем:

{ "ro.boot.hardware",   "ro.hardware",   mt6572, },


Как сделать так, что бы передаваемое значение заключалась в "" ?
То есть что бы получалась такая строка:

{ "ro.boot.hardware",   "ro.hardware",   "mt6572", },

    


Ответы

Ответ 1



Надо просто в Android.mk изменить строку на: init_options += -Dold_kernel=\"$(TARGET_BOARD_PLATFORM)\"

Ответ 2



В .cpp-файле добавляем макроопределение типа #define STR(x) #x и пишем {"ro.boot.hardware", "ro.hardware", STR(old_kernel), }, Все.

Как разбить строку несколько раз в python?

#python #python_3x #строки #список


Допустим, у меня есть строка:    message = "Лебедьракщука"

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

Как мне создать список:    finally = ['Лебедь', 'рак', 'щука']
    


Ответы

Ответ 1



К примеру так: In [27]: message Out[27]: 'Лебедьракщука' In [28]: key Out[28]: [6, 3, 4] In [29]: def splitWords(word, key): ...: step = 0 ...: result = [] ...: for i in key: ...: result.append(word[step:i+step]) ...: step += i ...: return result ...: In [30]: splitWords(message, key) Out[30]: ['Лебедь', 'рак', 'щука'] По поводу key: Если он в таком формате, делаем так: In [1]: key = 634 In [2]: list(map(int, str(key))) Out[2]: [6, 3, 4]

Ответ 2



Можно воспользоваться RegEx: In [62]: key = 634 In [63]: key = list(map(int, str(key))) In [64]: key Out[64]: [6, 3, 4] import re In [22]: pat = ''.join(['(.{{{}}})'.format(k) for k in key]) In [23]: repl = ' '.join([r'\{}'.format(i) for i in range(1, len(key)+1)]) In [24]: pat Out[24]: '(.{6})(.{3})(.{4})' In [25]: repl Out[25]: '\\1 \\2 \\3' In [26]: re.sub(pat, repl, message) Out[26]: 'Лебедь рак щука' In [27]: re.sub(pat, repl, message).split() Out[27]: ['Лебедь', 'рак', 'щука'] PS но решение от @Alban мне нравится больше... Вот еще одно решение: In [57]: [message[sum(key[:i]) : sum(key[:i+1])] for i in range(len(key))] Out[57]: ['Лебедь', 'рак', 'щука'] Как это работает: In [73]: [print('{} : {}'.format(sum(key[:i]),sum(key[:i+1]))) for i in range(len(key))] 0 : 6 6 : 9 9 : 13

Посимвольный вывод слов

#php #utf_8 #unicode


Здравствуйте!

Есть такая конструкция, которая выведет первую букву переменной $str, которая будет
равна 't':

mb_internal_encoding("UTF-8");
$str = 'test';
print_r($str[0]);   //    выведет 't'


Но почему это не работает с русскими словами?

mb_internal_encoding("UTF-8");
$str = 'тест';
print_r($str[0]);   //    выведет '�', вместо 'т'


Кодировка вроде выставлена, но почему в выводе  знак вопроса?

Подскажите, пожалуйста, как решить?

Спасибо!
    


Ответы

Ответ 1



Всё дело в том, что в кодировке UTF-8 единичный символ может занимать разное количество байт (от 1 до 6 или даже больше). Английские буквы, цифры, некоторые знаки препинания занимают по одному байту, и их представление ничем не отличается, как если бы они были закодированы в ASCII. Для букв русского алфавита, букв европейских языков, которых нет английском (например, немецкая Ö), для арабского алфавита, нужно уже по два байта. Распространённые восточные иероглифы занимают уже по 3 байта каждый. А всеми любимые эмодзи кодируются последовательностями от 4 байтов. Итак, давайте рассмотрим байтовое представление ваших строк. test -> 74 65 73 74 тест -> D1 82 D0 B5 D1 81 D1 82 Слева показано то, как эти буквы видим мы, справа — их побайтовое представление в памяти компьютера, причём значения байтов записаны в 16-ричной системе счисления (чтобы не занять много места). Как видите, русское слово занимает в два раза больше памяти, хотя букв в нём столько же. Кроме того, обратите внимание, каждый байт в его кодированном варианте не меньше 8016. Теперь вернёмся к PHP. Строки в этом языке о кодировках ничего не знают, а просто хранят в себе только байты. И оператор индексирования тоже ничего про кодировки, буквы, символы не знает; он просто, будучи применённым к строке, возвращает байт с указанным номером. Поэтому, когда вы пытаетесь напечатать первый байт (с номером 0), в первом случае выводится байт со значением 7416, который на экране компьютера виден как маленькая латинская буква «t». А во втором случае на вывод подаётся байт со значением D116, представляющий собой огрызок русской буквы «т»; не зная, какой байт идёт дальше, устройство вывода (терминал или веб-обозреватель) просто рисует знак вопроса. Что же делать, как напечатать только первый символ из строки? В качестве решения можно применить функции из расширения php-mbstring. $letter = mb_substr($str, 0, 1); // вернёт первый code point из строки Но учтите, функция mb_substr оперирует понятием code point, а не graphical cluster. Какое же это имеет значение? Стандарт юникода позволяет составлять некоторые буквы из нескольких code points. К примеру, буква «ё» может оказаться комбинацией буквы «е» и умляута.

Ответ 2



Используйте mb_substr: mb_substr($string, $letter, 1, "utf-8"); //$string - строка //$letter - индекс нужной буквы //1 - сколько символов включая нужную нужно вернуть //"utf-8" - кодировка

Регистры (теоретический вопрос)

#ассемблер #память #асинхронность #процесс #теория


Здравствуйте, извиняюсь за возможно глупый вопрос, но скажите пожалуйста где располагаются
регистры eax, ebx, ecx, edx, edi, esi, в оперативной памяти или процессоре?

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


Ответы

Ответ 1



регистры располагаются, конечно, в процессоре (если речь о современных распространённых процессорах). попеременно же используются они разными процессами благодаря механизму многозадачности. в грубом приближении: внутри процессора есть таймер, который время от времени посылает процессору сигнал («прерывание»), при получении которого процессор сохраняет текущее содержимое всех регистров в стек (находится в оперативной памяти, обычно каждый процесс имеет собственный стек; а сохраняются туда регистры не только с данными, но и со всякой контрольно-управляющей информацией, типа ip — instruction pointer — адресом следующей выполняемой команды) и передаёт управление по адресу обработчика данного прервывания (обработчик обычно реализован в ядре операционой системы). обработчик выбирает, какой процесс следует запустить следующим (какому процессу отдать очередной «квант времени»), и даёт процессору команду «загрузить в регистры то, что сохранённо там-то». восстановленный же из стека процесс продолжает работу «как ни в чём не бывало», до следующего срабатывания таймера.

Ответ 2



Регистры в процессоре. Многозадачность - фича ОС, которая сохраняет контекст процесса, включая регистры. Так и получается что один набор регистров вполне досаточен для многих процессов.

Класс ObservableCollection<T> и функция IndexOf

#c_sharp #observablecollection


Добрый день столкнулся с такой проблемой: функция IndexOf класса ObservableCollection
всегда возвращает -1.
Вот код:

ObservableCollection FilterMask = new ObservableCollection();
foreach(Worker w in ListWorker)
    {
        if(w.Directions.Count == 0) continue;
        Item ForFilter = new Item() { Text = w.Directions[0], IsSelected = true };
        if (FilterMask.IndexOf(ForFilter) == -1)
            FilterMask.Add(ForFilter);
    }


Пример класса Item:

public class Item : INotifyPropertyChanged
{
    string _Text;
    public string Text
    {
        get { return _Text; }
        set
        {
            _Text = value;
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("Text"));
        }
    }

    bool _IsSelected;
    public bool IsSelected
    {
        get { return _IsSelected; }
        set
        {
            _IsSelected = value;
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("IsSelected"));
        }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion
}


В FilterMask появляются дубликаты, чего не должно быть согласно коду=)
    


Ответы

Ответ 1



Разумеется, возвращает -1. Ты создаёшь новый объект класса Item и ищешь его в коллекции. Он туда ещё не добавлен. Если ты хочешь, чтобы твой код работал, перегрузи в Item методы Equals и GetHashCode. Или полноценно реализуй интерфейс IEquatable.

Сбивается время в Win7 ровно на 3 часа. Часовой пояс сохраняется

#windows_7 #время


Предыстория:

На 240-гигабайтном SSD-накопителе десктопа стояли лицензионная 7-я Винда (около 140
Гб) и Ubuntu 14.04. Решил подключить второй монитор, чтобы удобнее было учиться. Подключал,
естественно, при выключенном системном блоке.

В результате Виндоус перестала запускаться совсем (уходила в ребут после одного бегунка
при загрузке), а Убунту никаких проблем не показала - стала работать на 2 монитора,
как хотелось.

Поскольку восстановить Виндоус не удалось никакими средствами (руки вроде бы растут
откуда надо, кое-что умею), поставил ту же самую систему заново, предварительно обновив
Убунту до 16.04. Еще при этом заменил батарейку на материнской плате на новую.

Сама проблема:

Все бы ничего, но за прошедший месяц заметил неприятную мелочь - после нескольких
дней работы у Виндоус слетает время ровно на 3 часа, при этом часовой пояс сохраняется.
Т.е. сейчас у меня по Киеву должно быть 19:43, а Виндоус показывает 16:43.

Поймать момент, когда это происходит - не удавалось пока. 

Кто что может подсказать?
    


Ответы

Ответ 1



В Ubuntu в терминале прописать timedatectl set-local-rtc 1, и тогда на Windows 7 время сбиваться не будет. По умолчанию Ubuntu при загрузке устанавливает таймер BIOS в UTC 0 (Coordinated Universal Time - Координированное Универсальное Время). А Windows загрузившись воспринимает это время как локальное и показывает его как ни в чем не бывало

о принципе работы into into

#c_sharp #linq


Здравствуйте. Не могу понять, когда именно данные сохраняются в ws ?

string[] websites = { "hsNameA.com", "hsNameB.net", "hsNameC.net",
    "hsNameD.com", "hsNameE.org", "hsNameF.org",
    "hsNameG.tv", "hsNameH.net", "hsNameI.tv"
    };

    var webAddrs = from addr in websites
    group addr by addr.Substring(addr.LastIndexOf('.'))
        into ws
        where ws.Count()>2
        select ws;


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


Ответы

Ответ 1



SQL-подобный синтаксис разворачивается в последовательный вызов методов расширений LiNQ. В некоторых случаях такой синтаксис легче читается, чем длинные цепочки вызова методов. Ваш запрос можно переписать так: var groups = websites.GroupBy(addr => addr.Substring(addr.LastIndexOf('.'))); var webAddrs = groups.Where(ws => ws.Count() > 2); Таким образом видно, что сначала формируются все группы и, только после этого, происходит отбор нужных групп. Если написать последовательность вызова одной строкой (без промежуточной переменной groups) и посмотреть на результат компиляции в IL-код (например в LINQPad), вы убедитесь, что это одно и тоже.

Scala. Список футур. Выполнение шаг за шагом

#scala #future


Хола, коллеги!
У меня есть список некоторых сущностей. Они могут быть вложены друг в друга. Например:

case class Entity(id: Long, parentId: Long)

val list = List(
    Entity(1,0),
    Entity(2,1),
    Entity(3,2),
    Entity(4,1),
    Entity(5,0)
)


Мне нужно добавить их в БД. Мой сервис:

val listOfFutures = list map createEntity // createEntity - мой метод,
                                          // который добавляет сущность в БД.
                                          // Возвращает Future[Entity]
Future.sequence( listOfFutures ) map { _ => println("Ok!") }


Проблема в constraints(Как их по-русски назвать?). Получаю ошибку:


  Create failed. No such parent 1 entity exists.


Я думаю, что проблема в том, что метод createEntity выполняется параллельно. Как
заставить этот код выполняться последовательно, сущность за сущностью?
    


Ответы

Ответ 1



Future считается монадой, так как у неё есть последовательный flatMap: list.foldLeft(Future.successful(()))(( prevF, entity) => prevF .flatMap( _ => createEntity(entity)) .map( _ => ()) ) Аналогичный код, используя for-comprehension: list.foldLeft(Future.successful(()))(( prevF, entity) => for { _ <- prevF _ <- createEntity(entity) } yield () ) Объяснение: val entity = Entity(0, 1) createEntity(entity).map( _ => println("Ok!")) Метод map запоминает полученную функцию и выполняет её после того как получит успешный результат Future. Meтод flatMap работает также, только ожидает что полученная функция тоже будет возвращать Future. createEntity(entityOne).flatMap( _ => createEntity(entityTwo)) Таким образом мы соединяем две Future последовательно, т.е. вторая вызовется только после успешного выполнения первой. Отсюда очевидно что мы можем выстраивать длинные последовательные цепочки. createEntity(entityOne) .flatMap( _ => createEntity(entityTwo)) .flatMap( _ => createEntity(entityThree)) .flatMap( _ => createEntity(entityFour)) А результатом будет новая Future. Ок, а как поступить если у нас есть список Future? Так же как мы бы поступили бы например с числами. val listNumbers = List(1, 2, 3, 4, 5) val zeroNumber = 0 def joinNumbers(a: Int, b: Int): Int = a + b listNumbers.foldLeft(zeroNumber)(joinNumbers) Почему foldLeft, а не map? Потому что прибавляем по очереди, и нам нужна сумма предыдущих чисел. Зачем нужен zeroNumber? Ну а вдруг список пустой - вернем 0. Теперь с Future: val listEntities: List[Entity] = ??? val zeroFuture = Future.successful(()) def joinFuture(prevF: Future[Unit], entity: Entity): Future[Unit] = prevF .flatMap(_ => createEntity(entity)) // тут вторая Future .map( _ => ()) listEntities.foldLeft(zeroFuture)(joinFuture) Следующий createEntity выполняется после предыдущих. Зачем нужен zeroFuture - ну а вдруг список пустой. UPD: Попробую подробней расписать почему foldLeft, а не map. Сначала взглянем на map: val listOfFutures = list.map( entity => createEntity(entity)) map просто проходит по листу и вызывает создание Энтити. Он не ждёт пока создание завершится, он просто создаёт новую Future и идёт дальше к следующему элементу листа. Т.е. на каждой итерации нам нужно "нечто" что будет знать о том что на предыдущем шаге Энтити создался: val listOfFutures = list.map( entity => val prevEntityWasCreated = ??? // что-то, что знает о предыдущем Энтити // flatMap заставляет выполнятся ПОСЛЕ prevEntityWasCreated.flatMap(_ => createEntity(entity)) ) Т.е. проходимся по списку и на каждом этапе ждем пока завершиться предыдущий. Что-то подобное нам надо, верно? Точнее такое: val listOfFutures = list.map( (prevEntityWasCreated, entity) => prevEntityWasCreated.flatMap(_ => createEntity(entity)) ) Супер. Второй энтити ждет когда создастся первый, третий ждёт когда создастся второй. А чего ждёт первый? Надо создать пустую Future специально для первой этнити: val zeroFuture = Future.successful(()) val listOfFutures = list.map(zeroFuture)( (prevEntityWasCreated, entity) => prevEntityWasCreated.flatMap(_ => createEntity(entity)) ) Всё отлично, только тип не совпадает: val zeroFuture: Future[Unit] = Future.successful(()) val foo: Future[Entity] = prevEntityWasCreated.flatMap(_ => createEntity(entity)) Просто добавим map и изменим тип на одинаковый val zeroFuture: Future[Unit] = Future.successful(()) val foo: Future[Unit] = prevEntityWasCreated.flatMap(_ => createEntity(entity)).map( _ => ()) Последнии штрих - переименовать новую функцию в foldLeft. list.foldLeft(Future.successful(()))(( prevF, entity) => val foo: Future[Unit] = prevF .flatMap( _ => createEntity(entity)) .map( _ => ()) // возвращаем Future для следующего элемента foo )

Утечка памяти при многократном запуске потока

#java #многопоточность #memory_leaks


Доброго (CurrentTime) ,Столкнулся со странностью при многократном создании потока
и по завершению исполнения озу не освобождается, можете рассказать что тут происходит,
прошу извинений за вопрос тк новичок? 

public class MainClass {

public static void main(String[] args) throws InterruptedException {

    int i = 0;
    while (i < 100000) {
      TestThread test = new TestThread();
      test.start();
      i++;
    }

    System.gc();
    Thread.sleep(8000);

  }

}


Класс TestThread

public class TestThread extends Thread {

   public void run() {

    // Пустой

  }

}

    


Ответы

Ответ 1



Несколько возможных причин для такого поведения: Потоки не завершились на момент вызова System.gc. Потоки, хоть они ничего и не делают, требуют выделения ресурсов для запуска. Вы запускаете один за другим 100000 потоков, а затем вызываете сразу gc не дожидаясь их завершения. Часть потоков может быть не завершена на этот момент. Дождаться завершения работы потока можно с помощью Thread.join. Вызов System.gc не обязательно запускает сборщик мусора. Из документации к System.gc: Calling the gc method suggests that the Java Virtual Machine expend effort toward recycling unused objects in order to make the memory they currently occupy available for quick reuse. ... Вызов метода предлагает виртуальной машине Java приложить усилия для обработки неиспользуемых объектов, чтобы сделать память, которую они занимают, доступной для быстрого повторного использования. .... В общем, это рекомендация, которая не гарантирует сборку мусора. Сборка мусора произойдет когда виртуальная машина посчитает нужным. Можете еще почитать ответ на вопрос: «Как часто надо вызывать сборщик мусора?» Сборка мусора не обязательно освобождает память для ОС. Даже если сборка мусора запустится, нет никакой гарантии, что освобожденная память будет возвращена ОС для использования в других процессах. Освобождение памяти и выделение ее заново — ресурсоемкие задачи, которые могут оказать влияние на производительность клиентского (Вашего) кода. Поэтому разработчики JVM предусматривают сложные алгоритмы сборки мусора с минимальным влиянием на исполнение. В зависимости от настроек памяти JVM и используемого сборщика мусора память может быть сохранена для повторного использования Java (на очистку вообще не тратятся ресурсы) либо возвращена частично до определенного процентного порога (перераспределение памяти происходит в ограниченных масштабах). Подробнее о разных сборщиках мусора смотрите в документации к используемой Вами версии JVM. Можете также ознакомиться с обзорными статьями по теме: Статьи на сайте Oracle: Java HotSpot Garbage Collection; Теория и практика Java: Сборка мусора в HotSpot JVM; серия статей «Дюк, вынеси мусор!» на Хабре.

Сериализация сложного JAVA объекта в JSON

#java #json #сериализация


Добрый день подскажите как сериализовать в JSON объект Files? Используя метод toJsonString
сериализуются только поле nameDirectory, а поле pool выводится в виде хеша?

import org.json.simple.JSONValue;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;

public class Files {

    public Map pool;

    public String nameDirectory;

    public String toJsonString(){
        JSONObject JSobj = new JSONObject(pool);
        JSobj.toJSONString();
    }
}

public class File {
    String PathFile;
    ArrayList Records;
    boolean PutInEnd;
}

public class Record {

    private String recordname;
    private String status;
    private int countExecution;
}

    


Ответы

Ответ 1



Для таких целей есть специальные библиотеки - Jackson и Gson. import java.io.File; import java.io.IOException; import java.util.List; import java.util.ArrayList; import java.util.Map; import java.util.HashMap; import com.fasterxml.jackson.core.JsonGenerationException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.JsonMappingException; class Record { // Поле name и так находится в Record, // называть его recordname - это лишнее private String name; private String status; private int executionCount; public Record() {} public Record(String name, String status, int executionCount) { setName(name); setStatus(status); setExecutionCount(executionCount); } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setStatus(String status) { this.status = status; } public String getStatus() { return status; } public void setExecutionCount(int executionCount) { this.executionCount = executionCount; } public int getExecutionCount() { return executionCount; } } // Плохая идея использовать имена классов // входящих в стандартную библиотеку class SomeFile { private String path; // Имена полей должны начинаться со строчной буквы private List records; private boolean putInEnd; public SomeFile() { records = new ArrayList<>(); } public SomeFile(String path, boolean putInEnd) { this(); setPath(path); setPutInEnd(putInEnd); } public void setPath(String path) { this.path = path; } public String getPath() { return path; } public void setPutInEnd(boolean putInEnd) { this.putInEnd = putInEnd; } public void addRecord(Record record) { records.add(record); } public List getRecords() { return records; } } class SomeFiles { private String name; private Map pool; public SomeFiles() { pool = new HashMap<>(); } public SomeFiles(String name) { this(); setName(name); } public void setName(String name) { this.name = name; } public String getName() { return name; } public void putSomeFile(String name, SomeFile someFile) { pool.put(name, someFile); } public Map getPool() { return pool; } } public class App { public static void main(String[] args) { SomeFile f = new SomeFile("/root/secret.txt", false); f.addRecord(new Record("Some Record", "Some status", 42)); f.addRecord(new Record("Another Record", "Same status", 0)); SomeFiles sf = new SomeFiles("Some Files"); sf.putSomeFile("Some File", f); ObjectMapper mapper = new ObjectMapper(); // Для вывода с отступами mapper.enable(SerializationFeature.INDENT_OUTPUT); try { // Здесь происходит самая главная магия mapper.writeValue(new File("some_files.json"), sf); } catch(JsonGenerationException exc) { exc.printStackTrace(); } catch(JsonMappingException exc) { exc.printStackTrace(); } catch(IOException exc) { exc.printStackTrace(); } } } Получится такое: { "name" : "Some Files", "pool" : { "Some File" : { "path" : "/root/secret.txt", "records" : [ { "name" : "Some Record", "status" : "Some status", "executionCount" : 42 }, { "name" : "Another Record", "status" : "Same status", "executionCount" : 0 } ] } } }

Ответ 2



У вас 2 проблемы: Сериализация Map Сериализация File Если с первой более-менее все понятно - в рамках Gson решается приблизительно так: Map myMap; Type typeOfMap = new TypeToken>() { }.getType(); Gson gson = new GsonBuilder().create(); String json = gson.toJson(myMap, typeOfMap); Вторая проблема более концептуальная что-ли. Никто кроме вас не понимает, что вы имеете ввиду под сериализацией объекта типа File: или вы захотите просто сериализовать имя файла или имя файла включая полный путь или универсальный URI или же вообще содержимое файла. На этот вопрос кроме вас никто не ответит. Чтобы оформить свое отношение к сериализации объекта типа File вам нужно написать свой собственный сериалайзер - в терминах GSon это выглядит примерно так: public class MyFileAdapter implements JsonSerializer { @Override public JsonElement serialize(File src, Type typeOfSrc, JsonSerializationContext context) { //blah-blah } } } Далее надо известить Gson о том, что отныне объекты типа File будут обрабатываться вашим адаптером: GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.registerTypeAdapter(File.class, new MyFileAdapter());

SQL Server Management Studio (SSMS) не видит созданные таблицы

#sql_server


Недавно сел изучать БД и столкнулся с проблемой, что в созданные таблицы я не могу
ничего добавить и удалить их (потому что SSMS не видит эти объекты) 



Использую я Sql Server 2014 + SSMS версии 17 года (возможно проблема здесь ,но я
не понимаю как исправить)
    


Ответы

Ответ 1



SSMS не понимает в какой базе ему искать таблицу Customers. 1. Указать явно какую БД использовать с помощью use Добавить в начало запроса Use test_db; 2. Указать полный путь к БД в запросе drop table [test_db].[dbo].[Customers] 3. Указать БД test_db по-умолчанию для вашего пользователя Безопасность -> Имена входа -> Правой кнопкой по user_name -> Свойства -> База данных по умолчанию -> test_db В этом случае ваш вариант будет работать без изменений. UPD 4. Указать БД в панели "Редактор SQL"

Как сверстать блок c такими рамками?

#html #css




Есть идеи как сверстать фиксированный блок с такими рамками? Картинка сплошная, сделана
бекграундом. Пробовал таким образом, но при добавлении текста все ломается.



.block {
	display: inline-block;
	height: 318px;
}

.block-1 {
	box-sizing: border-box;
	width: 739px;
	padding: 35px;
	padding-right: 0;
	border: 3px solid #fff;
	border-right: none;
}

.block-2 {
	width: 198px;
	margin-left: -4px;
	border-bottom: 3px solid #fff;
}

.block-3 {
	width: 198px;
	margin-left: -3px;
	border: 3px solid #fff;
	border-left: none;
}


Ответы

Ответ 1



Если заведомо известно, что человек будет "под рамкой" только снизу или сверху, то сымитировать нижнюю или верхнюю рамку можно псевдоэлементами :before или :after соответственно: html, body { padding: 0px; margin: 0px; background: lightblue; } * { box-sizing: border-box; } .block { position: relative; max-width: 580px; margin: 50px auto; border: #fff solid 2px; border-bottom: none; padding: 40px 270px 40px 20px; } .block:after { display: block; content: ''; width: 100%; height: 2px; background: #fff; position: absolute; z-index: 2; left: 0px; bottom: 0px; } .block-text { color: #fff; font-size: 14px; line-height: 20px; } .block-img { position: absolute; z-index: 1; right: 10px; top: -40px; width: 250px; } .block-img img { width: 100%; }
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.


Дизассемблирование кода в codeblocks

#cpp #c #codeblocks


Здравствуйте!
Подскажите, пожалуйста, как дизассемблировать код в codeblocks?
    


Ответы

Ответ 1



Дебагер (gdb 8.0) из текущей поставки mingw-w64 (который i686-7.1.0-release-posix-dwarf-rt_v5-rev2.7z) при отладке С++ кода у меня зависает (при отладке С такого не наблюдается), возможно и у вас такая же проблема и поэтому окно Disassembly пустое. Попробуйте поставить рядом более старую версию mingw-w64 и указать в настройках CodeBlocks чтобы он использовал gdb из той сборки. Зайдите в настройки дебагера (Меню - Settings - Debugger), создайте новую конфигурацию (GDB/CDB Debugger - Create config) и укажите путь к нужному gdb.exe: Так же, CodeBlocks может выводить ассемблерный код в двух форматах AT&T и Intel. Это настраивается тут же, в свойствах дебагера - Choose diassembly flavor (GDB only). После того, как вы добавили новый дебагер, вы можете переключаться между ними через Меню - Debug - Active debuggers. Инструкция о том, как увидеть ассемблерный код: В качестве Build target выбрать Debug: Меню - Build - Select target - Debug Сделать Rebuild проекта: Меню - Build - Rebuild (Ctrl+F11) Если проект собрался успешно, поставить брекпоинт на строке кода и запустить отладку: Меню - Debug - Start /Continue (F8) После этого запустится дебагер и остановится на вашем брекпоинте. В этот момент и можно посмотреть дизассемблированный код: Меню - Debug - Debugging windows - Disassembly При этом, в логе на вкладке Debugger, будут примерно вот такие строчки: Starting debugger: C:\dev\mingw-w64_5.3.0\bin\gdb.exe -nx -fullname -quiet -args B:/test/bin/Debug/test.exe done Registered new type: wxString Registered new type: STL String Registered new type: STL Vector Setting breakpoints Debugger name and version: GNU gdb (GDB) 7.10.1 Child process PID: 4044 At B:\test\main.cpp:7

Разный css при обновлении страницы F5

#javascript #html #jquery #css


Веб дизайн только познаю,  хотя занимаюсь им давненько,  но понимаю что это бездна
знаний и вот по сути вопрос в чем.  Как сделать разный CSS при перезагрузке страницы?
 Разные иконки например,  что бы разным посетителям сайта показывались разные иконки.
 И при обновлении нажимая на F5 менялись стили иконок. 
??? 
    


Ответы

Ответ 1



На чистом JavaScript: var styles = ['blue', 'red', 'green']; // диапазон значений randomStyles('class', styles); // вызываем функцию "рандомных стилей" function randomStyles(sel, arr) { // sel - селектор, arr - диапазон значений var els = document.getElementsByClassName(sel), // получаем элементы с необходимым классом newArr = arr; // объявляем новый массив for (let i = 0; i < els.length; i++) { // перебираем все элементы с классом var randClass = newArr[Math.floor(Math.random() * newArr.length)]; // рандомное значение из массива els[i].classList.add('class-' + randClass); // добавляем элементу класс с полученным значением newArr.splice(newArr.indexOf(randClass), 1); // удаляем из массива подставленный класс, чтобы избежать повтора } } .class { width: 200px; height: 50px; margin-bottom: 10px; } .class-blue { background: blue; } .class-red { background: red; } .class-green { background: green; }
Этот же вариант на jQuery (производительность ниже, но вдруг кому-то пригодится): var styles = ['blue', 'red', 'green']; // диапазон значений randomStyles('.class', styles); // вызываем функцию "рандомных стилей" function randomStyles(sel, arr) { // sel - селектор, arr - диапазон значений var els = $(sel), // получаем элементы с необходимым классом newArr = arr; // объявляем новый массив els.each(function(id) { // перебираем все элементы с классом var randClass = newArr[Math.floor(Math.random() * newArr.length)]; // рандомное значение из массива $(this).addClass('class-' + randClass); // добавляем элементу класс с полученным значением newArr.splice($.inArray(randClass, newArr), 1); // удаляем из массива подставленный класс, чтобы избежать повтора }); } .class { width: 200px; height: 50px; margin-bottom: 10px; } .class-blue { background: blue; } .class-red { background: red; } .class-green { background: green; }


punycode. передача пременной из bash в python в функцию encode('idna')

#python #bash #encoding #python_27


существует файл py1 c следующим содержанием:

python -c "x=u'''$1''';  print x.encode('idna')"


буква u, в начале значения для переменной  - это попытка привести ввод в 
bash

./py1 подпись.рф


к следующему виду в python:

x=u"подпись.рф"


так вот, при вызове скрипта получаем следующий вывод:

~$ ./py1 а
xn--nba1k
~$ ./py1 апо
xn--34-eea4dwnbb5725d


но:

~$ ./py1 ф
Traceback (most recent call last):
File "", line 1, in 
File "/usr/lib/python2.7/encodings/idna.py", line 164, in encode
result.append(ToASCII(label))
File "/usr/lib/python2.7/encodings/idna.py", line 76, in ToASCII
label = nameprep(label)
File "/usr/lib/python2.7/encodings/idna.py", line 38, in nameprep
raise UnicodeError("Invalid character %r" % c)
UnicodeError: Invalid character u'\x84'


ошибка по-видимому в данном месте 

u'''$1'''


и возможно логичнее было бы воспользоваться sys.argv[] в python, однако я никак не
возьму в толк, как верно вставить полученную переменную в python из sys.agr в другую,
с параметром u перед строкой, пробовал следующий подход:

создается файл wpq1.py с нижеизложенным:

# -*- coding: UTF-8 -*-
import sys

x= unicode(sys.argv[1])
print x


затем вызывается в shell:

~$ python wpy1.py фырфырфыр
Traceback (most recent call last):
File "wpy1.py", line 5, in 
x= unicode(sys.argv[1])
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd1 
in position 0: ordinal not in range(128)

    


Ответы

Ответ 1



В Питоне 3 sys.argv уже как Unicode пришёл бы: $ python3 -c 'import sys; print(sys.argv[1].encode("idna").decode())' пример.рф xn--e1afmkfd.xn--p1ai В Питоне 2, самостоятельно аргументы командной строки из байт в текст декодировать необходимо. Для этого нужно выбрать кодировку. Для системных строк: argv, переменных окружения, путей можно sys.getfilesystemencoding() кодировку использовать (с оговорками): $ python2 -c 'import sys; print sys.argv[1].decode(sys.getfilesystemencoding()).encode("idna")' пример.рф xn--e1afmkfd.xn--p1ai На Linux sys.getfilesystemencoding() от локали зависит. Подробнее Как работать с путями c русскими символами? В общем случае, системные строки это почти произвольный набор байт, который не всегда как текст можно интерпретировать, поэтому существует surrogateescape обработчик ошибок, который также может активироваться на Python 3, если локаль не настроена (или неверно настроена): $ LC_ALL=C python3 -c 'import sys; print(sys.argv[1].encode("idna").decode())' пример.рф Traceback (most recent call last): File "/usr/lib/python3.5/encodings/idna.py", line 181, in encode result.extend(ToASCII(label)) File "/usr/lib/python3.5/encodings/idna.py", line 76, in ToASCII label = nameprep(label) File "/usr/lib/python3.5/encodings/idna.py", line 38, in nameprep raise UnicodeError("Invalid character %r" % c) UnicodeError: Invalid character '\udcd0' Локаль по умолчанию (поломанные или вообще отсутствующие настройки) подразумевает ascii кодировку (С, POSIX). Поэтому при запуске init-скриптов (сервисы), при заходе по ssh, в cron-скриптах, убедитесь что локаль c нужной кодировкой определена, чтобы не-ascii содержимое такое как IDN обрабатывать. Иначе ошибку получите: $ LC_ALL=C python2 -c 'import sys; print sys.argv[1].decode(sys.getfilesystemencoding()).encode("idna")' пример.рф Traceback (most recent call last): File "", line 1, in UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128) Если вы решите жёстко прописать кодировку такую как utf-8, то будьте уверены на 100%, что имена доменов у вас всегда всегда в этой кодировке генерируются в окружении, где вы запускаете ваш Питон-скрипт. Иначе или UnicodeDecodeError или хуже кракозябры получите, что приведёт к генерации неверного punycode (что вы можете не сразу заметить, что удорожает исправление ошибки).

Ответ 2



Не особо много знаю о пайтоне, но, погуглив документацию, заметил, что функция unicode имеет второй параметр для указания кодировки. Так что вот такой вариант рабоает в моей консоли (Ubuntu 16.04, UTF-8): import sys x = unicode(sys.argv[1], 'utf-8') print x print x.encode('idna')

Длина адреса переменной (указателя)

#cpp #указатели


short int a;
short int *pa;
pa = &a;
*pa = 10;
cout << "a  = " << a << endl; //a  = 10
cout.setf(ios::hex);
cout << "&a = " << &a;        //&a = 0x7ffc079b67ae


Неужели short int хватает чтобы записать такой длинный адрес переменной? Насколько
мне известно, адреса должны выглядеть примерно так 0x7ffc079b67ae. Неужели short int
хватает чтобы записать такой адрес, или запись адреса в указатель происходит каким-то
другим образом? Объясните, пожалуйста, кто разбирается. Или это происходит как-то по
какой-то ссылке на указатель?
    


Ответы

Ответ 1



Проведем аналогию - адрес на конверте в общем-то, всегда одного размера, указываете ли вы на небоскреб или на собачью будку :) Т.е. размер указателя не связан с размером того, на что он указывает. А чтобы понять, какого конкретно размера ваш указатель, добавьте в программу следующие строки: cout << "Размер a = " << sizeof(a) << " байт\n"; cout << "Размер pa = " << sizeof(pa) << " байт\n"; и посмотрите, что они выведут.