【Ruby】slim から HTML生成術 その3

~ その2の続き

実は、Slim::Template.new("test_slim.slim").render(self) のselfの部分にclassのインスタンスを渡すと、そこで宣言しているインスタンス・クラス変数やメソッドが呼び出せる!
(もちろん、selfも可能)

サンプルコード

requrie 'slim'
class MyClass
  attr_reader :title, :name

  def initialize
    @title = 'MyClass title'
    @name = 'MyClass name'
  end

  def add
     1 + 1
  end
end
p Slim::Template.new("test_slim.slim").render(MyClass.new)


Slim コードはこんな風に改変できます。

h1 = @title
div = "hello #{@name}" 
div = add

結果

"<h1>MyClass Title</h1><div>hello MyClass name</div><div>2</div>"

共通処理は別クラスに宣言しておけば、すっきり記述できますね。

【Ruby】slim からHTML生成術 その2

~ 前回の続き

slim はrubyのコードを直接埋め込めたりできます。

演算サンプルコード

h1 test
div hello slim
div = 1 + 1

= より後ろの文をRubyのコードと認識してくれるらしく、結果は下記のように出力されます。
2つめのdivタグの結果が2と出力されてますね。

"<h1>test</h1><div>hello slim</div><div>2</div>"

変数埋め込みサンプルコード

h1 = title
div = "hello #{name}" 

上記のようなslimサンプルで titleやname変数などを使用して、動的にテンプレートを生成したい場合はどうすればよいでしょうか?
RailsとかSinatraとかの記事はかなりあるのに(コントローラでクラス変数を作ればあとは動的に)、Ruby単体での埋め込み方法がなかなか見つからない・・・。

答え

requrie 'slim'
p Slim::Template.new("test_slim.slim").render(self, {tilte: "Sample", name: "shio_chan"})
"<h1>Sample</h1><div>hello shio_chan</div>"

render の第2引数にハッシュを渡すと、slim内で呼べるようになります。
うん、すっきり!

【Ruby】slim からHTML生成術

Slim の記事とかはほぼ Rails 前提で書かれているので、Rubyだけで Slim からHTMLを取得する方法を記述してみたり。

動作環境

ruby 2.3.0-p0
slim 3.0.7

前準備

slim をインストール参照

$ gem install slim

使い方

下記の感じでslimのテンプレートとrubyファイルを用意する。

test_slim.slim

h1 test
div hello slim

generate_html.rb

require 'slim'
p Slim::Template.new("test_slim.slim").render(self)

結果がわかりやすいように、"p" で標準出力に表示させています。

実行結果

$ rb generate_html.rb
"<h1>test</h1><div>hello slim</div>"

結構簡単に取得できるようです。
取得したHTMLを返したり、PDFとかに変換したりする使い方ができると思います。

Slimは日本語のREADMEもあったりします。(直訳すぎて意味不明な所も多々ありますが)

【Vim】自分的vimrc

""" =======================
""" complement
""" =======================
"" common
" ファイル別にプラグインとインデントを有効にする
filetype plugin indent on


" 文字補完
ab #i #include
ab #d #define


""" ===============================
""" set
""" ===============================
set noswapfile " スワップファイルを作らない
set backspace=2 " バックスペースでインデントや改行を削除
set showmatch " 対括弧の表示
set autoindent
set nostartofline " 行頭に移動しない
set number " 行番号表示
set wildmenu " コマンドライン補完
set showcmd " タイプ中のコマンドを表示
set showmode " 現在のモードを表示
set hlsearch " 検索語を強調表示(で解除)
set grepprg=grep\ -nH\ $* " grep 使用


" 日本語に対応させる
set encoding=utf-8
set fenc=uft-8
set fileencodings=utf-8,usc-bom,iso-2022-jp,euc-jp,cp932,sjis
set fileformats=unix,dos,mac

" tab 系 = 2space
set expandtab
set shiftwidth=2
set softtabstop=2

" ターミナルでマウスを使用
set mouse=a " マウスを有効
set guioptions+=a
set ttymouse=xterm2 " ターミナルでマウスを使用

" バッファを保存しなくても他のバッファを表示できるようにする
setlocal hidden

"日本語の行の連結時には空白を入力しない
setlocal formatoptions+=mM

""□や○の文字があってもカーソル位置がずれないよう
if exists('&ambiwidth')
set ambiwidth=double
endif

"画面最後の行をできる限り表示する。
set display+=lastline

