/// BANGBOO BLOG ///

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

January 3, 2016

Git

■Git
https://backlog.com/ja/git-tutorial/intro/01/

コマンドを使わずに理解するGit - Qiita
Gitを使いこなしたい!〜仕組みとコマンド24選〜 - Qiita
[初心者向け]GitとGitHubの使い方を徹底解説 - Qiita

Gitクライアント、Sourcetree/TortoiseGit etc
ローカルリポジトリとリモートリポジトリを作りソース管理、通常別途で運用サーバにデプロイ
 ローカルにリモート追跡ブランチ(リモートリポジトリのコピーをfetch)は
 originという名がつきorigin/ブランチ名、リモート/ローカルのデフォブランチは両方通常はmaster
 チェックアウトするとローカルの作業ソースの内容がその版に切り替わる
ワークツリー(作業)とインデックス(中間)を持ちローカル作業をindexにaddしcommit
バグ修正や機能追加などの異なる意味を持つ変更は、できるだけ分けてコミット
コメント 1行目 : 変更内容の要約 2行目 : 空行 3行目以降 : 変更した理由

cloneで、リモートリポジトリの内容を丸々ローカルリポジトリとしてDL
Pullで、リモートリポジトリから最新の変更履歴をローカルリポジトリにDL

Staged changes(index)に入れる → コメントを付記しCommitする
PushしリモートリポジトリにUPする(fast-forwardマージ)

///ブランチ運用モデル https://backlog.com/ja/git-tutorial/stepup/05/
master(デフォ)
hotfix
release
develop
feature
 masterとdvelopの2つがメインブランチで大きな流れ
 releaseブランチでリリースの調整、ブランチ名にrelease-をprefix
 緊急修正の場合hotfixブランチで調整、hotfix-をprefix
 featureブランチで機能追加しdevに纏める
※もしUAT/QAサーバがあるならmaster/developに加えてもう一本QAブランチがあってもいい



使用(ワークツリー)のブランチを切り替えるにはチェックアウト
HEADとは現在使用しているブランチの先頭を表す(更新の先頭のイメージ)

stashでコミットしていない変更を退避させ、今すぐやりたい作業をしてから、退避させていた変更を取戻して作業を再開することができる(変更があればcommitするまでブランチを切り替えができない)

mergeは複数のブランチを統合し両方の変更を取り込んだマージコミットが作成されます。masterブランチの先頭はそのコミットに移動。non fast-forwardを行うとブランチがそのまま残る

rebaseはmasterブランチの前に別ブランチの内容を付与する。先頭はmasterブランチのままなので、mergeもする。トピックブランチに統合ブランチの最新のコードを取り込む場合はrebaseを使う。iオプションでコミット書換、入替、削除、統合の制御可 git pull --rebase
git pull と git pull –rebase の違いって?図を交えて説明します! – KRAY Inc.
git pull --rebaseをpushする前にやろうという話。 - Qiita

pullを実行してから次のpushをするまでの間に、ほかの人がpushをしてリモートリポジトリを更新してしまっていた場合、マージを行なって他の履歴での変更を取り込むまで自分のpushは拒否されます(競合)マージは自動統合を行うが同じ箇所の場合はエラー。解決をして自分でコミットする必要がある

fetchは単にリモートリポジトリの内容を確認したいだけの時。ローカルに統合したい時はFETCH_HEADをマージするか、改めてpullを実行します

軽量タグと注釈付きタグの2種類。軽量タグはローカルで一時的に使用。タグで過去に戻せる

amend:直前のコミットを修正
revert:指定したコミットを打ち消すコミット
reset:コミットを捨てる
 変更したインデックスの状態を元に戻す(mixed)
 最近のコミットを完全に無かったことにする(hard)
 コミットだけを無かったことにする(soft)
cherry-pick:指定のコミットを現在のブランチに取り込む
mergeのsquashオプション:該当ブランチの全コミットを一つのコミットに纏めて統合

(競合は修正してaddし直したいが、、、)
fetchでエラーがあれば git reset --hard HEAD で作業を取り消し
pullでエラーがあれば git merge --abort と git reset --hard HEAD でマージと作業取り消し
githubでマージエラーがあれば git checkout kuso-sagyo > git pull origin master > 競合解消作業 > git commit > git push origin HEAD

プルリクエスト https://backlog.com/ja/git-tutorial/pull-request/03/
機能追加や改修など作業内容をレビュー・マージ担当者やその他関係者に通知する
 プッシュされたコミットは自動的にプルリクエスト上に反映
 プルリクエストは一覧され未完了のプルリクエストを確認しレビュー・マージ担当者は漏れなく処理可
 ソースコードの変更箇所をわかりやすく表示、コメントのやり取り可
1[開発者] 作業対象のソースを clone または pull
2[開発者] 作業用のブランチを作成
3[開発者] 機能追加、改修といった開発作業
4[開発者] 作業が完了したら push
5[開発者] プルリクエストを作成
6[レビュー・マージ担当者] 通知されたプルリクエストから変更を確認しレビュー
7[レビュー・マージ担当者] レビュー結果を判断し必要ならば開発者にフィードバック
8[レビュー・マージ担当者] レビューの結果、問題がない場合はマージ
9[レビュー・マージ担当者] レビューの結果、対応自体が不要となるなど、プルリクエスト自体が必要ない場合はクローズ




====================
Gitクライアント Sourcetree
https://eng-entrance.com/sourcetree-use
https://tracpath.com/bootcamp/learning_git_sourcetree.html

新しいverのSourcetreeではインストールができなかった ver 2.6.10.0ならOK
https://www.sourcetreeapp.com/download-archives
 IEは上手く動かず Chromeを使う こちらでもインスコはできなかったが
 SSH鍵をputtyで https://webkaru.net/linux/putty-ssh-login-public-key/
 データフォルダに.gitフォルダがあるので別のGITクライアントでもデータフォルダをDDするだけ
 文字化けはKB4074906では直らなかった、UTF8⇔Shift-jisでも直らん?

Virtualbox等のLinux環境でインストールが良いかも?
sudo apt-get install git だったかと

gitのバージョンを上げる
プロキシを引き継ぎながら最新GITを取れるように ppaをリポジトリに追加
sudo -E add-apt-repository ppa:git-core/ppa
sudo apt update
sudo apt upgrade
git --version
====================
git init --bare --shared 空のリモートリポジトリ(ワークツリーのない開発メンバー全員で使う共有のリポジトリ)を作成
 git remote add origin https://github.com/YY/XX.git リモートリポジトリに名前設定:git remote add [追加リモートリポジトリ名] [追加する場所リポジトリ]
 git remote -v リモートリポジトリの確認

git init 各人使用したいローカルディレクトリに移動しリポジトリ(dir)の.gitを作成
git status 状態確認

git clone https://github.com/YYYYYY/XXXXX.git リモートリポジトリのクローンをローカルに作成
 ※作成した場所にcdし実行、リポジトリのフォルダもできるのでローカルの/home/おまはん/repoで実行でよい
 git clone ssh://user@hostname/path/to/repos GitHub用(鍵登録しssh)

git branch 移動できるブランチとカレントを表示
 git branch -a ブランチの一覧を見る(リモート側?)
git checkout master ローカルの使用ブランチを切替

