Quantcast
Channel: Bashタグが付けられた新着記事 - Qiita
Viewing all 2889 articles
Browse latest View live

#Mac の ターミナル や #iTerm で HTTPS / HTTP プロクシから Webサイトに接続する ( サーバーに #ssh 接続して SOCKS proxy を立てる ) ( #bash #linux )

$
0
0

ssh コマンド で SOCKS proxy を起動しておく

ssh -vND 8888 user@xxx.xxx.xxx.xxx
ssh -vND 8888 user@xxx.xxx.xxx.xxx -i ~/.ssh/some.pem

環境変数で HTTPS proxy を指定する

export HTTPS_PROXY=socks://127.0.0.1:8888

こちらもお好みで

export HTTP_PROXY=socks://127.0.0.1:8888

自分のIPをcurlコマンドで確認してみる

環境情報確認サイト「確認くん」を使ってみる。

昔からお世話になってます!

$ export HTTPS_PROXY=
$ https://httpbin.org/ip
{
"origin": "YYY.YYY.YYY.YYY, YYY.YYY.YYY.YYY"
}

プロクシを利用しない設定にして自分のIPアドレスを確認する

$ export HTTPS_PROXY=
$ https://httpbin.org/ip
{
  "origin": "ZZZ.ZZZ.ZZZ.ZZZ, ZZZ.ZZZ.ZZZ.ZZZ"
}

切り替えできていたら成功!

設定を保存する

~/.bash_profile ~/.bashrc ~/.zshrc などのプロフィールファイルに export コマンドを書いておけばok

NOTE

なぜかこちらの方法だと反映されなかった。

curl httpbin.org/ip

グローバルIPをcurlで確認 - Qiita

関連

Mac OS で ssh サーバーを踏み台にして SOCK プロクシ経由で Web ページにアクセスする例 ( #Mac #ssh ) - Qiita

Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2652


Mac の環境構築を自動化してみた

$
0
0

はじめに

どうも、源武です。

macOS Catalina が登場して、システムの構成が大きく変化しましたね。

私は Catalina をインストールする上で、一旦データを初期化してからインストールしようと考えていました。

しかし、私の開発環境はソフトが多く、手動でセットアップするのは正直面倒です。

なので、環境構築を自動化するスクリプトをサクッと書いてきました。今回はそれを紹介します。

GitHub: Genbuchan/dotfiles

dotfiles

dotfilesをご存知でしょうか。.bashrc などの、先頭に . が付く設定ファイルのことです。

といっても今回のスクリプトに . が付くファイルはほとんど無いです笑

便宜上、今回は dotfilesということで話を進めていきます。

セットアップの流れ

至ってシンプルです。ソフトウェアをインストールして、設定ファイルを展開するだけ、という単純な内容となっています。

ここからは、詳しい流れを紹介していきます。

1. 前準備( Homebrew, Python のインストール)

この dotfiles のほとんどは、Python で書かれています。配列の扱いが楽だから、という単純な理由です笑

なぜ配列を使うのか、その答えは後ほど。

手順としては

  1. インストールの続行を確認する
  2. Homebrew をインストールする
  3. pyenv をインストールする
  4. Python 3 をインストールする
  5. 大部分のスクリプト (Pythonで書いたもの) に処理を投げる

Python のバージョン管理のことを考慮して、敢えて pyenv を経由して Python 3 をインストールしました。

2. セットアップの大部分( 自動セットアップなど )

今回、グループごとに複数のソフトウェアを順番にインストールするために、Python の配列を用いました。

definternet():print("\nPhase 1. Install internet applications")installCaskApps(["google-chrome","firefox","discord","slack"])definstallCaskApps(apps):forappNameinapps:print("Installing",appName)subprocess.run("brew cask install "+appName,shell=True)

installCaskApps 関数の第1引数に、インストールするアプリケーションのパッケージ名を配列に格納し、それを順次 for 文で展開するという流れです。

あとは元のシェルスクリプトに処理を投げて

cp-r"./Code/""/Users/$USER/Library/Application Support/"

これで設定ファイルを展開するだけです。

おしまい。

面倒なことは自動化してしまおう

自動化はプログラミングの醍醐味だと思います。こういう技術を学んで、面倒なことを楽にする努力をするのも1つの手だと思いました笑

dotfiles に書いていないアプリケーションの都合上、まだ macOS Catalina を導入できませんが、導入できる日が来ることを待っています。

ではでは。源武でした。

価格あたりのカロリーが高い「マクドナルド(マック)」のハンバーガーランキングをpythonで集計してみた

$
0
0

この記事も参考にしてください。

目次

マクドナルド(マック)で一番「得」な商品の定義

昼飯にとって最も重要なのは「コスパ」=「値段あたりのカロリー」です。

本当は小麦粉からすいとん等を作るのが一番ですが、外食を余儀なくされる機会も多いと思います。

代表的な良コスパ外食チェーン、「マクドナルド」でコスパの高い商品を調査してみました。

参考

https://saltiga.hatenablog.com/entry/2019/11/04/151658

調査方法

  1. マクドナルドの公式サイトから、メニューと価格一覧を取得
wget http://www.mcdonalds.co.jp/menu/burger/ -O - | ¥
grep-e price -e ly-mod-menu-name | ¥
grep-v ly-mod-menu-priceset | ¥
sed-e's/<[^>]*>//g' | ¥
awk'$1~/¥.*/&&a==1{print $1; a = 0}$1!~/¥.*/{print $1; a =1}' | ¥
paste - -  > price.txt
  1. 同様にカロリーも取得
wget -O - http://www.mcdonalds.co.jp/quality/allergy_Nutrition/nutrient2.php?id=1 | ¥
grep-A3 menu_info | ¥
sed-e's/<[^>]*>//g' | ¥
awk'{print $1}' | ¥
awk'$0' | ¥
paste - - - - 
awk'{print $1, $3}'> cal.txt
  1. 価格あたりのカロリーを計算
  • 計算結果をソートした
  • markdown できれいに表示できるようにする
price=open('price.txt')cal=open('cal.txt')pri=price.read().split()ca=cal.read().split()pril={}call={}foriinrange(len(ca)//2):call[ca[2*i]]=int(ca[2*i+1])foriinrange(len(pri)//2):pril[pri[2*i]]=int(pri[2*i+1].split("¥")[1])cpp={}foriinpril:ifiincall:cpp[i]=[str(call[i]/pril[i])+"円/kcal",str(pril[i])+"円",str(call[i])+"kcal"]foriincpp:print("|",i,"|",cpp[i][0],"|",cpp[i][1],"|",cpp[i][2],"|")price.close()cal.close()

結果(値段あたりのカロリーランキング)

ソーセージマフィン3.590909090909091円/kcal110円395kcal
チキンクリスプ3.1363636363636362円/kcal110円345kcal
マックグリドル2.8円/kcal150円420kcal
チキンクリスプマフィン2.6円/kcal140円364kcal
倍チキンクリスプ2.3714285714285714円/kcal210円498kcal
ハンバーガー2.327272727272727円/kcal110円256kcal
チーズバーガー2.192857142857143円/kcal140円307kcal
チキチー(チキンチーズバーガー)2.155円/kcal200円431kcal
倍マクポ(倍ベーコンマックポーク)2.1466666666666665円/kcal300円644kcal
マクポ(ベーコンマックポーク)2.1円/kcal200円420kcal
メガマフィン1.9857142857142858円/kcal350円695kcal
倍チキチー(倍チキンチーズバーガー)1.9466666666666668円/kcal300円584kcal
スパチキ(スパイシーチキンバーガー)1.945円/kcal200円389kcal
エグチ(エッグチーズバーガー)1.935円/kcal200円387kcal
ソーセージエッグマフィン1.9円/kcal250円475kcal
倍スパチキ(倍スパイシーチキンバーガー)1.8066666666666666円/kcal300円542kcal
倍ハンバーガー1.6952380952380952円/kcal210円356kcal
倍チーズバーガー1.6916666666666667円/kcal240円406kcal
倍てりやきマックバーガー1.6545454545454545円/kcal440円728kcal
倍てりやきチキンフィレオ1.6340425531914893円/kcal470円768kcal
ビッグブレックファスト1.63円/kcal600円978kcal
倍エグチ(倍エッグチーズバーガー)1.62円/kcal300円486kcal
エッグマックマフィン1.555円/kcal200円311kcal
倍チキンフィレオ1.541304347826087円/kcal460円709kcal
てりやきマフィン1.5379310344827586円/kcal290円446kcal
ベーコンエッグマックサンド1.495円/kcal200円299kcal
倍ダブルチーズバーガー1.4886363636363635円/kcal440円655kcal
親子てりやきマックバーガー1.4820512820512821円/kcal390円578kcal
倍ビッグマック1.4775510204081632円/kcal490円724kcal
ビッグマック1.3461538461538463円/kcal390円525kcal
てりやきチキンフィレオ1.345945945945946円/kcal370円498kcal
ダブルチーズバーガー1.3441176470588236円/kcal340円457kcal
チキンフィレオ1.2916666666666667円/kcal360円465kcal
旨辛てりやきマックバーガー1.2897435897435898円/kcal390円503kcal
倍グラン1.2142857142857142円/kcal490円595kcal
倍えびフィレオ1.1285714285714286円/kcal490円553kcal
グラン1.1025641025641026円/kcal390円430kcal
ホットケーキ1.0633333333333332円/kcal300円319kcal
倍フィレオフィッシュ1.040909090909091円/kcal440円458kcal
ベーコンレタスバーガー1.038888888888889円/kcal360円374kcal
倍ベーコンレタスバーガー1.0282608695652173円/kcal460円473kcal
えびフィレオ1.0128205128205128円/kcal390円395kcal
フィレオフィッシュ1.0029411764705882円/kcal340円341kcal
てりやきマックバーガー0.956円/kcal340円478kcal
  • 円/kcalじゃなくてkcal/円です。書き間違えました
  • てりやきマックバーガーは本当は340円で価格あたりのカロリーは1.4円です。公式サイトでなぜかテリヤキバーガーだけバリューセットの価格が表示されていたためです。

結局、コスパ上位のハンバーガーは?

  • 朝部門
    🥇 ソーセージマフィン
    🥈 マックグリドル
    🥉 チキンクリスプマフィン

  • 昼部門
    🥇 チキンクリスプ
    🥈 ハンバーガー
    🥉 チーズバーガー

という結果になりました。
やはり低価格メニューは低付加価値で、高価格のビッグマックや魚介系バーガーはぼったくりということがよく見て取れます。

まとめ

マクドナルドで価格あたりで最大のカロリーを得るためには・・・

  • 朝にお腹が空いているときは、ソーセージマフィンを食べられるだけ頼みましょう!!

  • 昼間にお腹が空いているときは、チキンクリスプを食べられるだけ頼みましょう!!

alias(エイリアス) の設定の仕方

$
0
0

bash の場合は、基本的に ~/.bash_profile
zshの場合は ~/.zshrc に記述するのがスタンダードです。

試しに登録してみましょう。(zshの場合)
$ vim ~/.zshrc

以下のような記述を追記します(これは例ですので、自分の好きに登録してOKです)。

alias gs="git status”
alias gd="git diff”
alias gc="git checkout”
alias gb="git branch”
alias gl="git log”
alias rs=“rails s”
alias rc=“rails c”

で、

$ source ~/.zshrc
を実行すると、使えるようになる。

inotifywaitによるディレクトリの監視とスクリプト実行

$
0
0

そのうち必要になりそうなのでメモ。
こちらを自分用に寄せたもの。
Linuxでファイルの変更を検知して、スクリプトを自動実行する(inotifywaitコマンド)

つくりたいもの

rootとなるディレクトリの配下に複数のディレクトリ(以下、子ディレクトリ)がある。
子ディレクトリの中に特定のファイルが生成されたとき、その子ディレクトリ内の別のファイルの内容を書き換える。

満たすべき機能

  • rootディレクトリ名は引数で指定
  • 生成を検知するファイル名・書き換え対象のファイル名は固定
  • 子ディレクトリは、外部から生成・削除
    • ディレクトリ名は任意
  • スクリプト実行後もディレクトリの監視を継続

使用する物

つくりかた

inotifywaitの標準出力からイベントの詳細を配列で受け取る。

./dir1/ CREATE aa.txt

あとは受け取った配列の中身から更新対象のファイルパスを作成し、更新を実行。
今回はsedを使って文字列を置換する(とりあえず "HELLO" -> "GOODBYE")。

つくったもの(サンプル)

#!/bin/bashDIR=$1CREATED_FILENAME='createdfile'MODIFIED_FILENAME='modifiedfile'

inotifywait -m-r${DIR}-e CREATE,DELETE | while read line
  do
    declare-aparams=(${line})event=${params[1]}dir=${params[0]}file=${params[2]}case${event}in'CREATE')if["`echo${file} | grep${CREATED_FILENAME}`"];then
          echo"FILE CREATED"echo${file}sed-i-e"s/HELLO/GOODBYE/"${dir}${MODIFIED_FILENAME}fi;;*);;esacdone

