Archiv autora: admin

Hrátky s barvami a pohybem objektů

Pro svoji potřebu jsem vytvořil skript v powershellu, který zobrazí okno a v něm barvy podle definovaných jmen. Je zde možnost si barvy ručně přesouvat pro lepší provnání barev mezi sebou. Ve skriptu je použito několik neběžných postupů. Snad to někomu pomůže. Skript lze stáhnout zde

Barvy1

void][System.Reflection.Assembly]::LoadWithPartialName(„System.Windows.Forms“)
[void][System.Reflection.Assembly]::LoadWithPartialName(„System.Drawing“)

# při nastavení proměnné $Debug na $true se budou vypisovat ladící informace
#$Debug=$true;
$Debug=$false;

$JmVyst = „C:\PSS\pokus.txt“; # nastavení jména a umístění logovacího souboru

# vytvoříme prázdný logovací soubor $JmVyst -použijeme jen v Debug režimu
if ($Debug) { echo “ > $JmVyst;}

#$TextHnedy1 = [System.Drawing.Color]::FromArgb(0xFF00744C)
$i=10
$PocetRadkuBarev=29;
$velikostPopisu = New-Object System.Drawing.Size(240, 18)

# velikost barevneho prouzku
#
$PodkladHnedy1 = [System.Drawing.Color]::FromArgb(0x7FF0D090)
$PodkladHnedy2 = [System.Drawing.Color]::FromArgb(0x70E0D0A0)

$script:Stisknuto = $false
$script:RelativneL = New-Object System.Drawing.Point(0, 0)

$mujFont = New-Object System.Drawing.Font(„Courier New“, 10, 0, 3, 0)

# pokud Stiskneme tlacitko nad barevným páskem – Label – zjistime souradnice mysi relativne uvnitr Label
function lblMouseDown($OBJ)
{
# nejprve absolutní hodnota na screenu
$curzor = [System.Windows.Forms.Cursor]::Position
# relativne k pasku
$script:RelativneL = $OBJ.PointToClient($curzor)
# $Labelx.Text = [string]$cursor.x
# $Labely.Text = [string]$cursor.y
# [System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point(0, 0)
$script:Stisknuto = $true # nastavime stav stisknuto
# – neumim to zjistit jinak

$OBJ.BringToFront() # dáme si náš pásek do popředí
}

function lblMouseUp { $script:Stisknuto = $false } # až uvolnime tlačítko – změníme status

# Pohyb myši
function lblMouseMove($OBJ)
{
# aktualní pozice
$curzor = [System.Windows.Forms.Cursor]::Position
# relativni pozice vzhledem k oknu formulaře – odečtený posun v rámci proužku
$RelativneF = $frmColor.PointToClient($curzor)-$script:RelativneL

if ($script:Stisknuto)
{
$OBJ.Location = $RelativneF # změníme pozici poroužku v okně
#- proužek se zobrazí na novém místě – hýbe se
}
}

# Ovládací rutina na srovnání ručně posunutých barevných proužků
function btnSrovnat_OnClick
{
$vx=[int]$VelikostPopisu.width

# nejprve si projedeme pole $lblColor a vypočítáme pořadí podle aktualních souřadnic jednotlivých proužků
for($i=0; $i -lt $lblColor.Count; $i++) {
$a=$lblColor[$i]
$x=($a.Location.x+$Vx+10)/$Vx ; $x=[math]::round($x) ;
$y = $a.Location.y
$poradi = $x*1000 + $y
# Vypočítané nové pořadí uloříme do pole xColor
$xColor[$i][3] = $poradi
# pro další účely si zapíšeme do logovacího souboru $JmVyst
if ($Debug) {
$mytmp=[string]$x +‚ | ‚+[string]$y +‚ | ‚+$xColor[$i][0] +‘ | ‚+$xColor[$i][1]+ ‚ | ‚ +[string]$xColor[$i][2]+ ‚ | ‚ + [string]$xColor[$i][3]
echo $mytmp >> $JmVyst
# $lblINFO.Text = $mytmp
} # If Debug
} # konec FOR lblColor

# Podle nového pořadí setřídíme pole xColor
$xColor = $xColor | Sort-Object @{ Expression = { $_[3] } ; Ascending = $true }

# —- provedeme nové přepsání podle setříděného pole xColor
$x = 10 ; $y = 10 ; # x,y souřadnice proužků
for($i=0;$i -lt $xColor.Count;$i++){
$a=$xColor[$i]
if ($Debug) {
# Zde si přepíšeme do logovacího souboru jednotlivé řádky, které lze použít pro ruční přepsání inicializace xColor v tomto skriptu
$radek = ‚$xColor += ‚ + „“;“ + ‚ $xColor[-1] = @(„‚ + $xColor[$i][0] + ‚“, „‚ + $xColor[$i][1] + ‚“,‘  + [string]$i + ‚,‘+[string]$xColor[$i][3]+‚);‘
echo $radek >> $JmVyst
}
#
# nastavíme proužku nové – normalizované – souřadnice
$lblColor[$a[2]].Location = New-Object System.Drawing.Point($x, $y)

if ($Debug) {
$Trideni=[string]$xColor[$i][3]
$lblColor[$a[2]].Text = $i.ToString().PadLeft(3) +‚ ‚+ $Trideni.Padleft(6)+‚ | ‚+ $a[1].Substring(4,6)+‚ ‚+$a[0]
}

$y += $velikostPopisu.Height; # posuneme na další řádek
if ((($i+1)%$PocetRadkuBarev) -eq 0) {$x += $velikostPopisu.Width ; $y = 10;} # po dosažení $PocetRadkuBarev pujdeme na další sloupec
}

#$frmColor.close();
# [System.Windows.Forms.Application]::Exit($null);

}

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$frmColor = New-Object System.Windows.Forms.Form
$frmColor.ClientSize = New-Object System.Drawing.Size(1224, 600)
$frmColor.font = $mujFont ; # Nastavíme pro okno $frmColor svůj font
$frmColor.Text = „Barvy“;

