Показаны сообщения с ярлыком Программирование. Показать все сообщения
Показаны сообщения с ярлыком Программирование. Показать все сообщения

четверг, 25 февраля 2016 г.

vaadin/expense-manager-demo. FAQ.

URL

NPM modules:
bcrypt.js - Lib to help you hash passwords.

body-parser.js - Node.js body parsing middleware.

cors.js - Cross-origin resource sharing (CORS) is a mechanism that allows restricted resources (e.g. fonts) on a web page to be requested from another domain outside the domain from which the resource originated.

jsonwebtoken.js - An implementation of JSON Web Tokens.

moment.js - A lightweight JavaScript date library for parsing, validating, manipulating, and formatting dates.

morgan.js - HTTP request logger middleware for node.js

multer.js - Multer is a node.js middleware for handling multipart/form-data, which is primarily used for uploading files. It is written on top of busboy for maximum efficiency.

четверг, 17 декабря 2015 г.

MongoDB Default Admin Password

По умолчанию в MongoDB аутентификация отключена.

Для mongo-express используйте user:admin password:pass.
For mongo-express you should use the default account “user:admin”, “password:pass”

Чтобы включить аутентификацию , добавьте "security: authorization: enabled"  в mongo.cfg.
Добавляем администратора:
use admin
db.createUser(
  {
    user: "myUserAdmin",
    pwd: "abc123",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)

Arrow keys not working on Windows 10 using slc loopback

Quick resolve. Choose "Use legacy console (requires relaunch)" and compability "Windows 95" far.exe (Far Manager) shortcut properties.



пятница, 11 декабря 2015 г.

GIT error: LF would be replaced by CRLF

Проект loopback.js развернут на Windows.

Конец строки (EOL) во всех файлах Unix-style.
Как вариант исправления ошибки GIT:

$ git config --global core.autocrlf input
Подробнее 

                 | Resulting conversion when       | Resulting conversion when 
                 | committing files with various   | checking out FROM repo - 
                 | EOLs INTO repo and              | with mixed files in it and
                 |  core.autocrlf value:           | core.autocrlf value:           
--------------------------------------------------------------------------------
File             | true       | input      | false | true       | input | false
--------------------------------------------------------------------------------
Windows-CRLF     | CRLF -> LF | CRLF -> LF | as-is | as-is      | as-is | as-is
Unix -LF         | as-is      | as-is      | as-is | LF -> CRLF | as-is | as-is
Mac  -CR         | as-is      | as-is      | as-is | as-is      | as-is | as-is
Mixed-CRLF+LF    | as-is      | as-is      | as-is | as-is      | as-is | as-is
Mixed-CRLF+LF+CR | as-is      | as-is      | as-is | as-is      | as-is | as-is


Visual Studio Code cannot detect installed git

The user settings file is located here:

Windows %APPDATA%\Code\User\settings.json
Mac $HOME/Library/Application Support/Code/User/settings.json
Linux $HOME/.config/Code/User/settings.json

Just add the path to the git executable in your Visual Studio Code settings like this:

{
    "git.enabled": true,
    // Path to the git executable
    "git.path": "C:\path\to\git.exe"
}

вторник, 8 декабря 2015 г.

Установка MongoDB на Windows (Installing MongoDB on Windows)

После установки. (After install)
1. Создать файл mongodb.cfg (Create file)
systemLog:
    destination: file
    path: c:\data\log\mongod.log
storage:
    dbPath: c:\data\db
2. Создать каталоги (Create directories):
mkdir c:\data\db
mkdir c:\data\log
3. Установить службу(Install service): 
"C:\mongodb\bin\mongod.exe" --config "C:\mongodb\mongod.cfg" --install

пятница, 8 июля 2011 г.

Webexception: Слишком много попыток автоматического перенаправления

Или так: "Webexception: Too many redirects".
Неблагодарное занятие парсить html страницы. Постоянно приходится менять код.Полгода приложение работало нормально закачивало ссылку, а теперь выдает ошибку. Chrome качает без проблем, а программа не может. Пришлось разбираться с помощью Fiddler.
   Итак можно четко увидеть, что на мой запрос сервер возвращает HTTP 302, то есть делает редирект на ту же самую страницу (Location:  http://etp.zakazrf.ru/Reductions.aspx), одновременно устанавливает cookies (Set-cookies: ASP.NET_SessionId....).  В моем приложении  cookies не обрабатовались, поэтому  программа постоянно получала HTTP 302, делала редирект на Location, и так по кругу, пока счетчик перенаправлений не сравнялся с параметром
request.MaximumAutomaticRedirections ( по умолчанию равен 50).
Пришлось изменить код

вторник, 30 ноября 2010 г.

Visual Studio С# 2010 Express. Не сохраняются данные в базе.

 Я потерял часа три на то, что бы понять, почему, когда я вызываю функцию DataContext.SubmitChanges(), данные в базе данных не обновляются. При этом никаких ошибок нет. Если в точно такую же ситуацию попали и вы, советую почитать вот здесь:
http://www.visualstudiodev.com/visual-c-express-edition/tableadapter-not-inserting-rows-to-the-database-43671.shtml
Если коротко, то при отладке программы в Visual Studio C# Express, файл базы данных копируется в каталог "(ProjectDir)\bin\Debug\mydatabase.mdb" и все изменения происходят уже в этой базе. Их не увидишь, пока не сделаешь еще одно подключение в проекте на этот файл базы данных. Ну а если эти данные важны для вас, то придется вручную заменить оригинальный файл базы данных на файл временной  базы. До этого я использовал Visual Studio Web Developer 2008 Express, ничего такого там не было.

суббота, 13 ноября 2010 г.

Осваиваем LINQ to XML

Как я описал в предыдущем посте Разбор HTML в Microsoft C Sharp запрос по URL  http://sberbank-ast.ru/PurchaseList.aspx возвращает данные  в XML формате. Нам нужно их разобрать. Как раз есть повод применить LINQ to XML. Сразу посоветую книжку для изучения. Авторы: Джозеф Албахари, Бен Албахари. Название - "LINQ карманный справочник". Очень доходчиво написано.
В этой книжке также есть ссылка на программу LINQPAD, где можно поупражняться в написании запросов на LINQ. Программа бесплатная, но за такой сервис, как "autocompletion" (аналог intellisense в Visual Studio) придется заплатить. Итак имеем XML структуру :

Допустим нам нужно найти purchID по определенному фильтру. Вот как выглядит код:


То есть мы выводим идентификаторы тех аукционов, которые в своем наименовании содержат слово "Поставка", и их ID больше 58061, и в описании встречаются или "Саратов" или "Москва".
Есть один момент, который меня не устраивает в этом коде. Хотелось бы, чтобы фильтр был универсальным. Например, я хочу включить несколько городов.  Понятно, что здесь нужно использовать деревья-выражения. Вот здесь мне и помог  Джозеф Албахари. Он написал универсальные extension функции для типа Expression < Func <T,TResult>>. По этой ссылки вы найдете их определения и примеры использования.
Dynamically Composing Expression Predicates
А теперь как изменился код:




Обратите внимание на Compile(). Мне пришлось использовать эту функцию для того что перевести дерево-выражение в лямбда-выражение , так как запрос локальный и возвращает тип IEnumerable, а не интерпретируемый, который возвращает IQueryable. Разница между двумя типами  описана в книге "LINQ карманный справочник".

среда, 10 ноября 2010 г.

Разбор HTML в Microsoft C Sharp

Приятно когда опытные программисты делятся полезными идеями и даже кодом своих программ. Вот один из примеров. Для своего нового проекта мне понадобился разборщик HTML. Мне нужен очень простенький, где я мог бы для определенного атрибута вытащить его значение. В принципе в сети нашел несколько вариантов. Но остановился вот на этом:
Parsing HTML in Microsoft C#.
Очень советую. Все просто и нагладно показано.   Вот пример как я его использую. Мне нужно получить реестров аукционов с сайта http://sberbank-ast.ru/PurchaseList.aspx  Посмотрев HTML -код страницы нашел тег input c атрибутом name="ctl00$ctl00$phWorkZone$xmlData"  - это для меня ключ поиска, но а потом у этого же тега вытаскиваю значение атрибута value со списком новых аукционов < input name="ctl00$ctl00$phWorkZone$xmlData" text="text" value="..здесь данные которые мне нужны...      Вот код для получения этих данных:



tag ["value"].Value не совсем еще XML. Просто вместо "<" стоит &lt  поэтому и понадобилась процедура для замены. Вот код этой процедуры



Вывод программы примерно следующий:

понедельник, 24 мая 2010 г.

WebException Сервер нарушил протокол. Section=ResponseHeader Detail=Недопустимое имя заголовка

В моем проекте MVC мне понадобилось подключиться к принтерам через WEB интерфейс. Я хотел программно считать пробег.
Получилось вот что:

Dim wc As New System.Net.WebClient
Dim Stream As System.IO.Stream
Try
 Stream = wc.OpenRead("http://" & Specific.IP_add _  

  "/hp/device/this.LCDispatcher?dispatch=html&cat=0&pos=1")
 Using sr As New System.IO.StreamReader(Stream)
  str = sr.ReadToEnd()
  Stream.Close()
 End Using
 Return CType(CountStr, Integer)
Catch ex As Exception
 Dim errorstring = ex.Message
End Try


У принтера HP4350 без проблем считалась страница, а вот у HP 4300 никак.
Ошибка была следующая :
"Сервер нарушил протокол. Section=ResponseHeader Detail=Недопустимое имя заголовка"
Решение удалось найти. Необходимо в файле web.config внести следующие изменения:

<configuration>
   <system.net>
       <settings>
          <httpwebrequest useunsafeheaderparsing="true">
       <settings>
   <system.net>
<configuration>

С принтером 4515 тоже не очень гладко получилось , так как  WEB интерфейс был доступен по протоколу https. Возникало следующее исключение:
"Базовое соединение закрыто Не удалось установить доверительные отношения для защищенного канала SSL TLS". Вот по этой ссылке сделал.
http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/c98ea134-c582-4c2a-8c42-d7e31f7fe389
Итак определяем функцию, котрая возвращает всегда "True"

Private Function ValidateCertificate(ByVal sender As Object, _
  ByVal certificate As  X509Certificate, ByVal chain As X509Chain, _
  ByVal sslPolicyErrors As SslPolicyErrors) As Boolean
  Return True
End Function


А вот ее вызов

Dim wc As New System.Net.WebClient
Dim Stream As System.IO.Stream
Try
 System.Net.ServicePointManager.ServerCertificateValidationCallback = _

 New System.Net.Security.RemoteCertificateValidationCallback AddressOf _
 ValidateCertificate)
 Dim myUri As New Uri("https://" & Specific.IP_address _ &  "/hp/device/this.LCDispatcher?nav=hp.Config")

 Dim mySP As System.Net.ServicePoint = _

     System.Net.ServicePointManager.FindServicePoint(myUri)
 Stream = wc.OpenRead(myUri)
 Using sr As New System.IO.StreamReader(Stream)
 str = sr.ReadToEnd()
 Stream.Close()
 End Using
 Return CType(CountStr, Integer)
Catch ex As Exception
 Dim errorstring = ex.Message
End Try

вторник, 27 апреля 2010 г.

MVC.Многостраничный просмотр таблицы.

Задача сводится к следующему. При выводе данных в окно браузера ограничиться некоторым количеством записей из таблицы, чтобы помещалось на экране. А тажке соорудить навигацию для доступа к невидимой части.
"MVC PageIndex" - запрос к Google.
Решение очень быстро нашлось. http://en.webdiyer.com/ . Абсолютно бесплатный модуль. Есть очень понятные примеры. http://en.webdiyer.com/MvcPager/Demo/StandardТак как я использую сначала фильтр, а потом уже вывожу данные, то вот мой измененный код:

Function Consumable(ByVal id1 As Integer?) As ActionResult
 Dim Datacontext As New PrintModelDataContext
 Dim ListConsumables As IQueryable(Of ClassConsumable)
 ListConsumables = From c In Datacontext.consumable, p In Datacontext.Printer _
                  Where c.Id_printer = p.Id _
                  Select New ClassConsumable _
                             With {.Id = c.Id, _
                                   .Naim = c.Naim, _
                                   .Part_number = c.Part_number, _
                                   .Revolving = c.Revolving, _
                                   .Count = c.Count, _
                                   .NaimPrinter = p.Naim}
 Return View(ListConsumables.ToPagedList(IIf(id1 Is Nothing, 1, id1), 20))
End Function


Мне пришлось создать новый класс, который является неким объединением двух таблиц Consumable и Printer. Ну а в представлении я абсолютно точно копирую из оригинала. Только перевожу в синтаксис языка  VB

<%=Html.Pager(Of print.ClassConsumable)(Model, New PagerOptions With {.PageIndexParameterName = "id1"})%>

И еще полезно будет в Web.config в каталоге VIEW внести строчку

<namespaces>
<add namespace="Webdiyer.WebControls.Mvc"/>
</namespaces>

Чтоб метод Pager был доступен в каждой странице проекта.

пятница, 19 марта 2010 г.

MVC. Html.DropDownList

Эта тема перекликается с описанной в прошлом посте. Но теперь хочется, чтобы при редактировании и добавлении новой записи, вместо идентификаторов-ссылок на первичные ключи был выбор ввиде выпадающего списка. То есть вместо Html.TextBox используем Html.DropDownList. Вот код в контроллере:

Function CreateSpecific() As ActionResult
Dim Datacontext As New PrintModelDataContext
Dim PrinterList As IList
PrinterList = (From p In Datacontext.Printer Select ID = p.Id, Naim = _ p.Naim).ToList
ViewData("PrinterList") = New SelectList(PrinterList, "ID", "Naim")
Return View()
End Function

А теперь используем список всех принтеров для выбора поля ID_Printer в таблице Specific в представлении:

<%=Html.DropDownList("Id_printer", CType(ViewData("PrinterList"), SelectList)%>

Если у нас есть логическое поле в таблице, то для него тоже можно использовать HTML.DropDownList.
Например в контроллере создаем список:

Dim YesNo As New List(Of SelectListItem)
YesNo.Add(New SelectListItem With {.Value = Boolean.Parse("True"), _
.Text = "ДА",  .Selected = Boolean.Parse("True")})
YesNo.Add(New SelectListItem With {.Value = Boolean.Parse("False"),_
.Text = "НЕТ", .Selected = Boolean.Parse("True")})
ViewData("YesNo") = New SelectList(YesNo, "Value", "Text")

А в представлении код тот же:

<%=Html.DropDownList("Boolean", CType(ViewData("YesNo"), SelectList)) %>
 

MVC. Выводим в представлениях вместо ID - наименования.

Продолжаем работать над MVC приложением. Конечно при отображении значений полей в записи таблицы,  хотелось бы видеть не идентификаторы-ссылки на другую таблицу ,связанную отношениями, а их смысловые значения. Допустим есть  первичная таблица Printer (Это таблица моделей принтеров).  Вот как выглядит контроллер для отображения этой таблицы .

Function Printer() As ActionResult
Dim Datacontext As New PrintModelDataContext
Dim List = From p In Datacontext.Printer Select p
Return View(List.ToList)
End Function

Потом в одноименном представлении (строго-типизированном) мы в цикле выводим колонки записи таблицы.

<%For Each item In Model%>
<%= Html.Encode(item.Naim) %>
<%= Html.Encode(item.Part_number) %>
<%= Html.Encode(item.Manufactory) %>
<%Next%>

А вот выводим дочернюю таблицу Specific:

Function Specific() As ActionResult
  Dim Datacontext As New PrintModelDataContext
  ViewData("Specific") = _
  From s In Datacontext.Specific, _
    p In Datacontext.Printer, _
    f In Datacontext.Filial _
   Where s.Id_Printer = p.Id And s.Id_Filial = f.Id _
   Select s.Id, s.Inv, s.SN, NaimPrinter = p.Naim,_
    NaimFilial = f.Naim
   Return View()
End Function

В представлении мы уж используем Viewdata("Specific") вместо Model.
В этом случае Intellisense уже вам не подскажет.

<%For Each item In ViewData("Specific")%>
<%=Html.Encode(item.NaimPrinter)%>
<%= Html.Encode(item.SN)%>
<%= Html.Encode(item.Inv)%>
<%=Html.Encode(item.NaimFilial)%>
<% Next%>

Вместо поля числового поля ID_printer Выводиться NaimPrinter из таблицы Printer, вместо ID_Filial - NaimFilial

среда, 17 марта 2010 г.

MVC Repository pattern VB

Вот такие ключевые слова мне понадобились для работы над моим первым MVC проектом. Начал я с изучения проекта Nerddinner http://nerddinnerbook.s3.amazonaws.com/Intro.htm Именно там и используется Repository. То есть набор методов над LINQ to SQL для работы с базой данных. Вот пример добавления строки в таблицу dinner:

public void Add(Dinner dinner) {
db.Dinners.InsertOnSubmit(dinner);
}


Вот пример поиска по ID в таблице dinner:

public Dinner GetDinner(int id) {
return db.Dinners.SingleOrDefault(d => d.DinnerID == id);
}


Так как в проекте Nerddinner используется только одна таблица, то это разработчиков устраивает. Но в моей базе данных 7 таблиц, и видимо есть способ не писать один и тот же код для всех таблиц. И вот в инете нахожу ссылку на универсальный Repository.
http://mikehadlow.blogspot.com/2008/03/using-irepository-pattern-with-linq-to.html
Только мне нужен на VB.
И вот предлагаю небольшую адаптацию написанную на VB.
Добавление записи в таблицу:

Public Sub Add(Of T)(ByRef Tab As T)
dc.GetTable(GetType(T)).InsertOnSubmit(Tab)
End Sub

Action метод для создания записи в таблице Printer будет такой:

Function CreatePrinter(ByVal Row As Printer) As ActionResult
Try
Datawork.Add(Of Printer)(Row)
Datawork.Save()
Return RedirectToAction("Printer")
Catch
Return View()
End Try
End Function


Удаление делается аналогично:

Public Sub Delete(Of T)(ByRef Tab As T)
dc.GetTable(GetType(T)).DeleteOnSubmit(Tab)
End Sub

А вот универсальный поиск по ID оказался для меня сложнее.

Public Function GetbyID(Of T)(ByVal ID As Int32) As T
Dim NameOfTable As ParameterExpression = Expression.Parameter(GetType(T), "x")
Dim lambda1 As Expression(Of Func(Of T, Boolean)) = _
Expression.Lambda(Of Func(Of T, Boolean))( _
Expression.Equal(Expression.Property(NameOfTable, "ID"), Expression.Constant(ID, GetType(Integer))), _
New ParameterExpression() {NameOfTable})
Return CType(dc.GetTable(GetType(T)), IQueryable(Of T)).SingleOrDefault(lambda1)
End Function

Для понимания Lambda Expression рекомендую ссылку http://chakkaradeep.wordpress.com/2008/04/14/c-30-language-enhancements-for-linq-part-3-expression-trees/ . Мне она очень помогла.

среда, 13 января 2010 г.

WinToDos. Как сохранить данные в DOS кодировке.

Думаете задача неактуальная. Ошибаетесь. Вы знаете, что Сбербанк принимает файлы на зачисление на пластиковые карты в DOS формате. Информация на зачисление выгружается из "1С Кадры и Зарплата" в формате XML, после этого нужно получить DOS-файл со списком на зачисление.
Сейчас это делается на VBA в EXCEL. Я решил переписать на VB2008. Вот как функция перекодировки  выглядит на VBA (Авторство не моё):

W = "": D = ""
For I = 192 To 255: W = W & Chr$(I): Next
For I = 128 To 175: D = D & Chr$(I): Next
For I = 224 To 236: D = D & Chr$(I): Next

Public Function WinToDos(ByVal S As String, ByVal W As String, ByVal D As String) As String
Dim R As String
Sym = S: Ltext = Len(S)
If Ltext > 0 Then
For I = 1 To Ltext
k = InStr(W, Mid(S, I, 1))
If k > 0 Then
Mid(Sym, I, 1) = Mid(D, k, 1)
End If
Next I
End If
WinToDos = Sym
End Function

То есть понятно. Создается две строки. Одна содержит символы в Windows кодировке, другая в DOS. Первый параметр - строка,которую нужно перекодировать.Затем в цикле меняем один символ на другой.
Можно было использовать и этот код. Ну уж больно хотелось использовать возможности .NET.
И вот что получилось. Вот пример программы создающий файл с данными в DOS кодировке.

Imports System
Imports System.IO
Imports System.Text

Module Module1
Sub Main()
Dim Sym As String = "Привет от старых штиблет"
Dim encoding1 As Encoding = Encoding.GetEncoding(866)
Dim ioFile As New _
StreamWriter("c:\proba.txt", Boolean.Parse("False"), encoding1)
ioFile.WriteLine(Sym)
ioFile.Close()
End Sub
End Module

В файле proba.txt в DOS кодировке будет строчка "Привет от старых штиблет"

среда, 16 декабря 2009 г.

Подключение к базе Firebird в .NET

Для того чтобы подключиться к базе Firebird нужно скачать Firebird .Net Provider.
http://www.ibphoenix.com/main.nfs?page=ibp_download_dotnet
При установке в Program Files появляется папка "firebirdclient 2.0", а в ней firebirdsql.data.firebirdclient.dll . Создаем в Visual Studio 2008 новый проект. В обозревателе решений на элементе "Ссылки" кликаем правой клавишей и выбираем "Добавить"
Добавляем firebirdsql.data.firebirdclient.dll . Пример кода:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FirebirdSql.Data.FirebirdClient;

namespace FirebirdTry
{
class FirebirdConnect
{
static void Main()
{
try
{
string ConnectionString = "UserID=nameuser;Password=password;" +
"Database=./db/namedatabase.gdb; " + "DataSource=namecomp;Charset=NONE;";

FbConnection addDetailsConnection = new FbConnection(ConnectionString);
addDetailsConnection.Open();
Console.WriteLine("Удачно");
Console.ReadKey();
FbCommand readCommand = new FbCommand("Select count(*) From
table",dDetailsConnection);
FbDataReader myreader = readCommand.ExecuteReader();
while (myreader.Read())
{
Console.WriteLine(myreader[0]);

}
myreader.Close(); // we are done with the reader
Console.ReadKey();
addDetailsConnection.Close();
}
catch (Exception x)
{
Console.WriteLine(x.Message);
Console.ReadKey();
}

}
}
}


Как видно на примере в отличие от типов пространства имен System.Data.OleDB:
OleDbConnection, OleDBCommand, OleDBDataReader, "OleDB" меняется на "Fb"

четверг, 23 июля 2009 г.

Очень полезно в нашей работе владеть инструментом для создания программок, облегчающих труд сисадмина. Этим инструментом можно смело назвать Microsoft Expression Studio 2008. Абсолютно бесплатная среда разработки приложений. Я воспользовался предложением от Microsoft и создал небольшую программку. В этой программе я использую Excel-файл. Для работы с Excel файлом мне необходимо было подключить библиотеку. Выглядет это так.


А в тексте самой программы: Imports Microsoft.Office.Interop (это на VB.Net)
Программка отлично работала, до тех пор пока не пришлось поменять компьютер. А после этого при запуске я получил ошибку:


"Невозможно загрузить файл или сборку Interop.Microsoft.Office..."
Получается нет у меня этой библиотеке на новом компе. А почему? На этот вопрос я нашел ответ вот здесь:http://msdn.microsoft.com/en-us/library/kh3965hw(VS.80).aspx
Оказывается нужно было, устанавливая офис, использовать опцию "Установить полностью".
А теперь придеться качать отдельный пакет установки "Redistributable Primary Interop Assemblies Package" http://www.microsoft.com/downloads/details.aspx?FamilyID=59daebaa-bed4-4282-a28c-b864d8bfa513&DisplayLang=en (это для Office 2007)
Ну все и заработало.