20210801のNode.jsに関する記事は6件です。

RaspberryPiとMESH(ボタンタグ+カスタムタグ)を使ったPCスクリーショット(Mac)の保存操作

経緯 趣味の自転車で使っている室内トレーニングアプリ(zwift,rouvyなど)でトレーニング中にスクリーンショットを保存したい Macではスクリーショットはcommand+shift+3で保存できますが、トレーニング中に操作するのは危険なので、片手でも実行できるようにしたい 作ったもの MESHのボタンタグを押すとMacのスクリーンショットを指定したフォルダに保存します。 MESHを選択した理由 バッテリー内蔵で単体で動作し、自転車に取付け可能で片手で操作できること SDK(JavaScript)があり、RaspberryPiと連携できること 構成 MESH MESHハブアプリケーションでボタンタグをトリガーにHTTP GETを送るカスタムタグのレシピを作成します カスタムタグとレシピはMESHハブアプリケーションを試してみるを参考にCode:Executeに下記コードを書いて作成します。 var apiURL = "http://ローカルホスト名:ポート番号/"; ajax ({ url : apiURL, type : "get", timeout : 1000, success : function ( contents ) { log("HTTP receive."); callbackSuccess( { resultType : "continue" } ); }, error : function ( request, errorMessage ) { log("http request error occured"); callbackSuccess( { resultType : "continue" } ); } }); return { resultType : "pause" }; RaspberryPi Raspberry Piに「MESH ハブ」アプリをインストールする方法を教えてほしいを参考にMESHハブで作成したレシピの実行環境をラズパイに構築し、HTTPリクエストを受けるローカルサーバー(Node.js + Express + child_process)を起動し、SSH接続(公開鍵認証)でAppleScriptをosascriptコマンドで実行します。 const express = require('express') const app = express() const {exec} = require('child_process') //要ユーザ設定ファイル作成(~/.ssh/config) const sshcmd = "ssh [接続するsshのエイリアス名]" //ファイル形式 const fileformat = "defaults write com.apple.screencapture type [ファイル形式]" //画像ファイルの保存先パス const savefilepath ="defaults write com.apple.screencapture location [画像ファイルの保存先パス] " //AppleScriptのパス const applescriptpath = "osascript [AppleScriptのパス] " //AppleScript実行(ファイル形式と保存先指定) //const cmd = sshcmd + fileformat + "&& " + sshcmd + savefilepath + "&& " + sshcmd + applescriptpath //AppleScript実行 const cmd = sshcmd + applescriptpath app.get('/', function (req, res) { exec(cmd, (error, stdout, stderr) => { if (error) { console.error(`exec error: ${error}`); return; } res.status(200) res.send('OK') }) }) app.listen(3000,() => console.log('Listening on port 3000')); プログラムはサーバーが落ちても再起動するようにforeverコマンドを指定します。 【Node.js】 RaspberryPiのプログラムを自動起動・永続化・SSH ログアウト後もプロセスを残すを参考にサービス登録、再起動し、Foreverのプロセスを下記コマンドから確認します。 /etc/rc.local sudo -u pi /usr/local/bin/node /usr/local/bin/forever start -a -d [動かしたいスクリプトのパス] $ forever list info: Forever processes running data: uid command script forever pid id logfile uptime data: [0] EL4C /usr/local/bin/node [動かしたいスクリプトのパス] 1447 1705 /home/pi/.forever/EL4C.log 0:0:0:14.962 SSHはMacから公開鍵を取得し、ユーザ設定ファイル(~/.ssh/config)を作成します。 ~/.ssh/config Host [接続するsshのエイリアス名] HostName [ローカルホスト名] User [ユーザー名] IdentityFile [秘密鍵のパス] Port [ボート番号(デフォルトは22)] Mac スクリーショットを実行するAppleScriptをスクリプトエディタで作成します AppleScript形式 on fullscreenshot() tell application "System Events"                 // Command+Shift+3を入力 key code 20 using {command down, shift down} end tell end fullscreenshot fullscreenshot() JavaScript形式 sys = Application("System Events"); // Command+Shift+3を入力 sys.keyCode("20", { using: ["command down", "shift down"]}); スクリプト保存時にファイルフォーマットを「スクリプト」に指定すると「.script」で保存されるため、これをosascriptコマンドで実行します。 なお、AppleScript形式の場合、ファイルフォーマットを「テキスト」に指定すると「.applescript」で保存されますが、それぞれosascriptで実行することが可能です。 最後に このスクリプトを作成した後、Zwiftではショートカットキーの設定でF10キーでスクリーンショットを指定のフォルダに保存できることを知りました。 ただ、スクリーンショット操作は運動に集中しているとキーでもボタンでも押せないことや押し忘れることがあったため、自動で実行できるような仕組みがあると良いかと思いました。こちらは今後検討予定ですが、映像解析や他デバイスからのトリガーから実行できる仕組みを検討してみようと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

gulpでSass環境構築とエラー紹介

