概ね開発の日々


オヤジニア

 77  views 

在京のチップ製造やネットワーク機器のメーカに提案する時に作った画像。

一昨年の年末から数ヶ月、某エアコンメーカの機器間通信の設計に携わっていて、室内機と室外機の協調動作や制御のためのタブレット型リモコンとのネットワーク設計あたりを担当してたんだけど、メッシュネットワークがあったらなんでもできるよな〜と、開発を提案してみたが採用にはいたらずに、お蔵入りでしたっけ。

でも、いつの間にかWiFiの組み合わせで実現してました → The Best Wi-Fi Mesh Network Systems of 2018 | PCMag.com

こういうのって思いつくのは一緒なんだよな〜。もう少し頑張ればよかったかもw

小中規模オフィス向けに5〜6台で構成が組める WPA2-Enterprise な NetFlow 吐いてくれるヤツ、どこか作ってくれません?

 105  views 

前回作ってみた Electron + Vue.js なデスクトップ・アプリに、ちょこちょこと機能をつけたら、なんとなく形になってきました。 そういえば、なんのアプリか書いてませんでしたが、自身の作業報告用のログとして、作業中のスクリーンショットを10秒ごとに、マウスの位置を1秒ごとに覚えておき、ファイルに保存してくれるツールです。 クラウドソーシングサイトのおまけ機能であったんですが、そのサイトのジョブ以外でも使いたかったので、作りました。 まだいくつか改善点が残っていますが(一時ファイルが残るとか設定が決め打ちだとか)、一通り動く様になったので、OSX用の実行ファイルをアップしておきます。→(ダウンロード

ダウンロードして解凍すると Watchdog.app ができ、それが実行ファイルです。 適当なところ(アプリケーションとかデスクトップ)に置いて、実行許可すると動きます♪

 70  views 

JavaScriptなエコシステム(NodeJSとかV8エンジンまわり)を使って、MacやWindowsやiPhoneやAndroidのネイティブアプリの開発もできるんですよ。と、ちょいちょい言ってたんだけど、実際のところどれぐらいでできるのか測るのに、MacOSXネイティブで動作するアプリをElectron+Vue.jsで作ってみた。UIをHTML+CSSで書けて、ビヘイビアなメソッドをJavaScriptで書いて行くんだけど、Webアプリとほとんど開発工数は変わらない。でも、できると思ってたことができなかったり、難しいと思ってたことが簡単だったり、ネイティブアプリ側のノウハウもちょっと必要。画像はバイト(娘)の作業記録用に今回つくったアプリで、開発にかかった時間は20時間ぐらい。環境の準備とか調査で結構無駄な時間も食ったので、今週は休みなしだなぁw あっ、テストしてよさげなら公開しようかと思ってます♪

 1943  views 

リーダー(いわゆる点々))にもいろいろありますが、データの説明をする時など縦の三点リーダーを重宝してます。

こんな感じ↓

コード,名称,個数
Apple,りんご,6
Orange,みかん,11
Banana,バナナ,3
⋮

 で、この縦の三点リーダー、半角と全角・コロンの派生と、UTF-8だと、三つばかり似たような文字があります。

記号 Unicode JIS X 0213 文字参照 名称
U+22EE - ⋮ ⋮ vertical ellipsis
U+FE19 1-1-36 包摂 ︙ ︙ 三点リーダ
U+205D - ⁝ ⁝ tricolon

使い方としては「続きがありますよ」って意味で使うので、この中の一番上の半角のものを使いたいんですが、毎回前に書いたドキュメントや、ググったりしてコピペ…

横の三点リーダー「…」は、「・・・(「/」スラッシュを3回)」や「。(「.」ドットで表示)」から変換できるのに…

一発で入力できないかと、色々やってみたら、optionキーを押しながらコロン「:」キーや、option+shiftとスラッシュ(/)キーでも入力できたりすることに気付きました。 他にも、option+「=」キーで「≠」や、option+shift+「=(+)」で「±」が入力できたりするみたい。 数学で使いそうな「∑」や「Ω」や「√」、著作権関連の「™」や「©」や「®」、毎回「かっこ」で変換していた「【」「】」「〔」「〕」なんかも割り当てられてます。よく使う記号があれば覚えておくとよさげ♪

どんな文字が割り当てられているかは、キーボードビューワー機能を使うと詳しく見れました。 既に説明してくれているページがあるので、詳しくは ここここ を見てください。

ただ肝心の、縦の三点リーダーは割り当てられてなかった…

日本語、英語の変換モードに関係なく入力したいので、キー割り当てを直接変更する方法も考えましたが、どうにもできなさげ(直接設定を書きかえれそうな気も…)

辞書に登録するにも1文字や句読点の変換は登録できないし、キーの割り当てをソフトで変更すると、ただでさえ遅い Bluetoothキーボードの反応が心配…

日本語の入力に、Google日本語入力を使うと「・(全角黒丸)」3個で変換できるらしいんだけど、それもちょっと…

