2016年12月18日日曜日

jQueryで前後の要素を入れ替えるシンプルな書き方

動きのイメージ




コード

<section class="main container">
    <section>
        要素1
    </section>
    <section>
        要素2
    </section>
    <section>
        要素3
    </section>
</section> 
<script>
$(function() {
    $('下へのセレクタ').click(function() {
        var section = $('section.main > section').has(this);
        section.next().after(section);
    });
    $('上へのセレクタ').click(function() {
        var section = $('section.main > section').has(this);
        section.prev().before(section);
    });
});
</script>

解説

一つ下へ移動する場合、該当の要素を次の要素`next()`の後`after()`に置く
一つ上へ移動する場合、該当の要素を前の要素`prev()`の後`before()`に置く

要素の個数や順番を計算するなどを最初に考えたがプロトタイプ作る上ではこれで十分だったのでメモ



2016年12月6日火曜日

リリース前に文法チェックを差分実行して確認する


コード(bach)

git fetch origin
for FILE in `git diff --name-status origin/master -- | grep -E '^[AUM].*\.php$'| cut -c3-`; do
  if php -l $FILE; then
    echo "OK"
  else
    exit 1
  fi
done

解説


まずfetchして最新のmasterを取得します
diffを取得してA: 追加、M: 更新、U: 競合しているファイルを抽出
必要な場所だけ取得してループを回します

$FILEを用いてphp -lで文法チェックする

2016年12月5日月曜日

複数のgzファイルを一気にgrepする方法

コード

find ./ -name "*.gz" -exec zgrep '正規表現' {} \;

解説

-execは引数を受け取って後続の処理に受け渡すオプション。{}の位置に受け取ったファイル名を渡す\;で終わらせるのがルール

2016年1月4日月曜日

Google apps script でGmailの下書きをつくるライブラリ

Google apps script でGmailの下書き(draft)をつくるライブラリを作成したので紹介します。


背景

Google apps scriptの標準関数だとメール送信はあるけど下書きが作れない!
Gmail APIを利用した形で実現出来たのでライブラリ化しました。

使い方

下記のような感じでbuildしてmake()で下書きが作成されます。

project id
M6iKsfeXXavjDNzz6EEFRBu141rqerMCH
example
var MailLib = new createHTMLDraftInGmail();
MailLib.From('sample@example.com')
       .To('sample@example.com')
       .Title('title')
       .HtmlBody('body
test')
       .make();


2015年11月10日火曜日

google apps script のライブラリを取り込んで利用する

今回はgoogle apps script でライブラリをつくる方法をご紹介します。

何がいいか?

  • 公開されている便利なライブラリを利用して効率よくプログラムできる
  • 自分で共通ライブラリを作って、読み込んで使うことで保守性が上がる

ライブラリを読み込む

  • 「リソース」タブの「ライブラリ」を選択する
  • プロジェクトキーを入力する
  • バージョンを指定する
  • 保存する




スクリプト内で利用する

「識別子」として指定した文字列で読み込んだライブラリを使うことができます
ex) var GetStockDataObj = GetStockData.factory({hoge: 'fuga'});



2015年11月6日金曜日

google apps script ライブラリの作り方と公開方法

今回はgoogle apps script でライブラリをつくる方法をご紹介します。

何がいいか?


  • 異なるファイルなどで作った関数やクラスを違うスクリプトから使うことができる
  • 便利関数など共通化しておける
  • 作ったプログラムを外部に公開できるので世界中で使ってもらえる(大げさ)
自分でもライブラリを一つ公開しました
=> google apps script 向け株式情報取得ライブラリ

ライブラリをつくる

バージョンを登録する


  • 「班を管理」を選ぶ
  • バージョンのタイトルを入力して「新しいバージョンを保存」を押す



プロジェクトキーを取得する


  • プロジェクトのプロパティを選ぶ
  • プロジェクトキーの項目の英数字をメモ帳などに保存しておく




権限設定を変える


閲覧権限以上がないとスクリプトを実行できないですので権限設定を変えます
「共有ボタン」を押す
権限を閲覧可に変更する(今回は一般公開なので誰でも閲覧可にしました限定して公開する場合は特定のアドレスだけに共有するようにしてください)










2015年11月2日月曜日

スプレッドシートで株価管理するための google apps script 向け株式情報取得ライブラリ

はじめに


自分が株価取得用に作ったgoogle apps scriptのスクリプトをライブラリ化したので紹介します。
これを定期実行の関数から呼び出して、株価の管理をしています。

