Windows
Обёртки над текстовыми командами в PowerShell
2Хотел поделиться опытом создания простой объектно-ориентированной обёртки над обыкновенной консольной утилитой для облегчения работы с ней. Для примера была выбрана pnputil для работы с хранилищем дистрибутивов драйверов в Windows. (далее…)
Работа с японским IME в Windows
0Горячие клавиши
В справке я полного списка не нашёл, да и в окне конфигурации размером со спичечный коробок смотреть неудобно. Поэтому делаю полный список всех горячих клавиш как он есть, без изменений (делался на основе конфигурации IME из Windows 7).
Также, настоятельно рекомендую попробовать Google Japanese IME (в Windows по-умолчанию будут использоваться всё те же горячие клавиши стандартного IME). Плюс — динамическая подсказка прямо во время ввода. Плюс — чуть меньше багов со шрифтами при вводе в Word. Но есть функциональные ограничения: только ввод с клавиатуры (нет рукописного ввода и поиска по ключам и количеству чёрт).
Таблица получилась довольно широкой, поэтому рекомендуется использовать максимальную ширину просмотра (переключается всплывающей кнопочкой в правом верхнем углу страницы).
Итак, список:
| Key | No input / Converted strings | Only Input strings | Converted | Showing Candidate List | Changing POS boundary | Char Input into Converted POS |
| SPACE | SpaceWidth | ConvAll | Extended candidate | DetThenNext | ConvPhra | ConvAll |
| Ctrl+SPACE | - | HalfSpace | HalfSpace | HalfSpace | HalfSpace | HalfSpace |
| Shift+SPACE | AltSpaceWidth | ConvAll | PrevCand | PrevCand | ConvPhra | ConvAll |
| Ctrl+Shift+SPACE | FullSpace | FullSpace | FullSpace | FullSpace | FullSpace | FullSpace |
| BackSpace | - | DelBackChar | DelBackChar | CloseCandidate | - | DelBackChar |
| Ctrl+BackSpace | UndoDet | DelBackChar | RevPhra | RevPhra | - | DelBackChar |
| Shift+BackSpace | - | DelBackChar | RevPhra | RevPhra | - | DelBackChar |
| Enter | - | DetAll | DetAll | Sel+Det | DetAll | DetAll |
| Ctrl+Enter | - | DetAll | DetAll | DetAll | DetAll | DetAll |
| Shift+Enter | - | - | - | - | - | - |
| Esc | - | ClearAll | RevPhra | CloseCandidate | RevPhra | RevAll |
| Shift+Esc | - | ClearAll | RevAll | RevAll | RevAll | RevAll |
| 半角/全角 | IME ON/OFF | - | - | - | - | - |
| 英数 | Kana/Alpha | Kana/Alpha | Kana/Alpha | Kana/Alpha | Kana/Alpha | Kana/Alpha |
| 無変換 | ToggleKana | ToggleKana | ToggleKana | ToggleKana | ToggleKana | ToggleKana |
| Shift+無変換 | ToggleAlphanumeric | Alphanumeric | Alphanumeric | Alphanumeric | Alphanumeric | Alphanumeric |
| 変換 | Reconv | ConvAll | Extended candidate | DetThenNext | ConvPhra | ConvAll |
| Ctrl+変換 | Menu | Menu | Menu | ReadCand | Menu | Menu |
| Shift+変換 | - | - | PrevCand | PrevCand | - | - |
| カタカナ | Katakana key | Katakana key | Katakana key | Katakana key | Katakana key | Katakana key |
| Shift+カタカナ | Katakana key | Katakana key | Katakana key | Katakana key | Katakana key | Katakana key |
| ひらがな | Hiragana key | Hiragana key | Hiragana key | Hiragana key | Hiragana key | Hiragana key |
| TAB | - | - | - | Change view | - | - |
| Shift+TAB | - | - | - | - | - | - |
| PageUp | - | - | - | PrevCands | - | - |
| PageDown | - | - | - | NextCands | - | - |
| End | - | EndOfChars | EndOfPhra | EndOfCand | - | - |
| Home | - | StartOfChars | StartOfPhra | StartOfCand | - | - |
| Shift+Home | - | - | - | - | - | - |
| ← | - | CharLeft | PhraCharLeft | PhraCharLeft | PhraLeft | CharLeft |
| Ctrl+← | - | StartOfChars | StartOfPhra | Goto1stPhra | - | StartOfChars |
| Shift+← | - | CharLeft | ShrinkPhra | ShrinkPhra | ShrinkPhra | CharLeft |
| ↑ | - | - | - | PrevCand | ShrinkPhra | - |
| Ctrl+↑ | - | StartOfChars | PrevCand | PrevCand | - | - |
| Shift+↑ | - | - | - | PrevCands | - | - |
| → | - | CharRight | PhraRight | PhraRight | PhraRight | CharRight |
| Ctrl+→ | - | EndOfChars | EndOfPhra | GotoLastPhra | - | EndOfChars |
| Shift+→ | - | CharRight | ExtendPhra | ExtendPhra | ExtendPhra | CharRight |
| ↓ | - | - | - | NextCand | ExtendPhra | - |
| Ctrl+↓ | - | EndOfChars | DetPhra | DetPhra | DetPhra | DetPhra |
| Shift+↓ | - | Det1stChar | Det1stPhra | NextCands | Det1stPhra | Det1stPhra |
| Delete | - | DelChar | DelChar | CloseCandidate | - | DelChar |
| Ctrl+Delete | - | - | - | Delete Word | - | - |
| Ctrl+A | - | StartOfChars | StartOfPhra | Goto1stPhra | - | StartOfChars |
| Ctrl+D | - | CharRight | PhraRight | PhraRight | PhraRight | CharRight |
| Ctrl+E | - | - | - | PrevCand | ShrinkPhra | - |
| Ctrl+F | - | EndOfChars | EndOfPhra | GotoLastPhra | - | EndOfChars |
| Ctrl+G | - | DelChar | DelChar | CloseCandidate | - | DelChar |
| Ctrl+H | - | DelBackChar | DelBackChar | CloseCandidate | - | DelBackChar |
| Ctrl+I | - | Katakana | Katakana | Katakana | Katakana | Katakana |
| Ctrl+K | - | CharLeft | ShrinkPhra | ShrinkPhra | ShrinkPhra | CharLeft |
| Ctrl+L | - | CharRight | ExtendPhra | ExtendPhra | ExtendPhra | CharRight |
| Ctrl+M | - | DetAll | DetAll | Sel+Det | DetAll | DetAll |
| Ctrl+N | - | EndOfChars | DetPhra | DetPhra | DetPhra | DetPhra |
| Ctrl+O | - | HalfWidth | HalfWidth | HalfWidth | HalfWidth | HalfWidth |
| Ctrl+P | - | FullAlphanumeric | FullAlphanumeric | FullAlphanumeric | FullAlphanumeric | FullAlphanumeric |
| Ctrl+S | - | CharLeft | PhraCharLeft | PhraCharLeft | PhraLeft | CharLeft |
| Ctrl+T | - | HalfAlphanumeric | HalfAlphanumeric | HalfAlphanumeric | HalfAlphanumeric | HalfAlphanumeric |
| Ctrl+U | - | Hiragana | Hiragana | Hiragana | Hiragana | Hiragana |
| Ctrl+X | - | - | - | NextCand | ExtendPhra | - |
| Ctrl+Y | - | RadLookup | RadLookup | RadLookup | RadLookup | RadLookup |
| Ctrl+Z | - | ClearAll | RevPhra | RevPhra | RevPhra | RevAll |
| AppsKey |
- | - | - | CandidateMenu | - | - |
| F2 | - | - | CharacterEdit | CharacterEdit | CharacterEdit | - |
| F5 | - | RadLookup | RadLookup | RadLookup | RadLookup | RadLookup |
| F6 | - | Hiragana | Hiragana | Hiragana | Hiragana | Hiragana |
| F7 | - | Katakana | Katakana | Katakana | Katakana | Katakana |
| F8 | - | HalfWidth | HalfWidth | HalfWidth | HalfWidth | HalfWidth |
| F9 | - | FullAlphanumeric | FullAlphanumeric | FullAlphanumeric | FullAlphanumeric | FullAlphanumeric |
| F10 | - | HalfAlphanumeric | HalfAlphanumeric | HalfAlphanumeric | HalfAlphanumeric | HalfAlphanumeric |
| Ctrl+F10 | Menu | - | - | - | - | - |
| Shift+F10 | - | - | - | Candidate Menu | - | - |
| F13 | Reconv | - | - | ReadCand | - | - |
| ローマ字 | Input Method | Input Method | Input Method | Input Method | Input Method | Input Method |
Если у вас всего лишь 101 кнопка
Это значит, что у вас нет таких замечательных штук как 半角/全角, 英数 (CAPS LOCK), 無変換, カタカナ/ひらがな, ローマ字 или F13. К счастью, хоть для некоторых из них есть альтернативные комбинации!
| Оригилаьная кнопка | Альтернатива |
| 英数 | Shift+CAPS LOCK или Alt+` |
| カタカナ | Alt+CAPS LOCK |
| ひらがな | Ctrl+CAPS LOCK |
Особые слова
В отличие от прямого ввода слов по буквам, IME даёт возможность интерпретации вводимых слов. Поэтому многие слова в результате дают возможность вставки специальных символов! Несколько примеров:
| Слово | Символы | Пример |
| ほし | звёздочки | ☆★※* |
| しかく | прямоугольники | ◇◆□■ |
| さんかく | треугольники | ∴△▲∵▽▼ |
| まる | кружки и круглые штуки | ○●◎〇①…⑳㊤㊥㊦㊧㊨゜ |
| ばつ | крестик | × |
| かっこ | парные скобки | 〔〕《》‘’“”『』「」【】<>≪≫〝〟 |
| やじるし/ー> | стрелки / (лево-право) | ↑↓⇔/→⇒ |
| おんぷ/シャープ/フラット | ноты / модификаторы | ♪♫♬/♯/♭ |
| ハート/こころ | сердечки | ♡❤ |
| チェック | галочки | ☑☒✔✗ |
| きごう | все возможные символы | ↑→゜ゝ㍍㌧▽◆♂ |
[EDIT 2010-07-10]: Tofugu на днях написал пост о специальных словах — How To Type (Hidden) Special Characters In Japanese. Я кое-что оттуда позаимствовал, применимое к Windows/Google IME.
[EDIT 2010-07-12]: Google Japanese IME, начиная с версии 0.12, расширил список спец. символов галочками и дополнительными нотами.
Как бонус, этот фокус работает с большинством IME

VPN и Интернет в одном флаконе
0Или, выражаясь умными словами, split tunneling.
Преамбула
Есть желание при подключении VPN в Windows использовать его только для доступа к внутренним ресурсам.
Проблемы
Проблема состоит в том, что по-умолчанию можно либо весь трафик перенаправлять через VPN-соединение (и тогда каждый раз нужно настраивать прокси-сервер, если такой вообще есть), либо лишится всякой разумной возможности работы с внутренними ресурсами (весь трафик будет перенаправляться через стандартный канал, который не имеет возможности попасть внутрь сети).
Возможное решение
Итак, хочется настроить split tunneling, чтобы для внутренних ресурсов трафик ходил через VPN и использовался внутренний DNS-сервер (чтобы можно было просто обращаться к внутренним ресурсам), а весь оставшийся трафик продолжал ходить через стандартный шлюз. Понятно, что всё это можно автоматизировать скриптами, но хочется, чтобы эти скрипты отрабатывали автоматически при подключении VPN-соединения и отменяли всё, что может помешать, после его разрыва.
Guide
Прежде чем продолжить, следует отдавать себе полный отчёт о возможных проблемах и рисках, которые несёт с собой подобная махинация. (Подробнее по ссылке из статьи Википедии).
Сейчас я буду творить волшебство, которое не является панацеей от всех проблем, но даёт представление о том, как всё можно организовать от и до. Отшлифовать все процессы под конкретную конфигурацию и собственные нужды придётся самому.
Итак, приступим:
-
Теперь хочется привязать выполнение скриптов к моменту установления подключения. Для этого воспользуемся Журналом событий Windows (это косметика, можно сразу переходить к шагу 3):
-
Созданные задания находятся чуть выше в консоли; нужно их отредактировать (или сразу создавать):
-
Планировщик заданий → Библиотека планировщика заданий → Задачи просмотра событий
-
Триггеры → При событии; журнал: Приложение; источник: RasClient; код события: 20225 (только если создаём руками)
-
Действия. Должно быть 2 штуки, оба типа “Запуск программы”:
- Программа или сценарий:
netsh; добавить аргументы:interface ipv4 add route prefix=192.168.64.0/23 interface=17 metric=200(здесь192.168.64.0/23– параметры внутренней сети;17– номер VPN подключения;200– метрика, чем меньше, тем более предпочтительна) - Программа или сценарий:
netsh; добавить аргументы:dnsclient add dnsservers 11 192.168.64.252 1(здесь11– номер основного подключения;192.168.64.252– адрес DNS-сервера во внутренней сети;1– номер в списке DNS-серверов):
- Программа или сценарий:
- Условия
- Отключить “Запускать только при питании от электросети” (опционально)
- Включить “Запускать только если подключении к следующей сети” и выбрать VPN-соединение:
-
-
Теперь подобным образом нужно добавить выполнение скриптов, отменяющих наши манипуляции со списком DNS-серверов на основном соединении (если что-то пойдёт не так, то всё будет работать, просто время разрешения имён может возрасти):
Заключение
Про IPv6 и DirectAccess мы поговорим как-нибудь в другой раз
Изображая Марка Русиновича
0Я, как и многие другие люди, предпочитаю иногда не выключать компьютер, а усыплять его или вводить в гибернацию. Сильно экономит время при включении.
И вот в субботу утром (ну, ладно, полпервого дня *^_^*) я проснулся от того, что кто-то включил компьютер. Не знаю для кого как, а для меня – это один из самых неприятных способов проснуться. Ещё сильнее я удивился, повернувшись лицом к проблеме и обнаружив, что никого рядом нет.
Хм… в проявление искусственного интеллекта я не верю, поэтому мне стало очень интересно, какого лешего мой компьютер самопроизвольно включился.
Начиная с Висты, консольная утилита powercfg.exe стала просто бесценным инструментом для диагностики большинства проблем, связанных с питанием. Итак, запускаем наш любимый PowerShell:
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.
PowerTab version 0.99 Beta 2 PowerShell TabExpansion library
/\/\o\/\/ 2007 http://thePowerShellGuy.com
PowerTab Tabexpansion additions enabled : True
PS> powercfg -lastwake
Wake History Count - 1
Wake History [0]
Wake Source Count - 1
Wake Source [0]
Type: Wake Timer
Owner: [PROCESS] \Device\HarddiskVolume1\Windows\System32\services.exe
Owner Supplied Reason: Windows will execute '\Microsoft\Windows\Media Center\mcupdate_scheduled' scheduled task that requested waking the computer.
Хмм… какого лешего ему понадобилось?
PS> $st = new-object -com('Schedule.Service')
PS> $st.Connect()
PS> $f = $st.GetFolder('\Microsoft\Windows\Media Center')
PS> $t = $f.GetTask('mcupdate_scheduled')
PS> $t.Definition.Actions
Id :
Type : 0
Path : %SystemRoot%\ehome\mcupdate
Arguments : -crl -hms -pscn 15
WorkingDirectory :
К сожалению, быстро поменять из PS настройки нельзя (нужно пересоздавать задание, хотя все свойства доступны для записи), поэтому пришлось делать всё руками через соответствующую оснастку консоли управления
.
И тут возникает вопрос: а вдруг таких подлянок несколько? А между тем, в оснастке нет поиска! Ответ, как всегда, можно найти в тандеме PowerShell + MSDN:
function Find-Wakers($path) {
Write-Host -NoNewline '.'
Write-Output $path.GetTasks(0) | where {
$_.Definition.Settings.WakeToRun
}
foreach ($p in $path.GetFolders(0)) {
Write-Output $(Find-Wakers($p))
}
}
$st = new-object -com('Schedule.Service')
$st.Connect()
$tasks = @(Find-Wakers($st.GetFolder('\')))
Write-Host
$tasks | Format-Table -Property Name,Path -AutoSize
Результат выполнения скрипта:
PS> .\Find-Wakers.ps1 ....................................................... Name Path ---- ---- StartRecording \Microsoft\Windows\Media Center\StartRecording
Первый булыжник в огород Windows 7
0И это… столь распиаренный обновлённый Windows Search 4.
Демонстрация на реальном примере, столь неприятно удивившем меня (800×600, 4 МБ):
Бонус – то же самое, но в Word 2007 SP2.
Update: индексирование текстовых файлов работает как положено, если в файле есть BOM. Но в любом случае, если честно, не очень понятно почему индексирование не работает как ожидается.