git pull origin master リモートの該当ブランチをローカルの使用中のブランチに(git pull=fetch+merge)
 git fetch origin master リモートのデータをリモート追跡ブランチに取り込む(変更点を確認
 git merge origin/master リモート追跡ブランチにある変更点を取り込む
 【Git基礎】git push origin masterのmasterはローカル/リモートどっちのこと? #Git - Qiita
  git fetch origin master はリモート側のマスターブランチを差す
  git push origin master はローカル側のマスターブランチを差す
   ソース:行き先 が本来だが行き先が省略されている


git checkout -b hotfix ブランチhotfixへ移動(-bをつける事でカレントから新規にブランチを作成し移動)
 git branch hotfix ブランチhotfixを作成(カレントから?
 git checkout hotfix ローカルの使用ブランチを切り替え
 ※hotfixで修正する場合

git checkout a.txt 特定ファイルの変更を取り消す
git checkout . add前の未追跡編集ファイルの取り消し、作業を取消し別ブランチ切替ができるように
git clean -df . add前の未追跡新規ファイルの取り消し
git reset HEAD . addを取り消し
gitでいろいろ取り消したい #Git - Qiita

git add a.txt 削除したファイルをaddでリポジトリから削除
git rm a.txt リポジトリから削除しディレクトリからも削除
git rm --cached a.txt リポジトリから削除するがディレクトリには残す
 rm a.txt ディレクトリから削除、リポジトリには残す

git add -n . アドの対象を表示
 git add . カレントdir以下の全てをIndex追加(危ない)
 git add *.py ワイルドカード
 git add a.txt ファイル追加
 git add dirA ディレクトリ追加
 git add -A 変更のあったすべてgit add --all

git reset . addを取消す

git diff --cached ステージング(index追加)の内容確認

git commit ローカルレポにindexをコミット、エディターが開く、iインサートモードで編集、ESC:wqで保存
 git commit -a -m "comment" -aは変更点がある登録された全ファイル

git log コマンドでコミットの履歴
git show コミットした内容自体を確認
git reset --soft HEAD^ コミットの取り消し

git cherry-pick _commit_id_ 他ブランチでコミットした内容をカレントブランチに適応

 ※コミットが済んでいないファイルが残っている状態で git checkout の別ブランチ作成や git merge でmasterにマージしない事
 git reset --hard HEAD^ 直前のコミットを取消(hardはcommit logが残らず、indexやworktreeもオプで戻せる、綺麗だが競合?)
 git reset --hard HEAD~2 数字で複数コミット取消
 git stash 退避/git stash list 退避リスト

git revert コミットNo. 直前のコミットを取消す再コミットでチーム開発向き(戻したcommit logが残る)
 →commit文を書かされるので保存してgit push
 誤ってmasterで修正をしてpushしてしてしまったときにはこれ
  git logでコミットIDをしらべ、git revert <commitID>、git pushでmasterにpushしてしまう

git branch -vv 上流ブランチの名前を確認
git config --get remote.origin.url リモートのリポジトリURLの確認

 git pull --rebase origin master push前にリモートのmasterの更新を取り込んでおけばコミットが綺麗になる

git push リモートに同ブランチがあれば通るがなければ下の--set-upstreamでリモートに作る
 git push --set-upstream origin hotfix push時にリモートに該当ブランチを作成

git push リポジトリ名 ローカルブランチ名:リモートブランチ名 が本来
 リモートリポジトリのアクセス先がoriginという名前で省略設定されている
  git push origin 20250101aaa:20250101aaa -> git push
 これ以外の場合は通常github等のリポジトリ側でPR先を変えるといいと思われるが、、
git pushの取り消しはgithub上でブランチを削除すればよいのではと

リモートでPull Requestを作成
 レビュアーはPull Reqeustを確認し問題なければリモートにマージする
 hotfix等はPull Requestをmasterにするが同時にその1度のpushをdevelopにもPull Requestする/マージも
 プルリクエストでコンフリクトしたときの対処方法(備忘録) - Laravel学習帳 (laraweb.net)

サーバーにデプロイ
 git checkout master マスターブランチに移動
 git pull マスターからデータを取る
 デプロイ作業(サーバにアップロード/terraform apply)

戻し(リバートバック)用にPRを事前準備をしたい
 空のaddやcommitはできない
 githubのコミットグラフで不要なコミット上でRevertボタンを押すとPRが作成される
 戻す可能性がある場合はmasterにマージせず作業ブランチでApply(下記リモートからデータ取得参照)
  ダメならmasterでApplyし直す、あるいはRevertボタンを押す

リモートからデータを取ってくる
git branch -r リモート追跡ブランチの一覧(pullしとけば出る)
git fetch origin darekanounko リモートにあるブランチを取得
git checkout darekanounko これで切り替えができる
 なければ同名で作ってpull? git checkout -b darekanounko > git pull これはダメ

git initの取消し
 rm -rf .git でgit initした場所の.gitファイルを削除
gitの作り直し(最悪これで回復)
 rm -rf .git でgit initした場所の.gitファイルを削除し、改めて git clone

git branch -d hotfix/unco072 hotfixブランチを削除 -dはマージ済みのもの、-Dで何でも削除
git push origin :hotfix/unco072 hotfixブランチをリモートから削除

git branch --merged マージしたブランチ一覧
git branch --merged | egrep -v "\*|master|develop" マージしたブランチmaster/dev以外
git branch --merged | egrep -v "\*|master|develop" | xargs git branch -D それらを削除
git remote prune origin リモートで消されたブランチをローカル反映 prune余分な枝を落とす
git branch --format "%(refname:short) %(upstream:track)" ブランチ名とトラック状態を取得
git branch --format "%(refname:short) %(upstream:track)" | grep "\[gone\]" 削除された[gone]のみ取得
git branch --format "%(refname:short) %(upstream:track)" | grep "\[gone\]" | awk '{print $1}' | xargs -IXXX git branch -D XXX それらはリモートで削除されており削除
git stash clear スタッシュを消す
git gc ガーベージコレクション
 よく使う お掃除系 git 便利コマンド集 (foresta.me)

コンフリクト
コンフリクトはgithubのPRのマージボタンがあるあたりで見れる
masterから修正ブランチを切り出しているのでstgブランチにマージしようとするとコンフリクトする
(masterには未だマージされていないが、stgには既にマージされているPR)
例えば
<<<< feat/kuso
kuso2 = dead
====
kuso = smells
>>>> stg
github上のresolve conflictで更新を掛けるとfeat/kusoPRに反映され、DEV/STGだけでなく本番へも変更が掛かってしまうため、DEV/STGから切りなおしfeatを合体させコンフリクト解消する
git checkout master
git pull
git switch stg
git pull
git switch -c feat/kuso-stg
git merge feat/kuso
コンフリクトを手修正
git add/commit/push (addがなくても強引にpushすればよい?)
githubでstgへ向けてPRを作成
元のstgへのfeat/kusoPRは却下する

git pull で下記エラー
error: cannot lock ref 'refs/tags/v1.3.38': unable to resolve reference 'refs/tags/v1.3.38': reference broken
→cat .git/refs/tags/v1.3.38 .git内のことで対象を見る、GUIフォルダでも大体空
→rm .git/refs/tags/v1.3.38
→RMすると大概git pullができるようになっている
reference brokenでgit pullできなくなったときの対策 - Qiita

他の対応方法として
→rm -rf おまはんのリポジトリのフォルダ フォルダごと消す
→git clone https://やり直しなはれ クローンやり直す
→git checkout master > git pull > git checkout 飛んだbranch (事前にgit pushで保存しとく)


.gitignoreという設定ファイルにデフォルトで対象外とするファイルを設定
.git/config を見るとどのURLにpushするか分かる
リポジトリが不要になったときは.git dirを削除する。管理ファイル(ワークツリーにないファイル)が削除されワークツリーのファイルはそのまま影響がない
 ローカルリポジトリで複数のブランチがある場合、必要なブランチをチェックアウト後ワークツリーのファイルを別途保存してから削除することを勧める
リポジトリを作成し直したい場合は.git dirを削除してから改めてgit initを実行

https://www.atmarkit.co.jp/ait/articles/2003/12/news010.html init
https://www.atmarkit.co.jp/ait/articles/2003/05/news006.html clone
https://www.atmarkit.co.jp/ait/articles/2003/06/news019.html pull
https://www.atmarkit.co.jp/ait/articles/2003/13/news031.html add
https://www.atmarkit.co.jp/ait/articles/2003/19/news018.html commit
 git: git stashの使い方 - Qiita

https://www.atmarkit.co.jp/ait/articles/2005/21/news023.html push
https://www.atmarkit.co.jp/ait/articles/2005/22/news028.html push衝突

https://www.atmarkit.co.jp/ait/articles/2004/24/news028.html checkout
https://www.atmarkit.co.jp/ait/articles/2004/30/news017.html checkout2

https://www.atmarkit.co.jp/ait/articles/2006/11/news025.html revert
https://www.atmarkit.co.jp/ait/articles/2007/01/news015.html revert2
https://www.atmarkit.co.jp/ait/articles/2007/10/news010.html revert3
https://www.atmarkit.co.jp/ait/articles/2007/27/news013.html reset
 Git revertとresetについて - Qiita

https://www.atmarkit.co.jp/ait/articles/2004/09/news018.html log
https://www.atmarkit.co.jp/ait/articles/2004/16/news025.html log2
https://www.atmarkit.co.jp/ait/articles/2004/17/news021.html show
https://www.atmarkit.co.jp/ait/articles/2004/23/news034.html show2
https://www.atmarkit.co.jp/ait/articles/2005/01/news024.html tag
https://www.atmarkit.co.jp/ait/articles/2005/07/news009.html tag2

https://www.atmarkit.co.jp/ait/articles/2005/08/news017.html remote
https://www.atmarkit.co.jp/ait/articles/2005/14/news025.html remote2

https://www.atmarkit.co.jp/ait/articles/2006/04/news022.html rm
https://www.atmarkit.co.jp/ait/articles/2006/05/news021.html rm2
https://www.atmarkit.co.jp/ait/articles/2006/12/news017.html mv

■ツール
git :: bash プロンプトにブランチ名と作業ツリーの状態を表示する [Tipsというかメモ] (root-n.com)
home/.bashrcに追記、1行目が切れがちで注意

Posted by funa : 12:00 AM | Web | Comment (0) | Trackback (0)


January 2, 2016

Fucking tire

■ノーパンクタイヤ

4年前にも考えてた、、2020年3月に再考してるだけ、しかも殆ど同じ結論

重い、クッション性能が悪い、スポーク折れ易い がパンクしない
ネットで見ると空気がやはり最高らしい、空気圧を正常にしていれば普通パンクしないらしいし
ムースは安くやってみる価値ありかも

sシンコー(shinko) パンクレスチューブ
https://www.amazon.co.jp/dp/B06XWTS7DR/?coliid=I1U44FJYPK81CL&colid=21U8GJP0VOHY6&psc=1&ref_=lv_ov_lig_dp_it

やり方は

e-core
https://www.amazon.co.jp/dp/B00MHJT9U4/?coliid=I9R84TPZQ5BH6&colid=21U8GJP0VOHY6&psc=1&ref_=lv_ov_lig_dp_it&th=1
ムースは2cm長めにカット、入れるときは石鹸水で滑らせる
太さにより入らない、脱輪するがあるので太さ選びは慎重に、タイヤ肉厚も考慮、やり方が不味ければリム落ちする

■他には
Tannus 中空ポリマー成型したタイヤをピン止め
https://csndiary.wordpress.com/2017/06/29/tannus/
中空構造タイヤ
https://www.amazon.co.jp/dp/B07JMGXD2L/?coliid=I194XNNO7XEAKH&colid=21U8GJP0VOHY6&psc=1&ref_=lv_ov_lig_dp_it
型善
http://www.katazen.co.jp/e-core eコア:ムース
http://www.katazen.co.jp/e-tube eチューブ:中空ウレタン
http://www.katazen.co.jp/afg ゲル注入

元ネタ、ココがほとんどやってる

アサヒT-チューブ
http://www.asahicycle.co.jp/product/protectia/
フリーゲル
http://www.no-air-touring.com/about.html

↓↓↓

■しかし空気式が性能に優れているので問題が起きたときに対処でもいいかも
ムース注入: EVERS(エバーズ) 自転車パンク修理剤 100ml 10秒注入 空気補填 PN-3
https://www.amazon.co.jp/dp/B00KYMFTB4/?coliid=I1TPJ5FJ8CI0OL&colid=21U8GJP0VOHY6&psc=1&ref_=lv_ov_lig_dp_it
貼るだけ: パナレーサー パンク修理 イージーパッチキット RK-EASY
https://www.amazon.co.jp/dp/B000AQYT8I/ref=psdc_15334761_t2_B00KYMFTB4

---------------------

■2016-01-02 にしかも何かやってた

ムース/ウレタン系、クッション性や重さ、脱輪、経年劣化等の問題:街乗ならOKだな
http://hamamuratakuo.blog61.fc2.com/blog-entry-915.html
http://55net1.com/wp/post-314/


発砲ウレタン
http://www.monotaro.com/p/4108/2343/?gclid=CL7GzYWEscsCFYwHvAodPRICmA&utm_medium=cpc&utm_source=Adwords&cm_mmc=Adwords-_-cpc-_-PLA-_-41082343&ef_id=VY-Y1QAAAaoBz58O:20160308115508:s

タイヤ穴開けられるの嫌なので試した。ウレタンを詰めたが、ビードストッパが無いためタイヤがリム落ちした(脱輪)。失敗。そーいやオートバイはビードストッパ2つやったな。
ホイルナット15mm。ワックスはちゃんと事前に塗る。

---------------------

自転車タイヤのチューブ、アウチ。監視カメラ付けよ。20インチ

Panaracerタイヤチューブ 20x1.50~1.75 英式バルブ 0TH20-15E-NP 170g
701円で去年買ったが1年も経たずに駄目。日本製はダメかも。→しかしやはり横を安全ピンでヤラレてましたな、トレッドでなかった。日本製ではなく日本が駄目なのでは。

TIOGA TIT12700 20×1.50-1.75 英式チューブ 130g
やったらどうや、909円(本体475円)。重さどおり少し薄いな。

---------------------

サイドウォールが補強されているというタイヤだが十分に柔らかいな、MTBに比べてだが。なおビードは硬い模様。ロゴは良いが、タイオガ使いたいな

---------------------

■バルブの種類
英式バルブ:日本で最もポピュラーなバルブ、ママチャリや車いすなど
米式バルブ:車やオートバイ、マウンテンバイクに、頑丈、圧調整可
仏式バルブ:自転車のロードバイクが多い、高圧、軽量

■空気入れ
英式バルブ用のポンプはヘッドに押さえにクリップが必要で大きくなる
小さいポンプは大体が米/仏バルブ用
英→米式バルブ変換も使ってみたが、ポンプ時にバルブの根元に負担が
あり、チューブがパンクしそう
→携帯に大きいがホースが出る英式用ポンプが安全
→小さいのはポンピングがしんどい、小さいのは浮き輪用としる

■CYCPLUS電動エアーポンプ(Max 150psi=10.3bar=10.5kgf/cm2)
https://www.amazon.co.jp/gp/product/B085T88VNL/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1
1) 米式(MTB)のチャックなので、英式(ママチャリ)や仏式(ロード)の場合はアダプターをバルブに着けてからチャックを付ける
2) 長押しパワーオン
3) 空気圧単位設定U
4) 空気圧設定+ー
5) パワーボタンで空気入れスタート
 ※誤差が大きく4.5kgf位入れる?

