Showing posts with label programming. Show all posts
Showing posts with label programming. Show all posts

November 11, 2015

Real time mirroring new Zone Minder event to Box.net cloud

Overview

This is my configuration:
  • Server OS: Ubuntu Server 14.04
  • ZoneMinder:1.28.1

Mounting box.com to local location 

This is how you can mount a box.com directory manually:
sudo mount -t davfs https://dav.box.com/dav /home/sergi/box.com
However it is better to do this via fstab. Information how to mount box.com locally is here. This will be mounted on startup.
If you do not want reboot run: sudo mount ~/box.com

Node installation 

I am using node.js 5.x, however this should work with node.js 0.12.x and above.
Installation information.

Fetching zmwatcher from GIT

Make sure you have installed git (sudo apt-get git)
  1. CD to some location (in my case I used home directory)
  2. Grab sources from github "git clone https://github.com/solvek/zmwatcher.git"

Running mirroring script

The mirroring script is located inside zmwatcher/samples/zmmirror/mirror.js
Open this file and add your config (basing on your hostname, hostname you can see at command prompt).
  • Before running the script you have to install it (its dependencies). Go to "cd ~/zmwatcher/samples/zmmirror"
  • Run "npm install" to install necessary dependencies
  • Run "sudo nodejs mirror.js" (in my case I am running it with root permissions because my regular user does not have permissions to events directory)
  • Modify samples/zmmirror/config.js with your values 
To run script mirroring manually:  sudo nodejs ~/zmwatcher/samples/zmmirror/mirror.js

Running mirroring script on linux startup 

Using systemd

  1. Create service file: sudo nano /etc/systemd/system/zmmirror.service
  2. Copy my systemd script from here
  3. Correct paths to node and index.js script
  4. Save
  5. Enable the service: sudo systemctl enable zmmirror.service
  6. Start the servcie: sudo systemctl start zmmirror.service
  7. Verify it is running: sudo systemctl status zmmirror.service

Using upstart system

A good description how to configure an upstart script.
  1. Create starting service script: sudo nano /etc/init/zmmirror.conf
  2. Copy my upstart script from here (another good script example)
  3. Correct paths to node, zmmirror.js script, output log
  4. Save
  5. Check syntax  sudo init-checkconf /etc/init/zmmirror.conf
  6. Start service: sudo service zmmirror start
  7. Check log: cat ~/zmmirror.log
That's all. This script should be started each time on system boot.
Useful commands:
  • Start service: sudo service zmmirror start
  • Stop service: sudo service zmmirror stop 
  • Restart service: sudo service zmmirror restart

Deletion of old files 

For deletion old content from box.com I am also using node.js script. The script is located here.
Here is how to schedule this script running once a day:
  1. Edit cleanup script: sudo nano ~/zmwatcher/samples/zmmirror/cleanup.js
  2. Specify your actual path.
  3. Run cron: sudo crontab -e
  4. Add line (run cleanup every day at 5 am): 0 5 * * * nodejs /home/sergi/zmwatcher/samples/zmmirror/cleanup.js 
To run cleanup script manually:  sudo nodejs ~/zmwatcher/samples/zmmirror/cleanup.js

January 9, 2015

Зчитування даних за допомогою Arduino та Processing. Обробка їх у R

Сьогодні хочу зробити невеличкий огляд того, як можна використовувати Arduino та Processing для збирання статистичних даних, а після цього обробляти ці дані за допомогою R.
Для демонстрації збирання статистики я за допомогою ультразвукового датчика HC-SR04 фіксую, коли колеги проходят перед моїм робочим столом. Додаткову корисну інформацію про те, як схрестити Arduino, Processing та R я взяв звідси.

Arduino


Ось схема для Arduino Uno
image

Якщо хтось проходить перед столом спрацьовує спікер (і лампочка).

Скетч для Arduino знаходиться тут.

Тут необхідно врахувати кілька моментів

  1. Використовується бібліотека NewPing, її потрібно проінсталювати до вашого Arduino середовища і перезапустити IDE
  2. Щоб мінімізувати хибні спрацювання, я перевіряю наявність сигналу кілька разів поспіль. Див. функцію pingConfirms. Треба сказати, що надійність спрацювання ще далека від ідеалу: то сигнал спрацьовує по декілька разів за один прохід, то пропускає проходи. Проте для наших наочних цілей це не дуже суттєво
  3. Зверніть увагу на константу MAX_DISTANCE, вона задає максимальу відстань до якої датчик буде спрацьовувати.
  4. Найважливіший момент: дані до комп’ютера передаються через серійний порт. Щоб відрізнити дебажний вивід перед даними я вивожу "$data:", цей текст я сприймаю як маркер даних, які будуть додаватись до CSV файлу, тому якщо даних більше одного, можна їх розділяти комою
  5. В нашому випадку в якості даних передається відстань в сантиметрах, але рельно нас це значення не буде цікавити, ми будемо просто групуваи дані за кількістю

