суббота, 28 ноября 2015 г.

ASP.Net MVC Html.ActionLink проблемы при передаче routeValues как переменной

Ситуация

Во View была строка

@Html.ActionLink("Заказать", "add", "order",
new {id=Model.Id, feedbackid=Model.FeedbackId},
      new {rel="nofollow"})


т.к. набор параметров был опциональный - захотелось их вынести в отдельную переменную

код стал таким
@{
var addOrderLinkRouteValues = new RouteValueDictionary();
addOrderLinkRouteValues.Add("Id", Model.Id);
// опциональное добавление других параметров
}
...
@Html.ActionLink("Заказать", "add", "order",
        addOrderLinkRouteValues,
      new {rel="nofollow"})

Проблема

испортилась ссылка. вместо набора параметров в ссылке на выходе стало отображаться название типа 

/order/add?Count=1&Keys=System.Collections.Generic.Dictionary%602%2BKeyCollection%5BSystem.String%2CSystem.Object%5D&Values=System.Collections.Generic.Dictionary%602%2BValueCollection%5BSystem.String%2CSystem.Object%5D

Решение

Если в двух словах. при таком использовании система подхватывает не тот перегруженный метод

подхватывается такой 
ActionLink(HtmlHelper, String, String, String, Object, Object)
а нам нужен быть такой
ActionLink(HtmlHelper, String, String, RouteValueDictionary, IDictionary<String, Object>)

соответственно код нужно заменить на такой 

@Html.ActionLink("Заказать", "add", "order",
addOrderLinkRouteValues,
        new Dictionary<string, object>{
        {"rel","nofollow"}
            }
        )
тут последний параметр задан типом Dictionary (реализующим IDictionary) а не объектом

среда, 25 ноября 2015 г.

Нулевая консоль в Windows Server 2008 R2

Столкнулся с подключением через удаленный рабочий стол к серверу.

Текст ошибки
Отсутствуют доступные серверы лицензирования удаленных рабочих столов


Для диагностики посоветовали подключиться через "нулевую консоль". Не знал что это. поэтому оставляю здесь

win+r -> mstsc /admin -> вводите данные для подключения

Тогда сервер воспринимает Вас как администратора и позволяет подключиться.

По самой сути ошибки еще разбираюсь.
читаю статьи

Отсутствуют доступные серверы лицензирования удаленных рабочих столов
http://www.modber.ru/catalog/item3062.html


http://pyatilistnik.org/oshibka-udalennyiy-seans-otklyuchen-poskolku-otsutstvuyut-dostupnyie-serveryi-litsenzirovaniya-udalennyih-rabochih-stolov-kotoryie-mogli-byi-provesti-litsenzirovanie/

понедельник, 19 октября 2015 г.

WinForms конпка по умлочанию (кнопка по "Enter")

Тут сохраню простой совет, возможно кому-то будет полезно:

Вопрос:
Как сделать в WinForms кнопку, которая бы срабатывала по умолчанию (при нажатии на Enter)

Ответ: Используйет свойство AcceptButton у формы (выберите кнопку значением этого свойства).

Материал по теме
http://stackoverflow.com/questions/4280221/default-button-property-in-winform-app

пятница, 16 октября 2015 г.

Gmail Outlook account settings

Tips for setting gmail account in Outlook

Account type: IMAP

incoming server: imap.gmail.com
outgoing server: smtp.gmail.com
login: (your email)
password: (your password)

ports:
imap: 993 (ssl)
smtp: 465 (ssl)

четверг, 15 октября 2015 г.

Nuget failed to add reference to ... (ошибка в Visual studio)

Ситуация

Visual Studio 2015. При компиляции проекта начала появляться ошибка

nuget failed to add reference to ...

Решение

Погуглил - советкую удалить все внутренности папки packages в солюшене

Сделал - помогло

решение взял отсюда

NuGet add reference error while installing packages
http://stackoverflow.com/questions/8314400/nuget-add-reference-error-while-installing-packages

воскресенье, 11 октября 2015 г.

Бесплатные видеоредакторы

Для выполнения части проекта понадобилась возможность простого редактирования видео, а именно вырезать часть ролика.

пока выбрал этот
Free Video Dub (для удаления ненужных участков видео)
Сайт программы: http://www.dvdvideosoft.com/ru/products/dvd/Free-Video-Dub.htm

Он простой как 3 копейки и позволил мне вырезать куски из видео. А именно это мне и нужно было в моей задаче.


Материалы по теме

сохраняю пока здесь, но внимательно не разбирал
комментированная подборка
http://pcpro100.info/kakie-est-besplatnyie-videoredaktoryi-dlya-windows-7-8/

каталог видеоредакторов
http://soft.mydiv.net/win/cname47/cname65/cname68/

Скачать видео с ютуба

Как скачать видео с ютуба?

Наверно рано или поздно каждый сталкивается с этим вопросом. Столкнулся и я. Решение несложное и описано много где в интернете.

Решение

По простому звучит так:

поставьте ss перед словом youtube в адресе видео.

При этом используется этот инструмент http://ru.savefrom.net/

Материалы по теме

Скачать видео с ютуба
http://lifehacker.ru/2012/06/27/download-youtube-video/

Как скачивать видео с Youtube
https://otvet.mail.ru/question/69213807

в конце концов большинство советов ведет сюда
http://ru.savefrom.net/

четверг, 1 октября 2015 г.

Gmail error: Please log in via your web browser and then try again

Situation

My web application sends email messages from website with gmail-account smtp credentials (login / password / SMTP server / port)

Error

When debugging an application on the local server - everything is OK.
Once the load on Web Hosting - i've got an error

534-5.7.14 Please log in via your web browser and then try again. 534-5.7.14 Learn more at 534 5.7.14 https://support.google.com/mail/bin/answer.py?answer=78754 18sm42904851wju.15 - gsmtp

Research

Googling helps. Оne of the answers here was usefull
http://stackoverflow.com/questions/20337040/gmail-smtp-debug-error-please-log-in-via-your-web-browser

