curluneの日記

日々試行錯誤。雑多に、気ままに、てきとーに。HoloLens/Oculus Rift,Touchと戯れる日々。

findとgrepでファイル検索 ひとりぷちアドベントカレンダー2017 13日目

いつも何気なく使っているコマンドも、たまにはメモしておこうかなと。ということで検索コマンドです。

いつもの検索

だいたいこれを使っています。細かいオプションあんまり覚えていないだけともいう。

find "開始ディレクトリ" -type f -name "*.拡張子" -exec grep --color -n "検索文字" {} +

-exec

findにかかった物に対してコマンドを実行する仕組みです。

引数-execから、引数+までの間に書いた物をコマンドとして実行してくれます。 このなかの{}という文字列はfindでかかったファイル名に置換えてくれます。

先ほどのコマンドの場合は、次のようになります。

grep --color -n "検索文字" "ファイル名"

初めて見た時はどんな暗号なのかと思いましたが、分かってみると案外シンプルです。

引数の分割等細かい部分は面倒を見てくれるのでありがたいコマンドです。

grepの代わりにchmodに使う事で、ファイルだけ変更もできます。

終わりに

ねたがない。

bashのEscはショートカットが割当られているから連打でキャンセルにならないというお話 ひとりぷちアドベントカレンダー2017 12日目

bashEscはキャンセルとはかぎらないよ、というお話です。

危ない事は無いと思うけれど、Esc癖のある方は気をつけましょう。

Escはメタキーの代わり

bashでは、Esc次の入力をメタキーと押した事にする、というものになっています。

Escを押してから>を押すと、メタキーを押しながら>押した場合と同じ扱いです。 そのため、適当にEscを押してからキーを入力すると何らかのショートカットが発動する場合があるのです。

Readline の記法

このセクションでは、emacs 形式の記法を使ってキーストロークを表します。 コントロールキーは C-key で表します (例: C-n は Control-N の意味です)。同様に メタ キーは M-key で表すので、M-x は Meta-X を表すことになります。 (メタ キーがないキーボードでは、M-x は ESC x を表します。つまり、 エスケープキーを押した後に x キーを押します。これは ESC を メタプレフィックス (meta prefix) にする操作です。 M-C-x の組み合わせは、ESC-Control-x つまり、エスケープキーを押した後に、コントロールキーを押したまま x を押すことを意味します。)

Man page of BASH

メタキー周りのショートカット

手元で次のようなショートカットが割当られていました。\eEscです。

bind -p | grep '\\e'
"\e\C-g": abort
"\eOD": backward-char
"\e[D": backward-char
"\e\C-h": backward-kill-word
"\e\C-?": backward-kill-word
"\eb": backward-word
"\e<": beginning-of-history
"\eOH": beginning-of-line
"\e[H": beginning-of-line
"\ec": capitalize-word
"\e\C-]": character-search-backward
"\e\e": complete
"\e!": complete-command
"\e/": complete-filename
"\e@": complete-hostname
"\e{": complete-into-braces
"\e~": complete-username
"\e$": complete-variable
"\e[3~": delete-char
"\e\\": delete-horizontal-space
"\e-": digit-argument
"\e0": digit-argument
"\e1": digit-argument
"\e2": digit-argument
"\e3": digit-argument
"\e4": digit-argument
"\e5": digit-argument
"\e6": digit-argument
"\e7": digit-argument
"\e8": digit-argument
"\e9": digit-argument
"\eA": do-lowercase-version
"\eB": do-lowercase-version
"\eC": do-lowercase-version
"\eD": do-lowercase-version
"\eE": do-lowercase-version
"\eF": do-lowercase-version
"\eG": do-lowercase-version
"\eH": do-lowercase-version
"\eI": do-lowercase-version
"\eJ": do-lowercase-version
"\eK": do-lowercase-version
"\eL": do-lowercase-version
"\eM": do-lowercase-version
"\eN": do-lowercase-version
"\eP": do-lowercase-version
"\eQ": do-lowercase-version
"\eR": do-lowercase-version
"\eS": do-lowercase-version
"\eT": do-lowercase-version
"\eU": do-lowercase-version
"\eV": do-lowercase-version
"\eW": do-lowercase-version
"\eX": do-lowercase-version
"\eY": do-lowercase-version
"\eZ": do-lowercase-version
"\el": downcase-word
"\e\C-i": dynamic-complete-history
"\e>": end-of-history
"\eOF": end-of-line
"\e[F": end-of-line
"\eOC": forward-char
"\e[C": forward-char
"\ef": forward-word
"\eg": glob-complete-word
"\e^": history-expand-line
"\e#": insert-comment
"\e*": insert-completions
"\e.": insert-last-argument
"\e_": insert-last-argument
"\ed": kill-word
"\eOB": next-history
"\e[B": next-history
"\en": non-incremental-forward-search-history
"\ep": non-incremental-reverse-search-history
"\e=": possible-completions
"\e?": possible-completions
"\eOA": previous-history
"\e[A": previous-history
"\e\C-r": revert-line
"\er": revert-line
"\e ": set-mark
"\e\C-e": shell-expand-line
"\e&": tilde-expand
"\et": transpose-words
"\eu": upcase-word
"\e.": yank-last-arg
"\e_": yank-last-arg
"\e\C-y": yank-nth-arg
"\ey": yank-pop

