ラベル プログラミング学習 の投稿を表示しています。 すべての投稿を表示
ラベル プログラミング学習 の投稿を表示しています。 すべての投稿を表示

2024年6月7日金曜日

Parameter と Argument の違い

どちらもなんとなく「引数」だと思ってなんとなくで使ってしまうのですが…
  • Parameter=仮引数(関数の定義に使用する引数)
  • Argument=実引数(関数を呼び出す際に渡す引数)

  function example(parameter) { // 関数の定義に使用する引数
    console.log(parameter);
  }

  const argument = "foo";

  example(argument); // 関数を呼び出す際に渡す引数
  
(コード例はMDNのParameter (仮引数)のページより)

参考資料:
MDN Web Docs 用語集 Parameter (仮引数)

2021年2月21日日曜日

偶数か奇数か調べるだけのサイト作ってみた

偶数と奇数が分からない人が結構(?)いるらしいというニュース記事を見かけて、入力した数字が偶数か奇数か判定するだけのサイトを作ってみました。

本当の本当にそれだけの機能しかありません。

偶数?奇数?


素のJavaScriptやCSSを書いて基本に戻ってみる練習として。私は偶数奇数は分かります(笑)

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
}

2020年5月8日金曜日

ActiveJobの処理でファイルを添付していると performed_jobs が想定より1件多くなる?(Ruby on Rails, Minitest, ActiveStorage)

遭遇した現象

こちらを参考に、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します。

2019年8月17日土曜日

recent メソッドが見つからない…?(Ruby on Rails 5 速習実践ガイド)

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速習実践ガイド | マイナビブックス

2019年7月30日火曜日

