それマグで!

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

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

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/

date コマンドと bash でタイマー(カウントアップ)を作る

date を使うと整数値の秒が取れる

date +%s

整数値で秒が取れるなら、タイマーも作れそうですよね。

整数の四則演算 と 組み合わせる。

echo $(( $now - $start))

これで、現在の時刻が取れる。

改行(CRLF)が邪魔なので

CRLFをしてしまうと1行次に行ってしまうのでCRだけをしてLineFeedをしないようにしてカレントの行を上書きする

時刻をフォーマットする

date コマンドで時刻をフォーマットする

date +%H:%M:%S @$time

引数に @1345 と整数時間を入れることで UNIX Epoch 1980-01-01 :00:00:00 からの経過時間として解釈してくれる。

これを利用して時間をHH:MM:SS にフォーマットをできる。

全てを組み合わせる

  • date で 整数秒
  • printf で 先頭へ
  • date @ で時間をフォーマット

これらを組み合わせて sleep すると、タイマーができるやったね

タイマーサンプル

#!/bin/bash

start=$( date +%s )


while : ; do


  elapsed=$((  $( date +%s )  - $start ));

  # echo $elapsed
  printf "$( date -d@${elapsed} -u +%H:%M:%S)\r"

  sleep 0.1
done

ミリ秒も計算したいよね

これだと味気ないので、bashで少数を計算する方法と、ミリ秒の表示を組み合わせる。

bashで少数を計算する

bashexpr$(( / (( でも整数値の計算しかできないので、bcなどを使う。

## bc を使って小数点を含む計算をする
echo 0.32 + 0.22 | bc
## 0.0x 始まりにする
printf %03f $( echo 0.32 + 0.22 | bc )

ミリ秒を表示する

date コマンドでミリ秒表示

date +%s.%3N

これらも組み合わせる

タイマー改良

#!/bin/bash

start=$( date +%s.%N )


while : ; do 


  elapsed=$( printf "%0.3f" $( echo   $( date +%s.%N )  - $start | bc  ));

  # echo $elapsed
  printf "$( date -d@${elapsed} -u +%H:%M:%S.%3N )\r"

  sleep 0.1
done

サンプル

実際にタイマーを動かしてみたサンプル

f:id:takuya_1st:20180815210230g:plain

誤差

sleep しているだけなので、だいぶ誤差が出てきます。誤差を正確に扱ってタイマーを作るのは大変なので、コレくらいにとどめておくことにする。

動画

動画はこちら

youtu.be

参考資料

dateコマンドでタイムスタンプ(unix epoch)を表示する

bash で現在のタイムスタンプを取得する

unix時間などと呼ばれる int 秒ですね、int の timestamp をdate コマンドで取得する

date +%s

## => 1534329465

これで、int秒のタイムスタンプを表示するすることができる。%s は現在の時刻の整数値を返してくれるので、便利ですよね。整数値があればタイマーにも使えます。

man より

man を見ると、次のように記述されてる

 %s     seconds since 1970-01-01 00:00:00 UTC
 %N     nanoseconds (000000000..999999999)

ナノ秒も含めて、現在の時刻を表示する

date +%s.%N
#=>1534329695.149991000

ミリ秒がいいんだけど

大丈夫、ミリ秒でもいける、それは %05d 的なノリで %3N とすればいい

$ date +%s.%3N
#=>1534329697.436

GNU date です

もちろん GNU date です。macOS 等の場合は、 brewGNU core を入れてないと動かない。

追記

gnu date のフォーマットなので、strftime などでも使えると思います。

python で int秒で unix タイムスタンプを取得した例

import time
print(time.strftime("%s"))
Time.now.strftime('%s') #=> "1535055995"

などと strftime でも使えて便利。最近のタイム関数は nano秒を返したりするしさ。言語毎に関数の使い方を覚えるのは流石に面倒なのです。GNU date の strftime という言語を超えたOSを超えた共通規格ですから、これを覚えておくと便利ですよね。

参考資料