- 投稿日:2020-12-27T22:10:13+09:00
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(§ion) 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) } } } }
- 投稿日:2020-12-27T22:06:35+09:00
【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
- 投稿日:2020-12-27T19:27:38+09:00
【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イメージを使ったため普通はデフォルトで入っているパッケージが入っていなかったのかもしれません。
- 投稿日:2020-12-27T16:56:05+09:00
Gitの設定やあれこれ
はじめに
Windows10におけるGitの導入と使用するコマンドについてまとめる
インストール手順
日本語パックのアドインを追加することでUIを日本語化させる
Gitのダウンロード
サイトに移動してWindowsを選択
インストール
初期設定
アカウント名・メールアドレスの設定
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
- 投稿日:2020-12-27T14:48:45+09:00
GitHub -アカウント登録・リポジトリ作成・Push-
はじめに
GitHubのアカウント登録からリポジトリへPushまでの流れをまとめました。
備忘録のため&GitHub初挑戦の方の助けになれば幸いです。
なお、本手順を実施するにあたりGitコマンドが使える状態になっていることが
前提なので、まだGitをインストールしていない方は下記のページを参考に
Gitをインストールしてコマンドを使える状態にしてください。前提
- Windows
- Gitのコマンドが使えること
・Gitインストール
https://qiita.com/ootukinnm/items/801abc921a826b5adcd0目次
1. はじめに
2. 前提
3. アカウント登録
4. リポジトリ作成
5. Pushアカウント登録
①公式ページに遷移し、「GitHubに登録する」ボタンを押下します。
②「Username」「Email address」「Password」を入力し、
画面後半で「検証する」ボタンを押下して簡単な検証を行い、
OKが出たら「Create account」ボタンを押下します。
これでアカウントの作成は完了です。リポジトリ作成
①画面右上のアイコンから「Your repositories」を押下します。
②「New」ボタンを押下します。
③Email確認画面に飛ぶので、設定したEmailに送られてきたメール内に
貼られているリンク先に遷移し、Emailの確認が完了したら
改めて上記ページに戻り、「New」ボタンを押下します。④「Repository name」を入力し、「Create repository」ボタンを押下します。
これでリポジトリの作成は完了です。Push
①リポジトリを管理したい場所を用意します。
今回はデスクトップ上に「work」フォルダを作成します。mkdir work & cd work②作成したリモートリポジトリのHTTPSのURLをコピーします。
③作成したリモートリポジトリをローカルにクローンします。git clone {上記でコピーしたリモートリポジトリのURL}
④クローンしたフォルダ内にプッシュしたいファイルを作成します。
今回は「test.txt」を作成します。cd testRepo copy nul test.txttest.txthogehoge⑤作成した「test.txt」をリモートリポジトリにPushします。
git add test.txt git commit -m "initial commit" git push {上記でコピーしたリモートリポジトリのURL}
- 投稿日:2020-12-27T10:49:09+09:00
[=LOVE]青春"サブリミナル"を再現してみた
アイドルグループ「=LOVE」(イコールラブ、通称イコラブ)さんの8thシングル『青春"サブリミナル"』の歌詞の一部をGitとJavaScriptを使って再現してみました!
手順
gitリポジトリ内で行います。
jsファイルを設置
unkown_by_ut.jsconst LOVE = 'love'; let answer二行目末尾に改行を入れておくのがポイントです。
一つ目のコミット
git add . git commit -m "さっきまで"jsファイルに変更を加える
unkown_by_ut.jsconst 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のいいね数推定の精度向上を図ってみる
という真っ当な記事を書いている方がいらっしゃいました。私も大場花菜ちゃん推しです。では、お粗末様でした〜
- 投稿日:2020-12-27T02:45:15+09:00
環境構築の時に同じ名前のフォルダを何重にも作ってしまうパターンをやめたい
初投稿です。よろしくお願いします。
結論
最終的に思い至った完成形がこちら(命名で解決)
なお、ドキュメントとソースコードは一箇所で管理する前提
場合に応じて適宜階層を変更します(プロジェクト名: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 │ └── myproject2. サフィックス(orプレフィックス) をつける
1と組み合わせながら使います
- 自分で用意したフォルダ
- ソースコード置き場であることを強調 _Source
- ローカルであることを強調 _Local
- あんまり思いつかなかった
. ├── My_Project_Source
- gitのリポジトリ名
- 1と同じ
. ├── My_Project_Source │ └── my-project
- プロジェクトファイル
- プロジェクトファイルであることを短く強調 _pj
. ├── My_Project_Source │ └── my-project │ └── myproject_pjさいごに
結局時と場合ですね。特に仕事だとリポジトリ名以下を決定するのは別の人の場合が多く、あんまり役に立つ機会は少ないかも知れません。
ここに書いたこと以外に良い構成がわかる方いましたら是非教えてください。