20191211のLinuxに関する記事は8件です。

dotfilesの育て方

dotfilesを育てよう!

dotfilesはエンジニア人生と切っても切れない関係です。
そんなdotfilesを理想の形に育てていく方法について紹介したいと思います。


dotfilesとは
.(ドット)から始まるファイルの総称です。
Unix系OSでは.から始まるファイルは隠しファイルとして扱われ、lsコマンド等にはオプションを指定しないと表示されない仕組みになっています1
古来より、この特徴を利用して、ホームディレクトリ直下に.から始まる設定ファイルを配置するという文化があります。
例えば、筆者のホームディレクトリでlsを実行した場合、下記のような出力となります。dotfiles01.png
隠しファイルも表示する-aオプションを加えて実行した結果は下記のようになります。
dotfiles02.png
.で始まるファイルが大量に表示されています。
要はこれらがdotfilesです。

Lv.1 Gitで管理しよう

まずは最初の一歩として、dotfilesをGit管理するところから始めましょう。
履歴管理やポータビリティの向上等様々な恩恵があります。(草を生やせたりも)

dotfilesというリポジトリを作成し、.bashrc等の各種dotfilesをリポジトリ配下にコミットします。
ホームディレクトリにはlnコマンドを用いてシンボリックリンクで配置します。
シンボリックリンクを作成することで、リポジトリ内のファイルで一元管理できるため、更新や最新化が簡単にできるようになります。

.bashrcのシンボリックリンク作成の例
# リンクの作成
$ cd path/to/dotfiles
$ ln -s .bashrc ~/.bashrc

# リンクを確認
$ ls -l ~/.bashrc
lrwxrwxrwx 1 reireias reireias 59  6月  8 22:30 /home/reireias/.bashrc -> /home/reireias/dev/src/github.com/reireias/dotfiles/.bashrc

なお、GitHubでは実に多くのdotfilesリポジトリが公開されています。
https://github.com/topics/dotfiles

ちなみに、AWS_ACCESS_KEY_ID等の認証情報が公開されてしまわないように注意しましょう

Lv.2 deployを簡単にしよう

シンボリックリンクの作成は、その環境に対して1度しか実施しませんが、対象となるdotfileが増えれば、その作業も効率化したくなるのがエンジニアの性というものです。

簡単なshell scriptで実装することができます。
shell script以外で実装してもよいのですが、クリーンな環境にインストールする際に依存するパッケージが少ないほど楽なので、大抵の環境で利用できるshell scriptがよく採用されています。

以下のスクリプトでは、dotfilesリポジトリ直下の.ではじまるファイル全てのシンボリックリンクをホームディレクトリに作成します。

install.sh
#!/bin/bash -e

IGNORE_PATTERN="^\.(git|travis)"

echo "Create dotfile links."
for dotfile in .??*; do
    [[ $dotfile =~ $IGNORE_PATTERN ]] && continue
    ln -snfv "$(pwd)/$dotfile" "$HOME/$dotfile"
done
echo "Success"

Lv.3 インストールスクリプトを書こう

dotfileによっては、パッケージやライブラリのインストールが必要となるものもあるでしょう。

例えば、

  • .tmux.confがあるので、tmuxをインストールしたい
  • pecoコマンドを利用する自作関数が.bashrcに定義してある
  • vimの特定のプラグインがpythonのライブラリに依存している

等があげられます。

はじめのうちはREADMEに依存パッケージの一覧を記載したりしているでしょう。
やっぱり自動化するのがエンジニアですね。

例えばshell scriptであれば下記のようにシンプルにコマンドを列挙していくだけでも、立派なインストールスクリプトになります。

インストールスクリプトの一例
#!/bin/bash

brew install tmux peco neovim
pip install neovim

Lv.4 インストールスクリプトの冪等性を意識しよう

冪等性を意識したインストールスクリプトにしてみましょう。
何度実行しても同じ結果になるようにすることで、新たにインストールスクリプトで行う処理を追加した場合でも既存の環境に対してインストールスクリプトを実行することが可能です。

