ときたの技術ノート

アウトプット!!!近道はない。泥臭く頑張れ。

【トークンの設定】git pushができない

はじめに

git pushができなくなると、毎度調べての繰り返しになっているので備忘録。

エラーメッセージ内容

https://docs.github.com/ja/enterprise-cloud@latest/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-token
git push origin main
Username for 'https://github.com': <<USERNAME>>
Password for 'https://<<USERNAME>>@github.com':
remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/<<USERNAME>>/TIL.git/'

やったこと

  1. git pushをしようとしたところ、ユーザー名とパスワードの入力を求められる。
  2. githubのアカウントパスワードを入力しても認証が通らない。
  3. アクセストークンを作成するも、認証が通らない。
  4. アクセストークンを権限を設定した上で作成。 ←これで認証が通る

解決方法

公式ドキュメントを参照し、アクセストークンの設定を行う。

docs.github.com

手順メモ

  1. 左側のサイドバーで [ Settings] をクリック。

  2. 左側のサイドバーの [ Personal access token] の下にある [Fine-grained トークン] をクリック。

  3. [General new token] をクリック。 新しいトークンの生成を行う。

  4. トークンの名前を入力。

  5. トークンの有効期限を選択。 (30days, 60days, 90days, custome と選択できる)

  6. [リソース所有者] で、リソース所有者を選択。 デフォルトでは、自分のgithubアカウントが設定されているので設定はこのままにしておいた。

  7. [Repository access]でリポジトリの選択。 自分の場合は、個人開発用で使うだけなので[All repositories]を選択。

  8. [Permissions] トークンに付与するアクセス許可を設定。

  9. [Generate token] をクリック。

です。以上!

文字列と数値の演算が異なる理由

やりたかったこと・やったこと

・文字列の数値同士で引き算がしたかった
文字列→数値型に変換して引き算を行った

1の補数を取得するプログラム*1

function oneComplement(bits){
    let n = bits.length;
    let oneComplement = "";
    for(let i=0; i < n; i++) {
        oneComplement+="1";
    }
    console.log(oneComplement);
    let one = String(Number(oneComplement) - bits);
    console.log(one);

    return one.length == n ? one : one.padStart(n, '0');

}

入力値

"0011000101000000111101011111100001001011000001011010101001010110110101101001000101011010011010011100100100000101110"

結果

1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 1.100111010111111e+114*2

→桁数が大きすぎて計算ができていない。 →数値の引き算で期待する結果が得られなかった。

原因

端的にいえば、文字列と数値ではデータ型が異なるため、というのが理由。

コンピュータは数値を2進数で表現するが、有限のビット数しか使えないため*3数値の精度に制限があるということを抑えておきたい。特に、浮動小数点数の場合、小数点以下の桁数が制限されるため、計算結果が正確に表現されないことがあるとのこと。これが、数値の引き算で期待する結果が得られない場合がある理由。

今回でいえば、入力値の桁数が数値として扱える有限ビット数の桁数をオーバーしていたのが原因。

*1:アンチパターン

*2:末尾がe+114となる数値は、科学的表記法(指数表記法)と呼ばれます。e+114は、10の114乗を表しています。つまり、上記の数値は1.100111010111111 × 10の114乗を表しています。

*3:コンピュータが扱えるビット数は、アーキテクチャやプロセッサによって異なるが、一般的には8ビット、16ビット、32ビット、または64ビットがよく使われる。ビット数が大きいほど、より大きな範囲の数値を表現することができますが、同時にメモリや計算速度の要件も増える。

8月の目標

こんばんは!7月もラストですね。 ネットのアウトプット記事を見ると、周りの人が優秀すぎてビビりちらかしそうですが、焦ってもいいことないしと自分に言い聞かせて、やれることをやろうと思います。

ちなみに目下のところは、以下を中長期的な目標にしています。

設計通り+ αで、大体のものが作れるようになる

その先にユーザー目線で、というのは勿論ありますが、まずは自分で大体のものが作れるように手を動かして開発ができるエンジニアになっていることが目標です。

で、そのために何をしていくかということで、小目標として8月の目標を掲げておきます...!!

基本情報技術者の学習(翌月受験/合格に向けて)
②<CSの学習>アウトプットを中心に(コーディング) ・連結リスト ・スタック ・キュー ・木構造 ・ラムダ関数 ・ソフトウェアテスト

です。

大抵のものはいけます、と言えるように早くなりたい。。 今はまだまだヘボエンジニアなので、頑張ります。自己開発したいものも色々あるんだけど、今は上記の目標を最優先に勉強しまっす(^^;)

【M1 Mac】yarnがインストールできない問題の対処法

環境

macOS : 13.4
チップ. :Apple N1 Pro
node :v20.4.0
npm  :9.7.2

目的

yarnをインストールして、パッケージなどのインストールをしたい。 yarnコマンドを使えるようにしたい。

事象

yarnのグローバルインストールは正常に終了しているようにみえるが、yarnコマンドが使えない。

事象詳細

まずはyarnを導入すべく、ターミナルにコマンドを打ち込む。

% npm install -g yarn

changed 1 package in 1s
npm notice
npm notice New minor version of npm available! 9.5.1 -> 9.8.0
npm notice Changelog: https://github.com/npm/cli/releases/tag/v9.8.0
npm notice Run npm install -g npm@9.8.0 to update!
npm notice

お次にyarnのバージョン確認をしようとするも....

% yarn -v
zsh: command not found: yarn

あれ、パスが通っていない.....???

解決方法