$xColor = @( );
# v této sekci naplníme pole xColor –
# [0] pojmenovanými barvami
# [1] popisem v
# [2] vazba na pole lblColor – naplněno později
# [3] vypočítané pořadí
# !!! pole se musí tak, že nejprve vytvoříme prázdnou buňku a do ní pak vložíme pole @, aby vzniklo dvojroměrné pole
# [-1] je poslední, právě přidaná, buňka pole
# $xColor += @(,.,…) provede vytvoření jednorozměrného pole – pěkná schiza
# tuto sekci můžeme přepsat odpovídajícím výstupem v logovacím souboru
#—————–
$xColor += “; $xColor[-1] = @(„Transparent“, „0x00FFFFFF“,0,1010);
$xColor += “; $xColor[-1] = @(„WhiteSmoke“, „0xFFF5F5F5“,1,1028);
$xColor += “; $xColor[-1] = @(„Gainsboro“, „0xFFDCDCDC“,2,1046);
$xColor += “; $xColor[-1] = @(„LightGray“, „0xFFD3D3D3“,3,1064);
$xColor += “; $xColor[-1] = @(„Silver“, „0xFFC0C0C0“,4,1082);
$xColor += “; $xColor[-1] = @(„DarkGray“, „0xFFA9A9A9“,5,1100);
$xColor += “; $xColor[-1] = @(„Gray“, „0xFF808080“,6,1118);
$xColor += “; $xColor[-1] = @(„DimGray“, „0xFF696969“,7,1136);
$xColor += “; $xColor[-1] = @(„Black“, „0xFF000000“,8,1154);
$xColor += “; $xColor[-1] = @(„DarkSlateGray“, „0xFF2F4F4F“,9,1172);
$xColor += “; $xColor[-1] = @(„SlateGray“, „0xFF708090“,10,1190);
$xColor += “; $xColor[-1] = @(„LightSlateGray“, „0xFF778899“,11,1208);
$xColor += “; $xColor[-1] = @(„DarkSlateBlue“, „0xFF483D8B“,12,1226);
$xColor += “; $xColor[-1] = @(„SlateBlue“, „0xFF6A5ACD“,13,1244);
$xColor += “; $xColor[-1] = @(„MediumSlateBlue“, „0xFF7B68EE“,14,1262);
$xColor += “; $xColor[-1] = @(„MediumPurple“, „0xFF9370DB“,15,1280);
$xColor += “; $xColor[-1] = @(„Magenta“, „0xFFFF00FF“,16,1298);
$xColor += “; $xColor[-1] = @(„Fuchsia“, „0xFFFF00FF“,17,1316);
$xColor += “; $xColor[-1] = @(„MediumVioletRed“, „0xFFC71585“,18,1334);
$xColor += “; $xColor[-1] = @(„DeepPink“, „0xFFFF1493“,19,1352);
$xColor += “; $xColor[-1] = @(„HotPink“, „0xFFFF69B4“,20,1370);
$xColor += “; $xColor[-1] = @(„Pink“, „0xFFFFC0CB“,21,1388);
$xColor += “; $xColor[-1] = @(„LightPink“, „0xFFFFB6C1“,22,1406);
$xColor += “; $xColor[-1] = @(„Thistle“, „0xFFD8BFD8“,23,1424);
$xColor += “; $xColor[-1] = @(„Plum“, „0xFFDDA0DD“,24,1442);
$xColor += “; $xColor[-1] = @(„Violet“, „0xFFEE82EE“,25,1460);
$xColor += “; $xColor[-1] = @(„Orchid“, „0xFFDA70D6“,26,1478);
$xColor += “; $xColor[-1] = @(„MediumOrchid“, „0xFFBA55D3“,27,1496);
$xColor += “; $xColor[-1] = @(„DarkOrchid“, „0xFF9932CC“,28,1514);
$xColor += “; $xColor[-1] = @(„BlueViolet“, „0xFF8A2BE2“,29,2010);
$xColor += “; $xColor[-1] = @(„DarkViolet“, „0xFF9400D3“,30,2028);
$xColor += “; $xColor[-1] = @(„DarkMagenta“, „0xFF8B008B“,31,2046);
$xColor += “; $xColor[-1] = @(„Purple“, „0xFF800080“,32,2064);
$xColor += “; $xColor[-1] = @(„Indigo“, „0xFF4B0082“,33,2082);
$xColor += “; $xColor[-1] = @(„MidnightBlue“, „0xFF191970“,34,2100);
$xColor += “; $xColor[-1] = @(„DarkBlue“, „0xFF00008B“,35,2118);
$xColor += “; $xColor[-1] = @(„Navy“, „0xFF000080“,36,2136);
$xColor += “; $xColor[-1] = @(„MediumBlue“, „0xFF0000CD“,37,2154);
$xColor += “; $xColor[-1] = @(„Blue“, „0xFF0000FF“,38,2172);
$xColor += “; $xColor[-1] = @(„RoyalBlue“, „0xFF4169E1“,39,2190);
$xColor += “; $xColor[-1] = @(„SteelBlue“, „0xFF4682B4“,40,2208);
$xColor += “; $xColor[-1] = @(„CornflowerBlue“, „0xFF6495ED“,41,2226);
$xColor += “; $xColor[-1] = @(„DodgerBlue“, „0xFF1E90FF“,42,2244);
$xColor += “; $xColor[-1] = @(„DeepSkyBlue“, „0xFF00BFFF“,43,2262);
$xColor += “; $xColor[-1] = @(„DarkTurquoise“, „0xFF00CED1“,44,2280);
$xColor += “; $xColor[-1] = @(„MediumTurquoise“, „0xFF48D1CC“,45,2298);
$xColor += “; $xColor[-1] = @(„Turquoise“, „0xFF40E0D0“,46,2316);
$xColor += “; $xColor[-1] = @(„Cyan“, „0xFF00FFFF“,47,2334);
$xColor += “; $xColor[-1] = @(„Aqua“, „0xFF00FFFF“,48,2352);
$xColor += “; $xColor[-1] = @(„Aquamarine“, „0xFF7FFFD4“,49,2365);
$xColor += “; $xColor[-1] = @(„SkyBlue“, „0xFF87CEEB“,50,2370);
$xColor += “; $xColor[-1] = @(„LightSkyBlue“, „0xFF87CEFA“,51,2388);
$xColor += “; $xColor[-1] = @(„LightSteelBlue“, „0xFFB0C4DE“,52,2406);
$xColor += “; $xColor[-1] = @(„LightBlue“, „0xFFADD8E6“,53,2424);
$xColor += “; $xColor[-1] = @(„PowderBlue“, „0xFFB0E0E6“,54,2442);
$xColor += “; $xColor[-1] = @(„PaleTurquoise“, „0xFFAFEEEE“,55,2460);
$xColor += “; $xColor[-1] = @(„Lavender“, „0xFFE6E6FA“,56,2478);
$xColor += “; $xColor[-1] = @(„LightCyan“, „0xFFE0FFFF“,57,2496);
$xColor += “; $xColor[-1] = @(„Azure“, „0xFFF0FFFF“,58,2514);
$xColor += “; $xColor[-1] = @(„AliceBlue“, „0xFFF0F8FF“,59,3010);
$xColor += “; $xColor[-1] = @(„LightSeaGreen“, „0xFF20B2AA“,60,3028);
$xColor += “; $xColor[-1] = @(„CadetBlue“, „0xFF5F9EA0“,61,3046);
$xColor += “; $xColor[-1] = @(„DarkCyan“, „0xFF008B8B“,62,3064);
$xColor += “; $xColor[-1] = @(„Teal“, „0xFF008080“,63,3082);
$xColor += “; $xColor[-1] = @(„MediumAquamarine“, „0xFF66CDAA“,64,3100);
$xColor += “; $xColor[-1] = @(„MediumSpringGreen“, „0xFF00FA9A“,65,3136);
$xColor += “; $xColor[-1] = @(„SpringGreen“, „0xFF00FF7F“,66,3154);
$xColor += “; $xColor[-1] = @(„DarkSeaGreen“, „0xFF8FBC8F“,67,3172);
$xColor += “; $xColor[-1] = @(„LightGreen“, „0xFF90EE90“,68,3190);
$xColor += “; $xColor[-1] = @(„PaleGreen“, „0xFF98FB98“,69,3208);
$xColor += “; $xColor[-1] = @(„MediumSeaGreen“, „0xFF3CB371“,70,3226);
$xColor += “; $xColor[-1] = @(„SeaGreen“, „0xFF2E8B57“,71,3244);
$xColor += “; $xColor[-1] = @(„DarkGreen“, „0xFF006400“,72,3262);
$xColor += “; $xColor[-1] = @(„Green“, „0xFF7f6042“,73,3280);
$xColor += “; $xColor[-1] = @(„ForestGreen“, „0xFF228B22“,74,3298);
$xColor += “; $xColor[-1] = @(„LimeGreen“, „0xFF32CD32“,75,3316);
$xColor += “; $xColor[-1] = @(„Lime“, „0xFF00FF00“,76,3334);
$xColor += “; $xColor[-1] = @(„LawnGreen“, „0xFF7CFC00“,77,3352);
$xColor += “; $xColor[-1] = @(„Chartreuse“, „0xFF7FFF00“,78,3370);
$xColor += “; $xColor[-1] = @(„YellowGreen“, „0xFF9ACD32“,79,3388);
$xColor += “; $xColor[-1] = @(„GreenYellow“, „0xFFADFF2F“,80,3406);
$xColor += “; $xColor[-1] = @(„DarkOliveGreen“, „0xFF556B2F“,81,3424);
$xColor += “; $xColor[-1] = @(„OliveDrab“, „0xFF6B8E23“,82,3442);
$xColor += “; $xColor[-1] = @(„Olive“, „0xFF808000“,83,3460);
$xColor += “; $xColor[-1] = @(„DarkKhaki“, „0xFFBDB76B“,84,3478);
$xColor += “; $xColor[-1] = @(„Khaki“, „0xFFF0E68C“,85,3496);
$xColor += “; $xColor[-1] = @(„PaleGoldenrod“, „0xFFEEE8AA“,86,3514);
$xColor += “; $xColor[-1] = @(„Yellow“, „0xFFFFFF00“,87,4010);
$xColor += “; $xColor[-1] = @(„Gold“, „0xFFFFD700“,88,4028);
$xColor += “; $xColor[-1] = @(„Goldenrod“, „0xFFDAA520“,89,4046);
$xColor += “; $xColor[-1] = @(„DarkGoldenrod“, „0xFFB8860B“,90,4064);
$xColor += “; $xColor[-1] = @(„SaddleBrown“, „0xFF8B4513“,91,4082);
$xColor += “; $xColor[-1] = @(„Sienna“, „0xFFA0522D“,92,4100);
$xColor += “; $xColor[-1] = @(„Tan“, „0xFFD2B48C“,93,4118);
$xColor += “; $xColor[-1] = @(„BurlyWood“, „0xFFDEB887“,94,4136);
$xColor += “; $xColor[-1] = @(„NavajoWhite“, „0xFFFFDEAD“,95,4154);
$xColor += “; $xColor[-1] = @(„Moccasin“, „0xFFFFE4B5“,96,4172);
$xColor += “; $xColor[-1] = @(„Wheat“, „0xFFF5DEB3“,97,4190);
$xColor += “; $xColor[-1] = @(„Bisque“, „0xFFFFE4C4“,98,4208);
$xColor += “; $xColor[-1] = @(„PeachPuff“, „0xFFFFDAB9“,99,4226);
$xColor += “; $xColor[-1] = @(„LemonChiffon“, „0xFFFFFACD“,100,4244);
$xColor += “; $xColor[-1] = @(„LightGoldenrodYellow“, „0xFFFAFAD2“,101,4262);
$xColor += “; $xColor[-1] = @(„BlanchedAlmond“, „0xFFFFEBCD“,102,4280);
$xColor += “; $xColor[-1] = @(„AntiqueWhite“, „0xFFFAEBD7“,103,4298);
$xColor += “; $xColor[-1] = @(„Cornsilk“, „0xFFFFF8DC“,104,4316);
$xColor += “; $xColor[-1] = @(„Beige“, „0xFFF5F5DC“,105,4334);
$xColor += “; $xColor[-1] = @(„PapayaWhip“, „0xFFFFEFD5“,106,4352);
$xColor += “; $xColor[-1] = @(„SeaShell“, „0xFFFFF5EE“,107,4370);
$xColor += “; $xColor[-1] = @(„FloralWhite“, „0xFFFFFAF0“,108,4388);
$xColor += “; $xColor[-1] = @(„OldLace“, „0xFFFDF5E6“,109,4406);
$xColor += “; $xColor[-1] = @(„Linen“, „0xFFFAF0E6“,110,4424);
$xColor += “; $xColor[-1] = @(„Snow“, „0xFFFFFAFA“,111,4442);
$xColor += “; $xColor[-1] = @(„LightYellow“, „0xFFFFFFE0“,112,4460);
$xColor += “; $xColor[-1] = @(„Ivory“, „0xFFFFFFF0“,113,4478);
$xColor += “; $xColor[-1] = @(„GhostWhite“, „0xFFF8F8FF“,114,4496);
$xColor += “; $xColor[-1] = @(„Honeydew“, „0xFFF0FFF0“,115,4514);
$xColor += “; $xColor[-1] = @(„MintCream“, „0xFFF5FFFA“,116,5010);
$xColor += “; $xColor[-1] = @(„White“, „0xFFFFFFFF“,117,5028);
$xColor += “; $xColor[-1] = @(„MistyRose“, „0xFFFFE4E1“,118,5046);
$xColor += “; $xColor[-1] = @(„LavenderBlush“, „0xFFFFF0F5“,119,5064);
$xColor += “; $xColor[-1] = @(„RosyBrown“, „0xFFBC8F8F“,120,5082);
$xColor += “; $xColor[-1] = @(„PaleVioletRed“, „0xFFDB7093“,121,5100);
$xColor += “; $xColor[-1] = @(„IndianRed“, „0xFFCD5C5C“,122,5118);
$xColor += “; $xColor[-1] = @(„Salmon“, „0xFFFA8072“,123,5136);
$xColor += “; $xColor[-1] = @(„LightSalmon“, „0xFFFFA07A“,124,5154);
$xColor += “; $xColor[-1] = @(„LightCoral“, „0xFFF08080“,125,5172);
$xColor += “; $xColor[-1] = @(„DarkSalmon“, „0xFFE9967A“,126,5190);
$xColor += “; $xColor[-1] = @(„Coral“, „0xFFFF7F50“,127,5208);
$xColor += “; $xColor[-1] = @(„Tomato“, „0xFFFF6347“,128,5226);
$xColor += “; $xColor[-1] = @(„DarkOrange“, „0xFFFF8C00“,129,5244);
$xColor += “; $xColor[-1] = @(„Orange“, „0xFFFFA500“,130,5262);
$xColor += “; $xColor[-1] = @(„SandyBrown“, „0xFFF4A460“,131,5280);
$xColor += “; $xColor[-1] = @(„Peru“, „0xFFCD853F“,132,5298);
$xColor += “; $xColor[-1] = @(„Chocolate“, „0xFFD2691E“,133,5316);
$xColor += “; $xColor[-1] = @(„OrangeRed“, „0xFFFF4500“,134,5334);
$xColor += “; $xColor[-1] = @(„Brown“, „0xFFA52A2A“,135,5352);
$xColor += “; $xColor[-1] = @(„Firebrick“, „0xFFB22222“,136,5370);
$xColor += “; $xColor[-1] = @(„Maroon“, „0xFF800000“,137,5388);
$xColor += “; $xColor[-1] = @(„DarkRed“, „0xFF8B0000“,138,5406);
$xColor += “; $xColor[-1] = @(„Red“, „0xFFFF0000“,139,5424);
$xColor += “; $xColor[-1] = @(„Crimson“, „0xFFDC143C“,140,5442);
#—————–

