Emacsのスタート画面をイケメンにする

100分の1秒でもemacsの起動を早くしようと試行錯誤している一方、起動のたびに真黒なScratch画面と向きあっていると気分も暗くなってくる。せめて初期画面くらいは、ホットするようなものにしたい…ということで、dashbord.elを導入してみた。

DebianにEmacs25.3をInstallする

私の場合は、ThinkpadのWindows10にVirtualBoxをInstallし、Vbox上でDebianを動かしています。

Installの手順

  • apt-getでインストールできるのは、Emacs25.1までなので、dawnloadしたsourceを直接コンパイルしてインストールします。
  • 幸い、もともとEmacs25.2がInstallしたあったので、すんなり成功しました。
$ wget http://public.p-knowledge.co.jp/gnu-mirror/emacs/emacs-25.3.tar.xz 
$ unar emacs-25.3.tar.xz
$ cd emacs-25.3
$ ./configure --with-x-toolkit=gtk3 --with-sound=no --with-x --with-xwidgets
$ make
$ sudo make install
$ sudo reboot 
$ emacs --version
$ GNU Emacs 25.3.1
  • emacs25.2はインストールしたままで上書きしましたが、まったく問題ありませんでした。

xwidgetsが動いた(^o^)v

  • Emacs25で採用されたxwidgetsですが、Mac環境では動きませんでした。
  • Linuxでは動くとの情報だったので試しました。

macOS SierraでSIPを無効にする方法

Sierraには、SIP(System Integrity Protecton)というセキュリティを強化機能が追加されていて、sudoを使ってもシステム用とされる/usr等のディレクトリに変更を加えられないようになっていて、開発環境の構築になにかと不都合です。

そこでSIPを無効にすることにしました。

1.リカバリーモードで起動する

command + r を押したままMacを起動させます。

2.ターミナルを起動

再起動後いつもとは違う画面となっていますが、ビックリしないでください。

画面上の選択のユーティリティーからターミナルを起動します。

Alt Text

3.SIPコマンドを打ち込む

立ち上げたターミナルに以下を打ち込み、enterを押す。

csrutil disable

Alt Text

上図のように、

Successfully disabled System Integrity Protection. Please restart the machine for the changes to take effect.

と返ってくれば成功です。Appleメニューから「再起動」を選んで再起動すると,SIPが無効化された状態で起動します。

4.SIPを有効に戻す

SIPが無効の状態で行う必要な作業が終わったら、元に戻しておきましょう。

同じ手順でターミナルを立ち上げて、csrutil enable と打ち込むだけです。

ちなみに私は無効のままにしています。

SierraでIllustrator(CS3~6)のエラーを回避する方法

macOSをSierraにバージョンアップすると、せっかく構築した開発環境にいろいろ障害が出そうなので、ずっとMarvericsで頑張っていましたが、iTunesなどのバージョンアップについていけなくなったので、やむなくSierraに移行しました。

Javaランタイムエラーを回避する方法

Sierraにアップグレードした状態で、Illustrator(CS3~6)を起動させると、次のようなエラーメッセージが出ます。

Alt Text

原因は、Appleが、El Capitan以降でJava 6のサポートを終了する。

とのことで、Sierra(10.12)では、CSシリーズを起動することができなくなったというわけです。

Javaチェックの実態

エラーがでるのは、起動時に以下のJava6の2つのディレクトリの有無をチェックしているからだとのことです。

  • /System/Library/Java/JavaVirtualMachines/1.6.0.jdk
  • /System/Library/Java/Support/Deploy.bundle

ところが実際には、Java6は使っていないそうです。 ということは、Java6の2つのディレクトリさえ存在していれば、実際にJava6がインストールされてなくても、Adobe CSシリーズは動作するということになります。

SierraにJava6のデレクトリを作成する方法

実は、Sieeraの問題点はここからです。

EI Capitan以後に採用された、System Integrity Protection(SIP)による制約のために、管理者権限をもってしても、/System/Library 下に任意のデレクトリを新規作成することができません。

そこで、一時的にSIPを無効にし、当該ディレクトリを作成した後に、再びSIPを有効にする必要があります。

macOS SierraでSIPを無効にする方法

上記によりSIPを無効化して再起動し、改めてターミナルを起動します。ターミナルに以下のように入力して実行します。

sudo mkdir -p /System/Library/Java/JavaVirtualMachines/1.6.0.jdk /System/Library/Java/Support/Deploy.bundle

非常に長いコマンドなので、右端の、Deploy.bundleまで確実にコピーしてください。

管理者パスワードを要求されるので入力します。

これで、Illustrator/Photoshop が起動できると思います。

Illustrator CS4のプラグイン読み込みエラーを回避する方法

私の場合、Illustrator CS4を起動したところ「プラグインの読み込みエラーです。PhotoshopImport.aip」とでます。

