<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ProgTips &#187; Datorlietas</title>
	<atom:link href="http://tips.naivist.net/category/datorlietas/feed/" rel="self" type="application/rss+xml" />
	<link>http://tips.naivist.net</link>
	<description>Kodējot radušās domeles</description>
	<lastBuildDate>Fri, 08 Jul 2011 11:17:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Kārtošana latviešu valodā ar Microsoft SQL Server</title>
		<link>http://tips.naivist.net/2011/07/08/kartosana-latviesu-valoda-ar-microsoft-sql-server/</link>
		<comments>http://tips.naivist.net/2011/07/08/kartosana-latviesu-valoda-ar-microsoft-sql-server/#comments</comments>
		<pubDate>Fri, 08 Jul 2011 07:20:05 +0000</pubDate>
		<dc:creator>Krišs Rauhvargers</dc:creator>
				<category><![CDATA[Datorlietas]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://tips.naivist.net/?p=210</guid>
		<description><![CDATA[Jau kopš senām Microsoft SQL Server versijām ir bijusi problēma, ka latviešu valodas teksti tiek kārtoti nepareizi. Proti, pat tad, ja datubāzei iestatīta &#8220;Latviešu&#8221; valoda, netiek šķiroti īsie un garie burti (šeit ar &#8220;latviešu&#8221; saprotu tādas kolācijas kā, piemēram, &#8216;Latvian&#95;CI&#95;AS&#8217; vai &#8216;SQL_Latvian&#95;Cp1257&#95;CI&#95;AS&#95;KI&#95;WI&#8217;). Līdz ar to sarakstu bērziņš, avotiņš, āboliņš SQL serveris kārtoja kā āboliņš, avotiņš, [...]]]></description>
			<content:encoded><![CDATA[<p>Jau kopš senām Microsoft SQL Server versijām ir bijusi problēma, ka latviešu valodas teksti tiek kārtoti nepareizi. Proti, pat tad, ja datubāzei iestatīta &#8220;Latviešu&#8221; valoda, netiek šķiroti īsie un garie burti (šeit ar &#8220;latviešu&#8221; saprotu tādas kolācijas kā, piemēram, &#8216;Latvian&#95;CI&#95;AS&#8217; vai &#8216;SQL_Latvian&#95;Cp1257&#95;CI&#95;AS&#95;KI&#95;WI&#8217;).
Līdz ar to sarakstu <code>bērziņš, avotiņš, āboliņš</code> SQL serveris kārtoja kā <code>āboliņš, avotiņš, bērziņš</code>. Kā zinām no ābeces mācīšanās, latviešu alfabēts ir <code>A, Ā, B, C, Č...</code>, tas ir, diakritiskās zīmes ir atsevišķas un tās seko aiz tā paša burta bez diakritiskās zīmes, tāpēc pareizi būtu bijis <code>avotiņš, āboliņš, bērziņš</code>.</p>

<p>Kopš SQL server 2008 ir pieejama vēl viena kolāciju saime &#8211; tādas, kas sākas ar <code>Latvian_100</code>, piemēram, <code>Latvian_100_CI_AS</code>. Šajās kolācijās gan viss ir salabots un kārtošana tiešām strādā pareizi: </p>

<pre><code>select VARDS from (
        select 'Bērziņš' as VARDS union
        select 'Āboliņš' as VARDS union
        select 'Avotiņš' as VARDS) as SAMPLES
order by VARDS collate Latvian_100_CI_AS
</code></pre>

<p>rezultāts ir</p>

<pre><code>VARDS
-------
Avotiņš
Āboliņš
Bērziņš
</code></pre>

<p>Papildus informāciju var pasmelties <a href="http://download.microsoft.com/download/d/9/4/d948f981-926e-40fa-a026-5bfcf076d9b9/Pre-SQLServer2008_NativeDataProviders_and_NewCollations.docx" onclick="pageTracker._trackPageview('/outgoing/download.microsoft.com/download/d/9/4/d948f981-926e-40fa-a026-5bfcf076d9b9/Pre-SQLServer2008_NativeDataProviders_and_NewCollations.docx?referer=');">MSDN dokumentācijā</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://tips.naivist.net/2011/07/08/kartosana-latviesu-valoda-ar-microsoft-sql-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Document title in SharePoint&#8217;s &#8220;ECB&#8221; dropdown menu</title>
		<link>http://tips.naivist.net/2010/09/16/document-title-in-sharepoints-ecb-dropdown-menu/</link>
		<comments>http://tips.naivist.net/2010/09/16/document-title-in-sharepoints-ecb-dropdown-menu/#comments</comments>
		<pubDate>Thu, 16 Sep 2010 08:40:06 +0000</pubDate>
		<dc:creator>Krišs Rauhvargers</dc:creator>
				<category><![CDATA[.NET pasaule]]></category>
		<category><![CDATA[Datorlietas]]></category>
		<category><![CDATA[SharePoint]]></category>

		<guid isPermaLink="false">http://tips.naivist.net/?p=169</guid>
		<description><![CDATA[Have you ever wondered why the SharePoint team decided to show only filename in dropdown menus, but not the title of the document? So when you save your file with an unreadable filename, it is displayed in your list and looks something like this (Historical note: it was not the case in SharePoint 2001. They [...]]]></description>
			<content:encoded><![CDATA[<p>Have you ever wondered why the SharePoint team decided to show only filename in dropdown menus, but not the title of the document? So when you save your file with an <em>unreadable</em> filename, it is displayed in your list and looks something like this (Historical note: it was not the case in SharePoint 2001. They changed it in SPPS2003 and in 2007 versions. 2010. <a href="http://blah.winsmarts.com/2010-1-SharePoint_2010_lets_you_put_the_ECB_Menu_on_any_column.aspx" onclick="pageTracker._trackPageview('/outgoing/blah.winsmarts.com/2010-1-SharePoint_2010_lets_you_put_the_ECB_Menu_on_any_column.aspx?referer=');">has it fixed</a>):</p>

<p><img src="http://tips.naivist.net/wp-content/defaultecb.png" /></p>

<p>You can, of course, modify the &#8220;All Items&#8221; view and add the &#8220;Title&#8221; column, but it never has a link to the document, nor has it the fancy drop-down for editing (see the column &#8220;Title&#8221; in the picture).</p>

<p>So, I decided to dig into CAML schemas and to create a field which would display the title of the document <em>and</em> have the dropdown menu. To achieve that, one can use &#8220;computed fields&#8221; &#8211; fields which do not actually represent data editable by the user, but are only used for presentational purposes. Hence, one only has to define the <a href="http://msdn.microsoft.com/en-us/library/ms435494(v=office.12).aspx" onclick="pageTracker._trackPageview('/outgoing/msdn.microsoft.com/en-us/library/ms435494_v=office.12_.aspx?referer=');"><code>DisplayPattern</code></a> of that field.<br />
There are two fields already built into SharePoint &#8211; the <code>_EditMenuTableStart</code> and <code>_EditMenuTableEnd</code>, which build the dropdown menu contents. What I had to add, was generation of the readable content. The most important part of the display pattern is this:</p>

<pre><code>&lt;IfEqual&gt;
  &lt;Expr1&gt;&lt;LookupColumn Name="Title" /&gt;&lt;/Expr1&gt;
 &lt;Expr2&gt;&lt;/Expr2&gt;
&lt;Then&gt;
     &lt;Field Name="FileLeafRef" /&gt;
 &lt;/Then&gt;
 &lt;Else&gt;
     &lt;Column HTMLEncode="FALSE" Name="Title" Default="(no title)" /&gt;
  &lt;/Else&gt;
&lt;/IfEqual&gt;
</code></pre>

<p>It compares the value of the <code>Title</code> column to an empty string. If this is the case (you have uploaded a document with no title or created a folder using Explorer view), it just shows <code>FileLeafRef</code> &#8211; the filename. Otherwise, it displays the value of the title field.</p>

<p>In my case I had an existing document library which I wanted to &#8220;fix&#8221;. Hence, I created a PowerShell script, which adds my field to the library. I used &#8220;<a href="http://msdn.microsoft.com/en-us/library/ms457586(v=office.12).aspx" onclick="pageTracker._trackPageview('/outgoing/msdn.microsoft.com/en-us/library/ms457586_v=office.12_.aspx?referer=');">AddFieldAsXML()</a>&#8221; method of <code>SPList</code> object to inject my CAML code into sharepoint.</p>

<p>Now it looks like this:</p>

<p><img src="http://tips.naivist.net/wp-content/modfiedecb.png" /></p>

<p>You can dowload the whole script here: <a href="http://tips.naivist.net/wp-content/CreateTitleField1033.ps1_.txt">http://tips.naivist.net/wp-content/CreateTitleField1033.ps1_.txt</a>
Rename it to <code>.ps1</code> and run it <code>.\CreateTitleField1033.ps1 -url http://yourserver/sites/somesite/someweb -ListName "Your list"</code>. Then modify the view settings to display the field.</p>

<p>If you are developing your own list defintion, you can use the particular fragment in <code>schema.xml</code> and have your field defined in a regular fashion.</p>

<pre><code>param(
  [string] $url      =  "",
  [string] $ListName = ""
)

$sharepoint = [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")
$site=[Microsoft.Sharepoint.SPSite]($url);
$web=$site.openweb();
$list= $web.lists[$ListName];

$schema =@"
    &lt;Field ID="{E2ABF8D3-6435-4773-A3D6-67508FEB7CF5}" ReadOnly="TRUE" 
             Type="Computed" 
             Name="KRItemLinkTitleDropdown" 
             DisplayName="Title" 
             DisplayNameSrcField="Title"
             AuthoringInfo="(dropdown displaying the title field)"
             EnableLookup="TRUE" 
             SourceID="http://schemas.microsoft.com/sharepoint/v3"
             StaticName="KRItemLinkTitleDropdown" FromBaseType="TRUE" ClassInfo="Menu"&gt;
         &lt;FieldRefs&gt;
          &lt;FieldRef Name="Title" /&gt;
          &lt;FieldRef Name="LinkTitleNoMenu" /&gt;
          &lt;FieldRef Name="FSObjType" /&gt;
        &lt;/FieldRefs&gt;
        &lt;DisplayPattern&gt;
           &lt;Field Name="_EditMenuTableStart" /&gt;
           &lt;HTML&gt;
           &lt;![CDATA[&lt;A onfocus="OnLink(this)" HREF="]]&gt;&lt;/HTML&gt;
       &lt;IfEqual&gt;
            &lt;Expr1&gt;
              &lt;LookupColumn Name="FSObjType" /&gt;
            &lt;/Expr1&gt;
            &lt;Expr2&gt;1&lt;/Expr2&gt;
            &lt;Then&gt;
                &lt;FieldSwitch&gt;
                &lt;Expr&gt;
                  &lt;GetVar Name="RecursiveView" /&gt;
                &lt;/Expr&gt;
                &lt;Case Value="1"&gt;
                  &lt;LookupColumn Name="FileLeafRef" HTMLEncode="TRUE" /&gt;
                &lt;/Case&gt;
                &lt;Default&gt;
                  &lt;SetVar Name="UnencodedFilterLink"&gt;
                    &lt;SetVar Name="RootFolder"&gt;&lt;HTML&gt;/&lt;/HTML&gt;
                      &lt;LookupColumn Name="FileRef" /&gt;
                    &lt;/SetVar&gt;
                    &lt;SetVar Name="FolderCTID"&gt;
                      &lt;FieldSwitch&gt;
                        &lt;Expr&gt;
                          &lt;ListProperty Select="EnableContentTypes" /&gt;
                        &lt;/Expr&gt;
                        &lt;Case Value="1"&gt;
                          &lt;Column Name="ContentTypeId" /&gt;
                        &lt;/Case&gt;
                      &lt;/FieldSwitch&gt;
                    &lt;/SetVar&gt;
                    &lt;FilterLink Default="" Paged="FALSE" /&gt;
                  &lt;/SetVar&gt;
                  &lt;GetVar Name="UnencodedFilterLink" HTMLEncode="TRUE" /&gt;
                &lt;/Default&gt;
              &lt;/FieldSwitch&gt;     
             &lt;/Then&gt;
            &lt;Else&gt;
                &lt;Field Name="ServerUrl" URLEncodeAsURL="TRUE" /&gt;
            &lt;/Else&gt;
            &lt;/IfEqual&gt;


       &lt;HTML&gt;&lt;![CDATA[" onclick="return DispEx(this,event,']]&gt;&lt;/HTML&gt;
                  &lt;ScriptQuote NotAddingQuote="TRUE"&gt;
                    &lt;ServerProperty Select="HtmlTransform" /&gt;
                  &lt;/ScriptQuote&gt;&lt;HTML&gt;&lt;![CDATA[',']]&gt;&lt;/HTML&gt;
                  &lt;ScriptQuote NotAddingQuote="TRUE"&gt;
                    &lt;ServerProperty Select="HtmlTrAcceptType"&gt;
                      &lt;Column Name="File_x0020_Type" /&gt;
                    &lt;/ServerProperty&gt;
                  &lt;/ScriptQuote&gt;&lt;HTML&gt;&lt;![CDATA[',']]&gt;&lt;/HTML&gt;
                  &lt;ScriptQuote NotAddingQuote="TRUE"&gt;
                    &lt;ServerProperty Select="HtmlTrHandleUrl"&gt;
                      &lt;Column Name="File_x0020_Type" /&gt;
                    &lt;/ServerProperty&gt;
                  &lt;/ScriptQuote&gt;&lt;HTML&gt;&lt;![CDATA[',']]&gt;&lt;/HTML&gt;
                  &lt;ScriptQuote NotAddingQuote="TRUE"&gt;
                    &lt;ServerProperty Select="HtmlTrProgId"&gt;
                      &lt;Column Name="File_x0020_Type" /&gt;
                    &lt;/ServerProperty&gt;
                  &lt;/ScriptQuote&gt;&lt;HTML&gt;&lt;![CDATA[',']]&gt;&lt;/HTML&gt;
                  &lt;ScriptQuote NotAddingQuote="TRUE"&gt;
                    &lt;ListProperty Select="DefaultItemOpen" /&gt;
                  &lt;/ScriptQuote&gt;&lt;HTML&gt;&lt;![CDATA[',']]&gt;&lt;/HTML&gt;
                  &lt;ScriptQuote NotAddingQuote="TRUE"&gt;
                    &lt;MapToControl&gt;
                      &lt;Column Name="HTML_x0020_File_x0020_Type" /&gt;&lt;HTML&gt;|&lt;/HTML&gt;
                      &lt;Column Name="File_x0020_Type" /&gt;
                    &lt;/MapToControl&gt;
                  &lt;/ScriptQuote&gt;&lt;HTML&gt;&lt;![CDATA[',']]&gt;&lt;/HTML&gt;
                  &lt;ScriptQuote NotAddingQuote="TRUE"&gt;
                    &lt;Column Name="HTML_x0020_File_x0020_Type" /&gt;
                  &lt;/ScriptQuote&gt;&lt;HTML&gt;&lt;![CDATA[',']]&gt;&lt;/HTML&gt;
                  &lt;ScriptQuote NotAddingQuote="TRUE"&gt;
                    &lt;ServerProperty Select="GetServerFileRedirect"&gt;
                      &lt;Field Name="ServerUrl" /&gt;&lt;HTML&gt;|&lt;/HTML&gt;
                      &lt;Column Name="HTML_x0020_File_x0020_Type" /&gt;
                    &lt;/ServerProperty&gt;
                  &lt;/ScriptQuote&gt;&lt;HTML&gt;&lt;![CDATA[',']]&gt;&lt;/HTML&gt;
                  &lt;ScriptQuote NotAddingQuote="TRUE"&gt;
                    &lt;Column Name="CheckoutUser" /&gt;
                  &lt;/ScriptQuote&gt;&lt;HTML&gt;&lt;![CDATA[',']]&gt;&lt;/HTML&gt;
                  &lt;ScriptQuote NotAddingQuote="TRUE"&gt;
                    &lt;UserID AllowAnonymous="TRUE" /&gt;
                  &lt;/ScriptQuote&gt;&lt;HTML&gt;&lt;![CDATA[',']]&gt;&lt;/HTML&gt;
                  &lt;ScriptQuote NotAddingQuote="TRUE"&gt;
                    &lt;ListProperty Select="ForceCheckout" /&gt;
                  &lt;/ScriptQuote&gt;&lt;HTML&gt;&lt;![CDATA[',']]&gt;&lt;/HTML&gt;
                  &lt;ScriptQuote NotAddingQuote="TRUE"&gt;
                    &lt;Field Name="IsCheckedoutToLocal" /&gt;
                  &lt;/ScriptQuote&gt;&lt;HTML&gt;&lt;![CDATA[',']]&gt;&lt;/HTML&gt;
                  &lt;ScriptQuote NotAddingQuote="TRUE"&gt;
                    &lt;Field Name="PermMask" /&gt;
                  &lt;/ScriptQuote&gt;&lt;HTML&gt;&lt;![CDATA[')"&gt;]]&gt;&lt;/HTML&gt;
                  &lt;UrlBaseName HTMLEncode="TRUE"&gt;
                  &lt;/UrlBaseName&gt;
                    &lt;IfEqual&gt;
                    &lt;Expr1&gt;
                      &lt;LookupColumn Name="Title" /&gt;
                    &lt;/Expr1&gt;
                    &lt;Expr2&gt;&lt;/Expr2&gt;
                    &lt;Then&gt;
                        &lt;Field Name="FileLeafRef" /&gt;
                     &lt;/Then&gt;
                    &lt;Else&gt;
                        &lt;Column HTMLEncode="FALSE" Name="Title" Default="(no title)" /&gt;
                    &lt;/Else&gt;
                    &lt;/IfEqual&gt;
                  &lt;IfEqual&gt;
                    &lt;Expr1&gt;
                      &lt;GetVar Name="ShowAccessibleIcon" /&gt;
                    &lt;/Expr1&gt;
                    &lt;Expr2&gt;1&lt;/Expr2&gt;
                    &lt;Then&gt;&lt;HTML&gt;&lt;![CDATA[&lt;img src="/_layouts/images/blank.gif" class="ms-hidden" border=0 width=1 height=1&gt;]]&gt;&lt;/HTML&gt;
                    &lt;/Then&gt;
                  &lt;/IfEqual&gt;&lt;HTML&gt;&lt;![CDATA[&lt;/A&gt;]]&gt;&lt;/HTML&gt;
                  &lt;IfNew Name="Created_x0020_Date"&gt;&lt;HTML&gt;&lt;![CDATA[&lt;IMG SRC="/_layouts/1033/images/new.gif" alt="New!"&gt;]]&gt;&lt;/HTML&gt;
                  &lt;/IfNew&gt;
                  &lt;Field Name="_EditMenuTableEnd" /&gt;
        &lt;/DisplayPattern&gt;
      &lt;/Field&gt;
"@
$fieldname = $list.fields.AddFieldAsXml($schema);
$list.update();
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://tips.naivist.net/2010/09/16/document-title-in-sharepoints-ecb-dropdown-menu/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tulkošanas makrosi</title>
		<link>http://tips.naivist.net/2008/01/02/tulkosanas_makrosi/</link>
		<comments>http://tips.naivist.net/2008/01/02/tulkosanas_makrosi/#comments</comments>
		<pubDate>Wed, 02 Jan 2008 21:11:46 +0000</pubDate>
		<dc:creator>Krišs Rauhvargers</dc:creator>
				<category><![CDATA[Datorlietas]]></category>

		<guid isPermaLink="false">http://tips.naivist.net/2007/12/31/tulkosanas_makrosi/</guid>
		<description><![CDATA[Divi Word makrosi, kas varētu noderēt tiem, kam nav instalēta Tildes vārdnīca, bet ir pieejams internets. Lai lietotu, makrosu projektiem referencēs jāpieliek Microsoft XML (es liku V 6.0, bet derēs jebkurš). Pēc tam atliek uzbindēt klaviatūras saīsni. Piemēram, es ieliku Shift+Ctrl+Alt+E tulkojumam uz angļu valodu un Shift+Ctrl+Alt+L tulkojumam uz latviešu valodu. Pēc tam, kad vajag [...]]]></description>
			<content:encoded><![CDATA[<p>Divi Word makrosi, kas varētu noderēt tiem, kam nav instalēta Tildes vārdnīca, bet ir pieejams internets.</p>

<p>Lai lietotu, makrosu projektiem referencēs jāpieliek Microsoft XML (es liku V 6.0, bet derēs jebkurš). Pēc tam atliek uzbindēt <a href="http://www.timeatlas.com/mos/5_Minute_Tips/General/Assigning_Word_Commands_to_Keyboard_Shortcuts/" onclick="pageTracker._trackPageview('/outgoing/www.timeatlas.com/mos/5_Minute_Tips/General/Assigning_Word_Commands_to_Keyboard_Shortcuts/?referer=');">klaviatūras saīsni</a>. Piemēram, es ieliku Shift+Ctrl+Alt+E tulkojumam uz angļu valodu un Shift+Ctrl+Alt+L tulkojumam uz latviešu valodu.
Pēc tam, kad vajag tulkojumu, iezīmējam tulkojamo  vārdu un izpildām klaviatūras maģiju.</p>

<p>Uzskatu, ka SIA &#8220;Tilde&#8221; tiesības ar šo neesmu pārkāpis, jo esmu tikai vienkāršojis piekļuvi datiem, kas ir publiski pieejami.</p>

<p>Rezultāts izskatās šādi: </p>

<p><img src='http://tips.naivist.net/wp-content/translator.png' alt='translator.png'  border='1' /></p>

<p><span id="more-121"></span></p>

<pre><code>'tulko iezīmēto tekstu uz angļu valodu
Sub TranslateToEn()
    Dim sRes As String
    sRes = Translate("L", GetSelection())
    If TrimEnd(sRes) &lt;&gt; "" Then MsgBox sRes
End Sub

'tulko iezīmēto tekstu uz angļu valodu
Sub TranslateToLV()
    Dim sRes As String
    sRes = Translate("E", GetSelection())
    If TrimEnd(sRes) &lt;&gt; "" Then MsgBox sRes
End Sub
'ielasa iezīmēto vārdu vai vārdu pirms kursora
Public Function GetSelection() As String
        Dim sTran As String
    If TrimEnd(Selection.Text) &lt;&gt; "" Then
        sTran = Trim(Selection.Text)
    Else
        Selection.MoveLeft Unit:=wdWord, Count:=1, Extend:=wdExtend
        sTran = Trim(Selection.Text)
        Selection.MoveRight Unit:=wdCharacter, Count:=1
    End If
    GetSelection = sTran
End Function

'izpilda tulkošanas darbu
Function Translate(ByVal spDirection As String, ByVal spText As String) As String
  Dim oXML As New XMLHTTP
  Dim sPost As String
  Dim sResponse As String

  If TrimEnd(spText) = "" Then Exit Function

  sPost = "MfcISAPICommand=Translate" &amp; spDirection &amp; _
         "&amp;ApostrofeMode=0&amp;DictionaryView=1&amp;WholeWordsCheckBox=1&amp;EditLine=" &amp; _
         URLEncode(spText)

  'nolasa rezultātus no servera
  Call oXML.Open("POST", "http://dictionary.tilde.lv/idiction.dll?", False)
  Call oXML.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
  Call oXML.setRequestHeader("Encoding", "Windows-1257")
  oXML.send (sPost)

  sResponse = ToChars(oXML.responseBody)

  'vairāk nevajadzēs
  Set oXML = Nothing

  'iespējams, vārds nebūs vispār atrasts
  If InStr(1, sResponse, "images/not_found_text.gif") Then
    sResponse = spText &amp; ": " &amp; vbCrLf &amp; "Vārds nav atrasts"
  End If


  Dim iNum As Integer
  iNum = InStr(1, sResponse, "&lt;B&gt;")
  If Not iNum &gt; 0 Then
   iNum = 1
  End If
  sResponse = Mid(sResponse, iNum)
  Dim sRemoves() As String
  Dim i As Integer
  sRemoves = Split("&lt;b&gt;,&lt;/b&gt;,&lt;i&gt;,&lt;/i&gt;,&lt;strong&gt;,&lt;/strong&gt;," &amp; _
                   "&lt;u&gt;,&lt;/u&gt;,&lt;script&gt;,&lt;/script&gt;,&lt;p&gt;,&lt;/p&gt;,&lt;i&gt;," &amp; _
                   "&lt;/i&gt;,&lt;big&gt;,&lt;/big&gt;,&lt;small&gt;,&lt;/small&gt;,&lt;/body&gt;,&lt;/html&gt;", _
                   ",", , vbTextCompare)

  sResponse = Replace(sResponse, spText &amp; "&lt;/B&gt;&lt;SMALL&gt;&lt;P&gt;", _
                      spText &amp; vbCrLf, , , vbTextCompare)
  'izvācam visādus tagus
  For i = 0 To UBound(sRemoves, 1)
      sResponse = Replace(sResponse, sRemoves(i), "", , , vbTextCompare)
  Next i

  'atstarpes vajag
  sResponse = Replace(sResponse, "&amp;nbsp;", " ")
  sResponse = Replace(sResponse, "&lt;br&gt;", vbCrLf)

  'atgriežamajai vērtībai novāc beigās enterus
  Translate = TrimEnd(sResponse)
End Function


Function URLEncode(EncodeStr As String) As String
    Dim i As Integer
    Dim erg As String

    erg = EncodeStr

    ' *** First replace '%' chr
    erg = Replace(erg, "%", Chr(1))

    ' *** then '+' chr
    erg = Replace(erg, "+", Chr(2))

    For i = 0 To 255
        Select Case i
            ' *** Allowed 'regular' characters
            Case 37, 43, 48 To 57, 65 To 90, 97 To 122

            Case 1  ' *** Replace original %
                erg = Replace(erg, Chr(i), "%25")

            Case 2  ' *** Replace original +
                erg = Replace(erg, Chr(i), "%2B")

            Case 32
                erg = Replace(erg, Chr(i), "+")

            Case 3 To 15
                erg = Replace(erg, Chr(i), "%0" &amp; Hex(i))

            Case Else
                erg = Replace(erg, Chr(i), "%" &amp; Hex(i))

        End Select
    Next

    URLEncode = erg

End Function

'no ResponseBody izveido normālu stringu
Function ToChars(ByVal opBody) As String
    Dim i As Integer
    Dim sChar As String
    Dim sReturn As String
    For i = 0 To Len(opBody) * 2 - 1
      sChar = (Chr(opBody(i)))
      sReturn = sReturn &amp; sChar
    Next i
    ToChars = sReturn
End Function

'novāc lieko beigās - tabus, enterus
Function TrimEnd(ByVal spText As String) As String
  Dim i As Integer
  Dim sChar As String

  For i = Len(spText) To 1 Step -1
     sChar = Mid(spText, 1, 1)
      If sChar &lt;&gt; vbCr And sChar &lt;&gt; vbLf And _
         sChar &lt;&gt; " " And sChar &lt;&gt; vbTab Then
        TrimEnd = Left(spText, i)
        Exit Function
      End If
  Next i
End Function
</code></pre>

<p>Instrukcija tiem, kam šīs lietas nav diez ko pazīstamas:</p>

<ul>
<li>Iekopējam visu šeit redzamo kodu (to, kam kreisajā malā oranža svītra)</li>
<li>Dodamies uz Wordu</li>
<li>Spiežam uz klaviatūras Alt+F11</li>
<li>Atrodam brīvu vietiņu, spiežam &#8220;Paste&#8221; </li>
<li>Ejam uz menu: tools->references. Ieliekam ķeksīti pie &#8220;Microsoft XML, v. 6.0&#8243; </li>
<li>Veram ciet šo papildus logu</li>
<li>Izveicam augstāk minēto <a href="http://www.timeatlas.com/mos/5_Minute_Tips/General/Assigning_Word_Commands_to_Keyboard_Shortcuts/" onclick="pageTracker._trackPageview('/outgoing/www.timeatlas.com/mos/5_Minute_Tips/General/Assigning_Word_Commands_to_Keyboard_Shortcuts/?referer=');">klaviatūras saīsnes veidošanu</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://tips.naivist.net/2008/01/02/tulkosanas_makrosi/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>WTF</title>
		<link>http://tips.naivist.net/2006/12/04/wtf/</link>
		<comments>http://tips.naivist.net/2006/12/04/wtf/#comments</comments>
		<pubDate>Mon, 04 Dec 2006 21:05:35 +0000</pubDate>
		<dc:creator>Krišs Rauhvargers</dc:creator>
				<category><![CDATA[Datorlietas]]></category>

		<guid isPermaLink="false">http://naivist.net/tips/index.php/2006/12/04/wtf/</guid>
		<description><![CDATA[RTU, maģistri, sieviešu komanda if (Edit1.Text = 'ozols') OR (Edit1.Text = 'logs') OR (Edit1.Text = 'zaicevs') OR (Edit1.Text = 'tukins') OR (Edit1.Text = 'petrovs') OR (Edit1.Text = 'sidorovs') OR (Edit1.Text = 'ivanovs') OR (Edit1.Text = 'celms') OR (Edit1.Text = 'koks') OR (Edit1.Text = 'liepins') OR (Edit1.Text = 'krastins') OR (Edit1.Text = 'pavlovs') OR (Edit1.Text = [...]]]></description>
			<content:encoded><![CDATA[<p>RTU, maģistri, sieviešu komanda</p>

<pre><code>            if (Edit1.Text = 'ozols') OR (Edit1.Text = 'logs') OR (Edit1.Text = 'zaicevs')
               OR (Edit1.Text = 'tukins') OR (Edit1.Text = 'petrovs') OR (Edit1.Text = 'sidorovs')
               OR (Edit1.Text = 'ivanovs') OR (Edit1.Text = 'celms') OR (Edit1.Text = 'koks')
               OR (Edit1.Text = 'liepins') OR (Edit1.Text = 'krastins') OR (Edit1.Text = 'pavlovs')
               OR (Edit1.Text = 'rukins') OR (Edit1.Text = 'papovs') OR (Edit1.Text = 'mamovs')
               OR (Edit1.Text = 'durovs')
               then
                    begin
                         lietot := Edit1.Text;
                         if forma = 'Form5'
                            then
                                Form5.Visible := True
                         else if forma = 'Form11'
                            then
                                Form11.Visible := True;
                         Form7.Visible := False;
                    end
            else MessageDlg ('Parole nav pareiza!',mtError,[mbOK],0);
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://tips.naivist.net/2006/12/04/wtf/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Word to Markdown converter</title>
		<link>http://tips.naivist.net/2006/02/02/word_to_markdown_converter/</link>
		<comments>http://tips.naivist.net/2006/02/02/word_to_markdown_converter/#comments</comments>
		<pubDate>Thu, 02 Feb 2006 16:33:09 +0000</pubDate>
		<dc:creator>Krišs Rauhvargers</dc:creator>
				<category><![CDATA[Datorlietas]]></category>

		<guid isPermaLink="false">http://naivist.net/tips/index.php/2006/02/02/word-to-markdown-converter/</guid>
		<description><![CDATA[Some smart people who didn&#8217;t want to teach users how to code in HTML invented Textile markup language Someone more lazy invented MarkDown syntax which is much easier to learn. MarkDown is really nice for small content management systems, blogging engines etc. For instance, to mark text as bold, you write the &#8220;bold text&#8221; like [...]]]></description>
			<content:encoded><![CDATA[<p>Some smart people who didn&#8217;t want to teach users how to code in HTML invented <a href="http://en.wikipedia.org/wiki/Textile_%28markup_language%29" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Textile_28markup_language_29?referer=');">Textile markup language</a></p>

<p>Someone more lazy invented <a href="http://daringfireball.net/projects/markdown/" onclick="pageTracker._trackPageview('/outgoing/daringfireball.net/projects/markdown/?referer=');">MarkDown</a> syntax which is much easier to learn. MarkDown is really nice for small content management systems, blogging engines etc.</p>

<p>For instance, to mark text as bold, you write the &#8220;<strong>bold text</strong>&#8221; like &#8220;&#95;&#95;bold text&#95;&#95;&#8221;. Other rules can be found in the <a href="http://daringfireball.net/projects/markdown/syntax" onclick="pageTracker._trackPageview('/outgoing/daringfireball.net/projects/markdown/syntax?referer=');">syntax page</a>.</p>

<p>However, when you have a MS Word document with several pages of <em>bolds</em>, <em>italics</em> and lists, you don&#8217;t really want to re-code all the markup.</p>

<p>This is why I wrote a simple macro for converting the most trivial things automatically. This macro does:</p>

<ul>
<li>Replace bold and italics</li>
<li>Replace headings (marked heading1-6)</li>
<li>Replace numbered and bulleted lists</li>
</ul>

<p>It&#8217;s very buggy, I believe it hangs on larger documents, however I&#8217;m NOT stating it&#8217;s a stable release anyway! :-) Experimental use only, recode and reuse it as you like, post a comment if you&#8217;ve found a better solution.</p>

<p><a href="http://naivist.net/tips/wp-content/uploads/2006/02/word_markdown_macro.txt" title="VBA code of the word to markdown macro" onclick="pageTracker._trackPageview('/outgoing/naivist.net/tips/wp-content/uploads/2006/02/word_markdown_macro.txt?referer=');">Click here to download the code</a>.</p>

<p>To use the code: </p>

<ul>
<li>open WinWord, </li>
<li>press Alt+F11 to open the VBA editor, </li>
<li>right click the first project in the project browser</li>
<li>choose insert-&gt;module</li>
<li>paste the code from the <a href="http://naivist.net/tips/wp-content/uploads/2006/02/word_markdown_macro.txt" onclick="pageTracker._trackPageview('/outgoing/naivist.net/tips/wp-content/uploads/2006/02/word_markdown_macro.txt?referer=');">file</a></li>
<li>close macro editor</li>
<li>go tools&gt;macro&gt;macros; run the macro named MarkDown</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://tips.naivist.net/2006/02/02/word_to_markdown_converter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Does this user belong to that domain group?</title>
		<link>http://tips.naivist.net/2005/10/13/user_group_member/</link>
		<comments>http://tips.naivist.net/2005/10/13/user_group_member/#comments</comments>
		<pubDate>Thu, 13 Oct 2005 08:54:47 +0000</pubDate>
		<dc:creator>Krišs Rauhvargers</dc:creator>
				<category><![CDATA[Datorlietas]]></category>
		<category><![CDATA[VB un .net]]></category>

		<guid isPermaLink="false">http://naivist.net/tips/index.php/2005/10/13/user_group_member/</guid>
		<description><![CDATA[A naivist-approach solution to check if a user belongs to a particular domain group.]]></description>
			<content:encoded><![CDATA[<p>UPD: This works only on LDAP groups and LDAP:// provider, not WinNT groups!</p>

<p>If we know two things &#8211; a login name of a user for instance <code>northwind\JohnDoe</code> and a domain group <code>northwind\board</code>. We want to check if John Doe belongs to the &#8220;board&#8221; group or not.</p>

<p>This is how you find it:  <code>IsUserMember( "northwind\JohnDoe", "northwind\board")</code> </p>

<p><span id="more-97"></span></p>

<p>Here is the VB.Net code you need :</p>

<pre><code>'''&lt;summary&gt;Checks if a user belongs to the domain group&lt;/summary&gt;
'''&lt;param name="spLogin"&gt;Full  login name domain\user&lt;/param&gt;
'''&lt;param name="spGroupLogin"&gt;Group full login name domain\group&lt;/param&gt;
'''&lt;returns&gt;True if belongs, False if not&lt;/returns&gt;
Public Function IsUserMember(ByVal spLogin As String, _
                             ByVal spGroupLogin As String) As Boolean
    Dim sUserDistinguish, sGroupDistinguish As String
    Dim sFilter As String
    Dim sAccount, sGroupAccount, sDomain As String


    If Not Me.SplitLogin(spLogin, sDomain, sAccount) Then
        'if username is not formed as domain\user, return false
        Return False
    End If

    If Not Me.SplitLogin(spGroupLogin, sDomain, sGroupAccount) Then
        'if group name is not formed as domain\group, return false
        Return False
    End If

    'get the distinguishedName of both user and group
    sUserDistinguish = DistingishedNameFromLogin(spLogin)
    sGroupDistinguish = DistingishedNameFromLogin(spGroupLogin)

    'check in a recursive manner if user belongs to group (or its subgroups)
    Return Me.IsUserInGroupRecursive(sUserDistinguish, sGroupDistinguish, sDomain, New Specialized.StringDictionary)
End Function


'''&lt;summary&gt;Recursively (in subgroups, too) finds a user in a group&lt;/summary&gt;
'''&lt;remarks&gt;&lt;/remarks&gt;
'''&lt;param name="spUserDistinguish"&gt;DistinguishedName of a user&lt;/param&gt;
'''&lt;param name="spGroupDistinguish"&gt;DistinguishedName of a group&lt;/param&gt;
'''&lt;param name="spDomain"&gt;domain name&lt;/param&gt;
'''&lt;param name="opCheckedGroups"&gt;Groups already sought&lt;/param&gt;
'''&lt;returns&gt;Boolean&lt;/returns&gt;
Public Function IsUserInGroupRecursive(ByVal spUserDistinguish As String, _
                                       ByVal spGroupDistinguish As String, _
                                       ByVal spDomain As String, _
                                       ByRef opCheckedGroups As Collections.Specialized.StringDictionary) As Boolean

    If opCheckedGroups(spGroupDistinguish) = "DONE" Then
        'there may be occasions when a group is somehow a subgroup of itself 
        'so we have to remember if the group is already sought or not
        'if thr group is already sought, there is NO such user
        Return False
    Else
        'mark the group as sought otherwise
        opCheckedGroups(spGroupDistinguish) = "DONE"
    End If

    If Me.IsUserDirectlyInGroup(spUserDistinguish, spGroupDistinguish, spDomain) Then
        'if the user is can be found in the group directly
        Return True
    Else
        'if not in the group directly, get all the subgroups
        For Each sSubGroup As String In Me.GetSubGroups(spGroupDistinguish, spDomain)
            'check subgroup recursively 
            If IsUserInGroupRecursive(spUserDistinguish, sSubGroup, spDomain, opCheckedGroups) Then
                'if user is found in a subgroup, return true
                Return True
                'otherwise check the next subgroup
            End If
        Next
    End If

    'if we are here, the user is not found
    Return False
End Function


'''&lt;summary&gt;Finds all subgroups of a group&lt;/summary&gt;
'''&lt;remarks&gt;&lt;/remarks&gt;
'''&lt;param name="spGroupDistinguishName"&gt;Distinguished name of the parent group&lt;/param&gt;
'''&lt;param name="spDomain"&gt;Domain name&lt;/param&gt;
'''&lt;returns&gt;Collections.Specialized.StringCollection&lt;/returns&gt;
Public Function GetSubGroups( _
        ByVal spGroupDistinguishName As String, _
        ByVal spDomain As String) As Collections.Specialized.StringCollection

    Dim sFilter As String
    Dim oResults As SearchResultCollection
    Dim oRet As Collections.Specialized.StringCollection

    'searches for subgroups that are members of this group
    sFilter = "(&amp;(objectCategory=group)(memberof=" &amp; spGroupDistinguishName &amp; "))"

    oResults = Me.FindByFilter(sFilter, spDomain)

    oRet = New Collections.Specialized.StringCollection
    For Each oResult As SearchResult In oResults
        oRet.Add(oResult.Properties("distinguishedname")(0).ToString)
    Next
    Return oRet
End Function


'''&lt;summary&gt;According to the filter specified, searches LDAP&lt;/summary&gt;
'''&lt;remarks&gt;&lt;/remarks&gt;
'''&lt;param name="spFilter"&gt;what to search for&lt;/param&gt;
'''&lt;param name="spDomain"&gt;The domain to search&lt;/param&gt;
'''&lt;returns&gt;DirectoryServices.SearchResultCollection&lt;/returns&gt;
Private Function FindByFilter(ByVal spFilter As String, ByVal spDomain As String) As SearchResultCollection
    Dim dsEntryObj As DirectoryEntry
    Dim dsSearcher As DirectorySearcher
    Dim dsResult As SearchResultCollection
    Try
        'search LDAP://domain
        dsEntryObj = New DirectoryEntry("LDAP://" &amp; spDomain)
    Catch e As Exception
        Throw New System.Exception(String.Format("Error creating LDAP directory object {0}!", "LDAP://" &amp; spDomain))
    End Try

    'create the searcher object
    dsSearcher = New DirectorySearcher(dsEntryObj)
    dsSearcher.Filter = spFilter
    Try
        'search in the directory
        dsResult = dsSearcher.FindAll()
    Catch e As Exception
        Throw New Exception(String.Format("Error searching in directory. Filter {0}", dsSearcher.Filter))
    End Try

    Return dsResult
End Function


'''&lt;summary&gt;Does user belong to the group directly?(i.e. not in subgroups)&lt;/summary&gt;
'''&lt;param name="spUserDistinguishName"&gt;Distinguished name of the user&lt;/param&gt;
'''&lt;param name="spGroupDistinguishName"&gt;distinguished name of the group&lt;/param&gt;
'''&lt;param name="spDomain"&gt;domain name&lt;/param&gt;
Public Function IsUserDirectlyInGroup(ByVal spUserDistinguishName As String, _
                                      ByVal spGroupDistinguishName As String, _
                                      ByVal spDomain As String) As Boolean
    Dim sFilter As String
    sFilter = "(&amp;(&amp;(objectCategory=group)" &amp; _
                  "(distinguishedname=" &amp; spGroupDistinguishName &amp; ")" &amp; _
                 ")" &amp; _
                "(member=" &amp; spUserDistinguishName &amp; "))"

    Return (Me.FindByFilter(sFilter, spDomain).Count &gt; 0)
End Function


'''&lt;summary&gt;Gets the distinguished name from user name&lt;/summary&gt;
'''&lt;param name="spLogin"&gt;Full login name domain\user&lt;/param&gt;
Public Function DistingishedNameFromLogin(ByVal spLogin As String) As String
    'empty input results in empty output
    If Trim(spLogin) = "" Then Return ""
    Dim sLogin, sDomain As String
    Dim sFilter As String
    Dim oResult As SearchResultCollection

    'separate the login name into parts
    If Not (SplitLogin(spLogin, sDomain, sLogin)) Then
        Return ""
    End If

    'search by sam account, only groups and users
    sFilter = "(&amp;(sAMAccountName=" &amp; sLogin &amp; ")(|(objectCategory=group)(objectCategory=person)))"

    oResult = Me.FindByFilter(sFilter, sDomain)


    If oResult.Count = 0 Then
        Return ""
    ElseIf oResult.Count &gt; 1 Then
        Throw New ArgumentException("More than one entry for this sAMAccountName")
    Else
        Return oResult(0).Properties("distinguishedname")(0).ToString
    End If
End Function


'''&lt;summary&gt;Splits the login name into parts - domain and account&lt;/summary&gt;
'''&lt;param name="spLogin"&gt;Full login name:  domain\account&lt;/param&gt;
'''&lt;param name="spDomain"&gt;OUT: Domain name&lt;/param&gt;
'''&lt;param name="spAccount"&gt;OUT: Account&lt;/param&gt;
'''&lt;returns&gt;Boolean&lt;/returns&gt;
Public Function SplitLogin(ByVal spLogin As String, ByRef spDomain As String, ByRef spAccount As String) As Boolean
    Dim iSlashPos As Integer
    spLogin = spLogin.Replace("/"c, "\"c)
    iSlashPos = spLogin.IndexOf("\"c)
    If iSlashPos &gt; -1 Then
        With spLogin.Split("\"c)
            spAccount = .GetValue(1).ToString
            spDomain = .GetValue(0).ToString
        End With
        Return True
    Else
        Return False
    End If
End Function
</code></pre>

<p>Note: Add system.directoryservices.dll to project references, import <code>System.DirectoryServices</code> namespace!</p>
]]></content:encoded>
			<wfw:commentRss>http://tips.naivist.net/2005/10/13/user_group_member/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Asm?</title>
		<link>http://tips.naivist.net/2005/09/23/asm/</link>
		<comments>http://tips.naivist.net/2005/09/23/asm/#comments</comments>
		<pubDate>Fri, 23 Sep 2005 10:42:08 +0000</pubDate>
		<dc:creator>Krišs Rauhvargers</dc:creator>
				<category><![CDATA[Datorlietas]]></category>

		<guid isPermaLink="false">http://naivist.net/tips/index.php/2005/09/23/asm/</guid>
		<description><![CDATA[Kā jums šķiet, vai &#8220;objektorientētais asamblers&#8221; ir oksimorons? Zinu tikai to, ka &#8220;objektorientācija&#8221; un &#8220;asemblers&#8221; vienmēr ir rādīti kā pretstati. Bet varbūt tak tomēr ir kāds gudrinieks, kurš pamanījies to apvienot?]]></description>
			<content:encoded><![CDATA[<p>Kā jums šķiet, vai &#8220;objektorientētais asamblers&#8221; ir oksimorons? Zinu tikai to, ka &#8220;objektorientācija&#8221; un &#8220;asemblers&#8221; vienmēr ir rādīti kā pretstati. Bet varbūt tak tomēr ir kāds gudrinieks, kurš pamanījies to apvienot?</p>
]]></content:encoded>
			<wfw:commentRss>http://tips.naivist.net/2005/09/23/asm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Modulus</title>
		<link>http://tips.naivist.net/2005/06/06/modulus/</link>
		<comments>http://tips.naivist.net/2005/06/06/modulus/#comments</comments>
		<pubDate>Mon, 06 Jun 2005 07:54:48 +0000</pubDate>
		<dc:creator>Krišs Rauhvargers</dc:creator>
				<category><![CDATA[Datorlietas]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://naivist.net/tips/index.php/2005/06/06/modulus/</guid>
		<description><![CDATA[Rakstot par nesmukajiem datumiem, biju izmantojis šādu izteiksmi: $sundayEveningSpan = ((($now["wday"]-1)%7)*24*60*60);. Rezultātā mainīgais $sundayEveningSpan tiek uzstādīts (tam vajadzētu tikt uzstādītam) uz sekunžu skaitu starp šodienas plkst. 00:00 un šīs pirmdienas 00:00. Vārdu sakot, tiek aprēķināts, cik sekundes pagājušas šajā nedēļā. Kā redzams, izteiksmē parādās operators %, kas atgriež izteiksmes $now["wday"]-1 vērtību pēc moduļa 7. Tas [...]]]></description>
			<content:encoded><![CDATA[<p>Rakstot par <a href="http://naivist.net/tips/index.php/2005/06/03/nesmukie_laiki/" title="Cilvēkam saprotami datumi" onclick="pageTracker._trackPageview('/outgoing/naivist.net/tips/index.php/2005/06/03/nesmukie_laiki/?referer=');">nesmukajiem datumiem</a>, biju izmantojis šādu izteiksmi:  <code>$sundayEveningSpan = ((($now["wday"]-1)%7)*24*60*60);</code>. Rezultātā mainīgais <code>$sundayEveningSpan</code> tiek uzstādīts (tam vajadzētu tikt uzstādītam) uz sekunžu skaitu starp šodienas plkst. 00:00 un šīs pirmdienas 00:00. Vārdu sakot, tiek aprēķināts, cik sekundes pagājušas šajā nedēļā. </p>

<p>Kā redzams, izteiksmē parādās operators %, kas atgriež izteiksmes <code>$now["wday"]-1</code> vērtību pēc moduļa 7. Tas darīts tāpēc, ka PHP <a href="http://lv.php.net/getdate" title="Par GetDate() no php.net" onclick="pageTracker._trackPageview('/outgoing/lv.php.net/getdate?referer=');">funkcijas GetDate()</a> atgrieztajā masīvā <code>wday</code> lauks atgriež &#8220;Numeric representation of the day of the week: 0 (for Sunday) through 6 (for Saturday)&#8221;. Tātad svētdiena ir 0-tā diena, sestiena ir 6. diena. Tā kā man (un arī daudziem citiem latviešiem) nedēļa sākas ar pirmdienu, no dienas numura bija jāatņem vieninieks pēc moduļa 7, lai iegūtu pareizo piekārtojumu: pirmdienai 0, svētdienai <code>(0-1) mod 7</code>, kas vienāds ar 6 <a href="http://en.wikipedia.org/wiki/Modular_arithmetic" title="Par moduļu aritmētiku no wikipedia.org" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Modular_arithmetic?referer=');">klasiskajā moduļu aritmētikā</a>.</p>

<p>Tomēr izrādījās, ka šādi mana funkcija darbojas nekorekti. Izpētot tuvāk, secināju, ka PHP valodai arī ir savas īpatnības &#8211; modulis no negatīva skaitļa ir negatīvs. Tas arī oficiāli ir dokumentēts <a href="http://lv.php.net/manual/en/language.operators.arithmetic.php" title="Par aritmētiskajiem operatoriem" onclick="pageTracker._trackPageview('/outgoing/lv.php.net/manual/en/language.operators.arithmetic.php?referer=');">modulus operatora aprakstā</a>. Tādēļ <code>-1 % 7==-6</code>, nevis 6, kā bija sagaidāms.</p>

<p>Lai novērstu šīs PHP īpatnības sekas, aizstājam -1 ar +6 (kas ir kongruenti pēc moduļa 7) un turpmāk nedēļas sākumu aprēķinām šādi: <code>$sundayEveningSpan = ((($now["wday"]+6)%7)*24*60*60);</code>.</p>

<p>Kā rāda testi, šāda pat problēma novērojama arī <em>Visual Basic.Net</em> un, ļoti iespējams, arī citās <em>.Net</em> valodās. Kā sacīts MSDN, &#8220;The result of x Mod y is the value produced by x – (x \ y) * y&#8221;. Tas nozīmē, ka gadījumā, kad pats <code>x</code> ir negatīvs, arī atgrieztais rezultāts būs negatīvs. </p>

<p>Tā, lūk. Atliek vien secināt, ka programmēšanas valodu veidotājiem ir vienalga, vai tiek saglabāta <a href="http://en.wikipedia.org/wiki/Multiplicative_group_of_integers_modulo_n" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Multiplicative_group_of_integers_modulo_n?referer=');">multiplikatīvās grupas pēc moduļa N</a> un <a href="http://en.wikipedia.org/wiki/Ring_%28algebra%29" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Ring_28algebra_29?referer=');">gredzena</a> īpašība, kas tik svarīga ir matemātiķiem. Un tas, protams, ir tikai normāli &#8211; ja vajadzēs, vienmēr varēsim pieskaitīt 6 tā vietā, lai atņemtu 1.</p>
]]></content:encoded>
			<wfw:commentRss>http://tips.naivist.net/2005/06/06/modulus/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Daudzrindiņu links</title>
		<link>http://tips.naivist.net/2005/06/01/multiline_hyperlinks/</link>
		<comments>http://tips.naivist.net/2005/06/01/multiline_hyperlinks/#comments</comments>
		<pubDate>Wed, 01 Jun 2005 11:16:06 +0000</pubDate>
		<dc:creator>Krišs Rauhvargers</dc:creator>
				<category><![CDATA[Datorlietas]]></category>

		<guid isPermaLink="false">http://naivist.net/tips/index.php/2005/06/01/daudzrindi%c5%86u-links/</guid>
		<description><![CDATA[Ja jūs zinātu, kāaaaa man ir apnicis cīnīties ar to, ka e-pasta klientprogramma neatpazīst garas www adreses. Piemēram, vēstules tekstā ir adrese, kuras pirmo rindiņu MSOutlook rāda zilu un pasvītrotu (jo atpazīst kā adresi), bet otro rāda melnu un nepazīst: http://www.google.lv/search?sourceid=navclient&#38;ie=UTF-8&#38;rls=GGLD,GGLD:2004-4 7,GGLD:en&#38;q=photo+workshop Lai apskatītos, kas tur iekšā, pārkopēju adresi uz Notepad, tur skrienu cauri rindām, [...]]]></description>
			<content:encoded><![CDATA[<p>Ja jūs zinātu, kāaaaa man ir apnicis cīnīties ar to, ka e-pasta klientprogramma neatpazīst garas www adreses. Piemēram, vēstules tekstā ir adrese, kuras pirmo rindiņu MSOutlook rāda zilu un pasvītrotu (jo atpazīst kā adresi), bet otro rāda melnu un nepazīst:</p>

<pre><code>http://www.google.lv/search?sourceid=navclient&amp;ie=UTF-8&amp;rls=GGLD,GGLD:2004-4
7,GGLD:en&amp;q=photo+workshop
</code></pre>

<p>Lai apskatītos, kas tur iekšā, pārkopēju adresi uz Notepad, tur skrienu cauri rindām, velku visu kopā&#8230; garlaicīgi.</p>

<p>Cīnījos ar to, izveidojot <a href="http://en.wikipedia.org/wiki/Bookmarklet" title="Kas ir bookmarkleti" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Bookmarklet?referer=');">bookmarkletu</a>, kas dara šādi: </p>

<pre><code>var s,w=window;
s=w.clipboardData.getData("Text").replace(/\r|\n|\s/g,"");
if(s.indexOf("http://")&gt;-1) 
  w.location.href=s
</code></pre>

<p>Tas ir, paņemam no Windows starpliktuves (clipboard) datus, kas tur šobrīd ir, izdzēšam visas rindas beigu pazīmes, ja palikušais teksts satur http://, tad mēģinām navigēt uz šo lapu. Un viss.</p>

<p>Savelkot to visu kopā, pie favorītiem jāpieliek šāds links:<br />
javascript:(function x(){var s,w=window;s=w.clipboardData.getData(&#8220;Text&#8221;).replace(/\r|\n|\s/g,&#8221;");if(s.indexOf(&#8220;http://&#8221;)>-1) w.location.href=s});x()<br />
Internet Explorer gan dusmosies, ka tas neesot atpazīts protokols, bet nu ko lai dara&#8230; bookmarkleti vispār ir &#8220;hacks&#8221;.</p>

<p>Ja gribas šo lietiņu izmantot, var doties uz manu <a href="http://naivist.net/tips/wp-content/bookmarklets.htm" title="kuu" onclick="pageTracker._trackPageview('/outgoing/naivist.net/tips/wp-content/bookmarklets.htm?referer=');">bookmarkletu lapu</a> un darīt, kā tur rakstīts.</p>
]]></content:encoded>
			<wfw:commentRss>http://tips.naivist.net/2005/06/01/multiline_hyperlinks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Iexplorer ContextMenu</title>
		<link>http://tips.naivist.net/2005/05/30/iexplorer_contextmenu/</link>
		<comments>http://tips.naivist.net/2005/05/30/iexplorer_contextmenu/#comments</comments>
		<pubDate>Mon, 30 May 2005 08:37:47 +0000</pubDate>
		<dc:creator>Krišs Rauhvargers</dc:creator>
				<category><![CDATA[Datorlietas]]></category>
		<category><![CDATA[JScript]]></category>

		<guid isPermaLink="false">http://naivist.net/tips/index.php/2005/05/30/iexplorer-contextmenu/</guid>
		<description><![CDATA[Attiecībā uz tīmekļa sistēmu drošību ir teiciens, ka 100% droša sistēma būs 0% lietojama. Tātad, jo drošāk, jo neērtāk. Tā kā pēdējā laikā ir populāri dažādi phishing pasākumi, arī .lv internetbankas cenšas panākt arvien augstāku savu pakalpojumu drošību. Līdz ar to ne tik vien tiek izmantoti SSL pieslēgumi, nesaprotami lietotāja vārdi un pieprasītas garas un [...]]]></description>
			<content:encoded><![CDATA[<p>Attiecībā uz tīmekļa sistēmu drošību ir teiciens, ka 100% droša sistēma būs 0% lietojama. Tātad, jo drošāk, jo neērtāk. Tā kā pēdējā laikā ir populāri dažādi <a href="http://en.wikipedia.org/wiki/Phishing" title="palasīt no wikipedia par zagšķerēšanu" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Phishing?referer=');">phishing</a> pasākumi, arī .lv internetbankas cenšas panākt arvien augstāku savu pakalpojumu drošību. Līdz ar to ne tik vien tiek izmantoti SSL pieslēgumi, nesaprotami lietotāja vārdi un pieprasītas garas un sarežģītas paroles, bet arī tiek lietotas kodu kartes (tās ir tādas kartiņas ar daudzām burtu/skaitļu virknītēm, katrai virknītei savs numuriņš. Pieslēdzoties e-bankai tiek pieprasīts ievadīt kādu no virknītēm, piemēram septīto pēc kārtas).  </p>

<p>Ideja jau skaista, bet lietojamība&#8230; katru reizi, kad gribi apskatīties, kā tavā kontā vēl joprojām ir tikai 3 santīmi, tev jāmeklē karte, uz tās jāmeklē kodi, tie &#8220;jāpārdrukā&#8221; u.t.t.</p>

<p>Šeit pastāstīšu risinājumu, kā papildināt Internet Explorer <a href="http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/ext/tutorials/context.asp" title="No MSDN par contextMenu" onclick="pageTracker._trackPageview('/outgoing/msdn.microsoft.com/library/default.asp?url=/workshop/browser/ext/tutorials/context.asp&amp;referer=');">contextMenu</a> ar savu funkciju, kas atgriež vajadzīgo kodu kartes ierakstu.</p>

<p>&#8220;Gudrību&#8221; iešujam JavaScript koda gabalā, kurš pārbauda, vai pārlūkprogramma atrodas manas internetbankas lapā un pēc tam no kodu kartes atrod vajadzīgo kodu un to iekopē &#8220;starpliktuvē&#8221; (clipboard).</p>

<pre><code>&lt; SCRIPT LANGUAGE="JavaScript"&gt;
var parentwin = external.menuArguments;
var doc = parentwin.document;
var sel = doc.selection;
var rng = sel.createRange();
var iNum = 0;

//vai esam nokļuvuši e-bankā
if (external.menuArguments.location.host=="mana.e-banka.lv") {

    //ja jā, tad uzstāda kodu kartes vērtības
    var myCodes = new Array("*****", "*****", "*****", "*****", 
                             "*****", "*****", "*****", "*****",
                             "*****", "*****", "*****", "*****", 
                             "*****", "*****", "*****", "*****");
    //kas iezīmēts browser logā?
    if (rng.text!="")
        iNum = rng.text*1;
        //ja iezīmēts skaitlis, mēģina nolasīt kodu
        if (!isNaN(iNum)) 
            window.clipboardData.setData("Text", myCodes[iNum-1]);
        else 
            alert("Nav iezīmēts skaitlis!") 
    }
else {
   alert("Šobrīd Tu neesi bankas lapā!");
}
&lt; /SCRIPT&gt;
</code></pre>

<p>Šādu skriptu saglabājam .htm failā uz cietā diska. Piemēram iekš, c:\i\banka.htm Pēc tam veram vaļā <a href="http://support.microsoft.com/kb/256986/" title="Par registry no Microsofta" onclick="pageTracker._trackPageview('/outgoing/support.microsoft.com/kb/256986/?referer=');">RegEdit</a>, un meklējam šādu zaru: HKEY<em>CURRENT</em>USER\Software\Microsoft\Internet Explorer\MenuExt Iespējams, tur jau priekšā būs kādi ieraksti no Tilde vai kāda cita programmatūras izstrādātāja, kurš savus produktus integrē MSIE. Pievienojam jaunu atslēgu, tās nosaukums būs redzams konteksta dialogā. Piemēram, es pievienoju atslēgu ar nosaukumu &#8220;&amp;KoduKarte&#8221;. Atslēgas <em>Default</em> vērtību uzstāda uz .htm failu, kurā saglabāts skripts, tas ir manā gadījumā, c:\i\banka.htm Papildus tam, atslēgā pievieno DWORD vērtību Contexts, kurā ierakstām &#8220;10&#8243;. Tas nozīmē, ka funkcija kontekstu dialogā būs redzama tikai tad, kad ir iezīmēts teksts. Eksportējot no reģistra, atslēga izskatās šādi:</p>

<pre><code>[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\&amp;KoduKarte]
@="c:\\i\\banka.htm"
"Contexts"=dword:00000010
</code></pre>

<p>Pēc tam atliek  atvērt jaunu InternetExplorer logu un tajā jau būs pieejama jaunā funkcija. Tikai tad, kad būs atvērta internetbankas lapa, tikai tad, kad būs iezīmēts teksts un nospiesta peles labā poga.</p>

<p>Vēlreiz brīdinu, ka šādi darīt nav labi un pavisam noteikti IR SLIKTI, jo šādā veidā Tu samazini Tavas bankas izveidotās drošības sistēmas drošības līmeni. Jo gadījumā, ja kādam citam būs pieeja Tava datora cietajam diskam, viņš(a) varēs nolasīt failu, kur glabājas kodi un tad viņam(ai) atliks TIKAI UZMINĒT TAVU LIETOTĀJA VĀRDU UN PAROLI, lai iekļūtu bankas lapā!</p>
]]></content:encoded>
			<wfw:commentRss>http://tips.naivist.net/2005/05/30/iexplorer_contextmenu/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

