ターミナル コマンド入力 command not found しかでない

 タイトルの通り、ターミナルでlsやらcatやら色々コマンドを打ち込んでるのにすべて読み込んでくれずに「command not found 」しかでないという困っている人に出会った。

 環境構築をしているところでPATHを変に上書きしたりして、コマンドが使えなくなったようである。

 

echo $PATH

 

 で bin のパスを確認する

参考: https://qiita.com/fuwamaki/items/3d8af42cf7abee760a81

 パスを見るとめちゃくちゃ長くて、Mysqlとか含まれていた。つまりMysqlのインストールとかPATH設定してるところで変に中断したりとかで狂ってしまったんだなということがわかった。

 これを元に戻す。

 

 vim ~/.bash_profile でパスの追加をする。

export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

 で正常だった頃のパスを再び加える。

source ~/.bash_profile

 でbash_profileを読み込み直して、完了。

 

 これでとりあえずcommand not found みたいなイケズな文言は出なくなりました。

 

参考: https://alis.to/kusshi/articles/3ldp4b5Rvmrw

 

 

 とはいえ、なんか対処療法でモヤモヤしていたんですね。bash_profileの中身も不要なPATHが色々加えられていて、なんか良くない感じになっていたし・・・

 とか思ってたら、なんかRubyのバージョン変更ができないとか色々不具合が出ているようでした。どうやらどれもbash_profileのPATHがうまくいってないからのよう…

 

 消してしまおう。

 

 と思い立って、

 rm ~/.bash_profile

 でファイルを削除してやりました。そして、

 echo export PATH='なんたら' >> ~/.bash_profile

 と必要なPATHを追加し直していきました。(この追加のコマンドでファイルは自動で作られる。)そしたら、コマンド入力できないというのも無くなったし、Rubyのバージョン変更もできるようになったし。

 

 思い切って設定ファイルを作り直すというのも手のようです。勇気を持ってやってみましょう。

 

git-secrets Argument list too long コミット できない

新しいアプリを立ち上げようとrails newした。そして作ったアプリのレポジトリをGit hubにあげようとしたらエラーが出た。

$ git commit -m "first commit"
$ /usr/local/bin/git-secrets: line 109: /usr/local/Cellar/git/2.19.0_1/libexec/git-core/git: Argument list too long

 どうもAWSのパスワードとかが流出しないよう監視してくれるgit-secretsが悪さしている気がする。

 

 Argument list too long について調べてみると、mvで一度に大量のファイルの移動をしたり、Git rmなどで大量のファイルを削除しようとするときに、引数が大きすぎるから拒否されるためにでるらしい。そういう時は処理を分割してやってくれるコマンドがあるという。

<参考>

https://qiita.com/SShayashi/items/1fef1bb11439891a5e2c

https://blog.shnr.net/?p=496

https://utano.jp/entry/2018/08/solution-for-mv-error-argument-list-too-long/ 

 

 しかし今回はそうじゃない。First commitの時に引数が大きすぎて拒否されている。

どうやらGemをbundle installしたためファイルがたくさんあって、それが原因になっている。そんなの当たり前じゃないか。いままでそんなこと起きたことないぞ?

 

<試したこと> 

●git-secretsの記述を削除してからコミット

 私は以前AWSにデプロイしたりしていて、そのときに新たに作るアプリケーションには自動でgit-secretsがinstallされるように設定していた。↓↓

$ git secrets --install ~/.git-templates/git-secrets
$ git config --global init.templatedir '~/.git-templates/git-secrets'

 このために新しいアプリがgit-secretsの影響を受けた。とりあえず、この新しいやつからgit-secretsをアンインストールしてみっかと git secrets --uninstall と打ってみたが、そんなコマンドは存在しないと言われた。え、導入はさせるが排出させる気はないのか…

 HomebrewからPCに入ってるgit-secretsをRemoveすることはできるみたいだが、とりあえず今回はこの新規アプリからだけ機能を削除してみた。

 

https://piruty2.hatenablog.jp/entry/%3Fp%3D521

 git-secretsの削除を調べていて出てきたこの記事を参考にすると、各アプリのディレクトリに隠しフォルダとして.git/hooksがあり、その中にgit-secretsを実行させるファイルがあるようだ。

$ cd .git
$ ls
COMMIT_EDITMSG HEAD hooks objects FETCH_HEAD config index refs
$ cd hooks
$ ls
commit-msg pre-commit prepare-commit-msg

 このhooksの中身を削除しました。

$ rm commit-msg

$   rm   pre-commit

