Gitのコマンド一覧|女子大生エンジニアの備忘録 #8

こんにちは、鈴です。

 

今回は、Gitの基本的なコマンドの備忘録です。

 

前回の記事はこちらから↓

 

riririririn.hatenablog.com

 

 

では早速本題に移りましょう!

 

 

 

ローカルリポジトリ作成

$ git init

$ git add *

$ git commit -m "initial commit"

*2、3行目は現在ファイルがリポジトリ内に存在する場合のみ

 

リモートリポジトリからプロジェクトをコピー

$ cd [ローカルリポジトリのパス]

$ git clone [リモートリポジトリパス]

*2行目のパスには"https://github..."のようばパスが入る

 

ファイル更新

$ git add [ファイル名]

$ git commit -a -m "任意のコメント"

$ git push origin master

* -a は変更を自動検出

 

git add 関連のコマンド一覧

全てのファイル・ディレクトリをadd

$ git add .

 

全てのCSSファイルをadd

$ git add *.css

 

追加されるファイルの検索

$ git add -n

 

変更されたファイルをadd

$ git add -u

 

addしてしまったファイルを除外

$ git rm --cashed

 

 

git commit 関連のコマンド一覧

変更のあったファイル全てをcommit

$ git commit -a

 

直前のコミットを取り消す

$ git commit --amend

 

変更点を表示してcommit

$ git commit -v

 

 

branchの操作

branchの作成

$ git branch [ブランチ名]

 

branchの移動

$ git checkout [ブランチ名]

 

branchの削除

$ git branch -d [ブランチ名]

 

現在のbranch名の変更

$ git branch -m [ブランチ名]

 

local branchの一覧

$ git branch

 

remoteとlocalのbranchの一覧

$ git branch -a

 

remote branchの一覧

$ git branch -r

 

remote branchへチェックアウト

$ git checkout -b [ブランチ名] origin/[ブランチ名]

 

 

merge関連の操作

編集をmerge

master以外のbranchの編集をmasterに反映する場合の手順は以下の通り。

 

  1. branchに移動
  2. 変更ファイルをcommit
  3. masterに移動
  4. 差分をmerge
  5. ファイルを更新

 

対応するコマンドは以下の通り。

 

$ git checkout [ブランチ名]

$ git commit -a -m ”コメント”

$ git checkout master

$ git merge [ブランチ名]

$ git push prigin master

 

mergeの取り消し

$ git merge --abort

conflictが発生して一旦戻したい場合に使用するコマンド。

 

 

余談

自分が利用するgitコマンドについてざっくりまとめました。

 

ミスやその他のコマンドについては都度修正・追加します。

 

今回は他の記事に比べると箇条書きで非常に淡白な感じの記事なのですが、読んでくださっている方はどちらの方がいいのかなあ・・と気になっています。

 

では。

 

 

深さ優先探索|Python|女子大生エンジニアの備忘録 #7

こんにちは、鈴です。

 

今回は、基本的なアルゴリズムの一つである深さ優先探索についての備忘録です。

 

アルゴリズムをご紹介した後、Pythonでの実装例を用いて解説を行っていきます。

 

前回の記事はこちらから↓

 

riririririn.hatenablog.com

 

では早速行ってみましょう。

 

 

 

深さ優先探索とは

 

深さ優先探索は、グラフや木構造を探索するための基本的なアルゴリズムの一つです。

 

木の根にあたる部分からスタートし、それ以上進めない行き止まりの地点まで試行を繰り返し、行き止まりになったらまだ探索が完了していない地点まで戻って探索を行います。

 

「縦型探索」とも呼ばれています。

 

基本

 

深さ優先探索の基本は以下の通りです。

 

  • 全箇所から全方位への移動を試し尽くす
  • そのために、試し尽くしていない箇所を覚えておき、後で戻ってくる

 

実現方法には2種類あります。

 

再帰関数による探索

 

位置を引数にした再帰関数による探索で、自ら4方向への呼び出しを行います。

 

再帰関数の擬似コードは以下のようになります。

 

関数 search(x,y) {

  if 位置(x,y)が範囲外

    return

  if 位置(x,y)がすでに探索済み

    return

 

  (x,y)に到達したことを記録

 

  #4方向への探索

  search(x+1,y)  #右

  search(x-1,y)  #左

  search(x,y+1) #下

  search(x,y-1)  #上

}

 

4方向への関数は再帰関数なので、1方向について全て試した後に帰ってきて次の方向を試すような仕様になっています。

 

これによって全方位試し尽くすことができます。

 

問題点としては、試行回数が多い問題の場合に、再帰関数が深くなりすぎることによって「スタックオーバーフロー」というエラーが発生する可能性があることがあげられます。

 

 