Processing


В цьому проекті Processing 2 я буду використовувати вийнятково для зчитування даних з серійного порта (USB) і дописування їх до CSV файлу. Ви можете також вискористовувати Processing для візуализації своїх даних, проте тут графики я малюватиму за допомогою R.
Середовище Processing дуже схоже на середовище Arduino, але мова Java-подібна. Універсальний скетч для зчитування данных з Arduino тут.
Спочатку вам потрібно запустити скетч, він виведе в консоль список всіх доступних серіальних портів, знайдіть порт, на якому працює Arduino, візьміть його порядковий номер (нумерація починається з нуля) і пропишіть його в константу mySerialPort, після цього скетч потрібно перезапустити і він почне збирати дані. Зверніть також увагу на шлях до файлу у скетчі, куди записуються дані

String filePath = sketchPath("../../data/data.csv");


Функція sketchPath створить шлях відносно папки в якій знаходиться скетч. Якщо файлу нема - він створиться, якщо вже є - до нього будуть додаватись рядки. Автоматично першим елементом в кожному рядку CSV файлу буде timestamp (кількість мілісекунд після 1970-01-01).

R


Для обробки даних і відображення графіків я використовую статистичний пакет R.
Після інсталяції R системм можна увійти в інтерактивний режим за допомогою однобуквенної команди R. (Щоб вийти з інтеактивного режиму введіть q().
Я написав невеличкий скрипт, який

  1. Зчитує дані з CSV файлу в пам’ять.
  2. Вирізає дані потрібного часового інтервалу: для цього підправте змінні startDate і endDate
  3. Підрховує число проходжень у кожнмоу з 10-хвилининх інтервалів. Можна інтервал зменити, він заданий у змінній period, це значення в секундах
  4. Малює стовпчиковий графік.

image
Для запуска всього цього зробіть таке:
  1. З консолі запустить команду R
  2. Задайте шлях до каталога, в якому знаходиться ваш data.csv файл:
    setwd("/home/solvek/projects/electronics/counter/data")
    

  3. Запустіть R скрипт:
    source("../plotchart.R")
    

    Тут шлях до скрипта вказаний відносно вищезаданого каталогоа даних

Святковий бонус


Можливо ви вже звернули увагу на те, що спікер видає сигнал з тональністю, котра залежить від відстані, на якій проходять повз датчик. Таким чином з Arduino можна зробити примітивний музичний інструмент:

Ось перероблений для цього скетч. Схемку змінювати не потрібно.

November 16, 2011

Coverflow

Here is theory how to implement coverflow scrolling


Given:

  1. S - height of container
  2. k - height of zone where badges are shown without folding (k < S)
  3. h - height of a badge (h < k)
  4. n - amount of badges
Problem:
Find top (y?) position of each t badge (t in [0..(n-1)]) if the list scrolled by q factor (q in [0;n*h-k] where 0 - means showing top badges without folding, n*h-k - means showing bottom badges without folding)

Solution:
We need an interpolator function f(x) which is
  1. Is defined in [0;1] and rising
  2. f(0) = 0
  3. f(1) = 1
This function defines how badges are folded
Good example of such function is f(x) = x*x

Calculation
v = n*h-k
z = t*h
p = q/v
alpha = (S-k)/(f(p)+f(1-p))

Then
1. y = alpha * f(z/v) if z < q
2.  y = z + alpha * f(p) - vp if z >= q and z <= q+k
3. y = S - alpha * f((n*h-z)/v) if z > q + k


 

May 27, 2011

Convert size for different densities of android screens



March 16, 2011

How to determine DPI of a screen by resolution in pixels and screen size

Given:
Screen resolution in pixels (w*h)

Screen size in inches (d - diagonal)

DPI = sqrt(w*w+h*h)/d



February 15, 2011

Converting attributes of a view in layout to attributes in styles

If you are developing for android and want quickly convert text like
     
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_gravity="center_horizontal"
          android:text="Congratulations!"
          android:textColor="@color/setup_tracking_title"
          android:textSize="32dip"
          android:textStyle="bold"
          android:layout_marginTop="40dip"
          android:shadowColor="#ffffffff"
          android:shadowDy="1"
          android:shadowDx="0"
          android:shadowRadius="1"/>
to style format
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_gravity">center_horizontal</item>
<item name="android:text">Congratulations!</item>
<item name="android:textColor">@color/setup_tracking_title</item>
<item name="android:textSize">32dip</item>
<item name="android:textStyle">bold</item>
<item name="android:layout_marginTop">40dip</item>
<item name="android:shadowColor">#ffffffff</item>
<item name="android:shadowDy">1</item>
<item name="android:shadowDx">0</item>
<item name="android:shadowRadius">1</item>
Use this  regular expression \s*([^=]+)="([^"]*)" for finding and this value for replacing <item name="\1">\2</item>