できること

  • 株式が存在するか
  • 現在の株価の取得
  • 社名の取得
  • 単元株式の取得
  • 予想配当の取得
==> サイトにある情報ならmatch使って拡張すれば良いので今後は出来高なども取れるようにする予定

github


https://github.com/uenoryoichi/googleAppsScript/blob/master/getStockData/GetStockData.gas

使い方

  1. ライブラリを読み込む
  2. codeを引数に渡してfactoryでオブジェクトを作成してください

技術的なこと -- プロトタイピングでの記述 --

jsでちょっとしたライブラリつくる時に使われているプロトタイプを使う機会が無かったので今回のライブラリ化に際して使ってみました。

良かった面

  • 共通で使う初期値などを予めsetして、それに沿ったオブジェクトを返してくれるので、単純に関数群としてのライブラリと異なり、分離した時に引数の受け渡しを都度都度しなくて良くなった。
  • 特にurlFetch部分の呼び出しがオブジェクト生成時のみになったので、かなり高速化して、GASの起動時間による制限でできなかったことができるようになった。
  • ライブラリ内のメソッドを継承したり追加したりできるので特殊な対応が必要な時にも柔軟に対応できる

まだまだな点

yahoo依存で頑張ってmatch関数によってデータを取得しているので、まだ不完全

  • 上場廃止のものはページが存在しているので取得できてしまう
  • 取得できるものがまだ限られている
  • 今まで作ってきた他のスクリプトとの相性上、今回は一つ一つの値を返すようにしたが、連想配列を一括で返すほうが、ライブラリとしては良いのではないかと作ってて思った

2015年9月30日水曜日

CSVダウンロード => googleドライブ保存を定期化する際に気をつけること


こちらの記事の続報です。
CSVをダウンロードしてGoogle Drive に保存する処理をGoogle Apps Script で作ってみた

google apps script は定期的な実行を簡単に行うことができます。

前回作ったスクリプトも毎日実行しておけば自動的にcsvが特定のフォルダに保存されて、データ収集が自動化できます。ここでいくつか失敗したことがあったので、その対処として入れた処理を紹介します。



同じファイルがあったら処理を終わらせる。

ソースコード

  var folderId = '1234567890';
  var file = DriveApp.getFolderById(folderId).getFilesByName(date + '.csv');
  if (file.hasNext()) return;

ileIterator::hasNext()

getFilesByNameがFileIteratorクラスで値を返してきます。
hasNext()でファイルがあれば、既にダウンロード済みなので処理は終了させてます。


CSVが存在しなくてリダイレクトされちゃったら処理を終わらせる

ソースコード


  if(response.getBlob().getContentType()=='text/html') return;

2015年9月28日月曜日

CSVをダウンロードしてGoogle Drive に保存する処理をGoogle Apps Script で作ってみた

googleドライブに貯めておきたいデータをダウンロードするのに、google apps script(GAS)使うと親和性高いから楽かも!と思い作成しました。

今回は株価のCSVを提供しているサイトからCSVをダウンロードしてそのままドライブに保存するまでです。

ソースコード


function getCsvSample() { 
  var folderId = '1234567890';
  var destfolder = DriveApp.getFolderById(folderId);
  var date = "2015-09-25";
  var response = UrlFetchApp.fetch("http://k-db.com/?p=all&download=csv&date=" + date);
  destfolder.createFile(date + '.csv', response.getContentText('Shift_JIS'));
}

変数、クラス、関数の説明


folderId

フォルダを特定するIDです。該当フォルダのURLをコピって来てください
https://drive.google.com/drive/**/**/folders/{ココに記述してある文字列}

DriveApp

googleドライブのファイルやフォルダを操作するクラスです。

UrlFetchApp

よく使うやつ、スクレイピングでお世話になっています。外部サイトへアクセスするときに使います。

getContentText()

今回はここで苦労しました。日本語が文字化けしてしまっている場合は保存や操作をする前に文字コード指定しないといけないです

2015年6月27日土曜日

Google Apps Script 自動で曜日ごとに色を付ける



定期的にデータを貯めこんでいるシートの日付部分をわかりやすくするために
曜日ごとに色を付けられるスクリプトを作りました。

集計メソッドの最後くらいで読んでおけばOK


