tag:blogger.com,1999:blog-4519492335152261272024-03-24T16:09:50.354+09:00ArxontArxonthttp://www.blogger.com/profile/13966745049986873569noreply@blogger.comBlogger206125tag:blogger.com,1999:blog-451949233515226127.post-81346486218459553072022-01-03T12:58:00.006+09:002022-01-03T12:58:59.051+09:00FAQ Narrator in WPF<p>The built-in Narrator in Windows 10 and Windows 11 is launched by the "LeftCtrl + Win + Enter" shortcut.</p><p><span style="font-size: medium;">Links:</span></p><p><a href="https://support.microsoft.com/en-us/windows/complete-guide-to-narrator-e4397a0d-ef4f-b386-d8ae-c172f109bdb1">Complete guide to Narrator</a></p><p><a href="https://docs.microsoft.com/en-us/dotnet/framework/ui-automation/accessibility-best-practices">Accessibility best practices</a></p><p>In the app window, the control that is in focus is voiced. Also, the Windows narrator voices every key pressed.</p><p>In Windows 7, only the specified control name is pronounced. </p><p>Narrator is missing out of the box in Windows 7 SP1 without updates and the very first versions of Windows 10.</p><p><span style="font-size: medium;"><b>1.</b></span> Narrator announces the type of the selected control, followed by it's name. </p><p>The voiced name is set using the <span style="font-family: courier; font-size: x-small;">AutomationProperties.Name</span> property. </p><p>For example:</p><p><span style="font-family: courier;"> <span style="font-size: x-small;">AutomationProperties.Name = "Login"</span></span></p><p>For custom controls, you need to write the type yourself. Otherwise, "Custom" will be pronounced.</p><p>Example:</p><p>Create a class</p><p> <span style="font-family: courier; font-size: x-small;">public class ToggleSwitchControlAutomationPeer : UserControlAutomationPeer</span><span style="font-family: courier; font-size: small;"> {</span></p><p><span style="font-family: courier; font-size: x-small;"> public ToggleSwitchControlAutomationPeer(ToggleButton owner) :</span></p><p><span style="font-family: courier; font-size: x-small;"> base(owner)</span><span style="font-family: courier; font-size: small;"> {</span><span style="font-family: courier; font-size: small;"> }</span></p><p><span style="font-family: courier; font-size: x-small;"> protected override string GetLocalizedControlTypeCore()</span><span style="font-family: courier; font-size: small;"> {</span></p><p><span style="font-family: courier; font-size: x-small;"> return "Toggle switch";</span></p><p><span style="font-family: courier; font-size: x-small;"> }</span></p><p><span style="font-family: courier; font-size: x-small;"> }</span></p><p>And in control itself</p><p><span style="font-family: courier; font-size: x-small;"> protected override AutomationPeer OnCreateAutomationPeer() </span><span style="font-family: courier; font-size: small;">{</span></p><p><span style="font-family: courier; font-size: x-small;"> return new ToggleSwitchControlAutomationPeer(this);</span></p><p><span style="font-family: courier; font-size: x-small;"> }</span></p><p><br /></p><p><span style="font-size: medium;"><b>2. Recommendation:</b></span></p><p>Add the app name to the main window and, if possible, to all windows of the application. </p><p>Otherwise, there will be a faceless "MainWindow" or "Login Window".</p><p>For example:</p><p><span style="font-family: courier; font-size: x-small;">"YourApplication MainWindow"</span> or <span style="font-family: courier; font-size: x-small;">"BestApp Login Window"</span></p><p><br /></p><p><b><span style="font-size: medium;">3.</span></b></p><p>By default, the Windows narrator repeats the name of the control, so you don't need to add it to the designation.</p><p><br /></p><p><span style="font-size: medium;"><b>4.</b></span></p><p>With the PasswordBox control (and some more) in the .Net Framework up to 4.7.1 trouble. There are actually three outputs:</p><p>a) Updating .Net Framework.</p><p>b) Add our own control in which we use the textbox.</p><p>c) We use a textbox with a special font (for a password, but potentially unsafe).</p><p><a href="https://github.com/dotnet/docs/blob/main/docs/framework/whats-new/whats-new-in-accessibility.md">https://github.com/dotnet/docs/blob/main/docs/framework/whats-new/whats-new-in-accessibility.md</a><br /></p><blockquote><pre class="c-mrkdwn__pre" data-stringify-type="pre" style="--saf-0: rgba(var(--sk_foreground_low,29,28,29),0.13); border-radius: 4px; border: 1px solid var(--saf-0); box-sizing: inherit; color: #1d1c1d; counter-reset: list-0 0 list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Monaco, Menlo, Consolas, "Courier New", monospace !important; font-size: 12px; font-variant-ligatures: none; line-height: 1.50001; margin-bottom: 4px; margin-top: 4px; overflow-wrap: break-word; padding: 8px; tab-size: 4; white-space: pre-wrap; word-break: normal;">In .NET Framework 4.7 and earlier versions, xref:System.Windows.Controls.<span class="c-mrkdwn__highlight" style="background: rgba(242, 199, 68, 0.4); box-sizing: inherit;">PasswordBox</span> controls were announced as "no item in view" or had otherwise incorrect behavior</pre></blockquote><p><b><span style="font-size: medium;">5.</span></b></p><p>Try to use short, clear phrases. No abbreviations, acronyms, compound words.</p>Arxonthttp://www.blogger.com/profile/13966745049986873569noreply@blogger.com0tag:blogger.com,1999:blog-451949233515226127.post-71622776349495117422021-08-25T12:03:00.000+09:002021-08-25T12:03:06.260+09:00Figma to WPF XAML<p> 0. Go to figma</p><p>1. Press to the need element</p><p>2. (If the element consists of several, then select the group</p><p>3. Press Export</p><p>4. Select SVG</p><p>5. Press Export</p><p>6. Open Inkscape</p><p>7. Select all elements - Resize page to selection</p><p>8. Select all elements - Group</p><p>9. File - Save As - Save as type - Microsoft XAML</p><p>10. Paste file to Visual Studio</p><p><br /></p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.blogger.com/video.g?token=AD6v5dwKvZ1lsuWlCOttGYb4y8YZU80gTx380xqmnD--6ZJNSgjAbUupmrC9t14zh1x60LGmOQ0_Wt92Aj599NQk6A' class='b-hbp-video b-uploaded' frameborder='0'></iframe></div><br /><p><br /></p>Arxonthttp://www.blogger.com/profile/13966745049986873569noreply@blogger.com0tag:blogger.com,1999:blog-451949233515226127.post-54286277561293010412020-08-26T23:56:00.000+09:002020-08-26T23:56:20.150+09:00Some tips for settings your keyboard Lenovo ThinkPad 8845CR UltraNav<p> Some tips for settings your keyboard <b>Lenovo ThinkPad 8845CR UltraNav</b></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-q65p309Be48/X0Z38THxa5I/AAAAAAAAAlk/zL17NIqry48bvS0M-D32-6cPNj2ccbYDgCLcBGAsYHQ/s600/8845.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="600" data-original-width="600" height="384" src="https://1.bp.blogspot.com/-q65p309Be48/X0Z38THxa5I/AAAAAAAAAlk/zL17NIqry48bvS0M-D32-6cPNj2ccbYDgCLcBGAsYHQ/w384-h384/8845.jpg" width="384" /></a></div><br /><b><br /></b><p></p><p>Tip Zero! NumLock is disabled with SHIFT! Shift + ScrLk (NumLock)</p><p><br /></p><p>1. If your system has NumLock enabled at system boot, disable:</p><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><p><span style="font-family: courier; font-size: x-small;">Windows Registry Editor Version 5.00</span></p><p><span style="font-family: courier; font-size: x-small;">[HKEY_USERS\.DEFAULT\Control Panel\Keyboard]</span></p><p><span style="font-family: courier; font-size: x-small;">"InitialKeyboardIndicators"="0"</span></p></blockquote><p>(do not forget to disable it in BIOS too)</p><p><br /></p><p>2. Since there is no Win key on the keyboard, and I actively use it, I assigned CapsLock key to WinKey</p><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><p><span style="font-family: courier; font-size: x-small;">Windows Registry Editor Version 5.00</span></p><p><span style="font-family: courier; font-size: x-small;">[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]</span></p><p><span style="font-family: courier; font-size: x-small;">"Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,5c,e0,3a,00,00,00,00,00</span></p></blockquote><p><br /></p><p>3. To use the middle button as a wheel, I used a third party software - <a href="https://github.com/ykon/w10wheel.net">https://github.com/ykon/w10wheel.net</a></p><p><br /></p><p>4. Adding an "acceleration" for the trackpoint <a href="https://forum.thinkpads.com/viewtopic.php?t=120571">https://forum.thinkpads.com/viewtopic.php?t=120571</a></p><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><p><span style="font-family: courier; font-size: x-small;">Windows Registry Editor Version 5.00</span></p><p><span style="font-family: courier; font-size: x-small;">[HKEY_CURRENT_USER\Control Panel\Mouse]</span></p><p><span style="font-family: courier; font-size: x-small;">"SmoothMouseXCurve"=hex:\</span></p><p><span style="font-family: courier; font-size: x-small;">00,00,00,00,00,00,00,00,\</span></p><p><span style="font-family: courier; font-size: x-small;">15,6e,00,00,00,00,00,00,\</span></p><p><span style="font-family: courier; font-size: x-small;">00,40,02,00,00,00,00,00,\</span></p><p><span style="font-family: courier; font-size: x-small;">39,dc,05,00,00,00,00,00,\</span></p><p><span style="font-family: courier; font-size: x-small;">00,00,10,00,00,00,00,00</span></p><p><span style="font-family: courier; font-size: x-small;">"SmoothMouseYCurve"=hex:\</span></p><p><span style="font-family: courier; font-size: x-small;">00,00,00,00,00,00,00,00,\</span></p><p><span style="font-family: courier; font-size: x-small;">b8,5e,01,00,00,00,00,00,\</span></p><p><span style="font-family: courier; font-size: x-small;">cd,4c,15,00,00,00,00,00,\</span></p><p><span style="font-family: courier; font-size: x-small;">ff,4c,88,00,00,00,00,00,\</span></p><p><span style="font-family: courier; font-size: x-small;">00,00,38,02,00,00,00,00</span></p></blockquote>Arxonthttp://www.blogger.com/profile/13966745049986873569noreply@blogger.com0tag:blogger.com,1999:blog-451949233515226127.post-16702571407407904582020-07-08T22:41:00.002+09:002020-07-09T11:19:46.391+09:00Build OpenVPN with XOR-patch (Scramble)<b>Task:</b> It is necessary to compile the current version of OpenVPN for 32 bits with the XOR patch.<br />
<br />
<b>Solution: </b><br />
1. Download and install <b>cygwin </b><a href="https://cygwin.com/install.html">https://cygwin.com/install.html</a><br />
During installation, you need to install the following packages -<br /><font face="courier" size="2">autoconf,<span style="white-space: pre;"> </span>automake, diffutils,<span style="white-space: pre;"> </span>git, libtool, m4, make, mingw64-i686-binutils, mingw64-i686-gcc-core, mingw64-i686-headers,<span style="white-space: pre;"> </span>mingw64-i686-pthreads, mingw64-i686-runtime, mingw64-x86_64-binutils, mingw64-x86_64-gcc-core, mingw64-x86_64-headers, mingw64-x86_64-pthreads, mingw64-x86_64-runtime, patch, patchutils, perl, unzip, wget</font><br />
<span style="white-space: pre;"> </span><br />
2. After run cygwin -<br />
<font size="2"><span style="white-space: pre;"> </span><span style="font-family: "courier new", courier, monospace;">cp `which true` /usr/bin/man2html </span></font><span style="font-family: "courier new", courier, monospace; font-size: x-small;"> </span> <br />
<br />
3. Download OpenVPN Builds <a href="https://github.com/OpenVPN/openvpn-build">https://github.com/OpenVPN/openvpn-build</a><br />
<font size="2"><span style="white-space: pre;"> </span><span style="font-family: "courier new", courier, monospace;">wget https://github.com/OpenVPN/openvpn-build/archive/master.zip</span></font><br /><font size="1">unpack</font><br />
<font size="2"><span style="white-space: pre;"> </span><span style="font-family: "courier new", courier, monospace;">unzip master.zip</span></font><br /><font size="1">Go to the directory</font><br />
<font size="2"><span style="white-space: pre;"> </span><span style="font-family: "courier new", courier, monospace;">cd openvpn-build-master/generic</span></font><br />
<span style="white-space: pre;"> </span><br />
4. Build (for the first time will get WITHOUT a patch)<br />
<font size="2"><span style="white-space: pre;"> </span><span style="font-family: "courier new", courier, monospace;">IMAGEROOT=`pwd`/image-win32 CHOST=i686-w64-mingw32 CBUILD=i686-pc-cygwin ./build</span></font><br />
<span style="white-space: pre;"><span style="font-family: "courier new", courier, monospace; font-size: x-small;"> </span></span><br />
5. After the build of the version is completed, without a patch, we go to the source directory - there will be downloaded archives with the OpenVPN source codes and the necessary libraries.<div><br />
6. We need to unpack the source OpenVPN<br />
<font size="2"><span style="white-space: pre;"> </span><span style="font-family: "courier new", courier, monospace;">tar xvfz openvpn-2.4.9.tar.gz</span><br />
<span style="white-space: pre;"> </span><span style="font-family: "courier new", courier, monospace;">rm openvpn-2.4.9.tar.gz</span><br />
<span style="white-space: pre;"> </span><span style="font-family: "courier new", courier, monospace;">cd openvpn-2.4.9</span><br />
<span style="white-space: pre;"> </span></font><br />
7. Download and apply xor patch - <a href="https://github.com/clayface/openvpn_xorpatch">https://github.com/clayface/openvpn_xorpatch</a><br />
<font size="2"><span style="white-space: pre;"> </span><span style="font-family: "courier new", courier, monospace;">wget https://raw.githubusercontent.com/clayface/openvpn_xorpatch/master/openvpn_xor.patch</span><br />
<span style="white-space: pre;"> </span><span style="font-family: "courier new", courier, monospace;">git apply openvpn_xor.patch</span><br />
<span style="white-space: pre;"> </span><span style="font-family: "courier new", courier, monospace;">tar -czvf openvpn-2.4.9.tar.gz openvpn-2.4.9</span></font><br />
And go back to the generic folder<br />
<font size="2"><span style="white-space: pre;"> </span><span style="font-family: "courier new", courier, monospace;">cd ..</span></font><br />
<br />
8. Starting the project build again -<br />
<font size="2"><span style="white-space: pre;"> </span><span style="font-family: "courier new", courier, monospace;">IMAGEROOT=`pwd`/image-win32 CHOST=i686-w64-mingw32 CBUILD=i686-pc-cygwin ./build</span></font><br />
<span style="white-space: pre;"> </span><br />
9. After finishing, you can goto the path <font face="courier" size="2">C:\cygwin\home\%<b>YOURUSERNAME</b>%\openvpn-build-master\generic\image-win32\openvpn\bin</font> and test your own OpenVPN build<br />
<br /></div>Arxonthttp://www.blogger.com/profile/13966745049986873569noreply@blogger.com0tag:blogger.com,1999:blog-451949233515226127.post-40652275903856661052020-05-05T23:07:00.000+09:002020-05-05T23:07:14.855+09:00ToolTip для отключенного ComboBox<b>Вводная:</b> Необходимо показывать ToolTip только при отключенном ComboBox.<br />
<br />
<b>Решение:</b><br />
1. В свойства ComboBox необходимо добавить<br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">ToolTipService.ShowOnDisabled="True"</span><br />
<br />
2. Самой подсказке надо добавить привязку к какому-нибудь свойству (в нашем примере IsFlag) и воспользоваться встроенным конвертором BooleanToVisibilityConverter<br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><ToolTip Visibility="{Binding IsFlag, Converter={StaticResource BooleanToVisibilityConverter }}" Content="Tooltip for test"/></span><br />
<br />
<br />
<pre class="xml" style="font-family: monospace;"><span style="color: #009900;"><span style="color: black; font-weight: bold;"><ComboBox</span> <span style="color: #000066;">ToolTipService.ShowOnDisabled</span>=<span style="color: red;">"True"</span> </span>
<span style="color: #009900;"> <span style="color: #000066;">IsEnabled</span>=<span style="color: red;">"{Binding IsFlag, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged,</span></span></pre>
<pre class="xml" style="font-family: monospace;"><span style="color: #009900;"><span style="color: red;"> Converter={StaticResource InverseBooleanConverter}}"</span></span>
<span style="color: #009900;"> <span style="color: #000066;">Margin</span>=<span style="color: red;">"25"</span> <span style="color: black; font-weight: bold;">></span></span>
<span style="color: #009900;"><span style="color: black; font-weight: bold;"><ComboBox.ToolTip<span style="color: black; font-weight: bold;">></span></span></span>
<span style="color: #009900;"><span style="color: black; font-weight: bold;"><ToolTip</span> <span style="color: #000066;">Visibility</span>=<span style="color: red;">"{Binding IsFlag, Converter={StaticResource BooleanToVisibilityConverter }}"</span></span>
<span style="color: #009900;"> <span style="color: #000066;">Content</span>=<span style="color: red;">"Tooltip for test"</span><span style="color: black; font-weight: bold;">/></span></span>
<span style="color: #009900;"><span style="color: black; font-weight: bold;"></ComboBox.ToolTip<span style="color: black; font-weight: bold;">></span></span></span>
<span style="color: #009900;"><span style="color: black; font-weight: bold;"><ComboBoxItem</span> <span style="color: #000066;">Content</span>=<span style="color: red;">"Item1"</span> <span style="color: #000066;">IsSelected</span>=<span style="color: red;">"True"</span> <span style="color: black; font-weight: bold;">/></span></span>
<span style="color: #009900;"><span style="color: black; font-weight: bold;"><ComboBoxItem</span> <span style="color: #000066;">Content</span>=<span style="color: red;">"Item2"</span> <span style="color: black; font-weight: bold;">/></span></span>
<span style="color: #009900;"><span style="color: black; font-weight: bold;"><ComboBoxItem</span> <span style="color: #000066;">Content</span>=<span style="color: red;">"Item3"</span> <span style="color: black; font-weight: bold;">/></span></span>
<span style="color: #009900;"><span style="color: black; font-weight: bold;"></ComboBox<span style="color: black; font-weight: bold;">></span></span></span></pre>
Arxonthttp://www.blogger.com/profile/13966745049986873569noreply@blogger.com0tag:blogger.com,1999:blog-451949233515226127.post-79459517368030111832019-04-16T18:09:00.003+09:002019-04-16T18:09:40.598+09:00Доступ к IP KVM Avocent DSR 1021<span style="font-family: -apple-system, BlinkMacSystemFont, Roboto, Open Sans, Helvetica Neue, sans-serif;"><span style="background-color: white; font-size: 13px;"><b>Вводная: </b>Имеется IP KVM Avocent DSR 1021. С настроенным IP-адресом и модулями. Необходимо зайти на него со свежо установленной Windows 10</span></span><br />
<span style="font-family: -apple-system, BlinkMacSystemFont, Roboto, Open Sans, Helvetica Neue, sans-serif;"><span style="background-color: white; font-size: 13px;"><br /></span></span>
<span style="font-family: -apple-system, BlinkMacSystemFont, Roboto, Open Sans, Helvetica Neue, sans-serif;"><span style="background-color: white; font-size: 13px;"><b>Решение:</b></span></span><br />
<span style="background-color: white; font-family: -apple-system, BlinkMacSystemFont, Roboto, "Open Sans", "Helvetica Neue", sans-serif; font-size: 13px;">1. Скачиваем последнюю версию JRE </span><span style="font-family: -apple-system, BlinkMacSystemFont, Roboto, Open Sans, Helvetica Neue, sans-serif;"><span style="font-size: 13px;"><a href="https://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html">https://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html</a> </span></span><span style="background-color: white; font-family: -apple-system, BlinkMacSystemFont, Roboto, "Open Sans", "Helvetica Neue", sans-serif; font-size: 13px;">и устанавливаем</span><span style="background-color: white; font-family: -apple-system, BlinkMacSystemFont, Roboto, "Open Sans", "Helvetica Neue", sans-serif; font-size: 13px;"> </span><br />
<br style="background-color: white; font-family: -apple-system, BlinkMacSystemFont, Roboto, "Open Sans", "Helvetica Neue", sans-serif; font-size: 13px;" /><span style="background-color: white; font-family: -apple-system, BlinkMacSystemFont, Roboto, "Open Sans", "Helvetica Neue", sans-serif; font-size: 13px;">2. В браузере прописываем, что открывать в режиме совместимости. </span><br style="background-color: white; font-family: -apple-system, BlinkMacSystemFont, Roboto, "Open Sans", "Helvetica Neue", sans-serif; font-size: 13px;" /><br style="background-color: white; font-family: -apple-system, BlinkMacSystemFont, Roboto, "Open Sans", "Helvetica Neue", sans-serif; font-size: 13px;" /><span style="background-color: white; font-family: -apple-system, BlinkMacSystemFont, Roboto, "Open Sans", "Helvetica Neue", sans-serif; font-size: 13px;">3. Редактируем файл java.security </span><span style="background-color: white; font-family: -apple-system, BlinkMacSystemFont, Roboto, "Open Sans", "Helvetica Neue", sans-serif; font-size: 13px;">по адресу C:\Program Files\Java\jre1.8.****\lib\security\ </span><br style="background-color: white; font-family: -apple-system, BlinkMacSystemFont, Roboto, "Open Sans", "Helvetica Neue", sans-serif; font-size: 13px;" /><br style="background-color: white; font-family: -apple-system, BlinkMacSystemFont, Roboto, "Open Sans", "Helvetica Neue", sans-serif; font-size: 13px;" /><span style="background-color: white; font-family: -apple-system, BlinkMacSystemFont, Roboto, "Open Sans", "Helvetica Neue", sans-serif; font-size: 13px;">4. Убираем MD5 в строке </span><br style="background-color: white; font-family: -apple-system, BlinkMacSystemFont, Roboto, "Open Sans", "Helvetica Neue", sans-serif; font-size: 13px;" /><span style="background-color: white; font-size: 13px;"><span style="font-family: Courier New, Courier, monospace;">jdk.jar.disabledAlgorithms=MD2, MD5, RSA keySize < 1024 </span></span><br style="background-color: white; font-family: -apple-system, BlinkMacSystemFont, Roboto, "Open Sans", "Helvetica Neue", sans-serif; font-size: 13px;" /><br style="background-color: white; font-family: -apple-system, BlinkMacSystemFont, Roboto, "Open Sans", "Helvetica Neue", sans-serif; font-size: 13px;" /><span style="background-color: white; font-family: -apple-system, BlinkMacSystemFont, Roboto, "Open Sans", "Helvetica Neue", sans-serif; font-size: 13px;">5. Убираем DH keySize < 768 </span><br style="background-color: white; font-family: -apple-system, BlinkMacSystemFont, Roboto, "Open Sans", "Helvetica Neue", sans-serif; font-size: 13px;" /><span style="background-color: white; font-size: 13px;"><span style="font-family: Courier New, Courier, monospace;">jdk.tls.disabledAlgorithms=SSLv3, RC4, DH keySize < 768 </span></span><br style="background-color: white; font-family: -apple-system, BlinkMacSystemFont, Roboto, "Open Sans", "Helvetica Neue", sans-serif; font-size: 13px;" /><br style="background-color: white; font-family: -apple-system, BlinkMacSystemFont, Roboto, "Open Sans", "Helvetica Neue", sans-serif; font-size: 13px;" /><span style="background-color: white; font-family: -apple-system, BlinkMacSystemFont, Roboto, "Open Sans", "Helvetica Neue", sans-serif; font-size: 13px;">6. Открываем "Панель управления"-"Программы"-"Java" </span><br style="background-color: white; font-family: -apple-system, BlinkMacSystemFont, Roboto, "Open Sans", "Helvetica Neue", sans-serif; font-size: 13px;" /><span style="background-color: white; font-family: -apple-system, BlinkMacSystemFont, Roboto, "Open Sans", "Helvetica Neue", sans-serif; font-size: 13px;">Security tab -> Edit Site List -> Добавляем IP адрес KVM "http://X.X.X.X" (+https)</span><br style="background-color: white; font-family: -apple-system, BlinkMacSystemFont, Roboto, "Open Sans", "Helvetica Neue", sans-serif; font-size: 13px;" /><br style="background-color: white; font-family: -apple-system, BlinkMacSystemFont, Roboto, "Open Sans", "Helvetica Neue", sans-serif; font-size: 13px;" /><span style="background-color: white; font-family: -apple-system, BlinkMacSystemFont, Roboto, "Open Sans", "Helvetica Neue", sans-serif; font-size: 13px;">7. Пробуем подключиться</span>Arxonthttp://www.blogger.com/profile/13966745049986873569noreply@blogger.com0tag:blogger.com,1999:blog-451949233515226127.post-40499741536715845012019-03-05T23:15:00.000+09:002019-03-05T23:15:05.636+09:00Про перевод имен переменныхВот есть разное программирование. И везде надо переменные называть. И правилом хорошего тона называть их на английском<i> (нуу за несколькими исключениями, к примеру в виде 1С)</i>.<br />
<br />
И вот тут можно использовать небольшой финт ушами.<br />
<br />
Для примера возьмём слово "склад" и предположим, что мы не знаем как его нам забить. Казалось бы не проблема - идём в Google.Translate и переводим<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-PXnPUDMIOzk/XH6Djy4zwrI/AAAAAAAAAhw/FimUGHXuvf8IkhS4UA2KEd6p8sK-k_sUgCLcBGAs/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="568" data-original-width="1000" height="181" src="https://1.bp.blogspot.com/-PXnPUDMIOzk/XH6Djy4zwrI/AAAAAAAAAhw/FimUGHXuvf8IkhS4UA2KEd6p8sK-k_sUgCLcBGAs/s320/1.png" width="320" /></a></div>
<div>
И тут нас поджидает засада - ни одно из предложенных нам гуглом слов не будет верным. А вот для того, чтобы узнать верное слово, мы ищем наш "Склад" на википедии. После чего переключаемся на английскую страницу кнопкой English. И узнаём, что правильно наш склад называть Warehouse</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-KOVK7nQKGvk/XH6EWOYSlhI/AAAAAAAAAh4/_7JmP2b_08AeCWS0SO_IS71xg1yHdhZEQCLcBGAs/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="990" data-original-width="1000" height="316" src="https://2.bp.blogspot.com/-KOVK7nQKGvk/XH6EWOYSlhI/AAAAAAAAAh4/_7JmP2b_08AeCWS0SO_IS71xg1yHdhZEQCLcBGAs/s320/2.png" width="320" /></a></div>
<div>
<br /></div>
Arxonthttp://www.blogger.com/profile/13966745049986873569noreply@blogger.com0tag:blogger.com,1999:blog-451949233515226127.post-1071325424597517052019-03-04T10:48:00.000+09:002019-03-04T10:48:16.487+09:00Перехват пароля к FTP серверу с помощью роутера Mikrotik<b>Вводная: </b>Есть программа с "захардкорженным" в коде паролем с доступом к FTP. Необходимо узнать пароль.<br />
<br />
<b>Решение: </b>Так как в качестве роутера у нас Mikrotik RB951Ui-2HnD, то будем использовать его. Заходим в winbox. В меню выбираем <span style="font-family: Courier New, Courier, monospace;">Tools - Packet Sniffer</span>. Если стоит галочка <span style="font-family: Courier New, Courier, monospace;">"Only Headers"</span> снимаем её.<br />
<br />
На вкладке <span style="font-family: Courier New, Courier, monospace;">Filter </span>выставляем <span style="font-family: Courier New, Courier, monospace;">Port - 21</span>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-VKbwfQ7zLig/XHyBYepLaWI/AAAAAAAAAhU/xTPWVTQK9vYofwed9sJ1rGTe4KmToP1KgCLcBGAs/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="551" data-original-width="1232" height="178" src="https://2.bp.blogspot.com/-VKbwfQ7zLig/XHyBYepLaWI/AAAAAAAAAhU/xTPWVTQK9vYofwed9sJ1rGTe4KmToP1KgCLcBGAs/s400/1.png" width="400" /></a></div>
<br />
Далее нажимаем <span style="font-family: Courier New, Courier, monospace;">"Start"</span>. Пробуем получить обновления через программу. Если пакеты пошли хорошо, есть нет, то вариант чуть сложнее - убираем порт и смотрим все пакеты от данного компьютера - вероятно (если мы уверены, что используется FTP) используется не стандартный порт.<br />
<blockquote class="tr_bq">
Узнать порт также можно простым запросом у техподдержки вашей программы - объяснив, что "системный администратор не открывает доступ по всем портам, а только по списку".</blockquote>
Далее нажимаем <span style="font-family: Courier New, Courier, monospace;">"Packets"</span> и смотрим все пакеты подряд (Нас интересует вкладка<span style="font-family: Courier New, Courier, monospace;"> "Packet"</span>) - в каком-нибудь из них, будет строка <span style="font-family: Courier New, Courier, monospace;">"PASS"</span> и далее пароль который нам нужен.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-PUJTd9E4K6E/XHyBYCgd57I/AAAAAAAAAhQ/w_dx8XiENI0RxK0i9wxmJzUk-_Gt-_PXACEwYBhgL/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="704" data-original-width="1150" height="243" src="https://4.bp.blogspot.com/-PUJTd9E4K6E/XHyBYCgd57I/AAAAAAAAAhQ/w_dx8XiENI0RxK0i9wxmJzUk-_Gt-_PXACEwYBhgL/s400/2.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Как вариант можем сделать сохранение в файл - на вкладке General. И сделать поиск по подстроке "PASS"</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-w1vIto4TN10/XHyDBuWkS8I/AAAAAAAAAhk/s-5ApUwo1iELXdzLLOLnMWbMilWIHMMNQCLcBGAs/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="691" data-original-width="1600" height="172" src="https://4.bp.blogspot.com/-w1vIto4TN10/XHyDBuWkS8I/AAAAAAAAAhk/s-5ApUwo1iELXdzLLOLnMWbMilWIHMMNQCLcBGAs/s400/3.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<br />Arxonthttp://www.blogger.com/profile/13966745049986873569noreply@blogger.com0tag:blogger.com,1999:blog-451949233515226127.post-31189590260826643452019-02-27T14:25:00.001+09:002019-02-27T14:25:14.832+09:00Строки в компоненте DataGrid разного размера (Compact Framework)<b>Вводная: </b>Есть проект для ТСД Windows Mobile 6.5 на .Net Compact Framework 3. И в нём есть DataGrid с некоторыми данным. Но проблема в том, что в данной версии фреймворка нельзя задать высоту для конкретной строки или авторасширение по контенту.<br />
<br />
Но у нас некоторые строки требуют одной строки для отображения, некоторые две - а делать все двухстрочными это достаточно накладно по использованию экрана.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/--4yQh6vKLoA/XHYeqAzMQNI/AAAAAAAAAg0/wQABd5k-ytY5FtHnZKK8Epr7WljNv897wCLcBGAs/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1328" data-original-width="1600" height="265" src="https://3.bp.blogspot.com/--4yQh6vKLoA/XHYeqAzMQNI/AAAAAAAAAg0/wQABd5k-ytY5FtHnZKK8Epr7WljNv897wCLcBGAs/s320/1.png" width="320" /></a></div>
<br />
<br />
<b>Решение: </b>Напрямую мы не можем обращаться к высоте каждой строки. Но такой параметр ЕСТЬ, правда он с приватным модификатором доступа, поэтому придётся немного схитрить<br />
<br />
Добавим после заполнения данными<span style="font-family: "courier new" , "courier" , monospace;"> (dataGrid1.DataSource = dataTable;) </span><br />
такой код<br />
<pre class="csharp" style="font-family: monospace;"><span style="color: teal; font-style: italic;">//Здесь получаем все строки </span>
<span style="color: #0600ff; font-weight: bold;">var</span> allRows <span style="color: green;">=</span> <span style="color: green;">(</span>ArrayList<span style="color: green;">)</span>dataGrid1
<span style="color: green;">.</span><span style="color: blue;">GetType</span><span style="color: green;">(</span><span style="color: green;">)</span>
<span style="color: green;">.</span><span style="color: blue;">GetField</span><span style="color: green;">(</span><span style="color: #666666;">"m_rlrow"</span>, BindingFlags<span style="color: green;">.</span><span style="color: blue;">NonPublic</span>
<span style="color: green;">|</span> BindingFlags<span style="color: green;">.</span><span style="color: #0600ff; font-weight: bold;">Static</span>
<span style="color: green;">|</span> BindingFlags<span style="color: green;">.</span><span style="color: blue;">Instance</span><span style="color: green;">)</span>
<span style="color: green;">.</span><span style="color: blue;">GetValue</span><span style="color: green;">(</span>dataGrid1<span style="color: green;">)</span><span style="color: green;">;</span>
<span style="color: teal; font-style: italic;">//Здесь формируем массив строк для обработки с их индексами</span>
<span style="color: #0600ff; font-weight: bold;">foreach</span> <span style="color: green;">(</span><span style="color: #0600ff; font-weight: bold;">var</span> pair <span style="color: #0600ff; font-weight: bold;">in</span> dataTable<span style="color: green;">.</span><span style="color: blue;">Rows</span><span style="color: green;">.</span><span style="color: blue;">Cast</span><span style="color: green;"><</span>DataRow<span style="color: green;">></span><span style="color: green;">(</span><span style="color: green;">)</span>
<span style="color: green;">.</span><span style="color: #0600ff; font-weight: bold;">Select</span><span style="color: green;">(</span><span style="color: green;">(</span>r, i<span style="color: green;">)</span> <span style="color: green;">=></span> <span style="color: green;">new</span> <span style="color: green;">{</span>Row <span style="color: green;">=</span> r, Index <span style="color: green;">=</span> i<span style="color: green;">}</span><span style="color: green;">)</span>
<span style="color: teal; font-style: italic;">//Указываем параметр по которому увеличиваем размер строки</span>
<span style="color: green;">.</span><span style="color: #0600ff; font-weight: bold;">Where</span><span style="color: green;">(</span>x <span style="color: green;">=></span> x<span style="color: green;">.</span><span style="color: blue;">Row</span><span style="color: green;">[</span><span style="color: #666666;">"Type"</span><span style="color: green;">]</span><span style="color: green;">.</span><span style="color: blue;">ToString</span><span style="color: green;">(</span><span style="color: green;">)</span><span style="color: green;">.</span><span style="color: blue;">Contains</span><span style="color: green;">(</span><span style="color: #666666;">"<span style="color: teal; font-weight: bold;">\n</span>"</span><span style="color: green;">)</span><span style="color: green;">)</span><span style="color: green;">)</span>
<span style="color: green;">{</span>
<span style="color: #6666cc; font-weight: bold;">int</span> index <span style="color: green;">=</span> pair<span style="color: green;">.</span><span style="color: blue;">Index</span><span style="color: green;">;</span>
<span style="color: teal; font-style: italic;">//Эдесь мы можем получить доступ к строке если надо</span>
<span style="color: teal; font-style: italic;">//DataRow row = pair.Row;</span>
SetGridRowHeight<span style="color: green;">(</span>allRows<span style="color: green;">[</span>index<span style="color: green;">]</span>, <span style="color: red;">60</span><span style="color: green;">)</span><span style="color: green;">;</span>
<span style="color: green;">}</span></pre>
<br />
Далее сама функция изменения размера<br />
<pre class="csharp" style="font-family: monospace;"><span style="color: #0600ff; font-weight: bold;">public</span> <span style="color: #0600ff; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> SetGridRowHeight<span style="color: green;">(</span><span style="color: #6666cc; font-weight: bold;">object</span> row, <span style="color: #6666cc; font-weight: bold;">int</span> height<span style="color: green;">)</span>
<span style="color: green;">{</span>
row<span style="color: green;">.</span><span style="color: blue;">GetType</span><span style="color: green;">(</span><span style="color: green;">)</span><span style="color: green;">.</span><span style="color: blue;">GetField</span><span style="color: green;">(</span><span style="color: #666666;">"m_cy"</span>, BindingFlags<span style="color: green;">.</span><span style="color: blue;">NonPublic</span>
<span style="color: green;">|</span> BindingFlags<span style="color: green;">.</span><span style="color: #0600ff; font-weight: bold;">Static</span>
<span style="color: green;">|</span> BindingFlags<span style="color: green;">.</span><span style="color: blue;">Instance</span><span style="color: green;">)</span>
<span style="color: green;">.</span><span style="color: blue;">SetValue</span><span style="color: green;">(</span>row, height<span style="color: green;">)</span><span style="color: green;">;</span>
<span style="color: green;">}</span>
</pre>
<div>
<br />
И результат:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-V7gZEvsyjmY/XHYevEtXtAI/AAAAAAAAAg4/3bIQ5UtLnd8h1JGFIREOov6J8e2WCqJaQCLcBGAs/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1495" data-original-width="901" height="320" src="https://1.bp.blogspot.com/-V7gZEvsyjmY/XHYevEtXtAI/AAAAAAAAAg4/3bIQ5UtLnd8h1JGFIREOov6J8e2WCqJaQCLcBGAs/s320/2.png" width="192" /></a></div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-apDVZPsZbN8/XHYeynXrN7I/AAAAAAAAAg8/l1phrMf6ZGkGfTBZaOxTKETeqKJycDSswCLcBGAs/s1600/code.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="770" data-original-width="1144" height="268" src="https://3.bp.blogspot.com/-apDVZPsZbN8/XHYeynXrN7I/AAAAAAAAAg8/l1phrMf6ZGkGfTBZaOxTKETeqKJycDSswCLcBGAs/s400/code.png" width="400" /></a></div>
<br />
<br /></div>
Arxonthttp://www.blogger.com/profile/13966745049986873569noreply@blogger.com0tag:blogger.com,1999:blog-451949233515226127.post-45856349513391377382019-02-19T10:50:00.002+09:002019-02-19T10:50:39.653+09:00Сброс настроек и пароля в IP камере Dahua 1220SP<b>Вводная: </b>Дана камера Dahua IPC-HFW1220SP. В веб-интерфейс не входит, telnet-ssh не доступны. IP по DHCP не получает (порт при этом поднимается, линк загорается). ИК-подсветка реагирует на смену света.<br />
<br />
<b>Решение: </b>Решили для начала сбросить настройки, но вот тут то и ждала засада - официальная документация <a href="https://dahuawiki.com/images/1/1e/ResetIPCamera.pdf">https://dahuawiki.com/images/1/1e/ResetIPCamera.pdf</a> про эту модель молчит. Продавец говорит - отправляйте нам на замену. Но это долго.<br />
<br />
Начали смотреть, в отличии от младшей модели 1020SP, на этой нет кнопки Reset (да, на младшей всё просто - нажали на кнопочку при включении - выждали 10 секунд и сбросилось).<br />
<br />
Не буду вас утомлять - для сброса данной карты нужно снять крышку, снять ИК подсветку (но не отключать провод! Это важно). И замкнуть чем-нибудь тонким две площадки указанные на фото, на выключенной камере - затем подать питание, выждать 15 секунд и убрать замыкание. По сути это кнопка сброса, но не распаянная.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-lH0BWJfLVRY/XGtgG-dzLnI/AAAAAAAAAgg/GZYLMrWcgCI6xZYXOXQwwM5dWp_ANQmTQCLcBGAs/s1600/camera.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1083" data-original-width="1083" height="400" src="https://4.bp.blogspot.com/-lH0BWJfLVRY/XGtgG-dzLnI/AAAAAAAAAgg/GZYLMrWcgCI6xZYXOXQwwM5dWp_ANQmTQCLcBGAs/s400/camera.png" width="400" /></a></div>
<br />
После сброса всё заработало штатно.<br />
<br />
<b>Ключевые слова: Dahua, HFW1220SP, factory settings, reset, default </b><br />
<br />
PS: Эксперимент делался на свой страх и риск - было бы очень весело если бы это было питание для чего-либо :) И замкнули + и -. Так что будьте осторожнее делая это на других ревизиях или моделях - проверьте вначале мультиметром, что там не будет ничего.Arxonthttp://www.blogger.com/profile/13966745049986873569noreply@blogger.com1tag:blogger.com,1999:blog-451949233515226127.post-38079667829394091332018-09-05T23:04:00.000+09:002018-09-05T23:04:47.541+09:00Доступ в интернет с эмулятора Windows Mobile 6 на Windows 10<b>Вводная:</b> Есть ТСД, штука дорогая, защищённая, с мощными батареями и главное в наличии. "Покупать другие не предлагать". Разработка для них знакома и не представляет сложности. Все поставилось, но софт требует доступа к интернет-серверу (REST-api, все дела). А его нет! Проблема в том, что доступ к сети реализован через VirtualPC 2007, которая в Windows 10 не работают от слова вообще.<br />
<br />
<b>Но выход есть:</b><br />
<b>1.</b> Ставим локальный прокси. Я рекомендую <b>Fiddler </b><a href="https://www.telerik.com/fiddler" target="_blank">https://www.telerik.com/fiddler</a><br />
<br />
<b>2. </b>Запускать от админа, потом в меню <b>Tools -> Options -> Connections </b><br />
<b><br /></b>
<b>3.</b> Обязательно указываем <b>"Allow remote computers to connect"</b><br />
<b><br /></b>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-VbD1xRa9M-0/W4_cJIKlMqI/AAAAAAAAAf8/sUtRMfJa0XMUXpWsZwmejmbm2QzLDSewACLcBGAs/s1600/Fiddler.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="368" data-original-width="542" height="217" src="https://2.bp.blogspot.com/-VbD1xRa9M-0/W4_cJIKlMqI/AAAAAAAAAf8/sUtRMfJa0XMUXpWsZwmejmbm2QzLDSewACLcBGAs/s320/Fiddler.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<b>4. </b>Запускаем <b>Microsoft Device Emulator Manager 9 </b>(входит в состав Microsoft Device Emulator 3.0 <a href="https://www.microsoft.com/ru-ru/download/details.aspx?id=5352">https://www.microsoft.com/ru-ru/download/details.aspx?id=5352</a> )<br />
<br />
<b>5.</b> Выбираем наш эмулятор и в контекстном меню выбираем <b>Cradle</b><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-jy1KsGstDYo/W4_cJfHGGBI/AAAAAAAAAgA/dMNRcah2XLQawdPdlZBwXiJKZduNoE3LQCEwYBhgL/s1600/DEM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="487" data-original-width="608" height="256" src="https://1.bp.blogspot.com/-jy1KsGstDYo/W4_cJfHGGBI/AAAAAAAAAgA/dMNRcah2XLQawdPdlZBwXiJKZduNoE3LQCEwYBhgL/s320/DEM.png" width="320" /></a></div>
<b><br /></b>
<b>6. </b>Должен открыться <b>"Центр устройств Windows Mobile"</b> <a href="https://www.microsoft.com/ru-ru/download/details.aspx?id=3182">https://www.microsoft.com/ru-ru/download/details.aspx?id=3182</a><br />
<br />
<b>7. </b>В нём выбираем "Подключение без настройки устройства"<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-3Fa4IFuirok/W4_cKOjNvjI/AAAAAAAAAgI/vvf79joWpdcYNAK-Y7F8wzmXIzZbZDMxwCEwYBhgL/s1600/Mobile%2BCenter.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="596" data-original-width="794" height="240" src="https://4.bp.blogspot.com/-3Fa4IFuirok/W4_cKOjNvjI/AAAAAAAAAgI/vvf79joWpdcYNAK-Y7F8wzmXIzZbZDMxwCEwYBhgL/s320/Mobile%2BCenter.png" width="320" /></a></div>
<br />
<b>8. </b>На эмуляторе <b>Settings -> Connections -> Connections -> Edit my proxy server</b><br />
<b><br /></b>
<b>9. </b>Указываем Ip адрес компьютера на котором запущен Fiddler и дважды нажимаем <b>OK</b><br />
<b><br /></b>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-p2JGy-jd4nI/W4_cJWhsJ7I/AAAAAAAAAgE/kIZLEzvExLAUIniQs_JuGav6y8JFse9WQCEwYBhgL/s1600/4.%2BProxy.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="997" data-original-width="602" height="320" src="https://3.bp.blogspot.com/-p2JGy-jd4nI/W4_cJWhsJ7I/AAAAAAAAAgE/kIZLEzvExLAUIniQs_JuGav6y8JFse9WQCEwYBhgL/s320/4.%2BProxy.png" width="193" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
<b>10.</b> Пробуем выходить в интернет<br />
<br />
<b>PS: </b>Минус у этого решения есть и достаточно серъёзный - это всё надо делать каждый раз после перезапуска компьютера. Но автоматизируется легко. AutoIt или на том-же C#.<br />
<br />
<b>PS2: </b>Кстати при наличии лицензионного ключа на 2008 Professional пришлось ставить пиратскую. Мой серийник, честно купленный в 2010 году, все найденные дистрибутивы просто отказались принимать :(Arxonthttp://www.blogger.com/profile/13966745049986873569noreply@blogger.com0tag:blogger.com,1999:blog-451949233515226127.post-26205749178940717412018-08-03T11:16:00.000+09:002018-08-03T11:25:47.882+09:00Битрикс - добавление в почтовый шаблон номера телефонаВводная: Необходимо добавить номер телефона и адрес клиента в письмо от интернет-магазина битрикса (о новом заказе).<br />
<br />
Решение:<br />
1) Добавляем в <b><span style="font-family: "courier new" , "courier" , monospace;">/bitrix/php_interface/init.php</span></b> код<br />
<br />
<pre class="php" style="font-family: monospace;"><span style="color: black; font-weight: bold;"><?</span>
AddEventHandler<span style="color: #009900;">(</span><span style="color: blue;">"sale"</span><span style="color: #339933;">,</span> <span style="color: blue;">"OnOrderNewSendEmail"</span><span style="color: #339933;">,</span> <span style="color: blue;">"ModifySaleMails"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: black; font-weight: bold;">function</span> ModifySaleMails<span style="color: #009900;">(</span><span style="color: #000088;">$orderID</span><span style="color: #339933;">,</span> <span style="color: #339933;">&</span><span style="color: #000088;">$eventName</span><span style="color: #339933;">,</span> <span style="color: #339933;">&</span><span style="color: #000088;">$arFields</span><span style="color: #009900;">)</span>
<span style="color: #009900;">{</span>
<span style="color: #000088;">$arOrder</span> <span style="color: #339933;">=</span> CSaleOrder<span style="color: #339933;">::</span><span style="color: #004000;">GetByID</span><span style="color: #009900;">(</span><span style="color: #000088;">$orderID</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$order_props</span> <span style="color: #339933;">=</span> CSaleOrderPropsValue<span style="color: #339933;">::</span><span style="color: #004000;">GetOrderProps</span><span style="color: #009900;">(</span><span style="color: #000088;">$orderID</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$phone</span> <span style="color: #339933;">=</span> <span style="color: blue;">""</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$address</span> <span style="color: #339933;">=</span> <span style="color: blue;">""</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">while</span> <span style="color: #009900;">(</span><span style="color: #000088;">$arProps</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$order_props</span><span style="color: #339933;">-></span><span style="color: #004000;">Fetch</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #009900;">{</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">(</span><span style="color: #000088;">$arProps</span><span style="color: #009900;">[</span><span style="color: blue;">"CODE"</span><span style="color: #009900;">]</span> <span style="color: #339933;">==</span> <span style="color: blue;">"PHONE"</span><span style="color: #009900;">)</span><span style="color: #009900;">{</span>
<span style="color: #000088;">$phone</span> <span style="color: #339933;">=</span> <span style="color: #990000;">htmlspecialchars</span><span style="color: #009900;">(</span><span style="color: #000088;">$arProps</span><span style="color: #009900;">[</span><span style="color: blue;">"VALUE"</span><span style="color: #009900;">]</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span><span style="color: #009900;">}</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">(</span><span style="color: #000088;">$arProps</span><span style="color: #009900;">[</span><span style="color: blue;">"CODE"</span><span style="color: #009900;">]</span> <span style="color: #339933;">==</span> <span style="color: blue;">"ADDRESS"</span><span style="color: #009900;">)</span><span style="color: #009900;">{</span>
<span style="color: #000088;">$address</span> <span style="color: #339933;">=</span> <span style="color: #990000;">htmlspecialchars</span><span style="color: #009900;">(</span><span style="color: #000088;">$arProps</span><span style="color: #009900;">[</span><span style="color: blue;">"VALUE"</span><span style="color: #009900;">]</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span><span style="color: #009900;">}</span>
<span style="color: #009900;">}</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">(</span><span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">(</span><span style="color: #000088;">$arOrder</span><span style="color: #009900;">[</span><span style="color: blue;">"USER_DESCRIPTION"</span><span style="color: #009900;">]</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #009900;">{</span>
<span style="color: #000088;">$arFields</span><span style="color: #009900;">[</span><span style="color: blue;">"DESCRIPTION"</span><span style="color: #009900;">]</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$arOrder</span><span style="color: #009900;">[</span><span style="color: blue;">"USER_DESCRIPTION"</span><span style="color: #009900;">]</span><span style="color: #339933;">;</span><span style="color: #009900;">}</span>
<span style="color: #666666; font-style: italic;">//-- добавляем новые поля в массив результатов</span>
<span style="color: #000088;">$arFields</span><span style="color: #009900;">[</span><span style="color: blue;">"PHONE"</span><span style="color: #009900;">]</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$phone</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$arFields</span><span style="color: #009900;">[</span><span style="color: blue;">"ADDRESS"</span><span style="color: #009900;">]</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$address</span><span style="color: #339933;">;</span>
<span style="color: #009900;">}</span>
<span style="color: black; font-weight: bold;">?></span></pre>
<br />
2) Добавляем в почтовый шаблон <span style="font-family: Courier New, Courier, monospace;">ИМЯСАЙТА/bitrix/admin/message_admin.php</span><br />
(я добавлял в шаблон "[SALE_NEW_ORDER] Новый заказ")<br />
<blockquote class="tr_bq" style="font-family: monospace;">
<br />
Доставка по адресу: #ADDRESS#<span style="color: #009900;"><<span style="color: black; font-weight: bold;">br</span> <span style="color: #66cc66;">/</span>></span></blockquote>
<blockquote class="tr_bq" style="font-family: monospace;">
Ваш контактный телефон: #PHONE#<span style="color: #009900;"><<span style="color: black; font-weight: bold;">br</span> <span style="color: #66cc66;">/</span>></span></blockquote>
<br />
Должно получится как-то так<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-bt2wesiiOpc/W2O6RqPujSI/AAAAAAAAAfo/6G8aUPWzoSEYEk9P_KMDM7LldUJQ23zbgCLcBGAs/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="580" data-original-width="1280" height="145" src="https://4.bp.blogspot.com/-bt2wesiiOpc/W2O6RqPujSI/AAAAAAAAAfo/6G8aUPWzoSEYEk9P_KMDM7LldUJQ23zbgCLcBGAs/s320/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA.PNG" width="320" /></a></div>
<br />
<br />
3) Результат<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-O2xWGbTcIoc/W2O6uQJTeeI/AAAAAAAAAfw/EA_BAO5t9Usqu60S_LnFlLQqKpvuNHc5gCLcBGAs/s1600/%25D0%2591%25D0%25B5%25D0%25B7%25D1%258B%25D0%25BC%25D1%258F%25D0%25BD%25D0%25BD%25D1%258B%25D0%25B9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="473" data-original-width="962" height="157" src="https://3.bp.blogspot.com/-O2xWGbTcIoc/W2O6uQJTeeI/AAAAAAAAAfw/EA_BAO5t9Usqu60S_LnFlLQqKpvuNHc5gCLcBGAs/s320/%25D0%2591%25D0%25B5%25D0%25B7%25D1%258B%25D0%25BC%25D1%258F%25D0%25BD%25D0%25BD%25D1%258B%25D0%25B9.png" width="320" /></a></div>
<br />Arxonthttp://www.blogger.com/profile/13966745049986873569noreply@blogger.com3tag:blogger.com,1999:blog-451949233515226127.post-21396390513176328162018-06-10T12:36:00.002+09:002018-06-10T12:37:46.477+09:00Разбиение файла импорта 1С на сайт на части<b>Вводная: </b>Есть хостинг, есть сайт у сайта есть импорт товаров из 1С. Из 1С УТ файлы выгружаются, через стандартный механизм обмена с web-сайтом.<br />
Но скрипту импорта периодически не хватает памяти, чтобы загрузить всё. И падает с ошибкой. Было решено "разбивать" файлы на части по 1000 товаров. И загружать последовательно.<br />
<br />
<b>Решение:
</b><!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"> Directory.EnumerateFiles(Environment.CurrentDirectory)
.Where(file => Path.GetFileName(file).StartsWith(<span style="background-color: #fff0f0;">"output"</span>)).ToList()
.ForEach(File.Delete);
XDocument source = XDocument.Load(<span style="background-color: #fff0f0;">"import.xml"</span>);
<span style="color: #333399; font-weight: bold;">int</span> iteration = <span style="color: #6600ee; font-weight: bold;">0</span>;
<span style="color: #008800; font-weight: bold;">while</span> (iteration * <span style="color: #6600ee; font-weight: bold;">1000</span> < source.Descendants(<span style="background-color: #fff0f0;">"Товар"</span>).Count())
{
XDocument xdoc = <span style="color: #008800; font-weight: bold;">new</span> XDocument(source);
<span style="color: #333399; font-weight: bold;">var</span> allElements = xdoc.Descendants(<span style="background-color: #fff0f0;">"Товар"</span>).OrderBy(a => a.Element(<span style="background-color: #fff0f0;">"Ид"</span>)?.Value);
<span style="color: #333399; font-weight: bold;">var</span> whatToLeave = xdoc
.Descendants(<span style="background-color: #fff0f0;">"Товар"</span>)
.OrderBy(w => w.Element(<span style="background-color: #fff0f0;">"Ид"</span>)?.Value)
.Skip(<span style="color: #6600ee; font-weight: bold;">1000</span> * iteration).Take(<span style="color: #6600ee; font-weight: bold;">1000</span>);
allElements.Except(whatToLeave).ToList().ForEach(e => e.Remove());
iteration++;
xdoc.Save(<span style="background-color: #ffaaaa; color: red;">$</span><span style="background-color: #fff0f0;">"output{iteration}.xml"</span>);
}
</pre>
</div>
Arxonthttp://www.blogger.com/profile/13966745049986873569noreply@blogger.com0tag:blogger.com,1999:blog-451949233515226127.post-17068780234872030132018-01-17T23:27:00.000+09:002018-01-17T23:27:27.223+09:00Принтер HP P1102W не печатает через RDPВводная: Есть терминальный сервер - Windows 2008 R2 64 bit, стандартная редакция. И клиент - Windows 7 Pro, 32 бита. На клиенте установлен принтер HP P1102W. При подключении через RDP, принтер отказывается работать. Пробрасывается, но не печатает. На самом клиенте проблем с печатью нет.<br />
<br />
Решение:<br />
<br />
<ol>
<li>Закрыть сеанс (именно выход из системы) и открыть заново - <b>не помогло</b></li>
<li>Перезагрузить клиент и сервер - <b>не помогло</b></li>
<li>Проверил корректность драйверов и ОДИНАКОВОСТЬ версии на клиенте и на сервере. Самое простое - и там, и там удаляем и ставим заново. Для сервера ставим и 32 битную версию, и 64 - <b>не помогло</b></li>
<li>Устанавливаем политику - запускаем <span style="font-family: Courier New, Courier, monospace;">gpedit.msc</span> и по пути <span style="font-family: Courier New, Courier, monospace;">Computer Configuration -> Administrative templates -Windows Components -> Remote Desktop Services > Remote Desktop Session Host -> Printer Redirection</span> отключаем опцию <span style="font-family: Courier New, Courier, monospace;">"Use Terminal Services Easy Print Driver First"</span> - <b>не помогло</b> (но было странно, ОПЦИЯ НЕ ДЕЙСТВОВАЛА - в свойствах принтера всё равно оставался Easy Print Driver)</li>
<li>Добавил ключ реестра <span style="font-family: Courier New, Courier, monospace;">UseUniversalPrinterDriverFirst</span> по пути <span style="font-family: Courier New, Courier, monospace;">HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services</span> тип REG_DWORD, создал его и установил в значение "4" ("3" - включен) - <b>помогло </b>и всё заработало.</li>
</ol>
<br />
<br />
PS: Ещё в интернетах встречал совет поменять драйвера на XPS, но на них очень сильно начинала тормозить клиентская 1С в RDP сеансе. Но вам может быть поможет.<br />
<br />
PS2: После каждого шага перезагружался.Arxonthttp://www.blogger.com/profile/13966745049986873569noreply@blogger.com0tag:blogger.com,1999:blog-451949233515226127.post-58262718452639860542018-01-16T21:03:00.000+09:002018-01-16T21:03:43.973+09:00Ежедневная смена пароля на роутере Mikrotik на пароль построенный по дате<b>Вводная:</b> "Иван, у меня есть тривиальная задача для микротик. Мне нужно ежедневно в 12 часов ночи менять пароль на вай-фае на текущую дату без точек (16012017 например вот так). Я так думаю, что можно решить скриптом, но не знаю, честно говоря, с какой стороны к этой проблеме подойти"<br />
<br />
<b>Решение:</b> Идею взял на <a href="http://kvas.livejournal.com/679174.html">http://kvas.livejournal.com/679174.html</a><br />
<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">:local wifiProfile wifiMyProfile</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">:local dateNow [/system clock get date];</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">:local dateNowDay [:pick $dateNow 4 6]</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">:local dateNowMonth [:pick $dateNow 0 3]</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">:local dateNowYear [:pick $dateNow 7 11]</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">:local months ("jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec");</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">:set dateNowMonth ([:find $months $dateNowMonth -1 ] + 1)</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">:if ( $dateNowMonth < 10 ) do={</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">:set $dateNowMonth ("0"."$dateNowMonth");</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">};</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">:log info message="==== NOW DATE: day: $dateNowDay month: $dateNowMonth year: $dateNowYear"</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">:local newPassword ("$dateNowDay" . "$dateNowMonth" . "$dateNowYear");</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">:log info message="==== NEW PASSWORD: $newPassword"</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">/interface wireless security-profiles set [find name=$wifiProfile] wpa2-pre-shared-key=$newPassword</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span>
<br />
Всё это добавляется в System-Script и вызывается в 0:05 через шедулер.Arxonthttp://www.blogger.com/profile/13966745049986873569noreply@blogger.com0tag:blogger.com,1999:blog-451949233515226127.post-52397940592952618132018-01-15T15:05:00.000+09:002018-01-15T15:07:53.388+09:00Удаление папок по времени<b>Вводная: </b>Делаю для себя небольшую систему резервного копирования. Задача - удалять старые папки-даты при добавлении новых. По алгоритму - оставляем только 15 последних папок, остальные удаляем.<br />
<br />
<b>Решение: </b>На вход подаётся List класса BackupDirectoryInfo. Просто DirectoryInfo не используется, так как в качестве хранилища бэкапа используются и файловые ресурсы, и облачные хранилища. Если требуется использовать только папки на физическом диске, то можно обойтись одним DirectoryInfo.<br />
<br />
<pre style="background-color: white; margin: 0em; overflow: auto;"><code style="color: black; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt;"><span style="color: blue;">public</span> <span style="color: blue;">abstract</span> <span style="color: blue;">class</span> BackupDirectoryInfo
{
<span style="color: blue;">public</span> <span style="color: blue;">string</span> Name;
<span style="color: blue;">public</span> <span style="color: blue;">string</span> Path;
<span style="color: blue;">public</span> DateTime CreatedTime;
<span style="color: blue;">public</span> <span style="color: blue;">abstract</span> <span style="color: blue;">void</span> Delete();
}
</code></pre>
<pre style="background-color: white; margin: 0em; overflow: auto;"><code style="color: black; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt;"><span style="color: blue;">private</span> <span style="color: blue;">void</span> DeleteOldFolder(List<BackupDirectoryInfo> dirs )
{
<span style="color: blue;">var</span> orderedList = dirs.OrderByDescending(x => x.CreatedTime)
.Take(15);
<span style="color: blue;">var</span> dirToDelete = dirs.Except(orderedList).ToList();
dirToDelete.ForEach(x => x.Delete() );
}</code></pre>
Arxonthttp://www.blogger.com/profile/13966745049986873569noreply@blogger.com0tag:blogger.com,1999:blog-451949233515226127.post-71615740090022445542017-12-30T11:36:00.000+09:002017-12-30T11:36:24.887+09:00Заполнить базу в MS SQL тестовыми данными<b>Вводная: </b>сабж.<br />
<br />
<b>Решение:</b><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">USE [<b>testBackup</b>]</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">GO</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">DECLARE @count INT </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">SET @count = 1</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">WHILE @count <= 100000</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">BEGIN</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">INSERT INTO [dbo].[<b>Table_1</b>]</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> SELECT </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) [<b>Test</b>]</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> SET @count += 1</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">END</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">GO</span><br />
<br />
Ну и удаление<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">USE [<b>testBackup</b>];</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">GO</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">DELETE FROM [dbo].[<b>Table_1</b>];</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">GO</span>Arxonthttp://www.blogger.com/profile/13966745049986873569noreply@blogger.com0tag:blogger.com,1999:blog-451949233515226127.post-18523099571305511832017-12-19T14:43:00.001+09:002017-12-19T14:43:41.846+09:00C# - отправить монитор в сон<b>Вводная:</b> Есть телевизор, он используется исключительно как монитор и подключен к компьютеру. Настроено автовыключение при пропадании сигнала и соответственно включение при его появлении. Но есть несколько моментов:<br />
1) Если выключаешь не с пульта, а с кнопки на телевизоре, то при появлении сигнала сам не включается - надо обязательно опять её нажать вручную.<br />
2) На компьютере настроен таймаут 15 минут - его менять не хотелось. А иногда ждать эти пятнадцать минут не хочется. А вставать за пультом, также не хочется. (к примеру когда вечером ложимся спать) - ну и пульт получается только для включения-выключения.<br />
3) Компьютер не выключается никогда.<br />
<b><br /></b>
<b>Решение:</b> Была написана небольшая программа на C#, которая при запуске просто отправляет монитор в сон. Код -<br />
<br />
<pre class="csharp" style="font-family: monospace;"> <span style="color: #6666cc; font-weight: bold;">class</span> Program
<span style="color: green;">{</span>
<span style="color: green;">[</span>DllImport<span style="color: green;">(</span><span style="color: #666666;">"user32.dll"</span><span style="color: green;">)</span><span style="color: green;">]</span>
<span style="color: #0600ff; font-weight: bold;">static</span> <span style="color: #0600ff; font-weight: bold;">extern</span> IntPtr SendMessage<span style="color: green;">(</span>IntPtr hWnd,
<span style="color: #6666cc; font-weight: bold;">int</span> msg,
IntPtr wParam,
IntPtr lParam<span style="color: green;">)</span><span style="color: green;">;</span>
<span style="color: #0600ff; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> Main<span style="color: green;">(</span><span style="color: green;">)</span>
<span style="color: green;">{</span>
<span style="color: #0600ff; font-weight: bold;">var</span> hwndBroadcast <span style="color: green;">=</span> <span style="color: green;">(</span>IntPtr<span style="color: green;">)</span>0xFFFF<span style="color: green;">;</span>
<span style="color: #0600ff; font-weight: bold;">var</span> scMonitorpower <span style="color: green;">=</span> <span style="color: green;">(</span>IntPtr<span style="color: green;">)</span>0xF170<span style="color: green;">;</span>
<span style="color: #0600ff; font-weight: bold;">var</span> wmSyscommand <span style="color: green;">=</span> 0x0112<span style="color: green;">;</span>
SendMessage<span style="color: green;">(</span>hwndBroadcast, wmSyscommand, scMonitorpower, <span style="color: green;">(</span>IntPtr<span style="color: green;">)</span><span style="color: red;">2</span><span style="color: green;">)</span><span style="color: green;">;</span>
<span style="color: green;">}</span>
<span style="color: green;">}</span></pre>
<br />
Несколько примечаний -<br />
1) Проект консольный, но "Output type" windows application - по этому никаких окон не появляется при запуске<br />
2) Админских прав не требует<br />
3) Никаких дополнительных библиотек не требует<br />
<br />Arxonthttp://www.blogger.com/profile/13966745049986873569noreply@blogger.com0tag:blogger.com,1999:blog-451949233515226127.post-26844054115586380092017-06-19T15:59:00.004+09:002017-06-19T15:59:53.397+09:00Настройки IPTV для роутеров Mikrotik в сети TTKКак настроить IPTV в ТТК.<br />
<br />
1. ОЧЕНЬ рекомендую в случае использования IPTV подключать его проводом. Иначе эфир у вас будет мягко говоря засран. Далее рассматривается схема с двумя бриджами - bridgeEthernet и bridgeWifi (конечно можно и не создавать бриджи, а оперировать сразу интерфейсами, к примеру ether2 (остальные будует подключены по master-slave) и просто wlan1), но лучше рассматривать бридж, так как есть и 2011, и мультидиапозонные роутеры (где WiFi 2.4+5). У нас будет bridgeEthernet, так как телевизор подключен проводом.<br />
<br />
2. Устанавливаем пакет multicast.<br />
<br />
3.<br />
<span style="font-family: Courier New, Courier, monospace;">/routing igmp-proxy interface</span><br />
<span style="font-family: Courier New, Courier, monospace;">add interface=bridgeEthernet</span><br />
<span style="font-family: Courier New, Courier, monospace;">add alternative-subnets=0.0.0.0/0 interface=ether1 upstream=yes</span><br />
<br />
В качестве апстрима выбираем физический интерфес в который у нас приходит провод от провайдера -<br />
есть два важных момента -<br />
<b>а) НИ В КОЕМ СЛУЧАЕ НЕ ПППОЕ! </b><br />
<b>б) ДОЛЖЕН БЫТЬ ОБЯЗАТЕЛЬНО НАЗНАЧЕН ЛЮБОЙ СТАТИЧЕСКИЙ АЙПИШНИК!!!</b><br />
<br />
В качестве локального интерфейса выбираем нужный нам интерфейс в локальной сети. Здесь также есть нюанс - <b>ОБЯЗАТЕЛЬНО НА ЭТОМ ИНТЕРФЕЙСЕ ДОЛЖЕН БЫТЬ НАЗНАЧЕН АЙПИШНИК!!!</b><br />
<br />
То есть на обоих интерфейсах должны быть айпишники из домашних диапазонов (Из разных).<br />
<span style="font-family: Courier New, Courier, monospace;">/ip address</span><br />
<span style="font-family: Courier New, Courier, monospace;">add address=192.168.123.1/24 interface=bridgeEthernet network=192.168.123.0</span><br />
<span style="font-family: Courier New, Courier, monospace;">add address=192.168.10.10/24 interface=ether1 network=192.168.10.0</span><br />
<br />
Если IPTV нужен через WiFi - ОБЯЗАТЕЛЬНО включите MulticastHelper. Но старайтесь чтобы не потребовалось.<br />
<br />
Также надо настроить параметры IGMP Proxy<br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;">/routing igmp-proxy</span><br />
<span style="font-family: Courier New, Courier, monospace;">set query-interval=1m5s query-response-interval=5s quick-leave=yes</span><br />
<br />
Всё. Можете проверять работу IPTV.Arxonthttp://www.blogger.com/profile/13966745049986873569noreply@blogger.com0tag:blogger.com,1999:blog-451949233515226127.post-654345509475278112017-01-14T17:18:00.001+09:002017-01-14T17:18:50.035+09:00"Колхозное" крепление Mikrotik SXTИногда нужно срочно устанавливать точку доступа Mikrotik SXT, причём не на мачту, а на стену. Но нормального крепления ( <a href="https://routerboard.com/QM">https://routerboard.com/QM</a> ) нет. Да и вообще никаких креплений, кроме стандартного, нет. А магазины где можно купить что-либо для микротика далеко.<br />
<br />
В таком случае может помочь использование такой штуки как "ответная часть петли". Стоит рублей 50. Отверстия для крепления есть. Нагрузку в виде антенны точно выдержит :) Продаётся в разных хозяйственных и строительных магазинах.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-_9doSujeKKk/WHnemrCQDSI/AAAAAAAAAek/Jld2aF9joPAE7sVcy8oNqWkAVAgFRXgjACLcB/s1600/WP_20170114_17_06_54_Pro.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://2.bp.blogspot.com/-_9doSujeKKk/WHnemrCQDSI/AAAAAAAAAek/Jld2aF9joPAE7sVcy8oNqWkAVAgFRXgjACLcB/s400/WP_20170114_17_06_54_Pro.jpg" width="400" /></a></div>
<br />Arxonthttp://www.blogger.com/profile/13966745049986873569noreply@blogger.com0tag:blogger.com,1999:blog-451949233515226127.post-65456975324378879232016-12-01T16:38:00.001+09:002016-12-01T16:38:30.726+09:00Тестовая задача C# - создание самораспаковывающегося архиваРеализовать программу, которая создаёт самораспаковывающийся архив.<br />
<br />
<ol>
<li>Тип результирующего файла - exe.</li>
<li>Одного файла должно быть достаточно, чтобы передать его для извлечения в другом месте.</li>
<li>При старте спрашивает папку в которую распаковать.</li>
<li>Сжатие любое, но должно присутствовать.</li>
<li>Программа должна уметь создавать архив из произвольного количества папок и файлов, произвольного типа.</li>
</ol>
<br />
Сторонние библиотеки использовать нелья, только Net.Framework (любая версия на ваш выбор).<br />
<div>
<br /></div>
<br />Arxonthttp://www.blogger.com/profile/13966745049986873569noreply@blogger.com0tag:blogger.com,1999:blog-451949233515226127.post-46061117072197462762016-10-28T14:01:00.001+09:002016-10-28T14:01:52.331+09:00Функционал tool snmp-[get|walk] в новых версиях MikrotikВ последнем релиз кандидате 6.38rc19 появилась интересная функция -<br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">snmp - added basic get and walk functionality "/tool snmp-[get|walk]";</span><br />
<br />
Теперь можно получить информацию о другом устройстве через snmp. Что открывает некоторые интересные возможности (можно сделать небольшой мониторинг на основе микротика).<br />
<br />
Для примера узнать занятую память на другом микротике (с адресом 192.168.0.1 и включенным SNMP без авторизации), можно простым запросом -<br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">tool snmp-get address=192.168.0.1 oid=.1.3.6.1.2.1.25.2.3.1.6.65536</span><br />
<br />
С помощью запроса<br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">tool snmp-walk 192.168.0.1</span><br />
Мы можем получить все значения всех OID которые есть в устройстве (лучше так не делать, а выводить только нужные ИМХО)<br />
<br />
Какие плюсы -<br />
<br />
<ul>
<li>мы не ограничены ПРОИЗВОДИТЕЛЕМ, можем получать информацию и от систем Windows, Linux, Cisco и всех прочих гд реализовано SNMP.</li>
</ul>
<br />
<br />
Какие минусы -<br />
<br />
<ul>
<li>я пока не понял, как положить значение в какую-нибудь переменную. Операторы put, get, set, find и прочие не работают (или я не понял как из завести, если кто знает поправьте - добавлю в описание). <span style="font-size: x-small;"><i>Как костыль записывать вывод в файл и его парсить</i></span></li>
<li>Нет реализации snmp-set, как я надеюсь пока. Потому что лично у меня есть оборудование которое его использует. </li>
</ul>
Arxonthttp://www.blogger.com/profile/13966745049986873569noreply@blogger.com0tag:blogger.com,1999:blog-451949233515226127.post-55305234448358241552016-10-06T11:50:00.000+09:002016-10-06T11:50:45.188+09:00Mikrotik: как посмотреть кто из пользователей забивает канал и как ограничить ему скорость?Увидел вопрос-ответ на <a href="http://spw.ru/support/voprosotvet/podklyuchenie/vopros5/">http://spw.ru/support/voprosotvet/podklyuchenie/vopros5/</a><br />
<i>"Mikrotik 1100AH как посмотреть кто из пользователей забивает канал и как ограничить ему скорость?"</i> и решил поделится немного другим способом.<br />
<br />
На мой взгляд, приведённый в ответе способ через Tools-Torch не очень наглядно показывает скорость, так как там идёт разбивка по IP адресам.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-ncBwpwOXZ7I/V_W7JMKldSI/AAAAAAAAAeE/JIywYkSEB0c3EeiV3ydwHt2bZae_T_4rQCLcB/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="341" src="https://4.bp.blogspot.com/-ncBwpwOXZ7I/V_W7JMKldSI/AAAAAAAAAeE/JIywYkSEB0c3EeiV3ydwHt2bZae_T_4rQCLcB/s400/1.png" width="400" /></a></div>
<br />
Так что иногда может помочь определение "качальщика" через Simple Queue.<br />
Создаём для пользователей нашей сети следующие правила -<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">/queue simple</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">add max-limit=1G/1G name=X220 target=192.168.0.100/32</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">add max-limit=1G/1G name=MainComp target=192.168.0.200/32</span><br />
<br />
Далее создаём правило ограничивающее скорость для всех кто не указан в перечислении выше:<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">/queue simple</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">add max-limit=2M/2M name="All Other" target=192.168.0.0/24</span><br />
<br />
Теперь чтобы увидеть кто и с какой скоростью качает можно просто смотреть в окно Queue. Причём в достаточно человекопонятном виде.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-u5zlCRgOKLE/V_W7JPUsE7I/AAAAAAAAAeI/3FyABelHCIIWe5s2iEf0ZbRQITv3WMQnQCEw/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="242" src="https://4.bp.blogspot.com/-u5zlCRgOKLE/V_W7JPUsE7I/AAAAAAAAAeI/3FyABelHCIIWe5s2iEf0ZbRQITv3WMQnQCEw/s400/2.png" width="400" /></a></div>
<br />
Также из плюсов можно отметить, что можно смотреть (и ограничивать) скорость не только по IP адресам, но и по подсетям (а там можно разбить к примеру по кабинетам, подразделениям или как вам удобно).<br />
<br />
И можно сразу же, ограничить пользователя который увлёкся :)<br />
<br />
PS: Не забывайте, что Queue даёт нагрузку на процессор. Так что проверяйте можно или нет это использовать в вашем случае.<br />
<div>
<br /></div>
Arxonthttp://www.blogger.com/profile/13966745049986873569noreply@blogger.com2tag:blogger.com,1999:blog-451949233515226127.post-87704728292659121292016-09-19T12:49:00.000+09:002016-09-19T12:49:29.460+09:00Как на mikrotik cделать фильтрацию трафика с 22:00 до 10:00<b>Вопрос:</b> Как на mikrotik одним правилом сделать фильтрацию трафика с 22:00 до 10:00? На cisco без проблем. Здесь же говорит "couldn"t add new firewall rule - start time bigger than end time". Если ставить 20:00:00 и 1d 10:00:00 то говорит "Error interval". Mikrotik так не умеет или я что-то делаю не так?<br />
<br />
<b>Ответ:</b> Одним правилом сделать это нельзя - mikrotik не воспринимает такие диапозоны, но есть варианты<br />
<br />
<span style="font-size: x-small;"><i>(далее блокируется пинг до Google DNS 8.8.8.8, не забудьте удалить после тестов)</i></span><br />
<br />
<b>0)</b> Стандартный способ - использовать два правила с временными промежутками 22:00:00-23:59:59 и 00:00:00-10:00:00<br />
<br />
<b>1)</b> Использовать через запрет - Где-то в конце есть правило, которое запрещает, а конкретным правилом разрешать.<br />
<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">/ip firewall filter</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">add chain=forward dst-address=8.8.8.8 protocol=icmp src-address=192.168.0.0/16 time=10h-22h,sun,mon,tue,wed,thu,fri,sat</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">add action=reject chain=forward protocol=icmp src-address=192.168.0.0/16</span><br />
<br />
<b>2)</b> Использовать шедулер -<br />
также создаём правило в файрволе, но не указываем конкретное время -<br />
<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">/ip firewall filter</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">add action=reject chain=forward dst-address=8.8.8.8 protocol=icmp src-address=192.168.0.0/16</span><br />
<br />
Далее получаем номер правила с помощью<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">ip firewall filter print</span><br />
<br />
И теперь создаём два правила шедулера -<br />
<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">/system scheduler</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">add interval=1d name=schedule1 on-event="ip firewall filter disable 1\r\</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> \n" policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive start-date=sep/19/2016 start-time=10:00:00</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">add interval=1d name=schedule2 on-event="ip firewall filter enable 1\r\</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> \n" policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive start-date=sep/19/2016 start-time=22:00:00</span><br />
<br />
Это даёт нам несколько преимуществ -<br />
<br />
<ol>
<li>Мы не привязаны только к правилам файрвола и можем работать с чем угодно - интерфейсы, пользователи и може делать всё что нам захочется.</li>
<li>Если правил для фильтрации много, то в случае изменения временного промежутка нам надо поменять в ОДНОМ месте, иначе пришлось бы менять во всех где используется временной фильтр.</li>
<li>В случае если надо выключить (или включить) фильтрацию, то можно запустить один скрипт который это всё сделает, а не менять время на интерфейсах (или на самом роутере)</li>
<li>Более гибкая работа со временем. Можно сделать несколько разных фильтраций с разными правилами и фильтрациями.</li>
</ol>
<br />
<br />
<b>3)</b> Немного "костыльный" способ - через изменение текущего часового пояса - то есть если у нас Московкий часовой пояс +3, то выбираем -7, и теперь надо указывать промежуток - от 12:00:00, до 23:59:59<br />
<br />
PS: Надо не забывать обязательно настраивать синхронизацию по времени в случае работы с учётом времени.Arxonthttp://www.blogger.com/profile/13966745049986873569noreply@blogger.com0tag:blogger.com,1999:blog-451949233515226127.post-23389711923003078962016-08-12T14:24:00.002+09:002016-08-12T14:24:32.605+09:00Небольшой хинт который поможет сберечь время и нервы.<b>Вводная:</b> Есть роутер Mikrotik и хороший-стабильный провайдер. Проблема оказалось в том, что долгое время интернет не пропадал от слова вообще. И мы просто забыли телефон технической поддержки! И когда случилась проблема время реакции сильно больше запланированных. Пришлось вначале звонить в справочную, узнавать номер провайдера, где дали общий номер телефона, на котором уже дали телефон техподдержки. Чтобы уменьшить влияние такой проблемы можно сделать следующий "хинт"<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-Ixy5pq3Jf8o/V61da2zJHSI/AAAAAAAAAds/HTIhLRkif043N0u9mdIHC1ezp_QGmUHUgCLcB/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="349" src="https://4.bp.blogspot.com/-Ixy5pq3Jf8o/V61da2zJHSI/AAAAAAAAAds/HTIhLRkif043N0u9mdIHC1ezp_QGmUHUgCLcB/s400/1.png" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-WTDT5nHc1D4/V61db0GisgI/AAAAAAAAAdw/KMov_USjJboxge8R3XzjQcz4caF1fv4kgCLcB/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="306" src="https://4.bp.blogspot.com/-WTDT5nHc1D4/V61db0GisgI/AAAAAAAAAdw/KMov_USjJboxge8R3XzjQcz4caF1fv4kgCLcB/s400/2.png" width="400" /></a></div>
<br />
PS: Также можно указать на кого зарегистрированно, номер договора, адрес и другие данные, которые могут уточнить<br />
<br />
PS2: Это не отменяет, что желательно иметь номер техподдержки записанным в телефоне.Arxonthttp://www.blogger.com/profile/13966745049986873569noreply@blogger.com0