October 23, 2010

Скільки можна заробити на розробці для Андроїда

(Indie - так називають розробників-одинаків)
Історія про Едді Кіма, який купив книжку про розробку для Андроїдів і захотів попрограмувати задля задоволення. В результаті він заснував в Сан-Франциско компанію, його творіння приносить йому 13000$ щомісяця. Програма продається за 4 долари/штука. На розробку потрібно було 3 тижні. Його програма Car Locator, дозволяє власникам автомобілів віднаходити свої припарковані автомобілі.
Незалежний кодер Стів Деметер, стверджує, що заробив 250000$ за два місяці від своєї iPhone гри Trism. Етан Ніколас отримав прибуток 600 тис. дол. за місяць гарячих продажів від своєї гри iShoot.
У лютому 2010 року Google оголосив, що щодня продається 60000 андроїд телефонів.
Що ж дозволило Кіму добитись такого успіху з Car Locator?
  1. Він застосував "freemium" стратегію, тобто кожен користувач має змогу скористатись повноцінною версією програми, перш ніж купити її. Спочатку ціна було 2$, даючи йому порядку 80-100$ щодня.
  2. Потім його програма стала Featured в Marketplace, піднявши середньоденний дохід до 435$. Після цього він підняв ціну спочатку до 3$, а потім до 4$.
Темка в групі про андроїди: How much money do you make?

Ще стаття по темі: How much can you really make developing mobile apps?

December 10, 2009

Корисні речі при розробці для Android

Емулятор

Для взаємодії з емулятором на компі використовуєтья консольна програма adb, яка знаходиться у папці Tool пакету Android SDK. Цю програму потрібно запускати при працюючому емуляторі.

Як повернути екран емуля?

Цифрову клавіатуру в режим Off (натиснути Num Lock), тоді на цифровій клавіатурі натиснути 7.
Інші команди керування емулем клавою компа.

Як інсталяти і вилучати аплікухи на/з емуля?

Інсталяція
adb install twisdial.apk
Вилучення
adb shell rm data/app/com.solvek.twisdial.android.apk

Вивести в консоль лог емулятора

adb logcat

October 23, 2008