本番環境のデータをローカルのDBに投入したら UnknownMigrationVersionError と ProtectedEnvironmentError (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 というテーブルに格納されていることが分かりました。

2019年7月28日日曜日

マイグレーションの現在のバージョンを調べるコマンド(Rails)

bin/rails db:version

入門書等で「バージョンを一つ前に戻す」や「特定のバージョンまで実行」などのコマンドは書いてあるのに今のバージョンを調べるコマンドが意外と書いてないことが多くて、毎回調べてるので。

参考: rake db:migrate - リファレンス - - Railsドキュメント

2019年7月6日土曜日

なんとかWSLで System Spec (System Test) 実行できた (Ruby on Rails 5)

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' の二行が必要でした。
最初に記事を書いた時点からの変更点は以下となります。

  • spec_helper.rb の記載内容
    require 'capybara/rspec' require 'webdrivers' を追加
  • WSLで google-chrome を叩いて、Chromeを起動だけしておく
    → ここで google-chrome --headless --disable-gpu --no-sandbox とすれば
    Errorが出なくなりました。


「Ruby on Rails 5 速習実践ガイド」を見ながらRSpecのテストを実行しようとして詰まりました。
3日くらい試行錯誤してなんとか実行まで漕ぎつけたのでその方法のメモです。

途中から心が折れて解消した手順とかエラーメッセージとか正確に控えてません…ごめんなさい。

また、Minitestのみ使っている別のプロジェクトでSystemTestを実行する方法も並行して調べていたので、情報が混ざっていたらすみません。Capybaraを動かす方法という意味では同じだと思うのですが。

少しでも参考になれば幸いです。

2019年3月11日月曜日

Devise に omniauth-google-oauth2 でGoogle認証を追加する (Rails 5.2.2)

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

前提条件とやりたいこと

今回は以下を目指します。

  • 既にDeviseでUserというモデルを作成済みの所にGoogle認証機能を追加する
  • 既にそのメールアドレスで登録があればログイン、無ければGoogleからメールアドレスと名前を引っ張ってきて自動で新規登録する

背景として、とある会社のGSuiteアカウントでしかログインできない社内向けツールを作るために調べた情報です。
おそらくGSuiteに限らずログイン可なアプリを作る場合でもそんなに変わらないはず。

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年12月31日月曜日

firebase deploy --only functions のエラー (Command terminated with non-zero exit)

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を使ってチームで作業する場合などは使えない。

参考:
https://stackoverflow.com/questions/48345315/error-deploying-with-firebase-on-npm-prefix-resource-dir-run-lint

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

2018年12月1日土曜日

#100DaysOfCode Day100!!

Day 100 December 1, 2018

Today's Progress:

  • Completed the feature of selecting a calendar in Pom-Cal

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

2018年11月22日木曜日

#100DaysOfCode Day91: Googleカレンダー連携ポモドーロタイマー作りました。

Day 91 November 21, 2018

Today's Progress:

  • Deployed Pom-Cal, the pomodoro timer, as Day 1

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.

まだ改善したいところは多々ありますが、とりあえず第一段階として公開できるところまでこぎつけたので公開しました!

Pom-Cal

  • Add a log (event) to Google Calendar when a Session if completed
  • Play a start sound and end sound (I wanted both)

Things I want to add:

  • Sound ON/OFF
  • Allow users to modify the event summary (task name or something?)
  • Allow users to choose which calendar to add the logs
  • Multi language (now it's all on the same page)
  • Progress bar to show the remaining time

Now there are 9 more days to go!

Link to work:
Pom-Cal
sidemt/pomcal: Pomodoro timer integrated with Google Calendar

2018年11月17日土曜日

My first PR was merged into dev.to!

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

Feature I added

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

My thoughts

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.

Ruby on Rails on Windows

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).

  • The environment of Ruby (on Rails) is installed on WSL(Ubuntu)
  • PostgreSQL is installed on Windows
  • The code cloned from the dev.to repo is stored on Windows

There is a detailed guide in dev.to's documentation. It helped me a lot.

Where I got stuck

I'm thinking of writing detailed posts on how I resolved these troubles later.

  • Initial installation before I can launch dev.to locally
  • Couldn't sign-in on the local environment (Thanks @andy for the help on this!)
  • Sign-in started working, but instead, Rubocop had an error of Ruby version mismatch which prevented me from making a new commit (it's in the pre-commit hook)
  • It seemed something was wrong with the Ruby versions managed by 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.

What I learned

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.

GitLab users!

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!

2018年11月16日金曜日

はじめてのぷるりく @ dev.to

初めてオープンソースのプロジェクトに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でRuby on Rails

まずWindowsユーザーなのですが、たぶんRails(Ruby)をやるには向いてないんですよね。Windows。今回すごい実感して今後の方向性考えたほうがいいのかなと思いました(笑)

今回WSL(Windows Subsystem for Linux)を使って、

  • Ruby・Rails周りの環境はWSL(Ubuntu)にインストール
  • PostgreSQLはWindows側にインストール
  • dev.toのリポジトリからクローンしたコードはWindows側に置く

という形にしました。dev.to公式のドキュメントでこの方法も書いてあって助かりました。

躓いた点

このあたりの詳しい躓きポイントと解決した方法は別途記事にできたらいいなと思ってます。

  • まずローカルで起動できるようにするまでに躓く
  • 起動できたと思ったらサインインできなくて躓く
  • サインインできて動作チェックして直して、修正をコミットしようとしたらコミット時に自動で走るRubocopでエラーが出るようになっててコミットできなくて躓く
  • rbenv のバージョンがおかしなことになってるのは分かったけれど1日やって直せなくて結局WSLをリセットしてインストールしなおす(このプロジェクトしかやってなかったからできる解決策)

→で、ようやくPR出せました。

オープンソースプロジェクトの環境構築で初心者が学べること

追加したコードは数十行で、作業時間の9割くらいは環境構築を試行錯誤していたのですが(笑) 実務経験の無い初心者としてはこのおかげで学ぶものが大きかったです。

自分一人で何か作っても、自分が全く知らないものを無理やりにでも触って動かすという経験はなかなかできないので。

例えば実際にPRを出すところまでまだ行けなくても、大規模なオープンソースプロジェクトの開発環境をローカルに構築して起動するようにしてみるだけでも、「実務の世界で使われているようなコードはこんな規模なんだ(きっと)」と感じることができ、エラーメッセージから解決策を調べる練習にもなり、いろんなモジュールの名前を目にすることもでき。学べたことが多々ありました。

存在すらしらない→名前だけは見たことがある→どういう系の機能で使われるものかなんとなく分かる、という状態にできると、自分が「こんなことを実現したい」と思ったときに格段に調べやすくなると思っているので、オススメです。

実は最初初めてPRを出すリポジトリは freeCodeCamp にしようと思ってそちらの環境構築もしていたので、比較的短期間に異なる言語・フレームワークのプロジェクトの環境構築を2回やって、そんなことを感じました。


dev.toお使いの方、ぜひGitLabのURL追加してみてください!

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年9月13日木曜日

RuboCop さんと付き合う (Style/GuardClause, Layout/IndentationConsistency)

Rails Tutorial を参考にしながら書いた下記のコードで RuboCop さんに指摘されたところに対処していきます。
指摘は2つ。

  • Style/GuardClause: Use a guard clause instead of wrapping the code inside a conditional expression.
  • Layout/IndentationConsistency: Inconsistent indentation detected.

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

2018年9月11日火曜日

Devise を導入すると ActiveRecord::RecordNotUnique: エラーでテストが動かなくなったので対処(暫定対応)

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

この後ユーザーが絡んだテストを追加する際にちゃんとした対応が必要そうですが…取り急ぎ。

2018年9月3日月曜日

Twitter API についてメモ 3

Twitter API についてメモ 3

昨日行き詰まってたところが乗り越えられた気がする!!
以下、調べたことログ。

そもそもRailsプロジェクトからAPIを呼ぶには

  • 「Make api calls in Rails」で検索して Making API Calls in Rails
    rest-client gem の代わりに twitter gem を使った方が Authenticate が簡単そうなのでできればそうしたい
  • response で帰ってきたJSONに関しては、RubyのJSONモジュールがあって、それでparseできそう
    Module: JSON (Ruby 2.0.0)
  • →twitter gem を使って、tweet id を配列で取得することに成功
    そこから埋め込みツイートにするには?