Страницы

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

понедельник, 13 апреля 2020 г.

Что возвращает строка Integer.valueOf(…)?

#android #java

                    
Не уверен, что получится без остального исходного кода, но получается слишком много кода.
Вопрос: что возвращает эта строчка:
res = Integer.valueOf(results.getAttributes().getNamedItem("count").getNodeValue());

И что за "count"? Это атрибут какой-то? Или блок в xml, который парсится? 
public static int numResults(Document doc){     
        Node results = doc.getDocumentElement();
        int res = -1;

        try{
            res = Integer.valueOf(results.getAttributes().getNamedItem("count").getNodeValue());
        }catch(Exception e ){
            res = -1;
        }

        return res;
    }

Это потом проверяется в активити
 if((numResults <= 0)){
        Toast.makeText(Main.this, "Geen resultaten gevonden", Toast.LENGTH_LONG).show();  
        finish();
    }

И больше - ни слово про эту функцию...Вот я и ломаю голову...Уже второй день пытаюсь
парсинг скопипастить...Знания java не хватает к написанию самостоятельно...    


Ответы

Ответ 1



Integer.valueOf - это преобразовать аргумент (который в данном случае - целое или строка) в целое. В данном случае аргумент с большой вероятностью - строка. Конструкция results.getAttributes().getNamedItem("count").getNodeValue()) - это действительно похоже на парсинг xml.

IP адрес в Delphi

#delphi #ip_address

                    
Как программно узнать свой IP адрес?    


Ответы

Ответ 1



Можно, например, так: function GetIP:string; var WSAData: TWSAData; p: PHostEnt; name: array [0..255] of AnsiChar; begin WSAStartup($0101, WSAData); gethostname(name, 256); p := gethostbyname(name); result := inet_ntoa(PInAddr(P.H_ADDR_LIST^)^); WSACleanup; end;

Ответ 2



function TForm2.LocalIP: string; type TaPInAddr=array [0..10] of PInAddr; PaPInAddr=^TaPInAddr; var phe:PHostEnt; pptr:PaPInAddr; Buffer:array [0..63] of char; i:Integer; GInitData:TWSADATA; begin WSAStartup($101, GInitData); Result:=''; GetHostName(Buffer, SizeOf(Buffer)); phe:=GetHostByName(buffer); if phe=nil then Exit; pptr:=PaPInAddr(Phe^.h_addr_list); i:=0; while pptr^[i]<>nil do begin result:=StrPas(inet_ntoa(pptr^[i]^)); Inc(i); end; WSACleanup; end;

Ответ 3



uses WinSock; function GetLocalIP: String; const WSVer = $101; var wsaData: TWSAData; P: PHostEnt; Buf: array [0..127] of Char; begin Result := ''; if WSAStartup(WSVer, wsaData) = 0 then begin if GetHostName(@Buf, 128) = 0 then begin P := GetHostByName(@Buf); if P <> nil then Result := iNet_ntoa(PInAddr(p^.h_addr_list^)^); end; WSACleanup; end; end;

JAVAH не может найти требуемый класс

#android_ndk #android #java

                    
При запуске javah -jni команда наотрез отказывается находить нужный класс:

$PROJECT_DIRECTORY/bin$
javah -jni
bt.nativeclient.BtnativeActivity
error: cannot access
bt.nativeclient.BtnativeActivity class
file for
bt.nativeclient.BtnativeActivity not
found javadoc: error - Class
bt.nativeclient.BtnativeActivity not
found. Error: No classes were
specified on the command line.  Try
-help

Мой класс java имеет аддрес: $PROJECT_DIRECTORY/src/bt/nativeclient/BtnativeActivity.java
и имеет вид:
package bt.nativeclient;

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView;

public class **BtnativeActivity** extends Activity   { 
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        TextView  tv = new TextView(this);
        tv.setText( stringFromJNI() );
        setContentView(tv);
    }

    public native String stringFromJNI();

    static 
    {
        System.loadLibrary("hello-jni");
    }  
}

Я пробовал запускать javah из: $PROJECT_DIRECTORY/bin, $PROJECT_DIRECTORY/src, просто
из $PROJECT_DIRECTORY. Я пробовал специфицировать путь для поиска класса через опцию
-classpath:
$PROJECT_DIRECTORY/src javah -classpath :. bt.nativeclient.BtnativeActivity

Более того, если включить опцию -verbose команда javah говорит, что она исказала
мой класс в той директории, где этот самый класс она должна была найти:

$PROJECT_DIRECTORY
**javah -verbose -classpath :./src -jni**
**bt.nativeclient.BtnativeActivity** error: cannot access
bt.nativeclient.BtnativeActivity class
file for
bt.nativeclient.BtnativeActivity not
found javadoc: error - Class
bt.nativeclient.BtnativeActivity not
found. [ **Search Path**:
/usr/lib/jvm/java-6-openjdk/jre/lib/resources.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/sunrsasign.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/jsse.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/jce.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/charsets.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/netx.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/plugin.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/rhino.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/modules/jdk.boot.jar:/usr/lib/jvm/java-6-openjdk/jre/classes/:**./src**
]

Я перепробовал все возможные комбинации, но не нашел решения.
Мне кажется, я упустил какую-то маленькую деталь по своей неопытности, может кто-нибуть
помочь мне, пожалуйста?    


Ответы

Ответ 1



Надо указывать пусть к .class файлу, они не в bin а в bin\classes. Класспас указывает не на ваш исходних а на дополнительные библиотеки, если их нет, то просто из папки bin\classes вызовите команду >javah <пакет>.<пакет>.<класс> Должно работать.

Рисование на виджете канвасом

#widgets #android #java

                    
Всем привет. Я уже задавал такой вопрос, но ответа так и не получил, задаю еще раз
:) Я пытаюсь нарисовать на виджете линию, круг или прямоугольник через канву, но ничего
не получается....
UPD:
решение найдено http://dajver.blogspot.com/2012/04/canvas-android.html    


Ответы

Ответ 1



А причем тут AppWidgetProvider? AppWidgetProvider нечто похожее на BroadcastReceiver - по сути некий сервис, который говорит "я умею показывать виджет", но он сам не рисует виджет! Это провайдер! Чтобы нарисовать виджет надо составить кастомный класс наследующий от View и в его методе onDraw() написать то что хотите. Вам уже в прошлый раз камрады указывали на вашу ошибку. Есличо смотрите пример реализации кастомного виджета здесь Update public class MySuperPuperWidgetView extends SomeExistingWidgetView { @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //рисуем виджет //далее пишем свою хрень на канвасе } }

Как восстановить R.java?

#android #java

                    
После очистки android-проекта пропал R.java файл.Соответственно, запустить проект
не могу...
Раз 20 делал очистку, файл не появляется.
Может кто подскажет, как восстановить его?    


Ответы

Ответ 1



Проверьте ошибки в хмл файлах разметки. Ошибки в классах. Запустите еще раз.

Ответ 2



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

Ответ 3



Самый верный способ это сгенерировать вручную через aapt: $aapt package -m -J -M AndroidManifest.xml -S res -I /platforms/android-xx/android.jar SOURCE_FOLDER - каталог с исходниками SDK_PATH - путь к SDK Android'а xx - номер API А вообще скорее всего у вас ошибка в AndroidManifest.xml - проверьте еще раз

Ответ 4



R.java - это файл который генерируется автоматически, ничего руками вносить или изменять в нем не нужно. Если у Вас проект без ошибок просто обновите список папок и все. Если R.java не генерируется и у Вас весь проект в ошибках, смотрите в лог Console (это если в Eclipse работаете)там написано в каком файле ошибка. Исправьте её и R.java сам появится.

Begun.ru API + Python

#python #soap

                    
Привет всем.
Cтолкнулся с задачей: разобраться с api бегун.ру средствами python.
Протокол SOAP, на котором у них основано взаимодействие, откровенно говоря, вижу
впервые, из документации от самого бегуна, кроме названия методов и принимаемых параметров,
также ничего не ясно..  Поиски по гуглу дали только один вразумительный example и тот
за 2010-й год и то на php. Достучатся до разрабов и получить хоть какие-то ответы пока
не удалось... все необходимые логины пароли на руках имею.
Итак вопрос: кто работал с api бегуна на python, какую из множества soap-lib использовали
вы? И если можно, пример авторизации и тестового запроса именно на бегун.
P.S:  Заранее благодарен.    


Ответы

Ответ 1



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

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

#android_sdk #android

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


Ответы

Ответ 1



Стандартно делается это так: 1) Интент new Intent(Intent.ACTION_VIEW, Uri.parse(url)) далее запуск активити браузера через startActivityForResult 2) Вызвавший интент активити по окончании работы браузера получит onActivityResult, где вы сможете в зависимости от результата выставить сообщение или что там у вас. По параметрам и проч. см. в документации. Но есть одна трабла - заставить браузер закрыться после окончания скачивания - это вряд ли... Есть конечно варианты реализации функционала другим способом: Напрямую выкачивать минуя браузер Выкачивать через WebView (по сути все тот же браузер, только как часть вашей проги)

Методы сортировки смешанных данных (текст + числа)

#база_данных #сортировка #алгоритм

                    
Какие есть способы сортировки данных типа:

Профессиональное училище № 21
Профессиональное училище № 30
Профессиональное училище № 120

или:

pgAdmin v1.8.4
pgAdmin v1.10.5
pgAdmin v1.12.3

Есть ли возможность сделать это на уровне БД?
Вопрос касается не только приведенных примеров, но вообще любых возможных вкраплений
в текстовые поля чисел.    


Ответы

Ответ 1