注意点

特定のファイルしか生成されない想定なので、CREATEDイベントを検知するだけで十分かと思ったが、sedのiオプションで生成される一時ファイル(sedhogeみたいなやつ)も検知してしまうので、ファイル名を指定する必要があった。

今後

systemdで動かしたい。

端末のパイプ先に特定の出力だけ渡す方法

$
0
0

経緯

CLIツールを作っていたときに、コマンドの標準出力のうち、
パイプ先のコマンドに渡したい出力と渡したくない出力があるケースがでてきました。

以下のようなツールです。

mycmd1.gif

何らかの処理を行い、プログレスバー風のアニメーションをプロンプトに表示し、
処理結果のファイル名を最後に出力するコマンドです。

コードは以下のような感じです。
Nimでの実装です。

importos,strutils,strformatforiin1..60:# カーソルを1行上に移動し、行を削除するANSIエスケープシーケンスecho"\x1b[1A\x1b[K\x1b[1A"# 進捗の分数letprog=&"[ {i:>2}/60 ]"# 処理済みのバーletleftBar="\x1b[44m"&" ".repeat(i).join()&"\x1b[m"# 空白のバーletrightBar=" ".repeat(60-i).join()echo&"{prog} [ {leftBar}{rightBar} ]"sleep25# 処理結果を格納したファイルパスecho"/var/tmp/result.txt"

渡したくないのはアニメーションをしているプログレスバーの部分です。
最後のファイル名だけパイプ先に渡して、catなりvimなりで開きたかったんです。

これをそのままlessするとどうなるか?
以下のようになります。

2019-11-05-231752_939x507_scrot.png

こうなります。悲惨です。
プログレスバーの出力と、カーソル移動、カーソル行の削除のANSIエスケープシーケンスまでlessが補足しています。

これを回避する方法を調べて、解決したことを書きます。

類似ツールの調査

必要な出力と不要な出力を分けてパイプ先に渡しているツールとしてpecoが思い浮かびました。
なので、pecoのソースを調べることにしました。

pecoのソースを読んだ所、pecoのUI部分はtermboxが全部引き受けていることがわかりました。
termboxで軽くUIを作ってlessしてみたところ、termboxのUI出力はパイプ先に渡さないことがわかりました。
termboxのソースを読んだところ、以下の部分がその理由でした。

https://github.com/nsf/termbox-go/blob/master/api.go#L27-L42

/dev/ttyを開いています。
ttyについて全然把握していなかったので、ttyについて調べました。
以下のQiitaの記事がとてもわかりやすかったです。

Qiita - ttyとかptsとかについて確認してみる

実装

前述の実装を参考に以下のように修正しました。

--- mycmd.nim   2019-11-05 21:16:47.623075601 +0900
+++ mycmd2.nim  2019-11-05 21:20:30.929732374 +0900
@@ -1,5 +1,15 @@
 import os, strutils, strformat

+var
+  tty = open("/dev/tty", fmReadWrite)
+  oldStdin = stdin
+  oldStdout = stdout
+  oldStderr = stderr
+
+stdin = tty
+stdout = tty
+stderr = tty
+
 for i in 1..60:
   echo "\x1b[1A\x1b[K\x1b[1A"

@@ -9,4 +19,9 @@
   echo &"{prog} [ {leftBar}{rightBar} ]"
   sleep 25