$x = 10 ; $y = 10 ;
# setřídíme pole xColor podle čtvrté buňky tj [3], začínáme nulou
$xColor = $xColor | Sort-Object @{ Expression = { $_[3] } ; Ascending = $true }

# pole lblColor bude uchovávat vlastní objekty label
$lblColor = @( );

#~ ~ < lblColor1 > ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
#foreach ($bColor in $xColor) # raději jsem volil cyklus FOR – vím přesně, který prvek pole zpracovávám
for ($i=0;$i -lt $xColor.Count; $i++)
{
$bColor=$xColor[$i]; # jeden prvek pole xColor, z kterého si budeme brát odpovídající parametry
$lblColor += “ ;
$lblColor[$i] = New-Object System.Windows.Forms.Label
$lblColor[$i].Location = New-Object System.Drawing.Point($x, $y)
$lblColor[$i].Size = $velikostPopisu
$lblColor[$i].TabIndex = $i;
# zobrazovaný text na proužku
if ($Debug) {
$Trideni=[string]$bcolor[3]
$lblColor[$i].Text = $i.Tostring().PadLeft(3) +‘ ‚+ $Trideni.Padleft(6)+‘ | ‚+ $bcolor[1].Substring(4,6)+‘ ‚+$bcolor[0]
} else {
$lblColor[$i].Text = $bcolor[1].Substring(4,6)+‘ ‚+$bcolor[0]
}

# zobrazovaná barva
$lblColor[$i].BackColor = [System.Drawing.Color]::FromName($bcolor[0])

# jednotlivé složky Barvy 0xA-R-G-B-)
$bA = [int](‚0x‘ + $bcolor[1].Substring(2,2) )
$bR = [int](‚0x‘ + $bcolor[1].Substring(4,2) )
$bG = [int](‚0x‘ + $bcolor[1].Substring(6,2) )
$bB = [int](‚0x‘ + $bcolor[1].Substring(8,2) )
$bRGB = [int]( ‚0x‘ + $bcolor[1].Substring(4,6) )

$bSuma = ($bB + $bG + $bR) # pro určení světlosti – pisma na proužku
$y += $velikostPopisu.Height ;
# barva buď černá nebo bílá
if ($bSuma -lt 300) { $lblColor[-1].ForeColor = [System.Drawing.Color]::white }
else { $lblColor[-1].ForeColor = [System.Drawing.Color]::black }
if ((($i+1)%$PocetRadkuBarev) -eq 0) {$x += 240 ; $y = 10;} # kreslit na další sloupec

# ulozime vazbu mezi lblColor a xColor – pro případné překreslování tlačítkem Setrid
$xColor[$i][2]=$i
# a tady je to potřebné navázání pro pohyb proužku – LABELu Add_XXXXX, kde XXXXX je potřebná událost a následně rutina, která ji obslouží
# $this je aktualní objekt tj $lblColor[$i],
# pokud bychom napsali např { lblMouseDown $lblColor[$i] }, pak se bude používat nasposledy zpracovaný objekt pro všechna volání na všech objektech (Labelech)
# $lblColor[5].Add_MouseDown({ lblMouseDown $lblColor[5] }) už bude správně používat odpovídající objekt

$lblColor[$i].Add_MouseDown({ lblMouseDown $this })
$lblColor[$i].Add_MouseUp({ lblMouseUp })
$lblColor[$i].Add_MouseMove({ lblMouseMove $this })

$frmColor.Controls.Add($lblColor[$i])
}

