tag:blogger.com,1999:blog-45922403386514304272024-02-29T01:43:38.731+02:00CodeBlogVurdalakovhttp://www.blogger.com/profile/14714378657208133499noreply@blogger.comBlogger200125tag:blogger.com,1999:blog-4592240338651430427.post-3055123174099229182023-07-03T09:30:00.002+03:002023-07-03T09:30:51.420+03:00Install FlightAware and FlightRadar24 on Raspberry Pi<script type="text/x-markdown">
## Overview
* First install FlightAware PiAware
* Then install FlightRadar24 feeder
## Follow FlightAware PiAware installation instructions
* https://flightaware.com/adsb/piaware/build/
## Enable SSH
* Shut down Raspberry Pi device.
* Remove microSD card and insert it into PC card reader.
* In microSD card root folder create an empty `SSH.txt` file.
* Eject microSD card from PC, insert it into Raspberry Pi and power it up.
## Login with default PiAware credentials
* Username: `pi`
* Password: `flightaware`
## Change password
* Run
```
sudo raspi-config
```
* Select "1. System Options"
* Select "S3. Password"
* Follow instructions
## Check whether Raspberry Pi OS is 32-bit or 64-bit
* Run
```
getconf LONG_BIT
```
## Add FlightRadar24
1. If you have a 64-bit image, first add "armhf" architecture:
```
sudo dpkg --add-architecture armhf
sudo apt update
```
2. Install FR24 support:
```
sudo bash -c "$(wget -O - http://repo.feed.flightradar24.com/install_fr24_rpi.sh)"
```
3. Disable MLAT in `fr24feed.ini` config file:
```
MLAT="no"
MLAT-without-gps="no"
```
4. Start sending data:
```
sudo systemctl start fr24feed
```
## Connect locally:
* PiAware status: http://192.168.1.36/
* FR24 feeder status: http://192.168.1.36:8754/
</script>
Vurdalakovhttp://www.blogger.com/profile/14714378657208133499noreply@blogger.com0tag:blogger.com,1999:blog-4592240338651430427.post-75491777756867404252022-07-19T12:59:00.000+03:002022-07-19T12:59:28.265+03:00[Fix] Raspberry Pi with Windows Remote Desktop Connection - empty screen or "connection problem, giving up"<script type="text/x-markdown">
**Problem**
When you try to establish a remote connection from Windows 10/11 (Remote Desktop Connection) to a Raspberry Pi with Raspbian 11 "Bullseye" (xrdp), you get an empty screen after a successfull login, or this message:
```
Connecting to sesman IP 192.168.1.22 port 3389
sesman connect ok sending
login info to session manager, please wait...
login successful for display 10
started connecting
connection problem, giving up
some problem
```
**Solution**
In SSH connection to Raspberry Pi, or in Raspberry Pi terminal:
1. Start nano editor:
```
sudo nano /etc/X11/xrdp/xorg.conf
```
2. Find this string:
```
Option "DRMDevice" "/dev/dri/renderD128"
```
3. Change it to:
```
#Option "DRMDevice" "/dev/dri/renderD128"
Option "DRMDevice" ""
```
4. Save and exit (`Ctrl+X`)
5. Restart computer:
```
sudo reboot
```
</script>
Vurdalakovhttp://www.blogger.com/profile/14714378657208133499noreply@blogger.com0tag:blogger.com,1999:blog-4592240338651430427.post-69449434792864600302021-12-11T15:53:00.000+02:002021-12-11T15:53:03.210+02:00Logic Analyzer VID 0925 PID 3881 Windows 10 driver installation<ol>
<li>Open this page: <a href="https://support.saleae.com/logic-software/legacy-software/older-software-releases">https://support.saleae.com/logic-software/legacy-software/older-software-releases</a>
<li>Download "Windows 64 bit (no installer)" package.
<li>Extract "Drivers" directory to any location on your hard drive.
<li>Connect Logic Analyzer device with USB cable.
<li>Press "Win+X" and select "Device Manager" item.
<li>Under "Other devices" folder find "Unknown device".
<li>Right-click, select "Properties" and verify that "Device instance path" is "USB\VID_0925&PID_3881\..."
<li>Close "Properties" dialog.
<li>Right-click and select "Update driver".
<li>Select "Browse my computer for drivers".
<li>Click "Browse" button and choose the "Drivers" directory you created at step 3.
<li>Click "OK" button.
<li>Click "Install" buton in confirmation dialog taht will pop up.
<li>Close confirmation window.
</ol>
Vurdalakovhttp://www.blogger.com/profile/14714378657208133499noreply@blogger.com0tag:blogger.com,1999:blog-4592240338651430427.post-47254250817945115402021-11-15T15:51:00.000+02:002021-11-15T15:51:08.650+02:00UltraEdit regular expressions<h3>Swap 2 words separated by whitespaces</h3>
<br /><table>
<tr><td>Find what:</td><td> </td><td><b><code>(\w+)(\s+)(\w+)</code></b></td></tr>
<tr><td>Replace with:</td><td> </td><td><b><code>$3$2$1</code></b></td></tr>
</table><br /><br />
Before:<br />
<pre>0x01 HID_USAGE_GENERIC_POINTER
0x02 HID_USAGE_GENERIC_MOUSE
0x04 HID_USAGE_GENERIC_JOYSTICK
0x05 HID_USAGE_GENERIC_GAMEPAD
0x06 HID_USAGE_GENERIC_KEYBOARD
0x07 HID_USAGE_GENERIC_KEYPAD
0x08 HID_USAGE_GENERIC_MULTI_AXIS_CONTROLLER
</pre>
<br />
After:<br />
<pre>HID_USAGE_GENERIC_POINTER 0x01
HID_USAGE_GENERIC_MOUSE 0x02
HID_USAGE_GENERIC_JOYSTICK 0x04
HID_USAGE_GENERIC_GAMEPAD 0x05
HID_USAGE_GENERIC_KEYBOARD 0x06
HID_USAGE_GENERIC_KEYPAD 0x07
HID_USAGE_GENERIC_MULTI_AXIS_CONTROLLER 0x08
</pre>
</li>Vurdalakovhttp://www.blogger.com/profile/14714378657208133499noreply@blogger.com0tag:blogger.com,1999:blog-4592240338651430427.post-49840133893499533612021-04-26T09:07:00.000+03:002021-04-26T09:07:10.367+03:00Keenetic routers<script type="text/x-markdown">
| Model number | keenetic.com | keenetic.ru | Description |
| ------------ | ------------ | ----------- | ----------- |
| KN-1810 | [Titan](https://keenetic.com/en/keenetic-titan) | [Ultra](https://keenetic.ru/ru/keenetic-ultra) | AC2600 Dual Band Mesh Wi-Fi Gigabit Router: a 5-Port Gigabit Switch, SFP Port, USB 2.0 and 3.0 Ports |
| KN-1910 | [Skipper](https://keenetic.com/en/keenetic-skipper) | [Viva](https://keenetic.ru/ru/keenetic-viva) | AC1300 Dual Band Mesh Wi-Fi Gigabit Router: a 5-Port GigabitSwitch, 2 USB 2.0 Ports |
| KN-3010 | [Speedster](https://keenetic.com/en/keenetic-speedster) | [Speedster](https://keenetic.ru/ru/keenetic-speedster) | AC1200 Dual Band Mesh Wi-Fi Gigabit Router/Extender: a 5-Port Gigabit Switch |
| KN-1711 | [Carrier](https://keenetic.com/en/keenetic-carrier) | [Extra](https://keenetic.ru/ru/keenetic-extra) | AC1200 Dual Band Mesh Wi-Fi Router: a 5-Port 100 Mbps Switch, USB 2.0 Port |
</script>
Vurdalakovhttp://www.blogger.com/profile/14714378657208133499noreply@blogger.com0tag:blogger.com,1999:blog-4592240338651430427.post-40622154889202033482021-04-14T08:21:00.002+03:002021-04-14T08:23:22.474+03:00Print Raspberry Pi CPU and GPU temperature<script type="text/x-markdown">
Display Raspberry Pi ARM CPU temperature and GPU temperature:
</script>
<pre><code>cpu1=$(</sys/class/thermal/thermal_zone0/temp)
cpu2=$(echo "scale=1;$cpu1/1000" | bc)
gpu1=$(/opt/vc/bin/vcgencmd measure_temp)
gpu2=$(echo $gpu1 | tr -dc '.,0-9')
echo "$(date +'%d.%m.%Y %H:%M:%S') @ $(hostname)"
echo "CPU: $cpu2"
echo "GPU: $gpu2"
</code></pre>
<script type="text/x-markdown">
Output:
<pre>14.04.2021 08:12:37 @ rpi3
CPU: 42.9
GPU: 42.7
</pre>
</script>Vurdalakovhttp://www.blogger.com/profile/14714378657208133499noreply@blogger.com0tag:blogger.com,1999:blog-4592240338651430427.post-9917175779583900532020-09-16T08:35:00.004+03:002020-09-16T08:36:52.623+03:00Disable Windows Defender Real-time protection from the command lineWhy? Because it significantly slows down Visual Studio build process.<br />
<br />
<b>PowerShell</b><br />
<br />
Get the current status:<br />
<br />
<pre><code>(Get-MpPreference).DisableRealtimeMonitoring
</code></pre>
<br />
Disable Real-time protection (requires admin rights):<br />
<br />
<pre><code>Set-MpPreference -DisableRealtimeMonitoring $true
</code></pre>
<br />
<b>Command line</b><br />
<br />
Get the current status:<br />
<br />
<pre><code>powershell (Get-MpPreference).DisableRealtimeMonitoring
</code></pre>
<br />
Disable Real-time protection (requires admin rights):<br />
<br />
<pre><code>powershell Set-MpPreference -DisableRealtimeMonitoring $true
</code></pre>
Vurdalakovhttp://www.blogger.com/profile/14714378657208133499noreply@blogger.com0tag:blogger.com,1999:blog-4592240338651430427.post-46684703597990492462019-06-05T09:09:00.000+03:002020-05-17T16:32:19.936+03:00ImageSharp: convert Image to System.Drawing.Bitmap and backSee also on <a href="https://gist.github.com/vurdalakov/00d9471356da94454b372843067af24e">GitHub Gist</a><br />
<br />
<pre><code>namespace Vurdalakov
{
using System;
using System.IO;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Advanced;
using SixLabors.ImageSharp.Formats.Png;
using SixLabors.ImageSharp.PixelFormats;
public static class ImageSharpExtensions
{
public static System.Drawing.Bitmap ToBitmap<TPixel>(this Image<TPixel> image) where TPixel : unmanaged, IPixel<TPixel>
{
using (var memoryStream = new MemoryStream())
{
var imageEncoder = image.GetConfiguration().ImageFormatsManager.FindEncoder(PngFormat.Instance);
image.Save(memoryStream, imageEncoder);
memoryStream.Seek(0, SeekOrigin.Begin);
return new System.Drawing.Bitmap(memoryStream);
}
}
public static Image<TPixel> ToImageSharpImage<TPixel>(this System.Drawing.Bitmap bitmap) where TPixel : unmanaged, IPixel<TPixel>
{
using (var memoryStream = new MemoryStream())
{
bitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Png);
memoryStream.Seek(0, SeekOrigin.Begin);
return Image.Load<TPixel>(memoryStream);
}
}
}
}
</code></pre>Vurdalakovhttp://www.blogger.com/profile/14714378657208133499noreply@blogger.com2tag:blogger.com,1999:blog-4592240338651430427.post-20714369116047008102019-06-04T07:45:00.002+03:002019-06-05T09:12:48.171+03:00ImageSharp: convert Image to byte arraySee also on <a href="https://gist.github.com/vurdalakov/00d9471356da94454b372843067af24e">GitHub Gist</a><br />
<br />
<pre><code>namespace Vurdalakov
{
using System;
using System.IO;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Advanced;
using SixLabors.ImageSharp.Formats;
using SixLabors.ImageSharp.PixelFormats;
public static class ImageSharpExtensions
{
public static Byte[] ToArray<TPixel>(this Image<TPixel> image, IImageFormat imageFormat) where TPixel : struct, IPixel<TPixel>
{
using (var memoryStream = new MemoryStream())
{
var imageEncoder = image.GetConfiguration().ImageFormatsManager.FindEncoder(imageFormat);
image.Save(memoryStream, imageEncoder);
return memoryStream.ToArray();
}
}
}
}
</code></pre><br />
Usage example:<br />
<br />
<pre><code>var image = Image.Load<Rgba32>("c:\\temp\\myimage.jpg");
var pngBytes = image.ToArray(PngFormat.Instance);
</code></pre>Vurdalakovhttp://www.blogger.com/profile/14714378657208133499noreply@blogger.com0tag:blogger.com,1999:blog-4592240338651430427.post-20083264995555180892019-05-30T08:43:00.003+03:002019-05-30T08:44:52.915+03:00Bluetooth/Mac address to string<pre><code>public static String FormatMacAddress(UInt32 macAddress)
{
return String.Format("{0:X2}:{1:X2}:{2:X2}:{3:X2}:{4:X2}:{5:X2}",
(macAddress >> 40) & 0xFF, (macAddress >> 32) & 0xFF, (macAddress >> 24) & 0xFF,
(macAddress >> 16) & 0xFF, (macAddress >> 08) & 0xFF, (macAddress >> 00) & 0xFF);
}
</code></pre><br />
<script type="text/x-markdown">
E.g. `FormatMacAddress(102481439948251)` returns `"5D:34:D1:D2:FD:DB"`.
</script>Vurdalakovhttp://www.blogger.com/profile/14714378657208133499noreply@blogger.com0tag:blogger.com,1999:blog-4592240338651430427.post-8891591684709835202019-04-23T15:49:00.000+03:002019-04-23T15:49:02.860+03:00GUID Guide<li>Part 1: <a href="https://ericlippert.com/2012/04/24/guid-guide-part-one/">https://ericlippert.com/2012/04/24/guid-guide-part-one/</a><br />
<li>Part 2: <a href="https://ericlippert.com/2012/04/30/guid-guide-part-two/">https://ericlippert.com/2012/04/30/guid-guide-part-two/</a><br />
<li>Part 3: <a href="https://ericlippert.com/2012/05/07/guid-guide-part-three/">https://ericlippert.com/2012/05/07/guid-guide-part-three/</a><br />
Vurdalakovhttp://www.blogger.com/profile/14714378657208133499noreply@blogger.com0tag:blogger.com,1999:blog-4592240338651430427.post-13257035504359208912019-03-21T15:43:00.000+02:002019-03-21T15:43:24.590+02:00How to change Visual Studio installation nickname<script type="text/x-markdown">
1. Set the `Nickname` field in the `*.isolation.ini` files in `%ProgramFiles(x86)%\Microsoft Visual Studio\2017[Version]\Common7\IDE\`
2. Set the `Nickname` field in the `state.json` file in `%ProgramData%\Microsoft\VisualStudio\Packages_Instances[InstanceId]\state.json`
Source: https://developercommunity.visualstudio.com/solutions/384658/view.html
</script>Vurdalakovhttp://www.blogger.com/profile/14714378657208133499noreply@blogger.com1tag:blogger.com,1999:blog-4592240338651430427.post-77716403211947770022019-03-14T08:28:00.005+02:002019-03-14T08:28:49.790+02:00[Fix] SerialPort.Open raises IOException with error 87 "The parameter is incorrect"See my <a href="https://stackoverflow.com/a/55138508/11196063">answer on StackOverflow</a>.<br />
<br />
In short: use <a href="https://github.com/jcurl/SerialPortStream">SerialPortStream</a> library and SerialPortStream.OpenDirect() method.<br />
<br />
<pre><code>namespace Vurdalakov
{
using System;
using RJCP.IO.Ports;
class Program
{
static void Main(String[] args)
{
using (var serialPort = new SerialPortStream("COM1"))
{
serialPort.OpenDirect();
while (serialPort.IsOpen)
{
var ch = (Char)serialPort.ReadChar();
Console.Write(ch);
}
}
}
}
}
</code></pre>
Vurdalakovhttp://www.blogger.com/profile/14714378657208133499noreply@blogger.com0tag:blogger.com,1999:blog-4592240338651430427.post-86936183869285055432019-01-28T16:21:00.000+02:002019-01-28T16:21:03.667+02:00C#: Handle unhandled exceptions<pre><code>namespace Vurdalakov
{
using System;
using System.Windows.Forms;
static class Program
{
[STAThread]
static void Main()
{
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
AppDomain.CurrentDomain.UnhandledException += (s, e) => HandleUnhandledException(e.ExceptionObject as Exception);
try
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
catch (Exception ex)
{
HandleUnhandledException(ex);
}
Environment.Exit(0);
}
private static void HandleUnhandledException(Exception ex)
{
// Handle unhandled exception
Application.Exit();
}
}
}
</code></pre>Vurdalakovhttp://www.blogger.com/profile/14714378657208133499noreply@blogger.com0tag:blogger.com,1999:blog-4592240338651430427.post-2923742163833657492019-01-28T15:32:00.001+02:002019-01-28T15:32:35.816+02:00C#: Hide WinForms main windowCan be used for any Windows application.<br />
<br />
<pre><code>namespace Vurdalakov
{
using System;
using System.Drawing;
using System.Windows.Forms;
public partial class MainForm : Form
{
public MainForm()
{
this.InitializeComponent();
}
private void MainForm_Load(Object sender, EventArgs e)
{
this.HideMainForm();
}
private void HideMainForm()
{
this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
this.StartPosition = FormStartPosition.Manual;
var x = 0;
var y = 0;
foreach (var screen in Screen.AllScreens)
{
var bounds = screen.Bounds;
x = Math.Min(x, bounds.Left);
y = Math.Min(y, bounds.Bottom);
}
this.Location = new Point(x - this.Width - 100, y - this.Height - 100);
}
}
}
</code></pre>Vurdalakovhttp://www.blogger.com/profile/14714378657208133499noreply@blogger.com0tag:blogger.com,1999:blog-4592240338651430427.post-13756154396474917702019-01-28T15:24:00.001+02:002019-01-28T15:25:07.317+02:00C#: Allow only one instance of application using mutex<pre><code>namespace Vurdalakov
{
using System;
using System.Security.AccessControl;
using System.Security.Principal;
using System.Threading;
using System.Windows.Forms;
static class Program
{
[STAThread]
static void Main()
{
// Allow everyone to access mutex
var allowEveryoneRule = new MutexAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), MutexRights.FullControl, AccessControlType.Allow);
var securitySettings = new MutexSecurity();
securitySettings.AddAccessRule(allowEveryoneRule);
using (var mutex = new Mutex(false, "ApplicationMutex", out Boolean createdNew, securitySettings))
{
var isMutextOwned = false;
try
{
try
{
isMutextOwned = mutex.WaitOne(500, false);
if (!createdNew || !isMutextOwned)
{
Tracer.Trace("Application is already running, exiting");
return;
}
}
catch (AbandonedMutexException)
{
isMutextOwned = true;
}
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
catch (Exception ex)
{
// Handle unhandled exception here
}
finally
{
if (isMutextOwned)
{
mutex.ReleaseMutex();
}
}
}
}
}
}
</code></pre>Vurdalakovhttp://www.blogger.com/profile/14714378657208133499noreply@blogger.com0tag:blogger.com,1999:blog-4592240338651430427.post-37453189872990393492019-01-24T11:01:00.000+02:002019-01-24T11:26:20.394+02:00Get MATLAB version and license number from C# project<script type="text/x-markdown">
1. Add a reference to the MATLAB COM object: `Project` / `Add Reference` / `COM` / `Matlab Application (Version 9.5) Type Library`
2. Use the following code:
</script><br />
<br />
<pre><code>try
{
var matlab = new MLApp.MLApp();
matlab.Feval("version", 1, out var result2);
var matlabVersion = (result2 as Object[])[0] as String;
Console.WriteLine($"MATLAB version: '{matlabVersion}'");
matlab.Feval("license", 1, out var result1);
var matlabLicense = (result2 as Object[])[0] as String;
Console.WriteLine($"MATLAB license: '{matlabLicense}'");
}
catch (Exception ex)
{
Console.WriteLine("MATLAB is not installed");
}
</code></pre><br />
<script type="text/x-markdown">
See also:
* [Call MATLAB Function from C# Client](https://se.mathworks.com/help/matlab/matlab_external/call-matlab-function-from-c-client.html)
* [version - Version number for MATLAB and libraries](https://se.mathworks.com/help/matlab/ref/version.html)
* [license - Get license number or perform licensing task](https://se.mathworks.com/help/matlab/ref/license.html)
</script>Vurdalakovhttp://www.blogger.com/profile/14714378657208133499noreply@blogger.com0tag:blogger.com,1999:blog-4592240338651430427.post-56117882154615381012019-01-22T11:21:00.000+02:002019-01-22T11:22:14.870+02:00[C#] Embed referenced assemblies into execurtable<script type="text/x-markdown">
1. Add required assemblies as **embedded resources** (in "Reflection" folder in the example below).
1. Add `AppDomain.AssemblyResolve` event handler on the application level.
</script><br />
<br />
<pre><code>
namespace Vurdalakov
{
using System;
using System.Reflection;
using System.Windows.Forms;
static class Program
{
[STAThread]
static void Main()
{
AppDomain.CurrentDomain.AssemblyResolve += OnAppDomainAssemblyResolve;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
private static Assembly OnAppDomainAssemblyResolve(Object sender, ResolveEventArgs args)
{
var resourceName = "Vurdalakov.Reflection." + new AssemblyName(args.Name).Name + ".dll";
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
{
if (stream != null)
{
var assemblyData = new Byte[stream.Length];
stream.Read(assemblyData, 0, assemblyData.Length);
return Assembly.Load(assemblyData);
}
}
return null;
}
}
}
</code></pre>Vurdalakovhttp://www.blogger.com/profile/14714378657208133499noreply@blogger.com0tag:blogger.com,1999:blog-4592240338651430427.post-78835259767737052712018-06-26T12:53:00.003+03:002018-06-26T12:54:14.213+03:00Excel VBA: Insert or duplicate column to the left or right of selected cell<pre><code>Public Sub InsertColumnToTheLeft()
ActiveCell.EntireColumn.Insert
End Sub
Public Sub InsertColumnToTheRight()
ActiveCell.Offset(, 1).EntireColumn.Insert
End Sub
Public Sub DuplicateColumnToTheLeft()
ActiveColumn = ActiveCell.column
InsertColumnToTheLeft
CopyColumn ActiveColumn + 1, ActiveColumn
End Sub
Public Sub DuplicateColumnToTheRight()
ActiveColumn = ActiveCell.column
InsertColumnToTheRight
CopyColumn ActiveColumn, ActiveColumn + 1
End Sub
Public Sub CopyColumn(SourceColumn, TargetColumn)
FinalRow = Cells(Rows.Count, SourceColumn).End(xlUp).Row
For Row = 1 To FinalRow
Cells(Row, TargetColumn).Value = Cells(Row, SourceColumn).Value
Next
End Sub
</code></pre>vbahttp://www.blogger.com/profile/16583275368933536473noreply@blogger.com0tag:blogger.com,1999:blog-4592240338651430427.post-67493130785017087882018-06-25T08:52:00.000+03:002018-06-25T08:52:38.135+03:00Downgrade or upgrade Node.js and npm on Windows<script type="text/x-markdown">
* Install [nvm-windows](https://github.com/coreybutler/nvm-windows) - a node.js version management utility (nvm) for Windows. Download latest installation package [from here](https://github.com/coreybutler/nvm-windows/releases).
</script><br />
<pre><code>D:\>node -v
8.9.4
D:\>nvm list
* 8.9.4 (Currently using 64-bit executable)
D:\>nvm install 6.2.2
Downloading node.js version 6.2.2 (64-bit)...
Complete
Creating C:\Users\balag\AppData\Roaming\nvm\temp
Downloading npm version 3.9.5... Complete
Installing npm v3.9.5...
Installation complete. If you want to use this version, type
nvm use 6.2.2
D:\>nvm list
* 8.9.4 (Currently using 64-bit executable)
6.2.2
D:\>nvm use 6.2.2
Now using node v6.2.2 (64-bit)
D:\>nvm list
8.9.4
* 6.2.2 (Currently using 64-bit executable)
D:\>node -v
v6.2.2
</code></pre>vbahttp://www.blogger.com/profile/16583275368933536473noreply@blogger.com0tag:blogger.com,1999:blog-4592240338651430427.post-11607042718105377412018-03-08T11:31:00.003+02:002018-03-08T11:31:27.285+02:00Lightroom plugin template<script type="text/x-markdown">
* [How to create an empty Lightroom plugin](https://gist.github.com/vurdalakov/6a86e51f643e9ad300824cb184988bb3)
</script>vbahttp://www.blogger.com/profile/16583275368933536473noreply@blogger.com0tag:blogger.com,1999:blog-4592240338651430427.post-903638656838969962018-02-20T10:57:00.002+02:002018-02-20T10:59:11.191+02:00[HowTo] Detect USB device attach/detach on MacOS in C#<script type="text/x-markdown">
* Use MonoMac/Xamarin [FileSystemWatcher](https://developer.xamarin.com/api/type/System.IO.FileSystemWatcher/) to watch the `/dev` directory changes:
</script><pre><code>var fileSystemWatcher = new FileSystemWatcher("/dev");
fileSystemWatcher.Created += (s, e) => { // handle USB device arrival };
fileSystemWatcher.Deleted += (s, e) => { // handle USB device removal };
fileSystemWatcher.EnableRaisingEvents = true;
</code></pre><br />
<script type="text/x-markdown">
* You may need to call this once (find [here](https://stackoverflow.com/questions/16859372/why-doesnt-the-servicestack-razor-filesystemwatcher-work-on-mono-mac-os-x) an explanation):
</script><pre><code>Environment.SetEnvironmentVariable("MONO_MANAGED_WATCHER", "enabled");
</code></pre><br />
<script type="text/x-markdown">
* Use [MonoMac-IOKit-USBDevice](https://github.com/Lunatix89/MonoMac-IOKit-USBDevice) library to get USB device properties like VID, PID, etc. (available in [NuGet](https://www.nuget.org/packages/MonoMac.IOKit)).
</script><br />
vbahttp://www.blogger.com/profile/16583275368933536473noreply@blogger.com0tag:blogger.com,1999:blog-4592240338651430427.post-72657619340014663542018-02-07T17:02:00.000+02:002018-02-07T17:02:02.127+02:00[HowTo] Export and import Capture One keyboard shortcut set<script type="text/x-markdown">
It's simple - just copy one file from one computer to another.
**MacOS:**
`<keyboard_shortcut_set_name>.plist` file in `~/Library/Application Support/Capture One/KeyboardShortcuts/` hidden folder (press `Command+Shift+(dot)` to make it visible in Finder).
**Windows:**
`<keyboard_shortcut_set_name>.xml` file in `%LOCALAPPDATA%\CaptureOne\CustomCommands` (or `C:\Users\<user_name>\AppData\Local\CaptureOne\CustomCommands`) folder.
**XML file format**
```
<Command CommandName="ToolTab5" CommandShortcut="131125" />
```
Lower 16 bit word of `CommandShortcut` is [Windows virtual key code](https://msdn.microsoft.com/en-us/library/dd375731.aspx).
Higher 16 bit word is mask of modifier keys:
* 1 - Shift
* 2 - Control
* 4 - Alt
</script><br />
vbahttp://www.blogger.com/profile/16583275368933536473noreply@blogger.com0tag:blogger.com,1999:blog-4592240338651430427.post-71117850219117847872018-02-02T11:05:00.000+02:002018-02-02T11:13:37.833+02:00How to change Raspberry Pi hostname<script type="text/x-markdown">
Default Raspberry Pi hostname is `raspberrypi`. Let's change it to `piaware`.
* Modify `/etc/hosts` file:
```
sudo nano /etc/hosts
```
Change `127.0.1.1 raspberrypi` line to `127.0.1.1 piaware`
* Modify `/etc/hostname` file:
```
sudo nano /etc/hostname
```
Change `raspberrypi` to `piaware`.
* Reboot Raspberry Pi:
```
sudo shutdown -r now
```
Note: this will change Raspberry Pi hostname in [SSH client working over USB cable](http://codeblog.vurdalakov.net/2018/02/how-to-connect-to-raspberry-pi-zero.html). E.g. in our case it will become `piaware.local` instead of `raspberrypi.local`.
</script>vbahttp://www.blogger.com/profile/16583275368933536473noreply@blogger.com0tag:blogger.com,1999:blog-4592240338651430427.post-59019054245414813942018-02-02T10:10:00.000+02:002018-02-02T10:10:52.858+02:00How to setup multiple WiFi networks on Raspberry Pi<script type="text/x-markdown">
* Add network1:
```
wpa_passphrase "network1_name" "network1_password"
```
```
network={
ssid="network1_name"
#psk="network1_password"
psk=7afd39e7d94225cf77f0925292fb2f2b48b82512b0b66fea00ba0beefbc1ed1f
}
```
* Append it to `wpa_supplicant.conf`:
```
sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
```
Don't forget to remove `#psk` line.
* Repeat steps above for network2
* Final `wpa_supplicant.conf` should be like this:
```
country=GB
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="network1_name"
psk=7afd39e7d94225cf77f0925292fb2f2b48b82512b0b66fea00ba0beefbc1ed1f
}
network={
ssid="network2_name"
psk=0ae9b3a15d71a7d205ee9ac3e01f45cfb16d9acaea3885093052aeafd8ca60b5
}
```
* Reconfigure interface:
```
wpa_cli -i wlan0 reconfigure
```
* Check interface status:
```
wpa_cli -i wlan0 status
```
Check that `ssid` and `ip_address` fields have valid values, and `wpa_state` field is set to `COMPLETED`:
```
pi@raspberrypi:~ $ wpa_cli -i wlan0 status
bssid=50:b5:c4:bd:19:5a
freq=2412
ssid=network1_name
id=1
mode=station
pairwise_cipher=CCMP
group_cipher=TKIP
key_mgmt=WPA2-PSK
wpa_state=COMPLETED
ip_address=192.168.1.67
p2p_device_address=1a:29:ab:78:15:c3
address=18:29:ab:78:15:c3
uuid=a359fb61-b842-51dc-a28f-718fa962eb22
```
* More information: [Setting WiFi up via the command line](https://www.raspberrypi.org/documentation/configuration/wireless/wireless-cli.md)
</script><br />
vbahttp://www.blogger.com/profile/16583275368933536473noreply@blogger.com0