github flavored markdownで書いたmdファイルを、pdfにする方法
仕事でシステム連携仕様書をmarkdownでかきました
今は、atomのmarkdown previewでやるのがナウいと言われて 仕様書をつくるだけ作りました。
しかしいざ先方にお渡しする段階で gistに貼り付けてurlをお渡しすることも考えたのですが、 やっぱりpdfでしょという話になり、その時に有料アプリ買うか・・・とかいろいろ悩んだ時のお話です。
結論からいえば、pipでgripを入れて、 htmlを吐き出して、ブラウザでpdfとして保存すればOKです。
インストール
pip install grip
以上。
使い方
grip sample.md
とするとlocalhost:5000でアクセスするとブラウザで、mdァイルが、 いい感じでhtmlで見れます。
あとはそれをchromeでpdfとして保存するだけ。
gripとてもいい感じです。
是非markdownで書類作成して、pdfでエクスポートする時は、gripでやりましょう。
apacheで、mod_deflateでレスポンスをgzipしたけどネットワークトラフィックが増えている?
iOSのネイティブアプリでの掲示板サービスの、jsonを返すバックエンドのAPIのサーバーをつくってます。 ネットワークトラフィックを減らそうと思って、apacheでgzip圧縮をすることにしました。 コンテンツの圧縮率をみたら、処理によって、圧縮できているところと、 むしろ圧縮以前より容量が増えたものがあったりして、よくわからないので備忘録的にまとめました\(^o^)/オワタ
必要なmodule
設定
httpd.confに記述するだけ。 やった環境 centOS 6.5, Apache/2.2.15 モジュールversion
- モジュールの読み込み
LoadModule deflate_module modules/mod_deflate.so LoadModule filter_module modules/mod_filter.so
- モジュールの利用
#Gzipの圧縮の設定 # Netscape 4.x has some problems... BrowserMatch ^Mozilla/4 gzip-only-text/html # Netscape 4.06-4.08 have some more problems BrowserMatch ^Mozilla/4\.0[678] no-gzip # MSIE masquerades as Netscape, but it is fine BrowserMatch \bMSIE !no-gzip !gzip-only-text/html # ここからフィルター設定 FilterDeclare Compression CONTENT_SET FilterProvider Compression DEFLATE Content-Type $text/plain FilterProvider Compression DEFLATE Content-Type $text/css FilterProvider Compression DEFLATE Content-Type $application/xhtml FilterProvider Compression DEFLATE Content-Type $application/xml FilterProvider Compression DEFLATE Content-Type $application/json FilterProvider Compression DEFLATE Content-Type $application/xhtml+xml FilterProvider Compression DEFLATE Content-Type $application/rss+xml FilterProvider Compression DEFLATE Content-Type $application/atom+xml FilterProvider Compression DEFLATE Content-Type $application/x-javascript FilterProvider Compression DEFLATE Content-Type $image/svg+xml FilterProvider Compression DEFLATE Content-Type $text/html FilterProvider Compression DEFLATE Content-Type $application/javascript FilterChain Compression # ここまでフィルター設定 # Don't append Vary heder for specific files SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|zip|lzh|exe)$ dont-vary # Make sure proxies don't deliver the wrong content Header append Vary User-Agent env=!dont-vary Header append Vary Accept-Encoding env=!dont-vary # gzipでの圧縮率をログに吐き出す(確認用) DeflateFilterNote Input instream DeflateFilterNote Output outstream DeflateFilterNote Ratio ratio LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%) %{User-agent}i' deflate CustomLog logs/deflate_log deflate
ちなみに一番下にある、deflate_logを見ると、mod_deflateによる圧縮率を見ることができます。
"GET /example/badge HTTP/1.1" 45/37 (121%) "GET /example/list?offset=1&per_page=20&seed=26 HTTP/1.1" 1835/5221 (35%)
送信データの多いもの(掲示板の一覧表示画面)は、大幅に圧縮できているけど、 送信データ量の少ないもの(新着通知のバッチのカウントを返すもの)は、むしろ容量が増えている(?)
これはなんでだろう。
上記謎と、gzip圧縮によるCPU使用の増加率とかも、サービスイン後に調べてみようとおもいます! リリース前は、あれもやりたい!これもやりたい!ということがあって、
サービスインするまでには、インフラやアプリ・運用を見据えた仕組みでやっとけばいいことというのは本当に無数にあって、 リリース前までにやるべきこと以外で、捨てることは本当に多いなと痛感しながら日々進めております。
Laravelで、DBやEloquentクラスでsqlを実行してget()したけど、結果がstdClassになっちゃった場合
ネイティブアプリのサーバーのAPIで、Laravel使って見るかーとなったけど、 結果が、stdClassになって、危うく全部foreachしてarrayキャストするところだった。 PDOのFETCHの設定が下記ファイルに書いてた。
app/config/database.php
/* |-------------------------------------------------------------------------- | PDO Fetch Style |-------------------------------------------------------------------------- | | By default, database results will be returned as instances of the PHP | stdClass obj | array format for simplicity. Here you can tweak the fetch style. | */ 'fetch' => PDO::FETCH_CLASS,
上記をPDO::FETCH_ASSOCにすれば解決。
ここ が大変わかりやすかったです。
githubのプライベートリポジトリをLaravelのartisan経由で、Rocketeerでデプロイする時にハマったこと
Laravelのartisan経由でdeployしようとすると、デプロイコマンド実行しても結果が返ってこない・・・
どうやらdeployタスクが実行されるタイミングで、公開鍵のパスワードを入力してください・・・ のようなコマンドライン上での対話が発生してしまうと、デプロイが止まってしまってしまう模様。
rocketeerのリポジトリの設定ファイル
// SCM repository ////////////////////////////////////////////////////////////////////// // The SCM used (supported: "git", "svn") 'scm' => 'git', // The SSH/HTTPS address to your repository // Example: https://github.com/vendor/website.git 'repository' => 'git@github.com:Someone/MyApp.git', // The repository credentials : you can leave those empty // if you're using SSH or if your repository is public // In other cases you can leave this empty too, and you will // be prompted for the credentials on deploy 'username' => '', 'password' => '', // The branch to deploy 'branch' => 'master', // Whether your SCM should do a "shallow" clone of the repository // or not – this means a clone with just the latest state of your // application (no history) // If you're having problems cloning, try setting this to false 'shallow' => true, // Recursively pull in submodules. Works only with GIT. 'submodules' => true, );
一旦公開鍵をパスフレーズなしで、作成したら、うまくいった。
php版capistranoのRocketeerを使ってdeployしてみる
開発環境から気軽にdeployできる方法をphpでやってみた。 capistranoだとrailsアプリ前提だったので(もちろんRailsアプリ以外もいけるけど)
概要
やってくれることはシンプル. capistranoと同じで、deployするclientからリリース環境に対してdeployをやるという構成。 指定したユーザーでssh接続して、deployの度にreleaseディレクトリに最新のアプリケーションを持ってくる。 そしてdocument rootが設定されたcurrentに対して、symbolic linkでアプリケーションを公開を切り替えるというもの。
利用するにあたって下記の3つの前提条件だけ. * git * ssh接続設定 * deploy先にcomposerが事前にインストールされていること
基本的な使い方はcomposerと同じ感覚。
使い方
cd ${application-directory} wget http://rocketeer.autopergamene.eu/versions/rocketeer.phar
php rocketeer.phar ignite
上記コマンドで、deploy用の設定がディレクトリに書かれる
./.rocketeer
└ config.php --deploy先にssh接続するための設定
└ hooks.php --deployにhookする処理を書く
└ logs --deployのログ
└ paths.php --phpや、composer等のパスを書く
└ remote.php --deploy先の設定を書く
└ scm.php --gitやsvnの設定を書く
└ stages.php --productionやstagingの設定を書く
上記設定ファイルの勘所はわからないので、後々運用したら書いてみる
php rocketeer.phar deploy
※composer経由で、installして、/vendor/bin/rocketeerから同じことをたたいたら、エラーがでたのですが、わかりませんでした。 どなたかお詳しいかたいらっしゃいましたら教えて下さいm(__)m
行ってきた。東京Node学園vol11
初参加で、行ってきました。 メモをうpります。 webにうpされていたので、名前や資料などもメモ用に掲載していますが、問題があればいってください。 以下発表
これからのNode.jsの話をしよう @yosuke_furukawa
最近のHot News
- リーダー変更
- Node.js v0.12
- sync child_process
- tracing API
- profiling 用のPAI
- heap memoryの状況をモニタ
- tick毎にユーザーの任意のオブジェクトをトレース
気になるライブラリ
- koa(WAF) 詳しくはこちらを
- generator / yieldの未来
- try ~ catchのエラーハンドリング
- エラーハンドリングが直感的
リアルタイムライブラリ
- Socket.IO
- 新しいperl6?
- sock.js
- faye
- Engine.IO
- Primus [おすすめ]
- transfer層を後で置き換えられる。とりあえずこれ使っとけばよい。
- Socket.IO
フロントエンドツール周り
- gulp
- browserify
東京Node学園の今後
browserifyの話 @hitsujiwoolさん
- ここ のソースをlocalで動かしてとのこと
- browserifyとは
- サーバーサイドのjsをクライアントで使えるよ!的な話。
- 使ってみないとわからない・・・。
- サーバーサイドのjsをクライアントで使えるよ!的な話。
LT
発表面白かったです。
まとめ Nodeのコアライブラリしっかりよんでみる Expressもうちょい使ってみる それから他のライブラリに手をつけるかw ネタはないけど、次回発表したい。 *** もう少し参加している人たちと話せたらいいなとおもうけど、いつもなんだかきっかけがなくてそそくさと帰ってくるコミュ障ですw
Node.js初心者がEngine YardにNode.jsアプリケーションをデプロイした時の凡ミス
PaaSのEngine Yard でNode.jsをデプロイしてみました。 最早Nginxはじめてさわってみたよレベル・・・w
ざっくり説明です。
- 言語を選びます
- デプロイするアプリを選択。
- EngineYardのdeploy用のprivate keyの登録
- 上記をデプロイする環境を設定する
- Application Server Stackという項目でNginx(Recommended)となっているものを選択.
あとはインスタンスの種類を選択。
Nginxを選択.
これで環境の設定自体は完了。
あとはChefの適用やらをまって、deployボタンを押せば完了。
よしブラウザでアクセスして確認してみよう・・・と思ったら動かない。 どうやらlocalで動かしていたNode.jsのlistenしているport番号を3000とベタ書きしていたのが悪いような気がする。
var app = require('express')() , server = require('http').createServer(app); var port = 3000; server.listen(port);
としていたものを下記のようになおしたら、動いた。
var app = require('express')() , server = require('http').createServer(app); var port = process.env.PORT || 3000; server.listen(port);
どうやらNginxでhttpからnodeのプロセスを動かすためのportのforwaringを6000で行ってるからみたい。 もちろん6000とベタ書きせず、process.env.PORTとする。