+tty.close()
+stdin = oldStdin
+stdout = oldStdout
+stderr = oldStderr
+
 echo "/var/tmp/result.txt"

ttyで仮想端末を開き、stdin,stdout,stderrで上書きします。
echoは上書きされたstdoutのほうに出力します。
一連の処理が終わったらttyを閉じてしまい、上書き前のstdin,stdout,stderrで元に戻します。

このように変更を加えたプログラムmycmd2を実行してみます。
結果がわかりやすいようにnlを使います。

mycmd2.gif

最後の出力結果のみ、パイプ先のnlが処理するようにできました。
これで特定の出力だけパイプ先に渡せそうです。

実装例

まだ作りかけなのですが、今回得た知見を利用して
Nimでディレクトリツリーを表示するコマンドを作ってます。

https://github.com/jiro4989/dirsel

選択したファイルを最後に出力するので、あとはパイプ先でよしなに使ってくれ、というツールにしようかと。

dirsel.gif

以上です。

Alpine などの Bourne/Ash シェルで変数・環境変数が未定義か確認・判定する

$
0
0

変数の未定義チェックに Bashシェルの -vオプションを Bourneシェルで使うと、unknown operandエラーが発生する。

Alpine Linuxなどの Bourne系シェル(Ash)で変数や環境変数の未定義をチェックできないか

bourneシェル未定義確認」とググっても、Bashシェルの情報ばかりだったので、自分のググラビリティとして。

TL;DR

zオプションと、変数の代替代入を組み合わせる

VARが未定義か確認する
[-z"$VAR"]&&["${VAR:-A}"="${VAR-A}"]

TS;DR

確かに bashをインストールすればいいだけなのです。しかし、Docker での利用なので、なるべく余計なものを入れたくない(レイヤーを作りたくない)のです。

Docker コンテナ起動時にホストからコンテナに環境変数を渡す必要がある場合、必須の環境変数がセットされていないとエラーでコンテナが起動しないようにしたかったのです。

以下は Docker の Alpine Linux イメージで試しました。

Alpine3.10.2
~ #cat /etc/os-release
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.10.2
PRETTY_NAME="Alpine Linux v3.10"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://bugs.alpinelinux.org/"
shのバージョン(Bourneというより正確にはAsh)
~ # sh --helpBusyBox v1.30.1 (2019-06-12 17:51:55 UTC) multi-call binary.

Usage: sh [-/+OPTIONS] [-/+o OPT]... [-c 'SCRIPT' [ARG0 [ARGS]] / FILE [ARGS] / -s [ARGS]]

Unix shell interpreter
bashのバージョン(別途インストール)
~ # bash --versionGNU bash, version 5.0.0(1)-release (x86_64-alpine-linux-musl)
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

-vオプションの場合

サンプル・スクリプトの内容
~ # cat sample1.sh#!/bin/sh[-v HOGE ]||{echo'Not defined HOGE'exit 1
}echo'HOGE is defined with value:'$HOGE
環境変数を未定義でテスト
~ #unset HOGE
~ ## Bash シェルで実行(正常)~ # bash sample1.sh
Not defined HOGE

~ ## Bourne シェルで実行(エラー)~ # sh sample1.sh
sh: HOGE: unknown operand
Not defined HOGE
環境変数を定義してテスト
~ #export HOGE=FUGA
~ ## Bash シェルで実行(正常)~ # bash sample1.sh
HOGE is defined with value: FUGA

~ ## Bourne シェルで実行(エラー)~ # sh sample1.sh
sh: HOGE: unknown operand
Not defined HOGE
空の環境変数を定義してテスト
~ #export HOGE=''~ ## Bash シェルで実行(正常)~ # bash sample1.sh
HOGE is defined with value:

~ ## Bourne シェルで実行(エラー)~ # sh sample1.sh
sh: HOGE: unknown operand
Not defined HOGE

-zオプション

~ # cat sample2.sh#!/bin/sh[-z"$HOGE"]&&["${HOGE:-A}"="${HOGE-A}"]&&{echo'Not defined HOGE'exit 1
}echo'HOGE is defined with value:'$HOGE
同じように動いた
~ #unset HOGE
~ # bash sample2.sh
Not defined HOGE
~ # sh sample2.sh
Not defined HOGE

~ #export HOGE=''~ # bash sample2.sh
HOGE is defined with value:
~ # sh sample2.sh
HOGE is defined with value:

~ #export HOGE=FUGA
~ # bash sample2.sh
HOGE is defined with value: FUGA
~ # sh sample2.sh
HOGE is defined with value: FUGA

~ ## 🎉

参考文献

何も知らないエンジニア

$
0
0

はじめまして

この度、今までとまったく違う業種である
エンジニアとして勤め始めました

そんな自分が
ゼロから知り始めるとどうなるか
何を知っていくのかを残していきたいと思います。

cat 今はbashとシェルスクリプトを扱っていますが
>その2つの違いがまだ理解しきれていません
>と、そういうレベルです

シェルスクリプトとは
Unixなどのコマンドなどが
内部でまとまって入っており、
それらを記述することで
全体的に実行させることができる
ドキュメントファイルのようなもの

シェルスクリプトファイルは基本的に.shの拡張子
実際のコードを書く前に最初の一行目は
#!/bin/shを書き、システムにこれから
シェルスクリプトを書きますようと知らせる

ですよね!

  • bashはそれ以前に存在したBourneシェル(コマンド名は「sh」)の後継として開発され、その名称は “Bourne” (開発創始者の姓)と “Born Again” (「新生」の意)をかけたものとも言われる。コマンド構文など基本的な仕様はBourneシェルの上位互換となっており、古いコマンドやシェルスクリプトなどはそのまま実行できる。 http://e-words.jp/w/bash.html

教えて下さいね!

教えてくれますよね!

cat 心

マサカリを投げる

を覚えました


readを使用してwhileでループしている場合にうまく対話処理できないときは

$
0
0

環境

GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)

やりたいこと

  1. 対象のディレクトリ配下の空のディレクトリを検索し削除する。
  2. 空のディレクトリがある場合、毎回削除するか確認する。

結論

  • readを使用してwhileでループしている場合、while内で対話処理するreadは実行されない。
  • 対処方法としてforでループする。

対象コード変更前

PARA_DIR=`pwd`

find ${PARA_DIR}-type d -empty | while read TARGET_RMDIR;do
  echo"`$basename${TARGET_RMDIR}`を削除する場合yを入力してください。"read input  #ここで対話処理したいif["${input}"="y"];then
    rmdir${TARGET_RMDIR}fi
done
  • 実行結果
(空のディレクトリのパス)を削除する場合yを入力してください。

read inputに指定しているところで処理が止まってくれない。原因は既にwhileでreadを使用しており、標準入力がfind ${PARA_DIR} -type d -emptyの結果だけとなるため。readは二回使えない。

対象コード変更後