ママチャリの標準空気圧3kgf/cm2
 psi換算だと42.6699psi
 bar換算だと2.941995bar
 KPa換算だと294.1995KPa

HIPHOP踏み絵的なアレ再会、trap、師弟制の牽制も効いてるし、誰もが有名になれる時代、NE似ー合わねんだー

Posted by funa : 08:00 PM | Bike | Comment (0) | Trackback (0)


January 2, 2016

Agile
■アジャイル
http://codezine.jp/article/detail/5465
スコープを柔軟化するため、スプリントで区切り、スプリント後は動作するようにする、しかしスケジュール/リソースは固定
ボトムアップとして(ストーリー、タスクなどの)バックログ。WBSはトップダウンだった
スクラムやXP等を使う
- 要求機能はストーリーとして表現される(エピックはストーリーを一定のジャンルでグループ化し可視化)
- プロダクトバックログを作成し、直近のリリース(スプリント数個分)ごとにリリースバックログを作成する
- スプリントごとにスプリントバックログとして作業を詳細化(時間単位)する
- スプリントの完了時には、テストされ、デモが可能な状態でなければならない
スプリントを導入しても、設計、実装、単体テスト、結合テストとタスクを分割していたのでは、ミニウォーターフォール
 逆に管理工数がかかったり品質が下がるかも。継続的統合やテスト駆動開発などが要る

1.計画を簡易的に行なう(スプリント単位で等)
2.その代わり定期的に見直す
3.簡易な計画/管理ツールを利用する
4.チームとしてスケジュールを組む

粗い要求までもリストアップするプロダクトバックログ(エクセルレベルで可)
次のリリースのためのリリースバックログ(エクセルレベルで可)
直近のスプリントのためのスプリントバックログ(タスク管理システムにすると意識しなくても良いかも)

初日にプランニングミーティングを行い、直近(2週間等)のタスクを計画
そして、毎日デイリースクラムを実施し、最終日にレトロスペクションミーティングで締めて
スプリントの1サイクルとなる

ミーティングでは、タスク管理システムないしは、
ホワイトボードに張られたタスクやバックログリスト(場合によってはガントチャート)などの
タスクを一覧できるツールを用いる

 ///プランニングミーティング
 プロダクトバックログから優先順位に従って選択したストーリーをタスクにブレークダウン
 ミーティング前
  1.タスクを決定する
 ミーティング時
  2.前スプリントのタスク完了を確認する
  3.メンバーの予定作業時間を確認する
  4.スプリントのゴールを共有する
  5.タスクを説明し工数を見積もる
 ミーティング後
  6.タスクを割り当てる

 ///デイリースクラム
昨日何をしたか?
今日何をするか?
進捗を妨げている問題は何か?

 ///レトロスペクションミーティング
 何をしたかについて、1人数分から十数分説明する
 何ができないか、どのような課題が残っているかに言及する


↓↓↓↓↓↓アジャイルから明確にスクラム

■スクラム
https://qiita.com/gold-kou/items/90ba982a14ca79d843c9
///対話の価値(左が要らないとは言っていない)
プロセスやツール < 個人と対話
包括的なドキュメント < 動くソフトウェア
契約交渉 < 顧客との対話
計画に従う < 変化への対応

透明性:スクラムチームの現状や問題点を見える化すること
検査:見える化により問題点を見つけること
適応:スクラムチームに問題があった場合に、改善策を考えて対処すること

個人はスクラムチームのゴールの達成を確約しなければならない
メンバーは正しいことをする勇気を持ち困難な問題に取り組まなければいけない
全員がスプリントの作業とスクラムチームのゴールに集中しなければいけない
スクラムチームとステークホルダーは仕事や課題とその遂行の様子を公開する
メンバーはお互いを能力のある独立した個人として尊敬しなければいけない

 ///プロダクトオーナー(PO)
- プロダクトバックログアイテム(PBI)の管理
- リリース計画策定
- 市場調査
- ステークホルダとの対話
- 開発チームとの対話
- 予算管理
- スプリントレビューで"DONEの定義"にしたがって受け入れ判断をする
注意点:POを複数人で実施することも可能だが、その場合は代表者を1人決めておく必要がある。

 ///スクラムマスター(SM)
- 妨害リストの管理
- 妨害の除去
- POのサポート
- 開発チームのサポート
注意点:チームが自己組織化するために、SMはメンバーに直接的な指示(タスク割り当てなど)や管理(進捗管理など)をしてはいけない。スクラムにはPMは存在しない。

 ///開発チーム
- 開発、インクリメント(成果物)を完成
- プロダクトバックログの追加
- 妨害リストの追加
注意点:開発チームは自己組織化されており、外部から仕事の進め方やタスクを指示されるようなことがあってはならない。1つの開発チームは3-9人で構成されなければならない。それより少ないと機能横断的でなくなる可能性が高くなるためNG。多すぎると調整が大変になってしまうためNG。多すぎる場合は別のスクラムチームをもう1つ作るべき。開発チーム内で年齢や役職、会社の違いがあったとしても全員フラットな関係でなければならない。開発チームに専門能力の高いメンバーがいて、その分野ではその人に頼りがちだけど、そこで問題が起きたとしてもそれはそのメンバーだけの責任でなく開発メンバー全員の責任であることに注意する。

 ///ユーザーストーリー形式 