# Teď přidáme tlačítko, které vyvolá nové seřazení
$x=10; $y= ($velikostPopisu.Height*$pocetRadkuBarev)+10 ;
$btnSrovnat = New-Object System.Windows.Forms.Button
$btnSrovnat.Location = New-Object System.Drawing.Point($x, $y)
$btnSrovnat.Size = New-Object System.Drawing.Size(135, 53)
$btnSrovnat.TabIndex = 0
$btnSrovnat.Text = „Srovnat“
$btnSrovnat.UseVisualStyleBackColor = $true
$btnSrovnat.add_Click({btnSrovnat_OnClick})
$frmColor.Controls.Add($btnSrovnat)

$lblINFO = New-Object System.Windows.Forms.Label
if ($debug) {
$Radek=‘ x=’+$x.ToString()+‘ y=’+$y.ToString()   + ‚  VelkostPopisu=‘ +$velikostPopisu.Height.ToString()+ ‚ pocetR=’+$pocetRadkuBarev.ToString()
} else {    $Radek=“
}
$lblINFO.Text = $Radek;
$lblINFO.Size = New-Object System.Drawing.Size(400, 80)
$lblINFO.Location = New-Object System.Drawing.Point(200, 550)
$frmColor.Controls.Add($lblINFO)

function Main
{
[System.Windows.Forms.Application]::EnableVisualStyles()
[System.Windows.Forms.Application]::Run($frmColor)
}