// 曜日で色を付ける
function setColorWeekend(){

  var range = sheet.getRange("A2:A5");
  var cols = range.getNumColumns();
  var rows = range.getNumRows();
  for (var i = 1; i <= rows; i++) {
    for (var j = 1; j <= cols; j++) {
      var cell = range.getCell(i, j);
      var w = cell.getValue();
      // 0が日曜日/背景を赤に
      if ((w % 7) == 0) {
        cell.setBackground("#FF0000");
      // 6が土曜日/背景を青に
      } else if ((w % 7) == 6) {
        cell.setBackground("#4169E1");
      } else { 
        cell.setBackground("#FFFFFF");
      }
    }
  }
}


2015年6月14日日曜日

GAイベントタグが発行されているか確認する方法

GAのリアルタイムで見る方法もあるけれど、自分のIPからのアクセスは除外していると

検証ができないので確認方法

GAの要素を検証

  

ネットワークタブを開く



Control+Fで__utmを検索

ロードでGA発行している場合は、画面表示後に行えばOK
クリックアクションの時は、ボタンをクリックした時に発行されるのでクリック後に見る

対象のアクションが記載されているURLが存在するかを確認する

例) 0008_expert_message

情報漏えい対策!evernoteの記述にパスワードをかけてセキュアに使う

evernoteを少しでもセキュアに使うための工夫
  • 一番安全なのは「社内のサーバーにおいておく」だけど社外で作業する時や緊急対応ができない。
  • ローカルにパスワード付きで保存しておくのも検索性が悪いしパソコンなくした時のリスク考えたらクラウド上とトントン

目次

  • パスワードを設定する
    • テキスト範囲を指定する
    • 右クリックして「選択したテキスト範囲を暗号化」を選択
    • パスフレーズ入力
    • 選択範囲が秘匿された状態になる
  • パスワードをかけて隠したものを閲覧する
    • パスワードかけた部分で右クリックして「暗号化されたテキストを表示」を選択
    • パスワード入力
    • 表示される

パスワードを設定する

テキスト範囲を指定する



右クリックして「選択したテキスト範囲を暗号化」を選択



パスフレーズ入力



選択範囲が秘匿された状態になる








パスワードをかけて隠したものを閲覧する

パスワードかけた部分で右クリックして「暗号化されたテキストを表示」を選択


パスワード入力


表示される

2015年4月19日日曜日

CentOS7.0でgitをソースからインストールする

前提

CentOS7.0を最小構成でインストール済み
gitの最新版はこちらの左カラムで確認

基本的な流れ

  1. 必要なパッケージをインストール
  2. ソースをダウンロード
  3. インストール

$ sudo yum install curl-devel expat-devel gettext-devel \  openssl-devel zlib-devel
$sudo yum install wget

$cd /usr/local/src
$sudo wget https://git-core.googlecode.com/files/git-1.9.0.tar.gz

2015年4月14日火曜日

php短縮タグが使えない!

いつもphpのタグを <?  ?> で書いているのですが、
CakePHP3.0を試すために先日新しく環境を建てた際に <?php   ?> でしか動かなかったのでメモ

調べてみたら簡単なのですが、php.iniで設定が必要みたいです

$ php -i | grep php.ini

short_open_tag の値をオンにする
$ sudo vi /etc/php.ini
;short_open_tag = Off
short_open_tag = On
参考:PHPマニュアル
http://php.net/manual/ja/ini.core.php

2015年1月18日日曜日

iCLUSTAサーバーでWordPressを導入する

iCLUSTAでWordPressを導入する

iCLUSTAにはページ上からWordPressを導入するツールがあるみたいですが、ローカルで試してからアップロードしたりしたい。よくわからないものは使いたくない!みたいな理由から手動で導入しました。

手順まとめ

mysqlを使えるようにする
標準ではDBサーバー使用できないので、
アカウントマネージャーでデータベースを申し込む(無料です)

WordPressをインストール
ダウンロードと設定ファイルの変更が必要です

1、MySQLを使用可能にする

  • そのままでは使えません
  • GMOクラウドのアカウントマネージャーに行く
  • 右上にあるログイン画面からログインする
  • 各種手続き=>サービスに関する手続き=>オプション申込み=>契約してるプランを選択
  • 追加項目の「無料データベース(MySQL)」を選択=>次へ
  • この後、案内にしたがって進むと申し込みができる。

注意点

  • 一度に一つのデータベースしか申し込めないので、複数個作る時には上の操作を何回か行う必要がある
  • 申し込みから開設まで1日くらい時間がかかる
この手順はphppMyAdminの導入手順と同じです


