くんすとの備忘録

IT系技術メモ

移転しました。

15秒後に自動的にリダイレクトします。

「第28回シェル芸勉強会 大阪サテライト」レポート

04/22(土)に東京で行われた「jus共催 第10回初心者向けなのかと百条委員会化する午前のシェル勉強会/第28回基準値を超えるシェル芸勉強会」について、今回も大阪でサテライトしました!

イベント情報

東京(本家)

usptomo.doorkeeper.jp

今回も、大阪(私達)と、福岡でサテライト会場がありました。

大阪サテライト

atnd.org

福岡サテライト

atnd.org

ぱぴろん(@papiron)さんによるまとめ

papiro.hatenablog.jp

大阪サテライトレポート

参加者

今回の参加者は、私も含めて16人、うち、初参加は3名でした。
徐々に平均年齢が下がってきてなかなか良い感じです♪

会場のようす

午前

今泉光之さん「シグナルについて」 ※後半は @ryuichiueda さん


SIGNALの種類や役割について体系的に学んだり、trapして確かめたりなど。




午後

sed地獄と思いきやawkゴリゴリな感じでした。

今回はなんというか……非常に疲れました……死屍累々

LTのようす

東京

大阪

今回もUstreamで配信して頂けました!(録画はナシです)

@KoharaKazuya さん 「シェル芸による git rev-list」


gitコマンドを使わず無理やりワンライナーでgitのログを閲覧するというシェル芸。 ダミーのgzipヘッダーを付けるのは他の処理でもたまにやるという声もありました。こわい。

@msr386 さん 「FORK爆弾 密着24時」