ってことで、結局辞書に「たてさん」で「︙(全角)」を登録することにしました…うーん

また気が向いたら、キー割り当てを直接変更する方法を探しますw

 237  views 

NodeJSからFTPするのに日本語が使えないことに気づいた。 どうにも上っ面の対応じゃだめで、大元のパッケージに手を入れました。 3〜4行直しただけなんだけど、ついでにGitHubにフォークしておきました。

https://github.com/tomohiroorikasa/node-ftp

パラメータに fileEncoding を追加しています。 node-ftpの代わりにインストールしておいて、以下のような感じで使います。 (CoffeeScript)

PromiseFtp = require 'promise-ftp'

co () ->
  connect =
    host: '[hostname or IPaddress]'
    port: 21
    user: '[user]'
    fileEncoding: 'UTF8' # <- ここ
    secure: false

  ftp = new PromiseFtp()

  try
    yield ftp.connect connect
  catch e
    console.error 'connected faild'
    throw e

  yield ftp.binary

  yield ftp.list( 'Remote Root Path' )

 ⋮
 ⋮
 ⋮ 処理をここに
 ⋮
 ⋮

.then ( ret ) ->
  if ret && ret != ''
    console.log ret
  process.exit 0

,( err ) ->
  console.error 'err:', err
  process.exit 1

GitHubのフォークの仕方がいまいちよくわからない。 ブランチ切らずにあげてみたけど、これで合ってるのかどうか。 怒られないかちょっと心配…w

 115  views 

移設後、いくつか不具合の報告があったので、やっぱり自分でもテストするかと、前のシステムに残っていた自ブログを移設してきた。自分の書いた文章って、後から読むとめっぽう恥ずかしいんだけど、まあ今更消してもあれなんで、そのまま置いときます。 ちなみに、最後の記事は今から1年3ヶ月前。あー、このタイミングで東京撤収して京都に戻っていたら、大赤字も出さずに済んだのに〜。と思ったり思わなかったりw で、1年前から比べると、システムがごっそり入れ替わってる。専用サーバは撤去してクラウド化したし、データベースはMySQLからMongoDBになった。NodeJSを使っているのは変わらないけど、Loopbackをバックエンドに入れて、フロントエンドの開発がメインになってる。 そのあたり時間があったら、ここか、あっちに、書くかもしれません。ってことで、たまに見に来てくれたら嬉しいかも♪

 80  views 

会社勤めに向いてないことが改めて露呈した某社への出向だったけど、客先との接し方や開発チームの回し方について考えるいい機会になったり、若手エンジニアの今時のツール利用方法や立ち位置も見えたりして、儲からなかったのは痛いけどまあ結果オーライw で、出向が終わりに近づいていたときに平行して制作を受託していたWebページ(内職とも言うw)が来週後半に公開される。受託した内容はトップのページを改版するだけなんだけど、ちょっとばかり凝ってSPA風にしてCMSを一切通さない静的ページのみの構成にしておいた。それには訳があって、ベースのCMSがよくあるLAMP環境のもので、しかもチューニングをまったくしてないし、さらに、20万件超えの検索システムを載せたりしていて、ちょっとツツくと落ちる。しかもオープン早々にプレスリリース巻くよ。とか、大手新聞に記事が晒される予定があったりで、速攻Yahoo砲が飛んでくる気配。色々アドバイスもしたんだけど、なんせエンジニア不在なのでスルーされるし、予算が皆無なのでこちらも手が出せず。ってことで、極力軽くしてあげたんだけど、どうにも理解できないようでw でもトップページだけの負荷軽減じゃあ所詮付け焼き刃程度なので、俺が担当者だったら今から寒気が止まんないw とは言え最悪のシナリオが実現しちゃったら、なんとかできないかと泣きつかれる可能性だデカイ。 前回「思いついた」って言ってたのはこの話で、高耐用性のコンテンツ管理システム(HA-CMS)を作ってみることにした。 先週まではぼちぼち周辺から作ってたんだけど、就活で出てきた娘との会話がヒントになって、従来のCMSと一線を画すコンセプトが出てきた。就活で上の空な娘に、CMSの説明をしてたんだけど、どうにもうまく伝わらない。モダンでクールなサイトはブログベースのCMSじゃなく、プログラミングスキルに長けたWebデザイナーが作ってるんだよね。で、そういうものを誰でも作れるCMSにしたいんだ。って話から、LAMPベースのCMSって基本ブログ用じゃない?Webデザインを突っ込んで必要箇所のデータを入れ替えられればいんじゃない?って話になり。そこから一週間で一気に開発。Express + Jade + NodeJS + MongoDB + Redis と、新しいミドルウェアやフレームワークを駆使して、かなり軽量のアプリケーションサーバに仕上がった。 負荷テストをみる限り、CPU以外にサーバに負荷はほとんどかかってなくて、LAMP系CMSの20〜50倍ぐらいのページは余裕で送出できる。ついでにやCSRF対策も盛り込み、最後に Nginxで巻いて HTTP/2 に対応させた。 ということで、折角だし名前つけた「ハヤブサ」。早速、自社サイトを入れ替えてみたので、来週末にでもログを見比べて、性能評価しようかと。よかったら覗いてください。

