Mateusz Świetlicki

Azure Lately I tried to deploy Azure Resource Manager (ARM) Template with several WebTests (microsoft.insights/webtests) and I kept getting random error with message "Lease already present". Error was very cryptic at first because it's internal implementation error licking out to end user but LZandmans topic on msdn supported my suspicions than error is caused by webtests concurrent deployment.

So the solution is to fix dependencies in your template file. WebTests should be dependsOn Insights Component, Alerts should be dependsOn WebTests and WebTests should dependsOn previous WebTest.

{
    "apiVersion": "2014-04-01",
    "name": "[parameters('webApi')]",
    "type": "Microsoft.Insights/components",
    ...
},
{
    "type": "microsoft.insights/webtests",
    "name": "[concat(parameters('webApi'),'-CalculatorStatus')]",
    "apiVersion": "2014-04-01",
    "dependsOn": [
        "[resourceId('Microsoft.Insights/components', parameters('webApi'))]"
    ]
    ...
},
{
    "type": "microsoft.insights/alertrules",
    "name": "[concat(parameters('webApi'),'-CalculatorStatus-Alert')]",
    "apiVersion": "2014-04-01",
    "dependsOn": [
        "[resourceId('microsoft.insights/webtests', concat(parameters('webApi'),'-CalculatorStatus'))]"
    ]
    ...
},
{
    "comments": "",
    "type": "microsoft.insights/webtests",
    "name": "[concat(parameters('webApi'),'-DataProviderStatus')]",
    "apiVersion": "2014-04-01",
    "dependsOn": [
        "[resourceId('Microsoft.Insights/components', parameters('webApi'))]",
        "[resourceId('microsoft.insights/webtests', concat(parameters('webApi'),'-CalculatorStatus'))]"
    ]
    ...
},
{
    "type": "microsoft.insights/alertrules",
    "name": "[concat(parameters('webApi'),'-DataProviderStatus-Alert')]",
    "apiVersion": "2014-04-01",
    "dependsOn": [
        "[resourceId('microsoft.insights/webtests', concat(parameters('webApi'),'-DataProviderStatus'))]",
        "[resourceId('microsoft.insights/alertrules', concat(parameters('webApi'),'-CalculatorStatus-Alert'))]"
    ]
    ...
}


So lets start by cleaning our repositories git clean should be enouth.

    git clean -dxf

Now install .NET Core SDK from https://www.microsoft.com/net/core#windows and restart all powershel consoles. After that I was able to run new dotnet command but it's still 2 days of work before everything will work again.

Basic help can be found in:

But this is what I did:

  1. In all project.json files:

    • Replace "compilationOptions" with "buildOptions"
    • Replace "Microsoft.AspNet.IISPlatformHandler" with "Microsoft.AspNetCore.Server.IISIntegration"
    • Replate "Microsoft.AspNet." with "Microsoft.AspNetCore."
    • Replace "1.0.0-rc1-final" with "1.0.0-rc2-final"
    • Replace "6.0.0-rc1-final" with "1.0.0-rc2-final"
    • Remove "Microsoft.Extensions.Configuration.FileProviderExtensions"
    • Add "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0-rc2-final" if you need it
    • Replace "EntityFramework.Commands" with "Microsoft.EntityFrameworkCore.Tools": { "type": "build", "version": "1.0.0-preview1-final" }
    • Remove command "ef": "EntityFramework.Commands"
    • Add tool Microsoft.EntityFrameworkCore.Tools: "tools": { "Microsoft.EntityFrameworkCore.Tools": { "version": "1.0.0-preview1-final", "imports": "portable-net452+win81" } },
    • Replace "EntityFramework.Core" with "Microsoft.EntityFrameworkCore": "1.0.0-rc2-final"
    • Replace "EntityFramework.MicrosoftSqlServer" with "Microsoft.EntityFrameworkCore.SqlServer": "1.0.0-rc2-final"
    • If you are using System.Web.Http add "Microsoft.AspNetCore.Mvc.WebApiCompatShim": "1.0.0-rc2-final"
    • If your framework is "dnx451" replcate it with "net461"
    • "xunit.runner.dnx" replace with "dotnet-test-xunit": "1.0.0-rc2-build10015"
    • command "test": "xunit.runner.dnx" replace with "testRunner": "xunit" but in root of JSON file.
    • Remove "exclude"
    • Remove "publishExclude"
    • Add "publishOptions": "publishOptions": { "include": [ "wwwroot", "appsettings.json", "web.config" ] }
    • "tags", "projectUrl" and "licenseUrl" remove or add to "buildOptions"
    • Replace "version": "1.0.0-*" with "version": "1.0.0"
    • Consider adding "preserveCompilationContext": true to web app "buildOptions"
  2. In whole solution:

    • Replace "using Microsoft.Data.Entity" with "using Microsoft.EntityFrameworkCore"
    • Replace "using Microsoft.AspNet." with "using Microsoft.AspNetCore."
  3. In Sturtup.cs:

    • Replace "IServiceCollection.AddInstance" with "IServiceCollection.AddSingleton"
    • Remove "app.UseIISPlatformHandler();"
    • Replace "WebApplication.Run(args);" with

      public static void Main(string[] args)
      {
          var host = new WebHostBuilder()
          .UseKestrel()
          .UseContentRoot(Directory.GetCurrentDirectory())
          .UseIISIntegration()
          .UseStartup<Startup>()
          .Build();
      
      
          host.Run();
      }
      
      
    • .AddJsonFile("appsettings.json") replace with: c# .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
  4. In program.cs:
    • Change "IApplicationEnvironment" to "ApplicationEnvironment"
  5. In many places there is no more need for passing and using "ServiceCollection". You can remove it.
  6. If you do not have it already it is a good idea to crate file nuget.config with: xml <?xml version="1.0" encoding="utf-8"?> <configuration> <packageRestore> <add key="enabled" value="True" /> <add key="automatic" value="True" /> </packageRestore> <packageSources> <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" /> </packageSources> </configuration>
  7. Make sure that your .gitignore is correct. Good example can be found in https://github.com/github/gitignore/blob/master/VisualStudio.gitignore but I whould also add */wwwroot/lib at the end.
  8. Move web.config from wwwroot to root of your project
  9. For good manner delete all project.lock.json files.
  10. If you have console apps using appsetting.json and "copyToOutput" to "buildOptions" in project.json: javascript "buildOptions": { "emitEntryPoint": true, "copyToOutput": [ "appsettings.json" ] },
  11. Change all projects that use EF and are Libraries to .NET Core App by adding static void Main() and buildOption emitEntryPoint. javascript "buildOptions": { "emitEntryPoint": true },
  12. If it posible remove all your existing EF migrations, drop your db and create them from scrach.
  13. If you are using xunit you probably need to add "C:\Program Files\dotnet\sdk\1.0.0-preview1-002702\runtimes\win-x86\native" to you PATH env properties.

Now you should be able to run:

    dotnet restore
    dotnet build
    dotnet test
    dotnet run

Common errors

Error: "Microsoft.DiaSymReader.Native.x86.dll" Not found.

Soluction: Try adding "C:\Program Files\dotnet\sdk\1.0.0-preview1-002702\runtimes\win-x86\native" to you PATH env properties.

