Страницы

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

вторник, 7 января 2020 г.

Почему строки с fuzzy в django.po не переводятся?

#python #локализация #django


Я обновляю файл django.po таким образом:
$ python manage.py makemessages -l ru
$ python manage.py compilemessages -l ru

После этого часть строк в django.po помечаются как fuzzy и не переводятся во время
работы приложения. Например, при 
#, fuzzy
msgid "view"
msgstr "показ"

вместо показ будет view.    


Ответы

Ответ 1



При выполнении makemessage как fuzzy помечаются строки имеющие близкий msgid. Такие строки не попадают в итоговый *.mo из *.po, как предположительно неверные. Нужно их поправить и убрать пометку fuzzy.

Аналоги BYTE, WORD, DWORD в Linux

#c #cpp #linux


В Windows есть определения типов BYTE, WORD, DWORD, которые объявляются в файле-заголовке
WinDef.h и используются при программировании на C/C++. Какие типы являются аналогами
для Linux и где они объявляются?    


Ответы

Ответ 1



Аналоги типов BYTE, WORD, DWORD - это типы uint8_t, uint16_t, uint32_t, определенные в stdint.h.

Не удается применить атрибуты стиля в GWT

#java #исключения #gwt


При попытке применить атрибут стиля не в camel-case формате падает исключение. Как
применить атрибут, если его нельзя использовать в другом формате? например, -moz-user-select.    


Ответы

Ответ 1



Еще можно написать такой метод в какой-нибудь утилитный класс: public static native void setProperty(Style style, String name, String value) /*-{ style[name] = value; }-*/; и добавлять свойство через него SomeUtil.setProperty(getElement().getStyle(), "-moz-user-select", "none");

Ответ 2



Создай стиль в css-файле с нужным свойством .stylename { -moz-user-select: none; } и примени его вот так: getElement().addStyle(".stylename");

Как правильно составить ТЗ?

#html #css #вёрстка #веб_программирование


Бывают случаи, когда ТЗ предоставленное заказчиком неполное, плохо составленное или
его вообще не существует. Какие тогда вопросы вы задаете прежде чем начать работу и
чтобы потом не возникало вопросов у заказчика? Дизайн сайта бывает разной сложности
и разного качества, но все же есть ли какие-то вопросы общего характера?    


Ответы

Ответ 1



В "сайте" есть две основные компоненты: функционал и дизайн. По функционалу, даже "поведению" сайта все относительно просто: это описывается так же, как для любого другого программного обеспечения, разве что с поправкой на stateless-характер HTTP. Цели, средства, use cases и прочие варианты и методы описания "как это должно работать". Что касается дизайна - то мои партнеры, занимающиеся дизайном, обычно поступают так: рисуют несколько набросков, из которых клиент потом выбирает понравившийся вариант. Далее этот набросок прорисовывается подробнее, после чего на этой картинке ставятся подписи обеих сторон, она получается статус "Приложение № (n+1): макет" и становится неотъемлемой частью общего ТЗ на сайт. Что касается деталей реализации (например, табличная или блочная верстка будет использовать) - как мне кажется, их необязательно указывать в ТЗ кроме тех случаев, когда это а) критично б) заказчик имеет хорошее представление об этом. Сам процесс написания ТЗ всегда трудоемок, требует вникания в предметную область Заказчика. Кстати, хорошо работает вопрос "а что Вам нравится из продукции конкурентов"? :) Успехов!

Разработка http-радио-проигрывателя Android

#android #http


Здравствуйте.
Направьте пожалуйста на библиотеки, которые позволят:

Получать поток с http
Воспроизводить его непосредственно в программе
И желательно, как сделать виджет

Точно не знаю, название этого протокола, поэтому приведу дампы данных из сниффера:
Запрос:
GET /server.128 HTTP/1.0
Host: radio.server.fm
User-Agent: WinampMPEG/5.61, Ultravox/2.1
Ultravox-transport-type: TCP
Accept: */*
Icy-MetaData:1
Connection: close

Ответ:
HTTP/1.0 200 OK Content-Type:
audio/mpeg icy-br:128
icy-description:Server.FM
icy-genre:Public Radio icy-name:Server
icy-pub:1 icy-url:http://server.fm
Server: Icecast 2.3.2 Cache-Control:
no-cache icy-metaint:16000

Ну а дальше уже идут блоки данных по 1400-1460 байт.
Т.е. обычный http, считывать все это не составит труда, но как это отдать проигрывателю
и как достать всю интересующую информацию? Название трека и т.п. Подскажите описание
всему этому делу?    


Ответы

Ответ 1



Может пригодиться: Radio-T Client Custom Audio Streaming with MediaPlayer

Ответ 2



Так это же icecast.. ну так и читайте про этот протокол.. я когда-то сталкивался с ним, но ОЧЕНЬ давно.. к сожалению, ничего не помню уже. Помню, что с документацией дела обстояли как-то не важно и много инфы доставал на каких-то тематических формумах. Это предмет для долгих мучительных раскопок с помощью гугла :) Попробуйте копнуть тут: Practical: A Shoutcast Server Протоколы сетевых радиотрансляций Icecast/Shoutcast icecast-now-playing-script другое

Операторы '||' и 'or'

#php


Доброго времени.
Сейчас работал с базой и озадачился вопросом:
$db_res = sqlite_open( $db_name ) || die ("Ошибка при открытии БД!" );
$query = sqlite_query($db_res, "SELECT * FROM $table") || die ('Ошибка в запросе!');

При использовании "|| die()" получаю ошибку 

Warning: sqlite_query() expects parameter 1 to be resource, string given in ... on
line ...
Ошибка в запросе!

Если изменить оператор "||" на "or" все работает правильно, почему?    


Ответы

Ответ 1



Дело в том, что оператор || имеет более высокий приоритет, чем оператор =, по этому $db_res будет присвоен результат выражения sqlite_open( $db_name ) || die ("Ошибка при открытии БД!" ), т.е. true. Оператор or наоборот имеет более низкий приоритет, чем =, следовательно сначала $db_res будет присвоен результат sqlite_open( $db_name ) и только потом будет применено логическое ИЛИ: $db_res || die ("Ошибка при открытии БД!" ) Т.е. если явно расставить приоритеты, то оба выражения будут выглядеть так: $db_res = ( sqlite_open( $db_name ) || die ("Ошибка при открытии БД!" ) ); ( $db_res = sqlite_open( $db_name ) ) or die ("Ошибка при открытии БД!" );

Ответ 2



А соглашения о программировании говорят об приоритете использования операторов OR и AND перед || и &&. Так что я советую использовать буквенный вариант.

Оформление кнопки input type=file

#html #css




Вызывает два элемента, один показывает путь до файла, второй элемент это кнопка для
вызова окна выбора файла, и тут возникает вопрос, как для двух этих элементов сделать
разные css оформления? Например для кнопки "обзор" сделать background-image?    


Ответы

Ответ 1



Держите реализацию идеи от kemerov4anin function getName (str){ if (str.lastIndexOf('\\')){ var i = str.lastIndexOf('\\')+1; } else{ var i = str.lastIndexOf('/')+1; } var filename = str.slice(i); var uploaded = document.getElementById("fileformlabel"); uploaded.innerHTML = filename; } .fileform { background-color: #FFFFFF; border: 1px solid #CCCCCC; border-radius: 2px; cursor: pointer; height: 26px; overflow: hidden; padding: 2px; position: relative; text-align: left; vertical-align: middle; width: 230px; } .fileform .selectbutton { background-color: #A2A3A3; border: 1px solid #939494; border-radius: 2px; color: #FFFFFF; float: right; font-size: 16px; height: 20px; line-height: 20px; overflow: hidden; padding: 2px 6px; text-align: center; vertical-align: middle; width: 50px; } .fileform #upload{ position:absolute; top:0; left:0; width:100%; -moz-opacity: 0; filter: alpha(opacity=0); opacity: 0; font-size: 150px; height: 30px; z-index:20; } .fileform #fileformlabel { background-color: #FFFFFF; float: left; height: 22px; line-height: 22px; overflow: hidden; padding: 2px; text-align: left; vertical-align: middle; width:160px; }
Обзор


Ответ 2



А никак. Тут только 1 вариант-прятать input под div и уже сам div оформлять.

Список стран и городов

#веб_программирование


Где можно узнать список всех стран, список городов в каждой и часовой пояс в каждом
городе для регистрации пользователей? 
Только список такой, чтобы можно было бы запустить какую-нибудь самописную утилиту,
которая добавит их ВСЕХ сразу в базу, а не по одному и вручную :)    


Ответы

Ответ 1



MaxMind World Cities with Population: Включает в себя города, регионы, страны, широты и долготы.

Ответ 2



Список стран вам гугл подскажет, на той же википедии вроде есть... А вот список городов - сильно сомневаюсь, что найдёте! Сделайте город тестовым полем и всё. Да и часовой пояс дропдаун-меню - лучше всего :)

Ответ 3



Я список городов, в одном из проектов брал из яндекс погоды, спарсить их оказалось не очень сложно - написал скрипт обхода и сохранения страниц + регулярка для выделения городов. Есть одно НО - если города в стране более или менее уникальные, то яндекс не предлагает выбрать область, т.е. если вам нужны будут области, то вам придется их брать их еще откуда-то. В качесте указания часвого пояса лучше взять UTC, для каждого пояса написать крупные города, люди дальше сами сориентируются по степени близости их к крупному городу.

Ответ 4



https://www.geonames.org/ Есть все необходимое API. Еще есть вариант через google, но они сейчас шибко лимитят. Ну либо впиши им номер своей кредитки ;-)

Как правильно вывести таблицу из MySQL на JSP?

#jdbc #java #mysql


Здравствуйте, подскажите, как ПРАВИЛЬНО сделать вывод таблицы из БД на JSP-страницу
на основе JDBC (без внесения логики на JSP)?     


Ответы

Ответ 1



Правильно это: Получить данные в сервлете/контроллере/DAO, в общем за пределами JSP. Средствами JDBC: создаем Connection, создаем Statement, запускаем Statement, забираем ResultSet. Преобразуем данные в более/менее адекватное представление, например в список экземпляров класса, который эти данные оборачивает (т.н. Value Object, Data Transfer Object). Передаем этот список в JSP. В JSP пробегаемся по списку и формируем табличку. .
${person.name} ${person.age} ${person.height}


Есть ли основания использовать подобный подход?

#c_sharp #lambda


Заинтересовался конструкцией из JavaScript:
(function(){ /* code */ })();

