grunt-contrib-cssmin で圧縮したときにプロパティが消える問題

1つのセレクタ内に同じプロパティを複数宣言してると最適化されて消されるっぽい。

IE用のCSSハックを書きたいときとかにつらい。

そんなときは Gruntfile に以下のオプションを追加すると最適化されなくなるのでプロパティが消えなくなる。

options: {
    noAdvanced: true
}

設定例は以下。

cssmin: {
  minify: {
    expand: true,
    cwd: 'static/dist/css/',
    src: ['**/*.css', '!**/*.min.css'],
    dest: 'static/dist/css/',
    ext: '.min.css',
    options: {
      noAdvanced: true,
    }
  }
}

grunt-contrib-cssmin のREADMEには書いてないけど、clean-css のREADMEには書いてある。

そしてこの issue を見るに clean-css のオプションはそのまま Gruntfile で指定できるっぽい。

FlaskでRequest関連のテストをしたいとき

そのためだけの views とかを定義したくなくて純粋に Request オブジェクトだけが欲しいときとか。

flask.app.test_request_context を使えば自由に作れる。

gist8009789

内部では Werkzeug の werkzeug.test.EnvironBuilder を実行しているだけなので、利用できる引数等はそちらのドキュメントを見てみればわかる。

environ_base とかに WSGI環境変数に使われている値を突っ込んでおけばヘッダとか諸々変更できる。

参考

Flaskのテスト関連メモ

調べたことの雑多なメモ。かなりてきとうです。

テストツールを探す

とりあえず以下の視点で探した

  • デバッグしやすさ
  • 結果の見やすさ
  • 導入の容易さ
  • coverageとか見れる
  • fixtureとか簡単につくれる

結果

とりあえず以下を使うことにした

  • pytest
  • pytest-cov (coverage)
  • flask-testing (utility)
  • factoryboy (fixture)
    • SQLAlchemy

なんとなくの理由

  • flask関連の情報が多いのはnoseだが、pytestのほうが結果が見やすくデバッグしやすいらしいので
    • noseもpytestも導入自体は簡単
  • pytestでcoverageを見るにはpytest-covがデフォらしい
  • flask-testingは色々便利なメソッドがつまってる(はず)
    • self.app, self.client などがデフォルトで定義されている
    • 使用したテンプレートや、コンテキストを確認するassertなども定義されていて便利
  • factoryboyはflask関連では情報が少ないが、fixtureってやつよりなんとなく情報量が多そう
    • ORMはSQLAlchemy一択という感じらしいのでそれと連携させる

参考記事

Flask でアプリケーションを作る際のメモ - Memo

  • noseを使用
  • viewはFlask付属のテストクライアント
  • ロジック部分は普通のunittest

How I Structure My Flask Applications

  • ツールは nose, factoryboy, mock がいいよ
    • factoryboy は fixture 生成できるっぽい、モデル(ORM)利用が前提?
  • rootのtestsディレクトリ以下に全てまとめる
    • test用の設定は tests.settings
    • factoryboy用の設定は tests.factories
    • ユーティリティ系は tests.utils
      • FlaskTestCaseMixinにassertなんかも作ってそこにまとめてある
    • TestCaseのベースクラスを作ってそれを継承
      • 共通のfixture, setUp, tearDown なんかは全てここ
    • 機能毎に tests.api, tests.frontend などのモジュールを定義している
  • 基本的にrequestのテストしかやってないっぽい

prschmid: Setting HTTP Request Values For Flask Unit Testing

GracefulExit - Flask と Alembic とテスト

  • Alembic で DBスキーマの管理ができるらしい、SQLAlchemyとセットで使うとか

Application Factories — Flask 0.10.1 documentation

  • この概念を用いるととてもよくなるらしい
  • blueprint を適用しているやつだとなおさら?

