zshrcとzprofileについて

あるとき.zprofileというファイル名を見かけて、そんなファイルあるのかなと疑問に思い、自分のターミナルで調べたら確かにあった。

中身を見たら、nodeのPATHだけ書いてあった。

export PATH=$HOME/.nodebrew/current/bin:$PATH

前にrbenvをインストールしたときは.zshrcにPATHを追加したので、
nodeも.zshrcに書いたと思ったら.zprofileにPATHを書いていた。

記事をいくつか見ると.zshrcに書くパターンと.zprofileに書くパターンの半々。

どっちに書けばいいんやら.....


使い分けは?


bashの記事引用、

.bash_profile
基本的に デフォルトのまま一切いじらない
端末操作以外でも設定しておく必要がある環境変数のみ設定する
.bashrc
.bash_profileに書いた設定以外はすべてここに書く
ほとんどの人は、 設定は全部.bashrcに書けば良い

qiita.com


zshの記事でも

zprofile
ログインシェルの場合に1度だけ読み込まれる。
つまりインタラクティブシェルやシェルスクリプトでは不要だけどログインシェルの時だけ必要な設定をする場合にはここに記述するのが良い。
zshrc
ログインシェルとインタラクティブシェルの場合だけ読み込まれる。
シェルスクリプトでは不要な場合に記述する。
一般的に紹介されている記事ではこの設定ファイルにいろいろ記述することが多い。
困ったらここに記述してみて問題が出てきたらちゃんと場所を考えるという運用でも問題ないかもしれない。

qiita.com

ということらしい。

異常を参考にして、上に書いたnodeのPATHも.zshrcに書き換えたが問題なくnode.jsは動いた。
$PATHを見ても通ってる。

~ % echo $PATH
/Users/gallardo/.nvm/versions/node/v14.12.0/bin:/Users/gallardo/.rbenv/shims:/Users/gallardo/.rbenv/bin:/Users/gallardo/.nodebrew/current/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin


詳細

それぞれの違いは?


  • シェルの種類
1・ログインシェル
  コマンドラインを起動したとき、サーバにログインしたときに立ち上がるシェルのこと
  対話形式で入力する
2・インタラクティブシェル
  コマンドラインで bash とか zsh と入力すると起動するシェルのこと
  対話形式で入力する
3・シェルスクリプト
  シェルによるプログラミングファイルを作成して実行すること


  • 役割
.zshenv
ログインシェル、インタラクティブシェル、シェルスクリプト、どれでも常に必要な設定を定義する
zsh が起動して、必ず最初に読み込まれる設定ファイル
対話形式のシェル設定をここですると、シェルスクリプト誤作動の原因になるため注意する
影響範囲が大きいので記述は必要最低限にするべき
.zprofile
ログインシェルに必要な設定だけを記述する
zshenv の次に読み込まれる設定ファイル
zsh ログイン時の一回だけ読み込まれる
.zshrc
ログインシェル、インタラクティブシェルの場合に読み込まれる
.zlogin
ログインシェルに必要な設定だけを記述する
最後に読み込まれる
役割は .zprofile とほぼ一緒。混乱を避けるため併用しないこと
.zlogout
exit コマンドで zsh を抜けたときに読み込まれる

suwaru.tokyo



環境構築やLinux(Unix)関係は特に苦手だと感じるので少しずつ慣れていきたい。

散歩,睡眠,筋トレ

最強の気分転換、リフレッシュ法は散歩、睡眠、筋トレ。


まず、散歩はデスクワークが多いので外を歩くことで新鮮な空気を吸ったり、自然を見たりしながら軽く運動でき、リラックスできる。
また、「思考の整理学」にも書いてあったが、忘却を促進して頭を整理する効果もある。
あと、西洋の哲学者は散歩を好んでいたらしい。(賢くなりたい......)

www.amazon.co.jp



2つめは睡眠。
3大欲求でもあり、人生の1/3は寝ている。
朝起きた後は脳もスッキリしていて作業効率も上がる。
また、昼寝をすることで午後のパフォーマンス向上することも言われている。

最高の睡眠を教えてくれた本。 www.amazon.co.jp