簡単な例を下記に示します。

# 冪等性なし
mv config /etc/hoge/config
echo "some setting" >> ~/.hogerc

# 冪等性あり
cp config /etc/hoge/config
if ! grep -q "^some setting$" ~/.hogerc; then
  echo "some setting" >> ~/.hogerc
fi

インストールスクリプトが大きくなるほど、冪等性をshell scriptで担保するのは難しくなってくるので、AnsibleChef等の構成管理ツールを使ってインストールスクリプトを記述するのも良い選択と言えるでしょう。

ただ、shell script以外のツールを利用し始めると、まっさらな環境にインストールする際の手順が多少増えてしまうので、注意が必要です。

Lv.5 CIをまわそう

猫も杓子もCIな世の中です。
dotfilesにおいてもCIを回しましょう。

インストールするパッケージやライブラリのバージョンを指定せず、最新版をインストールするようなスクリプトの場合、非互換な更新によりインストールスクリプトが失敗するようになることもあるでしょう。
インストールスクリプトの実行や適切にファイルが配置されたか等を確認するのがよいでしょう。

GitHub Actionsでのごくごくシンプルなサンプルコードを記載しておきます。

.github/workflows/main.yml
---
name: main

on: [push]

jobs:
  main:
    runs-on: ubuntu-latest # or macOS-latest
    steps:
      - uses: actions/checkout@v1
      - name: install dotfiles
        run: bash install.sh
      - name: test
        run: # some tests

Lv.6 ファイルを分割しよう

dotfilesが順調に成長していくと、.bashrc(.zshrc)や.vimrcなんかはかなり巨大になっていきます。
巨大な1ファイルは条件反射で悪とみなすのがエンジニアの常なので、なんとか分割したいものです。

幸い、.bashrc.vimrc等は別ファイルを読み込む機能を搭載しているので、分割が容易です。

例えば以下のように.bashrcから別ファイルを読み込むことができます。

.bashrc
source ${HOME}/.bash/keybind.sh
source ${HOME}/.bash/alias.sh

Lv.7 READMEを整備しよう

dotfilesは人に見られることでも成長します(?)
READMEを整備し、イケてるdotfilesリポジトリに仕立てましょう。

個人的には以下が記載されていると、パクリたく参考にしたくなります。

  • 対象のエディタ、shell、ツール
  • ターミナルのスクリーンショット
  • コンセプト
  • 依存するパッケージやライブラリ

番外編 様々な環境に対応しよう

LinuxとMac OSの両方を利用することのある変態珍しい人は、両方の環境に対応した設定やインストールスクリプトを用意すると幸せになれるのではないでしょうか?
CIもマトリックスビルド等を活用し、LinuxとMac OSの両方の環境で実行するとよいでしょう。

ちなみに、筆者は最近、AnsibleでLinuxのaptとMac OSのbrewをwhenによる分岐を利用せずに書く方法がなくて困っています。

さいごに

じゃあ、お前のdotfilesはどうなんだよ?と言われそうなので、いちおう掲載しておきます。
そんなに期待しないでくださいね。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Friendly ArmのZeroPiでsambaを使ってファイルサーバを立てる【購入品編】

初めに

Qiita初投稿です。

業務の中で説明能力の不足を感じ、とりあえずアウトプットの機会を増やそうというのが理由で始めました。

定期的に書きたいとこですが、三日坊主の可能性が高いです。気楽にいこうと思います。

あんまり長々せずに、細かく刻むスタイルにしようかと思いますので、
今回は部材の購入品編です。

今後は

  • 個人輸入編
  • OSインストール編
  • samba設定編

でしょうか。

今回の目的

10年前に初自作で組んだ初代メイン機のセカンドHDDにあるデータに、未だにアクセスする機会があります。