$   rm   prepare-commit-msg

 これでとりあえずこのアプリをgitにあげる時にgit-secretsは作動しなくなる。

 この状態でコミットを実行したら何なくできました。やはりgit-secretsがひっかかってた。なんだろう、引数が多すぎると監視しきれなくなっちゃうのかな?

 最初のコミットはできたので、あらためてアプリのディレクトリでgit-secret installし直しておきました。とりあえずこれで初回だけgit-secretsをスルーすることができました

 

●毎回この手順踏むのはよくないと思う

 この手順はどう考えてもイレギュラーだろう。他にスマートな方法はないのか。

 調べました。

 ありました。

https://qiita.com/jqtype/items/9196e047eddb53d07a91

https://mistymagich.wordpress.com/2015/12/04/git%E3%81%AEhook%E3%82%92%E3%82%B9%E3%82%AD%E3%83%83%E3%83%97/

 

$ git commit --no-verify

 このオプションをつければhooksに入っているファイルの作業を飛ばしてコミットができる。

 これやると、vimでコミット名を打ち込めと出るので、i でインサート開いて、コミットタイトルをいれてescキーからの:wqで、コミットが始まる。

 コミットが完了したら、

$ git push -u origin master

 でプッシュして完了。できた。

 

 前までこんな手続き踏まずにFirst commitできていたのに、なんかできなくなってやな感じ。git-secretsの入れ直ししてみようかしら。そしたらこの記事更新しよう。

 

 はぁ備忘備忘。

 

 

 

 

 

 

ruby rbenv global バージョンが変わらない

 Rubyのバージョン管理をする機能であるrbenvですが、ローカル環境のバージョン変更をしようとして

$ rbenv global 2.5.1
$ ruby -v

 ってやったらバージョンが切り替わらない。悲しみ。

 

 調べてみると

 

$ rbenv version
system
2.5.1
* 2.6.3(set by /Users/あなたのユーザー名/.ruby-version)

 と出てきたときの .ruby-version というファイルを参照してバージョン変更しているようである。しかし、rbenvでバージョン管理する際に更新するファイルは

/Users/(user_name)/.rbenv/version

  これなので、.ruby-versionは変更されず、だからいっこうにRubyのバージョンが変わらなかったのです。

 このruby-versionというファイルを無くす、ファイル名を変えちゃう、ファイルの中身を書き換える。という手段でバージョン変更できるらしい。自分は中身書き換えました。

 vim使うとバージョンを表す 2.6.3って書いてあるところを、2.5.1に修正して保存。それで ruby -v  をしたら変更できてた。いちおうrbenv global と rbenv rehash もかけました。

 

 これでバージョン変更はできたけど、中身書き換えただけなので次変える時も同様の手順が必要です。なので、ファイル名を書き換えるとかの方が良いかもしれない。

 

 しかし、この腕力で解決する方法、スマートじゃない。大丈夫だろうか?調べて他の解決方法を追記しようと思います。

 

参考:

https://www.macneko.com/entry/issue-rbenv-not-working-global

https://shikasen-engineer.com/rbenv_global/

 

 

 

 

gem version 違い 動かない

時間がかかったエラーの対処への備忘録

 

 過去に作ったRailsアプリケーションを動かそうとしたら、動かなくなっちゃった!どうして?という人のエラーをみていたのですが、なんかよくわからない。全てのアプリが動かないのではなくて、特定のアプリだけ動かない。調べてもクリティカルな参考記事がない。

 

 どうもgemのバージョンが合わないとかそういうエラー文があるのだが、いくらbundle install しなおしても治らない。Gemfileとかへの記述は正しい。ローカルのGemのバージョンもおかしくない。なんだろう?

 

 https://310nae.com/error-mysql2/

 

 この人のエラーと同じだった。というか厳密には似ているという感じか。

 

 結論bundle install --path vendor/bundle  というbundle installのオプションが悪さする。

 

 もともとgemはPCのシステム直下にインストールされるんですが、アプリケーションのディレクトリにインストールすることもできるというのがこのオプションである。というのも、PCにどんどんgem追加するのが気持ち悪いとかの理由でこの機能がある。また、かつてはbundlerという機能がなかったのでgemのバージョン管理が簡単じゃなくて、そのためにアプリごとにgemをインストールするのが主流だったからこうなってたそうである。 詳しくは↓

 https://qiita.com/jnchito/items/99b1dbea1767a5095d85

 

 さて、今回のエラーはこの --path vendor/bundle というオプションをつけてgemインストールをしていたから起きたそうである。このオプションは一度使うと、それがデフォルトになるので、この人はRails newでアプリケーションを作るたびに、gemのインストール先がアプリのディレクトリ内に作られていたんです。

 

 最初にあげた参考サイトの方はMysql2のインストールができずオプションをつけて解消しようとしたができなかった。というのもこの方も同じく--path vendor/bundle のオプションをつけてアプリケーションを作成していて、アプリのGemにPATHの変更を加えたかったのに、Mysql2のオプションインストールがローカルにばかり行っていて、個別のアプリに変更が適用されなかったからうまくいかなかった的な感じなですね。たぶん。

 

 この--path vendor/bundle オプションをつけているとローカル環境にばかり変更を加えて、肝心のアプリに変更が加えられず、エラーが解消されないというお門違いな状況になってしまうんですね。なので、bundlerというgem管理機能ができた現在はこのオプションをつける意味はあまりないのでやめるべきなんですね。

 

 そのオプションの解除の方法はこちら↓

