Эта памятка с десятью советами, которые могут стать полезными не только новичкам, но и вебмастерам продвинутым и имеющим большой опыт.
1. Не стоит брать новые домены, такие как .biz .name .info, ни один из них не прижился в Интернете, кроме последнего и при рассматривании поисковиками у них нет никакого приоритета.
2. Не стоит забывать о предпочтительных форматах gif .jpg, когда создаёте графический дизайн. Под растровую графику прекрасно подойдет первый формат, под фото – второй, а при правильном совмещении есть шанс добиться великолепного результата.
3. Если Вы уже есть в поисковых машинах, не следует закидывать их новыми заявками о регистрации. Потому как данные действия могут быть приняты за спам и Ваш сайт быстренько отнесут к сайтам из «Серого списка», если же будете продолжать в том же духе, дойдёт и до «Чёрного списка», а это значит, что поисковые роботы попросту будут обходить и игнорировать Ваш сайт.
4. Перед тем как составить слова для поиска стоит найти статистику запросов в машинах поиска, иногда будет выходить так, что запрашиваемые слова сочетают в себе не сочетаемое, но ничего не поделаешь, если желаете привлечь посетителей, Вам просто необходимо будет под данные слова подстраиваться.
5. Не стоит пытаться «мухлевать» с поисковиками, до добра это не доведёт, уж лучше вести честную, конкурентоспособную игру и это наверняка приведёт к тому, что Ваш сайт благодаря поиску станет посещаемым пользователями.
6. Не следует перегружать сайт счётчиками и различными каталогами, потому как подобные действия только увеличивают загрузку страницы.
7. Запомните, что если поисковое слово встречается в тексте, в названии сайта и в адресе страницы, особенно, если оно местами выделено жирным, то все козыря у вас на руках. Только не стоит слишком уж усердствовать, выделяя всё жирным, иначе Вашу попытку примут за жульничество.
8. Баннеры, как средство раскрутки очень не эффективны, их отдача зачастую не превышает 1%.
9. Разместите ссылки на Ваш сайт на других страницах, результат стоит того.
10. Создайте идею и сделайте свой сайт уникальным, именно уникальность сделает Ваш сайт посещаемым и неповторимым, но главное это уникальная идея.
Соблюдения всех вышеперечисленных советов не обязательно приведут Вас сразу же к успеху, но их не соблюдение это бесполезная трата сил и времени.
Октябрь
6,
2008
— Filed under: C++,Delphi,MySQL,PHP
Метки: баннеры, домены, спам, счётчики
Собственный метод создается путем добавления к его описанию спецификатора NATIVE, при этом он не должен иметь реализации (так же как и методы в описании интерфейса).
Сентябрь
25,
2008
— Filed under: C++
Метки: APP.JAVA, JAVA-метод
Взаимодействие кодов JAVA и С/С++ может осуществляться двумя способами: С/С++-код получает управление непосредственно из JAVA-программы путем вызова собственного (NATIVE) метода; С/С++-код динамически загружает JVM с помощью INVOCATION API.
Сентябрь
21,
2008
— Filed under: C++
Метки: JAVA-программы, JNI, С++
Использование INVOCATION API позволяет встраивать JVM в приложения без необходимости их статического связывания с кодом самой JVM. Напомним, что в этом случае управление изначально находится в С/С++-программе. INVOCATION API состоит из небольшого набора функций, позволяющих создавать и уничтожать JVM в текущем процессе, присоединять и отсоединять текущий поток от JVM (интерфейсный указатель существует только в рамках данного потока).
Сентябрь
10,
2008
— Filed under: C++
Метки: INVOCATION API, JAVA-приложение, JNI
JNI определяет 210 прикладных функций. Доступ к ним из С/С++-функции можно получить через интерфейсный указатель JNIENV*, который передается каждой С/С++-функции, представлющей реализацию собственного метода. Все функции разделены на 14 групп:
информация о версии JNI;
операции с классами;
исключения (EXCEPTIONS);
обработка глобальных и локальных ссылок;
операции с объектами;
доступ к данным объекта;
вызов методов объекта (INSTANCE METHOD);
доступ к статическим данным объекта;
вызов методов класса (CLASS METHOD);
операции со строковыми объектами;
операции с массивами;
регистрация собственных методов;
операции с мониторами (MONITOR OPERATIONS);
интерфейс с JVM.
Использование JNI функций необходимо только в том случае, если С/С++-функция осуществляет какое-либо взаимодействие с JVM: вызов JAVA-методов, доступ к данным, создание JAVA-объектов и т.д.
Ниже приведен пример JAVA-программы, которая выводит на печать количество свободной памяти на диске С для платформы WIN32. Для этого используется собственный метод и соответствующая реализационная С/С++-функция, вызывающая при своей работе функцию WIN32 API.
// Файл APP.JAVA
PUBLIC CLASS APP {
PUBLIC STATIC VOID MAIN(STRING ARGS[]) {
SYSTEMSPECIFIC SS = NEW SYSTEMSPECIFIC();
TRY {
LONG BYTES = SS.GETCDRIVEFREESPACE();
IF (BYTES != -1) {
LONG KB = BYTES / 1024;
SYSTEM.OUT.PRINTLN(«на диске C:\\ свободно » + KB + » KB»);
}
ELSE {
SYSTEM.OUT.PRINTLN(«произошла ошибка в С/С++-функции»);
}
}
CATCH (UNSATISFIEDLINKERROR E) {
SYSTEM.OUT.PRINTLN(«метод не найден (» + E + «)»);
}
}
}
CLASS SYSTEMSPECIFIC {
STATIC {
TRY {
SYSTEM.LOADLIBRARY(«SYSSPEC»);
}
CATCH (UNSATISFIEDLINKERROR E) {
SYSTEM.OUT.PRINTLN(«библиотека не найдена (» + E + «)»);
}
}
NATIVE LONG GETCDRIVEFREESPACE();
}
// Файл SYSTEMSPECIFIC.CPP
#INCLUDE «SYSTEMSPECIFIC.H»
#INCLUDE
JNIEXPORT JLONG JNICALL JAVA_SYSTEMSPECIFIC_GETCDRIVEFREESPACE (JNIENV *, JOBJECT) {
DWORD SCTRPERCLSTR, BYTESPERSCTR, FREECLSTR, CLSTR;
BOOL RES = GETDISKFREESPACE(«C:\\», &SCTRPERCLSTR, &BYTESPERSCTR, &FREECLSTR, &CLSTR);
RETURN RES == TRUE ? SCTRPERCLSTR * BYTESPERSCTR * FREECLSTR : -1;
}
Для успешной компиляции кода JAVA и С/С++ на платформе WIN32 необходимо правильно установить переменные окружения PATH, LIB, INCLUDE и CLASSPATH (многие из этих значений можно задать как параметры соответствующих компиляторов).
Если записать исходные тексты предыдущего примера в файлы APP.JAVA и SYSTEMSPECIFIC.CPP соответственно, то для их компиляции необходимо выполнить следующие команды (предполагается, что исходные файлы находятся в каталоге C:\TEST\NATIVE):
C:\TEST\NATIVE> JAVAC APP.JAVA
C:\TEST\NATIVE> JAVAH -JNI SYSTEMSPECIFIC
C:\TEST\NATIVE> CL -W3 SYSTEMSPECIFIC.CPP -FESYSSPEC.DLL -TP -LD -MD -LINK JAVAI.LIB
Для запуска программы необходимо выполнить: C:\TEST\NATIVE> JAVA APP
на диске С:\ свободно 324567 KB
C:\TEST\NATIVE>
Для трансляции С/С++-файлов можно использовать любой компилятор, допускающий создание 32-битных DLL.
Май
7,
2008
— Filed under: C++
Метки: JNI, функции
JNI использует целый набор типов для своих функций и для формальных параметров С/С++-функций, представляющих реализацию собственных методов. Все эти типы описаны в файле JNI.H, который включается в любой заголовочный файл для JNI. Файл JNI.H использует стандартную технику препроцессирования с макросом _CPLUSPLUS. Тем самым, в зависимости от того, какой (С++ или С) код компилируется, будут создаваться две немного отличающиеся версии описания типов. Каждая из них требует определенного синтаксиса доступа.
Файл JNI_MD.H содержит системно-зависимые описания JINT, JLONG и JBYTE. В этом же файле определены макросы JNIEXPORT и JNICALL. Тип VOID используется без переопределения.
Следует отметить, что для представления строковых объектов JNI использует сокращенный вариант формата UTF-8.
Первым аргументом С/С++-функции, представляющей реализацию собственного метода, является указатель на структуру JNIENV. Смысл этого указателя определяет важную идею, лежащую в основе реализации JNI. Если отвлечься от конкретного языка, то указатель на JNIENV, или интерфейсный указатель (JNI INTERFACE POINTER), является указателем на массив указателей, каждый из которых указывает на прикладную функцию JNI. Только через этот указатель С/С++-функция может получить доступ к функциям и ресурсам JNI. В случае С++ (макрос _CPLUSPLUS определен) тип JNIENV является структурой, а в случае С — указателем на структуру. В силу этого, для доступа к функциям JNI в С и С++ применяется различный синтаксис:
// C
JNIEXPORT VOID JNICALL JAVA_SYSTEMSPECIFIC_DOSPECIFIC(JNIENV* ENV, JOBJECT THIS) {
JINT VERSION = (*ENV)->GETVERSION(ENV);
Е
}
// C++
JNIEXPORT VOID JNICALL JAVA_SYSTEMSPECIFIC_DOSPECIFIC(JNIENV* ENV, JOBJECT THIS) {
JINT VERSION = ENV->GETVERSION();
Е
}
Главным преимуществом такой организации функций JNI является легкость модификации и дальнейшего расширения интерфейса.
Указатель на JNIENV действителен только в текущем потоке (THREAD). JVM гарантирует передачу одного и того же интерфейсного указателя всем методам, вызываемым из данного потока. Тем самым запрещено передавать интерфейсный указатель другому потоку. Если методы вызываются из разных потоков, то в этом случае каждый метод получает различные интерфейсные указатели.
Если С/С++-функция представляет реализацию нестатического собственного метода, то вторым параметром функции является объект типа JOBJECT. Данный параметр является ссылкой на JAVA-объект, для которого был вызван соответствующий собственный метод. Если функция представляет статический собственный метод, то вторым параметром является объект типа JCLASS, определяющий JAVA-класс, для которого вызван собственный метод класса (CLASS METHOD).
Последующие параметры С/С++-функции соответствуют параметрам собственного метода (если собственный метод их не содержит, то реализующая его С/С++-функция имеет только два описанных выше параметра).
Май
3,
2008
— Filed under: C++
Метки: JNI, структуры данных
Имя С/С++-функции формируется путем последовательного соединения следующих компонентов:
префикс JAVA_;
полное квалифицированное имя класса;
символ подчеркивания («_»);
имя метода;
для перегружаемых (OVERLOADED) методов — два символа подчеркивания («_ _») с последующей сигнатурой метода.
Использование имен с сигнатурой на конце необходимо только в случае перегрузки двух или более собственных методов (перегрузка с обычным методом не важна, так как обычные методы не будут находиться в создаваемой библиотеке, что, однако, не допускает наличия собственного и обычного метода с одинаковыми именами и сигнатурами).
Для соответствия лексиграфическим правилам С/С++ и использования UNICODE-кодировки, применяются дополнительные правила преобразования, представленные в табл. 2.
Таблица 2Исходный символ Результирующая последовательность
«_» _1
«;» _2
«[" _3
символ UNICODE с кодом ХХХХ _0ХХХХ
Ниже приведен пример JAVA-класса с собственными методами:
PACKAGE TESTPACKAGE;
ABSTRACT CLASS TEST {
PUBLIC NATIVE VOID M1(STRING[] SA, OBJECT O, INT[][] IA2);
PUBLIC NATIVE FLOAT[] M1(DOUBLE D, TEST T);
PUBLIC NATIVE TEST M3(INT I);
}
и соответствующие им имена С/С++-функций:
JNIEXPORT VOID JNICALL JAVA_TESTPACKAGE_TEST_M1___3LJAVA_LANG_STRING_2LJAVA_LANG_OBJECT_2_3_3I
(JNIENV *, JOBJECT, JOBJECTARRAY, JOBJECT, JOBJECTARRAY);
JNIEXPORT JFLOATARRAY JNICALL JAVA_TESTPACKAGE_TEST_M1__LJAVA_LANG_DOUBLE_2LTESTPACKAGE_TEST_2
(JNIENV *, JOBJECT, JOBJECT, JOBJECT);
JNIEXPORT JOBJECT JNICALL JAVA_TESTPACKAGE_TEST_M3
(JNIENV *, JOBJECT, JINT);
Рассмотрим типы параметров, которые получает на входе С/С++-функция при ее вызове.
Май
1,
2008
— Filed under: C++
Метки: С++, функции
Сигнатура метода — это сокращенная форма записи параметров метода и типов возвращаемого значения. Следует подчеркнуть, что в сигнатуру не входят ни имя метода, ни имена параметров. JNI формирует сигнатуры в соответствии с правилами, представленными в табл. 1.
Таблица 1Знак сигнатуры JAVA-тип
Z BOOLEAN
B BYTE
C CHAR
S SHORT
Internet INT
J LONG
F FLOAT
V VOID
D DOUBLE
L полное квалифицированное имя класса полное квалифицированное имя класса
[ тип тип[]
(типы аргументов) возвращаемый тип полная сигнатура метода
Проиллюстрируем эти правила на примерах:
метод LONG M1(INT N, STRING S, INT[] ARR);
сигнатура (ILJAVA/LANG/STRING;[I)J;
метод VOID M2(FLOAT N, BYTE[][] ARR, RUNTIME R);
сигнатура (F[[BLJAVA/LANG/RUNTIME;)V.
Полная информация о правилах образования сигнатуры метода представлена в файле SIGNATURE.H.
Апрель
30,
2008
— Filed under: C++
Метки: JNI, Сигнатура метода
Создание С/С++-кода необходимо начинать с создания заголовочного файла. Его можно написать вручную или воспользоваться утилитой JAVAH. Второй путь предпочтительней, так как допускает меньшее количество ошибок. При обращении к утилите JAVAH указывается имя класса и параметр -JNI. Без него JAVAH будет генерировать файл в формате JDK 1.0 NI. Имя класса представляет собой полное квалифицированное имя класса. Например:
JAVAH -JNI JAVA.LANG.RUNTIME
Перед использованием утилиты JAVAH соответствующий JAVA-класс должен быть скомпилирован в CLASS-файл. Утилита JAVAH анализирует CLASS-файл и строит заголовочный файл, в котором перечислены объявления С/С++-функций, представляющих реализации соответствующих собственных методов. В качестве имен создаваемых заголовочных файлов используются полные квалифицированные имена классов, которые описаны в указанном файле и содержат собственные методы. Например, если выполнить следующие команды:
JAVAC APP.JAVA
JAVAH -JNI SYSTEMSPECIFIC
то JAVAH сгенерирует следующий файл SYSTEMSPECIFIC.H:
/* DO NOT EDIT THIS FILE — IT IS MACHINE GENERATED */
#INCLUDE
/* HEADER FOR CLASS SYSTEMSPECIFIC */
#IFNDEF _INCLUDED_SYSTEMSPECIFIC
#DEFINE _INCLUDED_SYSTEMSPECIFIC
#IFDEF _ _CPLUSPLUS
EXTERN «C» {
#ENDIF
/*
* CLASS: SYSTEMSPECIFIC
* METHOD: DOSPECIFIC
* SIGNATURE: ()V
*/
JNIEXPORT VOID JNICALL JAVA_SYSTEMSPECIFIC_DOSPECIFIC(JNIENV *, JOBJECT);
#IFDEF _ _CPLUSPLUS
}
#ENDIF
#ENDIF
Как указывалось выше, данный файл можно создать вручную или с помощью утилиты JAVAH. В последнем случае не рекомендуется вносить в него какие-либо изменения, так как при последующем применении JAVAH к данному классу все внесенные изменения будут потеряны.
Директива препроцессора #INCLUDE включает файл JNI.H (из подкаталога INLCUDE основного каталога JAVA), в котором находятся все необходимые объявления типов и функций для реализации собственного метода.
Макросы JNIEXPORT и JNICALL необходимы только для платформы WIN32, где они раскрываются соответственно в __DECLSPEC(DLLEXPORT) и __STDCALL и позволяют более эффективно строить DLL. Платформа UNIX использует для этих целей обычные С-соглашения, поэтому указанные макросы раскрываются в пустые строки.
Как видно из примера, имя С/С++-функции значительно отличается от имени собственного JAVA-метода. Важным понятием при построении имени С/С++-функции и использовании JNI-функций является сигнатура метода (SIGNATURE или METHOD ARGUMENTS SIGNATURE).
Апрель
28,
2008
— Filed under: C++
Метки: SIGNATURE, С++
Вместе с тем следует помнить, что существуют операции, выполнение которых само по себе требует больших ресурсов, чем для обычных запросов. Например, использование операции DISTINCT к функции SELECT вызывает потребление гораздо большего количества процессорного времени, чем обычный SELECT. DISTINCT пытается искать уникальные значения, зачастую производя множество сравнений, подстановок и расчетов. Причем, чем больше становится объем данных, к которому применяется DISTINCT (ведь Ваша база со временем растет), тем медленее будет выполняться такой запрос и рост ресурсов, требуемых для выполнения такой функции, будет происходить не прямо пропорцонально объему хранимых и обрабатываемых данных, а гораздо быстрее.
Апрель
25,
2008
— Filed under: C++
Метки: Ресурсоемкие операции