Node.jsで特定の文字列から固有のidを作成する方法について

投稿者: Anonymous 現在、uuid-by-stringを使用しています。 uuid-by-stringを使用すると、基本的には被らないuuidが作成されるのですが const getUUID = require(‘uuid-by-string’); console.log(“おっぱい:”+getUUID(“おっぱい”)); console.log(“ちっぱい:”+getUUID(“ちっぱい”)); とすると、何故かuuidが被って、どちらも同じidで おっぱい:A8BE6F3B-3DED-4879-8A0B-4705EEBAF673 ちっぱい:A8BE6F3B-3DED-4879-8A0B-4705EEBAF673 が生成されてしまうみたいです。 例が下品な単語ですみません…。 日本語には対応していないのでしょうか? 他に何か日本語文字列から、固有の英数字idを生成する方法はないでしょうか? 解決 他に何か日本語文字列から、固有の英数字idを生成する方法はないでしょうか? 大きく分けると、ハッシュ値を使う方法と、ASCII の範囲に収まる方式でエンコードする方法があります。 ハッシュ値を使う方法は、文字列が長くても得られる ID の長さを一定に出来ます。 しかし、元の文字列が長すぎなければ、エンコードしてそのまま ID に使えるかも知れません。 (UUID の例にはuuid モジュールを使用しています。uuid-by-string というモジュールより信頼できると思います) “use strict” // ハッシュ値の16進表記 const crypto = require(“crypto”) function mkhash(str) { //const hash = crypto.createHash(“md5”) //const hash = crypto.createHash(“sha1”) const hash = crypto.createHash(“sha256”) hash.update(str)…(Continue Reading)

Node.jsのコールバックの連鎖の中でメモリ解放を行う方法