スタックによる探索

 

試すべき位置をスタックに保持しておく探索方法です。

 

再帰呼び出しの代わりに、位置をスタックにプッシュしていきます。

 

アルゴリスムは以下の通りです。

 

  1. 処理のスタート地点の位置をスタックにプッシュ
  2. スタックからポップ
  3. 隣にまだ訪れていない場所があればプッシュ
  4. スタックが空になるまで2.3を繰り返す

 

こちらの方法の場合、スタックオーバーフローを回避することができます。

 

 

Pythonによる実装例

 

実装例は以下の通りです。

 

f:id:riririririn:20211208162418p:plain

Python言語での実装例

 

 

今回は一つ目の探索方法、再帰関数による探索を実装しました。

 

位置の管理については真偽値を格納する二次元リストで行っています。

 

サイズは入力で受け取るようにしています。

 

本来はもう少し受け取る入力がありますが、今回は再帰関数の実装例なので省略しました。

 

また例として使えそうな問題があれば更新していきます。

 

 

まとめ

 

今回のまとめは以下の通りです。

 

  • 深さ優先探索の基本は全箇所かた全方位への移動を試し尽くす探索
  • ある方位について探索し尽くした後、試していない箇所まで戻ってくる
  • 実現方法については二種類
  • 1つ目は、再帰関数による探索方法
  • 2つ目は、スタックによる探索方法
  • 1つ目はスタックオーバーフローに注意

 

以上です。

 

 

余談

 

スタックオーバーフローのようなエラーは競技プログラミングをするまではあまりみたことがありませんでしたね。

 

ただやり方がわかってコードが書ければいいってわけじゃないのか!と絶望した記憶があります。

 

日々勉強ですね。。。

 

では。

 

線形探索|Python|女子大生エンジニアの備忘録 #6

こんにちは、鈴です。

 

今回は、線形探索のアルゴリズムについてご紹介し、実際にPython言語を用いて実装したプログラムの例を使って解説をしていきたいと思います。

 

今回の記事でわからないところがあれば、前回の記事に基礎的な部分が記述してあるので、そちらも参照してみてください。

 

前回の記事はこちらから↓

 

 

では、早速行ってみましょう。

 

 

 

線形探索

前回の記事でも紹介しましたが、線形探索は

 

ランダムに値が格納された配列の中から目的のデータを見つけるためのアルゴリズム

 

です。

 

なぜランダムか、というと、整列済の配列の場合は線形探索ではなく他のアルゴリズム(二分探索など)の方が高速に処理ができるからです。

 

 

アルゴリズム

 

線形探索のアルゴリズムをご紹介します。

 

ランダムに値が格納された配列の中から変数xに格納された値と同じ値を検索し、見つけた場合はその値の配列中でのインデックス番号を返す場合を考えます。

 

  • 配列arrayを受け取る(または値を格納して初期化する)
  • 値xを受け取る(または値を格納して初期化する)
  • インデックスを受け取る変数posを初期化する
  • 繰り返し処理を行い、array[i]とxが等しい場合、pos=iとして終了
  • posを出力

 

ポイントとしては、posの初期値を配列のインデックスとしてはありえない値に設定することが重要です。

 

そうすることでposが初期値のままだった場合、「同じ値が見つからなかった」と判断することができます。

 

 

Pythonでの実装例

 

上記の例に沿って、実際に実装したプログラムは以下の通りです。

 

f:id:riririririn:20211206203846p:plain

プログラム例

 

今回は、配列も値xも初期値として与える形式にしました。

 

インデックスを返す処理なので、for文で配列の長さを範囲としてインデックス番号を更新していく形式での記述が最適です。

 

また、配列の番号は0からスタートするため、posの初期値は-1としました。

 

上記の例には例外処理を追加しているのですが、posの初期値の値を配列内に存在しない値に設定することで、posが初期値のままだった場合に"Not exist."と出力することができます。

 

一つ注意点として、このプログラムでは配列内に同じ値が複数あった場合、一番最後に出てきた値のインデックスを返します。

 

 

最初のインデックスを返したい場合は、以下のように記述します。

 

f:id:riririririn:20211206204748p:plain

プログラム例・改

 

最初に値が一致した時点でループを抜ける処理を追加しています。

 

これによって最初のインデックスを得ることができます。

 

まとめ

今回の記事のポイントを簡単にまとめると、以下のようになります。

 

  • 線形探索はランダムな値が格納された配列に対して有効
  • すでに整列している(ソート済み)の配列に関しては別のアルゴリズムのが適している
  • インデックスを受け取る場合、初期値の設定に注意
  • 最初に値が一致するインデックスのみを返す場合、ループを抜ける処理の記述が必要

 

 