WordPressをインストール


  • WordPressをダウンロード
  • http://ja.wordpress.org/  公式ページ右側にあるダウンロードリンクからダウンロードします。






  • WordPressをサーバーにアップ
  • ダウンロードしたファイルを解凍してフォルダ名を変更
  • 最後に解凍してFileZillaなどを使ってphpmyadminフォルダをサーバーの直下に配置

設定ファイルの記述を変更


  • mysqlを使うために設定ファイルを変更
  • 解凍したフォルダ直下にwp-config.phpを作成   ※解凍フォルダ直下にwp-config-sample.phpがあるのでコピーする
  • wp-config.php内の記述を変更


// ** MySQL 設定 - この情報はホスティング先から入手してください。 ** //
/** WordPress のためのデータベース名 */
define('DB_NAME', 'database_name_here');

/** MySQL データベースのユーザー名 */
define('DB_USER', 'username_here');

/** MySQL データベースのパスワード */
define('DB_PASSWORD', 'password_here');

/** MySQL のホスト名 */
define('DB_HOST', 'localhost');


この○行目の記述を変更します
PlanManager ➔ ユーティリティ ➔ データベース設定から情報を確認して下さい
PlanManager : https://www.iclusta.com/util/db/


/** WordPress のためのデータベース名 */
//データベース名を入力
define('DB_NAME', 'ABCdef123');

/** MySQL データベースのユーザー名 */
//データベース名を入力
define('DB_USER', 'ABCdef123');

/** MySQL データベースのパスワード */
//編集で設定できます
define('DB_PASSWORD', 'password');

/** MySQL のホスト名 */
//データベースサーバー名:ポート番号の順でつなげる
define('DB_HOST', 'mysql123.in.shared-server.net:12345');     


設定ファイルをサーバーにアップする


これで設定完了です。
www//********.***/フォルダの名前/admin にアクセスすれば管理画面が出てきます。
あとはWordPressの設定手順にしたがってユーザー情報などを登録して使えるようになります


2014年10月18日土曜日

cakephp 中間テーブルの命名規則

中間テーブルの命名規則で右往左往したのでメモ

cakephpの中間テーブルの命名規則


複数形をアンダースコアでつなぐ
順番はabc順

「ユーザー」と「趣味」を多対多の関係で表現する場合

interests_usersとなる

modelの命名規則

複数形 + アンダースコア + 単数でつなぐ
順番はabc順

modelは単数なのでモデル名の末尾は単数にする
中間テーブルの一つ目の名称は複数のままにする
interests_user.php

インスタンスの命名規則

アッパーキャメルで複数 + 単数
InterestsUser




2014年10月14日火曜日

cakephp saveAllの仕様

オプションでvalidate onlyとした時、IDの補完はしない

save Allの便利な機能の中に、リレーションを張るとidを保管してくれる機能があります。
しかし、確認画面を挟むなどの理由でバリデーションだけをしたい時に、validatesをonlyとしてしまうと、idの補完は行われません。

なので、そのIDに依存するバリデーション条件が設定されている場合は、必ずエラーに成ってしまうので気をつけないといけません。

User hasone UserInfo

$data = array(
    'User' = array(
        'name' => 'waldo',
        'tel'     => 0123456789,
    ),
    'UserInfo' = array(
        'prefecture' => 'hokkaido',
        'city'           => 'sapporo',
    ),
);
       
$this->User->saveAll($data, $options);

この場合、UserInfo.user_idにinsertしたデータのUser.idが補完されてsaveされます。

$options = array('validates' => 'only');
$this->User->saveAll($data, $options);
とした場合は、上記の補完が適用されないため、user_idの存在の確認や、市外局番と住所の不一致などのバリデーションをuser_id経由で行えなくなります。(user_idが無いというエラーが出ます)

同様のことは
$options = array('validates' => 'first');
とした時にも一度onlyでバリデーションチェックをするので発生しますので注意してください。

解決方法

saveAllを使わない

idを補完したいということならsave後に$this->User->idでinsertしたIDを取得できるので、自前でsaveAll的なメソッドを作ってしまう。
逐一、unsetなどができて自由度が高い。

atomic => false で外部トランザクションをかけて毎回ロールバックする

楽ちんだが、オートインクリメントされていくので、IDが飛び飛びになってしまう

UserInfoバリデーション時にUserのPOST値を見に行く作りにする

UserInfoだけ追加でinsertしたい、updateしたいなどの時に、別途バリデーションを作らないといけない。冗長な作りになってくる



2014年10月13日月曜日

マージしたコミットを戻す git revert -m 1 と git revert -m 2 の違い

