Fonti

Calibri” fonts, kas nāk līdzi Vistai/MSOffice 2007, izskatās briesmīgi, ja to skata ar izslēgtu anti-aliasing.

Šis ir tāds kā kliedziens visiem tiem, kas ieinstalējuši IE7 vai citādā veidā ieguvuši apaļos, izplūdušos burteļus un priecājas par “jauno, webam piemēroto fontu” – nē, neder! Gaidiet, kamēr visa pasaule iešaus sev galvā un ieslēgs to acu mocītāju.

On Wiki

Vikipedia viena pati vēl nav “spēks”, tā ir vienkārši laba un laikam līdzi ejoša enciklopēdija (protams, taisnība ir arī tiem, kuri norāda uz publiskajā domēnā esošas vārdnīcas vājajām vietām).

Tomēr man šķiet, ka īsto viki garšu var sajust, lasot vikipēdijas diskusiju lapas, kas parāda ne tikai meklēto lietu, bet arī citus zināšanu apgabalus meklētās lietas apkaimē. Nu, piemēram, šāda diskusija par OSI modeli.

Var vien pabrīnīties, ka arī latviešu viki ir diskusijas. Piemēram, par Spānijas karaļu vārdiem.

Lasām!

WTF

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 = '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);

Sharepoint, MOSS un WSS – 2007. versija

Šķiet, esmu viens no retajiem LV, kuram šīs lietas vispār interesē, tomēr pastāstīšu – lai jau saglabājas nākotnei.

Kopš šī gada sākuma tīmeklī it bieži tiek pieminēts “jaunais Sharepoint” – visvairāk kā apjūsmojoši ieraksti dažādos blogos, cik ērts gan tas būs. Runa ir par Sharepoint 2007, precīzāk, diviem Sharepoint saimes produktiem – Windows Sharepoint Services (WSS) 3.0 un Microsoft Office Sharepoint Server (MOSS) 2007. Ar ko tie atšķiras? Apmēram ar to pašu, ar ko Notepad atšķiras no Wordpad – ar iespēju bagātību. Ja WSS iedomājamies kā skudrupūzni, tad MOSS ir skudrupūznis ar centrālapkuri, četriem skursteņiem un peldbaseinu pagrabā. Vārdu sakot, MOSS ir daudz papildus lietu – unificēta meklēšanas sistēma, lietotāju individuālie saiti, papildus saitu templeiti, papildus darba plūsmu realizācijas, biznesam svarīgo indikatoru (KPI, key performance indicators) monitorēšana, Excel web servisi utt utt. Vēl viena atšķirība – WSS ir “par velti”, tas ir, kopā ar Windows Server 2003, bet MOSS ir maksas produkts… un dārgs maksas produkts.

Atpakaļ pie pamatstāsta. Solīja jau kādu laiku, šī gada sākumā iznāca pirmā beta versija, kas bija patiešām ar īstu “betas” garšu, šī gada maijā – otrā Beta, augustā – Beta2TR versija. Pagājušajā nedēļā Microsoft paziņoja par galaversijas iznākšanu, pašlaik jebkuram ir pieejama 180 dienu trial versija MOSS un, protams, jebkuram Windows Server 2003 īpašniekam – WSS 3.0 RTW Instalēšanai būs noderīgs .NET Framework 3.0, kas arī tika izziņots pagājušajā nedēļā.

Par jaunumiem šajā versijā. Vēl joprojām Sharepoint kā datu glabātuvi izmanto Microsoft SQL Server, tagad varam lietot gan 2000., gan 2005. versiju. Joprojām tas darbojas kā IIS webservera process (bet, atšķirībā no iepriekšējās versijas, tagad kā normāla ASP.Net aplikācija, nevis ISAPI filtrs). Ir krietni uzlabota Active Directory integrācija, tagad varam precīzāk definēt attiecību “domēna lietotājs:portāla lietotājs”, piemēram, nosakot, kurus portāla lietotāja atribūtus nolasīt no kuriem domēna lietotāja konta atribūtiem (šī atkal laikam tikai mani interesējoša nianse).