余談

 

前回の記事をベースに引き続き線形探索についてつらつらと書いてきました。

 

一致する値の中でどのインデックスを返したいかによっても記述が若干変わってくるので、自分は何を求めたいのかをちゃんと考えて書くことが大切ですね。

 

閲覧ありがとうございました。

 

ではまた。

 

配列の合計値を求める|Python|女子大生エンジニアの備忘録 #5

こんにちは、鈴です。

 

今回はあらかじめ与えられている、または入力で受け取っている整数型の値が格納された配列の合計値を求める方法についての備忘録になります。

 

比較的簡単な内容となっておりますので、安心してください。

 

前回の記事はこちら↓

 

riririririn.hatenablog.com

 

では早速行ってみましょう!

 

 

 

線形探索

ランダムな配列の中から目的のデータを見つける方法を線形探索(sequential search)と呼びます。

 

線形探索では、繰り返し処理(ループ)で配列を処理します。

 

線形探索の前段階として、今回は配列の合計値を求める場合について取り扱っています。

 

アルゴリズム

アルゴリズムは以下のようになります。

 

  1. 配列の値を受け取る(または定義する)
  2. 合計値を格納する変数(ここではsumとする)を0で初期化
  3. 配列の中の全ての値について、sum = sum + 値xの処理を繰り返す
  4. sumの値を表示

 

いくつかポイントを整理しますね。

 

sum = 0

繰り返し処理を行う上で大切なのがループ中に使用する変数を事前に初期化しておくことです。

 

この初期化を忘れてループ処理を実行してしまうと、事前に定義されていない変数に対して値を代入することになるため、正確な値が計算できなくなってしまいます。

 

sum = sum + 値

プログラミングの世界で使用する=は計算式の=とは異なります。

 

具体的には、左の変数に右の計算結果を格納することを表します。

 

そのため、sum = sum + 値x の場合、

 

  1. 元々のsumの値とxの値を加算
  2. 計算結果を変数sumに上書き

という処理が実行されています。

 

Pythonでのプログラム例

 

ここからは、3つほどプログラム例を記述します。

 

例1

まず、基本形として、以下のような場合のプログラムを記述します。

 

  • 配列の値は初期値で与えたもの
  • forループで受け取る配列のインデックスを更新して繰り返し処理

 

f:id:riririririn:20211206195322p:plain

プログラム例1

 

プログラムは上記の通りです。

 

len(a)で、配列の長さを受け取り、iを0からその値を超えない範囲で繰り返しインクリメント(+1)していきます。

 

 

例2

次の例は、以下のような仕様になっています。

 

  • 配列を入力として受け取る
  • for文で配列の各値を直接受け取り加算

 

f:id:riririririn:20211206195637p:plain

プログラム例2

整数型の配列を入力として受け取る際の記述は上記のようになります。

 

一行の記述で以下の処理が行われています。

 

  1. input().split()で1行分の入力を分割して受け取る
  2. map(int...)で受け取った値を整数型に変更
  3. list()で入力値をリストに格納

 

Pythonでは入力値がデフォルトで文字列型になるため、整数として演算を行いたい今回のような場合には整数型に変換する必要があります。

 

また、for文についての記述も先ほどを変わっています。

 

range()なしで配列をinの後ろにそのまま記述することで、配列の各値を先頭からそのまま受け取ることができます。

 

 

例3

最後の例は以下のような仕様になっています。

 

  • 配列は入力で受け取る
  • 繰り返し処理をwhile文で記述

f:id:riririririn:20211206200603p:plain

プログラム例3

 

例2と異なる点はループ処理ですね。

 

while 条件式 で、条件式が真の間ループをする処理を記述することができます。

 

while文は条件の指定を間違えると無限ループになってしますので注意してください。

 

上記の例では例1同様に変数iに配列のインデックスを格納しています。

 

iの値の更新を自分で記述しないといけない点がfor文と異なりますね(この記述を忘れると無限ループになります)。

 

 

まとめ

いかがだったでしょうか。

 

今回のポイントは以下の通りです。

 

  • 配列から目的のデータを見つけるような処理を線形探索と呼ぶ
  • 線形探索の場合にはループ処理が有効
  • 繰り返し処理の中で値を更新する変数は、ループの前に初期化しておく
  • ループ処理にはfor文での記述、while文での記述がある
  • while文の場合は無限ループに注意

 

線形探索は基本的な処理なので、競技プログラミングなどでも頻繁に利用します。

 