ただ、

  • いまだにブートドライブがHDDで起動が遅い
  • サーバとしてつけっぱにするには消費電力が気になる(intel i7 860)
  • ミドルタワーが地味に邪魔

という課題があります。

よって、セカンドHDDを取り出してNAS化する、というのが今回の目的になります。

…というのは嘘で、「安くて面白そう」と、とりあえず買ったZeroPiの用途がたまたまここに落ち着いただけです。

購入品

ZeroPi

中国・シンセンのSBCメーカ、FriendlyElec社のボードになります。
https://www.friendlyarm.com/index.php?route=product/product&product_id=266

  • 1GbpsのLANポート
  • 小さい(40mm角)
  • 安い (ボードのみで$12.99≒¥1,500)
  • ケースも一緒に出てる、かつ安い ($3)

というのに惹かれて購入しました。
ただグラフィック出力がないので、linux、コマンドライン、sshなどのキーワードがわかる人でないと少しつらいかもしれません。続編で説明しようと思います。

詳細は下記の記事をご覧ください。
https://gadgetrip.jp/2019/09/friendlyelec_zeropi/
私はこの記事を見て購入を決めました。

周辺機器

ほかにamazonでちょこちょこ必要なものを買いました。
最近は良くわからないメーカありすぎ問題が起きていますので、
amazon発送・販売のものを選んでおけばいいのではと思います。

  • MicroSD 32GB
  • Ethernetケーブル Cat6 1m
  • Microカードリーダ

あとは流用品として下記のものも使っています。

  • 3.5inch HDD 3TB
  • 3.5inch HDDケース USB2.0 外部電源つき

ZeroPi君のLANが100Mbpsですので、480MbpsのUSB2.0で十分です。
よく見たら1Gbpsやったあっれえ…というかそもそも1Gbpsでるから買ったんじゃなかったっけ…まあそのうち変えよう…

所感

  • NASとかファイルサーバとか表記の揺らぎが気になる
  • 買うだけ買ってあまり使ってなかったrealforceのキーボードがやっぱ打ちやすい
  • 書くの時間かかる
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CentOSを使って画像から文字起こしするためにTess4J用にTesseractをコンパイルする

必要なもの

VirtualBox(やっぱり、javaって素晴らしい。)
CentOS6.3 ( iso ) のディスクイメージ (渋い)

仮想環境

  • RAM 8GB
  • ストレージ 40GB

手順

VMをセッティング

最初に構築のTestをするか聞いてくるが、テストはスキップすること。なぜか次に進めなくなるので。
後は、そのまま進める。Desktopバージョンで、全部入りでインストールする。

インターネットの設定

最初はnetが繋がらないので設定。
ターミナル起動して、スーパーユーザ切り替え

su - 

以下のファイルをviでいじる。(iで挿入モード、escでエスケープして、:wq!で上書き)

vi /etc/sysconfig/network-scripts/ifcfg-eth0

ONBOOT=yes #noをyesに変更

サービスをリスタート。

service netowrk restart

FireFoxが繋がるか確認して、つながればOK。
(ハードウェアによっては、ドライバーのインストール必要。)

その他のアップデート

ターミナルを起動して、
スーパーユーザ切り替え

su - 

アップデート

yum update

javaを1.8にアップグレード(develバージョンで)

# javacにもパス通るから。
yum install java-1.8.0-openjdk-devel

Eclipse Neon

eclipse neonをインストール(これ以上だと描画系ライブラリでバージョンエラー)
https://www.eclipse.org/downloads/packages/release/neon/3

Mavenプロジェクトで、tess4jを使ことを前提としています。

開発ツールをインストールして、tesseractをコンパイル

開発ツール(gccは4.7以上が必要)

# 開発ツール
yum -y groupinstall "development tools"
# 周辺ライブラリ
yum -y install libpng-devel libtiff-devel libjpeg-devel
# コンパイルに必要なツール
yum -y install centos-release-scl
# コンパイラー
yum -y install devtoolset-7-gcc-c++

インスコした環境を有効にする