終わりに

Escがキャンセル系でない、というのは若干なれない感じはあります。

けれどもコマンドラインのような、ほとんどのキーが入力用に使われる場面では、同時押し以外でショートカットが割り当てられる、というのは案外便利な物です。

AzureのApp Serviceでベーシック認証を使って簡易アクセス制限 ひとりぷちアドベントカレンダー2017 11日目

AzureのApp Serviceは、さくっとお試し環境を作るのに便利です。 お試し中に他所からアクセスされるのは宜しくないので、ベーシック認証で簡易アクセス制限を行ってみよう、というお話です。

App ServiceはWindows/Linuxを選択する事ができますが、Windowsな方についてです。

# フリープランはWindowsだけなのだもの

アクセス制限する

apacheのように設定ファイルだけ、とはいかないですが、ありがたいモジュールのおかげで簡単に実現できます。

github.com

管理ポータルのコンソールにて、次のようなコマンドを実行するだけで完了です。 このコンソール、ペーストがうまく行かない場合があります。 できない事は無いのですが、説明しにくいので頑張って入力しましょう。

f:id:curlune:20171211231912p:plain

git clone --depth=1 https://github.com/nabehiro/HttpAuthModule H
mkdir bin
cp H/P*/H* bin/
cp H/P*/W* .
rm -rf H

次のユーザ名とパスワードでアクセスできます。

user: hoge pass: hogepass

ベーシック認証とダイジェスト認証

先ほどの状態では、ベーシック認証ではなくダイジェスト認証になっています。 どちらもユーザ側としての操作は変わらないので、同じように利用できます。

両者の違いはパスワードのやり取りの方法です。ダイジェスト認証のほうがセキュアですが、たまに対応していないブラウザ(クライアント)がある?、らしいです。

設定の変更

コピーしたファイルのうち、Web.configに設定情報が入っています。

丁寧にコメントが入っているので詳細は省きます。

おわりに

IISなAzureは、apacheとは勝手が異なり多少つまづく事があります。けれどもまあ大体どうにかなるものです。

モジュール作者様に感謝。

vimのヘルプの言語を切り替えるプラグインをつくった ひとりぷちアドベントカレンダー2017 10日目

vimのヘルプにて、別の言語ではどのように書いてあるのか確認したいことがあったのでプラグインを作ってみました。

簡単そうで思いのほか苦戦してました。

完成品

github.com

ヘルプのウィンドウでコマンド:SwitchHelpLangを使用すると、別の言語のヘルプを表示します。

動作

現在表示中のhelp情報得る方法がわからなかったので、強引に実現してみました。

現在地は:tagsのテキストから正規表現で引っ張りだしています。 後は言語部分を置換えて開き直すだけ。

終わりに

現在のタグ(最後にジャンプしたタグ)ってどこかで取れそうな気もするけれど、見つかったので苦戦しました。もっときれいな方法があるかもしれない。

あとは、ドット.が改行にもマッチ?して悩んだりも。Vim scriptむつかしい。

ともあれ、初めてのプラグイン完成。ばんざーい。

検索・置き換え関系の区切りのスラッシュは別の記号も使えることがあるよというおはなし ひとりぷちアドベントカレンダー2017 09日目

たまにスラッシュ/を一生懸命エスケープしているものを見かけるので、楽な方法もあるよというお話。

# 他に書こうとしていたことが間に合わなかったのでごまかしているだけとも言う

解決策

区切りに別の記号を使う事で/エスケープが不要になります。 たとえば区切りに#をつかうと/はそのまま、#そのものはエスケープを利用して\#となります。直近で使わない記号を使うと、余計なエスケープが不要になるのです。

この仕組みは、いくつかの場面で使えるので覚えておくと便利です。

vim

2017/12/09

:s#/#-#g

説明はこちら

:h E146

'/' でパターンと置換文字列を囲む代わりに、英数字や '\', '"', '|' 以外であれば、 他の1バイト文字を使うことができる。これは検索パターンや置換文字列に '/' を含む 場合に有益である。例 :s+/+//+

php

$date = '2017/12/09';
echo preg_replace('#/#', '-', $date), PHP_EOL;

PHP: デリミタ - Manual

sed

echo '2017/12/09' | sed 's#/#-#g'
2017-12-09

など。

終わりに

地味だけどこういう仕組みはありがたいですね。 スラッシュはどこでも使われているからエスケープだらけになりやすいです。

