Страницы

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

суббота, 9 марта 2019 г.

Преобразование SVG в векторные PDF,PS

Добрый день, сообщество! Что имеется: программно сформированный на сервере валидный SVG, внутри в основном path. Серверный код на php, поэтому решение предпочтительно для php. Что требуется: получить PDF, PS, а также PSD(по возможности) содержащие ВЕКТОРНЫЙ рисунок такой же как в исходном SVG. В случае PDF это будет встроенный SVG, для остальных не знаю. Что пробовал: MagickWand(ImageMagick) - с удовольствием конвертирует, практически что угодно и во что угодно, особенно удачно получается PNG (даже с прозрачностью). Но есть одна большая проблема, которая все плюсы сводит на нет. При конвертации SVG в PDF, EPS, PS, PSD, растрирует исходный рисунок. Что уже посмотрел: но не совсем разобрался: 1. Apache Batik, не совсем понятно как работать и что будет на выходе. Можно конечно через exec запускать яву, но как к этому отнесется хостер, пока не известно. Apache FOP, очень интересный инструмент, уже практически разобрался со всеми преобразованиями и почти получил файл .fo, все примитивы преобразуются кроме, нужного path, которого, почему-то не было в найденной схеме. И что дальше делать, снова exec и java? В общем, может кто уже сталкивался с подобной темой, буду очень благодарен за инфу.


Ответ

Обратите внимание на TCPDF TCPDF является PHP-классом генерации PDF-документов, не требующим внешних расширений. Этот класс встраивает SVG непосредственно в векторном виде в PDF, но при желании можно и преобразовать его в растр с помощью того же ImageMagic. Пример использования класса. Пример полученного PDF-документа с SVG-графикой.

Нужен видео компрессор, совместимый с DirectShow.

Сам я разрабатываю приложение, в котором доступна запись с web-камеры. (Visual Studio 2008, C#) Требуемый размер сжатия: примерно 10 сек = 1 мб. Из тех компрессоров, что нашел я, подходит только один из DivX Codec pack, но он, судя по всему, платный + ставится только в комплекте с кучей всякого ненужного лично мне мусора через DivXInstaller.exe. Хотя в DivX Control Panel напротив кодеков написано: trial 15 days left. И эти 15 days у меня висят уже недели две… Еще есть неплохой вариант: VP40® Compressor. Степень сжатия, где-то 1 секунда – 1 мб. С ним есть непонятные проблемы на Windows XP, что именно там переклинило, я не знаю, но видео не записывается. Буду разбираться. Сам я тестирую на Windows 7. Те вопросы, который есть у меня сейчас: Есть ли нормальный установщик для DivX, который установит только кодеки для видео, а не будет тащить 200 мб из сети? Какие есть другие хорошие видео компрессоры, совместимые с DirectShow? Те, что есть по умолчанию (всякие Microsoft Video 1, DV Video Encoder, и.т.п ) обладают либо совершенно смешной степенью сжатия, либо очень плохим качеством записанного видео. Ну и да, компрессор должен быть бесплатным.


Ответ

Ну что ж, подведем некоторые итоги. По результатам тестов, был выбран VP40® Compressor для Windows 7 и Windows Vista. На Win XP, как оказалось, этот компрессор не работает, лол )). Для Windows XP пришлось выбрать компромиссный вариант: Microsoft Video 1. Качество записанного видео конечно у него ахавое. Ответы со StackOverflow не помогли )). Всем спасибо.

Имя конструктора объекта

Доброго времени суток, вопрос исключительно в познавательных целях: var DomAPICanvas = document.createElement("canvas"); var jQueryCanvas = $("");
console.log(DomAPICanvas.constructor); // HTMLElementCanvas function console.log(jQueryCanvas.constructor); // JQuery function Собственно я прекрасно понимаю, почему jQueryCanvas.constructor ведет себя именно таким образом (chaining), меня интересует следующее: есть ли возможность получить настоящее значения конструктора? И если да, то как?


Ответ

Настоящее значение конструктора можно получить только имея доступ к оригинальному обьекту/элементу. ( $("")[0] ) То есть код будет выглядеть так: var DomAPICanvas = document.createElement("canvas"); var jQueryCanvas = $("");
console.log(DomAPICanvas.constructor); // HTMLElementCanvas function console.log(jQueryCanvas[0].constructor); // HTMLElementCanvas function

Анимированный интерактивный favicon

Интересует такой вопрос, каким образом сделана favicon на сайте megalyrics.ru, когда запускаешь какой-нибудь трек? Изначально мысль была, что через js/php генерится статический изображение эквалайзера, и заменяется. Но, разные пользователи слушают разные треки и к тому же браузер это дело хорошо кеширует, потому явно не так происходит. К тому же это ж сколько в день миллиардов генерации изображения, пусть даже такого маленького. Есть у кого какие идеи? UPD Нашел такое, вроде то, что нужно, но все-же получается сколько изображений должно генериться в плане эквалайзера....


Ответ

Во время проигрывания трека favicon подменяется при помощи JavaScript. Однако вместо полноценных ссылок используется трюк с префиксом "data:". Т.е. во время проигрывания с определенным интервалом генерируется favicon сл. вида:

Сами данные картинки могут как генерироваться на JS, так и загружаться сразу все возможные варианты с сервера (если не ошибаюсь, там получается всего 64 варианта, 2 колонки по 8 делений)
PS Парсер не может разобрать вторую ссылку. http://ru.wikipedia.org/wiki/Data:_URL

Как узнать оперативную память занятую процессом

Доброго времени суток! Вопрос такой, надо узнать оперативую память занятую процессом по PID. Желательно командой, и желательно, что бы результат выводился только в виде занятой памяти без посторонней информации.


Ответ

В принципе у top есть пара полезных опций, например top -b -n 1 -p 1184 выведет один раз информацию о процессе 1184 и завершится. Но все равно он читает данные из /proc, поэтому лучше и удобнее смотреть там

Работа с буфером обмена

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


Ответ

Например так: if( OpenClipboard(NULL) ) { char* data = (char*)GetClipboardData(CF_TEXT); if(data) ;//делай что хочешь с данными, например - выводи на консоль CloseClipboard();
} Если же надо не просто вывести что УЖЕ скопировано, а найти окно эдита (вообще то в ворде уже и не эдит наверно) и взять текст оттуда, то это задача сложнее, но тоже вполне разрешимая. Можешь юзать FindWindow и FindWindowEx и снять текст с помощью GetWindowText, но тогда копировать в буфер и не обязательно, можешь прямо оттуда в консоль

Поиск по вхождению строки в django + haystack + Whoosh

Имеется некая модель. В ней хранятся названия фильмов. Вот класс индекса: from haystack import indexes from kino.films.models import Films
class FilmsIndex(indexes.SearchIndex, indexes.Indexable): text = indexes.CharField(document=True, use_template=True) rusname = indexes.CharField(model_attr='rusname') origname = indexes.CharField(model_attr='origname') year = indexes.IntegerField(model_attr='year')
def get_model(self): return Films Индекс создаётся и всё почти работает, но не совсем так как надо. Запрос вида SearchQuerySet().filter(content='avatar') возвращает то, что нужно, а вида SearchQuerySet().filter(content='avat') не возвращает ничего. Что я делаю не так?


Ответ

Ничего. А точнее вы все делаете правильно. Сам на этом накололся, когда делал через хайстэк автокомплит в поиске. Whoosh просто "полнотекстовый" поиск с минимальной морфологией. Для поиска вхождений вам надо пользоваться классическим like'ом. UPDATE Каюсь, я вас обманул. Решил все-таки нагуглить, чтобы не ударить в грязь лицом. И вот что нашлось. У хайстэка есть специальный метод autocomplete как раз для этого. import datetime from haystack import indexes from myapp.models import Note
class NoteIndex(indexes.SearchIndex, indexes.Indexable): text = indexes.CharField(document=True, use_template=True) author = indexes.CharField(model_attr='user') pub_date = indexes.DateTimeField(model_attr='pub_date') # We add this for autocomplete. content_auto = indexes.EdgeNgramField(model_attr='content')
def get_model(self): return Note
def index_queryset(self): """Used when the entire index for model is updated.""" return Note.objects.filter(pub_date__lte=datetime.datetime.now()) И собственно сам поиск from haystack.query import SearchQuerySet
SearchQuerySet().autocomplete(content_auto='old') # Result match things like 'goldfish', 'cuckold' & 'older'. Источник

Многопоточный перебор массива