3つめは筋トレ。
筋トレは辛い(別に嫌いじゃない)、余計なこと考える暇がないくらい辛い。
持てる力の限りを使うことにしか脳が働かない。
f:id:gallard316:20201123015356p:plain

Twitterでバズっていた筋トレの話。
根本的なストレスが生じる原因の対処にはなっていないが、気分を変える方法としては最強!
Testosteroneさんに感化されてる。

www.amazon.co.jp



私が思うリフレッシュ法を軽く書き連ねました。
他にもサウナとかいろいろあるけど、日常的に取り組みやすいものを書きました。

Cookie(クッキー)とセッション

プロになるためのWeb技術入門を読んでいて、Cookieやセッションを忘れていました。
Cookieの解説がわかりやすかったのでメモします。

gihyo.jp

Cookie

Cookieとは

HTTP通信は「Stateeless Protcol(ステートレスプロトコル)」つまり、状態を持たないプロトコル
そのため、ログイン状態などの状態をもてないため、HTTP通信をするとき、毎回ログイン画面が本来なら表示される。
これを解決するため、ブラウザを識別するための情報をHTTP通信に含めて送信する。
これをCookieと呼ぶ。

実際のやりとり

Cookieは、WebサーバからWebブラウザへHTTPレスポンス(リクエスト)のヘッダを利用して小さな情報を送ります。この情報は「名前=値」の組み合わせで表される。

Webブラウザが最初の通信
②Webサーバは「Set-Cookie」ヘッダーにCookieを含めてWebブラウザへ送信
Webブラウザは「Cookie」ヘッダーに送信されたCookieを含めてWebサーバへ送信

その後はログアウト、ブラウザを閉じる、タイムアウトしない限り、Cookieを含めて送信する。
ログアウトなどすると再度ログインをして新たにCookieを発行する。


  • HTTPレスポンス
HTTP/1.1 200 OK
・
・
Set-Cookie :  user=name; pass=password.....
・
・


HTTP/1.1 200 OK
・
・
Cookie : user=name; pass=password
・
・


Cookieの問題点

Cookieにはセキュリティ上の問題がある。
HTTP通信の中身は見ようと思えば見える。
つまり、Cookieで保存されたユーザ名やパスワードは簡単に他人にのぞかれる危険性があるので、なりすましの危険性がある。

セッション

セッションとは

上記の問題も含め、考え出されたのが「セッション」
セッションとは、ネットショッピングで例えると、
「ログイン」、「カートに入れる」、「購入」、「ログアウト」といった一連の流れを「セッション」という。


セッションIDとは

上記の通信の場合、Cookieにユーザ名やパスワードなどを用いて通信するのはよろしくない。
そのため、代わりに「セッションID」という「32桁の16進数のランダムな文字列」が使用される。
セッションIDはユーザの情報そのものを入れないので安全性は高い(セッションIDが漏洩すると結局はなりすましされるのでセキュリティ対策が必須!)。


セッション状態はWebサーバ側で管理されている。


ちなみに、有効期限が決められていないCookieWebブラウザが閉じられると同時に削除される。
このようなCookieを「セッションCookie」という。


「Team Geek」を読んだ

この本について小耳に挟む機会があり、興味が湧いた。
これから個人ではなく、他の人と開発していくことが増えるので読んでみた。 www.oreilly.co.jp

所感

全てはHRT

  • 謙虚(Humility)
    世界の中心は君ではない。君は全知全能ではないし、絶対に正しいわけでもない。常に自分を改善していこう。
  • 尊敬(Respect)
    一緒に働く人のことを心から重いやろう。相手を1人の人間として扱い、その能力や功績を高く評価しよう。
  • 信頼(Trust)
    自分以外の人は有能であり、正しいことをすると信じよう。そうすれば、仕事を任せることができる。


それぞれの頭文字をとってHRT(ハート)
これらのソーシャルスキルを身に付けることができれば、人間関係は円滑に進む。

言葉としては単純で理解しやすいが、実践していくととても難しい。
飲酒運転の真理と似ていて、シラフのときは「しないぞ!」と思っていても、酔っ払ったときの判断力はどうかわからないなと感じた。
頭に血が上ったときにHRTな状態でいられるか、自分を常に客観的に見られるように努力する。

