それマグで!

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

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

prinft %s は文字列の長さが指定できる!

知らなかった。%s は%s しか使えないんだと思ってました。

縦幅が綺麗に揃った文字列を出力するにはどうすればいいか、ずっと気になっててrubyruby で各種関数、phpphp で各種関数を使ってたけど、良く考えたら printf で出来ることに気付いた

Dir.glob('/*').each{|e|
  printf("%13s : \n", e )
}

出力結果

/Applications :
         /bin :
       /cores :
         /dev :
         /etc :
        /home :
     /Library :
  /lost+found :
         /net :
     /Network :
         /opt :
     /private :
        /sbin :
      /System :
         /tmp :
       /Users :
         /usr :
         /var :
     /Volumes :

あああ、気持ちいい。綺麗に出力される。

printf %10s

printf %10s ## 10 文字で空白埋め

なぜ今まで気づかなったんだろう。

シェルでも使えるよ!

printf の仕様なので、シェルスクリプトでも使える。コレも便利。

takuya@~$ ls ~ | xargs -I@ printf "%10s : \n"  @
Applications :
 Boostnote :
   Desktop :
 Documents :
 Downloads :
   Library :
    Movies :
     Music :
  Pictures :
    Public :
     Sites :
     repos :

はぁ、なんでprintf の空白埋め知らなかったんだろう。。。

ruby selenium webdriverでプロファイルを毎回同じものにする。

毎回・毎回ログイン処理を待つのを面倒くさいんですよね。

テスト時はログイン処理が必要だけど、テスト書いてる時は省略したいですよね

なので、プロファイルを指定すれば前回のCookieやらパスワード保存が使える

それなりに便利

#!/usr/bin/env ruby
##
require 'selenium-webdriver'
caps = Selenium::WebDriver::Remote::Capabilities.chrome(
  "chromeOptions" => {
      "args" => ["--user-data-dir=/Users/takuya/Desktop/sample-profile"]
        })
driver = Selenium::WebDriver.for :chrome , :desired_capabilities => caps

class  Selenium::WebDriver::Driver
  def xpath( query)
    ret = self.find_elements(  xpath: query )
    return ret[0] if ret.size==1
    return ret
  end
  def goto ( url )
    self.navigate.to url
  end

end


driver. goto "http://twitter.com"
driver.close()

swapを消して、swap を作る方法、Swapを確認する方法

swap のドライブを変更したい

swap ドライブをSSDに移動させようと思って、消したり作ったりしてた

swap を確認する方法

単純に swapon を叩くと現在のswap が見られる

takuya@:~$ sudo swapon
NAME      TYPE      SIZE USED PRIO
/dev/dm-1 partition  20G  39M   -1

swapを解除する方法

全ての swapoff する

swapoff -a 

指定した swap をoffする

swapoff /dev/sda9

swap を有効にする

swapon /dev/dm-1

Swap を作る

スワップエリアは、適当なディスクを決めて適当な場所を指定すると作ることが出来る。

ブロックデバイスとファイルが選べる。

Linuxでは、ブロックデバイスである必要はない。ファイルでも良い←しらんかった

ファイルの場合

最初にファイルを確保する

dd if=/dev/zero of=/my_swap bs=100M count=10 #テスト用なので1G
chown root. /my_swap
chmod 0600 /my_swap

