ラベル cygwin の投稿を表示しています。 すべての投稿を表示
ラベル cygwin の投稿を表示しています。 すべての投稿を表示

2021年4月18日日曜日

[emacs][cygwin] Visual Studioのemacs / emacsclient 連携設定

Visual Studioの外部ツール機能を利用して、Visual Studioで開いているファイルをショートカットキー一発で(orメニューから)emacs/emacsclientで開くことができる設定を紹介します。カーソル位置がemacsに引き継がれるのが地味に便利です。職場の都合などでビルド環境がVisual Studioだが、ビルド以外の作業は使い慣れたemacsを利用したい、という方にお勧めです。

今の時代になぜWSLでなくcygwinなのか?という疑問をもたれる方がいると思いますが、このエントリはWSLがリリース前にメモを作って、ずっと公開しないまま眠っていたものです。せっかくの情報なので時代遅れを承知の上公開します。

 

前提:

"C:\cygwin64"以下にcygwinをインストールし、cygwin上でemacs/emacsclientを利用している、自分の環境を前提に設定を紹介します。cygwinのインストールディレクトリ、及び、NTEmacs、gnupackなど異なる環境のemacsを利用している方は適宜ディレクトリやexeのパス設定を変更して下さい。

設定:

メニューの「ツール」-「外部ツール」にemacs/emacsclientを登録する。
  • emacsを起動するための設定
    • Title: emacs
    • Command: C:\cygwin64\bin\run.exe
    • Arguments: /usr/bin/emacs +$(CurLine):$(CurCol) $(ItemFileName)$(ItemExt) \+$(CurLine):$(CurCol)
    • Initial directory: $(ItemDir)
  • emacsclientを起動するための設定
    • Title: emacsclient
    • Command: C:\cygwin64\bin\run.exe
    • Arguments: /usr/bin/emacsclient +$(CurLine):$(CurCol) $(ItemFileName)$(ItemExt) \+$(CurLine):$(CurCol)
    • Initial directory: $(ItemDir)

  • (2021.04.18追記)cygwinのアップデートにより(?)、Argumentのコマンドをemacsclientからemacsclient-X11に変更しない起動できない状態になった。
    • Arguments: /usr/bin/emacsclient-X11 +$(CurLine):$(CurCol) $(ItemFileName)$(ItemExt)


余談:

この設定はTortoiseSVNのVisualStudio連携設定ページの情報を参照したときに、emacsも同じように設定できるのでは、と思いついたものです。emacs, svnに限らずいろいろと使い道がありそうです。
話がそれますが、Windows上の全てのキー操作をemacsのキーバインドに変更する方法を、以下のエントリで紹介しています。emacs使いの方にとっては便利な設定なのでこちらも是非参照してみてください。
  • [windows][emacs] Windows 8.1上で(特定ユーザーログイン時に)任意のアプリの操作をemacsキーバインドにする方法


  • 参考:

    2018年6月6日水曜日

    [linux][cygwin] unzipコマンドで "error: invalid compressed data to inflate" というエラーメッセージがでたら?

    zipアーカイブの中に長さが0のファイルが含まれていると、unzipコマンドでは以下のようなエラーメッセージが表示されて、解凍することができません。アーカイブが壊れていなくてもエラーになります。
    % unzip hoge.zip
      error:  invalid compressed data to inflate
    
    このような場合には、-tzipオプションを指定して7zコマンドを実行することで、エラーを回避して解凍できます。パスワード保護されているzipアーカイブも問題なく解凍できました。
    % 7z x -tzip hoge.zip
    

    manページによると、以下のフォーマットがサポートされていて、デフォルトは7zとのこと。
    The program supports 7z (that implements  LZMA  compression  algorithm),  
    ZIP, CAB,  ARJ,  GZIP,  BZIP2,  TAR,  CPIO, RPM and DEB formats.
    

    xはディレクトリ階層つきで解凍することを意味しています。eを指定するとディレクトリ階層なしで解凍されます。
    % 7z --help
    
    7-Zip [64] 15.14 : Copyright (c) 1999-2015 Igor Pavlov : 2015-12-31
    p7zip Version 15.14.1 (locale=ja_JP.UTF-8,Utf16=on,HugeFiles=on,64 bits,4 CPUs Intel(R) Core(TM) i3-4130 CPU @ 3.40GHz (306C3),ASM,AES-NI)
    
    Usage: 7z  [...]  [...]
           [<@listfiles...>]
    
    
      a : Add files to archive
      b : Benchmark
      d : Delete files from archive
      e : Extract files from archive (without using directory names)
      h : Calculate hash values for files
      i : Show information about supported formats
      l : List contents of archive
      rn : Rename files in archive
      t : Test integrity of archive
      u : Update files to archive
      x : eXtract files with full paths
    
    
      -- : Stop switches parsing
      -ai[r[-|0]]{@listfile|!wildcard} : Include archives
      -ax[r[-|0]]{@listfile|!wildcard} : eXclude archives
      -ao{a|s|t|u} : set Overwrite mode
      -an : disable archive_name field
      -bb[0-3] : set output log level
      -bd : disable progress indicator
      -bs{o|e|p}{0|1|2} : set output stream for output/error/progress line
      -bt : show execution time statistics
      -i[r[-|0]]{@listfile|!wildcard} : Include filenames
      -m{Parameters} : set compression Method
        -mmt[N] : set number of CPU threads
      -o{Directory} : set Output directory
      -p{Password} : set Password
      -r[-|0] : Recurse subdirectories
      -sa{a|e|s} : set Archive name mode
      -scc{UTF-8|WIN|DOS} : set charset for for console input/output
      -scs{UTF-8|UTF-16LE|UTF-16BE|WIN|DOS|{id}} : set charset for list files
      -scrc[CRC32|CRC64|SHA1|SHA256|*] : set hash function for x, e, h commands
      -sdel : delete files after compression
      -seml[.] : send archive by email
      -sfx[{name}] : Create SFX archive
      -si[{name}] : read data from stdin
      -slp : set Large Pages mode
      -slt : show technical information for l (List) command
      -snh : store hard links as links
      -snl : store symbolic links as links
      -sni : store NT security information
      -sns[-] : store NTFS alternate streams
      -so : write data to stdout
      -spd : disable wildcard matching for file names
      -spe : eliminate duplication of root folder for extract command
      -spf : use fully qualified file paths
      -ssc[-] : set sensitive case mode
      -ssw : compress shared files
      -stl : set archive timestamp from the most recently modified file
      -stm{HexMask} : set CPU thread affinity mask (hexadecimal number)
      -stx{Type} : exclude archive type
      -t{Type} : Set type of archive
      -u[-][p#][q#][r#][x#][y#][z#][!newArchiveName] : Update options
      -v{Size}[b|k|m|g] : Create volumes
      -w[{path}] : assign Work directory. Empty path means a temporary directory
      -x[r[-|0]]{@listfile|!wildcard} : eXclude filenames
      -y : assume Yes on all queries
    
    

    参考:

    2018年1月17日水曜日

    [cygwin] cygwinセットアップ・環境構築手順メモ

    主に自分向けの防備録です。windows10上で確認。インストーラーはここからDLする。

    <<設定>>



    <<環境変数>>

    • HOME
      • ホームディレクトリを切り替えられる
    • SHELL
      • "/bin/tcsh"とすることでデフォルトのシェルが切り替わる
      • ※/etc/passwdの設定を変えても反映されないので注意
    • DISPLAY
      • ":0.0"を設定


    <<インストールするパッケージ>>

    • Admin
      • shutdown
    • Archive
      • bzip2
      • p7zip
      • unzip
      • zip
    • Database
      • libsqlite3-devel
      • libsqlite3_0
      • mysql
      • postgresql-client
      • sqlite3
      • sqliteman
    • Devel
      • autoconf
      • automake
      • bashdb
      • binutils
      • clang
      • clang-analyzer 
      • cmake
      • cppunit
      • ctags
      • dmalloc
      • doxygen
      • gcc
      • gdb
      • git
      • gitk
      • jlint
      • libiconv-devel 
      • libtool
      • make
      • mercurial
      • ocaml
      • patch
      • patchutils
      • subversion
    • Doc
      • cygwin-doc (libc関連man page)
    • Editors
      • emacs
      • emacs-anthy
      • emacs-w32
      • emacs-X11
      • vim
    • Libs
      • libcurl
      • libiconv
      • libncurses-devel
    • Net
      • curl
      • httperf
      • inetutils  (telnet)
      • iperf
      • openldap (ldapsearch)
      • openssh
      • openssl
      • ssh-pagent
    • Python
      • pylint 
      • python2-pip
      • python3-pip
    • Ruby
      • ruby
      • ruby-devel
      • ruby-sqlite3
    • Shells
      • fish
      • rxvt-unicode
      • tcsh
      • xterm
    • System
      • ping
    • Text
      • aspell
      • aspell-en
      • enscript
    • Utils
      • cloc
        • 簡易LOCカウンタ(perlスクリプト)。先頭の "perl"を削除しないとエラーになる?
      • cppcheck
      • gnupg
      • keychain
      • lv
    • Web
      • ping Systemに移動?
      • wget
      • wput
    • X11
      • xhost
      • xinit
      • xlaunch
      • xmodmap
      • xorg-server
      • xwininfo
        • font-util   X.Org font utilities and font maps
          fontconfig  Font configuration utilities
          showfont    X.Org font server font information utility
          xfd         Displays all characters in an X font
          xfontsel    X font selector
          xfs         X.Org Font Server
          xfsinfo     X.Org font server information utility
          xorg-x11-fonts-*   X11 core fonts
    • =================================
    • gitビルド用に追加
      • glib2.0-openssl
      • subversion-perl
      • gettext
      • gettext-devel
      • expat
      • expat-devel
      • zlib
      • zlib-devel


    手動インストール



    その他、はまった問題

    Q: windows10上でcygwin-xを新規インストールしたが、スタートメニューにCygwin-Xフォルダ、XWin Serverアイコンが表示されず、xwin-xdg-menuを起動できない

    A:
    なぜか、以下のフォルダのアクセス権設定がインストールした自分のアカウントからアクセスできない状態になっていた。アクセス権を変更してやると、スタートメニュー上に表示されるようになりました。
      C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Cygwin-X
    参考にしたページ:Install Cygwin On Windows 10

    Q: windows10上でcygwinを新規インストールした際、/etc/group, /etc/passwdが自動生成されなかった。どうすればよいか?

    A: mkpasswd/mkgroup -c -lで再生成する。-cオプションを指定することで、ドメインないの全情報を取得しないで、自分のアカウントの情報だけが追加される。
    参考にしたページ:巨大ドメインに参加している PC での /etc/passwd, /etc/group ファイルのつくりかた

    Q: ~/.ssh/configの設定が読まれない。

    A: パーミッションを600に設定していても、読み出してくれない現象に遭遇(-Fで明示的にファイルを指定すると読み出してくれるのだが・・・)。/etc/ssh_configにコピーすると正しくロードしてくれた。
    参考:[ssh] OpenSSHのアップデートでssh-agentがパスワードを覚えてくれなくなった問題への対処


    過去の手順

    不要:pingのエラー回避

    2018.1.17現在、最新版のcygwinでは管理者権限がない状態でもpingが正しくどうさするようになっている。

    2016年9月24日土曜日

    [cygwin] cygwin64セットアップメモ

    自分向け備忘録。cygwin64環境をセットアップする際の手順をまとめておきます。

    設定


    環境変数

    • HOME
      • ホームディレクトリを設定
    • SHELL
      • "/bin/tcsh"とすることでデフォルトのシェルが切り替わる
        • ※/etc/passwdの編集では切り替わらないので注意

    インストールするパッケージ

    • Archive
      • bzip2
      • p7zip
      • unzip
      • zip
    • Database
      • mysql
      • postgresql-client
      • sqlite3
      • sqliteman
    • Devel
      • autoconf
      • automake
      • bashdb
      • binutils
      • ctags
      • dmalloc
      • doxygen
      • gcc
      • gdb
      • git
      • gitk
      • jlint
      • make
      • mercurial
      • ocaml
      • patch
      • patchutils
      • subversion
    • Doc
      • cygwin-doc (libc関連man page)
    • Editors
      • emacs
      • emacs-X11
      • vim
    • Libs
      • libiconv
      • libncurses-devel
    • Net
      • curl
      • inetutils  (telnet)
      • nc
      • nc6
      • openssh
      • openssl
      • openssl-devel
    • Web
      • ping
      • wget
      • wput
    • Ruby
      • ruby
      • ruby-sqlite3
    • Shells
      • fish
      • rxvt-unicode
      • tcsh
      • xterm
    • Text
      • enscript
      • jq(JSON processor)
    • Utils
    • X11
      • xhost
      • xmodmap
      • xinit
      • xorg-server

    参考

    2015年11月3日火曜日

    [cygwin] cygwinのシェル起動時にPATHの先頭に/usr/binと/usr/local/binが勝手に追加されないようにする

    cygwinのデフォルトの設定では、シェル起動時に以下の2つのディレクトリが自動的にPATHの先頭に追加されます。
    • /usr/local/bin
    • /usr/bin

    cygwinでインストールされているコマンドと同名の別コマンドを優先して起動したい場合には、この設定が邪魔になります。
    これを無効にするには以下の方法があります。お好みでどちらかを選択してください。
    1. /etc/profileもしくは/etc/csh.loginの該当処理をコメントアウトする(bash / tcsh)
      • cygwinがPATHを上書きしているのは、/etc/profile(bashの場合)と/etc/csh.login(tcshの場合)です。これらのスクリプトを編集することで、/usr/binと/usr/local/binが勝手に追加されないようにできます。
    2. ORIGINAL_PATHでPATHを上書きする(bashのみ)
      • シェルにbashを利用している場合は、cygwinがPATHを上書き設定する際、環境変数ORIGINAL_PATHにオリジナルの変数を保存してくれています。これを利用してPATHに上書きすれば、/usr/binと/usr/local/binを含まない設定にすることができます。

    具体的な修正内容:

    1. /etc/profileもしくは/etc/csh.loginの該当処理をコメントアウトする
      • tcshの場合は/etc/csh.loginの7行目をコメントアウトする
      • #set path=( /usr/local/bin /usr/bin /bin $path:q )    # <= ここ
        
        
      • bashの場合は/etc/profileの37行目をコメントアウトする
      •   : ${ORIGINAL_PATH=${PATH}}
          if [ ${CYGWIN_NOWINPATH-addwinpath} = "addwinpath" ] ; then
        #    PATH="/usr/local/bin:/usr/bin${PATH:+:${PATH}}"  # <= ここ
          else
            PATH="/usr/local/bin:/usr/bin"
          fi
        
        
    2. ORIGINAL_PATHでPATHを上書きする
      • tcshではこの方法では対応できません
      • bashの場合は~/.bashrcに以下の記述を追加する
      • export PATH=$ORIGINAL_PATH
        

    参考:

    2015年9月2日水曜日

    [cygwin] cygwin版X server(XWin)にリモートクライアントから接続できない問題の対処方法

    cygwinを最新バージョンにアップデートしたところ、リモートのX clientからwindows上のcygwin版X serverに接続できなくなってしまいました。
    対処方法は簡単でXWin起動時に"-listen tcp"オプションを付けてあげればよいだけです。cygwinバージョンアップ前にはオプション指定なしで接続できていたため、デフォルトの設定が変わったのだと思われます。

    cygwin環境:

    uname -aで表示されるcygwinバージョン情報です。
    % uname -a
    CYGWIN_NT-6.1 xxx 2.2.1(0.289/5/3) 2015-08-20 11:42 x86_64 Cygwin
    

    問題発生時の症状:

    クライアント側で起動したxtermをサーバー側で表示しようとすると、以下のようなエラーになっていました。
    % xterm
    xterm Xt error: Can't open display: xxx:0.0
    

    解決方法:

    XWin.exeの起動パラメタに"-listen tcp"を追加します。Cygwin-Xのアイコン(ショートカット)のプロパティを開き、「リンク先」を以下のように変更してください。
    • (デフォルト)
      • C:\cygwin64\bin\run.exe --quote /usr/bin/bash.exe -l -c "cd; /usr/bin/startxwin"
    • (修正後)
      • C:\cygwin64\bin\run.exe --quote /usr/bin/bash.exe -l -c "cd; /usr/bin/XWin.exe :0 -multiwindow -listen tcp"

    関連情報:

    これ以外にもいろいろとハマリどころはあるので、上記オプションで解決しない場合は以下のケースも疑ってみてください。
    • サーバー(windows/cygwin)側の問題
      • xhostへのクライアント登録ができていない
      • ファイアウォール設定が有効になっている
      • ssh起動時の引数に-Xを指定していない
    • クライアント側の問題
      • DISPLAY環境変数が不正
      • sshdの設定不正(X11Forwardingがnoとなっている)
      • xauthがインストールされていない

    参考:

    2015年8月17日月曜日

    [cygwin][emacs] cygwin版emacsでgtagsを使えるようにする方法

    これまでタグジャンプにはctagsを用いていたのですが、gtagsの「呼び出し元も一覧できる」という機能に惹かれてセットアップしてみました。いくつかはまりポイントがあったのでその対応方法も含め、手順を残しておきます。
    cgwin提供のパッケージにはgtagsは含まれていなかったため、自前でビルドすることにしました。

    目次:

    • gatgsの特徴
    • gtagsのインストール手順
    • emacsの設定
    • gtagsの使い方


    gtagsの特徴:

    • 良い点!
      • 関数の呼び出し元を一覧表示しジャンプできる(gtags-find-rtag)
      • 関数だけでなく、ローカル変数を含む任意のシンボルをタグジャンプできる(gtags-find-symbol)
        • 正規表現で一覧絞り込み可能(gtags-find-pattern)
        • 開いているファイルで絞り込み可能(gtags-parsefiile)
      • 特定文字列をファイル名に含むファイルを一覧できる(gtags-find-file)
      • ジャンプした場所をスタックで記憶しており、何個でも遡れることができる(gtags-pop-stack)
        • コールスタックを調査している場合、この機能が非常に役に立ちます。
    • 悪い点…orz
      • ctags(find-tag)ではclass宣言にジャンプできましたが、gtags-find-tagではタグジャンプできませんでした(typedef, struct, enum定義はOKなのですが)…。コンストラクタ・デストラクタしかタグづけされておらず、class宣言の場所はgtags-find-rtagで探し出さないといけない状態です。
        • できる!というかた是非手順をご教示くださいm(_ _)m


    gtagsインストール手順:

    1. ローカルで適当なディレクトリを作って、GNU GLOBAL source code tagging systemからソースコードのglobal-6.5.tar.gzアーカイブをダウンロードします。
      • (参考)DOS and Windows portsport版のglo65s.zipもありますが、cygwin環境でコンパイル&利用する上ではport版を利用する必要はないようです。port版をビルドする際には、以下の手順でconfigureにchmodで実行可能属性を付与する必要があります。
        • % chmod +x configure
          
        • zipを展開しただけだと実行権限がついておらず、configureスクリプトを実行しようとすると以下のようなエラーになります。
          % ./configure
          ./configure: Permission denied.
          
    2. zipアーカイブを展開し、生成されたglobal-6.5ディレクトリに移動
      • % tar xzf global-6.5.tar.gz
        % cd global-6.5
        
      • 全てのファイルがglobal-6.5ディレクトリ以下に展開されます。
    3. ./configureを実行
      • % ./configure
        
      • 足りないライブラリがあればcygwinパッケージでインストールする。自分の環境では以下のライブラリの追加インストールが必要でした。
        • libncurses-devel
      • このパッケージがない状態で./configureを実行すると以下のようなエラーになります。
      • % ./configure
         (...snip...)
        configure: checking "location of ncurses.h file"...
        configure: error: curses library is required but not found.
        If you are not going to use gtags-cscope, please try ./configure --disable-gtagscscope
        
    4. makeと、make installを実行
      • % make
        % make install
        
      • デフォルトでは/usr/local以下にファイルがコピーされます。
    5. 念のため確認
      • % rehash
        % which gtags
        /usr/local/bin/gtags
        % gtags --version
        gtags (GNU GLOBAL) 6.5
        Copyright (c) 2015 Tama Communications Corporation
        License GPLv3+: GNU GPL version 3 or later <http://www.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.
        
      • /usr/local/binにPATHが通っていないと以下のようなエラーになります。
        % which gtags
        gtags: Command not found.
        


    emacsの設定:

    1. gtags.elをload-pathに移動する
      • % cd /usr/share/emacs/site-lisp
        % ln -s /usr/local/share/gtags/gtags.el . 
        
      • load-pathに/usr/local/share/gtagsを追加する方法でも問題はありません。個人的な好みでsymbolic linkを利用しています。
    2. .emacsの編集
      • ;;; gtags ;;;
        (require 'gtags)
        (add-hook 'java-mode-hook (lambda () (gtags-mode 1)))
        (add-hook 'c-mode-hook (lambda () (gtags-mode 1)))
        (add-hook 'c++-mode-hook (lambda () (gtags-mode 1)))
        
    3. キーバインドのカスタマイズ
      • (setq gtags-mode-hook
              '(lambda ()
                 (local-set-key "\C-j\C-t" 'gtags-find-tag)
                 (local-set-key "\C-j\C-h" 'gtags-find-tag-from-here)
                 (local-set-key "\C-j\C-p" 'gtags-find-pattern)
                 (local-set-key "\C-j\C-r" 'gtags-find-rtag)
                 (local-set-key "\C-j\C-s" 'gtags-find-symbol)
                 (local-set-key "\C-j\C-f" 'gtags-find-file)
                 (local-set-key "\C-j\C-l" 'gtags-parse-file)
                 (local-set-key "\C-j\C-j" 'gtags-pop-stack)
                 ))
        (setq gtags-select-mode-hook
              '(lambda ()
                 (local-set-key "\C-j\C-j" 'gtags-pop-stack)
          (local-set-key [127] 'gtags-pop-stack)      ; [DEL]
                 ))
        
      • M-t, M-r, M-s, C-tにバインドする例が紹介されていましたが、個人的に利用するものとバッティングしていため、C-j C-???にマッピングしています。
      • C-tでは不要でしたが、C-j C-jをgtags-pop-stackにバインドするには、gtags-select-mode-hookでの定義も必要でした。


    gtagsの使い方:

    1. ソース群が格納されたディレクトリのルートへ移動してGTAGSファイルを生成する
    2. % cd src
      % gtags -v
      
    3. emacsを起動しgtags-find-tagで関数名を指定し[RET]
      • 初回はGTAGSファイルの場所を聞かれます。gtagsを実行したディレクトリに生成されているファイルを選択します。

    備考:

    cygwin以外の環境(mac, linux)でも同様の手順でセットアップができました。
    cygwin-mountを入れないと動かないかも、という記述を見かけましたが私の(以下の)環境では問題ありませんでした。
    % uname -a
    CYGWIN_NT-6.3 win8 2.2.0(0.289/5/3) 2015-08-03 12:51 x86_64 Cygwin
    


    参考:

    2015年7月19日日曜日

    [cygwin][haskell][emacs] MinGWでcygwinの"/cygdrive"パスにアクセスする裏技(cygwin環境のemacsでflycheckを動作させる方法)

    haskell関連のコマンドはMinGW上でビルドされているため、cygwin環境の"/cygdrive"から始まるパスには対応していません。haskell-hlintから呼び出されるhlintも当然この問題の影響を受けておりemacs関連の設定が適切にされていたとしても、以下のようなエラーが表示されてしまいます。

    ミニバッファに表示されるエラー詳細:

    Suspicious state from syntax checker haskell-hlint: Checker haskell-hlint returned non-zero exit code 1, but no errors from output: hlint.exe: Couldn't find file: /cygdrive/c/Users/Hiroyuki/tmp/flycheck_hello.hs
    

    MinGW関連コマンドで"/cygdrive"から始まるパスを解釈できない問題の回避方法:

    "/cygdrive"から始まるパスをMinGWによってビルドされたバイナリ(hlint)からも解釈できるようになれば、この問題は回避できるのでは?と考え、mklinkを用いて以下の手順でシンボリックリンクを作ってみました。
    C:\> cd \
    C:\> mkdir cygdrive
    C:\> cd cygdrive
    C:\cygdrive> mklink /d C C:\
    
    これが大成功!"C:\CYGDRIVE\C"に"C:\"へのシンボリックリンクを作っておくことでcygwin上の"/cygdrive/c/xxx/yyy"といったパスがMinGW上では"C:\xxx\yyy"として解釈される状態になります。
    この環境ではemacs上でflycheckが正しく動作するようになりました。

    この環境はMinGW関連コマンド全般に適用可能:

    この裏技はMinGW/MSYSでビルドされた任意のコマンドに適用可能なはずです。cygwin環境とMinGW環境が混在していて、MinGW/MSYS関連コマンドの実行に弊害が出ている方は是非お試しいただければ、と思います。

    余談:うまくいかなかった方法(cygwinのマウント機能の利用メモ):

    cygwin環境において"C:"ドライブのルートを"/C"としてマウントする方法もありますが、MinGWは"/C/xxx/yyy"というパスは解釈できずNGでした。
    % cd /
    % mkdir c
    % mount c: /c
    
    "C:"を/C:"としてマウントできれば、と思ったのですが残念ながら以下のようなエラーになりました…。
    % mkdir c:
    % mount c: c:
    mount: c:: Invalid argument
    

    参考:

    2015年3月27日金曜日

    [cygwin] cygwin版のgitコマンドでサーバーとの通信に失敗する問題の対処

    cygwin上でgitコマンドを使用しているのですが、ある環境でのみgit pull/pushで以下のようなエラーが発生する問題に遭遇しました。調子よく動作している別の環境との比較で原因が判明したので、同じ問題にハマってしまった人向けに情報を残しておきます。

    問題の現象:

    問題の環境ではgit pull/pushを実行すると、以下のようなエラーが出力されていました。
    % git pull origin master
    fatal: 'pull' appears to be a git command, but we were not
    able to execute it. Maybe git-pull is broken?
    
    % git push origin master
    fatal: Full write to remote helper failed: Broken pipe
    

    解決方法:

    この問題はPATH環境変数の設定によって発生します。cygwinのバイナリが格納されているディレクトリ(C:\cygwin64\bin)がユーザー環境変数にしか定義されていない状態だと、このエラーになります。以下のいずれかの設定に変更することで問題を解決できます。

    1. cygwinのシェルスクリプトでpath環境変数の先頭に/usr/binを追加する
      • cygwinをインストールしたデフォルト環境ではこの状態になっています。自分はcabalコマンドがcygwin上で実行できるよう、このデフォルト設定を無効にしていました。
    2. ユーザー環境変数ではなく、システム環境変数のPATHにcygwinディレクトリを追加する
      • 推測ですが、システムプロセスとして/usr/bin以下のコマンドを実行しているのだと思われます。パスの順序は変わらないのに、ユーザー環境変数のPATHにcygwinディレクトリを記述していると、問題の現象が発生しています。

    備考:

    2015年2月8日日曜日

    [cygwin][ruby] Cygwin上でrubyのgemコマンドが動作しない問題の対処方法

    新しいPC(Win8.1)にrubyのrefe, rrse環境をセットアップしようとして気がつきました。私の環境だと、gemコマンドの実行で以下のようなエラーになります。
    ※現状は、refeでなくrefe2を利用する必要があるらしいです。
    % gem install refe
    ERROR:  While executing gem ... (ArgumentError)
        invalid byte sequence in UTF-8
    
    

    私の環境は以下の通り。
    % uname -a
    CYGWIN_NT-6.3 win8 1.7.33-2(0.280/5/3) 2014-11-13 15:47 x86_64 Cygwin
    % ruby --version
    ruby 2.0.0p598 (2014-11-13) [x86_64-cygwin]
    % gem --version
    2.4.1
    
    

    ネット上の情報によると、LANG環境変数にC.BINARYを設定するとよいそうです。 私の環境でも、この方法でエラーを回避することができました。
    % setenv LANG C.BINARY
    % echo $LANG
    C.BINARY
    
    

    これでgemコマンドが正常に動作するようになり、refe/rrseのセットアップを完了しました!
    % gem install refe
    Fetching: refe-0.8.0.3.gem (100%)
    Successfully installed refe-0.8.0.3
    Parsing documentation for refe-0.8.0.3
    Installing ri documentation for refe-0.8.0.3
    Done installing documentation for refe after 3 seconds
    1 gem installed
    % gem install rrse
    Fetching: rack-1.6.0.gem (100%)
    Successfully installed rack-1.6.0
    Fetching: progressbar-0.21.0.gem (100%)
    Successfully installed progressbar-0.21.0
    Fetching: bitclust-core-0.8.0.gem (100%)
    Successfully installed bitclust-core-0.8.0
    Fetching: rrse-0.6.1.gem (100%)
    Successfully installed rrse-0.6.1
    Parsing documentation for rack-1.6.0
    Installing ri documentation for rack-1.6.0
    Parsing documentation for progressbar-0.21.0
    Installing ri documentation for progressbar-0.21.0
    Parsing documentation for bitclust-core-0.8.0
    Installing ri documentation for bitclust-core-0.8.0
    Parsing documentation for rrse-0.6.1
    Installing ri documentation for rrse-0.6.1
    Done installing documentation for rack, progressbar, bitclust-core, rrse after 36 seconds
    4 gems installed
    
    


    参考:

    2015年1月28日水曜日

    [linux][cygwin] less, manの終了直前の画面をクリアしないで端末上に残す方法

    端末上でmanコマンドでオプション引数の詳細を調べて、さあコマンドを実行、というときにオプション引数の情報が画面から消えて困る・・・という目に遭っている方はいないでしょうか。

    最近のlinuxのディストリビューションやcygwin環境ではデフォルトの設定によっって上記の挙動になっていますが、terminfoの設定を適切に変更することで、manコマンドだけでなくlessやviで表示していた画面をそのまま残した状態で、プロンプトに戻りそれを参照しながらコマンドを実行するということが可能になります。

    terminfoの設定手順

    t9mdさんの日記に書かれている通りですが、以下の手順でless, manなどの終了前の画面が端末上に残るようにできます。
    
    % infocmp > screen.terminfo
    % vi screen.terminfo             # vi上でrmcup、smcupを削除
    % tic -o ~/.terminfo screen.terminfo
    % rm -f screen.terminfo
    
    

    rmcup, smcupの削除について、自分の環境では、具体的には以下の二箇所の取り消し線部を削除しました。
    
    # Reconstructed via infocmp from file: /usr/share/terminfo/x/xterm
    xterm|xterm terminal emulator (X Window System), 
     am, bce, km, mc5i, mir, msgr, npc, xenl, 
     colors#8, cols#80, it#8, lines#24, pairs#64, 
     acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, 
     bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l, 
     clear=\E[H\E[2J, cnorm=\E[?12l\E[?25h, cr=^M, 
     csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H, 
     cud=\E[%p1%dB, cud1=^J, cuf=\E[%p1%dC, cuf1=\E[C, 
     cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A, 
     cvvis=\E[?12;25h, dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, 
     dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K, 
     flash=\E[?5h$<100>\E[?5l, home=\E[H, hpa=\E[%i%p1%dG, 
     ht=^I, hts=\EH, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L, 
     ind=^J, indn=\E[%p1%dS, invis=\E[8m, 
     is2=\E[!p\E[?3;4l\E[4l\E>, kDC=\E[3;2~, kEND=\E[1;2F, 
     kHOM=\E[1;2H, kIC=\E[2;2~, kLFT=\E[1;2D, kNXT=\E[6;2~, 
     kPRV=\E[5;2~, kRIT=\E[1;2C, kb2=\EOE, kbs=\177, kcbt=\E[Z, 
     kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, 
     kdch1=\E[3~, kend=\EOF, kent=\EOM, kf1=\EOP, kf10=\E[21~, 
     kf11=\E[23~, kf12=\E[24~, kf13=\EO2P, kf14=\EO2Q, 
     kf15=\EO2R, kf16=\EO2S, kf17=\E[15;2~, kf18=\E[17;2~, 
     kf19=\E[18;2~, kf2=\EOQ, kf20=\E[19;2~, kf21=\E[20;2~, 
     kf22=\E[21;2~, kf23=\E[23;2~, kf24=\E[24;2~, kf25=\EO5P, 
     kf26=\EO5Q, kf27=\EO5R, kf28=\EO5S, kf29=\E[15;5~, 
     kf3=\EOR, kf30=\E[17;5~, kf31=\E[18;5~, kf32=\E[19;5~, 
     kf33=\E[20;5~, kf34=\E[21;5~, kf35=\E[23;5~, 
     kf36=\E[24;5~, kf37=\EO6P, kf38=\EO6Q, kf39=\EO6R, 
     kf4=\EOS, kf40=\EO6S, kf41=\E[15;6~, kf42=\E[17;6~, 
     kf43=\E[18;6~, kf44=\E[19;6~, kf45=\E[20;6~, 
     kf46=\E[21;6~, kf47=\E[23;6~, kf48=\E[24;6~, kf49=\EO3P, 
     kf5=\E[15~, kf50=\EO3Q, kf51=\EO3R, kf52=\EO3S, 
     kf53=\E[15;3~, kf54=\E[17;3~, kf55=\E[18;3~, 
     kf56=\E[19;3~, kf57=\E[20;3~, kf58=\E[21;3~, 
     kf59=\E[23;3~, kf6=\E[17~, kf60=\E[24;3~, kf61=\EO4P, 
     kf62=\EO4Q, kf63=\EO4R, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, 
     khome=\EOH, kich1=\E[2~, kind=\E[1;2B, kmous=\E[M, 
     knp=\E[6~, kpp=\E[5~, kri=\E[1;2A, mc0=\E[i, mc4=\E[4i, 
     mc5=\E[5i, meml=\El, memu=\Em, op=\E[39;49m, rc=\E8, 
     rev=\E[7m, ri=\EM, rin=\E[%p1%dT, rmacs=\E(B, rmam=\E[?7l, 
     rmcup=\E[?1049l, rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[27m, 
     rmul=\E[24m, rs1=\Ec, rs2=\E[!p\E[?3;4l\E[4l\E>, sc=\E7, 
     setab=\E[4%p1%dm, setaf=\E[3%p1%dm, 
     setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m, 
     setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m, 
     sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m, 
     sgr0=\E(B\E[m, smacs=\E(0, smam=\E[?7h, smcup=\E[?1049h, 
     smir=\E[4h, smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, 
     tbc=\E[3g, u6=\E[%i%d;%dR, u7=\E[6n, u8=\E[?1;2c, u9=\E[c, 
     vpa=\E[%i%p1%dd, 
    
    

    cygwin上でinfocmp, ticコマンドをインストールするには

    cygwinではデフォルトではinfocmp, ticはインストールされていません。ncursesパッケージをインストールするとこれらのコマンドが使えるようになります。

    その他

    先日のエントリでlvを紹介した際、lvではlessの-X(--no-init)オプションに相当する機能がないのが残念、としましたがterminfoの設定を変えることで、コマンドに依らず起動中の画面を消さずにそのまま表示を引き継ぐことができることがわかりました。

    参考:

    メモ:

    • infocmpをcmpinfoとtypoしていたのを修正しました(2015/02/18)。

    2015年1月23日金曜日

    [cygwin][linux] lvで複数の文字コードが混在する環境で簡単に文字化けを回避する

    複数の文字コードを扱う環境では「文字化けで読めない・・・、editorで開き直そう。」という煩わしい作業が頻繁に発生しているのではないでしょうか。該当する方はlvというコマンドを利用すれば幸せになれますので是非一度試してみてください。

    lvは入力された文字コードは自動判別し、出力するコードはLANG環境変数で指定している文字コードに変換してくれるので、どんなファイルを与えても文字コード指定なしで意図通り表示してくれます(すばらしい!)。

    環境変数に以下の設定をしておけば、manやgitからもlvが利用されるようになります。-cは文字装飾用ANSIエスケープシーケンスに対応するためのオプション指定です。
     
    PAGER='lv -c'
    
    

    もし自動判別に失敗する、もしくは、LANGで指定していない文字コードで出力したい、といった特殊なケースには、-Iで入力、-Oで出力する文字コードを指定できます。
     
           coding-system:
                  a: auto-select
                  c: iso-2022-cn
                  j: iso-2022-jp
                  k: iso-2022-kr
                  ec: euc-china
                  ej: euc-japan
                  ek: euc-korea
                  et: euc-taiwan
                  u7: UTF-7
                  u8: UTF-8
                  l1..9: iso-8859-1..9
                  l0: iso-8859-10
                  lb,ld,le,lf,lg: iso-8859-11,13,14,15,16
                  s: shift-jis
                  b: big5
                  h: HZ
                  r: raw mode
    
    
    例えば、入力をeuc-japan、出力をshift-jisに指定したい、といった場合には以下のオプションを与えればOKです。
     
    % lv -Iej -Os euc.txt
    
    

    自分にとって唯一残念なのがlessの-X(--no-init)オプションに相当する機能が用意されていない点です。lessだと-Xオプションを指定しておくとlessで表示していた画面がlessをquitした後もそのままの状態でターミナル上に残ります。lessで情報を表示した後に、それを参照しつつコマンド実行する、というケースにはこの機能が必須なのですが・・・

    参考:

    2015年1月17日土曜日

    [cygwin] アップデートで起動しなくなったCygwin-X(1.7.33)の問題の解決方法

    windows7にインストールしているcygwinを最新(1.7.33)に更新したところCygwin-Xが起動しなくなってしまいました。ログを確認しネット上の情報を参考に試行錯誤したところ、正常に起動できる状態に復旧することができたので、その内容をまとめておきます。

    問題の症状

    • Cygwin-XでXを起動すると、一瞬XWin.exeが起動されるが、すぐに終了してしまう。
    • ログ(/var/log/xwin/XWin.0.log)は以下のようになっており、"winClipboardProc - winClipboardFlushWindowsMessageQueue trapped WM_QUIT message, exiting main loop."というメッセージの出力の通り、WM_QUITメッセージによりメインループを抜けてしまっている。
    • Welcome to the XWin X Server
      Vendor: The Cygwin/X Project
      Release: 1.16.3.0
      OS: CYGWIN_NT-6.1 hostname 1.7.33-2(0.280/5/3) 2014-11-13 15:47 x86_64
      OS: Windows 7 Service Pack 1 [Windows NT 6.1 build 7601] (Win64)
      Package: version 1.16.3-1 built 2014-12-30
      
      XWin was started with the following command line:
      
      /usr/bin/XWin :0 -multiwindow -nolisten tcp -auth 
       /cygdrive/c/Users/username/.serverauth.7540 
      
      ddxProcessArgument - Initializing default screens
      winInitializeScreenDefaults - primary monitor w 1920 h 1200
      winInitializeScreenDefaults - native DPI x 96 y 96
      [   403.995] (II) xorg.conf is not supported
      [   403.995] (II) See http://x.cygwin.com/docs/faq/cygwin-x-faq.html for more information
      [   403.995] LoadPreferences: /cygdrive/c/Users/0000119109/.XWinrc not found
      [   403.995] LoadPreferences: Loading /etc/X11/system.XWinrc
      [   403.995] LoadPreferences: Done parsing the configuration file...
      [   403.995] winDetectSupportedEngines - DirectDraw4 installed, allowing ShadowDDNL
      [   403.995] winDetectSupportedEngines - Returning, supported engines 00000015
      [   403.995] winSetEngine - Multi Window or Rootless => ShadowGDI
      [   403.995] winScreenInit - Using Windows display depth of 32 bits per pixel
      [   404.011] winAllocateFBShadowGDI - Creating DIB with width: 1920 height: 1200 depth: 32
      [   404.011] winFinishScreenInitFB - Masks: 00ff0000 0000ff00 000000ff
      [   404.011] winInitVisualsShadowGDI - Masks 00ff0000 0000ff00 000000ff BPRGB 8 d 24 bpp 32
      [   404.011] MIT-SHM extension disabled due to lack of kernel support
      [   404.026] XFree86-Bigfont extension local-client optimization disabled due to lack of shared memory support in the kernel
      [   404.026] glWinSelectGLimplementation: Loaded 'cygnativeGLthunk.dll'
      [   404.026] (II) AIGLX: Testing pixelFormatIndex 1
      [   404.136] GL_VERSION:     3.3.0 - Build 8.15.10.2712
      [   404.136] GL_VENDOR:      Intel
      [   404.136] GL_RENDERER:    Intel(R) HD Graphics 4000
      [   404.136] (II) AIGLX: enabled GLX_SGI_make_current_read
      [   404.136] (II) AIGLX: enabled GLX_MESA_copy_sub_buffer
      [   404.136] (II) AIGLX: enabled GLX_SGI_swap_control and GLX_MESA_swap_control
      [   404.136] (II) AIGLX: enabled GLX_SGIX_pbuffer
      [   404.136] (II) AIGLX: enabled GLX_ARB_multisample and GLX_SGIS_multisample
      [   404.136] (II) 66 pixel formats reported by wglGetPixelFormatAttribivARB
      [   404.136] (II) AIGLX: Set GLX version to 1.4
      [   404.136] (II) 21 fbConfigs
      [   404.136] (II) ignored pixel formats: 0 not OpenGL, 6 RBGA float, 3 RGBA unsigned float, 0 unknown pixel type, 36 unaccelerated
      [   404.136] (II) GLX: Initialized Win32 native WGL GL provider for screen 0
      [   404.229] winPointerWarpCursor - Discarding first warp: 960 600
      [   404.229] (--) 5 mouse buttons found
      [   404.229] (--) Setting autorepeat to delay=500, rate=31
      [   404.791] (II) Loading US keyboard layout.
      [   404.791] (--) Windows keyboard layout: "E0210411" (00000411) "ATOK 2012", type 7
      [   404.791] (--) Found matching XKB configuration "Japanese"
      [   404.791] (--) Model = "jp106" Layout = "jp" Variant = "none" Options = "none"
      [   404.791] Rules = "base" Model = "jp106" Layout = "jp" Variant = "none" Options = "none"
      [   404.853] winInitMultiWindowWM - DISPLAY=:0.0
      [   404.853] winMultiWindowXMsgProc - DISPLAY=:0.0
      [   404.884] winProcEstablishConnection - winInitClipboard returned.
      [   404.884] winInitMultiWindowWM - XOpenDisplay () returned and successfully opened the display.
      [   404.884] winClipboardThreadProc - DISPLAY=:0.0
      [   404.884] OS maintains clipboard viewer chain: yes
      [   404.884] winMultiWindowXMsgProc - XOpenDisplay () returned and successfully opened the display.
      [   404.884] winClipboardProc - XOpenDisplay () returned and successfully opened the display.
      [   405.134] winClipboardProc - winClipboardFlushWindowsMessageQueue trapped WM_QUIT message, exiting main loop. <=== ここ!
      [   405.134] winClipboardProc - XDestroyWindow succeeded.
      [   405.134] winClipboardIOErrorHandler!
      [   405.134] winMultiWindowXMsgProcIOErrorHandler!
      [   405.134] winInitMultiWindowXMsgProc - Caught IO Error.  Exiting.
      [   405.134] winDeinitMultiWindowWM - Noting shutdown in progress
      [   405.134] (EE) Server terminated successfully (0). Closing log file.
      
      

    調査の結果わかったこと

    • HOMEディレクトリに自前の.startxwinrcを用意していると問題が発生する
      • デフォルトの/etc/X11/xinit/startxwinrcのスクリプトが走れば起動する
    • スクリプトで起動している/usr/bin/fbpanelの有無で再現性が変わる

    解決方法

    二通りの解決方法があります。
    1. Xwin.exeを直起動する
      • Cygwin-Xのアイコン(ショートカット)のプロパティを開き、「リンク先」を以下のように変更すればよい。
        • (デフォルト)C:\cygwin64\bin\run.exe --quote /usr/bin/bash.exe -l -c "cd; /usr/bin/startxwin"
        • (修正後)C:\cygwin64\bin\run.exe --quote /usr/bin/bash.exe -l -c "cd; /usr/bin/XWin.exe :0 -multiwindow"
      • この方法だとHOMEディレクトリ以下の.startxwinrcがロードされないので注意してください(.xinitrc, .Xclientsもロードされない模様)。
    2. 自前の.startxwinrcで/usr/bin/fbpanelを起動する
      • fbpanelを起動すると画面左上の最前面に常にXアイコンが表示される状態になり、非常にジャマです。fbpanelを使いたい!という人以外には、この方法はおすすめしません。
    残念ながら、根本原因を突き止めることはできていません。環境によってはこの解決策は意図した通り機能しないかも…。

    参考情報

    いずれも自分の環境では解決には至りませんでしたが、参考まで。

    (2016/11/08追記)

    cygwinを最新版(2.6.0)にアップデートしたところ、インストールしたままのデフォルトの状態でXサーバーが起動できるようになっていることが分かりました。逆に、本エントリで紹介しているXWin.exeを直に起動する手順を実行するとXサーバーの起動に失敗する(いつまでまっても起動されない)のでご注意を。


    2015年1月15日木曜日

    [haskell][cygwin] cygwinのシェル上でcabal install cabal-installが失敗する問題の対処方法

    Windows7上でcabal install cabal-installがエラーになる問題に遭遇しました。その症状と解決方法をまとめておきます。

    問題の症状

    Windows7にHaskell Platform 2014.2.0.0をインストールしている環境でcabal install cabal-installを実行すると、以下のようなエラーとなりインストールに失敗してしまいます。cygwinは 1.7.33-2。
    % cabal install cabal-install
    Resolving dependencies...
    Configuring Cabal-1.22.0.0...
    Failed to install Cabal-1.22.0.0
    Last 10 lines of the build log ( C:\Users\XXX\AppData\Roaming\cabal\logs\Cabal-1.22.0.0.log ):
    [73 of 78] Compiling Distribution.Simple.UserHooks ( C:\Users\000011~1\AppData\Local\Temp\Cabal-1.22.0.0-10368\Cabal-1.22.0.0\Distribution\Simple\UserHooks.hs, C:\Users\000011~1\AppData\Local\Temp\Cabal-1.22.0.0-10368\Cabal-1.22.0.0\dist\setup\Distribution\Simple\UserHooks.o )
    [74 of 78] Compiling Distribution.Simple.Bench ( C:\Users\000011~1\AppData\Local\Temp\Cabal-1.22.0.0-10368\Cabal-1.22.0.0\Distribution\Simple\Bench.hs, C:\Users\000011~1\AppData\Local\Temp\Cabal-1.22.0.0-10368\Cabal-1.22.0.0\dist\setup\Distribution\Simple\Bench.o )
    [75 of 78] Compiling Distribution.Simple.Test.ExeV10 ( C:\Users\000011~1\AppData\Local\Temp\Cabal-1.22.0.0-10368\Cabal-1.22.0.0\Distribution\Simple\Test\ExeV10.hs, C:\Users\000011~1\AppData\Local\Temp\Cabal-1.22.0.0-10368\Cabal-1.22.0.0\dist\setup\Distribution\Simple\Test\ExeV10.o )
    [76 of 78] Compiling Distribution.Simple.Test ( C:\Users\000011~1\AppData\Local\Temp\Cabal-1.22.0.0-10368\Cabal-1.22.0.0\Distribution\Simple\Test.hs, C:\Users\000011~1\AppData\Local\Temp\Cabal-1.22.0.0-10368\Cabal-1.22.0.0\dist\setup\Distribution\Simple\Test.o )
    [77 of 78] Compiling Distribution.Simple ( C:\Users\000011~1\AppData\Local\Temp\Cabal-1.22.0.0-10368\Cabal-1.22.0.0\Distribution\Simple.hs, C:\Users\000011~1\AppData\Local\Temp\Cabal-1.22.0.0-10368\Cabal-1.22.0.0\dist\setup\Distribution\Simple.o )
    [78 of 78] Compiling Main             ( C:\Users\000011~1\AppData\Local\Temp\Cabal-1.22.0.0-10368\Cabal-1.22.0.0\Setup.hs, C:\Users\000011~1\AppData\Local\Temp\Cabal-1.22.0.0-10368\Cabal-1.22.0.0\dist\setup\Main.o )Linking C:\Users\000011~1\AppData\Local\Temp\Cabal-1.22.0.0-10368\Cabal-1.22.0.0\dist\setup\setup.exe ...
    Configuring Cabal-1.22.0.0...
    setup.exe: fd:4: invalid argument
    setup.exe: fd:4: hGetContents: invalid argument (invalid byte sequence)
    cabal.exe: Error: some packages failed to install:
    Cabal-1.22.0.0 failed during the configure step. The exception was:
    ExitFailure 1
    cabal-install-1.22.0.0 depends on Cabal-1.22.0.0 which failed to install.
    
    

    調べてわかったこと

    自分の環境では/bin/tcshをシェルに設定していますが、/bin/bashに変えても症状は改善せず。
    cygwin上で自動的に先頭に登録されるパス(/usr/bin)と環境変数LANG=ja_JP.UTF-8が原因。

    解決方法

    PATHの設定で、mingwのバイナリが格納されたディレクトリ(C:\Program Files\Haskell Platform\2014.2.0.0\mingw\bin)をcygwinのディレクトリ(/usr/bin, /usr/local/bin)よりも前書いておく。
    cygwinはシェル起動スクリプトで/usr/binと/usr/local/binを勝手にPATHの先頭に追加してしまします。ここの情報を参考に順番を整理してください。
    この設定をした上で、以下の手順のどちらかを実行すれば問題を回避することができます。
    1. コマンドプロンプト上で実行する
    2. コマンドプロント(cmd.exe)を起動してcabal install cabal-installを実行すると、以下の通り正常にインストールすることができました。 なぜcygwin上だと失敗してしまうのか。ディレクトリセパレータの扱いがコマンドプロンプト上とcygwin上で変わっているのが原因ではないか、と疑ってはいますが正確なところは調べられていません・・・。
      C:\Windows\system32>cabal install cabal-install
      Resolving dependencies...
      Configuring Cabal-1.22.0.0...
      Building Cabal-1.22.0.0...
      Installed Cabal-1.22.0.0
      Configuring cabal-install-1.22.0.0...
      Building cabal-install-1.22.0.0...
      Installed cabal-install-1.22.0.0
      
    3. cygwin環境のLANG環境変数を削除する
    4. コマンドプロンプトではなく、cygwinのターミナル上発生する問題を回避するには、LANG環境変数を変更する必要があります。cabalに以下のaliasを設定しておけば、cabal実行時のみLANG環境変数を無効にできます。
      alias cabal env LANG= cabal
      

    参考: 

    2014年8月23日土曜日

    [emacs][cygwin][mac] cygwin及びmac環境へのcmigemoのインストール

    cmigemoという便利なツールあることを知って、Windows(cygwin)とmacにインストールしました。cmigemoを利用することで、emacsのI-searchでひらがな・カタカナ・漢字を検索できるようになり非常に便利です!
    例えば、C-sもしくはC-rに続き"kara"を入力すると、メインバッファ中の「から」「」「(からす)」「カラオケ」「karaoke」「小」がインクリメンタルサーチにかかります。

    cygwinでのインストール手順

    • Cygwin SetupからC/Migemoのビルドに必要なパッケージをインストール
      • cygwinディレクトリのsetup_x64_64.exe(setup_x64.exe)を起動し、以下のパッケージを選択、インストールします。
        • Devel
          • gcc
          • make
        • Libs
          • libiconv
        • Web
          • wget
    • qkcのインストール
      • QKC Home Pageから"For UNIX"版のzipアーカイブをダウンロードしてインストールします。
      • 
        % unzip qkcc100.zip
        % make
        % cp qkc.exe /usr/local/bin
        
        
    • cmigemoのインストール
      • 以下のコマンドを実行することでインストールできます。オフィシャルな手順はcmigemo/doc/README_j.txtに記載されています。
      • 
        % git clone https://github.com/koron/cmigemo.git
        % cd cmigemo
        % ./configure
        % make cyg
        % make cyg-dict
        % make cyg-install
        
        
      • ./configureで"$'\r': コマンドが見つかりません"というエラーが出る場合はこちらを参考にしてエラーを回避してください。
      • 最後のmake cyg-installの実行で/usr/local以下に関連ファイルがコピーされます。アンインストールしたい場合にはmake cyg-uninstallを実行してください。
        • <要確認>インストールには管理者権限が必要(管理者権限を付与したターミナル上で実行)?
    • migemo.elのインストール
      • emacsを起動し以下のコマンドを実行
      • 
        M-x package-refresh-contents
        M-x package-install migemo
        
        
      • .emacsに以下のコードを追加
      • 
        (require 'migemo)
        (setq migemo-command "cmigemo")
        (setq migemo-options '("-q" "--emacs"))
        ;; Set your installed path
        (setq migemo-dictionary "/usr/local/share/migemo/utf-8/migemo-dict")
        (setq migemo-user-dictionary nil)
        (setq migemo-regex-dictionary nil)
        (setq migemo-coding-system 'utf-8-unix)
        (load-library "migemo")
        (migemo-init)
        
        

    macでのインストール手順

    • cmigemoのインストール
      • 以下のコマンドを実行することでcmigemoをインストールできます。デフォルトでインストールされているnkf, iconvが利用されるため、cygwinで行ったセットアップは不要です。
      • 
        % git clone https://github.com/koron/cmigemo.git
        % cd cmigemo
        % ./configure
        % make osx
        % make osx-dict
        % sudo make osx-install
        
        
      • デフォルトのインストール先は/usr/localになります。/usr/local/bin, /usr/local/libがPATH, LD_LIBRARY_PATHに設定されていない場合にはこれらを追加する必要があります。
    • migemo.elのインストール
      • emacsを起動し以下のコマンドを実行
      • 
        M-x package-refresh-contents
        M-x package-install migemo
        
        
      • .emacsに以下のコードを追加。utf8を利用する設定が紹介されておりcygwin環境ではそれを用いましたが、自分のmac環境ではutf8では後述の問題が出たためeuc-jpを設定しています。
      • 
        (require 'migemo)
        (setq migemo-command "cmigemo")
        (setq migemo-options '("-q" "--emacs"))
        ;; Set your installed path
        (setq migemo-dictionary "/usr/local/share/migemo/euc-jp/migemo-dict") ; macではutf8はNG?
        (setq migemo-user-dictionary nil)
        (setq migemo-regex-dictionary nil)
        (setq migemo-coding-system 'euc-jp) ; macではutf8はNG?
        (load-library "migemo")
        (migemo-init)
        
        
    • (補足)macではutf8の設定では正しくI-searchできない?
      • cygwinと同じ手順で「mac環境でも幸せ〜」になる予定だったのですが、アルファベットのI-searchができず不幸せな状態になってしまいました。問題の状況は"compile"を検索しようとして"co"をI-searchで入力しても検索に失敗してしまう、という状態でした。ミニバッファには以下のような情報が出力されています。"compi"まで入力すれば検索できる状態になります。
        • [MIGEMO] I-search: co [incomplete input]
      • この情報を見つけて以下のコマンドを実行してみましたが状況は改善せず。
        • M-x migemo-pattern-alist-clear
      • 試行錯誤した結果、エンコードをutf8からeuc-jpに変更すると正しく動作するようになったため、現状はこの設定で利用しています。

    参考

    [cygwin] 改行コードにCR+LFが用いられているスクリプトを実行する手順

    キャリッジリターン(CR, コードは0x0d)が改行コードとして用いられているスクリプトファイルをcygwin上で実行しようとすると、以下のようなエラーになります。
    
    ./configure: line 16: $'\r': コマンドが見つかりません
    
    

    ネット上で解決方法を探してみたところ、.bashrcで以下の設定をしておけばよいとのこと。
    
    export SHELLOPTS
    set -o igncr
    
    

    ところが自分のcygwin環境ではシェルにtcshを用いているために、上記の対応では問題を解決できませんでした。tcsh上でファイル先頭に
    
    #!/bin/sh
    
    
    が記載された、bash/shのスクリプトを起動したタイミングではホームディレクトリの.bashrcはロードしてくれないようです。/etc/bash.bashrc, ~/.startxwinrcに設定をいれてみても状況は改善せず…。
    最終的に/etc/profileにSHELLOPTSの設定を入れることで、意図した動作になりました。

    参考

    2014年3月11日火曜日

    [cygwin][linux] tcshのデフォルト補完設定のイマイチな部分を修正しよう

    cygwinや最近のlinuxディストリビューション上でtcshを起動すると、デフォルトでたくさんの補完設定がされていて便利なのですが、局所的に自分の使い方とマッチしない設定があるのでそれを修正します。
    cygwinでは/etc/profile.d/complete.tcshに、ubuntuでは/etc/complete.tcshにあるデフォルト設定ファイルを編集することになります。

    イケてない設定1:cpやmvの第二引数の補完対象がディレクトリに限定されている

    一番イケてないのがcp/mvのデスティネーション(第二引数)がディレクトリに限定されている点。上書き先に直接ファイルを指定したい、または複数ファイルをまとめてコピーしたい、といったケースで補完が効きません・・・。
    
        complete mv  c/--/"(backup force interactive update verbose suffix \
       version-control help version)"/ \
       c/-/"(b f i S u V v -)"/ \
       n/{-S,--suffix}/x:''/ \
       n/{-V,--version-control}/"(t numbered nil existing \
       never simple)"/ n/-/f/ N/-/d/ p/1/f/ p/2/d/ n/*/f/
    
        complete cp  c/--/"(archive backup no-dereference force \
           interactive link preserve parents sparse recursive \
       symbolic-link suffix update verbose version-control \
       one-file-system help version)"/ \
       c/-/"(a b d f i l P p R r S s u V v x -)"/ \
       n/-*r/d/ n/{-S,--suffix}/x:''/ \
       n/{-V,--version-control}/"(t numbered nil existing \
       never simple)"/ n/-/f/ N/-/d/ p/1/f/ p/2/d/ n/*/f/
    
    
    取り消し線で潰してある"p/2/d"を削除すれば所望の動作になります。ちなみに"p"は引数位置を指定するパターンコマンドで"2"が第二引数、"d"が(ファイルを除く)ディレクトリを意味しています。


    イケてない設定2:lnの第二・三引数で補完が効かない

    lnコマンド実行時"-s"オプションを指定の上、任意のディレクトリ・ファイルを第一引数に指定しますが、これが第二引数と解釈され、以下のような結果になります。
    % ln -s [CTRL-D]
    <link_name>
    
    取り消し線の"p/2/x:'<link_name>'"を"p/2/f/'"に置き換えれば第二・三引数で補完が効くようになります。
    % ln -s [CTRL-D]
        complete ln  c/--/"(backup directory force no-dereference \
           interactive symbolic suffix verbose version-control \
       help version)"/ \
       c/-/"(b d F f i n S s V v -)"/ \
       n/{-S,--suffix}/x:''/ \
       n/{-V,--version-control}/"(t numbered nil existing \
       never simple)"/ n/-/f/ N/-/x:'<link_name>'/ \
       p/1/f/ p/2/x:'<link_name>'/ p/2/f/ 
    
    


    イケてない設定3:gitコマンドが補完できない

    svnは対応されており、以下のようなコマンドが補完されるのですが、gitは登録されておらずコマンドを補完してくれません。
    
    % svn [CTRL-D]
    add      cleanup  export   list     merge    propedit resolved unlock
    blame    commit   help     lock     mkdir    propget  revert   update
    cat      copy     import   log      move     proplist status   
    checkout delete   info     ls       propdel  propset  switch   
    
    

    svnの設定をコピって以下の補完を追加。"@"は"/"と同じ意味です。
    
        complete git  'n@help@(add bisect branch checkoutclone \
                commit diff fetch grep init log merge mv \
       pull push rebase reset rm show status tag)@' \
       'p@1@(add bisect branch checkoutclone \
                commit diff fetch grep init log merge mv \
       pull push rebase reset rm show status tag)@'
     
    

    イケてない設定4:Haskell関連コマンドの補完が未登録

    ghc、ghci、cabalの補完設定も追加して幸せになりましょう。
    
        complete ghc  c/-v/"(0 1 2 3 4 5)"/ \
                c/-i/d/ \
                c/--/"(interactive make mk-dll help show-iface \
             supported-extensions supported-languages \
             info version numeric-version print-libdir)"/ \
       c/-W/"(all error warn)"/ \
       c/-{fwarn-,fno-warn-}/"(unrecognised-pragmas \
              warnings-deprecations deprecated-flags \
              unsupported-calling-conventions \
              dodgy-foreign-imports dodgy-exports \
              dodgy-imports lazy-unlifted-bindings \
              duplicate-exports hi-shadowing \
              identities implicit-prelude \
              incomplete-patterns incomplete-uni-patterns \
              missing-fields missing-import-lists \
              missing-methods missing-signatures \
              missing-local-sigs name-shadowing \
              orphans auto-orphans overlapping-patterns \
              tabs type-defaults monomorphism-restriction \
              unused-binds unused-imports unused-matches \
              unused-do-bind wrong-do-bind )"/ \
       c/-f/"(defer-type-errors helpful-errors \
              force-recomp warn- no-warn-)"/ \
        c/-/"(E C S c fglasgow-exts O prof H14m M e V w\
             ferror-spans ghc-timing fforce-recomp ?)"/ \
       n/-{odir,hidir,stubdir,dumpdir,outputdir,tmpdir}/d/ \
       'n/--make/f:*.hs/' \
        'n/*/f:*.hs/'
    
        complete ghci c/-i/d/ \
                c/-/"(fglasgow-exts H32m cpp i)"/
    
        complete cabal c/--{config-file,sndbox-config-file}=/f/ \
       c/--/"(help version numeric-version config-file= \
                      sandbox-config-file=)"/ \
       p/1/"(install update list info fetch get check \
            sdist upload report run init configure build \
            repl sandbox copy haddock clean hscolour \
            register test bench help)"/
    
    

    参考にしたサイト:

    2013年1月11日金曜日

    [windows][cygwin] windows7 上で ping が "ping: socket: Operation not permitted" になる問題の対処

    windows7 上に cygwin の ping をインストールして実行すると、以下のようなエラーが出ます。

    % ping hogehost
    ping: socket: Operation not permitted

    試行錯誤の末、ping.exeを右クリックしてプロパティダイアログを表示し、「互換性」タブの「管理者としてこのプログラムを実行する」にチェックを入れることで、pingが正常動作するようになりました。





    google先生に伺ったところ、どうもファイアウォールの設定で管理者にしかICMPv4の送受信権限が与えられていないようです。と、歯切れが悪いのは、ここに載っていた情報に従って設定したにもかかわらず、状況が改善しなかったためです。

    # もし正しいよりスマートな設定方法をご存じの方、是非お知らせください。m(_ _)m


    (以下、2013/05/16追記)
    ping.exe自体に管理者権限を設定してもエラーになる環境が多く悩んでいたのですが、cygwinのMLにこのような過去ログを発見しました。
    これによると、ping.exeを起動するターミナル(mintty)側に予め管理者権限を設定しておく必要がある、ということです。

    私はXを使っているので試しにrun.exeに管理者権限を与えておくと、X上で起動した任意のターミナルがその権限を引き継いでくれて、ping.exeも正しく動作することが分かりました!


    この設定をしておくとping.exe自体には管理者権限を設定する必要はありません。



    (以下、2016/09/29追記)
    ショートカットの詳細設定で「管理者権限で実行」にチェックを入れておくと、管理者権限でXWinを起動できます。ですが、起動時に毎回「ユーザーアカウント制御」ダイアログが表示されて「この不明な発行元からのアプリがデバイスに変更を加えることを許可しますか?」、[はい」ボタンを押す必要があり、非常に面倒・・・。
    このダイアログをスキップできないかと思ってネット上の情報を漁ってみたところ、UAC全体を無効にすることなく、XWinの起動時だけダイアログ表示をスキップするうってつけの方法が見つかりました。
    タスクスケジューラにタスクを設定することでダイアログ表示を回避できます。以下のサイトを参考に設定してください。


    (2016/10/16追記)
    上記タスクスケジューラからアプリを起動すると、プロセスの優先度が「通常以下」となり、動作が遅くなる問題がありました。以下の手順で「通常」優先度でタスクを起動するとよいです。



    2012年7月23日月曜日

    [ssh][linux][cygwin] ssh-agentの重複起動を防ぐには

    ssh, sftp, scp でパスワードの入力を省略するにはssh-agentを使います。

    このssh-agentは便利なのですが、何も考えずに利用しているとターミナル毎に個別にssh-agentを起動する羽目になり、気がつくとssh-agentが複数動いている、という状況に陥ってしまいます。

    これはssh,sftp,scpなどのクライアントツールが、ssh-agentを利用するために2つの環境変数(SSH_AUTH_SOCKとSSH_AGENT_PID)を参照しているためです。逆に言うと、これらの環境変数をターミナル間で共有することができれば、ssh-agentをその都度起動しなくてもよくなり、共有することができます。


    このブログで見つけたシェルスクリプトを.bashrc(もしくは.tcshrc)に追加することで、ターミナル起動時(=シェル起動時)に以下のお世話をしてくれます。

    • ssh-agentが起動済みかどうかをチェック
    • 未起動であれば起動
      • 2つの環境変数を$HOME/.ssh/environmentに記録
      • その後、ssh-addコマンドも実行してパスフレーズ入力を促す
    • 起動済であれば、2つの環境変数の設定を引き継ぐ
    .bashrcへの追加スクリプト(前述ブログのまま)

    SSH_ENV=”${HOME}/.ssh/environment”
    SSHAGENT=/usr/bin/ssh-agent
    SSHAGENTARGS=”-s”
    
    function start_agent {
        echo -n “Initialising new SSH agent…”
        ${SSHAGENT} | sed ‘s/^echo/#echo/’ > “${SSH_ENV}”
        echo succeeded
        chmod 600 “${SSH_ENV}”
        . “${SSH_ENV}” > /dev/null
        ssh-add
    }
    
    # Source SSH settings, if applicable
    
    if [ -f “${SSH_ENV}” ]; then
        . “${SSH_ENV}” > /dev/null
        #ps ${SSH_AGENT_PID} doesn’t work under cywgin
        ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
            start_agent;
        }
        if [[ -z `ssh-add -l | grep “${HOME}/.ssh/id_”` ]]; then
            ssh-add
        fi
    else
        start_agent;
    fi


    .tcshrcへの追加スクリプト(前述ブログのbashスクリプトをtcshスクリプトにポート)

    setenv SSH_ENV "$HOME/.ssh/environment"
    setenv SSHAGENT `which ssh-agent`
    setenv SSHAGENTARGS "-c"
    
    if ( -f "${SSH_ENV}" ) then
        source "${SSH_ENV}"
        ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent > /dev/null
        if ( $status == 1 ) then
            #echo "no agent found."
            goto call_start_agent
        endif
        ssh-add -l | grep "${HOME}/.ssh/id_" > /dev/null
        if ( $status == 1 ) then
            #echo "no key added."
            goto call_ssh_add
        endif
    else
        goto call_start_agent
    endif
    goto exit_ssh
    
    # Source SSH settings, if applicable
    call_start_agent:
        echo -n "Initialising new SSH agent... "
        ${SSHAGENT} | sed 's/^echo/#echo/' > "${SSH_ENV}"
        echo succeeded
        chmod 700 "${SSH_ENV}"
        source "${SSH_ENV}"
    
    call_ssh_add:
        ssh-add
    
    exit_ssh:

    2011年6月22日水曜日

    [cygwin] cygwin上でssh-agentを使いたい

    「cygwin上でssh-agentを使いたい」と考えていたのですが、ようやく実現しました。

    ググってwin-ssh-askpassなるものが存在することを知り、
    セットアップしたところ、すんなり動きました。
    参考にしたのは以下のサイトの情報です。

    起動batファイルはそのままだとエラーになったため微妙に修正しています。
    set CygPath=C:\cygwin\bin
    set SshAgent=%CygPath%\ssh-agent

    set BinPath=C:\Documents and Settings\XXX\My Documents\bin
    set WinSshAgent="%BinPath%\win-ssh-agent.exe"

    rem set WinSshOpt=--hide-console --no-ssh-agent --no-DISPLAY --no-default-identity
    set WinSshOpt=--hide-console --no-ssh-agent --no-DISPLAY

    start /b /d %HOME% %SshAgent% %WinSshAgent% %WinSshOpt%

    修正版win-ssh-agent.bat

    一点だけ、微妙にはまった問題が。
    .ssh 以下のファイルのアクセス権が全公開になっていると、エラーになります。
    linux上と同じようにちゃんと非公開にしてないとダメみたいです。


    P.S. 全然別の話になりますがcygwinのemacsがふつうに使えてびっくりです。
    Meadowだとcygwinのパスが理解できなかったりshell-modeの動作がいまいちだったのですが、その不満が解消されました!