いろいろググって試しましたが解決せず、最終的に下記サイトにある、Yosemite.AICS4.Fix.mpkg.zipをDownloadし、インストールすることで解決しました。

https://github.com/ralvarezt/aics4_yosemite_fix/releases

Yosemite対応のようですが、Sierra でも大丈夫でした。

Perl:文字列前後のスペース&タブを削除

運営している俳句サイトで自動句会システムを作動させている。

ユーザーが自分が詠んだ俳句をテキストフォームを使って投稿するという仕組みなのですが、キーボードからの入力ではなくて、コピー貼付け操作をされる方も多く、意図しないスペースが入ったまま投稿されるケースが多いです。そのままですとシステムが正常に処理できないことがあるので、投稿受付時に不要なスペースやタブを自動的に削除するように対策を施すことにしました。

文字列前後の半角スペース&タブを削除

正規表現を使って文字列$valの末尾の半角スペース&タブを削除するスクリプトは以下の通り。

$val =~ s/\s*(.*?)\s*$/$1/;

テストスクリプトで確認してみましょう。

## 文字列前後のスペース&タブ削除
$val = "This is a pen.     ";
$val =~ s/\s*(.*?)\s*$/$1/;
print $val;

文字列前後の全角スペースを削除

全角スペースの削除は、少しやっかいです。使用する文字コードによって異なるからです。

$val =~ s/\x81\x40//g;  SJIS
$val =~ s/\xa1\xa1//g;  EUC
$val =~ s/\xE3\x80\x80//g;  utf-8

UpFtpをMacとLinuxとで共用する方法

UpFtpと言うのは、結城浩さんの作られたMakeWebと併せて使うためのFTP自動化ツールのことです。

  • Makeweb:テキストをXHTMLに変換するPerlスクリプト
  • UpFtp:ホームページ更新用Perlスクリプト

これらのツールを使えば、MakeWeb記法(Markdown記法のような書式)で書いた、index.txtをMakeWebでコンパイルしてindex.htmlを生成させ、UpFtpでサーバーに送って更新する…という手順を下記のように makefileに書き、make -k するだけで自動処理されます。

makefile

target = index.html
a.out:all
all: $(target)

.SUFFIXES: .txt .html
.txt.html:
	perl ~/Dropbox/Web/GH/mw/makeweb.pl $< $@ # index.txt to index.html
	perl ~/Dropbox/Web/GH/upftp/upftp.pl 

異なる環境でデータを共有するのはDropboxが便利

Dropboxは、Windows/Linux/macOSとマルチ環境で使えるので、WEB構築の元データを複数端末で共有するのには一番適している。同期速度などの点でも他のクラウドと比較して一番早い。

ぼくの場合は、どの環境もユーザーフォルダの直下にDropboxをインストールしているので、以下のようPATH構成になる。

  • Windows C:\Users/minoru/Dropbox
  • Lnux /home/minoru/Dropbox
  • Mac /Users/minoru/Dropbox

Makefileの場合は、~/Dropboxと書くことで認識してくれるので容易に共用設定が書けるが、UpFtpの設定ファイルの場合は、以下のようにフルパスを書く必要があるので工夫が必要となる。

# Local root directory (in fullpath)
my $localrootdir = "";
# File list (in fullpath)
my $filelist = "";

ユーザフォルダーを変数で取得

フルパスを直書きするとマルチ環境で共用できないので、変数を取得してそれを共通で使えるようにします。

Mac/Linuxの場合

MacもLinuxも同じUNIXなので以下の方法でユーザーフォルダのPATHを取得できる。

$home = $ENV{"HOME"}
$home = %USERPROFILE%

Mac/Linux共用の設定

私の場合は、以下のように書くことでうまく動いている。

# Get HOME directory from environment variables
my $home = $ENV{"HOME"};
# Local root directory (in fullpath)
my $localrootdir = "$home/Dropbox/Web/GH";
# File list (in fullpath)
my $filelist = "$home/Dropbox/Web/GH/upftp/filelist.txt";

Windows/Mac(Linux)共用の設定

ここからは確認できていないので無責任になるけれども、OSを判別する特殊変数を使って分岐させる必要がある。

open-junk-file+howmでサンプルコードテスト環境を構築

ぼくはプログラマーではないけど、作業の自動化などを図るためにときどきパッチワークコードを試すことがある。 この目的のために多くの人は、open-junk-file.elを使っているみたいなので素直に見習う。

サンプルコードの場合、うまく動くことが確認できたらあとは使い捨てになるので保存場所にはさほど神経質にならなくても良いが、あとからの検索を用意にするためにぼくの場合は、howmフォルダーに置いている。検索は、helm-agでもいいのだけどhowmの一覧機能や検索機能がとても使いやすく優れているからだ。

open-junk-file.el