Здравствуйте. Есть следующий код, который загружает файл со словами в массив, допустим, содержание файла такое: Привет Пока Магазин Телефон Монитор .... // и т.д. Очень много слов Нужно сделать потоки для этого кода. Я пока не разобрался, как. class Test {
static string Text; static string[] ReadFile; static int Threads;
static void Main() {
Console.Write("Введите слово которое необходимо проверить: "); Text = Console.ReadLine();
Console.Write("Введите количество потоков: "); Threads = Convert.ToInt32(Console.ReadLine());
ReadFile = System.IO.File.ReadAllLines("slova.txt");
for (int i = 0; i < Threads; i++) // ну типо потоки запускаем { (new Thread(new ThreadStart(Slova))).Start(); } }
static void Slova() {
for (int i = 0; i < ReadFile.Length; i++) { if (ReadFile[i] == Text) { Console.Write("Слово " + Text + " успешно найдено в файле " + ReadFile); } } } } Дело в том, что этот код находит строку в файле и сверяет её с переменной Text столько раз, сколько установлено потоков, то есть если потоков 50, то он возьмет первую строку из файла и проверит её 50 раз, далее вторую и так далее, и сообщение о нахождении строки тоже 50 раз. Можно сделать в место for foreach (string textline in ReadFile) { .. } // тоже самое будет Как это исправить? Чтобы потоки хорошо работали. Я не очень разбираюсь в C#. Помогите, пожалуйста.


Ответ

Вы запускаете на каждую итерацию цикла новый поток. Вот и получается 50 потоков. Используйте готовый мультипотоковый цикл. Parallel.For(0, length, i => { // Тело цикла. }); подробней о Parallel.For Или разделите цикл на N частей по длине и в каждой создайте поток. Получите N-поточный цикл.

Код стандартного метода или класса в .NET

Можно ли посмотреть, как реализован тот или иной стандартный метод или класс в .NET? Например, я использую ArrayList и мне хочется видеть исходный код реализации, чтобы лучше понимать, как он устроен. Желательно, чтобы можно было сразу из IDE это видеть.


Ответ

У ReSharper и Reflector есть соответствующие плагины для Visual Studio

Как увидеть разницу между stateless и stateful session-бинами в EJB?

По идее, stateless бин не должен сохранять своё состояние (значения своих полей) после завершения запроса. Например, вызов метода GetSum(13) каждый раз должен возвращать "13". import javax.ejb.*; import javax.jws.*;
@Stateless @WebService(endpointInterface = "ITestWebService") public class TestWebService implements ITestWebService { private double sum = 0.0;
@Override public double GetSum( double a ) { this.sum += a; return sum; } } Но повторный вызов возвращает 13, 26, 39, ... Я неправильно понимаю stateless или можно грешить на сервер приложений?


Ответ

Stateless означает, что бин не держит состояние между сессиями. То есть надо "убить" бин чтобы увидеть что он не сохраняет свое внутреннее состояние.

Авторизация и сессии в django и piston

Доброе время! Имею urls.py: auth = JSONAuthentication() user_handler = Resource(UserHandler, auth)
urlpatterns = patterns('', url(r'^login/$', user_handler, { 'emitter_format': 'json' }), ) Авторизация работает как. Сначала challenge 401, отправляю username и password, request.user устанавливается какой нужно. дальше в handlers.py: class UserHandler(BaseHandler): allowed_methods = ('POST',) def create(self, request): auth.login(request, request.user) return {u'user':unicode(request.user)} т.е. делаю login, django в auth.login пишет request.session['_auth_user_id']=user.id, далее оно сохраняется в базу сессий. С этим всем хозяйством разобрался, отдебажил. Дальше в браузере жму F5, ожидаю, что сессия (длиной в неделю) сохранится и request.user заполнится по имеющейся сессии... Срабатывает опять авторизация, в авторизации предварительно ищу юзера в сессии: class JSONAuthentication(object): .... def is_authenticated(self, request): user = auth.get_user(request) .... И вот тут оказывается, что auth.get_user ищет в сессии request.session['_auth_user_id'], которой там нет, и отваливается. В сессии на этот момент есть только sessionid=<правильная сессия>, по которой надо получить сессию из базы - по коду оно дальше - и там уже user_id будет и проч... Вот я думаю, либо неправильно что-то делаю, либо что-то не допилил. ЗЫ используется связка python 2.7, django 1.3, piston (rest), pymongo (база), mango (хранение сессий и юзеров в mongodb) UPD Проблему решить удалось, осталось выяснить чей косяк. Мой или pymongo :)


Ответ

Проблему удалось решить двумя способами. Сложный. Проблема была в том, что сессия не восстанавливалась (обращение в auth.get_user к request.session['_auth_user_id'] вызывало восстановление сессии). При восстановлении возникало исключение UnicodeEncodeError в pymongo'вском bson.Objectid, который pymongo не обрабатывают (обработывается только UnicodeDecodeError, т.е. зеркальный эксепшин). Добавление в __setstate__ дополнительного UncodeEncodeError в секцию except решало проблему. Написал краткий тест с минимальными вызовами для выявления бага, в шелле он отрабатывал как надо, а в eclipse при отладке в частности валился, притом молчаливо - except перекрывал исключение, но не обратывал его. Пытался даже с pymongo'вцами разобраться, у них тоже в шелле все прекрасно работало. Оттуда выяснился более простой метод "исправления". Простой метод основан на том, что pydev в eclipse при старте приложения устанавливает свои параметры консоли, в частности меняет дефолтную кодировку (которая указывается в настройках pydev'а). Из-за нее-то и возникала проблема. У меня стояла в настройках cp1251, а в шелле - ascii, при которой работало все. Установил в настройках pydev'а ascii (utf-8 тоже можно как оказалось) и все заработало. В инете много где пишут про этот баг, мол setdefaultencoding - evil, evil, evil и в частности про pydev этим занимающийся в частности. Относительно pymongo, не знаю баг ли это в pymongo - то, что при одной дефолтной кодировке работает, при другой не хочет, решать им конечно, но имхо, стоит добавить этот злосчастный UnicodeEncodeError, хотя я видимо был бы единственным, кого это коснулось. UPD Разработчики pymongo признали такое поведение как ошибку, связанную с кодировками, используемыми в настройках сайта. В транк внесены изменения, убрана заглушка от ошибки преобразования из неизвестной кодировки в latin-1. Внесена корректная проверка значения, восстанавливаемого через pickle. В общем рад, что смог помочь выяснить причины, что привело к более правильному коду.

API для управления полноэкранным режимом

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


Ответ

Native Fullscreen JavaScript API (plus jQuery plugin)

Скачать файл с помощью AJAX

Добрый день. Ситуация такая: Есть сервер. На нем есть ссылка нажав на которую происходит генерация контента (перегоняется DJVU в TIFF) и выдается TIFF файл. Генерация происходит долго. До минуты (все это время в браузере пишется "Ожидание %host%"). Затем вылазит окошко "сохранить как" и готовый файл скачивается. Вопрос: можно ли как-то на время генерации (от клика до окна "сохранить как") выводит информационное сообщение (к примеру крутить ГИФку от начала, а по окну - убрать ее)? Хотелось бы, по возможности, через jQuery AJAX. Но создаю я AJAX запрос посылаю его, возвращается ответ, срабатывает success, но "сохранить как" не происходит. Можно ли как-то ему объяснить, что неплохо было бы сохранить все это? Надеюсь понятно объяснил. Спасибо за ответы и за участие. UPD С сервера идет картинка TIFF. Но идет она через минуту. Эту минуту надо отловить. Если применить такой код $.post(URL, PARAMS, function(data) { alert(data.length); }); То по запросу можно ГИФ включить, по success закрыть, но как заставить его пришедшую data сохранить в файл? Alert вываливается и все. Инфу надо как-то дальше сохранить. Если использовать старый способ отправки через FORM то происходит смена URL на файл и отловить появление "save as" не представляю как.


Ответ

Может Вам подойдёт такое решение: Вы со страницы вызываете ajax запрос на генерацию картинку, и в фоне ждете ответ, но в ответе вы отдаёте не саму картинку, а ссылку на неё, и в методе success прописываете location=data $.ajax({url:"you url for generation"}).success(function(data){ location = data; }); Точнее наверное надо создать новое окно с этим локейшеном: window.open(data,'','…'); Ну и соответственно всякие крутилки включаете и выключаете перед вызовом аякса и в суксессе. Через фреймы всё прекрасно отлавливается: можно посмотреть здесь HTML

JS $(document).ready( function(){ $("button").click(function(){ $("#loader").text("Loading..."); $("iframe").ready(function(){$("#loader").text("Loading... started...");}); $("iframe").load(function(){$("#loader").text("Loaded!");}); $("iframe").attr("src","http://jfarcand.files.wordpress.com/2012/05/untitled.jpg"); }); } );​

Обучение нейронных сетей с помощью алгоритма обратного распространения ошибки

Здравствуйте. Пытался реализовать вот этот алгоритм http://robocraft.ru/blog/algorithm/560.html однако когда провел обучение сети, обнаружил, что выходные данные даже близко не соответствуют действительности. Где же я допустил ошибку? Или алгоритм по ссылке неправильный? Помогите разобраться. double OpenNNL::_changeWeightsByBP(double * trainingInputs, double *trainingOutputs, double speed, double sample_weight) { double * localGradients = new double[_neuronsCount]; double * outputs = new double[_neuronsCount]; double * derivatives = new double[_neuronsCount];
calculateNeuronsOutputsAndDerivatives(trainingInputs, outputs, derivatives);
for(int j=0;j<_neuronsPerLayerCount[_layersCount-1];j++) { localGradients[indexByLayerAndNeuron(_layersCount-1, j)] = trainingOutputs[j] - outputs[indexByLayerAndNeuron(_layersCount-1, j)]; }
if(_layersCount > 1) { for(int i=_layersCount-2;i>=0;i--) { for(int j=0;j<_neuronsPerLayerCount[i];j++) { localGradients[indexByLayerAndNeuron(i, j)] = 0;
for(int k=0;k<_neuronsPerLayerCount[i+1];k++) { localGradients[indexByLayerAndNeuron(i, j)] += _neuronsInputsWeights[indexByLayerNeuronAndInput(i+1, k, j)] * localGradients[indexByLayerAndNeuron(i+1, k)]; } } } }
for(int j=0;j<_neuronsPerLayerCount[0];j++) { for(int k=0;k<_inputsCount;k++) { _neuronsInputsWeights[indexByLayerNeuronAndInput(0, j, k)] += speed * localGradients[indexByLayerAndNeuron(0, j)] * derivatives[indexByLayerAndNeuron(0, j)] * trainingInputs[k]; } }
for(int i=1;i<_layersCount;i++) { for(int j=0;j<_neuronsPerLayerCount[i];j++) { for(int k=0;k<_neuronsPerLayerCount[i-1];k++) { _neuronsInputsWeights[indexByLayerNeuronAndInput(i, j, k)] += speed * localGradients[indexByLayerAndNeuron(i, j)] * derivatives[indexByLayerAndNeuron(i, j)] * outputs[indexByLayerAndNeuron(i, j)]; } } }
delete[] localGradients; delete[] outputs; delete[] derivatives; } И в том алгоритме не сказано, как настраивать смещения нейронов. Может кто-нибудь подсказать как это делать? Если вам понадобится полный код, то он здесь: https://github.com/NicholasShatokhin/OpenNNL


Ответ

ох, нашел ошибку. В последнем цикле нужно было вместо outputs[indexByLayerAndNeuron(i, j)]; написать: outputs[indexByLayerAndNeuron(i-1, k)]; Все беды от невнимательности.

Как проверять слова Русского языка?

Для игры типа «Эрудита» надо проверять, есть ли составленное игроком слово в словаре, и соответствует ли оно требованиям: именительный падеж, единственное число. Наверное, достаточно раздобыть текстовый файл со словами через разделитель, и в нём искать. Кстати, может, есть некий формат, более удобный для поиска? Дерево, сортировка, всё такое? Основной вопрос — как расширить набор правил? Разрешить, например, все падежи, множественное число, глаголы во всех временах.


Ответ

На мой взгляд, какого-то лёгкого или средней сложности способа вы врядли найдёте. Разве что, пропишите все возможные варианты в БД или файле. С падежами - проще. Можно было бы прописать корни слов и отдельно возможные суфиксы, окончания слов и т.д. Но и тут засада. Возьмём для примера слова "хэшкод" и "конь". Как проверить правильность написанных слов, если в дательном падеже первое слово будет "хэшкодУ", а второе - "конЮ"? Вопрос риторический. С глаголами и их временами ещё печальней. Берём: "ехать" и "идти". В неопределенном времени (1-е лицо) получаем "езжу" и "хожу". Тут даже логики не просматривается.
Вывод: "Велик и могуч русский язык, но под PHP не заточен".
P.S. Кстати, тут неподалеку есть еще один форум (Русский язык). Возможно, что там могут кое-что дельное подсказать.

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

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


Ответ

Все верно - ваш тест не должен зависеть от конфигурации и быть "полу" автоматическим. Скорее всего у вас сильно связанный код. Разделите на два метода - нормальное выполнение, и аварийное(скорее всего, метод с выбросом Exception). Тогда их можно будет проверить отдельно. Был бы код, объяснил бы с примером :)

