それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

sudo で シェルのaliasされたコマンドを使えるようにするけど、環境変数を渡さない。

sudo するとコマンドnot found

あああ、、もう。

takuya@sakura:~$ sudo ll
sudo: ll: command not found

alias に頼り切ってると、こういうことが頻繁に起きる

解決策

alias sudo='sudo '

コレが解決策

間違った解決策: preserve Environment

sudo -E 

環境変数を渡してしまうと、意図通りの動作をしない可能性があったり、ミスを誘発するから絶対ダメ。(間違いとは言いすぎかもしれないが、過剰な環境変数の引き継ぎは意図しない動作を引き起こしてしまう)

このオプションは、現在の環境変数をすべて sudo 実行時に引き継ぐのでトラブルのもとになると思いう。

alias でうまくいく理由。

たぶんだけど、alias の展開が再帰的に行われるから 。

alias を使って再帰的な展開をつかってbashに解釈させるってことですね。

sudo のかわりに _sudo として考えてみる。

alias ll='ls -l'
alias _sudo='sudo '
_sudo ll

こう書いたとき、alias が展開されるとき、_sudo ll は sudo ls -l として順番にalias を展開済みにしてから プロセスが起動される。

# alias が  alias を展開して
$  _sudo ll 
   →  sudo ll  # ここで更に展開
      →  sudo ls -l
$ sudo ls -l # コレが実行される。

再帰的なalias展開を使うという、シンプルで盲点な解決策があるってことに気づかなかった私を殴りたい。

参考資料

https://wiki.archlinux.jp/index.php/Sudo#.E3.82.A8.E3.82.A4.E3.83.AA.E3.82.A2.E3.82.B9.E3.82.92.E6.B8.A1.E3.81.99

追記 2018/10/28

はてなブックマーク - tarumeのブックマーク / 2018年10月17日

よくわからない説明されてるけど、公式読むと→ http://www.gnu.org/software/bash/manual/bashref.html#Aliases >If the last character of the alias value is a blank, then the next command word following the alias is also checked for alias expansion.

再帰的に展開するっていう説明じゃよくわからないですか。すいません。書き方一部変更します。

1分で作れる誰でも作れるジョークウェア(ウイルス?)で書類送検される時代

メモ帳で出来るもので逮捕・送検される。

1分できるイタズラウイルスの作り方。

Windowsでは、次のようにかけます

  • Windows - R を同時に押します
  • notepad と書いてEnterを押します。
  • start cmd と書いて改行します。
  • Ctrl-A を押したあとに Ctrl-C を押します。
  • Ctrl-V を200回押します。
  • Ctrl-S を押します。
  • ファイル名を 知的好奇心を満たすため.bat と書いて保存します。

あとは、このファイルをダブルクリックして実行すればいい。