Main # This call must remain below all other event functions

Hromadná normalizace názvů souborů a adresářů pomocí powershelu

 

 

Potřeboval jsem provést normalizaci jmen souborů a adresářů, tak, abych je případně mohl použít pro webový přístup.  Skript není úplně optimalizovaný a chybí v něm ošetření neúspěšných přejmenování.
pozn: zase mě v powershelu dostalo volání a vracení hodnot funkce
funkce voláme: Jmeno_funce Parametr1 Parametr2 a nikoli
Jmeno_funce(Parametr1, Parametr2).
V druhém případě se poweshell snaží vyhodnotit výraz v závorce, který vloží jako jediný parametr.
Dále pokud pro testovací účely použiju příkaz echo místo funkce [System.Console]::WriteLine, pak se výstup z echa dostává do vrácené hodnoty.
Zkuste si pohrát s:

function pokus1 {
echo „AB“;
return „CD“;
}

function pokus2 {
echo „EF“;
return pokus1;
}

$A=pokus2 ;
echo $A;
echo „—„;
echo („Vysledek=“ + $A);
echo $(„Vysledek=“ + $A);

Docela zmatečné výsledky

Tady je vlastní zdroják:

# NormalizeDIRs

$ROOTdir=“V:\Zaznamy_ze_skoleni“;
# pole kam se budou ukládat plné jména přejmenovaných adresářů. Pokud tam není nalezena shoda, tak adresář přejmenuj
$script:APrejmenovano=@();

# Pokud je v poli APrejmenovano již uloženo plné jméno adresáře, není už třeba přejmenovávat
# v podstatě je to funkce navíc…
function NeedRename {
param ($CeleJmeno)

# [System.Console]::WriteLine(„NeedRename: “ + $CeleJmeno);
foreach ($B in $script:APrejmenovano){
     if ($B.FullName -eq $CeleJmeno) { return „NE“; }
   }
   return „ANO“;
}
#———————-

# odstraní diakritiku
function RemoveDiacritics {
param ($s)

#[System.Console]::WriteLine(„RemoveDiacritics=“ + $s);
$s = $s.Normalize([System.Text.NormalizationForm]::FormD);
   $sb = „“;
   for ($i = 0; $i -lt $s.Length; $i++) {
     if ([System.Globalization.CharUnicodeInfo]::GetUnicodeCategory($s[$i]) -ne [System.Globalization.UnicodeCategory]::NonSpacingMark) {
       $sb += $s[$i] ;
     }
   }
   return $sb;
}
#———————-

# tady se snažím pomocí záměn trochu učesat tvar. Zvláště takové zběsilosti jako je tečka mezera tečka před příponou (jmeno. .txt).
# Dalo by se tu vymyslet něco moudřejšího.
function NormalizujJmeno {
param ($Ret);

# [System.Console]::WriteLine(„Normalizuji: „+$Ret);
$vyst = (RemoveDiacritics $Ret);
$vyst = $vyst -replace „[=\s]“, „_“;
$vyst = $vyst -replace „[+;,\(\)]“, „-„;
#$vyst = $vyst -replace „\._“, „.“;
$vyst = $vyst -replace „_\.“, „.“;
$vyst = $vyst -replace „-_“, „-„;
$vyst = $vyst -replace „_-„, „-„;
$vyst = $vyst -replace „_+“, „_“;
$vyst = $vyst -replace „-+“, „-„;
$vyst = $vyst -replace „\.+“, „.“;
$vyst = $vyst -replace „\.-„, „-„;
$vyst = $vyst -replace „\.-„, „-„;

return $vyst ;
}
#———————-

# Tady je vlastní přejmenování adresáře. Pokud po normalizaci názvu dojde ke kolizi jmen, přidám na konec -00n „-{0:D3}“
function jbRenameDIR {
param ($Jmeno,$Rodic)

$Rozliseni=“;
   $i=0;
   $NoveJmeno = NormalizujJmeno $Jmeno;
   $OldFullName = $Rodic+’\’+$Jmeno;
   $NewFullName = $Rodic+’\’+$NoveJmeno+$Rozliseni ;
# pokud jsme narazili na adresář, kde se po normalizaci normalizaci nic nemění, nesnažíme se o rename-item – padá to na chybu
if ($OldFullName -ne $NewFullName) {
# pokud uz nazev existuje , dam priponu -ddd napr -001)
while (Test-Path $NewFullName) {
       $i++;
       $Rozliseni = „-{0:D3}“ -f $i;
       $NewFullName = $Rodic+’\’+$NoveJmeno+$Rozliseni;
     }
    $NoveJmeno = $NoveJmeno+$Rozliseni ;
# [System.Console]::WriteLine(„Rename : “ +$OldFullName +“ -> „+$NoveJmeno);
rename-item „$OldFullName“ „$NoveJmeno“ -force ;
   }
# tady ukládám do porovnávacího pole nové plné jméno
   $script:APrejmenovano += $NewFullName;
   return $script:APrejmenovano[-1] ;
}
#———————-