решил попробовать реализовать подобное на C#:
public Func λ(Func f)
{
    return f;
}

Работать можно примерно следующим образом:
var i = λ((int x) => x*x + 2*x + 3)(5);// 38

var j = λ((string x) => x.Split(' '))("a bc def");// ["a", "bc", "def"]

хотелось бы услышать критику и/или идеи для развития подобной идеи.
UPD: теперь, когда функция называется λ (u03bb), а не  _  очень похоже на полноценное
лямбда-выражения, хоть и менее практично, осталось избавится от типа формального параметра,
у кого-нить есть идеи?


UPD2: ещё немного кодобреда:
исходя из определения логических операторов в λ-исчеслениях
true = λx. λy. x
false = λx. λy. y
not = λt. t false true

на С# получаем следующие
public Func True(T x)
{
    return λ((T y)=>x);
}

public Func False(T x)
{
    return λ((T y)=>y);
}

public Func> Not(Func>, Func>,
Func>>> t)
{
    return t(False)(True);
}

способ использования(ИСКЛЮЧИТЕЛЬНО в образовательных целях)
var true1 = λ((int x)=>λ((int y)=>x))(12)(21);// True 12

var true2 = True(12)(21);// 12

var false1 = False(12)(21);// 21

var false2 = Not(True)(12)(21);// 21
    


Ответы

Ответ 1



Вы просто играетесь с синтаксическим сахаром, который лежит за известным понятием лямбда-функции. Существует общеизвестная абстракция Func, которая являет собой некоторый функциональный объект и может облагаться каким-либо контрактом в ходе выполнения. При этом выгода λ-подобной записи достаточно сомнительна, поскольку разработчики уже привыкли к использованию Func: var t1 = new Func(s => s.Length)("X"); var t2 = λ(s => s.Length)("X"); Любая современная IDE после ввода var t = s => s.Length автоматически предложит вам преобразовать лямбда-выражение в функциональный объект. Короче, если подытожить, то вы просто переименовали new Func в λ. С таким же успехом, например, можно переименовать Dictionary в D. Это, конечно, здорово, но не слишком полезно.

Ответ 2



Нижеизложенное в основном мое личное мнение. Смысла функционального исчисления не в том, что функции анонимные или имеют какую то особенную нотацию, а в том, что там нет переменных и состояний. Из-за этого в нем приходится МУЧАТЬСЯ, из-за этого там придумали нотацию с т.н. лямбда-выражениями. Все это потом выполняется на машинах Тьюринга, приспособленных для императивных языков, в которых есть переменные и состояния. В С# и другие языки добавили нотацию, но не добавили ограничения на отсутствие состояний. Можно ведь в таких функциях переменные использовать и менять. То есть форма без сути. Мучения без выгоды. Почему это стали делать? Похоже, что дело в образовании. В ВУЗах США массово внедрили Java (не слушая профессоров). Несчастные преподаватели, понимающие, что обучение на этом языке навсегда испортит студентам мышление и закроет возможность стать программистом начали искать выход в замене его на функциональные языки. Например, тот самый Дейкстра, который дожил до 2002 года, преподавал в Техасе и увидел наяву воплощение всех своих худших кошмаров. Ну а дальше как обычно - чему в институте научили, то и тиражируют. Теперь эти псевдолямбда выражения и псевдофункциональное программирование суют везде. Причем форму, а не содержание.

Логические и физические элементы HTML

#html


Почему 
 - физический, а
 - логический?!
Аналогично  и .
Вчера первый раз услышал, что b и strong хоть чем-то различаются, кроме названия.    


Ответы

Ответ 1



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

Ответ 2



Тоже впервые слышу о физических элементах, это наверное недавно "изобрели". b и strong не отличаются для человека, но отличаются для поисковых роботов - b жирный шрифт, мол для красоты, а strong - что-то очень важное в тексте, на что хотели обратить внимание.

Задача о процессах

#c #linux


Коллеги, хочу поделиться забавной задачей. Сколько новых процессов будет порождено
в ходе выполнения данной программы и почему?
#include 

int main() {
    int i;
    for (i = 0; i < 3; i++) {
        if (fork() && (i == 1))  break;
    }
return 0;
}
    


Ответы

Ответ 1



Пять. Исходный процесс порождает два, завершается с i==1, второй -- один, выход по i==1, третий и четвертый -- по одному, выход i==3. Пятый и шестой погибают бездетными. Исходный и пять новых

Ответ 2



Хех, ну после рисования на бумажке получается 6 потоков) Исходный поток1 порождает поток2 Проверяется условие в обоих потоках, ни в одном не выполняется Поток1 порождает поток3. Проверяется условие в потоке1, выполняется, поток завершается. Проверяется условие в потоке3, не выполняется. Поток3 порождает поток4. Проверяется условие выхода из цикла в потоке4 и потоке3, не выполняются, потоки выходят из циклов и завершаются. Тем временем поток2 времени даром не теряет. Порождает поток5. Проверяется условие в потоке2, выполняется, поток завершается. Поток5 порождает поток6. Проверяются условия выхода из цикла в потоке5 и потоке6, не выполняются, потоки выходят из циклов и завершаются. Пфффффф....

Ответ 3



1 итерация. 0 && (0 == 1), break не выполняется, процесс порождённ. 2 итерация. 0 && (1 == 1), break не выполняется, процесс порожден 3 итерация. 0 && (2 == 1), break не выполняется, процесс порождён, выход из цикла Итого, 3 порождённых + 1 родительский, наверно :) P.S я не знаю что делает fork(); в дебрях и под Linux не пишу, только что прочитал в сети.

Как проверить, зашел ли пользователь с мобильного устройства или с компьютера?

#jquery #mobile #javascript #php


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


Ответы

Ответ 1



Проверяйте содержимое navigator.userAgent на наличие подстрок "iphone", "android", "blackberry", "webos", и т.д.

Ответ 2



У Яндекса есть хороший API для определения мобильных устройств: API Яндекс.Детектор. PI Яндекс.Детектор предоставляет возможность определения модели и характеристик мобильного устройства пользователя сайта по заголовкам HTTP-запросов, передаваемых браузером его устройства.

Ответ 3



Подделать можно устройство легко, не вариант Если на стороне клиента то можно на js проверить размер экрана. Как сами понимаете у телефона или сматрфона экран будет меньше чем у ПК. Сразу дам навочку, а дальше сами

Ответ 4



Пример на php (может кому в будущем пригодится). Взят с этого сайта. Пользую на своих проектах - работает. // определение мобильного устройства function check_mobile_device() { $mobile_agent_array = array('ipad', 'iphone', 'android', 'pocket', 'palm', 'windows ce', 'windowsce', 'cellphone', 'opera mobi', 'ipod', 'small', 'sharp', 'sonyericsson', 'symbian', 'opera mini', 'nokia', 'htc_', 'samsung', 'motorola', 'smartphone', 'blackberry', 'playstation portable', 'tablet browser'); $agent = strtolower($_SERVER['HTTP_USER_AGENT']); foreach ($mobile_agent_array as $value) { if (strpos($agent, $value) !== false) return true; } return false; } // пример использования $is_mobile_device = check_mobile_device(); if($is_mobile_device){ echo "Вы зашли с мобильного устройства"; }else{ echo "Вы зашли с PC"; }

Ответ 5



Определение мобильного браузера Detect Mobile Browsers

Ответ 6



Браузер серверу отправляет вполне подробную информацию о самом себе, а уже на стороне сервера эту инфу проверять можно ...

Как правильно подключить jar библиотеку к проекту в Eclipse?

#java #android #eclipse #android_sdk


Доброго времени суток.
По каким-то причинам, если мой класс наследует класс, который определен в JAR файле,
ClassLoader выбрасывает исключение, что не может найти класс. Однако, если не наследовать
класс, то все работает.

Я скопировал проблемную библиотеку android-support-v4.jar из android-sdk в $(PROJECT_PATH)/jars,
затем подключил её в проекте как видно на картинке 



Однако, при старте выбрасывается исключение NotClassFoundError, а перед этим в лог
пишется сообщение:

> 
> 04-16 23:09:32.131: W/dalvikvm(1571):
> Unable to resolve superclass of
> Lbt/nativeclient/TorrentAdapter; (8)
> 
> 04-16 23:09:32.171: W/dalvikvm(1571):
> Link of class
> 'Lbt/nativeclient/TorrentAdapter;'
> failed


Собственно мой код, который наследует класс PagerAdapter из библиотеки:

