技術メモ

役に立てる技術的な何か、時々自分用の覚書。幅広く色々なことに興味があります。

引数のあるコマンドをエイリアスに登録する方法(シェルスクリプト)

引数のあるコマンドをエイリアスに登録したい時、調べたのでメモ
例えば、複数のサーバーが用意されていてSSHするサーバーを使い分けるみたいな時。

ssh USER@SERVER1.com -p 8888
ssh USER@SERVER2.com -p 8888
ssh USER@SERVER3.com -p 8888
...

みたいなコマンドを一つにまとめたい。

そんな時はこう書く

function entercommand() { ssh USER@SERVER$1.com -p 8888 ; }

これで、

entercommand 1

でSERVER1.comを指定して入ることができる

余談

シェルのワンライナーで変数を使いたい

シェルのワンライナーで変数を使いたい時、例えば入出力のファイルの名前を揃えたい時などに便利。
書き方としてはこんな感じ

f() { ls ${1}; }; f ~/Documents/

入出力を揃える

f() { ffmpeg -ss 00:01:00 -i ${1}.mp4 -c copy -to 00:05:00 ${1}_cut.mp4; }; f sample

sample.mp4という動画ファイルを1:00から5:00までトリミングしsample_cut.mp4という名前で保存するワンライナー

粘菌に迷路を解かせるシミュレーション

粘菌は凄い!なぜかって、脳がないのに餌までの最短経路を見つけることができる。
これが神経細胞の始まりだとか言われていたり言われていなかったりする



以前から知ってはいたが、調べているとニコ動でこんな動画があった。ちゃんとできている!しかもエクセルで!

おおなんだ、これはすごい!自分でも再現したい!
ということで、自分で作ってみることにした。


アルゴリズムは人工生命的なセルオートマトン的な何かだろうと推測される。
映像を参考にしながら試行錯誤していこう。

まず単純な規則から考えてみる。
セルの状態として考えられるのは、

  • エサ
  • 粘菌
  • かべ
  • 空白

そして、基本的な事は

  1. 道幅は1セル分のみ
  2. 初期値ではすべての道に粘菌が存在する
  3. ある規則に基づいて粘菌セルが空白セルに変わる、それ以外は不変

ということだろう。
そして恐らくある規則というのは、
「両隣が粘菌セルかエサであれば粘菌セルは生き残り、それ以外は隣の粘菌セルに吸収される。」
じゃないだろうか。

…なんとなくできそうだ、さっそく実装してみよう。

import sys
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from copy import deepcopy

colors = {
    "empty":(1, 1, 1),
    "wall":(0, 0, 0),
    "feed":(1, 0, 0),
    "ameba":(1, 0.8, 0.2),
}
symbols = {
    "$":"wall",
    " ":"ameba",
    "s":"feed",
    "t":"feed",
}
stagefile = "stage.txt"


def stage2colors(stage):
    colormap = deepcopy(stage)
    for i in range(len(stage)):
        for j in range(len(stage[0])):
            colormap[i][j] = colors[stage[i][j]]
    return colormap

def update(stage):
    next_stage = deepcopy(stage)
    for i in range(1,len(stage)-1):
        for j in range(1,len(stage)-1):
            next_stage[i][j] = cell_rule(stage, i, j)
    return next_stage

def cell_rule(stage, i, j):
    result = stage[i][j]
    if stage[i][j] == "ameba":
        around_cells = 0
        for x,y in [(-1,0),(1,0),(0,-1),(0,1)]:
            if stage[i+x][j+y] in ["ameba","feed"]:
                around_cells += 1
        result = "ameba" if around_cells > 1 else "empty"
    return result

f = open(stagefile,"r")
lines = f.readlines()
stage = []
for line in lines:
    line = line.replace("\n","")
    line = line.replace("\r","")
    stage.append([symbols[i] for i in line])

ims = []
fig = plt.figure()
plt.axis('off')
for t in range(40):
    stage = update(stage)
    im = plt.imshow(stage2colors(stage), interpolation='none')
    ims.append([im])
ani = animation.ArtistAnimation(fig,ims)
plt.show()
  • stage.txt
$$$$$$$$$$$$$$$$$
$   $   $       $
$ $ $ $ $ $$$$$ $
$ $ $ $ $ $   $ $
$ $ $ $$$ $ $ $ $
$ $ $   $ $ $   $
$ $ $ $ $ $ $$$$$
$ $ $ $ $t$   $ $
$ $$$ $ $$$ $ $ $
$     $  $  $ $ $
$ $$$ $ $$$ $ $ $
$ $   $ $   $   $
$$$ $$$$$ $$$ $ $
$   $         $ $
$ $$$ $$$$$$$$$ $
$   s           $
$$$$$$$$$$$$$$$$$

予想通りそれっぽいのができたぞ。
ただ、粘菌は環状になってる経路は最短距離で辿り着くようになってるよね。
実際の粘菌に近づけるにはもっと考えるところがありそう。

仮想環境の中でIPythonを使う方法 (virtualenv + ipython)

仮想環境下で

pip install ipython
ipython

としても、デフォルトモードのipythonが立ち上がってしまう。
例えば、2系を標準に入れている端末で3系の仮想環境を作った時なんかは困ってしまう。

簡単な解決法があったので紹介する。

エイリアスにこれを登録しておけくだけ。

alias ipy="python -c 'import IPython; IPython.terminal.ipapp.launch_new_instance()'"

ipyを実行すれば、入っている環境下でのipythonが立ち上がる。


参考サイト:
Running iPython cleanly inside a virtualenv (Example)