PARA_DIR=`pwd`TARGET_RMDIR=(`find ${PARA_DIR}-type d -empty`)for(( i = 0; i < ${#TARGET_RMDIR[@]}; i++ ))do
  echo"`basename${TARGET_RMDIR[i]}`を削除する場合yを入力してください。"read input
  if["${input}"="y"];then
    rmdir${TARGET_RMDIR[i]}fi
done
  • 実行結果
(空のディレクトリのパス[1])を削除する場合yを入力してください。
y #対話式で入力(空のディレクトリのパス[2])を削除する場合yを入力してください。
y #対話式で入力(空のディレクトリのパス[3])を削除する場合yを入力してください。
y #対話式で入力

あらかじめ削除対象のディレクトリを配列で保持し、for文でループする。

後からわかったこと

ディレクトリ削除をコンソールで確認するには以下でもいいことが判明。。。

rm-ri"$TARGET_RMDIR"< /dev/tty

やりたいことは達成できるけど、readを使用してwhileでループしている場合の対処としてこの記事は残します。

参考にさせていただいたサイト

https://oshiete.goo.ne.jp/qa/8511926.html

CLI の愚痴投稿ツールを作ってみた

$
0
0

愚痴投稿 CLI ツール guchi を作成しました

CLI から愚痴を吐くツールを作りました。ここ最近ストレス溜まってたのでね。。なお、愚痴は私が用意している以下ページ (というかただのテキスト) に吐かれます。
https://guchis.site/guchis

リポジトリは以下です。舐め腐ったツールですがよかったら使ってみてください。
https://github.com/daiching/guchi

動作確認は WSL (Ubuntu) と CentOS7 で実施しています。残念ながら Mac はわかりません (もし試した方がいて、動作報告していただけたら大変有り難いです!)

取得方法としては、以下でイケるはずです。

# 実行バイナリのみ$ wget https://github.com/daiching/guchi/raw/master/guchi
$ sudo chmod +x ./guchi
$ ./guchi

# go get する場合$ go get github.com/daiching/guchi
$ guchi

なお、操作感は以下の感じです。

# 投稿された愚痴を 10 件取得$ guchi

# 投稿された愚痴を X 件取得$ guchi -n X

# 愚痴を投稿する (何も指定しない場合、名前は Nanashi になります。)$ guchi <guchi>

# 愚痴を投稿者名指定で投稿する$ guchi -u<name> <guchi>

あとは config ファイルも設定できます

[~/.guchi]
# ~ ディレクトリ配下に .guchi ファイルを作ることでいつも使う名前が指定できます
Name=daiching

Go で CLI ツール作るの楽しいですねぇ。
サーバーサイドがちょっとあれなので、そのうちそっちもオープンにできたらいいと思います。

Cronの時間指定を@rebootにすると起動時実行できる

$
0
0

cronを使った定期実行ができるのは知っていたが、Raspberry piなんかを起動/再起動したタイミングで指定のプログラムを起動する方法はないんかなー?と思っていたらあったので個人的メモ。

Scheduling tasks with Cron

時間指定を* * * * *とかではなく @rebootにするだけで良いっぽい。

CronTabを作成してみる

$
0
0

Crontabとは

JOBを定期的に実行してくれるコマンドです。

登録方法

Cronの設定ファイルに記載することで実行してもらえます。
設定ファイルの起動は以下。

$ crontab -e

こちらを実行するとエディタが開かれるので、
一番下に実行したいコマンドを記載。
今回はShellScriptを記載し、それを定期実行するCronTabを設定しました。
なお、ShellScriptはchmodで権限を755にしておくこと。

*/5 **** ./home/vagrant/test.sh

Cron設定ファイルの記載方法

「時間 実行するコマンド」と記載します。
時間は左から「分 時間 日 月 曜日」で記載します。
時は24時間表記、曜日は0から6まで日曜日から土曜日までに対応し、さらに7はまた日曜に対応。
また、ワイルドカードの使用、間隔の指定が可能です。

書き方意味
00 8 1 * *毎月1日の8時に定期実行
*/1 * * * *毎分定期実行
00 12 * * * 1毎週月曜日に定期実行

登録されているCrontabの確認

Crontab -l で設定されたcrontabを確認可能。
なお、ユーザー毎に設定するものであるため、
各ユーザーの設定値を確認する場合は、

for user in$(cut-f1-d: /etc/passwd);do echo$user; crontab -u$user-l;done

で可能。

ほんとに実行されたよね?の確認。。

/var/log/cronに実行ログがある。
下に追記されているのでtailなどで見るのが手っ取り早い。

実行されてない場合の確認方法

ログ出力

Cron設定のコマンドにリダイレクトを書くだけです。

crontab -e
*/5 **** bash /home/vagrant/test.sh >> /home/vagrant/test.log 2>&1

>>でリダイレクトすれば追記してくれます。
なお、最後の2>&1は標準出力もエラー出力もする設定。
標準出力のみの場合はtest.sh 1> test.log
エラーのみでいい場合はtest.sh 2> error_test.log
とする。

結局は

Crontabに登録するコマンドを直叩きしてうまくいくかどうか確認して、
うまくいってからCrontabに登録するのが一番確実。
一行目のおまじない忘れとかスペース問題とかCrontabのログより気が付きやすいので。

bash /home/vagrant/test.sh >> /home/vagrant/test.log 2>&1

参考

crontabコマンドについてまとめました 【Linuxコマンド集】
cronのログを見よう
cronがうまく動かないときの調査

Bashでよく使うコマンドまとめ

$
0
0

普段あまり書く機会がなく、いざ書くとき結構忘れているのでまとめておく。

if

基本構文

条件式に指定されたコマンドの終了ステータスを判定し分岐を行う。
終了ステータスが0のときは真、それ以外は偽となる。

if 条件式1 ;then
  処理1
elif 条件式2 ;then
  処理2
else
  処理3
fi

本来条件式の後のthenは次の行に記載するが、
;をつけることで条件式と同一行に記載可能。

また、elseの後はthenは不要であり、
if文を閉じるにはfiが必要。

条件式

if文での条件式の評価にはtestコマンドを使用する。
testコマンドは比較の結果を0か1の終了ステータスで返すだけで、
メッセージ出力がないため、評価に特化したコマンドとなる。
test 引数の条件式と記載することが可能であるが、
[ 引数の条件式 ] と省略して記載が可能。
以降は省略形で記載する。
また、省略時カッコと条件式の間のスペースがマストのため、要注意。

逆に言うと条件式比較ではtestコマンドを使っているにすぎないので、
testコマンド以外を使うことも可能。

testにおける条件式は文字列の比較と数値の比較で記載方法が異なる。
それぞれ別でまとめる。

数値の比較

num1は条件式左の数字(testコマンドの第一引数)、num2は右(第二引数)である。

オプション数式的意味何の略か
-eqnum1 = num25 -eq 5equal
-nenum1 ≠ num25 -ne 5not equal
-ltnum1 < num25 -lt 6less than
-lenum1 ≦ num25 -le 6less than or equal
-gtnum1 > num25 -gt 4greater than
-genum1 ≧ num25 -ge 4greater than or equal
if[ 5 -eq 5 ];then
  echo"等しい"fi

文字列の比較

文字列においては、イコールが使用される。
なお、==ではないので注意。

オプション数式的意味
=string1 = string2"hoge" = "fuga"
!=string1 ≠ string2"hoge" != "fuga"
-zstring1 = ""(0文字ならば真)-z string1
-nstring1 ≠ ""(0文字でなければ真)-n string1
if["文字"="文字"];then
  echo"等しい"fi

AND,OR条件

AND,OR条件は2つの書き方が可能。
1つ目はtestコマンドのオプションを使って記載する方法
2つ目はbashコマンドを使って記載する方法

testコマンドのオプションを使う

testコマンドのオプションなので、
ひとつの[]内に記載が可能。
ただし、ぱっとみでわからないので視認性が下がるかも。
| オプション | 意味 | 例 |
|:-----------------:|:------------------:|:------------------:|
| -a | AND | 5 -a 5 |
| -o | OR | 5 -o 5 |

なお、優先順位は-oのほうが高いため、

[ 真 -o 偽 -a 偽 ]

の結果は真となる。
()で囲うことでグルーピングが可能だが、
その場合は必ず()をエスケープする必要がある。

bashコマンドを使う

条件式内のtest以外のbashコマンドを使用する。
具体的には以下
コマンド1 && コマンド2:1つ目の処理が成功した場合のみ、2つ目のコマンドが実行される。
コマンド1 || コマンド2:1つ目の処理が失敗した場合のみ、2つ目のコマンドが実行される。

上記のコマンド1と2をtestコマンドに置き換える形である。
[ 条件式1 ] || [ 条件式2 ]

なお、こちらの優先順位は前から評価されるため、

[ 真 ] || [ 偽 ] && [ 偽 ]

は真もしくは偽で真を判定したのち、真かつ偽の判定が実施され、
結果は偽となる。

$ [ a = a ] || [ b = bb ]  &&  [ c = cc ]; echo $?
1

逆に以下の場合は真である。

$ [ a = a ] && [ b = b ] || [ c = cc ]; echo $?
0

条件の否定

コマンド前に!をつけることで、
終了ステータスを反転させることが可能。(終了ステータスが0は1に、0以外は0にする)
!のあとは必ずスペースを入れること。

[ c = cc ]; echo $?
1
! [ c = cc ]; echo $?
0

testコマンドの引数でも可能。

[ !  c = cc ]; echo $?
0

配列

普段phpなどを書いていると、
bashの配列で,を使わないことを忘れがちなので一応メモ。

定義

空の配列を定義

array=()$ echo"${array}"# 何も表示されない

初期値ありの配列を定義

array=("a""b""c")echo${array[@]}
a b c
コマンドの結果を配列に格納
cd /home/hoge
ls
a.csv b.csv c

dirlist=(`ls-la /home/hoge | grep'*.csv'`)echo${dirlist[0]}
a.csv

値の追加

現在のarrayを入れて再定義するみたいなイメージ

array=("${array[@]}""d")echo${array[@]}
a b c d

値の取得

インデックス番号を指定でOK

echo${array[0]}
a

@で全要素表示

echo${array[@]}
a b c d

for

基本構文

for 繰り返し条件;do
    処理
done

初期値、ループ条件、ループ時の処理

鉄板パターンも記載可能。

max=10
for((i=0; i < $max; i++));do
    echo$idone

ファイルの中身を読み取り

for i in$(cat filetest.txt );do
  echo$idone

1
2
3
4
5
6
7
8
9

配列の中身を操作

array=(0 1 2 3 4 5 6 7 8 9)for i in${array[@]};do
  echo$idone

0
1
2
3
4
5
6
7
8
9

変数展開

シングルクォートとダブルクォート

変数などを文字列で展開するためには、
ダブルクォートを使用する。

echo"${var}"test"```シングルクォートだと展開されないので注意
```bash
echo '${var}'
${var}

mysqlへ接続し、結果をファイル出力

基本

セキュリティなどでINTO OUTFILEが使えない場合、
bashからリダイレクトさせて結果を取得する。
Passを変数に入れるとセキュリティ項目の設定次第ではエラーになるので、
その場合は設定を変えるかできないなら都度入力するようにする。
SQLは2行以上記載する場合はインデントを入れるとエラーになるので注意。

結果ファイルはtsv形式で格納される。

MYSQL_HOST='AAA'MYSQL_SCHEMA='DBname'MYSQL_ID='UserName'OUTPUT_FILE="test.tsv"SQL="SELECT *
FROM test
Where age > 30 ;"

mysql -h$MYSQL_HOST-u$MYSQL_ID-p-D$MYSQL_SCHEMA>${OUTPUT_FILE}<<EOF${SQL}EOF

結果を変数に格納

変数=$(コマンド)でコマンドの結果を変数に格納できる。
ただし、横方向に見ながらスペース区切りで挿入されるので、
2カラム以上を抽出する場合は使えなそう。
1カラムだけ取り出してその値をごにょごにょやるとかなら使えそう。

MYSQL_HOST='AAA'MYSQL_SCHEMA='DBname'MYSQL_ID='UserName'OUTPUT_FILE="test.tsv"SQL="SELECT *
FROM test
Where age > 30 ;"RESULT=$(mysql -h$MYSQL_HOST-u$MYSQL_ID-p-D$MYSQL_SCHEMA<<EOF${SQL}EOF
)

ヒアドキュメント

文字列をプログラムに埋め込むためのもので、
改行などもそのまま埋め込まれるので、
改行が必要なコマンドや、同じコマンドが連続する際に使用する。

echo"123"echo"123"echo"123"echo"ABC"echo"DEF"echo"GHI"

これを

cat<<EOD
123
456
789
ABC
DEF
GHI
EOD

こうできる。

レコード数の確認方法

wc -l ファイル名

タブ⇒カンマに変換

sedが便利。
grepを組み合わせれば該当フォルダをすべて置換など可能。

grep -l '\t' ./*.txt | xargs sed -i.bak -e 's/\t/,/1' 

参考

if文リファレンス
for一覧
Mysqlの結果を変数へ

macOS でZIP 圧縮した、複数のZIPファイルから __MACOSX と .DS_Store を一括して取り除く

$
0
0

macOS で Finder を使うと __MACOSX.DS_Storeなどのドットファイルが作成される。そのため macOS で ZIP 圧縮するとドットファイルが含まれる。
この ZIP ファイル を UNIX 環境や Window 環境で伸張すると不要なドットファイルのゴミファイルが発生する。
その防止策として、複数の ZIP ファイルから __MACOSX と .DS_Store を一括して取り除く shell のワンライナー。

ubuntu
$ cd ~/temp/zip
$ find .-type f -iregex".*\.zip$"-print0 | xargs -0-I{} zip --delete{}"*__MACOSX*""*.DS_Store"
macOS
$ cd ~/temp/zip
$ find -E.-type f -iregex".*\.zip$"-print0 | xargs -0-I{} zip --delete{}"*__MACOSX*""*.DS_Store"

参考資料
ZIPファイルから.DS_Store,.__MACOSXを取り除く
MacでZIPファイル圧縮したとき.DS_Storeを含めないようにする

ターミナル操作を超効率化する設定例集

$
0
0

はじめに

エンジニアの憧れ、ターミナル。
このターミナルを使いこなせば「なんかかっこいい」だけではなく、様々な作業を効率化することができます。

本記事では、普段ターミナル操作を効率化するために設定している内容を紹介します。

この記事を読むことで、ターミナルの魅力が伝わればと思います。

環境

  • macOS 10.15
  • zsh 5.7.1

注意

本記事では、各項目について細かな設定のやり方は載せていません。
詳細については、各々が個別に調査をお願いします。

ただし、シェルの設定はすべて GitHub の dotfilesリポジトリにありますので参考にしてください。

プロンプトのカスタマイズ

powerline-go

⭐️ コマンドを実行せずに必要な情報を得ることができ、作業効率が上がります。
⭐️ おしゃれな画面でやる気がアップします。

custom-prompt.png

通常、コマンドを入力するカーソルの手前にユーザー名やディレクトリ名、$記号などが組み合わさったプロンプトが表示されています。

このプロンプトは、環境変数 $PS1等を書き換えることで自由にカスタマイズできます。

Tmux

tmuxline.vim

⭐️ ひとつの画面を分割することで必要な情報を一度に得られます。
⭐️ 作業の論理的なグループごとにタブやセッションを切り替えることができます。

tmux.png

Tmux は、ひとつの画面を複数分割することができるソフトウェアです。
画面分割の他にも様々な機能がありますが、画面分割がメインかと思います (少なくとも自分は)。

iTerm のような画面分割機能を備えたソフトウェアもありますが、Linux サーバーを相手にするなど、Tmux が活躍する機会は多いと感じます。

コマンドの自動補完

zsh-autosuggestionsは、現在入力中のコマンドを履歴から検索して、前方一致するコマンドを自動入力してくれます。

⭐️ 長いコマンドを素早く入力できるようになります。
⭐️ 曖昧な記憶から完全なコマンドを得られます。

zsh-autosuggestions.gif

例えば、過去に git commitと実行したことがあったとして、今 gitと入力すると、後ろに薄い色でコマンドを補完してくれます。
さらに続けて git commit --のように追加で入力すると、自動的に最適な履歴へ置き換わります。

この機能は、前方一致させる必要があるという欠点があります。
そのため、実は曖昧なコマンドを思い出す用途で使うことはほとんどないです。
よく実行するコマンドをさらに素早く入力する目的で使用しています。

ファジー検索

zsh-autosuggestions

⭐️ 過去に入力したコマンドは、完全に記憶していなくともすべて引き出せます。

fuzzy-history.gif

zsh-autosuggestionsは、前方一致したコマンドをひとつだけ表示するものでした。
ファジー検索というものを使用すると、入力した文字列をベースに、過去の入力データから曖昧検索することができます。

パッケージをインストールする際に活用しています。

略語展開

zsh-abbrev-alias

⭐️ よく使うパイプ先のコマンドを素早く入力できます。

zsh-abbrev-alias.gif

キーワード FGNGLそれぞれに以下の文字列を割り当てています。
キーワードの直後にスペースを入力すると略語が展開されます。

  • FGN:find . -type d \( -name .git -o -name node_modules \) -prune -o -print
  • G:| grep --color=yes -Hn
  • L:| less

lessgrepxargsのようなよく使うパイプ先のコマンドを登録することが多いです。

ファジー UI + キーバインド

git-fuzzy-log

⭐️ 現在のコマンド入力を破棄せずに、まったく別の情報を確認できます。

git-fuzzy-log.gif

fzfベースの自作コマンドです。

コマンド入力中にショートカット (GGにバインドしています) を入力すると、Git のログが表示されます。
ESC で元の画面に戻ることができ、その際はコマンド入力を保持したままです。

git logに限らず、いくつかの操作をこのような「ファジー UI + キーバインド」形式で登録しています。
元のコマンド入力内容が破棄されないため、思考の流れを邪魔せずに作業できます。


macのデフォルトシェルをbashからzshに乗り換える

$
0
0

MacをCatalinaに上げてからターミナルを起動するたびに下記の文章が出るようになったので重い腰を上げてbashからzshに乗り換えることにしました。

The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.

'bash zsh mac'とかでググると似たような記事はたくさんありますが、この記事ではzshが入っている状態でbashからzshへの移行する手順を書いていきます。

手順

設定ファイルの準備

最初にbashの設定ファイルをzsh用にコピーします。
履歴が無くなったら作業効率がかなり悪くなるので忘れずコピーします。

cp -p .bash_profile .zprofile
cp -p .bashrc .zshrc
cp -p .bash_history .zsh_history

プロンプトを変更

- export PS1="\W:\$ "
+ export PROMPT="%{$fg[cyan]%}%c%{$reset_color%} %% "

プロンプトの文法が変わってるんですね。
元々カレントディレクトリだけ表示させていたので、そのままの仕様で移行しました。
変更ついでに色をつけてみたり、最後の記号はzshのデフォルトに合わせて%にしてみました。

この機会にもっとオシャレにならないかと思って世の中の人はどうしているのかググってみましたが2行プロンプトの記事が多くて自分の好みには合わなかったのでやめました。
↓が私の環境のキャプチャです(bash->zsh)。Simple is best!!
スクリーンショット 2019-11-07 17.21.33.png

tab保管

gitのtab保管やgcp-sdkの設定が壊れてしまったので修正。
zsh用の設定もすでにインストールされていたのでパスを変えるだけでした。

  • git
- if [ -f $(brew --prefix)/etc/bash_completion ]; then
-   . $(brew --prefix)/etc/bash_completion
- elif [ -f $(brew --prefix)/etc/bash_completion.d/git-completion.bash ]; then
-   . $(brew --prefix)/etc/bash_completion.d/git-completion.bash
- fi
+ fpath=($(brew --prefix)/share/zsh/site-functions $fpath)
+ autoload -U compinit
+ compinit -u
  • google cloud sdk
# The next line updates PATH for the Google Cloud SDK.
- if [ -f '/install/pass/google/google-cloud-sdk/path.bash.inc' ]; then . '/install/pass/google/google-cloud-sdk/path.bash.inc'; fi
+ if [ -f '/install/pass/google/google-cloud-sdk/path.zsh.inc' ]; then . '/install/pass/google/google-cloud-sdk/path.zsh.inc'; fi

# The next line enables shell command completion for gcloud.
- if [ -f '/install/pass/google/google-cloud-sdk/completion.bash.inc' ]; then . '/install/pass/google/google-cloud-sdk/completion.bash.inc'; fi
+ if [ -f '/install/pass/google/google-cloud-sdk/completion.zsh.inc' ]; then . '/install/pass/google/google-cloud-sdk/completion.zsh.inc'; fi

履歴検索

pecoとhistoryを使ってctrl+rの履歴検索をカスタマイズしていましたが動かなくなったので修正。
この対応で履歴検索がめちゃくちゃ高速なりました!頻繁に使うコマンドなのでもっと早くzshに移行すればよかった。。。

- peco-history() {
-     local NUM=$(history | wc -l)
-     local FIRST=$((-1*(NUM-1)))
-     if [ $FIRST -eq 0 ] ; then
-         history -d $((HISTCMD-1))
-         echo "No history" >&2
-         return
-     fi
-     local CMD=$(fc -l $FIRST | sort -k 2 -k 1nr | uniq -f 1 | sort -nr | sed -E 's/^[0-9]+[[:blank:]]+//' | peco | head -n 1)
-     if [ -n "$CMD" ] ; then
-         history -s $CMD
-         if type osascript > /dev/null 2>&1 ; then
-             (osascript -e 'tell application "System Events" to keystroke (ASCII character 30)' &)
-         fi
-     else
-         history -d $((HISTCMD-1))
-     fi
- bind -x '"\C-r":peco-history'
+ function peco-history-selection() {
+     BUFFER=`history -n 1 | tail -r  | awk '!a[$0]++' | peco`
+     CURSOR=$#BUFFER
+     zle reset-prompt
+ }
+ zle -N peco-history-selection
+ bindkey '^R' peco-history-selection

ペーストした時に色が反転する

zshにしてからターミナルに文字列を貼り付けると貼り付けた文字だけ色が反転するようになりました。bashだと同じ操作をしてもこのような挙動はしませんでした。
これは直し方がわからなかった。。。知っている方いたら教えてくださいmm
e.g. 'hogehoge'をペーストした場合、下記のようになります。
スクリーンショット 2019-11-07 18.05.37.png

その他

aliasや履歴検索以外のシンプルなfunctionは特に問題なく動きました。
そこまでゴリゴリにカスタマイズしていない人は結構すんなり移行できると思います。

新人向けチートシート: terminal

$
0
0

基本

cd <path> #pathに移動
cd - #移動前のpathに移動

pwd #ワーキングディレクトリのパスを表示
ls #カレントディレクトリの内容表示

mv <originalPath> <newPath> #ファイルを移動、名前変更
cp <originalPath> <newPath> #ファイルのコピー

find <path> --name "<pattern>" #pathの中からpatternにマッチするファイル・ディレクトリを表示 

rm <filePath> #ファイルを削除
rm -r <dirPath> #ディレクトリを削除

tar -zcvf <path>.tar.gz <path> #圧縮
tar --exclude <pattern> -zcvf <path>.tar.gz <path> #patternを除いて圧縮
tar -zxvf <filename> #展開

history #コマンドの入力履歴を確認

ファイルの中身を表示する

cat -n <path> #ファイルの中身を行数と表示する
tail -f <path> #ファイルの内容を入力を待ちながら表示(ログなどがリアルタイムで追加されることを確認したい場合)
vimdiff <path1> <path2> #ファイルの差分を確認する

vim <path> #ファイルをvimエディタで開く

補完系

<tab> #パスやコマンドの入力中にtabを押すと補完
<ctrl> + r #入力後に文字列を入れることでコマンド履歴から検索して補完

特定の文字列を含む文書検索・絞り込み

grep -R <pattern> <path> #<pattern>を含んだ行をpath内のファイル全て再帰的に検索
grep -A <number> #指定した行数、ヒットした行の後も表示(After)
grep -B <number> #指定した行数、ヒットした行の前も表示(Before)
grep -i #<pattern>の大文字小文字を無視(ignoreCase)
tail -f <fileName> | grep --line-buffered "<pattern>" #tailされる内容に対して、表示内容を絞りたい場合

プロセス管理系

ps -aux | grep <pattern> #パターンが含まれる起動中のプロセスを表示

kill <pid> #pidのプロセスを終了
kill -9 <pid> #pidのプロセスを強制終了

権限変更系

chmod -R <permission> <path> #path以下のフォルダ・ディレクトリの権限を再帰的に変更
chown -R <user>:<group> <path> #path以下のフォルダ・ディレクトリのuser, groupを再帰的に変更

新人向けチートシート

bash 使いが fish でスイスイ泳げるようになるまで (in Mac)

$
0
0

mac で fish の水槽(環境)整備。

気持ち

  • 最近、macOS 10.15 Catalinaでは デフォルトのシェルが bashから zshになったという記事をちらほら拝見しました。あまのじゃくな僕はこの機会に fishの環境を一通り整えてみることにしました。

  • fish に関しては、以前 この記事で入門をしたものの、「エンジニアは最初に見たシェルを親だと思って着いていく」という性質があるので、ずっと bashを使っていました。

  • 「一通り」とは言っても、独断と偏見で、こんな感じでいいでしょ と思うとこまでやった、という意味です。

  • 内容は以下の通りです。

  1. パッケージ管理ツールを入れる
    • fisher ( fisherman ) or oh-my-fish
  2. powerline
    • プロンプトが >Users>Name>Documents>hoge>みたいになるやつ
    • theme-bobthefishとかいうやつで実現できるらしい。
  3. peco
    • history検索便利ツール
  4. z
    • ディレクトリの history 検索便利ツール。

ちなみに現状はこんな感じです↓
スクリーンショット 2019-11-08 22.15.50.png

ディレクトリは CNN 研究用なのであまり気にしないでください..
ということで、順次導入していきます。

mac に fish を install

$ brew install fish

  • ちなみにバージョンは
~> fish --versionfish, version 3.0.2
  • /etc/shellsに fish を追記します。

    • 先に which fish で確認
$ which fish
/usr/local/bin/fish
  • この結果を /etc/shellsに追記します。

    • $ emacs /etc/shellsでもいいですし、
    • $ cat /usr/local/bin/fish >> /etc/shellsでもよいです。
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
/usr/local/bin/fish  # これを追記

デフォルトの shell を fish にするなら

  • $ chsh -s /usr/local/bin/fish

起動

  • ちなみに install 直後に fish を起動すると以下のような感じです
DaiMac:~ sudachi $ fish  # <= bash
Welcome to fish, the friendly interactive shell
sudachi@DaiMac ~># <= fish
  • colorize や conda 環境の設定などはなにもしていません。
    • ~>~の部分 (ディレクトリ表示部分) が緑なだけです。

設定ファイル

  • デフォルトでは 1つだけあるようです。
$ls .config/fish/
fish_variables
  • $ la, $ llなどが普通に (設定してないのに) 動く。
    • すげえ
  • $ lは動きませんでした。
    • 試しに、これを alias として登録してみましょう。
~> emacs ~/.config/fish/config.fish
-- 8<---- 8<---- 8<---- 8<---- 8<---- 8<---- 8<--
alias l 'ls -CF'  #これを追記
-- 8<---- 8<---- 8<---- 8<---- 8<---- 8<---- 8<--
~>source ~/.config/fish/config.fish
~> l
Downloads/    Desktop/    Documents/ ...
# OK うごきました!
  • 以下、度々出てくる -- 8<--は エディタのバッファを意味します。

1. package manager: fisher

(参考2より)

fish には oh-my-fish という fish のパッケージ管理フレームワークがあるのですが、古いとか著作権問題がどーのこーので停止してたとか結構ディスられてました。
そこで、Fisherman というプラグインマネージャーがいいということだったので Fishermanを導入してみることに

  • そのほか参考にさせていただいたサイトでも、概ね fisher(man)を install しているものが多かったので従おうと思います (長いものには巻かれろ)。

curl で落とします。

~> curl https://git.io/fisher --create-dirs-sLo ~/.config/fish/functions/fisher.fish
~>ls ~/.config/fish/
fish_variables functions  #<= functions/ が増えた。
  • 確認です。
~> fisher -vfisher version 3.2.9 ~/.config/fish/functions/fisher.fish
  • conf 下に配置するだけで使えるようになるみたいですね。

3. peco plugin

  • すみません順番が前後しますが先に pecoを入れます。

  • package の add (プラグインを入れている感じなのかな?)

~> fisher add oh-my-fish/plugin-peco
created new fishfile in ~/.config/fish/fishfile
fetching https://codeload.github.com/oh-my-fish/plugin-peco/tar.gz/master
linking ~/.config/fish/functions/peco_kill.fish
linking ~/.config/fish/functions/peco_select_history.fish
added 1 package in 0.55s
  • peco を用いた検索を Ctrl-rに割り当てます。

    • ちなみに bashでは Ctrl-rhistoryを後方検索するショートカットに割り当てられていますね。
    • pecoの設定をする前の fishで 同キーバインドを試して見ましたが、特に割り当てられていないようでなにも起こりませんでした。
  • ~/.config/fish/config.fishに設定を追記します。

~/.config/fish/config.fish
#peco
function fish_user_key_bindings
    bind \cr peco_select_history
end
  • これだけだと Ctrl-rした後に以下のような Error が出てしまいました。
~> fish: Unknown command peco
~/.config/fish/functions/peco_select_history.fish (line 8):
  history|peco $peco_flags|read foo
          ^
in function 'peco_select_history'
    called on standard input

  • brewで 本体にも pecoを入れる必要があるようです。
    • peco自体は fish関係なく、コマンド履歴とディレクトリ移動先の検索を行える tool として提供されているらしいです。

brew で peco をインストール

  • $ brew install pecoで取得できるらしい。
    • これも install したら Ctrl-rで実行できるようになりました!
    • pecoそのものと、 fishpluginが必要ということなのでしょうか..
      • ちなみに brewpecoを入れたわけですが、 bashでは Ctrl-rしても後方検索のままでした。
      • .bashrcなどに設定をかけば変わるかもしれませんね。

z をいれます。

  • z : 履歴からディレクトリへ移動ができるコマンドです。

  • 訪問履歴からディレクトリ移動候補を表示してくれます。

  • また、z {文字列}のように入力すると、履歴から一致するものを探して来てくれるようです。

インストール

  • ~> fisher add jethrokuan/z

    • ~> z pythonとかやると下に python 関連のプロジェクトのディレクトリが検索され、候補が出てきてくれるようになりました!
    • 選択後、z pathとなったら、Enterを押すと移動してくれるようです。

2. theme-bobthefish プラグインの導入

  • いよいよお待ちかね、powerlineに見えるアレを入れます。

    • コンソールの見た目をリッチにしてくれる上に、 gitの現在のブランチや差分状況をわかりやすく表示してくれる機能もあるので gitを使っている方ならぜひオススメしたいですね
    • ただし、 これを入れると、プロンプトをコピペした時に文字化けします。
      • 普段コンソールの入出力などのメモを取りながら作業をなさる方は注意です..
      • 以下、fishを用いていますがプロンプトは $を用います。

インストールです

  • ~> fisher add oh-my-fish/theme-bobthefish

    • インストール完了するとすぐに反映されますが文字化けする場合があります。
    • その場合は Powerline-fonts をインストールしましょう。
    • 以下に手順を載せます。

Powerline-fonts をインストール

  • どこでもいいので、powerline-fonts をダウンロードしましょう。
    • 僕は fish の設定ファイルの場所に適当にコピリました。
$cd ~/.config/fish
$ git clone https://github.com/powerline/fonts.git
$ l
config.fish    fish_variables    fonts/  #<=これが増えた
  • ダウンロード fonts/ディレクトリ下に移動し、インストールを実行します。
$cd fonts
$ ./install.sh
Copying fonts...
Resetting font cache, this may take a moment...
Powerline fonts installed to /Users/sudachi/Library/Fonts
  • install できれば、fonts/は用済みなので、いらなければ削除してしまいましょう。
$cd ../
$rm-rf ./fonts

次に terminal のフォントを powerline-font に変更します

  • 次に、terminaliTeam2にて、インストールした powerline-fontsを使うように設定します。

  • iTerm2使いの方

    • iTerm2 > Preferences > Profiles > Text > Fontから
    • Literation Mono Powerlineを選択しましょう。
    • ここです↓
      スクリーンショット 2019-11-08 23.03.08.png

      • と、参考には書いてあったのですが.....
      • ubuntu Mono derivative Powerlineという Font がある!!
      • メイン武器が ubuntuなこともありますが ubuntuの Font 案外好きなんですよね。
      • これにしても問題なかったのでこれにしてみました!! かわいい!!
      • そして、なんか心なしか文字が小さくなった気がする..ので 12 -> 14に変更
  • terminal.app (デフォルトのやつ) をお使いの方

    • 環境設定 > プロファイル > テキスト > フォントで設定できます。
    • ここ ↓ から同様の手順で変更してください。

スクリーンショット 2019-11-08 23.05.15.png

ブランチ名が表示されていない場合

  • 文字化けが解消されたが、現在のブランチ名が出てきませんでした。

    • その場合は、config.fishに 以下をを追記して再読み込みすることで表示されるようになります。
~/.config/fish/config.fish
set -g theme_display_git_master_branch yes
$source ~/.config/fish/config.fish

optional な設定

  • ディレクトリを省略したくない場合
    • デフォルトでは、以下のようにカレントディレクトリ以外は省略されています。
~/D/p/0/cnn >> master >
# 本当は ~/Documents/python/020_AI/cnn (master)
  • 省略させたくない場合は config.fishに以下を追記しましょう。
~/.config/fish/config.fish
set -g fish_prompt_pwd_dir_length 0
  • 更新をお忘れなく..
$source ~/.config/fish/config.fish

以下、僕が config.fishに追記した内容です

  • promptnew lineで実行するように変更
~/.config/fish/config.fish
set -g theme_newline_cursor yes
  • 時刻を表示しないように設定
~/.config/fish/config.fish
set -g theme_display_date no
  • コマンド実行時間の非表示
~/.config/fish/config.fish
set -g theme_display_cmd_duration no

anaconda path を通す

  • python を使って画像認識の研究をしているので、anaconda を使いたいです。

  • 現状

$ which python
/usr/bin/python  #デフォルトで入っている 2系のやつ

pyenv

  • 僕の anaconda は pyenvの上で動いているので、先に pyenvを通します。
    • 以下の path を config.fishに追加
-- 8<---- 8<---- 8<---- 8<---- 8<---- 8<--
set PATH $HOME/.pyenv $PATHeval (pyenv init - | source)
-- 8<---- 8<---- 8<---- 8<---- 8<---- 8<--

$ python --versionPython 3.6.5 :: Anaconda, Inc.  #お??
$ which python
/Users/sudachi/.pyenv/shims/python  #通った..のかな??

anaconda

  • 上記の path を通すと、なぜかすぐに condaが使えるようになりました。
$ conda -Vconda 4.6.14

$ conda activate
CommandNotFoundError:

$ conda init fish
$ conda activate  # <= できない??
  • condaは使えるようになりましたが、conda activateなどが使えない場合は以下を config.fishに追記します。
-- 8<---- 8<---- 8<---- 8<---- 8<---- 8<--
set -x PATH $PATH "$PYENV_ROOT/bin"status --is-interactive; and .(pyenv init - | psub)
source (conda info --root)/etc/fish/conf.d/conda.fish
-- 8<---- 8<---- 8<---- 8<---- 8<---- 8<--

$source ~/.config/fish/config.fish 
$ conda -Vconda 4.6.14

$ conda activate
$(base)$ which python                                             (base)/Users/sudachi/.pyenv/versions/anaconda3-5.2.0/bin/python

$ conda activate dataflow                              (base)$ which python                                         (dataflow)/Users/sudachi/.pyenv/versions/anaconda3-5.2.0/envs/dataflow/bin/python

$ python --version(dataflow)Python 2.7.16 :: Anaconda, Inc.
  • ubuntu に fish 入れた時も思いましたが、その末尾に出るスタイルは変わらないんだ..って感じです。

最終的に..

  • うちの fish はこんな感じにすくすく成長しました↓

スクリーンショット 2019-11-08 19.38.35.png

一応設定ファイルも晒しておきます。

~/.config/fish/config.fish
# ----------
# peco config
# ----------
set fish_plugins theme peco

function fish_user_key_bindings
  bind \cr peco_select_history # Bind for prco history to Ctrl+r
end

# ----------
# bobthefish config
# ----------
set -g fish_prompt_pwd_dir_length 0  # ディレクトリ省略しない
set -g theme_newline_cursor yes  # プロンプトを改行した先に設ける
set -g theme_display_git_master_branch yes  # git の branch 名を表示
set -g theme_color_scheme dracula
set -g theme_display_date no  # 時刻を表示しないように設定
set -g theme_display_cmd_duration no  # コマンド実行時間の非表示


# ----------
# python
# ----------
set -gx PYENV_ROOT "$HOME/.pyenv"
set -x PATH $PATH "$PYENV_ROOT/bin"
status --is-interactive; and . (pyenv init - | psub)

source (conda info --root)/etc/fish/conf.d/conda.fish

# ----------
# node.js
# ----------
set -x PATH $HOME/.nodebrew/current/bin $PATH

# ----------
# alias
# ----------
alias l 'ls -CF'
  • gitcondaを使い始めるといきなりコンソールが騒がしい感じになりますが、これで fishを運用する準備は整ったと思います。

  • さあ、遊ぶぞ~

参考です。お世話になりました。

  1. fish shell の導入方法と使い方まとめ
  2. 【fish】ターミナル環境をかっこよくしてみた話
  3. 詳解 fish
  4. fish shell を使いたい人生だった
  5. powerline font
  6. bobthefish 各種設定
  7. pyenv path
  8. conda activate

小説家になろうの活動報告欄でアンケート取ってる人が居たので集計してみた話

$
0
0

ざっくり手順

1.コメントをごっそりhtmlとして保存する
2.コメント本文だけを抜き出す
3.集計

1.コメントをごっそりhtmlとして保存する

url一覧を作ってチョメチョメしてwgetでDL
具体的には

download.sh
#!/bin/bashcat urllist.txt | perl -lne'for($i=1;$i<=10;$i++){print $_."index.php?p=".$i}'> urllist2.txt
# wget -i urllist2.txt# アクセス過剰で503で死んだので適当にスリープwhile read line
do
  wget $linesleep 10
done< urllist2.txt

urllist.txtには改行区切りで投票やってる活動報告個別ページurlを記載
作業用にurllist2.txtが出力される。
index.phpp=[0-9]なファイル名で結果が出力されるので適当にディレクトリに纏める。

2.コメント本文だけを抜き出す

タグからコメント部分だけをブチ抜く。
コメント部分の開始終了タグが分かりやすかったのでその辺を目印に適当に

getcomment.pl
opendir(DIR,"resultfiles");@file=readdir(DIR);closedir(DIR);openOUT,">./results.txt";foreach$file(@file){;openIN,"./resultfiles/$file";$flg=0;while($line=<IN>){print"$flg";if($line=~/<div id="blog_comment">/){$flg=1;}if($line=~/<\!\-\-blog_comment\-\->/){$flg=0;}if($flg==1){$line=~s/\<.*?\>//g;printOUT$line;}}}

3.集計
sortしてuniq

cat results.txt|sort|uniq -c> allresult.txt

表記揺れとかアホほどあったのでそこは適当にガシガシ編集する感じで。
投票にgoogle formとかのアンケ機能素直に使ったほうが集計作業は楽だったんじゃないかと思いました。まる

ディストリビューションをスクリプトで分ける(os-releaseの値について)

$
0
0

とりあえずコード

if[[-f /etc/os-release ]];then
    source /usr/lib/os-release
    case$IDin
        debian )echo"Debian";;
        ubuntu )echo"Ubuntu";;arch)echo"ArchLinux";;
          rhel )echo"Red Hat Enterprise Linux";;
        centos ) echp "CentOS";;
        fedora )echo"Fedora";;
      opensuse )echo"OpenSUSE";;*)echo"Other";;esacelse
    echo"/etc/os-release is not exist."fi

解説

ほとんどのLinuxディストリビューションには/etc/os-releaseというディストリビューションごとの内容を表示したファイルがあります。
これをsourceで読み込み、IDという変数に「〜〜系」のディストリビューションというのが載っています。
この部分のIDをcaseで分けています。
IDという変数を変えることで様々な分類分けができます。

よくある値

今回はDebianを例に見ていきます。

PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

PRETTY_NAME

ディストリビューションの固有名です。
バージョンやコードネームなど一般向けの正式名です。
スクリプトではあまり使用しないですね。(パターンが多すぎるため)

NAME

ディストリビューションの総称です。バージョン名は含まれていない場合が多いです。
スクリプトで使うのはIDやID_LIKE、VERSION_IDくらいですかね。

VERSION_ID

バージョン情報です。コードネームなどは無く、数字だけの場合が多いです。

VERSION

コードネームなども含めたバージョン情報です。

ID

ディストリビューションのIDです。NAMEと似たようなものですが、スクリプト向けに簡略化されています。

ID_LIKE

Debianにはありませんが他の殆どのディストリビューションにあります。
互換性のあるディストリビューションや大本のディストリビューションのIDが書かれています。

例:ManjaroではID_LINE=arch、UbuntuではID_LIKE=Debianなど

HOME_URL

ディストリビューションの公式サイトです。

SUPPORT_URL

サポートページのURLです。フォーラムなどへのリンクの場合もあります。

BUG_REPORT_URL

バグレポートページへのURLです。フォーラムなどへのリンクの場合もあります。

参考記事

Linuxのバージョンの確認方法
各ディストリビューションのos-releaseの値が書いてあったので助かりました。

Viewing all 2889 articles
Browse latest View live