Solution

The essence of the problem in my case:
Gmail blocks mails from unknown IP-addresses.
I wasn't able do the Google's advice ("Please log in via your web browser") from IP addres of my hosting server.

So, it was necessary to turn off the google blocking of unknown address through this link
https://accounts.google.com/DisplayUnlockCaptcha

UPD
Also I allow unsecured Apps on the page
https://myaccount.google.com/lesssecureapps

Related links

Gmail SMTP debug: error “please log in via your web browser”
http://stackoverflow.com/questions/20337040/gmail-smtp-debug-error-please-log-in-via-your-web-browser

среда, 30 сентября 2015 г.

Entity Framework: Reload newly created object / Reload navigation properties

Environment

ASP.NET MVC 4 application, EntityFramework 6

Problem


Unable to reload the updated properties of an object from the database, and navigation properties.

Scenario

I do processing Post-request for object creation in the controller's action .
The object itself passed in the Action as parameter.

I usually do this sequence

...
check values
save object
additional actions after saving
...

From the client side a new object comes "clean" / without navigational properties.
I add it to the context and save.
Once saved, I want to do the extra processing in which I need the navigation properties,
but the problem is that EF caches object and reloading does not update the navigation properties. They remain empty.

Solution

Before you read the object from database it must be disconnected from the context.

I got to do it this way:

public void Detach (T entity)
{
            ((IObjectContextAdapter) _db) .ObjectContext.Detach (entity);
}

The solution found here
Entity Framework Code First - No Detach () method on DbContext
http://stackoverflow.com/questions/4168073/entity-framework-code-first-no-detach-method-on-dbcontext

Related Links


Entity Framework Code First - No Detach() method on DbContext
http://stackoverflow.com/questions/4168073/entity-framework-code-first-no-detach-method-on-dbcontext

Reload an entity and all Navigation Property Association- DbSet Entity Framework
http://stackoverflow.com/questions/9081244/reload-an-entity-and-all-navigation-property-association-dbset-entity-framework

How to update an entity's navigation properties in Entity Framework
http://stackoverflow.com/questions/10542209/how-to-update-an-entitys-navigation-properties-in-entity-framework

Entity Framework POCO - Refresh a navigation property
http://stackoverflow.com/questions/3839166/entity-framework-poco-refresh-a-navigation-property

Entity Framework Перезагрузить только что созданный объект/перегрузить навигационные свойства

Окружение

ASP.NET MVC 4 приложение, EntityFramework 6

Проблема

Не получается перезагрузить обновленные свойства объекта из базы данных и навигационные свойства


Сценарий использования

Обрабатываю в контроллере Post-запрос на создание объекта. Объект передается параметром в Экшене.
как обычно я делаю

...
проверки
сохранение объекта
дополнительные действия после сохранения
...

С клиента новый объект приходит "чистым"/ т.е. без навигационных свойств.
Его я и добавляю в контекст и сохраняю.
После сохранения я хочу провести дополнительную обработку в которой мне нужны навигационные свойства, но проблема в том, что EF кеширует объект и повторная загрузка не приводит к обновлению навигационных свойств. Они остаются пустыми.

Решение

Перед тем как считать обновленный объект его нужно отсоединить от контекста.

У меня получилось сделать это так:

public void Detach(T entity)
{
            ((IObjectContextAdapter)_db).ObjectContext.Detach(entity);
}

Решение нашел здесь
Entity Framework Code First - No Detach() method on DbContext
http://stackoverflow.com/questions/4168073/entity-framework-code-first-no-detach-method-on-dbcontext

Ссылки по теме


Entity Framework Code First - No Detach() method on DbContext
http://stackoverflow.com/questions/4168073/entity-framework-code-first-no-detach-method-on-dbcontext

Reload an entity and all Navigation Property Association- DbSet Entity Framework
http://stackoverflow.com/questions/9081244/reload-an-entity-and-all-navigation-property-association-dbset-entity-framework

How to update an entity's navigation properties in Entity Framework
http://stackoverflow.com/questions/10542209/how-to-update-an-entitys-navigation-properties-in-entity-framework

Entity Framework POCO - Refresh a navigation property
http://stackoverflow.com/questions/3839166/entity-framework-poco-refresh-a-navigation-property



понедельник, 28 сентября 2015 г.

.NET приложение. Ошибка: Unable to load one or more of the requested types...

После публикации ASP.NET MVC приложения получил ошибку:

Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information. 

Причем локально ошибка не повторялась

Как выяснить причину

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