「〜として、〜したい。それは、〜だからだ。」を書きます。これは、INVEST(Independent, Negotiable, Valuable, Estimable, Small, Testableの頭文字をとったもの)を満たす必要があります。プロダクトバックログのDoneの定義も定義

 ///スプリントバックログ
開発チームにより作成される。スプリント期間中での修正、追加、削除も可能である。スプリントバックログの管理を行えるのは開発チームだけである。規模や工数はバラバラで問題ないが、1つのスプリントバックログアイテムの見積もりは1日以下の大きさに分割すること。スプリントバックログアイテムは"未着手"、"着手中"、"完了"などのいずれかのステータスがラベル付けされており、そのステータスが可視化されている必要がある。JIRAでも付箋とホワイトボードによるアナログ方式でもどちらでも問題ない。自己組織化されているので、誰かに割り当てられるものではなく自ら挙手する。設計、コーディング、テストコードの作成だけでなく、結合テストなどの実施、CI環境改良、ノウハウを残すなどもスプリントバックログとして分割するべきである。

 ///妨害リスト
スクラムチーム内外で、妨害になっていることを優先度順にリスト化したものである。どのロールの人でも追加できるが、妨害リストの管理の責任者はSMである。いつでも追加可能だが、特にデイリースクラムやスプリントレトロスペクティブで課題(妨害)の共有が行われやすい。

 ///スプリント
1ヶ月以内の固定した開発期間を何度も繰り返す。1週間、2週間、1ヶ月のいずれかが一般的。スプリント期間内に完了しなかったプロダクトバックログアイテムがあったとしても、スプリントを延長してはいけない。スプリントの中止はよっぽどのことが無い限り、行われるべきでないが、もしものときは実行権限を持つのはPOだけである。

 ///スプリント0
自己紹介、スクラム理論の勉強会(認識合わせ必須)、当面のプロダクトバックログの作成と共有、必要技術スキルの勉強会、開発環境構築などを行うスプリント開始前の準備期間のこと。必要期間はチームにより異なる。

 ///リリーススプリント
インクリメントの統合テストや通常スプリントで残ったタスクを実施してリリースを行うための特別なスプリント。 原則、このスプリントは存在しません。スプリント毎にリリース可能なものを作成するので、リリーススプリントが無いことが理想だが、そうでない場合に用意される。リリーススプリントはPOがリリース準備が整ったと判断するまで続く。

 ///イベント
開発チームでイベント以外のミーティングができるだけ行われないようにする。全てのイベントはタイムボックス化されている(何分とか、何時間までとかが決まっている)。もし、タイムボックスを超えてしまった場合、議論をそこで打ち切る必要はないが、タイムボックスを越してしまったという事実は妨害リストに追加したり、スプリントレトロスペクティブで話し合う必要がある。

 ///スプリントプランニング
第一部は全てのロールが参加する。ただし、第二部はPOは連絡がつく状態であれば参加しなくてもよい。第一部では、ベロシティをもとに今回のスプリントで対応できそうな範囲でプロダクトバックログを開発チームが選択する。(POが選択してはいけない)
プロダクトバックログはリファインメントによってすでに見積もりがされている状態のはずだが、リファインメント後に新規追加されたプロダクトバックログアイテム(つまり見積もりがまだされていないもの)が含まれている場合は、この場でリファインメントを実施する。第二部では、開発チームは選択したプロダクトバックログアイテムをスプリントバックログに分割する。これにより、POとSMにどのようにプロダクトバックログアイテムを消化できるかを伝えられる状態になる。分割したスプリントバックログに時間数を見積もり、その総計が1スプリントでのチームが開発できる時間をオーバーした場合は優先度の低いプロダクトバックログから外していく。逆に余裕がある場合なプロダクトバックログを追加する。POの予想より多すぎたり少なすぎたりする場合は、開発チームとPOは話し合う。開発チームは選択したプロダクトバックログアイテムを完了することに全力を注がなければならないが、完了することを約束するわけでない。なぜならば、見積もり時にはわからなかった技術的に困難な事象が発生することはよくあるからである。無謀な長期の残業は行わない。

 ///デイリースクラム
- いつ?⇒毎日同じ時間(一般的には朝)
- どこで?⇒どこでもいいがいつも同じ場所
- 誰が?⇒開発メンバー。SMは必要に応じて参加する。POは見学(発言は基本的にNG)してもよい。
- 目的は?⇒開発チームの検査
- どれくらい?⇒最大15分
昨日やったこと、今日やること、あれば課題(妨害)の共有。課題は共有に留めること。管理職の見学は避けたい。なぜならば、共有でなく管理職への報告になりがちで自己組織化が損なわれやすいのと、課題共有がしにくい雰囲気になりやすいからである。もし管理職にエスカレーションするべき課題があるならば、デイリースクラム後に報告すること。

 ///プロダクトバックログリファインメント
- いつ?⇒スプリント期間中であればいつでも良い。
- 誰が?⇒全てのロール
- 目的は?⇒プロダクトバックログの透明性の獲得
- どれくらい?⇒最大1日(8h)
POはプロダクトバックログの説明(前回からの変更分、追加分、削除分、詳細決定部分、順序変更部分など)を行う。リファインメントの対象は、次のスプリントあるいはさらにその次のスプリントで開発対象となりそうなくらいの範囲となる。優先度低いプロダクトバックログの説明までは行う必要はない。本当に実施するかも不透明だし変更も発生しやすいため。開発チームはプロダクトバックログへの意見(追加アイディアや順序変更や質問など)、新しいプロダクトバックログアイテムの見積もり、必要であれば再見積もりを行う。

 ///プランニングポーカー
プロダクトバックログの見積もりには"プランニングポーカー"と呼ばれる手法が一般的に使われる。プ開発チーム全員がフィボナッチ数列(0, 0.5, 1, 2, 3, 5, 8, 13,...∞)の値が書かれたカードを持ち、プロダクトバックログアイテムごとに「いっせーのせ!」でカード(見積もり)を提示する。この見積もりは単位のない"相対見積もり"である。見積もりの値が似たような値で均等に分散したとき(例えば5が3人で8が3人の場合)は、悲観的に考えて大きい値(ここでは8)をストーリポイントとして計算したほうがよい。

 ///スプリントレビュー
- いつ?⇒スプリントの終わり
- 誰が?⇒全てのロールとPOが招待した重要な関係者(ステークホルダーなど)
- 目的は?⇒インクリメントの検査とプロダクトバックログの適応
- どれくらい?⇒最大2時間(スプリント2週間の場合)
開発チームはインクリメントのデモを実施して、質問に答える。また、完了できなかったプロダクトバックログがあれば説明する。開発チームはデモをやることと受け入れに通ることばかり考えがちだが、大切なのはスプリントレビューを通して、よりよいプロダクトを得るための手がかりを見つけることである。デモはそのための手段であって目的ではないことに注意しよう。また、デモの説明スライドは作るべきでない。そこに労力が割かれがちだからだ。POはDONEの定義に従い、インクリメントが受け入れ可能かを判断する。

 ///スプリントレトロスペクティブ
- いつ?⇒スプリントレビュー後かつ次のスプリントが開始される前
- 誰が?⇒SMと開発チーム。POは参加してもよいが必須でない。
- 目的は?⇒スクラムチームの検査と適応
- どれくらい?⇒最大1.5時間(1スプリント2週間の場合)
スプリントで人・プロセス・ツールの観点から問題がなかったか、もっと成果を出すためにできることがないかを議論し、次回のスプリント以降の改善策を考える。手法として、KPT(Keep, Problem, Tryを出し合うこと)がよく使われる。

 ///ベロシティ
ベロシティとは、そのスプリントで開発したプロダクトバックログのストーリーポイントの合計である。スクラムチームはベロシティを高めて安定させることを目指す。そもそもストーリーポイントがいい加減な値。フィボナッチ数列の値しかだせないし、開発者は技術的な不安点があるからとりあえず大きな値をしばしば出しがちである。さらに、スプリントの日数は祝日、メンバの休暇などでスプリント毎に異なるものである。

スクラムではテスト専門チームの存在を許していない。スプリントの中で徹底的にバグを発見して潰すべきなのである。

■スクラムガイド Ken Schwaber & Jeff Sutherland
2020-Scrum-Guide-Japanese.pdf (scrumguides.org)

■マネジメント向け アジャイルの利点
https://www.ryuzee.com/contents/blog/13147

■カンバン
ToDo、進捗、ワークフロー整理、振り返り、で活用できれば
カンバンの基本のキ - Qiita
※なおトヨタのカンバン方式は意味自体はJust in timeの意、中で使われていた伝達法もTodoリストと違う、生産と運搬のタグみたいなもの

■JIRA
コンポーネントはプロジェクトを分割(トップダウン)
エピックはストーリーを一定のジャンルでグループ化(ボトムアップ)
タスクはスプリントの期間で終わり作業が内容が分かるタイトルに
ラベルがあれば時間集計できるので作業ラベル

Posted by funa : 12:00 AM | Web | Comment (0) | Trackback (0)


January 1, 2016

PHP Developer

■スクラム
https://www.bangboo.com/cms/blog/page_321.html
https://www.ryuzee.com/contents/blog/7137
プロダクトオーナー(バックログ並び)
スクラムマスター(外部からチームを守る)
デイリースクラム(毎朝)
プロダクトバックログをスプリントバックログに
ベロシティ(工数)
レビューをしてリリース可能な状態に(実際のリリースはビジネス判断)
スプリントレビュー(デモ)
スプリントレトロスペクティブ(チーム改善)

