ラベル JavaScript の投稿を表示しています。 すべての投稿を表示
ラベル JavaScript の投稿を表示しています。 すべての投稿を表示

2020年7月5日日曜日

MongoDBで "_id" フィールドの値で検索する

MongoDBにこういうデータがあって、findOneでIDを指定してこの1件を取得したい。

{
    "_id": {
        "$oid": "5f00f8d2e2b54b54646cac19"
    },
    "title": "new book"
}

最初こんな感じで書いてみたけどダメだった。検索結果がnullになってしまう。

var bookid =  '5f00f8d2e2b54b54646cac19';

// NG例1
collection.findOne({ "_id": bookid }, function(err, doc){ 
  // do something
}

// NG例2
collection.findOne({ "_id": { "$oid": bookid } }, function(err, doc){ 
  // do something
}

2019年9月29日日曜日

#100DaysOfCode R2 Day35-36

Day 35-36: September 27-28, 2019

Today's Progress:

  • <script> タグに書いていたコードを .js ファイルに分離
  • サインイン後、新しい告知を保存後のタイミングで保存されている情報を画面に表示するようにした
  • ESLintの導入

<script> タグでHTMLファイルに直書きすれば動くのに、.jsファイルに分離すると動かない、という状況によく陥るのですが、おそらく $(document).ready を入れるべきなのに入れてない、という状況が多いのかなと…。

下記の記事の、

</body> タグの直前にscriptを入れる場合、$(docment).readyは必要ない

という部分で理解できました。

JavaScript・jQueryの改修・高速化のためのメモ - Qiita

またしばらく経つと忘れてしまいそう…!

Links to work:

  • なし

2019年8月23日金曜日

GitHub から Security Alert が来たので package.json をアップデートする

GitHubから「One of your dependencies has a security vulnerability」(package-lock.jsonで指定されてるパッケージに脆弱性があるよー)というアラートがきたので対応した手順をメモしておきます。

更新したいpackage.jsonがあるディレクトリで以下を実行

$ npm-check-updates -u --packageFile package.json

これで package.json の内容が書き換わる。

(npm-check-updates 自体がインストールされていなくて使えない場合は $ npm install -g npm-check-updates から。参考: npm入門 - Qiita )

次に npm update 。これで実際にパッケージが更新される。

$ npm update

そしたら脆弱性が見つかったって言われた

found 48 vulnerabilities (1 low, 47 high)
  run `npm audit fix` to fix them, or `npm audit` for details

なので npm audit fix

$ npm audit fix

これで、自動的にアップデートして対処できるものは対処してくれる。

npm audit すると今残ってる脆弱性の詳細を教えてくれる。こんな感じ。

$ npm audit
=== npm audit security report ===


                                 Manual Review
             Some vulnerabilities require your attention to resolve

          Visit https://go.npm.me/audit-guide for additional guidance


  Low             Regular Expression Denial of Service

  Package         braces

  Patched in      >=2.3.1

  Dependency of   babel-cli

  Path            babel-cli > chokidar > anymatch > micromatch > braces

  More info       https://nodesecurity.io/advisories/786

found 1 low severity vulnerability in 3390 scanned packages
  1 vulnerability requires manual review. See the full report for details.

じゃあこの残ってるパッケージをどうしたらいいかっていうのはまた今度調べます… low severity なので。
緊急度が高いものはパッケージの開発者の方々もチェックして対応してくれていることが多いので、そのおかげで自動でアップデートできるみたいです。

参考:
npmのpackage.jsonを最新のバージョンに更新する
npm入門 - Qiita

2019年8月19日月曜日

[自作ツール更新] Markdown→HTML変換ツール: HTMLの改行を修正

自作の Markdown→HTML変換ツール を修正しました。

HTMLのコードを表示する欄に改行が反映されなくなっていた問題を修正しました。

修正前

修正後

作成した当初は改行されていたはずがいつの間にか改行されなくなっていたのですが、 marked で出力されたHTMLを .innerText メソッドで textarea に表示していたのを、 .value メソッドに変更すると改行されるようになりました。

修正前

document.getElementById("HTML").innerText = marked(this.state.input);

修正後

document.getElementById("HTML").value = marked(this.state.input);

2019年1月10日木曜日

2019年1月6日日曜日

JavaScript の 0 と null と undefined

値があるかどうかのチェック的なところでいつも迷うやつ。

undefined == null は true

undefined == null
true
undefined != null
false

0==null 0==undefined は false

0 == null
false
0 == undefined
false

0は値として受け付けたいけどnullやundefinedははじきたいという時に使える

  arr = arr.filter(function(elem){
    return elem != null;
  });

追記

これでもいけるっぽい?

  arr = arr.filter(function(elem){
    return !!elem;
  });

と思ったけどこれだと0もはじくので少し挙動が異なる。

!!undefined
false
!!null
false
!!0
false
!!''
false

でもって、空文字 '' はnullとは等価にならない。(一つ目の方法では受け付けられる)

'' == null
false

0 と '' は等価

0 == ''
true

// 厳密等価演算子ならfalse
0 === ''
false

2018年11月6日火曜日

module.exports と exports.something のメモ

同じファイルの中に二つのSchemaを定義していて、 module.exports が上手くいかなくて悩んだのですが。

参考: Node.js – exportsとmodule.exportsで関数を公開する – KeruuWeb

module.exportsは単一のモジュールを公開するときに使います。

OK

'use strict';

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

// userId(_id), description, duration, and optionally date
var logSchema = new Schema({
  description: {type: String, required: true},
  duration: {type: Number, required: true},
  date: {type: Date}
});

var userSchema = new Schema ({
  username: {type: String, required: true},
  _id: {type: Number, required: true, unique: true},
  logs: [logSchema]
});

// これだとうまくいく
exports.log = mongoose.model('log', logSchema);
exports.user = mongoose.model('user', userSchema);

NG

'use strict';

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

// userId(_id), description, duration, and optionally date
var logSchema = new Schema({
  description: {type: String, required: true},
  duration: {type: Number, required: true},
  date: {type: Date}
});

var userSchema = new Schema ({
  username: {type: String, required: true},
  _id: {type: Number, required: true, unique: true},
  logs: [logSchema]
});

// 上手くいかない
module.exports = mongoose.model('log', logSchema);
module.exports = mongoose.model('user', userSchema);

よく考えたらそうよねと…同じmodule.exportsに2回代入してるものね。

2018年10月11日木曜日

#100DaysOfCode Day51

Day 51 October 11, 2018

Today's Progress:

  • freeCodeCamp's Pomodoro Clock project
    • Created a function to toggle Break/Session
    • Added beep sound to play when the timer reaches 0

Thoughts:
At first, I tried .fastSeek(0) to rewind the audio element, but I had to use .currentTime = 0 instead. Due to browser compatibility?
Now all tests passed! I will start the visual improvement tomorrow.

Link to work:
CodePen
GitHub: sidemt/pomodoro-clock

2018年10月10日水曜日

#100DaysOfCode Day50!!

Day 50 October 10, 2018

Today's Progress:

  • freeCodeCamp's Pomodoro Clock project
    • Created a function to increment break length, decrement/increment session length
    • Started developing a function to countdown

Thoughts:
It's Day50!! I'm proud that I have come here without missing a day. I didn't think I could do it.

Today I started developing the countdown function using setInterval and clearInterval.

Link to work:
CodePen
GitHub: sidemt/pomodoro-clock

2018年6月20日水曜日

Array.filter() の結果が空になるときの確認ポイント (JavaScript)

自分が Array.filter() を使うときによく引っかかっている気がするところ。
filter のコールバック関数内に return を書いてtrueが返るようにしないと、filter結果のarrayが空になる。


// true or false を返すfunction
function checkMatch(key, element){
  return key == element;
}

// 上記の関数をfilterに使う場合

// これだと動作する
arr1 = collection.filter(function(element){
  return checkMatch(key, element);
});

// これだと動作しない return が抜けている
arr2 = collection.filter(function(element){
  checkMatch(key, element);
});

正規表現/Regular Expressions (JavaScript)

freeCodeCamp の Regular Expressions に関するレッスンのメモ。
Regular Expressions | freeCodeCamp

基本

  • regex もデータ型の一つ
  • .test() メソッド: regex.test(テストしたいString); の形でチェックできる

let testStr = "somethingToTest";
let testRegex = /Test/;
testRegex.test(testStr);
 // Returns true
  • .match() メソッド: string.match(regex); でマッチしたStringを取り出す

Flag

  • /freecodecamp/i の i の部分をflagという
  • i は大文字小文字どちらもマッチするようにするflag (case insensitive flag)
  • g は何回でもマッチするようにするflag (global flag)
  • /freecodecamp/gi みたいに複数書ける

よく使いそうなもの

  • .: wildcard character 何にでもマッチする
  • [aiu]: a, i, u のどれにでもマッチする
  • [a-z]: a から z の範囲の文字にマッチする
  • [a-z0-9]: a-zと0-9の全て
  • [^aeiou]: a, e, i, o, u 以外の 文字にマッチする
    • ※けど、., !, [, @, / と white space にはマッチしない(何故?)
    • → そもそも[] が示すのが character set だからかな?そこに記号は含まれてない?
  • [^something] は、character set からsomethingを除外する
  • [] の外で ^ が使われたときは意味が変わる。
  • [] の外の ^ →Stringの最初でだけマッチする

shorthand character classes

  • \w: [A-Za-z0-9_] と同じ(全てのアルファベット大文字小文字、数字、とアンダーバー) (="alphanumeric characters" というのはこれっぽい?)
  • \W: 上の逆。 [^A-Za-z0-9_]
  • \d: [0-9]
  • \D: 上の逆。 [^0-9]
  • a+: aが1回以上続けて出てくる
  • a*: aが0回位以上続けて出てくる(下の例の /t[a-z]*?i/ で"ti"にマッチさせるときに効果を発揮する)
  • Regular expressions はデフォルトでは greedy match (一番長いものにマッチする)
  • ? でlazy match(一番短いものにマッチする)にできる

let text = "titanic";
text.match(/t[a-z]*i/); // ["titani"]
text.match(/t[a-z]*?i/); // ["ti"]

※上記の例はfreeCodeCampより

チェックツール

正規表現のチェックができるツール

Online regex tester and debugger: PHP, PCRE, Python, Golang and JavaScript

2018年6月17日日曜日

配列、オブジェクトの中に含まれるかどうかのチェック (JavaScript)

いつも忘れてしまうやつシリーズ。

配列の中に、ある要素が含まれるかどうかのチェックは
array.indexOf(element);

オブジェクトの中に、あるプロパティ(=key)が含まれるかどうかのチェックは
object.hasOwnProperty('key');
または
'key' in object;

上記の in は演算子。

参考

2018年6月12日火曜日

コールバック関数を自分のために解説 (JavaScript)

ここまで理解したことのメモ。

主な解説はfreeCodeCampから
https://guide.freecodecamp.org/javascript/callback-functions/

  • JavaScript では、functionも first-class object。変数に格納したり、引数として渡したりできる。

  • Callback Functions (コールバック関数)とは
    • 他の関数に引数として渡される関数。 後で実行する( いつ 実行されるかは後述)
      • 他の関数を引数として受け取る関数を higher-order function (高階関数) という
      • このhigher-order function に、 いつ コールバック関数を実行するかを書く

  • 引数として渡すときは、関数名の後に()を付けない。渡した時点で今すぐ実行するのではなく、関数の定義をhigher-order functionに渡すだけなので。
    • 実際に実行する場所で、引数を渡す
  • 無名関数も、callbackとして(引数として)渡すことができる。(下記Gistのuse_anonymous_function.js)

2018年5月21日月曜日

Wikipedia API で、検索と本文を1度に取得する方法

「Wikipedia Viewer」の続き。(前回の記事)

freeCodeCampの見本のページが"extract"(本文のテキスト)というプロパティを表示しているようなので同じことをしようとしたのですが、検索結果のJSONを見てみるとextractはここに入ってこない。
extractを取得するには、最初のリクエストで検索をしてtitleなりpageidなりのリストを取得して、それを元にもう一回ページ内容を取得するAPIを呼ばないと出来なさそう…?に見えたのですが。
ありました。

Querying query results in one request
https://www.mediawiki.org/wiki/API:Page_info_in_search_results#Querying_query_results_in_one_request

「generator」という機能を使えばできる様子。


2018年5月20日日曜日

"No 'Access-Control-Allow-Origin' header is present on the requested resource"

結局またfreeCodeCampに出戻ろうとしているんですけど、次のプロジェクト「Wikipedia Viewer」をやろうとしたら、なんかapiが動いてくれない。なぜ??と色々コードをいじって、はっと気付いて開発者ツールを見たら

もー!!これ!!このエラー!!
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://s.codepen.io' is therefore not allowed access.
毎回これでひっかかってるんだったと思い出しました…。

今回解決するにあたって読んだものをとりあえずメモ。


2018年3月17日土曜日

ObjectとArray (JavaScript)

freeCodeCampの課題 をやってたときに、結局使わなかったけど、JavaScriptでJSONのレスポンスに対してなんで.forEachできないのかと四苦八苦してたメモ。


2018年2月1日木曜日

JavaScriptの文末のセミコロンを省略できる場合がある

freeCodeCampの課題をやってて気づいたこと。

今日やった課題は Prefilter JSON
下記のコードを指定された場所に書き写せばパスできる簡単な課題でした。が。
私、最後のセミコロンを打ち忘れたのです(よくやる)
Run testsボタンを押す直前に気付いたのですが、勢いでそのままクリックしてしまいました。
でも、テストは問題なくパスして次の課題に進むことができました。
もう一度戻ってプレビューの動作を確認しても問題なく動作しています。


いつもは行末のセミコロンを忘れるとエラーになるのに…?
と思って調べてみると、Automatic Semicolon Insertionという話が出てきました。
(「JavaScript semicolon at the end」で検索)
https://stackoverflow.com/questions/4002234/do-we-need-semicolon-at-the-end

セミコロンの自動補完や自動挿入と呼ばれる機能があって、場合によってはセミコロンを省略しても問題なく動作すると。
そういえばそんな話も聞いたことあったな…と思い出したり。

でもざっと見た感じ、必ずセミコロンを付ける方が(コーディングルール的に)推奨されてることが多いみたいですね。下手に場合分けするより全部付ける方がわかりやすく間違いも少ないというのは素人的にも納得です。