一人でHRTを心掛けているよりも、チームでこのことを共有しておくとHRTが浸透しやすいのかなと感じた。
それぞれ個々が他者の尊敬、信頼を向上しようと努めることでHRTは強固なものになっていくと思った。


あと、ビジネスの基本でよく言われる「ホウ、レン、ソウ」
「上司は報告, 連絡, 相談を部下に徹底させる」という意味で使われているが、
この言葉の生みの親、山種証券社長だった山崎富治氏は

下からの意見をどう吸いあげるか、みんなが働きやすい環境をどう作るか、暖かい人間関係をどう作るか、少数精鋭で社員一人ひとりに厚く報いるには…と、つね日ごろ頭を悩ませていたとき思いついたのが、"ほうれんそう"だった。

と著書「ほうれんそうが会社を強くする: 報告, 連絡, 相談の経営学」で述べている。

つまり、風通しの良い職場環境を作りたかった、そのための条件として「報告, 連絡, 相談」が必要であった。


チーム(会社)を最高の状態にするにはどうすれば良いかについて、
「HRT」と「ホウレンソウ」似ているところがとても多いなと感じた。

最後に

結局、コードもアプリも道具や媒体にすぎない。その向こう側に、仲間(同僚)やエンドユーザーという人がいる。
この人と最高の関係性を築くためにHRTを忘れないようにしたい。

rbenvについて

rubyのバージョンを変更をしようとして、忘れていたので、 復習がてら備忘録も書く。

rbenvとは

rbenvはRubyのバージョンを管理するツールです。
rbenvとrbenv-buildのセットでRubyのインストールとバージョン切り替えを担ってくれます。

globalで設定していてもそれぞれのディレクトリごとに変更してくれる。
わざわざ自分で変更しなくても良い(楽!)。

.ruby-versionファイルがあるディレクトリ以下のディレクトリでは、 .ruby-version ファイルに記載されているバージョンが適用されます。

  • グローバルでは2.7.1に設定してある
~ % ruby -v
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-darwin19]
 ~/example % ruby -v
ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-darwin19]


rbenvをインストール

  • Homebrewをアップデート。
~ % brew update


  • rbenvとruby-buildをインストール。
    (ruby-buildも一緒にインストールされるのでrbenvだけでok!)
~ % brew install rbenv 

ruby-build を入れると rbenv install コマンドが使えるようになります。


  • rbenvがインストールされたか確認
~ % rbenv --version
rbenv 1.1.2

または

~ % rbenv -v
rbenv 1.1.2


シェルにrbenvを設定する

このままだとデフォルトでrbenvが使えないので設定する
zshを使用しているので~/.zshrcに書き込んでいるが、それぞれのシェルに合わせて書き込む

~ % echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc
~ % echo 'eval "$(rbenv init -)"' >> ~/.zshrc
  • export環境変数を定義するコマンド
  • $HOMEはログインユーザのホームディレクト
  • :$PATH

    追加するコマンド検索パスの優先順位を高くしたい
    コマンド検索パスには優先度があり、echo $PATHで出力された左から優先されるため、
    追加するコマンド検索パスの優先度を高くしたい場合、以下のように記述する。
    export PATH=追加したいコマンド検索パス:$PATH

 「eval」コマンドは、指定した文字列を評価後に連結して、現在のシェルに実行させます。主にシェルスクリプトや環境設定用のファイルで使用します

vim .zshrcで見てみると下のように書き込まれている。

export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"


その後再起動または、以下を実行し設定を反映させる。

~ % source ~/.zshrc


rubyをインストールする

  • インストール可能なrubyを確認する(実行時により異なる)
~ % rbenv install --list

または

~ % rbenv install -l
1.8.5-p52
1.8.5-p113

~~~~~~~~~~~~~~~

2.6.6
2.7.0-dev
2.7.0-preview1
2.7.0-preview2
2.7.0-preview3
2.7.0-rc1
2.7.0-rc2
2.7.0
2.7.1
2.8.0-dev
jruby-1.5.6

~~~~~~~~~~~~~~

現在の安定版は 2.7.2です。

本家では2.7.2が安定版だがrbenvのlistにはない!
ので、2.7.1をインストール。