これは環境設定ファイルに設定しない限り、毎回ターミナルで実行が必要。

source /opt/rh/devtoolset-7/enable

コンパイルに必要なツールのインストール

cd /usr/src/
wget http://ftpmirror.gnu.org/autoconf-archive/autoconf-archive-2019.01.06.tar.xz
tar xvvfJ autoconf-archive-2019.01.06.tar.xz
cd autoconf-archive-2019.01.06/
./configure --prefix=/usr
make
make install

Tesseractの画像処理プログラムをコンパイル、インストール。

cd /usr/src/
wget http://leptonica.org/source/leptonica-1.77.0.tar.gz
tar xvvfz leptonica-1.77.0.tar.gz
cd leptonica-1.77.0/
./configure --prefix=/usr/local/
make
make install

Tesseractをコンパイル、インストール

今回は4.1.1-rc2

cd /usr/src/
wget https://github.com/tesseract-ocr/tesseract/archive/4.1.1-rc2.tar.gz
tar xvvfz 4.1.1-rc2.tar.gz # なぜかtesseract名が抜けてる笑。このバージョンだけ。
cd tesseract-4.1.1-rc2 
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
./autogen.sh
./configure --prefix=/usr/local/ --with-extra-libraries=/usr/local/lib/ --disable-openmp
make install

無事に終わったら、/usr/local/lib/に全部できているので、
「linux-x86-64」フォルダを好きな場所に作り、
この中にコピー。
cp file file... dir

これをeclipseのtesseractを使うプロジェクトのsrc/main/resourcesフォルダ直下にコピー

Eclipseをターミナルから起動する