The Flask Mega-Tutorial, Part XVI: Debugging, Testing and Profiling - miguelgrinberg.com

  • werkzeugのProfileMiddlewareを使えばviewのパフォーマンスを計測できる
  • coverage重要そう

Flask-Testing — Flask-Testing 0.3 documentation

  • 便利なメソッドとかを生やしたUnitTestクラスを提供するもの?(パっと見)
  • template context をassertできるっぽい
    • これだけでも使う価値あり?

Testing Flask Applications — Flask 0.10.1 documentation

  • 公式ドキュメント、基本的なテスト方法の手順を記載

vimで増えすぎたスワップファイルからファイルを復元する

vimで同名ファイルのスワップファイルが作成される場合、 .swp, .swo, ..., .sva, ... みたいに作成される毎に拡張子を一文字ずつずらしていくらしい

自分の場合、vimrcのdirectoryに /tmp 以外を指定していたので、 自動削除されずに無名のスワップファイルがすごい量になっちゃってて拡張子が*.sss とか *.srv までいっていた

拡張子毎の復元方法

1. *.sw[a-z]

ファイル名指定、スワップファイル直接指定で復元可能 ファイル名指定で復元候補に表示されるのもこの拡張子の範囲まで

Windowsで無名ファイルを復元する場合

:recovery _
:recovery /tmp/_.swp
vim -r _
vim -r /tmp/_.swp

2. *.s[uv][a-z]

スワップファイル直接指定でのみ復元可能

Windowsで無名ファイルを復元する場合

:recovery /tmp/_.svz
vim -r /tmp/_.svz

3. *.s[uvw][a-z] 以外

*.s[uvw][a-z] の範囲内に拡張子をリネームして、上記1か2を実行する

Windowsで無名ファイルを復元する場合

!mv /tmp/_.stz /tmp/_.sua
:recovery /tmp/_.sua
mv /tmp/_.stz /tmp/_.sua
vim -r /tmp/_.sua

:recovery や vim -r でファイル名指定で復元できるのは

*.sw[a-z] だけ、*.s[uv][a-z] は スワップファイル自体を直接指定する必要がある

それ以外の拡張子は *.s[uvw][a-z] の範囲内に拡張子をリネームしてから復元を実行する

*.s[uvw][a-z] なファイルは vim -r _.sua:recover _.sua みたいに直接swapファイルを指定しても復元できる

ただ *.stz からはダメっぽい。

そうなったら素直にswapファイルとして解釈してくれる範囲内に拡張子をリネームして、実行すればうまく復元してくれる

Vim documentation: usr_11

Nagios で何も考えずに複数人に通知したいときの適当な設定

※ この記事の内容は2013年8月頃にメモしたものです

諸々オブションはあるけど、 何も考えずにグループ分けした複数人に 通知を設定したいときの最低限の方法

環境

コンタクトの設定

/etc/nagios/objects/contacts.cfg

# Contact
# 個別の通知先を定義する
# デフォルト定義済テンプレートのgeneric-contactをuseする
# それ以外の設定を使いたい場合は個別の項目を変更すればできる?

define contact{
       contact_name taro.yamada
       use          generic-contact
       alias        Taro Yamada
       email        taro.yamada@example.com
       }

define contact{
       contact_name jiro.tanaka
       use          generic-contact
       alias        Jiro Tanaka
       email        jiro.tanaka@example.com
       }

# Contact Group
# 通知先をグループにまとめて定義する

define contactgroup{
        contactgroup_name       example
        alias                   Example Group
        members                 taro.yamada,jiro.tanaka
        }

サービスの設定

/etc/nagios/servers/hoge.cfg

# それぞれのサービス定義に通知してほしい contact_groups を追加する

define service {
    use                 local-service
    host_name           hoge
    service_description PING
    check_command       check_ping!160.0,20%!500.0,60%
    contact_groups          example
}

設定反映

コマンドで確認して

/etc/init.d/nagios checkconfig

設定反映

/etc/init.d/nagios reload

参考