Как изменить язык системы в windows программно?

Система windows server 2008 rc2 Вызовы setlocale(LC_ALL,"Rus"); setlocale( LC_ALL, "ru_RU.CP1251" ); std::system("chcp 1251");
не прокатывают Функция GetACP() (из winnls.h) возвращает 1252, а должна 1251. Если вручную изменить язык системы Панель управления - Часы, язык и регион - язык и региональные стандарты - дополнительно - язык программ не поддерживающих юникод. на русский то GetACP() возвращает 1251. Есть ли возможность это сделать? Можно ли это сделать без подключения не стандартных библиотек?


Ответ

Changing Non-Unicode programmatically to Russian Вам нужна ф-ция NtSetDefaultLocale. Из доступного пользователю интерфейса библиотек Windows наиболее подходит SetLocaleInfo, но по описанию она слишком слабовата будет для Вашей задачи =( P.S. Нашел! Попробуйте SystemParametersInfo с SPI_SETDEFAULTINPUTLANG. Никогда бы не догадался!!!

Двойной вызов конструктора глобального статического объекта?

В прекомпилированном заголовке создается статический объект. #pragma once
#include #include #include #include
class globale { public: int A; globale::globale() { A++; std::cout << "
1"; std::cout << "
A=" << A; } }; static globale object_; Главный код: #include "stdafx.h"
int main() { std::cout << "


object_.A=" << object_.A; std::cout << "
"; std::system("pause"); } В итоге globale object_; формируется дважды. То есть дважды вызывается конструктор. Если переместить static globale object_; после #include "stdafx.h" то всё нормально. Это вызов одного и того же объекта? Почему так происходит? Можно ли это исправить?


Ответ

Какие cpp-файлы есть в проекте? Если есть stdafx.cpp, то я буду не удивлен созданию двух разных статических объектов: по одному на каждый cpp-файл проекта. Решение - переместить определение статического объекта в cpp-файл. Если требуется использование этого объекта в других файлах проекта, то необходимо переписать код. Например, использовать ключевое слово extern, говорящее компилятору искать данный символ в других файлах, а не в текущем.

Формирование правильного массива

Всем привет! Уважаемое сообщество, помогите, зашел в тупик :(. Расскажу с начало суть того что я делаю. 1) Создание DOM из URL с помощью библиотеки PHP Simple HTML DOM Parser Manual. include ('SimpleHTMLDOM/simple_html_dom.php'); $html = file_get_html('http://fondbirzha.ru'); 2) Получение наименования публикации $array_nameNews = array(); foreach($html->find('div.narrow_column div h2 a') as $element) { $nameNews = $element->innertext; $nameNews = iconv( "UTF-8", "windows-1251", $nameNews);
// наполняем массив $array_nameNews[] = $nameNews; } 3) Получение даты публикации $array_dateNews = array(); foreach($html->find('div.narrow_column div div.postdate') as $element) { $dateNews = $element->innertext; // меняем кодировку $dateNews = iconv( "UTF-8", "windows-1251", $dateNews); // Обрезаем полученную дату вида "Опубликовано Ноябрь 26th, 2012 Автор Анастасия" $dateNews = preg_replace('/^(.*?\s)(.*?\s.*?,\s.*?\s)(.*?\s.*?)$/', '$2', $dateNews); // Уберем лишние символы "st," и "th," $dateNews = preg_replace('/^(.*?\s)(\d{1,2})(st,|th,)(\s\d{4})/', '$1$2$4', $dateNews);
// Поскольку название месяца получаем на русском языке, а дату для вставки в инфоблок необходимо представить в формате дд.мм.гггг создаем два шаблона $searchPattern и $replacePattern $searchPattern = array("Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"); $replacePattern = array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
// Заменяем русское название месяца на английское $newFormatDate = str_replace($searchPattern, $replacePattern, $dateNews);
// Преобразовываем строку в дату и приводим к виду "d.m.Y" $dateres = date("d.m.Y", strtotime($newFormatDate));
// наполняем массив $array_dateNews[] = $dateres; } 4) Получение полного описания публикации foreach($html->find('div.narrow_column div div.entry p.postinfo') as $tmp)$tmp->outertext = ''; // из результата делаем новый отбор if(count($html->find('div.narrow_column div div.entry'))){ // Ищем полное описание новости // похожий принцип отбора селекторов как в jQuery, в нашем случае ищем "div.narrow_column div div.entry" $array_textNews = array(); foreach($html->find('div.narrow_column div div.entry') as $element) { $contentNews = $element->outertext; $contentNews = iconv( "UTF-8", "windows-1251", $contentNews);
// наполняем массив $array_textNews[] = $contentNews; } } 5) РЕАЛИЗУЕМ СРАВНЕНИЕ ДВУХ МАССИВОВ - для чего? Вот собственно для того, чтобы отсечь совпадение записей в БД и новых которые получили с сайта http://fondbirzha.ru/. Сравнение я делал по имени публикации. $total = $result;
$totalArr = Array();
for ($i = 0; $i <= $total; $i++) { /* Берем первый элемент массива $array_nameNews и сравниваем его с каждым элементом массива $secondArr, если схождение найдено тогда берем следующий элемент массива $array_nameNews и снова ищем схождение, если схождение ненайдено значит помещаем этот элемент в новый массив */
$firstCharArr = array($array_nameNews[$i]);
$result = array_diff($firstCharArr, $secondArr);
if ($result) { $a = $result;
foreach($result as $key => $values){ $arResult = Array(); $arResult['NAME'] = $values; } array_push($totalArr, $arResult['NAME']); } } 6) Теперь после того как сравнили два массива мы получили третий массив и его нужно вставить в БД, но тут одно НО, поскольку сравнивал я имена массивов значит мне нужно получить теперь полное описание публикации, т.е. каждому элементу массива с именем присоединить ДАТУ и ПОЛНОЕ ОПИСАНИЕ, и каждому свое соответственно, вот здесь то я зашел в тупик. Я этот функционал сделал, и он работает, но неверно, он берет и подставляет неверное значение, т.е. просто тупо по порядку, а мне нужно каждому и соответствующее значение. $formatted = array();
// Создаем массив с данными полученный путем отбора необходимой нам информации foreach ($totalArr as $key => $news) { $one_piece = array(); $one_piece['NAME'] = $news; $one_piece['DATE'] = $array_dateNews[$key]; $one_piece['TEXT'] = $array_textNews[$key]; $formatted[] = $one_piece; } Коллеги, помогите пожалуйста, заранее благодарен!!!


Ответ

$key в последнем сегменте не указывает на соответствующий элемент в $array\_dateNews и $array\_textNews. Это просто индекс от 0 до count($totalArr)-1. Полагаю название, дату и описание нужно хранить в одном массиве. А еще array\_diff справится с вычитанием и без цикла: array\_diff($array\_nameNews, $secondArr)

Добавление собственных провайдеров учетных записей в Windows Phone

Приобрел недавно девайс на базе Windows Phone 8, и заметил интересную вещь. В системных настроках есть возможность привязки различных учетных записей - Windows Live, Twitter, Facebook, Skype для последующей синхронизации контактов и прочего. Также на телефонах от Nokia (под управление Windows Phone 7.5) есть возможность подключения учетных записей Nokia, и T-Mobile (телефон куплен в Германии). Выглядит это примерно так: Каким образом можно добавить сюда собственный провайдер для последующей сихронизации контактов? Покопавшись на MSDN нашел упоминание о возможности создания Contact Store для своего приложения, с возможностью отображения контактов в общем, системном списке. Но там ни слова о системной странице настроек! С примерами тоже крайне скудно. Может кто-то сталкивался?


Ответ

Действительно, в Windows Phone 8 приложение может создавать и изменять свои собственные контакты. Эти контакты впоследствии видны в People Hub. При этом вы можете управлять, будут ли доступны контакты для редактирования в People Hub, а также могут ли другие приложения читать полную информацию о контактах. "Добавлять" такие приложения с собственными контактами из страницы настроек нельзя. По поводу примеров — вот тут есть базовые примеры: http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj207024(v=vs.105).aspx Хорошие и полные примеры работы с контактами есть в этой книге: Windows Phone 8 Development Internals

Как проверить, что поток NSThread заблокирован?

Давно хотел узнать, возможно ли для тестирования (unit testing) сделать следующее: Можно ли добавить в NSThread метод, который будет показывать, заблокирован (остановлен) ли данный поток или нет? Я предполагаю, что, если эта задача в принципе решается, было бы удобно сделать отдельную категорию NSThread+IsBlocked, содержащую такой метод и вполне достойную своего отдельного репозитория на Github ;) Прямо сейчас я занимаюсь NSCondition - вот цепь вызовов, которую для остановки потока делает -[NSCondition wait]: [NSCondition wait] pthread_cond_wait$UNIX2003 _pthread_cond_wait __psynch_cvwait Кроме NSCondition есть множество других способов блокировать/останавливать потоки NSThread: dispatch semaphores, NSConditionLock, [NSThread sleepForTimeInterval:] и т.п. - я знаю Objective-C лишь на уровне iOS-разработчика, поэтому не имею представления, возможно ли написать такой метод, который будет показывать факт блокировки потока сразу для всех этих способов. Буду признателен даже за метод, работающий только с NSCondition и __psynch_cvwait. Вот простой пример того, чего я хотел бы добиться (искомый метод - isBlocked): // Some test case // ...
__block NSThread *thread; NSCondition *condition = [NSCondition alloc] init];
dispatch_async(someQueue(), ^{ thread = NSThread.currentThread;
[condition lock]; [condition wait]; [condition unlock]; });
while(1) { NSLog(@"Thread is blocked: %d", thread.isBlocked); } Я не знаток чистого C и POSIX threads, поэтому, если знаете ответ, сделайте его, пожалуйста, развёрнутым. Примечание: речь идёт именно о блокировании (остановке) потока, а не о проверке isLocked вроде "Находимся ли мы @synchronized {}?"


Ответ

Мир - Россия 1:0 - ответ получен в топике, который параллельно с этим был открыт мной на SO: Is it possible to check if an NSThread is blocked?.
Там см. принятый ответ. Очень изящное решение для NSCondition.
Заодно показывающее, как можно красиво модифицировать поведение классов, подменяя методы друг другом (по логике отдалённо напоминает alias_method_chain в Ruby).

Кривая Безье произвольного порядка.

Товарищи программисты-математики, отдаю на ваш справедливый суд данный класс. Некоторые очевидные методы, вроде lineTo я убрал, чтобы не было tl;dr, то есть, это выжимка интересующих меня моментов. /** * @param $x * @param $y */ function __construct($x=false,$y=false){ $this->x = $x?$x:rand(1,IMG_SIZE_X); $this->y = $y?$y:rand(1,IMG_SIZE_Y); }
/** * @param point $p * @param float $dist * * @return point */ function midPoint(point $p,$dist=0.5){ $new_x = $this->x+($p->x-$this->x)*$dist; $new_y = $this->y+($p->y-$this->y)*$dist; $new_point = new point($new_x,$new_y); return $new_point; } }
/** * Class bezierimage */ class bezierimage{ private $img; public $color; public $bgcolor; public $brush_position; function __construct(){ $this->img = imagecreatetruecolor(IMG_SIZE_X,IMG_SIZE_Y); $this->color = imagecolorallocate($this->img,255,255,255); }
/** * @param point[] $points * @param float $dist * * @return point[] */ function getBezierPoints($points,$dist=0.5){ if(count($points)==1){ return $points[0]; } $new_points = array(); for($i=1;$imidPoint($points[$i],$dist); } return $this->getBezierPoints($new_points,$dist); } /** * @param point[] $points * @param int $precision */ function bezierCurve($points,$precision=700){ foreach($points as $point){ $this->putPixel($point); } for($i=0;$i<$precision;$i++){ $dist = $i/$precision; $this->lineTo($this->getBezierPoints($points,$dist),2); } } } Можно ли, не прибегая к другим языкам, оптимизировать данный код? Он заметно начинает тормозить уже на порядке 70, а на 100 просто утыкается в ограничение по вложенности рекурсии. Особенно интересуют два момента: метод getBezierPoints - оптимизация метод bezierCurve - динамический подбор количества полигонов, в зависимости от кривизны линии на данном отрезке. По поводу сторонних библиотек: к сожалению, чаще всего находятся максимум 3-4 порядка, так что не вариант, разве что собрать свою. P.S. таки да, я опять пытаюсь использовать PHP в целях, для которых он не предназначен. Но интерес больше академический, для практики и правда более 6-10 точек не надо.