まず、なんだかlocaleを設定する。(https://github.com/nguyenq/tess4j/issues/105)

export LC_ALL=C

この状態で、eclipseの起動ファイルパスをターミナルに打ち込んで、起動。

ソフトウェアのリリース

自分で作ったjavaプログラムをコンパイルできたら、
jarと、tessdataフォルダと、コンパイル済みの「linux-x86-64」フォルダを同梱する。

同様の環境でターミナルでテストするときは、
export LC_ALL=Cしてから、
コマンド。

以上。

はまったところ

・コンパイル時、openmpのリンカーエラーを避けるために、オプションを追加する。(https://github.com/tesseract-ocr/tesseract/issues/2323)
・linux-x86-64フォルダを作り、中にコンパイル済みのファイルを全部入れて、これをプロジェクトフォルダ直下ではなく、リソースフォルダにコピーしないとだめ。
・(上記の方法だと)tesseractライブラリをコンパイルするときは毎回ターミナルで「source /opt/rh/devtoolset-7/enable」が必要
・localeコマンドで「export LC_ALL=C」(※設定ファイルに記録すればいいんですが)してから、そのままターミナルでeclipse起動。

Reference

Visionary Imaging Services, Inc.
Tatsuaki Kobayashi

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker "Cannot connect to the Docker daemon. Is the docker daemon running on this host?"

docker ps
docker info
何を打ってもこれがかえってくる・・・

ぐぐろう

結構あるあるなエラー文なのでしょうか、たくさん解決方法が出てきますよね

ちなみに
systemctl status docker
でDockerが起動していることは確認済み

代表的な解決策は以下でした
- rootで実行 or dockergroupを作成しユーザーを追加
- OS再起動
- Docker入れ直し

そもそもrootで実行しているし、OS再起動も効果なし
諸事情によりDockerの入れ直しはできない

はて・・・

この前、どんな操作したっけ・・・

そう、記憶を辿ると、/etc/sysconfig/dockerを編集していました
それを反映させるためにsystemctl restart dockerを行ったら先ほどの状態になったのです
ということは変更内容が何か悪さをしているんだな

そういえば、APIを受け付けるDockerソケットを設定したのでした
/etc/sysconfig/docker

OPTIONS='--selinux-enabled -H tcp://0.0.0.0:4242 --log-driver=journald'

ソケットを設定した後は、オプションでdaemonと接続するソケットを指定してdockerコマンドを実行しないと思うように動作してくれないようです
http://docs.docker.jp/v1.11/engine/reference/commandline/cli.html

ちゃんと指定してあげると・・・

[root@docker ~]# docker -H=tcp://127.0.0.1:4242 ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

解決〜〜!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

SSH接続時、初回確認メッセージを出さないようにするAnsibleロール

このエントリは Ansible 3 Advent Calendar 2019の11日目の投稿です。
ちょうど空いていたので、書いてみました。

この記事の内容

  • SSH初回接続時の確認メッセージを、出さないようにAnsibleで設定する

前提

  • 特定のホストへのSSH接続時のみ、確認メッセージを出さないようにしたい
  • ホストA、ホストBがあると仮定し、A -> BへSSH接続する
  • Ansibleを実行するクライアントは、A、BどちらへもSSH接続できる前提
  • StrictHostKeyCheckingの設定はいじらない

実装方法

  • Aのknown_hostsにBの公開鍵情報を直接記載する
  • Ansibleのknown_hostsモジュールを使う

コード

main.yml
# vars:
#     - ssh_host_and_user:
#         - from:
#             user: vagrant
#             host: A
#           to:
#             user: root
#             host: B

# ホストBのrootユーザの公開鍵を、変数に格納する
- name: Copy public key to variable
  slurp:
    src: "{{ ROOT_PUBLIC_KEY_HOST_B }}"
  with_items: "{{ ssh_host_and_user }}"
  register: to_host_public_key
  when: item.to.host == inventory_hostname

# ホストAの,任意ユーザのホームディレクトリを取得する
- name: Get home direcotry of from.user
  shell: |
    set -o pipefail
    egrep "^{{ item.from.user }}:" /etc/passwd | awk -F: '{ print $6 }'
  register: from_user_home_directory
  with_items: "{{ ssh_host_and_user }}"
  changed_when: false
  failed_when: from_user_home_directory.rc != 0
  when: item.from.host == inventory_hostname

# ホストBのrootユーザの公開鍵を、ホストAのknown_hostsへ書き込む
- name: Add Host B infomation to known_hosts in Host A
  become: item.from.user
  known_hosts:
    key: "{{ item.to.host }}
          {{ hostvars[item.to.host].to_host_public_key.results[0].content | b64decode }}"
    name: "{{ item.to.host }}"
    path: "{{ hostvars[item.from.host].from_user_home_directory.results[my_idx].stdout }}/.ssh/known_hosts"
    state: present
  with_items: "{{ ssh_host_and_user }}"
  loop_control:
    index_var: my_idx
  when: item.from.host == inventory_hostname


終わりに

known_hostsモジュールを使って、SSH初回確認メッセージを出さないように処理を書いてみました。
- 特定のホストへSSH接続するときのみ、確認メッセージを出さないようにできた
- 場合によっては、StrictHostKeyCheckingの設定をいじったほうが便利かもしれない

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

VBScript互換な自作言語 OpenVBS

OpenVBSとは?

これはモダンなBASICスクリプトエンジン、自作のJujubeコアを搭載し macOS, Linux, Windows に対応している。VBScriptと互換性があり、モダンな機能達が拡張されている。クラシカルなASPを実行するためのHTTPサーバも提供されており、macOSやLinux上でASPを実行可能である。

特徴

  • VBScript互換
    • 既存スクリプトは無編集で実行可能が目標
  • JSONに対応
    • 配列:"[]"や連想配列:"{}"を オブジェクト<->文字列 変換可能
  • クロージャに対応
    • クロージャを用いたオブジェクト表現可能
  • 役割別"="演算子に対応
    • "=" // 自動
    • ":=" // 常に代入
    • "==" // 常に比較
  • 関数の引数省略に対応
    • デフォルト引数指定により可変個引数可能
  • Returnステートメントに対応
    • return 123
  • エラーハンドリングに対応
    • "On Error GoTo Catch", "On Error Catch" の追加
  • 三項演算に対応
    • n = If i<100 Then i Else 100 End If
  • 変数の宣言時初期化に対応
    • Dim x = 0
  • 64bitに対応
    • 整数型は64bit、CLnglngの追加
  • Optional Chaining に対応
    • obj?.method()
  • Nullish Coalescing に対応
    • x = obj ?? errobj
  • "==="演算子に対応
    • if obj === "" then obj:=empty end if
  • "set" や "call" ステートメントの不要
    • あっても無視される
  • ソースコードUTF8に対応
    • 変数や関数やクラスなど、日本語命名可能
  • Classic-ASPに対応
    • HTTPサーバとASPレイヤを OpenASP.so にて提供
  • so(dll)拡張に対応
    • 多言語のライブラリも呼び出し可能

使い方

$ oscript sample.obs
 $ echo "wscript.echo 123" | ./oscript

ダウンロード / ソースコード

OpenVBS - The Script Engine for the BASIC-2020 -

サンプル - 互換性

The_"hello_world"
WScript.Echo "Hello World!"
COMオブジェクトの作成
obj = CreateObject("Scripting.Dictionary")
VBSグローバル関数
str = Trim("   A Script Engine  ")
Classスタイルのオブジェクト
Class Animal
  Dim wing
  Function fly()
    return wing
  End Function
End Class

サンプル - 拡張機能

Dim時_初期化
Dim v = 0
三項演算
n = If i<100 Then i Else 100 End If
GOTOステートメント
@infinite
  WScript.Echo "oh my."
GoTo @infinite
GOTOステートメント(行番号)
10 X = 1
20 WSCRIPT.ECHO X
30 X = X + 1
40 IF X<=10 THEN GOTO 20 END IF
デフォルトパラメータ
Function greet(name="Steve")
  WScript.Echo "Hello " & name & "!"
End Function
Returnステートメント
Function add(a, b)
  return a+b
End Function
クロージャ
self.say = Function()
  WScript.Echo "My name is " & self.name
End Function
エラーハンドリング
On Error GoTo Catch
  a = 1 / 0
On Error Catch
  WScript.Echo "error occurred"
On Error GoTo 0
JSONオブジェクト
obj = {
  "name" : "Steve",
  "age"  : 24,
}
JSONオブジェクトを文字列に
obj = { "name" : "Steve" }
str = obj()
文字列をJSONオブジェクトに
obj = {}
obj() = "{ ""name"" : ""Steve"" }"
インクリメント/デクリメント
a = ++i
b = i++
64bit整数
n = 9223372036854775807
=演算子の役割別
x = 3     '// copy or compare in situation
x := 3    '// always copy
x == 3    '// always compare
Optional_Chaining_'?.'
obj?.method()
Nullish_Coalescing_'??'
x = obj ?? errobj
===演算子
if obj === "" then obj:=empty end if
クラシカルなASP
<ul>
<% i = 10 %>
<% do while i-- %>
  <li><%= i %>: <%= now %></li>
<% loop %>
</ul>
'set'や'call'はなくても良い(ある場合は無視される)
v = Nothing
so(dll)によってライブラリを作成可能
lib = new MyLib

ライセンス

CC-BY

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【postgresql】外部DBサーバにクライアントからSSH接続する

 外部DBサーバにpostgresqlをインストールして、
 クライアント側からSSH接続でDBサーバにアクセスするときに少々嵌ったのでメモ。

・環境

  • DBサーバOS : Red Hat 7.2.1-2 (Linux)
  • クライアントOS : Windows 10
  • DB接続ツール : A5M2

・構築

 順番通りに実施していく。

DBサーバにpostgreSQLをインストール

 LinuxにpostgresqlをインストールしてDBサーバにする

$ sudo yum install -y postgresql96 postgresql96-server postgresql96-libs postgresql96-contrib

DBの初期化

 よくわからんがまあ色々ファイルが出来ているのでヨシ!

$ sudo /etc/init.d/postgresql96 initdb

postgreユーザーのパスワード変更

 New password:とあるように、新しいパスワード入力して、Retype new password:でもう一度入力すればOK。

$ sudo passwd postgres
Changing password for user postgres.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

postgresql.confとpg_hba.confの変更

 initdbでDBを初期化した後、/var/lib/pgsql96/data/ ディレクトリに
 postgresql.conf が生成されているので編集する。

$ sudo vi /var/lib/pgsql96/data/postgresql.conf

 開いたら53行目付近まで移動
 (:set numberを入力すると行番号表示できるので覚えておくと便利)

postgresql.conf
※一部抜粋
#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------

# - Connection Settings -

#listen_addresses = 'localhost'         # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost'; use '*' for all
                                        # (change requires restart)
#port = 5432                            # (change requires restart)
max_connections = 100                   # (change requires restart)

 listen_addressesのコメントを外してクライアントのグローバルIPアドレスを追記する。
 portのコメントもついでに外しておく。

~編集後~

postgresql.conf
※一部抜粋
#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------

# - Connection Settings -

listen_addresses = 'localhost,グローバルIPアドレス'  # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost'; use '*' for all
                                        # (change requires restart)
port = 5432                            # (change requires restart)
max_connections = 100                   # (change requires restart)

 グローバルIPの調べ方はいくらでもあるが、
 クライアントでwww.cman.jpとかにアクセスすれば一瞬で分かるのでオススメ。
 https://www.cman.jp/network/support/go_access.cgi

 続いて同じディレクトリに pg_hba.conf が生成されているので編集する。

$ sudo vi /var/lib/pgsql96/data/pg_hba.conf

 これは一番下にあるので末尾に飛んでしまえばよい。以下の通りに変更する。
 (Shift + g で飛べる)

pg_hba.conf
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
host    all             all             グローバルIPアドレス/32   trust

 ここでADDRESS列にクライアント側のグローバルIPアドレスを設定、METHODをtrustに設定しないと
 クライアントからDBサーバに接続できないので注意が必要。

postgreSQL起動

$ /etc/init.d/postgresql96 start

データベース作成

 ここでデータベースを作成しておかないと、
 クライアントでDB接続用のソフトウェア(今回はA5M2)で接続するときに困ってしまう。
 まずはpostgresユーザーにスイッチ

$ sudo su - postgres
Last login: Sun Dec 9 14:02:32 UTC 2019 on pts/0
-bash-4.2$

 psqlでDBにアクセス

-bash-4.2$ psql
psql (9.6.11)
Type "help" for help.

postgres=#

 postgres=#の表示になったら文字通り空のデータベースを作成する。

postgres=# create database hogeDB;

 これでDBサーバ側の設定は終わり。
 次はクライアント側の設定(主にA5M2)

・接続

 A5M2起動
 データベースの追加と削除
image.png
 追加→PostgreSQL(直接接続)
image.png
 「基本」タブの設定はDBの設定内容を入力し、
image.png
 「SSH2トンネル」タブにSSH接続に必要なユーザー名と秘密鍵を選択する。
image.png

 ここでテスト接続して「接続に成功しました。」と出たら成功!
image.png

 あとは設定を保存して煮るなりなんなりすればおk

参考:
外部サーバーのDBにアクセスする(postgresql)
https://liginc.co.jp/programmer/archives/1598

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Neovim の Terminal で画像表示や動画再生

はじめに

libsixel の登場以来、ターミナルに画像を表示する Sixel Graphics はかなり簡単に扱えるようになりました。

直接表示するだけではなく、DRCS と呼ばれる機能の Sixel 拡張が使用できる端末を用いる事により、その上で動作する Neovim が備えるターミナル上でも sixel での画像表示が可能です。
DRCS のSixel 拡張については @arakiken さんがこちらの記事で詳細に解説してくださっていますが、この記事上で少し触れられている、Neovim の DRCS-Sixel 対応を試してみようと思います。

Neovim の "floating windows" 機能を使えばバッファ上の任意の場所にサイズ指定したウィンドウが開けて、なおかつその上でターミナルが動作するので、DRCS-Sixel 化により好きな場所で画像を表示したり動画を再生したりする事が可能になります。

環境について

  • OS : Ubuntu 18.10
  • ターミナルエミュレータ : mlterm version 3.8.6

RLogin や mlterm 等、DRCS-Sixel を使えるターミナルエミュレータを使用してください。

libsixel のインストール

今は大抵ディストリビューションのパッケージに含まれているのでサクッとインストールしましょう。

~% sudo apt-get install libsixel-bin libsixel-dev

libvterm のインストール

neovim や vim の :terminal 機能で使われるライブラリです。
「DRCSのSixel拡張について」で紹介されている libvterm はこちらのリポジトリから落としてきてビルド及びインストールが可能ですが、現状の Neovim では libvterm のバージョン0.1以上を要求する為、下記の手順でソースコードを入手・展開しましょう。

~% wget http://www.leonerd.org.uk/code/libvterm/libvterm-0.1.2.tar.gz
~% tar xvzf libvterm-0.1.2.tar.gz

DRCS-Sixel 対応の為の diff は下記です。
https://bitbucket.org/arakiken/libvterm/branch/sixel#diff
私は今回は手動で差分を適用してみました。ソース修正後ビルドしてインストールします。

~% make
~% sudo make install

Neovim のインストール

今の Neovim はビルドの過程で libvterm をダウンロードして来て自らに組み込む様な形でターミナルを実装する仕組みになっている様ですが、make の際に下記オプションを指定することでこのバンドル版ではなく、OS にインストール済みの libvterm を使用させる様にします。

~% sudo apt-get install ninja-build gettext libtool libtool-bin autoconf automake cmake g++ pkg-config unzip
~% git clone https://github.com/neovim/neovim.git
~% cd neovim
~% make DEPS_CMAKE_FLAGS='-DUSE_BUNDLED_LIBVTERM=OFF'
~% sudo make install

以上で DRCS-Sixel 対応された Neovim のインストールは完了です。

画像表示してみる

画像表示には libsixel に含まれる img2sixel というコマンドが使えます。gif アニメもイケますが、中々綺麗に再生されなかったので、Sixel Graphicsを活用したアプリケーションの御紹介 の記事中にある FFmpeg-sixel を使い、mpeg4の動画を使う事にしました。

floating windows を使用するにあたっては、下記の記事を参考にさせて頂きました。
【Neovim】半透明色のウィンドウが開けるようになりました

miku.mp4 という動画を用意した上で、Neovim の設定ファイルに下記を追記します。

$HOME/.config/nvim/init.vim
command! Miku call s:miku()

function! s:miku()
    " 空のバッファを作る
    :let buf = nvim_create_buf(v:false, v:true)
    " そのバッファを使って floating windows を開く
    :call nvim_open_win(buf, v:true, {'relative': 'win', 'height': 30, 'width': 40, 'col': 44, 'row': 14})
    " 透明にする
    :set winblend=100
   " ターミナルを開いてコマンドを実行
    :terminal /usr/local/bin/ffmpeg2 -i ~/Desktop/images/miku.mp4 -f sixel -loglevel quiet -pix_fmt rgb24 -s 240x400 -
endfunction

この状態で Neovimを起動し、:miku とコマンドを打つと

mikumiku.gif

この様に動画が再生されます(すいません、gif動画が非常にモッサリしてますが実際はこんな感じでもっとスムーズに再生されます)。
この仕組みを使えば、以前 Twitter で流行った「一定時間サボるとメンターが出て来て激励するエディタ」に近いものも実現出来ちゃいますよね笑

他にも色々面白い使い方があると思うので、是非試してみてください!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む