ありがたや

PHP だと taglist.vim に class と variables しか表示されないんですけど

この記事の内容は2012年8月頃にメモしたものです

原因は ctags が 古いからっぽい

ctags を update すれば解決する

5.6-1.1 -> 5.8 に update した。

# yum remove ctags
# cd /usr/local/src
# wget http://prdownloads.sourceforge.net/ctags/ctags-5.8-1.src.rpm
# rpmbuild --rebuild ctags-5.8-1.src.rpm
# rpm -ivh /usr/src/redhat/RPMS/x86_64/ctags-5.8-1.x86_64.rpm
# ctags --version
Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
Compiled: Aug 20 2012, 20:29:01
Addresses: <dhiebert@users.sourceforge.net>, http://ctags.sourceforge.net
Optional compiled features: +wildcards, +regex

参考

Tricorn Labs » ctags でサクサクコーディング。

ありがたや

なんとなくモダンっぽいPHP環境をつくって yii framework を導入するところまで

  • この記事の内容は2013年8月頃にメモしたものです
  • なんか未完成っぽいけどめんどいのでそのまま公開

環境

開発環境として利用していて、 既に古いPHPや諸々のライブラリは導入されている状態

PHPのインストール

phpenv

git clone https://github.com/CHH/phpenv.git
cd phpenv/bin
sh phpenv-install.sh

.zshrc に以下を追記

export PATH=$HOME/.phpenv/bin:$PATH
eval "$(phpenv init -)"

設定を反映

source ~/.zshrc

phpenv コマンドが有効になる。

実行したら rbenv って表示されるけど気にしない、ことにする…

php-build

mkdir ~/.phpenv/plugins
cd ~/.phpenv/plugins
git clone https://github.com/CHH/php-build.git

phpenv でinstallコマンドが使えるか確認

phpenv install

成功していればPHPのバージョンがガーーッと出てくる

PHP 5.5

phpenv install 5.5.3

事前に依存パッケージを入れておく。 自分の環境には以下がなかった。

sudo yum install re2c libcurl-devel libmcrypt-devel libtity-devel

バージョンを確認

phpenv versions

globalのphpを切り替え

phpenv global 5.5.3

なんかうまく切り替わらない場合は phpenv rehash したり source ~/.zshrc すれば戻る

あとでdate()云々で怒られるのでphp.iniを編集

vim ~/.phpenv/versions/5.5.3/etc/php.ini

timezoneを設定しておいい

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Asia/Tokyo

Composerでyiiのインストール

アプリケーションを構築したいディレクトリに移動して

curl -s http://getcomposer.org/installer | php

カレントディレクトリに composer.phar ができる

試しに composer.json を作成する

{
    "require": {
        "yiisoft/yii": "1.1.*"
    }
}

次のコマンドを実行してインストール

php composer.phar install

カレントディレクトリに vendor というディレクトリが作成されて 中に諸々がインストールされている

必要要件を満しているか確認 ビルトインWebサーバを立ち上げて確認してみる

php -S localhost:8080

http://localhost:8080/vendor/yiisoft/yii/requirements/

「Yii Requirement Checker」が表示されて、 各項目の条件が一覧できるのでとりあえず確認

yiiについてもろもろ

  • Core framework code style · yiisoft/yii Wiki
    • コーディング規約
    • インデントはタブ必須らしい
    • なんとなくPython使いからするとテンションさがる
  • Ardem/yii-coding-standard
    • CodeSnifferも用意されているので Git commit hook とかに適用させれば幸せになるかもしれない
  • yii-webserver つかえる
  • yii-standard-coding 便利
    • ただジェネレートしたコードがERRORになるし
    • giiの中のコードもエラーになる
  • Gitで扱うときのyiiの雛形作成にはvcsオプションが便利
    • こんな感じ: yii webapp foo git
    • 適切な位置にgitignoreとかを配置してくれる

参考

ありがたやありがたや