teleren/devto huggingface dataset:
Scrum – the hard parts 2: sprint harder
Tags: scrum, agile, humor
Published: 2017-11-16 13:08:02

---
title: "Scrum – the hard parts 2: sprint harder"
published: true
description: A not so serious look at real life Scrum. Part 2.
tags: scrum,agile,humor
---

In the [first part of this series](https://dev.to/bertilmuth/scrum---the-hard-parts-4oc), I presented my favorite list of Scrum's hard parts and how you can work around them.

In the second part, I offer you a colorful bouquet of bad practices and workarounds as well.

Have fun!

# The Product Backlog

According to the [Scrum Guide](http://www.scrumguides.org/), the Product Backlog is never complete and initially contains only the best-understood requirements.

Particularly in innovative projects, where neither requirements nor technology are known in advance, this can lead to great uncertainty. How do we know that we are are *in time, budget and scope* so that our supervisor will receive the bonus from his target agreement?

The workaround is very simple: Make sure the project initialization phase is long enough, at least several months! If you encounter resistance from agile fundamentalists, use the term *Sprint 0*. A marathon of enjoyable meetings with stakeholders is about to take place until the requirements are documented in detail and finalized.

Another clever idea on top of that: Write these requirements using the user story template. This gives the Product Backlog an agile touch.

And remember: as long as nothing is implemented, it is most likely that all the wishes of stakeholders can be taken into account!

# The Scrum Master as Servant Leader

According to the Scrum Guide, the Scrum Master is a *Servant Leader* of the Scrum Team.

If you work in a company that introduces Scrum, you should take advantage of these new servants. After all, your company has to pay them. Here are just a few examples of what Scrum Masters are used for in practice:

* Scrum Master as a messenger: Instead of sending unpleasant messages to the Scrum Team, use the Scrum Master as a messenger. You do not believe how many conflicts can be avoided!
* Scrum Master as a reporter: the [Agile Manifesto](http://agilemanifesto.org/) says that software is the most important measure of progress. But not everyone wants to deal with the products produced by their own company, if you can analyze numbers and graphs instead! It takes a reporter at the team level. No one can do that better than the Scrum Master.
* Scrum Master as project manager: Especially Scrum Masters who used to work as project managers are often more than willing to contribute their experience. To be able to control Scrum projects effectively and efficiently, think about converting the Daily Standup into a status meeting. Combine that with the possibility of assigning tasks to the developers - this is how the transition from classic project management to Scrum runs smoothly.

TO BE CONTINUED (I'M AFRAID)...

*This article originally appeared in German in the [HOOD blog](http://blog.hood-group.com/blog/2016/08/09/scrum-the-hard-parts-2-sprint-harder/)*
Parser without location information is a useless function.
Tags: api
Published: 2017-11-16 12:42:17

---
title: Parser without location information is a useless function.
published: true
description: 
tags: #api
---

# 位置情報のないパーサーはガキの使い

The parser must be with the location information(e.g. file, line, row, byte).

We can not provide decent error information about parsed data without  the location information.

[KISS](https://en.wikipedia.org/wiki/KISS_principle) and [YAGNI](https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it) are also important, but if you are providing as a library, the location information is necessary for the parser.


## originals(Japanese/日本語)
https://twitter.com/wraith13/status/931114952873537537
https://twitter.com/wraith13/status/931115196373909504
https://twitter.com/wraith13/status/931120178770845696
html（css）について
Tags: html
Published: 2017-11-16 12:22:02

---
title: html（css）について
published: true
description: 
tags: html
---

htmlファイル内にcssを書くべきときと
先にcssファイルを作っておくときってあるけど
簡単なサイトを手打ちで作るときはどっちがいいのかってのを考えてみる

which should I use

css in html (<style>~</style>)
or
css and html
Magento 2 Inventory Management Extension
Tags: magento, inventorymanagement
Published: 2017-11-16 12:01:22

---
title: "Magento 2 Inventory Management Extension"
published: true
description: 
tags: Magento, Inventory Management
---
**An Intuitive Inventory Management System**

Effective inventory management is must if you want to make your business venture successful and generate good revenue. MageMob Inventory is a perfect [Magento 2 Inventory Management System](https://www.appjetty.com/magento2-magemob-inventory.htm) that offers you with all the control you need over your store inventory. Make the most out of this Magento 2 Inventory Management extension rendered by AppJetty and behold your business achieve great success!

**Why Should You Use MageMob Inventory?**

**Manage Inventory**

Our Magento 2 based stock control system helps you manage stocks, orders, suppliers, warehouses, etc. These features are not available in the default Magento system.
 
**Easy Configuration**

The extension is simple to configure and use. All you need to do is install it, configure and start using!
 
**Efficient Supply Chain**

Magento 2 Advanced Inventory Management software makes your ecommerce supply chain more efficient by helping you to manage and keep track of stocks, warehouses, suppliers, orders, etc.

###**MageMob Inventory – Feature Highlights**###

**Stock Management**

Using Magento 2 Stock Control System, Admin can view all the products’ current stock along with product images and also enable / disable the product as per the requirement.

**Warehouse Management**

The system enables admin to find the list of all warehouses associated with the store. Thereafter, they can filter warehouses by their names. It is also possible to create a new warehouse, search and edit warehouses of the store through our Magento 2 Multi Warehouse Management extension.

**Supplier Management**

Admin can add a new supplier for the store by adding details like Name, Address, Shipping & Payment Methods as well as related products.

**Purchase Order**

Make it easy to generate Purchase Orders for pending products and orders by adding Supplier, Unit Cost and Required Quantity details. You can also choose the warehouse while creating a purchase order.

**Inventory Log**

View a complete list of Sales Orders along with a complete log of each sales order and related inventory / stock with Magento 2 Inventory Tracking.
UX in huge (i mean) huge web forms
Tags: ux, design, frontend
Published: 2017-11-16 10:46:17

---
title: UX in huge (i mean) huge web forms
published: true
description: Front end developer frustation about "old-fashioned-windows-form-app" migration to web
tags: ux, design, front-end
---

Hi there, this is my first post, i am a front-end developer from spain working in a small company that sells real state appraisal-software, which is operating since early 90s.

The thing is, our top-selling software have 20 years old, written in old-windows-platform, and does not changed any since that. In my department we are leading the change from this old sw to cutting-edge data arquitecture and Web-application based platform (Angular, react, node, API-rest...).

Our customers has been working with our sw for a long without actually changes in the way of how they input their data inside our elderly-software. 
They love to see ALL data they can see in their screen that fits (about 50 inputs) without navigation or sorted sections for their data. Inputs are so condensed, padding between them is actually non-existant.

As a front developer and ux, i cannot tolerate to put 50 input in a row, or make "excel-ish" forms with about 60 columns (putting Responsive design away...).

We made an approach with sections selectables from a sidebar, and inside sections there is "collapsables" containing input forms with about 14 inputs each. I mean, can you imagine how many inputs we have? Do the math. 5 sections, about 5 container collapsables inside (aprox), 14 inputs each container. About 300~ input that cannot being erased (i swear if i could, most of them will be going to be history). 
Our customers, refuse to navigate between sections, they say: "we used to have all inputs all along my screen, i am not putting that away".

Have you face such a accomplishment? How do you make it? i've heard dev fellows that quit their job because of this huge-form-migrations. I am thinking about that.
Component just rendering component from props
Tags: react, beginners
Published: 2017-11-16 10:28:08

---
title: Component just rendering component from props
published: true
description: What is name this component is just rendering component from props.
tags: react,beginners
---

I wrote the component this like:

```jsx
import React from 'react';
import PropTypes from 'prop-types';

class Renderer extends React.Component {
  constructor(props) {
    super(props);
  }

  render() {
    return React.createElement(this.props.component, this.props);
  }

  static propTypes = {
    component: PropTypes.element.isRequired,
  };
}

export default Renderer;
```

This component can be used like this:

```jsx
import Renderer from './components/renderer'
import AwesomeComponent from './components/awesome_component'
import hoc from './components/awesome_hoc'

() => {
  render <Renderer component={hoc(AwesomeComponent)} />;
}
```

The reason why I use `<Renderer />` is I don't want using `React.createElement` in JSX.
And I should not define useless constants like this:

```jsx
import Renderer from './components/renderer'
import AwesomeComponent from './components/awesome_component'
import hoc from './components/awesome_hoc'

() => {
  const HocComponent = hoc(AwesomeComponent);
  render <HocComponent />;
}
```

Does anyone know the name of such this component?
コーダーの心得
Tags: coding, policy
Published: 2017-11-16 08:39:25

---
title: コーダーの心得
published: true
description: コーダーの心得
tags: Coding, Policy
---

# 背景
freecodecamp.comを進めてたらとても共感できるフレーズがたくさん出てきたので、翻訳メモを残します。

[Learn What to Do If You Get Stuck - Free Code Camp](https://www.freecodecamp.com/challenges/learn-what-to-do-if-you-get-stuck)

※一部、一般的な表現とするために意訳しています。

-----

# コーディング<br>=難しい

> (原文)Coding is hard. You will get stuck. Even experienced coders get stuck. The key is knowing how to get unstuck.

-----

# コーデイングが得意になるまでは時間がかかる

> (原文)It takes time to get good at coding. You wouldn't expect to beat a chess master after playing for 3 months. Don't expect to build the next Facebook after coding for 3 months.

-----

# 毎日コーディングあるのみ。人付き合いも大切。

## そして、他のコードを書く人との人付き合いを大切に。
### そうすればあなたは仕事の準備が完了し、晴れてコーダーとなるでしょう。

> (原文)Keep practicing coding every day and hanging out with other people who code, and you will become a job-ready coder.

-----

# 読む、検索する、確認する
## 動けなくなるまで、次に何をしたら良いかわからくなるまでそれは続けます。

> (原文)Any time you get stuck or don't know what to do next: Read-Search-Ask.

-----

# はじめに、ドキュメント、エラーメッセージを読む
## 良いコーダーのコツは、解釈してその後の指示通りに行動する能力です。

> (原文)First, read the documentation or error message. A key skill that good coders have is the ability to interpret and then follow instructions.

-----

# 解決しない場合はGoogle検索
## 良い検索クエリにたどり着くにはたくさんの時間を使います。
### あなたがGoogleで検索するときはたいてい使用言語やフレームワークで絞りたいはず。また直近の情報に絞りたいはず。

> (原文)If that didn't help, search Google. Good Google queries take a lot of practice. When you search Google, you usually want to include the language or framework you're using. You also want to limit the results to a recent period.

-----

# 仲間に尋ねる
## それでも解決しない場合はフレンドに尋ねます。もしあなたが障害を抱えているならチャットルームの仲間に尋ねます。

> (原文)If that didn't help, ask your friends. If you have trouble, you can ask your fellow campers in our help chat room.

-----

# 新しいコーダーの誕生です
## 今、あなたはコーディングする準備が整いました。後ずさりして心配しないでください。前進あるのみです。

> (原文)Now you're ready to start coding. The "Map" button in your upper right hand corner will show you our challenge map. We recommend that you complete these from top to bottom, at a sustainable pace. Our open source community is constantly improving our challenges, so don't be surprised if they change or move around. Don't worry about going back - just keep moving forward.

-----

# A happy coder time !
tips 
Tags: regextextcsv
Published: 2017-11-16 08:39:06

---
title: tips 
published: true
description: 小技集
tags: regex text csv
---

###　カンマ区切りCSVの改行を検索して改行なしへ置換
- こんなやつを
```HTML
1列目,"<html> 
           <img>",3列目  
```
- 一行にする
```CSV
1列目,"<html><img>",3列目  

```

- 検索文字に正規表現(regex)を使う、以下の呪文を貼り付け
```
([^\"｜\n])(\n)+
```
- 置換後の文字は空白
Hello, dev.to
Published: 2017-11-16 08:28:55

---
title: Hello, dev.to
published: true
description: 
tags: 
---

We Japanese developers are now very interested in this place :)

I'm welcome to read articles both in English and Japanese, also in writing.

多言語対応して各国のコミュニティが dev.to 上で育つのが早いか、dev.to クローンがそこかしこにできるのが早いか、今後に期待
Flask + Tensorflow + Keras で モデルからのpredictが動作しない問題 
Tags: flask, python, tensorflow, japanese
Published: 2017-11-16 08:01:02

---
title: Flask + Tensorflow + Keras で モデルからのpredictが動作しない問題 
published: true
description: Tensorflowを使ったPredictなAPI開発
tags: flask,python,tensorflow,japanese
---

## 機械学習ライブラリを使ったPredictなAPI開発

WebサービスでAIを活用する場合、多くはmicroservices的にVPC内にAPIを独立してデプロイし、インターナルに利用することが増えてきた。ことChainerやTensorflowといった機械学習系のライブラリは、その歴史的背景や数学ライブラリからPythonと相性がよいため、必然的にPythonのWAFを選択することになる。

## pythonでmicroservicesなAPIでのWAF 

PythonでWebアプリケーションを開発するには、WAFとしてDjango,Flaskの二大巨頭が台頭しているが、概ねシンプルな推論のAPI開発にDjangoは大して冗長であって、Flask辺りがつかっていて小気味良い。

## マルチスレッドにおけるモデルデータの参照問題

Tensorflowにしろ、Chainerにしろ、APIでの推論は、機械学習の成果として得られるモデルの読み込みが必要になる。
Tensorflow + Keras では、 サーバ起動時に事前にモデルをメモリに展開し、グラフを構築しておく。リクエスト時にはそれを利用する形になる。

この時、マルチスレッドで動作していると、構築されたグラフのスレッドとは別のスレッドでリクエストを受け付けることになるので、グラフをスレッド間で共有する必要がある


```python

global thread:

        self.model = load_model(model_path)
        self.model._make_predict_function()
        self.graph = tf.get_default_graph()

another thread:

        with self.graph.as_default():
            labels = self.model.predict(data)

```

* see also : https://github.com/fchollet/keras/issues/2397

## サーバレスアーキテクチャにおけるTensorflowの利用

昨今流行りのサーバレスであるが、GCP Cloudfunctionはそもそもnodejsしか使えないので除外、 AWS Lambdaが選択肢となる。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Tensorflowガンガン肥大していくが、学習はともかく認識時に必要最低限のモジュールだけを切り出したい</p>&mdash; ふわこ (@yurfuwa) <a href="https://twitter.com/yurfuwa/status/928094652288221184?ref_src=twsrc%5Etfw">2017年11月8日</a></blockquote>

このようなニーズがある。しかしAWS Lambdaには 50MB制限というのがあり、ひとつのLambda関数においての容量制限が厳しい。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ServerlessでTensorflowやろうと躍起になってたんですが、tensorflowどころかnumpyやらscipyやらが既に重すぎてaws lambdaで死ぬし、.soをstripしたり.pyc消しても焼け石に水だった</p>&mdash; ふわこ (@yurfuwa) <a href="https://twitter.com/yurfuwa/status/923608036609900544?ref_src=twsrc%5Etfw">2017年10月26日</a></blockquote>

素直にサーバーレスは諦めて、GCP AppEngineあたりで手を打つのが打倒っぽい。
AWSさん、なんとかなりませんか、これ。
rcart index
Published: 2017-11-16 07:44:12

---
title: rcart index
published: true
description: 
tags: 
---
### github issues
https://github.com/tohshige/test/issues

###Note Of Pug (Jade)
https://www.tam-tam.co.jp/tipsnote/html_css/post12789.html

pug > html
http://aramboyajyan.github.io/online-jade-template-editor/

HTML > PUG
http://html2jade.aaron-powell.com/
Firefox QuantumをArch Linux/Manjaro Linuxにインストールする方法
Tags: firefox, firefoxquantum, archlinux, manjarolinux
Published: 2017-11-16 07:37:47

---
title: Firefox QuantumをArch Linux/Manjaro Linuxにインストールする方法
published: true
description: Firefox QuantumをArch Linux/Manjaro Linuxにインストールする方法
tags: Firefox,Firefox Quantum,Arch Linux,Manjaro Linux
---

![](https://blog.mozilla.org/wp-content/uploads/2017/09/2017.25.09.FFQuantumBeta_Quantum-1400x770.png)

# Firefox Quantumについて

~~ｇｇｒｋｓ~~今話題の生まれ変わった高速なウェブブラウザです。


# 前提

- WindowsとかMacとかUbuntuとか使いたくないぜっていう人（煽り要素大）
- Firefoxがインストールされており`/usr/share/applications/firefox.desktop`がある
  - なかったら`sudo pacman -S firefox`してください

# ダウンロードと展開

`/opt`にインストールする例。(64 bit版バイナリ)

```
$ cd /opt
$ sudo wget https://download-installer.cdn.mozilla.net/pub/firefox/releases/57.0/linux-x86_64/en-US/firefox-57.0.tar.bz2
$ sudo tar xfj firefox-57.0.tar.bz2
```

# `/usr/share/applications/firefox-quantum.desktop`を作る

`/usr/share/applications/firefox.desktop`をコピーしましょ。

```
sudo cp /usr/share/applications/firefox.desktop /usr/share/applications/firefox-quantum.desktop
```

`/usr/share/applications/firefox-quantum.desktop`を編集

下記箇所の様に修正しましょ。

```
Name=Firefox Quantum Web Browser
Exec=/opt/firefox/firefox %u
Exec=/opt/firefox/firefox -new-window
Exec=/opt/firefox/firefox -private-window
```

# 以上です

`メニュー→インターネット→Firefox Quantum Web Browser`がいるのではないでしょか？
![](https://thepracticaldev.s3.amazonaws.com/i/zy0dt95lmbe0oqqsy75u.png)
true test
Published: 2017-11-16 07:35:08

---
title: true test
published: true
description: 
tags: 
---

##markdown
### test
## 2
```markdown
### test

```

##js
var = 100 ;
```js
var = 100 ; // test

```

<a href=/ >test</a>

##html
```html
<a href=/ >test</a>

```
Merging objects with Partial type
Tags: typescript
Published: 2017-11-16 07:34:20

---
title: Merging objects with Partial type
published: true
description: 
tags: [TypeScript]
---

My usual implementation pattern of immutable merging in TypeScript.

```ts
class MyClass {
    constructor(public id: string, public name: string) {}

    clone() {
        return new MyClass(this.id, this.name);
    }

    merge(another: Partial<MyClass>) {
        return Object.assign(this.clone(), another);
    }
}

const objA = new MyClass("1", "foo");

const objB = objA.merge({ name: "bar" });

console.log(objA !== objB);
console.log(objB.id === "1");
console.log(objB.name === "bar");
```

`Partial<MyClass>` allows us to pass an object matching `MyClass` partially.
Decisionmaking practise with a parable of Chess.
Tags: programming, experience, decisionmaking, learning
Published: 2017-11-16 07:22:03

---
title: "Decisionmaking practise with a parable of Chess."
published: true
tags: programming,experience,decision-making,learning
canonical_url: 
cover_image: https://thepracticaldev.s3.amazonaws.com/i/kmouz1lx3wnu3nl27gbk.jpg
---

![](https://cdn-images-1.medium.com/max/400/1*Fo_Sf7Tv7qw7ohrlpHNIVA.png)<figcaption>image from <a href="https://dailyem.wordpress.com/2013/04/01/proverb-of-the-day-perfect-is-the-enemy-of-good/">Dailyem</a></figcaption>

Like everything else, you become better at decisionmaking with practise. Have you ever had a difficult decision to make and thought endlessly over which option to&nbsp;take?

Did you realise in retrospect that you would’ve been better off just making a decsion and sticking to it, fixing mistakes as you went along? Here’s a great to practise that rapidly and all you need is a chess&nbsp;board.

Here’s why chess is a great&nbsp;proxy.

> There are over **9 million** different possible positions after **three** moves each. There are over **288 billion** different possible positions after **four** moves each. The number of distinct **40** -move games is far greater than the number of electrons in the observable universe. — [Chess-Poster](http://www.chess-poster.com/english/notes_and_facts/did_you_know.htm)

Sounds like a good small scale approximation of the real&nbsp;world.

### So here’s what you&nbsp;do.

Start a game of chess and make each move in at-most 15 seconds. In this time, consider the board, your strengths and weaknesses, strategy and endgame and most importantly MOVE.

You will make mistakes, you will lose pieces, you will realise you don’t have time to brood over them because you have to make your next move. You only have time to learn from your mistakes, not enough to mourn&nbsp;them.

> You only have time to learn from your mistakes, not enough to mourn&nbsp;them.

And you keep doing this, every 15 seconds, until the game ends. You will realise that the things you need to consider, aren’t that terribly vast after all. That the things that matter are few and obvious, if you focus your view. Your strategies come together and the gaps in your knowledge close ever so slightly. Practise with purpose and you improve your game/business/programming.

When the game is done, you have a breadth of experience to look over and learn from even more deeply, making you a better player for next&nbsp;time.

Hopefully this will help you learn something about yourself, your opponent and help you play the chess game that is your&nbsp;life.

Good luck and happy practise!
___

<sub>_P.S: It’s fine if you don’t have a partner, at this speed, playing against yourself works too! You don’t have time to&nbsp;cheat._<sub>

Comment below with your thoughts and ideas, tales of your decisions and how they turned&nbsp;out.

I can also be reached on Twitter at [@AniketSMK](https://twitter.com/AniketSMK)
How to convert an APNs token to `String` from `Data`?
Tags: swift, ios, apns, apple
Published: 2017-11-16 07:02:57

---
title: How to convert an APNs token to `String` from `Data`?
published: true
description: 
tags: swift,ios,apns,apple
---

I think this is the best code to convert an APNs token to `String` from `Data`.

```swift
let token = deviceToken.map { String(format: "%.2hhx", $0) }.joined()
```

### Usage


```swift
// Define initializer
extension String {
    public init(deviceToken: Data) {
        self = deviceToken.map { String(format: "%.2hhx", $0) }.joined()
    }
}

func application(_ application: UIApplication,
                 didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data!) {
    // Use like this:
    let token = String(deviceToken: deviceToken)
}
```

---

Full Japanese version: [Swiftでプッシュ通知用のDevice Token(Data型)を16進数文字列へ変換する方法 - Qiita](http://qiita.com/)
Gitlab Issues BoardでProjectを横断してIssue管理したいからやってみたこと
Tags: gitlab, googleappsscript, devops, teambuilding
Published: 2017-11-16 06:49:13

---
title: Gitlab Issues BoardでProjectを横断してIssue管理したいからやってみたこと
published: true
description: Gitlab Issues BoardでProjectを横断してIssue管理したいからやってみたこと
tags: gitlab,google apps script,DevOps,Team Building
---

![](https://about.gitlab.com/images/blogimages/announcing-the-gitlab-issue-board/gif-drag-and-drop-list.gif)

# 前提

1. Gitlab Issues Board便利だよねっていうマネージャがいる
2. 案件・クライアント毎にProjects/Sub Groupsを分けてIssueを管理している
3. 1 Sprintを1週間とし、その週に立ったIssueは翌週の水曜までにテスト環境にDeploy
4. ある程度DispatchingできるTeamである

## 最初にやったこと

![](https://thepracticaldev.s3.amazonaws.com/i/9ch6rwcfubqsjzqjr14u.png)

- Googleフォーム→Gitlab Service Desk→Issue(Project)

### 運用内容

1. Googleフォームから投稿
2. Google Apps Scriptからメール送信
3. Gitlab Service Deskで1次受け用のGitlab ProjectにIssueが立つ
4. Dispatcherが振り分け
5. StatusはLabelでtodo, wip, doneくらい持ってるが初期で割り振られていない
6. Issue Close条件
  1. クライアントの検収確認後
  2. 案件・クライアントのProjectにIssueをmoveする
  3. ↑でmoveしたIssueをCloseする(moveすると元のIssueは自動的にCloseする)


### メリット

1. 開発工数が低い
  1. Googleフォーム
  2. テンプレートに合わせてメール本文をBuildする
  3. Service DeskにGmailApp.sendmail()する
2. ランニングコストがG Suiteに含まれるので実質無料


### 課題

1. 案件・クライアントがわかりにくい
  1. IssueのDescriptionにあってややこしい
2. Service Desk経由からだとIssueの細かい表現の設定ができない
  1. Confidential Issueになる
  2. Labelを付与できない
  3. Assigneeを設定できない

## 次にやったこと

![](https://thepracticaldev.s3.amazonaws.com/i/a8gmwk53xhfwtbyoydlj.png)

- Google Apps Script→Gitlab APIからPOST→Issue(Project)

### 運用内容

1. Google Apps Scriptのフォームから投稿
2. Google Apps ScriptからGitlab APIにPOST
3. Gitlab ProjectにIssueが立つ
4. Issue Close条件
  1. クライアントの検収確認後
  2. Commit/Merge Requestにproject#IssueNoを含めて関連付けする


### メリット

1. ランニングコストがG Suiteに含まれるので実質無料
2. いくつか追加で自動化
  1. Assignee設定
  2. 案件・クライアントLabel
  3. Project横断はCommit/MR messageにproject#IssueNoを含めて関連付けする


### 課題

1. 最初の案に比べると開発工数高い
2. Slack通知のChannel分けをどうしたらいいか？(今は案件・クライアント毎にChannelがある)
3. 案件・クライアント情報及びGitlab Group User情報などをGoogle Spreadsheetから参照してフォームのSelect boxに出すようなことをやっていたけど、Gitlab APIから取得しても良さそう。

# まとめ

まだまだ始めたばかりなので運用しながらKPTするぞい。