メモのファイル名は、[timestamp.拡張子]という使い方が多いみたいだけど、ちょっと判りにくいので、ぼくの場合は、20170717.hoghoge.plという感じにしてる。

;;--------------------------------------------------------------------------------
;; open-junk-file.el                                      last updated: 2017/07/17
;;--------------------------------------------------------------------------------
(use-package open-junk-file
  :bind ("C-c j" . open-junk-file)
  :config (setq open-junk-file-format "~/Dropbox/howm/junk/%Y/%Y%m%d."))

;; Automatically insert tags according to extension
(defvar open-junk-ext-tags-alist
  '(("el" ";;" "ELISP")
    ("pl" "#" "PERL")
    ("py" "#" "PYTHON")
    ("rb" "#" "RUBY")))
(defadvice open-junk-file
  (after open-junk-file-insert-howm-comment-advice activate)
  "After open-junk-file, insert a tag into the opened buffer
to be searched by howm."
  (let* ((ext (replace-regexp-in-string "^.*\\.\\([^\\.]+\\)$" "\\1" buffer-file-name))
         (asc (assoc ext open-junk-ext-tags-alist))
         (prefix (cadr asc))
         (tag (caddr asc)))
    (insert prefix)
    (insert " %" tag)))

quickrun.el

コードを試運転したりデバッグするときに quickrun.el を入れて併用すると最強となる。

;;-------------------------------------------------------------------------
;; 20_quicrun.el                                   last updated: 2017/07/05
;;-------------------------------------------------------------------------
(use-package quickrun
  :bind ("C-c q" . quickrun) ;; ファイルを実行する
        ("C-c c" . quickrun-compile-only))

whitespace-modeでjaspace風に表示させる設定

Emacs24以降は、内包されたWhitespaceで全角スペースなどを明示的に表示できることは知っていたけれど、長い間使い馴染んだjaspaceのそれと同じような表示にするための設定がわからず挫折していた。

今回、emacs設定ファイルを全体的に見直すことになり、Tipsをググっていて表題のものを見つけたので試してみた。

(use-package whitespace
  :diminish global-whitespace-mode
  :config
  (setq whitespace-style
    '(face
      tabs spaces newline space-mark tab-mark newline-mark))
  (let ((dark (eq 'dark (frame-parameter nil 'background-mode))))
    (set-face-attribute 'whitespace-space nil
    		:foreground (if dark "pink4" "azure3")
    		:background 'unspecified)
    (set-face-attribute 'whitespace-tab nil
    		:foreground (if dark "gray20" "gray80")
    		:background 'unspecified
    		:strike-through t)
    (set-face-attribute 'whitespace-newline nil
    		:foreground (if dark "darkcyan" "darkseagreen")))
  (setq whitespace-space-regexp "\\( +\\)")
  (setq whitespace-display-mappings
        '((space-mark   ?     [?]    [?_]) ; full-width space - square
          (newline-mark ?\n    [?\xAB ?\n])))   ; eol - right quote mark
  (setq whitespace-global-modes '(not dired-mode tar-mode))
  (global-whitespace-mode 1))

メモ機能に特化した超シンプルなhowm+Dropboxの設定

メモ機能に特化したhowmの設定を紹介します。

  • GTDとしては使わないのでメニュー画面は使いません。
  • メニュー画面は使いませんが検索などの基本機能は全て使えます。
  • 新規投稿と一覧表示のみ直接使えるようにkey-bindしています。
  • ファイルは、スマホや他の端末からも共有出来るようにDropboxで管理します。
  • メモは、markdown-mode で書きます。理由は後述します。

howm-memoの設定

;*************************************************************************
;; howm-memo.el                       last updated: 2017/06/09
;*************************************************************************
;; M-x package-install howm
;; (use-package key-chord)
;; (use-package use-package-chords
;;   :config (key-chord-mode 1))
;;-----------------------------------------------------------------------
(use-package howm
  :init
  (setq howm-view-title-header "#"
        howm-directory "~/Dropbox/howm"
        howm-file-name-format "%Y/%m/%Y-%m%d-%H%M.md"
  :config
  (setq howm-view-split-horizontally t      ;; 一覧バッファと内容バッファを横に並べる
        howm-view-summary-persistent nil    ;; RET でファイルを開く際一覧バッファを消す
  :chords ((",," . howm-create)             ;; メモを書く
           ("@@" . howm-list-all)))         ;; メモ一覧を開く

;; 空になったファイルを尋ねずに自動削除:howm以外でも有効
(defun my:delete-file-if-no-contents ()
  (when (and (buffer-file-name (current-buffer))
             (= (point-min) (point-max)))
    (delete-file
     (buffer-file-name (current-buffer)))))
(if (not (memq 'my:delete-file-if-no-contents after-save-hook))
    (setq after-save-hook
          (cons 'my:delete-file-if-no-contents after-save-hook)))

;***********************************************************************
; end of file