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

2015年3月31日火曜日

Emacsとシェルのパスを共有

.zshrcなんかで設定しているパスの変数をEmacs側でインポートしてEmacsからでも通るようにするlispがあります。
これです。
purcell/exec-path-from-shell

MELPAに登録されているので簡単にダウンロードできます。
以下のように設定しておくと好みの変数を持ってきてこれます。
;; load environment variables -------------------------------
(let ((envs '("PATH" "C_INCLUDE_PATH" "CPLUS_INCLUDE_PATH" "TEXINPUTS" "BSTINPUTS" "BIBINPUTS")))
(exec-path-from-shell-copy-envs envs))
これで.zshrcの方だけで管理しておくことができます。
以下の記事の後半の設定とかいらなくなります。
Ochiailab Tips: LaTeXのsty, bst, bibファイルなどを単一フォルダで管理する方法

便利なので使え。

参考サイト: Emacsでの環境変数の設定に exec-path-from-shellを使うようにした - Life is very short

2013年11月8日金曜日

GitとGitHubかBitbucketを利用してソースのバックアップを取る

楽天優勝おめでとうございます。

Gitは本来プロジェクトやコードのバージョン管理をするツールですが、僕らの研究ではあまり使う機会がありません。
でも使い方によってはBitbucketやGitHubなどのウェブサービスと一緒に使うことでソースコードのバックアップを取ることができます。
しかも他のPCからも疑似的に同期できます。
手動ですが。
Dropboxで同期してるから大丈夫だと思ってても、ファイルを消してしまったら同期しているPC全てでそのファイルが消えてしまうので安全ではないです。

以下に書くことは僕もまだ学習中なので、おかしな点があればご指摘お願いします。

Git, GitHub, Bitbucketとは

バージョン管理システムっていうのはGitに限らず、CVSとかSubversionなどというものもあって、今一番旬なのがGitです。
GitHubやBitbucketっていうのはGitのホスティングサービスとかいうやつで、Gitで管理しているプロジェクトのバックアップ先だと思っていいです。
Gitに対応したホスティングサービスは以下に比較があります。
Gitホスティングサービス5選【比較表付き】 | Find Job ! Startup
GitHubは有料会員にならない限り、アップしてるソースが全世界に公開されるのに対し、Bitbucketは逆に無料会員だと基本的に公開はされません。
他人と共同作業したいならGitHub、個人で利用ならBitbucketがいいと思います。
僕は一応両方登録してて、今のところEmacsの設定だけGitHubに上がってます。

Gitの設定

まずやることは、ローカルのPC内でGitの初期設定です。
以下のコマンドをターミナルから一つずつ打ちます。
名前などは適宜変えてください。
git config --global user.name "Your Name"
git config --global user.email "your_email@example.com"
そうすると、「~/.gitconfig」に以上の内容が書き込まれます。
このファイルを直接いじることも可能です。
GitHubだとこれらのデータが全世界に知れ渡る可能性があるので、ニックネームとかでもいいです。(mmmmiya_rなど)

次はバックアップを取りたいプロジェクト内での設定です。
もし研究専用のフォルダがあるならそのフォルダがいいと思います。
僕みたいに中にサブフォルダがいくつもある人は、そのルートフォルダごとバックアップを取るのがいいでしょう。
色んなフォルダで独立して管理しているなら、そのフォルダごとに設定をすることになります。

Gitの使い方

まず簡単なGitの使い方から説明します。
ターミナルで管理したいフォルダに移動してください。
ここでは「program」というフォルダ名にしときます。
cd program
そしたらば、次はそのフォルダをGitの対象にするために以下のコマンドを入力します。
git init
これで、「program」の中に「.git」というフォルダができます。
この「.git」というフォルダの中に、これから先行う全てのバージョンの情報が保存されていくことになります。
これをリポジトリというらしいです。

次は「program」内の全てのファイルをバージョン管理の対象にすることをGitに伝えるために以下を入力します。
git add .
ドット(.)があることに注意してください。
ドットはカレントディレクトリを表すので、カレントディレクトリ以下の全てのフォルダが対象になります。

この段階ではまだ一つのバージョンとして保存はされていません。
なので、この一番最初のバージョンを作るために以下を入力します。
git commit -m "First commit."
このcommitまでやって始めて一つのバージョンができあがります。
-mのオプションは、後で見返したときにどういう変更が行われたのか分かりやすいようにメッセージを付けるオプションで、省略するとエディタが立ち上がって入力画面になります。
何も書かずに終了したらcommitされません。

そして、今フォルダ内の「text.txt」というファイルをいじったとします。
このいじった内容を次のバージョンとして保存したい場合は、順番に
git add text.txt
git commit -m "text.txt is modified."
とします。

ここまでまとめると、「git add」でファイルを次のバージョン管理の対象にして、「git commit」で一つのバージョンとして保存しておく、ということになります。

このように2段階になっている理由は、複数のファイルの変更したけど特定のファイルは次のバージョンに入れたくない場合があるからです。
ただ単にバックアップ目的ならば、全ての変更ファイルや新しく作ったファイルをまとめてaddしたいと思うでしょう。
そのときは
git add -A
これでOKです。
また、git addとgit commitの二段階踏むのめんどくさいと思う人は
git commit -a
これでgit add -A してgit commitしたことと同じになります。

.gitignore

さて、まだ本題に入る前にもう少しだけGitの説明します。
git add -Aっていうのは全てのファイルをバージョン管理の対象とするので、Emacsの一時保存ファイルなんかも対象になってしまいます。
こういういらないデータをGitの対象外にするには「program」直下に「.gitignore」というファイルを作ってそこに一覧を書いておきます。
例えば
# Emacs temp files
*~
[#]*[#]
.\#*
といった具合に正規表現(正式にはglobパターン)が使えます。
C言語使っている人なら、「~.o」ファイルなどアーキテクチャに依存するファイルも対象外にしたいかと思います。
以下に色んな言語に対応した「.gitignore」のテンプレートがあります。
https://github.com/github/gitignore

git commitまで使いこなせないと目的のバックアップを取るとこまで辿りつけないので練習しましょう。

GitHub, Bitbucketとの連携

さてここからはGitのホスティングサービスの説明に移らさせていただきます。
GitHubかBitbucketどっち使うか決めたら登録してください。
ニックネームやメールアドレスは、さっきやったgit configのものを使ったほうがいいかもしれません。
以下「user-name」という名前で登録したと仮定します。

SSHキー

PCとGitHubがSSHを利用した公開鍵認証で接続されるので、まずはその鍵を生成します。
ローカルPCで以下を入力します。
ssh-keygen -t rsa -C "your_email@example.com"

そしたらどこに保存するか聞かれて、これはデフォルトでいいので[Enter]を押します。
そして2回パスフレーズ(パスワードみたいなもの)を入力したら変なアスキーアートみたいなのが表示されて完了です。
「~/.ssh/id_rsa.pub」というファイルに書き込まれます。

で、これをGitHubかBitbucketのサイト上で登録します。
GitHubなら「Account settings」の「SSH Keys」で適当なタイトル(例えばPCのマシン名)を付けて、「~/.ssh/id_rsa.pub」のファイルの中身をそのままKeyにコピペしてAdd keyしてください。
Bitbucketでも同様に設定画面からSSHキーの追加ができます。
これでPCからのアクセスでいちいちパスワード入力しなくてよくなるはずです。

リポジトリ生成

次はバックアップ用のフォルダをサイト上で作ります。
サイト上でリポジトリを作成してください。
GitHubなら右上の方にある「Create a new repo」を押すといいです。
Bitbucketなら、日本語の表示にしていたら上部の「作成」を押すといいです。
そしたらレポジトリの名前なんかを入力します。
フォルダ名と同じ「program」がいいかもしれません。
あとは手順通りに作成しますが、GitHubだとReadmeファイルを作るかとかライセンスはどうするかといったことまで聞かれると思いますが、作らなくていいです。
これで空のレポジトリができて、GitHubでもBitbucketでもこの後どうすべきか指示が出るはずです。
一応この画面を消さずに残しといてください。
コピペで使える部分があります。

ローカルPCでの設定

もう少し続きますよ。
次は今サイト上で作ったリポジトリを、PC内でバックアップ先として指定するための設定を行います。
PC上のターミナルで「program」に入ってください。
GitHubを使っている場合は以下を入力します。
git remote add origin https://github.com/user-name/program.git
Bitbucketなら以下です。
git remote add origin ssh://git@bitbucket.org/user-name/program.git
以上のコマンドはさっき残しておけと書いたページに書いてあるのでコピペでいけます。

何をやっているのかというと、バックアップ先にoriginという名前を付けて登録しています。
バックアップ先は多分何個も登録できるのですが、ややこしくなりそうなのでやめたほうがいいかもしれません。

アップロード

ここまできて、やっとバックアップを取る準備が整いました。
あとはPCのターミナルで「program」に入って以下を入力します。
git push -u origin master
こうすると転送が始まってサイト上にアップロードされるというわけです。
追記:Bitbucketだとこれじゃいかないかもしれなくて、さっき残しておいたページの説明通りにやれば進められるはずです。

もしさっきサイト上でリポジトリ作ったときに、Readmeファイルなどを作ってしまっていると既に別のファイルが存在してしまっているというエラーが出ます。
そのときは一度
git pull origin master
って打てばどちらのファイルも維持されたまま併合(マージ)されます。
その後にgit pushしてください。

日々の生活

さて、これで一通り設定は終わりです。
あとはこまめにgit addとgit commitをやって、一日の終わりなどに
git push
とやれば、その日の変更履歴がサイト上にアップロードされるというわけです。
MacではSourceTreeというGUIソフトがあるのでGUIしか使えない人も便利かもしれません。
Free Mercurial and Git Client for Windows and Mac | Atlassian SourceTree

他のPCで同期したい

サイト上のバックアップを他のPCにダウンロードして使うには
git clone https://github.com/user-name/program.git
でできます。
Bitbucketなら
git clone https://user-name@bitbucket.org/user-name/program.git
この中に.gitフォルダも既に含まれているはずなので、そのPCのSSHキーの登録が済んでいればgit remoteの設定なんかは要らずに、
git push
これだけでそのPC内の変更がサイト上に反映されるはずです。
元のPCでは
git pull
これだけでサイト上の最新版に更新できるはずです。
複数のPCで使いたい場合はDropboxなどでの同期は止めたほうがいいかもしれません。
conflictsなどのエラーが出てしまったときはGitのもう少し詳しい使い方知っていないといけないのでめんどくさいです。

以上で発表を終わらさせていただきます。
Thank you for your listening.

2013年7月1日月曜日

youtube 落とす from shell


○ まえがき
youtube-dlというのを使うとシェルからyoutubeを落とせます.

○ 導入
ぼくはhomebrewでインストールしました.

○ 使い方
単純に落とすだけなら,
 User> youtube-dl "https://www.youtube.com/watch?v=QH2-TGUlwu4"
でOKです.あと例えばmp4で落としたいなら,
 User> youtube-dl --recode-video mp4 "https://www.youtube.com/watch?v=QH2-TGUlwu4"
など.
(その他オプションがいっぱいあるので,その一覧が見たい場合は--helpをつけて実行してください.)

○ むすび
youtube-dlを使ってyoutubeからnyan catを落としました.

2013年6月20日木曜日

いつ、ぱーじするの? | purgeの自動化

            
        


  

おはようございます。

メモリ解放するときにpurgeする人は多いと思いますが、毎回terminalで打つのは面倒ですよね。そこでcronを使って、purgeを自動化してみました。(purgeにはXcodeが必要らしいです)




$crontab -e 
;;特に設定していない人はvimが起動するはずです。
;;cronが起動します

*/15 * * * * /usr/bin/purge
;;上を追加して上書き保存
;;15分おきにpurgeします   


これだとうざダサいので、私はこうしてます。

00 10-23/3 * * * * /usr/bin/purge 
;;毎日10~23の間3時間おきにpurgeする
;;私は23時以降、Macを触ることはありません。

さらに、自宅警備を生業とする人 にはこんな設定もおすすめです。


10 3-6 * * 5,6,7 /usr/bin/purge 
;;毎週金、土、日のAM3〜6時10分にpurge


ではでは〜。

参考リンク
ゼロ円でMacのメモリを定期的に自動開放する
crontabの書き方




Emacsでめっちゃパージする

Emacsでpurgeする関数を自作してみました。
;; 自作のpurgeする関数
(defun purge ()
  (interactive)
  (message "purging...")
  (shell-command
   (format "purge"))
  (message "Finished."))
(global-set-key "\C-c\C-p" 'purge)
C-c C-pでパージ出来ます。

2013年6月17日月曜日

引数が可変個のgccのコマンド簡略化

こちらの記事でも紹介されているように、よく使うコマンドは簡単なコマンドで置き換えてしまうと楽です。
でも僕の場合、頻繁にg++でコンパイルするのですがプログラムによって
g++ main.cpp -g -Wall -o main -lmylib
でコンパイルできることもあれば
g++ main.cpp -g -Wall -o main -lmylib -litpp -ljpeg -ltiff -lgsl
などと多数の外部ライブラリを用いることもあります。
ダイナミックライブラリなら全て後者でやっても問題無いのかもしれませんが、何か腑に落ちません。

なので可変個数の引数を取れるようにしたコンパイルコマンドの簡略化をシェルスクリプトで試みました。
以下がソースです。
# 引数1個めと2個めは入力ファイル、出力ファイル
function cc(){
    arg=("$@")
    command="gcc -O3 -g -Wall ${arg[1]} -o ${arg[2]} -lmylib"

    if [ $# -gt 2 ]; then
        for i in `seq 3 $#`
        do
            command="${command} ${arg[$i]}"
        done
    fi
    
    echo $command
    eval $command
}
ここでは-lmylibは必ず使うという前提でやってます。
あんま需要無いかもしれませんがよろしくです。

2013年1月12日土曜日

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

以前,ちょっと知識でポートフォワーディングについて書きましたが,PCを入れ替えたりして接続先のホスト情報が変わった場合,いつものようにssh接続しようとすると以下の様なメッセージが出るかもしれませんし,出ないかもしれません.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
e5:99:11:ec:f7:f5:61:fa:41:c2:04:76:9b:0f:68:1f.
Please contact your system administrator.
Add correct host key in /var/root/.ssh/known_hosts to get rid of this message.
Offending key in /var/root/.ssh/known_hosts:1 ← ☆ここ☆
RSA host key for [接続先IP] has changed and you have requested strict checking.
Host key verification failed.
もし出た場合は,☆ここ☆と書いてある行に示されているファイルをemacsなりviなりで開いて,接続先IPの行を消すと,次接続した時にホスト情報が再作成されてたぶん直ります.


・参考


2013年1月9日水曜日

>>

標準出力をファイルに書き込むときに,

$ ./test > test.txt

みたいにしますが,

$ ./test >> test.txt

とすると追記ができるらしいです.




2012年11月20日火曜日

ターミナルとEmacsに関する風テク

唐突ですが風キッズのみんなに質問です.
みんなはemacsからターミナルに移動した時何をしますか?

たぶんいましがたemacsで編集してたファイルに関する処理をすると思います.
しかし!このときカレントディレクトリが常に今編集してたファイルのフォルダになってるほど人生は甘くないです.ー そう,甘くないんです.
だから私たち人間はこんなときcdとか打つのだと思います.

でもいちいちパス打って移動するのってめんどくさいです.なので今emacsが開いてるファイルのフォルダに一発でcdできるコマンドを紹介します.逆関数としてターミナルのカレントディレクトリをemacs上でdiredさせる方法も紹介します.

○ emacs側の設定
(server-start)
(defun non-elscreen-current-directory ()
  (let* (current-dir
         (current-buffer
          (nth 1 (assoc 'buffer-list
                        (nth 1 (nth 1 (current-frame-configuration))))))
         (active-file-name
          (with-current-buffer current-buffer
            (progn
              (setq current-dir (expand-file-name (cadr (split-string (pwd)))))
              (buffer-file-name)))))
    (if active-file-name
        (file-name-directory active-file-name)
      current-dir)))

○ shell側の設定
alias eclient="/Applications/Emacs.app/Contents/MacOS/bin/emacsclient"
function cde () {    
    EMACS_CWD=`eclient -e "
      (if (featurep 'elscreen)
          (elscreen-current-directory)
        (non-elscreen-current-directory))" | sed 's/^"\(.*\)"$/\1/'`

    echo "chdir to $EMACS_CWD"
    cd "$EMACS_CWD"
}
function dired () {
  eclient -e "(dired \"$PWD\")"
}

あとはターミナル上でcdeと打てばemacsで今開いてるバッファのフォルダに行くし,diredと打てばカレントディレクトリをemacs上でdiredしてくれます.完.

※注 これzshオンリーなテクかもしれません.bashでできるのか知らないです.


○ 参考サイト様


2012年10月23日火曜日

term+.el

[2012/11/15 追記]
term+での複数シミュレーションを行ったらemacs自体の速度低下を確認しました.デバッグ以外はなるべくterminal専門アプリでの実行をおすすめします

emacs上のターミナルを拡張するelispでterm+.elっていうのがあるんですが,なかなかいいので紹介します.概要と使用法については下のリンクにある作者の方のドキュメントがすごい充実してるのでそちらを参照されると良いと思います.



私は下みたいな設定にしてC-tでansi-termが開くようにしてます.
;; term+
(add-to-list 'load-path "~/emacslib/termplus")
(require 'term+)
(require 'xterm-256color)
(require 'term+mux)

;; Find available shell
(defun skt:shell () 
  (or (executable-find "zsh") ;; bashユーザは一行下と入れ替え
      (executable-find "bash")
      (error "No shell program was found in your PATH...")))

;; Set shell-name 
(setq shell-file-name (skt:shell))
(setenv "SHELL" shell-file-name)
(setq explicit-shell-file-name shell-file-name)

;; Setup sufficient moji-codes for Mac
(setq system-uses-terminfo nil)
(prefer-coding-system 'utf-8)
(require 'ucs-normalize)
(setq file-name-coding-system 'utf-8-hfs)
(setq locale-coding-system 'utf-8-hfs)

;; Color settings for term
(setq term-default-bg-color "Black")
(autoload 'ansi-color-for-comint-mode-on "ansi-color"
  "Set `ansi-color-for-comint-mode' to t." t)

;; Binding key
(global-unset-key "\C-t")
(global-set-key "\C-t" '(lambda ()
                                (interactive)
                                (ansi-term shell-file-name)))