スワップとして初期化する。(わすれがち

mkswap /my_swap

このファイルをマウントする

swapon /my_swap

あとは、これを/etc/fstab にでも書いておけば ファイルスワップになる。

ブロックデバイスの場合

最初にfdisk/gdisk で容量(パーティション)を作る。

LVMなら lvcreate 作ればイイ

sudo lvcreate  -L 20GB -n swap myVolgrp # lvm の例

mkswap する。ブロックデバイスをmkswapしておく

sudo mkswap /dev/mapper/acid-swap

マウントする

sudo swapon /dev/mapper/acid-swap

まとめ

  • swap は いつでもオン・オフできる
  • swap はファイルでもディスクでも何方でも良い
  • mkswap する必要がある
  • 起動時にマウントするにはfstab にかく

パーティション管理面倒くさいから、ファイルでいいならファイルにしょうかな。

参考資料

linux スワップ(swap)領域の作成

ruby で URL をパースしてGET引数をHashに展開する。(日本語URI対応)

GET引数をハッシュに変えたい

実は、頻繁にやるんだけど、毎回適当に行っていて、これといった方法を決めてなかったので、ちゃんと方法を決めることにする。

require 'uri'


module URI
  class << self
    alias :_parse :parse

    def parse a, original=false
      return self._parse a if original

      r=/[一-龠]+|[ぁ-ん]+|[ァ-ヴー]+|[a-zA-Z0-9]+/
      a = a.gsub(r){|m|  URI.encode_www_form_component(m) }

      u = self._parse a
      if u.query
        q = u.query
        q = q.split(/&/)
        q = q.map{|e|
            n = e
            e = e.split(/=/,2)
            e<<nil unless e.size%2==0
            e
        }
        q= q.flatten
        q = Hash[*q]
        def q.to_str
          self.map{|e|e.join('=')}.join('&')
        end
        u.query = q
      end
      return u
    end
  end
    class Genric
      # alias :_query= :query=
    end
end

class URI::Generic
      alias :_query=  :query=
      def query=(v)
        return @query = v if v.class == Hash
        return self._query=(v)
      end
end

実行するとHashで返してくれる。

=>{ 
  "flow"=>"recipe_ingredient_list",
  "p"=>"1", 
  "ingredient_vals"=>"%u3058%u3083%u304C%u3044%u3082%5B-%5D",
  "ingredient_ids"=>"1_18%5B-%5D"
}

出来ることは出来たが、ruby ってやっぱり面倒くさい。もっとスマートな解決方法はないのかなぁ

2016-08-25 追加

  • GET引数が名前だけ値なしでエラーになるのを解消
  • URI.to_s/to_str で暗黙的変換ができないのを解消
  • 日本語を含むURIに対応できないので、ぱぱっと対応 ( ドメインは未対応 )

Swap の適正量 の目安

Swap の適正量

スワップファイルはどれくらいが適当なのか?

昔はRAMの2倍と言われましたが、いまだにそんなわけ無いと思うので調べてみた。

Redhat の資料によると

メモリ量 スワップサイズ
2GB 以下 メモリの2倍程度から3倍程度
2-8GB メモリと同程度から2倍程度
8-64GB メモリの1.5倍程度

f:id:takuya_1st:20160701171258p:plain:w400

つまり休止状態でメモリダンプする量+2GB程度、10GBもあれば十なんだよ。

判断のポイントは休止状態をどうするか

休止状態を考慮しなくていいならもっと少なくていいそうだ。

メモリと同程度(余裕見て+2GB)もアレば十分。これは休止状態も考慮したものらしい。

そうだよなぁ。32GBメモリくらい普通に詰んでるもんな。

ちなみに、64GBでハイバネーションするのは辛いってRedhatには書いてある。HDDなら64GB読み込みに時間かかるから、起動したほうが速い。そりゃそうだ。まあ、SSDなら実現可能だろうけど、64GBもswap取られたら堪らんよね。

参考資料

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/s2-diskpartrecommend-x86.html

推奨される Swap 領域の目安 - eTuts+ Server Tutorial

git status で git-diff エラーになったのでインストール

git-diff でカラー表示してたけど、新規マシンになかった

新規マシンにgit 入れたけど、git-diffがなくて怒られた

diff - highlight を持ってくる

curl https://raw.github.com/git/git/master/contrib/diff-highlight/diff-highlight -o diff-highlight
chmod a+x diff-highlight
mv diff-highlight /usr/local/bin

.gitconfig を確認する

~/.gitconfig

[pager]
        log = diff-highlight | less
        show = diff-highlight | less
        diff = diff-highlight | less

vimdiffでも良いんだけど、diff-heighlight も便利

diff見るのは、別になんでもインだけど。diff-heighlight はやっぱり便利

参考資料

http://gerolian.xyz/2013/12/04/929/

Linux でwinrar のrarファイルを圧縮展開・rr3% つける。rarで文字コードも嬉しい?

rar コマンドでファイルを圧縮

tar とほぼ同じ c の代わりに a

rar a  -rr3p ファイル名.rar 追加

実際にヤってみた例

takuya@~/Desktop$ rar a -rr3p out.rar  ScrenCaptured_2016-06-2*

RAR 5.30   Copyright (c) 1993-2015 Alexander Roshal   18 Nov 2015
Trial version             Type RAR -? for help

Evaluation copy. Please register.

Creating archive out.rar

Adding    ScrenCaptured_2016-06-22_20.31.34.png                       OK
Adding    ScrenCaptured_2016-06-24_13.23.18.png                       OK
Adding    ScrenCaptured_2016-06-24_14.20.06.png                       OK
Adding data recovery record
Done

a はファイルを追加する

rar a ファイル名.rar 追加したいファイル 追加したいファイル 追加したいファイル 追加したいファイル

ファイル名を決めたら、追加される。ない場合は新規作成される。

rar のファイルの中身を一覧する。

rar l out.rar
unrar l out.rar

指定ファイルを消す。

 rar d out.rar  test.html

指定したファイルを削除する。

フォルダを丸ごと放り込む

rar a out.rar dir/

末尾のスラッシュはなくても大丈夫

rar コマンドのインストール

Debianでは次のようにして手軽に取得できた

sudo apt install rar
sudo apt install unrar

macOS X では、公式サイトからコマンドラインバイナリを持ってきた http://www.rarlab.com/download.htm

ライセンスが trial が気になる。けど

unrar に関してはライセンス制限なし

展開については制限なしですね。

zip の文字コード問題。

windowsの zip archive ファイルには、「文字コード問題」という、とてもめんどくさい問題が横たわります。

unzip すると文字化けするので pythonruby でunzip コマンドを「再発明」する必要があったり、unzip コマンドにパッチ当てたりすることになる。*1

rar を使えば文字コードを解決できるんじゃ

そうえば、WinRAR のファイルを展開して文字化けしたことがない。内部的にUTF-8で保存されているようですね。

*1: というかunbutu jp も提供してる unzip の cp932 パッチは debian のpatch や unzip 本家に取り込んでくれないのかなぁ

JSでマウスイベント(クリック)を起こす/ mouseEvent を Dispatch して起動する

Javascript でクリックイベントを起こす。

クリックイベントを起こさないとテストできないページが有る。

クリックイベントをFireするには、initEvent と dispatch イベントを使う。

マウスイベント

var me = document.createEvent("MouseEvents")
me.initMouseEvent("click", true, true, window,0,0,0,0,0,false,false,false,false,0,null)
window.document.body.dispatchEvent(me)

マウスイベントが発行された確認

window.document.body.dispatchEvent(me)
  document.addEventListener("DOMContentLoaded",function(){
      document.body.addEventListener("click",function(e){
        console.log(e)
      },false)
  },false)

これでいべんとが発行できる。

特定のElementをクリックする

var ele = document.querySelector("#target_id");
ele.dispatchEvent(me)

結構便利。

注意点:contextmenu は動かない・・・

テスト用はちょっと違う動作をさせる必要がある。

ここはそのうち調べないといけない。

参考資料

php の realpath ってファイルチェックも兼ねてた

realpath を何となく眺めていると。

ファイルが存在しない時は false を返すと書いてある。え、そうなのか。当たり前だけど、気づいてなかった

realpath() returns FALSE on failure, e.g. if the file does not exist.

file_exists した後に、realpath で整形してた。

realpath 一個で十分でした。辛い

<?php

if (!(  $fname = realpath("../../file") ) ){
  return 0
}

これで良いんだ。。。file_exists なんてそんなに出番なかったんだ。

Pulse Secure の常駐プロセスの自動起動が鬱陶しい

pulse secure が自動起動してmacOS Xの起動を妨害する。

なんなんだマジでこのソフト・・・

自動起動をオフにして、必要なときだけ有効にすることにする。

takuya@~/Library$ launchctl load -w /Library/LaunchAgents/net.juniper.pulsetray.plist
takuya@~/Library$ launchctl unload -w /Library/LaunchAgents/net.juniper.pulsetray.plist

netatalk サーバーのアイコンを変える

netatalk の設定 afp.conf を見てたら

mimic

ミミック(擬態)という設定項目を発見!

早速設定してみた

ミミックすると、afp でMacから見えるアイコンが変わる。

  • afp.conf 書換
  • systemctl restart netatlk.conf
  • macOS X 側で Finder 再起動

mimic = Macmini

Mac Mini になった! f:id:takuya_1st:20160618173235p:plain:w300

mimic = MacPro

ゴミ箱になることを期待したけど、ゴミ箱にならなかった。残念

f:id:takuya_1st:20160618173323p:plain:w300

mimic = windows

OSX時代からのWindowsへの扱いが「怨念」こもってるwwやばい。

f:id:takuya_1st:20160618173417p:plain:w300

他にも色々

MacBookPro MacbookAir や AppleTV, Airpot(タイムカプセル)などが有りました。。

PowerBook, PowerMac, Macmini, iMac, MacBook, MacBookPro, MacBookAir, MacPro, AppleTV1,1, AirPort.

Windowsがあったので、他にもあるかも?

参考資料

afp.conf

juniper/Junos Pulse secure クライアントの代替にopenconnectを使う。

pulse secure を使うとSSL-VPNが張れるのですが。

Pulse SecureはOSの起動時に起動して起動を妨害する。とても邪魔

代替ソフトを探した

openvpn は方式が完全に違うから無理。jnc は jar のインストールが面倒くさいから見送り

openconnect が便利だった、

brew install openconnect
brew cask install tuntap

tuntap は openvpn などでも使われるので入ってることが多い

接続する

sudo openconnect --user takuya secure.example.jp --juniper

オプションに --juniper をつければ pulse secure の互換になる。

注意

DNS の設定が変わるので、macOS X だとWiFiDNS設定がぐちゃぐちゃになった。

この辺は今後使いながら調べる必要がありそう。

参考資料

http://www.infradead.org/openconnect/manual.html

linux にmac の タイムマシンサーバーを作る。

タイムマシンサーバーを作る。

タイムカプセル、高い。高いよ。バックアップを取るのにちょっと不便だよ。

netatalk で タイムカプセルを作る

Samba にsparse bundle を作る手もあるけれど、Sambaだとバックアップが途切れた時に不便なので。AFPで構成しています。

Debian Jessie にアプグレしたので作りなおした。

Debian LTSが Wheezy から Jessie になったので、合わせて作りなおしました。

変更点としては sysv-init から systemd に変わったところに合わせる感じです。

準備

必要な素材(ビルド用)を持ってきます。

sudo apt install build-essential \
 libevent-dev \
 libssl-dev \
 libgcrypt11-dev \
 libpam0g-dev \
 libwrap0-dev \
 libdb-dev \
 libtdb-dev \
 avahi-daemon \
 libavahi-client-dev \
 libacl1-dev \
 libldap2-dev \
 libcrack2-dev \
 systemtap-sdt-dev \
 libdbus-1-dev \
 libdbus-glib-1-dev \
 libglib2.0-dev \
 tracker \
 libtracker-sparql-1.0-dev \
 libtracker-miner-1.0-dev \
 libkrb5-dev \
 libmysqlclient-dev \

ソースを取得して展開します。

curl  -L https://sourceforge.net/projects/netatalk/files/netatalk/3.1.8/netatalk-3.1.8.tar.gz | tar zxvf -
cd netatalk-3.1.8

コンパイルします。

./configure \
        --with-init-style=debian-systemd \
        --without-libevent \
        --without-tdb \
        --with-cracklib \
        --enable-krbV-uam \
        --with-pam-confdir=/etc/pam.d \
        --with-dbus-sysconf-dir=/etc/dbus-1/system.d \
        --with-tracker-pkgconfig-version=1.0

systemd を選択するところがポイント、PAMでユーザー認証するので PAM のパスを書いてある。

make clean && make -j 3 

無事にビルドが終わったことを確認します。

 ./etc/afpd/afpd -V
afpd 3.1.8 - Apple Filing Protocol (AFP) daemon of Netatalk

This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any later
version. Please see the file COPYING for further information and details.

afpd has been compiled with support for these features:

          AFP versions: 2.2 3.0 3.1 3.2 3.3 3.4
         CNID backends: dbd last tdb mysql
      Zeroconf support: Avahi
  TCP wrappers support: Yes
         Quota support: Yes
   Admin group support: Yes
    Valid shell checks: Yes
      cracklib support: Yes
            EA support: ad | sys
           ACL support: Yes
          LDAP support: Yes
         D-Bus support: Yes
     Spotlight support: Yes
         DTrace probes: Yes

              afp.conf: /usr/local/etc/afp.conf
           extmap.conf: /usr/local/etc/extmap.conf
       state directory: /usr/local/var/netatalk/
    afp_signature.conf: /usr/local/var/netatalk/afp_signature.conf
      afp_voluuid.conf: /usr/local/var/netatalk/afp_voluuid.conf
       UAM search path: /usr/local/lib/netatalk//
  Server messages path: /usr/local/var/netatalk/msg/

インストール

あとあと管理が楽なので、checkinstall を使います。

sudo apt install checkinstall
sudo checkinstall   \
   --pkgname=netatalk3.1.8 \
   --pkgversion="1:$(date +%Y%m%d%H%M)"  \
   --backup=no \
   --deldoc=yes \
   --fstrans=no \
   --default

インストールしたファイルを確認するときは sudo dpkg -L netatalk3.1.8

初期設定しておきます。

インストールのターゲットが /usr/local/だったので、設定は /usr/local/etcにあります。

これだと、忘れそうで不便なので、ln しておきます。

sudo ln -s  /usr/local/etc/afp.conf /etc/

設定ファイルを書きます。

;
; Netatalk 3.x configuration file
;

[Global]
    uam list = uams_dhx2_passwd.so
    mac charset = MAC_JAPANESE
    hostname = acid-afp
    vol preset = default_for_all_volumes
    log file = /var/log/netatalk.log
    #log level = default:maxdebug
    log level = default

    dbus daemon = /usr/bin/dbus-daemon

[default_for_all_volumes]
    file perm = 0600
    directory perm = 0700

[Homes]
    basedir regex = /home

[videos]
    path = /var/video/
    time machine = no


[My Time Machine Volume]
    path = /home/takuya/time_capsule/
    time machine = yes
    vol size limit = 450000

今回はuam list = uams_dhx2_passwd.so が必要だった。コレを入れないとPAM通して認証済みログ出てるのに、なぜかドライブが見えなかった。

起動する

sudo service netatalk restart

systemd に認識されてることを確認

sudo systemctl status netatalk
sudo systemctl start netatalk
sudo systemctl status netatalk

systemd に自動起動するように確認

service に登録されてるか確認

sudo systemctl  list-units --type=service | grep netatalk

再起動する。

sudo systemctl enable netatalk
sudo reboot
sudo systemctl status netatalk

関係ないけど、systemd になってこの作業がめんどくさくてやだ。。。忘れて、起動しない&設定反映しないで、焦ること多数。

見えたよ

f:id:takuya_1st:20160617003937j:plain:w600

タイムカプセルとして使えるようになった。

f:id:takuya_1st:20160617003938j:plain:w600

ログインする方法

デフォルトのままで。わたしは、linux のユーザ名でログインする方法にしました。

詳しくは→ http://netatalk.sourceforge.net/3.1/htmldocs/configuration.html#authentication

基本的には /etc/passwd (PAM) にユーザ認証を任せる感じ

/etc/pam.d/netatalk
#%PAM-1.0
auth     include common-auth
account  include common-account
password include common-password
session  include common-session

Sambaもあるとき

同一サーバーにSamba も afp あるときは、同名のホスト名で、共有される。Macのネットワーク一覧でAFPが優先されて見えちゃうので、Sambaがネットワークから見えなくなる。名前が被っちゃう。

なので、ホスト名を変えておくことで、同時に使うことが出来る。

# なにもしないと `hostoname`=myserver
    hostname = myserver-afp 

Sambaがあるときは設定を変えることで使いやすくなる。

Sambaより楽かも

Samba4系で AD サーバーになったので設定があれこれめんどくさくなった。macOS X からのデータ共有ならAFPとnetatlk のほうが手軽でいいや

netatalk なら spotlight にも対応するし。必要ならtdb使えるし、持っておいて損はない。

将来的にはSMBでもタイムマシーンが使えるらしいが。。。

macOS SierraおよびServer 5.2ではSMB接続のネットワークボリュームを「Time Machine」のバックアップディスクとして使用可能に? | AAPL Ch.

いつNetatalkを捨てて、Sambaに移行すべきか:HAT blog

AFP は将来的には使えなくなる・・・だと?ええ、、SMBで共有するとなるとそれはそれめんどくさいよね。そもそもLinuxのSMBでtime capusle に使えるのかな・・・

過去資料

http://takuya-1st.hatenablog.jp/entry/2014/04/07/013519

2017-03-01

systemd 関連を一部修正

参考資料

http://netatalk.sourceforge.net/3.0/htmldocs/afp.conf.5.html

http://netatalk.sourceforge.net/wiki/index.php/Install_Netatalk_3.1.8_on_Debian_8_Jessie

http://d.hatena.ne.jp/m-bird/20120925/1348595321

expect自動入力 を python で実現する

expect 便利ですよね。

expect コマンドがあればターミナルの自動入力が出来ます。

ruby でも使ってました。 でも ruby は gems がもう地獄でちょっとずつ python / javascript に移行しようと思っています。

使い方:import

import pexpect

起動と処理待ちは spawn

import pexpect

prc = pexpect.spawn("find")
prc.expect( pexpect.EOF )

コマンドの終了待ちは EOFで行います。

出力結果がほしい時

sys.stdout につなげます。

import pexpect
import sys

prc = pexpect.spawn("find")
prc.logfile = sys.stdout
prc.expect( pexpect.EOF )

文字列の送信

基本的な使い方が分かったので入力する。

import pexpect
import sys

prc = pexpect.spawn("ssh user@192.168.2.1 ")
prc.logfile = sys.stdout
prc.expect("password:")
prc.sendline("PASSWORD")
prc.expect( pexpect.EOF )

これでパスワードは入力できる。基本的なところが分かった。

spawn は 通常の spawn と同じ

prc = pexpect.spawn("ssh",["user@192.168.2.1 "] )

オプションを使うときは配列で与えてもいいし、パイプも使えるし。

すごく楽ですね。

なぜか、うちの環境にはpexpect が最初から入ってた。。。python 素晴らしい。

参考資料

Core pexpect components — Pexpect 4.1.0 documentation