package bt.nativeclient;
import android.support.v4.view.PagerAdapter;
import android.view.View;
public class TorrentAdapter extends PagerAdapter {
    public TorrentAdapter() {

    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public boolean isViewFromObject(View arg0, Object arg1) {
        // TODO Auto-generated method stub
        return false;
    }
}


Я подозреваю, что я не учел какую-то маленькую деталь при работе с eclipse. 
Кто-нибудь может мне помочь с данной проблемой, возможно где-то надо дописать пути?
Спасибо.
    


Ответы

Ответ 1



Начиная с ADT 17 (если я все правильно помню) нужно просто класть в libs, плагин сам добавляет jarку в билдпас, в раздел Android Dependencies, в apk тоже добавляет автоматичекски. Вручную в билдпасе она пробисана быть не должна, если есть - убери. Если не подтянулась из libs - это глюк. Клин, если не поможет - перезагрузить эклипс, еще раз клин.

Как сделать превью сайта?

#javascript #html5 #css


К примеру: есть список ссылок, рядом с ссылкой картинка. Как сделать так чтобы эта
картинка была скрином с сайта на который ведет ссылка?    


Ответы

Ответ 1



Привет. Чтобы получить скриншот сайта можно воспользоваться бесплатным сервисом http://mini.s-shot.ru/. Пример использования такой: function screen($url, $extn, $size, $format) { $url = 'http://mini.s-shot.ru/'.$extn.'/'.$size.'/'.$format.'/?'.urlencode($url); $str = file_get_contents($url); file_put_contents('screen.'.$format, $str); // тут лучше указать путь куда сохранять } screen('http://hashcode.ru', '1024x768', '600', 'jpeg'); Функция используя сервис создает скриншот сайта и сохраняет его в файл "screen.jpeg". Потом можно подгрузить с помощью

Как получить стек потока, когда приходит сигнал SEGMENTATION FAULT?

#c #unix #cpp #linux


В многопоточной программе какой-то поток выполняет недопустимую операцию и ядро присылает
сигнал SEGMENTATION FAULT. Я хочу посмотреть стек этого потока на момент выполнения
недопустимой операции.
Подскажите, пожалуйста, каким образом это можно сделать.
Я подозреваю, в обработчике сигнала можно что-то сделать, но вот что?
В принципе можно получить идентификатор потока при помощи функции pthread_self()
и каким-нить образом достать стек этого потка...     


Ответы

Ответ 1



А какие у вас ограничения? Вы не можете воспользоваться gdb? что-то типа $ulimit -c unlimited $./your_prog $gdb -c core ./your_prog gdb> bt или вообще посмотреть прямо в gdb где все падает?

Ответ 2



После запуска gdb набираем : gdb> thread apply all bt full Получаем стек выполнения для каждого запущенного потока плюс указание на то, в какой функции все завалилось.

Асинхронность. Почему не работает обработчик события?

#c_sharp


Господа программисты. Прошу вашей помощи. Разбираюсь с асинхронным программированием
и иногда возникают некоторые сложности.  Вот есть такой класс:

delegate void simpleDelegate(int progress);
class Calculations  
{  
    public event simpleDelegate Progresschanged;  
    public int getsquare(int digit)  
    {  
        for (int i = 0; i <= 100; i++)  
           if (Progresschanged != null)  
                Progresschanged(i);  
        return digit * digit;  
    }  
}

и есть форма, где по нажатию кнопки запускается метод класса в асинхронном режиме:
delegate int myDel(int r);
 private void button1_Click(object sender, EventArgs e)
    {
        Calculations calc = new Calculations();
        calc.Progresschanged += delegate(int r)
        {
            this.Invoke(new MethodInvoker(() =>
            {
                progressBar1.Value = r;
            }));
        };

        myDel deleg = calc.getsquare;            
        IAsyncResult res = deleg.BeginInvoke(12, null, null);            
        int k = deleg.EndInvoke(res);
        listBox1.Items.Add(k);
    }

Не знаю почему, но приложение намертво зависает. Причём, если не использовать асинхронность,
а сделать типа такого:    

myDel deleg = calc.getsquare;            
deleg(12);

то всё работает. Что мне исправить, но не убирая асинхронности?    


Ответы

Ответ 1



Насколько я понимаю, у вас присутствует взаимная блокировка. Вот что у вас происходит в главном потоке: Сначала вызывается button1_Click() Затем в этом методе создается новый поток для асинхронного выполнения getsquare() Далее сразу же вызывается EndInvoke(), тем самым блокируя главный поток до тех пор, пока не будет выполнен getsquare() Теперь, что происходит в новом потоке: Запускается выполнение getsquare() Затем дергается событие, на которое был подписан делегат из метода button1_Click() Далее в этом делегате вызывается Invoke() сигнализируя диспетчеру потоков о том, что в главном потоке необходимо выполнить некоторое действие. Блокируется в освобождении главного потока. Однако главный поток не будет освобожден никогда, поскольку заблокирован в EndInvoke(). Решение проблемы: использовать Callback. IAsyncResult res = deleg.BeginInvoke(12, new AsyncCallback(Complete), null); // ... void Complete(IAsyncResult ar) { var caller = (myDel) ((AsyncResult) ar).AsyncDelegate; int k = caller.EndInvoke(ar); // ... }

Ответ 2



Ну у Вас тут нифига не асинхронность: int k = deleg.EndInvoke(res); Данный код будет ждать результата. И вешать поток нахрен. И, кстате, вы понимаете что этот код будет выполняться в том же потоке, так же что тоже не будет в чистом виде "Асинхронно". По факту, этим кодом(BeginInvoke) вы ставите в очередь на выполнение указанную функцию, если придут какие-либо другие события то они будут ждать завершения работы делегированного кода (будут в очереди за ним). А зависание происходит от того что вы ставите в очередь на выполнения делегата, и ожидаете завершение его, а он не может даже запуститься т.к. вы не вышли из обработки кнопки. Наверное вам лучше прочитать про Thread'ы. Асинхронный вызов синхронных методов

Как получить часовой пояс на Python

#python


Здравствуйте. Нужно получить номер часового пояса на питоне time.timezone выдаёт
стоил вроде.-14000 а мне нужно получить например для Москвы 3.
Кто нибудь подскажет как это сделать. Заранее спасибо    


Ответы

Ответ 1



Для работы с временными зонами сами разработчики Python рекомендуют использовать модуль pytz

Ответ 2



Чтобы получить верное значение для разных дат, необходимо использовать базу временны́х зон (zoneinfo), которая хранит правила смены часовых поясов в мире. В Москве эти правила менялись в последние годы. В Питоне, tzlocal модуль позволяет вернуть pytz.timezone объект, который содержит правила для локальной часовой зоны: from datetime import datetime from tzlocal import get_localzone # $ pip install tzlocal tz = get_localzone() # local timezone d = datetime.now(tz) # or some other local date utc_offset = d.utcoffset().total_seconds() Этот код возвращает текущий часовой пояс в переносимой манере с учётом правил, предоставляемых установленной версией pytz модуля. В большинстве случаев можно ограничиться стандартной библиотекой: #!/usr/bin/env python3 from datetime import datetime, timedelta, timezone d = datetime.now(timezone.utc).astimezone() # local time utc_offset = d.utcoffset() // timedelta(seconds=1) В редких случаях, на системе такой как Windows, которая не предоставляет доступ к zoneinfo, этот код может вернуть ошибочное значение. Дополнительные варианты, которые обходят эту проблему и/или варианты для старых версий Питона, можно найти здесь.

Название полей таблиц

#postgresql #база_данных #mysql


Подскажите, в каком виде лучше записывать название полей в бд?
Например, есть поле catId. Как считаете, не лучше ли его назвать cat_id ?
Есть ли какие-то стандарты и своеобразные правила к записи названий полей?
З.Ы. понимаю, что вопрос странный и, наверное, в какой-то мере глупый, но всё же.    


Ответы

Ответ 1



В то время, как в коде принято называть переменные в виде camelCase, в таблицах используется наименование вида cat_id, type_id и подобное. Соответственно, лучше называть поля с "_" и не использовать заглавных букв - так будет проще поддерживать и разрабатывать код.

Ответ 2



Дело вкуса. Я лично придерживаюсь таких правил (раздел 10: SQL, базы данных) P.S. С reg.ru никак не связан, и по остальным пунктам - не всё разделяю :)

Права доступа extjs

#extjs


Доброго времени суток. Столкнулся с задачей добавления прав доступа ко views extjs.
На уме только один вариант загружать json типа:
{
    view1: 1,
    view2: 0,
    view3: 0
}
Где 1 - write, 0 - read. И каждому view передавать параметром свой access. И уже
в initComponent ставить условие включать тот или иной элемент во view или нет. Есть
более красивые варианты? Может кто-то уже сталкивался с подобной задачей?    


Ответы

Ответ 1



Раз стоит задача, что каждый view может принимать разные вариации в зависимости от прав доступа к нему, то да — "разруливать" эти вариации следует в initComponent. Вот только информацию о правах доступа я бы передавал не параметрами, а реализовал бы глобально доступный метод (через синглтон), который бы принимал аргументом имя view (и ещё, может быть, его контекст) и давал бы ответы "read", "write", "none" и т.п. Каждый view в своём initComponent опрашивал бы этот метод и получал бы ответ о том, как ему самого себя представить юзеру. Такой подход позволит реализовать любую кастомную логику выдачи ответов "read", "write", "none" по имени view, и по умолчанию можно как раз настроить эту логику на опрос JSON из вашего примера, который в свою очередь придёт с сервера.

Ответ 2



Возможно, есть более правильные и тривиальные решения, но в нашей конторе это реализовано следующим образом. Авторизация в системе у нас проходит без участия ExtJS (4.2), потому что стандартные компоненты не позволяют работать функционалу автосохранения пароля в браузере. После авторизации, на странице мы создаем некий DOM элемент со статичным ID, в котором храним массив переменных с уровнем доступа, чтобы каждый раз не запрашивать их (в массиве более 500 значений). Для доступа к данным используем Ext.get('element_id'). В initComponent и уже прогруженных View мы или дизейблим элементы, или вовсе их не рендерим. Но на стороне API всегда сохраняется проверка прав доступа.

Получение директории программы

#net


Всем доброго времени суток. 
Задача - получить адрес установленной программы (браузера), допустим, нам нужно поднять
operу, нужно получить адрес к ней.
Так как держать @"C:\Program Files (x86)\Opera\opera.exe" не есть гуд. 
Заранее спасибо.     


Ответы

Ответ 1



В дополнение к предыдущему ответу. GUID программы вряд ли будет известен заранее (а в некторых случаях это вовсе и не GUID), поэтому есть смысл поискать программу в этом разделе реестра по её названию (параметр 'DisplayName'). А интересующий вас параметр - это 'InstallLocation'. public static string GetLocation(string programName) { var uninstall = Registry.LocalMachine .OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"); if (uninstall == null) { return String.Empty; } foreach (string subKeyName in uninstall.GetSubKeyNames()) { using (var subKey = uninstall.OpenSubKey(subKeyName)) { if (subKey != null) { var keyValue = subKey.GetValue("DisplayName"); if (keyValue != null && keyValue.ToString() == programName) return subKey.GetValue("InstallLocation").ToString(); } } } return String.Empty; } И сразу же хочу сделать 2 замечания к этому коду: Сравнивать название программы в большинстве случаев не будет имет смысла, потому что в название обычно входит и версия. Скорее всего сравнение лучше заменить на String.StartsWith(). В 64-битной системе информация о всех программах, которые работают в WoW64-режиме будет находится в другом разделе HKLM: SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall Поэтому в 64-битной системе есть смысл проверить два этих раздела.

Ответ 2



Универсально и хоть с какой-то гарантией - спросить у юзера :-) Если не универсально и без гарантии, то можно поискать где-то тут: HKLM/Software/Microsoft/Windows/CurrentVersion/Uninstall/{что-то}/InstallLocation P.S. {что-то} - это GUID программы, который нужно знать заранее. P.P.S. Или аналогично - в HKCU

Вывод сотых числа после запятой