■PHP開発
http://www.objective-php.net/
オブジェクト指向(クラス、メソッド、プロパティ)、MVCについて
 まずプログラムが動くようにしてから必要ならクラス化やMVCにすればよい、大体は不要だが
  fatコントローラならページ化した方がいいのだが
  MVCのモデルMをロジックとデータの2段構成→ファイル増え逆に一元管理ができないしょ
   利点:オブジェクト指向は他言語への応用力鍛錬、MVCはVの役割分担、参入障壁
    Cを無くしVがハンドルする、Page-Objectモデルが、レスポンスも早く、込み入った処理/デザインも出来てよいけど
       靴紐やら枠嵌よりHTMLやら言語やらはネイティブがいい
 SPA(Single Page Application)はJSがサーバに欲しいデータを要求する、MVCがダメだからPOモデル

■オブジェクト指向のルール
カブセル化:隠蔽するべくできるだけpublicメンバを使わない
継承:親クラスのプロパティやメソッドが引き継がれる(private以外の)、ルールが多くありOOにできる
ポリモーフィズム(多態性):オーバライドやオーバロードでメソッドを状況で使分ける
//// アクセス修飾子
 public オブジェクト外からアクセス可
 private オブジェクト外からアクセス不可、継承されない
 protected オブジェクト外からアクセス不可、継承される
//// コンストラクタ
 __construct()はインスタンスの生成時に一度だけ自動的に実行される
 アクセス修飾子は基本的にはpublic
//// オーバーライド
 継承クラスで親クラスのメソッドを上書きし乗っ取る
//// 静的メンバ
 static修飾子をつける
 インスタンスを生成しなくてもアクセス可能(publicにしておくと)
 「クラス名::メソッド名()」で呼び出す
 staticメソッドはインスタンスから呼び出せない(クラス自体に属する)
  クラスのメソッドでなく関数のような役割
//// クラス定数
 const 定数名 = 値
 アクセス修飾子は付けられません(クラス定数はpublic扱い)
 定数名には「$」は付けません、define関数と同じ
 設定値の格納用として普通使う、クラスで纏め分類しておくとdefine関数より管理がし易い
 静的フィールドとの違いは値の変更が出来るか出来ないかだけ
//// 抽象クラス
 abstractをつける
 直接インスタンスを生成できず必ず継承して使用するクラス
 継承先のクラスで必ずオーバーライドする必要がある
 抽象メソッドとは処理内容を持たずに名前だけ定義されたメソッド
  共通で行う処理を抽象クラスとして定義し各画面の処理は抽象メソッドとしておく使い方
//// インターフェイス
 インターフェイスとは抽象メソッドのみ定義可能なクラス
 抽象メソッドだがabstractはいらない
 アクセス修飾子にはpublicしか指定できない
 直接インスタンスの生成はできない
 実装にはインターフェイスで定義されているメソッドは全て実装する必要があり、アクセス修飾子はpublicで引数の数も名前も完全一致が必要
  インターフェイスの実装でポリモーフィズムであることを保障できる
  インターフェイスは多重実装可
   class FoodProduct implements IProduct, IFood
//// タイプヒンティング
 引数で受取るクラスやインターフェイスを制限できる
  public function addProduct(Meet $product) ←Meetクラスを指定
  public function addProduct(IProduct $product) ←Iproductインターフェイスを指定
//// 名前空間
 異なる名前空間同士では同じ名前のクラスが定義できるようになる(長名になりがちなので)
 名前空間未指定はグローバル空間、\をつけるとグローバル throw new \Excetpion('hogehoge');
 クラス定義ファイルの頭にnamespaceキーワードで名前空間を定義 namespace Food;
 使用は2つの方法
 1)namespaceを含めたフルパスでクラス名を指定し使用 $item = new \Food\Product();
 2)前空間の利用宣言をあらかじめする use Food\Product; $item = new Product();
  同名だと衝突するので別名や階層化やオートローダ http://www.objective-php.net/basic/namespace
 namespace はディレクトリではなく別名であり、
  接頭文でもなく、関数名が被らないように名付時と使用時の両方で宣言してるだけ
  関数名被らなければ使用時に気にしすぎる必要はない、下記でOK
   namespace App\Http\Controllers;
   use Illuminate\Http\Request;
   use App\Http\Requests;(App\Http\Controllers\App\Http\Requestsというわけではない)
//// 例外
PHPは勝手に例外を投げないので自分で書くのであまり意味がない(新しい関数やクラスは例外を投げてくれるが)
try {
    if($a!==1){ throw new Exception('Bad'); }
    echo "End";
} catch (Exception $e) {
    Logger::write($e->getMessage());
    echo "ERror";
}
-> ERror

//// サンプル
<?php
//カプセル化、アクセス修飾子、コンストラクタ、セッター/ゲッターのメソッド、継承
class Product{
    protected $name; // 商品名
    protected $price; // 価格
    public function __construct($name){
        $this->name = $name;
    }
    public function getPrice(){
        return $this->price;
    }   
    public function setPrice($price){
        $this->price = $price;
    }
}
class FoodProduct extends Product{
    private $expire;
    public function setExpire($expire){
        $this->expire = $expire;
    }
    public function getExpire(){
        return $this->expire;
    }
}
$food = new FoodProduct('肉');
$food->setPrice(100);
$food->setExpire(30);
echo '価格を' . $food->getPrice() . '円に設定しました。';
echo '賞味期限を' . $food->getExpire() . '日に設定しました。';
?>
<?php
//静的メンバ(静的メソッド)
class PriceFormater{
    private static $fee = 10;
    public static function formatJapanese($price){
        $price = number_format($price + self::$fee);
        $price = $price . '円';
        return $price;
    }
}
$price = PriceFormatter::formatJapanese(3000);
?>
<?php
//クラス定数
class Tax{
    const IMPORT_TAX_RATE = 0.08;
}
class Product{
    const TAX_RATE = 0.05;
    private $price = 100;
    public function getSalePrice(){
        $tax = $this->price * self::TAX_RATE;
        $tax2 = $this->price * Tax::IMPORT_TAX_RATE;
        $price = $this->price + $tax + $tax2;
        return $price;
    }
}
var_dump(Product::TAX_RATE);
$prd = new Product();
$price = $prd->getSalePrice();
?>
<?php
//抽象クラス(文字追加の処理所要時間測定)
abstract class TimeMeasurer{
    abstract protected function process();
    public function exec(){
        $startTime = $this->getMicrotime();
        $this->process();
        $endTime = $this->getMicrotime();
        $procSecs = $endTime - $startTime;
        echo sprintf('処理所要時間は%s秒でした。', $procSecs);
    }
    private function getMicrotime(){
        $splitedMt = explode(' ', microtime());
        return $splitedMt[0] + $splitedMt[1];
    }
}
class TestClass extends TimeMeasurer{
    protected function process() {
        for ($i = 0; $i < 1000000; $i++) {
            $str .= 1;
        }
    }
}
$test1 = new TestClass();
$test1->exec();
?>
//インターフェイス、タイプヒンティング、(ポリモーフィズム)
---- Car.php
interface Car{
    public function start();
}
GasolineCar.php
class GasolineCar implements Car{
    public function start(){
        echo sprintf('%s エンジンOK', $this->gasolineIgnition());
    }
    //関数の戻り値の型をstringで指定
    private function gasolineIgnition(): string
    {
        return 'brrr';
    }
}
---- DieselCar.php
class DieselCar implements Car{
    public function start(){
        echo sprintf('%s エンジンOK', $this->DieselIgnition());
    }
    private function DieselIgnition(): string
    {
        return 'vvvv';
    }
}
---- driver.php
class driver{
    public function on(Car $car){
        $car->start();
    }
}
index.php
$driver = new driver();
$driver->on(new GasolineCar());
$driver->on(new DieselCar());

//// OO設計
index.php
 Dispacherを呼ぶ

abstract class Dispatcher
 URL引数を取得
class siteDispatcher extends Dispatcher
 URL引数から適切なコントローラを呼ぶ

↓abstract class RequestVariables
↓ $_POST、$_GETを取得
↓class Post extends RequestVariables
↓ Post変数
↓class QueryString extends RequestVariables
↓ Get変数
↓class Request
↓ Post変数とGet変数を纏める

↓class ModelBase
↓ モデルの共通機能(DB接続等)をstaticメソッド、継承してもいい

class CartController extends ControllerBase
 カート用コントローラ(ヘッダーやコンテント)
abstract class ControllerBase
 カート以外でも使用する共通機能(Post/Get取得やビュー呼出)

class CartHeader
 ユーザ情報等のカートのヘッダー情報のモデル
class CartContent
 リスト取得や追加や削除の操作のモデル

====
//// オブジェクト指向のメモ
 コントローラのメソッド内では変数にスコープをつけなくて良い
  メソッド外にはpublic/private/protectedを付ける
 インスタンス生成 $a = new Class名; コンストラクタに渡す場合は new Class名(引数);
  メソッド使用 $a->メソッド();

-> (クラスのフィールド名、メソッド名) アロー演算子 メンバ変数やメンバ関数を使う
:: (クラスのメソッド名) スコープ演算子 インスタンスを生成していないクラスのメンバ関数を使う事が出来る

    class Pet{
        var $dog = "wan";
        var $cat = "nyan";
        function func(){
            echo "Welcome";
        }
    }
    echo Pet::cat;
    $obj = new Pet();
    echo $obj->func();