前提 Nodeはインストール済とします。 作業 プロジェクトのホームディレクトリから下記のコマンドを叩いて、package.jsonを作成します。 $ npm init -y gulpを使用してsassの環境を構築していくので、下記のコマンドを叩いてインストールを行う。 $ npm install --save-dev gulp $ npm install --save-dev gulp-sass 次に同じ階層にgulpfile.jsを作成して以下のように記述。 gulpfile.js var sass = require('gulp-sass')(require('sass')); var gulp = require('gulp'); gulp.task("sass", function(done){ gulp.src("./sass/**/*.scss") .pipe(sass({outputStyle: "expanded"})) .pipe(gulp.dest("./css")); done(); }); // 下記の設定で自動コンパイルをすることができる。 gulp.task("watch", function(){ gulp.watch("./sass/**/*.scss", gulp.series(["sass"])) }); sassのディレクトリを作成して、中にscssなどのファイルを作成した後に下記のコマンドでコンパイル。 $ npx gulp sass 自動コンパイルはこちら $ npx gulp watch 遭遇したエラー 其の1 gulp-sass 5 does not have a default Sass compiler; please set one yourself. Both the `sass` and `node-sass` packages are permitted. For example, in your gulpfile: var sass = require('gulp-sass')(require('sass')); [21:46:51] The following tasks did not complete: sass [21:46:51] Did you forget to signal async completion? gulpfile.jsのvar sass部分の記述方法をエラー文の通りに変更すれば解決しました。 其の2 Error: Cannot find module 'sass' Require stack: - /Users/***/practice/error_gulp/gulpfile.js - /Users/***/practice/error_gulp/node_modules/gulp-cli/lib/shared/require-or-import.js - /Users/***/practice/error_gulp/node_modules/gulp-cli/lib/versioned/^4.0.0/index.js - /Users/***/practice/error_gulp/node_modules/gulp-cli/index.js - /Users/***/practice/error_gulp/node_modules/gulp/bin/gulp.js at Function.Module._resolveFilename (node:internal/modules/cjs/loader:933:15) gulpのsassをおとなしくインストールしたら、解消しました。 $ npx gulp sass 【備考】 Nodeとgulpのバージョンの相性が悪いと、エラーが出てしまう事があるようです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Node.jsで簡易なWebシステムの構築①

目的 Node.jsを用いて簡易なWebシステムを構築する。まずは DBを参照して簡単な画面を出すだけ。 環境条件 Node.js実行環境構築 で構築した環境を利用。 構築手順 ec2-userでログイン # rootユーザにスイッチ sudo su - 1.アプリ用のデータ準備 MySQLに必要な設定を実施する。 # MySQLにログイン mysql -uroot -ppassword # DBの作成 create database myappdb; # DBの選択 use myappdb; # テーブルの作成(ID, Name, Priceを含む簡易なテーブル) create table myapptbl1 (id int auto_increment, name varchar(50), price int, primary key (id)); # データの投入 insert into myapptbl1 (name, price) values ('りんご',150); insert into myapptbl1 (name, price) values ('みかん',100); insert into myapptbl1 (name, price) values ('メロン',1000); insert into myapptbl1 (name, price) values ('ぶどう',400); # データの確認 select * from myapptbl1; +------+-----------+-------+ | id | name | price | +------+-----------+-------+ | 1 | りんご | 150 | | 2 | みかん | 100 | | 3 | メロン | 1000 | | 4 | ぶどう | 400 | +------+-----------+-------+ 2.アプリケーション用の初期設定 myapp1というプロジェクトを作成し、必要なモジュールのインストール等を実施する。 # ディレクトリの作成 mkdir -p /opt/nodejs/myapp1 #ディレクトリの移動 cd /opt/nodejs/myapp1 # npmの初期設定 npm init -y Wrote to /opt/nodejs/myapp1/package.json: { "name": "myapp1", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" } # expressのインストール npm i -D express npm notice created a lockfile as package-lock.json. You should commit this file. npm WARN myapp1@1.0.0 No description npm WARN myapp1@1.0.0 No repository field. express@4.17.1 added 50 packages from 37 contributors and audited 50 packages in 2.687s found 0 vulnerabilities # express-generatorのインストール npm install -D express-generator npm WARN deprecated mkdirp@0.5.1: Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.) npm WARN myapp1@1.0.0 No description npm WARN myapp1@1.0.0 No repository field. # mysql接続用モジュールのインストール npm install --save mysql npm WARN myapp1@1.0.0 No description npm WARN myapp1@1.0.0 No repository field. mysql@2.18.1 added 9 packages from 14 contributors and audited 59 packages in 1.339s found 0 vulnerabilities 3.アプリケーションの開発 こんな形になるようにファイルを作成する。(treeコマンドの結果) myapp1/ ├── app.js ├── node_modules(略) ├── package.json ├── package-lock.json └── views └── index.ejs app.js // 各種ライブラリの呼び出し const express = require('express') const ejs = require('ejs') const mysql = require('mysql') const app = express() // テンプレートエンジンをejsに指定 app.set('ejs', ejs.renderFile) // mysqlへのコネクションオブジェクトの定義 const con = mysql.createConnection({ host: 'localhost', user: 'root', password: 'password', database: 'myappdb' }); // urlへアクセスしてきた際の動作を定義 app.get('/', (req, res) => {       // mysqlへ接続しmyapptbl1の全件のデータを取得し、index.ejsに受け渡しを実施 con.query('select * from myapptbl1', function (err, results, fields) { if (err) throw err res.render('index.ejs', { content: results }) }); }) // 3000番ポートでListenするように設定 app.listen(3000, () => { console.log('server start') }) index.ejs <!DOCTYPE html> <html> <head> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> </head> <body> <div class="container" style="margin-top:50px;"> <table class="table"> <thead class="thead-dark"> <tr> <th scope="col">id</th> <th scope="col">name</th> <th scope="col">price</th> </tr> </thead> <tbody> <% for(let i in content) { %> <tr> <% let obj = content[i]; %> <th> <%= obj.id %> </th> <th> <%= obj.name %> </th> <th> <%= obj.price %> </th> </tr> <% } %> </tbody> </table> </div> </body> </html> # /opt/nodejs/myapp1に移動してアプリケーションを起動 node app.js http://ホスト名:3000 にブラウザからアクセスし、以下のような画面が出れば完了。 次はMySQLへのデータ登録を実施。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Node.js実行環境構築