" コメントやブロックの折りたたみ可能
set foldmethod=syntax

""" =============================
""" map
""" ============================

" rake
nnoremap rake :!rake

" ヘルプの設定
nnoremap :help
nnoremap :help

" ハイライトを削除
nnoremap :nohlsearch

" unite-rails の設定
nnoremap :Unite rails/

""" =============================
""" autocmd
""" ============================
" 保存時にrubyの構文チェック
" augroup rbsyntaxcheck
" autocmd!
" autocmd BufWrite *.rb w !ruby -c
" augroup END


augroup csyntaxcheck
autocmd!
" C/C++関数を強調表示
autocmd FileType c,cpp syntax match CFunction /[a-zA-Z_]\w*\s*\(\(\^*\]\s*\)\?(\s*[^\*]\)\@=/
autocmd FileType c,cpp syntax match CFunction /\*\s*[a-zA-Z_]\w*\s*\(\(\[\]\s*\)\?)\s*(\)\@=/
autocmd FileType c,cpp hi CFunction guifg=#ff0000 guibg=#ffff00
autocmd FileType c set omnifunc=ccomplete#Complete
augroup END

augroup templateload
autocmd!
autocmd BufNewFile repo.tex 0r ~/Dropbox/Document/tmp/tex/repo.tex
autocmd BufNewFile slide.tex 0r ~/Dropbox/Document/tmp/tex/slide.tex
autocmd BufNewFile ms.tex 0r ~/Dropbox/Document/tmp/tex/ms.tex
autocmd BufNewFile *.java 0r ~/Dropbox/Document/tmp/java.java
augroup END

autocmd FileType python set omnifunc=pythoncomplete#Complete
autocmd FileType javascript set omnifunc=javascriptcomplete#CompleteJS
autocmd FileType html set omnifunc=htmlcomplete#CompleteTags
autocmd FileType css set omnifunc=csscomplete#CompleteCSS
autocmd FileType xml set omnifunc=xmlcomplete#CompleteTags
autocmd FileType php set omnifunc=phpcomplete#CompletePHP




""" =================================
""" color
""" =================================

syntax enable
colorscheme ron
"colorscheme darkblue
hi perlComment ctermfg=darkgray
hi perlDATA ctermfg=cyan
hi perlPOD ctermfg=darkred
hi Normal cterm=bold


let tlist_objc_settings='objc;P:protocols;i:interfaces;I:implementations;M:instance methods;C:implementation methods;Z:protocol methods'

"
inoremap :set iminsert=0




""" ===================
""" plugin
""" ==================
"" def Vundle
filetype off
set rtp+=~/.vim/bundle/vundle/
call vundle#rc()

" Vundleで管理するプラグインを書く
Bundle 'gmarik/vundle'

" github にあるプラグイン
Bundle 'Shougo/neocomplcache'
Bundle 'Shougo/vimshell'
Bundle 'Shougo/vimproc'
Bundle 'thinca/vim-visualstar'
Bundle 'nathanaelkane/vim-indent-guides'
Bundle 'tomtom/tcomment_vim'
Bundle 'thinca/vim-ref'
Bundle 'soh335/vim-ref-jquery'
Bundle 'soh335/vim-ref-pman'
Bundle 'ujihisa/ref-hoogle'
Bundle 'Shougo/neocomplcache'
Bundle 'Shougo/vimfiler'
Bundle 'Shougo/unite.vim'
Bundle 'basyura/unite-rails'
Bundle 'msanders/cocoa.vim'
Bundle 'vim-ruby/vim-ruby'
Bundle 'vim-scripts/errormarker.vim'
Bundle 'thinca/vim-quickrun'
Bundle 'hallison/vim-markdown'

" www.vim.org にあるプラグイン
Bundle 'project.tar.gz'
Bundle 'Markdown'

" それ以外にある git リポジトリにあるプラグイン
Bundle 'git://vim-latex.git.sourceforge.net/gitroot/vim-latex/vim-latex'

"" end Vundle

"" common
" ファイル別にプラグインとインデントを有効にする
filetype plugin indent on

"" def vim-latex
let g:tex_flavor='latex'
" スペルチェック(拡張子がTeXのときON)
"autocmd FileType tex set spell
""end vim-latex

"" def YankRing.vim
" 履歴ファイルの保存先を変更
let g:yankring_history_dir = expand('$HOME')
let g:yankring_history_file = '.yankring_history'