#php


Как сделать чтобы после полученного значения, если оно целое или один знак после
запятой, выводились 1 или 2 нуля в зависимости от числа?
[UPD]Все оказалось гораздо проще: sprintf("%.02f",$ostatok)    


Ответы

Ответ 1



", $value); $value = 10.3; echo sprintf("%.2f" . "
\n", $value); $value = 10.23; echo sprintf("%.2f" . "
\n", $value); ?> Вывод: 10.00 10.30 10.23

Ответ 2



Try it

Как уменьшить расход памяти? php, cURL, array

#массивы #память #php #оптимизация #curl


Собираю два массива А и Б по ~миллиону целых чисел из веб сервиса, чтобы затем сосчитать
их пересечение. Сервис отдаёт за один запрос 1000 чисел, поэтому в цикле около 1000
раз для каждого приходится делать запрос через cURL. Коннекшн один, используется снова
и снова: подставляются новые значения в CURLOPT_POSTFIELDS, и снова curl_exec().

Полученный json разбирается, и очередной массив с 1000 целых чисел merge'ится в А или Б.

Пока это всё работает в виде пруф-оф-концепт на shared хостинге руЦентра, где памяти
выделено всего ничего. С партиями меньше миллиона скрипт справляется. Больше - вылетает
с фатальной ошибкой об исчерпанной памяти. Иногда на этапе получения второго миллиона
из сервиса, иногда уже после, на этапе сравнения.

Вместо ф-ий array_merge() и array_intersect() уже использую свои, менее ресурсоёмкие:
мне не нужно сортировать и получать само пересечение, достаточно сосчитать кол-во общих.

Не может только массив целых с 2 млн. значений занимать десятки мегов памяти же!
Как понять, раздувается ли это cURL при каждом новом обращении? Или, может, массивы
хранят значения не как целые по 4 байта, а как строки например?

Сориентируйте, пожалуйста, с оптимизацией по памяти - куда копать?
    


Ответы

Ответ 1



Имхо при ужатой памяти вам проще на БД переложить этот процесс. Работать будет дольше, но памяти есть меньше. Может быть, можно будет даже часть алгоритмов на базу переложить. Далее, в php с памятью такая анархия, что лучше даже не интересоваться. Достаточно сказать, что размер массива всегда степень двойки (в большую сторону), состоит он из указателей(4-8 байт) на int, а int - это структура(имя, тип, размер etc). И далее, если можно обрабатывать все в процессе - do it. Т.е. получили тысячу, обработали, выкинули, погнали дальше. Если нет - БД. Теоретически можно попробовать с временными файлами поколдовать, но вряд ли этот способ сильно выиграет у БД по удобству/скорости.

Объявление шаблонного класса

#cpp #шаблоны_с++


Есть класс:
template 
class cFunction {
public:
    cFunction(T* _func, int _n);
    float getY(int num);
private:
    T* func;
};

и есть класс:
class cFunction1 {
public:
    cFunction1(float _a, float _b, float _x);
    cFunction1();
    void setParams(float _a, float _b, float _x);
    float getY();
private:
    float a, b, x;
};

который может передаваться в качестве параметра для класса cFunction.
Как объявить объект класса cFunction с параметром cFunction1?
Такая конструкция:
cFunction  *func = new cFunction(f1, size);