чтобы выяснить, чего именно не хватает приложению, я добавил такой дополнительный код на страницу обработки ошибок
(у меня в приложении была настроена специальная страница обработки ошибок, поэтому код я написал сразу в ней и код на razor. но вы можете адаптировать этот код в чистый C# ):

@if (Model.Exception is ReflectionTypeLoadException)
    {
        var rtlexc = Model.Exception as ReflectionTypeLoadException;
        if (rtlexc.LoaderExceptions != null) {
            foreach (var rtlexcitem in rtlexc.LoaderExceptions)
            {
                <div>
                    @rtlexcitem.Message
                </div>
            }
        }
        
    }

Этот код вывел меня на сборку которая не была подгружена в проект
Оказывается члены команды добавили новую длл-ку, но не установили ей свойство копироваться локально.

Как решать

Проект/References/Нужная сборка/Свойства/Copy Local = true

Смотрите также

тема на stackoverflow

Error message 'Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.'




воскресенье, 27 сентября 2015 г.

Отзыв о книге: Андрей Иванов Идеальный поиск в Интернете глазами пользователя

Книга "Идеальный поиск в Интернете глазами пользователя" Андрей Иванов - купить книгу ISBN 978-5-459-00333-8 с доставкой по почте в интернет-магазине OZON.ruКнига "Идеальный поиск в Интернете глазами пользователя" Андрей Иванов - купить книгу ISBN 978-5-459-00333-8 с доставкой по почте в интернет-магазине OZON.ru

Сразу начну с плохого.

Что очень не понравилось


Книга очень натягивает объем: часто автор добавляет малоинформативные таблицы и скриншоты, которые могут занимать подряд несколько страниц. Похоже автор хотел подзаработать на популярности другой книги Оптимизация и продвижение сайтов в поисковых системах, которую он писал совместно с Ашмановым.

Но, честно говоря, искусственная растянутость и маленькое количество действительно полезного материала очень бросается в глаза.

Это для меня было большим минусом.


Какие мысли мне запомнились


Влияние поисковиков на интернет-контент

Поисковики говорят, что только отражают состояни интернета, но на самом деле влияют на его содержимое, так как множество SEO оптимизаторов ведут войну за появление на первой странице поиска, соответсвенно изменяют контет в угоду поисковикам.

Виды запросов

Навигационные: найти сайт такой-то организации
Транзакционные: купить/заказать что-то
Информационные: найти информацию о том-то

Критерии оценки поисковой выдачи

Осмысленность, Авторизованность(инфо с официальных сайтов), Авторитетность, Полнота,Структура, Оформление.

Проблемы поисковиков.

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

Выводы

В конце книги есть такая фраза:
Мы обещали вам, что вы будете лучше представлять к чему идет сетевой поиск и каковы критерии качества поисковой выдачи с точки зрения её потребителей.

Ну что ж: автор свое обещание выполнил.
Но, если задам себе вопрос: сильно ли мне помогла книга в практическом продвижении сайта -скажу: "Не очень".

Содержимое  книги можно охарактеризовать как общие размышления простым языком о технических вопросах в целом.


Нужно ли читать: Только если хотите побольше узнать про теорию поисковых систем.

Моя оценка: 2 из 5
(Если же нужна хорошая практическая книга по поисковой оптимизации - рекомендую книгу: Оптимизация и продвижение сайтов в поисковых системах )

Ссылки

понедельник, 14 сентября 2015 г.

Отзыв о книге: И.Ашманов, А.Иванов Оптимизация и продвижение сайтов в поисковых системах.

Ozon.ru - Книги | Оптимизация и продвижение сайтов в поисковых системах (+CD) 3-е изд. Ашманов И., Иванов А. | Ашманов И., Иванов А. | | | Купить книги: интернет-магазин / ISBN 978-5-496-00312-4Ozon.ru - Книги | Оптимизация и продвижение сайтов в поисковых системах (+CD) 3-е изд. Ашманов И., Иванов А. | Ашманов И., Иванов А. | | | Купить книги: интернет-магазин / ISBN 978-5-496-00312-4

На текущий момент мой лидер в SEO оптимизации сайта.

Написано хорошим техническим языком. Хороший теоретических подход. Не заумно но и не поверхностно. И сразу же практические примеры.

Сначала описана внутренность поисковых систем, чтобы ввести неподготовленного читателя в курс дела.

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

После прочтнеия, вы уже будете ориентироваться в большинстве терминов, которые раньше могли вас пугать: Анкор, Серп, ПейджРанк, ТИЦ.
Причем термины достаточно толково объяснены, и с них спадает завеса "загадочности", которую любят напускать SEO-оптимизаторы.

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

Какие области оказались не охваченными в книге и чего мне не хватило: платная реклама, ретаргетинг/ремаркетинг, продвижение сайтов в соц сетях. Конечно, судя из названия, это не входит в тему книги, но тема в тренде, поэтому  нужно будет искать отдельные книги по этим темам.

Моя оценка: 4+ из 5

Стоит ли читать: да, если вы хотите разобраться в SEO оптимизации сайтов.

Ссылки
Книга И.Ашманов, А.Иванов Оптимизация и продвижение сайтов в поисковых системах на Озоне

среда, 2 сентября 2015 г.

Битрикс: Интеграция с Bitrix24 ломает выгрузку заказов

Ситуация

Битрикс Управление сайтом 15.5.5
Была настроена интеграция с Битрикс24. После этого сломалась выгрузка заказов из 1С.
Выгрузка начлаа выдавать:
Ошибка проверки источника запроса. Обновите модуль обмена

Полный текст ошибки


Обмен не выполнен
Выгружено заказов: 2
Произошла ошибка: . По причине: 

Произошла ошибка на стороне сервера. Файл не отправлен (C:\Users\1GB\AppData\Local\Temp\4\1cbitrix\1cbitrix-2ed2f243-3f1a-47a0-ab45-8e2426a95baa.xml).
Обмен не выполнен
Ответ сервера:
Ошибка проверки источника запроса. Обновите модуль обмена.

Обмен заказами завершен с ошибками!!!

Решение

Помогло "быстрое" решение из статьи

Но статья рассчитана на профессионалов - не всем может быть понятно. Поэтому поясню.

Админка/Настройки/Командная PHP-строка вводим и выполняем следующие команды

COption::SetOptionString('catalog', 'DEFAULT_SKIP_SOURCE_CHECK', 'Y'); 
COption::SetOptionString('sale', 'secure_1c_exchange', 'N');


пятница, 31 июля 2015 г.

Битрикс: ошибка Mysql query error: The SELECT would examine more than MAX_JOIN_SIZE rows

Ситуация

Битрикс 15.5.3

В новом модуле рассылки на странице

/bitrix/admin/sender_mailing_recipient_admin.php?MAILING_ID=13&lang=ru#authorize

появилась ошибка

[Bitrix\Main\DB\SqlQueryException] 
Mysql query error: The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is okay (400)
SELECT 
 `sender_posting_recipient`.`NAME` AS `NAME`,
 `sender_posting_recipient`.`EMAIL` AS `EMAIL`,
 COUNT(`sender_posting_recipient_posting_read`.`ID`) AS `READ_CNT`,
 COUNT(`sender_posting_recipient_posting_click`.`ID`) AS `CLICK_CNT`,
 COUNT(`sender_posting_recipient_posting_unsub`.`ID`) AS `UNSUB_CNT`
FROM `b_sender_posting_recipient` `sender_posting_recipient` 
LEFT JOIN `b_sender_posting_read` `sender_posting_recipient_posting_read` ON `sender_posting_recipient`.`ID` = `sender_posting_recipient_posting_read`.`RECIPIENT_ID`
LEFT JOIN `b_sender_posting_unsub` `sender_posting_recipient_posting_unsub` ON `sender_posting_recipient`.`ID` = `sender_posting_recipient_posting_unsub`.`RECIPIENT_ID`
LEFT JOIN `b_sender_posting_click` `sender_posting_recipient_posting_click` ON `sender_posting_recipient`.`ID` = `sender_posting_recipient_posting_click`.`RECIPIENT_ID`
LEFT JOIN `b_sender_posting` `sender_posting_recipient_posting` ON `sender_posting_recipient`.`POSTING_ID` = `sender_posting_recipient_posting`.`ID`
WHERE `sender_posting_recipient_posting`.`MAILING_ID` = 13
AND `sender_posting_recipient_posting`.`MAILING_CHAIN_ID` = 30
GROUP BY `sender_posting_recipient`.`NAME`, `sender_posting_recipient`.`EMAIL`, `sender_posting_recipient`.`ID`
ORDER BY `sender_posting_recipient`.`ID` DESC
/home/virtwww/w_vavilon-shop-com-ua_a98650c1/http/bitrix/modules/main/lib/db/mysqlconnection.php:104
#0: Bitrix\Main\DB\MysqlConnection->queryInternal(string, array, NULL)
 /home/virtwww/w_vavilon-shop-com-ua_a98650c1/http/bitrix/modules/main/lib/db/connection.php:332
#1: Bitrix\Main\DB\Connection->query(string)
 /home/virtwww/w_vavilon-shop-com-ua_a98650c1/http/bitrix/modules/main/lib/entity/query.php:1749
#2: Bitrix\Main\Entity\Query->query(string)
 /home/virtwww/w_vavilon-shop-com-ua_a98650c1/http/bitrix/modules/main/lib/entity/query.php:454
#3: Bitrix\Main\Entity\Query->exec()
 /home/virtwww/w_vavilon-shop-com-ua_a98650c1/http/bitrix/modules/main/lib/entity/datamanager.php:230
#4: Bitrix\Main\Entity\DataManager::getList(array)
 /home/virtwww/w_vavilon-shop-com-ua_a98650c1/http/bitrix/modules/sender/admin/mailing_recipient_admin.php:130
#5: require(string)
 /home/virtwww/w_vavilon-shop-com-ua_a98650c1/http/bitrix/admin/sender_mailing_recipient_admin.php:2

Примечание

Чтобы увидеть текст ошибки - изменил настройки параметров ядра
https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&LESSON_ID=2795 
а именно: 
файл bitrix\.settings.php 
в разделе exception_handling

'exception_handling' => 
  array (
    'value' => 
    array (
      'debug' => false,
      'handled_errors_types' => 4437,
      'exception_errors_types' => 4437,
      'ignore_silence' => false,
      'assertion_throws_exception' => true,
      'assertion_error_type' => 256,
      'log' => NULL,
    ),
заменил 
'debug' => false,
на
'debug' => true,

Решение

Решения пока не нашел. отправил запрос в службу поддержки Битрикса

понедельник, 27 июля 2015 г.

Удаление вируса luckubeginning.com

Ситуация

Обновлял ks player - подхватил "вирус" luckybeginning.com
Его суть: подменяет начальную страницу в браузерах, в частности ie, блокирует настройки поставщиков поиска.

Проблема в том, что запросы типа  "удалить luckybeginnig.com" ведут на подозрительные сайт,которые предлагают загрузить еще более подозрительные утилиты.

Один более-менее приличный сайт:
http://www.techsupportall.com/how-to-remove-luckybeginning-com-homepage-removal-help/

(на самом деле я и с него никаких утилит не устанавливал)

Решение

Удаление недавно установленных программ

Первым делом удалил все только что установленные программы через Удаление программ.

В списке программ отсортировал по дате добавления и удалил все программы, установленные сегодня.

Починка IE

Начал искать в надстройках IE (меню Настроить надстройки).

Нашел подозрительную надстройку, которая вела в папку

C:\Program Files (x86)\MiuiTab

Причем надстройка была недоступна для удаления.

Что сделал: закрыл IE и через проводник удалил подозрительную папку.

После перезапуска IE загрузился без назойливой фейковой домашней страницы.




понедельник, 2 марта 2015 г.

C# разбор Html Файла (парсинг html)

Задача

Понадобилос разобрать HTML-файл

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


Решение Html Agility Pack

Гугл почти сразу вывел на статью

Html Agility Pack — удобный .NET парсер HTML
http://habrahabr.ru/post/112325/

Еще несколько статей тоже ссылались на Html Agility Pack.

Соответственно я взял эту библиотеку за основу.

Оригинальный сайт Html Agility Pack
http://htmlagilitypack.codeplex.com/

На этом сайте брал документацию, саму библиотеку установил через NuGet

Нюансы


1. кодировка и загрузка

Статья на хабре http://habrahabr.ru/post/112325/

не затронула вопросы загрузки  и кодировки файлов. соответственно, приведу здесь пример

var website = new HtmlWeb();            
website.OverrideEncoding = Encoding.GetEncoding("windows-1251");
var doc = website.Load("[url]");

2. XPath

Html Agility Pack активно работает с XPath,  а так как я с ним раньше плотно не сталкивался - пришлось учить онлайн

соответственно, вот несколько полезных ресурсов
Примеры xpath-запросов к html
http://habrahabr.ru/post/114772/

XPath - вики
https://ru.wikipedia.org/wiki/XPath

XML Path Language (XPath) 2.1
http://www.w3.org/TR/xpath-21/

Язык XML Path (XPath) версия 1.0
http://citforum.ru/internet/xpath/index.shtml


Другие ссылки по теме

Html agility pack not loading url
http://stackoverflow.com/questions/19793291/html-agility-pack-not-loading-url

Parsing HTML with c#.net [duplicate]
http://stackoverflow.com/questions/6063203/parsing-html-with-c-net

C# library for parsing HTML?
http://softwarerecs.stackexchange.com/questions/10773/c-library-for-parsing-html

C# and HtmlAgilityPack encoding problem
http://stackoverflow.com/questions/3452343/c-sharp-and-htmlagilitypack-encoding-problem

How to Parse HTML using C#
http://www.codeproject.com/Tips/804660/How-to-Parse-HTML-using-Csharp


Распарсить HTML в .NET и выжить: анализ и сравнение библиотек
http://habrahabr.ru/post/273807/

суббота, 28 февраля 2015 г.

Битрикс чистка сайта (удаление ненужных файлов)

Ситуация

Сайт на Битриксе разросся до 17 ГБ и перестал "влазить" в параметры хостинга. Соответственно возникла необходимость Почистить сайт (удалить ненужные файлы).


Внимание! Рекомендации в этом посте применяйте на свой страх и риск. Даю без гарантий.

Что сделал

1. Чистка резервных копий

Удалил старые резервные копии через

Настройки\Инструменты\Резервное копирование\Список резервных копий

Это действие в моем случае помогло больше всего.

2. Чистка кеша

Почистил папки 
/bitrix/managed_cache/ 
/bitrix/cache/


Ссылки по теме

Проблема : Увеличивается объём занимаемого места в папке /bitrix/cache/
http://www.hcube.ru/support/faq/index2.php?ELEMENT_ID=3098

Если на хостинге закончилось место
http://dev.1c-bitrix.ru/community/blogs/howto/no-disk-space.php

Как уменьшить размер сайта на сервере? (битрикс 8.0.4)
http://dev.1c-bitrix.ru/community/forums/forum23/topic33413/

Мастер очистки сайта
http://marketplace.1c-bitrix.ua/solutions/acrit.cleanmaster/

Мастер очистки данных
https://dev.1c-bitrix.ru/learning/course/?COURSE_ID=48&LESSON_ID=2354

Чистка сайта от мусора и кеша
http://dev.1c-bitrix.ru/community/forums/forum6/topic39645/

Оптимизация размера сайта на платформе 1С-Битрикс
http://habrahabr.ru/sandbox/85103/

пятница, 6 февраля 2015 г.

C# разбор(чтение) Excel-файла без установленного Excel

Задача:
Разобрать(прочитать) Excel-файл на C#.

Решение должно использоваться в веб-приложении на сервере, соответственно, должно работать без установленного Excel.

Что помогло

Помогла библиотека Excel Data Reader

Суть: с помощью библиотеки можно сделать импорт экселя в дотнетовский датасет (DataSet),
а дальше уже работать в терминах .NET со строками/столбцами датасета.

Код получается примерно такой

FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read);

//1. Reading from a binary Excel file ('97-2003 format; *.xls)
IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
//...
//2. Reading from a OpenXml Excel file (2007 format; *.xlsx)
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
//...
//3. DataSet - The result of each spreadsheet will be created in the result.Tables
DataSet result = excelReader.AsDataSet();


Где взять

https://exceldatareader.codeplex.com/

Материалы по теме


ExcelDataReader
http://exceldatareader.codeplex.com/


Работа с Excel в C# без установленного Microsoft Office
http://it-student.com.ua/c/tips/rabota-s-excel-v-c-bez-ustanovlennogo-microsoft-office.html

NPOI Lib
http://www.leniel.net/2014/01/npoi-2.0-major-features-enhancements-series-of-posts-scheduled.html#sthash.mzVboJsi.dpbs

NPOI - ссылка для скачивания и примеры
http://npoi.codeplex.com/releases

NPOI Примеры
http://stackoverflow.com/questions/5855813/npoi-how-to-read-file-using-npoi



​Работа с COM сервером Excel
http://wladm.narod.ru/C_Sharp/comexcel.html#7

Объектная модель Excel с точки зрения разработчика под .NET
http://www.ishodniki.ru/art/art_progr/net/474.html


Excel средствами C#
http://petrachuk.ru/excel-by-csharp/

C# How To Read .xlsx Excel File With 3 Lines of Code
http://www.codeproject.com/Tips/801032/Csharp-How-To-Read-xlsx-Excel-File-With-Lines-of

Excel загрузка и выгрузка данных, используя OpenXML
http://habrahabr.ru/post/203522/

Koogra Excel BIFF/XLSX Reader Library
http://sourceforge.net/projects/koogra/

C# ExcelDataReader IndexOutOfRangeException error (trying to import Excel File)

Environment

VS 2013
Excel Data Reader library

Problem

I try to import excel file.

With code like this
FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read);