start cmd
start cmd
start cmd
start cmd
...(以下数万回位

割と怖い。

たったこれだけで逮捕され、書類送検され、「不正指令電磁的記録の保持」になるとか、ちょっとやばい気がします。

これはウイルスと言えるのだろうか。

実際の逮捕例。

動画投稿サイトを参考に作成したコンピューターウイルスを保管・提供したなどとして、神奈川県警サイバー犯罪対策課と港北署が、不正指令電磁的記録保管などの非行内容で、大阪、東京、山梨各都府県に住む9~11歳の男子児童3人を児童相談所に通告したことが14日、分かった。新潟県に住む県立高校2年の男子生徒(17)も同日、同容疑で書類送検した。  同課によると、児童3人を児相に通告したのは2017年12月。通告内容は、大阪府の小学3年の児童(9)は同5~6月、投稿動画を参考に作成したウイルスを保管し、ネットワーク上のサーバーに転送・掲載した、としている。都内の同4年の児童(9)と山梨県の同5年の児童(11)はそのウイルスをダウンロードした、としている。

 ウイルスを作成するなどした大阪府の児童は「悪いことだと知っていた。これまでに10人以上がダウンロードした」と話し、ダウンロードした2人も「友達を驚かせようと思った」「いたずらに使えると思った」などと動機を語っているという。

 男子生徒の書類送検容疑は同9月、投稿動画を参考に作成したウイルスをサーバー上に保管した、としている。ウイルスの作成方法を自身のブログに掲載していたといい、「閲覧数を増やして広告収入を得たかった」などと供述している。

 いずれのウイルスも、感染するとパソコン画面にウインドーが次々表示され、機能が著しく低下する。県警のサイバーパトロールで発覚した。

https://headlines.yahoo.co.jp/hl?a=20180315-00024554-kana-l14

関連記事

「強制終了して下さい」の無限ループで逮捕されるか。実験してみた - それマグで!

ウイルスの作成方法書いたら逮捕されるらしいので、この記事で私が逮捕されるか社会的な実験です。

GitHubでフォーク元の更新分のマージで最新版にする。

github は手軽にフォーク出来て便利

github で フォーク(fork)後に、フォーク元の更新の差分を、自分のフォークに取り込むための手順とやり方です。

 準備: フォークしたローカル環境(自分のレポジトリ)に移動

cd my-forked-repos

作業:フォーク元の登録

git remote add でfork 元を登録する ローカルのgit にリモートとして、フォーク元を登録します。

git add remote upstream https://github.com/元のレポジトリ.git
  • upstream の名前は、は覚えやすい名前であれば何でもいいです。一般的にupstreamが使われるようです。
  • URL は git@github.com のSSHでもHTTPSでもどちらでもいいです。取得できればオッケ。

フォーク元の更新を取得します。

git fetch upstream 

これで、upstream と名付けたレポジトリの最新コミットを、これを取ってきます。

ローカルのmasterとマージします。

自分のレポジトリのmasterと フォーク元(upsteam)の masrerをマージします。

git checkout master
git merge upstream/master

コンフリクト解決しながら必要であればコミットする

おわったら

## github に送る
git push 

コレで完了。

git の基本機能remote add を使った対応。

github の公式に紹介されてる方法は git remote add を使ったものです。

githubのフォークといえども、gitの基本機能である複数リモートを使って対応するようです。

github 側でfork したときでも、.git/config を自動生成するわけにはいかないので gitのコマンドで対応するのが限界ですね。

git のコマンドで2つ目、3つ目の同期先を指定する。

git remote add origin  $path

参考資料

GitLabでgit lfsを有効にする。

gitlabで lfs を有効にする。

git lfs でPSDとかPNGとか比較的大きなファイルを扱う。

LFSを使えるとデザインデータとかバイナリなどのgit管理が楽になる。っていうか、バイナリはコレを使わないと非効率すぎる。

155 ### Git LFS
156 #  2018-01-01 modifled to enabled by takuya 
157 gitlab_rails['lfs_enabled'] = true
158 gitlab_rails['lfs_storage_path'] = "/var/opt/gitlab-lfs"

設定を変えたら、再起動(omibus版)

sudo gitlab-ctl reconfigure

デフォルト設定

gitlabのデフォルトの設定はつぎのようになってた。

## Git LFS defaults
 gitlab_rails['lfs_enabled'] = false
 gitlab_rails['lfs_storage_path'] = "/mnt/storage/lfs-objects"

注意点

LFSはファイルの格納と差分の扱いを分割するものでありんす。

LFSを使っていると、git clone は早くなるが、リモートレポジトリの移動に難点が出てくるので、注意が必要

サーバー側は単にLFSとしてバイナリを入れてるDropBox的なものに徹しているので、リモートを移動とか移行とかするときは LFSを併せて移動する必要があるのでそこだけ留意しておかないとgit clone して remote add して push しただけだと動かなくなる可能性もある。

2018-11-15 追記

GitLab側で新規レポジトリ作成時にGithubからcloneをWebUIで行ったら、Github LFS → GitLab LFSの移行は、問題なく行えた。結構行けるかも

参考資料

https://docs.gitlab.com/ee/workflow/lfs/lfs_administration.html

sierra以降で野良アプリ(不明・匿名)のアプリケーションを実行する sudo spctl --master-disable

すべてのアプリケーションを許可する設定を復活させる

AppStore と確認済みの開発元からのアプリケーションの許可しか選べない問題。

mac で 起動できないアプリケーション(野良ビルド)を動かす。

すべてのアプリケーションを許可が出てくる。これで問題なく動かせる。 勿論、これは未署名のアプリケーションを動作させる設定なので、本当に慎重にやらなくちゃいけない。 慎重にやらない人がいたら、デフォルトオフにされて設定を消されてしまったわけですしね。

無条件に野良アプリを使えるようにする。

未確認のアプリケーション(証明書が切れてるなど)のMacのアプリを実行できるようにする。

sudo spctl --master-enable

初期状態に戻すには

sudo spctl --master-disable

もしかしたら、csrutil enable --without debug が必要かもしれない。

設定前

f:id:takuya_1st:20180905170155p:plain

設定後

f:id:takuya_1st:20180905170150p:plain

vimdiff を neovimでやるには

vim がなくて vimdiffが使えない。

vim があれば、ファイルの差分をvimdiffで表示できるよね。 git とかJSONを触ってるととっても便利。

vimdiff old new 

でも 最近 neovim なので vimが入ってない、すると vimdiffが使えない。

同じことを neovim でやるには

nvim -d old new

neovim みたいに、vimdiff コマンド単品は用意されてないようですね。

なので、常用するには

alias vimdiff='nvim -d '

こうですかね。

参考資料

https://gist.github.com/huytd/78c676a797f81eb08cdedf5400e1b6a3

mdlsコマンドで アプリケーションのCFBundleIdentifier ( bundle Identifier )の文字列を探す

BundleIdentifier の Identifier ( 識別子文字列)を取り出す。

mac のアプリケーションの識別子こと kMDItemCFBundleIdentifier を調べる。

plutil でxmlgrep して CFBundleIdentifier を調べててたけど。もっと簡単に identifier を調べて、UTI文字列を取り出す方法を見つけたので、メモっておく。

takuya@.bin$ mdls -name kMDItemCFBundleIdentifier  /Applications/Microsoft\ Remote\ Desktop.app
kMDItemCFBundleIdentifier = "com.microsoft.rdc.mac"

mdls コマンドで Appの情報を取り出す

mdls /Applications/Google\ Chrome.app

アプリケーションのPATHを引数に与えてあげればいい。

mdls 自体は、 list の ls と meta data の md の意味らしい。 ( man mdls )

その他の使い方としては、mdlsを使えばファイルのメタデータを取得できるらしい。そのうち調べたい。

takuya@.bin$ mdls
(null): no filename specified!

usage: mdls [-name attr] [-raw [-nullMarker markerString]] [-plist file] path
list the values of one or all the attributes of the specified file
  -raw:         don't print attribute names before values
  -nullMarker:  substitute this string for null attributes in raw mode
  -plist:       output attributes in XML format to file. Use - to write to stdout
                option -plist is incompatible with options -raw, -nullMarker, and -name
example:  mdls  ~/Pictures/Birthday.jpg
example:  mdls  -name Keyword ~/Pictures/Birthday.jpg

コマンドの場所

コマンドは macOSにバンドルされていて、 /usr/bin/ に存在した。

takuya@.bin$ which mdls
/usr/bin/mdls

mdls の取得例

takuya@.bin$ mdls /Applications/Microsoft\ Remote\ Desktop.app
_kMDItemDisplayNameWithExtensions  = "Microsoft Remote Desktop.app"
_kTimeMachineNewestSnapshot        = 4001-01-01 00:00:00 +0000
_kTimeMachineOldestSnapshot        = 2018-08-12 03:51:06 +0000
kMDItemAlternateNames              = (
    "Microsoft Remote Desktop.app"
)
kMDItemAppStoreCategory            = "ビジネス"
kMDItemAppStoreCategoryType        = "public.app-category.business"
kMDItemAppStoreIsAppleSigned       = 1
kMDItemCFBundleIdentifier          = "com.microsoft.rdc.mac"
kMDItemContentCreationDate         = 2017-01-12 00:21:41 +0000
kMDItemContentCreationDate_Ranking = 2017-01-12 00:00:00 +0000
kMDItemContentModificationDate     = 2017-01-18 07:54:08 +0000
kMDItemContentType                 = "com.apple.application-bundle"
kMDItemContentTypeTree             = (
    "com.apple.application-bundle",
    "com.apple.localizable-name-bundle",
    "com.apple.application-bundle",
    "public.directory",
    "public.executable",
    "com.apple.application",
    "public.item",
    "com.apple.package",
    "com.apple.bundle"
)
kMDItemDateAdded                   = 2018-08-13 06:13:02 +0000
kMDItemDateAdded_Ranking           = 2018-08-13 00:00:00 +0000
kMDItemDisplayName                 = "Microsoft Remote Desktop.app"
kMDItemExecutableArchitectures     = (
    "x86_64"
)
kMDItemFSContentChangeDate         = 2017-01-18 07:54:08 +0000
kMDItemFSCreationDate              = 2017-01-12 00:21:41 +0000
kMDItemFSCreatorCode               = ""
kMDItemFSFinderFlags               = 0
kMDItemFSHasCustomIcon             = (null)
kMDItemFSInvisible                 = 0
kMDItemFSIsExtensionHidden         = 1
kMDItemFSIsStationery              = (null)
kMDItemFSLabel                     = 0
kMDItemFSName                      = "Microsoft Remote Desktop.app"
kMDItemFSNodeCount                 = 1
kMDItemFSOwnerGroupID              = 0
kMDItemFSOwnerUserID               = 0
kMDItemFSSize                      = 39006120
kMDItemFSTypeCode                  = ""
kMDItemInterestingDate_Ranking     = 2018-08-31 00:00:00 +0000
kMDItemKind                        = "アプリケーション"
kMDItemLanguages                   = (
    empty
)
kMDItemLastUsedDate                = 2018-08-31 03:58:51 +0000
kMDItemLastUsedDate_Ranking        = 2018-08-31 00:00:00 +0000
kMDItemLogicalSize                 = 39006120
kMDItemPhysicalSize                = 15273984
kMDItemUseCount                    = 4
kMDItemUsedDates                   = (
    "2018-08-21 15:00:00 +0000",
    "2018-08-30 15:00:00 +0000"
)
kMDItemVersion                     = "8.0.27246"

以前の記事

http://takuya-1st.hatenablog.jp/entry/2017/04/23/002406

Macがスリープ時に自動ログアウトするのを防ぐ

かなり重要な設定なのでメモ

High Sierraにすると起動中のプログラムが勝手に終了してしまう。

macOSでは、すべてのプログラムを終了されてしまう。

macOS High Sierraにしてから、離席しているとすべてのプログラムを終了されてしまう。 何言ってるわからないだろ。うん。私も最初何が起きているのか理解できなかったんですね。

最初は、touchID の問題かと思ってだいぶ調べたけれど違いました。

離席して戻ると

「iTermによって終了出来ませんでした、このまま終了するにはiTermを終了して下さい」

このように、アプリの所為で終了出来ないと言われるんですね。これが原因が分からず悩んでた。

iTermや、IntelliJ や、EvernoteChromeでも起きると。なぜ起動中のアプリケーションやプログラムが勝手に終了されてしまうんだろうか。

デフォルトでスリープ時にログアウトする設定

High Sierraではスリープ時にログアウトするんですね。スリープしたらログアウトしてプログラムを終了に掛かるんですね。そしてそう言うことを想定してないプログラムが、未保存のデータがあるので、終了確認を出して来る。Appleさん的には、ログアウトしてもアプリケーションの状態を復元する仕組みがああり、それを使えって言ってるから当然の行為であるという感じなのでしょうが。個人的には非常にめんどくさい。スリープしてて欲しいのに、ログアウトされるのは堪らない。

スリープ時に自動ログアウトする設定をオフにする。

スリープに自動ログアウトする設定をオフにする。この設定も場所が分かりにくくなってる。

以前のキャプチャーがネットに転がっていて、設定項目が喪失しているようにみえるのですが、「詳細」(Advance)に存在する。*1

f:id:takuya_1st:20180901182911p:plain

ここで設定する。

ここで自動ログアウトをオフにすると、スリープしているとき復帰後に「〇〇で終了できませんでした」というメッセージに驚かされる心配がなくなる。

f:id:takuya_1st:20180901182920p:plain

touchID を便利に使うには、必須の設定。

タッチを採用したMacbookだとスリープの復帰にはTouchIDを使えるが、自動でログアウトされると割とめんどくさい、スクリーンロックだと有効にはたらくのに、ログアウトされてしまうとユーザ名をサイド入力する必要が出てくるのでタッチIDがまるで役に立たなくなってしまう。

どうして、この自動ログアウト設定をデフォルトON設定したのか、首を傾げるばかりでした。

参考資料

https://support.apple.com/ja-jp/guide/mac-help/mchlp2443/mac

https://www.macobserver.com/tips/mgg-answers/macos-sierra-disable-auto-logout/

*1:Advanceを詳細と邦訳するのもセンスがないが

ipset と iptables で 楽チンなFW管理

ipset で IPアドレス(またはネットワークアドレス)からの接続を許可する

linux のFWを使うのにアドレス条件を指定すると記述量が半端なく長くなる。

これを解消するために、ipset というコマンドがあり、IPアドレスやネットワークアドレスをグループ化して管理するコマンドがある。これについては以前も記述した。以前の記述が不明確でわかりづらいので書き直す事にした。→ 以前の記事

今回は、ローカルネットワークやローカルネットワーク内の指定ホストからの接続を許可する例を書きます。

それをipsetで書いて、ipsetの使い方を見てゆこうと思います。

iptablesとipsetでポートへのアクセスをIPアドレス(ネットワーク)単位で制御する。

ipset と iptablesを組み合わせて使うと理解しやすくメンテしやすいFWの記述ができる。

準備:インストール

実験に使っているのは、いつもRaspbianなので、apt をつかいます。

sudo apt install ipset

ipset でリストをつくります。

ipset ではネットワークアドレスやIPアドレスを、グループ化して管理するため「リスト」と呼ばれるものを作ります。

今回は、ローカルアドレスを表すリスト(my_hosts)と、ローカルネットワークを表すリスト(my_local )の2つを作ることにします。

リストの作成:ローカルアドレス

リストを作成します。hash:ip はこのリストが、IPアドレスの列挙であると明示しています

# ipset create my_hosts hash:ip

リストの削除

リストを削除するには次のようにします。

# ipset destroy my_hosts

リストに、IPアドレスを追加します。

追加するIPアドレスはローカルのLAN内にいるIPアドレスのつもりです。

# ipset add my_hosts 192.168.11.1
# ipset add my_hosts 192.168.1.1
# ipset add my_hosts 192.168.255.1

追加した結果を確認します

# ipset list my_hosts
Name: my_hosts
Type: hash:ip
Revision: 4
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 124
References: 0
Members:
192.168.1.1

リストから項目の削除

項目を指定して削除するには次のようにします。間違ったときや不要になった時に使うと良いでしょう。

# ipset del my_hosts 192.168.11.1
# ipset del my_hosts 192.168.1.1
# ipset del my_hosts 192.168.255.1

ネットワークアドレスのリストを作成

IPアドレスだけでなく、ネットワークアドレスでの範囲指定を単位としたリストを作ることが出来ます。

今度は hash:net をつかいます。先ほどは hash:ip だった。

# ipset create my_local hash:net

ネットワークアドレスのリストへの項目の登録と削除と確認。

これも先ほとど同じです。

# ipset add my_local 192.168.11.0/24
# ipset dell my_local 192.168.11.0/24
# ipset list my_local

再起動後にも設定が維持されるようにする。

ipset が再起動後にもまたロードされる様に、設定を保存する。また、再起動後にロードさせる設定をsystemd に連携させる。

設定の保存

sudo ipset save -f /etc/ipset.conf

設定のロード(リストア)

sudo ipset restore -f /etc/ipset.conf

再起動後にロードさせる systemd 設定をつくる

/etc/systemd/system/ipset.service

[Unit]
Description=ipset restore 
Before=networking.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/sbin/ipset restore -exist -f  /etc/ipset.conf

[Install]
WantedBy=network.target

どのサービスに入れるかは判断の分かれるところなので、明確な解答はないですね。 iptables やnetworn.serviceのサービス定義の ExecStartPreでも良いと思います。

また、ipset は iptablesと共に使われるので、iptablesの起動設定に含めたり、/etc/network/if-pre-up.d/に記述するのいいともおいます。

iptablesの記述にipsetを使う。

ipsetを保存とリロードが出来たら、iptablesの設定に追加していきます。

my_local からの ssh(tcp/22) 接続を許可する霊

-I INPUT -m state --state NEW -p tcp --dport 22 -m set --match-set my_local src -j ACCEPT

my_hostsからの全ての接続を許可する

-I INPUT  -m set --match-set my_hosts src -j ACCEPT

書き方のポイント

 -m set --match-set my_local src -j ACCEPT
  • -m set Ipset モジュールを指定
  • --match-set セットにマッチする条件を指定
    • my_local ipset で指定したリストを指定
    • src ここではSRCにリストを適用すると条件を指定( src / dst / src,dst のいずれか)

設定はこんな感じでかけた。

iptablesを書いたら保存とリロード

iptablesの保存とリロードは別の記事や他の人がいっぱい書いてるのでそれを参考にする。

man について

詳しい使い方はiptables-extensions(8)の中にあるので、次のマニュアルでsetの章に書いてある。

man 8  iptables-extensions

ipset については次のように書いてあった

   set
       このモジュールは ipsec(8) で定義できる IP 集合にマッチする。

       [!] --match-set setname flag[,flag]...
              where flags are the comma separated list of src and/or dst specifications and there can be no more than
              six of them. Hence the command

               iptables -A FORWARD -m set --match-set test src,dst

              will  match  packets,  for which (if the set type is ipportmap) the source address and destination port
              pair can be found in the specified set. If the set type of the specified set is single  dimension  (for
              example  ipmap),  then  the command will match packets for which the source address can be found in the
              specified set.

       --return-nomatch
              If the --return-nomatch option is specified and the set  type  supports  the  nomatch  flag,  then  the
              matching  is  reversed: a match with an element flagged with nomatch returns true, while a match with a
              plain element returns false.

       ! --update-counters
              If the --update-counters flag is negated, then the packet and byte counters of the matching element  in
              the set won't be updated. Default the packet and byte counters are updated.

       ! --update-subcounters
              If  the --update-subcounters flag is negated, then the packet and byte counters of the matching element
              in the member set of a list type of set won't be updated. Default the  packet  and  byte  counters  are
              updated.

       [!] --packets-eq value
              If the packet is matched an element in the set, match only if the packet counter of the element matches
              the given value too.

       --packets-lt value
              If the packet is matched an element in the set, match only if the packet counter of the element is less
              than the given value as well.

       --packets-gt value
              If  the  packet  is  matched  an element in the set, match only if the packet counter of the element is
              greater than the given value as well.

       [!] -bytes-eq value
              If the packet is matched an element in the set, match only if the byte counter of the  element  matches
              the given value too.

       --bytes-lt value
              If  the  packet is matched an element in the set, match only if the byte counter of the element is less
              than the given value as well.

       --bytes-gt value
              If the packet is matched an element in the set, match only if  the  byte  counter  of  the  element  is
              greater than the given value as well.

       The  packet  and  byte counters related options and flags are ignored when the set was defined without counter
       support.

       The option --match-set can be replaced by --set if that does not clash with an option of other extensions.

       Use of -m set requires that ipset kernel support is provided, which, for standard kernels, is the  case  since
       Linux 2.6.39.

hash:net hash:ip 以外に何があるの?

ipset help 

パッと見た感じ、 net :ネットワークアドレス(範囲)や port ( ポート)や mac アドレスなども含められるようですね。

Supported set types:
    hash:mac        0   Initial revision
    hash:ip,mac     0   Initial revision
    hash:net,iface  6   skbinfo support
    hash:net,iface  0   Initial revision
    hash:net,port   7   skbinfo support
    hash:net,port,net   2   skbinfo support

iptableを書くとしんどい

iptablesをガチがきしてくのは、もちろんちゃんとやるときは意識して記述もしているしテストも実施している。 しかし、ぱぱっと記述を終えるには長すぎることあり、結局いつもコピペしている。

コピペだといつまでも成長しないので、できる限り、都度都度記述していくように切り替えて、記述に親しんでいきたい。

iptables関連のスクリプトはほんとみんな秘伝のタレになってるので、ちょっとそのままコピペで使うのはこわい。

そのまま実行するとIPアドレスが大量に列挙されて行数がとんでもないことになる。本当に辛い。

アドレス(と範囲)を列挙するなら ipsetつかったほうが楽。

今後拡大するネットワークと ipv6を控えて 秘伝のタレで運用するのは限界もありそうだよね。

まぁ、あれだnftablesに移行しろって事で。

arch見てたらこんな記述が

nftables は既存の iptables(ip-,ip6-)を置き換える netfilter のプロジェクトです。 カーネル 3.13 から nftables を使うことができます

nftables - ArchWiki

関連資料

ssh をiptablesで国内限定にする(日本国外のIPから規制する) - それマグで!

再起動時にipsetをリストアさせる方法: ままれのblog

https://github.com/BroHui/systemd-ipset-service

jid / json のjq的なクエリをインタラクティブに試せるツール

jid が便利そうなので使ってみた

jid-github

インストール

brew install jid

使ってみる

jid は json を食わせて、その結果から必要なものを絞り込んで調べることができる

試しに使ってみる。

echo '{"info":{"date":"2016-10-23","version":1.0},\
"users":[{"name":"simeji","uri":"https://github.com/simeji","id":1},\
{"name":"simeji2","uri":"https://example.com/simeji","id":2},\
{"name":"simeji3","uri":"https://example.com/simeji3","id":3}],"userCount":3}}' \
| jid

TAB で補完

TABキーを使うと候補が絞り込めて楽チン。

f:id:takuya_1st:20180819030947p:plain

検索だけなら jq より便利かも

jq は検索だけでなく、結合や計算や書き換えといった機能が豊富で、高機能すぎるので、どうしても複雑なところがあって直感的じゃない。

なので、このjidだと絞り込みはすごく楽だった。特定の配列をみたい時にはjid を使う方が早い

毎回ゼロからクエリ書くと面倒なので

cat test.json | jid '.info'

このように最初から引数値を与えることで、検索ができるようになっていて素晴らしい。

jq ように出力する

作ったクエリをjq として出したい時は

cat test.json | jid -q '.users'

のように作っておけば、jq に再利用が可能なクエリ文字列が出てきて便利だな。

キーボードの使い方

key description
TAB / CTRL + I Show available items and choice them
Enter 終了
CTRL + W Delete from the cursor to the start of the word
CTRL + U Delete whole query
CTRL + F / Right Arrow (:arrow_right:) Move cursor a character to the right
CTRL + B / Left Arrow (:arrow_left:) Move cursor a character to the left
CTRL + A To the first character of the 'Filter'
CTRL + E To the end of the 'Filter'
CTRL + J Scroll json buffer 1 line downwards
CTRL + K Scroll json buffer 1 line upwards
CTRL + G Scroll json buffer to bottom
CTRL + T Scroll json buffer to top
CTRL + L Change view mode whole json or keys (only object)
ESC Hide a candidate box

個人的には

個人的には、巨大なJSONファイルって読みにくいしメンテしにくいだけだから嫌いなんだけどなぜかみんな使うし、付き合うのは仕方ないよね。

参考資料

https://www.softantenna.com/wp/review/jid/

Cockpitでリモートからブラウザ経由でUbuntu /Debian GNU LinuxをWEBから管理する

cockpit を試してみて良かったのでめも

Cockpit は、Debian/Ubuntuなどで利用できる管理ツールで、Webブラウザから操作ができる。

ターミナルが使えたり

ブラウザからターミナルが使えたり

f:id:takuya_1st:20180818193339p:plain

daemon プロセスを再起動できたり

ブラウザからsystemd のプロセスを再起動できたり、

f:id:takuya_1st:20180818193420p:plain

モニタリング。

ディスクの使用量やCPUメモリの使用量を確認したり

f:id:takuya_1st:20180818195751p:plain

vm / docker のプロセスを管理

vm や Docker のコンテナをパパッと再起動したり状態をみたり

f:id:takuya_1st:20180818195310p:plain

systemd の依存関係をGUIで見れるから便利

ぐちゃぐちゃになるSystemdの依存関係や管理が資格的に行えるのはメリットがある。systemdのdaemonやタイマーの一覧して表示するのに便利だと思う。

f:id:takuya_1st:20180818195610p:plain

スマホから操作するのに便利。

ちょっとした再起動を試すのに、スマホからパパッとできるのでいいですね。

Cockpit プロジェクトをインストール

Debain 9 ( stretch ) には、Ubuntuと違ってBackportsで提供されていました

backports の導入とインストール

backportsの導入

echo 'deb http://deb.debian.org/debian stretch-backports main' > \
 /etc/apt/sources.list.d/backports.list
apt-get update

インストール

sudo apt-get install cockpit

起動

起動はsystemd socket で行われるので通常は使わなくていいらしい?

ポートとListenアドレスの指定

デフォルトでは、グローバルIPもローカルIPもローカルループバックアドレスもお構いなしにリッスンしてしまうので、ポートを決めておく。

cp /lib/systemd/system/cockpit.socket  /etc/systemd/
cat /etc/systemd/system/cockpit.socket
[Unit]
Description=Cockpit Web Service Socket
Documentation=man:cockpit-ws(8)
Wants=cockpit-motd.service

[Socket]
ListenStream= 127.0.0.1:9090
ExecStartPost=-/usr/share/cockpit/motd/update-motd '' localhost
ExecStartPost=-/bin/ln -snf active.motd /run/cockpit/motd
ExecStopPost=-/bin/ln -snf /usr/share/cockpit/motd/inactive.motd /run/cockpit/motd

[Install]
WantedBy=sockets.target

リロード

systemctl stop cockpit.socket
systemctl daemon-reload
systemctl start cockpit.socket

後は適当に認証する。

nginx とかApache で認証したり、vpnssh port forwarding 経由で使えばいいですよね。

ログイン画面

ログインは、ローカルユーザー( /etc/passwd ) で行うので、総当りされると面倒だし。安易にグローバルIPに公開できないですね。

f:id:takuya_1st:20180818193254p:plain

ssh 経由で認証したり、kerberos 認証したりもできるってさ

参考資料

https://cockpit-project.org/guide/latest/listen.html

https://cockpit-project.org/running#debian

ウェブブラウザーから操作できる軽量管理ツール「Cockpit」

gihyo.jp

DebianのBackporstを利用する(ミラーサーバー経由

debian のバックポートを利用する。

debian のバックポートは、公式サービスになっています。

Debian -- ニュース -- backports サービスが公式になりました

sources.list.d に加える。

直接 /etc/apt/sources.list に追記してもいいのですが、sources.list.d で分割した方が管理しやすいと思います。

echo 'deb http://deb.debian.org/debian stretch-backports main' > \
 /etc/apt/sources.list.d/backports.list
apt-get update

ミラーサーバを利用する

ミラーサーバーを使った方がみんなが嬉しいだろうと思うので、ミラーサーバを(さくら)を使うことにする。

sakura-mirrorの場合

公式になったということは、Debianのミラーサーバにもdistとして用意されているということになる。

さくらのミラーサーバでのBackports

f:id:takuya_1st:20180818191435p:plain

ミラーサーバの場合のバックポーツの利用例

URLを変えるだけでいい。

echo 'deb http://debian-mirror.sakura.ne.jp/debian stretch-backports main' > \
 /etc/apt/sources.list.d/backports.list
apt-get update

バックポーツを指定したインストール

apt の man を見るとターゲットリリースが指定できるので、どのリリースを使うか指定できる

概要
       apt [-h] [-o=config_string] [-c=config_file] [-t=target_release] [-a=architecture] {list | search | show | update | install pkg [{=pkg_version_number | /target_release}]...  |
           remove pkg...  | upgrade | full-upgrade | edit-sources | {-v | --version} | {-h | --help}}

リリースを指定したインストール・検索

通常リリースや、backports を指定して検索して見る

stretch-backports を指定して検索

root@acid:~# apt search -t stretch-backports nodejs-dev
ソート中... 完了
全文検索... 完了
nodejs-dev/stretch-backports 8.11.1~dfsg-2~bpo9+1 amd64
  evented I/O for V8 javascript (development files)

stretch を指定

root@acid:~# apt search -t stretch nodejs-dev
ソート中... 完了
全文検索... 完了
nodejs-dev/stable 4.8.2~dfsg-1 amd64
  evented I/O for V8 javascript (development files)

まぁ公式なので気にせず使えるのがメリットですよね。

backports にあるパッケージを入れてみる

sudo apt install cockpit

ok

参考資料

https://q-three.com/archives/293#apt_jessie-backports

Debian -- ニュース -- backports サービスが公式になりました

Debian の backports を使う

man apt

Evernoteにコードブロックが追加された

Evernoteにコードブックが追加されました。

念願のコードブロックを手に入れたぞ。

f:id:takuya_1st:20180818175610p:plain:w350

これまで、enmlを持ってきたり、HTMLを作り置きしておいてそこからコピペでスタイルを適用したり、マクロ(Automator)を作ってキーボードショートカットに割り当てたり、本当に苦労したけど。もうこれで苦労しなくて済むんですね。感動した。

使い方は簡単

メニューからコードブロックを選ぶか、Cmd-Ctrl-Bを押すだけ。

f:id:takuya_1st:20180818175615p:plain:w250

コードブロックの特徴

コードブロックが搭載されたことにより、次の2点が楽になります。

特に、これまでモノ・スペースのフォントを選ぶのがめんどくさかったので本当に助かる。

ブロック→スタイル削除で活用する

一旦、ブロックを作ってからスタイル削除(背景や文字装飾)を削除しても、等幅フォントが残る(バグ?)があるので、これを応用すると手軽に、等幅フォントを適用できて便利。

f:id:takuya_1st:20180818181549p:plain:w150

スタイルを消しても等幅フォントは残る

f:id:takuya_1st:20180818181531p:plain:w250

フォント設定はスタイル削除で消せないので、上手にやれば活用できる。

ドコモWiFiの0001docomoにつながらない時に試すこと

0001docomoにつながりません。

docomoWifiは優秀なんだけど癖があります。

ドコモの公衆無線LANは便利ですぐ繋がるし人通りが多くても通信エラーになるようなことがい優秀な無線LANを提供してくれてる。

Wi-Fiの認証は認証済みになるのに、DHCPIPアドレスが降ってこないことがあります。

1契約で1つしか同時に同じアクセスポイントに繋がりません。

1契約(1アカウント)で接続できる同時接続台数は1です。*1

そのため、iPhone / iPad / Androidなど複数のモバイルを機器を同時に使えません。スマホ・モバイル機器が同時に接続できるのは早い者勝ちですになってしまいます。

ドコモWifiにつなぐ対応方法

いくつか対応方法があります。

  1. 0000docomoを使う
  2. wifi をオフにする
  3. 契約数を増やす
  4. 一時的にアカウントを借りる。

対策1: 0000docomoを使う

0001docomoはほとんどの場合、0000docomo と2つのSSIDで提供されています。

f:id:takuya_1st:20180817192227p:plain:w250

そこで、代替策として 0000docomoを使います。 0001docomo と 0000docomo は接続が別計算なので大丈夫です。

0000docomoのWPAパスワードは次の通りです。

 0000docomo "B35D084737

対策:2 使わない機器のWiFiをチェックする

使わない機器のWifiを止めてしまえばいいのです。

使う機器以外のWifiの接続状態をチェックして、不用意に繋いでしまっている0001docomoの接続をオフにします。

そんなのは当たり前だろ。と思う人も多いかもしれませんが、WiFi接続パスワードは所有者が同じスマホ間で共有されています。なので、繋いだ記憶のない機器でも0001docomoのパスワードは同期されて接続可能状態になっています。気づかない間に繋がってることがあります。

つながらない場合は、真っ先に手持ちのデジタル機器の無線LANの接続状態を確認しましょう。預かり知らない間にパスワード設定が同期されてつながってることが多いですよ。

使いたい端末以外が先に0001docomoを使っていた場合は切断しておきましょう。

対策3: 契約数を増やす

docomoWifiは追加契約ができます。月額300円かかります。頻繁に使うのなら、追加してもいいでしょう。

f:id:takuya_1st:20180817194332p:plain:w250

また、moperaに変えるか、追加契約をすることで、無料の追加アカウントを一つもらえます。これも便利ですよ。

mopera足した方がお得

ドコモWifiを追加契約 300 円ですが、mopera UI スタンダード 500 円 ISPセット割 -150円 -150円なので、ドコモWifiを追加契約するなら、mopera足した方が安いですね。

ちなみにmoperaを契約している私の請求明細は次のようになっています。

f:id:takuya_1st:20180817195852p:plain:w250

対策4: 一時的にアカウントを借りる

一緒にお出かけしている家族のドコモアカウントを借りれば、一時しのぎをすることができます。

家族のスマホ契約のSPモードにもWifiアカウントが付いてますから、それを借りればいいわけです。

家族全員が同時にドコモWifiを使うという状況はあまり考えにくいですものね。

参考資料

https://www.nttdocomo.co.jp/service/wifi/docomo_wifi/about/bill_plan/u_publiclan/

*1: 多分だけど、全く違うAPで距離が離れていると同じアカウントで複数繋がるんだと思う

Evernoteで検索されないときに再インデックス化させる方法

Evernote で検索を再構築する。

Evernoteで、思ったように検索されないときがあります。

Web版だったら検索されるのに、iOSだと検索されるのに、Windowsだとだめ。macOSだとダメとかそういうことは起きます。 Evernoteは検索に通信を使っていません。検索するのにいちいちサーバーに問い合わせたりしてないので速いんですよね。

検索のインデックス(索引)はローカルにあるのでコレを再構築すると検索が復活します。

ヘルプをOption押しながら実行すると

検索の索引の再構築のメニューが出てきます。Mac全体のファイル検索にマッチさせるもの(MacなのでSpotlight)と、Evernoteの検索から検索したときにヒットさせるもの。 これらをそれぞれ再構成することができる。

f:id:takuya_1st:20180816020131p:plain

どういうときに検索されない事態が起きるのか

経験上ですが、Macを新しく移動したとき(新規ユーザーに移動したとき)、Evernoteをインストールし直したときですね。あとはEvernoteのメジャーバージョンアップ

これらのときに検索が壊れて、ノートが検索されないことが起こるようです。

参考資料

https://discussion.evernote.com/topic/110260-help-needed-cannot-search-my-old-notes/