そのうちもう少し難しい探索法についての記事も書いていけたらと思います。

 

 

余談

 

while文を使う時は今でも無限ループに陥ってエラーになることが多々あります。

 

競技プログラミングを始める前は線形探索で全ての処理がなんとかなると思っていたくらい、簡単な実装ではこの線形探索が活躍しますね。

 

次の記事はこちらから↓

 

riririririn.hatenablog.com

 

 

ではまた。

 

 

メルカリの送料を安くする方法|女子大生の副業メモ #2

こんにちは、鈴です。

 

今回は、タイトルにある通り、メルカリの送料を安くする方法について記事になります。

 

この記事は、

 

  • 高さ3センチを少し超えそうなものを送りたい
  • 匿名配送を使いたいけど送料が高くて困っている
  • 対面ではない方法で商品を発送したい
  • 手持ちの梱包資材で発送したい

 

というような方の参考になるかと思います。

 

では、早速本題に移りましょう。

 

 

ゆうパケットポスト

結論から先に述べますが、送料を安くする方法はゆうパケットポストを利用する方法です。

 

専用箱を購入してポストにそのままできる発送方法として、メルカリをやっている方ならご存知の方法かと思います。

 

このゆうパケットポストに、今年の夏頃から新しいシステムが追加されました。

 

発送用シール

その新しいシステムとは、発送用シールを購入して専用箱なしで発送できるというものです。

 

発送用シールとは、以下のようなものです。

 

f:id:riririririn:20211201130035j:plain

ゆうパケットポストの発送用シール

このシールは20枚入り100円で郵便局で購入できます。

 

一部を除く全国の郵便局で販売されているので、お近くの郵便局でチェックして見てください。

 

郵便局で取り扱いがない場合は、ローソンなどコンビニでも10枚入りのものが販売されているようです。

 

サイズ規定

この発送用シールを使ったゆうパケットポストによる発送で取り扱い可能なサイズは以下の通りです。

 

  • 3辺合計60cm以内
  • 長辺34cm以内
  • 郵便ポストに投函可能

 

以上の3つの条件を満たせばどのようなものでも発送可能なようです。

 

発送手順

発送手順は、

 

  1. シールについている二次元バーコードを読み取る
  2. 梱包済みの商品にシールを貼る
  3. お近くの郵便ポストに投函する

 

たったのこれだけです。

 

ネコポスやゆうパケットと同様で、手持ちの梱包資材で梱包OKな上、非対面で発送が可能です。

 

この方法を使うと厚手の冬物衣料などの送料が匿名配送のままで大幅に節約できます。

 

送料を抑えたい方は是非参考にして見てください。

 

まとめ

 

ゆうパケットポストの発送シールを使うメリットまとめです。

 

  • 厚さ3センチ以内からポストに投函出来ればOKに
  • 対面発送の手間なし
  • 送料は200円+シール代
  • 匿名配送可能
  • 専用箱の購入不要
  • 発送シールは郵便局、コンビニで購入可能
  • シールは郵便局なら20枚100円

 

 

余談

私は現在大学4年生で、就職を機に県外に転居することが決まっています。

 

そのため夏頃からメルカリを利用して荷物をコツコツと整理しているのですが、匿名配送を使うとどうしても送料がかかってしまいがちですよね。。。

 

かといって全く知らない人に住所を把握されてしまうのも怖いですし。

 

メルカリやラクマなど、フリマサイトを利用する人は年々増えているので、もっともっと発送方法が充実してくるのではないかと思います。

 

余分なコストを抑えて、効率よくお小遣い稼ぎをしていきたいですね。

 

関連記事はこちら↓

 

riririririn.hatenablog.com

 

 

ではまた。

 

 

ベクトル解析|ナブラ|女子大生の備忘録 #5

こんにちは、鈴です。


今回はベクトル解析についての備忘録です。


ここ最近勉強する機会があったので、内積外積、ナブラ演算子の公式などをまとめて記録していきます。


前回の記事はこちらから↓

riririririn.hatenablog.com


では、早速本題に移りましょう。



以下の2つのベクトルについて考えます。

f:id:riririririn:20211130204009p:plain
ベクトルの定義

この時、i, j, kはそれぞれが直交する単位ベクトル(大きさ1のベクトル)です。


内積(ドット積)

f:id:riririririn:20211130203729p:plain
内積の公式

内積は上の公式によって求められます。


高校数学で学んでいる人も多いと思うので、これは問題ないかと思います。


ベクトルを絶対値記号で囲った値はベクトルの大きさを示したもので、2行目のように計算して求めることができます。


外積(クロス積)

f:id:riririririn:20211130203751p:plain
外積の公式

