[Scala] 括弧ゴルフ

http://e-arrows.sakura.ne.jp/2010/08/is-lisp-really-has-too-many-parenthesis.html

時期をものすごい逸してますが、Scalaが意外にもないようなので。
ちなみに2.8.0で確認してます。

object Fact {
  def main(args: Array[String]) = {
    val n = args.headOption map Integer.parseInt getOrElse 1
    var fact: BigInt = 1

    for (i <- 1 to n) {
      fact *= i
      println(i + "! = " + fact)
    }
  }
}

12個でした。
Scala上級者がやればもっと減るだろうけど

別の端末のカレントディレクトリに移動

zshで別のscreenの窓(?)のカレントディレクトリにcdするのを見て、screen限定じゃないのが欲しいという人*1がいたので作ってみた。
本家と違ってやたらゴミファイルを作る。

TMPDIR=${TMPDIR:-/tmp}
export CDD_PWD_DIR="${TMPDIR}/cdd_pwd_dir.$UID"
SED=/bin/sed

function _reg_pwd_tty() {
    local tty_file
    tty_file=${CDD_PWD_DIR}/$(echo "${TTY}" | ${SED} -e 's|-|-h|g' -e 's|/|-s|g')
    if [ ! -d ${CDD_PWD_DIR} ]; then
        mkdir ${CDD_PWD_DIR}
        if [ $? != 0 ]; then
          return 1
        fi
    fi

    pwd > "${tty_file}"
    if [ $? != 0 ]; then
      echo "Error: Don't wrote ${tty_file}."
      return 1
    fi
}

function _print_dirs() {
    ls -1 ${CDD_PWD_DIR} | while read i; do
        echo -n "${i} => " | ${SED} -e 's|-s|/|g' -e 's|-h|-|g'
        cat -- ${CDD_PWD_DIR}/${i}
    done
}

function cdd() {
  local tty_file

  if [ -z "$1" ];then
    _print_dirs
    return 0
  fi

  tty_file=${CDD_PWD_DIR}/$(echo "${1}" | ${SED} -e 's|-|-h|g' -e 's|/|-s|g')

  if [ -r ${tty_file} ];then
    cat ${tty_file}
    cd $(cat ${tty_file})
  else
    _print_dirs
  fi
}

使い方は本家とほぼ同じ。$HOME/.zshrcで上記のファイルをインポートして、以下を記述する。

function chpwd() {
    _reg_pwd_tty
}

補完関数、fpath通ってるところに"_cdd"という名前で置くと動くと思う。

#compdef cdd

local CDD_PWD_DIR="${TMPDIR}/ccd_pwd_dir.$UID"
local curcontext="$curcontext" state line expl ret=1 list disp cdd_pwd files

_arguments -C \
    '1:cdd_dir:->cdd-dir' \
    && ret=0

if [[ -n "$state" ]]; then
    case $state in
        cdd-dir)
            files=($(ls -1 ${CDD_PWD_DIR}))
            cdd_pwd=($(echo $files | sed -e 's|-s|/|g'  -e 's|-h|-|g'))
            for (( i = 1; i <= $#cdd_pwd; i++ )); do
                cdd_pwd[$i]="$cdd_pwd[$i] -- $(cat $CDD_PWD_DIR/$files[$i])"
            done
            list=( ${^cdd_pwd%% *} )
            disp=( -ld cdd_pwd)
            _wanted -V cdd-dir expl 'cdd_dir' compadd "$@" "$disp[@]" -Q -a list
        ;;
    esac
fi

return ret

zshの補完関数はわかりづらいなぁ。かかった時間の99%補完関数。

suできない

rootにsuできない状態になっていた。原因はユーザ情報の重複であった。LDAPでユーザ情報を管理してるが、/etc/passwdとLDAPの両方にrootユーザが記載されていた。そして、LDAPに記載されているrootではシェルとホームディレクトリが存在しないものを指定していた。
その結果、シェルの実行に失敗しsuに失敗していた。

おそらく、samba周りの設定をしていた際にLDAPにrootを作ったのだと思う。
問題あるような気もするが、とりあえずそのユーザを削除した。