phpにおける :: と ->に違いについて
アロー(->)演算子を使う場合 インスタンスプロパティとインスタントメソッドにアクセスする echo $a->name
スコープ定義(::)演算子を使う場合  静的プロパティと静的メソッドにアクセスする
https://qiita.com/mpyw/items/41230bec5c02142ae691

インスタンスプロパティインスタンスメソッド静的プロパティ静的メソッド
外部から$v->name$v->name()クラス名::$nameクラス名::name()
インスタンスメソッド内から$this->name$this->name()self::$nameself::name()
静的メソッド内からself::$nameself::name()

クラス名に変数が使えるので注意 $con = new AAA(); は下と同じ
 $className = 'AAA';
 $con = new $className();

$_SERVER['REQUEST_URI']等はグローバル変数なのでどこへでも書ける(クラスやメソッド内等)

====

可変変数
$test = "aaa";
$var  = "test";
echo $$var;     //"aaa"が出力
echo ${"test"};  //これも"aaa"が出力
echo ${$var};  //これでも"aaa"が出力
${"name_$test"}
$this->{$test}
$foo->{$start . $end}
$foo->{$arr[1]}

三項演算子
 条件式 ? 真の式 : 偽の式
 $lang = 'En';
 $msg = $lang == 'Jp' ? 'こんにちは' : 'Hello';
 print $msg;//Hello

エルビス演算子
 条件式(真の式) ?: 偽の式;
 条件式がTUREと同等だった場合その値または「1」が返され、FALSEだった場合に偽の式が返されます
 $a = 4;
 $b = 9;
 $num = $a < $b ?: 'aはbより大きい値';
 echo $num;//1

NULL合体演算子
 条件式または$変数 ?? 式;
 条件式または$変数の値が「NULL」のとき式が返り、FALSEのときは条件式または$変数の値が返えされます
 条件が存在しなくてもnoticeエラーが出ない
 $list = ['a' => 1, 'b' => 2, 'c' => 3];
 echo $list['b'] ?? '99'; // 2
 echo $list['z'] ?? '99'; // 99
https://www.tomcky.net/entry/2018/02/17/093654
https://qiita.com/ritsuka/items/b4f78ac4121ce5e01173

連想配列はforeach
 $preflist = array('Tokyo' => '東京', 'Osaka' => '大阪');
 foreach ($preflist as $key => $value){
   echo $key . ':' . $value;
 }
 $fruits = array("Orange","Apple","Berry");
 for($i = 0 ; $i < count($fruits); $i++){
  echo $fruits[$i];
 }

配列を指定した値で埋める
 array_fill (インデックス, 要素数, "値");
 $ar = array_fill (4, 3, "PHP");
 Array ( [4] => PHP [5] => PHP [6] => PHP )

配列の中で最も大きい数値を返します
 max( array(100, 200, 300) )
 min( 100, 200, 300 )

変数の整数としての値を取得する integer
 intval('122.34343The') = 122

平方根/べき乗を取得するには、sqrt()、pow()関数
 pow(8, 2) = 64
 sqrt( 16 ) = 4

NULLか変数ありか空か
 (is_null($val01) ? 'TRUE' : 'FALSE')
 (isset($val01) ? 'TRUE' : 'FALSE')
 (empty($val01) ? 'TRUE' : 'FALSE')

値の出現回数の総ざらい
 $array = array(1, "hello", 1, "world", "hello");
 print_r(array_count_values($array));
  [1] => 2, [hello] => 2, [world] => 1

asort($A)値で昇順にキー保持しソート、連想配列向き arsot($A, SORT_STRING)降順にソート,文字のモード
sort() / rsort() ソート後にキーが添字配列が付け直される

文字列を配列に変換する
 str_split('hel')
  [0] => H
  [1] => e
  [2] => l

配列に追加
 $hoge['key2'] = 'value2';
 $hoge[] = 'AAA';
 array_push($hoge,'CCC','DDD');

array から要素を削除、ループ中のcount()現象に注意
 unset($arr[1]);
 $arr = array_values($arr);//添字が0から振られ直す

breakはデフォルトでは一番内側のwhile文を抜けて次の処理へ移る
 ネストの場合は抜けたい階層の数を指定 break 2;
 現在のループ処理を抜けて、次のループ continue;

配列のキー・添字を確認
 $ar = array("PHP" => 4, "CGI" => 5);
 if(array_key_exists("PHP", $ar)){

配列の値の有無をチェック
 $ar = array("PHP", "CGI", "PERL");
 if(in_array("PHP", $ar)){

シリアライズ
ソフトウェア内部で扱っているデータを丸ごと、ファイルで保存したりネットワークで送受信することができるようにバイトストリームに変換する、これにより配列やオブジェクト等ををデータベースやテキストとして保存したりすることができる、シリアライズ後の文字列は「型:値」の形式に変換されている(string:byte数)
$data=array('key1' => 'value1','key2' => 'value2');
$serial=serialize($data);
var_dump($serial);//string(54) “a:2:{s:4:”key1″;s:6:”value1″;s:4:”key2″;s:6:”value2″;}”
//戻す $data=unserialize($serial);

■ファイルアップロード(のエラー判定)がダメはphp.ini
memory_limit (メモリ使用量の上限)128MB
post_max_size (POSTの最大サイズ ※1回の全upファイルの合計サイズ)8MB->16M
upload_max_filesize  (1ファイルあたりの最大アップロードサイズ)2MB->8MB
  memory_limit >= post_max_size >= upload_max_filesize > MAX_FILE_SIZE で設定する必要がある
max_execution_time スクリプトの実行時間 30
file_uploads ファイルアップロードが許可されているか On
max_file_uploads 一度にアップロードできるファイル数 20
apacheに「LimitRequestBody」がありデフォ2GB いくらPHP側でそれ以上を設定をした所でHTTPリクエストで駄目(FTPが必要?)
<?php phpinfo(); ?>で確認
php.iniを変更する(通常これ)
htaccessで設定する
httpd.confで設定する
1)<input type="hidden" name="MAX_FILE_SIZE" value="8000000">のタグを埋めハンドリング
 超えると$_FILES['userfile']['error']で0以外の確か2が返る
2)アプリ側でも閾値を持ち$_FILES['userfile']['size']でエラーハンドリング、小さめに設定
 しかしファイルが大きすぎるとPHPではファイルサイズが0になり不明になるが
 $_SERVER['CONTENT_LENGTH']でPostサイズは取れる→(2)で
3)upload_max_filesizeを超えると$_SERVER['CONTENT_LENGTH']でエラーハンドリング
 これなら(1)のアプリ制限を持たす必要もないが動的に制限を掛けたい場合に
4)post_max_sizeを超えるとアプリが落ちるので大き目に設定
 ※下記の考え方は参考になるがコードは間違っている
 upload_max_filesize post_max_sizeエラーの対策 CakePHP - watuu's diary (hatenablog.com)
 php — PHPの `post_max_size`を超えるファイルを適切に処理する方法は? (it-swarm-ja.tech)

■Javascript
関数宣言>無名関数>ES6 クラス で書き方の変遷
コツ、使用、注意事項をまとめてある
https://www.bangboo.com/cms/blog/page_325.html

■CSSレイアウト
https://www.bangboo.com/cms/blog/page_327.html
Grid 格子状のレイアウト(テーブルレイアウトな感じで)
flexbox 1行の横並び、縦並び
float テキストの回りこみ
https://speakerdeck.com/tonkotsuboy_com/2019nian-madenijian-zhi-siteokitai-cssjavascriptfalseshou-fa
https://qiita.com/kura07/items/e633b35e33e43240d363
https://idotdesign.net/blog/web/htmlcss/css-grid-layout/
http://www.htmq.com/css3/

■CSS
Lightboxなしモーダル https://unicolabo.jp/topics/668.html#overlay
 https://www.bangboo.com/reserve/index.php
Formのフォーカスやツールチップ https://www.go-next.co.jp/blog/web/html_css/23603/
Table Trオンマウス https://gray-code.com/html_css/change-style-when-cursor-is-on-table-line-or-cell/

■HTMLタグ
https://qiita.com/kudo_kk/items/b2b1341b2b2543b6fa58
alt属性は画像の代替テキスト
title属性はふきだしチップを表示

/// HTML5
https://www.bangboo.com/cms/blog/page_273.html

■Laravel ララベル
https://coinbaby8.com/laravel-php-dekirukoto.html
https://laravel10.wordpress.com/
ルーティング:  URLと対応 .phpで終わせず処理をひとつのファイルやクラスにまとめる
Blade:  テンプレートエンジン
ミドルウェア: URL前後に処理を付加
エラーハンドラ: 例外やエラーが発生した際の処理
DI : サービスコンテナというのを用いクラスインスタンスの依存度を極力下げて、実行時に外部から与えてもらえるように
バリデーション:  入力値のチェックを設定のみで自動的に
データベース連携
認証の自動化

インスコ~機能~使い方
https://www.bangboo.com/cms/blog/page_324.html

■IDE/Editor
VS code, Atom, PhpStorm, etc.
HTMLエディタ: Dreamweaver, Brackets etc.
 https://hota1024.com/2018/02/19/php%E3%81%AE%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF5%E9%81%B8/
Visual studio codeにPHP intelephense、PHP Debugを入れる?