vimのキーマップ設定にユニコードを使う ひとりぷちアドベントカレンダー2017 08日目

vimのキーマップ設定はユニコードの記述?でもいけるよ、というお話。

凡ミスにより、バックスラッシュ円記号との戦いの中でたどり着きました。

やりたかったこと

windowsvimで、円記号のキーを押したときチルダを入力する、という事が目的です。

そのときの環境は少し特殊で、キーボードにてバックスラッシュ円記号が別々にて入力できました。代わりにチルダの入力ができなかったのでキーマップでごまかしたかったのです。

ユニコードな指定方法

次のような記述で目的を果することができました。

"  c2a5 U+00A5 YEN SIGN
noremap <char-0x00A5> ~
noremap! <char-0x00A5> ~

単純に <char-0x に続けてユニコードな指定を行うというものです。 この辺りの詳細は次のヘルプで確認できます。

:help <Char>

そもそもの原因は

大本の原因は、いつのまにやらfileencoding=cp932になっていた事です。 この事に気づけなかったため今回の方法を探す事になりました。

前記の通り、バックスラッシュ円記号を別に入力する事はできます。

そのため.vimrcマッピングを設定するまでは問題ないです。 この時点ではg8によってバックスラッシュ円記号が別の文字である事が確認できます。 f:id:curlune:20171208044522p:plain

ですが、保存後に開き直すと円記号バックスラッシュに変化してしまいました。その結果、目的が果たせませんでした。円記号ではなくバックスラッシュ宛の割当になってしまうのです。

たしか印字文字以外での指定方法があったな、ということでいろいろ探した結果、今回の方法にたどりつけました。

終わりに

vimは柔軟にマッピングできるのでありがたいですね。発展を支えてくださる方々に日々感謝。

bashでメニュー補完を使う ひとりぷちアドベントカレンダー2017 07日目

CUIオンリーの場合、ファイルは目の前にあるけれど名前のせいで手を出せずに悔しい、ってことがたまにありますよね。先頭の文字が文字化けだったり、特殊文字だったりで入力できないという状況。

そんな時に活躍するのが、候補を順次入力してくれるメニュー補完(menu-complete)です。

機能自体はbashに内蔵されているのでキーを割り当てるだけで利用できます。

動作の違い

通常の補完(complete)は共通する一致箇所までを入力してくれます。

メニュー補完の場合は、候補を順次入力してくれます。 vimのデフォルト?の補完のような動作です。 ファイル数が少ない場合や、先頭文字が入力できない、という時に便利です。

元に戻す方法

変更の前に元に戻す方法です。

\C-というのは、Ctrlを押しながら、のキーです。 \C-iというのは特別な意味があってtabキーと同じ扱いです。

tabキーに通常の補完を割り当てることで、一致部分までの補完に戻ります。

bind '"\C-i": complete'

bindコマンドで遊ぶ時は、新たにbashを実行して分けておくとリセットが楽です。

補完動作を置換える

単に置換えてしまうのであればこれで行けます。

bind '"\C-i": menu-complete'

全ての候補を順次入力してくれます。

いつものように?先頭数文字を入力してから補完を開始すると、先頭一致の中で順次入力してくれます。

どちらも使えるようにする

使うたびにショートカットを上書きしても良いですが、もう少し使いやすくしてみます。

シンプルに別々のキーに割り当てる

空きキーがあるのであればこの方法。それぞれ好きなキーに割り当てる事でどちらもつかえます。

候補としては使いやすい箇所は \C-iの他に\e\e\C-xの後に好きなキーを使う、辺りです。

\eというのはEscキーで、Esc2回はtabと同じように補完が割り当てられています。

\C-x はプレフィックスとして他のキーと組み合わせて使われています。 続くキーには空きが多いので割り当てやすいです。

関数で切り替える

雑ですが関数を作るとトグルな切替もできます。

次のようなものを.bashrc辺りに保存して読み直す(. ~/.bashrc)とtoggleCompleteを実行するたびに切替できます。

_IS_MENU_COMPLETE=false
function toggleComplete()
{
    if [ "$_IS_MENU_COMPLETE" = true ]; then
        bind '"\C-i": complete'
        _IS_MENU_COMPLETE=false
    else
        _IS_MENU_COMPLETE=true
        bind '"\C-i": menu-complete'
    fi
}

ショートカットも追加する

さらに次のような割当も追加すると、Ctrl+x``tabの順の入力で切り替える事ができます。

bind -x '"\C-x\C-i": toggleComplete'

機会はないと思いますが、入力の途中でも切り替える事もできます。

終わりに

bashにもメニュー補完する機能はある、という事を知っているといつか役に立つかもしれません。

# 実際のところはvim:! 経由で対処する場合の方が多いです。けれどたまーにvimが無くて仕方なく...

Man page of BASH