Rakeで自動化&Export



# Document Links

-   [マルチスケールシミュレーション特論まとめ](https://qiita.com/evendemiaire/items/25f459daa57ab8875ba6)
-   [チャート式ruby-appendix-IV(rake)](https://qiita.com/daddygongon/items/1c2d6d2895333ccf5e62)


# Rake


## Rakeってなんぞや

わからないので，とりあえず調べて，有志の力を借りる．

-   RakeはMakeによく似た機能を持つRubyで書かれたシンプルなビルドツール
-   makeコマンドのRubyでの代替，Rakefileにtaskを記述していく

とかなんとか．

詳しくは，

-   [Rubyのrakeについての基礎知識](https://qiita.com/magaya0403/items/398cd4b3d4946ec8ce39)
-   [ruby rake の使い方](https://qiita.com/abcb2/items/9905449ab3fcf5d27ace)

[講義資料](https://qiita.com/daddygongon/items/1c2d6d2895333ccf5e62)を見ると，

前回の[bundler](https://qiita.com/daddygongon/items/14218c96df5cbcf35c62)を少し思い出してください．

    $ rake install:local

とすると自動的にhogehogeがinstallされましたよね．

と記述されている．．．私は上手くいかなかったが，まあ，とりあえず進めよう．

上述したが，Rakefileにtaskを記入していくと，

    $ emacs -nw Rakefile

で，Rakefile内に以下を記述．

```ruby
task :default do
  system 'rake -T'
  exit
end

desc 'hello NAME'
task :hello do
  name = ARGV[1]
  puts "Hello #{name}!"
  exit
end
```

実行結果

    $ rake
    rake hello  # hello NAME

rakeって打つと，Rakefileに記述したtaskを教えてくれる．

なぜかって言うと，

```ruby
task :default do
  system 'rake -T'
  exit
end
```

で，rakeが引数なしで入力されたときのtaskを書いてるから．すなわち，rake -Tが走ってる．

では，他のtaskを動かすには？

実行結果

    $ rake hello World
    Hello World!

こんな感じで，taskをこなしてくれる．

では早速taskを記述！，とその前に，

```ruby
desc 'hello NAME'
task :hello do
  name = ARGV[1]
  puts "Hello #{name}!"
  exit
end
```

この部分，"ARGV[1]"になってる．

でもこれが正しい．＊注意


## System Call

-   Rakefileに記述することの多い関数はsystem (systemコマンドを起動する関数)．

コマンドもtaskにできるみたい．[以前の記事](https://qiita.com/evendemiaire/private/51b5f82f2fda25bc5d17)でシェルスクリプトの紹介をしたが，Rubyでもこんなのがあるとは．．．

例えば，gitに共有するときの流れで，

-   git pull origin main
-   git add -A
-   git commit -m "hogehoge"
-   git push origin main

って一個ずつ打ってたわけだけど，taskを書くと

```ruby
desc 'git pull push'
task :push do
  p comm = "git pull origin main"
  system comm
  p comm = "git add -A"
  system comm
  p comm = "git commit -m #{ARGV[1]}"
  system comm
  p comm = "git push origin main"
  system comm
  exit
end
```

実行結果

    $ rake push hogehoge
    git pull origin main　　　
    　　　・
    　　　・
    　　　・

ってな感じで，pullからpushまでやってくれる．便利ですなぁ．．．

"p comm"しておく(putsでもいい)と，コマンドを出力するからわかりやすいよ．

ちなみに，

```ruby
desc 'git pull push2'
task :push2 do
  ["git add -A",
   "git commit -m \'hoge\'",
   "git pull origin main",
   "git push origin main"].each do |comm|
    p comm
    system comm
  end
  exit
end
```

とも記述できる．

ほかにも，コマンドをcolorizeしたいなら，

```ruby
require 'colorize'
desc 'git pull push2'
task :push2_color do
  ["git add -A",
   "git commit -m \'hoge\'",
   "git pull origin main",
   "git push origin main"].each do |comm|
    puts comm.green
    system comm
  end
  exit
end
```

で，コマンドがgreenにcolorizeされる．


## Command\_Line

systemで使える外部のコマンドは動作が遅いので，より高速で動かせるようにrubyの組み込み関数に用意されているとのこと．

例えば，皆のREADME.orgがあるかを見たいとき，

```ruby
require 'command_line/global'
desc 'make list'
task :mk_list do
  #system 'ls -1 ../**/README.org'
  target = "../**/README.org"
  Dir.glob(target).each do |file|
    p file
  end
  exit
end   
```

てな感じで，配列に入った情報を列挙してるみたい．

コマンドを組み込んで，qiita\_idを取り出すなら，

```ruby
require 'command_line/global'
desc 'make list'
task :mk_list do
  #system 'ls -1 ../**/README.org'
  target = "../**/README.org"
  Dir.glob(target).each do |file|
    p file
    res = command_line "grep qiita_id #{file}"
    p res.stdout
  end
  exit
end   
```

標準出力(stdout)などを取り出すのはcommand\_lineというgemを使うらしいので，

    $ sudo gem install command_line

をしましょう．

他にもいろいろできるみたいだけど，それは次回以降．


# Export


## emacsでhtmlとかにexport

Org-Modeで記述した記事はHtmlとかにもexportできる．

    $ emacs -nw hoge.org
    c-c c-e ho # export as [h]tml, [o]ut
    c-c c-e ll # export [l]atex, [l]atex 

これでhtmlやlatexにexportできる．

便利ですなぁ．．．


## htmlizeをinstallしろと云われた

htmlにexportしようとしたら，

*Please install htmlize from <https://github.com/hniksic/emacs-htmlize>*

と云われた．(Emacsのversionは26.3)

    M-x package-list-packages

でpackage一覧が出るが，そこにはhtmlizeの文字が無かった．．．

様々な記事を探して試して数時間，ついにできた．

やったことは

-   ~/.emacsに以下を記述
-   emacsでhtmlizeのinstall

```
(require 'package)
(let* ((no-ssl (and (memq system-type '(windows-nt ms-dos))
		    (not (gnutls-available-p))))
       (proto (if no-ssl "http" "https")))
  (when no-ssl
    (warn "\
Your version of Emacs does not support SSL connections,
which is unsafe because it allows man-in-the-middle attacks.
There are two things you can do about this warning:
1. Install an Emacs version that does support SSL and be safe.
2. Remove this warning from your init file so you won't see it again."))
  ;; Comment/uncomment these two lines to enable/disable MELPA and MELPA Stable as desired
  (add-to-list 'package-archives (cons "melpa" (concat proto "://melpa.org/packages/")) t)
  ;;(add-to-list 'package-archives (cons "melpa-stable" (concat proto "://stable.melpa.org/packages/")) t)
  (when (< emacs-major-version 24)
    ;; For important compatibility libraries like cl-lib
    (add-to-list 'package-archives (cons "gnu" (concat proto "://elpa.gnu.org/packages/")))))
(package-initialize)
```

２行目，"windows-nt ms-dos"とかある．(私はLinux環境だが，これで出来たので，問題ないかと．．．)

*有識者の方は情報求む*

ほいで，

    $ emacs -nw
    M-x package-install
    htmlize

でhtmlizeがinstallでき，exportできるようになった．


# 締め

今回はrakeを使ったtask管理について学んだ．

次回，[Assert&Rubular](https://qiita.com/evendemiaire/items/6faaf8d014ac8067ddbc)



------
 - **source** ~/school/multi/my_ruby/grad_members_20f/members/evendemiaire/post/rake.org