выдает ошибки:
undefined reference to `cFunction::cFunction(cFunction1*, int)'
collect2: ld returned 1 exit status
    


Ответы

Ответ 1



Хм. Шаблоны в C++, в отличие от, например, .NET, -- конструкция времени компиляции. То есть, во время выполнения программы шаблонов не существует, существуют только конкретные специализации. А теперь подумайте: если реализация вашего шаблонного класса в .cpp, откуда компилятор узнает, что нужно скомпилировать специализацию для шаблонного параметра cFunction1? Никак: когда он компилирует .cpp-файл с шаблоном, он не знает, какие специализации нужны, а когда он компилирует место, где заказывается специализация, у него нету исходников шаблона. Решение -- вынесите весь шаблонный класс в .h. Обратите внимание, что весь, к примеру, STL написан по этому принципу: реализация находится в header'е.

Ответ 2



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

adb windows 8 64bit

#android #adb #windows_8


К сожалению, купил и установил на компьютер Windows 8 Pro 64 и теперь возникла проблема
с подключением девайса. Повествование касательно самсунг, но думаю с другими вендорами
будет аналогично. Установил все нужные тулзы для разработки, установил Samsung kies
- подключил по usb девайс - он его не видит. Драйвера через кайс ставил - результат
аналогичный. Смутило, что обычно win 7, например, ставил драйвера устройства и потом
все хорошо, девайс видно из Eclipse. Теперь же такого не было.
Слышал, что это из-за того, что стоит настройка отказа установки устройства с неподписанным
драйвером, но пока не нашел где эту шнягу выключить.
Может, ну может, кто-нибудь, ну пожалуйста :) сталкивался с подобной проблемой и
знает ее решение?
Второй вопрос тоже наметился: avd не запускается(видимо из-за C:/Users/русские буквы)
- напомните как решить и это за одно. Помню как-то перемещал avd и указывал путь.    


Ответы

Ответ 1



У меня тоже Windows 8 Pro x64, Eclipse 3.7.2 с установленным AVD,SDK, драйвер (samsung_usb_driver_for_mobile_phones) для моего Samsung Galaxy W, и установлена галочка "Отладка USB", всё работает без проблем. Кайс вообще не использую.) Слышал, что это из-за того, что стоит настройка отказа установки устройства с неподписанным драйвером, но пока не нашел где эту шнягу выключить. Впервые слышу.) Второй вопрос тоже наметился: avd не запускается(видимо из-за C:/Users/русские буквы) - напомните как решить и это за одно. Помню как-то перемещал avd и указывал путь. Пишем своё первое приложение на Android - в самом низу описано. такая же была проблема.

Ответ 2



Все решается иначе, спасибо хабраюзеру serso за ссылку - PdaNet

Ответ 3



Запрет установки не подписанных драйверов в Windows отключается в консоли. Cmd Bcdedit.exe -set testsigning on Эта команда переводит систему в тестовый режим для разработчиков. В этом режиме отключается проверка цифровой подписи

Получить параметры функций

#cpp #функции


Использую в программе систему перевода с применением функции Lang("Text"), которая
возвращает найденный перевод строки, либо переданный текст. По ходу вызовов Lang()
программа заносит новые слова в файл.
Как бы получить сразу все тексты во всех Lang()? Подозреваю, вариант с применением
#define и хитрым кодом. Хотя как вариант можно прогнать код программы через парсер.    


Ответы

Ответ 1



Для Windows, я бы решил эту проблему аналогично, как в ситуации: "Построение цепочки потомков для каждого скомпилированного символа", при условии, что макрос _D выглядел бы как-то так: #define ___D( x ) #x #define __D( marker, x ) ___D( marker ## x ) #define _D( x ) __D( LangMarker, x ) при том, что marker более ни где по коду в тексте встречаться не будет. И, соответственно, использовался бы он так: Lang( _D( someone save us ) ); Хотя, именно для такой задачи, "овчинка выделки не стоит". Можно даже вырезать из всех этих строк сам маркер! Т.е. маркер будет выступать в роли compile-time-атрибута, предписывающего размещение строки в таком массиве, но это реализовать уже сложнее, т.к. потребует модификации всех ссылок на эти строки. Можно в самом маркере закодировать переменную, в которую будет сливаться такой массив. Т.е, на самом деле, вариантов, как это реализовать в compile-time достаточно много и может ограничиваться только фантазией и возможностями самого языка. Мои комментарии везде позаканчивались, поэтому я выбрал из своих ответов тот, который бы решал поставленную задачу. Некоторые зависимые от него комментарии я так же переместил в тело ответа, чтобы была понятна их связь. Следите, пожалуйста, за моими новыми комментариями при редактировании ответа. К сожалению, более подходящего решения оставлять сообщения в форуме я пока не вижу. Думаю, стоит этот вопрос вынести на рассмотрение администрации. Комментарии: как это решение привязать к моей задаче @mikelsv, это решение включает в себя "посткомпилятор", который найдет все строки в объектных файлах и выделит из них только те, которые помечены маркером. Организует из них список или вектор и поместит адрес его первого элемента в какую-нибудь статическую переменную. Все это он сделает на этапе компиляции, поэтому в программе вектор/список строк будет известен заранее, можно даже знать его размер заранее. Если вы говорите о синтаксисе времени выполнения, то не гарантировано, что любая из конструкций Lang() вообще когда-либо сработает или вообще произведёт код Я не говорю о синтаксисе времени выполнения, я говорю о compile-time выражениях, которые допустимы в statement'е параметра функции. компиляция может до макроса Lang вообще не добраться. Например: #ifdef SOMETHING Lang("1") #else Lang("2") #endif Тогда это будет зависимая конструкция. Значит, в реальной программе эта конструкция и не встретится никогда без перекомпиляции с SOMETHING. Так что рантайм и компиляция не кажется мне адекватным решением Не уверен, что в адекватности дело. @mega: не, так нельзя рассуждать. Потому что если я перед функцией main напишу int doexit() { exit(0); return 0; } int i = doexit(); то рантайм ни до одного Lang не доберётся. Чем это отличается от #ifdef? Ничем, просто другой синтаксис. @VladD, как это соотносится с условием задачи? От #ifdef это отличается тем, что до Lang исполнение просто не доберется. Поэтому, если компилятор учитывает особенности ОСи, он и формировать не будет "недосягаемый" код. Ergo: в рантайме вы не можете гарантированно добраться до содержимого Lang. У меня другой вопрос: а зачем Вам "недосягаемый" Lang? Ведь Вы можете написать: #define MyLng( x ) Lang( x ) и везде в программе использовать MyLng, что в таком случае будете делать? Очевидно, будете править свой фильтр, "раздувать" regexp для Lang, и возможно, все будет хорошо, если не забудете, о каком-нибудь еще аналоге MyLng :) Или можете поступить интереснее: #define __Depend( x ) #x #define _Depend( x, y ) x ##<-depend <-## y #define Depend( x, y ) __Depend( _Depend( x, y ) ) Lang( Depend( head, neck ) ) Lang( Depend( head, _Depend( neck, body ) ) ) Очевидно, в такой ситуации очередное "раздувание" regexp будет частично включать код самого макроса Depend, все его возможные вложения и, соответственно все зависимости, которые из него вытекают. Т.е., у Вас и с досягаемым-то кодом уже проблемы, а Вы о недосягаемом думаете, странно :) По моему, один парсер ( а в нашем случае, лучше сказать - "сканер" ) эту задачу не решит. Вернее, суть его решения всегда будет заключаться в том, как бы переписать фильтр под конкретный код. А это означает, что человек, который его использует, при изменении кода, всегда будет сталкиваться с исходной проблемой, т.е. он ее так и не решит. Периодически, я с такими решениями тоже сталкиваюсь. Тот же doxygen - полезнейший продукт, но абсолютно "тупой" парсер. Вот и ему приходится расписывать в PREDEFINED десятки элементарных фильтров и следить за их обновлениями. Не знаю, как с макросами. Насколько я понял их надо вставить всюду в текст программы внуть Lang? Такая идея мало кому из пишущих код понравится. @avp, макрос нужен только для фильтрации строк, т.е., чтобы в массиве были только определенные константные строки, а не все, что были скомпилированы. Ну, допустим, самый простой вариант: все строки в Lang будут начинаться с ##, например: Lang( "##someone save us" ). Т.е. нужна какая-то идентификация самих строк. Если она уже есть, значит и код менять не потребуется. Либо, как вариант: все эти строки будут находиться в определенном сегменте памяти (секции), тогда модификации кода будут вообще минимальны. Я сейчас не могу сказать, в каком классе данных находятся константные строки VS, надо разобрать для примера какой-нибуть *.obj, со строками. Но в любом случае, это контролируется прагмой data_seg или code_seg, поэтому, заключив функцию/класс/заголовок и т.п., который содержит массовые вызовы Lang в определенный сегмент, его можно будет использовать в качестве фильтра, который будет отделять обычные строки от искомых. Поэтому без парсера тут не обойтись. Во во, и я о том же. А что может быть лучше парсера от VS? Наверное только парсер от VS, его-то мы и используем. Нам ведь не сам парсер нужен. Нам нужны результаты его работы. В *.obj и находятся результаты его работы. @mega: какой из примеров вы имеете в виду? #define MyLng( x ) Lang( x )? Это противоречит заданию -- искать надо текст Lang(...) MyLng как раз и делает вызов Lang(...). Как это может противоречить заданию? Но представьте себе, что у нас есть код: if (random(4) < 0) { cout << Lang("1") } Компилятор знает, что значение random положительное, и выкидывает код при оптимизации. Завтра приходит разработчик, находит ошибку и исправляет её. Запускать анализ снова? Даже если представить, что Компилятор делает какие-то предположения по поводу этой функции. Разработчик, исправив ошибку запустит процесс сборки заново. Т.е. запустит всю цепочку утилит компоновки, в которую входят все задействованные компиляторы, мой "посткомпилятор" (или "прелинкер"), и, непосредственно линковщик. Что с того? Будет массив на один элемент длиннее, что от этого изменится? Или Вы переживаете на счет того, что количество "билдов" программы увеличится? Не совсем я понимаю Вашу позицию. Вы ее проясните пожалуйста, а то, подозреваю, ее не только я не понимаю.

Ответ 2



Если я все-таки правильно понял задачу. Сделать синглетон-обертку для контейнера, например, множества std::set (или наследовать его) и заносить туда в функции Lang() все тексты, которые были переданы ей. Всегда можно прочитать содержимое этого контейнера.

Ответ 3



Вы под Юниксом? Попробуйте просто grep -rh 'Lang(' projectDir/ | sed 's/Lang(/\n\0/g' | grep 'Lang(' | sed 's/^.*Lang(\([^)]*\)).*$/\1/' | sort -u >out.txt (Надеюсь, нигде не напутал. Пусть гуру шелла поправят.)

Изучение WPF (Анимация кнопки при наведении курсора мышки)

#c_sharp #wpf


Доброго времени суток, Хешкодовцы

В продолжение предыдущего моего вопроса по поводу анимации с использованием триггеров. 

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


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


Заранее спасибо за Вашу помощь.



Update

Ну вот и опять появилось время для самообучения. Попытался вспомнить, на чем остановился,
еще нашел неплохую статью в MSDN, делаю аналогично, но другие стили, и на тригерах
опять столкнулся с проблемой. То ли читаю криво, то ли в windows 7 как-то особенно
получается.

В общем суть проблемы как было написано раньше осталась. Код XAML:


    
        
    
    
        
    



А вот результат. Изначально окно с растянутой кнопкой:



После наведения курсора мышки:



Убрали курсор мышки:



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

В общем, где я проглядел что-то?
    


Ответы

Ответ 1



Смотрите, в чём дело. Стиль для Button определяется примерно так, как в этом примере: http://msdn.microsoft.com/en-us/library/ms753328.aspx. Вы видите, что анимация на MouseOver реализована в переопределённом ControlTemplate через VisualStateManager (почитайте про него, полезная штука). Что происходит на самом деле: срабатывает ваш триггер и переключает Background срабатывает VisualStateManager, переходит в состояние CommonStates.MouseOver, и применяет поверх ваших изменений свои вычисленные значения (которые определены в Template, унаследованном от системного стиля.) То есть так сделать не получится, т. к. два фрагмента кода «сражаются» за цвет фона. Мораль отсюда такова: если уж меняете стиль контрола, перекрывайте его полностью. Или пользуйтесь выставленными наружу свойствами, это предусмотренные дизайном точки кастомизации.

Objective C: как клонировать UIView?

#objective_c


Доброго времени суток. 
Суть вопроса. Есть два View, в одном находится таблица и кнопка. Нужно клонировать
View с таблицей на другой несколько раз. Подскажите, пожалуйста, как можно это реализовать?
Спасибо.  
PS. После gogle понял, что надо писать функцию типа

-(UIView *)cloneView:(UIView *)myView {  
   ................  
   return cloneView;  
}

А вот что писать вместо точек остается тайной.    


Ответы

Ответ 1



Вот возможные косвенные решения вопроса: 1) UIView duplicate предлагает архивировать UIView: -(UIView *)cloneView:(UIView *)aView { NSData *archivedViewData = [NSKeyedArchiver archivedDataWithRootObject: self]; id clone = [NSKeyedUnarchiver unarchiveObjectWithData:archivedViewData]; return clone; } Этот метод должен работать с ограничением на views, которые не могут быть архивированы: Unfortunately, this won't work if your view has any subviews/objects that can't be archived (such as a UIImage) что означает, что если у вас есть картинки, то это решение не сработает. 2) Другое решение You can load a view from a XIB file several times предлагает создать xib-файл с вашим view, чтобы он с помощью [NSBundle.mainBundle loadNibNamed:@"ReusedView" owner:self options:nil]; порождал экземляры этого view. 3) Третье решение предлагает не клонирование, а просто перерисовку оригинального view. 4) Моё предложение: Вы так и не ответили, для чего именно вам понадобилось клонирование - это решение сгодится для не совсем-сложных-и-частных случаев - Вы создаёте для своих view специальные подклассы UIView, в которые добавляете метод: - (id)copyWithZone:(NSZone *)zone { UIView *copyView = [UIView allocWithZone:zone] initWithFrame:self.frame]; // Здесь процедура порождения копии return copyView; } И в теле этого метода скопировать всё содержимое вашего view шаг за шагом. Этот способ мне кажется самым надёжным и удобным. И если вам действительно нужны Клоны, то можно в copyWithZone описать всю вашу, даже возможно сложную, процедуру порождения копии. Да, и кстати, "решение" @Bimawa начнёт работать именно в том виде, в котором он описал. На SO я встречал соображение, что когда-нибудь Apple реализует -[UIView copyWithZone], поэтому ещё раз повторю, что это копирование лучше делать в методе copyWithZone подкласса UIView, а не, скажем, категории типа UIView+Cloning, чтобы не "засорять" UIView и его производные классы.

Ответ 2



UIView *view = [UIView new]; UIView *view2=[view copy];

Ответ 3



Мне тоже понадобился этот "а зачем вам это нужно". Я нашел очень простой и удобный способ делать клоны с использованием шаблонов storyboard. Для этого я создаю в своем объекте myController класса UIViewController нужный объект, например UIView, и кладу его в нижнюю строку конструктора (совершенно не обязательно). Далее создаю на него именованный outlet, например footerShooter. Когда мне нужна копия объекта, я создаю myController *controller, используя storyboard по идентификатору. Далее извлекаю нужный объект по ссылке controller.footerShooter, а от controller избавляюсь. Вот и все.

Ответ 4



UIView *view = [UIView new]; UIView *copyView = [viewsnapshotViewAfterScreenUpdates:YES];

Полная автоматизация установки web-сервера на Debian

#debian #bash #linux


Команда которой я ставлю веб сервер:

aptitude update && aptitude upgrade && \
 aptitude install apache2-mpm-itk nginx php5 libapache2-mod-php5 \
 mysql-server mysql-client php5-mysql phpmyadmin


Во время установки требуется несколько подтверждений и вводов пароля:


Подтверждение (Y/N) Нужно Y
Нужно ввести MySQL Root PASS
Еще раз ввести MySQL Root PASS
Появляется экран на котором стрелками выбор установленного веб-сервера ( 1 - Apache,
2 - lighttpd). Нужно 1
Подтверждение авто настройки phpmyadmin (Нужно Yes)
Pass of database admin user
Pass of database admin user - Retype
Pass of database admin user - Retype


Как это автоматизировать с помощью Bash скрипта. Чтобы скрипт сам все подтвердил и ввел?
    


Ответы

Ответ 1



утвердительные ответы на вопросы да/нет можно получить, передав опцию -y: $ sudo aptitude -y ... $ sudo apt-get -y ... конфигурационные опции можно задать до установки пакетов. посмотреть опции, например, для пакета mysql-server-5.5 (естественно, уже после установки): $ sudo debconf-show mysql-server-5.5 * mysql-server/root_password_again: (password omitted) * mysql-server/root_password: (password omitted) mysql-server-5.5/postrm_remove_databases: false mysql-server/password_mismatch: mysql-server-5.5/start_on_boot: true mysql-server-5.5/nis_warning: mysql-server/no_upgrade_when_using_ndb: mysql-server-5.5/really_downgrade: false mysql-server/error_setting_password: конфигурационные опции для всех установленных пакетов можно посмотреть программой debconf-get-selections из пакета debconf-utils. установить, например, пароль и подтверждение для пакета mysql-server-5.5 можно так: $ echo 'mysql-server-5.5 mysql-server/root_password password ваш_пароль' | sudo debconf-set-selections $ echo 'mysql-server-5.5 mysql-server/root_password_again password ваш_пароль' | sudo debconf-set-selections полностью отключить всякую интерактивность при выполнении aptitude, apt-get, apt, dpkg и т.п., можно с помощью переменной окружения DEBIAN_FRONTEND со значением noninteractive: $ sudo DEBIAN_FRONTEND=noninteractive aptitude install ...

Динамические массивы в СИ

#c


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

typedef struct
{
   int offset;
   int len;
}student;

struct student **students = NULL;

students[5000] = (student*)malloc(sizeof(student));
students[5000]->offset = 1; // здесь пишет dereferencing pointer to incomplete type
students[5000]->len = 2;

students[14] = (student*)malloc(sizeof(student));
students[14]->offset = 10;
students[14]->len = 20;


Понимаю, что тут не хватает ещё выделения памяти для самих students, как написать
не знаю. WinXP, DevCPP (mingw?)
Количество элементов в students заранее неизвестно, и они могут идти не последовательно.

UPDATE: Вот рабочий код

typedef struct
{
    int offset;
    int len;
}student;

student* students = malloc(5000 * sizeof(student));

students[4999].offset = 1;
students[4999].len = 2;

students[14].offset = 10;
students[14].len = 20;

printf("%d",students[4999].len);


UPD #2:
Вот очень хороший модуль uthash для хеш массивов. Отличная и понятная документация,
множество примеров.

Ещё хочу попробовать Красночерные деревья от MIT
    


Ответы

Ответ 1



Что за страшное students[5000]? =) В своём коде вы дословно пытаетесь присвоить 5001-му элементу массива students (который равен NULL), указатель на область памяти, достаточной для одного экземпляра структуры student. Если вам нужно выделить память под 5000 записей типа student, то сделать это можно так: students = (student**)malloc(5000 * sizeof(student)); И после завершения работы с данными не забудьте очистить память во избежение утечек! free(students); UPDATE. Если вам нужно некое поле-челочисленный идентификатор студента, выделите в структуре дополнительную поле под этот идентификатор, а студента с 5000 ID ищите перебором по этому полю. Иначе вам придётся либо выделять память под всех студентов, либо реализовывать хэш-таблицы или другие способы поиска по ключу. То, что вы хотите сделать на самом деле не имеет никакого смысла если задуматься, как компьютер производит доступ к элементу массива. Если у вас не выделена память под предыдущие элементы, как ему узнать, в какой ячейке искать 5000? А если вам нужно добавить 3000, а память между 0 элементом и 5000 уже занята? Именно поэтому язык не допускает таких трюков.

Thread-safe очередь, и все-все-все

#очередь #c #многопоточность #cpp


Опять у меня идиотский вопрос (простите, но впадаю в старческий маразм, "бабушка
ничего не помнит").
Дано: поток данных поступает в очередь (com-порт). Другой поток разгребает эту очередь,
складывает разобраные данные в базу. Всё в рамках одного приложения.
Вопрос: что юзать в качестве очереди на C (возможно, C++)    


Ответы

Ответ 1



Видимо что-то в таком духе (увидел знакомую тему и не удержался). #include #include #include #include #include struct qitem { struct qitem *next; int len; char data[1]; // реально здесь будет len+1 байт данных }; struct queue { struct qitem *head, *tail; // head == tail == 0 очередь пуста pthread_mutex_t lock; // мьютекс для всех манипуляций с очередью pthread_cond_t cond; // этот cond "сигналим" когда очередь стала НЕ ПУСТОЙ pthread_t th; // tid обработчика }; void inqueue (const char *str, int len, struct queue *q) { struct qitem *p = (typeof(p))malloc(sizeof(*p) + len); strcpy(p->data, str); p->len = len; p->next = 0; pthread_mutex_lock(&q->lock); if (q->tail) q->tail->next = p; else { q->head = p; pthread_cond_broadcast(&q->cond); // теперь очередь не пуста, сигнализируем } q->tail = p; pthread_mutex_unlock(&q->lock); } void processit (struct qitem *p) { int t = atoi(p->data); if (t > 0) { printf ("Sleep %d\n", t); sleep(t); } } // обработчик очереди в отдельном потоке void * consumer (void *arg) { struct queue *q = (typeof(q))arg; for (;;) { pthread_mutex_lock(&q->lock); if (!q->head) { // очередь пуста, делать нечего, ждем... pthread_cond_wait(&q->cond, &q->lock); //pthread_mutex_unlock(&q->lock); // это для нескольких обработчиков очереди //continue; // в нашем случае не нужно // для нескольких "concurrent" обработчиков нужна последовательность // lock/check/wait/unlock/continue/lock/check... } struct qitem *p = q->head; q->head = q->head->next; q->nitems--; if (!q->head) q->tail = q->head; pthread_mutex_unlock(&q->lock); printf ("consume: %s", p->data); if (strcmp(p->data, "STOP") == 0) break; processit(p); free(p); } return 0; } // сделаем пустую очередь и запустим ее обработчик в новом потоке struct queue * run_consumer() { struct queue *q = (typeof(q))malloc(sizeof(*q)); q->head = q->tail = 0; q->nitems = 0; pthread_mutex_init(&q->lock, 0); pthread_cond_init(&q->cond, 0); pthread_create(&q->th, 0, consumer, (void *)q); return q; } int main () { void *res = 0; char *in = NULL; size_t sz; int l; struct queue *q = run_consumer(); while ((l = getline(&in, &sz, stdin)) > 0) { inqueue(in, l, q); in = NULL; } inqueue("STOP", 5, q); if (pthread_join(q->th, &res)) perror("join"); return (long)res; } Для тестирования просто читаем строки с клавиатуры, и ставим их в очередь. Обрааботчик их печатает. Если в начале строки число, то обработчик делает sleep, позволяя написать в очередь несколько строк.

Ответ 2



Я бы использовал просто queue. Поскольку у вас доступ к очереди из нескольких потоков, вам нужно синхронизировать обращения к очереди. Для синхронизации подошёл бы std::mutex, если он доступен на вашем компиляторе. В любом случае, какая-то синхронизация вам всё равно нужна, т.к. в её отсутствие у разных потоков может быть разное представление о содержимом памяти (например потому, что в многопроцессорной системе каждый процессор сбрасывает кэш независимо).

Ответ 3



Используйте boost::lockfree::queue

Чтение и вывод на экран содержимое файла

#файлы #java


import java.io.*;
import java.util.*;

public class prints{
  public static vois main(String[] args) throws IOException{
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    FileReader fin = new Filereader("/root/2/Files.txt"));
    String name;
    int c;
    System.out.println("Print File Files.txt? y/n");
    name = br.readLine();
    if(name.equals("y"))
    while ((c = fin.read()) != -1) System.out.println((char) c);
  }
}

Есть запрос, вывести ли содержимое файла на экран, если "y" то вывод.    


Ответы

Ответ 1



Если вам требуется вывести текст файла в консоль, то лучше выводить его построчно через BufferedReader. import java.io.*; public class FileRead{ public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); File f = new File("/root/2/Files.txt"); BufferedReader fin = new BufferedReader(new FileReader(f)); String name; String line; System.out.println("Print File "+f.getName()+"? y/n"); name = br.readLine(); if(name.equals("y")) while ((line = fin.readLine()) != null) System.out.println(line); } }

Ответ 2



FileInputStream file = new FileInputStream("file.txt"); Byte[] infile; file.read(infile[]); System.out.print(infile[]);

C++ сервер - клиент [закрыт]

#cpp #linux #windows #книги


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


Ответы

Ответ 1



Имеется довольно хорошая библиотека для этой цели: boost::asio. Boost - большой сборник высококачественных библиотек C++. Авторитет boost в мире C++ настолько высок, что решения boost включаются в стандарт языка C++. Boost позволяет писать кроссплатформенный код. В документации на boost::asio имеется пример готового TCP-сервера и TCP-клиента.

Ответ 2



Еще можно посмотреть в сторону QT, собственная документация по библиотеке очень хороша, так же есть примеры. Но с точки зрения универсальности применения - Boost более интересен. Из книг мне попалась "Создание сетевых приложение в среде Linux. Руководство разработчика", автор Шон Уолтон. Я ее использовал как вводное пособие в создание сетевых приложений.

Задание из ЕГЭ по информатике с помощью JS

#javascript


30го числа ЕГЭ, время на подготовку совсем нету, чисто случайно попалась программа,
котоая решает задачи подобного плана: 

У исполнителя Утроитель две команды,
которым присвоены номера:
1. прибавь 2,
2. умножь на 3.
Сколько существует программ,
которые число 1 преобразуют в число 55?

Но она на Win XP, а мне бы на айподе её использовать. Конечно задачку то я решить
могу, но там можно ошибиться в вычислениях + товарищ нифига не смыслит в этом, тоже
хотелось бы и ему помочь. Ну и я загорелся написать программу под айпод, т.к. знаниями
Objective C не располагаю, решил просто на JS сделать страничку в инете, на которой
можно будет это решать. Но вот начал думать, что-то даже и не знаю, как сделать. 
Алгоритм то такой: постипенно выполнять эту задачу для чисел меньше 55, т.е. сначала
для 2, потом для 3 и т.д. Формула такая: R(n) = R(n-2) + R(n/3) это для данной задачи.
R(n) - это кол-во программ, n это число в которое преобразовать. Если n не делется
на 3, то R(n/3) приравнивать к 0. И получается нам нужно найти только R(2),R(3) своим
умом и логикой, R(2)=0 (т.к. таких программ не существует), R(3) = 2 (можно умножить
1 на 3 или прибавить 2 к 1). А дальше уже подставляем всё в первую формулу: R(4) =
R(4-2) + R(4/3) 4/3 не делится, поэтому равно 0, следовательно R(4) = R(2) = 0. И так
далее, до 55. Вот такой алгоритм впринципе я представляю как организовать. Можно создать
массив с этими занчениями просто и всё и также работать, только будет не R(2), в R[2].
Но я не знаю как вычислить первые R(2),R(3) с помощью JS. 
Помогите пожалуйста. Ведь программы раздые бывают, может быть из числа 8 в число
27, с разными операциями исполнителя(например будут уже умножить на 2 и прибавить 3).
И вопрос именно как определить первые элементы массива, чтобы от них уже строить остальные
по формуле R(n) = R(X) + R(X) 
UPD:
Вот и программа, написал благодаря алгоритму IVsevolod:
    



Б13




Исполнитель умеет выполнять следующие команды:






Сколько есть программ, которые преобразуют
число в число


Ответы

Ответ 1



Хм. как я понял число 55 может меняться? я бы сделал рекурсивно, что-то типо этого (напишу на псевдо языке): функция Считаем(число) { результат = 0; число1 = число + 2; число2 = число * 3; если (число1 == 55) то результат ++; иначе если (число1 < 55) nj результат += Считаем(число1); если (число2 == 55) то результат ++; иначе если (число2 < 55) nj результат += Считаем(число2); вернуть реузльтат; } выводим Считаем(1); Синтаксис JS достаточно прост. На html страничку можно прикрутить пару формочек, и действие прикрутить к кнопке. надеюсь помог, и вопрос понял правильно :)

Ответ 2



Оттранслировал псевдокод из ответа IVsevolod на Java (с некоторыми вольностями) и добавил вывод получившихся программ для этой виртуальной машины. public class main { static int printCounter = 1; static int recurse(int arg, StringBuilder b){ return check(arg+2, new StringBuilder(b).append("+")) + check(arg*3, b.append("*")); } static int check(int arg, StringBuilder b){ final int checkResult = 55; if (arg == checkResult){ System.out.print(printCounter++); System.out.print("\t"); System.out.println(b); return 1; } if (arg < checkResult) return recurse(arg, b); return 0; } public static void main(String[] arg){ System.out.println(check(1, new StringBuilder())); } } Может, кому-то будет интересно побаловаться. :)

Редактор с разбиением окна на буферы как в vim или emacs

#редактор_текста #vim #emacs #linux


Интересует вопрос - существуют ли редакторы, под Linux, в которых есть возможность
разбить одно окно редактирования файла, на два, как это можно в vim или emacs, потому
что очень часто полезно видеть перед собой одновременно два исходника. 
И ещё хотел бы узнать, чтобы не создавать новый вопрос - чем emacs или vim лучше
(особенно в наше время)? Все говорят, что они настраиваемы до неузнаваемости, но в
чем выражаются эти настройки. Что можно полезного извлечь (для веб-мастера к примеру)
из этих редакторов, чего нет в других? 
P.S. Для себя я пока усвоил только разбиение окна на буферы.    


Ответы

Ответ 1



Из известных мне редакторов под линукс это умеют делать ещё два - QtCreator и Code::Blocks. Это конечно грубо, назвать IDE редактором, но мы же на форуме программистов, здесь в основном для кода и используются редакторы. Эти два умеют как просто сделать "два (и более) окна просмотра одного файла", так и разделить рабочее пространство для редактирования нескольких файлов. Также это умеет делать SublimeText (он платный, если что). Но там эта функция немного специфичная. Нужно в меню View->Layout выбрать способ разделения рабочего пространства, а после этого можно перетаскивать вкладки. Кстати, IDEA также умеет разделять рабочее пространство (меню Window->Editor Tabs). чем emacs или vim лучше (особенно в наше время)? Авторы этих редакторов в свое время поняли, что напихать все в один редактор сложно и не нужно и сделали гибкую систему плугинов (хотя это очень спорный вопрос - в эмаксе это своя модификация лиспа, а в виме ещё до недавно свой язык. Сейчас можно на питоне дописывать, но не полностью все). В других редакторах пытаются втиснуть все и сразу.

Заголовок Content-Length для передачи JSON

#json #javascript


Здравствуйте.
Очень часто в чужом коде и примерах я вижу такой код:
var userData = new UserInfo(login, pass);
            var userData = JSON.stringify(userData);
            request.onreadystatechange = asincComplete;

            request.open("POST", "user_auth.php", true);
            request.setRequestHeader("Content-Type", "text/plain");
            request.setRequestHeader("Content-Length", userData.length);
            request.send(userData);

У меня след. вопрос:
Почему заголовком Content-Length передают длину строки в симовлах (свойство length),
тогда как должна быть указана длина в байтах? Я понимаю, что выше приведенный код справедлив
только для латинских символов, но не для остальных символов юникода.
Каким способом вы кодируете json данные? И каким способом их декодируете на сервере
(например, на php)?
Спасибо.    


Ответы

Ответ 1



... 5.Terminate these steps if header is a case-insensitive match for one of the following headers: Accept-Charset, Accept-Encoding, Access-Control-Request-Headers, Access-Control-Request-Method, Connection, Content-Length, Cookie, Cookie2, Date, DNT, Expect, Host, Keep-Alive, Origin, Referer, TE, Trailer, Transfer-Encoding, Upgrade, User-Agent, Via … or if the start of header is a case-insensitive match for Proxy- or Sec- (including when header is just Proxy- or Sec-). ... отсюда Это означает, что далеко не все заголовки для запроса можно установить, используя XMLHttpRequest. Firefox 23.0 молча отбрасывает такие попытки, Chrome извещает в консоли вот так: Refused to set unsafe header, про остальные браузеры ничего сказать не могу. Конкретно Content-Length в вышеупомянутом списке с 2006 года, так что код либо очень старый, либо некачественный.

Ответ 2



Не нужно выставлять зголов length, это сделает сам браузер: function sendJson(url, jsonData, callback) { var xhr = new XMLHttpRequest(); xhr.open("POST", url, true); xhr.onload = function (){ callback(xhr) }; xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(JSON.stringify(jsonData)); } sendJson('/save/', { "foo": "bar" }, function (xhr){ console.log(xhr); });

Изолированное выполнение Java

#sandbox #java #plugin


Доброго времени суток!
Вопрос общего плана, так как пока пытаюсь собрать в кучу мысли и определится с инструментарием.
Есть (будет:)) ядро приложения, которое взаимодействует с файловой системой, базой
данных, сетью. Для увеличения его функционала планируется использование "модулей расширения".
Основная задача модулей - получить от ядра данные, каким-то образом их обработать,
вернуть результат.
Само собой, очень хочется, чтоб модули имели как можно меньше возможностей шариться
там, где им явно не разрешили...
Если бы речь не шла о кросс-платформе, я бы наверно удовлетворился *nix-chroot'ом
- каждой хрени по изолированной середе (+,возможно, по отдельному пользователю) и в
своих рамках хай творят, что хотят.
Вариант разработки своей интерпретируемой среды с кучей предметных объектов и языком..
наверно, в теории, тоже может рассматриваться, но уже попахивает извращениями в стиле 1С))
Вопрос - можно ли каким-либо образом запускать java-классы в среде... ну примерно
так, как это делает браузер для апплетов? Или может как-то можно уменьшить набор системных
классов для модуля (естественно предоставив аналогичные, но фильтруемые)...
Буду рад услышать идеи, соображения, ссылки на литературу...
Спасибо!    


Ответы

Ответ 1



Ну можно конечно извратиться и запустить 2 копии JVM, в одной JVM крутится ваше ядро, а во второй ваши плагины. Взаимодействие между ядром и плагинами организовать через RMI

Ответ 2



Похоже, вам пригодится кастомный ClassLoader, чтобы устанавить нужный ProtectionDomain. Ссылки: [1], [2].

Когда garbage collector ненужен и вреден?

#производительность #сборщик_мусора


Перечислите, пожалуйста, задачи (желательно поконкретнее), при которых влияние garbage
collector на производительность программы критична и несовместима с оптимальной работой
программы?    


Ответы

Ответ 1



любая задача которой паузы критичны. К примеру, проигрывание видео (пользователю не сильно приятно, когда видео просто останавливается, потому что gc решил поработать) кардиостимулятор (подожди пользователь, пару ударов пропустим, у нас тут gc.:) ) другие приборы жизнеобеспечения. автопилот сетевые real-time игры. Только прицелился, а тут "сделай паузу, скушай батончик".

Клиент -android, сервер -java app

#android #сокет #клиент_сервер


Здравствуйте, помогите пожалуйста! Есть Клиент под Android и сервер на java на pc
- когда запускаешь с эмулятора - все работает - сообщения передаются. Когда запускаешь
приложение на android устройстве - при нажатии на кнопку отправить всё вылетает.
Очень нужна ваша помощь.

Код Клиента:

package com.example.client;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import com.example.client.R;
import android.app.Activity;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;    
public class MainActivity extends Activity {

private Socket client;
private PrintWriter printwriter;
private EditText textField;
private Button button;
private String messsage;
String ip="192.168.0.80";
int port=80;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);
textField = (EditText) findViewById(R.id.textout); 
button = (Button) findViewById(R.id.send);

button.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {

messsage = textField.getText().toString(); 
Socket client =null;
textField.setText("");      
DataOutputStream dataOutputStream= null;
DataInputStream dataInputStream = null;

try {

 client = new Socket("192.168.0.80", 80);
 client.setSoTimeout(100);
 dataOutputStream = new DataOutputStream(client.getOutputStream());
 dataInputStream = new DataInputStream(client.getInputStream());
 dataOutputStream.writeUTF(messsage);

} catch (UnknownHostException e) {
 e.printStackTrace();
} catch (IOException e) {
    System.out.println("Got an IOException: " + e.getMessage());
}
}
});
}
}

    


Ответы

Ответ 1



Вы производите коннект с сервером в главном потоке, на реальном устройстве в новых версиях Android SDK это выкидывает исключение, а на эмуляторе работает. Вам нужно создать поток Thread или Runnable и вынести всю логику коннекта и связи на этот поток. Обновление Вот этот код внесите в run(): client = new Socket("192.168.0.80", 80); client.setSoTimeout(100); dataOutputStream = new DataOutputStream(client.getOutputStream()); dataInputStream = new DataInputStream(client.getInputStream()); dataOutputStream.writeUTF(messsage);

Ответ 2



Почитайте следующие статьи Отзывчивое Android-приложение или 1001 способ загрузить картинку Процессы и потоки в Android: пишем AsyncTask правильно «Правильный» html парсинг

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

#java #concurrency #mysql


Мини-проект на Java. Суть мини-проекта: Данные вводятся пользователем, кэшируются,
кладутся в базу. Разумеется, тут есть многопоточность, т.е. будет тестовый клиент,
запускающий кучу потоков на чтение/запись.
Как, собственно, правильно считать число запросов к базе? 
Обязательно ли использование java.concurrency?
P.S.: Я тут прикинул следующий код, скажите насколько он тут уместен?
public class DAO {

public volatile int counter;

public void synchronized addNumber {

   try{
     ... // положили какое-то значение в базу
   } catch (Exception e) {
     // логируем
   } finally {
     counter++;
   }

}

// Аналогично будет и со взятием значения из базы

}
    


Ответы

Ответ 1



Может проще взять AtomicInteger и не ломать голову?

Как в запросе к dbf указать кодировку?

#c_sharp #dbf


Есть dbf файл, созданный Visual Fox Pro. Его я менять не могу, могу только читать. Читаю
 conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=e:\\;Extended
Properties=dBASE IV;User ID=;Password=;";
                    conn.Open();
                    OleDbCommand comm = conn.CreateCommand();
                    comm.CommandText = @"SELECT NOMER, FEMGN, FEOBS, DATA, TIME FROM
ANALIZ";
                    dt.Load(comm.ExecuteReader());
                    column = dt.Columns[0];
                    row = dt.Rows[0];
                    result = row[column].ToString();
                    dataGridView1.DataSource = dt

Но в файле кодировка dos. Необходимо привести к utf -8. Пытаюсь так - не получается
 var fromEncodind = Encoding.GetEncoding(866);//из какой кодировки
                var bytes = fromEncodind.GetBytes(o);
                var toEncoding = Encoding.UTF8;//в какую кодировку
              string  ans = toEncoding.GetString(bytes);

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


Ответы

Ответ 1



DBF таблицы с кодировкой 866 грузится нормально, если загружать через OLE DB Provider for Visual FoxPro 9.0 private void LoadTable(string path, DataGridView dataGrid) { try { var connectionString = "Provider=VFPOLEDB.1;Data Source=" + path + ";Collating Sequence=MACHINE"; var con = new OleDbConnection(connectionString); con.Open(); var adapter = new OleDbDataAdapter("SELECT * FROM " + Path.GetFileNameWithoutExtension(path), con); con.Close(); var dataSet = new DataSet(); adapter.Fill(dataSet); dataGrid.DataSource = dataSet.Tables[0]; } catch (Exception err) { MessageBox.Show(err.Message + " " + path, "Ошибка открытия DBF таблицы", MessageBoxButtons.OK, MessageBoxIcon.Error); } }

Ответ 2



помимо Provider=VFPOLEDB.1 из ответа Мурада, в случае английской винды еще потребуется: var value = ds.Tables[0].Rows[0][1]; string encodedValue = Encoding.UTF8.GetString((Encoding.Convert(Encoding.GetEncoding(866), Encoding.UTF8, Encoding.Default.GetBytes(value.ToString()))));

Выборка из SQL возвращает лишние скобки

#python #sql


Делаю выборку из SQL
cur = db.cursor()
cur.execute("SELECT FL_ARCHIVE FROM ROUTE WHERE FL_ARCHIVE >= 10")
select_results = cur.fetchall()
for result in select_results:
    print result

Потом для каждого элемента выборки равного к примеру десяти хочу запускать определенную
функцию. Проблема в том, что из БД мне не 10 вовзращается, а
(10,)
(10,)
(11,)

Я конечно понимаю, что все лишнее можно выкусить, но наверно я что-то не так делаю,
если такой результат получается.
Кстати, вот 10 это будет строкой или числом? Т.е. мне надо писать
if result == '10':

или могу:
if result == 10:
    


Ответы

Ответ 1



Вы вызываете fetchall() , поэтому Вам возвращается кортеж. Делайте срез на первый элемент. print result[0] if result == '10': и if result == 10: разные сравнения. Лучше перед сравнением приводите к ожидаемому типу через str(result[0]) , например . Хотя в вашем случае возвращается именно тип int .

IOS высота cell в зависимости от текста

#ios7 #ios #coredata #tableview


Я получаю обьект из CoreData следующим образом: 
self.name = [[abc anyObject] valueForKey:@"name"]

и отображаю его:
cell.nameLabel.text = [NSString stringWithFormat:@"%@",self.name];
cell.nameLabel.numberOfLines = 0;
cell.nameLabel.lineBreakMode = NSLineBreakByWordWrapping;

Помещается текст не полностью. Как менять высоту cell в зависимости от текста?    


Ответы

Ответ 1



- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { CGSize constraintSize = CGSizeMake(286.0f, CGFLOAT_MAX); UIFont *theFont = [UIFont systemFontOfSize:14.0f]; CGSize theSize; if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) { CGRect frame = [[self.mArray objectAtIndex:indexPath.row] boundingRectWithSize:constraintSize options:(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading) attributes:@{NSFontAttributeName:theFont} context:nil]; theSize = frame.size; } else { theSize = [[self.mArray objectAtIndex:indexPath.row] sizeWithFont:theFont constrainedToSize:constraintSize lineBreakMode:NSLineBreakByWordWrapping]; } return theSize.height; } Обновлено для iOS 7 и выше.

Ответ 2



Наилучший общий способ, который я пока придумал, такой. Выносите весь контент (view'шки) из cell'а в отдельную view (можно её назвать как-то вроде BlaBlaCellContentView). В этой view заводите класс-метод, который вам возвратит высоту ячейки с определенными данными (типа + (CGFloat) heightForData:(Data *)data maxWidth:(CGFloat)maxWidth). В этом методе для вычисления высоты, просто делаете layout всех ваших вьюшек (как обычно делаете в layoutSubviews) и выставляете фрейм для самой вьюшки. Далее, в cell'е заводите weak синглтон (хотя необязательно weak, можно обычный синглтон) для этой вьюшки и делаете аналогичный метод для вычисления высоты, примерно такой: - (void) sizeToFitWithWidth:(CGFloat)width { self.Width = width; [self layout]; self.Height = self.bottomLabel.BottomY + kMarginY; } + (CGFloat) heightForProduct:(IHerbProduct *)product width:(CGFloat)width { CartItemCellContentView *sharedCellContentView = [self sharedWeakInstance]; sharedCellContentView.product = product; [sharedCellContentView sizeToFitWithWidth:width]; CGFloat height = sharedCellContentView.Height; return height; } (замечу, что .Width, .Height, BottomY - это из моей собственной категории для UIView, но из названий и так понятно, что они возвращают). Ну и код для weak синглтона (смысл - живет до тех пор, пока на него есть хотя бы одна ссылка. Если уничтожился, то при следующем вызове создастся заново): + (instancetype) sharedWeakInstance { static __weak id weakInstance = nil; id strongInstance = weakInstance; @synchronized(self) { if (!strongInstance) { strongInstance = [self new]; weakInstance = strongInstance; } } return strongInstance; } P.S. Пришёл к таком подходу, т.к.: sizeWithFont:constrainedToSize: не всегда даёт те же результаты, что и [UILabel sizeToFit]. Для сложных cell'ов приходится писать слишком много сложного кода для вычисления высоты - оказалось проще переиспользовать код для layout'а.

Ответ 3



Если у вас будет много ячеек разной высота, то можно вынести подсчет высоты в отдельный метод. - (CGFloat)textViewHeightForAttributedText: (NSAttributedString*)text andWidth: (CGFloat)width { UITextView *calculationView = [[UITextView alloc] init]; [calculationView setAttributedText:text]; CGSize size = [calculationView sizeThatFits:CGSizeMake(width, FLT_MAX)]; return size.height; } И потом уже получать высоту: UIFont *font = [UIFont fontWithName:@"HelveticaNeue-Medium" size:16.0]; NSDictionary *attrsDictionary = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName]; NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:text attributes:attrsDictionary]; CGFloat height = [self textViewHeightForAttributedText:attrString andWidth:280];

Ответ 4



-(void)viewDidLoad { self.yourTableView.rowHeight = UITableViewAutomaticDimension; self.yourTableView.estimatedRowHeight = 44.0f; } Всё! :)

Переменные в функции

#переменные #javascript


var title = "external title";
function example(){
    title = "changing external title";
    alert(title);
    var title = "internal title";
}

example();
alert(title);

Почему "при запуске кода сгенерируются сообщения "changing external title", а затем
"external title", показывающее, что внешняя переменная title не была изменена внутри
функции. " Разве title внутри функции не глобальная?    


Ответы

Ответ 1



Нет, вы же пишите в последней строке var title, а интерпретатор - двухпроходной, сначала он ищет объявления типа function name(){}, var name в объявляемой области видимости и делает эти переменные локальными, а потом исполняет код. Благодаря этому поведению можно писать function Foo() { console.log('Me not run'); } function(){ var a=[Foo,Bar]; a[0](); function Foo() { console.log("Hello Foo"); } function Bar() { console.log("Hello Bar"); } }(); вас же не удивляет что Foo и Bar локальны для этой области видимости и что a[0] не undefined ? единственное что нужно помнить, что если вы объявляете функцию, то она станет сразу определена, еще на первом проходе, а если переменную, то правая часть объявления будет выполнена только во втором проходе.

Хранение и удобный доступ к большому объему данных на питоне

#python


Всем привет. Возникла следующая проблема: где хранить и как обеспечить быстрый доступ
к достаточно большой таблице данных на Python?
Исходные данные - тхтшник с 4млн. строк и 10 столбцами.
Изначально планировать все это дело запихнуть в .pkl вот таким образом:
import pickle
infile=open('big.txt','r')
flag=1
count=0
data=[]
while flag==1:
    row=infile.readline()
    if row=='':
        flag=0
        print('export done')
        break
    data.append(row.split('\t'))
outfile=open('big_dump.pkl','wb')
pickle.dump(data,outfile)
print('dump done')

Однако, такой код перегружает оперативку, вероятно потому что хранит список data
в памяти. В какую сторону смотреть, какую библиотеку для хранения выбрать? 
Я думал насчет pytables, но там маловато русской документации. Проблема еще и в том,
что после сохранения данных нужна возможность вызывать их из файла по ключу.    


Ответы

Ответ 1



какую библиотеку для хранения выбрать? PostgreSQL, MySQL, Oracle, MS SQL Server, MariaDB, в крайнем случае SQLite, еще может быть такое, что там лучше подойдет NoSQL что-нибудь типа MongoDB, Cassandra.