Piekļuves tiesību granularitātes līmenis (ak, svešvārdi…). 2003. versijā nebija daudz iespēju – piekļuvi varēja definēt vai nu visam saitam kopā, vai katrai dokumentu bibliotēkai vai sarakstam atsevišķi. Un viss. Jaunajā variantā piekļuves tiesības varam definēt līdz pat ieraksta līmenim, kas ir daudz loģiskāk, ja nepieciešams izveidot koplietošanas dokumentu glabātvi. Šī iemesla dēļ gan sanācis tā, ka tiesību administrēšana ir kļuvusi ķēpīgāka. Ja līdz šim šķita, ka normālā prakse būtu – 1) Sharepoint saita līmenī sadefinēt loģiskas lietotāju grupas 2) Šīm grupām piešķirt tiesības skatīt to vai citu dokumentu bibliotēku, sarakstu, darīt to vai citu darbību 3) Šajās grupās ievietot cilvēkus vai grupas no domēna … tad tagad rodas sajūta, ka “ai, vai tad nu es šī viena dokumenta dēļ taisīšu speciālu grupu?”, tātad tiesības tiek izmētātas pa visu saitu.

Audiences (šķiet, šī ir MOSS, nevis WSS iespēja). Katram ierakstam varam norādīt mērķauditoriju (target audiences), t.i., grupas, kam tas varētu būt interesants. Tāpat – lapā ievietotam webpart-am var norādīt auditoriju. Ja pareizi saprotu, piekļuve šādā veidā netiek aizliegta, bet attiecīgais ieraksts vai webparts tiek aizvākts no to lietotāju acīm, kam tas nebūs vajadzīgs. Un tas ir ērti.

Navigācijas sistēma. Jau noklusētajā shēmā tā ir stipri sakarīga. 1) katram saitam var veidot savu augšējo navigācijas paneli, sastāvošu no atsevišķām cilnēm (tabs). Ir izvēle, vai mantot “parent” saita tabus, vai izmantot savējos. 2) stipri labāks ‘quick launch’ menu saita kreisajā malā. Ir izvēle, vai nu automātiski ģenerēt no visām dokumentu bibliotēkām un sarakstiem, vai veidot pašam savējo 3) breadcrumbs pasākums, kas parāda vertikālo navigāciju saitu struktūrās. Visumā ir sajūta, ka apmaldīties nevarēs.

Darba plūsmu programmēšana. Kopā ar Windows Workflow Foundation ir atnākusi iespēja strādāt ar darba plūsmām arī no Sharepoint. Ir sajūta, ka te ir savāktas vienkāršākās un nepieciešamākās lietas no Biztalk Server un palaistas plašākās tautās. Līdz ar to tādi procesi kā dažādu veidu vīzēšana, atsauksmju savākšana, atbilžu sagatavošana un citi darbiņi, ko cilvēki veic nelielās komandās, ir aprakstāmi un programmējami arī šajā vidē.

Multiple lookups. Iepriekšējā Sharepoint versijā sarakstam bija iespējams izveidot lauku, kurš norāda uz cita tajā pašā saitā esoša saraksta konkrētu ierakstu. Piemēram, cilvēku tabulā varētu būt lauks, kas ir norāde uz struktūrvienību sarakstu. Līdz šim nebija iespējams apskatīt situāciju, kad cilvēks strādātu vairākās struktūrvienībās vienlaicīgi. Tagad ir.

Custom field types. Šis ir interesants. Pēc noklusējuma Sharepoint sarakstiem var pievienot laukus ar tipiem kā “text”, “multiline text”, “number”, “date”, “choice”, “lookup”… tagad varam veidot savus tipus. Nu, kaut vai tas pats iecienītais piemērs ar personas kodu – zināms teksta formāts, zināms garums. Atliek tikai izstrādāt savu klasi, kas mantota no SPField tipa, izveidot rediģēšanas kontroli savam lauka tipam (Jo Sharepoint taču automātiski ģenerē datu ievades un parādīšanas formas katram sarakstam), varbūt vēl neliela čupiņa koda… un tam ir jādarbojas. Pagaidām neesmu izmēģinājis, bet jau ticu, ka būs labi.

Wiki un Blog saitu templeiti. Nezinu, pagaidām nešķiet, ka jaunā spēļmantiņa būs tik vērta, cik viņi paši sola. Wiki sintakse ne tuvu nelīdzinās wikipedia iespējām, blogi it kā ok, pat komentēt var… bet kaut kā nav ērti, vismaz ne priekš tiem, kas paši tajos raksta.

Overall – labais! Uzrakstīšu citreiz vēl, šoreiz jau tā par garu sanāca.

Always, ALWAYS initialize!

