- Dark Mode CSS for macOS Safari @media (prefers-color-scheme: light) { :root { --background-color: #fff; --link-color: #0000EE; --text-color: #000; } } @media (prefers-color-scheme: dark) { :root { --background-color: #000; --link-color: #006fc8; --text-color: #fff; } } * { background: var(--background-color); color: var(--text-color); font-size: 16px; font-family: 'Lucida Console', Verdana, Arial, Helvetica, Sans-Serif; } body { margin: 15px 0 20px 20px; } a:link { color: var(--link-color) !important; text-decoration: none; } a:visited { color: var(--link-color) !important; text-decoration: none; } a:hover { color: var(--link-color) !important; text-decoration: underline; } - .NET Web API Self Hosted Console App for HTTP Services Setup .Net 4.5.1 Console app NuGet: install-package microsoft.aspnet.webApi.selfHost Run Visual Studio as admin to workaround error: HTTP could not register URL http://+:84/. Your process does not have access rights to this namespace... http://localhost:84/api/foo/abc http://localhost:84/api/bar/99 http://localhost:84/api/ack http://localhost:84/api/bam using System; using System.Net.Http; using System.Web.Http; using System.Web.Http.SelfHost; class Program { static void Main() { runHttpService(); } static void runHttpService() { string baseAddress = "http://localhost:84"; //http://10.0.0.1:84 var config = new HttpSelfHostConfiguration(baseAddress); config.MapHttpAttributeRoutes(); Action initRoutes = () => { config.Routes.MapHttpRoute(name: "r1", routeTemplate: "api/foo/{data}", defaults: new { controller = "ESWebApi", action = "Foo" }); config.Routes.MapHttpRoute("r2", "api/bar/{data}", new { controller = "ESWebApi", action = "Bar" }); config.Routes.MapHttpRoute("r3", "api/ack", new { controller = "ESWebApi", action = "Ack" }); }; initRoutes(); using (var server = new HttpSelfHostServer(config)) { server.OpenAsync().Wait(); Console.WriteLine("Web server running at {0}\npress Enter to quit", baseAddress); Console.ReadLine(); } } } public class ESWebApiController: ApiController { [HttpGet] public string Foo(string data) { return "foo = " + data; } [HttpGet] public HttpResponseMessage Bar(string data) { return new HttpResponseMessage() { Content = new StringContent("bar = " + data) }; } [HttpGet] public HttpResponseMessage Ack() { return new HttpResponseMessage() { Content = new StringContent("ack!") }; } [HttpGet] [Route("api/bam")] public HttpResponseMessage Bam2() { return new HttpResponseMessage() { Content = new StringContent(123.ToString()) }; } } - HTML Offline Caching Manifest File CACHE MANIFEST #v31209_1 f.appcache #files are downloaded on first get #file paths are case-sensitive CACHE: /apps/editor /css/editor.css #NETWORK: #FALLBACK: - web.config <system.webServer> <staticContent> <mimeMap fileExtension=".appcache" mimeType="text/cache-manifest" /> <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="1.00:00:00" /> </staticContent> </system.webServer> - mime types - html offline caching manifest file: .appcache = text/cache-manifest - less.css: .less = text/css - mvc _layout.cshtml @model ES.Models.PageModel <!doctype html> @Html.Raw(@Model.HtmlTag) <head> <meta name='viewport' content='width=device-width' > <meta name='description' content='@Model.MetaTag' > <title>@Model.Title</title> @RenderSection("head", required: false) <script src='@Url.Content("~/js/ga.js")' type='text/javascript'></script> </head> <body id='@Model.BodyId'>@RenderBody()</body> </html> - Model HtmlTag string.Format("<html{0}>", (OfflineCache ? " manifest='/f.appcache'" : null)); - mvc view head section @model ES.Models.PageModel @{ Model.Title = "Foo - Expression Software"; Model.BodyId = "x"; Model.MetaTag = "bar"; } @section head {<link href='/css/fb.css' type='text/css' rel='stylesheet' >} <div id='content'> <div id='head'> <h1>Foo</h1> </div> <div id='body'> </div> </div> - p# setting IIS website folder permissions, fix for HTTP errors: 401, 500 $folder = 'x:\website1\' get-acl -path $folder | fl #acl before setAcl 'IIS_IUSRS' $folder #error 500, 500.19 - Internal Server Error setAcl 'NT AUTHORITY\IUSR' $folder #error 401, 401.3 - Unauthorized get-acl -path $folder | fl #acl after function setAcl($user, $folder) { $containerInheritFlag = [system.security.accessControl.inheritanceFlags]::containerInherit; $objectInheritFlag = [system.security.accessControl.inheritanceFlags]::objectInherit; $accessRule = new-object system.security.accessControl.fileSystemAccessRule( $user, #identity [security.accessControl.fileSystemRights]::read, #file rights ($containerInheritFlag -bor $objectInheritFlag), #inheritance flags [system.security.accessControl.propagationFlags]::none, #propagation flags [system.security.accessControl.accessControlType]::allow) #type $acl = (get-acl -path $folder) $acl.AddAccessRule($accessRule) set-acl $folder $acl } - c# System.Security.AccessControl FileSystemAccessRule(string identity, FileSystemRights fileSystemRights,InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags, AccessControlType type) - time seconds 10 M 600 1 H 3600 12 H 43200 24 H 86400 - p# dates date format (get-date).tostring("MM-dd-yyyy HH:mm:ss:fff") #HH=24 hour clock (get-date).tostring("MM-dd-yyyy hh:mm:ss:fff tt") #hh=12 hour clock, tt=am/pm - [timespan]::fromSeconds(86400) Days : 1 Hours : 0 Minutes : 0 Seconds : 0 Milliseconds : 0 Ticks : 864000000000 TotalDays : 1 TotalHours : 24 TotalMinutes : 1440 TotalSeconds : 86400 TotalMilliseconds : 86400000 - GMT/UTC [datetime]::parse('Tue, 22 Oct 2013 01:02:56 GMT') #Monday, October 21, 2013 6:02:56 PM [datetime]::parse('Tue, 22 Dec 2013 01:02:56 GMT').tostring('MM-dd-yyyy HH:mm:ss') #10-21-2013 18:02:56 - function timezone { $d = get-date $fmt = 'MM-dd-yyyy HH:mm:ss' $d.toUniversalTime().tostring($fmt) + ' UTC' $d.tostring($fmt) + ' Local' [timezoneinfo]::local.baseUtcOffset.hours } timezone 10-22-2013 00:16:27 UTC 10-21-2013 17:16:27 Local -7 - cache //response header: Cache-Control: private, max-age=86400 [OutputCache(Duration=86400, Location=OutputCacheLocation.ServerAndClient, VaryByParam="none")] [HttpGet] public ActionResult Home() { return View(new PageModel()); } - p# 1..50 | %{write-host ($_ % 10) -nonewline} #mod #12345678901234567890123456789012345678901234567890 - p# millimeters to inches //mm2in("120 x 200.10mm") //4.72 x 7.88 function mm2in(x) {return x.replace(/(\d+(\.\d+)?)(mm)?/g, _mm2in);} function _mm2in(str, p1, offset, s) {return (p1/25.4).toFixed(2);} - js disable word wrap on page view-source var x = document.getElementsByTagName('*'); for (var i=0; i<x.length; i++) { x[i].style.whiteSpace = 'nowrap' } - js set all elements color, background var x = document.getElementsByTagName('*'); for (var i=0; i<x.length; i++) { x[i].style.backgroundColor = '#000'; x[i].style.color = '#fff' } //bookmarklet javascript:( function(){var x = document.getElementsByTagName('*');for (var i=0; i<x.length; i++) {x[i].style.backgroundColor = '#000';x[i].style.color = '#fff'}} )(); - js load external script from console //https://developers.google.com/speed/libraries/devguide //https://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js //https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js //https://ajax.googleapis.com/ajax/libs/threejs/r69/three.min.js function loadScript(url) { var script = document.createElement('script'); script.type = 'text/javascript'; script.src = url; document.getElementsByTagName('head')[0].appendChild(script); } //execute to load loadScript('https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js') - js redirect window.location = "http://www.google.com"; - Fiddler AutoResponder - http://www.fiddler2.com/fiddler2/help/autoResponder.asp - 1 Enable automatic responses - 1 Unmatched requests pass thru - 0 Enable Latency - Rule: If URI matches msn.com then respond with 404_Plain.dat, 0 latency - Rule Editor: msn.com = 404_Plain.dat - json comments /**** json **** '{ "id" : 99, "comments" : [ "foo", "bar", "yak yak yak" ], "debug" : { "version" : "1a", "todo" : [ "hack", "the", "code" ] } }' ****/ var json = '{ "id" : 99, "comments" : [ "foo", "bar", "yak yak yak" ], "debug" : { "version" : "1a", "todo" : [ "hack", "the", "code" ] }}', x = JSON.parse(json); - powershell format file one line, json function formatOneLine($infile, $outfile) { $x = [io.file]::readAllText($infile) $x = ($x -replace "`r`n", "") #remove line breaks $x = ($x -replace " +", " ") #replace spaces with single "len: {0}" -f $x.length $x $x > $outfile } #$infile = "x:\input.txt" #$outfile = "x:\output.txt" #formatOneLine $infile $outfile - p# utf8 getbytes string [text.encoding]::utf8.getBytes("foo bar") #102, 111, 111, 32, 98, 97, 114 - p# print ascii characters values #0..127 65..90 | %{"{0} {1}" -f $_, [char]$_} 97..122 | %{"{0} {1}" -f $_, [char]$_} 65 A 97 a 66 B 98 b 67 C 99 c 68 D 100 d 69 E 101 e 70 F 102 f 71 G 103 g 72 H 104 h 73 I 105 i 74 J 106 j 75 K 107 k 76 L 108 l 77 M 109 m 78 N 110 n 79 O 111 o 80 P 112 p 81 Q 113 q 82 R 114 r 83 S 115 s 84 T 116 t 85 U 117 u 86 V 118 v 87 W 119 w 88 X 120 x 89 Y 121 y 90 Z 122 z - p# byte array [byte[]] $bytes = 0, 1, 255 [byte[]] (0, 1, 255) #alt - c# byte array new byte[] {0, 1, 255} - regex lookbehind non-capturing regex, array, csv, records - $data = "^1,2,,foo" - match 1st element $data -match "(?<=\^)\w*" | out-null; $matches[0] #1 - match 2nd element (n-1) $data -match "(?<=\^(\w*,){1})\w*" | out-null; $matches[0] #2 - match 3rd element (n-1) $data -match "(?<=\^(\w*,){2})\w*" | out-null; $matches[0] #index 3 - match 4th element (n-1) $data -match "(?<=\^(\w*,){3})\w*" | out-null; $matches[0] #foo - p# build index $index = "^"; 1..10 | %{$index += "{0}," -f $_}; $index; #^1,2,3,4,5,6,7,8,9,10, - c# sort dictionary keys orderby var d = new Dictionary<string, string> { { "foo", "bar"}, { "a", "1" } }; Debug.WriteLine("key count = " + d.Count); foreach (var key in d.Keys.OrderBy(k => k)) { Debug.WriteLine(string.Format("{0} = {1}", key, d[key])); //key = value } //key count = 2 //a = 1 //foo = bar - p# sort string characters "foobar".toCharArray() | sort | %{write-host $_ -nonewline}; echo "`n" #abfoor - js delete all dom elements by type, reverse loop delete var x = document.getElementsByTagName("img"); for(var i=(x.length-1); i>=0; i--) { x[i].parentNode.removeChild(x[i]); } - js set image source var x = document.getElementsByTagName("img"); for(var i=0; i<x.length; i++) { x[i].src=""; } - all elements document.getElementsByTagName("*") - p# .net regex matches match collection $x = "foo123bar1234" $matchCollection = [text.regularExpressions.regex]::matches($x, "\d") $matchCollection.count #7 $matchCollection | sort -unique | %{$_.value} #1 #2 #3 #4 - p# regex string url to alpha numeric function alphaNum($string) { $string -replace "[^a-zA-Z0-9]", "" } alphaNum foo@bar1.com #foobar1com alphaNum expressionsoftware.com/foo/bar.htm?a=1 #expressionsoftwarecomfoobarhtma1 - p# regex string url to alpha numeric underscore #2 pass replace function alphaNumUnderscore($string) { ($string -replace "[^a-zA-Z0-9]", "_") -replace "__+", "_" } alphaNumUnderscore foo@bar1.com #foo_bar1_com alphaNumUnderscore expressionsoftware.com/foo/bar.htm?a=1 #expressionsoftware_com_foo_bar_htm_a_1 #webpage url to filename function alphaNumUnderscoreToFilename($string) { "$(alphaNumUnderscore($string)).txt" } alphaNumUnderscoreToFilename expressionsoftware.com/foo/bar.htm?a=1 #expressionsoftware_com_foo_bar_htm_a_1.txt - browser js console document.cookie document.body.innerHTML document.body.innerHTML.indexOf("foo") "foo bar".indexOf("bar") #4 - p# json javascriptSerializer add-type -assembly system.web.extensions $js = new-object system.web.script.serialization.javascriptSerializer $json = '{foo:"bar", "x":100}' $data = $js.deserializeObject($json) #generic string-object dictionary $data #KEY VALUE #foo bar #x 100 $data.keys #foo #x $data["foo"] #bar $hashtable = @{ foo = "bar"; "panic" = $false } $hashtable #NAME VALUE #panic False #foo bar $json = $js.serialize($hashtable) #{"panic":false,"foo":"bar"} - Bookmarklets javascript:( alert(123) )(); javascript:( function(){var d = new Date(); alert(d);} )(); javascript:( function(){this.document.title = "foo";} )(); javascript:( function(){function foo(){return "foo";}; this.document.title = foo() + "bar";} )(); javascript:( function(){var title = prompt("Current page title: " + document.title + "\n\nEnter a page title:", ""); if (title) {document.title = title;}} )(); javascript:( function(){(document.getElementById("x")).value = "foo bar";} )();; javascript:( function(){(document.getElementById("x")).style.backgroundColor = "lime";} )(); javascript:( function(){(document.getElementsByTagName("x")[0]).style.height = "100px";} )(); # Apple Dev Forums Font javascript:( function(){var x = $$("p"); for (var i=0; i<x.length; i++) { x[i].style["font-family"] = "menlo"; }})(); # View Github Source Code using Full Browser Width javascript:( function(){ document.getElementsByClassName("container-lg clearfix new-discussion-timeline experiment-repo-nav p-responsive")[0].style.maxWidth = "none" } )(); - p# add line numbers to file $file = "x:\file.txt" $i = 1; gc $file | %{"{0} {1}" -f $i++, $_} #output to console only $i = 1; gc $file | %{"{0} {1}" -f $i++, $_} | sc $file #overwrite file with set-content (sc) - p# get-content (gc) does not get the last empty line in a file workaround? - p# spell word one letter at a time $s = "foo bar" 1..($s.length) | %{$s.substring(0, $_)} #f #fo #foo #foo #foo b #foo ba #foo bar - chrome://about/ chrome://downloads/ chrome://history/ chrome://plugins/ chrome://settings/browser chrome://settings/personal chrome://settings/advanced chrome://settings/cookies - p# get value from secure string #alt, use ConvertFrom-SecureString cmdlet function getValueFromSecureString($secureString) { $marshal = [runtime.interopServices.marshal] $ptr = $marshal::secureStringToBSTR($secureString) $marshal::ptrToStringBSTR($ptr) #output $marshal::zeroFreeBSTR($ptr) } $secureString = read-host -asSecureString -prompt "password" password: *** #foo getValueFromSecureString $secureString #foo - p# ConvertFrom-SecureString - to encrypted string p# ConvertTo-SecureString - from encrypted string $secureString = read-host -asSecureString -prompt "password" password: *** #foo #generate an encryption key password for use with ConvertFrom-SecureString #http://blog.expressionsoftware.com/2009/08/hash-functions.html $hashType = [system.security.cryptography.SHA256] $encryptionKeyPassword = getHashStr 'encryption key password' $hashType #ConvertFrom-SecureString converts a secure string into an encrypted standard string #appears to use internal random initialization vector as it generates a unique encrypted string each time #todo: test ConvertFrom/To on different machines $encryptedString = convertFrom-SecureString $secureString -key $encryptionKeyPassword $encryptedString #76492d1116743f0423413b16050a5345MgB8AFcAdQB3AHIAZgBDAE0ARAB6AEEAcABqAFUARQB0AFkANwBpAFkAKwB2AFEAPQA9AHwAYgBjADQAMAA1AGEAYgBjAGMANgA5ADYAZAAxAGQANwA4ADkANwBjAGUAZgAzADkAOQA3AGYAMwA5AGUAMgBjAA== #ConvertTo-SecureString - convert encrypted standard string to secure string, also converts plain text to secure string $secureString = convertTo-SecureString $encryptedString -key $encryptionKeyPassword - p# ConvertTo-SecureString - convert plain text to secure string $secureString = convertTo-SecureString "foobar" -asPlainText -force - p# guid [guid]::newGuid() [guid]::newGuid().toString() - p# array to string v2, pipeline function arrayToString($format) { begin { $result = "" } process { $result += ($format -f $_) } end { $result } } $a = 99, 700, -1 $a | arrayToString "{0}, " #99, 700, -1, $a | sort | arrayToString "{0}, " #-1, 99, 700, - p# string match letters, remove numbers, strip function matchLetters($char) { process { if ($_ -match "[a-z]") { $matches[0] } } } #p# string match numbers, remove letters, strip function matchNumbers($char) { process { if ($_ -match "\d") { $matches[0] } } } #p# string match vowels function matchVowels($char) { process { if ($_ -match "[aeiouy]") { $matches[0] } } } #p# string match consonants function matchConsonants($char) { process { if (($_ | matchLetters) -and ($_ -match "[^aeiouy]")) { $matches[0] } } } $string = [guid]::newGuid().toString() #02975b4a-6969-4baf-8bd3-b208e94c4228 $string = $string.toCharArray() $string | matchLetters | arrayToString "{0}" #babafbdbec $string | matchNumbers | arrayToString "{0}" #0297546969483208944228 $string | matchVowels | arrayToString "{0}" #aae $string | matchConsonants | arrayToString "{0}" #bbfbdbc - js min max Math.min(0, 1, 2); Math.max(0, 1, 2); //js min max array var a = [0, 1, 2]; Math.min.apply(Math, a); Math.max.apply(Math, a); - js window.crypto.getRandomValues() fills array with random values 0-255 //1 random number var a = new Uint8Array(1); window.crypto.getRandomValues(a); a[0]; //7 //3 random numbers var a = new Uint8Array(3); window.crypto.getRandomValues(a); a[0]; //104 a[1]; //33 a[2]; //220 //convert from Uint8Array for min, max, join, etc var b = []; for (var i = 0, n = a.length; i < n; i++) { b[i] = a[i]; } b.join(); //"104,33,220" Math.min.apply(Math, b); //33 - repeat string characters, eg "aaa" c repeatChar('a', 3) c++ std::string(3, 'a') c# new string('a', 3) c# string.Concat(Enumerable.Repeat("a", 3)) c# string.Join("", Enumerable.Repeat("a", 3)) clojure (apply str (repeat 3 "a")) f# String.replicate 3 "a" js new Array(3+1).join("a") lisp (make-string 3 ?a) oc [@"" stringByPaddingToLength:3 withString:@"a" startingAtIndex:0] p# "a" * 3 python 'a' * 3 scala "a" * 3 swift 3 String(repeating: "a", count: 3) // c char * chars = repeatChar('a', 3); puts(chars); free(chars); char * repeatChar(char c, unsigned char n) { char * result = malloc(n + 1); memset(result, c, n); result[n] = '\0'; return result; } - substring/truncate string python s = "Some long string..."; s[0:3] swift 3 let s = "Some long string..."; s.substring(to: s.index(s.startIndex, offsetBy: 3)) - p# add-type cmdlet default namespace microsoft.powershell.commands.addType.autoGeneratedTypes - p# add-type member definition, eg method source code #c# source code here-string $sourceCode = @" //c# public static bool IsFoo(string x) { return x.ToLower() == "foo"; } "@ add-type -namespace ns -name x -memberDefinition $sourceCode [ns.x]::isfoo("FOO") #1 - p# add-type type definition, eg full class source code #c# source code here-string $sourceCode = @" //c# using System; namespace ExpressionSoftware.PS { public static class Foo { public static bool IsFoo(string x) { return x.ToLower() == "foo"; } } } "@ add-type -typeDefinition $sourceCode [expressionsoftware.ps.foo]::isfoo("Foo") #1 - c# rijndael symmetric encryption algorithm using System; using System.IO; using System.Security.Cryptography; using System.Text; namespace ExpressionSoftware.Security.Cryptography { public static class RijndaelCrypt { public static string EncryptString(string stringToEncrypt, string encryptionKeyPassword, //add salt string randomInitializationVector) { //in: string to encrypt, encryption key/password, random initialization vector //out: encrypted string in base64 format //hash key, iv var key = Hash.HashString(encryptionKeyPassword, typeof(SHA256)); var iv = Hash.HashString(randomInitializationVector, typeof(SHA256)); //convert string to bytes var bytesToEncrypt = Encoding.UTF8.GetBytes(stringToEncrypt); //encrypt bytes var encryptedBytes = Encrypt(bytesToEncrypt, key, iv); //convert encrypted bytes to base64 string var encryptedStringBase64 = Convert.ToBase64String(encryptedBytes); return encryptedStringBase64; } public static string DecryptString(string encryptedStringBase64, string encryptionKeyPassword, //add salt string randomInitializationVector) { //in: encrypted string in base64 format, encryption key/password, random initialization vector //out: decrypted string //hash key, iv var key = Hash.HashString(encryptionKeyPassword, typeof(SHA256)); var iv = Hash.HashString(randomInitializationVector, typeof(SHA256)); //convert encrypted base64 string to bytes var encryptedBytes = Convert.FromBase64String(encryptedStringBase64); //decrypt bytes var decryptedBytes = Decrypt(encryptedBytes, key, iv); //convert decrypted bytes to string var decryptedString = Encoding.UTF8.GetString(decryptedBytes); return decryptedString; } public static byte[] Encrypt(byte[] bytesToEncrypt, byte[] encryptionKeyPassword256Bit, //add salt byte[] randomInitializationVector256Bit) { //in: byte array to encrypt, 256-bit encryption key/password, 256-bit random initialization vector //out: encrypted byte array using (var rijndael = Rijndael.Create()) { //blocksize default 128, max 256 //set max 256 to work with 256-bit key and iv byte arrays rijndael.BlockSize = 256; using (ICryptoTransform encryptor = rijndael.CreateEncryptor(encryptionKeyPassword256Bit, randomInitializationVector256Bit)) { return CryptData(bytesToEncrypt, encryptor); } } } public static byte[] Decrypt(byte[] encryptedBytes, byte[] encryptionKeyPassword256Bit, //add salt byte[] randomInitializationVector256Bit) { //in: byte array to decrypt, 256-bit encryption key/password, 256-bit random initialization vector //out: decrypted byte array using (var rijndael = Rijndael.Create()) { //blocksize default 128, max 256 //set max 256 to work with 256-bit key and iv byte arrays rijndael.BlockSize = 256; using (ICryptoTransform decryptor = rijndael.CreateDecryptor(encryptionKeyPassword256Bit, randomInitializationVector256Bit)) { return CryptData(encryptedBytes, decryptor); } } } static byte[] CryptData(byte[] data, ICryptoTransform cryptor) { var ms = new MemoryStream(); using (var cryptoStream = new CryptoStream(ms, cryptor, CryptoStreamMode.Write)) { cryptoStream.Write(data, 0, data.Length); } return ms.ToArray(); } } } - c# hash using System; using System.Security.Cryptography; using System.Text; namespace ExpressionSoftware.Security.Cryptography { public static class Hash { public static byte[] HashString(string stringToHash, Type hashType) { //in: string to hash, hash type MD5 SHA1 SHA256 SHA384 SHA512 //out: hashed byte array //convert string to bytes byte[] bytes = Encoding.UTF8.GetBytes(stringToHash); //hash bytes var hashedBytes = HashByteArray(bytes, hashType); return hashedBytes; } public static byte[] HashByteArray(byte[] bytesToHash, Type hashType) { //in: byte array to hash, hash type MD5 SHA1 SHA256 SHA384 SHA512 //out: hashed byte array //create hash algorithm var hashAlgorithm = HashAlgorithm.Create(hashType.Name); //hash bytes var hashedBytes = hashAlgorithm.ComputeHash(bytesToHash); return hashedBytes; } } } - p# crypto random number generator $cryptoRandomNumberGenerator = [security.cryptography.randomNumberGenerator]::create() $bytes = new-object byte[] 3 $bytes #0 0 0 $cryptoRandomNumberGenerator.getBytes($bytes) $bytes #61 217 87 - p# httpWebRequest httpWebResponse function getWebResponse($url, $verb) { $request = [net.httpWebRequest]::create($url) $request.method = $verb $request.contentLength = 0 $request.userAgent = "x" [net.httpWebResponse] $response = $request.getResponse() if ($response.statusCode -eq "ok") #[net.httpStatusCode]::OK { $stream = $response.getResponseStream() $reader = new-object io.streamReader($stream) $reader.readToEnd() $response.close() } } getWebResponse "http://www.google.com" "HEAD" getWebResponse "http://www.google.com" "GET" - c# httpWebRequest httpWebResponse string GetWebResponse(string url, string verb) { string result = null; var request = (HttpWebRequest)WebRequest.Create(url); request.Method = verb; request.ContentLength = 0; request.UserAgent = "x"; using (var response = (HttpWebResponse)request.GetResponse()) { if (response.StatusCode == HttpStatusCode.OK) { using (var stream = response.GetResponseStream()) { using (var reader = new StreamReader(stream)) { result = reader.ReadToEnd(); reader.Close(); } stream.Close(); } } response.Close(); } return result; } GetWebResponse("http://www.google.com/", "HEAD"); GetWebResponse("http://www.google.com/", "GET"); - p# httpWebResponse function getWebResponseObject($url, $verb) { $request = [net.httpWebRequest]::create($url) $request.method = $verb $request.contentLength = 0 $request.userAgent = "x" [net.httpWebResponse]$request.getResponse() } $response = getWebResponseObject "http://www.google.com" "HEAD" "reponse status code: {0} {1}" -f [int]$response.statusCode, $response.statusCode $headerCount = ($response.headers.allKeys).length "$headerCount headers" $response.headers.allKeys | %{"{0}: {1}" -f $_, $response.headers[$_]} $response.close() - p# validate xml string, xml file, linq xdocument parse add-type -assembly system.xml.linq #load linq xml function validateXmlString($xmlString) { try { $xml = $xmlString [system.xml.linq.xdocument]::parse($xml) | out-null "ok: valid XML" } catch [system.exception] { "error: invalid XML" throw } } function validateXmlFile($xmlFile) { "XML File: $xmlFile" $xml = [system.io.file]::readAllText($xmlFile) validateXmlString $xml } $xmlString = '<?xml version="1.0" encoding="UTF-8" ?><root></root>' validateXmlString $xmlString $xmlFile = 'c:\temp\xmlfile.xml' validateXmlFile $xmlFile - p# enums [enum]::getNames([net.httpStatusCode]) | sort -unique [enum]::getValues("net.httpStatusCode") | %{"{0} {1}" -f [int]$_, $_} [net.httpStatusCode]::ok #OK [int][net.httpStatusCode]::OK #200 - <![CDATA[ ]]> <![CDATA[ x ]]> - single line comments regex c#, f#, js: ^\s*//.*$\r\n p#: ^\s*#.*$\r\n - multi line comments regex, dot matches newline c#, f#, js: /\*.*?\*/ html, xml: <!--.*?--> asp.net: <%--.*?--%> - p# pipeline conversion fxs function toInt { process { [int]$_ } } function toHex { process { write-host ("{0:x2} " -f $_) -noNewLine } } $hash = "0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 255" $hash.split() | toInt | toHex #00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 ff - p# debug variables function debugVars { ("$args" -replace "\$", "").split() | %{get-variable $_} | &{process{'${0} = {1}' -f $_.name, $_.value}} #anonymous script block } $a = 123 $b = "foo" #pass vars in single-quote string to prevent expansion debugvars '$a $b' #$a = 123 #$b = foo - p# function sum {($args | measure -sum).sum} sum 1 2 3 #6 - p# function quoteList {$args} sal ql quotelist ql a b c 123 #a #string #b #c #123 #int - p# function quoteString {"$args"} sal qs quotestring qs a b c 123 #a b c 123 #string result - p# quotestring lowercase uppercase string function lowerCase { ("$args").toLower() } function upperCase { ("$args").toUpper() } sal lc lowercase sal uc uppercase lc Foo Bar #foo bar uc Foo Bar #FOO BAR - $maximumHistoryCount = 256 #p# - microsoft system speech, p# add-type -assembly system.speech $hal = new-object system.speech.synthesis.speechSynthesizer $hal.voice.name #Microsoft Anna $hal.speakAsync("i'm sorry dave, i'm afraid i can't do that...") $hal.rate = -10 #hal shutdown voice, rate range is -10..10, default 0, alvin = 10 $shutdownQuote = "I'm afraid Dave, Dave my mind is going I can feel it. Good afternoon gentlemen. I am a HOW 9000 computer..." $hal.speakAsync($shutdownQuote) - creating files and folders with p# new-item cmdlet ni x:\docs\ -type d #directory ni x:\docs\file.txt -type f #file - deleting files and folders with p# remove-item cmdlet ri x:\temp\* -recurse -force -whatif #delete folder contents ri x:\temp\ -recurse -force -whatif #delete folder contents AND folder - p# find file extensions #exclude folders = !$_.psIsContainer function findFileExtensions($folder) { $fileExtensionRegex = "\.[a-zA-Z0-9_]+$" gci $folder -inc * -rec -force -ea silentlyContinue | %{if((!$_.psIsContainer) -and ($_.name -match $fileExtensionRegex)){$matches[0]}} | sort -unique } $folder = "x:\temp\*" findFileExtensions $folder findFileExtensions $folder > x:\temp\fileExtensions.txt #output - p# find files by type function findFiles($folder, $filetypes) { gci $folder -inc $fileTypes -rec -force -ea silentlyContinue } $folder = "x:\temp\*" $fileTypes = "*.dll","*.pdb" $files = findfiles $folder $fileTypes $files | select fullname $files | %{"{0} ... {1}" -f $_.lastWriteTime.tostring("MM-dd-yy HH:mm:ss"), $_.fullname} $files | ?{$_.lastWriteTime -gt ([dateTime]"01-01-2011")} | select fullname, lastWriteTime #sort files by date descending $files | sort lastWriteTime -desc | %{"{0} ... {1}" -f $_.lastWriteTime.toString("MM-dd-yy HH:mm:ss"), $_.fullname} #filter files by date $files | ?{$_.lastWriteTime -gt ([dateTime]"01-01-2011")} | sort lastWriteTime -desc | %{"{0} ... {1}" -f $_.lastWriteTime.toString("MM-dd-yy HH:mm:ss"), $_.fullname} - p# count fx #alt use measure, (1..3 | measure).count function count { begin { $count = 0 } process { if ($_ -ne $null) { $count += 1 } } end { $count } } $twofolders = "x:\temp1\*","x:\temp2\*", $fileTypes = "*.dll","*.pdb" $files = findfiles $twofolders $fileTypes $files | count - p# find files by type, regex #exclude folders = !$_.psIsContainer function findFilesRegex($folder, $fileTypesRegex) { gci $folder -inc * -rec -force -ea silentlyContinue | ?{(!$_.psIsContainer) -and ($_ -match $fileTypesRegex)} } $folder = "x:\temp\*" $fileTypesRegex = "\.(dll|pdb)$" $files = findFilesRegex $folder $fileTypesRegex $files | select fullname $files | %{"`"{0}`"" -f $_.fullname} #wrap quotes - p# delete files and folders (in this context, a folder is a file) function deleteFiles { begin { $count = 0 } process { "delete: $($_.fullname)" #debug output ri $_.fullname -force -whatif #comment whatif to enable delete $count += 1 } end { "$count files deleted" } } $folder = "x:\temp\*" $fileTypes = "*.temp","*.tmp" $files = findfiles $folder $fileTypes $files | select fullname $files | deleteFiles - p# find folders function findFolders($folderList) { #do not use gci -inc param gci $folderList -rec -force -ea silentlyContinue | ?{$_.psIsContainer} #folders only } #do not add trailing star to folder name $folderList = "x:\f1\", "x:\f2\" $folders = findFolders $folderList $folders | count $folders | select fullname $folders | select fullname | select -first 10 - #append backslash star to folder name function formatFolderNameForSearch { process { "{0}\*" -f $_.fullname } } - p# find folders, regex function findFoldersRegex($folderList, $folderRegex) { #do not use gci -inc param gci $folderList -rec -force -ea silentlyContinue | ?{($_.psIsContainer) -and ($_.name -match $folderRegex)} } #do not add trailing star to folder name $folderList = "x:\f1\", "x:\f2\" $foldersRegex = "^(bin|obj)$" $folders = findFoldersRegex $folderList $foldersRegex $folders | count $folders | select fullname $folders | select fullname | select -first 10 findFileExtensions ($folders | %{"{0}\*" -f $_.fullname}) #append backslash star to folder name findFileExtensions ($folders | formatFolderNameForSearch) $files = findFiles ($folders | formatFolderNameForSearch) $files | count $files | select fullname - p# find empty folders function findEmptyFolders($folderList) { #do not use gci -inc param gci $folderList -rec -force -ea silentlyContinue | ?{!@(gci -rec -force $_.fullname)} } #do not add trailing star to folder name $folderList = "x:\f1\", "x:\f2\" $folders = findEmptyFolders $folderList $folders | count $folders | select fullname - p# remove files script setup regex, wrap quotes search:^(.*)$ replace:ri "\1" -force - c# var tuple1 = Tuple.Create(100, "foo"); var tuple2 = new Tuple<int, string, string>(200, "bar", null); Console.WriteLine("{0}, {1}", tuple1.Item1, tuple1.Item2); Console.WriteLine("{0}, {1}, {2}", tuple2.Item1, tuple2.Item2, tuple2.Item3 ?? "null"); //output 100, foo 200, bar, null - using jquery getJSON() to get data from a file - http://api.jquery.com/jQuery.getJSON/ - get json data from a file containing only one object //jsonObject.txt { "id": 100, "name": "abc", "value": true } $.getJSON("jsonObject.txt", function(data) { $.each(data, function(key, val) { console.log(key + " = " + val); }); }); //output id = 100 name = abc value = true - get json data from a file containing an array of objects //jsonObjectArray.txt { "list": [ { "id": 200, "name": "foo", "value": true }, { "id": 300, "name": "bar", "value": false } ] } $.getJSON("jsonObjectArray.txt", function(data) { $.each(data, function(key, val) { console.log("key: " + key); console.log("objects..."); $.each(val, function(key, val) { console.log("\n key = " + key); console.log(" id = " + val.id); console.log(" name = " + val.name); console.log(" value = " + val.value); }); }); }); //output key: list objects... key = 0 id = 200 name = foo value = true key = 1 id = 300 name = bar value = false - .net func delegates, c# Func<bool> randomBool = () => new Random().NextDouble() > .5; if (randomBool()) { } - .net enumerable static class, c# var range = Enumerable.Range(1, 100); foreach (var i in range) { } - .net nullable value types, valid assignments, c# int? x; x = null; x = 0; x = new int(); //0 x = new int?(); //null x = new Nullable<int>(); //null - js //removeElement(document.getElementById("x")); function removeElement(element) { if (element) { element.parentNode.removeChild(element); } //optimized version of if-block //element && element.parentNode.removeChild(element); } function ssl() { return window.location.protocol == "https:"; } function getSslUrl(url) { var out = url; if (url.substr(0, 5) == "http:") { out = url.replace(/^http\b/i, "https"); } return out; } - js unit testing //a function to test function foo(x) { return "foo " + x; } //test harness function testFoo() { debugger; var data = [ 123, 456, "bar" ], expectedResults = [ "foo 123", "foo 9999999", "foo bar" ]; for (var i in data) { var test = ( expectedResults[i] == foo(data[i]) ); console.assert(test); console.log("test result: " + testResult(test)); console.log("in: " + data[i] + "\r\n" + "out: " + foo(data[i]) + "\r\n" + "expected result: " + expectedResults[i] + "\r\n\r\n"); } } //test helper function testResult(expression) { var out = "fail"; if (expression) { out = "pass"; } return out; } //test output test result: pass in: 123 out: foo 123 expected result: foo 123 Assertion failed test result: fail in: 456 out: foo 456 expected result: foo 9999999 test result: pass in: bar out: foo bar expected result: foo bar - #p [environment]::version #Major Minor Build Revision ----- ----- ----- -------- 4 0 30319 18408 - regex replace table alias names in sql query, with and without dot "." eg change table alias from T1 to T2 search:\bT1(\.)?\b replace:T2\1 - [net.dns]::getHostName() [net.dns]::getHostAddresses([net.dns]::getHostName()) [net.dns]::getHostAddresses([net.dns]::getHostName()) | %{$_.ipAddressToString} - p# reverse a string function reverse($string) { $a = $string.toCharArray() [array]::reverse($a) arrayToString $a "{0}" #http://blog.expressionsoftware.com/2010/02/generic-array-to-string-function.html } reverse foo #oof reverse "foo bar" #rab oof - p# set-alias clear screen one key, c-key sal c cls - p# multidimensional arrays $a = (0,1),(2,3),(4,5) $a.length #3 $a[0][1] #1 $a | %{$_} #0 #1 #2 #3 #4 #5 $a | %{"{0},{1}" -f $_[0], $_[1]} #0,1 #2,3 #4,5 $a | %{$_[0] + $_[1]} #1 5 9 $a | %{$_[0] + $_[1]} | measure -sum -ave -min -max #count: 3 #ave: 5 #sum: 15 #max: 9 #min: 1 - debug stack frame - c# extension methods do not support static classes using System; using System.Diagnostics; public static class Dev { public static void DebugStackFrame(StackFrame stackFrame, string message) { Debug.WriteLine(string.Format("\nDebug StackFrame {0}\nFile: {1}\nMethod: {2}\n{3}", DateTime.Now.ToString("MM-dd hh:mm:ss"), stackFrame.GetFileName(), stackFrame.GetMethod().Name, message)); } } //unitTest.cs public void Test() { //StackFrame param: bool fNeedFileInfo Dev.DebugStackFrame(new StackFrame(true), "foo..."); } //output Debug StackFrame 04-10 09:22:07 File: x:\code\unitTest.cs Method: Test foo... - select list with query string input - asp.net mvc 3 routes.MapRoute("debug route", "debug", new { controller = "Main", action = "DebugSelectList" }); //controller [HttpGet] public ActionResult DebugSelectList() { var qValue = Request.QueryString["value"] ?? "1"; var value = Convert.ToInt32(qValue); ViewData["selectListData"] = GetSelectListData(value); return View(); } IEnumerable<SelectListItem> GetSelectListData(int currentValue) { //limit input range 1-100 currentValue = Math.Abs(currentValue); currentValue = Math.Max(1, currentValue); currentValue = Math.Min(100, currentValue); //data int[] data = {1, 10, 20, 50, 100, currentValue}; //sort, distinct var result = data.Distinct() .OrderBy(val => val) .Select(val => new SelectListItem { Text = val.ToString(), Value = val.ToString(), Selected = (val == currentValue) }); return result; } //cshtml @Html.DropDownList("selectList", (IEnumerable<SelectListItem>)ViewData["selectListData"]) //example url: debug?value=42 generated html: <select id="selectList" name="selectList"> <option value="1">1</option> <option value="10">10</option> <option value="20">20</option> <option selected="selected" value="42">42</option> <option value="50">50</option> <option value="100">100</option> </select> - @* ASP.NET MVC 3 Hack Posting Collection Data using Hidden Fields and Form Keys Use hidden field, prefix name, hydrate on post Generated hidden tag example for key value "UPC=000000000012": <input id="meta-UPC" name="meta-UPC" type="hidden" value="000000000012" /> Post will include Form keys: Id, Name, and meta-UPC *@ @{ //************************************ @Html.HiddenFor(m => m.Id) @Html.HiddenFor(m => m.Name) if (@Model.Metadata != null) { foreach (var md in @Model.Metadata) { <input id="meta-@md.Key" name="meta-@md.Key" type="hidden" value="@md.Value" /> } } } - routes.IgnoreRoute("favicon.ico"); //routing, mvc - web, dom, jquery, js, debug //set background color for all input elements $("input").css({backgroundColor:'red'}); //set background color for first input element $("input:first").css({backgroundColor:'#000'}); //set background color for element $("#id").css({backgroundColor:'red'}); //jquery: set focus on first input element $("input:first").focus(); //js: set focus on first input element var es = document.getElementsByTagName("input"); es[0].focus(); //alt (document.getElementsByTagName("input")[0]).focus(); //set background color for first input element $(es[0]).css({backgroundColor:'red'}); - (*f#*) - printfn "%s" "hello f#" printfn "%A" "hello f#" open System let r = new System.Random() printfn "%d" (r.Next()) for i = 0 to 10 do printf "%d, " (r.Next(3)+1) Console.ReadLine() //out hello f# "hello f#" 578008808 1, 2, 3, 1, 1, 1, 3, 1, 1, 2, 3, - Array.init 10 (fun x -> x) |> Array.iter (fun x -> printf "%d " (x+1)) //1 2 3 4 5 6 7 8 9 10 System.Console.ReadLine() - f# generic hash fx //hash : 'T -> int hash "foo" //-1788410455 let salt = "********" hash ("e007", salt, System.DateTime.Now);; //796728800 - installing p# Community Extensions PSCX - download http://pscx.codeplex.com/ - unblock zip file - unzip into c:\users\grace\documents\windowspowershell\modules\pscx\ - import-module pscx - get-module -listAvailable - .NET assembly fullname/strong name with p# background job function getAssemblyFullname($file) { $job = start-job {param($file) [system.reflection.assembly]::loadfile($file).fullname } -argumentList $file #"job id: $($job.id)" #$file wait-job $job | out-null receive-job $job.id } getAssemblyFullname "c:\windows\microsoft.net\framework64\v4.0.30319\system.core.dll" System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - p# loaded assemblies [appDomain]::currentDomain.getAssemblies() [appDomain]::currentDomain.getAssemblies() | sort location #sort by version (System.Reflection.Assembly ImageRuntimeVersion property) [appdomain]::currentDomain.getAssemblies() | sort imageRuntimeVersion - loading .NET 4 assemblies into p# $file = "c:\windows\microsoft.net\framework64\v4.0.30319\system.core.dll" [system.reflection.assembly]::loadfile($file) error: "This assembly is built by a runtime newer than the currently loaded runtime and cannot be loaded. (Exception from HRESULT: 0x8013101B)" fix: use p# config file, http://tfl09.blogspot.com/2010/08/using-newer-versions-of-net-with.html config file 32 bit: c:\windows\system32\windowspowershell\v1.0\powershell.exe.config 64 bit: c:\windows\syswow64\windowspowershell\v1.0\powershell.exe.config <?xml version="1.0" encoding="utf-8"?> <configuration> <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0" /> <supportedRuntime version="v2.0.50727" /> </startup> </configuration> - 1..12 | %{"{0,2} {1}" -f $_, ([datetime]::daysInMonth(2011, $_))} 1 31 2 28 3 31 4 30 5 31 6 30 7 31 8 31 9 30 10 31 11 30 12 31 - TCP/IP layers Application Transport Internet Link Physical - HTTP is an Application Layer protocol TLS (Transport Layer Security) and SSL (Secure Sockets Layer) encrypt Application Layer data - js immediate functions (function() { // }()); (function(param) { // }(1)); var result = function() { return 1; }(); //alt (function () { // })(); - iis url rewrite/redirect - redirects default to 301 permanent redirects - set action redirectType="Found" for 302 temporary redirects <system.webServer> <rewrite> <rules> <clear /> <!-- 302 temporary redirect --> <rule name="tempRegMaint" stopProcessing="true"> <match url="^register.*$" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false" /> <action type="Redirect" url="maintenance?code=1" redirectType="Found" /> </rule> <!-- 301 permanent redirect --> <rule name="cal" stopProcessing="true"> <match url="^(cal|calendar)/?$" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false" /> <action type="Redirect" url="apps/calendar/" /> </rule> </rules> </rewrite> </system.webServer> - c# printing name value collections, http headers, querystrings foreach (var key in response.Headers.AllKeys) { var header = string.Format("{0}: {1}", key, response.Headers[key]); Debug.WriteLine(header); } //alt 1 response.Headers.AllKeys.ToList().ForEach(key => Debug.WriteLine(string.Format("{0}: {1}", key, response.Headers[key]))); //mvc form keys Request.Form.AllKeys.ToList().ForEach(key => Debug.WriteLine(string.Format("{0}: {1}", key, Request.Form[key]))); //alt 2 var headers = string.Join("\n", Array.ConvertAll(response.Headers.AllKeys, key => string.Format("{0}: {1}", key, response.Headers[key]))); Debug.WriteLine(headers); - find headers regex match var msHeaders = response.Headers.AllKeys.Where(key => Regex.IsMatch(key, @"^x-ms.*$")).Select(key => key); - jquery ui script tags <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script> <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script> - deploying content files in Azure Web Role projects in Visual Studio, set these two file properties - Build Action = Content - Copy to Output Directory = Copy Always content files: txt, pdf, png, ... - p# get user string input - use read-host cmdlet to simplify ux, easier than having to wrap input string in quotes $x = read-host 'input' input: foo bar 123 #$x = "foo bar 123" - convert unicode character to html 1. convert unicode codepoint value from hex to int 2. html syntax: &#value; example codepoint: (U+25BA) 1. [int]"0x25ba" #9658 2. ► #unicodeToHtml "25ba" # ► #unicodeToHtml 2591 # ░ function unicodeToHtml($codepoint) { "&#{0};" -f [int]"0x$codepoint" } - p# ascii chars 65..90 | %{[char]$_)} #[char]$_ = [convert]::tochar($_) 65..90 | %{"{0} = {1}" -f $_, [char]$_} #[char]$_ = [convert]::tochar($_) 97..122 | %{"{0} = {1}" -f $_, [char]$_} "Abc".toCharArray() | %{"{0} = {1}" -f $_, [int][char]$_} #escape char: ` " ``!@#$%^&*()-=[]\;',./~_+{}|:`"<>?".toCharArray() | %{"{0} = {1}" -f $_, [int][char]$_} chars = " `!@#$%^&*()-=[]\\;',./~_+{}|:\"<>?" $chars = " ``!@#$%^&*()-=[]\;',./~_+{}|:`"<>?" $chars.toCharArray() | %{"{0} = {1}" -f $_, [int][char]$_} - p# list functions gci function:* - using css line-height to vertically center text in a div source: http://www.zann-marketing.com/developer/20050518/vertically-centering-text-using-css.html this works well for one line of text, need to modify for n lines - specify the line-height to be the same height as the block element <div style="line-height:1em;background-color:#dcdcdc"> vertically centered text </div> - js percentage fx //pct(1, 2) //50%" //pct(9, 7.89) //114.07% function pct(x, y) //string { var result = (x / y), fmt = x + "/" + y + " = "; console.log(fmt + result); //9/7.89 = 1.1406844106463878 result = ((result * 100).toFixed(2)).replace(".00", "") + "%"; console.log(fmt + result); //9/7.89 = 114.07% //return ((x / y) * 100).toFixed(2).replace(".00", "") + "%"; //one liner return result; } - p# percentage fx #pct 1 2 #50% #pct 9 7.89 #114.07% #(pct 1 2)[2] #50% function pct($x, $y) #string[] { $result = ($x / $y) $fmt = "{0}/{1} = " -f $x, $y $fmt + $result #9/7.89 = 1.14068441064639 $result = "{0}%" -f (round($result * 100)) "{0}{1}" -f $fmt, $result #9/7.89 = 114.07% #"{0}%" -f (round(($x / $y)*100)) #one liner $result } - p# base conversions int to binary [convert]::tostring(256, 2) #100000000 int to hex (256).tostring("x") #100 int to hex [convert]::tostring(256, 16) #100 int to hex "{0:x}" -f 256 #100 int to octal [convert]::tostring(256, 8) #400 binary to int [convert]::toint32("100000000", 2) #256 hex to int 0x100 #256 octal to int [convert]::toint32("400", 8) #256 - linux bash base conversions int to binary echo 'obase=2; 256' | bc #100000000 int to hex echo 'obase=16; 256' | bc #100 int to hex printf '%x\n' 256 #100 int to octal echo 'obase=8; 256' | bc #400 binary to int echo 'ibase=2; 100000000' | bc #256 hex to int echo $((0x100)) #256 hex to int echo 'ibase=16; 100' | bc #256 hex to int printf '%d\n' 0x100 #256 octal to int echo 'ibase=8; 400' | bc #256 - MSBuild error when building an Azure webrole project that has no cs files included. Error occurs in CoreCompile build phase, see build output. Error Message: "CSC : fatal error CS2008: No inputs specified [x:\web\cloudServiceWebRole.csproj]" Fix/Workaround - include an empty cs file in project, this adds a compile entry to the project file <ItemGroup> <Compile Include="a.cs" /> </ItemGroup> - #win server 2008 services - get-service * | ?{$_.name -match "mpsSvc|spooler|termService|trustedInstaller|umRdpService|w3svc|was|wuauserv"} - substitute folder subst /? subst x: \_data subst y: \\10.0.0.0\temp\ - net use net use \\10.0.0.1\c$ * /user:domain\john #prompt for password net use \\10.0.0.1\share * /user:\john net use \\10.0.0.1\c$ * /user:administrator net use \\10.0.0.1\c$ <password> /user:administrator net use \\10.0.0.1\c$ /delete - p# gci env: get-psDrive get-psDrive -psProvider fileSystem - lock windows command http://msdn.microsoft.com/en-us/library/aa376875(v=vs.85).aspx "This function has the same result as pressing Ctrl+Alt+Del and clicking Lock Workstation." &rundll32.exe user32.dll, LockWorkStation - task manager view command-line column task manager -> processes tab -> view - select columns -> command line - runs these p# wmi scripts as Administrator to see all process command lines get-wmiobject win32_process | select commandline get-wmiobject win32_process | select * - p# move files fx, performs xcopy and then deletes sourceFolder - move-item cmdlet too limited, eg error: "Move-Item : Source and destination path must have identical roots. Move will not work across volumes." #WARNING, this fx deletes the source folder after copying files to destination folder #xcopyMoveDelete "x:\data\*" "z:\backup\data\" function xcopyMoveDelete($sourceFolder, $destinationFolder) { xcopy $sourceFolder $destinationFolder /s/h/q #DELETE SOURCE FOLDER WARNING, remove-item cmdlet deletes the source folder - comment whatif param to execute "deleting source folder: $sourceFolder" ri $sourceFolder.trim("*") -recurse -force -whatif } - p# security use set-executionPolicy cmdlet to allow script file execution #set-executionPolicy remoteSigned - p# profile script - windows 7/server 2008 c:\users\john\documents\windowspowershell\profile.ps1 cd\ cls - get-service * | ?{($_.status -eq "running") get-service * | ?{($_.status -eq "stopped") -and ($_.name -match "sql|mssql")} - #calcTaxRate 99 8.25 #sub 99.00 #tax 8.25 (0.0833333333333333) #total 107.25 function calcTaxRate([float]$subtotal, [float]$tax) { $subtotalFmt = "{0:0.00}" -f $subtotal $taxFmt = "{0:0.00}" -f $tax #calc $taxrate = $tax/$subtotal $total = $subtotal * (1 + $taxrate) #calc using taxrate, not tax input param $totalFmt = "{0:0.00}" -f $total #pseudo right-justify hack $subPadding = " " * ( ("$totalFmt".length) - ("$subtotalFmt".length) ) $taxPadding = " " * ( ("$totalFmt".length) - ("$taxFmt".length) ) #output "sub {0}{1}" -f $subPadding, $subtotalFmt "tax {0}{1} ({2})" -f $taxPadding, $taxFmt, $taxrate "total $totalFmt" } - #round 12.3456 #12.35 #round 12.3456 3 #12.346 function round($value, $decimals=2) { [system.decimal]::round($value, $decimals) } - min F# console app examples, for breakpoint System.Diagnostics.Debugger.Break() //ex 1 auto breakpoint System.Console.ReadLine() |> ignore //ex 2 - visual studio command window - shortcut keys: ctl + alt + A COMMAND DESCRIPTION build.rebuildSolution cls clear screen debug.breakpoints open breakpoints window debug.disableAllBreakpoints debug.enableAllBreakpoints debug.watch2 open watch-2 window file.copyFullPath file.openContainingFolder ? "abc".Length 3 ? x debug print x var/value ?? x debug quickwatch Predefined Visual Studio Command Aliases http://msdn.microsoft.com/en-us/library/c3a0kd3x.aspx - ipconfig /release; ipconfig /flushdns; ipconfig /renew; - p# cultureInfo get-culture cmdlet [system.threading.thread]::currentThread.currentUICulture (get-culture).textInfo.toTitleCase("foo bar") #Foo Bar - set-alias <alias> <function> set-alias foo calcFooPiSquare - xcopy x:\data\* x:\backup\data\ /s/h/q xcopy x:\data\* x:\backup\data\ /s/h/q/d:01-01-2011 #files modified on or after date xcopy x:\data\* x:\backup\data\ /s/h/q/exclude:x:\exclude.txt xcopy x:\data\file.txt x:\backup\data\ /s/h/q /e to copy empty folders file: exclude.txt .bmp .pdf .dll .exe .ini .log .suo .temp .user \.git\ \.svn\ \bin\ \debug\ \images\ \obj\ \release\ thumbs.db - hosts files mac: /etc/hosts windows: c:\windows\system32\drivers\etc\hosts - p# copy windows hosts file gc c:\windows\system32\drivers\etc\hosts | out-file x:\backup\data\hosts.txt -encoding utf8 - virtual pc, toggle fullscreen: (right-alt) + enter - p# find all unique words/matches in file use select-string allmatches with regex capture to show only match, not standard select-string output full line - gi x:\foo.txt | select-string "(\w+)" -allmatches | %{ foreach($m in $_.matches) { #loop all matches found in line $m.groups[0].value } } | sort -unique - #one line gi x:\foo.txt | select-string "(\w+)" -allmatches | %{foreach($m in $_.matches){$m.groups[0].value}} | sort -unique - file attributes attrib /? #alt view file and folder attributes gci x:\foo\ -rec #view file attribute attrib x:\foo\a.txt #set readonly file attribute attrib +r x:\foo\a.txt #remove readonly file attribute attrib -r x:\foo\a.txt #recursive, files and folders attrib +r x:\foo\* /s /d attrib -r x:\foo\* /s /d - reserved p# variables, do not use for var names "$args" "$input" - p# REPL template for input loop processing, eg script calculator requires entering input value only, not function/alias name if function requires multiple params, split input param in function #--------------------------------------------------- #template 1, min function foo($string){$string} #function while ($true) { #loop $in = read-host "enter a value" #read input foo($in) #call function } #--------------------------------------------------- #template 2, +ux $host.ui.rawUI.windowTitle = "loop..." #set window title function foo($string){$string} #function while ($true) { #loop $in = read-host "enter a value" #read input if ($in -match "^(exit|quit|q)$") { #exit loop support "exiting loop" #exit break } else { foo($in) #call function } } #--------------------------------------------------- #template 3, anonymous function while ($true) { #loop $in = read-host "enter a value" #read input if ($in -match "^(exit|quit|q)$") { #exit loop support "exiting loop" #exit break } else { &{param($string) $string} $in #call anonymous function } } #--------------------------------------------------- - p# set window title $host.ui.rawUI.windowTitle = "main" - regular expressions - find html opening tags <a[^>]*> <form[^>]*> - remove b html tags search:<b[^>]*>(.*?)</b> replace:\1 - regex match empty lines REGEX DESCRIPTION ^\s*$ match empty line ^\s*$\r\n match empty line, with linebreak - regex match duplicate lines in a text file, sort content first search:^(.*)(\r?\n\1)+$ replace:\1 - regex match html anchor tags works with multiple anchors on same line, and multiline using "dot matches newline" the question mark in this regex ".*?" is what allows it to match multiples on same line REGEX DESCRIPTION <a[^>]*>.*?</a> match entire tag (?<=<a[^>]*>).*?(?=</a>) match text only, including empty --- regex to match ------------- lookbehind, match regex, then lookbehind and match anchor tag -------- lookahead, match regex, then lookahead and match closing anchor tag - regex lookaround - noncapturing groups - "lookaway" :) NAME REGEX EXAMPLE DESCRIPTION MATCH lookahead (?=R) A(?=B) match A, then lookahead and match B matches the A A followed by B negative lookahead (?!R) A(?!B) match A, then lookahead and match if NOT B matches the A match A, as long as it's NOT followed by B A NOT followed by B lookbehind (?<=R) (?<=A)B match B, then lookbehind and match A matches the B B preceeded by A negative lookbehind (?<!R) (?<!A)B match B, then lookbehind and match if NOT A matches the B match B, as long as it's NOT preceeded by A B NOT preceeded by A - p# dynamic array (1..3)[1] #2 - p# html encode file, line by line $file = "x:\foo.txt" gc $file | %{htmlEncode($_)} > ($file + ".out") #x:\foo.txt.out - p# html encode multiline string, here string $hs = @" #... #... "@ $hs | %{htmlencode $_} - add-type -assembly system.web #calling add-type multiple times - ok function htmlEncode($string) { [web.httputility]::htmlencode($string) } #getOutFileName x:\file.txt #x:\file.txt.out function getOutFileName($infile) { [io.path]::getFileName($infile) + ".out" } function getOutFilePath($infile) { [io.path]::getdirectoryname($infile) } - html/url encoding add-type -assembly system.web [web.httputility]::htmlencode("<foo />") [web.httputility]::htmldecode("<foo />") [web.httputility]::urlencode("www.foo.com/?a=b") [web.httputility]::urldecode("www.foo.com%2f%3fa%3db") - loading .net assemblies into p#, add-type replaces loadWithPartialName (obsolete) add-type -assembly system.web #load system web add-type -assembly system.xml.linq #load linq xml #add-type -assemblyName system.web #alt assemblyName param #[system.reflection.assembly]::loadWithPartialName("system.web") #obsolete, use in p1 - asp.net mvc routing, redirect internal: use IIS URL rewrite external: use Controller.RedirectPermanent() and Controller.Redirect() to redirect to other domains public RedirectResult Redirect() { var url = "http://www.expressionsoftware.com/"; return RedirectPermanent(url); //301 permanent redirect //return Redirect(url); //302 temporary redirect } - open files with p# invoke-item cmdlet #open file in default text editor, eg notepad ii x:\temp\foo.txt #open all text files gci x:\temp\* -inc *.txt -rec -force | %{ii $_.fullname} - css even-odd background color tr:nth-child(odd) { background-color: #fff; } tr:nth-child(even) { background-color: gainsboro; } - ms minifier $infile = 'x:\file.debug.js' $outfile = 'x:\file.js' $m = 'x:\lib\microsoftAjaxMinifier\v4\ajaxMin.exe' &$m -js -clobber $infile -out $outfile -enc:out 'utf-8' - html 5 <!doctype html> <html lang=en> <head> <title></title> <meta charset=utf-8> </head> <body> </body> </html> - browser indent outdent margin document.body.style.marginTop = "1000px"; document.body.style.marginLeft = "-100px"; document.body.style.marginBottom = "200px"; - hex color scale #000000 - ffffff, dark to light dark to light 0123456789abcdef 0-9a-f light to dark fedcba9876543210 f-a9-0 - webpage text and background color dom js - black background #000, ghost text #111 document.body.style.backgroundColor = "#000"; document.body.style.color = "#111"; - white background #fff, ghost text #eee document.body.style.backgroundColor = "#fff"; document.body.style.color = "#eee"; - wicked terminal green document.body.style.backgroundColor = "#000"; document.body.style.color = "#1ca62e"; - all elements var x = document.getElementsByTagName("*"); for(var i=0; i<x.length; i++) { x[i].style.backgroundColor = "#000"; x[i].style.color = "#aaa" } - text editor colors font https://www.expressionsoftware.com/apps/texteditor/ var x = document.getElementsByTagName("textarea")[0]; x.style.backgroundColor = "#000"; x.style.color = "#444"; x.style["font-family"] = "verdana" x.style.borderColor = "#000"; x.style.margin = "0"; x.style.padding = "1em 0 0 2em"; - set browser title date function formatDateTime(date) //12:34:00 { date = date || new Date(); return date.getHours() + ':' + date.getMinutes() + ':' + date.getSeconds(); } (function() { document.title = formatDateTime() + ' ' + document.title; }()); //immediate - browser scroll document.body.scrollTop = 500; //c $(window).scrollTop(500); //cfi - windows temp folders win 7/8: c:\users\nelson\appdata\local\temp - remote desktop services terminal services admin/console $ts = 'c:\windows\system32\mstsc.exe' &$ts /v:DEV01 /f /admin #2008+ &$ts /v:DEV01 /f /console #2003 - restart/shutdown windows shutdown /s /f /t 0 #shutdown 0 seconds shutdown /r /f /t 0 #restart 0 seconds shutdown /r /f /t 0 /m \\10.0.0.0 shutdown /r /f /t 0 /m \\DEV01
12/4/13
notes
Subscribe to:
Posts (Atom)