Note

3年後の自分のために書いています

【コードメモ】JS で Object を forEach する方法

$ node
> let obj = { hoge: "hogehoge", fuga: "fugafuga" }
> Object.keys(obj).forEach(key => console.log(key, obj[key]))
hoge hogehoge
fuga fugafuga

参考

How to loop through a plain JavaScript object with the objects as members? - Stack Overflow

Object.keys() - JavaScript | MDN

【コードメモ】FizzBuzz 別バージョン

1から100までの数字を標準出力に改行つきで出力するプログラムを作ってください。 3の倍数と3がつく数字の時だけ、数字のあとに!をつけてください。

出力例: 1 2 3! 4 5 6! 7 8 9! 10 11 12! 13! 14 ...以下100まで続く

コンソールで実行しやすいようにワンライナーで。

Ruby

$ irb

> (1..100).each { |n| puts ((n % 3).zero? || n.to_s.include?('3')) ? "#{n}!" : n.to_s }
# or
> 1.step(100) { |n| puts ((n % 3).zero? || n.to_s.include?('3')) ? "#{n}!" : n.to_s }

JavaScript

$ node

> for (let n = 1; n <= 100; n++) { let v = (n % 3 === 0 ||  n.toString().includes("3")) ? `${n}!` : n.toString(); console.log(v) }

ActiveRecord で create_xx, build_xx 系のメソッドが作られるのは has_one した時だけ

表題の通りですが、 has_many した時も create_xxs 的なメソッドが自動生成されると勘違いしていたのでメモ。

ActiveRecord::Associations::ClassMethods

class Project < ActiveRecord::Base
  has_one :project_manager
  has_many :milestones
end

Project#create_project_manager(attributes={}) はいけるけど、 Project#create_milestones(attributes={}) はいけないという話。

やっぱり Rails ガイドよりも Ruby on Rails API の方が正確かつ詳細な情報があって良いですな。

高階関数とカリー化をそろそろ理解したい with JavaScript

あとでサンプルコード追加するかも。

早く Haskell やれやって話なんですけどね。

この記事のシリーズがだいぶ分かりやすかった。

tech.recruit-mp.co.jp

高階関数

関数を『引数』もしくは『返り値』として扱う関数のこと。

カリー化

期待される数より少ない引数で関数を呼び出した場合に、残りの引数を取るためにその呼び出された関数が別の関数を返すような関数。

JavaScript のスプレッド構文とレスト構文がややこしいので Ruby の配列展開と splat パラメータで理解する

細かい仕様の違いはあるかもしれないが、大体以下の感じで理解している。

スプレッド構文

Array に関しては Ruby でいう配列の展開(*)とほぼ同じかな。

スプレッド構文を使うと、関数呼び出しでは 0 個以上の引数として、Array リテラルでは 0 個以上の要素として、Object リテラルでは 0 個以上の key-value のペアとして、Array や String などの iterable オブジェクトをその場で展開します。

function sum(x, y, z) {
  return x + y + z;
}

const numbers = [1, 2, 3];

console.log(sum(...numbers));
// expected output: 6

console.log(sum.apply(null, numbers));
// expected output: 6

関数呼び出しとかと一緒に使わないで単独で ...numbers とかってやると syntax error になる。(これは Ruby も同じ)

Object に関してはまだ proposal っぽいけど、JS の方はそのまま Object のまま展開されるのに対して、 Ruby のハッシュ展開は以下のように配列に変換されるのでちょっと仕様が違いそう。

$ irb

> hash = { x: 1, y: 2, z: 3 }
=> {:x=>1, :y=>2, :z=>3}
> a, b, c = *hash
=> [[:x, 1], [:y, 2], [:z, 3]]
> a
=> [:x, 1]
> b
=> [:y, 2]
> c
=> [:z, 3]

レスト構文(分割代入)

レスト構文はスプレッド構文と全く同じ見た目をしていますが、Array や Object の分割代入に使われます。こちらはスプレッド構文とは逆の働きといえます: スプレッド構文が要素を展開するのに対して、レスト構文は複数の要素を集約して 1 つのオブジェクトにします。

Array

Ruby で可変長引数を扱うための splat パラメータ(*)とほぼ同じかな。

function sum(...theArgs) {
  return theArgs.reduce((previous, current) => {
    return previous + current;
  });
}

console.log(sum(1, 2, 3));
// expected output: 6

console.log(sum(1, 2, 3, 4));
// expected output: 10

Object

Ruby のダブル splat パラメータ(**)の object でやり取りする版かな。(Ruby のはキーワード引数リストをハッシュとして受け取る)

今はまだ Proposal のようだ。

Rest/Spread Properties for ECMAScript 提案 (ステージ 3) は、分割代入に rest 構文を追加します。残余プロパティは、分割パターンによってすでに取り出されていない、残りの列挙可能なプロパティのキーを収集します。

let {a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40}
a; // 10 
b; // 20 
rest; // { c: 30, d: 40 }

参考

スプレッド構文 - JavaScript | MDN

Rest parameters - JavaScript | MDN

分割代入 - JavaScript | MDN

GitHub - tc39/proposal-object-rest-spread: Rest/Spread Properties for ECMAScript

Rubyのパラメータと引数の対応付けを理解する(前編)

クラス/メソッドの定義 (Ruby 2.6.0)

メソッド呼び出し(super・ブロック付き・yield) (Ruby 2.6.0)

個人開発で使えそうな API まとめ

完全に自分用のメモ。 軽い調査結果も残しておく。

求人検索

Google Job Search API (Cloud Talent Solution)

GCP アカウント必要、アカウント作ると12ヶ月3万円無料期間始まるので開発直前に始めた方がいい

Cloud Talent Solution documentation  |  Job Search documentation  |  Google Cloud

Linkedin API

新しいMSのドキュメントには求人検索系 API 載ってないかも?

Recommended Jobs | LinkedIn Developer Network

Indeed Job Search API

パブリッシャー登録 必要、会社名と Web サイトの URL がいる

Job Search API

勉強会・交流会

Meetup

認証は OAuth2、プロキシサーバ必要

Extend your community | Meetup

Doorkeeper

CORS 対応しており、プロフィールから アプリケーション登録 すればプロキシサーバ無しでクライアントから利用可能

Doorkeeper API | Doorkeeper

connpass

Same-origin policy に引っかかるので、プロキシサーバ必要

APIリファレンス - connpass

VSCode x TypeScript x ESLint で自動整形する

JS のプロジェクトを TS に変更したら ESLint の整形が効かなくなったのでメモ。

VSCodesettings.json に以下を追加すればOK。

  "eslint.validate": [
    "javascript",
    "javascriptreact",
    {"language": "typescript", "autoFix": true },
    {"language": "typescriptreact", "autoFix": true }
  ]

"javascript", "javascriptreact" も書かないと js への整形が効かなくなる。

参考

GitHub - microsoft/vscode-eslint: VSCode extension to integrate eslint into VSCode

Autofix lightbulb not shown in TypeScript · Issue #609 · microsoft/vscode-eslint · GitHub