What output would you expect from such a piece of code (VB.net, of course):

    Imports System.Globalization
    .... 
    Dim CurrentCalendar As System.Globalization.Calendar = _
                CultureInfo.CurrentUICulture.Calendar

    'We want to output all the dates in the current year for every month.
    For iMonth As Integer = 1 To 12
        Dim sOutput As String
        'accumulate all the dates
        For iDay As Integer = 1 To CurrentCalendar.GetDaysInMonth(Now.Year, iMonth)
            sOutput &= iDay & ","
        Next
         'print out all the accumulated dates
        Console.WriteLine(sOutput.TrimEnd(","c))
    Next

I’d say it must be

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31

but, the hell, no, it is:

(1st line)
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
(2nd line)
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,1,2,3,
                   ...other Februray dates..28
(3rd line)
...January dates...February dates...March dates...
(4th line)
...January dates...February dates...March dates...April dates...
(5th line)
...January dates...February dates...March dates...May dates...   
....
(12th line)
...January dates...February dates...March dates...May dates...December dates...

This means that even though the variable s is re-declared, it is not being re-initialized! Just… keep it in mind.

Hint: instead of being Dim sOutput As String it should be Dim sOutput As String="" if we still want to keep this syntax.

IsUserInGroup updated

In an earlier article I’ve been talkin about how to check if a user belongs to a specific domain group. However, the code in that article doesn’t work on local groups and WinNT ADSI provider. I’ve made an update to the code posted there, this should work both on domain and local groups.

Usage:

If IsUserInGroup("Contoso\JohnDoe", "Contoso\Managers") Then
   '...do something
End If

Notes:

  • Option Strict Off. Sorry, I’m using the GetObject magic function here, so there’s no way I could leave the option strict on.
  • Seems to be quite slow when local groups are scanned from outside.
  • Could be a problem when you have users from two different domains + local users.

    Continue reading IsUserInGroup updated

Par “conditional comments”

Ir tāda lieta HTMLā kā “conditional comments“, kas ir parasti SGML komentāri, kurus Internet Explorer 5+ tomēr “lasa” un mēģina saprast. Un ja tur atrodas [if kautkas] tad tas tiek ņemts vērā.

Parasti tiek lietots, lai speciāli priekš IE ielādētu papildus CSS failu vai “pielabotu” atsevišķas CSS definīcijas, bet tikpat labi, lūk, arī alternatīvs pielietojums nosacījumam “ja tiek lietots IE”.

<!--[if IE]>
<a href="http://www.getfirefox.com/" title="Browse happy">Go get firefox</a>
<![endif]-->

Word to Markdown converter

Some smart people who didn’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 “bold text” like “__bold text__”. Other rules can be found in the syntax page.

However, when you have a MS Word document with several pages of bolds, italics and lists, you don’t really want to re-code all the markup.

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

  • Replace bold and italics
  • Replace headings (marked heading1-6)
  • Replace numbered and bulleted lists

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

Click here to download the code.

To use the code:

  • open WinWord,
  • press Alt+F11 to open the VBA editor,
  • right click the first project in the project browser
  • choose insert->module
  • paste the code from the file
  • close macro editor
  • go tools>macro>macros; run the macro named MarkDown

cmdSave.Enabled = False

Nemaz nav prātīgi domāt, ka, ASP.Net kontrole (piemēram, poga), kas it kā ir “atspējota” (disabled, not enabled), patiesībā tāda ir. Vienīgais, ko patiesībā ASP.Net izdara, ir, ģenerējot HTML kodu, kontroles kodā ieraksta disabled=true.

Taču, ja šo pogu klienta pusē atkal “iespējojam” (eneiblojam), piemēram, ar šāda te:

javascript:( 
    function(){
      d=document;
      l=d.getElementsByTagName("INPUT");
      for(var i=0;i<l.length;i++){
         l[i].disabled=false}
 }())

JavaScript bookmarkleta palīdzību, ASP.Net neveiks nekādas servera puses pārbaudes, vai poga ir bijusi ieslēgta, vai nav. Tas jādara pašiem. Vislabāk nemaz nedot lietotājam rokās pogu, kuru nevar nospiest, bet, ja gribas saglabāt skaistu interfeisu, tad cmdSave_Click(...) kods jāpapildina ar pārbaudi, vai poga šobrīd vispār ir ieslēgta.

Paldies par uzmanību :-)