今回、パスが通っていないことが原因かと思い、調査をしたがパスの設定の問題ではなさそうだった。 直接的な原因の追求ができなかったが、yarnの公式ドキュメントで推奨されている方法でインストール自体はできたので、対処方法としてここにメモしておく。

ちなみにドキュメントによると、CorePackを使用することが推奨されている。 バージョンは、16.10以降が対象とのこと。

Yarn を管理する推奨される方法は、16.10 以降のすべての Node.js リリースに同梱される新しいバイナリであるCorepack を使用することです。これはユーザーと Yarn の間の仲介者として機能し、Yarn バイナリをチェックインすることなく、複数のプロジェクト間で異なるパッケージ マネージャー バージョンを使用できるようにします。


1. nvmがインストールされているかを確認する。

$ nvm -v
0.39.3

※nvmとは
Node Version Managerの略。ノードのバージョン管理ツールのこと。 複数のNode.jsのバージョンを管理し、必要に応じてバージョンの切り替えを行うことができる。

2. nodeのバージョン一覧を表示

(※16.10 以降のバージョンがインストールされていれば特に不要)

nvm ls-remote

インストール可能なNode.jsのバージョン一覧を表示するコマンド。
今回は、yarnのインストールのために、Corepackが使用可能な16.10 以降のバージョンをインストールする必要があるため、最新のバージョン、 v.20.4.0をインストールする。

3. nodeのインストール

nvm install v20.4.0

4. nodeのバージョン確認

% node -v
v20.4.0

先ほどインストールしたものが反映されていることを確認。 これでCorePackを使えるバージョンがインストールされていることが確認できた。

5. CorePackの有効化

ただし、CorePackはデフォルトではオプトイン(有効化されていない)状態のため、以下のコマンドで有効可能にする。

% corepack enable

6.グローバルyarnVersionの更新を行う

% corepack prepare yarn@stable --activate
Preparing yarn@stable for immediate activation...

7. プロジェクトの初期化を行う

% yarn init -2
{
  name: 'xxxxxxx',
  packageManager: 'yarn@3.6.1'
}

これでok。

8. yarnのバージョン確認

% yarn -v
3.6.1

not foundにならず、インストールが行えた!!

参考サイト

Installation | Yarn - Package Manager

【リファクタリングメモ】vol.3 -JavaScript -

内容

以下のswitch文をリファクタリングすること。 冗長で拡張性が低い。

// カードの値を数字に変換する
function switchToValue(card) {
 switch(card) {
   case "A":
     card = 1;
     break;
   case "J":
     card = 11;
     break;
   case "Q":
     card = 12;
     break;
   case "K":
     card = 13;
     break;
 } 
   return card;
}

修正案

ポイント: オブジェクトを使用してカードの値を変換する。

function switchToValue(card) {
    const cardValue = {
        "A": 1,
        "J": 11,
        "Q": 12,
        "K": 13
    } 
   return cardValue[card];
}

【リファクタリングメモ】vol.2 -JavaScript -

問題

下記コードをリファクタリングすること。

function fruitImgUrl(fruit){
    // 引数fruitについて、小文字でも大文字でも対応可
    fruit = fruit.toLowerCase();

    // エラーハンドリング
    if(!fruit) {
        throw new Error('Invalid input');
    }

 // ★fruit毎に条件分岐する →もっとスマートな方法は??★
   //=====================================
    if(fruit==='banana') { 
        return "url1";
    } else if(fruit==='pineapple') {
        return "url2";
    } else if(fruit==='pear') {
        return 'url3';
    } else {
        return 'no image';
    }
  //=====================================

}

解決案

連想配列を使用する!!!!!!

function fruitImgUrl(fruit){
    fruit = fruit.toLowerCase();
   
   // ★連想配列を使う
    const fruitUrl = {
        "banana": "url1",
        "pineapple": "url2",
        "pear": "url3"
    }
    const defaultUrl = "no image";

    return fruitUrl[fruit] == undefined ? defaultUrl: fruitUrl[fruit];
}

コメント

連想配列を使った方が、スッキリした形になるので積極的に使っていく。

【リファクタリングメモ】vol.1 -JavaScript -

問題

下記のコードの(1), (2) を修正すること。
(参考) joinWordsメソッドは、文字列をdelimiterごとに連結するメソッドである。
stringArrは文字列が格納されている配列、delimiterは区切り文字を表す。

function joinWords(stringArr,delimiter){
    let words = "";
    for(let i=0; i< stringArr.length; i++) {
        words+=stringArr[i];
        
        if(i===stringArr.length-1) break; // もっとシンプルに書ける(*1)
        words+=delimiter;(*1)
    }
    // このコードがダメな理由→「undefined」と表示される(*2)
    //return console.log(words);
    return words;
}
console.log(joinWords(["Monday","Tuesday","Wednesday"],'-'));

(*1)について

下記のように最後に区切り文字が連結されることを防ぎたい。↓

Monday"-"Tuesday"-"Wednesday-

そのためループの最後の番目にbreak文を使い、区切り文字を連結させないようにしていたが、もっとシンプルにやれた。 joinメソッドを使えばいい。
join() メソッドは、配列の要素を指定した区切り文字で結合して文字列として返すことができる。
これを使って以下のように書き換えたものがこちら。

if(i===stringArr.length-1) break; // もっとシンプルに書ける(*1)
words+=delimiter;(*1)

書き換え↓

words.join(delimiter);

2行が1行になり、非常にスッキリした。

(*2)について

この関数の出力結果がundefinedになるのは、console.log(words)をreturn文の代わりに使用しているため。 console.log()はコンソールに値を表示するだけで、値を返さない。 なので、この箇所はreturn文を使用して値を返すようにする必要がある。