<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xml:lang="en" xml:base="http://mobobe.com/wp-atom.php">
	<title type="text">MoBoBE</title>
	<subtitle type="text">Most boring blog evar</subtitle>

	<updated>2011-06-06T13:50:37Z</updated>

	<link rel="alternate" type="text/html" href="http://mobobe.com" />
	<id>http://mobobe.com/feed/atom/</id>
	

	<generator uri="http://wordpress.org/" version="3.3.2">WordPress</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/MoBoBE" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="mobobe" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">MoBoBE</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><entry>
		<author>
			<name>13xforever</name>
						<uri>http://mobobe.com/</uri>
					</author>
		<title type="html"><![CDATA[Ragnar&#246;k &#8211; тёмная тема для Visual Studio]]></title>
		<link rel="alternate" type="text/html" href="http://mobobe.com/2011/06/06/ragnark-dark-theme-for-visual-studio/" />
		<id>https://mobobe.com/?p=340</id>
		<updated>2011-06-06T13:50:37Z</updated>
		<published>2011-06-06T12:50:00Z</published>
		<category scheme="http://mobobe.com" term="Разработка" /><category scheme="http://mobobe.com" term="C#" /><category scheme="http://mobobe.com" term="css" /><category scheme="http://mobobe.com" term="html" /><category scheme="http://mobobe.com" term="javascript" /><category scheme="http://mobobe.com" term="theme" /><category scheme="http://mobobe.com" term="Visual Studio" /><category scheme="http://mobobe.com" term="xml" />		<summary type="html"><![CDATA[Как-то даже странно, что я до сих пор про неё не писал, ибо пользуюсь ею уже много лет. Но вот сегодня натолкнулся на новую многообещающую тему Dark Pastel и подумал, что пора 
За основу была взята одноимённая тема изначально опубликованная Томасом Рестрепо для Visual Studio 2005 и 2008. (У него  [...]]]></summary>
		<content type="html" xml:base="http://mobobe.com/2011/06/06/ragnark-dark-theme-for-visual-studio/"><![CDATA[<p style="text-align: justify;">Как-то даже странно, что я до сих пор про неё не писал, ибо пользуюсь ею уже много лет. Но вот сегодня натолкнулся на новую многообещающую тему <a rel="external" href="http://www.servicestack.net/mythz_blog/?p=729">Dark Pastel</a> и подумал, что пора <img class="wlEmoticon wlEmoticon-smile" style="border-style: none;" src="http://mobobe.com/wp-uploads/2011/06/wlEmoticonsmile.png" alt="Smile" /></p>
<p style="text-align: justify;">За основу была взята одноимённая тема изначально <a rel="external" href="http://winterdom.com/2007/10/ragnarokavs2005colorscheme">опубликованная</a> Томасом Рестрепо для Visual Studio 2005 и 2008. (У него есть и <a rel="external" href="http://winterdom.com/category/vs-color-scheme">другие темы</a>).</p>
<p style="text-align: justify;">К сожалению, я ещё не встречал популярных тем, включающих в себя раскраску токенов специфичных для Resharper’а, что очень быстро сводит на нет все попытки попробовать что-то отличное от стандартных настроек.<span id="more-340"></span></p>
<p style="text-align: justify;">Итак, скриншоты (Resharper 6.0 EAP с включенной подсветкой идентификаторов):</p>
<p style="text-align: justify;">C#</p>
<p style="text-align: justify;">
<a href="http://mobobe.com/wp-uploads/gallery/ragnarok-dark-theme-for-visual-studio/csharp.png" title="" class="fancybox" rel="singlepic11" >
	<img class="ngg-singlepic ngg-center" src="http://mobobe.com/wp-uploads/gallery/cache/11__600x783_csharp.png" alt="Пример кода на C#" title="Пример кода на C#" />
</a>
</p>

<a href="http://mobobe.com/wp-uploads/gallery/ragnarok-dark-theme-for-visual-studio/csharp2.png" title="" class="fancybox" rel="singlepic12" >
	<img class="ngg-singlepic ngg-center" src="http://mobobe.com/wp-uploads/gallery/cache/12__600x474_csharp2.png" alt="Пример кода на C#" title="Пример кода на C#" />
</a>

<p>HTML</p>

<a href="http://mobobe.com/wp-uploads/gallery/ragnarok-dark-theme-for-visual-studio/html.png" title="" class="fancybox" rel="singlepic13" >
	<img class="ngg-singlepic ngg-center" src="http://mobobe.com/wp-uploads/gallery/cache/13__600x255_html.png" alt="Пример кода HTML" title="Пример кода HTML" />
</a>

<p>Javascript</p>

<a href="http://mobobe.com/wp-uploads/gallery/ragnarok-dark-theme-for-visual-studio/js.png" title="" class="fancybox" rel="singlepic14" >
	<img class="ngg-singlepic ngg-center" src="http://mobobe.com/wp-uploads/gallery/cache/14__600x442_js.png" alt="Пример кода на Javascript" title="Пример кода на Javascript" />
</a>

<p>CSS</p>

<a href="http://mobobe.com/wp-uploads/gallery/ragnarok-dark-theme-for-visual-studio/css.png" title="" class="fancybox" rel="singlepic15" >
	<img class="ngg-singlepic ngg-center" src="http://mobobe.com/wp-uploads/gallery/cache/15__600x218_css.png" alt="Пример кода CSS" title="Пример кода CSS" />
</a>

<p>XML (web.config)</p>

<a href="http://mobobe.com/wp-uploads/gallery/ragnarok-dark-theme-for-visual-studio/xml.png" title="" class="fancybox" rel="singlepic16" >
	<img class="ngg-singlepic ngg-center" src="http://mobobe.com/wp-uploads/gallery/cache/16__600x274_xml.png" alt="Пример кода XML" title="Пример кода XML" />
</a>

<p>Ссылки на актуальные версии: <a href="http://dl.dropbox.com/u/2214201/VS%20Themes/Ragnar%C3%B6k_2010_with_resharper_5.0.vssettings">для VS2010</a>, <a href="http://dl.dropbox.com/u/2214201/VS%20Themes/Ragnar%C3%B6k_with_resharper.5.0.vssettings">для VS2008</a> (не все правки переносятся в старую версию).</p>
<p>Тема расчитана на Resharper 5.0+ с включенной опцией подсветки идентификаторов (с выключенной тоже работает замечательно).</p>
<p>PS: ещё есть очень занятный сайт, посвящённый как раз темам для Visual Studio: <a rel="external" href="http://studiostyl.es/">studiostyl.es</a>.</p>
]]></content>
		<link rel="replies" type="text/html" href="http://mobobe.com/2011/06/06/ragnark-dark-theme-for-visual-studio/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://mobobe.com/2011/06/06/ragnark-dark-theme-for-visual-studio/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>13xforever</name>
						<uri>http://mobobe.com/</uri>
					</author>
		<title type="html"><![CDATA[Обёртки над текстовыми командами в PowerShell]]></title>
		<link rel="alternate" type="text/html" href="http://mobobe.com/2010/12/04/text-command-wrapper-in-powershell/" />
		<id>https://mobobe.com/?p=333</id>
		<updated>2011-06-06T13:42:59Z</updated>
		<published>2010-12-04T08:45:19Z</published>
		<category scheme="http://mobobe.com" term="Windows" /><category scheme="http://mobobe.com" term="PowerShell" /><category scheme="http://mobobe.com" term="автоматизация" />		<summary type="html"><![CDATA[Хотел поделиться опытом создания простой объектно-ориентированной обёртки над обыкновенной консольной утилитой для облегчения работы с ней. Для примера была выбрана pnputil для работы с хранилищем дистрибутивов драйверов в Windows.
Стандартная процедура
Меня в первую очередь данная утилита  [...]]]></summary>
		<content type="html" xml:base="http://mobobe.com/2010/12/04/text-command-wrapper-in-powershell/"><![CDATA[<p style="text-align: justify;">Хотел поделиться опытом создания простой объектно-ориентированной обёртки над обыкновенной консольной утилитой для облегчения работы с ней. Для примера была выбрана <a rel="external" href="http://technet.microsoft.com/en-us/library/cc730875.aspx">pnputil</a> для работы с хранилищем дистрибутивов драйверов в Windows.<span id="more-333"></span></p>
<h4>Стандартная процедура</h4>
<p style="text-align: justify;">Меня в первую очередь данная утилита интересует как механизм удаления ненужных дистрибутивов драйверов (старые версии, более неиспользуемое оборудование и т.д.).</p>
<p style="text-align: justify;">Итак, получение списка всех дистрибутивов:</p>
<pre>C:\Windows\system32&gt;pnputil -e
Microsoft PnP Utility

Published name :            oem0.inf
Driver package provider :   Microsoft
Class :                     Printers
Driver date and version :   06/21/2006 6.1.7600.16385
Signer name :               Microsoft Windows

Published name :            oem1.inf
Driver package provider :   Logitech
Class :                     Universal Serial Bus controllers
Driver date and version :   11/04/2010 1.0.2.11
Signer name :               Microsoft Windows Hardware Compatibility Publisher

Published name :            oem2.inf
Driver package provider :   Creative
Class :                     Sound, video and game controllers
Driver date and version :   07/15/2008 6.0.01.1361
Signer name :

...</pre>
<p style="text-align: justify;">Далее, нужно найти в этом списке интересующие нас пакеты и удалить их, один за другим:</p>
<pre>C:\Windows\system32&gt;pnputil -d oem21.inf
Microsoft PnP Utility

Driver package deleted successfully.</pre>
<p style="text-align: justify;">Не самый удобный способ, не правда ли?</p>
<h4>Делаем обёртку</h4>
<p style="text-align: justify;">Для начала – получение списка:</p>
<pre class="prettyprint lang-ps">function Get-Driver
{
  $driverListRaw = $(pnputil -e)
  if ($driverListRaw.Length % 6 -ne 2) {throw "Invalid output from 'pnputil -e'"}
  $driverListRaw = $driverListRaw[1..$($driverListRaw.Length-2)]
  $objectCount = $driverListRaw.Length / 6
  for ($i=0; $i -lt $objectCount; $i++)
  {
    Write-Output $(Create-CustomDriverObject $driverListRaw[$($i*6)..$($i*6+5)])
  }
}</pre>
<p style="text-align: justify;">Теперь из текста хочется получить массив объектов (или Как создать свой объект в PowerShell):</p>
<pre class="prettyprint lang-ps">function Create-CustomDriverObject($arr)
{
  return New-Object System.Object | Select-Object -Property
            @{Name='PublishedName'; Expression={$arr[1].Split(':')[1].Trim()}},
            @{Name='DriverPackageProvider'; Expression={$arr[2].Split(':')[1].Trim()}},
            @{Name='Class'; Expression={$arr[3].Split(':')[1].Trim()}},
            @{Name='DriverDateAndVersion'; Expression={$arr[4].Split(':')[1].Trim()}},
            @{Name='SignerName'; Expression={$arr[5].Split(':')[1].Trim()}}
}</pre>
<p style="text-align: justify;">Ну и напоследок простенькая функция, которая будет уметь удалять указанный пакет:</p>
<pre class="prettyprint lang-ps">function Remove-Driver($driver)
{
  Write-Host $(pnputil -d $driver.PublishedName)
}</pre>
<p style="text-align: justify;">Вот и всё.</p>
<h4>Результат</h4>
<p style="text-align: justify;">Теперь мы можем творить всякие интересные вещи:</p>
<pre>PS C:\Windows\system32&gt; $allDrivers | where { $_.DriverPackageProvider -like '*nvidia*' -and $_.Class -like '*display ad
apter*' } | Format-Table -AutoSize -Property PublishedName,DriverPackageProvider,DriverDateAndVersion

PublishedName DriverPackageProvider DriverDateAndVersion
------------- --------------------- --------------------
oem1.inf      NVIDIA                07/14/2009 8.15.11.9038
oem21.inf     NVIDIA                08/17/2009 8.16.11.9062
oem42.inf     NVIDIA                11/20/2009 8.17.11.9562
oem60.inf     NVIDIA                03/15/2010 8.17.11.9713
oem36.inf     NVIDIA                09/27/2009 8.16.11.9107
oem81.inf     NVIDIA                06/07/2010 8.17.12.5721
oem58.inf     NVIDIA                01/11/2010 8.17.11.9621
oem76.inf     NVIDIA                04/03/2010 8.17.11.9745

PS C:\Windows\system32&gt; $allDrivers | where { $_.DriverPackageProvider -like '*ati tech*' -and $_.Class -like '*display
adapter*' } | Format-Table -AutoSize -Property PublishedName,DriverPackageProvider,DriverDateAndVersion

PublishedName DriverPackageProvider DriverDateAndVersion
------------- --------------------- --------------------
oem92.inf     ATI Technologies Inc. 08/03/2010 8.762.0.0000
oem75.inf     ATI Technologies Inc. 08/25/2010 8.771.0.0000
oem95.inf     ATI Technologies Inc. 09/28/2010 8.782.0.0000
oem79.inf     ATI Technologies Inc. 07/06/2010 8.753.0.0000</pre>
<p style="text-align: justify;">Например, одной строкой избавиться от всех (теперь уже ненужных) драйверов:</p>
<pre>PS C:\Windows\system32&gt; $driversToRemove = $allDrivers | where { $_.DriverPackageProvider -like '*nvidia*' -and $_.Class
 -like '*display adapter*' }
PS C:\Windows\system32&gt; $driversToRemove | %{ Remove-Driver $_ }
Microsoft PnP Utility  Driver package deleted successfully.
Microsoft PnP Utility  Driver package deleted successfully.
Microsoft PnP Utility  Driver package deleted successfully.
Microsoft PnP Utility  Driver package deleted successfully.
Microsoft PnP Utility  Driver package deleted successfully.
Microsoft PnP Utility  Driver package deleted successfully.
Microsoft PnP Utility  Driver package deleted successfully.
Microsoft PnP Utility  Driver package deleted successfully.</pre>
]]></content>
		<link rel="replies" type="text/html" href="http://mobobe.com/2010/12/04/text-command-wrapper-in-powershell/#comments" thr:count="2" />
		<link rel="replies" type="application/atom+xml" href="http://mobobe.com/2010/12/04/text-command-wrapper-in-powershell/feed/atom/" thr:count="2" />
		<thr:total>2</thr:total>
	</entry>
		<entry>
		<author>
			<name>13xforever</name>
						<uri>http://mobobe.com/</uri>
					</author>
		<title type="html"><![CDATA[PowerShell и систематизация файлов]]></title>
		<link rel="alternate" type="text/html" href="http://mobobe.com/2010/09/06/powershell-and-file-cataloging/" />
		<id>http://mobobe.com/?p=326</id>
		<updated>2010-09-05T19:16:22Z</updated>
		<published>2010-09-05T19:09:01Z</published>
		<category scheme="http://mobobe.com" term="Uncategorized" /><category scheme="http://mobobe.com" term="PowerShell" /><category scheme="http://mobobe.com" term="автоматизация" />		<summary type="html"><![CDATA[Дурацкое название, но что-то лучше ничего не придумалось.
Очень быстро покажу пару скриптов, которыми я постоянно пользуюсь для поддержания моей коллекции обоев с deviantArt в относительном порядке.
Для начала, хочется заметить, что в общем случае имя файла генерируется сервером в виде  [...]]]></summary>
		<content type="html" xml:base="http://mobobe.com/2010/09/06/powershell-and-file-cataloging/"><![CDATA[<p style="text-align: justify">Дурацкое название, но что-то лучше ничего не придумалось.</p>
<p style="text-align: justify">Очень быстро покажу пару скриптов, которыми я постоянно пользуюсь для поддержания моей коллекции обоев с <a href="http://deviantart.com" rel="external">deviantArt</a> в относительном порядке.</p>
<p style="text-align: justify">Для начала, хочется заметить, что в общем случае имя файла генерируется сервером в виде <code>my_picture_s_name_by_awesome_me.jpg</code>, т.е. название + by + имя пользователя, приведённое к виду, пригодному для сохранения в любой файловой системе.</p>
<p style="text-align: justify">Итак, хранятся все картинки в одной папке – новые в корне, старые – рассортированные по авторам. От скрипта требуется умение автоматически распихивать файлы заданного вида по папкам. Решается тривиально (скрипт был написан очень давно, когда v1.0 только-только вышла и я ещё почти ничего о нём не знал):</p>
<pre class="prettyprint lang-ps">$files = Get-ChildItem -Filter &quot;*_by_*.???&quot; | where {$_.GetType() -eq [System.IO.FileInfo]}
$myRegEx = New-Object System.Text.RegularExpressions.Regex('.+_by_(.+)\..{3}', [System.Text.RegularExpressions.RegexOptions]::IgnoreCase)
foreach ($f in $files) {
	$dir = Join-Path $f.Directory $myRegEx.Split($f.Name)[1]
	$destination = Join-Path $dir $f.Name
	if (-not (Test-Path $dir)) { New-Item -ItemType Directory -Path $dir | Out-Null }
	Move-Item -Path $f.FullName -Destination $destination -Force
}</pre>
<p style="text-align: justify">Второй скрипт пришлось придумать только что, поскольку буквально на прошлой неделе к некоторым файлам зачем-то стали приписывать некий набор символов. Пока что я не знаю, зачем он нужен и какой у него формат, эмпирически же известно, что это семисимвольный довесок, начинающийся на <code>d2x</code> или <code>d2y</code>. Пока что будем его обрезать:</p>
<pre class="prettyprint lang-ps">ls | where {$_.FullName -Match '.+\-[a-z0-9]{7}\.[a-z]{3,4}'} |
ren -NewName {$_.FullName -Replace '(.+)(\-[a-z0-9]{7})(\.[a-z]{3,4})','$1$3'}</pre>
]]></content>
		<link rel="replies" type="text/html" href="http://mobobe.com/2010/09/06/powershell-and-file-cataloging/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://mobobe.com/2010/09/06/powershell-and-file-cataloging/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>13xforever</name>
						<uri>http://mobobe.com/</uri>
					</author>
		<title type="html"><![CDATA[RavenDB, dynamic и Excel]]></title>
		<link rel="alternate" type="text/html" href="http://mobobe.com/2010/07/24/ravendb-dynamic-and-excel/" />
		<id>http://mobobe.com/?p=297</id>
		<updated>2010-07-26T09:04:32Z</updated>
		<published>2010-07-24T11:35:06Z</published>
		<category scheme="http://mobobe.com" term="Разработка" /><category scheme="http://mobobe.com" term=".NET" /><category scheme="http://mobobe.com" term="C#" /><category scheme="http://mobobe.com" term="NoSQL" /><category scheme="http://mobobe.com" term="руководство" />		<summary type="html"><![CDATA[Интро
Уже давно хотелось пощупать главное нововведение .NET 4 – DLR, да и RavenDB выглядит очень аппетитным, а собранные вместе в одном месте дают возможность реализовать очень интересные штуки. Да и на чём потренироваться у меня есть – мой список дисков, который я веду в Excel. Давно уже хочется  [...]]]></summary>
		<content type="html" xml:base="http://mobobe.com/2010/07/24/ravendb-dynamic-and-excel/"><![CDATA[<h2>Интро</h2>
<p style="text-align: justify;">Уже давно хотелось пощупать главное нововведение .NET 4 – DLR, да и <a rel="external" href="http://ravendb.net/">RavenDB</a> выглядит очень аппетитным, а собранные вместе в одном месте дают возможность реализовать очень интересные штуки. Да и на чём потренироваться у меня есть – мой <a href="http://dl.dropbox.com/u/2214201/CDDB.xlsx">список дисков</a>, который я веду в Excel. Давно уже хочется отказаться от таблиц и использовать что-то более гибкое.</p>
<p style="text-align: justify;">Итак, далее последует примерный конспект моих мытарств в освоении всего нового, а именно – как работать с приложениями MS Office напрямую, основы использования динамических объектов и работа с RavenDB. На всякий случай, я использовал MS Office 2010 RTM x64, Visual Studio 2010 RTM и RavenDB build 101 (начал я с 100, но там был баг с загрузкой индексов).</p>
<h2>Как оседлать Excel</h2>
<p style="text-align: justify;">Итак, как же нам получить все интересующие на данные из исходного файлика в формате <code>xlsx</code>? Побродив немного по MSDN и форумам, я заметил два основных подхода: работа как с БД через Jet OLE DB (<a rel="external" href="http://www.codeproject.com/KB/office/excel_using_oledb.aspx">пример на CodeProject</a>), либо напрямую через компоненты автоматизации (COM-объекты).</p>
<p style="text-align: justify;">Поскольку у меня много мета-информации хранится в комментариях к ячейкам, первый вариант отпадает сразу. Второй вариант тоже не сахар, ибо работа с COM – не самое благодарное занятие.</p>
<h3>Компонентная модель</h3>
<p style="text-align: justify;">Итак, работаем с COM. Очень поверхностно, работа заключается в создании объекта нужного приложения (в моём случае – Excel), открытия интересующего нас файла и последующего взаимодействия с этим самым файлом. Самое главное – не забыть потом всё это закрыть (и нет, <code>using</code> здесь не помощник).</p>
<pre class="prettyprint lang-cs">using Microsoft.Office.Interop.Excel;
&lt;...&gt;
private static void Main()
{
	var excel = new Application();
	try
	{
		Workbook workbook = excel.Workbooks.Open("CDDB.xlsx", ReadOnly: true, Editable: false);
		Worksheet sheet = workbook.Sheets["Игры"];
		foreach (Range row in sheet.Rows)
		{
			var objetToStore = GameConverter(row.Cells);
			&lt;...&gt;
		}
		workbook.Close();
	}
	finally
	{
		excel.Quit();
	}
}</pre>
<p style="text-align: justify;">Для сравнения, вот как выглядело открытие файла раньше:</p>
<pre  class="prettyprint lang-cs">Workbook workbook = excel.Workbooks.Open("CDDB.xlsx", null, true, null, null, null, null, null, null, false, null, null, null, null, null);</pre>
<h3>Достаём данные</h3>
<p style="text-align: justify;">Собственно, обработка данных. В данном примере функция <code>GameConverter</code> принимает одну строку-запись из файла и конвертирует её в некий объект, который будет более наглядно отражать её суть. И тут возникает вопрос, – как это сделать. Лично мне в данном случае не хотелось привязываться к какой-то конкретной объектной модели, поэтому первое, что пришло в голову – использовать анонимные объекты.</p>
<pre class="prettyprint lang-cs">private static object GameConverter(dynamic gameRow)
{
	return new
	{
		type = "game",
		title = new
		{
			localized = GetField(gameRow, 1),
			original = GetField(gameRow, 2),
		},
		publisher = GetField(gameRow, 3),
		disks = GetField(gameRow, 4),
		architecture = GetField(gameRow, 5),
		media = GetField(gameRow, 6),
		protection = GetField(gameRow, 7),
		language = GetField(gameRow, 8),
		shippedVersion = GetField(gameRow, 9),
		latestPatch = GetField(gameRow, 10),
		borrowedBy = GetField(gameRow, 11),
		purchaseDate = GetField(gameRow, 12),
		price = GetField(gameRow, 13),
	};
}

private static object GetField(dynamic row, int idx)
{
	return new { value = row[idx].Value2, comment = GetComment(row[idx].Comment) };
}

private static string GetComment(dynamic cell)
{
	return cell == null ? null : cell.Shape.AlternativeText;
}</pre>
<p style="text-align: justify;">Хм… выглядит неплохо, но смущает явный копипаст. Ну да ладно, пока что сойдёт. Самое главное – уже сейчас видны преимущества использования динамических объектов, ибо я так и не разобрался, как же просто можно обратиться к полям с данными (что к чему надо кастовать на каком шаге), даже зная, как называются интересующие меня поля.</p>
<p style="text-align: justify;">После прогона с отладчиком, видно, что объект формируется как надо:</p>
<p style="text-align: justify;"><img class="wlDisabledImage" style="display: inline; border-width: 0px;" title="Наш анонимный объект в отладчике" src="http://mobobe.com/wp-uploads/2010/07/1_anonymous_obj.png" alt="Наш анонимный объект в отладчике" width="587" height="343" /></p>
<h2>Работа с RavenDB</h2>
<p style="text-align: justify;">Сначала, почему RavenDB? Потому что это объектное хранилище, да к тому же написанное на .NET для .NET. Идеальный вариант. Работать с ним проще простого: запускаем сервер, инициализируем клиент, подключаемся, работаем.</p>
<pre class="prettyprint lang-cs">using Raven.Client;
using Raven.Client.Document;
using Raven.Database.Data;
&lt;...&gt;
private static void Main()
{
&lt;...&gt;
		using (IDocumentStore store = new DocumentStore {Url = "http://localhost:8080/", Credentials = CredentialCache.DefaultNetworkCredentials}.Initialize())
		using (IDocumentSession session = store.OpenSession())
		{
			Worksheet sheet = workbook.Sheets["Игры"];
			foreach (Range row in sheet.Rows)
			{
				var o = GameConverter(row.Cells);
				session.Store(o);
			}
			session.SaveChanges();
		}
&lt;...&gt;
}</pre>
<p style="text-align: justify;">Вроде бы всё просто: делаем объекты, пихаем их в базу. Но что это? Падение при попытке сохранить первый же объект?</p>
<p style="text-align: justify;"><img class="wlDisabledImage" style="display: inline; border-width: 0px;" title="2_exception" src="http://mobobe.com/wp-uploads/2010/07/2_exception.png" alt="2_exception" width="563" height="364" /></p>
<p style="text-align: justify;">Хм… раз мы не управляем генерацией идентификаторов объектов вручную, RavenDB пытается генерировать их сам на основе имени класса сохраняемого объекта и у нашего анонимного типа оно несколько длинновато. Выхода два: делать дополнительную работу по генерации идентификаторов объектов, либо генерировать объект по-другому. Поскольку лень – двигатель прогресса, мы пойдём вторым путём.</p>
<h3>Как очистить базу</h3>
<p style="text-align: justify;">Самым неожиданным моментом было обнаружить, что вот так просто нельзя дропнуть всю БД и начать с нового листа. Возможно, есть способ и попроще, но самый простой выход, до которого дошёл я, – это создать индекс, возвращающий все документы, а потом вызвать метод массового удаления, используя этот самый индекс.</p>
<pre class="prettyprint lang-cs">private static void InitDb(IDocumentStore store)
{
	try
	{
		store.DatabaseCommands.GetIndex("AllDocuments");
	}
	catch (InvalidOperationException)
	{
		store.DatabaseCommands.PutIndex("AllDocuments", new IndexDefinition {Map = "from doc in docs select new {doc}"});
	}
	store.DatabaseCommands.DeleteByIndex("AllDocuments", new IndexQuery {PageSize = int.MaxValue}, false);
}</pre>
<p style="text-align: justify;">Конечно, чтобы удалить <strong>все</strong> документы, придётся сначала дождаться полной индексации и, возможно, более корректно обрабатывать paging, но для прототипа сойдёт и так.</p>
<h3>Как создавать объекты. Попытка №2</h3>
<p style="text-align: justify;">Да, анонимные объекты хороши не всегда. Следующий логичный шаг – создание объектной модели. Ничего особенно умного, просто разбить наш анонимный класс на подклассы и дать им имена.</p>
<pre class="prettyprint lang-cs">private class Field
{
	public dynamic value;
	public string comment;
}
private class Title
{
	public Field localized;
	public Field original;
}

private class Game
{
	public string type;
	public Title title;
	public Field publisher;
	public Field disks;
	public Field architecture;
	public Field media;
	public Field protection;
	public Field language;
	public Field shippedVersion;
	public Field latestPatch;
	public Field borrowedBy;
	public Field purchaseDate;
	public Field price;
}</pre>
<p style="text-align: justify;">Вот, теперь всё работает.</p>
<pre class="prettyprint lang-js">{
	"type":"game",
	"title":{
		"localized":{
			"value":"Fate/stay night",
			"comment":null
		},
		"original":{
			"value":"フェイト／ステイナイト",
			"comment":"FEITO / SUTEI NAITO"
		}
	},
	"publisher":{
		"value":"Type-Moon",
		"comment":null
	},
	"disks":{
		"value":1,
		"comment":null
	},
	"architecture":{
		"value":"PC",
		"comment":null
	},
	"media":{
		"value":"DVD",
		"comment":null
	},
	"protection":{
		"value":"CD",
		"comment":null
	},
	"language":{
		"value":"я",
		"comment":"есть патч англификации"
	},
	"shippedVersion":{
		"value":null,
		"comment":null
	},
	"latestPatch":{
		"value":null,
		"comment":null
	},
	"borrowedBy":{
		"value":null,
		"comment":null
	},
	"purchaseDate":{
		"value":39764,
		"comment":null
	},
	"price":{
		"value":2559.05,
		"comment":null
	}
}</pre>
<p style="text-align: justify;">Только что-то как-то слишком много лишнего. Сплошные <code>null</code>’ы. Что-то мне подсказывает, что этого можно избежать, а ключ лежит в использовании DLR и конструировании объектов по мере надобности.</p>
<h3>Как создавать объекты в runtime</h3>
<p style="text-align: justify;">Итак, ExpandoObject. Новый класс, призванный в паре с <code>dynamic</code> дать разработчиком большую гибкость по работе с объектами во время выполнения программы. Вещь, доступная в таких языках, как Python, Ruby, JavaScript, PowerShell и прочих. Нас же интересует добавление новых полей по мере надобности.</p>
<pre class="prettyprint lang-cs">private static dynamic GameConverter(dynamic gameRow)
{
	dynamic game = new ExpandoObject();
	game.type = "game";
	game.title = new ExpandoObject();
	dynamic field = GetField(gameRow, 1);
	if (field != null) game.title.localized = field;
	field = GetField(gameRow, 2);
	if (field != null) game.title.original = field;
	field = GetField(gameRow, 3);
	if (field != null) game.publisher = field;
	field = GetField(gameRow, 4);
	if (field != null) game.disks = field;

	&lt;...&gt;

	return game;
}

private static dynamic GetField(dynamic row, int idx)
{
	dynamic value = row[idx].Value2;
	if (value == null || value.ToString().Trim() == "") return null;

	dynamic field = new ExpandoObject();
	field.value = value;
	dynamic comment = GetComment(row[idx].Comment);
	if (comment != null) field.comment = comment;
	return field;
}

private static string GetComment(dynamic cell)
{
	return cell == null ? null : cell.Shape.AlternativeText;
}</pre>
<p style="text-align: justify;">Запускаем. И… это именно то, что надо <img src='http://mobobe.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<pre class="prettyprint lang-js">{
	"type":"game",
	"title":{
		"localized":{
			"value":"Fate/stay night"
		},
		"original":{
			"value":"フェイト／ステイナイト",
			"comment":"Подпись: FEITO / SUTEI NAITO"
		}
	},
	"publisher":{
		"value":"Type-Moon"
	},
	"disks":{
		"value":1
	},
	"architecture":{
		"value":"PC"
	},
	"media":{
		"value":"DVD"
	},
	"protection":{
		"value":"CD"
	},
	"language":{
		"value":"я",
		"comment":"Подпись: есть патч англификации для 2 из 3 путей"
	},
	"purchaseDate":{
		"value":39764
	},
	"price":{
		"value":2559.05
	},
	"Id":"expandoobjects/15"
}</pre>
<p style="text-align: justify;">Только вот смотрю я на весь этот копипаст и кажется, что можно это дело улучшить. Глянем в <a rel="external" href="http://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject.aspx">MSDN</a>, ага, так и есть – ExpandoObject реализует интерфейс IDictionary. Отлично!</p>
<pre class="prettyprint lang-cs">private static dynamic GameConverter(dynamic gameRow)
{
	dynamic game = new ExpandoObject();
	game.type = "game";
	game.title = new ExpandoObject();
	AppendFieldIfNotNull(game.title, "localized", GetField(gameRow, 1));
	AppendFieldIfNotNull(game.title, "original", GetField(gameRow, 2));
	var fields = new[]
	             	{
	             		"publisher",
	             		"disks",
	             		"architecture",
	             		"media",
	             		"protection",
	             		"language",
	             		"shippedVersion",
	             		"latestPatch",
	             		"borrowedBy",
	             		"purchaseDate",
	             		"price"
	             	};
	for (int i = 3; i &lt; 14; i++)
		AppendFieldIfNotNull(game, fields[i - 3], GetField(gameRow, i));
	return game;
}

private static void AppendFieldIfNotNull(ExpandoObject obj, string field, dynamic value)
{
	if (value == null) return;
	if (value.ToString().Trim() == "") return;

	// ReSharper disable RedundantCast
	(obj as IDictionary&lt;string, object&gt;) = value;
	// ReSharper restore RedundantCast
}</pre>
<p style="text-align: justify;">Здесь, кстати, нашёлся <a rel="external" href="http://youtrack.jetbrains.net/issue/RSRP-186603">небольшой баг</a> в <a rel="external" href="http://www.jetbrains.com/resharper/">решарпере</a> (кстати, буквально за день до этого я нашёл <a rel="external" href="https://connect.microsoft.com/VisualStudio/feedback/details/576053/c-compiler-4-crash">другой баг</a> – в компиляторе c#, который был гораздо неприятней).</p>
<p style="text-align: justify;">Дальнейшая работа уже не так интересна – написание однотипных конвертеров для каждой страницы, перенос дополнительной мета-информации (цвет записи), правильное конвертирование данных (даты) и перенос сортировок в виде индексов, но в этом уже нет ничего нового.</p>
]]></content>
		<link rel="replies" type="text/html" href="http://mobobe.com/2010/07/24/ravendb-dynamic-and-excel/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://mobobe.com/2010/07/24/ravendb-dynamic-and-excel/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>13xforever</name>
						<uri>http://mobobe.com/</uri>
					</author>
		<title type="html"><![CDATA[Firefox 4]]></title>
		<link rel="alternate" type="text/html" href="http://mobobe.com/2010/07/04/firefox-4/" />
		<id>https://mobobe.com/?p=271</id>
		<updated>2010-07-04T10:37:11Z</updated>
		<published>2010-07-04T09:36:23Z</published>
		<category scheme="http://mobobe.com" term="Uncategorized" /><category scheme="http://mobobe.com" term="firefox" />		<summary type="html"><![CDATA[Последние полнедели я живу с ночной сборкой того, что к концу года выйдет под именем Firefox 4. Поскольку буквально на днях должен состояться релиз первой публичной беты, я решился перейти на ночные сборки вместо стабильной версии. Пара багов и неработающих функций то тут, то там меня не особенно  [...]]]></summary>
		<content type="html" xml:base="http://mobobe.com/2010/07/04/firefox-4/"><![CDATA[<p style="text-align: justify">Последние полнедели я живу с ночной сборкой того, что к концу года выйдет под именем Firefox 4. Поскольку буквально на днях должен состояться релиз первой публичной беты, я решился перейти на ночные сборки вместо стабильной версии. Пара багов и неработающих функций то тут, то там меня не особенно пугает, а общее впечатление уже сейчас очень положительное.</p>
<p style="text-align: justify">Про все новые поддерживаемые стандарты и технологии писали уже неоднократно, да и мне сейчас гораздо важнее совсем другое – нововведения, делающие жизнь конечного пользователя комфортней.</p>
<p style="text-align: justify">Итак, первое, что бросается в глаза – скорость. Скорость загрузки, отрисовки страниц (в т.ч. при прокручивании), сложных веб-приложений, использующих JavaScript. Несмотря на то, что код только-только дорос до более-менее стабильного состояния, уже сейчас заметна разница в старте приложения по сравнению с текущей стабильной веткой. Конечно, до Chrome ещё далеко, но по крайней мере, уже не возникает раздражения при постоянном пользовании программы (и это с учётом того, что у меня стоит множество расширений для Firefox).</p>
<p style="text-align: justify">Второе – то, что я ждал больше всего – новый интерфейс.</p>
<div style="text-align: center">
<div class="ngg-galleryoverview" id="ngg-gallery-5-271">


	
	<!-- Thumbnails -->
		
	<div id="ngg-image-10" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://mobobe.com/wp-uploads/gallery/firefox4/firefox4.png" title=" " class="fancybox" rel="set_5" >
								<img title="firefox4" alt="firefox4" src="http://mobobe.com/wp-uploads/gallery/firefox4/thumbs/thumbs_firefox4.png" width="600" height="295" />
							</a>
		</div>
	</div>
	
		
 	 	
	<!-- Pagination -->
 	<div class='ngg-clear'></div>
 	
</div>

</div>
<p style="text-align: justify">Его сильно переработали и теперь он очень хорошо вписывается в окружение Windows 7. Aero Galss, Aero Peek (хотя всё ещё используется один процесс <img src='http://mobobe.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> ), закладки сверку, аппаратное ускорение отрисовки примитивов, использование DirectWrite для типографики… Это просто сказка какая-то <img src='http://mobobe.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: justify">Конечно, даже с учётом того, что сборка довольно стабильная, проблем всё же слишком много для использования обычным пользователем: изменившаяся система расширений ломает большинство из них, аппаратное ускорение работает не всегда (и иногда делает невозможным просмотр некоторых страниц, как говорят), бывают проблемы с отрисовкой самого интерфейса, временные затыки при долгой работе, настройки интерфейса не сохраняются при закрытии и т.д. и т.п.</p>
<p style="text-align: justify">Ещё не все нововведения, анонсированные для 4й версии реализованы, что несколько расстраивает. Так, главная кнопка приложения попала в транк лишь пару недель назад (а переехала на положенное место и того позже). Кнопки Обновить/Отменить всё ещё отдельные, как в прототипах для 3.7 (а не интегрированы в адресную строку). Закладки для веб-приложений тоже ещё не реализованы (а я уже так привык к ним, когда пользовался прототипом на предыдущих версиях). Менеджер аккаунтов тоже ещё не готов (сейчас он ничем не отличается от предыдущих версий). Новый менеджер расширений готов лишь на половину (совсем нет страницы поиска, процесс установки/обновления никак не показывается). Ну и т.д. и т.п.</p>
<p style="text-align: justify">Но лично для меня – стабильная работа (пока ещё ни одного вылета), DirectWrite и новый интерфейс вполне достаточны, чтобы пребывать в восторге и пользоваться сырым продуктом на постоянной основе.</p>
]]></content>
		<link rel="replies" type="text/html" href="http://mobobe.com/2010/07/04/firefox-4/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://mobobe.com/2010/07/04/firefox-4/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>13xforever</name>
						<uri>http://mobobe.com/</uri>
					</author>
		<title type="html"><![CDATA[Чудо, что зовётся AdBlock]]></title>
		<link rel="alternate" type="text/html" href="http://mobobe.com/2010/06/23/wonderthing-adblock/" />
		<id>https://mobobe.com/2010/06/23/%d1%87%d1%83%d0%b4%d0%be-%d1%87%d1%82%d0%be-%d0%b7%d0%be%d0%b2%d1%91%d1%82%d1%81%d1%8f-adblock/</id>
		<updated>2010-07-03T12:28:00Z</updated>
		<published>2010-06-23T11:04:39Z</published>
		<category scheme="http://mobobe.com" term="Разработка" /><category scheme="http://mobobe.com" term="css" /><category scheme="http://mobobe.com" term="firefox" />		<summary type="html"><![CDATA[Думается, что все более-менее “продвинутые” пользователи знают, что одним из первых расширений для Firefox стоит ставить AdBlock Plus. Все знают, что парой щелчков мыши (добавлением подписки) можно избавить себя от подавляющего большинства рекламы в сети. Причём, в любом её проявлении.
Естественно,  [...]]]></summary>
		<content type="html" xml:base="http://mobobe.com/2010/06/23/wonderthing-adblock/"><![CDATA[<p style="text-align: justify">Думается, что все более-менее “продвинутые” пользователи знают, что одним из первых расширений для Firefox стоит ставить <a href="https://addons.mozilla.org/firefox/addon/1865" rel="external">AdBlock Plus</a>. Все знают, что парой щелчков мыши (добавлением подписки) можно избавить себя от подавляющего большинства рекламы в сети. Причём, в любом её проявлении.</p>
<p style="text-align: justify">Естественно, нельзя сделать абсолютно универсальный инструмент, поэтому иногда придётся дотачивать его под себя. Обычно, это сводится к добавлению простеньких правил для блокирования URL определённого вида, но иногда этого недостаточно.</p>
<p style="text-align: justify">И вот здесь большинство пользователей сдаётся. Мало кто догадывается, знает и тем более использует расширенные возможности по блокированию и скрытию контента. Особенно мне хочется остановиться на скрытии элементов с помощью CSS-селекторов.</p>
<p style="text-align: justify">Зачем это надо? Например, иногда бывает проще скрыть элемент, в котором показывается реклама, чем блокировать сотню ссылок, откуда она подтягивается. Или чтобы подправить вид сайта после отсекания некоторых элементов дизайна xD</p>
<p style="text-align: justify">Для примера, возьмём всеми [не]любимый <a href="http://bash.org.ru/" rel="external">bash.org.ru</a>. Вот как он выглядит в девственном виде, как его задумали создатели:</p>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Вот так сайт видят пользователи IE" alt="Вот так сайт видят пользователи IE" src="http://mobobe.com/wp-uploads/2010/06/1noadblock.png" width="760" height="359" /></p>
<p style="text-align: justify">А вот так после включения AdBlock со стандартными правилами:</p>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="А так видят сайт большинство пользователей Firefox" alt="А так видят сайт большинство пользователей Firefox" src="http://mobobe.com/wp-uploads/2010/06/2stdadblock.png" width="760" height="228" /></p>
<p style="text-align: justify">Не очень эстетично, правда? А если мы нажмём [Ctrl]+[Shift]+[E] и добавим новое правило скрытия элементов вида <code class="prettyprint lang-css">bash.org.ru##div.q&gt;div:first-child:not(.vote)</code>, то в результате увидим вот это:</p>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="А вот так видят этот сайт... педанты" alt="А вот так видят этот сайт... педанты" src="http://mobobe.com/wp-uploads/2010/06/3advadblock.png" width="760" height="180" /></p>
<p style="text-align: justify">Вот ещё несколько полезных примеров:</p>
<pre style="text-align: left" class="prettyprint lang-css">icanhascheezburger.com##div#toprightad
icanhascheezburger.com##div#rightskyad
icanhascheezburger.com##div#leftcolumnad

mail.ru##div.rb_body
mail.ru##div.mf_smsTop

iphones.ru##div.rc10
iphones.ru##div#sidebar&gt;noindex:last-of-type
iphones.ru##div#sidebar&gt;noindex:nth-of-type(2)

rutracker.org##div[id^=&quot;bn-&quot;]
rutracker.org##div.tCenter

urod.ru##a[href^=&quot;http://loadpartners.com&quot;]
r.radikal.ru##embed#id_flbaner
exler.ru##td#Counter
exler.ru##div[id^="Banner"]

membrana.ru##body&gt;table&gt;tbody&gt;tr&gt;td&gt;table+table
umap.ru##td.column-right&gt;div:nth-of-type(3)

##div.item-body&gt;div&gt;a[href*=&quot;d.techcrunch.com/ck.php&quot;]&gt;img</pre>
<p style="text-align: justify">Особенно радует, что использовать можно практически все возможности, <a href="http://www.w3.org/TR/css3-selectors/" rel="external">предоставляемые CSS3</a>. Подробности – в <a href="http://adblockplus.org/en/filters#elemhide" rel="external">документации по AdBlock</a>.</p>
]]></content>
		<link rel="replies" type="text/html" href="http://mobobe.com/2010/06/23/wonderthing-adblock/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://mobobe.com/2010/06/23/wonderthing-adblock/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>13xforever</name>
						<uri>http://mobobe.com/</uri>
					</author>
		<title type="html"><![CDATA[Office Live]]></title>
		<link rel="alternate" type="text/html" href="http://mobobe.com/2010/06/08/office-live/" />
		<id>http://mobobe.com/2010/06/08/office-live/</id>
		<updated>2010-07-03T12:24:38Z</updated>
		<published>2010-06-08T09:26:20Z</published>
		<category scheme="http://mobobe.com" term="Интернационализация" /><category scheme="http://mobobe.com" term="Япония" /><category scheme="http://mobobe.com" term="японский язык" />		<summary type="html"><![CDATA[Ура, товарищи! Чудо свершилось и буквально только что Office Live стал доступен для использования.
К сожалению, все мои опасения по поводу ограниченности функционала для работы с японскими текстами (из того, что мне больше всего нужно) подтвердились.  

Как видно, просмотр всё так же хорош, как и  [...]]]></summary>
		<content type="html" xml:base="http://mobobe.com/2010/06/08/office-live/"><![CDATA[<p style="text-align: justify">Ура, товарищи! Чудо свершилось и буквально только что <a href="http://office.live.com/" rel="external">Office Live</a> стал <a href="http://windowsteamblog.com/windows_live/b/windowslive/archive/2010/06/07/office-is-now-live-on-skydrive.aspx" rel="external">доступен для использования</a>.</p>
<p style="text-align: justify">К сожалению, все мои опасения по поводу ограниченности функционала для работы с японскими текстами (из того, что мне больше всего нужно) подтвердились. <img src='http://mobobe.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p style="text-align: center"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Просмотр - хорош; редактирование - так себе" alt="Просмотр - хорош; редактирование - так себе" src="http://mobobe.com/wp-uploads/2010/06/office_live_view_vs_edit.png" width="616" height="529" /></p>
<p style="text-align: justify">Как видно, просмотр всё так же хорош, как и раньше, а вот создавать новые (или редактировать уже существующие) документы – нельзя <img src='http://mobobe.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
]]></content>
		<link rel="replies" type="text/html" href="http://mobobe.com/2010/06/08/office-live/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://mobobe.com/2010/06/08/office-live/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>13xforever</name>
						<uri>http://mobobe.com/</uri>
					</author>
		<title type="html"><![CDATA[Категории словаря Google Japanese IME]]></title>
		<link rel="alternate" type="text/html" href="http://mobobe.com/2010/04/25/categories-in-google-japanese-ime/" />
		<id>http://mobobe.com/?p=238</id>
		<updated>2010-07-03T12:35:36Z</updated>
		<published>2010-04-25T10:01:04Z</published>
		<category scheme="http://mobobe.com" term="Япония" /><category scheme="http://mobobe.com" term="японский язык" />		<summary type="html"><![CDATA[Google 日本語入力 (aka Google Japanese IME) – новый игрок на рынке японских средств ввода, появившийся около полугода назад.
Его основная особенность – словарь, построенный на основе лингвистической статистической модели, полученной Google на основе всей индексированной на данный момент информации в  [...]]]></summary>
		<content type="html" xml:base="http://mobobe.com/2010/04/25/categories-in-google-japanese-ime/"><![CDATA[<p style="text-align: justify"><a href="http://www.google.com/intl/ja/ime/" rel="external">Google 日本語入力</a> (aka Google Japanese IME) – новый игрок на рынке японских средств ввода, <a href="http://googlejapan.blogspot.com/2009/12/google_03.html" rel="external">появившийся</a> около полугода назад.</p>
<p style="text-align: justify">Его основная особенность – словарь, построенный на основе лингвистической статистической модели, полученной Google на основе всей индексированной на данный момент информации в Интернете. На практике это означает более высокий процент “угадывания” ввода пользователя при конвертировании. Более того, подсказки с вариантами появляются непосредственно при вводе и иногда предлагают готовое предложение уже после ввода всего пары символов. Ещё из плюсов – поправка на небольшие опечатки и типичные ошибки при вводе.</p>
<p style="text-align: center"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Пример подсказки" alt="Пример подсказки" src="http://mobobe.com/wp-uploads/2010/04/suggestion_popup.png" width="292" height="114" />     <br /><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Более экстримальный пример" alt="Более экстримальный пример" src="http://mobobe.com/wp-uploads/2010/04/another_example.png" width="310" height="98" /> </p>
<p style="text-align: justify">Из минусов – редко встречаемые чтения / кандзи / сочетания слов попросту отсутствуют. Но это можно исправить, воспользовавшись встроенным редактором пользовательских словарей, который не в пример удобнее аналога из стандартной поставки в Windows.</p>
<p style="text-align: center"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Пример реального пользовательского словаря" alt="Пример реального пользовательского словаря" src="http://mobobe.com/wp-uploads/2010/04/dictionary_editor.png" width="560" height="217" /> <span style="font-size: smaller">Как ни странно, этих слов действительно нет в словаре, поставляемом вместе с IME.</span></p>
<p style="text-align: justify">Самое замечательное – это возможность указания категории добавляемого слова. Проблема в том, что не все термины в этом списке понятны (по крайней мере, лично мне).</p>
<p style="text-align: justify">Поэтому, вооружившись словарями и википедией, я сделал небольшую шпаргалку:</p>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<th>Категория </th>
<th>Перевод</th>
</tr>
<tr>
<td>名詞</td>
<td>существительное</td>
</tr>
<tr>
<td>固有名詞</td>
<td>имя собственное</td>
</tr>
<tr>
<td>人名</td>
<td>имя (полное?)</td>
</tr>
<tr>
<td>姓</td>
<td>фамилия</td>
</tr>
<tr>
<td>名</td>
<td>имя</td>
</tr>
<tr>
<td>組織</td>
<td>организация</td>
</tr>
<tr>
<td>地名</td>
<td>название места</td>
</tr>
<tr>
<td>名詞サ変</td>
<td>отглагольное существительное?</td>
</tr>
<tr>
<td>名詞形動</td>
<td>существительное, употребляемое в качестве прилагательного (noun adjectival)</td>
</tr>
<tr>
<td>数</td>
<td>число / числительное?</td>
</tr>
<tr>
<td>アルファベット</td>
<td>алфавит</td>
</tr>
<tr>
<td>記号</td>
<td>символ / знак</td>
</tr>
<tr>
<td>顔文字</td>
<td>смайл (aka 絵文字)</td>
</tr>
<tr>
<td>副詞</td>
<td>наречие</td>
</tr>
<tr>
<td>連体詞</td>
<td>pre-noun adjectival</td>
</tr>
<tr>
<td>接続詞</td>
<td>союз</td>
</tr>
<tr>
<td>感動詞</td>
<td>междометие</td>
</tr>
<tr>
<td>接頭詞</td>
<td>приставка</td>
</tr>
<tr>
<td>助数詞</td>
<td>счётный суффикс</td>
</tr>
<tr>
<td>接尾一般</td>
<td>суффикс (другое)</td>
</tr>
<tr>
<td>接尾人名</td>
<td>суффикс (к имени человека)</td>
</tr>
<tr>
<td>接尾地名</td>
<td>суффикс (к названию места)</td>
</tr>
<tr>
<td>動詞ワ行五段</td>
<td>глагол на у (笑う, 問う)</td>
</tr>
<tr>
<td>動詞カ行五段</td>
<td>глагол на ку (書く, 行く)</td>
</tr>
<tr>
<td>動詞サ行五段</td>
<td>глагол на су (探す)</td>
</tr>
<tr>
<td>動詞タ行五段</td>
<td>глагол на цу (勝つ)</td>
</tr>
<tr>
<td>動詞ナ行五段</td>
<td>глагол на ну (死ぬ)</td>
</tr>
<tr>
<td>動詞マ行五段</td>
<td>глагол на му (読む)</td>
</tr>
<tr>
<td>動詞ラ行五段</td>
<td>глагол на ру (切る)</td>
</tr>
<tr>
<td>動詞ガ行五段</td>
<td>глагол на гу (泳ぐ)</td>
</tr>
<tr>
<td>動詞バ行五段</td>
<td>глагол на бу (遊ぶ)</td>
</tr>
<tr>
<td>動詞ハ行五段</td>
<td>глагол на фу? &#8212; википедия <a href="http://ja.wikipedia.org/wiki/%E4%BA%94%E6%AE%B5%E6%B4%BB%E7%94%A8" rel="external">говорит</a>, что <a href="http://ja.wiktionary.org/wiki/%E4%BA%94%E6%AE%B5%E6%B4%BB%E7%94%A8" rel="external">нет таких</a></td>
</tr>
<tr>
<td>動詞一段</td>
<td>глагол (другое)</td>
</tr>
<tr>
<td>動詞カ変</td>
<td>неправильные глаголы на ку (来る, 来)</td>
</tr>
<tr>
<td>動詞サ変</td>
<td>неправильные глаголы на су (する, 発する, 愛する, す)</td>
</tr>
<tr>
<td>動詞ザ変</td>
<td>неправильные глаголы на зу (案ずる)</td>
</tr>
<tr>
<td>動詞ラ変</td>
<td>неправильные глаголы на ру (有り)</td>
</tr>
<tr>
<td>形容詞</td>
<td>прилагательное (“настоящие”, на и)</td>
</tr>
<tr>
<td>終助詞</td>
<td>частица, заканчивающая приложение (よ, ね, かし, わ)</td>
</tr>
<tr>
<td>句続点</td>
<td>символ-разделитель (、。)?</td>
</tr>
<tr>
<td>括弧開</td>
<td>открывающая скобка</td>
</tr>
<tr>
<td>括弧閉</td>
<td>закрывающая скобка</td>
</tr>
<tr>
<td>独立語</td>
<td>отдельное слово</td>
</tr>
</tbody>
</table>
<p style="text-align: justify">То, что помечено знаком вопроса – в этом я не уверен, так что, если кто поправит – буду очень признателен.</p>
]]></content>
		<link rel="replies" type="text/html" href="http://mobobe.com/2010/04/25/categories-in-google-japanese-ime/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://mobobe.com/2010/04/25/categories-in-google-japanese-ime/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>13xforever</name>
						<uri>http://mobobe.com/</uri>
					</author>
		<title type="html"><![CDATA[Похороны Internet Explorer 6]]></title>
		<link rel="alternate" type="text/html" href="http://mobobe.com/2010/03/22/internet-explorer-6-funeral/" />
		<id>http://mobobe.com/2010/03/22/%d0%bf%d0%be%d1%85%d0%be%d1%80%d0%be%d0%bd%d1%8b-internet-explorer-6/</id>
		<updated>2010-07-03T12:38:51Z</updated>
		<published>2010-03-21T20:42:02Z</published>
		<category scheme="http://mobobe.com" term="Про блог" /><category scheme="http://mobobe.com" term="хостинг" />		<summary type="html"><![CDATA[Ляпота! Добрые люди организовались таки и полуофициально похоронили IE6 ещё 1 марта. Даже Майкрософт цветов прислала. Вот и я осуществил, наконец, давешнюю мечту. Теперь всяк сюда входящий с IE6 сразу же отправляется в будущее.
Последнее обновление так же прошло не особенно гладко. Версия 2.0 темы  [...]]]></summary>
		<content type="html" xml:base="http://mobobe.com/2010/03/22/internet-explorer-6-funeral/"><![CDATA[<p style="text-align: justify">Ляпота! Добрые люди организовались таки и полуофициально <a href="http://ie6funeral.com/" rel="external">похоронили</a> IE6 ещё 1 марта. Даже Майкрософт цветов прислала. Вот и я осуществил, наконец, давешнюю мечту. Теперь всяк сюда входящий с IE6 сразу же отправляется <a href="http://www.browserchoice.eu/" rel="external">в будущее</a>.</p>
<p style="text-align: justify">Последнее обновление так же прошло не особенно гладко. Версия 2.0 темы выдалась на редкость забаженой, да к тому же переключение ширины колонки ушло в небытие и осталась только админская возможность переключения с фиксированной ширины колонки на 100% <img src='http://mobobe.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  И переопределение шрифтов с помощью соответствующей опции для пользовательского CSS тоже не работает <img src='http://mobobe.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p style="text-align: justify">Но с другой стороны, теперь на каждой странице есть QR код со ссылкой на неё, чтобы не париться каждый раз с <a href="http://www.deviantart.com/deviation/105015598" rel="external">Ubiquity</a>. Да и мой патч для WPTouch с оптимизированными PNG’шками уже <a href="http://wordpress.org/extend/plugins/wptouch/changelog/" rel="external">приносит радость</a> <img src='http://mobobe.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: justify">А ещё на прошлой неделе я, наконец, попробовал поюзать Parallel Extensions из библиотек .NET 4.0 – было очень круто, мне понравилось <img src='http://mobobe.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Осталось ещё что-нибдь поделать с использованием <a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx" rel="external">Rx .NET</a> и будет совсем хорошо. Кстати, Visual Studio 2010 выходит уже на днях – в Екатеринбурге официоз <a href="http://www.microsoft.com/visualstudio/ru-ru/events/" rel="external">намечается</a> на 16 апреля.</p>
]]></content>
		<link rel="replies" type="text/html" href="http://mobobe.com/2010/03/22/internet-explorer-6-funeral/#comments" thr:count="2" />
		<link rel="replies" type="application/atom+xml" href="http://mobobe.com/2010/03/22/internet-explorer-6-funeral/feed/atom/" thr:count="2" />
		<thr:total>2</thr:total>
	</entry>
		<entry>
		<author>
			<name>13xforever</name>
						<uri>http://mobobe.com/</uri>
					</author>
		<title type="html"><![CDATA[Очередное обновление]]></title>
		<link rel="alternate" type="text/html" href="http://mobobe.com/2010/03/01/new-update/" />
		<id>http://mobobe.com/2010/03/01/%d0%be%d1%87%d0%b5%d1%80%d0%b5%d0%b4%d0%bd%d0%be%d0%b5-%d0%be%d0%b1%d0%bd%d0%be%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5/</id>
		<updated>2010-03-01T12:04:34Z</updated>
		<published>2010-03-01T12:02:51Z</published>
		<category scheme="http://mobobe.com" term="Про блог" /><category scheme="http://mobobe.com" term="Wordpress" />		<summary type="html"><![CDATA[Обновил пакеты ОС, WordPress, тему и некоторые плагины. Если что-то вдруг не работает, можно меня пнуть.  
]]></summary>
		<content type="html" xml:base="http://mobobe.com/2010/03/01/new-update/"><![CDATA[<p>Обновил пакеты ОС, WordPress, тему и некоторые плагины. Если что-то вдруг не работает, можно меня пнуть. <img src='http://mobobe.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content>
		<link rel="replies" type="text/html" href="http://mobobe.com/2010/03/01/new-update/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://mobobe.com/2010/03/01/new-update/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	</entry>
	</feed>