//1. Reading from a binary Excel file ('97-2003 format; *.xls)
IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
//...
//2. Reading from a OpenXml Excel file (2007 format; *.xlsx)
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
//...
//3. DataSet - The result of each spreadsheet will be created in the result.Tables
DataSet result = excelReader.AsDataSet();

I've got an exception
IndexOutOfRangeException
on some files.

Solution

What've I found out by experimental way: problem files was in old Excel 5-7 format.

"save as" problem files in "excel 97-2003" format and reimport them.

среда, 28 января 2015 г.

Joomla 3: управление пользователями через API (создание пользователя Joomla)

Задача

Возникла задача программного управления пользователями Joomla 3.

Решение

Начал изучать API Joomla + изучил ряд материалов по теме

В результате сделал набор тестовых файлов работы с пользователями


Архив содержит такие файлы

_joomla_inizialize.php - инициализация окружения Joomla
create_user.php - создание пользователя Joomla
delete_user.php - удаление пользователя Joomla
get_current_user.php - получение текущего пользователя Joomla
get_user_bycode.php - получение пользователя Joomla по коду
program_authorisation_user.php - программная авторизация пользователя Joomla


Материалы по теме


                Используем API CMS Joomla!
                http://joomfans.com/faq/ispolzuem-api-cms-joomla.html

                Two ways to add Joomla users using your custom code
                http://www.diademblogs.com/content-management-systems/two-ways-to-add-joomla-users-using-your-custom-code

                Accessing the current user object
                https://docs.joomla.org/Accessing_the_current_user_object​

                JFactory/getUser
                https://docs.joomla.org/JFactory/getUser

                JUser (joomla api)
                https://api.joomla.org/cms-3/classes/JUser.html#method_save

                How can I create a new Joomla user account from within a script?
                http://stackoverflow.com/questions/1904809/how-can-i-create-a-new-joomla-user-account-from-within-a-script

                JFactory/getUser - documentation
                https://docs.joomla.org/JFactory/getUser

                Использование метода getUser() в Joomla
                http://poleshuk.ru/ispolzovanie-metoda-getuser-v-joomla/

                Функция програмной авторизации в Joomla
                http://stackoverflow.com/questions/12959065/joomla-login-function

                Работа с обьектами базы Joomla
                http://stackoverflow.com/questions/21240910/how-to-work-with-joomla-database-object

                Программная авторизация в Joomla 2.5+
                http://inet-reklama.com/blog/joomla/programmnaya-avtorizatsiya-v-joomla-2-5