⑴ オプションによって作ってしまった vender/bundle のディレクトリの削除

⑵ローカルで「$ vim .bundle/config」を編集して BUNDLE_PATH: "vendor/bundle" この記述を消してしまう。

 これでアプリごとにGemを入れるディレクトリを作る設定がなくなります。

 

参考:

https://hi-algorithm.com/bundle-install-path-vendor-bundle/

https://qiita.com/yusaku_takiguchi/private/f9f56d727cfe77ccd4a8

 

 これは気づくのに時間がかかる。知らなきゃできないは。あ〜備忘備忘。

 

 

 

puts でまとめて出力しよう

Rubyの出力メソッドのひとつ”puts” よく見ます。

 

複数の値を出力する時、putsを複数行にわたって書いていませんか?私はそうでした。

 array = ["a","b","c"]

 puts array 
 puts "\n"
 puts 1+1
 
=> a
  b
  c
=>  
=> 2
 もうそんなことはやめにしましょう。

 

array = ["a","b","c"]

puts array , "\n"1+1 
 
=> a
b
c

2

 

 このようにカンマで区切ればいっぺんにputsで出力できるのです。時短になりますね。これでまた一歩、世界平和に近づいたのです。

 

 以上です。

 

配列とは [ ]いらないのかもしれない

Rubyの配列の概念を疑うようなことがあったので備忘録

 

普通の配列の記述は

      array = [ "a", "b", "c" ]         

のように書きますよね。

 

ところがです。この大括弧で囲まなくても配列として認識されるみたいなんです。

array = "hoge""gefu""mofu"

puts array[1]
puts array.class

⬇︎出力

 MacBook-puro ruby array.rb
 gefu    #配列の取り出し方ができている
 Array   #この変数は配列クラスとして認識されている

 

 たまたま大括弧を書き忘れた時にきちんと動作しているので気付いたのですが、

 ary =  "yuki",45, ["mana""kana"], {:name => "takashi"
 puts ary [2][0]
 puts ary.class
 
 => mana
 => Array
 # 配列は[ ]で囲まなくても配列として認識される!?
 # 変数に複数の値を入れたら、それはもう配列として認識されるのかもしれない...

変数に複数の要素をぶち込んだらそれはもう配列ということにしてくれるようですね。まぁ確かにそうだしな。

 

 明示的にわかりやすくするために [ ] で囲むのかな。レファレンスをみても自分はこれについての記述を見つけられなかったんですよね。とはいえこういうこともあるんだなって思いました。

 

以上

coffeeファイルに気をつけろ

javascriptのファイルが読み込まれない!?

 

延々と悩まされました。個人作成のものだったので1ヶ月だらだらと悩み続け、問題を先送りにし、解決しないままだらだらと過ごしました。

 

Railsで画像投稿機能をつけようと思って。それにJavascriptで複数枚の画像を投稿できるように、投稿フォームをappendする機能を実装したんです。でも、Javascriptがうんともすんとも言わないのです。困った。

 

原因はJSのファイル名でした。

f:id:kc-masui:20191116212253p:plain

今回はproducts.jsというファイルに機能を実装しました。これが実行されない。なんで!?

 

それは直前にあるproducts.coffeeというcoffeeファイルがあったから、同一ファイル名のものと認識されたせいだからです。

 

coffeeファイルと言えど、同じディレクトリ内にあるもので同名のものなのでNGなようです。F●CK!!!

 

ここでCOFFEEファイルってなんなのか勉強しておこう。

.coffee拡張子のファイルはCoffeeScriptと呼ばれ、JavaScriptの互換プログラミング言語である。Javascriptよりも簡素に書くことができて、ファイルを実行すると、JSに変換される。

結局、JavaScriptなんですよ。だから、同名ファイルだと重複が起きて、大事な方が読み込まれなくなってしまったんですね。

 

対処の方法としては、products.jsをproduct.jsに変えました。

 

無駄な時間を喰ってしまった…。しかし、手がかりがなかったからなぁ…。よく自分だけで解決できたよ。よかった。これで先に進める。