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日目
bash
のEsc
はキャンセルとはかぎらないよ、というお話です。
危ない事は無いと思うけれど、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 を押すことを意味します。)
メタキー周りのショートカット
手元で次のようなショートカットが割当られていました。\e
はEsc
です。
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のように設定ファイルだけ、とはいかないですが、ありがたいモジュールのおかげで簡単に実現できます。
管理ポータルのコンソールにて、次のようなコマンドを実行するだけで完了です。 このコンソール、ペーストがうまく行かない場合があります。 できない事は無いのですが、説明しにくいので頑張って入力しましょう。
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のヘルプにて、別の言語ではどのように書いてあるのか確認したいことがあったのでプラグインを作ってみました。
簡単そうで思いのほか苦戦してました。
完成品
ヘルプのウィンドウでコマンド: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;
sed
echo '2017/12/09' | sed 's#/#-#g' 2017-12-09
など。
終わりに
地味だけどこういう仕組みはありがたいですね。 スラッシュはどこでも使われているからエスケープだらけになりやすいです。
vimのキーマップ設定にユニコードを使う ひとりぷちアドベントカレンダー2017 08日目
vimのキーマップ設定はユニコードの記述?でもいけるよ、というお話。
凡ミスにより、バックスラッシュ
と円記号
との戦いの中でたどり着きました。
やりたかったこと
windowsのvimで、円記号
のキーを押したときチルダ
を入力する、という事が目的です。
そのときの環境は少し特殊で、キーボードにてバックスラッシュ
と円記号
が別々にて入力できました。代わりにチルダ
の入力ができなかったのでキーマップでごまかしたかったのです。
ユニコードな指定方法
次のような記述で目的を果することができました。
" c2a5 U+00A5 YEN SIGN noremap <char-0x00A5> ~ noremap! <char-0x00A5> ~
単純に <char-0x
に続けてユニコードな指定を行うというものです。
この辺りの詳細は次のヘルプで確認できます。
:help <Char>
そもそもの原因は
大本の原因は、いつのまにやらfileencoding=cp932
になっていた事です。
この事に気づけなかったため今回の方法を探す事になりました。
前記の通り、バックスラッシュ
と円記号
を別に入力する事はできます。
そのため.vimrc
にマッピングを設定するまでは問題ないです。
この時点ではg8
によってバックスラッシュ
と円記号
が別の文字である事が確認できます。
ですが、保存後に開き直すと円記号
がバックスラッシュ
に変化してしまいました。その結果、目的が果たせませんでした。円記号
ではなくバックスラッシュ
宛の割当になってしまうのです。
たしか印字文字以外での指定方法があったな、ということでいろいろ探した結果、今回の方法にたどりつけました。
終わりに
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
キーで、Esc
2回は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
が無くて仕方なく...