пятница, 23 января 2015 г.

MS SQL: Создание нового последовательного Guid в базе данных

База данных: MS SQL 2008
Возникла потребность при создании записи в таблице генерировать новый последовательный Guid. Причем генерировать на уровне базы данных.

К сожалению, newsequentialid() имеет ограничения: её можно использовать только в качетсве default-значения колонки. Соответственно пришлось прибегнуь к обходному маневру: создать свою хранимую процедуру

CREATE PROCEDURE dbo.GenerateNewSequentialId(
  @NewId uniqueidentifier output
)
AS 
BEGIN
  declare @returnid table (id uniqueidentifier default newsequentialid(), fakefield int)

  INSERT INTO @returnid(fakefield)
  VALUES(1)
    
  set @NewId =  (select top 1 id from @returnid)
END


Статьи по теме
MS SQL использование GUID как первичных ключей (Primary key)


четверг, 22 января 2015 г.

Что меня смущает в SCRUM

Перечитал несколько книг по методологиям SCRUM и Agile.
Методологии нравятся и я их стараюсь применять.
Какие-то применяю (парная разработка, пользовательские истории, итерационная разработка)
Какие-то принимаю, но еще не научился "правильно готовить" (test driven development, непрерывная интеграция)

Но есть 2 вещи, которые меня смущают