# Prejmenovani Souboru. Tady v případě kolize jmen dam rozlišovaci řetězec -00n před příponu
function jbRenameFile {
param ($Jmeno,$Rodic)

$Rozliseni=“;
   $i=0;

if ($Jmeno -match „(.*)\.(.*)“) {
     $Basename=$matches.1;
     $extension=‘.’+$matches.2;
   } else {
     $Basename=$Jmeno;
     $extension=“;
   }
   $NoveJmeno = NormalizujJmeno $BaseName;
   $OldFullName = $Rodic+’\’+$Jmeno;
$NewFullName = $Rodic+’\’+$NoveJmeno+$Rozliseni+$extension ;
if ($OldFullName -ne $NewFullName) {
# pokud uz nazev existuje , dam priponu -ddd napr -001)
while (Test-Path $NewFullName) {
       $i++; $Rozliseni = „-{0:D3}“ -f $i;
       $NewFullName = $Rodic+’\’+$NoveJmeno+$Rozliseni+$extension;
      }
   $NoveJmeno = $NoveJmeno+$Rozliseni+$extension ;
# [System.Console]::WriteLine(„Rename : “ +$OldFullName +“ -> „+$NoveJmeno);
  rename-item „$OldFullName“ „$NoveJmeno“ -force ;
 }
return $NewFullName; ;
}
#———————-

function jbRenameDIRs {
param ($D)

$AD=Get-ChildItem -Path $D |where Attributes -eq Directory
   if ($AD.count -gt 0) {
     foreach ($pol in $AD) {
       $Rename = NeedRename $pol.Fullname ;
       If ($Rename -eq „ANO“) {
         $NJ = jbRenameDIR $pol.Name $pol.Parent.FullName ;
# [System.Console]::WriteLine( „Prejmenovano na „+ $NJ );
# rady je rekurzivní volání, ale s novým jmenem NJ
        jbRenameDIRs $NJ ;
       } else {
         echo „Sem nikdy nepujdu“;
         jbRenameDIRs $pol.FullName ;
       }
     }
   }
}
#———————-

function jbRenameFiles {
param ($D)

# tady volám Get-ChildItem zjednodušeně se switchem -recurse
   $AD=Get-ChildItem -Path $D -recurse|where Attributes -ne Directory
   if ($AD.count -gt 0) {
     foreach ($pol in $AD){
       $parent=split-path $pol.VersionInfo.FileName ;
       $NJ = jbRenameFile $pol.Name $parent ;
# [System.Console]::WriteLine( „Prejmenovano na „+ $NJ );
     }
   }
}
#—————–

# nejprve přejmenuji adresářovou strukturu
jbRenameDIRs($ROOTdir);
# a teď soubory
jbRenameFiles($ROOTdir);

Ještě pokud chceme, aby se okno powershellu zavřelo po dokončení akce
if ($Host.Name -eq ‚ConsoleHost‘) {Stop-Process $PID}

Skript volám v plánovači úloh powershell s parametrem

-command „& {. ‚c:\PSS\NormalizeDir.ps1‘}“

Snad tím někomu udělám radost

 

Připojení 3G modemu Huawei E173 k tabletu s androidem

Připojit USB modem k PC

Po nainstalování ovladačů (obvykle automaticky -lze použít i ovladače Huawei 4.2.19) je potřebné zjistit číslo COM portu pomocí Správce zařízení devmgmt.msc.

Připojíme se pomocí seriové konzoly – použijeme např. putty

Nastavení putty:

Nejprve zkusíme příkaz ATI

a dále si zkontrolujeme nastavení pomocí AT^U2DIAG? tj jaké je aktuální nastavení. Nakonec vlastní operaci AT^U2DIAG=276. K dispozici bude resetované tovární nastavení  ( modem, CD – flash, i mikroSD)
pozor: zařízení se změní na VID_12d1&PID_1c07 ( jinak je jako VID_12d1&PID_1c05)

Vygenerovat kód pomocí utility Universal_MasterCode

Provedeme nahrání odpovídající firmware E173Update_21.017.09.00.00.B726 popř.zde. Standardní FW od T-mobile dělá problémy.

V tomto okamžiku lze USB modem odpojit od PC.

A teď vlastní nastavení v tabletu.

doplnit do /system/etc/3g_dongle.cfg sekci

[E173]
dongle_name=E173
production_name=E173
vendor_name=huawei
network_type=GSM_MODE
pid_vid_origin=0x12d11c07
bcdDevice_origin=0x0
pid_vid_now=0x12d11c07
bcdDevice_now=0x0
at_port=3
ppp_port=0

Doplnit na konec souboru /system/bin/preinstall.sh
echo „12d1 1c07“ > /sys/bus/usb-serial/drivers/option1/new_id

Restartovat tablet

Editaci lze provést např přes ADB připojení.
Potřebné soubory lze stáhnout např. zde. Stačí jen rozbalit v složce, kde budeme spouštět adb.exe.

V nastavení – sekce „{} Pro vývojáře“ povolit „Ladění USB“.  Připojit pomocí USB tablet s PC.
Pustit příkazový řádek – komandové okno.   Zkusíme zda jsme připojeni příkazem

adb devices

* daemon not running. starting it now on port 5037 *
* daemon started successfully *
List of devices attached
20080411382bd8e device

Provedeme zálohu (stažení do adresáře kde jsme spustili adb.exe) stávajících souborů

adb pull /system/bin/preinstall.sh

adb pull /system/etc/3g_dongle.cfg

Teď lze soubory upravit – nezapomenout je uložit v linuxovém formátu tj řádky ukončené je LF nikoli CRLF. To umí například editor pspad.  Můžete použít již upravené soubory.