Ответ

По поводу getBezierPoints — можно сделать в один проход без рекурсии.
Смотрите. Пусть в начале у нас есть точки p[0], ..., p[n-1]. После первого шага у нас получается q[0] = (p[0] + p[1]) / 2, q[1] = (p[1] + p[2]) / 2, ..., q[n-2] = (p[n-2] + p[n-1]) / 2, то есть
q[i] = (p[i] + p[i+1]) / 2.
На следующем шаге
r[i] = (q[i] + q[i+1]) / 2 = (p[i] + 2p[i+1] + p[i+2]) / 4.
Видно, что возникают биномиальные коэффициенты:
r[i] = (C_2^0 p[i + 0] + C_2^1 p[i + 1] + C_2^2 p[i + 2]) / 2^2.
(Немного математики: По индукции легко доказать, что биномиальные коэффициенты будут и дальше: если на j-м уровне
s[i] = (\sum_k=0^{j-1} C_j^k p[i + k]) / 2^j,
то на (j+1)-м
t[i] = (s[i] + s[i+1]) / 2 = = (\sum_k=0^j (C_j^k + C_j^{k + 1}) p[i + k]) / 2^{j + 1} = (\sum_k=0^j C_{j + 1}^k p[i + k]) / 2^{j + 1}.
База индукции очевидна.)
Итак, нам нужны биномиальные коэффициенты. Их можно тоже легко вычислить на лету. Конечный алгоритм должен быть таким:
int l = count($points); int coeff = 1; point result = $points[0]; for (int idx = 1; idx < l; idx++) { coeff *= (l - idx); coeff /= idx; result += $points[idx] * coeff; } result /= (1 << (l - 1)); // степень двойки