" :YRShowコマンドの設定
" F7 で :YRShow を実行出来るようにする
nnoremap :YRShow
" 記録する履歴の件数を10件に制限する
let g:yankring_max_history = 10
" 履歴全体を見通せるようにウィンドウの高さを制限
let g:yankring_window_height = 13

"" end YankRing.vim

"" def yanktmp.vim
map sy :call Yanktmpank()
map sp :call YanktmpPaste_p()
map sP :call YanktmpPaste_P()
if has("win32")
let g:yanktmp_file = $TEMP. '/vimyanktmp'
endif

"" end yanktmp.vim

"" def indent-guides
let g:indent_guides_enable_on_vim_startup = 1
let g:indent_guides_color_change_percent = 15
let g:indent_guides_guide_size = 1

"" end indent-guides

"" def vimshell
" nnoremap zsh :VimShellInteractivezsh
nnoremap shell :VimShell

"" end vimshell


"" quickrun
nnoremap run :QuickRun

let g:quickrun_config = {}
" if strlen($rvm_bin_path)
" let g:quickrun_config['ruby'] = {
" \ 'command': 'ruby',
" \ 'exec': '$rvm_bin_path/ruby %s',
" \ 'tempfile': '{tempname()}.rb'
" \ }
" endif
"

let g:quickrun_config = {}
let g:quickrun_config['markdown'] = {
\ 'command': 'bluecloth',
\ 'exec': '%c -f %s'
\ }

"" end quickrun

"" necomplcache
let g:neocomplcache_enable_at_startup = 1
let g:NeoComplCache_SmartCase = 1
let g:NeoComplCache_EnableCamelCaseCompletion = 1
let g:NeoComplCache_EnableUnderbarCompletion = 1
let g:NeoComplCache_MinSyntaxLength = 3
"

let g:neocomplcache_enable_underbar_completion = 1
" "Define dictionary.
" let g:neocomplcache_dictionary_filetype_lists = {
" \ 'default' : '',
" \ 'vimshell' : $HOME.'/.vimshell_hist',
" \ 'scheme' : $HOME.'/.gosh_completions'
" \ }
" noremap neocomplcache#cancel_popup()
" imap neocomplcache#sources#snippets_complete#expandable() ? "\(neocomplcache_snippets_expand)" : pumvisible() ? "\" : "\"
"

Ruby Goldに合格しました!

7月21日にRuby技術者認定試験のGoldを受けてきました.
結果は,無事に合格です.

今回は,100点満点中90点とGoldにしてはかなりの高得点でした.
勉強期間は4月からなので約3ヶ月ですが,時間は実質1ヶ月あったぐらいではないでしょうか?
社会人って勉強できる時間少ないですよね;(当たり前)

Gold受験にあたり,参考にした書籍は次のとおりです.

メタプログラミングRuby

メタプログラミングRuby

メタプログラミングRubyはGoldを受ける・受けないにかかわらず,読んでおいて損はないです.(良書)
話言葉形式でスラスラと頭の中に入ってきますし,ちょっと使ってみたい技がたくさん出てきます.
プログラマーの仲間入りが出来るかも?

Ruby公式資格教科書 Ruby技術者認定試験 Silver/Gold対応 (EXPERT EXPASS)

Ruby公式資格教科書 Ruby技術者認定試験 Silver/Gold対応 (EXPERT EXPASS)

本書には模擬問題がありますが,余り参考にしないほうが良いかも?
全部できて当たり前ではないとGoldは取れないと思います.
範囲の確認程度や最終確認に使用するのがおすすめ

プログラミング言語 Ruby

プログラミング言語 Ruby


Goldの範囲ですが,クラス・モジュールやライブラリを理解していて,尚且つオブジェクト思考が分かれば問題なく合格できると思います.

ObjectクラスやModuleクラスは高確率で出ます.
ライブラリではSocketの組み込みクラスやThreadの生成,例外処理の動きなどがよく出てくる印象です.
Marshallのfreeze,dup,cloneメソッドは文章問題として出てきていました.



Ruby1.8系のサポートが終了してしまったので,「そろそろRuby技術者認定試験のバージョンが変わるのではないか?」という噂があります.
本試験はRuby1.8.7ですので,今のうちの受験をおすすめします.
善は急げ!!!!

Ruby技術者認定試験Silver合格しました!!

2月24日にRuby技術者認定試験のSilver受けてきました!
結果は・・・・・

100点満点中94点!!

無事合格!!!!