写真は、特に関係なしw おっと、証明書がChromeとAndroidでエラーになる。買い直さなきゃなw

 52  views 

金沢での打合せ帰りに乗ったサンダーバード。 守秘義務とかあって詳しくは書けないが、何かが終わった日。 そして、新しいことを思いついた日でもある。 2週間が経ち、やっと今日から着手した

 171  views 

2ヶ月ほど出稼ぎ(出向ね)に行って、太りました(まだ行ってるけど)。久しぶりの投稿です。

年度末で危機的状況だった案件がやっと収束してきたので、1日オフィスに引き籠って、掃除したり、洗濯したり、料理したり、放ったらかし気味のお客さんの仕事を片付けたり。余った時間でここの開発まとめ。運動とかする方向に行かんな〜。かわりと言っちゃなんですが、ひっそりと今日からユーザー登録できるようになってます。いまいち使い勝手が良くなかったり、実装したいことも残ってて、この先どうするかも決めあぐねてたりしますが、よかったら使ってください m(\\)m

全然整理ができてなくて、ここぞなプログラミングネタもないんですが、ユーザー登録に使ってみた reacptcha が結構使えそうなので載せときます。

Webページ側のform内に置くHTMLはこんな感じ。非表示の name: _recaptcha に確認用の文字列が入ってくる。

<div class="g-recaptcha" data-sitekey="(サイトキー)" data-callback="recaptchCallback" data-expired-callback="recaptchExpiredCallback"
></div>
<input type="hidden" class="form-control" id="_recaptcha" name="_recaptcha" value="" required>

で、スクリプトをどこかに置いておく。

function recaptchExpiredCallback() { // <= 期限切れ時用。ちょっと怪しい
$('#regist-form .form-control#_recaptcha').attr('value','');
    $('#regist-form').validator('validate');
}

function recaptchCallback(code) { // <= コールバック用
    $('#regist-form .form-control#_recaptcha').attr('value',code);
    $('#regist-form').validator('validate');
}

裏側(サーバ側、NodeJS)はこんな感じ。確認用の文字列を送って、大丈夫かどうか確認する。

checkRecaptcha = function( req, res, callback ){
    var params = checkParams( req ); // <- パラメータ取得関数。POSTデータがparams.hash に入る

    var remoteIp = req.headers['x-real-ip'];  // <- 手前がNginxの時

    if ( params.hash._RECAPTCHA ) {
        request.post({
            url: "https://www.google.com/recaptcha/api/siteverify",
            form: {
                secret: '(サイトキー)',
                response: params.hash._RECAPTCHA,
                remoteip: remoteIp
            }
        }, function ( err, ret, body ){
            var success = false;
            if ( !err && ret.statusCode == 200 ) {
                var json = JSON.parse( body );
                if ( json.success ) {
                    success = true;
                }
            }

            callback( req, res, false );
        });
    }
}

そういや、GlobeSSL(グローバルじゃなくグローブね)なる怪しげな格安SSL証明書をここ用に取得してみた。暗号化目当てじゃなく、HTTP/2でデカめの画像のパフォーマンス向上のためなので。ちなみに、ひとつ1000円(安)

写真は目黒川(先週、出向先までの道のりで撮影)。あー、花見行くの忘れてたな〜

 92  views 

朝方に見つけたバグ(連続してINSERTされた場合に、連番をうまく採番できない)が気になり、昼前から修正しはじめる。まずは、寝る前に書いたコードから不要な部分を削除。非同期で速さと軽さを追い求めるNodeJSのトリッキーなコーディングと、正確さと堅さが必要なデータベースのトランザクション処理は、毎度ながら頭を悩ませる。いっそ最初から同期処理するコードを他の言語で書いてしまおうかとか考えつつ、とりあえずパフォーマンスを落とさぬように試行錯誤。結局 MySQL の AUTO_INCREMENT のお世話になることに。INSERT の前後をトランザクション処理で挟んで、LAST_INSERT_ID()関数で連番を取得することに。おおまかな流れはこんな感じ。

{開始}
START TRANSACTION;
INSERT INTO [対象テーブル] ([フィールドリスト]) VALUES ([値リスト]);
{失敗時 ROLLBACK; 後に抜け}
SELECT LAST_INSERT_ID(); にてAUTO_INCREMENTの値を取得
COMMIT;
{終了}

夕方、訳あって作業中断。夜になって再開しデバッグまで完了。 写真はその翌朝に行ったカフェ。オープンの日だったので早朝から並んでみた。ブレンドがパンチが効いてて美味しかったなぁ。 今日から客先出向。雪で新幹線が遅れ初日から午後から出社に…はてさて、どうなることやらw