1. Ежедневные собрания
Это идет в разрез с большинством книг для управленца, где говорится:
собрания - способ потратить время, и не брать на себя ответственность,
чем меньше собраний - тем лучше.
А в скраме рекомендуются ежедневные собрания :(

2. Отсутствие персональной ответственности
Везде в книгах пишется: "за код отвечает команда".
А как тогда мотивировать выдающихся людей, как выяснять кто тянет команду вверх, а кто вниз?
С кого спрашивать за допущенные ошибки?
В книгах по менеджменту обычно говорится: "нет ответственного, считай что задача не будет выполнена"

Книги
Джонатан Расмуссон "Гибкое управление IT-проектам"
Майк Кон "Scrum. Гибкая разработка ПО"

Ссылки по теме

Scrum в одной картинке
https://image-store.slidesharecdn.com/671c33ed-13c8-41b3-a768-91e785debcfd-original.jpeg

Отзыв о книге: Джонатан Расмуссон "Гибкое управление IT-проектам"

Гибкое управление IT-проектами. Руководство для настоящих самураев от Расмуссон Джонатан - скачайте цифровую книгу Гибкое управление IT-проектами. Руководство для настоящих самураев в fb2, txt, pdf, epub, mobi и других форматах | ISBN 978-5-459-01205-7Гибкое управление IT-проектами. Руководство для настоящих самураев от Расмуссон Джонатан - скачайте цифровую книгу Гибкое управление IT-проектами. Руководство для настоящих самураев в fb2, txt, pdf, epub, mobi и других форматах | ISBN 978-5-459-01205-7

Прочитал достаточно быстро - понравилась. Пока, в моем рейтинге, первое место в номинации  "введение в Agile".

Автор прошелся по разделам Agile как организационным
  • подготовка проекта, планирование
  • работа на основе пользовательских историй
  • принципы общения с клиентами
  • управление итерациями
  • оформление рабочего пространства

так и практическим

  • тестирование
  • рефакторинг
  • интеграция


Книга вызывает ощущение "написано человеком для людей".

Мысли изложены доступно и, главное, идеи донесены ясно, а не запутаны между кучей ненужных абзацев.
Если кто-то хочет углубиться - в конце многих технических глав (по тестированию, рефакторингу, непрерывной интеграции) даны ссылки на более подробные книги/ресурсы по каждой теме.

Примеры в книге на C#, но их минимум и они простейшие. Это позволило книге сохранить универсальность и независимость от языка, поэтому она будет полезна как разработчикам на .NET так и на Java.

Автор видимо увлекается восточной философией, поэтому в книге некоторые мысли изложены в виде вставок "беседы с сенсеем". Также много отсылок к миру конг-фу, самураев и ниндзей. Это позволило материалу стать более "живым". Меня совсем не раздражало.

Читалась книга быстро и легко. Осилил за полторы недели неспешного чтения.

Цитата
Не забудьте о том, что смысл заключается не в том, чтобы быть гибким, а в том, чтобы писать высококлассные программы и оказывать клиенту безупречные услуги.

Моя оценка: 4 из 5
Для кого: разработчики практикующие или желающие практиковать Agile, менеджеры проектов, начинающие Agile-мастера
Стоит ли читать: да

Ссылки
Книга на Озоне
Книга на Литресе

пятница, 16 января 2015 г.

CHM файлы в Windows 8 (64 бит): не отображается содержимое

Ситуация

Закачал старые файлы помощи в формате CHM. Пытаюсь открыть в Windows 8 (64 бит).

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

Потом файл открывается, но содержимого не видно



Решение

Просто снял галочку "Показывать это сообщение" на окне с предупреждением о потенциально опасном содержимом.

Ссылки по теме


Windows 8 64bit can't open chm files
http://answers.microsoft.com/en-us/windows/forum/windows_8-files/windows-8-64bit-cant-open-chm-files/7dec5d51-f621-4753-ab13-ea3b59a07cb8

Read your old CHM files from network storage on Windows 8
http://tenbulls.co.uk/2014/02/11/read-your-old-chm-files-from-network-storage-on-windows-8/

Opening a CHM file produces: “navigation to the webpage was canceled”
http://stackoverflow.com/questions/11438634/opening-a-chm-file-produces-navigation-to-the-webpage-was-canceled


вторник, 6 января 2015 г.

Сохранение знаний о новых технологиях

Часто в проектах приходится применять новые технологии (модули/плагины/компоненеты/библиотеки),
чтобы он их не терять, рекомендую оставлять на корпортаивном портале оставлять заметку, освещающую 2 вопроса:
где скачать, с чего начать

тут в общем случае будет 1. ссылка на скачивание и 2. ссылка на обучающие материалы.

Потом, если технология приживется, можно будет расширять статьи, но с этих 2-х пунктов вполне можно стартовать.

Распределенные вычисления

Нашел несколько ссылок. сохранил здесь

Распределенные вычисления
Эх, ухнем! Распределенные вычисления вчера и сегодня
http://habrahabr.ru/company/intel/blog/165585/

продай время процессора и заработай
http://cloud.mql5.com/ru

От себя добавлю.
Ради интереса попробовал установить программу расчетов с cloud.mql5.ru.
Компьютер грузит на полную т.е. на рабочем компьютере использовать маловероятно.

Шаблон учетной системы: Настройки "по умолчанию"

(ВНИМАНИЕ! статья в работе! обратная связь принимается)


У настроек должно быть значение "по умолчанию". это должно обеспечить
возмоность использовать настройки более высокого уровня

Шаблон учетной системы: Удаление документов

(ВНИМАНИЕ! статья в работе! Обратная связь принимается)

Как удалять документы в учетной системе?
Или вопрос в общем виде: как удалять ОБЪЕКТЫ в учетной системе?

Обычный ответ: SQL-команда delete.

Но если вы делаете долгоживущую учетную систему, рекомендую задуматься о мягком удалении документов.

Суть: не давать обычному пользователю жестко удалить объект из системы.
Вместо удаления объект помечается удаленным.

Техническим языком можно описать так: у объекта добавляется реквизит: "удален".
Удаление документ интерпретируется как изменение объекта, а именно установка реквизита "удален"

Этот принцип реализован в 1С.

Какие объекты удалять мягко

Я бы рекомендовал мягко удалять все справочники и все документы.

О справочниках и документах см. в статье Шаблон учетной системы: основные виды объектов

Преимущества

В системе хранятся все объекты. Т.е. вы всегда сможете восстановить историю: кто удалял документ. Это основное преимущество больше относится к потребностям клиента/бизнеса, а не разработки, но бизнесу оно бывает очень важно и, если заложить мягкое удаление в архитектуру системы, вы сэкономите много времени в будущем.

Накладные расходы


Дополнительное поле
Во всех объектах системы, которые вы захотите мягко удалять, нужно будет внедрять признак удаления. Облегчить эту задачу можно с использованием базового объекта.
Эта методика описана в статье
Шаблон Учетной системы в БД: Наследование в базе

Ручное вмешательство в автогенерируемый код
обычно удаление придется переписывать, если вы пользуетесь средствами генерирующими шаблоны запросов. Команду удаления вам придется заменить на команду изменения.

Ориентировочный вид команды:

update (имя_объекта) set IsDeleted = 1

Скрытие удаленных объектов в выборках
Вам нужно отслеживать, чтобы в выборках по умолчанию не было удаленных объектов.



Шаблон Учетной системы в БД: Наследование в базе

(Внимание! статья находится в процессе написания)

В цикл статей Шаблон Учетной системы:

Тема
наследование в базе

Обычно в учетных системах возникает 2 вида основных объектов

  •   справочник
  •   документ

идея такая:

в ключевых объектах существует ряд реквизитов, общих для всех объектов системы это
  • Дата создания
  • Автор
  • Дата последнего изменения
  • Последний изменивший
  • Признак удаления
Для справочников обычно выделяются такие поля
  • код
  • название
Для документов список общих полей такой
  • дата/время операции
  • номер документа
  • состояние (отношение к проведению)
Если позволяют возможности БД  я бы рекомендовал использовать общую таблицу типа "Системный объект" или "Базовый объект" в которой дублировать записи о любом объекте системы.

Применить такую технику наиболее просто, если вы используете Уникальные идентификаторы в качестве ключевых полей.

Тема использования уникальных идентификаторов применительно к MS SQL раскрыта в статье
MS SQL использование GUID как первичных ключей (Primary key)

UPD

ПРОБЛЕМА ВИРТУАЛЬНОГО НАСЛЕДОВАНИЯ!


Все хорошо звучало в теории.

Когда начал реализовывать систему на практике столкнулся с такой проблемой:

Суть проблемы: СУБД ничего не знает о выдуманном нами наследовании :(

Детали

Есть 2 таблицы объект (к примеру заказ: DocOrder) и таблица предок (BaseObject).
Объект связан с предком связью 1 к 1 (первичный ключ в DocOrder = первичный ключ в BaseObject)
Общие поля объектов находятся в BaseObject. в общих полях в частности есть поле "изменивший пользователь".
И теперь на триггере объекта DocOrder не могу повесить проверку контроля прав. т.к. триггер срабатывает до появления записи в таблице-предке BaseObject с общими полями.

Не нашел пока элегантного способа решения этого вопроса.
А это неудобство сводит на нет преимущества новой модели.

Отзыв о книге: Райан Бенедетти "Изучаем работу с jQuery" (серия "Head First")

Книга "Изучаем работу с jQuery" Р. Бенедетти, Р. КрэнлиКнига "Изучаем работу с jQuery" Р. Бенедетти, Р. Крэнли (на Озоне)
Книга "Изучаем работу с jQuery" Р. Бенедетти, Р. Крэнли (на Литресе)




Простая книга для начинающих. Думаю - неплохой старт для изучения jQuery. Читается быстро (я осилил за неделю), понимается легко.

Принципиально понравился подход с оформлением издательства HeadFirst: код и рисунки прямо по тексту. Врезки прямо в исходниках.

Обратная сторона медали - упрощенная подача материала. Простіе примеры.

Рекомендую новичкам для вхождения в тему или более опытным для систематизаци знаний.

Краткое описание

    место jQuery в триединстве: HTML-CSS-JAVASCRIPT
    По сути утилитная библиотека в двух словах её можно описать как "выбирай и действуй"


    ВЫБОР

        Главная функция
        jQuery() => $()

        $('id|класс|хтмл тег в css нотации' или элменеты страницы)

        $(document).ready(function(){
        })

        $(this) - текущий элемент

        методы для обхода дерева DOM.

    ДЕЙСТВИЯ

        визуальные (css: сдвиг, прозрачность, изменение размеров)
        события на действия объектов
        Ajax-вызовы
        работа с jSON


    + расширяем jQuery UI

        это
          + элементы (календари, попапы, таб-шиты, аккордеоны, бегунки, и др.)
          + расширенная анимация
          + локализация и стилизация


Главы книги

    1. Знакомство с jQuery
    2. Селекторы и методы
    3. События и функции
    4. Операции со структурой страниц
    5. jQuery эффекты и анимация
    6. jQuery и JavaScript
    7. Пользовательские функции для пользовтаельских эффектов
    8. jQuery и Ajax
    9. Данные JSON
    10. jQuery UI
    11. jQuery и API

Моя оценка: 4 из 5
Стоит ли читать: да, если вы начинаете знакомство с jQuery

Ссылки

Книга "Изучаем работу с jQuery" Р. Бенедетти, Р. КрэнлиКнига "Изучаем работу с jQuery" Р. Бенедетти, Р. Крэнли (на Озоне)
Книга "Изучаем работу с jQuery" Р. Бенедетти, Р. Крэнли (на Литресе)


Отзыв о книге: Роберт Матрин "Принципы, паттерны и методики гибкой разработки на языке C#"

Книга "Принципы, паттерны и методики гибкой разработки на языке C#" Р. С. Мартин, М. Мартин - купить книгу Agile Principles, Patterns, and Practices in C# ISBN 978-5-93286-197-4Книга "Принципы, паттерны и методики гибкой разработки на языке C#" Р. С. Мартин, М. Мартин - купить книгу Agile Principles, Patterns, and Practices in C# ISBN 978-5-93286-197-4

Интересная книга.

Главы:

Принципы гибкой разработки: итерации, тесты, пары, отсутствие перегрузов
принципы проектирования​ (SRP, OCP, Принцип подстановки лисков, ISR, DIP)

Обзор доступным языком UML диаграмм (Диаграммы классов, Объектов, Последовательности, Состояний )

Основные паттерны (Команда, Шаблонный метод, Стратегия, Одиночка, Моносостояние, Нулл-объект)

Что понравилось

В одной книге освещены разные аспекты и SOLID и UML и гибкая разработка

Что странно:

Базы данных - почти пофигу. О некоторых вещах автор говорит: я не разобрался и вы не лезьте.


Моя оценка: 4 из 5
Стоит ли читать: да.

Плохие практики при работе с БД

1. Запрос "СЕЛЕКТ ЗВЁЗДОЧКА"

Запрос вида

"SELECT * ..."

Почему плохо: потому что это мина замедленного действия, которая может приветси к торможению при расширении модели БД.
Пример: была таблица из 2-х полей к которой мы применили запрос select * и реально нам для работы в конкретном сценарии нужно было только эти 2 поля.
Через 2 года модеь расширилась, таблица выросла до 20-ти полей, причем появились "длиннотекстовые" поля и блобы(картинки).
Этот же запрос, даже там, где дотстаточно было бы 2- полей теперь всегда выбирает 20.
как нужно: явно указывайте выбираемые поля через запятую. Используйте sql-менеджер для ускорения работы (Детали - у Луценко)

2. Обращение к полям в датасете по номеру.


Это тоже "бомба замедленного действия" , т.к. запрос и обращение к его полям могут быть визуально разделены в прграмме. И, если через год кто-то добавит в средину запроса новое поле (расширяя модель), то сразу нарушится порядок полей. И весь ваш код, в котором Вы обращаетесь к полю по номеру - рушится.
И хорошо, если ошибка видна сразу, а может же случиться, что одно поле переместится на место другого поля, такого-же типа, явной ошибки не будет, и система будет продолжать считать, только данные уже будут не те (например если из-за сдвига подменится поле "сумма заказа" на "сумма заказа со скидкой").
Кроме того очень ухудшается читаемость кода. Как например найти нужное поле в 20-ти строках присваивания вида

ДатаСет.Поле[1] = значение
ДатаСет.Поле[2] = значение
ДатаСет.Поле[3] = значение
...
ДатаСет.Поле[20] = значение


Как нужно: обращайтесь к полям по имени.

3. Формирование запроса в коде путем склеивания строк (подстановка параметров в виде текста)


почему плохо:
а) увеличивается риск получить простейшую ошибку, если вы подставляете в запрос строку, а в строке есть кавычка - она сломает ваш код.
б) увеличивается риск хакнуть систему путем sql injection (посмотрите в вики).
в) сложно отлаживать запрос, например если захотиете вытащить его из программы и проверить в скл-менеджере

как лучше: задавате запрос константной строкой. в общем случае используйте параметры. Если без текстовых вставок не обойтись - делайте в строке запроса шаблоны вида __TEMPLATE_NAME__ и заменяйте их функцией замены строки при формировании реального запроса. И, только в крайних случаях, склеивайте запрос как строку. 

Перегнать DVD в AVI

Оставлю пока здесь

перегнать DVD в AVI