Usefull links

https://blogs.msdn.microsoft.com/dotnet/2016/05/16/announcing-net-core-rc2/

https://github.com/dotnet/cli/issues/3069

https://docs.efproject.net/en/latest/cli/dotnet.html

https://docs.asp.net/en/latest/fundamentals/configuration.html

https://docs.efproject.net/en/latest/modeling/index.html

https://blogs.msdn.microsoft.com/dotnet/2016/05/16/announcing-entity-framework-core-rc2/

http://dotnet.github.io/docs/core-concepts/dnx-migration.html

https://docs.asp.net/en/latest/testing/unit-testing.html

Today I turn on by mistake ODIN mode on my Galaxy Tab S2 (T715).

I did this by clicking and holding HOME + VOLUME DOWN + POWER and then clicking VOLUME UP. To my surprise you can't leave ODIN mode by clicking and holding POWER button even for 10s.

Turns out that you have to click and hold HOME + VOLUME DOWN + POWER for 3s to leave ODIN mode and restart your device.

Today after VisualStudio rebuild Synergy stop working with error "ERROR: failed to init synwinhk.dll, another program may be using it".

Odd but restarting Synergy service help.

On Windows 8+ go to TaskManager > Services find Synergy, Right-click and Reset.

List all application pools (AppPools)

    Get-Childitem IIS:\AppPools\

List machine environment path record

    [Environment]::GetEnvironmentVariable("Path", [System.EnvironmentVariableTarget]::Machine).Split(";")

Add new machine environment path record

    function Add-EnvPath
    {
        param($newPath)

        if([System.String]::IsNullOrEmpty($newPath)){
            Write-Error "Path must not be null!"
            return -1
        }

        if(![System.IO.Directory]::Exists($newPath)){
            Write-Error "Path does not exist!"
            return -1
        }

        $path = [Environment]::GetEnvironmentVariable("Path", [System.EnvironmentVariableTarget]::Machine)
        $path += ";" + $newPath

        [Environment]::SetEnvironmentVariable("Path", $path, [System.EnvironmentVariableTarget]::Machine)
    }

Get installed .NET frameworks versions

    function Get-NetVersions {
        Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -recurse |
        Get-ItemProperty -name Version -EA 0 |
        Where { $_.PSChildName -match '^(?!S)\p{L}'} |
        Select PSChildName, Version
    }