みんな大好きFork爆弾。 それによってサーバが停止したときのクラッシュダンプを見るという、危険シェル芸から一歩踏み込んだ内容の発表でした。 リソースが枯渇して死亡というイメージはあると思いますが、 やはり実際に計測して何が起こっているのか確認するということは大事ですね!(しろめ

@kunst1080 「Ubuntu on Bash on Ubuntu on Windows」


Bash on Ubuntu on Windows上でchrootを使い、別のUbuntuのコンテナを動かす……ということで実際に作成した環境をデモしました。 コンテナ内からコンテナ外のプロセスをkillできるのはいかがなものかと……

@nmrmsys さん 「SIerでもできる! シェル芸?」

https://dl.dropboxusercontent.com/u/54939588/slides/Shell-Arts-Can-Also-Be-The-SIer.html
とあるSIer向けの勉強会でシェル芸をやりたいという話があり、 それに向けてブラウザでbashを動かす環境はないか探してみたという内容でした。 他所様の環境でFork爆弾を投げるのはマジほんとやめてくださいね…… > 某参加者s(複数形)

@3socha さん 「SSM Run Command で遊ぶ」

https://horo17.github.io/aws-nest-call-slide/#/
「Windows ホストの PowerShell からイベントログに書き込む SSM Run Command を実行する Lambda Function を Linux ホストのシェルから実行する SSM Run Command」のワンライナーの説明でした。ネストしゅごい……(ぐるぐる~


今回も濃ゆい発表をありがとうございましたm( )m 大阪のLTはジャンルを問わないので、ネタさえあれば大丈夫! どしどし発表しちゃって下さい~

まとめ

上田会長、東京・福岡・大阪の皆様、お疲れ様でした。
フェンリル様、いつも会場を使わせていただきましてありがとうございます!

次回もまたよろしくお願いします!!

追記

DockerとLet's Encryptで自分用Mastodon鯖を立ててみた

自分用の設定メモ

事前準備

  • conohaでdockerのインスタンスを作成
    • 2.イメージ -> イメージタイプ = アプリケーション に「Docker」っていうのがある
  • docker-composeのインストール
  • ドメインの取得
  • ufwで80番と443番のポートを開放

構成

docker-composeを使って、以下の2つの環境を作成

  • mastodon

    • mastodonのAPサーバ
    • ポートフォワードはやらない
  • https-portal

    • Let’s Encryptを使ったHTTPS対応を全自動でやってくれるコンテナ
    • 80番と443番のポートを開放する
    • mastodonのネットワークに接続してmastodon/webを公開する

手順(というか設定メモ)

mastodon の環境作成

github.com

READMEの通りに進める。

※解説はいろんな人が書いてるので省略

最終的な設定ファイルはこんな感じ。

docker-compose.yml

データの永続化部分のコメントを外して、ポートフォワードの部分をコメント化

version: '2'
services:

  db:
    restart: always
    image: postgres:alpine
### Uncomment to enable DB persistance
    volumes:
      - ./postgres:/var/lib/postgresql/data

  redis:
    restart: always
    image: redis:alpine
### Uncomment to enable REDIS persistance
    volumes:
      - ./redis:/data

  web:
    restart: always
    build: .
    image: gargron/mastodon
    env_file: .env.production
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
#    ports:
#      - "3000:3000"
    depends_on:
      - db
      - redis
    volumes:
      - ./public/assets:/mastodon/public/assets
      - ./public/system:/mastodon/public/system

  streaming:
    restart: always
    build: .
    image: gargron/mastodon
    env_file: .env.production
    command: npm run start
#    ports:
#      - "4000:4000"
    depends_on:
      - db
      - redis

  sidekiq:
    restart: always
    build: .
    image: gargron/mastodon
    env_file: .env.production
    command: bundle exec sidekiq -q default -q mailers -q pull -q push
    depends_on:
      - db
      - redis
    volumes:
      - ./public/system:/mastodon/public/system

.env.production

SECRETとドメインとSMTPの設定をしただけ。 SMTPにはとりあえずで使い捨てのGMailアカウントを使用。

11行目付近

# Federation
LOCAL_DOMAIN=mastodon.kunst1080.net
LOCAL_HTTPS=true

36行目付近

# E-mail configuration
# Note: Mailgun and SparkPost (https://sparkpo.st/smtp) each have good free tiers
SMTP_SERVER=smtp.gmail.com
SMTP_PORT=587
SMTP_LOGIN=<GMailのメールアドレス>
SMTP_PASSWORD=<GMailのパスワード>
SMTP_FROM_ADDRESS=<GMailのメールアドレス>
SMTP_OPENSSL_VERIFY_MODE=none

https-portal の環境作成

docker-compose.yml

mastodonのネットワーク(mastodon_default)へ接続して、mastodonのweb:3000を公開する。

version: '2'

services:
  https-portal:
    image: steveltn/https-portal:1.0.1
    ports:
      - '80:80'
      - '443:443'
    restart: always
    environment:
      DOMAINS: 'mastodon.kunst1080.net -> http://web:3000'
      FORCE_RENEW: 'true'
      STAGE: 'production'
    networks:
      - mastodon_default

networks:
  mastodon_default:
    external: true

STAGE: 'production'を付けないとオレオレ証明書になってしまうので注意。

おまけ: 管理者の設定方法

$ docker-compose run --rm web rails mastodon:make_admin USERNAME=kunst1080

参考URL

Mastodon

https-portal

九九の答えが36種類であることの証明

まず、九九に現れる式に使われる数字の組み合わせの数を数えます。 計算式を m * n とすると mは1~9nは1~9 です。 そうすると、 mとnが異なるときに使われる数字の組み合わせ は、1~9から2つの数字を選ぶ組み合わせなので

9C2 = (9 * 8) / (2 * 1) = 36 通り …… ①

となります。

また、 mとnが等しいときの組み合わせ は、1*12*2……9*9となりますので

9 通り …… ②

となります。

①と②より、式に使われる数字の組み合わせの数

36 + 9 = 45 通り …… ③

となります。

ここから、 計算結果が重複するもの を取り除いて行きます。 計算結果が重複するものは、例えば

4 * 9 = 36
6 * 6 = 36

のようなもののことです。

ここで、 1から9までの数字を素因数分解 してみましょう。

1
2 = 2
3 = 3
4 = 2 * 2
5 = 5
6 = 2 * 3
7 = 7
8 = 2 * 2 * 2
9 = 3 * 3

このように、素数と合成数1が混ざっていることがわかります。

ここで、先程の式を見てみましょう

4 * 9 = 36
6 * 6 = 36

この式を素因数分解すると、

4 * 9 = (2 * 2) * (3 * 3) = 2 * 2 * 3 * 3 = 36
6 * 6 = (2 * 3) * (2 * 3) = 2 * 2 * 3 * 3 = 36

このように、全く同じ式になります。

九九の中にある 計算結果が重複するもの というのは、このように、 式に使っている数字の組が異なり、素因数分解した結果が等しい ものであると言えそうです。

ここで、 1から9までの数字を素因数分解 したものから、合成数だけを抜き出してみます。(9以下の合成数の一覧)

4 = 2 * 2
6 = 2 * 3
8 = 2 * 2 * 2
9 = 3 * 3

少し変形して

4 = 2 * 2
6 = 2 * 3
8 = 2 * 2 * 2 = 2 * 4
9 = 3 * 3

これらの式は、1の段の計算結果 と上記の計算式について、式に使っている数字の組が異なり、素因数分解した結果が等しい ことが明らかです。 よって、

1 * 4 と 2 * 2
1 * 6 と 2 * 3
1 * 8 と 2 * 4
1 * 9 と 3 * 3

の

4通り …… ④

を、1の段と計算結果が重複する式の数 として数え上げることができます。

では、9より大きい数ではどうでしょうか。

式に使っている数字が異なり、素因数分解した結果が等しい という定義と、 9以下の合成数の一覧 からもう一度考えてみます。

4 = 2 * 2
6 = 2 * 3
8 = 2 * 2 * 2
9 = 3 * 3

ここへ、123を加えてみます。

1 = 1
2 = 2
3 = 3
4 = 2 * 2
6 = 2 * 3
8 = 2 * 2 * 2
9 = 3 * 3

順番を少し変えます。

1 = 1
2 = 2
3 = 3
4 = 2 * 2
6 = 2 * 3
9 = 3 * 3
8 = 2 * 2 * 2

上記の一覧の中にある数字から、 素因数分解した結果が等しくなるような組み合わせ を探せば良さそうです。

まず、計算して項が3つになる組み合わせは

(2 * 2) * 2 = 2^3
(2 * 2) * 3 = 2^2 * 3

(2 * 3) * 2 = 2^2 * 3
(2 * 3) * 3 = 2 * 3^2

(3 * 3) * 2 = 2 * 3^2
(3 * 3) * 3 = 3^3

です。上記の内、計算結果が重複している式の組み合わせは

2^2 * 3 → (2 * 3) * 2 と (2 * 3) * 2
2 * 3^2 → (2 * 3) * 3 と (3 * 3) * 2

の

2通り …… ⑤

です。次に、計算して項が4つになる組み合わせは

(2 * 2) * (2 * 2) = 2^4
(2 * 2) * (2 * 3) = 2^3 * 3
(2 * 2) * (3 * 3) = 2^2 * 3^2
(2 * 3) * (3 * 3) = 2 * 3^3
(2 * 3) * (2 * 3) = 2^2 * 3^2
(3 * 3) * (3 * 3) = 3^4
(2 * 2 * 2) * 1   = 2^3
(2 * 2 * 2) * 2   = 2^4
(2 * 2 * 2) * 3   = 2^3 * 3

です。上記の内、計算結果が重複している式の組み合わせは

2^4       → (2 * 2) * (2 * 2) と (2 * 2 * 2) * 2
2^3 * 3   → (2 * 2) * (2 * 3) と (2 * 2 * 2) * 3
2^2 * 3^2 → (2 * 2) * (3 * 3) と (2 * 3) * (2 * 3)

の

3通り …… ⑥

です。

ここまでに算出してきた ③④⑤⑥ についておさらいすると

  • ③ → 式に使われる数字の組み合わせの数 = 45通り
  • ④ → 1の段と計算結果が重複する式の数 = 4通り
  • ⑤ → 9より大きい数で、計算結果が重複する式の数(項が3つ) = 2通り
  • ⑥ → 9より大きい数で、計算結果が重複する式の数(項が4つ) = 3通り

です。これらの数を使うと、以下のように式に使われる数字の組み合わせの数から計算結果が重複する式の数を取り除いた組み合わせは

式に使われる数字の組み合わせの数 - 計算結果が重複する式の数
45 - (4 + 2 + 3) = 36 通り

となります。

したがって、九九の答えとなる計算結果の数字は36種類であると言えます。

※もっとスマートな証明を誰か……

おまけ

ここまでの思考の流れ

MacでiTermの背景色を変更するシェルスクリプト

[ch_bg_color.sh]

#!/bin/bash

R=$1
G=$2
B=$3

/usr/bin/osascript <<EOF
tell application "iTerm"
  tell current session of current window
    set background color to {$(($R*65535/255)), $(($G*65535/255)), $(($B*65535/255))}
  end tell
end tell
EOF

AppleScriptを使ってるし完全にMac用。

Bash on Ubuntu on Windowsのchrootを試してみた

4/11の配信日が待ちきれないので、Insider Programに登録して新しいBash on Ubuntu on Windowsをいち早く試してみましたっ!

セットアップ

Windows Insider Program に登録し、Insiderのレベルを スロー に設定しました。

f:id:kunst1080:20170402234641p:plain

※登録してから更新が降ってくるまで、1日待ちました

Bash on Ubuntu on Windowsのバージョン確認

まずはBash on Ubuntu on Windowsの環境のバージョンを確認します。 uname -acat /etc/lsb-release で確認です。

f:id:kunst1080:20170402234720p:plain

uname -a

Linux DESKTOP-T3CMM04 4.4.0-43-Microsoft #1-Microsoft Wed Dec 31 14:42:53 PST 2014 x86_64 GNU/Linux

cat /etc/lsb-release

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.1 LTS"

ですね。

ここで、Creators Updateしてない版のbash(以降、「現行」)の方も見てみましょう。

f:id:kunst1080:20170402234728p:plain

※別マシンなので解像度は小さいですが…‥

見ての通り、Ubuntuのバージョンが14.04から16.04に上がったのがわかります。

日本語の表示

現行ではターミナルに日本語を入力すると横が切れたりしますが、Creators Update適用後は切れずに表示されるよう改善されたみたいです。

f:id:kunst1080:20170402234744p:plain

chroot対応の確認 - コンテナで遊ぼう

現行のBash on Ubuntu on Windowsではchrootに対応しておらず、中でコンテナを起動させたり、無理やりArchLinuxを動かしてもpacmanでエラーが出るといった問題が発生1していました。 リリースノート2によると、Creators Updateにchroot対応が含まれているようです。そういうことなので、いろいろコンテナを作って試してみたいと思います。

※自分の中ではこれが今回の一番の目玉!!!

Ubuntuのコンテナの作成

必要なパッケージのインストール

# apt install debootstrap

debootstrapを使ったUbuntuのインストール

違いがわかりやすいよう、XenialではなくVividを入れます。

# debootstrap vivid /srv/chroot/vivid http://ftp.riken.go.jp/Linux/ubuntu/
# cp -L /etc/resolv.conf /srv/chroot/vivid/etc

デバイスのマウント

bashを閉じる度に設定し直しになるので注意

# cd /srv/chroot
# mount -t proc none vivid/proc
# mount -t sysfs none vivid/sys
# mount -o bind /dev vivid/dev

ログインと確認

# chroot /srv/chroot/vivid /bin/bash

コンテナ内で

# uname -a
# cat /etc/lsb-release

f:id:kunst1080:20170402234757p:plain

ちゃんと環境が変わってますね!

※少し遊んでみましたが、chroot環境ではターミナル内でスクロールできなかったり日本語を入力できなかったりしますね。()これは普通のLinuxとかでのchrootと同じかな)

f:id:kunst1080:20170402234808p:plain

sudo付きでchrootするとわかりやすいんですが、ホストのプロセスが見えてるっぽいんですよね……

Debianのコンテナの作成

※動かそうとしたらセグフォったのでパス!

ArchLinuxのコンテナの作成(ブートストラップイメージを使う方法)

ArchWiki3を見ながらインストールを進めます。

ブートストラップイメージの取得と展開

# cd /tmp
# wget http://ftp.jaist.ac.jp/pub/Linux/ArchLinux/iso/latest/archlinux-bootstrap-2017.04.01-x86_64.tar.gz
# tar xzf archlinux-bootstrap-2017.04.01-x86_64.tar.gz
# mv root.x86_64 /srv/chroot/arch

デバイスのマウント

# mount --bind /srv/chroot/arch /srv/chroot/arch
# cd /srv/chroot/arch
# cp /etc/resolv.conf etc
# mount -t proc /proc proc
# mount --rbind /sys sys
# mount --rbind /dev dev
# mount --rbind /run run

pacmanの設定

pacmanで使用するmirrorlistのファイルを先に修正しておきます。

# vim /srv/chroot/arch/etc/pacman.d/mirrorlist

好きなミラーサーバのコメントを外しておきます。

ログインと環境のセットアップ

ログイン

# chroot /srv/chroot/arch /bin/bash

コンテナ内で環境をセットアップ

# pacman-key --init
# pacman-key --populate archlinux
# pacman -Syy
# pacman -S base

動作確認(gitのインストール)

# pacman -S git

f:id:kunst1080:20170402234826p:plain

Archちゃん動きました。

ArchLinuxのコンテナの作成(LiveCD イメージを使う方法)

airootfs.sfsの取得

# apt install -y squashfs-tools p7zip-full
# wget http://ftp.jaist.ac.jp/pub/Linux/ArchLinux/iso/latest/archlinux-2017.04.01-x86_64.iso
# 7z x archlinux-*.iso
# cp arch/x86_64/airootfs.sfs /srv/chroot/

airootfs.sfsからルートイメージの取り出し

# cd /srv/chroot
# unsquashfs airootfs.sfs
# mv squashfs-root arch2
# rm airootfs.sfs

デバイスのマウント

# mount --bind /srv/chroot/arch2 /srv/chroot/arch2
# cd /srv/chroot/arch2
# cp /etc/resolv.conf etc
# mount -t proc none proc
# mount -t sysfs none sys
# mount -o bind /dev dev
# mount -o bind /dev/pts dev/pts

ログインと環境のセットアップ

ログイン

# chroot /srv/chroot/arch2 /bin/bash

コンテナ内で環境をセットアップ

# pacman-key --init
# pacman-key --populate archlinux
# pacman -Syy

動作確認(gitのインストール)

# pacman -S git

f:id:kunst1080:20170402234840p:plain

どちらの方法でも動くようです。

環境をArchLinuxに入れ替える

前回(http://www.kunst1080.net/entry/2016/08/26/001940)と同じ手順でできました。

違うところは

  • isoのダウンロード用URLが変わってるので要チェック
  • resolv.conf書きましょう
  • pacmanでエラー出なくなってました。

f:id:kunst1080:20170402234854p:plain

前よりちゃんと使えそうです。


ひとまずこんな感じで!
これは本格的に色々コンテナ作って遊べそうです!!

参考URL

Vue.jsでリストの一部をレンダリングする

v-for="item in items"でアイテムのリストを描画する際、itemssliceしてやることでリストの一部だけを描画することができるようです。

※やってみたらできた;)

サンプルコード

<html><body>

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.2.4/vue.min.js"></script>

<div id="sample">

  <h4>List1</h4>
  <ul>
    <li v-for="item in items.slice(0,2)">
      item = {{item}}
    </li>
  </ul>

  <h4>List2</h4>
  <ul>
    <li v-for="item in items.slice(2,4)">
      item = {{item}}
    </li>
  </ul>

  <h4>List3</h4>
  <ul>
    <li v-for="item in items.slice(4,6)">
      item = {{item}}
    </li>
  </ul>

</div>

<script>
var vm = new Vue({
    el: "#sample",
    data: {
        items: ["a", "b", "c"]
    }
});

// 要素を追加すると、sliceで割り当てられた部分に描画される
vm.items.push("d");
vm.items.push("e");
vm.items.push("f");

</script>

</body></html>

サンプル表示

f:id:kunst1080:20170317215301p:plain

関連するマニュアルのURL