имхо у вас проблема не с сортировкой данных а с проэктированием СУБД. значения то неатомарные, - посему должна иметь место оптимизация и разбиение данных на 2 поля: имя + номер или продукт + версия если вы не слышали ничего про реляционные СУБД (втч. про нормальные формы) есть и для вас пару вариантов: для всех полей которые являются комплексными нужно добавить по одному numeric полю в таблицу. и на вставку/обновление повесить триггер который будет для каждого такого поля заполнять соответствующие им поля _order. которые и будут использоватся для сортировки. или же сами можете заполнять при вставке. (имеет смысл хранить эти данные в отдельной таблице) можно добавить функцию которая будет подсчитывать order для сортировки на лету. выглядеть это будет как-то так: 1) select x.afield from xtable x order by get_order (x.afield) или 2) select x.afield from xtable x order by get_order ('xtable', 'xfield', x.afield) настройки для функции get_order могут хранится в какой-то отдельной таблице. в первом примере вам придется автоматически определять шаблон который использовать для определения порядка следования записи, в другом примере вы сможете с помощью if elseif... использовать алгоритм в зависимости от входных данных. первый вариант более предпочтительный с точки зрения performance. а правильный, - оптимизация структуры СУБД UPDATE: с одной стороны полное имя учебного заведения это вроде как-бы единое значение. но это только на первый взгляд. "профессиональное" (опциональный префикс, - можно игнорировать) "училище" - тип учебного заведения (академия, институт, университет) может быть использовано для сортировки "№ 43" - номер учебного заведения. "Санкт Петербурга" - явно же город. "имени" васи пупкина - даж незнаю как атрибут назвать но "имени" явно можно использовать для фильтра, - только есть ли смысл, - хз. далее логически анализируем данные: номер учебного заведения + его тип = уникальная комбинация (в пределах одного города) учебное заведение может быть расположено только в одном городе, во всех остальных будут филиалы. хотя называтся могут одинаково. т.е комбинация этих 3х полей не будет уникальной. в результате получается таблица следующего содержимого: id // уникальный id type, // профессиональное училище / университет / академия. можно вынести в отдельную таблицу number, // порядковый номер. его в принцыпе может и не быть. (это надо учесть в сортировке) dedication_id // поле которое будет хранить ссылку на id человека которому посвящено. если null - то никому не посвящено. null тоже можно учесть при сортировке foundation_date // время когда было создано учебное заведение. имхо это важное поле. description // или full_name/display_name - полное имя заведения, то которое вы будете отображать пользователю. и которое никогда не будет участвовать в сортировке. location_id // ссылка на таблицу с местоположениями (ессно будет содержать город) p.s. пожалуй еще лучше было бы создать отдельную таблицу отделения или филиалы. привязанную к конкретному учебному заведению. где каждый отдельный филиал имеет свой конкретный адресс. что позволит хранить данные независимые от других филиалов. напр: количество студентов/наличие кафедр/специальностей итд итп таблица dedication id, // уникальное id prefix, // его величество name, // василий пупкин ^^ таблица нужна, т.к. одному ученому может быть посвящено больше чем 1 заведение. p.s.s если обобщить одной фразой работу с субд: легко проэктировать = сложно работать и наоборот.

Android: Preferences

#android_sdk #android #eclipse #java

                    
Проблемы с Preferences.
Есть 2 активности (класса). В одной ключ "number" равен 0,а в другой (в которой я
работал с этим ключом) = 2.
(Я при запуске программы выгружаю ключи). Код одинаковый и в одинаковых местах (OnCreate),
разные только имена переменных:
notes = getPreferences(MODE_WORLD_WRITEABLE);
            Editor ed = notes.edit();
        textView1.setText(String.valueOf(notes.getInt("number", 0)));
    


Ответы

Ответ 1



SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); String val = prefs.getString("number", ""));

CUDA: Ошибка при компиляции программы

#c #cuda #cpp

                    
Доброго времени суток!
Прошу помочь. Компиляция программы не проходит из-за ошибок типа "identifier is undefined
in device code".  Пояснение по программе: есть реализация AES от Брайена Гладмана (Brian
Gladman, Worcester, UK), которую я хочу использовать в своей cuda-программе.  Ошибка,
мешающая компиляции, возникает при использовании макроса в коде Брайена. Например,
в строчке:
ke8(cx->ks, 0); ke8(cx->ks, 1);

ke8 - это макрос, его код:
#define ke8(k,i) \
{ kef8(k,i); \
    k[8*(i)+12] = ss[4] ^= ls_box(ss[3],0); \
    k[8*(i)+13] = ss[5] ^= ss[4]; \
    k[8*(i)+14] = ss[6] ^= ss[5]; \
    k[8*(i)+15] = ss[7] ^= ss[6]; \
}

Насколько я понял, такая ошибка связана с макросами, и во время компиляции он не
определяется cuda-устройством. Хотя, буквально 2-мя строчками выше "ke8(cx->ks, i);"
работает без нареканий, а ведь там тоже работает тот же самый макрос. Гугль-поиск решения
этой проблемы не дал.
Из-за чего может возникать ошибка "identifier is undefined in device code", и как
её решить?    


Ответы

Ответ 1



Ошибка identifier is undefined in device code возникает в том случае, если идентификатор не определен. Поскольку, глядя на макрос, трудно сказать, во что он раскрывается, рекомендуется посмотреть на файл, полученный из исходника препроцессором. Для этого в C/C++/Preprocessor, выставить Generate Preprocessed File в YES. После компиляции посмотреть на код, оставшийся от макроса, и обратить внимание на те переменные, которые трактуются как необъявленные. Если их реально нет, значит, что-то не подключено (библиотека или заголовок).

Ответ 2



Вам нужно добавить директиву препроцессора GPU, в противном случае фиксированные поисковые таблици не определены в памяти устройства, а в памяти хоста и CUDA не может их найти.

SilverLight XAML. Binding цвета эллипса к элементу массива цветов

#c_sharp #silverlight #xaml

                    
У меня есть эллипс, и вот такая конструкция:
private Brush lampColor;
public Brush LampColorTest
{
    get { return lampColor; }
    set
    {
        lampColor = value;
        OnPropertyChange("LampColorTest");
    }
}

С помощью какой-то команды я задаю LampColorTest значение, допустим, Yellow. Когда
это происходит, эллипс перекрашивается в желтый цвет. Привязываю эллипс я так:


Ответы

Ответ 1