~ % rbenv install 2.7.1


  • インストールしたrubyのバージョン確認
    *は今使用中のバージョン
    (versionsで全て、versionで今使用中のバージョン)
~ % rbenv versions
* system (set by /Users/owner/.rbenv/version)
  2.7.1
~ % rbenv version
* system (set by /Users/owner/.rbenv/version)


バージョンの切り替え

切り替えには2パターンあります。

・ローカルな切り替え
・グローバル な切り替え


ローカルな切り替え

プロジェクト(ディレクトリ)ごとに使用するRubyのバージョンを切り替える方法です。
切り替えコマンドを実行することで、カレントディレクトリにRubyのバージョン情報の書かれた .ruby-versionファイルが作成されます。
.ruby-versionファイルがあるディレクトリ以下のディレクトリでは、 .ruby-version ファイルに記載されているバージョンが適用されます。
また、グローバルな切り替えよりも優先度が高いため、プロジェクト(ディレクトリ)ごとに .ruby-version ファイルに記載されているバージョンが適用され、Rubyのバージョンが切り替えられます。

~ % rbenv local 2.7.0
  • 確認
~ % ls -a
  • .ruby-version が作成されているはずです。内容も確認してみましょう。
~ %  less .ruby-version
2.7.0


グローバルな切り替え

パソコンのシステム全体で共通で使用するRubyのバージョンを切り替える方法です。
~/.rbenv/version のファイル内のバージョン情報を書き替えることでバージョンを切り替えています。
ただし、ローカルな切り替えで説明した .ruby-version ファイルがある場合は、 .ruby-version ファイルが優先されるようになっています。

~ % rbenv global 2.7.1
  • rubyバージョン確認
~ % ruby -v
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-darwin19]



インストールの仕方はGithubからも可能。

github.com

qiita.com

www.atmarkit.co.jp

ブログを書こう

最近、ブログを書くということを習慣化したいなと考えている。
実際に、ごく最近からだが書き出している。

なぜ書こうと思ったか理由を書きたい。

文章力をつけたい

まず、率直に私が文章を書く力が弱いなと感じたためである。
じゃあ、どこで書こうかなということで、プレッシャーとして不特定多数の人に読まれる可能性もあるブログを選んだ。
多少の緊張感を持って、文章力向上を目指したい。


自分を知ってもらう

昔、教員をしていたときに先輩に「保護会で親を感動させる話はできるか」と問われた。
当然、社会1年目のペーペーには難しく、無難にこなすしかなかった.......
そして、先輩は「じゃあ、文章で普段から訴えなきゃいけない!(学級通信を書け!)」と言った。


また、最近別の記事にも書いたが、角谷さんが以下のように仰っていた。

・今の気持ち(感情)
あなたが書かなければ誰にも伝わらない。”相手に伝わるように”テキストで書くには訓練が必要だ
・やったこと(事実)
今日も1日がんばった!詳しく書きたいだろうけど、みんなは詳細を見たいかな?
・わかったこと(意見、解釈)
もちろん、感情以外も適切に伝わるようにテキスト出力するには訓練、訓練、訓練
・次にやること(計画、表明)
考えることは大事だけれど、明日の自分への置き手紙(明日の自分に適切に伝わるように書けるかな?)
・シャウトアウト(感謝)
チームに感謝。仲間に感謝。よい振る舞い、助かったことをフィードバックして増えたらうれしくない?


教員の時の記憶が、最近急に思い起こされた。
そして、
今の気持ち(感情)という部分が、上の記憶と重なった......
自分の気持ち、書く、...
点と点がつながった気がした


エンジニアとして働くのなら、人と人の関係は大事であり、自分のことを知ってもらうことが必要である。
よくわからないものとは距離をおきたいはずだ。自分からさらけだす人は誠実さや勇敢さを感じる。

口頭でのコミュニケーションも含めて、日々のブログでもアウトプットして自分を知ってもらうようにする。



上記でも言われているが、相手に伝わるようにするには訓練、訓練、訓練
アウトプットを大事にしたい。

JavaScript Dateオブジェクト