マージコミットのrevertで後ろにつける引数について、ネット上を探してもなかなかまとまっているページがなかったので、まとめます。

参考
http://blog.toshimaru.net/git-revert-mainline/

そもそもマージしたコミットの逆差分を作るには?
オプションで -m を指定します。今回はその後ろにつける1,2の引数についてです

git revert -m 1

マージをした側に戻すように差分をつくる
基本的に使うのはこっちが多い

git revert -m 2

マージされた側に戻すように差分をつくる

実際にやってみる

[uenoryouichi@ueno-MacBook-Air:git_study](master)$ git checkout -b merged
[uenoryouichi@ueno-MacBook-Air:git_study](merged)$ vi test.php
[uenoryouichi@ueno-MacBook-Air:git_study](merged)$ git add .
[uenoryouichi@ueno-MacBook-Air:git_study](merged)$ git commit -m 'このブランチをマージする'

[uenoryouichi@ueno-MacBook-Air:git_study](base)$ git checkout master
[uenoryouichi@ueno-MacBook-Air:git_study](master)$ git checkout -b base
[uenoryouichi@ueno-MacBook-Air:git_study](base)$ vi test.php
[uenoryouichi@ueno-MacBook-Air:git_study](base)$ git add .
[uenoryouichi@ueno-MacBook-Air:git_study](base)$ git commit -m 'このブランチでマージコマンドを打つ'
 
[uenoryouichi@ueno-MacBook-Air:git_study](base)$ git merge merged
Auto-merging test.php
Merge made by the 'recursive' strategy.
 test.php | 4 ++++
 1 file changed, 4 insertions(+)
 
[uenoryouichi@ueno-MacBook-Air:git_study](base)$ glog
*       Ryoichi Ueno    25605e9  (HEAD, base) Merge branch 'merged' into base
|\
| *     Ryoichi Ueno    5e19ce5  (merged) このブランチをマージする    (<= 2に相当)
* |     Ryoichi Ueno    4e1dfd0  このブランチでマージコマンドを打つ   (<= 1に相当)
|/
*       Ryoichi Ueno    f410859  (master) second
*       Ryoichi Ueno    70e35e5  initial commit
[uenoryouichi@ueno-MacBook-Air:git_study](base)$


git revert -m 1でrevertする

[uenoryouichi@ueno-MacBook-Air:git_study](base)$ git revert -m 1 25605e9
[uenoryouichi@ueno-MacBook-Air:git_study](base)$ glog
*       Ryoichi Ueno    fe81bcd  (HEAD, base) Revert "Merge branch 'merged' into base"
*       Ryoichi Ueno    25605e9  Merge branch 'merged' into base
|\
| *     Ryoichi Ueno    5e19ce5  (merged) このブランチをマージする
* |     Ryoichi Ueno    4e1dfd0  このブランチでマージコマンドを打つ
|/
*       Ryoichi Ueno    f410859  (master) second
*       Ryoichi Ueno    70e35e5  initial commit
[uenoryouichi@ueno-MacBook-Air:git_study](base)$ git diff --stat 4e1dfd0       baseブランチ側とは差分がない
[uenoryouichi@ueno-MacBook-Air:git_study](base)$ git diff --stat 5e19ce5      mergedブランチ側と差分がある
 test.php | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

git revert -m 2でrevertする


[uenoryouichi@ueno-MacBook-Air:git_study](base)$ git revert -m 2 25605e9
[uenoryouichi@ueno-MacBook-Air:git_study](base)$ glog
*       Ryoichi Ueno    1b77f6a  (HEAD, base) Revert "Merge branch 'merged' into base"
*       Ryoichi Ueno    25605e9  Merge branch 'merged' into base
|\
| *     Ryoichi Ueno    5e19ce5  (merged) このブランチをマージする
* |     Ryoichi Ueno    4e1dfd0  このブランチでマージコマンドを打つ
|/
*       Ryoichi Ueno    f410859  (master) second
*       Ryoichi Ueno    70e35e5  initial commit
[uenoryouichi@ueno-MacBook-Air:git_study](base)$ git diff --stat 4e1dfd0   baseブランチ側と差分がある
 test.php | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)
[uenoryouichi@ueno-MacBook-Air:git_study](base)$ git diff --stat 5e19ce5    mergedブランチ側とは差分がない

git reset のオプションについて --soft --hard --mixedの違い

rd : 差分は破棄される(indexとworking treeも戻る)
mixed : add前の状態で保持されている(working treeが保持)
soft : add状態で保持されている(indexも保持)

参考

