OmniAICreator/Qiita-1.07M huggingface dataset:
Windows環境で npm install で躓いたら　

Windows 環境で躓いたのでメモ
githubからサンプルをダウンロードして　Windows 環境で　nodejs環境を構築してたら躓きました。

※nodejs はインストールされているところまでは前提とさせていただきます

```
npm install 
```
エラーに python2.7 がいりますとか
C++ がいりますとかでてくる

下記の記事にもあるように、macだとすんなりいくところもWindowsではダメなことがあるらしい
https://qiita.com/okamoai/items/a875b26abab7f18da7d1


解決方法としては

```
npm install --global windows-build-tools
```
yarnなら

```
yarn global add windows-build-tools
```


参照：[npm windows-build-tools](https://www.npmjs.com/package/windows-build-tools)



利用は　powershell を　管理者権限で立ち上げて実行。
"Scrapbox" Greate UI UX – switching text url or image with focus status when user editing

#when focus

you can see url text

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/51c37601-df24-22ab-7440-369697956425.png)


#when not focus

you can see image

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/0d7049a7-9146-dd86-e6ab-c240957e9ea5.png)

#Greate!

- You can edit url text directly when you focus to edit it!
- You can see image when you do not focus to editing.

#Scrapbox is made by Japanese

Who is interface developer? i








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ScrapboxのすごいUI/UXデザイン – 画像URLのフォーカス状態によってテキストと画像が切り替わる

#え嘘だろ、アプロードした画像がURL表示だけとか？

と思ったら違った。

#フォーカスがついた状態

URL表示になる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/51c37601-df24-22ab-7440-369697956425.png)

#フォーカスが外れた状態

画像表示になる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/0d7049a7-9146-dd86-e6ab-c240957e9ea5.png)

#すげえな！

編集したい時はURLを編集できる。
編集していない時は見栄えを確認できる。

#Scrapboxすごい！

設計者の人どなたですか！？








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ログインできないユーザでコマンドを実行する方法＋おまけ

# 背景

ログインできないユーザで、apacheやtomcatなどを動作させたいことは、たまにあると思います。
よくあるケースなのに（そのはず…）、求める答えにたどり着くまでに時間がかかったので、投稿します。

今回は、user という名前のユーザを例として使用しています。

# 動作環境

- Amazon EC2
- Cent OS 7

Cent OSなので、```/sbin/nologin``` です。
OSによって違うようなので、そこは各OSに従ってください。

# 実行方法

表題の件は、下記のコマンドのような実現できます。
例は、tomcatを起動するコマンドになります。

```
$ su -s /bin/bash - user -c "/opt/tomcat/bin/catalina.sh start"
```

# おまけ

## ログインできないユーザか調べる方法

下記のように、```/etc/passwd```を参照し、```/sbin/nologin```となっていればログインできないユーザと特定できます。

```
$ more /etc/passwd
user:/sbin/nologin
```

この状態だと、```su```しようとしても、```This account is currently not available.```と表示され、ユーザを切り替えることができません。

```
$ su user
This account is currently not available.
```

## /sbin/nologinのユーザに切り替える方法

とはいえ、```/sbin/nologin```が設定されていて、ログインできないユーザにスイッチしたいときはあるかもしれません。
そんなときは、```--shell=/bin/bash```を付与すると、ログインできないユーザでも切り替えることができます。

```
$ su - user --shell=/bin/bash
```

## /sbin/nologinのユーザを追加する

```/sbin/nologin``` を付与する場合は、下記のようになります。

```
$ useradd -s /sbin/nologin user
```

## /sbin/nologinにユーザを変更する

新規ユーザ追加との違いは、useraddかusermodしか違いはありません。

```
$ usermod -s /sbin/nologin user
```

##
複数の数値が定義されている配列dataから、「各数値」と「40未満の数値がいくつあるか」を表示するプログラムを作成

#3つの方法を考えてみた
##①オーソドックス？
```HTML
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>4_10</title>
    <script>
        var data = [59, 39, 100, 2, 15, 40, 84, 97];
        for(var i = 0;i<data.length;i++) {
            document.write(data[i]+'<br>'); // 配列データの表示
        }
        
        var count=0; //countの箱に0を代入
        for(var j= 0;j<data.length;j++) {//データの数だけ入れていく
            if(data[j]<40) {
                count++;
            }
        }
        
        document.write('<p>40点未満の人は' + count + '人です</p>'); // 40未満の数値の個数表示
    </script>
</head>
<body>
</body>
</html>
```
##②配列の結合を利用
```HTML
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>4_10</title>
    <script>
        var data = [59, 39, 100, 2, 15, 40, 84, 97];
        var count = [];//40未満の数字が入る変数を作りたい
        for (var i = 0; i < data.length; i++) {
            document.write(data[i]+ '<br>'); 
            if (data[i] < 40 ){
                count.push(data[i]);
            }
        }
        document.write('<p>40点未満の人は' + count.length + '人です</p>'); 
    </script>
</head>
<body>
</body>
</html>
```
##③上級者向け
```HTML
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>4_10</title>
    <script>
        var datas = [59, 39, 100, 2, 15, 40, 84, 97];
        for (var i = 0; i < datas.length; i++) {
            document.write(datas[i]+ '<br>'); 
        }
        
        document.write ('<p>40点未満の人は' + 
            datas.filter(
                function(data){
                    return (data<40);
                }
            ).length + '人です</p>'); 

    </script>
</head>
<body>
</body>
</html>
```
Digdagのstoreのパラメータを環境ごとにセットアップするTips

digdagのパラメータ(store)を環境ごとにセットアップをしたいということがあったので、その方法を紹介します。
digdagのrbオペーレーターを利用しますがPythonでも同じことが実現可能です。