先日、JSでカレンダープログラム(コマンドラインcalを叩いたときと同じもの)を作成しました。
その際、Dateを使ったのですが罠が多かったので記録として残そうと思います。


Dateオブジェクトについて

Dateを使うことで特定の年月や日付、時刻を取得することができる。


例えば、今日の日付が欲しかったら、以下のようにする。

const now = new Date()
console.log(now.getDate()) // => 4


具体的な使い方

インスタンス

現在の時刻がほしい

  • 現在の時刻をインスタンス化する場合、Dateをnewするときは引数に何も渡さない(上の例と同じ)
const now = new Date()
// => Wed Nov 04 2020 20:13:39 GMT+0900 (日本標準時)

GMT = Greenwich Mean Time = グリニッジ標準時
日本から送った E メールなどの送信日時に [ GMT +09:00 ]と表示されていることがありますが、これはグリニッジ標準時から 9 時間進んでいる、という意味になります。


特定の時刻がほしい

Dateをnewするときに引数を渡すことで、特定のの時刻を表すインスタンスを作成できる。
Dateのコンストラクタ関数(new)は渡すデータ型や引数によって時刻の指定方法が変わる。
Dateは次の3種類を引数としてサポートしている。


  • 時刻を示す文字列を渡すもの
const date1 = new Date('Wed Nov 04 2020 20:13:39')
// => Wed Nov 04 2020 20:13:39 GMT+0900 (日本標準時)
const date2 = new Date('2020/12/31)
// => Thu Dec 31 2020 00:00:00 GMT+0900 (日本標準時)

// 他にも引数の取り方はある


  • 時刻の部分(年・月・日など)をそれぞれ数値で渡すもの

new Date(year, month, day, hour, minutes, seconds, milliseconds);
(日を表す第三引数から後ろの引数は省略可能)

const date1 = new Date(2020, 11, 4, 20, 13, 39) 
// => Fri Dec 04 2020 20:13:39 GMT+0900 (日本標準時)
const date2 = new Date(2020, 12, 31)
// => Sun Jan 31 2021 00:00:00 GMT+0900 (日本標準時)


  • 時刻値(1970-01-01 00:00:00(UTC)からの秒数(ミリ秒単位))を渡すもの
const date1 = new Date(1612018886000)
// => Sun Jan 31 2021 00:01:26 GMT+0900 (日本標準時)

GMT を調整して、世界共通の標準時と定めたのが、UTC = Universal Time, Coordinated = 協定世界時
なんでも GMT をそのまま世界の基準として使ってしまうと、長い目で見ると微妙なズレ(100 年で約 18 秒)が生じるため、人工的に調整する必要があったのだとか

メソッド


  • date.getFullYear()
  • date.getMonth()
  • date.getDate()
  • date.getDay() (曜日を表す。0〜6を日曜日から土曜日に当てはめている。)
  • date.getHours()
  • date.getMinutes()
  • date.getSeconds()
  • date.getMilliseconds()
  • date.getTime() (時刻値(1970-01-01 00:00:00(UTC)からの秒数(ミリ秒単位))
const now = new Date()
console.log(now) // => Wed Nov 04 2020 21:10:36 GMT+0900 (日本標準時)
console.log(now.getFullYear()) // => 2020
console.log(now.getMonth()) // => 10
console.log(now.getDate()) // => 4
console.log(now.getDay()) // => 3 (水曜日なので3)
console.log(now.getHours()) // => 21
console.log(now.getMinutes()) // => 10
console.log(now.getSeconds()) // => 36
console.log(now.getMilliseconds()) // => 269
console.log(now.getTime()) // => 1604491836269


上記の結果を見るとgetMonth()10となっている
これは、月を表す第二引数は0から11までの数値で指定するから!


月末日の取得

月末日がほしい場合、月を+1して、日を0にする
例えば、2020年の2月の月末日は

const date = new Date(2020, 2, 0)
console.log(date.getDate()) // => 29


日にちの0を入れたときの月は正確に取得できないかも?

const date = new Date(2020, 2, 0)
console.log(date.getFullYear()) // => 2020
console.log(date.getMonth()) // => 1  (なぜか1月になる)
console.log(date.getDate()) // => 29


参考

www.quicktranslate.com