scripts

среда, 31 июля 2013 г.

Работа со сканером и отправка электронной почты из C#.

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


1.Порядок работы


1.1 Информация о клиенте


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

1.2 Сканирование


Нажатие на кнопку "Сканировать" запускает процесс сканирования. В фоновом режиме создается папка для данного клиента, куда будут сохраняться отсканированные документы. Название папки уникально и имеет следующий вид ГП26_Иванов_И_И_2013_07_26. Таким образом, если Иванов И.И. придет в другой день, то для него будет создана другая папка.
Далее фоново в этой папке создается текстовый файл с данными о клиенте (Иванов_info.txt). 
В процессе сканирования создаются сканы документов, причем, чтобы обеспечить их уникальность в названии скана присутствует порядковый номер (Иванов_И_И_1.jpeg, Иванов_И_И_2.jpeg).

1.3 Отправка почты


По нажатию на кнопку "Отослать" вначале в фоновом режиме создается архив папки клиента созданной в процессе сканирования (ГП26_Иванов_И_И_2013-07-26.7z) , после успешного создания архива происходит отправка электронного сообщения с прикрепленным архивом на заданный email.

2.Особенности реализации


Работать со сканером решил через wia (Windows Image Acquisition).
Нашел обзор сканирования без использования диалогового окна (без диалогового окна быстрее и проще работать) и вынес логику работы со сканером в отдельный класс WIAScanner

Перед отправкой отсканированных изображении на электронный почтовый адрес (класс Email) происходит архивация папки бесплатным архиватором 7-Zip (класс SevenZip).
Сообщение отправляется синхронно, по завершению отправки пользователю выдается соответствующее сообщение.
Некоторые данные (куда отправлять почту) решил хранить во внешнем конфигурационном файле scancenter.config

вторник, 30 июля 2013 г.

Немного о JavaScript. Объекты.

1.2 Объекты.

Объект - это неупорядоченное множество пар ключ-значение.
Часто про объект говорят, что он содержит набор свойств, а если свойство содержит функцию, то его называют методом. Надо понимать, что это просто терминология и по сути это все данные.
Теперь можно сказать, что все в JavaScript является объектами кроме значений "примитивных" типов и это так.
В своей практике я всегда создаю объект с помощью литерала объекта. Это красиво и легко запоминается.
var myObj = {};
Так просто.
Классов в JavaScript нет, но при этом есть механизм прототипов, который позволяет реализовать наследование. Про наследование разговор еще будет впереди.

Для обхода свойств объекта правильно применять цикл for-in ( для массивов лучше for ) .Сразу хочу обратить внимание на одну особенность. Допустим мы расширили прототип Object, от которого наследуют свойства все объекты, а потом создали свой объект pupkin. Теперь мы хотим обойти в цикле свойства созданного нами объекта.
Object.prototype.whoami = "I am Object";

var pupkin = {
    age: 22,
    title: "kursant",
    kurs: 1
};
for (var k in pupkin) {
    console.log( k );   
}
Результат будет
  • "age"
  • "title"
  • "kurs"
  • "whoami"
Это не совсем то, что мы ожидали, но тут ошибок нет. Наш объект унаследовал свойство whoami от своего прототипа. Так что, если необходимо работать со свойствами только одного объекта без учета унаследованных, то необходимо использовать метод hasOwnProperty().
Добавим в цикл условие проверки принадлежности свойства данному объекту и немного модифицируем вывод:
for (var k in pupkin) {
  if (pupkin.hasOwnProperty(k)) {
    console.log( k + ":" + pupkin[k] ); 
  }     
}
Результат:
    • "age:22"
    • "title:kursant"
    • "kurs:1"
Вот, теперь другое дело )
Следующий разговор будет о функциях. Удачи.

воскресенье, 28 июля 2013 г.

Кубанский казачий хор. Песни.

Матушка Добрынюшке наказывала



Матушка Добрынюшке наказывала,
Государыня Добрынюшке наговаривала:
- Ой ты сын мой любезный, свет Деменьтьевич,
Что повесил, кручинясь, буйну голову ?
Ты бы взял в свои ручки белые
Гусли звонкие, сладкогласные.
Стал бы петь да потряхивать кудрями,
Да меня потешать, матерь старую.