外積は上の公式によって求められます。


行列を扱うので見た目には難しそうですが、各単位ベクトルについて、垂直方向以外に存在する4つの値を対角線上で掛け合わせて計算しているだけです。


慣れないうちは行列式も省略せずに記述したほうが計算ミスする確率が下がるのでオススメです。


ナブラ演算子

f:id:riririririn:20211130203806p:plain
ナブラ演算子

上はナブラ演算子の定義になります。


以降のベクトル解析で使用する演算子になりますが、この演算子の定義さえ覚えておけば以降の公式については知識の組み合わせで解けるようになっています。


ここで、スカラー場f、ベクトル場Fを以下のように定義します。

f:id:riririririn:20211130204119p:plain
スカラー

f:id:riririririn:20211130204132p:plain
ベクトル場

勾配

f:id:riririririn:20211130203829p:plain
勾配の公式

勾配は上の公式によって求められます。


一見難しそうに見えますが、ナブラの単位ベクトルごとに定数fをかけているだけだと思えば簡単です。


発散

f:id:riririririn:20211130203843p:plain
発散の公式

発散は以上の公式によって求められます。


これはベクトルであるナブラ、Fの内積です。先ほどのベクトルの基礎知識があり、左辺の意味が理解できれば暗記しなくても解けるようになっています。


回転

f:id:riririririn:20211130203900p:plain
回転の公式

回転は以上の公式によって求められます。


もうお分かりかと思いますが、これはナブラとFの外積に等しいです。


ラプラシアン

f:id:riririririn:20211130203914p:plain
ラプラシアンの公式

最後はラプラシアンの公式です。


これは今までの公式とは形式が異なりますが、ナブラとナブラに定数fをかけたもの(=ベクトル)の内積だと考えれば右辺の意味が理解できると思います。


まとめ

ナブラ演算子はベクトルと同じ扱い方ができるので、ベクトル解析の基礎、内積外積の公式さえ覚えていれば、丸暗記せずとも解くことができます。


大事なのは基礎固めですね。


余談

はてなブログで数式書くのはなかなか難しかったので、一度LaTeXを用いてファイルを作って切り取って貼るという雑な手法を使ってしまいました。


読み込みに時間がかかってしまったらすみません。


ナブラ演算子については、初め丸暗記しようとしていたのですが、意味がわかれば「全然暗記しなくていいじゃん」となりました。


力技でどうにかしようとするのではなく一度考え方を工夫して見ることが大事ですよね・・・。


「こんなのもう知ってるよ!」って方は大多数かと思いますが、私と同じく力技を使いかけた少数の方たちの参考になれば幸いです。


では。



尺取り法|Python|女子大生エンジニアの備忘録 #4

こんにちは、鈴です。

 

今回は尺取り法についての備忘録になります。

 

前回の備忘録はこちらから↓

 

riririririn.hatenablog.com

 

 

 

前置きは省略して、早速本題に移りましょう。

 

 

 

尺取り法とは

尺取り法とは、区間の左端と右端を動かしながら条件を満たす区間を高速に見つけるというアルゴリズムです。

 

この区間の端と端の動きを尺取り虫に例えてこのような名前で呼ばれているようです。

 

Pythonでの実装例

 

例題として、以下の場合を考えます。

  • 入力1:整数のリストS
  • 入力2:整数K
  • 出力:S内で和がK以下となる最大の要素数
  • sum(l,r):S[l]からS[r]までの和を返す関数

f:id:riririririn:20211128191215p:plain

Python言語での尺取り法の例

尺取り法をざっくり解説すると、

  • 左端を0に固定して条件を満たすできるだけ遠くに右端を固定
  • 左端を1つ右に動かしてさらにできるだけ遠くに右端を固定
  • 以上の操作を繰り返し、一番長かった区間の長さを出力

という流れです。

 

区間が伸び縮みして尺取り虫のように進んでいるのがなんとなくイメージできますかね。

 

 

余談

 

皆さんはAtCoderという競技プログラミングのコンテストをご存知ですか?(このページを見て頂いている時点で失礼な質問かもしれませんが・・・)

 

私はなるべく毎週AtCoderのABC(AtCoder Begginer Contest)に参加するようにしているのですが、先週のABCでこの尺取り法が登場して解けませんでした。

 

まだまだ自分は勉強不足だということを痛感しております。

 

就職を控えた大学4年生にして今だに茶色コーダーなので、卒業までに頑張って緑に到達したいものですね・・・。

 

問題にチャレンジしてみたいという方は、ABC229のD問題をチェックして見てください。

 

次の記事はこちらから↓

 

riririririn.hatenablog.com

 

 

 

では。