http://d.hatena.ne.jp/murank/20110327/1301224770


用語の補足

HEAD:コミット状態
index:addした状態
working tree:add前の変更分

[uenoryouichi@ueno-MacBook-Air:git_study](master)$ vi test.php
[uenoryouichi@ueno-MacBook-Air:git_study](master)$ git add test.php
[uenoryouichi@ueno-MacBook-Air:git_study](master)$ vi test.php
[uenoryouichi@ueno-MacBook-Air:git_study](master)$ git status
[uenoryouichi@ueno-MacBook-Air:git_study](master)$ glog
*       Ryoichi Ueno    f410859  (HEAD, master) second                ←HEAD
*       Ryoichi Ueno    70e35e5  initial commit
[uenoryouichi@ueno-MacBook-Air:git_study](master)$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)                                   ←index
 
     modified:   test.php
 
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
 
     modified:   test.php                                                                    ←working tree



http://d.hatena.ne.jp/murank/20110327/1301224770 より引用


この状態でそれぞれどのような動きになるか試してみましょう
git reset --soft HEAD
git reset --soft HEAD^
git reset HEAD
git reset HEAD^
git reset --hard HEAD
git reset --hard HEAD^

git resetとgit revertの基本

コードを過去に戻すgit resetとgit revertの違いについて解説します。

ソースを切り戻す時、resetなのか?revertなのか?gitに慣れていないメンバーが多いこともあり、しっかり理解することで安心して切り戻しなどの作業をみんなができるようになると良いなと感じたことから記事にさせていただきました。

はじめに

コードの中にこちらのaliesが使われていますので記載します。

alias glog='git log --graph --all --format="%x09%C(cyan bold)%an%Creset%x09%C(yellow)%h%Creset %C(magenta)%d%Creset %s"'


resetとrevert

利用シーン
過去に戻る。
コミットした差分を修正したい

resetの基本

「指定したコミット位置までHEADの位置を戻す」

revertの基本

「指定したコミットの逆差分を作成する」

よくある切り戻しのシーン

バグが有るコードをリリースしてしまった。orz
リリース前のコードに戻したい!!

どちらが正しいでしょう?
git resetを使って、前回リリースした位置まで戻す!
git revertを使って逆差分で上書きする!


正解はもちろん「git revertする」です。

revertによる切り戻し手順

revert -m 1 <commit hash>でマージコミットの逆差分を作ります(-m と 1 については下方で解説します。)
 ※切り戻し自体はgithubのwebUIによる操作もできるようになりました(下方に記載)

[uenoryouichi@ueno-MacBook-Air:git_study](base)$ git revert -m 1 25605e9
[uenoryouichi@ueno-MacBook-Air:git_study](base)$ glog
*       Ryoichi Ueno    fe81bcd  (HEAD, base) Revert "Merge branch 'merged' into base"
*       Ryoichi Ueno    25605e9  Merge branch 'merged' into base
|\
| *     Ryoichi Ueno    5e19ce5  (merged) このブランチをマージする
* |     Ryoichi Ueno    4e1dfd0  このブランチでマージコマンドを打つ
|/
*       Ryoichi Ueno    f410859  (master) second
*       Ryoichi Ueno    70e35e5  initial commit

reset使っちゃいけない理由

gitの概念として歴史を改変してはいけない。
誰かが誤ったコミットの歴史を間違って保有している可能性がある。→デグレのリスクが生じる。
存在しないコミットから分岐したブランチが作られる可能性がある。→PRを送れないorデグレのリスク

例)
master_resetで7d71e00 をリリースしました。前回リリースは cdf4505
修正するためにresetで戻した場合(ダメなパターンです)
[uenoryouichi@ueno-MacBook-Air:git_study](recover_reset)$ git reset --hard cdf4505
HEAD is now at cdf4505 hogehogehogehoge
[uenoryouichi@ueno-MacBook-Air:git_study](recover_reset)$ glog
*       Ryoichi Ueno    7d71e00  (master_reset) miss!!!!!
*       Ryoichi Ueno    cdf4505  (HEAD, recover_reset) hogehogehogehoge
*       Ryoichi Ueno    b3bd9c4  hogehogehoge
*       Ryoichi Ueno    44515ea  hogehoge
*       Ryoichi Ueno    1b4f700  hoge
[uenoryouichi@ueno-MacBook-Air:git_study](recover_reset)$ git push -f origin master

おさらい

resetの基本
「指定したコミット位置までHEADの位置を戻す」
revertの基本
「指定したコミットの逆差分を作成する」