投稿者: Anonymous createHoge, createFuga, execPiyo の三つメソッドがあります。 createHoge, createFuga はとても大きなデータを生成する関数で、データを生成したらコールバックを呼び出すものです execPiyo は、createHoge, createFuga で生成したデータを処理する関数で、データ処理が完了したらコールバックを呼び出すものです。 createHoge(function(hoge) { createFuga(function(fuga) { execPiyo(hoge, fuga, function() { console.log(“1piyo done.”); // この時点で hoge, fuga を破棄したい createHoge(function(hoge) { createFuga(function(fuga) { execPiyo(hoge, fuga, function() { console.log(“2piyo done.”); }); }); }); }); }); }); このようなコールバック呼び出しの連鎖で実行できるものとします。で、連続して execPiyo を何回も実行したい時にcreateHoge, createFugaで生成したhoge, fuga をメモリから解放できずに困っています。 RxJSやPromiseやgeneratorを使ってcreateHoge, createFuga, execPiyoの実行を複数回書いてみたんですが、どのやり方でもメモリを食いすぎて途中で落ちてしまいます。 補足: createHoge,…(Continue Reading)

Bluemix DevOps Serviceのエディターの保存について

投稿者: Anonymous IBM Bluemix DevOps ServicesでJavaScriptのコードを書いています。 エディターで明示的にファイルの保存をしなくても変更したコードは保存されているようですが、変更はどの時点で保存されるのでしょうか?デプロイのタイミングでしょうか? 解決 IDS(IBM Bluemix DevOps Services)のエディターは自動保存の設定になっています。デフォルトでは変更直後(正確には0.25ミリ秒ごと)に自動保存されます。 もし自動保存が必要ないのであれば、設定を解除することも可能です。EDIT CODEが選択されている状態で、画面上部のメニューにあるスパナの形のアイコン「ローカル・エディター設定」にて、設定を変更できます。 回答者: Anonymous

シェルスクリプトでnode.jsがすでにインストール済みかチェックするには?

投稿者: Anonymous シェルスクリプトを始めたばかりなのですが、 件名の処理をどのようにしたら良いかわからず質問しました。 macにてシェルスクリプトを使って、Node.jsが入っていなければ、 Node.jsをダウンロードするという処理を書きたいのですが 入っていればと言うのをどのように書けば良いかわかりません。 Node.jsのダウンロードは、 下記のコマンドで実現できました。 curl -O https://nodejs.org/dist/v0.12.5/node-v0.12.5.pkg 処理としては下記のようになるはずです。 #!/bin/sh if アプリが存在しない then curl -O https://nodejs.org/dist/v0.12.5/node-v0.12.5.pkg fi   MacOSX:10.10.3   ■最終目的は下記の手順をシェルスクリプト化する事です。 ●Node.jsダウンロード  https://nodejs.org/download/ ●ファイルサーバーとするフォルダを指定  1:フォルダ作成  2:コマンドプロンプトから1:のフォルダへ移動  例)cd /path/to/my/project  3:コマンドプロンプトにて下記入力   npm install connect ●jsファイルを1のフォルダに作成  ・jsファイルの中身は下記ソース var connect = require(‘connect’), serveStatic = require(‘serve-static’); var app = connect(); app.use(serveStatic(__dirname)); app.listen(5000);  ・適当な名前で保存   仮にserver.jsとする。 ●コマンドラインからサーバー実行  1:コマンドプロンプトからjsファイルのフォルダへ移動…(Continue Reading)

gruntでビルド後の本番環境の構築の一般解について

投稿者: Anonymous grunt(自動ビルドツール)を利用したWEBアプリ開発の勉強をしております。 node.jsやgruntを用いた開発・ビルド環境の構築方法や、grunt serveコマンドで テストサーバを立てる方法は多く凡例があるのですが、ビルド後の情報が少ないため、 質問させて下さい。 gruntでは、minifyなどを行った結果を例えば、distフォルダなどにまとめてくれますが、 開発環境から本番環境に移して、サーバを立ち上げる場合、一般的にはどのようにするので しょうか。 現状、以下があるのではと考えています。  ①本番環境のpublicな領域にdist以下を置いて、Apacheサーバなどで、index.htmlにアクセスできるようにする。  ②本番環境にnode.jsを導入し,nodeでサーバサイドjavascriptを起動する。 あまり情報がないので、シンプルに①なのかなと思うのですが、nodeで起動できるjavascriptくらい自動生成するかもとも思っています。 全く、見当違いをしている可能性もあるので、これが常識だみたいなものがあれば、 ご教授頂ければと思います。よろしくお願いします。 解決 gruntは単に自動化のためのツールであって、gruntでビルドするとデプロイの方法が変わってくるというものではありません。「gruntでビルドしたからデプロイはこうするのが普通だ」というような常識はないでしょう。 gruntでビルドした後の情報が少ないように見えるのは、ビルドの方法とデプロイの方法はほとんど無関係だからです。デプロイの方法を検索したいなら、「grunt」をキーワードに探すのではなく、「amazon web service デプロイ」「heroku デプロイ」「レンタルサーバ デプロイ」とか本番環境と関連させて検索してみるとよいと思います。 勉強中とのことですが、まずは現在予定している環境へ取り敢えずどんな方法でも良いのでデプロイしてみたらいかがでしょうか。デプロイしてみて動けば、とりあえずそれは方法の一つとして間違ってはいないでしょうし、動かなければ何か勘違いしているのでしょう。私はとりあえずいろいろやってみて覚えました。 (1)か(2)かでいえば、静的なページやクライアントサイドだけで動くアプリケーションなら(1)でも(2)でも動くでしょうし、nodeアプリケーションであれば必然的に(2)を選ぶことになるでしょう。いずれにせよ実際にデプロイしてみればわかります。 ところで、この業界はころころ「常識」が変わるので、あんまり「常識」を鵜呑みにしないほうがいいです。何しろ、nodeアプリケーションはgruntでビルドするのが常識だったのは過去の話で、もうすでにgruntは廃れつつあります。現在は、記述性が高くプラグインの品質も高いgulpのほうがよく使われるようになってきています。今から新しいアプリケーションを作るならgulpをおすすめします……が、もちろんgulpもいつまで持つのか不明です。「〇〇が常識!」という言葉の賞味期限は長くて1年とかで、それ以降は「昔の話」ですし、「〇〇が常識!」という人は自分が手慣れたやり方を周囲に押し付けているだけというときもあるので、さほど気にしなくて大丈夫です。 まとめ: デプロイの方法とgruntはあまり関係ありません 思いついた方法で動けば、ひとまず間違いではありません 常識はすぐ変わるので気にしなくていいです 回答者: Anonymous

npm installでUNMET PEER DEPENDENCY

投稿者: Anonymous 既存のASP.NET MVC5プロジェクトにAngular2をインストールするため、 http://www.mithunvp.com/using-angular-2-asp-net-mvc-5-visual-studio/ を参考にしていたのですが、npm installで UNMET PEER DEPENDENCY [email protected] UNMET PEER DEPENDENCY [email protected] npm WARN [email protected] requires a peer of [email protected] but none was installed. npm WARN [email protected] requires a peer of [email protected]^0.7.2 but none was installed. と表示されてしまいます。(node_modulesは作成される) そのまま実行しても、zone.js等が見つからず、エラーが出てしまいます。 依存関係を解決するにはどのようにすればよいでしょうか? よろしくお願い致します。 手順 node.js(v6.10.1 LTS)をインストール TypeScript for Visual Studio 2015(v2.2.2)をインストール 参考にしたサイトのデモプロジェクトをダウンロード package.jsonのあるパスでnpm install(ここで上記のWARN) そのまま実行すると画像のエラー…(Continue Reading)

nodejsでの逐次処理について

投稿者: Anonymous nodejs の逐次処理について質問です。 JavaScript Promiseの本 https://azu.github.io/promises-book/ 上記サイトを参考に、コールバック地獄を回避するために、以下のようなタスク1~3の逐次処理するロジック(タスクの処理結果を次のタスクに渡す)を記載し、希望通りタスク1~3が逐次実行されるのは確認できました。 ですが、js 初心者のため、以下の疑問が出てきましたので質問させていただきました。 (抽象的な質問で申し訳ありません。。。) (1) このやり方が一般的なのでしょうか? (2) このやり方での問題点は何かありますでしょうか? とりあえず動作確認のみ行いました。が、このロジックが正しいかどうかの判断がついていません。 // 何かしらの非同期処理 // この関数では入力パラメータの value に +1 するだけ // 入力パラメータの error は reject を発生させて、catch() が動作しているか確認用 function async_task(value,error) { return new Promise(function (resolve, reject) { setTimeout(function () { if (error === undefined){ resolve(value+1); } else { reject(error); } }, 1000);…(Continue Reading)

Node.jsでZIPファイルを展開したい

投稿者: Anonymous ZIPファイルと展開先ディレクトリのパスを与えるとZIPの中身が宛先ディレクトリの中に全部展開される、という処理をしたいです。良い方法はありますか? 解決 unzipというnpmモジュールがあります。 https://github.com/EvanOxfeld/node-unzip このように利用します。 var fs = require(‘fs’); var unzip = require(‘unzip’); fs.createReadStream(‘./xxx.zip’).pipe(unzip.Extract({ path: ‘output/path’ })); 回答者: Anonymous

Sails.jsのmodelのintな値をインクリメントしたい

投稿者: Anonymous たとえばCounterというmodelを module.exports = { attributes = { count: ‘INT’ } } として用意して、 Counter.create({count: 10}) を実行すると、 { count: 10, createdAt: Sat Jan 24 2014 17:12:18 GMT+0900 (JST), updatedAt: Sat Jan 24 2014 17:12:18 GMT+0900 (JST), id: 1 } のようなmodelが作成され、 Counter.update({id: 1},{count: 11}) を実行すれば、上のmodelのcountを11に変更することができますが、 これを値を確認せずにインクリメントする方法はないのでしょうか? 解決 追記: 前回のコード、コールバック指定していないところがあったので、更新しました。すいません (1/26) モデルにクラスメソッドを定義して呼び出してやるのが良い。 models/Counter.js module.exports = { attributes:…(Continue Reading)

javascriptファイルダウンロード時のファイル名の指定について

投稿者: Anonymous 現在以下の様な手段を使ってサーバからファイルをダウンロードしているのですが、 ファイル名が指定したものになりません、原因が分かる方いますでしょうか? var a = document.createElement(‘a’); a.download = ‘test.xml’; a.href = ‘http/XXX/XXX/user?id=1234’; a.click(); サーバー側はnode.jsで作成されていてurlで指定されたものをデータベースにアクセスして取得してくれるようになっています。 この時ダウンロードされたファイルの内容などは正しいのですが、ファイル名だけが指定したものになってくれません、、、どうしてでしょうか? 解決 クロスドメインの問題はありますが、受付先で許可して、こうすれば取得できますね。 既に回答がありますが、対応ブラウザもご確認ください。 _x000D_ _x000D_ window.URL = window.URL || window.webkitURL;_x000D_ _x000D_ function work(){_x000D_ var val1 = document.getElementById(‘url’).value;_x000D_ var val2 = document.getElementById(‘name’).value;_x000D_ downloadXML(val1, val2);_x000D_ }_x000D_ _x000D_ /**_x000D_ * @param url String_x000D_ * @param filename String_x000D_ **/_x000D_ function downloadXML(url, filename){_x000D_…(Continue Reading)

ブラウザに対するウェブページのドメインの偽装について

投稿者: Anonymous 以下のような二例が可能かどうか質問させてください。 ユーザAがウェブページindex.htmlをサイトhttps://example.comに置きます。 不正なユーザBがindex.htmlをC#などで開発したウェブブラウザで表示し、htmlの内容をライブ的に改変します。ここまでは可能だと思います。以下のリンクで確認ください。 https://social.msdn.microsoft.com/Forums/windowsapps/ja-JP/0e75cb00-2a9c-4650-a4ae-6090300d8aaa/webbrowserhtml?forum=csharpgeneralja 次に不正なユーザBはindex.htmlのクリックボタンを押して不正なGetリクエストをhttps://example.comに送信します。 質問1 この際にMicrosoftのC#のブラウザは、ページが改変されているにも拘わらず、index.htmlのオリジンをhttps://example.comとして扱うのでしょうか? 質問2 そもそも不正なユーザBはGet送信にWebブラウザを使わずとも、index.htmlの内容さえ知れば、後は自作した非ブラウザの通信プログラムで、オリジンを偽装してhttps://example.comに不正なGetリクエストを察知されずに送信できるのでしょうか? 尚、一般にGetリクエス送信にページのオリジンの情報を含めることでブラウザやサイト側がセキュリティをかけていると言うのは私の推測です。検索したのですが結果が得られませんでした。 以上よろしくお願いします。 解決 WebブラウザーのHTTP(S)通信では直前に表示していたページやリンクを含むページののURLをRefererヘッダーに含めて送信します。 この際にmicrosoftのC#のブラウザは、ページが改変されているにも拘わらず、index.htmlのオリジンをhttps://example.comとして扱うのでしょうか? WebBrowserで使用されているIEコンポーネントでの動作は分かりませんが、一般的にはユーザーがHTMLを改変したとしても元のURLをリファラとして送信するものと思います。 そもそも不正なBはGet送信にWebブラウザを使わずとも、index.htmlの内容さえ知れば、後は自作した非ブラウザの通信プログラムで、オリジンを偽装してhttps://example.comに不正なGetリクエストを察知されずに送信できるのでしょうか? HTTP通信の内容は単なるテキストですので、Refererやブラウザーの種別を表すUser-Agentもふくめてすべて自己申告です。ですのでWebブラウザーによるリクエストと、その他のプログラム(HttpWebRequestやFiddlerなど)が偽造したリクエストを見分けることは本質的にできません。ですが一般的にWebブラウザー以外のプログラムはJavaScriptの実装が弱いため動的な処理を含めることで排除できる場合があります。具体的にはたとえばWebブラウザー上の操作ログを暗号化してリクエストに含め、サーバー側で検証するサービスなどが提供されています。 回答者: Anonymous

webサーバーからスマホアプリの操作

投稿者: Anonymous  ぷらぷら検索していましたら、モバイル向けのフリマアプリ(メルカリ)にweb上から出品できるサービスを見つけました(メルポンというやつです)。メルカリはスマホアプリのみから出品可能で、web上からは出品できません。このサービスはどういった仕組みでスマホアプリを操作しているのでしょうか。 それ用のツールなどがあるのでしょうか。 解決 プログラムからアプリを操作する方法は、AndroidのuiautomatorやiOSのInstrumentなど、開発者向けに提供されているものがあります。これを使いやすくラップしたAppiumなどのツールもあります。 スマホ向け無料システムテスト自動化ツール(8):SeleniumのUIテスト自動化をiOS/AndroidにもたらすAppiumの基礎知識とインストール方法、基本的な使い方 (1/4) – @IT ただこの場合、同時処理が必要な数だけ端末を用意する必要がありますし、サービスとして提供するには向かないように思います。(本来の目的である、アプリの自動テストなどは実機でやることに意味があるので仕方ありませんが) ですから、「アプリを操作している」のではなく「アプリに成りすましてサーバーと通信している」のではないでしょうか。単純なHTTP(S)通信であればFiddlerやCharlesなどのプロキシサーバーで、そうでなければパケットキャプチャをするなどして通信を解析することができます。 回答者: Anonymous

意図せず動作している Node.js のプロセスを確実に停止するには?

投稿者: Anonymous いつもお世話になっています。 下記の質問についてご存知の方がいらっしゃいましたらご教示を願います。 【質問の主旨】 ブラウザのアドレスバーにlocalhost:8080を入力してアクセスすると、過去にNode.jsで起動したことがあるものの、すでに停止したと思われるページが表示されます。 この表示を停止させて 「このサイトにアクセスできません localhost で接続が拒否されました。」 と言う画面に表示するためにはどうすれば良いでしょうか? 【質問の補足】 1. クライアントPCはmacOSでブラウザはGoogle Chromeを使用しています。下記の作業を行いましたが、ページは表示されたままです。 右クリック ↓ [検証] ↓ ブラウザのアドレスバーの左にある[リロード]にカーソルを当てる ↓ [キャッシュの消去とハードの再読み込み]をクリック 2. Qiitaでバックグラウンドで動作するNode.jsプロセスを停止させるというページを見つけました。その記事によると、実行中のプロセスを一覧表示すると言うコマンドとそのプロセスを停止させるコマンドが紹介されています。 $ ps -e | grep node | awk ‘{print $1}’ 54044 63221 63239 63241 63637 65703 とりあえず実行中のプロセスを一覧表示するpsコマンドを実行すると上記のプロセスIDが返ってきました。ですがプロセスを停止させる、 $ kill -9 [プロセスID] はまだ実行していません。killコマンドは使ったことがなく、果たして本当に使っても良いかどうか分かりません。 以上、ご確認よろしくお願い申し上げます。 解決 今回のケースでは、node.jsプロセスは問題なく終了されていたものの、localhost:8080にService Workerが登録されたままであったためにlocalhost:8080にアクセスすると依然としてページが表示されていたと考えられます。 Service Workerはオフラインの状態でもページを動作させる機能を持つため、node.jsプロセスを終了してlocalhost:8080のサーバーにアクセス不能にしたり、あるいはキャッシュを消したりしてもlocalhost:8080を開くとページが表示され続けることがあります。 Service Workerの登録を解除するは、localhost:8080でChromeのデベロッパーツールを開き「Application」タブに移動しService Workersというところを開きます。下の画像のようにService…(Continue Reading)

node.jsとexpressのexpress.staticについて

投稿者: Anonymous node.jsとexpressを用いたサーバ構築についてわからないことがあったので質問します。 質問内容は app.use(express.static(__dirname)); と app.get(‘/’, function(req, res){}); の記述順番によって意図しない結果が返ってくるというものです。 質問: パターン1の位置にexpress.staticを記述し、http://localhost:3000にアクセスすると、index.htmlの内容が表示されるのはなぜでしょうか? また、htmlのファイル名がindex.htmlの時にだけこの現象が起こるのですがなぜでしょうか? 想定している動き: app.getではtestpage.html(存在しないhtml)を返すと記述しているので、localhost:3000にアクセスするとError: ENOENTとなるはずでは? 備考: 普段はパターン2の位置にexperss.staticを記述していました。2の位置にexpress.staticを記述しlocalhost:3000にアクセスするとError: ENOENTとなります(想定通り) 認識している点: app.use(express.static(__dirname + ‘/public’)); 指定したディレクトリ以下の静的ファイルを公開する app.get(‘/’, function(req, res){}); 引数で指定されたGETリクエストに対して処理を行う。今回の質問の場合指定したhtmlファイルを返す。 以下サンプルを示します。 ディレクトリ構成 app ├package.json ├app.js ├node_modules │ └express └public   └index.html app.js var express = require(‘express’); var app = express(); var http = require(‘http’).Server(app); //パターン1 app.use(express.static(__dirname + ‘/public’)); app.get(‘/’,…(Continue Reading)

ElectronでMenuが正しく表示されない

投稿者: Anonymous ElectronでMenuが正しく表示されません。 練習のためにmain processからMenuを表示させてみようとしています。 Menu.buildFromTemplateとMenu.setApplicationMenuで表示されるはずですが、うまくいきません。 applicationを起動すると、main.htmlはきちんと表示されます。 しかし、Menuが表示されません。 なぜなのでしょうか? main.js (main process) var v8 = require(“v8”); v8.setFlagsFromString(“–harmony_arrow_functions”); //ES2015のarrow functionを使えるようにするため require(“./process.js”); process.js var Menu = require(“menu”); var app = require(“app”); var BrowserWindow = require(“browser-window”); require(“crash-reporter”).start(); var template = Menu.buildFromTemplate([ { label: “ElectronPhoto”, submemu: [ {label: “About ElectronPhoto”, click: () => {aboutWindow.show();}} ] } ]); app.on(“ready”, ()…(Continue Reading)

BluemixのWebインターフェースの日本語化

投稿者: Anonymous Bluemixで開発をしています メニューなどWebの画面表示が英語なのですが言語設定変更はどこでできるのでしょうか 解決 お疲れ様です。 BluemixのWeb UIの表示言語は、お使いのWebブラウザの設定に依存します。 ブラウザ側で言語を設定してください。 回答者: Anonymous

node.jsのconnectモジュールでミドルウェアの順番を動的に変えることは可能か?

投稿者: Anonymous connectモジュールを使って、順次処理をしていくとします。 var connect = require(‘connect’); connect() .use(funcA) .use(funcB) .use(funcC); .listen(3000); ここで、funcAの処理の内容によって、funcBを経由せずにfuncCに行くことは可能でしょうか? 解決 簡潔に言えば、それはできません。それぞれの函数の呼び出しは独立からです。 独立とは、 var connect = require(‘connect’); connect().use(funcA).use(funcB).use(funcC).listen(3000); と var connect = require(‘connect’); var tmp1 = connect(); var tmp2 = tmp1.use(funcA) var tmp3 = tmp2.use(funcB) var tmp4 = tmp3.use(funcC) tmp4.listen(3000); とが等価であること。 ですが、ECMAScript6に導入されたPromiseオブジェクトを使えばできるかも知れませんが、いい方法とは思えません。 funcAとfuncBとfuncCの処理を一つの関数にまとめてはどう思いますか。それなら、処理の流れはよく管理できるようになるのではないでしょうか。 回答者: Anonymous

意図せずプロセスが終了しない時の調査方法

投稿者: Anonymous 非同期処理を多用したスクリプトで、全ての処理が完了してもプロセスが終了しないという現象が以前発生しました。当時はとりあえず一定時間を超えてプロセスが残っていたら強制終了するような仕組みで対応したのですが、最近になって「なにか非同期処理やタイマーが残っていてイベントループが終了しなかったのでは?」という仮説が浮かびあがりました。 処理が完了したところで process.exit(0) を呼べば確実に終了することはできると思いますが、実装にミスがある可能性を考えると、放置していても終了しない理由が知りたいです。 Node.jsのプロセスが意図せずして動き続けている場合、どのように調査するとよいでしょうか? 解決 processモジュールにドキュメント化されていないAPIがあります。 process._getActiveHandles(); process._getActiveRequests(); これらを使うと、Worker queueに残っているもの(プロセスを活かし続けているもの)を確認できるかもしれません。 回答者: Anonymous

gruntのタスク実行で「Task not found. Use –force to continue」と出る

投稿者: Anonymous このモジュールをgruntで実行したいです。 https://github.com/Fkscorpion/grunt-license-report gruntfile.jsを下記のように書きました。 module.exports = function (grunt) { grunt.loadNpmTasks(‘grunt-license-report’); grunt.initConfig({ “grunt-License-Report”: { output: { path: ‘./report/licenses’, format: ‘html’ } } }); grunt.registerTask(‘default’, [‘grunt-License-Report’]); }; コマンドラインで「grunt」を実行すると 下記のエラーが出ます。 Warning: Task “grunt-License-Report” not found. Use –force to continue. Aborted due to warnings. 解決方法が分かる方がいましたらよろしくお願いします。 解決 自己解決しました。 gruntfile.jsを以下のように書くことで実行できました。 module.exports = function (grunt) { grunt.initConfig({ pkg: grunt.file.readJSON(‘package.json’), “grunt-license-report”: {…(Continue Reading)

ReactもしくはNode.jsで、既存のPDFをフォーマットに使用し、PDF出力を行いたい

投稿者: Anonymous 実現したいこと 現在 フロントエンドをReactでサーバレス環境(Firestore + Cloud Functions)にてWEBの開発を行なっています。 開発の仕様で、既存のPDFをフォーマットに使用して(値をあてはめて)PDFを出力したいのですが、ライブラリ等を調査したところクライアントサイド(React)だけでは既存のPDFをフォーマットに使用しての出力する糸口が見つかっておりません。 Cloud Functions(node.js)も利用しているので、node.js側でも解決できないものか調査を進めているのですが、実現方法ございますでしょうか?? 調査した情報(ライブラリ)とメモ React-PDF https://github.com/diegomura/react-pdf PDFkit https://github.com/foliojs/pdfkit pdf-image https://github.com/mooz/node-pdf-image pdfmake http://cly7796.net/wp/javascript/started-with-pdfmake/ https://qiita.com/maecho/items/071abbb60dcbeabef7a6 解決 PDFの編集は非常に手間の係る作業になります。既存のPDFをフォーマットに使う場合、その編集は注釈(Annotation)で値を入力して表示するのが一番楽だと思います。その場合でも、各々の値ごとに出力する位置を0.1mm単位で決める必要があります。もし、フォーマットが少しでも変更になれば、位置がずれてしまうため、位置を全部修正する必要があるのでメンテナンスも大変です。 そのため、既存のPDFを使わずに、HTMLで様式を作成してCloud FunctionsでPuppeteerを使ってPDFに変換した方ははるかに楽にできると思います。 それでも、既存のPDFをフォーマットとして使いたいのであれば、英語版の Edit existing PDF in a browser という質問が参考になると思います。自分が使ったことがないので保証はできませんが、そこのコメントに書いてある PDFNetJSを使えば、フロントエンドでPDFの修正ができるのではないでしょうか。 印刷したいだけであれば、pdf.jsとpdf-annotate.jsを使えばできるように思います。 回答者: Anonymous

httpモジュールのcreateServerの引数について

投稿者: Anonymous node.jsの勉強をしています。 httpモジュールのcreateServerの引数について質問です。 getFormClient関数は引数が2つありますが、 呼び出す側のhttp.createServer(getFormClient)は引数がありません。 これは、デフォルト引数ということで理解しました。 しかし、デフォルト引数であるならば、getFormClient関数の引数はundefinedになり、 res.writeHead(200, {‘Content-Type’: ‘text/html’});などでエラーになるのではないでしょうか? _x000D_ _x000D_ const http = require(‘http’);_x000D_ const fs = require(‘fs’);_x000D_ _x000D_ var server = http.createServer(getFormClient)_x000D_ function getFormClient(req, res){_x000D_ fs.readFile(‘index.html’, ‘UTF-8’,_x000D_ (err, data) => {_x000D_ res.writeHead(200, {‘Content-Type’: ‘text/html’});_x000D_ res.write(data);_x000D_ res.end();_x000D_ }_x000D_ );_x000D_ } _x000D_ _x000D_ _x000D_ 解決 これは、デフォルト引数ということで理解しました。 いいえ、デフォルト引数ではありません。 そのコールバック関数 (getFormClient 関数) を呼び出すのは Node.js であり、内部で生成されたオブジェクトを引数として、当該コールバック関数を呼び出します。そのため、今回の場合デフォルト引数は関係がなく、…(Continue Reading)

NodeJSでの return; もしくは return false; の挙動について

投稿者: Anonymous 例えば以下のコードのように、メソッド以外でreturn;やretrun false;を実行するとそこで処理が止まってしまうのはなぜですか? var n = 0; // 出力される console.log(“hoge”); if ( n == 0 ) return; // 出力されない console.log(“foo”); よろしくお願いします。 UPDATE Mon 8 June nodejsでの実行環境になります。 解決 もし、Node.jsで実行しているのであれば… Node.jsではファイルごとに1つの関数としてコンパイルされるため、サンプルコードのreturn文は有効なコードとなります。本来の意味通り、関数の実行を中断して呼び出し元に帰ります。 回答者: Anonymous

別ユーザーでインストールしたツールをPHPのexecで実行するとPermission deniedになる

投稿者: Anonymous AmazonEC2に「svgexport」というツールをインストールしました。 https://github.com/shakiba/svgexport 上のURLに書いてあるとおり、 npm install svgexport -g でインストールしたのですが、インストールされた場所が、ec2-userの下になってしまいました。 <SSHでのインストール場所の確認> [[email protected] ~]$ which svgexport ~/.nvm/versions/node/v8.10.0/bin/svgexport 恐らくそのせいと思うのですが、 PHPの中からexecでsvgexportを実行すると、Permission deniedで実行できません。 <PHPからexecで実行した文> exec(‘/home/ec2-user/.nvm/versions/node/v8.10.0/bin/svgexport /var/www/html/test.svg /var/www/html/test.png’); <ログに書き出した実行結果> $output= Array ( [0] => sh: /home/ec2-user/.nvm/versions/node/v8.10.0/bin/svgexport: Permission denied ) SSHでec2-userで直接コマンドを実行すると、正常に変換されます。 <SSHで正常にいくコマンド> [[email protected] ~]$ /home/ec2- user/.nvm/versions/node/v8.10.0/bin/svgexport /var/www/html/test.svg /var/www/html/test.png ec2-userで正常に実行できていますので、パーミッションの関係だと思うのですが、どうすればいいのかがわかりません。 どなたかご教授いただけますようお願いいたします。 どうぞよろしくお願いします。 [追記] コメントをいただきましたので、ec2-userのパーミッションを以下に追記させていただきます。 [[email protected] ~]$ ls -la total 1208 drwx—— 14…(Continue Reading)

Windows7でnpm installするとエラーになる

投稿者: Anonymous windows7でnpm installするとエラーが発生します C:Usersusernamepackage.jsonが存在していないというエラーのようです どうすれば解決できるのでしょうか? node5.9.0 npm3.7.3 を使っています npm WARN enoent ENOENT: no such file or directory, open ‘C:Usersusernamepackage.json’ npm WARN username No description npm WARN username No repository field. npm WARN username No README data npm WARN username No license field. 解決 npm install は、カレントディレクトリにある package.json に書かれた全パッケージを、同カレントディレクトリの node_modules/ ディレクトリにインスールするコマンドです。よって package.json が存在しない場合には、動作の前提条件を満たせないためそのようなエラーになります。もしも本当に npm install…(Continue Reading)

YConnectとPassportを使用したログイン機能実装について

投稿者: Anonymous Yahoo!JAPANが提供する外部認証機能でYConnectというものがあり Node.js+Express+Passport+Yconnectを使用したログイン機能の実装をしようと思っています。 下記のサイトで、YConnectの実装方法の一部が書かれています。 https://www.npmjs.com/package/passport-yj ただ、上記のサイトの記述だけでは実装できず 下記のTwitterやFacebookやGoogleの外部認証の場合のように var TwitterStrategy = require(‘passport-twitter’).Strategy; var FacebookStrategy = require(‘passport-facebook’).Strategy; var GoogleStrategy = require(‘passport-google-oauth’).OAuth2Strategy; というように、Strategyのrequireをする必要があるかと思います。 また、callbackURLにアクセスした際に、下記のように authenticateの後、’twitter’というような名前を書いていかないといけないかと思います。 app.get(‘/auth/twitter/callback’, passport.authenticate(‘twitter’, { failureRedirect: ‘/login’ }), function (req, res) { res.redirect(‘/’); }); ただ、YConnectにはStrategyが存在せず(?)、 Strategyがない場合にどのようにログイン機能を実装すれば良いのか分からず、困っています。 どうやったら実装できますでしょうか? 解決 まずは、実装例の該当する箇所を参考にするのがよいと思います。 require(‘passport-yj’).YJStrategy; とありますね。 回答者: Anonymous

JavaScriptのstreamでreadするとnullが返ってきてしまう。

投稿者: Anonymous こんにちは、(node | io).jsのStreamについての質問をした者です。今、Streamの勉強をしているのですが上記の質問と同じようにhelloworld.txtを読み込み、”MyPushn”という文字列を追加し、process.stdoutに表示するということを、pipeを使わず、代わりにwriteやreadを使って、やってみようと考えています。 しかし、下記のコードを実行すると例のようなエラーが出ます。どうすればいいのでしょうか? var Transform = require(“stream”).Transform; var util = require(“util”); var fs = require(“fs”); var StringDecoder = require(“string_decoder”).StringDecoder; var process = require(“process”); util.inherits(MyStream, Transform); function MyStream() { Transform.call(this); } MyStream.prototype._transform = (chunk, encoding, callback) => { var data = chunk; var utf8decoder = new StringDecoder(“utf8”); var decoded_data = utf8decoder.write(data); var send_data…(Continue Reading)

Mongoose + express でネストされたスキーマモデルをsaveしたい.

投稿者: Anonymous 現在ExpressとMongooseで jsonAPIを作成しております. 2つのモデルを合成してsaveしたいです. // app/models/room.js var mongoose = require(‘mongoose’); var TmpSchema = require(‘./tmp’); var Schema = mongoose.Schema; var RoomSchema = new Schema({ users: [TmpSchema], host_user: String }); module.exports = mongoose.model(‘Room’, RoomSchema);’ こちらは子となるモデルです. // app/models/tmp.js var mongoose = require(‘mongoose’); var Schema = mongoose.Schema; var TmpSchema = new Schema({ user_id : String } , {…(Continue Reading)

AWS Lambda Node.js6.10 ‘/06’のエスケープがうまくいかない

投稿者: Anonymous AWS Lambdaから、curlを使ってFTP接続をしようとしています。 しかし、pwが’6’始まりなのが災いしてか、PWを正しく引き渡すことができず、 Access denied: 530″になってしまいます。 (コマンドプロンプトから実行すると接続でることを確認しました。) 一部ですが、コードは以下の通りです。 var com = ‘curl –globoff -u testuser:6testpw ${url}’ const child = exec(com, function(error) { context.done(error, ‘Process complete!’)}); ※実際には、${url}に接続先を指定しています。 ・上記の場合、’testuser:06testpw’が引き渡されます。 ・’testuser:’+’6’+’testpw’とすると、’testuser:testpw’が引き渡されます。 ・’\06testpw’を指定すると、’\06testpw’そのままになってしまいます。 Encodeなどいろいろ試しましたが、うまくいきませんでした。。 お力添えいただきたく、よろしくお願いいたします。 解決 child_process.execは Runs a command in a shell and buffers the output. とのことですので、execに渡した値が改めてシェルによって再度解析されます。curlに引数–globoff, -u, testuser:6testpw, ${url}を渡したいのであればexecには curl –globoff -u testuser:\06testpw ${url} を渡す必要があり、JavaScriptコードでは…(Continue Reading)

Electronが起動せず困っています。

投稿者: Anonymous http://39mamon.com/?p=206 http://qiita.com/Quramy/items/a4be32769366cfe55778 こちらのサイトを参考にElectronの環境を作っていたのですが、うまく動かすことができません。 OSはcentOS6.7です。 cd electron-readus でフォルダに移動し sudo npm -g install electron-prebuilt でインストールを行い必要なファイルを作成 lsで index.html main.js npm-debug.log package.json が表示されています。 ここでelectronを入力すると /usr/lib/node_modules/electron-prebuilt/dist/electron: error while loading shared libraries: libgconf-2.so.4: cannot open shared object file: No such file or directory と表示されます。何かのファイルが足らないのだろうと思うのですが、 ldd electronと入力しても 「ldd: ./electron: そのようなファイルやディレクトリはありません」 とエラーメッセージがでてしまいます。 なにかお気付きの方いらっしゃいましたご連絡ください。 解決 エラーメッセージに表示されているように、electronの実行ファイルの本体は/usr/lib/node_modules/electron-prebuilt/dist/electronにあるのでlddにはそのパスを指定してください。 $ ldd /usr/local/lib/node_modules/electron-prebuilt/dist/electron | grep gconf…(Continue Reading)

Expressでリクエストごとに割り振られるIDはありますか?

投稿者: Anonymous node.js+express4で簡単なAPIを作成して、log4jsでアクセスログ、システムログ、エラーログを出力するように実装しました。 それで、ログを見やすくするために、処理毎にIDを振ろうと思い、とりあえずunixtimeをID代わりに振ってみたのですが、もっと良いものは無いか探しています。 例えば、node.js側でAPIにリクエストが送られる度に割り振る、処理IDのようなものは無いのでしょうか? もし御存知でしたら、ご教示いただけないでしょうか。 よろしくお願いします。 解決 ちょっと古いご質問ですが、最近ちょうどおっしゃっているような仕組みを実装をしましたので回答します。 まず、私の知る限りNode.js自体にはリクエストIDはありません。 また、リクエストIDは実際にはnginxなどリクエストをnode.jsより先に受け取るシステムが振って、X-Request-Idなどのヘッダでnode.jsに渡すことが多いです。 なお、Node.jsアプリ内でもランダムバイトやUUIDv4などでリクエストIDを振ることは外部のモジュールをインストールすれば比較的容易に実現可能です。 ちなみにログ出力の方が非同期処理があるので難しいです。そのあたりは下記URLに詳しくまとめましたので参考にして下さい。 http://qiita.com/ippei_ukai/items/adea86744777cbef5eba 回答者: Anonymous