## サンプル
先に最終的な構成を紹介します。
最終的な構成はGitHubからも確認できます。(https://github.com/katsuyan/digdag_sample_set_params)

### ディレクトリ構成
```
.
├── config
│   └── config.yml
├── digdag.dig
└── tasks
    └── setup.rb
```

### digdag.dig
```digdag.dig
timezone: Asia/Tokyo

+set_state:
  _retry: 3
  _export:
    docker:
      image: ruby:2.5.1
  rb>: Setup.set_state
  require: 'tasks/setup'

+echo_db_user:
  echo>: ${db_user}

+echo_db_pass:
  echo>: ${db_pass}
```

### setup.yml
```setup.rb
require 'yaml'

class Setup
  def set_state
    environment = Digdag.env.params['environment']

    config = YAML.load_file('config/config.yml')[environment]
    config.each do |key, value|
      Digdag.env.store(key.to_sym => value)
    end
  end
end
```

### config.yml
```config.yml
production:
  db_user: user
  db_pass: pass

development:
  db_user: user_dev
  db_pass: pass_dev

test:
  db_user: user_dev
  db_pass: pass_dev
```

## 環境ごとにDigdag storeをセットアップする流れ
### 1. config.ymlを用意
config.ymlに環境ごとの設定を記述します。

```yaml

production:
  db_user: user
  db_pass: pass

development:
  db_user: user_dev
  db_pass: pass_dev

test:
  db_user: user_dev
  db_pass: pass_dev
```

### 2. config.ymlから設定をDigdagのstoreに格納するスクリプトを用意

```rb
environment = Digdag.env.params['environment']

config = YAML.load_file('config/config.yml')[environment]
config.each do |key, value|
  Digdag.env.store(key.to_sym => value)
end
```

### 3. Digdagからconfigをsotreするスクリプトを呼び出す

```
+set_state:
  _retry: 3
  _export:
    docker:
      image: ruby:2.5.1
  rb>: Setup.set_state
  require: 'tasks/setup'
```

### 4. digdag実行時に`environment`環境変数を渡す

```sh
digdag run digdag.dig -p digdag_env=development
```

以上はdevelopment環境時のコマンドになります。development部分をproduction, testに書き換えることで環境ごとにconfig.ymlの設定から対象のパラメータをstoreに設定することができます。

## まとめ
yamlファイルで環境ごとの設定を管理する方法を紹介しました。これにより、環境ごとの設定をこのyamlファイルに閉じ込めることができます。
Slack分報 – 心理的安全性を守るにはつぶやきシローになりなさい。

# まずは自分を守る

- 人の心理的安全性を守る前に、自分を守ろう
- 自分の心理的安全性も守れないのに、どうやって人のを守れるの？
- チームの心理的安全性を作る前に、自分の分をどうして確保しないの？
- 飛行機でも子供より前に酸素ボンベを親がつけなさい、って言うじゃない？

# つぶやきシローになる

- 自分が何に弱いか、強いかは他の人にはわからない
- Slack分報とかでつぶやきシローになって自分が何に弱いかをつぶやいていこう
- 苦笑いに弱いとか、音環境を気にするとか、弱点をさらけ出していこう
- 自分の取扱説明書をストリームで作っていくようなイメージ
- 人に直接言うよりもつぶやきシロー的イメージならアラも立たないでしょ

---

>心理的安全性を作るにはつぶやきシローになりなさい。 - YouTube
>https://www.youtube.com/watch?v=031TYhqdkXI 









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Windowsのパソコンに普段何気なくログインしているけど、どんな機能なのか？

# 想定読者
・普段Windows パソコンに何気なくログインしているけど、その仕組みを知らない方
・Active Directoryって聞いたことはあるけどどんなことができるのか知らない方
・Acrive Directory管理の初心者

# 自己紹介
新卒で開発者(Cプログラマ)としてIT業界に入り、
Randstadの前身であるFSHD(フジスタッフホールディングス)への転職を機にヘルプデスクを経験、
後にRandstadでインフラへ転進後、会社の色々な事情でGISを経験、
またRandstadに戻ってきたインフラ系なんちゃってエンジニア。

# はじめに
僕自身の経験からになりますが、開発やっていた頃はWindowsパソコンで仕事しているにもかかわらず
IT業界に入ってからしばらく経ってもその仕組みを知らずに仕事しておりました。
Windows使うのであればActive Directoryを理解しておいた方が何かと便利だった経験がありますので、
今回はActive Directoryの取っ掛かりとして初心者向けの記事を書かせていただきます。

# ■Active Directoryとは？
まずActive Directoryとは、何者かというところから。
Active DirectoryはWindows Serverに元々備えられている機能で、
パソコン利用者一人一人のパソコン設定を一元管理したり、パソコンにログインするアカウントの管理を行ったりするのに使用します。
基本的には同ネットワークに接続するパソコンすべてが関係するLAN（Local Area Network）で完結する機能になります。
会社単位の法人でなく、個人の家庭内のネットワーク環境で構築することもできます。

# ■Active Directoryでできること
機能/役割は以下の通り様々あるのですが、この記事ではユーザの操作に近い部分である
「**Active Directory ドメインサービス**」機能についてのみに焦点を当てて記載します。
![ActiveDirectoryの機能.PNG](https://qiita-image-store.s3.amazonaws.com/0/320119/cec70399-b3db-30bc-d43e-11b88a98d2bf.png)

# ■Active Directoryの「ドメイン」という概念
Active Directory≒「ドメイン」。
一般的にActive Directoryといえば「マイクロソフトが提供するユーザー管理に関わるさまざまな役割」を指し、
Active Directoryで言うところの「ドメイン」は元々「1回のログオン操作でアクセスできる範囲」と定義されているようです。

たとえば代表的な特徴としては以下の２つがあります。

####1. ユーザーアカウントを一括管理
パソコンにログインするアカウントやシステムで使用するアカウントをActive Directoryで一括管理。
特定のフォルダへのアクセス権限も管理できます。

####2. パソコンの設定を一括変更
パソコンのFirewall設定やネットワーク設定、その他セキュリティ関連の設定などを
サーバーからグループポリシーという機能で一括変更を行うことができます。
設定が適用されるタイミングはユーザーがパソコンにログインしたタイミングになりますので
パソコンのユーザは特に特別な操作をする必要無く設定を反映させることができます。
パソコンへの再ログインなどをせずに手動でコマンドプロンプトから「gpupdate /force」コマンドを叩いて
強制的にグループポリシーを当てる方法もあります。

また、基本的な管理の形は以下のイメージ図のようになります。
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/320119/6c654dde-2eb6-f0cc-1e83-97cb6a74f00c.jpeg)

# ■こんなときにActive Directory ドメインサービスは便利
####1. 特定の人(もしくはグループ)のみが指定のフォルダへアクセスしたい場合
①「ＩＴ部署」の権限"グループＡ”を作成
②「ＩＴ部署のメンバー」のアカウントを"グループＡ"に関連付ける
③ＩＴ部署のメンバーのみをアクセスさせたいフォルダに"グループＡ"を関連付ける
上記のような流れで特定の権限を持ったユーザのみのアクセスを絞ることができます。

####2. 指定した回数パスワードを間違えた人のログインアカウントにロックをかけたい場合
Actiive Directoryにある「グループポリシー」という機能で設定が可能です。
　※一定時間が経つと自動的にロックを解除する機能もあります

####3. ログインアカウントのパスワードを忘れた場合
管理者は現在のパスワードを閲覧することはできませんが、
パスワードをリセットし、再設定することができます。

####4. 使っていたパソコンが壊れたが、すぐ仕事を再開したい場合
他のパソコンから自分のアカウントでログインすることにより、すぐに元パソコンで使用していた時と同じ
自分のWindows権限で作業を再開できます。
設定次第ではどのパソコンからログインしても、デスクトップのアイコンも同じ状態で
すぐに別のパソコンから作業を続行することが可能です。
　※ただしこれはいろいろと制約が出てくると思いますので会社によっては実施していない会社もあります。

####5. 特定のパソコンに対して管理者がログインしたい場合
社内のActiveDirectoryで管理されているPCに対してであれば管理者は使用しているドメインの
「administrator」という権限を持つアカウントでActiveDirectory内のパソコン全てに
ログインすることができます。（こちらは基本的に管理者のみが管理します）

#終わりに
このテーマだとセキュリティの問題で具体的な設定の例を画像で乗せることはできませんでした。。
テーマの選択と文章が面白くないところが大きな反省点。
次回はもう少し反省点を活かして書きたいと思います。
Vuex with Axios

      api.getData(url, params, TYPES.GET_LIST_DATA);

      getData(url, params, mutation) {
        store
          .dispatch('getAxios', {
            url: url,
            params: params,
            mutation: mutation,
          })
          .catch();
      },

      getAxios({ commit }, arg) {
        axios
          .get(URL_BASE + arg.url, arg.params)
          .then(res => {
            commit(arg.mutation, res.data);
          })
          .catch(e => {
            if (e.response) {
              console.log('data', e.response.data);
              console.log('status', e.response.status);
              console.log('headers', e.response.headers);
              console.log('statusText', e.response.statusText);
            }
          });
      },

      mutations: {
        [TYPES.UPDATE_GET_DATA](state, res)
        {
          state.listData = res;
        }
      },

      state: {
        listData: [],
      }

      computed: {
        listData: () => store.state.listData,
      },
mavenのプロキシ設定

# 日々プロキシと戦うあなたに
```
mvn -v
```

上記を実行すると

```
Apache Maven: -----
Maven home: ------
Java version: -----
OS name: -----
```

といった感じで情報が出ます。

ここの `Maven home:`以下、`conf/setting.xml`　に以下を追加します。

```
<proxies>
   <proxy>
      <active>true</active>
      <protocol>http</protocol>
      <host>${host}</host>
      <port>${port}</port>
    </proxy>
  </proxies>
```

これで設定は完了です。健闘を祈る。
php-master-changes 2018-12-03

今日は OpenSSL のテスト修正、Travis ビルド時の git の進捗出力無効化、コード/ビルドシステムのリファクタリング、ドキュメントの修正、PHP 7.3 GA に向けた NEWS 更新、preload された op_array を判別するフラグの追加があった！

# 2018-12-03
## kamazee: Regenerate certificates for openssl tests
- https://github.com/php/php-src/commit/655fb96354f5ee9c08b8104b0ad7018316feb5bc
- [7.2~]
- [OpenSSL のテストがこける](https://externals.io/message/103534)ので証明書を再生成

## pprindeville: Don't need interactive progress on git clones in Travis
- https://github.com/php/php-src/commit/61af343768edd7f72219f9d328cde44697ad5cf3
- [7.1~]
- Travis ビルド時は進捗を見守る人がいるわけじゃないので、git が黙って仕事するよう修正

## carusogabriel: Clean up unnecessary ternary expressions and simplify some returns
- https://github.com/php/php-src/commit/cdd8368d6f3f000a2e30a6be9976c5539f10fe85
- 不要な三項演算子の除去やコードの単純化
- [PR:3448](https://github.com/php/php-src/pull/3448) でぼちぼちやってた奴

## petk: Replace LT_AC_PROG_SED with AC_PROG_SED
- https://github.com/php/php-src/commit/ea01d7837c98f77d76792431ae7876234dc52545
- ビルドシステムで、LT_AC_PROG_SED を AC_PROG_SED に置き換え
- 元々 libtool のマクロであった奴が autoconf へ統合され、移行が推奨されているらしい

## carusogabriel: Add forked and maintained extension in php-src from GCOV
- https://github.com/php/php-src/commit/2970989ed97decb30a25ad33cf5ad2f2f664e23e
- php-src 内で fork してメンテナンスしているライブラリをカバレッジ取得除外対象から外した（カバレッジをとるようにした）

## carusogabriel: Remove old generated files
- https://github.com/php/php-src/commit/51004a9c5ee95644d935ee79568c2c38e6a4baab
- ドキュメントのソースコード案内から、以前はリポジトリに含まれていたが今は含まれていないファイルを削除
- これソースコードリリースパッケージ内には入る奴で、実際消すべきかというとびみょい気も

## cmb69: [ci skip] Prepare NEWS for 7.3 GA
- https://github.com/php/php-src/commit/5be58a437c18c5677c3f2070da3f666ac862a178
- [7.3~]
- PHP 7.3.0 の GA に向けて NEWS の更新

## dstogov: Mark preloaded op_arrays
- https://github.com/php/php-src/commit/4f26b3b51b35e969ea0312229f3b93e25ef05006
- ext/opcache で、preload された op_array を判別するフラグを追加
vue.js(nuxt.js) の plugin はとても便利

# 概要

plugin を使うと便利なことが簡単にできます。もしもまだ手を付けてない人がいるならぜひ調べてみるとよいでしょう。
実際に実務で使った簡単な例を３つ紹介します。

1. **閉じられたらバックアップ**: 画面閉じられる前に `store` の内容をブラウザのローカルストレージに時間とともにバックアップする（マニアックですが、応用は効くはず）。
2. **`v-view-only`**: ディレクティブを定義してメニューの一部を触れなくする。
3. **`$imgUrl(path)`**: 関数を用意して画像URLのドメイン切り替えを吸収する。


# 方法

### nuxt.js の場合

```js:plugins/beforeunload.js
// 閉じられたらバックアップ
export default ({store}) => {
  window.addEventListener('beforeunload', () => {
    // ローカルストレージに時刻をキーにしてデータを保存
    localStorage.setItem(`store-backup-${new Date().toISOString()}`, JSON.stringify(store.state))
  })   
}
```

```js:plugins/view-only.js
import Vue from 'vue'

Vue.directive('view-only', {
  bind: function (el, binding, vnode) {
    el.style.pointerEvents = 'none' // タッチ系イベントの無効化
    el.style.opacity = '0.3' // デザイン薄く
  }
})
```

```js:plugins/img-url.js
// $imgUrl(path)
import Vue from 'vue'

export const imgUrl = function (path) {
  if (location.host === 'localhost') { // 何らかの条件
    return `http://xxxxx${path}`
  } else {
    return `https://yyyyy${path}`
  }
}

Vue.prototype.$imgUrl = static_assets
```

これで以下を書けば有効化できます。

```js:nuxt.config.js
module.exports = {
    (省略)
    plugins: [
        { src: '@/plugins/beforeunload', ssr: false },
        { src: '@/plugins/view-only' },
        { src: '@/plugins/img-url' },
    ],
    (省略)
```

```vue:利用可所
<template>
  <div>
    <Menu @click="clickMenu(1)" v-view-only>
    <Menu @click="clickMenu(2)">
    <Menu @click="clickMenu(3)">
    <img :src="$imgUrl('/hoge.png')">
  <div>
</template>
```


### vue.js の場合

```js
const MyPlugin = {}
MyPlugin.install = function (Vue) {
  // 閉じられたらバックアップ
  window.addEventListener('beforeunload', () => {
    console.log('ここでアクションできる。')
  })

  // $imgUrl(path)
  Vue.directive('view-only', {
    bind: function (el, binding, vnode) {
      el.style.pointerEvents = 'none' // タッチ系イベントの無効化
      el.style.opacity = '0.3' // デザイン薄く
    }
  })

  // $imgUrl(path)
  Vue.prototype.$imgUrl = function (path) {
    if (location.host === 'localhost') { // 何らかの条件
      return `http://xxxxx${path}`
    } else {
      return `https://yyyyy${path}`
    }
  }
}
```

これで以下を書けば有効化できます。

```js
Vue.use(MyPlugin) 
```

```vue:利用可所
Vue.component('my-component', {
  template: `
  <div>
    <Menu @click="clickMenu(1)" v-view-only>
    <Menu @click="clickMenu(2)">
    <Menu @click="clickMenu(3)">
    <img :src="$imgUrl('/hoge.png')">
  <div>
  `
})
```

# まとめ

以上、plugin を使えば簡単に Vue を拡張できて、再利用しやすくできる例の紹介でした！
docker-registryをdocker-composeで起動する

この記事は、「[オンプレミス、Kubernetesで、マイクロサービスを意識したWebアプリをデプロイするまでの軌跡](https://qiita.com/soumi/items/2ef65b0d6e3fb562451e)」の一部です。

## はじめに

例えば、

```shell
$ docker run -d -p 80:80 --name webserver nginx
```

というコマンドでDockerイメージを立ち上げると、Nginxのイメージが立ち上がります。
ではこのNginxのイメージはどこから来るのかというと、Dockerの公式レジストリからDLされてきます。

https://hub.docker.com/explore/

Docker Hubと呼ばれるこのレジストリは、サインアップする事で誰でもイメージを公開することが出来、月々支払う事でプライベートなイメージを作成する事が出来ます。

ただ、案件等であまり外に出したくないコンテナというものも存在すると思います。
そんな時は、なんとかオンプレミスで同じサービスが立ち上げられないか考えたりするもの。調べてみるとやはりありました。

[プライベートなDockerレジストリサーバーをコンテナで立てる](https://qiita.com/rsakao/items/617f54579278173d3c20)

このイメージは公式が提供してくれているので、ありがたく使う事にしましょう。

## registryをインストールする

といっても、手順は拍子抜けするほど簡単です。
docker-compose.ymlに以下の内容を記述して、起動するだけです。

```yaml:docker-compose.yaml
registory:
  container_name: local-docker-registory
  image: registry:2.3.0
  ports:
    - 5000:5000
  volumes:
    - <ファイル保存先へのパス>
```
```shell
docker-compose up -d
```

ファイル保存先のパスはホストOSのパスで、```/home/registry/repos/```のような形になります。
これで、以下のアドレスで待機するDockerレジストリが出来上がりました。

```
http://ホストのip:5000
```

ポート番号は必要であれば適宜変更してください。

## 立ち上げたレジストリにファイルをプッシュ

今立ち上げたレジストリにファイルをイメージをプッシュするには、以下の手順を踏みます。

### コンテナをビルド

```shell
docker build -t <イメージ名>:<タグ> <DockerFileのあるディレクトリ>
```

***例***
目的のDockerFileがあるディレクトリにいる場合

```shell
docker build -t test-image:1.0 .
```

### ビルドしたイメージにタグをつける

```shell
docker tag <イメージ名>:<タグ> <レジストリのIP>:<ポート>/<リポジトリ名>/<イメージ名>:<タグ>
```

***例***

```shell
docker tag test-image:1.0 192.168.0.xxx:5000/test/test-image:1.0
```

### イメージをプッシュ

```shell
docker push <レジストリのIP>:<ポート>/<リポジトリ名>/<イメージ名>:<タグ>
```

***例***

```shell
docker push 192.168.0.xxx:5000/test/test-image:1.0
```

タグは主にバージョンを示すことが多いのかなと思うのですが、これが中々管理が大変で…
特に複数のコンテナアプリを同時に扱っていたりすると混乱します。

ともあれ、これでプライベートなレジストリが手に入りました。
Kubernetesを使用する場合はイメージは全てどこかのレジストリにアップされている必要があるので、そちらの構築でも役に立ってくれます。そのあたりはまた別の記事で書こうかと思います。

以上です。
お疲れ様でした！
生産性を爆上げする slack 利用法

`爆上げする` といったな。あれは嘘だ。

## 最近の私がしていること

最近、TwitterなどのSNSでもリアルの人付き合いでも、周囲で人をネガティブにする発言（以下、呪詛※1 と言います）が目立ってきたので、ネガティブは周囲の生産性を下げる！これはいかん！と思って世の中を幸せにすべく他人の呪詛をもぐもぐ食べていたんです。

※1 ポジティブであろうがネガティブであろうが、ある種の攻撃性の含んだコトバを呪詛と呼んでいます。例えば「転職先が最高すぎる！クソ会社潰れろ！」「最近のQiitaはクソ！」など（うっ、自分で書いて体調が悪くなってきた）

## 何が起きたか？

体調不良を起こして自分の生産性がゼロになりました。
本当に何もできなくて、掃除ができず部屋が汚れ、食器の洗い物も3週間ぐらい放置してました。臭い。助けて。
おまけに明らかにストレスの影響が身体に出てきてしまい、これはいかん！と対策を立てることにしました。

## どうしようと思ったか？

SNS等で呪詛をもぐもぐする量は減らせそうになかったので、代わりにポジティブ発言を自ら行うことで自らを自浄したり、他人のポジティブ発言を引き出して他人のポジティブをもぐもぐ食べることで心身浄化をはかりました。

## どうしたか？

slackにyaruチャンネルを作りました。

![IMG_20181120_122609.png](https://qiita-image-store.s3.amazonaws.com/0/68087/21699f6d-c4f2-5a83-ec89-1f4f5aefeb38.png)


「やるぞ！٩( ᐛ )و」と書くだけです。毎朝出社したときに書くようにしています。朝イチでポジティブ発言するところがミソなので、おはようチャンネルとかでも良かったかもしれない。

## どうだったか？

これ以外にも調子を取り戻すための対策はいろいろやっていたので、一概には言えませんが、結果としてだいぶ体調が良くなってきました。
とくに「自分が発言する」という点が大事で、これは他人のポジティブをもぐもぐ食べるよりも数倍効果ある感覚があります。

## 生産性を爆上げする slack 利用法

生産性というと上げることを考えがちですが、どっちかというと「生産性を下げない方法」あるいは「下がった生産性を元に戻す方法」の方が重要なのではないかと思います。（そのため `爆上げする` は嘘になりました。）
こんな感じで自分の周囲にポジティブ要素が増えるよう他にもいろいろ工夫しながら過ごしています。

## 自らポジティブを作りだし、ポジティブによって健康を維持せよ

30歳こえると、なんだかいろいろあって、いろいろあるので、これがマジで大事になってくるなぁと。最近オヤジギャグをいうオジさんの気持ちが分かってきました。オジさんいじめないであげてください。

yaruチャンネルはいいぞ！
alphabetが枠内で改行されない件[CSS]

# **はじめに**
サービスのwebデザインをしている際に、ブロックボックスであるにも関わらず、アルファベットの文章が枠内で折り返されないという問題に遭遇したので、その解決策を備忘録として投稿します。

### **問題**
下記画像のように、日本語であるひらがなは改行処理が正常に行われているのに対して、アルファベットでは、改行されず、ブロックボックスを突き抜けていきました。。

<img width="1206" alt="古川_卓弥さんの友達一覧ピトミー_ソーシャル自己分析サービス.png" src="https://qiita-image-store.s3.amazonaws.com/0/269862/f9c3dc2e-ae37-0df0-4824-c01840729c68.png">

### **解決**

次のコードを対象の要素に対して追記するだけで解決されます。

```target.css
.target-block-box {
  word-wrap: break-word;
  overflow-wrap: break-word;
}

```

<img width="1201" alt="古川_卓弥さんの友達一覧ピトミー_ソーシャル自己分析サービス.png" src="https://qiita-image-store.s3.amazonaws.com/0/269862/b51334c1-c1e5-ec76-443b-7a390c4c824a.png">

# **おわりに**
こういった知識をつけていくことがwebデザイン速度を上げてくれると思うのでどんどん学んでいきたいですね。

参考になったよー、って方はいいねお願いします(^^)
グローバル変数とローカル変数

#グローバル変数
グローバル変数はファイルの中全体で使用することができる変数。

グローバル変数を関数内で使うには**global**というメソッドを使う。



#ローカル変数
ローカル変数は関数内の変数のことで関数内でしか使うことができない。

関数内で使用されている変数はその外の変数と区別され、関数外では同じ名前の変数であっても、別の変数と認識される。

```
<?php
$num = 5;

function func(){
    $num = 10;
}

func();
echo $num; // 5
?>
```

#使い分け

特別な事情が無い場合はローカル変数を使い、やむを得ない事情がある場合に限り、グローバル変数を使う。

---
また、この記事は[PHPフレームワークLaravel入門](https://www.amazon.co.jp/dp/4798052582/ref=asc_df_47980525822542427/?tag=jpgo-22&creative=9303&creativeASIN=4798052582&linkCode=df0&hvadid=295678107984&hvpos=1o2&hvnetw=g&hvrand=15604873734545540909&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1028850&hvtargid=pla-526985037105&th=1&psc=1)のアウトプットとして書いてみました。

**自分がまだ理解していない部分を文字で起こすことによって頭の中を整理する**ことが目的です。

終
Node.jsアプリをLinux環境で常駐化させる　forever編


[Node.jsアプリをLinux環境で常駐化させる　nohup編](https://qiita.com/chihiro/items/ae1eb63537e60b03cb68)　のforever編です。

Node.jsアプリを動かす時に、コマンド実行したターミナルからログアウトしてしまうと、アプリも終了してしまいます。
sshを切ってもアプリを起動しておくには、いくつか方法があり、上記の記事では`nohup`コマンドを紹介しました。
こちらでは`forever`について紹介します。

##foreverとは
nodeアプリをdaemon化することができる、npmモジュールです。
https://github.com/foreverjs/forever
また、エラー等でアプリが落ちた場合に、自動的にアプリを再起動してくれます。
この点が`nohup`よりも便利な点かなと思います。

##動作確認環境
* AWS EC2 (Amazon Linux)
* Node.js：v8.12.0
* express：4.16.4


##install

```bash
$ npm install -g forever

$ forever --version
v0.15.3
```

##アプリを起動する

```bash
$ forever start <JSファイル>
```

expressでアプリを構築した場合は`npm start`で`node ./bin/www`が動くようになっています(初期状態)。
これを踏まえて、foreverで動かすために以下のコマンドを実行します。

```bash
$ forever start ./bin/www
```

##foreverで動かしているアプリ一覧を表示する

```bash
$ forever list
info:    Forever processes running
data:        uid  command        script  forever pid   id logfile                 uptime
data:    [0] AAAA /~~~~/bin/node bin/www 11111   22222    /~~~~/.forever/AAAA.log 0:2:6:13.416
```
`forever`を使って起動しているアプリの情報を見ることができます。
`logfile`に書かれているパスのファイルに、アプリのログが出力されています。


##アプリを停止する
停止したいアプリの指定方法がいくつかあります。
指定する値は、それぞれ`forever list`コマンドで出力された列の値に対応します。

```bash
$ forever stop <Index>  # forever list コマンドで表示される一番左の列の番号
$ forever stop <uid>
$ forever stop <script>
```


##オプション
いくつかオプションが準備されています。

| オプション | 説明 |
|:--|:--|
| -m  MAX | 自動で再起動する回数を指定する |
| -l  LOGFILE | ログの出力ファイル名の変更 |

※`-n`オプションでログに行数を表示できそうだったので試したのですが、表示できませんでした。
私が何か間違えているのかもしれないです。。。
【Ruby】ブロックにおける"do"と"ブレース"の違い

#Rubyにおけるブロック
##ブロックとは
手続きをひとまとめにしたもの。メソッドを呼び出す際に１つだけ渡すことが可能で、ブロックを渡されたメソッドは任意のタイミングでブロックに記述された手続きを実行することができる。

##ブロックの記述方法
ブロックを記述するにはdoとブレースを利用する２種類の方法がある。

###doを利用
do と end で手続きを囲む。

```ruby:example_do.rb
fruits.each do |fruit|
  puts "eat #{fruit}"
end
```
###ブレースを利用
ブレース{} で手続きを囲む。

```ruby:example_braces.rb
fruits.each { |fruit|
  puts "eat #{fruit}"
}
```

##do と ブレース の違い
do と ブレース には結合度の違い、および用途の違いがある。
- do よりも ブレース の方が結合度が強いため、動作が多少異なる場合がある
- ブロックが一行におさまる場合は ブレース 、複数行にまたがる場合は do を使用する
- ブロックが値を返す式として記述する場合は ブレース 、手続きを実行する文として記述する場合は do を使用する
続）俺のフレームワークが、1205行で実装できる訳がない！

[前回はこちら…](https://qiita.com/johnny-shaman/items/3b7ea472125d2131ee7c)
# 前回に引き続き…
釣られた方ありがとうございます。多分少し行数増えてます（笑）

今回は、デモを用意してみました。

<p data-height="512" data-theme-id="dark" data-slug-hash="oQyGzZ" data-default-tab="js,result" data-user="johnny_shaman" data-pen-title="$(dsand).$() with _(losand)._ ex.1" class="codepen">See the Pen <a href="https://codepen.io/johnny_shaman/pen/oQyGzZ/">$(dsand).$() with _(losand)._ ex.1</a> by NoboruOkazaki (<a href="https://codepen.io/johnny_shaman">@johnny_shaman</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

心ゆくまで触ってみてください。
paizaでアセンブラ その2

#概要

paizaでアセンブラ、やってみた。
fizzbuzz問題、やってみた。

#サンプルコード


```
.code64
.text
.globl main

main:
	movq 	$1, %rdi
	movq 	$101, %rsi
	call 	fizzbuzz
	movq 	$0, %rdi
	call 	exit
strlen:
	mov 	$-1, %rax
strlen_loop:
	incq 	%rax
	cmpb 	$0, (%rdi, %rax)
	jnz 	strlen_loop
	ret

puts:
	pushq 	%rdi
	movq 	%rsi, %rdi
	call 	strlen 
	movq 	%rax, %rdx
	popq 	%rdi
	movq	$0x1, %rax
	syscall
	ret

exit:
	movq	$0x0, %rax
	syscall
reverses:
	call 	strlen
	movq 	%rax, %rsi
	movq 	$0, %rdx
	movq 	$2, %rcx
	div 	%rcx
	movq 	$0, %rdx
	cmp 	$0, %rax
	jz      reverses_loop_end
reverses_loop:
	leaq 	-1(%rdi, %rsi), %rcx
	sub 	%rdx, %rcx
	movb 	(%rdi, %rdx), %bl
	xchgb 	%bl, (%rcx)
	movb 	%bl, (%rdi, %rdx)
	incq 	%rdx
	cmp 	%rax, %rdx
	jnz 	reverses_loop 
reverses_loop_end:
	movq 	%rdi, %rax
	ret

itos:
	leaq 	itos_buff(%rip), %rsi
	movq 	$0, %rax
itos_clear_loop:
	movb 	$0, (%rsi, %rax)
	incq 	%rax
	cmp 	$65, %rax
	jnz 	itos_clear_loop
	movq 	%rdi, %rax	 
	movq 	$10, %rcx	  
itos_div_loop:
	movq 	$0, %rdx
	divq 	%rcx
	add 	$48, %rdx
	mov 	%rdx, (%rsi)
	incq 	%rsi
	cmpq 	$0, %rax
	jnz     itos_div_loop
	leaq 	itos_buff(%rip), %rdi
	call 	reverses
	ret

fizzbuzz:
	cmp 	%rdi, %rsi
	je 		fizzbuzz_ret
	movq 	$0, %rbx
	movq 	%rdi, %rax
	movq 	$0, %rdx
	movq 	$3, %rcx
	div 	%rcx
	cmp 	$0, %rdx
	jnz 	fizzbuzz_fizz_end
	movq 	$1, %rbx
	pushq 	%rdi
	pushq 	%rsi
	pushq 	%rbx
	mov 	$1, %rdi
	leaq 	fizz(%rip), %rsi
	call 	puts
	popq 	%rbx
	popq 	%rsi
	popq 	%rdi
fizzbuzz_fizz_end:
	movq 	%rdi, %rax
	movq 	$0, %rdx
	movq 	$5, %rcx
	div 	%rcx
	cmp 	$0, %rdx
	jnz 	fizzbuzz_buzz_end
	movq 	$1, %rbx
	pushq 	%rdi
	pushq 	%rsi
	pushq 	%rbx
	mov 	$1, %rdi
	leaq 	buzz(%rip), %rsi
	call 	puts
	popq 	%rbx
	popq 	%rsi
	popq 	%rdi
fizzbuzz_buzz_end:
	cmp 	$0, %rbx
	jnz 	fizzbuzz_recurse
	pushq 	%rdi
	pushq 	%rsi
	call 	itos
	movq 	$1, %rdi
	movq 	%rax, %rsi
	call 	puts
	popq 	%rsi
	popq 	%rdi
fizzbuzz_recurse:
	pushq 	%rdi
	pushq 	%rsi
	movq 	$1, %rdi
	leaq 	newline(%rip), %rsi
	call 	puts
	popq 	%rsi
	popq 	%rdi
	incq 	%rdi
	call 	fizzbuzz
fizzbuzz_ret:
	ret

.data
fizz: 
	.asciz "Fizz"
buzz:
	.asciz "Buzz"
newline:
	.asciz "\n"
itos_buff:
	.fill 65, 1, 0	

```


以上。
paizaでアセンブラ

# 概要

思えば、paizaでアセンブラがやりたいだけの一年だった。
paizaでアセンブラ、やってみた。
pythonとgcc使った。　

# サンプルコード


```
import subprocess
import os

def gcc():
    c_file = 'hello.s'
    test_c = """
.code64
.text
.globl main

main:
    mov   $1, %rax; 
	mov   $1, %rdi; 
	mov   $msg, %rsi; 
	mov   $12, %rdx; 
	syscall;
	mov   $0, %rax; 
	syscall;

.data
msg:
	.asciz "Hello world!"
"""
    with open(c_file, 'w') as f:
        f.write(test_c)
    os.system("gcc -no-pie %s" % c_file)
    result = subprocess.Popen('./a.out', stdout = subprocess.PIPE).communicate()[0]
    for i, v in enumerate(result[ : -1].split('\n')):
        print v

if __name__ == '__main__':
  gcc()
  

```

# 成果物

https://paiza.io/projects/FKJch5jcEi4MNi0E6C2EzQ

以上。
コントローラについて

#コントローラの作り方

```
php artisan make:controller コントローラ名 
```
これで、指定した名前でコントローラを作ることができる。

コントローラ名は基本的に、「○○Controller」というように、名前の後に「Controller」を付けたものが使われる。

**・artisan**
→アーティザン
→laravel専用のコマンド

#保存場所

コントローラは「Http」フォルダ内にある「Controllers」というフォルダの中に作成される。

#コントローラの説明

###名前空間
コントローラは、クラスとして作成される。

このクラスは、App/Http/Controllersという**名前空間**に配置される。

名前空間というのは、クラスを階層的に整理するための仕組みでフォルダを使って断層的にファイルを整理するのと同じイメージ。

この名前空間を指定しているのが最初の文。

```
namespace App/Http/Controllers;
```

これは、コントローラクラスを作成する際の基本設定として覚えておきましょう。

###useによるクラスのインポート

次に記述されているのは、**use文**です。

これは以下のように記述されています。

```
use Illuminate/Http/Request;
```

ここでは、Illuminateパッケージ内に用意されている「Request」を使える状態にしています。

###クラスの定義

続いて、クラスの定義がされています。

```
class コントローラ名 extends Controller
```

コントローラクラスは、このように**Controllerというクラスを継承**して作成されています。

#アクションメソッド
コントローラに用意される処理は**アクション**と呼ばれる。

これは**メソッド**の形で用意される。

そんでもってこのこと**アクションメソッド**と呼ぶ。

それとアクションメソッドは引数を持たないメソッドとして用意される。

それとアクションはコントローラに用意される処理を行うためのもので、複数用意することができる。

###ルート情報の用意

コントローラのアクションを使うようにするためには、**アクションにルートを割り当てる設定**が必要。

```
Route.get('アドレス', 'コントローラ名@アクション名)
```

この形でroutesフォルダのweb.phpなどに用意してあげる。

**第１引数のアドレスにアクセスされると、第２引数に指定されたコントローラのアクションが実行される。**


---
また、この記事は[PHPフレームワークLaravel入門](https://www.amazon.co.jp/dp/4798052582/ref=asc_df_47980525822542427/?tag=jpgo-22&creative=9303&creativeASIN=4798052582&linkCode=df0&hvadid=295678107984&hvpos=1o2&hvnetw=g&hvrand=15604873734545540909&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1028850&hvtargid=pla-526985037105&th=1&psc=1)のアウトプットとして書いてみました。

**自分がまだ理解していない部分を文字で起こすことによって頭の中を整理する**ことが目的です。

朝、5時に家を出て朝活をしております。

朝はやっぱり眠たいzzzz

とりま、インターン中、１ヶ月続けられるように頑張ってみます。

twiiter(@fkm10pa)もよかったらみてください!!

後２時間頑張るぞー！！

終
React Nativeでハマったこと① [-bash: react-native: command not found]

プログラミング初心者として、いろんな記事を参照していると、専門用語とかなんか前提を省くとかされてて、中級者にはよいのだろうけど、初心者からすると、わからんから調べてるのに、書かれてる用語とか前提がわからんから、またそれをググって、さらにググってと、ブラウザのタブが増えていくのがつらい。。。

なので、簡潔に、超初心者向けに書きます（ってかそんな高度なこと書けねぇ）

厳密なことが知りたい人は、頑張って偉い方の記事とか読んでください。


###僕の投稿の基本構成は以下の通り
①この記事の対象者
　どんな問題を抱えている人に向けているのか
②結論
　この問題の答え


では、早速本題に...

##この記事の対象者
⒈React Native初心者かつ、Expoを使用しないでReact Nativeを使用しようとしている人

⒉そもそもReact Nativeのプロジェクトディレクトリ（プロジェクトフォルダ：まあ、なんか必要なファイルが色々入ってるフォルダ）が作成できない方。


```
$ react-native init [プロジェクト名]
```

つまり、Terminalとかで上のコマンドを行なっても

```
$ -bash: react-native: command not found
```

って出てしまう方。


##結論

もし、以下のリンクの方法や
【react native 環境構築　起動まで】
https://qiita.com/tatsuyafukui/items/e520ac8c98f1523b612e

公式サイトの方法
https://facebook.github.io/react-native/docs/getting-started

で必要なことは揃っているのにうまくいかないなら、**パスが通ってない可能性がある**。

パスを通すって何？って方にはこの記事がとても分かり易かった
【Linux入門 ~「パスを通す」とは~】
https://qiita.com/Naggi-Goishi/items/2c49ea50602ea80bf015

つまり、コマンド

```
$ react-native
```

を使用する準備が整ってないことになる。

##解決策はこちら
1.**ターミナルで以下のコマンドを打ってみる**

```
$ ls -a 
```

そうすると、いろんなフォルダ名がずらーーーっと出てくる

2.**bash_profile を探す**
なければ、作る。作り方はググってください・・・多分、mkdirコマンド（Homeつまり〜の中に）

3.**nano ~/.bash_profile でエディタを立ち上げる**
ターミナルのHome（〜）内でnanoというデフォルトのエディタを立ち上げるために、以下のコマンドをターミナルでポチってみる。

```
$ nano ~/.bash_profile
```

そうすると、以下の感じの画面が立ち上がる。

<img width="698" alt="スクリーンショット 2018-12-03 13.33.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/86106/c9247c30-ac74-4a2c-b752-f2f90115d843.png">
（なんかかっこいい）

4.**ここに以下の２行を追加する**

```
export PATH="/usr/local/share/npm/bin:$PATH"
export PATH=${PATH}:${HOME}/node_modules/.bin
```

5.保存して終了

control+x からの、y から　Enter で終了。

6.一旦ログアウト（再起動とかはいらないので、左上のAppleマークからログアウトして再ログインする）

7.**以上でPATHにパスが通ったが、本当に取っているのか確認**

以下のコマンドをターミナルで打ってみる。

```
$ printenv PATH
```

結果に、先ほど入力した

```
export PATH="/usr/local/share/npm/bin:$PATH"
export PATH=${PATH}:${HOME}/node_modules/.bin
```

が含まれていればOK。

自分のプロジェクトを作成したいディレクトリにcdコマンドで移動して、

```
$ react-native init [プロジェクト名]
```

を再度実行してみてください！


以上です〜！
コマンドプロンプト・プログラミング 々

# 目次

- [コマンドプロンプト・プログラミング 序](https://qiita.com/feelinguy/items/ce75348470b583b3ae42)
- [コマンドプロンプト・プログラミング 々](https://qiita.com/feelinguy/items/0b88db4aeb41bee44f19) <- ★
- [コマンドプロンプト・プログラミング 宴](https://qiita.com/feelinguy/items/ed91ed23e7baa63471a5)
- [コマンドプロンプト・プログラミング 二次会](https://qiita.com/feelinguy/items/02c70d56b2ed039db0ee)
- [コマンドプロンプト・プログラミング 三次会](https://qiita.com/feelinguy/items/f519549b0f9e8d2a714b)
- [コマンドプロンプト・プログラミング 壮行会](https://qiita.com/feelinguy/items/76dcc87020edbeb7dc14)

# ユーティリティ

前回作ったユーティリティを修正した。

- `token` -> `words`
- `line` -> `-conc`

## words：トークンを二重引用符付きで得る

```sh:words.cmd
@echo off
for %%w in (%*) do (
  if "%%~w" == "" goto :eof
  echo "%%~w"
)
exit /b
```
```cmd.exe
> words

> words a,b,c; one=1 two=2 three=3
"a"
"b"
"c"
"one"
"1"
"two"
"2"
"three"
"3"

> words   Hello   World!   "   yeah!"
"Hello"
"World!"
"   yeah!"
```

`cmd.exe` のデリミタを回避するには二重引用符が欠かせないので、
二重引用符付きで出力することにした。

## -conc：出力を一行にまとめる

```sh:-conc.cmd
@echo off
setLocal
  set line=
  for /f "delims=" %%l in ('find /v ""') do (
    call :join-space "%%~l"
  )
  if "%line%" == "" goto :eof
  echo %line%
endLocal
exit /b

:join-space
  if "%line%" == "" (
    set line=%~1
  ) else (
    set line=%line% %~1
  )
  exit /b
```
```cmd.exe
> words | -conc

> words a,b,c; "one=1 two=2 three=3" | -conc
a b c one=1 two=2 three=3

> words   Hello   World!   "   yeah!" | -conc
Hello World!   yeah!
```

パイプから拾うことを強調したくて `-conc` と `-` を前置した。

## puts：標準出力

```sh:puts.cmd
@echo off
call words %* | call -conc
exit /b
```
```cmd.exe
> puts

> puts 1,2,3,4,5
1 2 3 4 5

> puts Hello World! "   bye..."
Hello World!   bye...
```

これにて nix の `echo` ライクになった。

# `for` の挙動

nix の `head` `tail` を作ろうとしたのだが、

```cmd.exe
> type sample.txt
1
2

4
5

> type sample.txt |^
More? for /f "delims=" %l in ('find /v ""') do @echo %l
1
2
4
5
```

改行のみの行を捨てやがる。。。

# 次回

`for` の呪縛から逃れる術が見つかればなー。

- [コマンドプロンプト・プログラミング 宴](https://qiita.com/feelinguy/items/ed91ed23e7baa63471a5)
Windows10のバージョン1809のWSLでDockerが動作する環境を構築した

[Windows10のバージョン1809のWSLでDockerが動作する環境を構築した
](https://xn--v6q832hwdkvom.com/post/windows10%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B31809%E3%81%AEwsl%E3%81%A7docker%E3%81%8C%E5%8B%95%E4%BD%9C%E3%81%99%E3%82%8B%E7%92%B0%E5%A2%83%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%97%E3%81%9F/)の抜粋版です

## 今回インストールできた環境
```shell
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.1 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.1 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

$ docker version
Client:
 Version:           18.06.1-ce
 API version:       1.38
 Go version:        go1.10.4
 Git commit:        e68fc7a
 Built:             Fri Oct 19 19:43:14 2018
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.06.1-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.4
  Git commit:       e68fc7a
  Built:            Thu Sep 27 02:39:50 2018
  OS/Arch:          linux/amd64
  Experimental:     false
```

## 作業メモ
### 1.WSL(Windows Subsystem For Linux)を使うための設定をする
```powershell

> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
```

### 2.Microsoft Storeから「Ubuntu 18.04」をインストールする

### 3.WSL環境を「管理者として実行」して、Dockerをインストールする
```shell
$ sudo apt update && sudo apt -y upgrade

$ sudo apt install -y docker.io

$ sudo cgroupfs-mount

$ sudo usermod -aG docker $USER
```
### 4.Dockerを起動するシェルスクリプトを書く
```shell
$ cat Docker.sh
#!/bin/sh
 pass='password1!'
 echo "$pass" | sudo -S cgroupfs-mount && sudo service docker start
 sleep 15
 docker version

$ chmod 700 Docker.sh
```

### 5.WSL環境を「管理者として実行」して、Dockerを起動する
```shell
$ ./Docker.sh
```

## まとめ
Windows10のWSL環境でDockerの`18.06`が動くということは  
Windows10 + WSL + Docker + SqlServer2019のPreview版  
で既存の環境を汚さないお手軽検証環境が簡単に手に入るのかも？
abc 114　C 再帰　D 素因数分解

C

```
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<map>
#include<math.h>
#include<queue>
#include<deque>
#include<stack>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const int INF = 1e9;
int main() {
	int N;
	cin >> N;
	int ans = 0;
	for (int i = 1; i <= N; ++i) {
		int k = i;
		bool threecount = false;
		bool fivecount = false;
		bool sevencount = false;
		bool can = true;
		while (k != 0) {
			int j = k % 10;
			if (j == 3) { threecount = true; }
			else if (j == 5) { fivecount = true; }
			else if (j == 7) { sevencount = true; }//3,5,7が１回以上出るか
			else {
				can = false;
				break;
			}//3,5,7以外の数字が現れないか
			k /= 10;
		}
		if (can == 1 && threecount == 1 && fivecount == 1 && sevencount == 1) {
			ans++;
		}
	}
	cout << ans << endl;
	return 0;
}
```
TLE

再帰を使おう

```
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<map>
#include<math.h>
#include<queue>
#include<deque>
#include<stack>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const int INF = 1e9;
int ans;
int N;
vector<ll>v;
void dfs(ll n, ll k) {
	if (k > 1e9)return;
	int f[10] = {}, t = n;
	while (t) {
		f[t % 10]++;
		t /= 10;
	}
	if (f[3] && f[5] && f[7])v.push_back(n);
	dfs(n + 3 * k, k * 10);
	dfs(n + 5 * k, k * 10);
	dfs(n + 7 * k, k * 10);
}
int main() {
	ans = 0;
	cin >> N;
	dfs(0, 1);
	sort(v.begin(), v.end());
	ll i = 0;
	for (; i < v.size(); ++i) {
		if (v[i] > N)break;
	}
	cout << i << endl;
	return 0;
}
```
慣れていきたい
D整数Nが与えられます。N！(=1×2×...×N)
の約数のうち、七五数 は何個あるでしょうか？
ここで、七五数とは約数をちょうど75個持つ正の整数です。

```
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<map>
#include<math.h>
#include<queue>
#include<deque>
#include<stack>
#include<cstdio>
#include<utility>
#include<set>
#include<list>
#include<cmath>
#include<stdio.h>
#include<cstdio>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const int INF = 1e9;
int main() {
	int N;
	cin >> N;
	ll cnt[111] = {};
	for (ll i = 2; i <= N; ++i) {
		ll t = i;
		for (ll j = 2; t != 1; ++j) {
			while (t%j == 0) {
				t /= j;
				cnt[j]++;//全部素因数分解して因数の数を格納する
			}
		}
	}
	ll sum = 0;
	for (ll i = 0; i < 111; ++i) {
		if (cnt[i] >= 74)sum++;
		for (ll j = 0; j < 111; ++j) {
			for (ll k = j + 1; k < 111; ++k) {
				if (i == j || i == k)continue;
				if (cnt[i] >= 2 && cnt[j] >= 4 && cnt[k] >= 4)sum++;
			}
		}
	}
	for (ll i = 0; i < 111; ++i) {
		for (ll j = 0; j < 111; ++j) {
			if (i == j)continue;
			if (cnt[i] >= 14 && cnt[j] >= 4)sum++;
			if (cnt[i] >= 24 && cnt[j] >= 2)sum++;
		}
	}
	cout << sum << endl;
	return 0;
}
```
c問題でも何回か出てきた考え方やな
ec-cube4をMacにインストールするときにやったことメモ

#intlのインストール
--
###icu4c-55_1-src.zipをダウンロード
~/tmpで解凍。
chmod a+x ./runConfigureICU 
chmod a+x ./configure
./runConfigureICU MacOSX
make
sudo make install

###php.iniにintl.so読み込みを設定
私の環境ではMAMPを使っているのでMAMPのphp.iniを編集。
MAMPのfile➔edit templates➔PHP(php.ini)➔7.1.22を選択

extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/intl.so
を設定。

###githubからeccube4をクローン
git clone git@github.com:EC-CUBE/ec-cube.git

###ec-cube/binがMAMPのPHPを使うように変更
cd ec-cube/bin
vi *
 #!/usr/bin/env /Applications/MAMP/bin/php/php7.1.22/bin/php                                                                                                             
に変更

###ec-cubeをインストールするデータベースを用意
MySQLにec4データベースを作成した。

###ec-cubeをインストール
bin/console eccube:install

コマンドラインを使ってインストール

＞bin/console eccube:install

Database Url [mysql://ec4mypassword:@localhost/ec4]:

Mailer Url [gmail://hohoho:mypassword@localhost]:

                                                                                                                        
 [OK] EC-CUBE installation successful.                                                                                  
                                                                                                                        

installation successfulが表示された。
jpgについて その1


特にネタが思いつかなかったため、昔せっせと自分でエンコーダを作っていたjpgの内部構造について記事をしたためたいと思います\_(:3」∠)\_
**※注意 このお話で紹介するのはjpgの 1フォーマットに過ぎません。 全てのjpgがこのアルゴリズムで 動いてはいませんので悪しからず…** (jpg2000, 可逆jpg, etc…)

# そもそもjpgとは？
 * 静止画像を圧縮する方式の1つ
 * 非可逆圧縮
 * デジカメなんかの記録方式もコレ(exifとか特殊なヘッダがくっついている)
 * 画像の品質が低いとブロックノイズ発生


なんてお話を切り出してみたものの、とても1回では書ききれないため、今回はjpgの圧縮に用いられている主要なアルゴリズムについて触れていきたいと思います。

今回説明する主要アルゴリズムは以下の3つ

## 主要アルゴリズム
 * ランレングス(ゼロランレングス)
 * ハフマン符号
 * 2次元DCT

順にどのようなアルゴリズムなのか説明していきます。

# ランレングス
ある連続したデータを、そのデータ1つ分と連続した長さで表現すること

例

```
AAAAABBBBBBBBBAAA 
↓ 
A5B9A3
```

 * 可逆圧縮
 * 0(数字のゼロ)に対して行う場合を特別にゼロランレングスという
 * 連続したデータが多ければ多いほど高圧縮


# ハフマン符号
よく出現する文字には短いビット列、 あまり出現しない文字には長いビット列 を割り当てることで総データ量の 削減を狙うエントロピー符号

 * 可逆圧縮
 * 接頭符号(先頭から順に判定していって、必ず一意に符号化できるもののこと)
 * ハフマン木より生成

例

![スクリーンショット 2018-12-04 4.56.56.png](https://qiita-image-store.s3.amazonaws.com/0/321378/ad47d4e4-2cff-9c4a-2000-4ed4539a6154.png)

![スクリーンショット 2018-12-04 4.57.09.png](https://qiita-image-store.s3.amazonaws.com/0/321378/8f1badf5-8b55-ea2b-d4ad-feb7e10481e0.png)


# 2次元DCT
DCTを2次元空間に適用したもの

## そもそもDCT(discrete cosine transform)とは
 * 離散コサイン変換
 * 離散信号を周波数領域へ変換する1つの方法
 * MP3などの圧縮に利用されている

![スクリーンショット 2018-12-04 5.02.33.png](https://qiita-image-store.s3.amazonaws.com/0/321378/42d353c9-0576-0ec9-d11e-1397942f93b3.png)


MP3 → 1次元DCT
画素平面の2次元に適用したもの → 2次元DCT

音の周波数領域はイメージしやすいが、はて、画素の周波数領域？ …それってなんぞ？

![スクリーンショット 2018-12-04 5.05.43.png](https://qiita-image-store.s3.amazonaws.com/0/321378/d0d27605-7ea8-4b63-ea2a-2a8e45024842.png)

ここはイメージしづらいところですが、離散データを特定の成分ごとに分離する手法と捉えてください。
(逆の変換をかければ元の離散データに復元可能)

---

今回はここまで(๑•̀ㅂ•́)و✧

上記で挙げたアルゴリズムの他にも高い圧縮率を出すための工夫として

 * YCbCr変換
 * ジクザクスキャン
 * DC成分AC成分
 * ４：１：１

など様々な先人の知恵が盛り込まれています。

次回は上記含めて実際の処理フローについて見ていきたいと思います。
つづく
EOS のアカウント・ロール・権限　上級編

[EOS のアカウント・ロール・権限　基本編](https://qiita.com/blueplanet/private/c9f035aa02ac2a0db42e)　で基本的な使い方を紹介しました。
実は、基本設定以外に、他の指定方法によって、

- 複数キーペアと重み係数を指定し、マルチサインにする
- 他のアカウントを指定し、権限を委譲する

こともできます。

## 複数キーペアを指定する
`cleos set account permission` コマンドで権限を設定する時は、json フォーマットを使うことで、もっと細かく指定することが出来ます。
以下 help 説明のように、`authority` パラメータには json フォーマットで指定することが出来ます。

```shell
cleos set account permission -h
set parameters dealing with account permissions
Usage: /opt/eosio/bin/cleos set account permission [OPTIONS] account permission authority [parent]

Positionals:
  account TEXT                The account to set/delete a permission authority for (required)
  permission TEXT             The permission name to set/delete an authority for (required)
  authority TEXT              [delete] NULL, [create/update] public key, JSON string, or filename defining the authority (required)
  parent TEXT                 [create] The permission name of this parents permission (Defaults to: "Active")
```

具体的には、閾値・キーの配列・アカウントの配列のフォーマットで指定出来ます。

```json
{
  "threshold"       : 2,
  "keys"            : [{ "key": "key1","weight": 1 },{ "key": "key2","weight": 1 },{ "key": "key3","weight": 2 }],
  "accounts"        : []
}
```

上記の場合は

- key1 の重み係数が 1 で、key2 の重み係数が 1 となっています
- 閾値が 2 になっているので、 key1 と key2 同時でサインするだけその権限で実行出来ます
- 一方で、key3 のほうは、重み係数が 2 なので、1人だけ実行出来ます

勿論、key1 と key2 の重み係数を 2 にしておけば、片方だけで実行できるようになります。

## 他のアカウントを指定する
また、キーではなく、アカウントを指定することで、他のアカウントに権限を委譲することができるようになります。

アカウントで指定するメリットは

- キーは人間が読めないので、誰なのかは覚えられない、識別できない；アカウントの場合は、人間が読めるので、識別しやすい
- アカウントで指定するので、仮にそのアカウントが自分のキーを変更しても、権限の設定を変更しないで済む

があります。

```json
{
  "threshold"       : 2,
  "keys"            : [],
  "accounts"        : [
    {
      "permission" : { "actor" : "alice", "permission"  : "active" },
      "weight"      : 1
    },
    {
      "permission" : { "actor" : "bob", "permission"  : "active" },
      "weight"      : 1
    },
    {
      "permission" : { "actor" : "carol", "permission"  : "active" },
      "weight"      : 2
    }
  ]
}
```

内容は上のキー指定と同じになりますが、人間がすぐ読めます

- bob と alice は、二人一緒でしか実行出来ません
- carol は、1人で権限を実行出来ます

**上記は全部 `active` で設定していますが、勿論、基本編のように、カスタマイズの権限でも行けます**

`carol` アカウントの場合は、基本編と同じ手順で送金できますが、
`bob` と `alice` の場合は、マルチサインになるため、やり方が異なります。後ほど別記事で書きます。

## 継承関係
権限設定する時に、最後にパラメータ `parent` があります。
これを使うことで、カスタマイズ権限などの継承元を指定できます。
デフォルト `active` になっています

## まとめ
権限設定を活用することで、アカウントの権限を他のアカウント、つまりスマートコントラクトに任せることができます。
How to fix Non-NixOS TravisCI setlocale problems

On TravisCI, you will very quickly run into locale related issues like so:

```sh
bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
/nix/store/n2hjbpkf4c0m48945ivxs3lmsczzw2rg-bash-4.4-p23/bin/bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
Failure to decode string:
/nix/store/n2hjbpkf4c0m48945ivxs3lmsczzw2rg-bash-4.4-p23/bin/bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
/nix/store/n2hjbpkf4c0m48945ivxs3lmsczzw2rg-bash-4.4-p23/bin/bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
```

To work around this problem, set `LOCALE_ARCHIVE_2_27` (from `glibc-locales-2.27`) by using the `<nixpkgs>` `glibcLocales` package path:

```yml
sudo: required
dist: trusty
language: nix
script:
  - glibcLocales=$(nix-build --no-out-link "<nixpkgs>" -A glibcLocales)
  - export LOCALE_ARCHIVE_2_27="${glibcLocales}/lib/locale/locale-archive"
  - # other things in your script like:
  - make
```

See <https://github.com/NixOS/nixpkgs/issues/38991#issuecomment-443840585> for more details
android device file explorer

![image.png](https://qiita-image-store.s3.amazonaws.com/0/296847/31466752-c7ff-b97d-d9da-776ed2ed8e08.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/296847/9a9eaf1a-8c66-4e35-8cfb-1d53de2c6a7b.png)
自分用のChrome拡張をスッと作る(ログ)

自分は基本的にtampermonkeyに雑に用意することが多く、それで事足りることが多いがChrome拡張を書く練習として作ってみる。

今回は、GitHubのヘッダーに自分のTODOリストへのリンクを追加する。自分はTODO管理をGitHubのプライベートレポジトリで運用しているのでどこからでもそれへのパスがあると非常に便利。

![スクリーンショット 2018-12-04 03.52.20.png](https://qiita-image-store.s3.amazonaws.com/0/15319/d5c3a36b-1bc5-739c-888d-31efd5f06d85.png)

検索すると過剰なテンプレートが多いが、`manifest.json` さえあれば基本的によさそうだ。それに最新のChromeに対応すればいいので、特にトランスパイルは必要ない。まあライブラリが必要になればバンドルの必要があるので、webpackが必要になりそうだが今回は必要ない。

```
$ tree
.
├── content.js
└── manifest.json
```

`manifest.json` にいくつかの設定を書く。webページないのコンテンツをいじりたい場合は、`content_scripts` にどのサイトで実行するかや実行するスクリプトへのパスを追加する。公開する場合は、iconの画像等を用意する必要があるが、個人で使うなら関係ない。

```json
{
  "name": "GitHub-Header-Plus",
  "description": "HeaderにLinkを追加",
  "version": "0.1.0",
  "manifest_version": 2,
  "content_scripts": [
    {
      "run_at": "document_start",
      "matches": [
        "https://github.com/*",
        "https://gist.github.com/*"
      ],
      "js": [
        "content.js"
      ]
    }
  ]
}
```

あとは、雑にスクリプトを書くだけ。

```js
function insert({ title, href }) {
  const li = `
    <li>
      <a
        class="js-selected-navigation-item HeaderNavlink px-2"
        href=${href}
      >
        ${title}
      </a>
    </li>`
  document
    .querySelector('ul.flex-items-center')
    .insertAdjacentHTML('beforeend', li)
}

document.addEventListener('DOMContentLoaded', () => {
  const todo = {
    title: 'Todo',
    href: '/akameco/works/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc', // ここに任意のurlを追加する
  }
  insert(todo)
  console.log('👍 add todo')
})
```

あとは、`chrome://extensions/` にアクセスしてパッケージ化されてない拡張としてディレクトリを指定してあげれば完了だ。

![スクリーンショット 2018-12-04 03.52.20.png](https://qiita-image-store.s3.amazonaws.com/0/15319/d5c3a36b-1bc5-739c-888d-31efd5f06d85.png)

よくあるようにポップアップで任意のLinkを追加できれば汎用的になるので、公開はできる感じになるだろうが、記事を書きつつ30分でする作業だとここで限界。おわり
レスポンシブで正方形の縦横比を維持

初めまして、初投稿！
まだまだ勉強中なので、徐々にクオリティを上げていけたらなと...
よろしくお願いします！！



レスポンシブで要素を正方形で維持するのって結構面倒だなーって、
一年前か半年前か...

PC表示の時は幅と高さ決めちゃえば良いんですがレスポンシブだと
デバイスの幅で正方形を維持できない問題、コーディング始めたての時はかなりつまずきました。


解決策が意外となかったので、共有がてら


```
$(function() {
  function img_rect() {
    var wt = $("li").css("width");
    $("li").css('height', wt);
  };
  $(window).resize(function() {
    img_rect();
  });
  img_rect();
});
```


rectの縦横比をレスポンシブに合わせて調整してくれます。
要素のwidthを取って、heightに代入するといった感じです。

レスポンシブでインスタグラムやギャラリーなど見せるときおすすめです！
アイデアをいかに共有するか


こんにちは、LIGのWEBディレクターのほそです。
ゲームプランナー、デザイナーを経て現在はWEB業界で働いでいます。

なにかとエンジニアのお世話になるお仕事をしてきましたが、
実はかなりの機械オンチで、いつもどうやって自分の考えた仕様を実装してもらうか、
ストレスないコミュニケーションができるかに腐心してきた日々でもありました。

# 機械オンチの僕がいかにエンジニアと意思疎通をしてきたか
そんな僕がなんとか仕事をしてこれたのは、プランナーとエンジニアをつなぐ
様々なツールがあってこそ。
今回は今まで使ってきた社内連絡ツールの話を肴に、
アイデアをいかに共有するかプランナー目線でメリットデメリットを考えてみます。

# ゲーム会社にて　コンシューマゲーム開発
新卒でプランナーとして入社し、コンシューマゲームを制作していました。

このころ主に使っていたのは、
・[IBM Notes](https://www.ibm.com/jp-ja/marketplace/enterprise-email)
・インスタントメッセンジャー（内製ツール）
です。

## IBM notesのメリットデメリット

Notesはメールクライアントとしてだけでなく
プロジェクト管理、タスクの割り振り、バグ報告やアイデア出しなどを行なっていました。
社外との連絡が少なかったので、ほぼNotesと口頭で連絡は完結していました

### メリット
・1ツールで完結できること
・古いナレッジにアクセスしやすい
・数十ページに渡る資料を共有できる
### デメリット
・チャット機能がなく、アイデア出しには向かない
・スケジュール管理機能がない

アイデア出しとスケジュールの管理はというと…主に紙とペンが主役でした。
その代わり、ひたすらにあちこちの机を回って、
対面での打ち合わせでその分を埋めていました。

この対面のアポ取りに活躍したのが、
先述のインスタントメッセンジャーです。

## 使ってみての感想
このころは、ひたすら歩き回って大変だったなあという印象がありますが、
対面の即応性は、他のツールで代替し難いと、
いろいろな環境を経験したいまでも思います。

#デザイン会社にて

ゲームプランナーのあと一度キャリアチェンジして、
デザイナー兼プランナーとして働いていました。
そこでの連絡ツールは頼れるこいつ。

・gmail

です。

## Gmailだけですべての仕事を押し切る
はい。どベタですが、僕が働きはじめた当初、会社では紙モノや映像のテロップなど
グラフィックデザインだけで完結するものが多かったため、
社内確認、クライアントとのやりとり共にほぼメールだけで済ませていました。

WEB案件については、社内にエンジニアがいなかったのですが、
1枚もののLPなどが多かったため、都度都度外部パートナーをアサインしたり、
予算に応じてクラウドワークスで募集したりするなど、
メールで事足りる範囲で済んでいました。

## WEB案件の大型化で暗雲が立ち込める
しかし徐々に会社の請け負うWEBの案件が大型化してきました。
WPカスタマイズやページ数の増大など、コミュニケーション量が
増加するに従ってメールだけでは対応しきれない…！
なにかしら管理ツールの導入が必要となりました。

## TaskWorldを導入してみた

そこで導入されたのがこいつです。

・[TasWorld](https://taskworld.com/ja/)
プロジェクトが肥大化するにつれ、チャットワーク、trello,slackなど各案件ごとに
管理ツールが勝手に運用されている状態に陥り、これはいかんだろう・・・ということで
taskworldが導入されました。

### メリット
・プロジェクトのマイルストーン管理が楽
・マイルストーンごとにチャットしたりデータやりとりできる
・現在の残りタスクが一覧しやすい

### デメリット
・ナレッジの集積場としては微妙
・チャットツールとしては素っ気ない。クライアントも呼びづらい
・バグ管理が苦手

## 使ってみての感想
Taskworldの使用感は、trelloのカードごとにチャット機能が付いている感じです。
これはマイルストーンの設定と進行管理がめちゃくちゃ楽でした。

デザイン業務だと、たとえば【初校提出】というカードを作成したら、
そこでデザインデータ提出や社内チェックバックを繰り返し初校を仕上げる…
というフローで制作していました。

反面、カード1枚をマイルストーン単位で充てていたため、
バグをどんどん登録していく機能がなく、
結局エンジニアとチャットで細かくファイル共有などを行なって
フォローして行く運用になっていました。

とはいえ、小規模な制作会社においてはある程度
効率化できている方だったのではないか…と思います。

# LIGではどうなのか

・チャットワーク
・redmine
・gsuite

補助的に
・Slack
・Trello
など

## 使ってみての感想
クライアント対応、社内連絡ともにチャットワークの比重が高く、
プロジェクトの進行管理はRedmineが担っている感じです。

SlackやTrelloなどは、チームや案件に合わせてサブ的な扱いで
使用されており、フレキシブルに新しいツールを試していけるのは
結構いい感じだと思います。

あとは書類作成や打ち合わせの議事録などGsuiteを活用していく
方針になっており、Googleドキュメントなど全員で書き込みしながら
打ち合わせができるのは便利だなと思っています。

#最後に
自分は、組織の柔軟性と、アイデアの創発性の関係に関心があり、
連絡ツールという視点で今までの仕事を振り返ってみました。
情報が古いところもありますが、なにかの参考になれば幸いです。