- Ты прости, государыня-матушка.
Не поется мне, не играется.
Я вчера скакал по Святой Руси,
Я стрелой летел ниже облака,
Видел я на Руси оскудение,
Видел мерзость кругом запустения,
Церкви белые оскверненные;
Басурманами разоренные.
Басурмане те не из тартара,
А своих кровей, лыком шитые.
Поклоняются люди идолам,
Отреклись от Бога, безумные,
Православную веру забросили,
Обучают детей жить без Господа.
Скоморохам житье - лучше некуда,
Приосанилось племя вертлявое,
Позабыли напевы родимые.
И гудят гудцы непотребное.
Сатана восстал на Святую Русь,
Понаставил бесовские капища,
Из заморских стран едут нехристи
И с собой везут нравы срамные,
Всем заморским Русь заполонили,
Так что духу нет православного.
А князья одну думку думают,
Как без Бога им миром правити.

Матушка Добрынюшке наказывала,
Государыня Добрынюшке наговаривала:
- Ох и глупый ты сын, свет Деменьтьевич,
Не набрался поди уму-разуму.
Не пришла еще ночка темная,
Ночка темная, тьма кромешная.
Есть еще на земле сыны русские,
Православную веру хранящие.
Сколько мучеников, исповедников
Пред Престолом стоят Вседержителя,
День и ночь умоляют с Пречистою
О родной стороне, об Отечестве.
И пока в Церквах Божиих молятся,
Панихиду не правь по Святой Руси.
Матушка Добрынюшке наказывала,
Государыня Добрынюшке наговаривала.

Не для меня



Не для меня придёт весна,
Не для меня Дон разольётся,
И сердце девичье забьётся
С восторгом чувств – не для меня.

Не для меня сады цветут,
В долине роща расцветает,
Там соловей весну встречает,
Он будет петь не для меня.

Не для меня придёт Пасха,
За стол родня вся соберётся,
"Христос воскрес" из уст польётся,
Пасхальный день не для меня.

А для меня кусок свинца,
Он в тело белое вопьётся,
И слезы горькие прольются.
Такая жизнь, брат, ждёт меня.

Немного о javasript. Введение. Типы примитивных значений.

Предисловие.
Не так давно мне посчастливилось пообщаться с хорошими ребятами, которые очень хорошо знают JavaScript. В процессе беседы я понял, что некоторые моменты не очень хорошо понимаю. Цель этой статьи - разобрать некоторые основные моменты в JavaScript ( в первую очередь самому ).