Написать свой IValueConverter? public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { int index; if (!Int32.TryParse(parameter.ToString(), out index)) { // грязно ругаемся } var list = value as IList; if (list == null || list.Count < index + 1) { // аналогично } return list[index]; }

Файлы данных для android-приложения.

#android #jni

                    
Пишу приложение с использованием jni. Библиотеке на C++ требуются файлы с данными.
Как их добавить в проект, и как их можно будет открывать из jni?    


Ответы

Ответ 1



Вот пример: тыц Добавляете в assets, а дальше используете обычный апи только сишный. Как пример выше по ссылке. Там пишется файл с данным и создается директория. Если я конечно правильно понял ваш вопрос. UPD Туда же: тыц-два

Ответ 2



В общем скомбинировал и обработал найденное на stackoverflow. Получилось следующее. В классе наследованном от Activity. private void assetsToFiles() throws IOException { // распаковать файлы из assets File dir = getFilesDir(); AssetManager assetManager = getAssets(); String[] files = null; files = assetManager.list(""); byte[] buffer = new byte[1024]; for(String filename : files) { File outfile = new File(dir, filename); if(outfile.exists()) continue; InputStream in; try{ in = assetManager.open(filename, AssetManager.ACCESS_STREAMING); }catch (java.io.FileNotFoundException e) { continue; } OutputStream out = new FileOutputStream(outfile); int read; while ((read = in.read(buffer)) != -1) { out.write(buffer, 0, read); } in.close(); out.close(); } } Эту функцию вызываю из onCreate. Нужные файлы помещаю в проекте в каталог assets. А программе их следует искать в каталоге, путь к которому возвращает getFilesDir(). Блок try пришлось сделать из-за того, что assetManager.list почему-то возвращает в списке несуществующее имя "images".

Конвертируем html в изображение.

#php

                    
Прошу вашей помощи в поиске php библиотеки для конвертирование html + css в изображение
pgn,jpg,gif.    


Ответы

Ответ 1



Вот пример конвертации Html => PDF => PNG / JPEG $html_content = '

Hello World

'; $html2pdf = new HTML2PDF('P', 'A4'); $html2pdf->writeHTML($html_content); $file = $html2pdf->Output('temp.pdf','F'); $im = new imagick('temp.pdf'); $im->setImageFormat( "jpg" ); $img_name = time().'.jpg'; $im->setSize(800,600); $im->writeImage($img_name); $im->clear(); $im->destroy(); По началу не забудьте подключить библиотеку HTML2PDF или mPDF

Как сделать Get-запрос?

#java #android

                    
Как сделать get-запрос на Java для Android и получить ответ?    


Ответы

Ответ 1



Создать новый объект URL и вызвать на нем метод .openStream() new URL("http://hashcode.ru").openStream()

Использование generics в Delphi: неизвестный тип данных TList

#delphi #generics #delphi_xe2

                    
Пробую использовать generics:

var List: TList;    


но RAD Studio мне подчеркивает неизвестный тип данных TList, хотя в коде var List:
TList; - никаких проблем нет. В чем тут может быть проблема? Юнит Classes, естественно,
подключен.
    


Ответы

Ответ 1



Ответ найден: нужно подключить еще и юнит System.Generics.Collections

Работа с торрент файлами во flash

#flash #torrent

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


Ответы

Ответ 1



Пока во флеше смотреть это не получится. Говоря очень просто: флеш умеет ловить поток только RTMP или RTMFP - это проприетарные протоколы, судя по всему надстроенные над базовым RTP. А торрентовое видео вероятнее всего идет в соответствии с протоколом HLS (либо похожим), и флеш его проиграть никак не сумеет. Хотя говорят, что JWPlayer поддерживает HLS - посмотрите сами.

Картинка приложения для постинга ссылок

#сервисы #интеграция #разметка #вконтакте

                    
Столкнулся со следующей проблемой. Для того, чтобы ссылки на мой сайт красиво отображались
в социальных сетях, создал специальную картинку - лого. Вот, например, как выгладит
ссылка на facebook:



Картинки слева смотрятся отлично.
Но возникла проблема с контактом. Вот какая ерунда получается:
     

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


Ответы

Ответ 1



Эврика!!! Чисто как говориться "на шару" (но я это называю методом научного тыка), ввёл такой url: http://vk.com/share.php?image=http://example.com/webpages/images/logovk3.png&url=http://example.com/news/32 т.е. тот, который содержит ключ IMAGE. И всё работает!!! Надеюсь, кому-то в будущем поможет. Я потратил на поиск решения целых 2 часа.

Ответ 2



ВКонтакте полагается на тот же Open Graph протокол, что и FaceBook. Упоминание нашлось в дебрях вконтактовских док: для видео картинку надо указывать через знакомый

Exception handling

#c_sharp #sql_server

                    
Есть программа для работы с базой данных на локальном компьютере. Есть проект Data
access layer`а и клиентского приложения. В данном клиентском приложении я ловлю исключения
прямо в обработчику нажатия кнопки, при вызове методов из DAL. Правильно ли так делать?
Если нет, то как и где  правильно это делать? Какие есть правило хорошего тона ловли
исключений?  Покидайте хорошие статьи если есть таковы. Заранее благодарен за помощь.
UPD------
Кстати,  в MVC исключения, связанные с некорректными входящими данными, допустим,
на текстбокс, правильно ловить во View?    


Ответы

Ответ 1



Общие советы: Вынесите логику (в том числе обработку исключений) из обработчиков событий в отдельные методы, в обработчике оставьте только вызов метода (Разделение UI и логики, повторное использование кода). Не перехватывайте все исключения. Обычно всё, что мы можем сделать с неизвестным исключением - записать его в лог. Поэтому вместо перехвата исключений в каждом методе, лучше сделать общий обработчик, например, так Application.ThreadException - событие (для WinForms) Обработайте ожидаемые исключения. Например, при соединении с базой вполне возможно, что SQL Server недоступен. Отличная статья на CodeProject по обработке исключений (на английском).

Ответ 2



Ловить обрабатывать исключения нужно на том же уровне абстракции, где оно происходит. С другой стороны, если нужно пробросить исключение выше, то ему нужно изменить уровень абстракции и сделать более общим, а потом сделать исходное как inner. В вашем случае получается что уровень представления работает с исключениями с уровня данных. Например, подход MVC для этого делает контроллеры, которые отвечают за правильное обеспечение данных представлению. В свою очередь, у моделей делают специальные сервисы, а это сервисы уже взаимодействуют с хранилищем. Так вот доступ к хранилищу происходит через общий интерфейс, который декларирует какие исключения могут происходить. Как только они происходят, контроллер ловит их и упаковывает в исключения на своем уровне абстракции. По поводу статей не подскажу, но вообще это изучается в курсах Software Design, handling exceptions. Знаю что это действительно важный вопрос и его стоит задавать на раннем этапе проектирования.

Русский язык в запросах PDO PHP

#pdo #php

                    
Здравствуйте!
Как можно "включить" поддержку русского языка при выборке данных из таблицы базы данных?
Пробовал :
 ...
 $ps = $db->prepare("SET NAMES utf-8");
 $ps->execute();
 ...

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


Ответы

Ответ 1



"mysql:host=**;dbname=**;charset=utf8" Будет работать с php > 5.3.6 Всё же есть в документации

Как пишется дополнение к ТЗ?

#проектирование

                    
Допустим у меня есть раздел 2, и пункт 2.3. Требования к СУБД и там будут пункты:

а) СУБД должна быть быстрой;
б) СУБД должна иметь возможность резервного копирования и восстановления данных;
в) СУБД должна ставиться на Linux;

Прошел год. И заказчик захотел модернизировать систему. И написал еще требования.
Одно из них пусть будет "СУБД должна быть бесплатной". И потребовал все требования
и дополнения оформить в виде дополнения к старом ТЗ.
В ГОСТ сказано:

3.6. Титульный лист дополнения к ТЗ на АС оформляют аналогично титульному 
листу технического задания. Вместо наименования «Техническое задание» пишут 
«Дополнение № ... к ТЗ на АС … ». 
3.7. На последующих листах дополнения к ТЗ на АС помещают основание для 
изменения, содержание изменения и ссылки на документы, в соответствии с которыми 
вносятся эти изменения. 
3.8. При изложении текста дополнения к ТЗ следует указывать номера 
соответствующих пунктов, подпунктов, таблиц основного ТЗ на АС и т.п. и применять 
слова: «заменить», «дополнить», «исключить», «изложить в новой редакции».

Но тут всё не понятно.
Я пишу дополнение так:
Раздел 2. Пункт 2.3.
Дополнить: г) СУБД должна быть бесплатной
Или я переписываю весь (под)пункт полностью? Т.е:
2.3. Требования к СУБД

а) СУБД должна быть быстрой;
б) СУБД должна иметь возможность резервного копирования и восстановления данных;
в) СУБД должна ставиться на Linux;
г) СУБД должна быть бесплатной
    


Ответы

Ответ 1



Исходя из цитаты из ГОСТа, правильнее Раздел 2. Пункт 2.3. Дополнить: г) СУБД должна быть бесплатной Да и исходя из здравого смысла тоже, если вы пишете дополнение, то должно быть сразу ясно, что именно изменилось. Как вариант можно (наверное) написать так: Раздел 2. Пункт 2.3. Дополнить: г) СУБД должна быть бесплатной Таким образом: 2.3. Требования к СУБД а) СУБД должна быть быстрой; б) СУБД должна иметь возможность резервного копирования и восстановления данных; в) СУБД должна ставиться на Linux; г) СУБД должна быть бесплатной

Запросы к базе данных MSSQL в высоконагруженном приложении

#c_sharp #sql_server

                    
Хочу создать static class для работы с БД, содержащий методы для получения данных.
Но дело в том, что обращения к методам класса могут происходить из разных потоков.
Вопрос. Как поведет себя подобный класс при одновременном обращении к одному из методов
из двух разных потоков? (Будет ли он ждать, пока завершится первый запрос, произойдет
исключение или запрос будет выполнятся в другом потоке?)
Точнее: Как правильно организовать запросы к БД осуществляя их из разных потоков?    


Ответы

Ответ 1



Заложить в подобной задаче статический класс, как фундамент работы с БД, означает отказаться от ООП и перейти к процедурному программированию, постепенно наращивая "мусорник", в лучшем случае разделенный на "хелпер" классы, "датасорсы" или еще чего. Более того, "контекст" БД обычно НЕ потокобезопасный, как и статика, и вам придется постоянно заботиться о синхронизации. Гораздо эффективней применить какую-либо ORM для работы с БД + (UnitOfWork + Repository + Specification). В данном подходе архитектура станет к тому же и тестируемой, чего не скажешь про сплошные статические классы и методы, протестировать которые можно только при помощи дополнительного кода в виде "врапперов". Для управления жизненным циклом объектов имеет смысл использовать один из существующих решений DI/IoC. Например в вашем случае можно на этапе настройки указать жизненный цикл для контекста БД "PerThread" и "контейнер" будет сам следить, чтобы в каждом потоке был свой, новый контекст или одна транзакция.

Как менять внешний вид пункта ListView при клике на него?

#android #listview #java

                    
При разработке приложения столкнулся с такой проблемой. У меня есть ListView. Нужно,
чтобы при клике на пункт, этот пункт менял свой внешний вид (цвет текста), а при повторном
клике возвращался в обычное состояние. Сложность в том, что это должно сохраняться,
т.е. при перезапуске приложения, внешний вид пунктов должен быть такой же как при закрытии.
P.S. Пункты списка тянутся из базы, если это чем-то поможет.    


Ответы

Ответ 1



Надо примерно так: Декларируем лэйаут TextView (my_text_view.xml) Заводим списочек: ListView listView = new ListView(context); String[] items = {"Item 1","Item 2", "Item 3"}; ArrayAdapter adapter = new ArrayAdapter(context,R.layout.my_text_view,items); listView.setAdapter(ad); Далее при клике на элемент: listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView parent, View view, int position, long i) { ((TextView) view).setTextColor(anyColor); //вставляем свой цвет } });

Как запустить виджет в Android-эмуляторе?

#android_sdk #android

                    
Вот сделал я Android виджет. Хочу добавить его на хоумскрин, но при добавлении не
вижу. При запуске в эклипсе вот что пишет:  



Что делать? Как быть?
    


Ответы

Ответ 1



Попробуй длинный тычок на пустое место, куда добавил виджет. Если появится контекстное меню или таскалка - значит, виджет добавился, но невидимый (с прозрачной картинкой) - т.е. ты что-то напутал с ресурсом, который у тебя на виджете должен отображаться. Еще была пара случаев, когда это случалось совсем спонтанно, помогал клин-редеплой. Возможно, sdk глюкнуло и забыло упаковать картинку в apk. // FIXME В след. раз лучше делай скриншот вкладки LogCat, в логе консоли видно только установку приложения

VideoView: закрытие Activity после окончания проигрывания файла

#android #videoview #java

                    
Народ, подскажите, пожалуйста, как закрыть Activity по окончании проигрывания. Вот
мой код:
final VideoView myVideoView = (VideoView) findViewById(R.id.videoViewPresentation);

video = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.video);

myVideoView.setVideoURI(video);
myVideoView.setMediaController(new MediaController(this));
myVideoView.requestFocus(0);

t = new Thread(new Runnable() {
    public void run() {
        myVideoView.start();
    }
});

t.start();
    


Ответы

Ответ 1



Надо слушать листенер окончания проигрывания и там убивать активити. videoView.setOnCompletionListener()

Зачем в пользовательском контроле поле components?

#c_sharp #visual_studio #usercontrol

                    
При создании нового контрола студия всегда создаёт поле
private System.ComponentModel.IContainer components = null;

но никогда его не использует.
Для чего оно нужно?    


Ответы

Ответ 1



На форму можно положить не только контролы, но и невизуальные компоненты. В то время как контролы при закрытии формы освобождаются автоматически, т.к. форма знает о своих дочерних контролах и прибивает их, компоненты этим свойством не обладают, и их надо закрывать явно. Для этого дизайнер создаёт переменную components и в перекрытом методе Dispose() прибивает компоненты, которые положены на форму. Для того чтобы понять, чем недоволен компилятор, посмотрите на две вещи: 1. Есть ли на форме невизуальные компоненты? 2. Если есть, есть ли среди них компонент, конструктор которого принимает экземпляр IContainer. Правильно написанные компоненты должны иметь именно такой конструктор, который будет генерироваться дизайнером.

Ответ 2



Мой ответ может быть не очень точным. На самом то деле используется, там хранятся ссылки на компоненты (потому что форма это контейнер) и при закрытии формы идет освобождение ресурсов (компонентов). Там в комментариях еще же написано: Required designer variable.

Парсинг XML

#xml #android #синтаксический_анализ

                    
Работаю на андроид с Xml. Столкнулась с тем, что мне нужно парсить xml такого вида:




Понимаю, как достать текст, атрибуты, а как мне достать слово "Пример"?    


Ответы

Ответ 1



Надо парсить SAX'ом, простейший пример использования здесь Касаемо секции CDATA ее надо ловить в хэндлере DefaultHandler.characters(), причем с конкатенацией, поскольку он может вызываться несколько раз. P.S. @atnartur неправ, поскольку парсер вернет без , вернет только Пример

Ответ 2



Простой пример Serializing with CDATA blocks http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php

Как вывести информацию о нагрузке сервера?

#php #оптимизация

                    
Здравствуйте, у меня два вопроса. 

Вопрос первый - вот "гулял" по интернету и увидел следующие. На одном сайте в низу
его страницы была информации как загрузка сайта грузит систему. Там было написано процент
и оперативную память какую он берет на себя (там было около 22 мб). К сожалению, ссылку
куда-то дел и не могу найти куда. Суть вопроса, есть ли такие функции в php, которые
показывает нагрузку, или они через microtime() сделали условие, при котором будет от
1-100% показываться? 
Второй вопрос: видел, что только в классах объявляют переменную (БЕЗ УКАЗАНИЕ ТИПА),
нельзя ли как-то сделать так, чтобы указывать тип изначально, как на языке С++...
    


Ответы

Ответ 1



1.1. Средняя загрузка процессора. В комментариях вроде есть аналог для серверов на WIN. 1.2. Пик выделенной памяти под ПШП, работает только в *никс. 2. PHP не типизированный язык, задавать типы в нем нельзя.

Как сделать выпадающий элемент в Tabs?

#android #java

                    
Доброго времени суток!
Столкнулся с проблемой, использую TabActivity, и  нужно каким то образом сделать
крайний правый tab чем-то вроде выпадающего списка "еще..." в котором будет еще пара
кнопок, не знаю даже как и описать, лучше покажу:  


    


Ответы

Ответ 1



Ох, это дурацкая особенность всех при всех дизайнеров, клиентов - смотреть на iPhone!!!!! Убейте их! Так ведут себя нативно табы в ios, насколько я знаю. У меня такая же задача стоит, точнее будет чуть позже. Я думаю, в Android-е - это(БОЛЬШОЕ КОЛИЧЕСТВО ВКЛАДОК) делается как в приложение Google Play Store - ViewPager(который есть в compability library) + компонент, аля вкладки, выпадалки. UPD Собственно вот: пост и viewpagerindicator

Ответ 2



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

Обязательно ли все свойства биндить?

#wpf #mvvm

                    
Интересует: обязательно ли все свойства биндить (например, видимость, label content,
IsReadOnly)  или же можно передавать в ViewModel объект Вида через конструктор,  а
также какие есть еще обязательные правила или рекомендации при использовании MVVM.
Большое спасибо за помощь.    


Ответы

Ответ 1



Такой вопрос у меня обычно возникал, когда я не мог связать логику взаимодействия различных компонентов приложения. У меня было сильное искушение просто добавить объект в ViewModel. Моя рекомендация - детально разработать на листе бумаги иерархию компонентов, продумать хорошо XAML, не лениться писать кажущийся длинный код ViewModel, так как потом он себя окупит меньшими временными затратами на доработку и понимание, так как все будет структурировано. Плюс к этому вы получите хороший опыт разработки распределенных приложений (если оно у вас таковое), навыки создания более "чистого" кода. Насчет биндинга: Биндить нужно только то, что требует зависимости от данных или логики кода. В большинстве случаев мелкие нюансы убираются лучшим знанием XAML (у него есть набор Trigger, State, Storyboard, Command, element-property->property-element etc). Также если хочется что-то кастомизировать "в комплекте" - есть динамическая загрузка стилей --- Создал макет, прикрепил его к ресурсам (через Key), потом если что загрузил новый словарь ресурсов и все значения стилей, кистей и т.п. См. шаблон Visual Studio - CustomControl. Насчет связи компонентов: в WPF (как и в C#) есть очень удобная вещь - Prism. Всю ее можно и не знать сразу, но вот к примеру EventAggregator очень даже полезен при связи компонентов. Если у вас разные компоненты, которые не знают друг о друге ничего, то он вам очень поможет. Также для общего представления о связывании я почитал бы на MSDN про MEF.

ЧПУ на django

#python #url #django

                    
Поправьте если я не прав:
models.py:
...
def get_absolute_url(self):
    return '/pages/%s' % self.slug

urls.py:
url(r'^pages/(?P.*)/$', 'APP.views.view_page'),

APP.views.py:
def view_page(request, slug):
    page = get_object_or_404(Page, slug=slug)
    return render_to_response('TEMPLATE', {'x': page})

Не могу понять, как работает get-object-or_404, первый параметр это модель, а второй
slug  это поле в модели, принимает переменную из url.py:  и сверяет, если они
равны (читай: часть введеного УРЛа по регулярке совпадает с model.slug) грузит страницу,
а в противном случае 404. Так? А то ужасное описание здесь: get_object_or_404.
get_object_or_404(klass, *args, **kwargs)

Calls get() on a given model manager, but it raises Http404 instead of the model's
DoesNotExist exception.
Required arguments
klass
A Model, Manager or QuerySet instance from which to get the object.
**kwargs
Lookup parameters, which should be in the format accepted by get() and filter().
Example

The following example gets the object with the primary key of 1 from MyModel:
from django.shortcuts import get_object_or_404

def my_view(request):
    my_object = get_object_or_404(MyModel, pk=1)

This example is equivalent to:
from django.http import Http404

def my_view(request):
    try:
        my_object = MyModel.objects.get(pk=1)
    except MyModel.DoesNotExist:
        raise Http404

Note: As with get(), a MultipleObjectsReturned exception will be raised if more than
one object is found.
get_list_or_404
get_list_or_404(klass, *args, **kwargs)

Returns the result of filter() on a given model manager, raising Http404 if the resulting
list is empty.
Required arguments
klass
A Model, Manager or QuerySet instance from which to get the list.
**kwargs
Lookup parameters, which should be in the format accepted by get() and filter().
Example

The following example gets all published objects from MyModel:
from django.shortcuts import get_list_or_404

def my_view(request):
    my_objects = get_list_or_404(MyModel, published=True)

This example is equivalent to:
from django.http import Http404

def my_view(request):
    my_objects = list(MyModel.objects.filter(published=True))
    if not my_objects:
        raise Http404
Questions/Feedback

Having trouble? We'd like to help!
 Try the FAQ — it's got answers to many common questions. 
 Search for information in the archives of the django-users mailing list, or post
a question. 
 Ask a question in the #django IRC channel, or search the IRC logs to see if it has
been asked before. 
 If you notice errors with this documentation, please  open a ticket and let us know!
Please only use the ticket tracker for criticisms and improvements on the docs. For
tech support, use the resources above. 
Search

Version:

Contents
Django shortcut functions
render
Required arguments
Optional arguments
Example
render_to_response
Required arguments
Optional arguments
Example
redirect
Examples
get_object_or_404
Required arguments
Example
get_list_or_404
Required arguments
Example
Browse
Prev: File Uploads
Next: Generic views
Table of contents
General Index
Python Module Index
You are here:
Django dev documentation 
Using Django 
Handling HTTP requests 
Django shortcut functions
Download:

 Offline (development version): HTML | PDF | ePub 
Provided by Read the Docs.

© 2005-2012 Django Software Foundation unless otherwise noted. Django is a registered
trademark of the Django Software Foundation. Linux Web hosting graciously provided
by Media Temple. ](https://docs.djangoproject.com/en/dev/topics/http/shortcuts/#get-object-or-404)

Если я все реализовал ЧПУ как правильно и ошибок у меня нет, то прошу совета как
элегантно добавлять .html без / в конце урла, не прописывая .html в шаблоне.    


Ответы

Ответ 1



def get_absolute_url(self): return '/pages/%s.html' % self.slug url(r'^pages/(?P.*)\.html$', 'APP.views.view_page'),

Движение объекта (HTML5 canvas)

#canvas #javascript #html5 #алгоритм

                    
Привет всем, нужна реализация следующего: анимация по рандомным координатам ходит
в произвольные стороны в рамках разрешения пользователя. Каков алгоритм сего действия?    


Ответы

Ответ 1



Генерируешь рандомный X Проверяешь, не вылазит ли он за пределы экрана Генерируешь рандомный Y Проверяешь, не вылазит ли он за пределы экрана Указываешь координаты твоему объекту Делаешь паузу Повторяешь 1-6 пункт

Правила и фильтры OpenLayers (отбор по свойствам объектов)

#c_sharp #json #javascript #openlayers #geojson

                    
Есть GeoJSON вида:

{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-108.04,44.68]},"properties":{"course":184.7,"vid":1}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-111.04,45.68]},"properties":{"course":44.1,"vid":2}}]}


Являющийся источником слоя vectors (см. "Как послать JSON в теле HTTP-ответа?").
Нужен фильтр показывающий только точки с vid входящим массив, вида:  

var pointShow = [1,3];


Вроде бы для этого нужно использовать правила (Rule), но я с OpenLayers не особо
знаком, да и в интернете найти что-то по теме кроме описания FeatureId на сайте "OpenLayers"
не получилось.  

Пробовал сделать так:

var myStyle = new OpenLayers.Style();
var defRule = new OpenLayers.Rule({
    filter: new OpenLayers.Filter.FeatureId({fids: ["2242"]}),
    symbolizer: {
        externalGraphic: "OpenLayersRotationExample_files/marker-red.png",
        graphicWidth: 21,
        graphicHeight: 25,
        graphicXOffset: -10,
        graphicYOffset: -12
    }
});
myStyle.addRules([defRule]);

...

vectors = new OpenLayers.Layer.Vector(
   "Simple Geometry",
   {
      protocol: new OpenLayers.Protocol.Script({
        url: "http://localhost:8181/view",
        callbackKey: "format_options",
        callbackPrefix: "callback:",
        filterToParams: function(filter, params) {
          if (filter.type === OpenLayers.Filter.Spatial.BBOX) {
            params.bbox = filter.value.toArray();
            if (filter.projection) {
              params.bbox.push(filter.projection.getCode());
            }
          }
          return params;
        }
      }),
      strategies: [
        new OpenLayers.Strategy.Refresh({force: true, interval:10000}),
        new OpenLayers.Strategy.BBOX({resFactor:2})
      ],
      styleMap: new OpenLayers.StyleMap({
        "default": myStyle
      })
   }
);


Но в итоге я ничего не вижу.  

В связи с этим вопрос - как правильно писать правила и фильтры OpenLayers?
Буду признателен за полезные ссылки на примеры и примеры использования разных фиьтров,
в частности FeatureId (желательно более понятных чем тут "Filtering a WFS Layer").  

PS: Пока решил так:

var myStyle = new OpenLayers.Style();
var defRule = new OpenLayers.Rule({
  symbolizer: {
    externalGraphic: "OpenLayersRotationExample_files/marker.png",
    graphicWidth: 14,
    graphicHeight: 17,
    graphicXOffset: -7,
    graphicYOffset: -8,
    graphicOpacity: 0.9,
    rotation: "${course}",
    display: "none"
  }
});
myStyle.addRules([defRule]);
for (keyVar in arr) {
  myStyle.addRules([
    new OpenLayers.Rule({
      filters: [new OpenLayers.Filter.Comparison({
        type: OpenLayers.Filter.Comparison.EQUAL_TO,
        property: "vid",
        value: arr[keyVar]
      }),
      symbolizer: {
        externalGraphic: "OpenLayersRotationExample_files/marker-red.png",
        display: ""
      }
    })
  ])
}

//arr - список id объектов которые нужно показать
//vid, course - поля свойств объектов (properties)


Возможно не очень красиво и медленно, но работает. Кто знает как разобраться с FeatureId,
прошу подскажите - все таки, я думаю, он быстрее отработает чем куча фильтров.
    


Ответы

Ответ 1



У вас JSON не полный. У каждой feature должен быть некоторый "id", по которому фильтровать фильтром FeatureId.

Готовые наборы тайлсетов для игр

#c_sharp #xna #графика #разработка_игр #2d

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

В свободное от работы время начал потихоньку изучать xna. Подготовил двумерный изометрический
тайловый движок, даже нашел подходящий редактор под него, однако осталась одна проблема
- нашел очень мало нормальных тайлсетов. Художник и дизайнер из меня, прямо скажу,
аховый, так что вариант "нарисовать самому" я оставляю на самый крайний случай. При
попытке найти что-то в сети в основном получаю какой-то лохматый "ужос"... В общем
- не нашел.

Собственно у меня вопросы:


Есть ли сайты, на которых есть нормальные тайлсеты?
Есть ли нормальные редакторы для создания тайсетов? (можно конечно и в Paint-е(Gimp-е/Photoshop-е)
что-то наваять, но с моими навыками "рисования"... в общем, хотелось бы что-то более
специализированное)


Пример тайлсета, если кто не знает, что это такое:


[upd] Да, вопрос получился конечно не по программированию, но извиняюсь. Больше мне
спрашивать негде.
    


Ответы

Ответ 1



Вы когда нибудь пробовали собрать toolbar для оконного приложения с помощью сайта который представляет бесплатные иконки от разных людей? Ваш toolbar получится не ахти, так как все иконки будут нарисованы разными людьми в разном стиле и цветовой гамме. Даже если вы будете долго копаться на нескольких таких сайтах в поисках единого стиля, то наврятли получится что-то стоящее, т.к. совершенно не факт что вы найдете даже готовый набор полностью удовлетворяющий вашим нуждам. Тоже самое и с тайлсетом. Их все должен рисовать один человек в одном стиле по одному документу, на gamedev.ru и фриланс сайтах есть десятки людей которые с радостью возьмутся выполнить такой заказ по вполне адекватной цене(реальная рыночная цена тому что вы приводите в качестве примера не больше 100-300 рублей за полоску), да и качество будет вполне ничего, если вы конечно потрудитесь отобрать достойного кандидата. В качестве редактора можно использовать Photoshop и 3DSMax ну или Blender и GIMP если вы красноглазик. Специальный редактор для тайлсетов это плохая идея потому что непонятно чем собственно тайлсет отличается от обычной картинки. Самому рисовать их ни в коем случае нельзя, так как если у вас нет хотя бы пары лет опыта работы с графическими редакторами и хотя бы зачатков умений художника, то в лучшем случае у вас получится результат которым можно только пугать других людей. С другой стороны с попытки с 50ой может и получится что-нибудь хорошее, но тогда вы просто потеряете время. Правда есть и альтернативный вариант: http://lunar.lostgarden.com/labels/free%20game%20graphics.html http://hasgraphics.com/ http://cgtextures.com/ http://blogoscoped.com/archive/2006-08-08-n51.html http://www.freewebs.com/teh_pro/sprites.htm http://www.spriters-resource.com/ http://www.flyingyogi.com/fun/spritelib.html http://www.gamedev.net/topic/272386-sprites-sprites-and-more-sprites/ P.S. Собирать игры в качестве хобби это плохая идея, так как это требует очень много свободного времени и усилий. Нужно либо делать это нормально либо вообще не делать.

Ответ 2



Что касается сайтов с нормальными тайлсэтами - никогда не встречал, что касается редакторов - такие, безусловно, есть, но они никак не изменяют того факта, что нужно уметь рисовать, учитывая их более ограниченный функционал, большего смысла в них не вижу, разве что, обычно, удобно сразу рисовать сэт. Вообще, для того, что-бы научится хоть более менее нормально рисовать оные, великих навыков художника не требуется, все, чему нужно научится - базовым навыкам передачи светотени и объема. К тому-же, нет людей, которые не умеют рисовать, есть только те, которые не научились. Плюс ко всему, если рисовать не на бумаге, можно сделать, допустим, размерность 2к*2к px, при уменьшении которой, многие косяки изображения исчезнут, главное правильно передать объем и более менее правильно светотень. Даже если совсем не будет получатся - можно поискать начинающего художника и попросить нарисовать его, но, повторюсь - такое рисование не требует великих навыков, другой вопрос в том, достаточно ли у вас времени и желания?..

Книги по Python + QT [дубликат]

#python #qt #книги

                            
             
                
                    
                        
                            На этот вопрос уже дан ответ здесь:
                            
                        
                    
                
                        
                            Книги и учебные ресурсы по Python
                                
                                    (1 ответ)
                                
                        
                Закрыт 4 года назад.
            
        

Что можно почитать русского о Python + QT? Желательно о PySide. И еще вопрос: есть
ли существенные отличия между PyQT и PySide?    


Ответы

Ответ 1



По PyQt есть книга Прохоренка. По PySide не встречал.

Зачем нужен draw9patch?

#android

                    
Зачем нужен draw9patch?    


Ответы

Ответ 1



Классический пример - нужно сделать кнопку с красивыми краями. Дизайнеру нарисовать не проблема, проблема начинается тогда, когда приходит осознание того, что кнопки бывают разного размера. Просто растянуть не получиться - изображение будет искажено. Не рисовать же тысячи кнопок? Но выход есть. Представьте себе, что кнопку поделили на 9 прямоугольников, 3х3. Теперь процесс растягивания стает значительно проще. Центральная часть растягивается во все стороны, угловые не трогаются, а боковые растягиваются только в одном направлении. Системе найти эти края для разделения очень просто - по сторонам изображения есть небольшие черные квадраты. Вот любители даже сделали сайт, где можно подгрузить свою картинку и покрутить размеры, увидеть, как оно изменяется.

Как вывести в админке django столбец из связи многие ко многим?

#python #django

                    
Здравствуйте! Подскажите, пожалуйста, как вывести в админке django столбец из связи
многие ко многим?
Пример:
Есть модель  books и author:
class books(models.Model):
    name = models.CharField(max_length=50, verbose_name=u'Название книги')
    year = models.IntegerField(max_length=10, verbose_name=u'Год выпуска')
    author = models.ManyToManyField(author)

class author(models.Model):
    full_name = models.CharField(max_length=50, verbose_name=u'Автор')

Содержание admin.py:
from django.contrib import admin
from support.models import books, author

class BooksAdmin(admin.ModelAdmin):
    list_display = ('name', 'year', 'ЧТО_ТУТ_НАПИСАТЬ?')

admin.site.register(books, BooksAdmin)

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


Ответы

Ответ 1



Чтобы появился третий столбец, в котором будут отображаться авторы книги через запятую. #models.py class Books(models.Model): name = models.CharField(max_length=50, verbose_name=u'Название книги') year = models.IntegerField(max_length=10, verbose_name=u'Год выпуска') authors = models.ManyToManyField(Author) def author_names(self): return u" %s" % (u", ".join([author.full_name for author in self.authors.all()])) author_names.short_description=u'Авторы' def __unicode__(self): return self.name class Author(models.Model): full_name = models.CharField(max_length=50, verbose_name=u'Автор') def __unicode__(self): return self.full_name #admin.py: from django.contrib import admin from support.models import books, author class BooksAdmin(admin.ModelAdmin): list_display = ('name', 'year', 'author_names') admin.site.register(books, BooksAdmin)

Ответ 2



Напрямую - никак ManyToManyField fields aren’t supported, because that would entail executing a separate SQL statement for each row in the table. If you want to do this nonetheless, give your model a custom method, and add that method’s name to list_display. (See below for more on custom methods in list_display.)

Ответ 3



#models.py python3 django 1.11 from django.db import models class Author(models.Model): full_name = models.CharField(max_length=50, verbose_name='Автор') def __str__(self): return self.full_name class Books(models.Model): name = models.CharField(max_length=50, verbose_name='Название книги') year = models.IntegerField( verbose_name='Год выпуска') authors = models.ManyToManyField(Author) def __str__(self): return self.name #admin.py from django.contrib import admin from .models import Books, Author from itertools import chain class BooksAdmin(admin.ModelAdmin): def author_names(self, obj): a = obj.authors.values_list('full_name') return list(chain.from_iterable(a)) list_display = ('name', 'year', 'author_names') admin.site.register(Books, BooksAdmin) admin.site.register(Author)

boost::regex и pcre исключение Ran out of stack space trying to match the regular expression

#cpp #регулярные_выражения #boost #pcre

                    
Когда то давно задавал подобный вопрос на другом форуме, но никто внятно не ответил.
Есть две библиотеки для работы с регулярными выражениями по стандарту PCRE.
Это boost::regex (или урезанный вариант std::regex) и библиотека PCRE.
Собственно есть сложное регулярное выражение.
там присутствуют подобные выражения
"+string_open+"(?>(?>(?!"+string_open+"|"+string_close+").)+|(?R))*"+string_close+"

Всё это дело замечательно отрабатывает для небольших входящих строк. но когда входящая
строка превышает допустим 1000 символов и условия указанные в регулярном выражении
выполняются, то выбрасывается исключение и в boost и в pcre.
Ran out of stack space trying to match the regular expression.
Собственно здесь говорится что происходит выход за пределы некоего стека.
1) Библиотеку pcre можно собрать из исходников, и увеличить там некоторые константы
#define , точно не помню что именно там было, то ли указание на использование рекурсивной
модели работы то ли еще что то.
Но в общем скомпилированная таким образом библиотека pcre стала работать с неограниченными
по объему строками и решала поставленную задачу. Сейчас используется именно такая модель.
Однако данный метод увеличил время работы регулярных выражений в 10-20 раз. 
раньше программа поднималась за 4 секунды, а с использованием такого подхода 40-50
секунд.
2) В boost ни где не смог найти информацию, о том как и где изменять значения этого
стека. 
Что из себя представляет этот стек? Этот тип формируют сами библиотеки?
Невозможность изменить этот стек, выглядит нелогичным, потому что 
программа нормально отрабатывается для строки допустим 990 символов.
Время выполнения разбора 5 миллисекунд. Занимаемая память 400 кб.
Добавляются 20 символов и всё ran out stack.    


Ответы

Ответ 1



Это читали? Что бы сделал я? Попробовал обе опции: и BOOST_REGEX_RECURSIVE, и BOOST_REGEX_NON_RECURSIVE; Увеличил бы BOOST_REGEX_BLOCKSIZE и BOOST_REGEX_MAX_BLOCKS.

Ответ 2



Для такой задачи лучше использовать более серьёзный парсер, нежели регулярные выражения. Например, boost::spirit. Обе проблемы — стека и быстродействия — решаются сами собой. Из "недостатков" могу отметить большее время компиляции (порядка десятков секунд, частично решаемо с помошью прекомпилированных хэдеров) и достаточно крутая в начале кривая обучения (там активно используются ленивые вычисления, к логике которых надо привыкнуть — но дальше всё проще).

Как поправить css для вложенного элемента?

#css3 #css

                    
Есть div.postcontent. 

В нем могут быть просто ссылки: div.postcontent p a 

Ссылки могут содержать картинку: div.postcontent p a img

Есть навороченный css для ссылок. Мне нужно его отключить для ссылок, содержащих
картинки. Т.е. для варианта (1), он должен работать, для (2) не работать.
.postcontent a:before{
    content: "\25BA";
    font-size: 80%;
    display: inline-block;
    padding-right: 3px;
    pointer-events: none;
}
    


Ответы

Ответ 1



Интересный случай...Что-то решения я не вижу. Попробуй вот-так .postcontent a{position:relative} .postcontent a img:before{position:absolute;//ваш код} Ты ведь сможешь отпозиционировать относительно A.

Ответ 2



Попробуй: < img ... onload="this.parentNode.className +=' myOverrideClass'"/> Хотя у @koza4ok лучше.

Обработка событий Button в Android

#android #java

                    
В приложении есть необходимость обрабатывать два события:
 - кнопка нажата (onClick()) 
 - кнопка отпущена
Описание первого события мне понятно, но как описать второе?    


Ответы

Ответ 1



Ловите MotionEvent.ACTION_UP, примерно так: button.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { } else if (event.getAction() == MotionEvent.ACTION_UP) { Log.i(TAG, "Кнопка отпущена!"); } } };

Вызов функции из DLL из командной строки

#cpp #dll

                    
у меня есть функция в DLL:

extern "C" __declspec(dllexport) void test(char *text, len);


Как правильно её вызвать из командной строки? Пока пытаюсь делать так:

rundll32 mydll.dll,test "string" 6

    


Ответы

Ответ 1



Почитайте описание как использовать rundll32. Вкратце - не любая ф-ция может быть вызвана из библиотеки, а строго следующая определенным соглашениям, описанным в статье по ссылке. Если по-простому и по-русски, то rundll32 поддерживает только ф-ции со следующей сигнатурой: void CALLBACK EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow); Обратите внимание на аргументы и на то, что ф-ция должна следовать соглашению _stdcall, а не _cdecl.

Где лучше хранить двоичные данные: в БД или отдельном файле? [ASP.NET MVC 3]

#c_sharp #net #sql_server #aspnet_mvc

                    
Доброго времени суток.
Есть база данных в которой хранятся учётные записи пользователей. К каждому пользователю
привязаны два двоичных файла. Первый файл занимает около 30КБ, второй занимает около
300КБ. Со временем количество пользователей может исчисляться сотнями тысяч.
Первый вариант - хранить эти данные в базе данных. Поле Data в таблице будет иметь
тип varbinary(MAX):
public ActionResult GetWorld()
{
    var world = db.GetWorld(...);

    return File(world.Data, "application/octet-stream");
}

public ActionResult SaveWorld(HttpPostedFileBase worldData)
{
    var world = db.GetWorld(...);

    world.Data = new byte[worldData.ContentLength];
    worldData.InputStream.Read(world.Data, 0, worldData.ContentLength);
}

Второй вариант - хранить эти данные в виде отдельных файлов:
public ActionResult GetWorld()
{
    var world = db.GetWorld(...);

    string pathToWorldData = Server.MapPath(
        string.Format("~/App_Data/Worlds/{0}.dat", world.Id));

    return File(pathToWorldData, "application/octet-stream");
}

public ActionResult SaveWorld(HttpPostedFileBase worldData)
{
    var world = db.GetWorld(...);

    string pathToWorldData = Server.MapPath(
        string.Format("~/App_Data/Worlds/{0}.dat", world.Id));

    worldData.SaveAs(pathToWorldData);
}

Есть ещё другой вариант - varbinary(MAX) и FILESTREAM, но чем он по сути отличается
от второго? Только будет много возни в коде.    


Ответы

Ответ 1



Если хранить данные как поле таблицы, база будет пухнуть. Использование опции FILESTREAM позволяет хранить данные как отдельные файлы, но при этом с поддержкой транзакционности. Правда, лог базы данных всё равно будет пухнуть, его надо будет чистить периодически. Теперь о проблемах. FILESTREAM работает только с Windows-аутентификацией при обращении к БД. Возможно, я чего-то не нашёл, но по-другому у меня не получилось. В сочетании с тем, что диспетчер служб Windows любит терять пароли после пары перезагрузок, работать с этой опцией становится совсем весело. Ещё у меня была такая фигня, что после установки какого-то из обновлений Windows её было не включить. С учётом того, что Microsoft любят добавлять всё время новые возможности своих продуктов, не доводя до ума старые, используйте лучше файлы. Если так надо сделать поддержку транзакционности, посмотрите в сторону распределённых транзакций.

Ответ 2



Бинарные данные лучше хранить в файлах. Картинки, видео и музыку никто не хранит в БД. Не стоит лишний раз все усложнять. Для хранения большого количества файлов обычно создают множество подпапок, например можно хранить файлы для первой тысячи записей в папке /0/, для второй в /1/ и т. д.

Ответ 3



ну если есть деньги, то в БД, т.к. 500 мегабайт стандартно вроде, дальше уже доп $$$ а также из базы дольше дергаться будет, факт поле надо выбирать не varchar точно, раз ты байты будешь там хранить, лучше уж varbinary (кстати, для xml файлов есть тип xml в 2008) я бы посоветовал только путь к файлам хранить в БД, а файл дергать из файловой системы

Ошибка: The method … of type … must override a superclass method

#openjdk #java

                    
Здравствуйте.
Ошибка при компиляции с OpenJDK. 
Ситуация следующая. Есть нижеприведённый код:
class MyAction extends AbstractAction {

    @Override
    public void actionPerformed(ActionEvent arg0) {

        // что-то делаем...

    }

}

Вроде всё нормально, и Eclipse ошибку не показывает. Но при попытке компиляции из
консоли выскакивает ошибка 

"The method actionPerformed(ActionEvent) of type MyClass.MyAction must override a
superclass method". 

Такая ошибка обычно появляется в тех случаях, когда не совпадает сигнатура или тип
возвращаемого переопределяемой функцией значения, или, что то же самое, при помещении
Override над методом, который не имеет "прототипов" в классе-родителе. Во-вторых, IDE
такие ошибки отлавливает, подчёркивает и ничего не хочет компилировать. А здесь всё
выглядит нормально. Что характерно, с обычным JDK эта ошибка не появляется. Структура
пакетов там, насколько я помню, та же самая, что и в стандартном JDK - java.awt.event.ActionEvent.
Также проверил, какие java-библиотеки вообще видит Eclipse, оказалось, что только OpenJDK.
Кто-нибудь сталкивался с подобным?    


Ответы

Ответ 1



class MyAction extends AbstractAction { public MyAction() { super(); } @Override public void actionPerformed(ActionEvent arg0) { // что-то делаем... } }

Перевод функции arcTo -> bezier

#canvas #алгоритм

                    
Как бы превратить arcTo (стандартная функция postScript, да и не только, например
в HTML5Canvas она есть) с параметрами x1, y1, x2, y2, radius в кривую Безье?    


Ответы

Ответ 1



Вспомнить тригонометрию : ) Бился с аналогичным вопросом в Processing. Вопрос популярный и решения гуглятся. Например, даже с интерактивным примером.

Ответ 2



Занимался аналогичным вопросом. Вот в помощь картинка в svg для вычисления расстояния (l) до контрольной точки, тоже не для эллипса к сожалению, но думаю можно как-нибудь обобщить.

Ошибки компиляции из командной строки: Error: cannot find symbol

#java

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

У меня такая проблема: при компиляции программы в Eclipse все проходит успешно и
запускается. А если компилировать с командной строки, то до запуска не доходит из-за
кучи подобных ошибок:



Что нужно поправить, что бы скомпилировать успешно ?
    


Ответы

Ответ 1



Пропишите корректный classpath. Компилятор не видит не библиотеки, в которых у вас лежат эти классы. Сделать это можно опцией компилятора cp и указанием *jar файлов или директорий. Пример: javac -cp lib1.jar:lib2.jar:lib3.jar:/lib/dir/:../:. MainWindow.java Используемые бибилиотеки можно посмотреть в проекте Eclipse. Делать это нужно, даже если вы используете самописные классы, в таком случае нужно указать все директории (или запакованные .jar файлы) в которых у вас лежат скомпилированные .class файлы.

Несколько доменов

#python #django

                    
Необходимо чтобы по поддомену выполнялся своё приложение.

Есть site.com, нужно чтобы по main.site.con вызывалось приложение 'apps.views.main'

Попробовал сделать это через middleware:  

class SomeDomainMiddleware(object):
    def process_request(self, request):
         if request.META['HTTP_HOST'] == 'main.site.con':
            return HttpResponseRedirect('/main/')
         else:
            return HttpResponseRedirect('/')


Пробовал через return HttpResponseRedirect(reverse('apps.views.main')), но ругается
что не передал args и kwargs, хотя кроме request там ничего и не нужно.

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

P.S. не хочется через SITE_ID делать это, так как по сути сайт один, просто приложение
такое себе на поддомене.
    


Ответы

Ответ 1



По перебирал варианты, найдя точки остановок, вывел такой код: class SomeDomainMiddleware(object): def process_request(self, request): if request.META['HTTP_HOST'] == 'main.site.com': if request.META['REQUEST_URI'] == '/': return HttpResponseRedirect('/main/') else: if request.META['REDIRECT_STATUS'] != '200': return HttpResponseRedirect('/') Конструкции request.META['REDIRECT_STATUS'] != '200' и if request.META['REQUEST_URI'] != '/main/' нужны, чтобы были точки остановки, без них редирект будет бесконечным, а точнее то ограниченное чисто рас, сколько сервер разрешит, после чего будет выдано - ничего, как-то так. А эти ограничения говорят нам что редирект уже был и нужно пропустить редирект. Если кто-то имеет элегантнее способ, прошу все же поделится, так как понимаю что мой способ похож на грабли, хотя имеет место на жизнь.

Ответ 2



Можно на поддомен положить свой .wsgi, который будет сразу запускать Ваше приложение. Если нужна какая-то интеграция с основным сайтом, то в .wsgi можно указать другой файл settings, например, subdomain_settings.py, в который импортировать основные settings: from settings import * А затем перекрыть требуемые элементы, например: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'ANOTHER_DB', 'USER': 'ANOTHER_USER', 'PASSWORD': 'ANOTHER_PASS', 'HOST': '127.0.0.1', 'PORT': '', } } MEDIA_ROOT = '/home/user/media' MEDIA_URL = '/media/'

Xml-сериализация атрибутов вложенных узлов в свойства объекта

#c_sharp #xml #net

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

в объект примерно такого класса:
[XmlRoot("Service")]
public class Service
{
    public string Host { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
}

То есть смысл в том, чтобы не создавать для каждого вложенного узла свой класс, наподобие
этого:
public class Host
{
    [XmlAttribute("value")]
    public string Value { get; set; }
}

и затем не городить огород:
[XmlRoot("Service")]
public class Service
{
    [XmlElement("Host")]
    public Host Host { get; set; }
    .
    .
    .
}

...

var host = service.Host.Value;

Хочется верить, что атрибуты "value" всех вложенных узлов можно сразу замапить на
string-свойства. Буду благодарен за любой совет.    


Ответы

Ответ 1



Может быть, пусть Service имплементирует интерфейс IXmlSerializable и реализует ReadXml разумным образом? Сделать это только при помощи атрибутов невозможно: свойства определяют либо такой: http://domain.com:80 user_name password либо такой синтаксис. Я тут набросал код: [XmlRoot] class Service : IXmlSerializable { string Host; string Username; string Password; XmlSchema IXmlSerializable.GetSchema() { return null; } void IXmlSerializable.ReadXml(XmlReader reader) { if (reader.IsEmptyElement) // проверяем формат throw new Exception(); // надо какое-то другое исключение, конечно reader.ReadStartElement(); // читаем открывающий тег Service while (reader.IsStartElement()) // пока есть вложенные теги... processNode(reader); // читаем их reader.ReadEndElement(); // читаем закрывающий тег } void processNode(XmlReader reader) { if (!reader.IsEmptyElement) // опять проверяем формат throw new Exception(); if (reader.AttributeCount != 1) // то же самое throw new Exception(); string name = reader.Name; string value = reader.GetAttribute(0); setField(name, value); reader.ReadStartElement(); // переходим к следующему } void setField(string name, string value) { switch (name) // ну или reflection, если хотите { case "Host": Host = value; break; case "Username": Username = value; break; case "Password": Password = value; break; } } void IXmlSerializable.WriteXml(XmlWriter writer) { serializeField(writer, "Host", Host); serializeField(writer, "Username", Username); serializeField(writer, "Password", Password); } void serializeField(XmlWriter writer, string name, string value) { writer.WriteStartElement(name); writer.WriteStartAttribute("Value"); writer.WriteString(value); writer.WriteEndElement(); } }

Серверная обработка изменений Store ExtJS

#javascript #extjs #php

                    
Здравствуйте!
Разбираюсь с ExtJS, с переменным успехом... 
Ни как не могу принять на сервере данные отправляемые Store при изменении записей
(добавлении, изменении или удалении). Пишет что данные уходят POST-ом, но на сервере
ни $_POST, ни $_GET, ни $_REQUEST отправленные данные не показывает - как будто ничего
не отправлялось (ну кроме случайного значение в $_GET - _dc=1357565039902).

Вот что уходит на сервер (взял из консоли Хрома), соответственно, при удалении, обновлении
и добавлении:

Request URL:http://localhost/service/destroy/news.php?_dc=1357565811429
Request Method:POST
Status Code:200 OK
Query String Parameters:
  _dc:1357565811429
Request Payload:
  {"items":{"id":5}}

Request URL:http://localhost/service/update/news.php?_dc=1357566047052
Request Method:POST
Status Code:200 OK
Query String Parameters:
  _dc:1357566047052
Request Payload:
  {"items":{"datepubl":"2012-12-01T00:00:00","title":"the Update Plan","alias":"the-update-plan","new":"

small text new

","newfull":"

full text new

","id":4}} Request URL:http://localhost/service/create/news.php?_dc=1357566179903 Request Method:POST Status Code:200 OK Query String Parameters: _dc:1357566179903 Request Payload: {"items":{"id":0,"datepubl":null,"dateclose":null,"title":"the NEW new","alias":"the-new-new","new":"text the NEW new","newfull":""}} Посылает эти запросы следующий Store: var storeNews = Ext.create('Ext.data.Store', { autoLoad: true, autoSync: true, idProperty: 'id', remoteFilter: true, fields: [ { name: 'id', type: 'int' }, { name: 'datepubl', type: 'date' }, { name: 'dateclose', type: 'date' }, { name: 'title', type: 'string' }, { name: 'alias', type: 'string' }, { name: 'new', type: 'string' }, { name: 'newtext', type: 'string' } ], proxy: { type: 'ajax', api: { read: 'service/view/news.php', create: 'service/create/news.php', update: 'service/update/news.php', destroy: 'service/destroy/news.php' }, reader: { type: 'json', successProperty: 'success', root: 'data', messageProperty: 'message' }, writer: { type: 'json', writeAllFields: false, root: 'data' }, listeners: { exception: function(proxy, response, operation){ Ext.MessageBox.show({ title: 'REMOTE EXCEPTION', msg: operation.getError(), icon: Ext.MessageBox.ERROR, buttons: Ext.Msg.OK }); } } } }); Подскажите, пожалуйста, как принять переданные данные на сервера ? Или как их правильно отправить, если я делаю это не верно ?..


Ответы

Ответ 1



Все проще чем кажется: $data = json_decode(file_get_contents('php://input')); Store хочет в ответе получить готовый вид этой записи. Только тогда он будет уверен, что эта строка таблицы существует на самом деле, а не является какой то "вымышленной". У каждой записи в store есть свойство phantom. Оно означает, существует ли запись реально, или она временно появилась в store. По добавлению store будет отсылать все фантомные записи. Когда store получит в ответе данные записи, он поймет, что сервер её обработал или сохранил, и присвоит значение phantom = false, то есть запись реальная. print( json_encode( $data ) ); Если выполняется добавление записи, то ей должен быть присвоен ID, если такой имеет место быть.

Преобразование типов и шаблоны

#cpp

Перенос текста

#android #java

                    
Как во всех читалках реализован перенос текста? Как мне динамически создать WebView
и на него вывести текст с переносом на следующую страницу когда закачивается текущее?
Как это реализовано в Foliant или в CoolReader ? Помогите пожалуйста разобраться.
UPD:
Вот смотрите, немного видоизменю вопрос. У меня вот такой вот слайдинг экранов http://habrahabr.ru/post/131889/
как мне резать строку так что бы  передавать на каждую новую страницу новый не прочитанный
текст? Как мне обрезать текст так что бы при окончании экрана следующий переносился
на следующий экран.
UPD2:
Давайте перефразирую вопрос. Как мне порезать текст и подсчитать сколько его поместится
на экране? Хотя бы так.. Помогите, пожалуйста.    


Ответы

Ответ 1



Задача, о которой вы говорите, достаточно сложна, поэтому давайте разделим её на части. Часть 1. Расстановка переносов. Для начала, есть словари, в которых слова даны со всеми возможными переносами. Составление таких словарей, понятно, трудоёмкая задача. Кроме того, словари обычно всё же хранят таблицы аффиксов и правила присоединения их к корням: хранить 6 падежей для каждого слова обременительно. Затем, существует классической алгоритм Ф. Лианга для расстановки переносов, который использовал мегаотец Дональд Кнут в своей системе TeX. Этот алгоритм базируется на паттернах, которым назначается тот или иной вес, и построен таким образом, чтобы словарь исключений был минимален (например, таблица исключений для английского языка содержит всего 14 элементов). Вы можете найти таблицы для всех языков вместе с таблицами исключений в любой поставке TeX'а (например, во многих дистрибутивах линукса). Этот же алгоритм, с незначительным изменениями используется во многих популярных открытых системах проверки орфографии. Например, hunspell, который используется в OS X, OpenOffice, Firefox, Chrome, Opera, Eclipse и ещё куче других программ, пользуется именно лианговским алгоритмом. Есть ещё проприетарные, закрытые алгоритмы переноса, про них ничего сказать не могу. Как именно расставляются переносы в каждой конкретной читалке, могут сказать лишь специалисты. Однако список программ, которые пользуются TeX'овскими переносами впечатляет, не правда ли? Часть 2. Разбиение текста на строки. Здесь существует снова-таки простой безыскусный подход: зная возможные точки переносов, "напихиваем" куски в текущую строку до тех пор, пока можно. Затем переходим на следующую строку, и так до конца. По моим впечатлениям, Microsoft Word до сих пор работает именно так. Алгоритм же, используемый в системе TeX, гораздо изящнее: целью алгоритма является максимизация суммарного "качества" всех строк. Для каждого из вариантов разбиения на строки алгоритм может оценить, насколько строка растянута или ужата. Отклонение от "идеального" случая уменьшает качество строки. Другие факторы, например, переносы, также уменьшают качество строки. Алгоритм подбирает разбиение за квадратичное время, пользуясь вариантом динамического программирования. Качество получившегося разбиения заметно лучше, чем в наивном алгоритме, и возрастает с увеличением длины абзаца; однако алгоритм сам по себе не очень быстр. Снова-таки, каким алгоритмом пользуется та или иная читалка, сказать могут лишь специалисты. Часть 3. Что делать? Во-первых, поговорите с начальством, узнайте, что они хотят. Вынесите разбиение на строки в отдельный модуль и для начала за пол-дня с кофе и булочками набросайте "жадное" разбиение на строки без переносов. (Обратите внимание на частный случай, когда одно слово в середине длиннее всей строки.) Во-вторых, для переносов проверьте, совместим ли hunspell с вашей лицензией, и прикрутите его для расстановки переносов. Это недолго, и сразу даёт разбиение, не отличающееся от OpenOffice -- уже неплохо. Работы тут на пару дней. В-третьих, попробуйте либо самостоятельно заимплементировать ТеХ'овский алгоритм разбиения на строки, или найдите готовую имплементацию (даже по несовместимой лицензии). Потестируйте скорость, это может быть критично для вашей программы. Если скорость подходит, ищите имплементацию, совместимую с вашей программой в смысле лицензионной чистоты (или сделайте сами, информация в гугле найдётся, хотя и на английском). Если нет, может быть, такое качество вёрстки ценой скорости вам и не нужно?

Ответ 2



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

Ответ 3



Очень просто - там есть файл с словарем, в котором все слова записаны, как их можно переносить. Где то так чи-тал-ках реа-ли-зо-ван пе-ре-нос текс-та Использовать webview для этого - лишняя трата ресурсов. Файл для переносов легко гуглится по слову 'Russian_EnUS_hyphen_(Alan).pdb'. Как он читается и используется, можно подсмотреть в коде coolreader'a - hyphman.h и hyphman.cpp

Загрузчик скриптов javascript (или ресурсов вообще) на JavaScript

#javascript

                    
Здравствуйте!
Меня интересует JavaScript-загрузчик - то есть скрипт загружающий другие javascript
с сервера.
То есть что бы не прописывать все скрипты по одному в ресурсах страницы, а прописать
один и сказать ему какие ещё скрипты нужно загрузить с сервера... А после загрузки
всех скриптов сгенерировать специальное событие говорящее о полной загрузки скриптов.
Это нужно для того что бы скрипты грузились в нужном порядке, а так же для установки
факта загрузки всех скриптов.

Если есть готовое решение - отлично, а если его нет и кто-то подскажет (желательно
с наброском) как такой загрузчик написать - буду очень признателен!    


Ответы

Ответ 1



Для использования с ExtJs целесообразно использовать Ext.Loader. Раскладываете все ваши классы по файлам и потом загрузчик сам загрузит всё необходимое. Пример использования Для общего случая вам подойдёт: HeadJS - весьма удобная штука, умеет загружать и js и css LABjs JSL RequireJS и т.д. (сравнительная таблица)

Как определить, жив ли процесс? Python 2.6, unix

#python #unix #процесс

                    
Вопрос тут появляется в похожем виде не впервые. Столкнулся со следующей проблемой:
нужно проверять не только существование процесса, но и то, что он не является зомби.
try:
    os.kill(pid, 0)
    return True
except OSError:
    return False

Вариант выше знаю, он не прокатывает с последним условием. Ставить внешние программы/модули
нельзя, все это происходит на разных машинах под линуксом и BSD, рутового доступа на
которые нету. Есть какие-нибудь варианты, как решить проблему?    


Ответы

Ответ 1



Можно чисто средствами баша ps aux | awk ' { print $2" "$8 } ' | grep -q "$pid Z" где $pid это pid вашего процесса. В случае если процесс зомби, то результат этой команды будет равен нулю, т.е. полное совпадение.

Js RegExp: выбор текста между тегами

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

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


Но это не работает. Как сделать это правильно?    


Ответы

Ответ 1



Задача поставлена путано: автор просит «написать скрипт», но из дальнейшего текста вопроса следует, что необходимо обычное регулярное выражение. Также не очень понятно, нужна ли именно реализация регулярного выражения на JavaScript или же метка javascript проставлена по ошибке, только потому что операция поиска производится в содержимом скрипта. Если формулировка следующая: «найти текст между тегами с помощью регулярных выражений», то приведу шаблон для PCRE. Т. к. атрибут type в HTML5 можно опустить, в ответе он не учитывается. Регулярное выражение: (?<=<[Ss][Cc][Rr][Ii][Pp][Tt]>)([\s\S]*?)(?=<\/[Ss][Cc][Rr][Ii][Pp][Tt]>) Демонстрация: https://regex101.com/r/oO7pR0/1 Пояснения: Используются метасимволы поиска контекста, они могут поддерживаться не везде: ?= — положительный просмотр вперёд, ?<= — положительный просмотр назад. Выражение ув-мого Гены Царинного находит текст вместе с тегами, а автору, насколько понял, сами теги не нужны. Нахождение содержимого внутри них — случай применения «операций нулевой ширины» с приведёнными выше метасимволами.

Ответ 2



Ответ из комментариев /]*>([\s\S]*?)<\/script>/

Игровой цикл

#qt

                    
Делаю кроссплатформенную игру с использованием Qt (из Линукса). Именно Qt выбрал,
потому что в перспективе понадобится графический интерфейс для всяких редакторов, а
также он предустановлен практически во все Linux'ы.
Пробовал использовать стандартный цикл QApplication::exec() и сделать таймер с нулевым
интервалом. Но всё это сильно дёргалось, хотя в полноэкранном режиме было ещё нормально.
Вот код:
QApplication app;
QTimer t;
t.setSingleShot(false);
t.start(0);
app.exec();

Потом попробовал сделать свой бесконечный цикл, вызывая processEvents, а после него
обновляя игру. Стало получше, но всё равно иногда дёргается в оконном режиме. Выдаёт
FPS от 50 до 70, хотя в Windows версии на WinAPI было больше 200. Код:
while(running)
{
    QApplication::processEvents();
    engine->Step();
}

Код, который я пробовал на WinAPI, когда ещё не перешёл на Linux:
while(GetMessage(...))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    engine->Step();
}

Вроде то же самое, что и на Qt, но на Qt тормозит, а на WinAPI нет. Хотя эксперимент
был не совсем чистым, так FPS на WinAPI я замерял на Windows, а FPS на Qt я замерял
в Linux.    


Ответы

Ответ 1



Обычно пишут для каждой платформы пачку платформозависимых файлов, которые обрабатывают ввод, собирают информацию о системе, инициализируют отдельные потоки для звука и приводят это все к форме принятой в движке. Затем где-нибудь в одном из файлов для каждой системы вставляют: int main(int argc, char *argv[]) { core.init(); while(1) //Специальная олимпиада открыта вдруг for(;;) быстрее { core.drawFrame(); } return 0; //should never get here } При этом сам кросс-платформенный код отрисовки инкапсулирован в core. Сам этот метод может быть достаточно сложен. Там могут быть счетчики FPS, работа с вводом , обработка AI, столкновений, логики и лишь в конце рендеринг/очистка памяти. При этом рендеринг осуществляется разными техниками для разных объектов/материалов в несколько проходов с разными шейдерами в разные буферы. По поводу редакторов для игры, очень сомнительно что ему реально нужна кросс-платформенность и непонятно что он будет делать. В лучшем случае комбинировать меши выгруженные из нормального 3D редактора в уровень. Но если игра маленькая это можно сделать и в любом другом 3D редакторе. А файл с описанием уровня/активов просто автоматически сгенерировать скриптом. По поводу core.init() это тоже зависит от реализации. Если игра маленькая она просто загружает все что можно загрузить. Если большая то грузится основной GUI, шейдеры, метафайл с описанием остальных активов, пользовательский кэш, загрузочный экран/заставка и.т.д. Геометрия и текстуры уровня же подгружаются отдельно по сигналу от GUI из обработчика ввода внутри drawFrame если пользователь решил таки загрузить очередной уровнеь. По поводу скачков FPS то непонятно каким образом вы его считаете. Взвешенное(weighted) скользящее среднее по 20ке последних тиков вроде неплохой метод. http://en.wikipedia.org/wiki/Moving_average P.S.Код Doom 3, на который я ориентируюсь сделан таким образом, если смотреть на то как он справляется с покрытием нескольких платформ.

Ответ 2



Оказалось, что дело не в главном цикле Qt. Попробовал перекомпилировать под Windows, где у меня уже был реализован WinAPI-вариант, там тот же самый низкий FPS. Сделал через XLib на Linux'е - вроде чуть плавнее, но FPS вроде не увеличился. Единственное что изменилось при портировании и не было проверено - это компилятор MSVC сменился на g++. Я пробовал также llvm-g++ и clang++, но на производительности никак не отражается. Да и дебаг от релиза по производительности ничем почти не отличается, а в студии сильно отличалось. Вообще не могу понять, что же такое произошло во время портирования. Были подозрения на некоторые изменения, но я попробовал их повторить в старой версии движка в студии и они никак не повлияли на высокий FPS. Так что буду учиться пользоваться Linux'овским профайлером. Ещё попробую создать отладочный контекст OpenGL и задействовать GL_AMD_debug_output. Может он что-нибудь скажет. Если нет, то попробую скомпилировать проект в студии.