20201227のGitに関する記事は8件です。

Goでドコモメールimap受信

Goでドコモのキャリアメールを受信するサンプル実装

package main

import (
    "io"
    "io/ioutil"
    "log"
    "os"

    "github.com/emersion/go-imap"
    "github.com/emersion/go-imap/client"
    "github.com/emersion/go-message/mail"
)

func main() {
    c := login()

    defer c.Logout()

    viewMailBox(c)
    viewInBox(c)
}

func login() *client.Client {
    c, err := client.DialTLS("imap.spmode.ne.jp:993", nil)
    if err != nil {
        log.Fatal(err)
    }
    if err := c.Login("account_id", "password"); err != nil {
        log.Fatal(err)
    }
    return c
}

func viewMailBox(c *client.Client) {
    mailboxes := make(chan *imap.MailboxInfo, 10)
    done := make(chan error, 1)
    go func() {
        done <- c.List("", "*", mailboxes)
    }()

    for m := range mailboxes {
        log.Println("* " + m.Name)
    }

    if err := <-done; err != nil {
        log.Fatal(err)
    }
}

func viewInBox(c *client.Client) {
    mbox, err := c.Select("INBOX", false)
    if err != nil {
        log.Fatal(err)
    }

    if mbox.Messages == 0 {
        log.Fatal("No message in mailbox")
    }
    seqSet := new(imap.SeqSet)
    seqSet.AddNum(mbox.Messages)

    var section imap.BodySectionName
    items := []imap.FetchItem{section.FetchItem(), imap.FetchEnvelope}

    messages := make(chan *imap.Message, 1)
    go func() {
        if err := c.Fetch(seqSet, items, messages); err != nil {
            log.Fatal(err)
        }
    }()

    msg := <-messages
    if msg == nil {
        log.Fatal("Server didn't returned message")
    }

    r := msg.GetBody(&section)
    if r == nil {
        log.Fatal("Server didn't returned message body")
    }

    mr, err := mail.CreateReader(r)
    if err != nil {
        log.Fatal(err)
    }

    log.Println("Subject:", msg.Envelope.Subject)

    header := mr.Header
    if date, err := header.Date(); err == nil {
        log.Println("Date:", date)
    }
    if from, err := header.AddressList("From"); err == nil {
        log.Println("From:", from)
    }
    if to, err := header.AddressList("To"); err == nil {
        log.Println("To:", to)
    }

    // Process each message's part
    for {
        p, err := mr.NextPart()
        if err == io.EOF {
            break
        } else if err != nil {
            log.Fatal(err)
        }

        switch h := p.Header.(type) {
        case *mail.InlineHeader:
            b, _ := ioutil.ReadAll(p.Body)
            log.Println("Got text: ", string(b))
        case *mail.AttachmentHeader:
            filename, err := h.Filename()
            if err != nil {
                log.Fatal(err)
            }

            log.Println("Got attachment: ", filename)

            b, _ := ioutil.ReadAll(p.Body)
            if err != nil {
                log.Fatal(err)
            }

            file, err := os.Create(`./imap/attachment.txt`)
            if err != nil {
                log.Fatal(err)
            }
            defer file.Close()

            if _, err = file.Write(b); err != nil {
                log.Fatal(err)
            }
        }
    }
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Git】git push 〜引数を省略した時の挙動〜

はじめに

僕は、いつもヒヤヒヤしながらgit pushを実行しています。
なぜかというと、git pushは、設定によって挙動が違うからです。
そんな、私の寿命を1秒でも伸ばすために、git pushのオプションの挙動をまとめます。

引数を省略しない(正式なフォーマット)

$ git push origin main

第1引数(origin等) ・・・ リポジトリ名
第2引数(main等) ・・・ ブランチ名

origin(リモートリポジトリ)のmainブランチにローカルブランチがプッシュされます。いちいちorigin masterって打つの面倒くさいですよね〜


※ここは完全に余談

origin ・・・ リモートリポジトリのURL

$ git remote -v // リモートリポジトリのURLを表示

origin  https://github.com/westhouseK/git_demo.git (fetch)
origin  https://github.com/westhouseK/git_demo.git (push)

もし何も表示されない方は、以下でリモートリポジトリのURLを登録できます。

【SSH登録している人】
$ git remote add origin git@github.com:westhouseK/git_demo.git

【SSH登録していない人】
$ git remote add origin https://github.com/westhouseK/git_demo.git

【本題】 引数を省略する

$ git push

種類

push.default 詳細
nothing 何もプッシュしない
current 現在のブランチを同名リモートブランチとしてプッシュする
upstream 現在のブランチの上流ブランチにプッシュする
simple 現在のブランチを同名の上流ブランチにプッシュする
matching すべてのローカルブランチを同名のブランチにプッシュする

上流ブランチ ・・・ リモートの履歴を追跡するブランチ

Gitのバージョン1.x系ではmatchingが、バージョン2.x系ではsimpleがデフォルトになっています。

現在の設定を確認するには・・・

$ git config --global push.default

設定するためには・・・

$ git config --global push.default simple

★ nothing

$ git push
fatal: You didn't specify any refspecs to push, and push.default is "nothing".

「引数をしていないから、プッシュできない」って怒られますね。ある意味、一番安全ですが、面倒くさいですね。

★ current

$ git push
To github.com:westhouseK/git_demo.git
 * [new branch] current_demo -> current_demo

$ git branch -vv
* current_demo 368c172 first commit
  main         368c172 first commit

現在と同名のブランチをプッシュするようです。
ちなみに、同名のブランチがリモートにあると、ちゃんと怒られるみたい。

error: failed to push some refs to 'git@github.com:westhouseK/git_demo.git'

★ upstream

$ git push
fatal: The current branch upstream_demo has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin upstream_demo


$ git push --set-upstream origin upstream_demo
To github.com:westhouseK/git_demo.git
 * [new branch]      upstream_demo -> upstream_demo
Branch 'upstream_demo' set up to track remote branch 'upstream_demo' from 'origin'.

$ git branch -vv
  main          368c172 first commit
* upstream_demo 368c172 [origin/upstream_demo] first commit
                         ↑上流ブランチ

上流ブランチが設定されていないと、プッシュすることができません。上記のように、プッシュの時に上流ブランチをセットするか、個別に上流ブランチをセットする必要があります。変なことはしなさそうな挙動ですね。

★ simple

【上流ブランチが設定されていない場合】
$ git push
fatal: The current branch simple_demo has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin simple_demo


【設定されている上流ブランチ名と現在のブランチ名が異なる場合】
$ git push
fatal: The upstream branch of your current branch does not match
the name of your current branch.  To push to the upstream branch
on the remote, use

    git push origin HEAD:dev

To push to the branch of the same name on the remote, use

    git push origin HEAD

上流ブランチがセットされていない、上流ブランチがローカルブランチと違うと、プッシュできない模様。Git 2.x系のデフォルトになっているだけあって、安心といえば安心。ただ、simpleではない笑。

★ matching

$ git push
To github.com:westhouseK/git_demo.git
   368c172..3cf3d12  test1 -> test1
   368c172..2b3f77e  test2 -> test2

ローカルにあるすべてのブランチをプッシュします。test1だけをプッシュしたつもりが、test2もプッシュされます。怖すぎです。
ただ、リモートにブランチがない時、以下のようにプッシュされないようです。

$ git push
Everything up-to-date

まとめ

  • Gitのバージョンによって、挙動が違うので注意
  • Git 1.x系ではmatching、2.x系ではsimpleがデフォルト
  • ローカルブランチをリモートと同じ名前で作っていれば、事故らなそう
  • matchingには、しない方が無難!
  • ちなみに、私はcurrent

これで僕も長生きができそうです。間違ったこと書いてあったら、言ってください。人の寿命は削りたくないので?

参考サイト

公式

https://git-scm.com/docs/git-config

参考

https://gotohayato.com/content/116/
https://www-creators.com/archives/4931
https://www.yunabe.jp/docs/relearning_git_push_default.html
https://qiita.com/tamata78/items/09cc89ed87f022668d80

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【CentOS】Gitの指定バージョンをダウンロードしてビルドする

あまりにも毎回忘れるのでスクリプトを作りました。

結論

以下のようにバージョン名を指定してGitをインストールできるプログラムを公開しました。
リポジトリ:Polarbear08/centos-git-installer

# ./installer.sh 2.29.2

詳細はREADMEを参照してください。

モチベーション

  • Gitは時々脆弱性が発表されてアップデートを促してくる割にはパッケージマネージャでは最新版が入らない
  • 最新版を入れるためにソースからビルドする方法を毎回検索していてよろしくない
  • 多分探せば類似リポジトリはあるけれどシェルスクリプトの練習をしたい

スクリプトの内容

installer.sh
#!/bin/bash

# verify input
VERSION=$1
if [[ $VERSION =~ [1-9]+\.[0-9]+\.[0-9] ]]; then
        GIT_DIR=git-$VERSION
        GIT_TAR=$GIT_DIR.tar.gz
        URL="https://mirrors.edge.kernel.org/pub/software/scm/git/$GIT_TAR"
else
        echo -e "Usage:\t $0 <VERSION>"
        echo -e "e.g.)\t $0 2.29.2"
        exit 1
fi

# install wget for downloading git
yum install -y wget

# confirm installation
wget -q --spider $URL
if [ $? = 0 ]; then
        echo "install git version $VERSION"
else
        echo "something seems wrong with URL: $URL"
        exit 1
fi

# install dependencies
yum install -y \
        curl-devel \
        expat-devel \
        gettext-devel \
        openssl-devel \
        perl-devel \
        zlib-devel \
        gcc \
        make

# download and install git
mkdir -p /usr/local/src
cd /usr/local/src
wget https://mirrors.edge.kernel.org/pub/software/scm/git/${GIT_TAR}
tar xf ${GIT_TAR}
rm -f ${GIT_TAR}

cd ${GIT_DIR}
make prefix=/usr/local all
make prefix=/usr/local install

# completion notice
git version > /dev/null  && echo "$(git version) was successfully installed"

文字コードで変なエラー踏んだら嫌なのでASCII文字だけにしています。

参考

  • セマンティック バージョニング 2.0.0
    セマンティックバージョニングに従ったバージョン名を識別する正規表現が記載されています。 今回はそんないかついパターンは必要なかったですが参考にしました。
  • Gitのインストール
    公式ドキュメントです。gitのビルドに必要な依存関係が示されています。gccとmakeは載ってないんですが必要でした。DockerHubのcentosイメージを使ったため普通はデフォルトで入っているパッケージが入っていなかったのかもしれません。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Gitの設定やあれこれ

はじめに

Windows10におけるGitの導入と使用するコマンドについてまとめる

インストール手順

日本語パックのアドインを追加することでUIを日本語化させる

  1. Gitのダウンロード

    サイトに移動してWindowsを選択

    2020-12-20-14-22-49.png

  2. インストール

    1. インストール先の選択
      任意のパスを選択
      2020-12-20-14-29-22.png
    2. コンポーネントの選択
      特に変更なし
      2020-12-20-14-31-23.png
    3. スタートメニューフォルダの選択
      特に変更なし
      2020-12-20-14-33-09.png
    4. デフォルトエディタの選択
      VSCodeに変更
      2020-12-20-15-34-20.png
    5. 初期ブランチ名の調整
      特に変更なし
      2020-12-20-15-58-14.png
    6. PATH環境の調整
      特に変更なし
      2020-12-20-15-59-38.png
    7. HTTPS通信に使用するライブラリの選択
      特に変更なし
      2020-12-20-16-02-48.png
    8. 改行文字コードの設定
      特に変更なし
      2020-12-20-16-12-11.png
    9. コンソールの設定
      特に変更なし
      2020-12-20-16-13-39.png
    10. git pullコマンドの設定
      特に変更なし
      2020-12-20-16-27-35.png
    11. 認証管理の設定
      特に変更なし
      2020-12-20-16-33-30.png
    12. 追加オプションの設定
      特に変更なし
      2020-12-20-16-40-47.png
    13. 実験機能の使用するかの設定
      特に変更なし
      2020-12-20-16-45-06.png

初期設定

アカウント名・メールアドレスの設定

git config --global user.name "ユーザー名"
git config --global user.email メールアドレス

アカウント名・メールアドレスの確認

git config --global user.name
git config --global user.email

コマンド

ローカルリポジトリの初期化

cd 対象のフォルダパス
git init

ステージングエリア関する操作

# ステージエリアへの一括追加
git add パス
# ステージエリアへのワークツリーから削除したことも含めて追加
git add -a パス
# ステージエリアへの.gitignoreで対象外としているファイルも追加
git add -f パス
# ステージエリアの変更をコミットする
git commit
# ステージエリアへの一括追加取り消し
git reset HEAD
# ステージエリアへの対象ファイル追加取り消し
git reset HEAD [File Name]

リモートリポジトリからのローカルに関する操作

#リモートリポジトリをローカルに複製する  
git clone URL
# リモートリポジトリパスの確認  
git remote -v
# リモートリポジトリパスの設定
git remote set-url origin [URL]
# リモートリポジトリパスにローカルリポジトリを紐づけ
git remote add origin リモートリモートリポジトリ.git

リモートリポジトリにローカルリポジトリの変更を登録

# git push リモート名 ブランチ名
git push -u origin master

ローカルリポジトリに関する操作

# ローカルリポジトリの状態を確認する
# ステージングに追加している状態なども確認
git status
# 現ブランチの確認
git branch
# ブランチの作成
git branch ブランチ名
# ブランチを切り替える
git checkout ブランチ名
git switch ブランチ名
# コミット前のカレントパスからの一括差分取り消し
git checkout .
git restore .
# コミット前の対象ファイル差分取り消し
git checkout [File Name]
git restore [File Name]

コミット内容をまとめる

# 例. HEADから3番目をまとめる
# 1. HEADから3番目を編集
git rebase -i HEAD~3
# 2. pickからsquashに変更
pick aaaa
squash bbbb
squash cccc

管理外ファイルの設定

リポジトリに管理しないファイルの設定方法を記載する

.gitignoreファイルを作成する

管理外設定したいフォルダに.gitignoreファイルを作成する

ルートにだけでなく、任意のフォルダ毎に作成可

コメントの記載

#で始まる行はコメントとして扱う

特定の拡張子を無視する

*.res
*.obj
*.exe

フォルダを無視する

.vs/

特定のファイルを無視しない

!/*/main.exe
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

GitHub -アカウント登録・リポジトリ作成・Push-

はじめに

GitHubのアカウント登録からリポジトリへPushまでの流れをまとめました。
備忘録のため&GitHub初挑戦の方の助けになれば幸いです。
なお、本手順を実施するにあたりGitコマンドが使える状態になっていることが
前提なので、まだGitをインストールしていない方は下記のページを参考に
Gitをインストールしてコマンドを使える状態にしてください。

前提

  • Windows
  • Gitのコマンドが使えること

・Gitインストール
https://qiita.com/ootukinnm/items/801abc921a826b5adcd0

目次

1. はじめに
2. 前提
3. アカウント登録
4. リポジトリ作成
5. Push

アカウント登録

公式:https://github.co.jp/

①公式ページに遷移し、「GitHubに登録する」ボタンを押下します。
img1.png
②「Username」「Email address」「Password」を入力し、
画面後半で「検証する」ボタンを押下して簡単な検証を行い、
OKが出たら「Create account」ボタンを押下します。
img2.png
img3.png
img4.png
img5.png
これでアカウントの作成は完了です。

リポジトリ作成

①画面右上のアイコンから「Your repositories」を押下します。
img6.png
②「New」ボタンを押下します。
img7.png
③Email確認画面に飛ぶので、設定したEmailに送られてきたメール内に
貼られているリンク先に遷移し、Emailの確認が完了したら
改めて上記ページに戻り、「New」ボタンを押下します。

④「Repository name」を入力し、「Create repository」ボタンを押下します。
img8.png
img9.png
img10.png
これでリポジトリの作成は完了です。

Push

①リポジトリを管理したい場所を用意します。
今回はデスクトップ上に「work」フォルダを作成します。

mkdir work & cd work

②作成したリモートリポジトリのHTTPSのURLをコピーします。
img10.png
③作成したリモートリポジトリをローカルにクローンします。

git clone {上記でコピーしたリモートリポジトリのURL}

img11.png
④クローンしたフォルダ内にプッシュしたいファイルを作成します。
今回は「test.txt」を作成します。

cd testRepo
copy nul test.txt
test.txt
hogehoge

⑤作成した「test.txt」をリモートリポジトリにPushします。

git add test.txt
git commit -m "initial commit"
git push {上記でコピーしたリモートリポジトリのURL}

img12.png
img13.png
以上です。
初投稿なので、こうしたほうがいいなどのご指摘があれば
コメントしていただければ幸いです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[=LOVE]青春"サブリミナル"を再現してみた

アイドルグループ「=LOVE」(イコールラブ、通称イコラブ)さんの8thシングル『青春"サブリミナル"』の歌詞の一部をGitとJavaScriptを使って再現してみました!

手順

gitリポジトリ内で行います。

jsファイルを設置

unkown_by_ut.js
const LOVE = 'love';
let answer

二行目末尾に改行を入れておくのがポイントです。

一つ目のコミット

git add .
git commit -m "さっきまで"

jsファイルに変更を加える

unkown_by_ut.js
const LOVE = 'love';
let answer
=LOVE

二つ目のコミット

git add .
git commit -m "その答え"

完成!

git log

を実行すると、

commit 12fb9840578f2410882ea0e1fa66ac832319d093 (HEAD -> master)
Author: user <user@sample.com>
Date:   Sun Dec 27 10:00:00 2020 +0900

    その答え

commit 2755bace9774959e9ef437c5db06e636ccd94a5a
Author: user <user@sample.com>
Date:   Sun Dec 27 10:00:00 2020 +0900

    さっきまで

さらに

git diff 2755bace9774959e9ef437c5db06e636ccd94a5a 12fb9840578f2410882ea0e1fa66ac832319d093

を実行して、

diff --git a/unkown_by_ut.js b/unkown_by_ut.js
index 6966efa..90b7c6d 100644
--- a/unkown_by_ut.js
+++ b/unkown_by_ut.js
@@ -1,2 +1,3 @@
 const LOVE = 'love';
 let answer
+=LOVE
\ No newline at end of file

差分が「=LOVE」となります。

まとめ

と、いうわけで!
さっきまでと違うもの〜♪ その答えは「=LOVE」~♪
『青春"サブリミナル"』名曲なので、よかったら聴いて下さい!!

あと、ネタ被りを恐れてQiita内で「イコラブ」を検索したところ、
Twitterのいいね数を推定してみる
Twitterのいいね数推定の精度向上を図ってみる
という真っ当な記事を書いている方がいらっしゃいました。私も大場花菜ちゃん推しです。

では、お粗末様でした〜

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

環境構築の時に同じ名前のフォルダを何重にも作ってしまうパターンをやめたい

初投稿です。よろしくお願いします。

結論

最終的に思い至った完成形がこちら(命名で解決)
なお、ドキュメントとソースコードは一箇所で管理する前提
場合に応じて適宜階層を変更します

(プロジェクト名:MyProject)
.
├── 01_My_Project (自分で用意したフォルダ)
│   ├── ここにgit管理しないドキュメント等をおく
│   ├── ...
│   │
│   └── my-project (gitのリポジトリ名)
│       ├── ここに.gitファイルがある
│       ├── ...
│       │
│       └── myproject (プロジェクトファイル)

はじめに

一般的なツールで開発をしていると、プロジェクトファイルと呼ばれるものが自動作成されることが多い。
- flutter create myproject
- vue create myproject
- etc...

こちらであらかじめフォルダを準備していた場合、ツールが自動生成する名前とフォルダ名が被ってしまい、何重にも同じ名前のフォルダ構成になってしまうことがよくあった。
特に全体像がつかめていない頃は、「ここは好きな名前を書く」みたいな説明を読むたびに、毎回同じ名前をつけてしまっては自分で混乱していた。

(ダメな例)
.
├── myproject (自分で用意したフォルダ)
│   └── myproject (gitのリポジトリ名)
│       └── myproject (プロジェクトファイル)

そこで自分なりの解決方法をまとめておくことにした。

1. 記法を変える

  • 自分で用意したフォルダ
    • スネークケース
    • 大文字小文字は適当
    • PC上での見やすさを優先
.
├── My_Project
  • gitのリポジトリ名
    • 小文字のケバブケース
    • URLとして使われることを想定
.
├── My_Project
│   └── my-project
  • プロジェクトファイル
    • 単語間の境界なし
    • パッケージ名をイメージ
    • 基本全て小文字だが、使用ツールや見た目を優先して区切り目を作っても良い
.
├── My_Project
│   └── my-project
│       └── myproject

2. サフィックス(orプレフィックス) をつける

1と組み合わせながら使います

  • 自分で用意したフォルダ
    • ソースコード置き場であることを強調 _Source
    • ローカルであることを強調 _Local
    • あんまり思いつかなかった
.
├── My_Project_Source
  • gitのリポジトリ名
    • 1と同じ
.
├── My_Project_Source
│   └── my-project
  • プロジェクトファイル
    • プロジェクトファイルであることを短く強調 _pj
.
├── My_Project_Source
│   └── my-project
│       └── myproject_pj

さいごに

結局時と場合ですね。特に仕事だとリポジトリ名以下を決定するのは別の人の場合が多く、あんまり役に立つ機会は少ないかも知れません。
ここに書いたこと以外に良い構成がわかる方いましたら是非教えてください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

gitメモ

環境

Win 10 pro

コンピューター上のすべてのリポジトリについて無視するファイルを設定する

すべてのリポジトリでもvscodeやeclipceのプロジェクトファイルなど共有したくない場合とか

方法(.vscodeのファイルを無視する)

Git Bashを開く

git config --global core.excludesfile ~/.gitignore_global

echo .vscode >> ~/.gitignore_global
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む