Use proxy settings from "Set up my proxy server" on Windows Mobile (C#)

The following code allows to retrieve xml with proxy details.

XmlDocument arg = new XmlDocument();
arg.LoadXml("<wap-provisioningdoc><characteristic-query type="\"CM_ProxyEntries\"/"></characteristic-query><wap-provisioningdoc><characteristic-query type="\"></characteristic-query>");
XmlDocument prox = ConfigurationManager.ProcessConfiguration(arg,
true);


Unfortunately if your proxy requires username and password this approach will return only username.

September 26, 2008

How to retreive current date and time in Pocket Scheme

Unfortunalelly I could not find proper procedure for getting current date and time. But it is possible to use WinApi functions. In our case we will import GetLocalTime funtion from Kernel32.dll.
This funcion requires a pointer to structure SYSTEMTIME:
void WINAPI GetLocalTime(
__out LPSYSTEMTIME lpSystemTime
);
And after calling this function this structure will be filled with data:

typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME,
*PSYSTEMTIME;
Here is Pocket Scheme code that imports function GetLocalTime and usage.

(require "w32.dll")

(define *kdll*
(cond-expand
(windows-nt "kernel32.dll")
(windows-ce "coredll.dll")))

(define GetLocalTime
(w32:foreign-procedure *kdll* "GetLocalTime" '(w32api void lpvoid)))

; outputs current year
(let ((rgw (make-raw-vector 8 'u16)))
(begin
(GetLocalTime rgw)
(display (raw-vector-ref rgw 0)) ; outputs current year
)
)

June 8, 2008

Development Profile for Firefox

Sometimes you may need special Firefox profile for development purposes if you for example are debugging your extension.
In this case you may want to have simultaneously opened two instances of firefox: one with your bookmarks and all staffs and another, light but with dev extensions and any other features, it is possible.
1. Create new profile "Dev" by command
"C:\Program Files\Mozilla Firefox\firefox.exe" --profilemanager
2. Create shortcut for your profile
"C:\Program Files\Mozilla Firefox\firefox.exe" -P "Dev" -no-remote
3. Install some useful extensions:
3.1. Restart Firefox
3.2. Firebug
4. Setup your development environment for this profile

April 1, 2008

Дряпанка - мова програмування для найменших

Дряпанка - це нова мова програмування з якою легко створювати власні інтерактивні історії, мультфільми, ігри та музику, а також відкривати свої творіння іншим у інтернеті.

Стаття у Вікіпедії



Нещодавно у Масачусетському Технологічному Інституті розробили мову програмування для навчання програмуванню найменших - Scratch (Дряпанка).
У веселій формі діти можуть створювати справжні програми, конструюючи їх з візуальних блоків. Програма має дружній для дітей інтерфейс. Створені програмки можна публікувати на сервері, тоді будь хто зможе запускати їх просто у браузері.

Цього літа розробники обіцяють випустити версію 1.3, у якій буде підтримка Юнікоду і українського інтерфейсу. Зараз ми активно працюємо над українською локалізацією, у якій може взяти участь кожен бажаючий, переклад робиться через веб-інтерфейс, кожен може пропонувати свої варіанти перекладу.
Бажаючим я можу надіслати альфа версію продукту, де є підтримка юнікоду і де можна протестувати переклад.

P.S. Дряпанка викликала інтерес навіть у моєї 5-річної доні :)

На додачу: російськомовний блоґ присвячений Дряпанці.

February 4, 2008

Find all values with specified Guid in whole database

The following script looks through all tables and all columns (of Uniqueidentifier type) and outputs how many records with specified ID

DECLARE @ID UNIQUEIDENTIFIER
SELECT @ID='20b1d494-1e03-49af-918d-09a54cd6f792' -- Specify ID here


IF object_id('TempDB..#tables') IS NOT NULL DROP TABLE #tables
CREATE TABLE #tables
(
[Id] INT NOT NULL PRIMARY KEY,
[Name] SYSNAME NOT NULL
)
INSERT #tables
(
[Id],
[Name]
)
SELECT
[Id],
[Name]
FROM sysobjects
WHERE xtype = 'U'

IF object_id('TempDB..#columns') IS NOT NULL DROP TABLE #columns
CREATE TABLE #columns
(
[TableId] INT NOT NULL,
[Name] SYSNAME NOT NULL,
[Count] INT NULL
)

INSERT #columns
(
[TableId],
[Name]
)
SELECT
SC.[Id],
SC.[Name]
FROM
#tables T
JOIN
SYSCOLUMNS SC ON T.id = SC.id
WHERE sc.xtype = 36

DELETE #tables WHERE [Id] NOT IN (SELECT TableID FROM #Columns)

DECLARE @tableId INT, @nameColumn SYSNAME, @cmd VARCHAR(4000)
WHILE(EXISTS(SELECT * FROM #columns WHERE [Count] IS NULL))
BEGIN

SELECT TOP 1 @cmd = 'UPDATE R SET [Count] = (SELECT COUNT(*) FROM ['+T.[Name]+'] WHERE ['+C.[Name]+'] ='''+CONVERT(VARCHAR(36), @ID)+''') FROM #columns R WHERE R.[TableId] = '+CONVERT(VARCHAR(10),T.[Id])+' AND R.[Name] = '''+C.[Name]+''''
FROM
#tables T
JOIN
#columns C ON T.[Id] = C.TableId
WHERE
C.[Count] IS NULL

--PRINT @cmd

EXEC(@cmd)
END

SELECT
T.[Name] AS 'Table Name',
C.[Name] AS 'Column Name',
C.[Count] AS 'Records'
FROM
#tables T
JOIN
#columns C ON T.[Id] = C.TableId
WHERE
C.[Count] > 0

August 6, 2007

Ґаджет для відправки СМС з інтернету

Вступ


Чи доводилось вам відправляти СМСки своїм друзям та близьким з інтернету? Якщо ви проводите значну частину свого часу за комп'ютером, то я впевнений що так. В такому разі ґаджет connect.co.ua саме для вас, всі українські оператори у компактному ґаджеті, та ще й ваші контакти зберігатимуться.
Я вже зустрічав у блоґах невеличкі огляди свого ґаджету для відправки СМС, на цей раз представляю вашій увазі власний розгорнутий огляд ґаджету connect.co.ua. Спробую поділитись інформацією, у чому я бачу особливість цього ґаджету.
Перш за все ґаджет призначений для швидкої і безкоштовної відправки СМС на всі мобільні оператори України. Користуватись ґаджетом можуть усі, у кого є браузер, ніякого особливого програманого забезпечення не потрібно, і ваші контакти будуть доступні вам будь-де, де є доступ до інтернету.
Інтерфейс ґаджету побудований за принципом "закладок", з метою компактного розміщення. Є такі закладки: "Головна", "Опції", "Довідка", "Контакти".

Форма відправки повідомлень


Закладка "Головна" містить поля для відправки СМС, причому значення поля "підпис" запам'ятовується. Також, коли ви відправите повідомлення на якийсь номер, автоматично запам'ятається номер телефону в адресній книзі. Щоб ще менше витрачати часу на відправку повідомлення, можна скористатись гарячою клавішою Ctrl-Enter для відсилання.

Опції


На закладці "Опції" можна вибрати різні шлюзи, через які надсилатиметься повідомлення. Саме надсилання робиться через пост у веб форму у новому вікні. Залежно від вибраного шлюза пост робиться на різні сайти.

Оскільки можливість налаштування шлюза не зовсім зрозуміла користувачам, опишу це детальніше, хоча інформація корисна тільки для тих, у кого повідолмення не доходять, в протилежному випадку подальший опис закладки "Опції" можна пропустити.
Наприклад, шлюз "За замовчуванням" відправляє повідомлення через сайти операторів, у цьому випадку потрібно буде ввести код захисту від спамерів, як на сайтах операторів, у повідомлення також оператори вставляють свою рекламу, зате доставка повідомлень надійніша, ніж через e-mail шлюзи, крім того, повідомлення доставляються на телефони Kyivstar та Djuice, навіть якщо абонент не активізував послугу отримання повідомлень через email шлюзи. Щоб нормально відображався код захисту від спамерів, користувачам Internet Explorer потрібно дозволити кукі для деяких сайтів.
Цікавий шлюз sms.gt.com.ua - працює доволі надійно з усіма операторами, ніякої реклами не вставляється... Щоправда є одне обмеження - на один номер з однієї IP адреси можна відправляти лише одне повідомлення на день.
Усі інші шлюзи працюють за принципом email шлюзів, тому, користуючись ними і відправляючи повідомлення на Kyivstar чи DJuice, потрібно точно знати, чи активізував ваш одержувач таку можливість.

Підтримка користувачів

Закладка "Довідка" містить посилання на сайт підтримки ґаджету, на якому можна знайти рішення найтиповіших проблем, з якими стикаються користувачі, чи поставити запитання мені.

Телефонна книга


Автоматичне запам'ятовування номерів телефонів - одна із найцікавіших можливостей ґаджету, щоб відіслати повідомлення на номер, збережений у контактах, достатньо перейти у вкладку "Контакти", клікнути мишкою на потрібному контакті і його номер і код оператора автоматично виберуться на головній вкладці, причому для кожного контакту запам'ятовується шлюз, з якого останній раз цьому контакту надсилалось повідомлення. Для зручності кожному контакту можна присвоїти ім'я. Для сортування контактів використовується спеціальний алгоритм, який дає змогу найчастіше використовувані чи останньо-використані контакти розміщати на початку списку. Алгоритм працює за "принципом забування", як людський мозок :).

Для розробників


При розробці ґаджету я не пошкодував часу на те, щоб ґаджет був якомога легший (в плані швидкодії і розміру файлів), сумісний з усіма найпопулярнішими браузерами, а також достатньо універсальний (може працювати не лише у Live.com, але й, наприклад, його можна вставити у будь-яку сторінку - є HTML код). Існує також API, яке дає змогу інтегрувати ґаджет у будь який сайт так, щоб зареєстровані користувачі сайту могли зберігати контакти на сервері цього сайту, як я зробив для php-рушія Joomla. Ґаджет з відкритим кодом, вихідні коди можна подивитись у репозиторії SVN.

July 17, 2007

Отчет: Конкурс гаджетов в Украине от Майкрософта, опыт разработчика

Этим летом представительство компании Майкрософт в Украине проводит конкурс среди разработчиков гаджетов для сайта Live.com и Vista Sidebar. О начале разработки было объявлено 16 июня, гаджеты принимались до 16 июля, после чего началось голосование самих пользователей на сайте GadgetCompetition.com.ua. Само голосование будет продолжаться до 6 августа, после чего объявлят победителей. Главный приз конкурса - оплаченное участие в конференции для разработчиков TechEd 2007 в Барселоне. Среди участников голосования также разыгрывают призы.
Подобный конкурс Майкрософт планирует провести в 15 странах. Кроме Украины летом конкурс проводится в Швейцарии, Австрии и Норвегии, во всех остальных странах, в том числе в России конкурс будет осенью этого года (кроме России, участвуют Бельгия, Хорватия, Египет, Греция, Венгрия, Польша, Португалия, Румыния, Нидерланды, Великобритания). В конкурсе могут принять участие также и гаджеты, разработанные до объявления конкурса.
На украинский конкурс было представлено 67 гаджетов, большинство среди которых для Vista Saidebar.
Если сравнивать гаджеты для Висты с веб гаджетами, то количество закачек первых было значительно выше, думаю, это потому, что Виста гаджетами больше интересуются западные пользователи, поэтому такая разница скорее всего мало повлияет на результаты голосования. Согласно данным представительства Microsoft будут браться ко вниманию только голоса пользователей, в аккаунтах Live ID которых указана страна Украина. Что касается функционала голосования, то мне приходилось слышать много нареканий, что он очень не понятен и не удобен, это целая головоломка :)
Лично я представил на конкурс пару веб гаджетов (для Live.com). Поскольку до этого имел опыт разработки гаджетов для IGoogle и Netvibes, то скажу, что API от Microsoft выглядит как то менее удобным для разработчика, хотя разработка в среде Visual Studio .Net 2005, лично для меня, более привычная. Свой гаджет старался разрабатывать так, чтобы он работал не только в Live.com, но и в IGoogle и Netvibes, его даже можна встроить в любую HTML страницу.
Были также некоторые проблемы работы гаджета в браузерах отличных от Interent Explorer, в частности плохо работает ресайзинг высоты гаджета (а точнее он полностью отсутствует в Firefox и Opera), встречал на форумах сентенцию разработчиков от Майкрософт, что лучше уж так, чем вообще не поддерживать Firefox... Както странно звучит, ведь в IGoogle и Netvibes подобных проблем не наблюдалось.

June 12, 2007

Поточний стейтмент для заданого SPID (MS SQL Server)

1. Команда sp_who2 - відображає процеси, перша колонка - ідентифікатор процесу
2. Вибрати інформацію для процесу з системної таблиці: select * from sys.sysprocesses where spid=128
(З нього скопіювати значення поля sql_handle, воно буде потрібе для кроку 3)
3. Інформація про SQL стейтмент SELECT * FROM ::fn_get_sql(0x0100C0011739970F08C388120000000000000000)

May 10, 2007

Аналіз сервісу BountySource

BountySource - сервіс для хостингу опенсорсових проектів. Для власників проектів предоставляються SVN, хостинг файлів, трекінгова система, CMS. Принциповою відмінністю цього сервісу від інших сервісів є те, що для задач проектів у трекінговій системі користувачі мають змогу пропонувати грошову винагороду розробникаи за реалізацію задач, при чому за ту саму задачу винагороду можуть пропонувати багато користувачів.
Сервіс було засновано у 2004 році. Домен було зареєстровано ще у 2003 році. BountySource спочатку розроблялась на PHP, а з 18 березня 2006 року розробники перейшли на Ruby on Rails!
З кожним bug report чи feature request може бути асоційована певна грошова винагорода від довільного числа користувачів. Гроші відіграють роль стимулу для розробників, а також допомагають розробникам визначити пріоритети задач відповідно до реальних потреб користувачів. BountySource в даний момент інтегрована з PayPal.
Під Bounty в OpenSource розуміється грошова винагарода за реалізацію необхідної функції у OpenSource програмі.
В дечому аналогічний проект до BountySource - Fundable, який необмежується лише FOSS, але дозволяє організовувати групу, для реалізації будь-якої задачі. При створенні задачі, задається сума, яку потрібно зібрати групі, і кожен може внести свій внесок у групу.

December 21, 2006

Что должен знать правильный .NET-разработчик

Каждый кто пишет код

* Объясните разницу между нитью (Thread) и процессом (Process)
* Что такое сервис (Windows Service) и как его жизненный цикл отличается от «стандартного» EXE?
* Какой максимальный объем памяти может адресовать один процесс? Отличается ли он от максимального объема виртуальной памяти, доступной системе? Как это влияет на структуру системы?
* В чем различие между EXE и DLL?
* Что такое строгая типизация (strong-typing) в сравнении со слабой типизацией (weak-typing)? Какая предпочтительнее? Почему?
* Некий продукт называют «контейнером компонентов» ("Component Container"). Назовите по крайней мере 3 контейнера компонентов, поставляемых с семейством продуктов Windows Server Family.
* Что такое PID? Чем он полезен при выявлении неисправностей системы?
* Сколько процессов могут слушать один и тот же порт TCP/IP?
* Что такое GAC? Какую проблему он разрешает?

.NET-разработчик среднего уровня

* Объясните разницу между интерфейсно ориентированным (Interface-oriented), объектно ориентированным и аспектно ориентированным (Aspect-oriented) программированием
* Объясните что такое «интерфейс» и чем он отличается от класса
* Что такое Reflection?
* В чем различие между XML Web Services с использованием ASMX и .NET Remoting с использованием SOAP?
* Являются ли системы типов, представленные в XmlSchema и в CLS — изоморфными?
* Концептуально, в чем различие между ранним и поздним связыванием (early-binding и late-binding)?
* Использование Assembly.Load — это статическая или динамическая ссылка?
* Когда уместно использование Assembly.LoadFrom, а когда Assembly.LoadFile?
* Что такое «Asssembly Qualified Name»? Это имя файла? В чем различие между ними?
* Правильно ли так писать?
Assembly.Load("foo.dll");
* Чем отличается «strongly-named» сборка от «НЕ strongly-named» сборки?
* Может ли DateTime равняться null?
* Что такое JIT? Что такое NGEN? Каковы преимущества и ограничения каждого из них?
* Как основанный на поколениях сборщик мусора в .NET CLR управляет жизненным циклом объекта? Что такое «non-deterministic finalization»?
* В чем различие между Finalize() и Dispose()?
* Чем полезен using()? Что такое IDisposable? Как он поддерживает deterministic finalization?
* Что делает эта полезная команда? tasklist /m "mscor*"
* В чем разница между «in-proc» и «out-of-proc»?
* Какая технология позволяет выполнять out-of-proc взаимодействие в .NET?
* Когда вы запускаете компонент из под ASP.NET, в каком процессе он работает под Windows XP? Windows 2000? Windows 2003?

Ведущий разработчик

* Что не так вот в следующей строке?
DateTime.Parse(myString);
* Что такое PDB? Где они должны находится, чтобы можно было выполнять отладку?
* Что такое «цикломатическая сложность» (cyclomatic complexity) и почему она важна?
* Напишите стандартный lock() плюс «двойную проверку» для создания критической секции вокруг доступа к переменной.
* Что такое «FullTrust»? Имеют ли FullTrust сборки, помещенные в GAC?
* Какие преимущества получает ваш код, если вы декорируете его атрибутами, относящимися к особым Security permissions?
* Что делает эта команда?
gacutil /l | find /i "Corillian"
* Что делает эта команда?
sn -t foo.dll
* Какие порты брандмауэра должны быть открыты для DCOM? Каково назначение порта 135?
* Сопоставьте OOP и SOA. Каковы принципы каждого из них?
* Как работает XmlSerializer? Каких ACL permissions требует использующий его процесс?
* Почему catch(Exception) почти всегда — плохая мысль?
* В чем разница между Debug.Write и Trace.Write? Когда должен быть использован каждый из них?
* В чем различие между компиляцией в Debug и в Release? Есть ли значительная разница в скорости? Почему или почему нет?
* Как работает JIT — по сборке целиком или по методу? Как это влияет на working set?
* Сравните использование абстрактного базового класса и использование интерфейса?
* В чем различие между a.Equals(b) и a == b?
* В контексте сравнения, что такое идентичность объектов по сравнению с эквивалентностью объектов?
* Как можно выполнить глубокое копирование (deep copy) в .NET?
* Изложите ваше понимание IClonable.
* Что такое «упаковка» (boxing)?
* string — это тип значений (value type) или ссылочный тип?
* В чем значимость паттерна "PropertySpecified", используемого в XmlSerializer? Какую проблему он пытается разрешить?
* Почему в .NET выходные параметры (out parameters) не стоит применять? Действительно ли это так?
* Может ли атрибут быть установлен на один из параметров метода? Чем это полезно?

Разработчик компонентов на C#

* Сопоставьте использование override и new. Что такое «shadowing»?
* Объясните использование virtual, sealed, override и abstract.
* Объясните использование и значение каждого компонента строки:
Foo.Bar, Version=2.0.205.0, Culture=neutral, PublicKeyToken=593777ae2d274679d
* Объясните различия между public, protected, private и internal.
* Какое преимущество вы получаете от использования первичной сборки взаимодействия (Primary Interop Assembly, PIA)?
* Благодаря какому механизму NUnit узнает, какой метод протестировать?
* В чем различие между:
catch(Exception e){throw e;} и
catch(Exception e){throw;}
* В чем разница между typeof(foo) и myFoo.GetType()?
* Объясните что происходит в первом конструкторе:
public class c{ public c(string a) : this() {;}; public c() {;} }
Чем полезна такая конструкция?
* Что такое «this»? Может ли this использоваться в статическом методе?

Разработчик на ASP.NET (UI)

* Объясните, как POST-запрос формы из браузера становится на серверной стороне событием — таким как Button1_OnClick.
* Что такое «PostBack»?
* Что такое «ViewState»? Как он кодируется? Является ли он шифрованным? Кто использует ViewState?
* Что такое element и для чего используются эти две технологии ASP.NET? (В оригинале: What is the element and what two ASP.NET technologies is it used for?)
* Какие три Session State providers доступны в ASP.NET 1.1? Какие преимущества и недостатки у каждого из них?
* Что такое «Web Gardening»? Как его использование влияет на проект?
* В заданном ASP.NET-приложении, сколько объектов-приложений имеется, если это одно-процессорная машина? двухпроцессорная? двухпроцессорная с включенным Web Gardening? Как это отражается на проекте?
* Используются ли нити (threads) ASP.NET приложения повторно для различных запросов (requests)? Получает ли каждый HttpRequest свою собственную нить? Должны ли вы в ASP.NET использовать Thread Local storage?
* Полезен ли атрибут [ThreadStatic] в ASP.NET? Есть ли побочный эффект? Это хорошо или плохо?
* Дайте пример того, как использование HttpHandler может упростить существующий проект, который обслуживает Check Images на .aspx-странице.
* На события какого вида может подписываться HttpModule? Какое влияние они могут оказать на реализацию? Что может быть сделано без перекомпиляции ASP.NET-приложения?
* Опишите способы представления «arbitrary endpoint (URL)» и направьте запросы к этой endpoint в ASP.NET.
* Объясните как работают cookies. Дайте пример злоупотребления Cookie.
* Объясните важность HttpRequest.ValidateInput()?
* Какого рода данные передаются в заголовках HTTP (HTTP Headers)?
* Сравните HTTP-запросы вида GET и POST. Что такое «HEAD»?
* Назовите и опишите по крайней мере 6 статус-кодов HTTP (HTTP Status Codes) и объясните о чем они говорят клиенту, давшему запрос.
* Как работает «if-not-modified-since»? Как это может быть программно реализовано на ASP.NET?
* Объясните <@OutputCache%> и использование «VaryByParam», «VaryByHeader».
* Как работает «VaryByCustom»?
* Как можно реализовать кэширование готового HTML в ASP.NET, кэшируя отправляемые версии страниц, полученные по всем значениям q= кроме q=5 (например, http://localhost/page.aspx?q=5)?

Разработчик, использующий XML

* В чем назначение XML Namespaces?
* Когда уместно использование DOM? Когда неуместно? Есть ли ограничения по размеру?
* Что такое «WS-I Basic Profile» и почему он важен?
* Напишите простой XML-документ, использующий пространство имен (namespace) по умолчанию, а также qualified (prefixed) namespace. Добавьте элементы из обоих пространств имен.
* В чем основное фундаментальное различие между элементами (Elements) и атрибутами (Attributes)?
* В чем различие между «Well-Formed XML» и «Valid XML»?
* Как бы вы валидировали XML используя .NET?
* Почему такое использование — почти всегда неудачно. В каких случаях такое уместно?
myXmlDocument.SelectNodes("//mynode");
* Объясните различие между «pull-style parsers» (XmlReader) и «eventing-readers» (Sax)
* В чем различие между XPathDocument и XmlDocument? Опишите ситуацию когда один из них может быть использован над другим.
* В чем различие между XML "Fragment" и XML "Document"
* Что означает — «каноническая» форма XML?
* Почему спецификация XML InfoSet отличается от Xml DOM? Что пытается решить InfoSet?
* Сравните DTD и XSD. В чем они схожи, в чем различны? Что предпочтительнее и почему?
* Поддерживаются ли DTD в System.Xml? Как именно?
* Всякая ли XML Schema может быть представлена в виде графа объектов? А наоборот?

Оригинал перевода:

http://www.c-gator.ru/articles/what-great-dot-net-developers-ought-to-know-interview-questions/

Оригинал поста на английском:

http://www.hanselman.com/blog/WhatGreatNETDevelopersOughtToKnowMoreNETInterviewQuestions.aspx

October 31, 2006

Кодировки символов и как с ними бороться в PHP и JavaScript.

Кодировки символов и как с ними бороться в PHP и JavaScript.
Поговорим о кодировках символов, используемых в браузерах, и работе с ними в серверных и клиентских скриптах.
Для начала - небольшой обзор кодировок, немного теории, позже перейдем к проблемам и их решению.

October 10, 2006

SharpForge - Open source C# SourceForge implementation

SharpForge supports collaborative development and management of multiple software projects. Similar to SourceForge or CodePlex but for your own team or organisation. The software is written in C# for .NET 2.0 is integrates with Subversion for source control and is released under the New BSD License.