Введение.
Давным-давно (хотя не так уж и давно) в 2008 году, решив стать программистом, я подошел к этому серьезно и решил получить системные знания. Для этого получил высшее образование в области разработки ПО (вечерняя форма), а параллельно с учебой работал программистом. Так вот, диплом я писал на C# и был в легком восторге от платформы .net и конечно в мыслях представлял себя программистом под эту платформу.
Но жизнь вносит свои коррективы, первая моя работа после учебы и переезда в другой город была связана с клиентской разработкой на JavaScript. Признаюсь, что когда я только начал с ним работать, я думал, что это не серьезный язык программирования (до этого я работал с Delphi, PHP, 1С, C#) и поэтому особо не думал о его изучении.
Язык программирования JavaScript на мой взгляд очень дружелюбный, он позволил мне делать довольно серьезные вещи очень поверхностно понимая сам язык. И вот проработав с JavaScript 1 год - плотно и 1 год периодически, я решил навести порядок у себя в голове, восполнить и упорядочить свои знания.
Я благодарен JavaScript за его дружелюбие и глубину, и рад, что он набирает популярность. Конечно, когда планируешь быть программистом на C# - думаешь, блин, это же серьезный язык, его спроектировали серьезные ребята, они изучили кучу языков, выбрали из них лучшее, чтобы этот язык получился самый лучший. Сразу берешь книгу, начинаешь разбираться, писать маленькие программульки, настраиваешься на серьезную работу. А что JavaScript? Да его какой-то гик за 10 дней и ночей написал, вообще странно, что этот язык еще жив и вытеснил из браузеров такого гиганта как Java. Хотя самое первое удивление такое, а что JavaScript - это не Java =-O ?
Тут тебе предлагают разрабатывать на JavaScript. Ну а почему бы и нет? Язык не сложный. Переменные, функции, массивы, объекты, условные операторы, циклы - этого достаточно. Быстренько прочитать обзорную статью, о я понял нужен файл с раcширением js, в него пишешь код и прописываешь путь к этому файлу в html. Хорошо, я согласен. Начинаем работать.
И такое поверхностное отношение к JavaScript очень не справедливо!
Конечно, сейчас он на коне и думаю теперь большинство более основательно подходит к изучению этого языка, но до сих пор попадаются довольно серьезные проекты, в которых код структурирован таким образом:
var ...
var ...
function ...
function ...
function ...
Конечно это все работает, но только понимание сильных сторон языка, знание паттернов и принципов грамотной организации кода могут принести радость от работы на этом языке.
Особенно меня огорчает, когда люди даже и не стремятся разобраться и понять глубже JavaScript (это наверное касается и других вещей).
JavaScript дает мне радость от работы с ним и я хочу вернуть должок и разобрать моменты, которые когда то поверхностно прочитал или не прочитал вовсе. Вперед.

1. Типы дынных.
1.1 Типы примитивных значений.
Когда-то я прочитал такое высказывание, что всё в javascipt является объектами и так мне эта мысль глубоко засела в голову, что потребовалось внимательное разбирательство, чтобы это исправить. Ведь на самом деле в javascript типы делятся на primitive data types (типы примитивных значений) и object.
Итак типы примитивных значений:
  • string;
  • number;
  • boolean (tru, false);
  • undefind;
  • null;
Здесь у меня появился резонный вопрос, а какова их суть? В книжках обычно не разжевывается, что собой представляют primitive data types. Но не надо забывать, что есть спецификация ECMA-262 и там сказано, что значения этих типов в реализации представляются напрямую на низком уровне (дальше я копать не стал). Они не являются объектами, у них нет прототипов и конструкторов (а вот это уже ближе к практическому использованию). Здесь особое внимание стоит уделить типу null из-за особенности работы оператора typeof по отношению к этому типу. А именно, typeof null выдает результат "object" и это сбивает столку, если не знать, что typeof обращается к внутренней таблице, где почему то для null прописано возвращать "object". Хотя на самом деле надо бы возвращать null, так как это и есть правда.
Хотелось бы прояснить еще один момент относительно "примитивных" типов. Значения этих типов не имеют свойств и методов, но как же тогда объяснить такое поведение строкового литерала.
  • "Pupkin".length
  • 6
Дело тут в том, что в JavaScript для чисел, строк и логических значений существуют объекты-обертки. Объекты-обертки обладают рядом разнообразных свойств и методов, которые делают работу с "примитивными" типами более удобной. На самом деле этот не идет вразрез с определением "примитивных" типов. Просто интерпретатор при передаче ему выражения
  • "Pupkin".length
 за кулисами временно создает объект из строки (new String("Pupkin")) вызывает метод length у этого объекта, а результат возвращается в виде строки. Конечно с точки зрения человека, создается ложное ощущение, что примитив строки имеет метод lenght.
Удачи!

понедельник, 22 июля 2013 г.

Скрипт выбора провайдера на powershell

Итак, появилась необходимость быстро менять настройки сети. Решил создать скрипт на powershell, который позволил бы быстро менять сетевые настройки. Скрипт выставляет сетевые настройки в зависимости от указанного в параметрах провайдера при запуске. Вот исходник set_provider.ps1.
$provider = $args[0]
#вывод справочной информации
function printHelp {
    "ИМЯ"
    "`tset_provider"
    "ОПИСАНИЕ"
    "`tЗадает сетевые настройки для указанного провайдера"
    "`n"
    "-------------------------- Пример 1 --------------------------"
    ""
    ".\set_provider.ps1 meriya"
    "`n"
    "Описание"
    "-----------"
    "Эта команда переключает сетевые настроки на сеть мэрии"
    "`n"
    "-------------------------- Пример 2 --------------------------"
    ""
    ".\set_provider.ps1 sibsety"
    "`n"
    "Описание"
    "-----------"
    "Эта команда переключает сетевые настроки на сеть сибирских сетей"
    "`n"
    "-------------------------- Пример 3 --------------------------"
    ""
    ".\set_provider.ps1 enforta"
    "`n"
    "Описание"
    "-----------"
    "Эта команда переключает сетевые настроки на сеть энфорты"
}
$wmi = Get-WmiObject win32_networkadapterconfiguration -filter "ipenabled = 'true'"
#задать настройки сети для выбранного провайдера
switch ($provider) {
    "meriya" {
        $wmi.EnableStatic("10.190.130.244","255.255.255.0")
        $wmi.SetGateways("10.190.130.1",1)
        $wmi.SetDNSServerSearchOrder("10.195.9.71")
        "Заданы сетевые настройки сети мэрии."
    }
    "sibsety" {
        $wmi.EnableStatic("192.168.1.244","255.255.255.0")
        $wmi.SetGateways("192.168.1.2",1)
        $wmi.SetDNSServerSearchOrder("192.168.1.2")
        "Заданы сетевые нстройки сибирских сетей."
    }
    "enforta" {
        $wmi.EnableStatic("10.171.72.244","255.255.255.0")
        $wmi.SetGateways("10.171.72.1",1)
        $wmi.SetDNSServerSearchOrder("8.8.8.8")
        "Заданые сетевые настройки энфорты."
    }
    "h" {printHelp}
    default {Write-Output "Нужны параметры! Для справки вызови set_provider.ps1 h"}
}