DW8の拡張子設定: 
C:\Program Files (x86)\Macromedia\Dreamweaver 8\Configuration\DocumentTypes\MMDocumentTypes.xml
https://helpx.adobe.com/jp/dreamweaver/kb/change-add-recognized-file-extensions.html

■Git
https://www.bangboo.com/cms/blog/page_322.html

■XSS対策、CSRF対策、脆弱性チェック
https://www.bangboo.com/cms/blog/page_267.html

PHPサイバーテロの技法


■SQL
https://www.bangboo.com/cms/blog/page_151.html
https://www.bangboo.com/cms/blog/page_154.html

■Memcached
KVSでメモリにキャッシュを持たせる
1)Memcached にget
2)キャッシュがない or Memcachedサーバが落ちている場合、DBから取得
3)2の結果をMemcached にset
http://dbinfo.sakura.ne.jp/?contents_id=219

■画像アクセスのPW保護
ディレクトリのBasic認証PW保護 ログイン時にhtpasswdを時間制限で書き換える https://teratail.com/questions/121911
<img src="https://user:password@example.com/secret.jpg"> 画像URLのPW埋込がFirefoxしかできなくなってた(2019年8月時点)
ApacheでCookieによるアクセス制御をかける http://webos-goodies.jp/archives/50573319.html
BlobでPHPでセッション認証を判定後に出力(ヘッダーで画像として)
 ファイル名を変名してサーバに置く、アクセス時に変名をしてDL(画像じゃないが)

■要件定義、上流工程、PMBOK
https://www.bangboo.com/cms/blog/page_171.html

======================
■今昔
■MySQL
type=でなく ENGINE=InnoDB で
0000-00-00はだめ datetime NOT NULL default '1000-01-01 00:00:00',

■画像にアクセス制御を加えアクセスできなくする
1)htaccessのBasic認証 https://www.kens-web.com/2011/06/1235
2)PHPでセッションを使いDBでBlob http://web-design-fox.hatenablog.com/entry/2015/06/23/000412
上記2つがメインか?Basic認証のPWの管理方法で工夫はできそう(アクセス禁止フォルダやログインPW共用等で)

Posted by funa : 10:47 PM | Web | Comment (0) | Trackback (0)


January 1, 2016

11 Tips of Excel
■エクセル操作の注意点
  1. コピー等をする場合はフィルターを一旦解除して、フィルターを操作し直してから行うとミスがすくない
  2. フィルターをかけてコピーしたものを、フィルターが掛かった枠にはペーストできない→そのコピペは連続カラムに貼られる
  3. しかし、フィルターを掛けた状態で、セルを同じ値でドラッグして埋めることはできる
  4. 可視状態のものをコピー: ALT+; 押しながらコピー
  5. 相対パス A1 絶対パス $A$1 これは適切に指定
  6. 計算式で出したものはコピー>値で実体値をペーストする列を作ってそっちを操作するとミスが少なくなる
  7. フラグ対象の値を取り込み =COUNTIF($Q$1:$Q$3500,A2)>=1 で判定しフラグを付与 TRUEが付く
  8. IDリストと付与値を取り込み =IFERROR(VLOOKUP(A2, $C$2:$D$3500, 2,FALSE),"") で該当IDに値を付与する
  9. 優先順に判定する IF文を使用、空欄の場合はB2,C2,D2と移動し一番左を採用 =IF(B2<>"", B2, IF(C2<>"", C2, IF(D2<>"", D2, "")))
  10. 動画リンクを作るために文字を足す ="http://aaaa?id="&A2
  11. リンクを付ける =HYPERLINK(C3) 直接リンクを貼る事は出来ず別カラムが必要、マクロの方法もあるが

Posted by funa : 12:00 AM | Gadget | Comment (0) | Trackback (0)


December 26, 2015

Card

クレジットカードのポイントと納税方法について書く。

■納税
Yahoo納税だと手数料が高く、ポイントを超えてしまうのでnanacoを。
nanacoだとチャージのときにポイントが付く。(つかないかも)
また、現金しか払えないような公共料金系でもnanacoは使える。

1)nanacoのサイトで行く
http://www.nanaco-net.jp/service/creditcharge_flow.html
2)登録したリクルートのクレジットカードでnanacoへチャージ(1.2%pt)
(他のカードはJCBでないと駄目等が多くポイントがつかない)
3)711に行きnanacoで税金を払う
4)リクルートのポイントをPontaへ変える?

※5000円以上からしかチャージができない、3.2万いるときは0.5(1日目)+2.7(2日目)、注意
※1日1回、月10回まで、1日の上限3万、1か月の上限20万

参照:
http://icube2011.doorblog.jp/archives/3668174.html

■銀行金利(楽天の方が便利だが、あおぞらの方が金利が高い、楽天300万で遣り繰りがいいのでは)
あおぞら銀行 BANK 年0.2%
 ゆうちょ銀行・郵便局のATMで無料で入出金可能
  セブン銀行ATMなら入金だけ無料
 振込手数料は 他行振込154円/回、同行間無料(デビット利用があった月は1回無料)

楽天
普通預金の残高300万円以下の部分:年利0.10%
普通預金の残高が300万円を超える部分:年利0.04%
 100万位残高があると、他行振り込み、ATM入出金が、何回か無料になる

■マイナンバーカード
トップページ | マイナポータル (myna.go.jp)
スマホアプリだと、機種との相性がある、無理だった
PC+Chrome機能拡張+カードリーダ でスマホでできることはできそう
カードリーダにカードを挿しUSB接続 > 上記サイトでログイン > その後にやりたい操作
手続きフロー|口座開設のご案内|イオン銀行 (aeonbank.co.jp)

■確定申告(転職等で年末調整がされなかった時)
マイカードをリーダで使えば5年分可能、5年時効だったと思う
受付システム(通知等) https://uketsuke.e-tax.nta.go.jp/UF_APP/lnk/MenuMnmbCdKakutei
 ↑Chrome機能拡張等をインスコし、一度Chromeを終了し起動する、MyNumberの暗号4桁
Howto&確定申告 https://www.e-tax.nta.go.jp/kojin.html
 ↑印刷し郵送する方法を令和元年分は取った、源泉票より申請書類を作成する
ふるさと納税や医療費は、12月31日が終わらないと1年間の総額を確定できない
確定申告をするかワンストップ特例制度
ワンストップ特例制度を利用した場合、控除額のすべてが翌年度の住民税から控除
 →ふるさとはワンストップであればいつ注文でもいい

ふるさと納税で使える額は給与や控除等で大きく変わるで毎回サイトで確認を

■ダイエー
ダイエー優待
利用可能期間:2015年6月1日(月)~2017年5月31日(水)
代金3%OFF、クレジット支払い(ときめきポイント0.5%:サイトで1000単位でWaonに交換する)
イオン系だと200円で1ptや感謝デー等がある

クレジット払いだとときめきポイントが貯まる
サイトでWAON POINTへの交換(電子マネーWAONポイントは端末で手続きが要るので駄目)
支払い時WAONポイントが使えるようになる
http://www.aeon.co.jp/index.html

WAONポイントと電子マネーWAONポイントと違う

■電子マネーWAON
WAONポイント0.5%、ポイントはFamiポート/イオン銀行ATM/ミニストップ店員でチャージさせる
チャージはオートと現金がある
吉野家、マクドなどクレジットが使えないところで使う
ダイエーカードも併せて使えてエコポイント0.5%(レジで使える)

※WAONポイントをチャージさせて、吉かMでWAONを使い切る
※今のところ、ほぼ同じなので楽天でもイオンでもそれ系統の店であればそれを使う

■イオンゴールド
海外旅行保険:利用ナシでもあり
国内旅行保険:旅費や宿泊支払いで、入院日額5000円

■イオン20日30日は5%off
一部洋酒は適応外

■Tポイント
複数あるとPTを一定期間でまとめると吉(BCタイプ)
http://tsite.jp/r/ptido/index.html

■楽天Edy
オートチャージ1000円にした、チャージ時0.5%。レジでのチャージはポイント貯まらない
1日1万までの限度にしてあるが2.5万まで可
チャージ0.5%+楽天Edy0.5%+楽天ptカードの3重取りだと1.5%位に
あんまり使えないな、オートチャージを無くし普通にクレジットの方が良い

■楽天カード
海外旅行保険:旅費支払いだと3ヶ月以内はでる

■楽天Pay+Ponta提示
支払いは楽天Pay(クレジット楽天)で1.5%、PontaPt1%=2.5%

■関電ガス
関西電力と関電ガスの基本料金はまとまらない
しかしなっとくプランで6%程度+電気セット割3%+早期割1%で、大阪ガスと比べて10%程度安いらしい
解約金は大阪ガスへの戻し等でデメリットはない

ENEOS電気で基本料金1年無料キャンペーンで285円x12安くなる
電気料は従量電灯Aから月70円安くなる=>1年目は1500円/年位安いが、セット割りがなく翌年から1000円位高い=>切り替え面倒
https://www.noe.jxtg-group.co.jp/denki-kyotsu/swcplp/?companycode=2000&partnercode=603409&utm_source=yahoo&utm_medium=ad_exchange&utm_campaign=202002_newmember_ele_kansai&waad=sW7YiMpL

セット割で3%off 年4万で1200円くらい安い
https://kepco.jp/gas/menu_nattoku/

関電 従量電灯A=>なっトクでんき 100kwhで月50円くらい安い
100kwh 2,068円 2,011円
大阪ガス 一般料金=>なっトクガス3m^2で月100円くらい安い
3m^2 1,253円 1,167円