Thanks to Jaykul. (http://stackoverflow.com/questions/3487265/powershell-to-return-versions-of-net-framework-on-a-machine)

Nuget is great package manager for .NET projects but it is not perfect in some advance usages.

For example if you are using git submodules in your solution, projects from submodule can have different package repository path than the main projects.

If you have solution structure like:

C:\Code\Foo\Foo.sln C:\Code\Foo\Foo\Foo.csproj C:\Code\Foo\Lib\Bar\Bar.sln C:\Code\Foo\Lib\Bar\Bar\Bar.csproj

and if Foo.sln contains Bar.csproj and Foo.csproj depends on Bar.csproj and you would like to build Bar.csproj while building Foo.sln you will have problem with nuget packages!

Foo.sln will look for nuget packages in:

C:\Code\Foo\packages

But Bar.sln will look for nuget packages in:

C:\Code\Foo\Lib\Bar\packages

And Bar.csproj will have reference to:

    <Reference Include="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\..\packages\log4net.1.2.10\lib\2.0\log4net.dll</HintPath>
    </Reference>

Which translates to:

C:\Code\Foo\Lib\Bar\packages\log4net.1.2.10\lib\2.0\log4net.dll

One way to fix this problem is to use Nuget Restore but not the one in Visual Studio. The one in visual studio will try to point all projects to C:\Code\Foo\packages which is not that we want.

But if you add NuGet.exe to solution and create PowerShell script Restore.ps1

    $slns = Get-ChildItem -r | ? Extension -eq ".sln" | % FullName
    $slns | % { .\.nuget\NuGet.exe restore $_ }

And run it at least once pre-build you will be sure all the nuget packages are where they suppose to be.

Moje oceny prezentacji:

Everyone who writing WPF application stamble on overhead generated by INotifyPropertyChanged in all ViewModel classes. You can try to hide it in base class or #regions but sooner or later You will become sick from all the get's and set's.

Here I will show You 4 ways to implement INotifyPropertyChanged in C#. Code can by found on Github https://github.com/mswietlicki/NotifyPropertyChanged

1. Manual

public class Person: INotifyPropertyChanged
{
    private string _firstName;
    private string _lastName;

    public string FirstName
    {
        get { return _firstName; }
        set
        {
            _firstName = value;
            OnPropertyChanged();
            OnPropertyChanged("FullName");
        }
    }

    public string LastName
    {
        get { return _lastName; }
        set
        {
            _lastName = value;
            OnPropertyChanged();
            OnPropertyChanged("FullName");
        }
    }

    public string FullName
    {
        get { return string.Format("{0} {1}", FirstName, LastName); }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        var handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

2. BetterManual

public class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged = delegate { };

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    protected virtual void OnPropertyChanged<TProperty>(Expression<Func<TProperty>> projection)
    {
        var propertyName = ((MemberExpression)projection.Body).Member.Name;
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

public class Person : ViewModelBase
{
    private string _firstName;
    private string _lastName;

    public string FirstName
    {
        get { return _firstName; }
        set
        {
            _firstName = value;
            OnPropertyChanged();
            OnPropertyChanged(() => FullName); //Usisng Lambda expression allows us to remove dangerous string literals.
        }
    }

    public string LastName
    {
        get { return _lastName; }
        set
        {
            _lastName = value;
            OnPropertyChanged();
            OnPropertyChanged(() => FullName);
        }
    }

    public string FullName
    {
        get { return string.Format("{0} {1}", FirstName, LastName); }
    }
}

3. Dynamic proxy using Castle.Windsor

public class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged = delegate { };

    public virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    public virtual void OnPropertyChanged<TProperty>(Expression<Func<TProperty>> projection)
    {
        var propertyName = ((MemberExpression)projection.Body).Member.Name;
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    public void RegisterPropertyDependecy<T1, T2>(Expression<Func<T1>> source, Expression<Func<T2>> reactor)
    {
        var sourcePropertyName = ((MemberExpression)source.Body).Member.Name;
        PropertyChanged += (sender, e) =>
        {
            if (e.PropertyName.Equals(sourcePropertyName))
                OnPropertyChanged(reactor);
        };
    }
}

public class Person : ViewModelBase
{
    public Person()
    {
        RegisterPropertyDependecy(() => FirstName, () => FullName);
        RegisterPropertyDependecy(() => LastName, () => FullName);
    }
    public virtual string FirstName { get; set; }

    public virtual string LastName { get; set; }

    public virtual string FullName
    {
        get { return string.Format("{0} {1}", FirstName, LastName); }
    }
}

public class AutoOnPropertyChangedInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        invocation.Proceed();

        var viewModel = invocation.Proxy as ViewModelBase;
        if (viewModel == null)
            return;

        if (!invocation.Method.Name.StartsWith("set_"))
            return;

        var propertyName = invocation.Method.Name.Substring(4);
        viewModel.OnPropertyChanged(propertyName);
    }
}

public class PersonFactory
{
    public Person CreatePerson()
    {
        using (var container = new WindsorContainer())
        {
            container.Register(
                Component.For<IInterceptor>()
                    .ImplementedBy<AutoOnPropertyChangedInterceptor>());

            container.Register(
                Component.For<Person>()
                    .ImplementedBy<Person>().Interceptors(InterceptorReference.ForType<IInterceptor>()).Anywhere);

            return container.Resolve<Person>(); 
        }
    }
}

4. PostBuild using PropertyChanged.Fody

/// <summary>
/// This class uses PropertyChanged.Fody to implement INotifyPropertyChanged using post build IL modification. Manual implementaion of INotifyPropertyChanged is not needed but will help Visual Studio.
/// </summary>
[ImplementPropertyChanged]
public class Person: INotifyPropertyChanged
{
    public string FirstName { get; set; }

    public string LastName { get; set; }

    /// <summary>
    /// Fody is smart enough to know that FullName depends on FirstName and LastName and to invoke OnPropertyChanged("FullName")
    /// </summary>
    public string FullName
    {
        get { return string.Format("{0} {1}", FirstName, LastName); }
    }

    /// <summary>
    /// Not really needed but will help Visual Studio. Try to remove INotifyPropertyChanged and PropertyChanged see that happens.
    /// </summary>
    public event PropertyChangedEventHandler PropertyChanged;
}

Today I spend my evening with Fody an open source PostSharp alternative. Fody

Personaly I think that this type of library is must have for every project, specially ones using WPF and MVVM but I won't agree with every available Fody plugin.

For example using Fielder.Fody you can change auto-propety to public field and it will still be seen as property:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

equals

public class Person
{
    public string FirstName;
    public string LastName;
}

And you don't even need to add any attributes! I thing that this plugin is dangerous and to much like magic. Using it will only obscure your code and make it less readable.

Nevertheless many other plugin are extremely useful! E.g.:

Antor.Fody:

    [LogToDebugOnException]
    private int Work(){
        ...

        LogTo.Trace("Some event");
    }

Commander.Fody:

    [OnCommandCanExecute("SubmitCommand")]
    public bool CanSubmit()
    {
        ... 
    }
    [OnCommand("SubmitCommand")]
    public void OnSubmit(){
        ...
    }

Equals.Fody:

    [Equals]
    public class Point
    {
        public int X { get; set; }

        public int Y { get; set; }
    }

    [Fact]
    public void PointEquality
    {
        var a = new Point { X = 4, Y = 5 };
        var b = new Point { X = 4, Y = 5 };

        Assert.IsTrue(a == b);
    }

PropertyChanged.Fody:

    [ImplementPropertyChanged]
    public class Person 
    {        
        public string GivenNames { get; set; }
        public string FamilyName { get; set; }

        public string FullName
        {
            get
            {
                return string.Format("{0} {1}", GivenNames, FamilyName);
            }
        }
    }

NullGuard.Fody:

    [assembly: NullGuard(ValidationFlags.All)]
    ...

    public void SomeMethod(string arg)
    {
        // throws ArgumentNullException if arg is null.
    }

ToString.Fody

    [ToString]
    public class Point
    {
        public int X { get; set; }

        public int Y { get; set; }
    }

    ...

    Console.WriteLine(new Point { X = 4, Y = 5 }); //Returns: {T: "Point", X: 4, Y: 5}

In summary try it and love it. Your life will be much easier. :)

Lately I found myself in need to reduce power consumption of my LED Staff AVR controller while idle.

ATTiny85 have 3 sleep modes: Idle, ADC Noise Reduction and Power-down. Power-down (SLEEP_MODE_PWR_DOWN) will stop internal clock and everything other than Watchdog, INT0 and Pin Change (PCINTx). In this mode AVR consumes less power than I can measure (supposedly 1.8µA @ 3.3V).

To switch to sleep mode use this code:

void SystemSleep() {
    sei();
    set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here
    sleep_enable();

    sleep_mode();                        // System actually sleeps here

    sleep_disable();                     // System continues execution here when watchdog timed out 
    cli();
}

Also you need to define way to wakeup AVR. I used PCINT4 (Pin 4 Change).

    SetBit(GIMSK, PCIE, 1); // Turn on Pin Change interrupt
    SetBit(PCMSK, PCINT4, 1); // Which pins are affected by the interrupt

One more thing you need to do is to write code that will catch to interrupt. If you don't do this AVR will fall to first line of code that is main() and "reset" your program.

ISR(PCINT0_vect) { //Needed for sleep to not reset program after PCINT

}

Note: Every PCINTx will rise PCINT0_vect;

Yesterday I conducted an experiment in which I tested how long will 1 12V battery power 1 meter of led strip.

Strip worked for at least 7 hours... WHY?!

I used:

  • 1 meter of 12V Led Strip (30 LED/m) with 2.4W/m power consumption (according to the documentation).
  • 1 x 12V A23 50mAh battery.

If specification was correct my strip should be power by current around (2.4W / 12V = 0.2A) 200mA. Battery have 50mAh capacity so it should last (50mAh / 200mA = 0.25h) around 15 minutes.

So, why it worked for 7 hours?

My first guess is that battery simple can't supply so much power and efective current was much smaller but LED can still work only dimmer that in specification.

I will do some mesurements and come back to this topic...

Recently I have moved my "LED Wings Poi" project from ATMega8 to ATMega1284P and I have made myself a little problem. I forgot to change fuse settings and program 1284P to lfuse=0xa4 and hfuse=0xd9. So what happened was uC set itself to Ext. Low-Freq. Crystal clock. Full fuse table can by found on ![http://www.engbedded.com/fusecalc/].

Only way to fix it is to buy Low-Freq. Crystal clock. connect it to XTAL1 and XTAL2 pins and to ground through 2 x 20pF capasitors (one for one line)

ATTiny crystal connections

and than use AVRDude to program your fuses back to originals:

sudo avrdude -p m1284p -c usbasp -P usb -t -B 125
sudo avrdude -p m1284p -c usbasp -P usb -U lfuse:w:0xd2:m -U hfuse:w:0x99:m -U efuse:w:0xfd:m -B 125

If you are like me and hate to look for TV/projector/speakers remote, you will be happy to know that you can use your Raspberry Pi and your computer or phone to act as IR remote.

IR Transmiter in action

What you need?

  • Raspberry Pi
  • 940nm IR diode (preferable super bright)
  • 200 Ohm resistor
  • NPN transistor (BC547 or S9014 or similar)
  • Some jumper cables
  • Decoded remote configuration from my previous post Raspberry Pi as IR remote decoder (LIRC)

Setting up:

You need to simple board and connect to GPIO 17 of your Raspberry Pi as in schematic:

IR Transmiter schematic

IR Transmiter picture

Transistor is needed to increase our remote effective range. You can connect diode directly to GPIO but it will be to weak to be useful. You can also use 5V to increase range.

Instalation:

Instalation is the same as in my IR decoder post Raspberry Pi as IR remote decoder (LIRC).

    sudo apt-get install lirc
    echo 'lirc_dev' | sudo tee --append /etc/modules > /dev/null
    echo 'lirc_rpi gpio_in_pin=18 gpio_out_pin=17' | sudo tee --append /etc/modules > /dev/null
    echo 'dtoverlay=lirc-rpi,gpio_in_pin=18,gpio_out_pin=17' | sudo tee --append /boot/config.txt > /dev/null
    sudo reboot

    sudo wget http://raw.github.com/mswietlicki/Blog/master/Files/lirc_hardware.conf -O /etc/lirc/hardware.conf
    sudo wget http://raw.github.com/mswietlicki/Lirc_remotes/master/benq.config -O /etc/lirc/lircd.conf
    sudo /etc/init.d/lirc restart

Testing:

Now we can use irsend to send command to your device.

To send command once:

    irsend SEND_ONCE benq ON

To send command many times:

    irsend SEND_START benq ON
    sleep(1)
    irsend SEND_STOP benq ON

To list all commands:

    irsend LIST benq ""

To list all install remotes:

    irsend LIST "" ""

Referance: http://www.lirc.org/html/irsend.html

Web interface:

For web control you can try http://ni-c.github.io/heimcontrol.js/. I however will be writing my own system.

As part of my dream to build automatisation and remote control system in my flat I needed to decode IR remotes for my projector and speakers. Thanks to that later I will by able to control them easily from Raspberry Pi or AVR uC.

What you need?

  • Raspberry Pi
  • IR receiver TSOP2236 36kHz (or similar)

Setting up:

For LIRC to work properly with IR receiver you need to connect:

  • RPi 3.3 to TSOP2236 pin 2 (Vs)
  • RPi GND to TSOP2236 pin 3 (GND)
  • RPi GPIO 18 to TSOP2236 pin 1 (OUT)

Remember to check your IR Receiver datasheet for pins numbers conformation.

IR Receiver

Instalation:

To install Lirc on your Raspberry Pi use my quick instalation or read detail instractions on this blog.

    sudo apt-get install lirc
    sudo echo 'lirc_dev' >> /etc/modules
    sudo echo 'lirc_rpi gpio_in_pin=18 gpio_out_pin=17' >> /etc/modules
    sudo wget http://raw.github.com/mswietlicki/Blog/master/Files/lirc_hardware.conf -O /etc/lirc/hardware.conf
    sudo wget http://lirc.sourceforge.net/remotes/benq/MP620 -O /etc/lirc/lircd.conf
    sudo /etc/init.d/lirc restart

Testing:

To test if receiver works properly you can look at raw data passing from /dev/lirc0.

    sudo /etc/init.d/lirc stop
    mode2 -d /dev/lirc0

Attention: to read from /dev/lirc0 you need to stop lirc service.

Recording:

To record your IR remote codes you can use irrecord:

    sudo /etc/init.d/lirc stop
    irrecord -d /dev/lirc0 --disable-namespace Remote.raw
    irrecord -a Remote.raw Remote.conf

Loading remote configuration:

To load remote configuration you need to replace /etc/lirc/lircd.conf file.

    sudo cp Remote.conf /etc/lirc/lircd.conf
    sudo /etc/init.d/lirc restart

You can also look for predefine configuration for your remote on http://lirc.sourceforge.net/remotes.

Summary:

IR Remote codes for BenQ W700ST and Microlab Solo7c decode by me can be found on https://github.com/mswietlicki/Lirc_remotes.

References:

I find myself recently with interesting WPF binding use case. I needed to create ContextMenu/MenuItem which binds CommandParameter property to ViewModel and Command property to CodeBehind. It was nesesary due to fact that it was UserControl and DateContext could not have usercontrol specyfic behavior.

First I tried simply:

<UserControl x:Name="Root" ...>
...
    <ContextMenu>
        <MenuItem Command="{Binding CopyToClipboardCommand, ElementName=Root}" CommandParameter="{Binding Content}" Header="Kopiuj" />
...
</UserControl>

But it didn't work because ContextMenu does not exist in UserControl visual tree.

My problem was solve by binding to PlacementTarget property of ContextMenu and Tag property of parent StackPanel:

<UserControl x:Name="Root" ...>
    ...
    <StackPanel Tag="{Binding ElementName=Root}">
        ...
        <StackPanel.ContextMenu>
            <ContextMenu>
                <MenuItem Command="{Binding RelativeSource={RelativeSource AncestorType=ContextMenu}, Path=PlacementTarget.Tag.CopyToClipboardCommand}" CommandParameter="{Binding Content}" Header="Kopiuj" />
            </ContextMenu>
        </StackPanel.ContextMenu>
    </StackPanel>
    ...
</UserControl>

Little too complex but works fine.

Last week I find myself in need to write quite big SQL script that would migrate data from one db to second slightly different db and also create triggers for persistent continues migration. Instead of doing this by hand I decided to write simple node.js console program that will connect to MSSQL db get required date and output finished SQL script.

Node.js

First of course you need to have install node.js on your machine. This part is easy. Just go to http://nodejs.org and download windows installer.

Secondly you need some kind of text editor or IDE. I experimented with SublimeText 2, Light Table and even Vim but eventually I came but to Visual Studio 2012 with Node.js plugin. Vim and SublimeText are fast and powerfull text editors but lack of refactoring, lack of real-time code check and configuration needed to integrate with node.js was to much for me. Light Table is very promising but not yet fully ready for day to day use. (v. 0.4.0)

Thirdly you need node.js module for MSSQL connection. There is official Microsoft package msnodesql-0.2.1-v0.6 but it is very hard to install correctly so I settle for npm install mssql. There is however a but in mssql module that makes it unable to connect to sql server with instance (e.g. "server01\instace01"), fortunately I don't need this function.

While installing node modules remember that Visual Studio Node Package Manager saves module in project directory and don't share them with external node app.

Also you can't install modules from Command Prompt or PowerShell while it's in Administrator mode. I mean you can but it will install them in %WINDIR%\System32 for some reason and node.exe won't see them.

Also npm install -g ... is use for module to be accessible from cmd. Not globally or something.

I can't really show you the code but I will give you couple tips that I find out hard way:

1. If function calls async function you need to specify callback. There is no other simple way to wait for result.

2.

    process.stdout.write(text); 
    or 
    console.log(text); 

is sync if you print to console but async if you print to pipe (file) so don't do process.exit(0); directly after.

    process.stdout.addListener("drain", function () { 
        process.exit(0); 
    }); 

will wait for stream to print.

3.

    columns.map(function (c) { return c.name; }).join(', '); 

usefull for strings concat.

4. JavaScript have 'for' loop async bug so you have to pass item as function parameter;

    for (var i in tables) {
        var table = tables[i];

        doSomethingAsync(table, function (table, columns) {
            ...
        });
    }

This may not by a developer news but last night I stepped on very funny and addictive little Steam game: FTL: Faster Than Light and so passed 4h of my life :/

FTL

Game is simple and easy to learn but extremely hard to finish. It takes around 30 minutes to finish the game but you can't save and every time you make some stupid mistake you end up starting from the beginning and you will find many mistake to make ;). From attacking ship that is to strong for you to finding random quest that will kill 1 of your crew member. Nether the less randomness of game levels, many weapons, drones, ships and ways to kill your opponent will keep you playing for hours.

Pros:

  • Fun
  • Addictive
  • Simple
  • Spaceships!
  • Good music

Cons:

  • Addictive. I had to uninstall this game to stop playing ;)
  • Little too hard and unpredictable
  • Too expensive (10$)
  • No android port

My score: (7/10)

Have you ever wonder what is exact upload date of YouTube video? I have. Fortunately YouTube provides xml API which enables us to retrieve all metadata about a video. YouTube API.

I however went one step further and created PowerShell script that gives you exact date in your local timezone.

PL

W związku z faktem, że większość moich spisów jest ściśle technicznych i wartościowych nie tylko dla Polaków postanowiłem zmienić główny język mojego bloga na angielski.

Od tego momentu przyszłe wpisy będą prowadzone głównie w języku angielskim.

EN

Due to the fact that most of my posts is highly technical and valuable not only for Poles I decided to change the main language of my blog to English.

From this point forward new entries will be mainly in English.

W .NET 3.5 istnieje bug powiązany z bindingiem właściwości IsChecked. Powiązana właściwość ViewModelu nie zmienia się automatycznie na False.

Problem został naprawiony w .NET 4.0 ale jeżeli jesteś zmuszeni to korzystania z 3.5 musisz użyć obejścia polegającego na ręcznym resetowaniu właściwości na False gdy jedno z nich zostanie ustawione na True.

UWAGA: Zmiana wartości na False musi wywołać zdarzenia OnPropertyChanged inaczej trik nie zadziała.

<StackPanel>
    <RadioButton GroupName="Rozmowa" Content="Rozmowa z klientem" IsChecked="{Binding IsTalkWithClient}" />
    <RadioButton GroupName="Rozmowa" Content="Rozmowa z osobą decyzyjną" IsChecked="{Binding IsTalkWithDecisionPerson}"/>
</StackPanel>

public bool IsTalkWithClient
{
    get { return _isTalkWithClient; }
    set
    {
        _isTalkWithClient = value;
        OnPropertyChanged(() => IsTalkWithClient);

        if (IsTalkWithClient) IsTalkWithDecisionPerson = false;
    }
}

public bool IsTalkWithDecisionPerson
{
    get { return _isTalkWithDecisionPerson; }
    set
    {
        _isTalkWithDecisionPerson = value;
        OnPropertyChanged(() => IsTalkWithDecisionPerson);

        if (IsTalkWithDecisionPerson) IsTalkWithClient = false;
    }
}

NDC

12-14 czerwca w Oslo odbyła się konferencja NDC (Norwegian Developers Conference). Jak przystało na dobrą konferencję wszystkie prezentację są nagrane i dostępne on demand w Internecie pod adresem http://vimeo.com/ndcoslo.

Moje oceny prezentacji:

Będę systematycznie dodawał następne oceny.

7/14/2013 7:15:00 PM

Gdzieś na początku maja postanowiłem stworzyć nowy domowy projekt który mógłbym napisać używając prawdziwego TDD (t.z. Nie wolno Ci napisać ani linijki kodu produkcyjnego jeżeli nie istnieje test który nie przechodzi!) oraz innych nowoczesnych metodyk których na co dzień nie mogę użyć w pracy. Akurat tak się złożyło, że od dawna planowałem odświeżyć mojego bloga.

Głównymi założeniami były:

  • Blog będzie pisany z duchem TDD
  • Projekt będzie silnie używał IoC do którego odwołanie będzie jedynie w bootstraperze
  • Projekt będzie otwarty i publicznie dostępny na GitHubie (https://github.com/mswietlicki/MSBlogEngine)
  • Blog będzie używał Markdown jako język formatowania wpisów.
  • Blog będzie używał Git jako sposób przechowywania wpisów.
  • Wpisy będą publicznie dostępne także na GitHubie (https://github.com/mswietlicki/Blog)
  • Będzie to aplikacja ASP.NET MVC.

I jak możecie już zobaczyć złożenia w większości zostały zrealizowane i efekt mojej pracy można zobaczyć pod adresem http://mateusz.swietlicki.net.

Jeśli macie uwagi lub chcielibyście dodać własne poprawki zapraszam na GitHub. Z przyjemnością przyjmę Pull requesty ;)

Jak mogliśmy się spodziewać 27 czerwca 2013 Microsoft ogłosił nowe logo platformy .NET. Jest to kolejny krok w kierunku ujednolicenia twarzy graficznej produktów Microsoft stylem Metro.

.NET

Mi logo się podoba, a wam?

Doctor who Crack

Przeglądając internet w poszukiwaniu plakatu o tematyce Doctora Who natknąłem się na pracę anonimowego artysty który zbudował "Crack in the universe" lub "Crack in the bedroom wall" (źródło: http://www.obviouswinner.com/obvwin/2012/12/28/build-a-custom-doctor-who-crack-in-the-universe-for-your-bed.html).

Zainspirowany postanowiłem samemu zbudować podobny "Crack" do swojej sypialni.

Efekt wygląda następująco:

Crack on my bedroom wall

Crack on my bedroom wall - budowa

Moja rzeźba jest trochę większa i zasilana z sieci elektrycznej, a do jej budowa potrzebowałem:

  • 4m aluminiowego kontownika (ok 20zł w Leroy Merlin)
  • 5m taśmy led biała zimna (100zł w Leroy Merlin)
  • 12V zasilacz o mocy 15W (20zł w Leroy Merlin)
  • 5m kabla miedzianego
  • 2 śruby (do przymocowania do ściany)
  • Klej "kropelka" (do przymocowania do ściany)
  • Nożyce do metalu
  • Wiertarka
  • 2h wolnego czasu wieczorem.

Efekt jest genialny i robi duże wrażenie na wszystkich gościach!

Wczoraj wdrażałem system mojej firmy na serwerze przygotowanym dla nas przez klienta (Urząd Miasta).

W skrócie 15min roboty rozrosło się do 3 godzin.

O to dlaczego:

  • Problem 1: Jeśli powiesz klientowi “System wymaga co najmniej Windows 2008 / SQL 2005 / IIS7 itd.” klient prawie na pewno dostarczy Ci właśnie to Minimum.
  • Problem 2: ASP.NET 4.0 nie działa na Windows 2008 / IIS 7.0 bez odpowiedniej konfiguracji.
    • Pamiętaj o instalacji .NET Framework 4.0 Full
    • Pamiętaj o odpaleniu “aspnet_regiis.exe –i” aby skonfigurować IIS7
    • Pamiętaj o wybraniu poprawnej Puli Aplikacji w managerze IIS7
    • Pule dzielą się na Classic i Integrated. Prawie na pewno potrzebujesz Classic.
    • Upewnij się, że włączyłeś ASP.NET 4.0 w “ISAPI and CGI Restrictions”
  • Problem 3: MS SQL Express nie instaluje się domyślnie z SQL Managemend Studio, i już na pewno nie z Reporting Services. Upewnij się, że ściągnąłeś odpowiednią instalkę.
  • Dobrym pomysłem jest też zabrać ze sobą własny Internet. Klient w cale nie musi mieć WiFi i nie użyczy ci internetu.

Pozdrawiam,

Jak może wiecie 6-8 czerwca miała miejsce konferencja NDC 2012. Największa w strona konferencja informatyczna, chyba nawet większa niż TechEd. Jak wiele nowoczesnych konferencji wszystkie prezentacje są dostępne online on demand. (http://ndcoslo.oktaset.com/Agenda)

W tym poście postaram się pokierować Was które nagrania są najfajniejsze, a które są nudne.

  • Getting Agile with Scrum (4/5)
    • Bardzo fajna prezentacja dla wszystkich które nie mieli jeszcze styczności z Agile i Scrum w swojej firmie.
  • Mobile, How Do I Develop Thee? Let Me Count the Ways (2/5)
    • Ogólnie nudne.
  • Leading a Self-Organizing Team (3/5)
    • Warto posłuchać jak ludzie rozwiązuje problemy zespołów, znudziło mnie jednak po 30min.
  • Roslyn... hmmmm... what? (3/5)
    • Prowadzący kiepsko mówi po angielsku i nie zawsze ma pełne pojęcie o czym mówi, ale ogólnie warto obejrzeć.
  • Professional Software Development (4/5)
    • Prezentacje Roberta C. Martina zawszę warto obejrzeć! Choć to takie mało praktyczne rozmyślania.
  • Clean Architecture (4/5)
    • Robert C. Martin. Jak zwykle zmusza do myślenia i zmienia sposób parzenia na świat.
  • The Single Responsibility Principle. (4/5)
    • Robert C. Martin. Jeśli nie używacie SRP musicie to obejrzeć.

Następne recenzje w drodze…

Natknąłem się ostatnio na bardzo fajne narzędzie: http://chocolatey.org

Jest to konsolowe narzędzie pozwalające automatycznie instalować i aktualizować programy takie jak 7zip, notepad++, vlc, chrome itd…

Ja stworzyłem sobie prostym pliczek PowerShella który automatycznie zainstaluje prawie wszystkie moje ulubione aplikacje z ciągu kilku minut.

powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('http://bit.ly/psChocInstall'))"
cinst chocolatey
cinst 7zip
cinst notepadplusplus
cinst filezilla
cinst ChocolateyGUI
cinst vlc
cinst putty
cinst 7zip.commandline
cinst paint.net
cinst webpicommandline
cinst linqpad4
cinst tortoisesvn
cinst foobar2000
cinst ilspy
cinst PowerGUI
cinst NugetPackageExplorer
cinst synergy
cinst WindowsLiveInstaller
cinst procmon
cinst clojure.clr
cinst procmon

Dla pewności uruchom jako Administrator.

Napotkałem dziś ciekawy problem podczas kopiowania bazy SQL z jednego serwera (w domenie) do drugiego (poza domeną).

Okazało się, że mimo iż nie kazałem mu kopiować uprawnień SQL zgłaszał błąd:

Cannot find the principal '3W\mswietlicki', because it does not exist or you do not have permission.

Okazało się, że '3W\mswietlicki' niechcący był OWNERem przenoszonej bazy danych.

Aby to naprawić musiałem użyć:

EXEC sp_changedbowner 'sa'

By zmienić ownera na niedomenowego ‘sa’.

Mieliście kiedyś potrzebę stworzenia generycznej metody która enkapsulowałaby warunek LINQ i która można by użyć w zapytaniu np. do EntityFramework bez utraty IQueryable na IEnumarable?

Ja tak. Na w zapytaniu:

var sessionId = getUserSession();
var sds = DB.UserDetails.Where(d => d.SessionId == sessionId)
            .Where(d => d.UserId == competencyScore.EnityId)
            .Select(d => d.OfficeUnit).First();

Sprawdzenie czy detale są z danej sesji wymaga dodatkowej zmiennej i warunku, a biorąc pod uwagę, że taki sam warunek przynależności do sesji używam w wielu innych zapytaniach przydało by się go opakować w funkcję, tak aby powstało coś takiego:

var units = DB.UserDetails.InUserSession()
                .Where(d => d.UserId == competencyScore.EnityId)
                .Select(d => d.OfficeUnit)

Jest to bardziej skomplikowane niż się wydaje ponieważ funkcja powinna być generyczna i najlepiej by rozszerzała IQuerable.

Ostatecznie udało mi się rozwiązać problem używając klasy Expression:

public static IQueryable InUserSession(this IQueryable queryable)
{
    var sessionId = getUserSession();
    return queryable.AddEqualityCondition("SessionId", sessionId);
}

public static IQueryable AddEqualityCondition(this IQueryable queryable, string propertyName, V propertyValue)
{
    ParameterExpression pe = Expression.Parameter(typeof(T), "p");

    IQueryable x = queryable.Where(
        Expression.Lambda>(
            Expression.Equal(Expression.Property(pe, typeof (T).GetProperty(propertyName)),
                             Expression.Constant(propertyValue, typeof (V)), false,
                             typeof (T).GetMethod("op_Equality")), new ParameterExpression[] {pe}));
    return (x);
}

Uwaga: AddEqualityCondition nie potrafi porównać typu prostego i jego Nullable więc wracajcie na to uwagę.

Jeśli otrzymujecie błąd:

<compilation debug="true" targetframework="4.0">     
    <assemblies>      
         <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"></add>
    </assemblies>      
</compilation>

fails with
Exception information:  
Exception type: ConfigurationErrorsException Exception message:
Unrecognized attribute 'targetFramework'. 
Note that attribute names are case-sensitive.

To powinieneś zainstalować .NET 4.0 framework oraz uruchomić na serwerze:

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319>aspnet_regiis -i

Jako ciekawostkę dodam, że ASP.NET 4.0 można wyinstalować komendą:

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319>aspnet_regiis -u

Cześć,

Natknąłem się ostatnio na problem podłączenia się do Exchange 2010 SP1, wykorzystując EWS (Exchange Web Service)

Podczas próby połączenia się do usługi serwer zwracał błąd: “The request failed with HTTP status 401: Unauthorized.” lub cos o niedostępności Active Directory. Problem dziwny ponieważ dane logowania na pewno podawałem poprawne.

Mój kod wyglądał w ten sposób:

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP1);
service.Credentials = new WebCredentials("temp1", "temp", "domena");
service.TraceEnabled = true;
service.Url = new Uri("http://192.168.0.205/EWS/Exchange.asmx");

ListAppointments(service);

Po przejrzeniu wielu niepomocnych wątków w Internecie spróbowałem przejrzeć się samej klasie ExchangeService gdzie znalazłem:

service.PreAuthenticate = true;

Co natychmiastowo rozwiązało mój problem.

Mam nadzieję, że wam też rozwiązanie pomoże.

Cześć,

Opisze dzisiaj serię problemów które miałem z instalacją Microsoft Exchange 2010 SP1 pod Windows Server 2008 R2 SP1 i migrację danych z Exchange 2003 działającym na Windows Server 2003 R2 SP2 PL który jest również kontrolerem domeny poziomu Windows Server 2003 Native.

OK, oto lista błędów w chronologicznej kolejności:

  1. "Active Directory does not exist”. OK, upewniłem się że DNS jest poprawnie ustawiony na serwer AD, a nie na internet, oczywiście był bo było to konieczne do dodatnia serwera do domeny. Następnie po chwili googlowania with bing pomógł msdn http://technet.microsoft.com/en-us/library/bb125224.aspx i komenda “ServerManagerCmd -i RSAT-ADDS” uruchomiona na komputerze pod Exchange 2010.
  2. “The schema master is not running Windows Server 2003 Service Pack 1”. Tutaj okazało się, że problemem jest polska wersja windowsa. Należało zmienić ustawienia na serwerze domeny przy użyciu ADSI Edit (AdsiEdit.msc). Okazało się że kontroler domeny przedstawiał swój operationSystemServicePack jako “Dodatek Service Pack 2” zamiast “Service Pack 2”.
  3. Dalej jeszcze gorzej. Tym razem “Could not find any Domain Controller in domain 3w.local.”. Póki co uruchomiłem “PS D:> .\Setup.com /PrepareAD” gdzie d: jest dyskiem instalacyjnym exchange 2010 i czekam dobrą godzinę na zakończenie. OK, Super zakończyło się bez błędu, uruchomiłem jeszcze “PS D:> .\setup.com /PrepareDomain” dla pewności i wystartowałem okienkową instalację.
  4. Hmm, znowu “The schema master is not running Windows Server 2003 Service Pack 1” powtórzę stare rozwiązanie z AdsiEdit.msc…
  5. Super, jeszcze tylko Warningi:
    1. ”This computer requires the Microsoft Office 2010 Filter Packs.” Szybki skok na http://go.microsoft.com/fwlink/?LinkID=191548 i po problemie.
    2. ”If Microsoft Outlook 2003 is in use, you should replicate the free/busy folder on this server to every other free/busy server in the organization. This step should be performed once Setup completes.” ale to później.
  6. 27min i instalacja zakończyła się sukcesem. Updates i Restart.
  7. Przenoszenie danych: http://www.youtube.com/watch?feature=player_embedded&v=-NKkas5N4kY
  8. Problem z certyfikatem SSL. Jeszcze nie rozwiązany…

W nowym SharePoint 2010 sryptowe zarządzanie zostało przeniesione z STSADM do coraz popularniejszego PowerShella. W tym artykulę napiszę postaram się zamieścić podstatowe użyteczne skrypty dla developera SP2010. By zacząć pracę z SharePoint 2010 w consoli PowerShell należy uruchomić wersję x64 konsoli i zainportować polecenia:

Add-PSSnapin Microsoft.SharePoint.PowerShell

Teraz można już przetestować działanie enumerując kontrolki:

Get-SPFarm

Oczywiście jeżeli nie chcesz wpisywać tego za każdym razem gdy chcesz się dostać do SP możesz dodać powyższą komendę do pliku (który domyślnie nie istnieje):

<user_documents>/WindowsPowerShell/Microsoft.PowerShell_profile.ps1

Przykłądowy skrypt wysukujący content typów danej listy i tworzący elementy na innej liście

$12HivesDir = "${env:CommonProgramFiles}\Microsoft Shared\web server extensions\14\" 
$devSite = New-Object -TypeName "Microsoft.SharePoint.SPSite" -ArgumentList "http://192.168.0.201/Repozytorium"; 
$devWeb = $devSite.OpenWeb();

$zadania = $devweb.GetList(“http://192.168.0.201/Repozytorium/Lists/Zadania")</a>

$types = @() 
$dtypes = @() 
foreach($ctype in $zadania.ContentTypes) 
{ 
    $types += $ctype.name 
}

$opisy = $devweb.GetList(http://192.168.0.201/Repozytorium/Lists/Opisy%20wiadomoci)

foreach($ctype in $opisy.items) 
{ 
    $dtypes += $ctype.name 
}

foreach($ctype in $types) 
{ 
    if($dtypes -notcontains $ctype) 
    { 
        Write-Host "Dodaje element: ", $ctype
        $item = $opisy.AddItem() 
        $item.item("Typ zadania") = $ctype
        $item.Update() 
    } 
}

Pracując ostatnio w małej firmie programistycznej natkneliśmy się na pożny problem podczas naszych pierszych kroków z SharePoint 2010.

Po instalacji SharePointFundation wszystko zdawało się działać dobrze dla osoby która go zainstalowała, ale gdy ktoś próbował dostać się z zewnątrz czy nawet później z serwera nagle wszystko działało dziwnie.

Otóż:

  • listy działały tak jakby tylko na stronie głównej
  • panele administracyjne dodanych fitryn wyrzucały błędy braku pliku
  • system nie widział użytkowników domeny

Męczyliśmi się z tym kilka dobrych godzin myśląc że to błąd instalacji SP czy specyfikacji serwera. Na koniec jednak okazało się że błąd jest banalny.

Błędy tego typu występują gdy użytkownik próbuje dostać się do serwera podając adres który nie jest skonfigurowany w ustawieniach mapowania alternatywnego.

Jeżeli np. mapowanie jest skonfigurowane na http://mojserwer to dostanie się z http://localhost czy http://192.168.0.1 mimo że teoretycznie poprawne powoduje błędy linków i tym samym w.w. problemy.

Należy więc dodać wszystkie możliwe mapowania do konfiguracji w paneli administracyjnym.

Napiszę tu pewnie kiedyś kilka słów wstępu. Teraz jednak przejdę odrazu to rzeczy.

Aby dokonać zmian w bazie danych sharepointa trzeba się tam na początek dostać.

Zainstalować SQL Management Studio

SQL Management Studio

Dalej gdy będzie taka możliwość wybieramy nową instancję, ponieważ nie można rozszerzyć istniejącej.

Następnie w ekranie połączania wpisać:

  • \.\pipe\mssql$microsoft##ssee\sql\query (dla WSS 3.0 lub SP 2007)
  • \.\pipe\mssql$sharepoint\sql\quer lub \sharepoint (dla SP 2010)

Autentykacja niech zostanie na “Windows”.

Możecie też potrzebować wyszukać konkretnego tekstu w bazię. Powinna pomóc tak funkcja:

CREATE PROCEDURE FindMyData_String 
    @DataToFind NVARCHAR(4000), 
    @ExactMatch BIT = 0 
AS
SET NOCOUNT ON

DECLARE @Temp TABLE(RowId INT IDENTITY(1,1), SchemaName sysname, TableName sysname, ColumnName SysName, DataType VARCHAR(100), DataFound BIT) 

    INSERT  INTO @Temp(TableName,SchemaName, ColumnName, DataType) 
    SELECT  C.Table_Name,C.TABLE_SCHEMA, C.Column_Name, C.Data_Type 
    FROM    Information_Schema.Columns AS C 
            INNER Join Information_Schema.Tables AS T 
                ON C.Table_Name = T.Table_Name 
        AND C.TABLE_SCHEMA = T.TABLE_SCHEMA 
    WHERE   Table_Type = 'Base Table'
            And Data_Type In ('ntext','text','nvarchar','nchar','varchar','char') 


DECLARE @i INT
DECLARE @MAX INT
DECLARE @TableName sysname 
DECLARE @ColumnName sysname 
DECLARE @SchemaName sysname 
DECLARE @SQL NVARCHAR(4000) 
DECLARE @PARAMETERS NVARCHAR(4000) 
DECLARE @DataExists BIT
DECLARE @SQLTemplate NVARCHAR(4000) 

SELECT  @SQLTemplate = CASE WHEN @ExactMatch = 1 
                            THEN 'If Exists(Select * 
                                          From   ReplaceTableName 
                                          Where  Convert(nVarChar(4000), [ReplaceColumnName]) 
                                                       = ''' + @DataToFind + ''' 
                                          ) 
                                     Set @DataExists = 1 
                                 Else 
                                     Set @DataExists = 0'
                            ELSE 'If Exists(Select * 
                                          From   ReplaceTableName 
                                          Where  Convert(nVarChar(4000), [ReplaceColumnName]) 
                                                       Like ''%' + @DataToFind + '%'' 
                                          ) 
                                     Set @DataExists = 1 
                                 Else 
                                     Set @DataExists = 0'
                            END, 
        @PARAMETERS = '@DataExists Bit OUTPUT', 
        @i = 1 

SELECT @i = 1, @MAX = MAX(RowId) 
FROM   @Temp

WHILE @i <= @MAX
    BEGIN
        SELECT  @SQL = REPLACE(REPLACE(@SQLTemplate, 'ReplaceTableName', QUOTENAME(SchemaName) + '.' + QUOTENAME(TableName)), 'ReplaceColumnName', ColumnName) 
        FROM    @Temp
        WHERE   RowId = @i 


        PRINT @SQL 
        EXEC SP_EXECUTESQL @SQL, @PARAMETERS, @DataExists = @DataExists OUTPUT

        IF @DataExists =1 
            UPDATE @Temp SET DataFound = 1 WHERE RowId = @i 

        SET @i = @i + 1 
    END

SELECT  SchemaName,TableName, ColumnName 
FROM    @Temp
WHERE   DataFound = 1 
GO

I wywołanie:

EXEC FindMyData_string 'microsoft', 0

Więcej o szukaniu można znaleźć na http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/the-ten-most-asked-sql-server-questions--1

LifeCam VX-5500

Jeśli jesteś szczęśliwym posiadaczem kamery internetowej Microsoftu np.: LifeCam VX-5500, może interesowało Cię czy nie dało by się spersonalizować hardwareowego przycisku który jest na kamerce?

Jeśli tak to dobrze trafiłeś :)

Personalizacja jest możliwa, wymaga jedynie podstaw umiejętności programistycznych. Otóż po zainstalowaniu Microsoft LifeCam w katalogu “C:\Program Files (x86)\Microsoft LifeCam” znajdziemy tam m.i. “IcePick.exe”. To właśnie “IcePick.exe” jest otwierany podczas klikania sprzętowego przycisku.

Wiec co musimy zrobić to podmienić “IcePick.exe” naszym programikiem otwierającym np. Skype lub wykonującym inną dowolnie przez nas zaprogramowaną akcję.

Natknąłem się ostatnio znów na problem z serwerem Exchange 2010 stojącym na wirtualnym WS2008R2. Przy próbie połączenia z konsolą exchange wyświetlał się komunikat błędu:

Connecting to remote server failed with the following error message : The WinRM client received an HTTP server error status (500), but the remote service did not include any other information about the cause of the failure. For more information, see the about_Remote_Troubleshooting Help topic.

Rozwiązanie okazuje się dość proste, wystarczy wywołać 2 komendy PowerShella:

Import-Module ServerManager     
Add-WindowsFeature WinRM-IIS-Ext

Które zainstalują WinRM IIS Extensions.

Inner Exception: An unsecured or incorrectly secured fault was received from the other party. See the inner FaultException for the fault code and detail.

Problem w moim przypadku wystąpił przy próbie połączenia proxy z usługą WCF korzystającej z wsHttpBinding, ponieważ godzina serwera różniła się o około 10min od godziny klienta. Co ciekawe to serwer miał zły czas.

Cześć,

Po tym jak poprowadziłem na spotkaniu Grupy.NET na Politechnice Lubelskiej prezentacje o podobnym temacie, otrzymałem kilka próśb od osób których na nim nie było abym opisał jego esencję.

Tak wiec dla wszystkich zainteresowanych, moją prezentację można ściągnąć tutaj. Ma ona niewiele treści, ale znajdziecie tam kilka linków.

Sam temat przygotowań do egzaminu Application Development Foundation był już powielany wielokrotnie w Internecie, wiec nie będę się tu bardzo rozpisywał. Opowiem jedynie jak ja się do niego uczyłem.

Otóż można by wyszczególnić 3 etapy mojej nauki.:

Książka

Na początek oczywiście postanowiłem przeczytać/przeanalizować książkę MSPress Self Paced Training Kit 70-536. Robiłem to jednak w trochę niezwykły sposób. Otóż zauważyłem, że czytając książkę szczególnie w wersji papierowej, po prostu mi się nie chciało. Przeskakiwałem fragmenty, czytałem nieuważnie, bagatelizowałem fragmenty mówiąc sobie “to wiem, to wiem, to jest proste”, tym samym omijając jednak sporo ciekawych fragmentów.

Wpadłem więc na pomysł, że skopiuje tekst z pdf’a (dołączanego do książki lub nielegalnie dostępnego w Internecie) do Expressivo (głos Jennifer) i będę śledził wzrokiem tekst który słyszę z komputera. Takie rozwiązane wymuszało na mnie analizę całego tekstu i nie pozawalało mi się rozkojarzyć. Co wyraźnie wpłynęło na efektywność mojej nauki.

Rozwiązanie to ma oczywiście swoje wady gdyż trzeba tekst na początek trochę przygotować np.: usunąć kod, opisy stron, nagłówki itp. (ja napisałem sobie do tego programik). Także nie każdy lubi słuchać syntezowanego głosu wiec może się tak męczyć.

Internet

Następnym krokiem było dla mnie szukanie informacji o egzaminie w Internecie. Fora, blogi, opracowania jak bardzo dobre Grupy.NET EastGroup.

Na koniec

A właściwie razem w drugim krokiem sprawdzałem swoje umiejętności na dostępnym na płycie programie Practice tests. Można także skorzystać z płatnych (czasami jednak dostępnych na rapidach) próbnych testach w stylu Transcender.

Testy takie są bardzo fajne ponieważ odpowiedz na każde pytanie jest dokładnie opisana, dlaczego akurat ta, a nie tamta.

Gdy już myślicie że wszystkie umiecie i testy wam wychodzą czas zarejestrować się w autoryzowanym ośrodku szkoleniowym (lista tutaj) i w ciągu kilku dni od zgłoszenia zdać egzamin.

Za egzamin płaci się przy zdawaniu lub Voucherem przez stronę www.prometric.com. (Obsługa strony prometrica jest trudna i nie zrozumiała, ale to już opowieść na inny wpis)

Pozdrawiam i życzę udanego egzaminu :)

Windows 7 tak samo jak Vista umożliwia twórcom OEM zmianę tła okna logowania do Windowsa.

Aby je zmienić należy edytować wpis w rejestrze:

HKLM\Software\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\Background na "1"

Następnie utworzyć plik %windir%\System32\oobe\info\backgrounds\backgroundDefault.jpg (plik nie może być większy niż 256kB)

Lub skorzystać z narzędzia TweaksLogon