- Parameter=仮引数(関数の定義に使用する引数)
- Argument=実引数(関数を呼び出す際に渡す引数)
function example(parameter) { // 関数の定義に使用する引数
console.log(parameter);
}
const argument = "foo";
example(argument); // 関数を呼び出す際に渡す引数
function example(parameter) { // 関数の定義に使用する引数
console.log(parameter);
}
const argument = "foo";
example(argument); // 関数を呼び出す際に渡す引数
偶数と奇数が分からない人が結構(?)いるらしいというニュース記事を見かけて、入力した数字が偶数か奇数か判定するだけのサイトを作ってみました。
本当の本当にそれだけの機能しかありません。
素のJavaScriptやCSSを書いて基本に戻ってみる練習として。私は偶数奇数は分かります(笑)
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
}
こちらを参考に、Jobが1件実行されたことを確認するテストを書いてみました。
https://api.rubyonrails.org/classes/ActiveJob/TestHelper.html#method-i-assert_performed_jobs
# download_job_test.rb
require "test_helper"
class DownloadJobTest < ActiveJob::TestCase
setup do
@my_image = my_images(:one)
end
# (省略)
test "perform download job" do
assert_performed_jobs 0
perform_enqueued_jobs do
DownloadJob.perform_later(@my_image.id)
end
# Jobが1件実行されたことを確認する
assert_performed_jobs 1
end
end
ところが実行してみると、何故か2件のJobが実行されてFailします。
Ruby on Rails 5 速習実践ガイドで躓いたところ。
Chapter 7-2で、本の記述に従って下記を tasks_controller に追加したところ、
@tasks = @q.result(distinct: true).recent
index を開こうとするとエラーが発生。
NoMethodError in TasksController#index undefined method `recent' for #<Task::ActiveRecord_AssociationRelation:0x00007f8298add2d0> Did you mean? reject reset
調べてみたところ、この .recent
は Ruby や Rails、または ransack gem で用意されているメソッドではない様子。
「rails .recent メソッド」で検索して下記ページに行き当たり、これはScopeなのでは?と思い当る。
Railsでよく利用する、Scopeの使い方。 - Qiita
https://qiita.com/ngron/items/14a39ce62c9d30bf3ac3
本の索引からScopeのページを探して見返すと、P. 178 に下記の記載が。
scope :recent, -> { order(created_at: :desc) }
このページを読んだ時点では「たとえば次のように ... 使うことができます」としていくつか使い方の例が挙げられているだけだったので、この scope が後々必要になるとは思わず、追加していなかったことが原因でした。
app/models/task.rb にこの scope を追加すると期待通り動作するようになりました。
参考・引用元: 現場で使える Ruby on Rails 5速習実践ガイド | マイナビブックス
heroku上のアプリ からダウンロードしたデータをローカル(development)のDBに投入したところ、migration のバージョンが heroku上にあった物になってしまい、かつ、環境がプロダクションと認識されるようになってしまいました。
$ bin/rails db:rollback
rails aborted!
ActiveRecord::UnknownMigrationVersionError:
No migration with version number 201906********.
bin/rails:4:in `<main>'
Tasks: TOP => db:rollback
(See full trace by running task with --trace)
調べてみた所、migrationのバージョンの履歴は schema_migrations というテーブルに格納されていることが分かりました。
bin/rails db:version
入門書等で「バージョンを一つ前に戻す」や「特定のバージョンまで実行」などのコマンドは書いてあるのに今のバージョンを調べるコマンドが意外と書いてないことが多くて、毎回調べてるので。
2020/08/21 追記:最初に記事を書いた時とは別のPCで、VcXsrvなしで実行できることを確認しました。(インストールもしていない状態)
環境は以下の通りです。
Windows 10 Home バージョン1909
Ubuntu 18.04.5 LTS (Windows Subsystem for Linux)
Ruby 2.6.5
Rails 6.0.2.2
Minitestでのみ確認しました。RSpecは最近触っておらず…。
2019/08/31追記:結局現在は、VcXsrvもgoogle-chromeも起動させていなくても実行できるようになっています…いつの間にか。
何が影響したのかは分からず…。Windows Updateはありました。(Windows 10 Home, 現在のバージョンは1903)
Ubuntu, Ruby, Rails のバージョンは変わっていません。
2019/07/08訂正:何度もすみません。勘違いがありましたので再度訂正します。
一度VcXsrvは不要と書いたのですが、Headless Chromeを使用する場合でもやはり起動だけはさせておかないといけないようです…。
また、削除しても動いたと思っていた require 'capybara/rspec'
require 'webdrivers'
の二行が必要でした。
最初に記事を書いた時点からの変更点は以下となります。
require 'capybara/rspec'
require 'webdrivers'
を追加
google-chrome --headless --disable-gpu --no-sandbox
とすれば「Ruby on Rails 5 速習実践ガイド」を見ながらRSpecのテストを実行しようとして詰まりました。
3日くらい試行錯誤してなんとか実行まで漕ぎつけたのでその方法のメモです。
途中から心が折れて解消した手順とかエラーメッセージとか正確に控えてません…ごめんなさい。
また、Minitestのみ使っている別のプロジェクトでSystemTestを実行する方法も並行して調べていたので、情報が混ざっていたらすみません。Capybaraを動かす方法という意味では同じだと思うのですが。
少しでも参考になれば幸いです。
Rails 5系の情報がまだあまり無いようだったので。とりあえずうまくいった手順です。
こちらを参考にGoogle Developers Console側の登録をした後、
爆速ッ!! gem omniauth-google-oauth2 で認証させる - Qiita
Railsアプリ側の設定は、omniauth-google-oauth2のREADMEに「Devise」の項があるので、それに従ってやればうまくいきました。
zquestz/omniauth-google-oauth2: Oauth2 strategy for
Google > Devise
今回は以下を目指します。
背景として、とある会社のGSuiteアカウントでしかログインできない社内向けツールを作るために調べた情報です。
おそらくGSuiteに限らずログイン可なアプリを作る場合でもそんなに変わらないはず。
var obj = {
a: 'aaa',
b: 'bbb',
c: 'ccc'
};
for (var i in obj) {
console.log(i + ': ' + obj[i]);
}
結果
a: aaa
b: bbb
c: ccc
値があるかどうかのチェック的なところでいつも迷うやつ。
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
2019/08/29追記:現在は修正されているようです。詳細後述。
firebase deploy --only functions
実行時に Error: functions predeploy error: Command terminated with non-zero exit code4294963238
というエラーが発生した際の対処法。
C:\Users\***>firebase deploy --only functions
=== Deploying to '***'...
i deploying functions
Running command: npm --prefix "$RESOURCE_DIR" run lint
npm ERR! path C:\Users\***\%RESOURCE_DIR%\package.json
npm ERR! code ENOENT
npm ERR! errno -4058
npm ERR! syscall open
npm ERR! enoent ENOENT: no such file or directory, open 'C:\Users\***\%RESOURCE_DIR%\package.json'
npm ERR! enoent This is related to npm not being able to find a file.
npm ERR! enoent
npm ERR! A complete log of this run can be found in:
npm ERR! C:\Users\***\AppData\Roaming\npm-cache\_logs\2018-11-18T04_48_00_356Z-debug.log
Error: functions predeploy error: Command terminated with non-zero exit code4294963238
firebase.json の中の $RESOURCE_DIR
を %RESOURCE_DIR%
に書き換える。
※Windows用の解決策。異なるOSを使ってチームで作業する場合などは使えない。
Try to replace $RESOURCE_DIR with %RESOURCE_DIR% in your firebase.json file.
C:\Users\***>firebase deploy --only functions
=== Deploying to '***'...
i deploying functions
Running command: npm --prefix "%RESOURCE_DIR%" run lint
> functions@ lint C:\Users\***\functions
> eslint .
+ functions: Finished running predeploy script.
i functions: ensuring necessary APIs are enabled...
+ functions: all necessary APIs are enabled
i functions: preparing functions directory for uploading...
+ Deploy complete!
Project Console: https://console.firebase.google.com/project/***/overview
2019/08/29追記: 久しぶりにFirebase を使ったところ、今は直っている様子。$RESOURCE_DIR
のままでも上手くいきました。
Firebase CLI もWindowsもNode.jsも何もかもアップデートしているので、どれでうまくいくようになったのか分かりませんが…(苦笑)
上手くいった際のFirebase CLI のバージョンは 7.3.0 です。
C:\Users\***>firebase deploy --only functions
=== Deploying to '***'...
i deploying functions
Running command: npm --prefix "$RESOURCE_DIR" run lint
> functions@ lint C:\Users\***\functions
> eslint .
+ functions: Finished running predeploy script.
i functions: ensuring necessary APIs are enabled...
+ functions: all necessary APIs are enabled
i functions: preparing functions directory for uploading...
i functions: packaged functions (39.41 KB) for uploading
+ functions: functions folder uploaded successfully
i functions: creating Node.js 8 function myFunction(us-central1)...
+ functions[myFunction(us-central1)]: Successful create operation.
Function URL (myFunction): https://us-central1-***.cloudfunctions.net/myFunction
+ Deploy complete!
Project Console: https://console.firebase.google.com/project/***/overview
Today's Progress:
Thoughts:
Completed the feature of selecting a calendar to use in Pom-Cal. At first, it had a bug of not updating the options properly after signing in with a different account. I fixed it by changing the timing of calling getCalendarList and adding clearOption function.
So it's Day 100! I made it!
It was a good challenge for habit making. For coding, I did made some progress but there are a lot more to learn. I will keep going!
Link to work:
Pom-Cal
sidemt/pomcal: Pomodoro timer integrated with Google Calendar
All logs of my 100 Days of Code
Today's Progress:
Thoughts:
I coded almost all day and deployed the Pomodoro timer! There are many things I want to improve but it at least has minimum functions for the first deployment.
まだ改善したいところは多々ありますが、とりあえず第一段階として公開できるところまでこぎつけたので公開しました!
Things I want to add:
Now there are 9 more days to go!
Link to work:
Pom-Cal
sidemt/pomcal: Pomodoro timer integrated with Google Calendar
My first PR to an open source project was successfully merged. The repo it got merged into was dev.to!
Add GitLab URL field to user profile by sidemt · Pull Request #1121 · thepracticaldev/dev.to
I added a new field to put a link to GitLab profile on DEV profile.
@ben gave me a comment on GitHub so I wrote the changelog post for it too.
Changelog: Add GitLab link to your profile - DEV Community
As many of you may know dev.to uses Ruby on Rails. I have learned the basics of Rails and have made a few web apps as personal projects but had never worked on such a large project.
But there already were similar URL fields and one of them was added recently so I could easily find out what I needed to change by looking into the PRs and codes of the other fields.
The most difficult part for me was setting up the environment locally.
I'm a Windows user.
As far as I know, I can't install rbenv
on Windows. So I used WSL(Windows Subsystem for Linux).
There is a detailed guide in dev.to's documentation. It helped me a lot.
I'm thinking of writing detailed posts on how I resolved these troubles later.
rbenv
but I couldn't resolve it. After investigating for a whole day I decided to reset the WSL and installed everything again (I could do this because dev.to was the only project I'm using WSL)After going through these challenges, I finally submitted the PR.
The code I added was 30 lines or so. 90% of my work was setting up the environment.
But as a code newbie who has no work experience as a developer, I learned a lot from this installation process.
When you create something by yourself you would use something you know or have heard of. Going through all the errors, I had many chances to deal with things I had no idea what they were.
Many "things I don't even know they exist" became "things I have heard of their name" and "things I kind of know what they do". I can now guess "I might be able to do this using this..." and search for it more easily.
If you are a beginner in programming, I recommend you trying to set up a development environment of a large open source project. Even if you can't eventually submit a PR, you can get an idea of what a real-world project looks like, you can practice reading the error message and searching for solutions, you can see the names of a huge number of modules which might help you in the (near) future.
Actually, I was considering to submit my first PR to freeCodeCamp at first (But I couldn't find "first timers welcome" issues available. I was lucky to find an entry-level issue here!) so I recently installed its environment too. These experience made me think that setting up a local environment of open source projects may be a good practice for beginners.
I use GitLab for my private repositories. It's free!
If you are a GitLab user please try adding the link to GitLab on your DEV profile!
初めてオープンソースのプロジェクトにPRを出してマージされました!嬉しい!!
Add GitLab URL field to user profile by sidemt · Pull Request #1121 · thepracticaldev/dev.to
DEV Community (dev.to) という、英語圏のMediumとQiitaの中間みたいな感じのサービスの機能追加にコントリビュートしました。
DEV Community (https://dev.to/)
日本のTwitterでも話題になったことがあるようで、時々名前を見かけるので結構知られているのかなと。
(周りにエンジニア系のリアル知り合いがいない初心者なものでその辺の温度感が分かりません…)
dev.toのプロフィールにGitLabのプロフィールへのリンクを追加できるようにしました。
Changelogの投稿もして良いですよとコメントいただいたので簡単にですが投稿させていただきました。
Changelog: Add GitLab link to your profile - DEV Community
Ruby on Railsのプロジェクトです。
こんな大規模なプロジェクトのコードに変更を加えるのは初めてだったのですが、同様の入力欄がすでに多数あり、最近も追加されていたので、その時の変更内容や他の欄のコードを参考にして書くことができてそんなに難しくありませんでした。
難しかったのは環境構築でした。
まずWindowsユーザーなのですが、たぶんRails(Ruby)をやるには向いてないんですよね。Windows。今回すごい実感して今後の方向性考えたほうがいいのかなと思いました(笑)
今回WSL(Windows Subsystem for Linux)を使って、
という形にしました。dev.to公式のドキュメントでこの方法も書いてあって助かりました。
このあたりの詳しい躓きポイントと解決した方法は別途記事にできたらいいなと思ってます。
rbenv
のバージョンがおかしなことになってるのは分かったけれど1日やって直せなくて結局WSLをリセットしてインストールしなおす(このプロジェクトしかやってなかったからできる解決策)→で、ようやくPR出せました。
追加したコードは数十行で、作業時間の9割くらいは環境構築を試行錯誤していたのですが(笑) 実務経験の無い初心者としてはこのおかげで学ぶものが大きかったです。
自分一人で何か作っても、自分が全く知らないものを無理やりにでも触って動かすという経験はなかなかできないので。
例えば実際にPRを出すところまでまだ行けなくても、大規模なオープンソースプロジェクトの開発環境をローカルに構築して起動するようにしてみるだけでも、「実務の世界で使われているようなコードはこんな規模なんだ(きっと)」と感じることができ、エラーメッセージから解決策を調べる練習にもなり、いろんなモジュールの名前を目にすることもでき。学べたことが多々ありました。
存在すらしらない→名前だけは見たことがある→どういう系の機能で使われるものかなんとなく分かる、という状態にできると、自分が「こんなことを実現したい」と思ったときに格段に調べやすくなると思っているので、オススメです。
実は最初初めてPRを出すリポジトリは freeCodeCamp にしようと思ってそちらの環境構築もしていたので、比較的短期間に異なる言語・フレームワークのプロジェクトの環境構築を2回やって、そんなことを感じました。
dev.toお使いの方、ぜひGitLabのURL追加してみてください!
Today's Progress:
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.
4ヶ月前の私が書いたブログに助けられました。→ On the New Orbit: コールバック関数を自分のために解説 (JavaScript)
これ↓
引数として渡すときは、関数名の後に()を付けない。渡した時点で今すぐ実行するのではなく、関数の定義をhigher-order functionに渡すだけなので。
clearIntervalで止まらない→ setInterval()の戻り値 intervalID
をグローバルな変数で受け取っておいて、clearIntervalに渡してあげることで解決。
参考: window.clearInterval - Web API インターフェイス | MDN
Link to work:
CodePen
GitHub: sidemt/pomodoro-clock
Day50: It's Day50!! I'm proud that I have come here without missing a day. I didn't think I could do it.
— sidemt (@siideemt) 2018年10月10日
Today I started developing the countdown function of Pomodoro Clock using setInterval and clearInterval.#100DaysOfCode #freeCodeCamp pic.twitter.com/YHCOIgPSXO
Rails Tutorial を参考にしながら書いた下記のコードで RuboCop さんに指摘されたところに対処していきます。
指摘は2つ。
class StaticPagesController < ApplicationController
before_action :logged_in_user, only: [:my_page]
def home
...
end
def my_page
...
end
private
# before action
def logged_in_user
unless user_signed_in?
flash[:danger] = 'Please log in.'
redirect_to root_url
end
end
end
Rails Tutorial のサンプルアプリをベースに作り始めたアプリに、 Devise によるユーザー登録を追加したところ、全てのテストで下記のエラーが出るようになりました。
テストには Minitest を使用しています。
ActiveRecord::RecordNotUnique: ActiveRecord::RecordNotUnique: SQLite3::ConstraintException: UNIQUE constraint failed: users.email: INSERT INTO "users" (...
emailの重複制約に引っかかっている様子…?
テスト環境のユーザーはどこに設定があるんだっけと思い返したところ、 test/fixtures/users.yml
の内容がデフォルトで下記のようになっているのを発見。
one: {}
# column: value
#
two: {}
# column: value
おそらくこれのせいで、同じ値を使って one と two の二人のユーザーが作られる状態になっているのかと。 two を削除すると、とりあえずまたテストが動くようになりました。
one: {}
# column: value
この後ユーザーが絡んだテストを追加する際にちゃんとした対応が必要そうですが…取り急ぎ。
昨日行き詰まってたところが乗り越えられた気がする!!
以下、調べたことログ。