Nejprve ale si zpřístupníme systém na zápis

adb remount
remount succeeded

Vrátíme upravené soubory zpět.

adb push preinstall.sh /system/bin/preinstall.sh

adb push 3g_dongle.cfg /system/etc/3g_dongle.cfg

Pokud budete mít modem v režimu ID_12d1&PID_1c05, musíte změnit odpovídající položky jak v /system/bin/preinstall.sh tak v /system/etc/3g_dongle.cfg

 


AT-příkazy – zdroj
Huawei+AT-commands
Popis obecných AT příkazů

 

Windows 2012 – RRAS – error 13806

Při konfiguraci RRAS – v rámci Remote Access -na Windows serveru 2012 jsem neustále narážel na chybu 130806. Měl jsem konfiguraci VPN only. VPN typu PPTP a SSTP mi proběhly v pořádku, pokud jsem zkusil IKEv2 hned se objevila chyba 13806. Zkoušel jsem různé kombinace certifikátů, ale bez úspěchu.

Jednou jsem povolil i zakladní konfiguraci Dirrect Access, kde mimo jiné se nastavuje certifikát pro IP-HTTP a ejhle chyba zmizela a VPN se navázala.

RAS-1-640

Po zrušení Direct Access přes Remove Configuration Settings v Remote Access management Console a opětovném nastavení VPN – se chyba neobjevuje. Ale funguje to jen s tím certifikátem, který byl použit v Remote Access management Console – Remote Access Serveru.

Změnu lze – nebo já to jinak neumím – provádět jen při povoleném Direct Acessu. To pak lze i pomocí powershelu. Např:

 $C=( Get-ChildItem -Path cert:LocalMachine\my | Where-Object -FilterScript { $_.FriendlyName -Like „Custom-VPN-server-1“ } )

set-RemoteAccess –SslCertificate $C

 #Restart RRAS

restart-service RemoteAccess

Pokud Dirrect Access není aktivní, pak nefungují ani tyto skripty.

Snad to někomu ušetří nějaký čas.

 

Powershell – získání výstupu z webové služby s ověřením v aplikaci

/*Nejprve si pohrajeme s odchytáním komunikace na webovou službu např pomocí prográmku Fiddler ( proxy) abychom získali potřebné infomace o URL

Nejprve získáme pověření  buď pomocí Get-Credential nebo z uloženého pověření v souboru  popř pomocí System.Net.NetworkCredential*/

$cred = Get-Credential
$global:credNet=$cred.GetNetworkCredential()
#$global:credNet = New-Object System.Net.NetworkCredential -argumentlist $user,$P
$CookieContainer = New-Object System.Net.CookieContainer

$global:myCache = new-object system.net.CredentialCache
$global:WEBSRV=new-object system.uri("https://xxx.example.cz/xxx/websrv.aspx")
$global:WEBSRVb=new-object system.uri("https://xxx.example.cz")
# do cache uložíme ověření pro NTLM
$global:myCache.add($WEBSRVb,"NTLM",$credNet)
$LOGIN="//https://xxx.example.cz/xxx/login.aspx?ReturnUrl=/xxx/import.aspx"
# vytvoříme požadavek pro přihlášení
[net.httpWebRequest] $global:req = [net.webRequest]::create($LOGIN)
$global:req.AllowAutoRedirect = $false
# to zrušení přesmerování je nutné
$global:req.KeepAlive = $true
$global:req.CookieContainer = $CookieContainer
# nastavíme si odkud se budou brát Credentials
$global:req.Credentials =$global:myCache
$global:req.TimeOut = 50000
$global:req.Headers.Add("Keep-Alive: 300");
# požádáme o odpověď - responze (login.aspx)
# hlavně nám vrátí potřebné cookies<
[net.httpWebResponse] $global:res = $req.getResponse()
# nyní zkusíme zavolat vlastní službu 
[net.httpWebRequest] $global:req2 = [net.webRequest]::create($WEBSRV)
# předáme potřebné Cookie a pověření
$global:req2.CookieContainer = $CookieContainer
$global:req2.Credentials =$global:myCache
$req2.Headers.Add("Cookie", $global:res.Headers["Set-Cookie"])
# a provedeme vlastní zavolání služby
[net.httpWebResponse] $global:res2 = $req2.getResponse()
#po uspěšném dokončení si přečteme co nám služba vrátila
$data=$res2.GetResponseStream()
$reader=New-Object System.IO.StreamReader($data)
$Obsah=$reader.ReadToEnd() # celá data - HTML
$reader.close()
$data.close()
$Obsah > "./data.html" # uložíme si do souboru

Powershell – uložení Credential do souboru

# nejprve si načteme interaktivně požadované pověření

$Credential = Get-Credential
$MujKlic = "MojeLehkéHeslo"

/*
CelyKlic vygeneruje klíč potřebné délky (lpozadovana) pro budouci XOR s kodovanym popř dekodovaným řetězcem
$keyX … puvodni klic, můze být menší než šifrovaný řetězec
—————–*/

Function CelyKlic ([string]$keyX,[int]$lpozadovana) {
   $keyL=$keyX.Length
   $j=53; // nastavime zaklad ASCII hodnoty  0-255
# [System.Console]::Write("lPozadovana="+[string]$lpozadovana+'  ');
      while($keyX.Length -lt $lpozadovana){
         $keyP='';
# vezmu puvodni klic KeyX trochu o upravim pomoci binarniho OR a $j a pridam jako rozsireni
     $j++ ;$j++ ;$j++ ;
     for ($i=0; $i -lt $keyL; $i++) {
       $pom=[char] ($keyX[$i] -bor $j) ; # nasledujici pridany znak-binarne OR s $j
       $keyP=$keyP+$pom
     }
     $KeyX=$KeyX+$KeyP
  }
  Return $KeyX # vrátíme modifikovaný klíč požadované délky
}

/* Funkce provede kodovani/dekodovani pomocí XOR, pouzije modifikovaný klíč z CelyKlic
$ret kodovaný řetězec, $bkey – zadaný klíč
*/

Function koduj ([string] $ret, [string] $bkey) {
   $private:jmP=''
   $CelyK=CelyKlic $bkey $ret.Length
   for ($i=0; $i -lt $ret.Length; $i++) {
      $private:jmP=$private:jmP+[char] ($ret[$i] -bxor $CelyK[$i])
   }
   return $private:jmP
 }