なっとくガス
イ 基本料金
1月および1契約につき745 円 10 銭
ロ 従量料金
1立方メートルにつき155 円 88 銭

■PayPay
2弾 2019/2/12-2019/5/31 まで20%Off
ファミマ、松屋、ビッカメ、ヤマダ、ミニストップ、ワタミ等

■Line pay
2019/3月1日(金)~3月14日(木) ローソン20%off
コンビニチャージ(ファミリーマート)、 famiポートでコンビニ支払い、QR/バーコードを表示してレジでチャージ
銀行口座を登録してチャージ
LinePayのPt 例)3/9 -> 5/3頃までに付く
 Line>Lineウォレット>Lineポイント>Lineポイント履歴で確認ができる
  3/8 2/27 2/25 2/20 2/11 1/11 12/14 12/6 11/30 11/27 11/16 11/10 10/3
   11/30まで付いている
Line outは固定なら3分、携帯なら1分無料、通常広告を見るが登録施設なら見ない

■郵便局
2020/5からキャッシュレス決済対応、2月から一部
https://www.post.japanpost.jp/life/cashless/index.html

親のお金が引き出せない!認知症による口座凍結から親のお金を守る6つの方法 (mirasia-times.jp)

■Amazon
プライムの契約や解約で同じ期限や同じセキュリティコードでクレジットカードが再発行される
プライム契約しているときのものを使い続けるといい?

■QUOカード使える店
エネオス、マツキヨ、本屋、ビッグエコー、HMV、UCC、711ファミマローソン
使えるお店 | 【公式】ギフトといえばQUOカード(クオカード) (quocard.com)

■家(自作)
極太突っ張り棒を使って仕切り等で狭くても効率よく使う
2x4で最下段収納の2.5段ベッド
レンタル倉庫 minikura(ミニクラ)| 安心、簡単に使える収納サービス | 寺田倉庫
基礎ブロック+単管パイプで車庫(高さや3方外気遮断、建築確認申請の義務:施工前や施工後に申請や検査で後追いでは認められる事はない、グレーで黙認も多いらしい)

Posted by funa : 04:08 PM | Gadget | Comment (0) | Trackback (0)


August 30, 2015

Photo Boo

Photo Boo
超重要サイト。写真部の部活。現時点では1年足らずだが大体同じプロセスでこの釣果。ライザップと3股中。α7R、G7X、Kiss X4、DP2 Merrill、ixy 30s

Posted by funa : 01:17 AM | Web | Comment (0) | Trackback (0)


March 28, 2015

Victorinox PLI traveller

Sony α7R ISO2500 F5 1/30 29mm, SEL1635Z Vario-Tessar T* FE 16-35mm F4 ZA OSS

ビクトリノックス PLIトラベラー
閉じた長さ: 91mm
ラージブレード(大刃)・スモールブレード(小刃)・カン切り・マイナスドライバー(小)・栓抜き・マイナスドライバー(大)・ワイヤーストリッパー・リーマー(穴あけ)・キーリング・ピンセット(毛抜き)・ツースピック(爪楊枝)・はさみ・マルチフック・プライヤー・ワイヤーカッター・端子つぶし・ソーイングアイ(糸穴)・プラスドライバー
Zebra SL-F1ミニ
ABITAX タグライト

ポケットに小さな道具を詰めるというある種の美学というか。

Posted by funa : 12:55 PM | Gadget | Comment (0) | Trackback (0)


February 22, 2015

Oxcelo

折り畳み自転車の運用を断念し、コレで移動のレボリューションを起こした。
コレは電車移動先、旅行先でのラスト5kmの決定的移動手段だ。
梅田から難波は楽に行ける、1ブロックは数秒だから町ブラ、引越し先を探すのにも良いのだ。

自転車の方が圧倒的に楽で早いが、徒歩と比べ距離/スピード/疲れにおいて非常に優れる。
折り畳み時は、トルクス一本でハンドルポストが外れ90x35x15cmに、リヤホイル外すと75x35x15cm。
重いがベルトを直接付けられる、実質片輪で転がすしかない。
南京錠で町の手すり等に固定できる。
持ち上げるとハンドルフリーなので足に当たったりする、基本は持ち上げずハンドルで取り回す、持ち上げるときはハンドルを切ってから持ち上げる。
靴が減りそうだが、足腰を落としてから蹴ると良く進む。


注意不足でハンドルを硬く固定できていないとズレる。
振動があり耐久性は期待できない気がする。

5.9kg タイヤ径200mm ハンドブレーキがあることが特徴で下り坂が利点になる
折り畳み90x33x15
Oxelo town9 easyfold suspension

オクセロはフランスから来ているが、世界最大のスポーツ用品店のデカトロンの一ブランドとのこと
https://www.decathlon.co.jp/jp_ja/?gclid=EAIaIQobChMIs-er3K-Y4QIV1aiWCh2S0wN4EAAYASAAEgKbNvD_BwE


■その他持ち運び重視のキックボード
Halo 1.9kg 耐荷重:50kg ウィール:120ミリ 高850長720 折り畳み215x650
https://store.shopping.yahoo.co.jp/bespo/halo-001.html?sc_i=shp_pc_search_itemlist_shsr_title

AVIGO BC125 2.8kg 耐荷重:100kg ウィール:125ミリ 高805長690
https://www.toysrus.co.jp/s/dsg-407683400

■電動
Xiaomi M365
http://www.gearbest.com/skateboard/pp_596619.html?lkid=10794995

Posted by funa : 12:22 AM | Gadget | Comment (0) | Trackback (0)


December 23, 2014

α7Ⅱ


a7ii_FE35mmF2.8_35mm パンケーキ

フルサイズEマウントのSony α7Ⅱだ。パンケーキだとコンデジに近いサイズになるが、解像度はズームが良いかも。ツァイス感はないかな。FE 70-200mm F4 G OSSだと本体の手振れ補正でなくレンズ側か。パンケーキの動画は本体補正で振れがない。バリSelfiなし。

Posted by funa : 01:48 AM | Gadget | Comment (0) | Trackback (0)


Navi: <  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20  >
PhotoGallery


TWITTER
Search

Mobile
QR for cellphone  QR for smart phone
For mobile click here
For smart phone click here
Popular Page
#1Web
#2Hiace 200
#3Gadget
#4The beginning of CSSレイアウト
#5Column
#6Web font test
#7Ora Ora Ora Ora Ora
#8Wifi cam
#9みたらし団子
#10Arcade Controller
#11G Suite
#12PC SPEC 2012.8
#13Javascript
#14REMIX DTM DAW - Acid
#15RSS Radio
#16Optimost
#17通話SIM
#18Attachment
#19Summer time blues
#20Enigma
#21Git
#22Warning!! Page Expired.
#23Speaker
#24Darwinian Theory Of Evolution
#25AV首相
#26htaccess mod_rewite
#27/// BANGBOO BLOG /// From 2016-01-01 To 2016-01-31
#28竹書房
#29F☆ck CSS
#30Automobile Inspection
#31No ID
#32Win7 / Win10 Insco
#33Speaker
#34Arcade Controller
#35Agile
#36G Suite
#37Personal Information Privacy Act
#38Europe
#39Warning!! Page Expired.
#40GoogleMap Moblile
#41CSS Selectors
#42MySQL DB Database
#43Ant
#44☆od damnit
#45Teeth Teeth
#46Itinerary with a eurail pass
#47PHP Developer
#48Affiliate
#49/// BANGBOO BLOG /// From 2019-01-01 To 2019-01-31
#50/// BANGBOO BLOG /// From 2019-09-01 To 2019-09-30
#51/// BANGBOO BLOG /// On 2020-03-01
#52/// BANGBOO BLOG /// On 2020-04-01
#53Windows env tips
#54恐慌からの脱出方法
#55MARUTAI
#56A Rainbow Between Clouds‏
#57ER
#58PDF in cellphone with microSD
#59DJ
#60ICOCA
#61Departures
#62Update your home page
#63CSS Grid
#64恐慌からの脱出方法
#65ハチロクカフェ
#66/// BANGBOO BLOG /// On 2016-03-31
#67/// BANGBOO BLOG /// From 2017-02-01 To 2017-02-28
#68/// BANGBOO BLOG /// From 2019-07-01 To 2019-07-31
#69/// BANGBOO BLOG /// From 2019-10-01 To 2019-10-31
#70/// BANGBOO BLOG /// On 2020-01-21
#71Bike
#72Where Hiphop lives!!
#73The team that always wins
#74Tora Tora Tora
#75Blog Ping
#76無料ストレージ
#77jQuery - write less, do more.
#78Adobe Premire6.0 (Guru R.I.P.)
#79PC SPEC 2007.7
#80Google Sitemap
#81Information privacy & antispam law
#82Wifi security camera with solar panel & small battery
#83Hope get back to normal
#84Vice versa
#85ハイエースのメンテ
#86Camoufla
#87α7Ⅱ
#88Jack up Hiace
#89Fucking tire
#90Big D
#914 Pole Plug
#925-year-old shit
#93Emancipation Proclamation
#94Windows env tips
#95Meritocracy
#96Focus zone
#97Raspberry Pi
#98Mind Control
#99Interview
#100Branding Excellent
Category
Recent Entry
Trackback
Comment
Archive
<     July 2024     >
Sun Mon Tue Wed Thi Fri Sat
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Link