目的 Node.jsを用いて簡易なWebシステムを構築することを目的に、まずは動作環境の構築を行う。 環境条件 Node.jsサーバ EC2:t2.micro OS:Red Hat Enterprise Linux 8 (HVM), SSD Volume Type Disk:汎用SSD(GP2) 10GB セキュリティグループの設定等はいい感じに。 構築手順 ec2-userでログイン # rootユーザにスイッチ sudo su - # Node.js用ディレクトリの作成 mkdir -p /opt/nodejs # 作成したディレクトリへ移動 cd /opt/nodejs # Node.jsのモジュールインストール yum module install nodejs:14 # nodeの配置先の確認 which node /usr/bin/node # Node.jsのバージョン確認 node -v v14.16.0 # NPMのバージョン確認 npm -v 6.14.11 この後のアプリケーション開発のために、同サーバにmysqlをインストールしたが、手順については割愛。 8.0.21をインストールし、rootアカウントのパスワードを設定。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【簡単】nodejsがインストール済のlinuxのコンテナを作成する【備忘録】

Dockerfile作成 Dockerfile FROM node:12 ENTRYPOINT /bin/bash あとはDockerfileのあるディレクトリで docker build -t image_name . でイメージをビルドし、 docker run -it image_name でnodejsがインストール済みのlinuxのシェルにアクセスできます。 ちなみにlinuxのディストリビューションはdebainです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【AWS】Lambdaのスロットリング時の挙動確認

やりたいこと S3のファイルPUTをトリガーとしたLambdaでスロットリングエラーが発生した時の挙動の確認 (スロットリングエラーが発生したときのトリガーイベントが消失するのか…) Summary Lambdaのスロットリングが発生してもS3 イベントは消失せず、一定間隔でリトライされる。(リトライ間隔は徐々に伸び、最大5分) リトライされる期間はイベントの最大有効時間の設定で調整(公式開発者ガイドに記載) 前提 検証手順 Lambdaソースコードの修正 Lambda同時実行数、タイムアウト期間の設定 動作確認 1. Lambdaソースコードの修正 Lambda内に70秒の待機を追加し、スロットリングが発生しやすくする。 index.js 'use strict'; const aws = require('aws-sdk'); const s3 = new aws.S3(); exports.handler = async (event) => { //S3から送られたトリガー内容を確認_ console.log(event); const bucket = event['Records'][0]['s3']['bucket']['name']; const key = event['Records'][0]['s3']['object']['key']; console.log(bucket); console.log(key); //S3.copyObjectを実施(params内Bucket,CopySource, Keyは必須) const params = { Bucket: "copied-bucket-210731", CopySource: bucket+'/'+key, Key: key }; //70秒待機 const sleep = () => new Promise(resolve => { setTimeout(() => { resolve(); }, 70000); }); await sleep(); const result = await s3.copyObject(params).promise(); console.log(result); }; 2. Lambda同時実行数、タイムアウト期間の設定 同時実行数: Lambdaの設定>同時実行で同時実行の予約=1に設定 タイムアウト期間: Lambdaの設定>基本設定でタイムアウト=5分に設定 3. 動作確認 ファイルを10個用意し、S3バケットに同時にアップロードする。 Copiedバケットにすべてのファイルがコピーされていることを確認 概ねリトライ間隔に比例して、コピーされている Cloudwatch Metrixよりスロットリングが発生することを確認 投入時に高頻度でスロットリングが発生、リトライ時に処理されることで徐々にスロットリングの値が低下 参考 (クラメソさんの記事はやってる最中に見つけて、ほぼやりたいことやってくれてました…ありがとうございます!)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む