はてなブログのシンタックスハイライト覚書
概要
はてなブログでのシンタックスハイライトの覚書。 公式ヘルプを参照しつつ、自分でよく使いそうな項目の使い所と例を示す。
Qiitaとの比較
Qiitaのシンタックスハイライトは下記を参照。
自分の使用する範囲でそれぞれの利点は以下の通り。
shell関連
sh
cowgill/spamhausよりspamhaus.sh
を例示。
#!/bin/bash # based off the following two scripts # http://www.theunsupported.com/2012/07/block-malicious-ip-addresses/ # http://www.cyberciti.biz/tips/block-spamming-scanning-with-iptables.html # path to iptables IPTABLES="/sbin/iptables"; # list of known spammers URL="www.spamhaus.org/drop/drop.lasso"; # save local copy here FILE="/tmp/drop.lasso"; # iptables custom chain CHAIN="Spamhaus"; # check to see if the chain already exists $IPTABLES -L $CHAIN -n # check to see if the chain already exists if [ $? -eq 0 ]; then # flush the old rules $IPTABLES -F $CHAIN echo "Flushed old rules. Applying updated Spamhaus list...." else # create a new chain set $IPTABLES -N $CHAIN # tie chain to input rules so it runs $IPTABLES -A INPUT -j $CHAIN # don't allow this traffic through $IPTABLES -A FORWARD -j $CHAIN echo "Chain not detected. Creating new chain and adding Spamhaus list...." fi; # get a copy of the spam list wget -qc $URL -O $FILE # iterate through all known spamming hosts for IP in $( cat $FILE | egrep -v '^;' | awk '{ print $1}' ); do # add the ip address log rule to the chain $IPTABLES -A $CHAIN -p 0 -s $IP -j LOG --log-prefix "[SPAMHAUS BLOCK]" -m limit --limit 3/min --limit-burst 10 # add the ip address to the chain $IPTABLES -A $CHAIN -p 0 -s $IP -j DROP echo $IP done echo "Done!" # remove the spam list unlink $FILE
Python関連
python
import re import sys import json import six from voluptuous import Schema, Required, Any, Range, Invalid, ALLOW_EXTRA def validate_io_size(v): if re.search("^[0-9]+[bkm]", v) is None: raise Invalid("not a valid value (%s)" % str(v)) def get_schema(): schema = Schema({ "comment" : six.text_type, Required("operation") : Any("read", "write"), "thread" : Range(min=1), Required("io_size") : validate_io_size, Required("access_percentage") : Range(min=1, max=100), }, extra=ALLOW_EXTRA) return schema def main(): schema = get_schema() with open(sys.argv[1], "r") as fp: dict_sample = json.load(fp) schema(dict_sample) six.print_(dict_sample) return 0 if __name__ == '__main__': sys.exit(main())
SQL関連
sql
SQLクエリ用。
SELECT hoge FROM table_namme WHERE value > 0
HTML関連
HTML
<html> <head> <title>Hello world</title> </head> <body> Hello world </body> </html>
CSS
カスケーディング・スタイル・シート用。
h1, h2, h3, h4 { margin-top: 0.5em; margin-bottom: 0.1em; } h3 { margin-left: 0.5em; } h4 { margin-left: 1.5em; } body { counter-reset: part; } h2 { counter-reset: chapter; } h2:before { content: counter(part) ". "; counter-increment: part; } h3 { counter-reset: section; } h3:before { content: counter(part) "." counter(chapter) ". "; counter-increment: chapter; } h4 { counter-reset: subsection; } h4:before { content: counter(part) "." counter(chapter) "." counter(section) ". "; counter-increment: section; }
Linuxコマンド出力
diff
--- lhs 2016-01-05 08:13:48.341912876 +0900 +++ rhs 2016-01-05 08:14:19.913913237 +0900 @@ -1,4 +1,4 @@ hoge -foo +aaaaaaaaaaaaa bar - +bbbbbbbbbbbbbbb
その他
JSON
一覧にはなかったが、JSONもシンタックスハイライトが有効。
{ "text" : "value", "value" : 100, "list" : ["a", "b", "c"], "nest_dict" : { "child" : 1 } }
YAML
pygmentsのデモより
time: 120 title: 'íì¤í¸ 컨íì¤í¸' contestpw: '0000' languages: - display: 'GNU C 4.6.2' compile: 'gcc -lm -O2 -o {:basename}.exe {:mainfile}' execute: '{:basename}.exe' binary: '{:basename}.exe' - display: 'GNU C++ 4.6.2' compile: 'g++ -O2 -o {:basename}.exe {:mainfile}' execute: '{:basename}.exe' binary: '{:basename}.exe' - display: 'Microsoft Visual C++ 2010' compile: 'cl /Ox {:mainfile}' execute: '{:mainfile}.exe' binary: '{:mainfile}.exe' - display: 'Oracle Java SE 7' compile: 'javac {:mainfile}' execute: 'java {:basename}' binary: '{:basename}.class' problems: - title: 'HELLOWORLD' input: './problems/HELLOWORLD/helloworld.in' output: './problems/HELLOWORLD/helloworld.out' timelimit: 10 external_validation: yes validator: './validators/Validator.jar' validationcmd: 'java -jar {:validator} {:infile} {:outfile} {:ansfile} {:resfile} rz' color: 'color0' - title: 'HELLOWORLD2' input: './problems/HELLOWORLD/helloworld.in' output: './problems/HELLOWORLD/helloworld.out' timelimit: 1 external_validation: no validator: 1 validator_ignorecase: yes color: 'color1' judgements: - 'Yes' - 'No - Compilation Error' - 'No - Run-time Error' - 'No - Time-limit Exceeded' - 'No - Wrong Answer' - 'No - Excessive Output' - 'No - Output Format Error' - 'No - Other - Contact Staff' groups: - { name: 'KAIST', scoreboard: yes } - { name: 'Test accounts', scoreboard: no } accounts: admins: # default scoreboard: no # default administrator -> 1 - { name: 'Administrator 2', password: '0000' } judges: # default scoreboard: no - { name: 'Judge 1', password: 'judge1' } - { name: 'Judge 2', password: 'judge2' } scoreboards: # default scoreboard: no - { name: 'Scoreboard 1', password: 'scoreboard1' } - { name: 'Scoreboard 2', password: 'scoreboard2' } teams: # default scoreboard: yes - { name: 'Team 1', group: 1, password: 'team1' } - { name: 'Team 2', group: 2, password: 'team2' } - { name: 'Team 3', password: 'team3' } - { name: 'Team 4', scoreboard: no, password: 'team4' }
ansible playbook形式だとあまり恩恵が見えない。
--- - name: reboot OS hosts: server-under-test gather_facts: no tasks: - name: reboot shell: reboot async: 0 poll: 0 - name: wait for SSH port down local_action: wait_for host={{ inventory_hostname }} port=22 state=stopped - name: wait for SSH port up local_action: wait_for host={{ inventory_hostname }} port=22 state=started delay=10 - pause: seconds=5