概ね開発の日々


オヤジニア

 33  views 

年明け早々、風邪をひいて調子を崩す。 動画変換を仕込みたく、色々試すも頭が回らずいまひとつの出来で先送り。 [こちら](http://owned.media/)の進捗もぼちぼち。微調整に終始する。 一覧とポータルにサムネイル画像の表示をつけた。BootstrapなのでTwitter風。 CSSはこんな感じ。coverは便利だなぁ ``` background:url([画像のファイルパス]) no-repeat scroll center center; background-size:cover; ``` 飲み会のお誘いにいそいそと出かけ、少し風邪がぶりかえすw 食い扶持探しのつもりだったところ、お抱え力士としてどうだい?的なお声がかり。 打てば響くプログラマーがいてくれる環境に魅力はあれど、呉越同舟にならんかなと、ちと考え中。 風邪もほぼ治ったので、開発再開。 初回のサムネイル画像を生成する処理に、少し時間がかかる。 NodeJSの1スレッド動作だと、どうしても重い処理に引っ張られて遅く見えるので、複数プロセスを立ち上げることに。 でも、VPS環境でCPUがひとつなので、clusterモジュールを使うのもなんだかなぁ [express-cluster](https://www.npmjs.com/package/express-cluster)モジュールにしてみる 実際はもうちょい複雑だけど、大体こんな感じで仕込んだ。 ``` var express = require( 'express' ); var cluster = require( 'express-cluster' ); cluster( function( worker ) { var app = express(); app.use( … ); // パーサ使ったりとかもろもろ app.get( '/', function( req, res ) { res.status( 200 ).send( 'html text' ); }); return app.listen( 8080 ); }, { count: 5, respawn: true, verbose: false // debug }); ``` でも、重い処理(画像変換とか)を child_process 使って、追い出すほうがよさそうな気もする… 写真はいただきもののくず湯。お気遣いありがとうございます。 でも、なんとか頼らずに全快しそうです。次回、ありがたく飲ませていただきます m(_ _)m

 20  views 

FBに記事をシェアしたけど画像が表示されてなかった。 [OGP](http://ogp.me/)の画像URLに、スマホのデカイ画像そのままあげたせいか? ということで、ImageMagickベースのサムネイル画像の生成ツールを仕込む。 ``` % npm install imagemagick ``` ※ RPM等でImageMagickを入れておく バックエンド側(NodeJS)はこんな感じ ``` var im = require( 'imagemagick' ); im.convert( [ srcPath, '-resize', maxWidth + 'x' + maxHeight + '>', destPath ], function( err, stdout, stderr ) { if ( err ) { // error... } else { res.download( destPath ); } } ); ``` セッションにメモリを使っていたせいで、バックエンドを再起動するたびログインし直す必要があり、デバッグが面倒になってきたので、永続化をRedisにて。 ``` app.use( session({ , saveUninitialized: true, resave: true }) ); ``` ↓ ``` redisStore = require( 'connect-redis' )( session ); app.use( session({ key: 'hogefuga', store: new redisStore({ host: '127.0.0.1', port: 6379, prefix: 'session' }), cookie: { path: '/', maxAge: 3600000 // 1h }, secret: 'hogefuga', saveUninitialized: true, resave: true }) ); ``` 一段落して、FBのデバッグツールで記事を解析させてみるが画像が出てこない。 > og:image was not defined, could not be downloaded or was not big enough. Please define a chosen image using the og:image metatag, and use an image that's at least 200x200px and is accessible from Facebook. Image 'http://b.st-hatena.com/images/entry-button/button-only@2x.png' will be used instead. と思ったら、バックエンドからファイルを返す時に、 ``` res.download( filePath ); ``` ではなく、こうしないといけなかった ``` var bin = fs.readFileSync( filePath ); res.end( bin, 'binary' ); ``` う、うんw 試行錯誤ついでに、Bootstrapっぽいパラメータで動作するようにした。 写真は3日に引いた伏見稲荷のおみくじ。 内容はさておき **1番**。でだしとしては、いんでないかい?

 36  views 

正月明け、今日から仕事初め。 家の前の車通りがめっぽう増えた。 朝のうちに、Ajaxのファイルアップロードを仕上げて、 投稿への画像の貼り付けができるようにした。 フロントエンド側でファイルのアップロードをどうするか色々と試行。結果、あれこれ処理せずとも結局FormDataをそのまま送りつけるだけで事足りた。 HTML ``` <form onsubmit="return upload( this );"> <input type="file" id="FILE"> </form> ``` JS ``` function upload( form ) { var data = new FormData( form ); $.ajax({ type: "POST", url: '[POST先のURL]', data: data, processData: false, contentType: false, success: function( ... ) { ... }}); return false; } ``` NodeJS+Express4+multer ``` if ( req.files && req.files.FILE ) { fs.renameSync( req.files.FILE.path, [保存先のファイルパス] ); } ``` 写真は元旦の松尾大社(お酒の神様として有名)。 さて、写真のあてにおせちの残りでもつまもうかw

 40  views 

元旦、2日と連続で降った雪も溶け、テストもそこそこで初詣へ。 また、バックエンドの再起動を忘れ、サービスが落ちてた… 普段の監視ネットワークとは別に、少しの間だけ死活監視したい。がっつりしたものはいらないんで node.js で簡単な死活監視を作って、動かしておくことにした。なお、node.js本体に含まれるモジュール以外は使っていない。 `chkhttp.js` ``` var http = require( 'http' ); var exec = require( 'child_process').exec; var server = { host: 'localhost', // <- 監視したいURLのドメイン部分(IPアドレスまたはドメイン名) path: '/', // <- 監視したいURLのパス部分 port: 80 // <- 監視したいポート } var email = 'hoge@ocids.com'; // <- 死活結果 http.get( server, function( res ) { if ( res.statusCode !== 200 ) { exec( 'echo "response code ' + res.statusCode + '" | mail -s "'+ server.host +' error" ' + email ); } process.exit(); }).on( 'error', function( e ) { exec( 'echo "' + e.message + '" | mail -s "'+ server.host +' error" ' + email ); process.exit(); }); ``` よかったら `$ node chkhttp.js` とかcronで、お好きにどうぞ。

 23  views 

元日の昨日は昼から近所の神社に初詣に出かけた。 3時頃から降り始めた雪が夕方近くになって本降りの大雪に。 あちこちで車がスタック、チェーン買っとかないと。 今日は、Facebookのリンクが開発者向けかつ関西弁になっていたのを修正しておく。 ``` <div id="fb-root"></div> <script>(function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0]; if (d.getElementById(id)) return; js = d.createElement(s); js.id = id; js.src = "//connect.facebook.net/ja_JP/sdk.js#xfbml=1&appId=[ここはAppID]&version=v2.0"; fjs.parentNode.insertBefore(js, fjs); }(document, 'script', 'facebook-jssdk'));</script>` ``` ↑を適当に配置し、↓を表示させたいところに。 ``` <div class="fb-like" data-layout="button_count" data-action="like" data-show-faces="true" data-share="true"></div> ``` 記事画像としてファイルをajaxでアップロードできるようにすべく色々試行するも、うまくいかないまま寝落ち。 バックエンドを再起動し忘れて寝たせいで8時間ほどサービスが停止。 本番までに監視のスキームを考えないとな…

 22  views 

年末年始は京都の自宅にいてます。 年越し直後に寝落ちして変な時間に起きたんだけど、みんな寝てるので暇。 気になっていたところを改修しておこう。

まずは、マイページ(各アカウント毎のページ)のタイトルとプロフィールが決め打ちだったので、個別に表示できるようにする。 DBスキーマに手を入れるが、ついでに記述でパスワードなど絶対表に出しちゃいけないカラムを指定できるようにする。 { ID:"PASSWORD", NAME: "PASSWORD", TYPE: "string", LENGTH: 100, HIDDEN: true }, (行末の HIDDEN: true で、一切出力されない) TinyControllerな設計なので、下手するとデータがフロントエンドに筒抜け。 認証の情報が表から取得できてた。以後、気をつけなな…

おせちをつまみ食いするも、まだ誰も起きず。

ここは、サーバ負荷軽減のため Google Analytics 様を活用してる。\r\n動作確認がてらログを齧る。FBで告知した日に400PV。100PVぐらいが知り合いか。 (ざっくりした告知へのご反応、ありがとうございますm(--)m) で、ルーマニアから閲覧してるのは誰だw

そうそう。記事の本文はマークダウン記法が使えるようになってます。 (でもWikiとか直のHTMLとかは積まないつもり)

まだ起きてこないw コーヒーでも淹れるかね

 24  views 

あと1日で2014年も終わりですが、こんなサイトを作っとります。ハイw

 28  views 

オウンドメディアのためのウェブサイト「Owned.media」を本日公開しました。