2週間という短い準備期間でしたが無事に合格することができました.
合格秘話ということで,参考にした,書籍やサイトなんかを紹介したいと思います.

  • Ruby技術者認定試験 公式ガイド

RUBY技術者認定試験 公式ガイド (ITpro BOOKs)

RUBY技術者認定試験 公式ガイド (ITpro BOOKs)

  • Ruby公式資格教科書 Ruby技術者認定試験 Silver/Gold対応

Ruby公式資格教科書 Ruby技術者認定試験 Silver/Gold対応 (EXPERT EXPASS)

Ruby公式資格教科書 Ruby技術者認定試験 Silver/Gold対応 (EXPERT EXPASS)

各メソッドの機能や引数,戻り値などをちゃんと覚えていなくてもプログラムって書けてしまうので,そこを重点的に覚えなおししていましたね.
実は,「非破壊的メソッドと破壊的メソッドの区別がつかない!!」と頭を抱えてしまいました.(暗記しましたが)

恐らく,Rubyがある程度書ける人出あれば,書籍の後ろに載っている問題を徹底的にやれば合格できるでしょう.
ほぼ,見た事あるような,似たような問題ばかりでした(笑)


次は,Gold頑張る

rbenvでまだ対応していないRuby2.0.0-p0をrbenvで入れたい人たちへ

2月24日に等々Ruby2.0.0-p0がリリースされました!
お恥ずかしい話ですが,修論とか修論とか修論とかでリリース間近だったの知りませんでした.
あまりにもびっくりしすぎてどっかの喫茶店で,飲み物を吹き出しそうになったのはここだけの話です.

で.早速インストールしようと思いましたが,rbenvのインストール一覧にはもちろんありません.
ruby-build」を更新すれば!とか思いましたが,リリースしてすぐ対応されているわけでもなく・・・・

$ rbenv install
  ・・・
  1.9.3-preview1
  1.9.3-rc1
  2.0.0-dev
  2.0.0-preview1
  ・・・

インストール方法

Ruby2.0.0-p0用の「ruby-build」というものがあるらしく,curlでダウンロードしてきて,インストールするだけのようです.

インストール完了!とか思ったら失敗

$ rbenv install 2.0.0-p0                                                                                                                      [~]
Downloading ruby-2.0.0-p0.tar.gz...
-> http://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p0.tar.gz
Installing ruby-2.0.0-p0...
/usr/local/bin/ruby-build: line 308: build_package_verify_openssl: command not found

BUILD FAILED

Inspect or clean up the working tree at /var/folders/n6/5r_577b127lczz3bft7x7jgr0000gn/T/ruby-build.20130225000908.63553
Results logged to /var/folders/n6/5r_577b127lczz3bft7x7jgr0000gn/T/ruby-build.20130225000908.63553.log

Last 10 log lines:
installing manpages:          /Users/shiori/.rbenv/versions/2.0.0-p0/share/man/man1
installing default gems:      /Users/shiori/.rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0 (build_info, cache, doc, gems, specifications)
                              bigdecimal 1.2.0
                              io-console 0.4.2
                              json 1.7.7
                              minitest 4.3.2
                              psych 2.0.0
                              rake 0.9.6
                              rdoc 4.0.0
                              test-unit 2.0.0.0

build_package_verify_opensslが無いらしいのですが・・・Ruby2.0.0-p0を入れるときに最新版のopensslもインストールされるようなのですよね.
実は,Homebrew でインストールしている ruby-build のバージョンが違うことが原因!(詳細:http://pnlybubbles.github.com/ruby/2012-02-14/ruby-2.0.0-rc2-install-memo/)
--HEADというオプションを付けてアップグレードします.

$ brew install --HEAD ruby-build
$ rbenv install 2.0.0-p0        
                                                                                                              
Downloading openssl-1.0.1e.tar.gz...
-> https://www.openssl.org/source/openssl-1.0.1e.tar.gz
Installing openssl-1.0.1e...
Installed openssl-1.0.1e to /Users/shiori/.rbenv/versions/2.0.0-p0

Downloading ruby-2.0.0-p0.tar.gz...
-> http://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p0.tar.gz
Installing ruby-2.0.0-p0...
Installed ruby-2.0.0-p0 to /Users/shiori/.rbenv/versions/2.0.0-p0

はい成功!
入れ方は他にもあるようなので(これとか:自分でコンパイルしたRubyをrbenvで管理する(Mac OS X, Ubuntu) - Qiita)ヨサゲな方法で入れてRuby2.0の世界を楽しみましょう!