Если делить надо не обязательно на 2, аналогично получается вот что:
int l = count($points); double alpha = 0.333333; // или любое другое значение между 0 и 1 double beta = 1 - alpha; double beta2alpha = beta / alpha; int coeff = alpha ** (l - 1); // степень point result = $points[0] * coeff; for (int idx = 1; idx < l; idx++) { coeff *= (l - idx); coeff /= idx; coeff *= beta2alpha; result += $points[idx] * coeff; }

Как организовать мигание вспышки

Именю такой код, для включения вспышки mCamera = Camera.open(); Camera.Parameters params = mCamera.getParameters(); params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); mCamera.setParameters(params); И такой для выключения Camera.Parameters params = mCamera.getParameters(); params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); mCamera.setParameters(params); mCamera.release(); mCamera = null; Как организовать мигание вспышки по нажатию ToggleButton. То есть, есть ToggleButton ON то вспышка мигает, а если OFF то останавливается. PS. Работать с ToggleButton умею, нужет только код, запускающий мигание.


Ответ

Собственно, вот рабочий код. Есть маленький нюанс. Если нажать на кнопку в момент, когда вспышка будет гореть, то она так и останется гореть. Кто захочет, добавит дополнительную проверку или выключение вспышки по завершению цикла. Итак, первым делом обязательно добавляем в файл манифеста строки о доступе к камере и вспышке. По условиям вопроса я добавил на слой простую ToggleButton. Её id - btn_switch . Всё, дальше можно копировать код в своё Activity и наслаждаться морганием. package com.blogspot.leved_notes.blinker;
import android.app.Activity; import android.content.pm.PackageManager; import android.hardware.Camera; import android.hardware.Camera.CameraInfo; import android.hardware.Camera.Parameters; import android.os.Bundle; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.Toast; import android.widget.ToggleButton;
public class MainActivity extends Activity implements OnCheckedChangeListener {
ToggleButton mSwitcher; private Camera mCamera; private Parameters mParams;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
mSwitcher = (ToggleButton) findViewById(R.id.btn_switch); mSwitcher.setOnCheckedChangeListener(this);
if (!checkCameraHardware()) gameOver();
mCamera = getCameraInstance(); checkFlash(); }
@Override public void finish() { super.finish(); if (mCamera != null) mCamera.release(); }
@Override public void onCheckedChanged(CompoundButton btn, boolean state) { if (state) { Thread thread = new Thread(new Runnable() {
@Override public void run() { if (mCamera != null) { while (mSwitcher.isChecked()) { String mode = mParams.getFlashMode(); if (mode.equals(Parameters.FLASH_MODE_OFF)) mode = Parameters.FLASH_MODE_TORCH; else mode = Parameters.FLASH_MODE_OFF;
mParams.setFlashMode(mode); mCamera.setParameters(mParams); try { Thread.sleep(500L); } catch (InterruptedException e) { e.printStackTrace(); } } } } }); thread.start(); } }
/** Check if this device has a camera */ private boolean checkCameraHardware() { boolean result = false; PackageManager pm = getPackageManager(); if (pm.hasSystemFeature(PackageManager.FEATURE_CAMERA) && pm.hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)) { // this device has a camera and flash result = true; } else gameOver();
return result; }
private void gameOver() { finish(); Toast.makeText(this, "Error!", Toast.LENGTH_LONG).show(); }
/** A safe way to get an instance of the Camera object. */ public Camera getCameraInstance() { CameraInfo info = new CameraInfo(); Camera c = null;
for (int i = 0; i < Camera.getNumberOfCameras(); i++) { Camera.getCameraInfo(i, info); if (info.facing == CameraInfo.CAMERA_FACING_BACK) { try { c = Camera.open(i); // attempt to get a Camera instance } catch (Exception e) { e.printStackTrace(); } } }
return c; // returns null if camera is unavailable }
private void checkFlash() { if (mCamera != null) { mParams = mCamera.getParameters(); } else gameOver(); }
}

Java: является ли объектом int[]?

По мотивам "Нюанс при применении метода toString"
@Barmaley:
Не все массивы являются объектами, скажем int[] не является объектом...
@Антон Феоктистов:
Barmaley, могли бы подробнее рассказать про int[]? А то я сегодня даже в книжки полез. У Эккеля сказано, что любой массив, это объект, в котором хранятся ссылки на объекты. Какого-то замечания по примитивам там не было. Если int[] не является объектом, то и методов length(), toString(), hashCode() и т.д. не было бы, по идее
Хотелось бы действително узнать по подробнее. Сам я этот язык ещё изучаю и интересны подобные нюансы. P.S. Просьба не путать int с int[]. Переменная int как примитивный тип не может являться объектом. Вопрос именно о принадлежности массива int (int[]) к объектам.


Ответ

Я ошибся. Переменные примитивных типов не являются объектами, а массивы примитивных типов уже объекты: An object is a class instance or an array. Первоисточник здесь

Output caching и кэширование на уровне Jit компиляции

Здравствуйте, я возможно сейчас один глупый вопрос задам, но все же: Мне не совсем понятно за счет чего страница закэшированная на уровне контроллера(OutputCache) должна обрабатываться быстрее , чем любая другая страница по дефолту кэшируемая Jit компилятором.По поводу этого в одной книге было следующее: [OutputCache] is actually implemented using the core ASP.NET platform’s output-caching technology, which means that if there’s a cache entry for a particular URL, it will be served without invoking any part of ASP.NET MVC Но разве кеш Jit компилятора это не уровень веб-сервера?И все запросы, кроме первого , должны быть так же обработаны напрямую, не затрагивая ASP.NET MVC. Спасибо.


Ответ

Вы пытаетесь сравнить два механизма, работающих на абсолютно разных уровнях: JIT-компилятор выполняет компиляцию IL-кода при первом обращении приложения к этому коду. После этой операции он сохраняет скомпилированный код в памяти, чтобы не выполнять компиляцию при повторном обращении. Это верно не только для ASP.NET Web-приложений, но и для всех .NET-приложений (если они не были заранее скомпилированы в native code, например с помощью NGen). Атрибут OutputCache обеспечивает кэширование всех, либо некоторых действий контроллера. Это значит, что после первого обращения приложения к действию контроллера, результат этого действия будет закеширован, согласно параметрам атрибута. По умолчанию, он будет сохранен на Web-сервере, всех proxy-серверах (если таковые имеются) и в браузере пользователя. При последующих обращениях приложения к этому действию, оно не будет вызываться, а Web-сервер будет сразу возвращать результат из своего кэша. Такое кэширование (как вы указали в вопросе) реализовано платформой ASP.NET и характерно именно для Web-приложений. Отсюда и ответ на ваш вопрос: ВЕСЬ код приложения компилируется по мере обращения к нему и сохраняется JIT-компилятором. Но это всего лишь код. Атрибут OutputCache обеспечивает кэширование результата выполнения этого кода, за счет чего код не будет вызываться повторно. Поэтому, при использовании [OutputCache] и достигается выигрыш в скорости.

Скачивание нескольких файлов с сервера

Реализовать скачивание одного файла с сервера на комп пользователя не составляет труда.А если пользователь выбирает из предложенного списка несколькофайлов, можно ли реализовать на php их скачивание одним потоком? Я имею в виду, сделать так, чтобы окошко "сохранить как " появилось только один раз.


Ответ

Можно сделать архив на стороне PHP, и все файлы вернуть в одном архиве.

Как обработать кириллические символы в urllib.request.urlopen()?

Здравствуйте! У меня такой вопрос, urllib.request.urlopen() не принимает кириллические символы в http запросе, Выполняю: urllib.request.urlopen('http://exemple.com/sent?"русский_текст"') получаю: self._output(request.encode('ascii')) UnicodeEncodeError: 'ascii' codec can't encode characters in position 11-17: ordinal not in range(128) Прочитав документацию по urllib.request понял, что urllib.request.urlopen() пытается перевести мой запрос в кодировку latin 1 (iso8859-1) и именно на это он и ругается, как правильно обработать запрос с кириллическими символами?


Ответ

urllib.request.urlopen('http://example.com/send?{0}'.format(quote_plus('"русский_текст"'))) или даже так: urlopen(urlunparse(('http', 'example.com', '/send', None, quote_plus('"русский текст"'), None), )) а вообще либой requests многие штуки чуточку удобнее делать

Измерить время выполнения одной инструкции

Всем привет. Вот недавно возник такой вопрос. Вопрос носит характер удовлетворения скорее чистого любопытства, а не практический интерес, хотя, в-принципе, было бы и на практике интересно попробовать возможно ли такое проверить. В-общем, насколько я понимаю, такое невозможно на сегодняшних, современных процессорах (невозможно же?), так как Instruction pipeline на современных процах конвееризирован. Каждая инструкция состоит из нескольких составляющих ее операций, которые далеко не факт что будут выполняться за одинаковое время - допустим, при fetching'е операнда из памяти или на стадии Write back может произойти cache miss, и в итоге время доступа вырастет очень существенно, от десятков наносекунд до микро или даже милисекунд. Также на многих процессорах используются конвеерные оптимизации, т.е. опредленная последовательность инструкций (паттерн) будет отрабатывать быстрее, нежели другой, менее удачливый набор, опять-таки, из-за особенностей конвеера и стадий обработки инструкции. Получается, это невозможно? Скажите, прав я или нет?


Ответ

Да, всё зависит от огромного числа факторов, некоторые из которых Вы назвали. Я слышал, что intel'овские профайлеры умеют показывать некоторые подобные скрытые вещи (насколько я помню, - например, промахи кэша и ошибки предсказания переходов), используя знания об архитектуре и некоторые вещи эмулируя (а не измеряя).

Вывести на экран кодировку строки в Perl

Есть строка $str в неизвестной кодировке. Как вывести на экран эту самую кодировку?


Ответ

Кажется, так: use Encode::Detect::Detector; my $encoding_name = Encode::Detect::Detector::detect($str); print $encoding_name;

Установка списка отзывов (*.crl) в хранилище компьютера

Ребята, подскажите пожалуйста как в C# установить *.crl в хранилище компьютера. Есть код для установки сертификата в корневые сертификаты:
private static void InstallRootCertificate(string cerFileName) { X509Store store = new X509Store(StoreName.AuthRoot, StoreLocation.LocalMachine); X509Certificate2 certificate = new X509Certificate2(cerFileName); store.Open(OpenFlags.ReadWrite); store.Add(certificate); store.Close(); }
Но он, по понятным причинам не подходит для crl. Заранее спасибо.


Ответ

Хотя вопрос был задан очень давно, и уже, возможно, не актуален, все же предложу решение, поскольку проблема интересная. Ее решение может быть полезно, например, когда нужно автоматизировать обновление списков отозванных сертификатов на десятках серверов.
К сожалению, никаких стандартных средств для решения этой задачи .NET не предоставляет. Придется использовать обертки для crypt32.dll и unsafe-код. Ниже приведет пример решения. Его основу составляет класс CrlFile, который позволят открыть crl-файл и импортировать его в стандартное хранилище (класс System.Security.Cryptography.X509Certificates.X509Store).
Дополнительная информация:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa376011(v=vs.85).aspx https://blogs.msdn.com/b/gproano/archive/2005/03/22/400645.aspx?Redirected=true

class Program { static void Main(string[] args) { var store = new X509Store(StoreName.CertificateAuthority, StoreLocation.CurrentUser); store.Open(OpenFlags.ReadWrite);
var crl = new CrlFile(@"d:\tmp\ca
oot.crl"); crl.Import(store, CrlAddDisposition.CERT_STORE_ADD_REPLACE_EXISTING); store.Close(); } }
public class CrlFile { // по уму здесь нужна реализация SafeHandle, // но чтобы не удлинять код оставим, как есть private IntPtr _context;
private readonly string _file;
public CrlFile(string file) { _file = file; }
public bool Import(X509Store store, CrlAddDisposition disp, ref IntPtr storeContext) { EnsureCrlContext(); return Crypto32Interop.CertAddCRLContextToStore(store.StoreHandle, _context, (uint)disp, storeContext); }
public bool Import(X509Store store, CrlAddDisposition disp) { var storeContext = IntPtr.Zero; return Import(store, disp, ref storeContext); }
private unsafe void EnsureCrlContext() { if (_context != IntPtr.Zero) return;
var context = new IntPtr(Crypto32Interop.CERT_QUERY_CONTENT_CRL);
var handle = GCHandle.Alloc(_file, GCHandleType.Pinned); var data = handle.AddrOfPinnedObject();
bool ret = Crypto32Interop.CryptQueryObject( Crypto32Interop.CERT_QUERY_OBJECT_FILE, data, Crypto32Interop.CERT_QUERY_CONTENT_FLAG_CRL, Crypto32Interop.CERT_QUERY_FORMAT_FLAG_ALL, 0, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, new IntPtr(&context));
_context = Crypto32Interop.CertDuplicateCRLContext(context); Crypto32Interop.CertFreeCRLContext(context); handle.Free(); }
~CrlFile() { if (_context != IntPtr.Zero) Crypto32Interop.CertFreeCRLContext(_context); } }
public static class Crypto32Interop { public const uint CERT_QUERY_CONTENT_CTL = 2; public const uint CERT_QUERY_CONTENT_CRL = 3;
public const uint CERT_QUERY_OBJECT_FILE = 1;
public const uint CERT_QUERY_FORMAT_BINARY = 1; public const uint CERT_QUERY_FORMAT_BASE64_ENCODED = 2; public const uint CERT_QUERY_FORMAT_ASN_ASCII_HEX_ENCODED = 3;
public const uint CERT_QUERY_CONTENT_FLAG_CRL = (1 << (int)CERT_QUERY_CONTENT_CRL); public const uint CERT_QUERY_CONTENT_FLAG_CTL = (1 << (int)CERT_QUERY_CONTENT_CTL); public const uint CERT_QUERY_FORMAT_FLAG_BINARY = (1 << (int)CERT_QUERY_FORMAT_BINARY); public const uint CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED = (1 << (int)CERT_QUERY_FORMAT_BASE64_ENCODED); public const uint CERT_QUERY_FORMAT_FLAG_ASN_ASCII_HEX_ENCODED = (1 << (int)CERT_QUERY_FORMAT_ASN_ASCII_HEX_ENCODED); public const uint CERT_QUERY_FORMAT_FLAG_ALL = (CERT_QUERY_FORMAT_FLAG_BINARY | CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED | CERT_QUERY_FORMAT_FLAG_ASN_ASCII_HEX_ENCODED);
[DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern IntPtr CertDuplicateCRLContext(IntPtr pCrlContext);
[DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool CertFreeCRLContext(IntPtr pCrlContext);
[DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool CertAddCRLContextToStore( [In] IntPtr hCertStore, [In] IntPtr pCrlContext, [In] uint dwAddDisposition, [Out] IntPtr ppStoreContext);
[DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool CryptQueryObject( [In] uint dwObjectType, [In] IntPtr pvObject, [In] uint dwExpectedContentTypeFlags, [In] uint dwExpectedFormatTypeFlags, [In] uint dwFlags, [Out] IntPtr pdwMsgAndCertEncodingType, [Out] IntPtr pdwContentType, [Out] IntPtr pdwFormatType, [In, Out] IntPtr phCertStore, [In, Out] IntPtr phMsg, [In, Out] IntPtr ppvContext); }
public enum CrlAddDisposition : uint { CERT_STORE_ADD_NEW = 1, CERT_STORE_ADD_USE_EXISTING = 2, CERT_STORE_ADD_REPLACE_EXISTING = 3, CERT_STORE_ADD_ALWAYS = 4, CERT_STORE_ADD_REPLACE_EXISTING_INHERIT_PROPERTIES = 5, CERT_STORE_ADD_NEWER = 6, CERT_STORE_ADD_NEWER_INHERIT_PROPERTIES = 7, }

Пишу проект на Qt. Где нужно указать, что используется ПО с открытым исходным кодом?

Здравствуйте. Пишу проект для себя (если кому-то будет интересно, то и для людей) с использованием Qt. Qt под GPLv3, мой проект под MIT. Так вот, где мне нужно указать, что используется ПО с открытым исходным кодом (в данном случае Qt)?


Ответ

Если я правильно читал документацию, то нужно сделать так в корневой каталог положите копии лицензий Qt и MIT (той, которую Вы используете) создайте файл LICENSE.txt, где напишите, что это Ваш проект под лицензией MIT и Вы используете Qt под GPLv3 во всех своих файлах в верху добавьте короткую вставку с указанием авторства, даты создания, лицензии и подобного. там, где добавить вставку невозможно (к примеру, папка с картинками), вставьте текстовый документ с подобных текстом (картинки созданы таким то, лицензия такая то). также, неплохо добавить в пункт меню "помощь" рядом с " о программе" пункт "о Qt", с вызовом стандартного окошка. в любом случае, всегда можно им написать напрямую и уточнить детали - http://qt.digia.com/licensing/

POST/GET request и tor hidden service (.onion)

Здравствуйте, люди. Подскажите пожалуйста, возможно ли отправить POST запрос к tor hidden service (то есть к хосту, который имеет .onion домен). На VPS установлен tor, и он открывает socks5 (127.0.0.1:9050) для доступа в tor-сеть. Пробую примерно как в примере ниже, но с той стороны нет ответа, как будто ничего не доходит. $fp = fsockopen($proxy, $port, $errno, $errstr, 30); $url = @parse_url($url);
if($fp) { //читаем данные if(($data = @file_get_contents('php://input')) === false)$data = '';
$request = "POST {$url['path']}." HTTP/1.1
"; $request .= "Host: {$url['host']}
"; if(!empty($_SERVER['HTTP_USER_AGENT']))$request .= "User-Agent: {$_SERVER['HTTP_USER_AGENT']}
"; $request .= "Content-Type: application/x-www-form-urlencoded
"; $request .= "Content-Length: ".strlen($data)."
"; $request .= "Connection: Close
"; //шлем fwrite($fp, $headers.$data); //ответ while(!feof($fp)) echo fread($fp, 1024); fclose($fp); } else die; ?>


Ответ

К сожалению, не хватает респектов для ответа на собственный вопрос, поэтому кину сюда. $proxy = "127.0.0.1"; $port = "9050"; $url = "https://mydomain.onion/input.php"; $ch = curl_init(); curl_setopt ($ch, CURLOPT_URL, $url); curl_setopt ($ch, CURLOPT_HEADER, 0); curl_setopt ($ch, CURLOPT_PROXYTYPE, 7 ); curl_setopt ($ch, CURLOPT_PROXY, $proxy.':'.$port ); ob_start();
curl_exec ($ch); curl_close ($ch);
$result = ob_get_contents(); ob_end_clean(); var_dump($result); Тут нет собственно самих данных, они добавляются также curl_setopt

Зачем нужны миграции?

Зачем их придумали, если можно вместе с исходниками выкидывать дамп? Чувствую, что вопрос наитупейший ^^ тапками не кидайте.


Ответ

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

Как вывести данные с объекта ?

Нужно с помощью console.log () вывести из объекта "data" данные в соответствии массива "digCnt" Например, в первая цифра в массиве 2 значит нужно вывести данные c объекта "1 : { 2: здесь должен быть текст 2}" var digCnt = [2,1,4,5]; var data = { 1: { 1: 'здесь должен быть текст 1', 2: 'здесь должен быть текст 2', 3: 'здесь должен быть текст 3', 4: 'здесь должен быть текст 4', 5: 'здесь должен быть текст 5', 6: 'здесь должен быть текст 6', }, 2: { 0: 'здесь должен быть текст 0', 1: 'здесь должен быть текст 1', 2: 'здесь должен быть текст 2', 3: 'здесь должен быть текст 3', 4: 'здесь должен быть текст 4', 5: 'здесь должен быть текст 5', }, 3: { 0: 'здесь должен быть текст 0', 1: 'здесь должен быть текст 1', 2: 'здесь должен быть текст 2', 3: 'здесь должен быть текст 3', 4: 'здесь должен быть текст 4', 5: 'здесь должен быть текст 5', }, 4: { 1: 'здесь должен быть текст 1', 2: 'здесь должен быть текст 2', 3: 'здесь должен быть текст 3', 4: 'здесь должен быть текст 4', 5: 'здесь должен быть текст 5', } };


Ответ

В цикле обходите массив digCnt и выводите нужные значения. Примерно так: for(var i = 0; i < digCnt.length; i++) { console.log(data[i + 1][digCnt[i]]); } Пример: JSFiddle

C++ в современном мире

В современное время, как правило, выделяют три "мейнстримовых" языка: C#, Java и C++. (ну, допустим, что это так хотя бы в контексте данного поста ). Собственно, С# "вытек" из-за Java, а Java пришел на смену C\C++, упрощая разработку и привнося почти абсолютную кроссплатформенность. Java и C# - такие языки, что им нравится обучаться, реально ощущая их мощь, актуальность и спектр, где их можно задействовать.
Что же касается C++. Несомненно, этот язык занимает заслуженное место в топе "мэйнстримовых" языков и используется повсеместно. Тем не менее, изучая этот язык, можно довольно быстро заскучать начинающим: они видят, как использовать те же STL контейнеры, узнают об указателях и , возможно, даже о библиотеке Boost, но где все это реально можно применить( наверное, кроме олимпиад ), они могут недопонять.
C++ широко используется в научных разработках, биоинженерии, генетике, космонавтике( так, софт луноходов-марсоходов писан на СИ ) и т.д.
Собственно, вопрос такой: Может быть изначально стоит лишь ознакомиться с C++, затем бросить его в "отдаленный уголок" мозга и продолжить изучать тот же Java или C#, четко зная, как и где их можно "круто" применить? А в будущем, если это потребуется, добраться до того "отдаленного участка" мозга, развернуть те "C++ крошки" и уже на их основе обучаться далее C++, но уже на практике?
Почему, изучая плюсы в одиночку( вне команды людей и вне интересной практики ), он кажется таким скучным, будто бы он создан только для программирования спутников и луноходов?


Ответ

С++ - это всего лишь один из огромного множества языков программирования. Не лучше и не хуже других (разумеется, чем-то лучше, чем-то хуже, не суть). Поэтому нельзя говорить, что он прям обязателен к изучению. Это всего лишь один из инструментов работы программиста. Нужно ли изучать каждый отдельно взятый язык обычно зависит от области деятельности, которой программист хочет себя посвятить. То есть первична должна быть задача, под которую выбирается язык, а не язык, под который подбираются задачи. Учить язык только ради того, что это С++ вряд ли разумно. Что же касается того, "почему он кажется таким скучным" - так язык и не должен никого развлекать. Он должен выполнять возложенные на него задачи (в частности, от С++ требуется сохранение высокой производительности и средств низкоуровнего программирования вместе с наличием высокоуровневых абстракций). Более того, C#/Java/etc тоже ведь вроде не жонглируют горящими топорами, не рассказывают анекдотов и не пропукивают лезгинку в угоду развлечению пользователя. Вряд ли от промышленного языка программирования разумно требовать того, чтобы он был еще и интересным (субъективное свойство кстати - ведь довольно сложно сказать, что делает язык "интересным")

Как сделать динамическое меню в Bootstrap?

Как сделать динамическое меню в Bootstrap, как показано на картинке?


Ответ

Navbar Navbars are responsive meta components that serve as navigation headers for your application or site. They begin collapsed (and are toggleable) in mobile views and become horizontal as the available viewport width increases.

Android Wear простой пример обмена данными со смартфоном

Собственно, вопрос в названии... Не смог найти простейшего примера обмена данными между смартфоном и часами... Прошу именно простейший пример, исходники семплов, что идут вместе с SDK избыточно большие и сложные.


Ответ

Посмотрите тут и тут #1 Отправка сообщения из активити на часах @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.my_activity); initApi(); }
//Конектимся к API private void initApi() { client = getGoogleApiClient(this); retrieveDeviceNode(); client.connect(); }
/** * Returns a GoogleApiClient that can access the Wear API. * * @param context * @return A GoogleApiClient that can make calls to the Wear API */ private GoogleApiClient getGoogleApiClient(Context context) { return new GoogleApiClient.Builder(context) .addApi(Wearable.API) .build(); }
/** * Connects to the GoogleApiClient and retrieves the connected device's Node ID. If there are * multiple connected devices, the first Node ID is returned. */ private void retrieveDeviceNode() { new Thread(new Runnable() { @Override public void run() { client.blockingConnect(CONNECTION_TIME_OUT_MS, TimeUnit.MILLISECONDS); NodeApi.GetConnectedNodesResult result = Wearable.NodeApi.getConnectedNodes(client).await(); List nodes = result.getNodes(); if (nodes.size() > 0) { nodeId = nodes.get(0).getId(); } client.disconnect(); } }).start(); }
/** * Отправляем "сообщение" к подключенному телефону, передаем параметр yourData (какие то ваши данные), или null вместо него. */ private void sendMessageToMobile() { if (nodeId != null) { new Thread(new Runnable() { @Override public void run() { client.blockingConnect(CONNECTION_TIME_OUT_MS, TimeUnit.MILLISECONDS); Wearable.MessageApi.sendMessage(client, nodeId, MESSAGE, new byte[]{yourData}); client.disconnect(); } }).start(); } } #2 Принимаем "сообщение" на телефоне public class ListenerService extends WearableListenerService {
@Override public void onMessageReceived(MessageEvent messageEvent) {
//Ваши действия
} В манифесте: А так же в манифесте wear модуля нужно добавить гугл плей сервис

Как раскидать картинки по папкам mdpi, hdpi, xhdpi, ldpi?

Объясните мне, пожалуйста, принцип того, как раскидать картинки по папкам mdpi, hdpi, xhdpi, ldpi. Вот у меня есть картинка размером 800x1280, как мне узнать, какой у нее dpi, чтобы от него уже делать выводы, куда кидать... Я знаю, что ldpi = 0.75, mdpi = 1.0, hdpi = 1.5, xhdpi = 2.0
Я просто хочу делать программы под разные экраны, но как делать, не знаю.


Ответ

dpi - зависит от разрешения экрана в пикселах и его физического размера в дюймах. Как узнать? Есть экран девайса 800 на 1280, (800Х800)+(1280Х1280) извлекаем корень = 1509,4. Теперь магия. Если экран 4,7", то 1509,4/4,7 = 321 DPI ~ xhdpi (2.0), если хотим вашу картинку на весь экран на этом девайсе, то кладём её в xhdpi - это будет как бы базовый девайс. Для дугих девайсов кладём в mdpi картинку (400 на 640), в hdpi картинку (600 на 960) и так далее. Обновление Это на 100% работает в идеальном мире. ) Уж очень разные экраны бывают. "Но ведь не может быть в mdpi базовым 800 на 1280" на экране в 9,4", будет. Можете пересчитать. ) Можно прикинуть примерно и посмотреть на эмуляторе или в редакторе xml, как это будет выглядеть на разных девайсах. Вы можете закинуть эту картинку, не изменяя во все папки и тоже посмотреть, что будет. Android растянет или сожмёт. НО память будет не оптимально расходоваться. Не кидайте все картинки только в mdpi, на девайсах с высоким DPI некоторые (особенно большие) после принудительного увеличения могут очень много памяти съедать.

Зачем закрывать подключения?

Здравствуйте. Разбираюсь с mysqli, в частности с этим примером: /* проверка подключения */ if (mysqli_connect_errno()) { printf("Не удалось подключиться: %s
", mysqli_connect_error()); exit(); }
$query = "SELECT Name, CountryCode FROM City ORDER by ID DESC LIMIT 50,5";
if ($result = mysqli_query($link, $query)) {
/* выборка данных и помещение их в массив */ while ($row = mysqli_fetch_row($result)) { printf ("%s (%s)
", $row[0], $row[1]); }
/* очищаем результирующий набор */ mysqli_free_result($result); }
/* закрываем подключение */ mysqli_close($link); ?> И напросился вопрос: зачем нужно очищать результат набора, mysqli_free_result($result);, закрывать подключения mysqli_close($link); и чем плохо, если этого не делать?


Ответ

Непонятно, откуда предыдущий оратор вообразил какой-то "таймаут".
Соединение с БД закрывать не надо - оно закроется само по окончании работы скрипта. Сразу. БЕЗ каких-либо "таймаутов".
Резалтсет в большинстве случаев очищать не нужно, поскольку как только закончит выполнение вызвавшая его функция, он так же обнулится.

Как можно узнать высоту Laoyut?

Я сам назначаю ему высоту по контенту, но я хочу узнать его высоту в dp или пикселях, чтобы при смене контента оставить высоту таким же какой и был.
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) fr.getLayoutParams(); params.height = -2; fr.setLayoutParams(params);
И еще вопрос: если я назначу
params.height = 100;
в чем это значение измеряется - в px или dp?


Ответ

Приведённый вами в вопросе код спокойно вернёт в
params.height
высоту элемента.
Проблема может возникнуть, если она изначально
= "wrap_content" || "match_parent"; //вернёт -2 || -1, а не высоту в пикселях
Тогда вариантов несколько. Например можно получить координаты "верха" и "низа" элемента:
FrameLayout fr = //находим элемент int topYcoord = fr.getTop(); int bottomYcoord = fr.getBottom();
И из них вычислить высоту элемента:
int calculatedHeight = bottomYcoord-topYcoord;
И применить к элементу:
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) fr.getLayoutParams(); params.height = calculatedHeight; fr.setLayoutParams(params);
UPD 0:
Всё вышеописанное работает в onResume() активити, когда система подсчитала все координаты всех лэйаутов.
До onResume() можно, например так:
//int h = fr.getMeasuredHeight(); вернёт 0, т.к. не измерялось ещё. //вроде как принудительно измеряет элемент //"0" здесь - это какие-то константы. Что и как они конкретно делают - магия для меня fr.measure(0,0); //теперь высота измерена и вернет !0 int h = fr.getMeasuredHeight();
UPD 1:
Поэкспериментировал. Выводы:
FrameLayout возвращает 0 всегда, если в нём нет детей. Если есть ребёнок, возвращает его высоту, даже если он (ребёнок) занимает его не полностью. С RelativeLayout всё работает.
Вывод: Пользуйте RelativeLayout.

Хешкод, переопределение метода GetHashCode

Господа, не могу понять каким образом переопределять метод GetHashCode(). Ведь, насколько я понял, хешкод берется из скрытой переменной в объекте, к которой нет доступа. Тогда как мне его переопределить ?? Если не затруднит, то хотелось бы увидеть какой-то элементарный пример. И еще не пойму, почему разные хешкоды в коде using System; class a { public int x; public a(int y) { x = y; } } class b { static void Main() { Console.WriteLine(new a(5).GetHashCode() + " " + new a(5).GetHashCode()); } } Ведь тут написано https://msdn.microsoft.com/ru-ru/library/system.object.gethashcode(v=vs.110).aspx Для двух одинаковых объектов возвращенные хэш-коды равны


Ответ

Ведь, насколько я понял, хешкод берется из скрытой переменной в объекте, к которой нет доступа. Так ведь и метод вы переопределяете в своем же классе :). Что-то типа: class a { public int x;
public a(int y) { x = y; }
public override int GetHashCode() { return x; } } Есть несколько правил для переопределения GetHashCode(), основные: 1) Используемая функция должна давать хорошее распределение. Это, строго говоря, зависит от данных, однако часто хорошо подходит подобная функция: public override int GetHashCode() { int hashcode = field1.GetHashCode(); hashcode = 31 * hashcode + field2.GetHashCode(); hashcode = 31 * hashcode + field3.GetHashCode(); // и т.д. для остальный полей return hashcode; } 2) Эта функция должна быть быстрой. 3) GetHashCode() не должен выбрасывать исключения. 4) В идеале GetHashCode() не должен меняться в течение жизни объекта, т.е. полагаться только на неизменяемые члены класса. На практике этим часто пренебрегают, пока не стрельнет. Так же не забудьте, что Equals() и GetHashCode() всегда должны идти в паре: переопределили один метод, переопределяйте и другой. И если два объекта равны, то у них должен быть одинаковый хэшкод. Обратное необязательно верно (хэш-функция может вернуть одинаковое дначение для разных объектов). Что почитать (на английском): Про правильное переопределение GetHashCode() Про хэш-функции

Реализация внешнего trait для внешнего шаблона, параметризованного локальным типом в Rust

После перехода с январьской версии компилятора Rust на beta. Обнаружил что код подобный этому не компилируется http://is.gd/oX7GWN
use std::fmt::{Display, Formatter, Error};
struct MyLocalType;
type MyResult = Result;
impl Display for MyResult { fn fmt(&self, f: &mut Formatter) -> Result<(), Error> { f.write_str("some test string") } }
fn main() { let r: MyResult = Ok(MyLocalType); println!("{}" , r); }
Это ошибка компилятора, или теперь внешние параметризованные типы нужно всегда "заворачивать" в свои ?


Ответ

Ответ, скопированый с англоязычного stackoverflow:
https://stackoverflow.com/questions/29789877/can-not-implement-trait-from-another-crate-for-generic-type-from-another-crate-p There's no direct way to solve this for a pure alias like type. The code is the same as
impl Display for Result and the compiler can't ensure that there will be no conflicting implementations in other crates (aka, can't ensure that the implementation is 'coherent'). Being able to do it is definitely useful sometimes, but it was unfortunately a bug that the compiler accepted it before. Solutions include: defining a proper wrapper type for Result, e.g. struct MyResult(Result); defining your own enum: enum MyResult { Ok(MyType), Err(String) } define a wrapper type, but only use it when printing, i.e. write println!("{}", Wrapper(r)); instead of println!("{}", r); Both of these make MyResult a local type, and so the impl then should be legal.
Описание на русском, как его понял я:
Теперь нет способа реализовывать типаж для стороннего обобщённого типа, пусть даже и параметризованного локальным типом. Так как компилятор не может быть уверен, что реализация будет согласована со всеми другими реализациями.
Чтобы решить эту проблему нужно сделать тип полностью локальным. Eсть несколько способов:
«Обернуть» его в локальный тип-обёртку, например: struct MyResult(Result); Объявить свой собственный Result-подобный тип: enum MyResult { Ok(MyType), Err(String) } Или же обернуть его, но использовать обёртку только там, где необходим требуемый типаж, например: println!("{}", Wrapper(r)); вместо println!("{}", r);

Кросплатформенный код на C, теоретические проблемы

Понимаю что вопрос дурацкий, но тем не менее :) В каких случаях неверно утверждение: "если код на pure C, использующий только стандартные библиотеки, собирается и работает под linux-32, linux-64 и win-32, то он без дополнительных мер соберётся и корректно заработает под win64"?
В принципе ответ очевиден: например, в тех случаях, где есть завязка на разрядность, совмещённая с "ифдеф виндовс". Но есть практические примеры не таких очевидных вещей?


Ответ

Как уже было сказано выше, многое зависит не только от платформы, но и от компилятора - часто именно от компилятора.
Для разрешения ситуаций с размерами и разрядностью иногда создаются внутренние типы, фактический смысл которых зависит от платформы. Так например у Apple CGFloat в 32-битной системе это float, а в 64-битной - double.
Для пущей совместимости могу посоветовать собирать проект одним и тем же компилятором на разных платформах.

Параметризованный класc. Возврат класса потомка

Я так понимаю это сделать нельзя, но всё таки спрошу...
Есть у меня базовый абстрактный класс Control, где параметр T - это тоже какой-то класс Component, но это уже не так важно.
Я создаю потомка Button - наследник от Control.
public class MyButton : Control
В базовом классе у меня есть методы, они что-то делают и возвращают ссылку на самого себя. Бывает удобно сделать:
new MyButton().Text("Foo").Name("Boo")
Но проблема в том, я могу вернуть только Control в базовом классе. В итоге у меня получается:
// 1. MyButton btn = new MyButton(); btn.Text("");
// 2. Control