/* ted přichází vlastní zakodovaní nejprve UserName ze zadaného $credential
všiměte si zadávání parametrů, žádné závorky, žádné čárky
navíc , pokud by se objevil v těle volané funkce nějaký příkaz typu echo, pak se tento dostané do vracené hodnoty -to je na zastřelení */

$TXTjmeno=koduj $credential.UserName $MujKlic
# protože to budu ukládat do textového souboru převedu na lehčí tvar Base64String
$JMkodbase64=[System.Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($TXTjmeno))
$JMkodbase64 > ".\JMKodBase64.txt"
# vytvoří v aktualním adresáři soubor JMKodBase64.txt

/*
není třeba vkládat CRLF, vloží ho automaticky
$CRLF=“`r`n“
$CRLF >> „.\JMKodBase64.txt“
*/

# u hesla je třeba převést z specialni kontrukce SecureString na string
[string]$TXTpassword=ConvertFrom-SecureString($credential.Password)
# z důvodu paranoi ještě zakodujeme jednou
$TXTpassword=koduj $TXTpassword $MujKlic
#[System.Console]::Writeline($TXTpassword)
$TXTpassword64=[System.Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($TXTpassword))
$TXTpassword64 >> ".\JMKodBase64.txt" # a přidáme na konec souboru

#————- Pro načtení credetials zpátky

$cUserName =''
$cPassw = ''
$CRED64= gc JMKodBase64.txt
# načte obsah textového souboru do pole $CRED64, každý řádek v jednom prvku
# Prevedem zpet z BASE64
$txtJmeno=[System.Text.Encoding]::UNICODE.GetString([System.Convert]::FromBase64String($CRED64[0]))
# dekodujeme
$cUserName=koduj $txtJmeno $MujKlic
#[System.Console]::Writeline($cUserName)
$txtPassw=[System.Text.Encoding]::UNICODE.GetString([System.Convert]::FromBase64String($CRED64[1]))
$cPassw=koduj $txtPassw $MujKlic
#[System.Console]::Writeline($cPassw)
# u hesla musíme  převést na SecureString
$sPassw=ConvertTo-SecureString($cPassw)
# vytvoříme požadované Credential
$cred = New-Object System.Management.Automation.PSCredential $cUserName, $sPassw
#popr. pro dalsí pouzití
$global:credNet=$cred.GetNetworkCredential()

poskytovatel zásad a nedůvěryhodný certifikát

Řetěz certifikátů byl správně zpracován, ale poskytovatel zásad považuje jeden z certifikátů certifikační autority za nedůvěryhodný.

Pokud se objeví tato hláška při vyžádání certifikátů z místní certifikační autority z prostředí Windows 7 lze tento problém řešit z prostředí klienta naimportování kořenového certifikátu do místního uložení v registrech příkazem:

certutil -enterprise -f -addstore NTAuth myRootCA.cer

Příkaz je nutné spustit v cmd okně jako správce.

certutil -TCAInfo zobrazí info o certifikační autoritě

certutil -store -enterprise NTauth vypíše obsah úložiště textově

certutil -viewstore -enterprise NTauth vypíše obsah úložiště graficky v okně

Odstranění certifikátu z uložiště NTAuth
certutil -enterprise -delstore NTAuth poř.číslo.certifikatu

fyzické umístění úložiště

HKLM\SOFTWARE\Microsoft\EnterpriseCertificates\NTAuth\Certificates
zdroje:

http://www.tekweb.dk/manuals/command/commands/c/CERTUTIF.HTM
http://social.technet.microsoft.com/Forums/en-US/winserversecurity/thread/446d7e1f-16a7-43e1-a866-3786528b22e6
http://support.microsoft.com/kb/295663
How to import third-party certification authority (CA) certificates into the Enterprise NTAuth store

Odstranění diakritiky v PowerShellu

Pro odstranění diakritiky v řetězcích lze z použít normalizace řetězce na tvar

př: ‚ěščřžýáíéů -> eˇsˇcˇrˇzˇy´a´i´e´u°.

Pak se už jen profiltruje vstupní řetězec a vyhodí se znaky NonSpacingMark
function RemoveDiacritics {
param ($s)

$s = $s.Normalize([System.Text.NormalizationForm]::FormD);
$sb = “;

for ($i = 0; $i -lt $s.Length; $i++) {
if ([System.Globalization.CharUnicodeInfo]::GetUnicodeCategory($s[$i]) -ne    [System.Globalization.UnicodeCategory]::NonSpacingMark

) {
$sb += $s[$i] ;
}
}
return $sb;
}

Pokud se někdy stane, že bude vytvořen soubor nebo adresář, který obsahuje např. mezeru na konci jména, pak vlastní systém NEUMÍ takovýto soubor odstranit.
Ani kontroly chkdsk nepomohou. Pak lze použít příkaz Robocopy ve tvaru
ROBOCOPY C:\Empty X:\CILOVY_ADR /PURGE.
Příkaz se bude snažit synchronizovat obsah adresářů a to co v C:\EMPTY není – smaže v X:\CILOVY_ADR.
To může být samozřejmě i MOC nebezpečné, proto dvakrát měř…

VNC na Gentoo

Potřeboval jsem si zpřístupnit vzdálené aplikace na linuxovém serveru Gentoo x32.  Jako vhodné se mi zdálo použít VNC.

Nainstaloval jsem na linux x11vnc verze 0.8.2. Vytvoříme soubor s heslem ve /etc/.vnc/passwd příkazem:

x11vnc -storepasswd

V /etc/xinetd.d jsem vytvořil soubor vnc s obsahem:

service vnc
{
       port             = 5900
       type             = UNLISTED
       flags            = REUSE
       socket_type      = stream
       instances        = 3
       wait             = no
       user             = root
       server           = /usr/bin/x11vnc
       server_args      = -inetd -q  -display :0 -usepw -rfbversion 3.6 -permitfiletransfer
       log_on_success   = HOST PID
       log_on_failure   = HOST
       disable          = no
}

Předem je dobré mít nastartován X server X :0 & a KDE DISPLAY=0:0 ksmserver &.

Dale už jenom spustim vncviewer a jedeme …