Hatena::ブログ(Diary)

メモ帳 RSSフィード

2016-09-26

【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>"

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

2016-09-25

【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内で呼べるようになります。
うん、すっきり!

2016-09-24

【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もあったりします。(直訳すぎて意味不明な所も多々ありますが)

2015-01-13 【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 " 検索語を強調表示(<C-L>で解除)
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<Enter>

" ヘルプの設定
nnoremap <C-h> :<C-u>help<Space>
nnoremap <C-h><C-h> :<C-u>help<Space><C-r><C-w><Enter>

" ハイライトを削除
nnoremap <ESC><ESC> :nohlsearch<CR>

" unite-rails の設定
nnoremap <C-x> :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 <silent><ESC><ESC>:set iminsert=0<CR>




""" ===================
""" 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 <silent> <F7> :YRShow<CR>
" 記録する履歴の件数を10件に制限する
let g:yankring_max_history = 10
" 履歴全体を見通せるようにウィンドウの高さを制限
let g:yankring_window_height = 13

"" end YankRing.vim

"" def yanktmp.vim
map <silent> sy :call Yanktmpank()<CR>
map <silent> sp :call YanktmpPaste_p()<CR>
map <silent> sP :call YanktmpPaste_P()<CR>
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 :VimShellInteractive<Space>zsh
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 <expr><C-e> neocomplcache#cancel_popup()
" imap <expr><TAB> neocomplcache#sources#snippets_complete#expandable() ? "\<Plug>(neocomplcache_snippets_expand)" : pumvisible() ? "\<C-n>" : "\<TAB>"
"

2013-07-28

Ruby Goldに合格しました!

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

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

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

メタプログラミングRuby

メタプログラミングRuby

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

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

プログラミング言語 Ruby

プログラミング言語 Ruby




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

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



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