OmniAICreator/Qiita-1.07M huggingface dataset:
Pandas Series 基礎

#1.簡単なSeriesを作る
Seriesを用いることにより、表のように扱うことができる

```
import pandas as pd
from pandas import Series

A = Series([1, 3, 5, 7])  //Seriesを作る
A
>> 0    1
   1    3
   2    5
   3    7
   dtype: int64

A.values　//値を返す
>> array([1, 3, 5, 7])
```

#2.indexのあるSeriesを作る


```
WP = Series([13.8, 13.3, 3.2, 2.6], index=['CHN', 'IND', 'USA', 'IDN'])
WP

>> CHN    13.8
   IND    13.3
   USA     3.2
   IDN     2.6
   dtype: float64

WP['USA']
>> 3.2

WP[WP>10]
>> CHN    13.8
   IND    13.3
   dtype: float64
```
indexを加えることで、数字だけでなく文字列で表すことができる
文字列のindexを用いることでも表示できる
また[]内で不等号を用いることで条件を満たしたものだけを出力する

#Seriesの機能

・to_dict()
辞書として出力する

```
WP.to_dict()
>> {'CHN': 13.8, 'IND': 13.3, 'USA': 3.2, 'IDN': 2.6}
```
また辞書からSeriesを作ることもできる

```
A = WP.to_dict()
B = Series(A)
B
>> CHN    13.8
   IDN     2.6
   IND    13.3
   USA     3.2
   dtype: float64
```

・isnull()、notnull()
要素ごとにnullかどうかを調べる

```
WP.isnull()
>> CHN    False
   IND    False
   USA    False
   IDN    False
   dtype: bool

WP.notnull()
>> CHN    True
   IND    True
   USA    True
   IDN    True
   dtype: bool 
```

・Seriesに名前をつける

```
WP.name = '世界の国の人口'　//Series自体に名前をつける
WP
>> CHN    13.8
   IND    13.3
   USA     3.2
   IDN     2.6
   Name: 世界の国の人口, dtype: float64

WP.index.name = "country"　//indexに名前をつける
WP
>> country
   CHN    13.8
   IND    13.3
   USA     3.2
   IDN     2.6
   Name: 世界の国の人口, dtype: float64
```
Invariant Violation: Text stringa must be rendered within a <text> componetが出てきた

# はじめに
react NativeはOS(Android,iOS)に依存しないアプリをかけるので、筆者の中での勉強の優先順位をじわじわと挙げている。

そんな中で、タイトルにもなっている
Invariant Violation: Text stringa must be rendered within a <text> componet

が出てきた時の対応方法を書いておく。

# コード

```App.js
~~~~~(中略)~~~~~

export default class App extends React.Component {

  constructor(props){
    super(props);
    this.state = {
      todo: [
        {index: 1, tilte: "原稿を書く", done: false},
        {index: 2, tilte: "犬の散歩をする", done: false}
      ],
      currentIndex:2
    }
  }
  render() {
    return (
      <View style={styles.container}>

        <View style={styles.filter}>
          <Text>Filterがここに配置されます</Text>
        </View>
        <ScrollView style={styles.todolist}>
          <FlatList data={this.state.todo}
            renderItem={({item}) => <Text>{item.title}</Text>}
            keyExtractor={(item, index) => "todo_" + item.index} 
          />
        </ScrollView>}
        <View style={styles.input}>
          <Text>テキスト入力がここに配置されます</Text>
        </View>
      </View>
    );
  }
}


~~~~~(中略)~~~~~
```

# 解決
コードを書いてみてわかった。

</ScrollView>の後ろの}が余計だった。

削除して実行してみると、エラーなく実行できた。
Laravel5.5のCarbon1系でaddMinutesメソッドがBadMethodCallException

# 結論

`(new Carbon(Carbon::now()))->addMinutes(10)`こう記述。
Carbon1系でも動作しますがが非推奨とのことで、Carbon2系にアップデートしましょう。

## 問題

```php
Carbon::now()->addMinutes(10);
```
を実行すると

```
BadMethodCallException with message 'Method addMinutes does not exist.'
```

Composerを動かすと以下のログが。

```
Carbon 1 is deprecated, see how to migrate to Carbon 2.
https://carbon.nesbot.com/docs/#api-carbon-2
    You can run './vendor/bin/upgrade-carbon' to get help in updating carbon and other frameworks and libraries that depend on it.
```

## 対応

なんか回りくどい書き方

```php
(new Carbon(Carbon::now()))->addMinutes(10);
```

## 参考

[laravel-carbon-2](https://github.com/kylekatarnls/laravel-carbon-2)を参考に、Carbon2系にアップデート

```composer.json
{
  ...
  "require": {
    ...
    "kylekatarnls/laravel-carbon-2": "^1.0.0",
    "nesbot/carbon": "2.0.0-beta.2 as 1.25.0"
  }
  ...
}

```

追加したあと

```
composer update
```
webpack.configをtypescriptで書く話


# webpack.configをtypescriptで書く話

## Webpack.config.jsがつらい
~~というか.jsがつらい~~
ようやくtypescriptにも慣れてきた所でジワジワとwebpack.config.jsの中身が膨れ上がり始めた
このままでは精神的によろしくないので、全部typescriptに落とし込んでしまおうという流れになった

## 環境

``` packages.json
{
  "devDependencies":{
    "@types/webpack": "^4.39.1",
    "typescript": "^3.2.2",
    "ts-node": "6.0.4", // 大事なやつ
    "webpack": "^4.36.1",
    "webpack-cli": "^3.3.6"
  }
}
```
前回に引き続き登場の`ts-node`
このモジュールによって、.tsなコンフィグファイルを読ませることが可能となっている

## 手順
何も考えずに
`npm i --save-dev @types/webpack typescript ts-node webpack webpack-cli`
を実行

webpack.config.jsと同じディレクトリにwebpack.config.tsを作り、以下のようにする

```webpack.config.ts
import * as WebPack from "webpack";

const options: WebPack.Configuration[] = [
{
  // ここに内容記述
}];

export default options;
```

これで準備OK
試しに記述してみる

``` typescript
const entry: WebPack.Entry = {
  main: "./src/Main.ts",
  option: "./src/Option.ts"
};
const output: WebPack.Output = {
  filename: "[name].js",
  path: `${__dirname}/dist/js`
}

const options: WebPack.Configuration[] = [
{
  name: "debug_local"
  entry: entry,
  output: output,
  //...
}];

```

このようになる
WebpPack.以下の型は、プロパティ名と一致しているので特に型を探す手間もなく簡単に記述できる

## 型定義のないプラグイン
webpackのLoaderは文字列一致でnode_modulesから呼び出してくれるが、Pluginの方はインスタンスが必要になる
型定義のあるプラグインは

```ts
import * as PluginName "PluginModule";

const options: WebPack.Configuration[] = [
  {
    plugins: [new PluginName()],
  },
```
と呼んでやればいいが、自分の使いたいプラグインの型定義ファイルが公開されていない場合は

```ts
const PluginType = require('ModuleName');
const plugin = new PluginType();

const options: WebPack.Configuration[] = [
  {
    plugins: [plugin],
  }
];
```

## 自分で作るプラグイン

今回は、.scssから.d.tsを生成する[typed-css-modules](https://github.com/Quramy/typed-css-modules)をWebpack.Pluginに落とし込んでみる
これにより、ビルド時に勝手にd.tsの生成をしてくれるようになる

```.ts
import * as TCS from "typed-css-modules";

class SCSSTypeGenerator implements WebPack.Plugin {
  apply(compiler: WebPack.Compiler){
    console.log("[SCSSTypeGenerator]start scss -> d.ts");
    const baseDirectory = Path.join(__dirname, "/src");
    TCS.run(baseDirectory, {
      camelCase: true,
      dropExtension: true,
      pattern: "**/*.scss"
    });
  }
}
```

インターフェースは
`apply(compiler: Compiler): void`
だけ実装すれば動作してくれるのでとてもお手軽
プラグインの実行タイミングをずらしたい場合は、引数の
`compiler.hooks.`以下にあるイベントにフックすることで実現できる
イベントごとに微妙に型が違うので注意すること（`SyncHook<T>`,`AsyncSeriesHook<T>`等）
オブジェクト指向とは？

10年くらいJavaのシステム開発に携わってきました。
何度かオブジェクト指向とは？という話を、現場で話したり、本を読んだり、ネットで調べたり。

そんな中、現場面接でオブジェクト指向の良い所は？と聞かれました。
その時は、？？ってなったので、改めて思考を整理して、言語化してみました。

私と同じように、現場経験が長いけど、オブジェクト指向とは？と改めて聞かれると、？？となる方。
そんな方の思考整理のキッカケになればと思います。

# 参考サイト
- [オブジェクト指向を正しく理解する
](https://tech.nikkeibp.co.jp/it/article/COLUMN/20060921/248617/?n_cid=nbpnxt_twbn)

# 整理する前のオブジェクト指向とは？
現実世界の考え方、見え方、をプログラミングの世界にそのまま持ってきている。
それゆえに、オブジェクト指向で作られたプログラムは、直感的に分かり易い（＝現実世界と似ているから）

と思っていました。

でも、あれ？ほんとう？今まで見たプログラムってそうだった？
と自問自答した結果、別の結論に至りました。

# 整理後のオブジェクト指向とは？
参考サイトのお言葉をお借りします。

「オブジェクト指向では全体の機能を一枚岩ととらえずに，データと手続きを持った「オブジェクト」の集まりとしてとらえる」

これにつきます。

それゆえに、オブジェクト指向で作られたプログラムは、個々の部品の独立性が高いので、保守性や再利用性が高くなり、開発工数、改修工数が従来より少なくなり、生産性が上がるという結論に至っています。

## 「オブジェクト指向では全体の機能を一枚岩ととらえずに，データと手続きを持った「オブジェクト」の集まりとしてとらえる」
私の理解を付け加えると、
「データ」・・・ 属性
「手続き」・・・振る舞い
を持った「オブジェクト」が、「集まったなら出来ること」が、それが「機能」。

## 開発工数、改修工数が従来より少なくなり、生産性が上がるという結論
オブジェクトは、独立しています。独立性が大切。

### 開発工数を少なくできる（再利用性）
独立した「たろすけオブジェクト」は、A機能にも、B機能の集合にも参加できます。
それって、A機能を作る時に、「たろすけオブジェクト」を作れば、B機能を作るときに、改めて作らずに済む。

### 改修工数が少なくなる（保守性）
独立した「たろすけオブジェクト」は、A機能にも、B機能の集合にも参加しているので、
A機能、B機能に共通した「手続き」を直す場合、「たろすけオブジェクト」の1か所の修正で済む。

# 上記をベースに3大特徴を自分の言葉で整理すると
## ポリモーフィズム
指示する側が楽チン。

具体的に言うと、「ユーザ管理画面を作ってほしー」って思った時に、
指示する相手が、「たろすけ」だろうが、「からすけ」だろうが「ユーザ管理画面を作ってください」って指示すれば、作ってくれるということ。
中身は、「たろすけ」と「からすけ」で、個性に富んだ「ユーザ管理画面」が出来ます。

更にいえば、「ものすけ」が出てきても、同じ指示で大丈夫です。

## 継承
共通の親分類にお任せ。

具体的に言うと、「たろすけ」と「からすけ」で同じ手続きは、「すけ分類」の「親」、「おやすけ」を作って、そこにお任せする。
という感じですかね。

これも良い所は、「ものすけ」が出てきても、その手続きを使えるということ。

## カプセル化
指示する側は、具体的な作業の中身を知らなくてよい。
これは、システム開発現場では、丸投げに当たりそうなので、お勧めできませんが、プログラム開発においては楽チンです。

ポリモーフィズムで、お話した「ユーザ管理画面を作ってほしー」って思った時に、
指示する相手が、「たろすけ」だろうが、「からすけ」だろうが「ユーザ管理画面を作ってください」って指示すれば、作ってくれる。

指示する側は、作り方を知らなくても良い。

というお話。

# あれ？結局、オブジェクト指向って何が良いの？
独立性が高いから、開発工数、改修工数が従来より少なくなり、生産性が上がる。
かな。

とはいえば、世の中には、銀の弾丸があるわけでは無いです。
あれば、みんな使っています（笑）
なので、全てにカッチリ当てはまるとは思っていません。

ただ、便利な手法の１つとして、捉える。
使える所で使う。
っていうのが、良いかと思います。

# 駄文
頭で整理できた！って思って、言語化すると、色々詰まりますｗ
言語化は大切ですねｗ
Data Pumpインポート時のREDO抑制機能を試す（Oracle Database 12c-）

# Data Pumpインポート
 Data Pumpインポート処理の実行時にはテーブルに対して更新が発生するため、REDOが生成されます。障害が発生した場合にはData Pumpの再ロードを行うことで整合性が保てるのであれば、REDOの生成を抑制してパフォーマンスを向上させることができます。Oracle Database 11gまでは、REDOの抑制はインポート先のオブジェクトに対してNOLOGGING属性を指定していました。
Oracle Database 12c以降は、impdpコマンドのtransformパラメーターにdisable_archive_loggingオプションを指定することでインポート時のREDOを抑制することができます。

## 使い方
 transformオプションにdisable_archive_loggingを指定します。さらにこのオプションを有効化（:Y）するか、無効化（:N）するかを指定します。特定のオブジェクトのみ効果を指定する場合には、オブジェクトの種類を指定することができるようです（例disable_archive_logging:Y:TABLE）。
ただし最新の [マニュアル](https://docs.oracle.com/cd/F19136_01/sutil/datapump-import-utility.html#GUID-64FB67BD-EB67-4F50-A4D2-5D34518E6BDB) には記述がありません。

```
$ impdp userid=SCOTT/password dumpfile=scott.dmp directory=DIR1 table_exists_action=TRUNCATE transform=disable_archive_logging:Y

Import: Release 19.0.0.0.0 - Production on Fri Aug 30 03:10:33 2019
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.
...

Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
Job "SCOTT"."SYS_IMPORT_SCHEMA_01" completed with 4 error(s) at Fri Aug 30 03:10:41 2019 elapsed 0 00:00:08
$
```

disable_archive_loggingパラメータを指定した場合と指定しなかった場合で、REDO発生量を比較します。V$SYSSTATビューから処理実行ごとにREDO発生量を検索して処理後に引き算します。

```
SQL> SELECT VALUE FROM V$SYSSTAT WHERE NAME='redo size';

     VALUE
----------
  57994244

```

|処理|REDO生成量(KB)|
|:---|---:|
|通常| 113,199.25|
|disable_archive_logging指定|59,912.06|

impdpコマンドに「transform=disable_archive_logging:Y」オプションを指定することで、REDO生成量が小さくなっていることがわかります。

## FORCE LOGGINGとの併用
　データベースの属性にFORCE LOGGINGがあります。FORCE LOGGING属性が設定されていると、NOLOGGING属性が指定されたオブジェクトに対してもREDOが生成させるようになります。Data Guard環境では一般的な指定です。FORCE LOGGING属性が有効なデータベースに対してdisable_archive_loggingパラメーターを指定してインポートを行いました。

```
SQL> SELECT FORCE_LOGGING FROM V$DATABASE;

FORCE_LOGGING
---------------------------------------
YES

```

|処理|REDO生成量(KB)|
|:---|---:|
|通常|113,352.77|
|disable_archive_logging指定|113,328.91|

上記の結果から「transform=disable_archive_logging:Y」オプションを指定してもFORCE LOGGINGが指定されたデータベースではREDOの生成は抑制できないことがわかります。

## その他
 サポート文書 [DocID: 2373293.1](https://support.oracle.com/knowledge/Oracle%20Database%20Products/2373293_1.html) にはFORCE LOGGING設定以外でもREDOが生成される条件が示されています。
[Ruby]Seleniumで開いているページをファイルに保存する

`driver.get`したあと、ページを丸ごと保存したいときの情報が見つけられなかったのでメモ。

`driver.page_source`をつかう。

```rb
File.open("page1.html", "w") do |file|
  file << driver.page_source
end
```

参考：[7\. WebDriver API — Selenium Python Bindings 2 ドキュメント](https://kurozumi.github.io/selenium-python/api.html#selenium.webdriver.remote.webdriver.WebDriver.page_source)


Seleniumのつかい方は、以下のサイトがとても参考になりました👏

- [Seleniumチートシート \[Ruby\] \| 酒と涙とRubyとRailsと](https://morizyun.github.io/web/selenium-cheat-sheet.html)
- [Webブラウザの自動操作 \(Selenium with Rubyの実例集\) \- Qoosky](https://www.qoosky.io/techs/71dd2d67ea)
AndroidX + Robolectric + MultiDex のビルドがエラーになるとき

Robolectric の MultiDex 対応に `org.robolectric:shadows-multidex` をいれてて
AndroidX への移行している場合、
ビルド時に Jetifier まわりでエラーが出ることがあります:

```
> Execution failed for JetifyTransform: /home/circleci/.gradle/caches/modules-2/files-2.1/org.robolectric/shadows-support-v4/3.3.2/120e08a6d6d9bd56614f9a3e91c853039107761d/shadows-support-v4-3.3.2.jar.
> Failed to transform '/home/circleci/.gradle/caches/modules-2/files-2.1/org.robolectric/shadows-support-v4/3.3.2/120e08a6d6d9bd56614f9a3e91c853039107761d/shadows-support-v4-3.3.2.jar' using Jetifier.
Reason: The given artifact contains a string literal with a package reference 'android.support.v4.content' that cannot be safely rewritten. Libraries using reflection such as annotation processors need to be updated manually to add support for androidx.
```

## ブラックリストに追加

この場合 Jetifier と相性が悪いので
Workaround としてブラックリスト入りさせる方法が提案されてます:

👉 https://github.com/robolectric/robolectric/issues/4491#issuecomment-498603341

```properties:gradle.properties
android.jetifier.blacklist=shadows
```

## `ShadowAndroidXMultiDex` を使うように変更

あとは `Config` を与えるときの `Config.Builder.setShadows(ShadowMultiDex.class)` を `Config.Builder.setShadows(ShadowAndroidXMultiDex::class)` に変更しておくのも必要です。

バージョンによっては `ShadowAndroidXMultiDex` がないことがあるので、`shadows-multidex` のバージョンを上げておくことも必要です:

```gradle:app/build.gradle
testImplementation "org.robolectric:shadows-multidex:4.3"
```

## `GlobalConfigProvider` の設定

で、この `Config` を設定するために `GlobalConfigProvider` を設定しておく必要があります:

👉 https://github.com/robolectric/robolectric/issues/4770#issuecomment-479559317

```kotlin:app/src/test/java/your/own/app/provider/CustomGlobalConfigProvider.kt
package your.own.app.provider

import com.google.auto.service.AutoService
import org.robolectric.annotation.Config
import org.robolectric.pluginapi.config.GlobalConfigProvider
import org.robolectric.shadows.multidex.ShadowAndroidXMultiDex

@AutoService(GlobalConfigProvider::class)
class CustomGlobalConfigProvider: GlobalConfigProvider {
    override fun get(): Config {
        return Config.Builder
                .defaults()
                .setShadows(ShadowAndroidXMultiDex::class.java)
                .setPackageName("your.own.app")
                .build()
    }
}
```

で `AutoService` を使ってるので以下を追加します:

```gradle:app/build.gradle
testImplementation "com.google.auto.service:auto-service:1.0-rc6"
kaptTest "com.google.auto.service:auto-service:1.0-rc6"
```

これで Robolectric の Multidex が Jetifier 有効でもビルドできるようになるかと思います。
【GAS×Vue.js Webアプリ】google.script.run で async/await を使う

# はじめに
某デジタルメディアでGASを使ってを社内ツールを開発している情報系学部4年生です。
WebアプリケーションをVue.jsで書き、バックエンドや各種APIコールなどをGoogle Apps Scriptで処理し、データベースにスプレッドシートを使用することでインフラコスト0で運用できる。

Webアプリケーション側からGAS内のコードを走らせてその戻り値を受け取るために
[google.script.run](https://developers.google.com/apps-script/guides/html/reference/run) を使用すると楽に実装できるが、サーバサイドのコードを走らせているため、非同期処理となり、複数のスプレッドシートを読み込んで実装する場合はコールバック地獄が発生する。

その問題を解決できたので、簡単にメモ
[参考にしたサイト](https://note.mu/torufurukawa/n/n23610ee49b4a)

# コード
フロントのVue.jsの処理を以下のように実装する。

```javascript:hoge.js
let db = new Vue({
  el: '#app',
  data: {
    sheet_a: null,
    sheet_b: null,
  },
  methods: {
    loadData: async function() {
      //ここに書くと順番に実行される
      const sheet_a = await this.getSheetA();
      console.log('成功!取得したデータ: ' + JSON.stringify(sheet_a));
      this.sheet_a = sheet_a;


      const sheet_b = await this.getSheetB();
      console.log('成功!取得したデータ: ' + JSON.stringify(sheet_b));
      this.sheet_b = sheet_b;
      //全部のデータを取得した後に実行したい処理を下に記述

    },

    getSheetA: function() {
      //コード.js内のgetSheetA()を実行
      return new Promise((resolve, reject) => {
        google.script.run
          .withSuccessHandler((result) => resolve(result))
          .withFailureHandler((error) => resolve(error))
          .getSheetA();
      });
    },
    getSheetB: function() {
      //コード.js内のgetSheetB()を実行
      return new Promise((resolve, reject) => {
        google.script.run
          .withSuccessHandler((result) => resolve(result))
          .withFailureHandler((error) => resolve(error))
          .getSheetB();
      });
    }

  },
  //マウント時
  mounted: function() {
    //マウント時にシートを取得
    this.loadData();
  },
});
```

一応GAS側で実行されるコードも記述しておきます。
※本来は``doGet()``関数内にHTMLファイルを返すためのコードを書かないといけません。
GAS×Vueで簡単なWebアプリを作る方法は[こちら](https://qiita.com/merarli/items/e82299fb91e066e714fe)

```javascript:コード.gs
function getSheetA() {
  var sheet = SpreadsheetApp.getActive().getSheetByName('シート1');
  var rows = sheet.getDataRange().getValues();
  var keys = rows.splice(0, 1)[0];
  return rows.map(function(row) {
    var obj = {};
    row.map(function(item, index) {
      obj[String(keys[index])] = String(item);
    });
    return obj;
  });
}

function getSheetB() {
  var sheet = SpreadsheetApp.getActive().getSheetByName('シート2');
  var rows = sheet.getDataRange().getValues();
  var keys = rows.splice(0, 1)[0];
  return rows.map(function(row) {
    var obj = {};
    row.map(function(item, index) {
      obj[String(keys[index])] = String(item);
    });
    return obj;
  });
}
```
CentOS8.0にEPELリポジトリの追加

#目的
RHEL8 or CentOS8にEPELリポジトリを追加すること。

#手順
```
yum -y install https://dl.fedoraproject.org/pub/epel/8/Everything/x86_64/Packages/e/epel-release-8-5.el8.noarch.rpm
```
Photoshopで背景画像を切り抜く

<strong>問題点：PSDのデザインは最大の画面サイズではありません。 したがって、PSDからバックグラウンド全体をカットすると、バックグラウンドは繰り返されますが、破損します。<strong>

<i>ベストプラクティス：元の画像パターンのみをカットします（利点：小さな画像サイズの結果、ページの読み込み時間が短くなります）</i>

<h1>①背景画像カッティングプロセス</h1>

<h2>STEP 1. PhotoshopでオリジナルのPSDを開く (例：元の背景画像のサイズ→ 1000 x 700 px)</h2>
![image-1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488641/8e37df39-3913-d5e2-29f7-a81d2143e938.png)

<h2>背景画像のパターンコピーする手順</h2>

<h3>STEP 1. クリックPattern Overlay(2) > クリックPattern Overlay > (3) クリックcopy pattern (4)</h3>
![image-2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488641/780b6c6b-ed77-b818-4cb1-431f763a86fb.png)


<h3>STEP 2. コピーしたパターンにマウスを合わせて元のパターンサイズ（283 × 283 px）を確認し、サイズを覚えておいてください。</h3>
![image-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488641/c5ba0cab-eb5e-4b24-8012-ac87c56682be.png)

<h3>STEP 3. 背景レイヤーを新しいページに複製します。</h3>
![image-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488641/a3803329-d6ec-c0e8-dd30-745c31198a01.png)

<h3>STEP 4. 背景の矩形形状（1000 x 700 px → 283 x 283 px）のサイズを変更し、Radius（半径）を15px → 0）を削除します。 背景（bg-charm.png）イメージをトリムして保存します。</h3>
![image-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488641/76d6e1ef-fd85-8c03-2858-510b1e2f2f4b.png)
元と背景画像：(1000 x 700px)
![image-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488641/1b9b0f04-65eb-36e4-bba4-39dc972cf4eb.png)
repeat外した背景画像：(283 x 283px)

<h1>②PC / SP用のビューポート互換コーディング(CSS):</h1>

<i>PCの場合: </i>

```CSS:CSS
.charm-bg {
  background: url('img/charm/bg-charm.png') repeat top left;
}
```

<i>SPの場合: </i>

```CSS:CSS
.charm-bg { 
  background: url('img/charm/bg-charm.png') repeat top left;
  background-size: 50%;
}
```
Git diff で差分ファイルを抽出する。大量・大容量ファイルでも大丈夫バージョン

#やりたいことは差分ファイルの抽出

今回の夢は、指定コミットから指定コミットまでの差分を、ディレクトリ構造そのままで、差分のみzipに圧縮したい願望を叶えることです。

# 既存記事での差分抽出方法おさらい

色々調べた上で見つかった便利抽出コマンドのおさらいです。
色々なコマンドが見つかりまして、使わせて頂いてました。

```bash
git archive revision `git diff --name-only origin/master revision --diff-filter=ACMR` -o diff.zip
```

diffでファイルリストを出力して、アーカイブでzip可するコマンドですが、
**大量のファイルに対応できません**

比較的大きなプロジェクトで差分を出していると、すぐにハマります。
なので、これは使わなくなりまして……。

```bash
git diff --name-only --diff-filter=ACMR {OLDID} {NEWID} | xargs git archive --format=zip {NEWID}  -o diff.zip
```

xargsの力で、たくさんファイルがあっても大丈夫！　というコマンドですが、
**超大量のファイルもしくは、大容量ファイルに対応できません**

ここ、きちんと出力できていない事実だけで問題でしたので、原因をそんなに詳しく調べてないのですが、

- Git Lfsを使っている
- 1000ファイル以上の大量のファイル
- mp4等の大容量ファイルを含んでいる

この条件で実行した場合、HEADから数コミット分の差分ファイルしか出力されず、期待したzipを作成できませんでした。

これ以上の差分作成コマンドはネットの海に見当たりません……。
僕は自作を余儀なくされたのでした。

# 大量、大容量ファイルでも大丈夫バージョンができたー！

git archiveの挙動がエラーも出ず度々変わってくるので、かなり悩まされました。

git diff はどんなにファイルが多くてもすべての差分ファイルリストを出力してくれているようです。

そこで僕は気づきました。

## 別に git archive使う必要ないんじゃね？？？？

挙動が変なら使わなければいいんですよ。

```bash
rm -f diff.zip && git diff --name-only --diff-filter=ACMR {OLD} {NEW} | zip diff.zip -@
```

**これでいいじゃん！！！!**

gitに archiveなんて機能があると使いたくなっちゃいますが、 git diffで差分リストさえ出せればどうとでもできるんですよねー。
windowsの人は gitBashとかにでもzipコマンドをインストールしておきましょう。

**ただし、チェックアウトしているファイルがzip圧縮されます。HEAD以外の差分抽出は、該当コミットにチェックアウトしてから実行しましょう。**

より簡潔にかつスマートなコマンドが出来上がって僕は満足なのでした。

おわり。
kintoneの特定のフィールドをmdファイルとしてダウンロード

kintoneの詳細画面とかにボタンを置いて、押すと任意のフィールドをmdファイルとしてダウンロード。
ダウンロードするファイル名はYYYY-MM-DD形式のフィールド（今回はルックアップ）の値を取得して、いい感じにトリミングして「YYYYMMDD.md」としてダウンロード

* `memo_markdown`この部分を任意のコピーしたいフィールドのフィールドコードに変更。
* ファイル名につかう日付フィールド(今回はルックアップ)を`release_date`というフィールドコードで配置
* 「スペース」フィールドの配置が必要。今回は`md_link_sapce`というフィールドコードで配置。
* jQueryは読み込み必要。


```javascript:sample.js
(function($) {
  'use strict';
  let events = [
    'app.record.detail.show'
  ]
  
  kintone.events.on(events, function(event){
    let el = kintone.app.record.getSpaceElement('md_link_sapce');
    $('<input />', {
      'type': 'button',
      'name': 'c_button',
      'value': 'Download',
      'class': 'create_button',
    }).on('click', function (resp) {
      var kin_stream = event.record.memo_markdown.value;
      var r_date = event.record.release_date.value;
      r_date = r_date.replace( /-/g , "" );
      SaveToFile(r_date + ".md",kin_stream);
    }).appendTo(el);
  });
  
  function SaveToFile(FileName,Stream) {
    if (window.navigator.msSaveBlob) {
      window.navigator.msSaveBlob(new Blob([Stream], { type: "text/markdown" }), FileName);
    } else {
      var a = document.createElement("a");
      a.href = URL.createObjectURL(new Blob([Stream], { type: "text/markdown" }));
      //a.target   = '_blank';
      a.download = FileName;
      document.body.appendChild(a) //  FireFox specification
      a.click();
      document.body.removeChild(a) //  FireFox specification
    }
  }

})(jQuery);
```
銀座Rails#12@DeNA行ってきました。

昨日行ってきた銀座Rails#12で学んだことをメモ的にまとめておこうと思います。

### 「出張Railsウォッチ in 銀座Rails」
週刊Railsウォッチの@morimorihogeさん(BPS株式会社)の発表でした。Rails6の新機能や、個人的にはまだ自分は使ったことがないgemなどを色々聞けたことが収穫でした。大規模サービスでは複数DBを使用することもありますが、Rails6には標準で対応（まだ実用は厳しいみたいです）したり、gemだとswitch_point、secondbase(Rails5.1まで対応)などが良いみたいです。複数DBを設定する時はdatabase.ymlの形式が変わったり、migrationもmagration_pathを設定して別々に行うようです。

あと他にも興味深いものを紹介して頂きました。

Fullstaq Ruby...高速化されたRubyのディストリビューション
Ruby on Jets...Rubyのサーバーレスアプリケーションフレームワーク

### 「Rails使いのNuxt.js入門」
坂川雅俊さんの発表でした。普段、私はRailsをメインに業務をしていますし、そのRailsもまだまだ勉強不足なので、なかなかJavaScriptをしっかり勉強できる機会は少ないのですが、VueやReactを使ってしっかり作られたWebアプリはモバイルのネイティブアプリと比べても差が少ないアプリケーションになっていると感じることも多く、Vue.jsのフレームワークであるNuxt.jsにも関心がありました。発表の内容はNuxt.jsで一から簡単にアプリを使ってみるという内容で、Nuxt.jsも一回は触ってみたくなる内容でした。
Pugという言葉を最近たまに聞いたことがあったのですが、この発表でも使われていてPugとはHTMLを効率的に書くためのテンプレートエンジンで、RubyでいうSlimテンプレートのような記法のことみたいです。Slimみたいにスッキリ書けるのはRubyエンジニアの特権みたいに感じているところもあったのですが、そういう訳でもないみたいですね。

### 「プログラマがコードを書きながら考えること 」
 「プロを目指す人のためのRuby入門」で有名な@jnchito(伊藤淳一) さんの発表でした。伊藤淳一さんがコーディングをする過程を追体験して、アプリを作成しながらその時にどういうことを考えながらコーディングしているかという発表内容でした。作成したアプリケーション自体も自分にはかなり勉強になるものだったのですが、今回の発表内容的にも自分がコーディングをする時との違いや、作業の流れを追うように意識しました。

・公式のドキュメントを参照する
自分の場合は、公式ドキュメントは英語で書かれていることが多くなるべくブログやQiitaなどの日本語記事で済ませようと考えてしまうことが多いです。しかしどうしても個人が前に書いた記事は内容や環境が古くなっていたり、やはり公式のドキュメントに勝るものはないと再認識しました。

・なるべく簡単な機能をつけるところから始めて機能を拡張していく
伊藤淳一さんのようなエンジニアでもいきなり作りたい機能をまるっと作成するのではなく、まず簡単なサンプルを作って設定などが出来ているか確認していたりする姿は個人的には救われたというか、自分も最終的なゴールにたどり着くために途中の適切な目標を作成してアプリを作成していきたいと思いました。

・RubyMineのデバッガ機能でブレークポイントを設定してデバッグ
IDEのデバッガを使って素早くにブレークポイントを設定して、どこまでは正しく処理をしているか確かめている姿は便利な道具をしっかり使いこなせれば、やはり恩恵を受けられると感じさせられました。自分はIDE使っていてもデバッガはまともに使えたことがなかったのですが、また挑戦したいと感じさせられました。

・開発途中で簡単なテスト書いて、実際に動かして確認する時間を短縮
テストの使い方、活用の仕方を実際に感じることが出来ました。自分はまだしっかりとしたテスト書きながら開発が出来ていないので、テストを書く必要性や利点を思い知らされました。

アプリケーションを作成している時の思考過程などを追体験させて頂いて、色々勉強になりましたし普段自分が何度も体験している「あれ？動かないぞ？」という状態は、経験や実力のある人でも当然に起こるものであるということが分かったと同時に、そのエラーが起きてから解決するための技術がやはり違いましたし自分には足りないと感じました。知識や経験によってある程度、問題解決のための方法が直感的に分かることもあるみたいです。
IOSでいい感じにサイドメニューをスムーズスクロールさせる。

# IOSでサイドメニューを開くとスクロールがなんかスムーズじゃない
こういうメニュー、全然スムーズに動いてくれない。
カクカク動く感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/c85134e8-ad66-cfa5-ceb8-f67aa4a2c1f7.png)


## これでスムーズになる。

```css style
overscroll-behavior-y: contain;
-webkit-overflow-scrolling: touch;
```

## 参考
iOS Safari でスムーススクロールにするやつ
https://developer.mozilla.org/ja/docs/Web/CSS/-webkit-overflow-scrolling
スクロールチェインを制御するやつ
https://developer.mozilla.org/ja/docs/Web/CSS/overscroll-behavior
PythonからOpenCVのcontribを使用する

# 背景
macOSではOpenCVをbrew経由でインストール可能だが、SIFTなどcontribに含まれる機能を使うことはできない（昔はcontribもインストールできたが今はできなくなってしまった）。
contribの機能を使うには自前でOpenCVをビルドしなければならない。
自分の作業メモ的に記録しておく。
この記事ではOpenCV4（4.1.0）のインストールを想定している。

# 1. OpenCVのダウンロード
下記URLからOpenCVのソースコードをダウンロード
https://github.com/opencv/opencv/releases
適当な場所に解凍する

# 2. OpenCV contribのダウンロード
下記URLからOpenCV contribのソースコードをダウンロード
https://github.com/opencv/opencv_contrib/releases
適当な場所に解凍する。OpenCVの解凍して出てきたフォルダ直下に適当な名前で解凍しておくとよい（`contrib`など）。

# 3. cmakeの設定
ついでにcmakeもインストール
https://cmake.org/download/
OpenCVのビルドのために必要。

# 4. OpenCVのビルド
cmakeを起動し、ビルドの設定を行う。

- 1. contribのモジュールも一緒にビルドするために`OPENCV_EXTRA_MODULES_PATH`にステップ2でダウンロードしたOpenCV contribの保存場所を指定する。
![Screen Shot 2019-08-30 at 14.16.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6951/723a578e-ddd2-46ba-95ee-cb94833f7700.png)


- 2. 著作権で保護された機能（SIFTなど）を使うために`OPENCV_ENABLE_NONFREE`にチェックを入れる
![Screen Shot 2019-08-30 at 14.19.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6951/c678d408-9263-3af1-fef7-dfa51e05758e.png)

- 3. Configure、Generateをクリックしてmakeファイルを生成
- 4. コマンドラインから`make`、ビルドが終わったら`make install`を実行する

# 5. opencv-python, opencv-contrib-pythonをインストール
Python経由でOpenCVを触るために下記のソフトをpipでインストール
- https://pypi.org/project/opencv-python/
- https://pypi.org/project/opencv-contrib-python/

# 6. ビルド結果をpythonのパッケージにコピーする
下記ファイル（`cv2.cpython-37m-darwin.so`）をPythonのcv2のパッケージにコピーする
![Screen Shot 2019-08-30 at 15.28.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6951/08f16f7c-4b98-db54-98ed-206e74f44564.png)
![Screen Shot 2019-08-30 at 15.30.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6951/bf0d6cf2-35f8-8ce4-3bc7-1dced53a930c.png)
Numpy 基礎

numpyの基礎についてあの記事なので初歩的なものになっています。

#1.行列の作り方
自分で要素を指定する

```
import numpy as np
array = np.array([[1,2,3], [4,5,6]])
array

>>>array([[1,2,3],
          [4,5,6]])
```

特殊な行列の作り方
・np.zeros()   ： 全ての要素が０
・np.ones()   ： 全ての要素が１
・np.empty()  ： 空っぽの行列
・np.eyes()   ： 単位行列
・np.arange() ： arange関数

```
np.zeros(5)
>>> array([ 0.,  0.,  0.,  0.,  0.])

np.ones(5,3)
>>> array([[ 1.,  1.,  1.,  1.,  1.],
           [ 1.,  1.,  1.,  1.,  1.],
           [ 1.,  1.,  1.,  1.,  1.])  

np.empty(5)
>>> array([-1.28822975e-231, -1.28822975e-231,  1.48219694e-323,
           0.00000000e+000,  0.00000000e+000])

np.eye(3)
>>> array([[1., 0., 0.],
           [0., 1., 0.],
           [0., 0., 1.]])

np.arange(4)　//引数に置いた数字までの行列を作る
>>> array([0, 1, 2, 3])


np.arange(5,50,2) //5から50までの数字で1つ飛ばしの行列
>>> array([ 5,  7,  9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 
           35, 37, 39, 41, 43, 45, 47, 49])
```  

#2.行列の計算

四則演算の確認


```
array1 = np.array([1,2,3,4])
array2 = np.array([5,6,7,8])

array1 * array2  //行列のかけ算
>>>array([ 5, 12, 21, 32])

array1 ** 3 //べき乗
>>> array([ 1,  8, 27, 64])

array1 - array1 //引き算
>>> array([0, 0, 0, 0])

array1 + 1 //各要素ごとに１を足す
>>> array([2, 3, 4, 5])
```

#3.計算のための関数

・np.sqrt() : 平方根の計算
・np.exp() : 自然対数の底eの累乗
・np.add(A, B) : ２つの行列を足す
・np.maximum(A, B) : 各要素の大きい方を返す

詳しくは　http://docs.scipy.org/doc/numpy/reference/ufuncs.html#available-ufuncs
cherry本を通して

# cheery本を読んでみて良かったこと
・クラスとモジュールの概念を掴むことができた。
・Procオブジェクトの便利さを再認識
・使えるメソッドの量が増えた

## １、ruby内の全てのデータはオブジェクトである。
rubyの全てのデータはオブジェクトだという事は知っていたけど、あまり深くは理解してなかった。オブジェクトは何かしらのクラスに所属している。これを理解することにより、「クラス」というものをより強く意識することができるようになった。「クラス」を意識することにより、役割ごとに処理をまとめることができるようになった。

## ２、クラスとインスタンス
クラスとインスタンスを意識することにより、クラスメソッドやインスタンスメソッドを意識して使うことができるようになった。インスタンスにどういう属性を持たせるべきか、このインスタンスはクラス内部だけでしか呼ばれないか、もしくは外部でも呼ばれるようにしたいか。(public、private、protected)外部からも呼ばれるようにするためには、アクセサメソッドを定義するなど、一連の流れを掴めるようになった。

## ３、クラスの継承
今までは、クラスの継承が中々パッと思い浮かばなかったが、コードを各際にまずは何か既存で使えそうなものがないかを考えれるようになった。スーパークラスとサブクラスには明確な関係性があるか、意味の分からない継承をしようとしていないかがわかるようになった。

## 4、module全般についての知識が高まった。
そもそもmoduleについての知識がものすごく曖昧だった。しかし、moduleがどういう時に使われるのかが明確になった。

モジュールの用途は以下のような時である。
・継承を使わずにクラスにインスタンスメソッドを追加する、もしくは上書きする(include、prependなど)
・複数のクラスに対して共通の特異メソッド(クラスメソッド)を追加する。(extend)
・クラス名や定数名の衝突を防ぐために名前空間を作る。
・関数的メソッドを定義する。
・シングルトンオブジェクトのように扱って設定値などを保持する。

## ５、Procオブジェクトの便利さを再認識
今まではProcオブジェクトの名前を知っているぐらいで、実際にどう使うかは曖昧だった。procとラムダの違いなんて気にしたこともなかった。チェリー本では、Procについての情報量が多かったので、しっかりと使い方を学ぶことができた。

```sample.rb
# ブロック処理ができるラムダの作成はとても簡単
add_lambda = ->(a, b) { a + b }
add_lambda.call(10, 20)  # => 30
```

## ６、使えるメソッドが増えた
cherry本の中で色々なメソッドが出てくるので、コード書き写してく時に自然と使い方を学べるのはとてもgoodでした。
例：inject, rjust, scan, values_at, chars, split, with_indexなどなど。

##　良かったこと総括
rubyの中での概念、処理の流れなどを理解することができたことが一番良かった。メソッドの探索方法や例外処理が発生した時の処理の手順やクラスの継承など。こういう概念の部分は一見すぐには役立ちそうではないけど、プログラミングをしていく上でこういった概念を理解しているか、いないかで頭の中の整理のされ方が変わってくると思うので、概念を理解することを意識してcherry本を読むことがすごい大事なことだったと思う。あと、ちょくちょく出てくる例題問題は実際に手を動かして、何も見ずに解けるようにするだけでただ本を読むよりかは、何か得られるものがあると思う。

# cherry本を読んでも分からないこと。解決できなかったこと。課題。
・１つ１つの概念やメソッドの使い方を理解できたが、暗記したわけではないので、パッと使うことができない。誰かに指摘された時に、あー、そのメソッドを使えばいいのか！というレベル。数あるメソッドの中から、このメソッドをこのタイミングで使う！という絶妙な使い方はやはり仕事の業務をする上で覚えていく感じになるのだと思う。

・言葉では理解できていても、実際に手取り足取り使えるようにはならない。業務を通して、レビューを受けて、徐々に脳に浸透させていくしかないかと。それか、「cherry本」の内容を踏まえて、簡単なプログラムを自分で作ってみるとか。

・どこまで深掘りすべきなのか。

・これは個人的に苦手だなと感じたところだが、「演算子を独自に再定義する」的なことがあまり理解できていないので、もうちょっと調べる必要がある。例えば、comparableモジュールの<=>の再定義とか
既存のVueプロジェクトにTypeScriptを導入する

# TL;DR
- 既存のVueプロジェクトにTypeScriptを導入したい際にやったことをまとめた
- `vue-cli`や`nuxt`を利用したプロジェクトではない
- extendではなくデコレータ方式で記述する

# バージョン
- webpack: 4.33.0
- typescript: 3.5.3
- vue-property-decorator: 8.2.1
- ts-loader: 6.0.4
- @typescript-eslint/parser: 1.12.0
- @vue/eslint-config-typescript: 4.0.0
- vue-eslint-parser: 6.0.4
- ts-jest: 24.0.2

# 実際に導入する
## Vue

### 関連モジュール
```bash
$ npm i -D typescript vue-property-decorator
```

型定義ファイル(`d.ts`)を作成する。

```index.d.ts
declare module "*.vue" {
  import Vue from "vue";
  export default Vue;
}
```

## Webpack

### 関連モジュールのインストール
```bash
$ npm i -D ts-loader
```

### webpack.config.jsの設定
```webpack.config.js
...
{
  test: /\.ts$/,
  loader: "ts-loader",
  exclude: "/node_modules/",
  options: {
    appendTsSuffixTo: [/\.vue$/]
  }
}
...
```

## ESLint

### 関連モジュールのインストール
```bash
$ npm i -D @typescript-eslint/parser @vue/eslint-config-typescript vue-eslint-parser
```

### .eslintrc.jsの設定
```.eslintrc.js
module.exports = {
  ...
  extends: [
    'plugin:vue/recommended',
    'eslint:recommended',
    '@vue/typescript'
  ],
  parser:  'vue-eslint-parser',
  parserOptions: {
    parser: '@typescript-eslint/parser',
    ecmaFeatures: {
      "legacyDecotators": true
    }
  },
  ...
}
```

## Jest

### 関連モジュールのインストール
```bash
$ npm i -D ts-jest
```

### jest.config.jsの設定
```jest.config.js
module.exports = {
  moduleFileExtensions: ["js", "jsx", "json", "vue", "ts"],
  transform: {
    "^.+\\.vue$": "vue-jest",
    "^.+\\.(ts|tsx)$": "ts-jest"
  },
  transformIgnorePatterns: ["node_modules/"],
  moduleNameMapper: {
    "^@/(.*)$": "<rootDir>/src/js/$1"
  },
  snapshotSerializers: ["jest-serializer-vue"],
  testMatch: ["**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)"],
  testURL: "http://localhost/",
  setupFiles: [
    "<rootDir>/tests/unit/jest-env.js"
  ],
  globals: {
    "ts-jest": {
      "tsConfigFile": "tsconfig.json"
    }
  },
  watchPlugins: [
    "jest-watch-typeahead/filename",
    "jest-watch-typeahead/testname"
  ],
  "collectCoverage": true,
  "collectCoverageFrom": ["src/js/**/*.{js,vue}"]
};

```

## 型定義ファイル
使ってるライブラリの型定義ファイル(`@types/〇〇`)をインストールしておく。

## TypeScriptの設定ファイル
`tsconfig.json`を作成する。


```tsconfig.json
{
  "compilerOptions": {
    "target": "es5",
    "module": "es2015",
    "strict": false,
    "importHelpers": true,
    "moduleResolution": "node",
    "experimentalDecorators": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "sourceMap": true,
    "baseUrl": ".",
    "paths": {
      "@/*": [
        "src/*"
      ]
    },
    "lib": [
      "es2019",
      "esnext",
      "dom"
    ],
    "resolveJsonModule": true
  }
}

```
Google フォームからカレンダー登録する

やり方忘れそうなので備忘録
とりあえずカレンダー登録出来るお手軽なやつ

# 1. Google フォームとカレンダーイベント作成
https://docs.google.com/forms
https://calendar.google.com/calendar

とりあえず中身はどうでもよいので作成

# 2. コード作成
#### スクリプトエディタを開く

![スクリーンショット 2019-08-30 14.47.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59905/af525b31-68ee-c75c-1fb4-5ba2875829ce.png)

#### ソースコードコピペ

```
var CAL_ID = 'test@example.com';  //更新
var CAL_EVENT_TITLE = 'GCP勉強会'; //更新
var CAL_EVENT_DATE = '2020/02/19'; //更新

function myFunction(e) {
  // Form申し込みした人のアドレスを取得
  var address = e.response.getRespondentEmail();    

  //カレンダーにユーザー追加
  var cal = CalendarApp.getCalendarById(CAL_ID);
  var events = cal.getEventsForDay(new Date(CAL_EVENT_DATE), {
      search: CAL_EVENT_TITLE,
  });
  var event = events[0];
  event.addGuest(address);
}
```

#### カレンダー、イベント情報の更新
- CAL_ID
- CAL_EVENT_TITLE
- CAL_EVENT_DATE

を更新する

# トリガー作成
プロジェクトの詳細 > トリガー からトリガーを追加する

#### プロジェクト一覧から対象のプロジェクトの詳細を見る
![スクリーンショット 2019-08-30 14.50.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59905/89e61bad-f4bd-a24a-468e-f9dbf44312d6.png)

#### 更に設定を開くとトリガーがあるのでこちらをひらく
![スクリーンショット 2019-08-30 14.51.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59905/37e04596-8748-7132-5544-2af98c1e4e1d.png)

#### トリガーを追加する
イベントはフォーム送信時にする
初回はcallenderとsheetに対しての認証を行う必要があるので指示にしたがってAPIをたたけるようにする
AIで感情分析できるのかな？と思って調べた感情分析のAPIサービス、2019年8月に調べたらポジティブかネガティブかという軸しかなくて、文章中にポジ・ネガのキーワードがあるかどうか？という判定方法ぐらいなのかな？まとめ

#結局AIはどこまで感情を判定できるのか？
AIが判定する感情とはがどの程度のものか2019年8月に調べたところ、狭義のAI、ニューラルネットワークを使って何かをするような具体的な事例にはたどりつけず、APIサービスがいくつかある事が分かったので、出来ること、出来ない事の境界を明らかにしみた。

感情分析の軸はポジティブ、ネガティブだったり、「喜び」「好き」「悲しみ」「恐れ」「怒り」だったり。「萌える」も分からないし「尊い」も分からないだろうし、ましてや「無理」の理解は無理だろう。文章の流れや構造によって皮肉的に伝えたりすることも、判定できているとは思えない。

2019年現在では単語レベルで感情を分けて、その数、強度などで感情を判定するものだと感じられる。「好き」「嫌い」といったエッジの効いた感情ならば文章にも表現されやすいが、「もやもやする」「じんわりくる」感情は文章に現れづらく、認識には程遠い。この辺が出来る事と出来ない事の境界だった。

#リンクと感想
[AIが感情を認識する仕組みとは【活用事例もあわせて紹介】](https://nissenad-digitalhub.com/articles/ai-for-emotion-recognition/)
表情、発生音、口調のようなノンバーバル情報をAIの画像認識や音声認識で理解し始めている、というような記事で、恐らくプログラマではない人が、感情分析について説明したものだと思う。一般にAIで感情を認識するというとこちらの認識の方が合っていて、「AI怖い」という感想になるかもしれないが、この辺は2000年代以前の、VRやARについての最新トレンドを追っている時と同じく、かなり先にならないと実現できないものを過剰に評価している感がある。画像認識技術を使って感情分析するには2019年夏ではまだ早い。あくまで文字データから認識したい。


[Excelで誰でも簡単言語処理 (感情推定, 固有表現抽出, キーワード抽出, 文類似度推定 etc...)](https://qiita.com/umaniel_/items/769753e9e5f53be77d4f)
Qiitaで探し始めて最初に私がたどりついた投稿。エクセルを使って、COTOHA APIにアクセスして文章から感情を推定させる。サンプルのエクセルもきちんと動いて理解した。

[COTOHA APIを使って人の気持ちを考える](https://qiita.com/umaniel_/items/769753e9e5f53be77d4f)
平成30年度のセンター試験（追試験）国語の問題文を、感情分析を使って見事に解いています。結論ではポジティブ、ネガティブ値から判断したように書いているが、感情分析にはポジティブ、ネガティブワードで決まる値だけが大事なのではなく、文脈の前後の感情、文脈の中の時間の流れ、特に行間を読むとはどういうことか？ということを深く考えさせられた。

[WEB上の任意の記事から、読者の感情を推定する試み](https://qiita.com/yukihon_lab/items/dc936859571138eb5ab6)
国語の問題文を感情分析させるのは、まだ2019年では早い。ならばもっと上手なやり方はレビューを使って元の文章を推定させるという。計測が難しいものを直接測定するのではなく、間接的に測定すればよいという示唆は素晴らしい。

[テキストの感情分析をするためのクラウドサービス比較](https://qiita.com/kazu20/items/42fbfe6dfa81b716b4bc)
感情分析、と言われているサービス Google, Microsoft, Amazon, IBM,　をまとめたもの。結局日本語対応しているのはGoogleだけなのかー、という概要と、料金についてもまとめられていてとても参考になりました。

[テキストから感情分析するAIツール、ユーザーローカルが無償公開　いろいろ試してみた (1/2)](https://www.itmedia.co.jp/news/articles/1812/17/news074.html)
感情分析、Googleだけではなく、他もあったはずだと思ってたどり着いた記事。ユーザーローカル感情認識AI、たしかにチラッとためしてみていました。「喜び」「好き」「悲しみ」「恐れ」「怒り」の5項目のチャートで数値化するというのは、ポジティブ、ネガティブより進化しているんですが、文字の並び方や文末の細かなニュアンス表現から感情を読み取れる点については、将来が期待できた。(positive?)

[日本語Sentiment Analysisに関する手法比較](https://qiita.com/berry-clione/items/0313f4fe136135203739)
極性辞書を使ってポジティブ、ネガティブを判定していたんですね。東北大学　乾・鈴木研究室が手掛けている研究なんですね。なんか、自然言語処理で、MeCabとかと似たようなにおいがします。
LaravelでマスターデーターのCache化について

マスターデーターをDBで管理する際にSQLのJoinで一緒に取得する場合も多くありますが、実装上で可読性や色んな理由で別のSQLで参照場合もあると思います。

## やりたいこと
実装したらあまり気にしなくてもシステム上でCache化と更新が行うようにしたい。

## 実装
モデルのsavedイベント利用してCacheを削除することでデーターが更新された場合は
Cacheが取得されるタイミングで更新されることを実装してみました。

```/app/Models/MasterModel.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;

class MasterModel extends Model
{
    /**
     * Table
     *
     * @var string
     */
    protected $table = 'mst_sample';

    /**
     * The attributes that should be mutated to dates.
     *
     * @var array
     */
    protected $dates = ['created_at'];

    /** updated_atは使用しない */
    public $timestamps = false;

    /**
     * The "booting" method of the model.
     *
     * @return void
     */
    public static function boot()
    {
        parent::boot();

        self::saved(function($master) {
            Cache::forget('master.id.'.$master->id);
        });
    }

    /**
     * IDでマスター情報を取得
     *
     * @param string $id
     * @return mixed
     */
    public static function findWithCache($id = null) {
        $ret = Cache::rememberForever("master.id.{$id}", function() use($id) {
            if (is_null($id)) {
                return null;
            }
            return static::find($id);
        });

        return $ret;
    }
}

```
もちろん、親のfind等をOverrideして使っても良いかと思います。
react-navigationでreact-native-gesture-handler関連のエラーが出る


どうやらexpo 34あたりからreact-native-gesture-handlerがインストールされなくなった？らしい（公式サイトにはそうは書いてないけど）。

なので、react-navigationを利用するためには、

```bash
npm install --save react-navigation
```

の後に、

```bash
npm install --save react-native-gesture-handler react-native-reanimated
```

とする必要があるようです。

>expoだと、expo install react-native-gesture-handler react-native-reanimatedとするのがいいと[ここ](https://reactnavigation.org/docs/en/getting-started.html)に書いてます。

ただ、インストールすると、expo start時に下記のようなエラーというかWarningがでる。

![スクリーンショット 2019-08-31 9.08.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/20f2b431-7308-2477-7fe5-b0136a22dd37.png)



どうやら、バージョンが合わないらしく、ダウングレードする必要があるらしい。
Warningや[ここ](https://github.com/react-navigation/react-navigation/issues/6217)のページに、

package.jsonの中の、記述を下記のように変更する必要がある。

```
"react-native-gesture-handler": "~1.3.0"
"react-native-reanimated": "~1.1.0",
```

その上で、

1. node_modulesとpackage-lock.josnを一度削除して
2. npm installを再実行
3. そしてexpoを利用している場合、expo r -cとしてキャッシュをクリアしないと反映されない

以上。ほんとバージョン管理が大変。
Elmでライブラリを作るときのテストに追加したいコマンド

```bash
elm make --docs=/tmp/docs.json
```

これを npm scripts の "test" に追加しておくと便利 ([package.jsonの例](https://github.com/arowM/elm-form-decoder/blob/master/package.json#L6))

これを実行すると、パッケージサイトに公開するときの要件を満たしているかチェックしてくれます。
たとえば、expose している関数に `{-| Some comment -}` 形式のコメントが付いていないときに教えてくれます。

通常の `elm make` ではこういうのは検知してくれませんが、`--docs` オプションにJSONファイルをわたすと、
パッケージサイト用にドキュメントを生成しようとしてチェックしてくれます。

[さくらちゃんにご飯をあげる](https://www.amazon.co.jp/gp/registry/wishlist/20ZV2VC57615B/ref=nav_wishlist_lists_1)
[さくらちゃんをもっと見る](https://twitter.com/hashtag/%E3%81%95%E3%81%8F%E3%82%89%E3%81%A1%E3%82%83%E3%82%93%E6%97%A5%E8%A8%98?src=hash)
[他の記事を見る](https://qiita.com/arowM)
![EC46eTKUUAAvxf1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16345/fef424f4-fd07-2d98-a02b-b108090ce21d.jpeg)
#git で変更単位を意識した「良いコミット」とは？ 一言で言うならば、着脱自由なものである。つまりよく出来たタイムマシーンだ。

What is "good commit" that is aware of the change unit in #git? In a nutshell, it's detachable. In other words, it is a well-made time machine.



![image](https://user-images.githubusercontent.com/13635059/63991179-a3901980-cb21-11e9-9531-79893afb0659.png)

- 自分や他の人が、思うような変更差分に戻りやすく、一つの状態で動作を再現しやすい
- rebase などをしてコミット同士の順序を入れ替えても、コンフリクトあるいは手に負えないコンフリクトが起きにくい
- どのコミットの状態をとっても、動作不可能なものや、テストに落ちるものがなく、実装とテストが一体になっている
- rebase などでコミットを削除しやすく、削除してもコンフリクトが起きにくい
- cherry-pick で他のブランチに持って行きやすい
- Github などの Pull Request でコミット単位でのレビューがしやすい
- 二個以上のブランチで同じコミットを共有しやすい、共有しても問題が起こりにくい

色々と書いたが、一言「着脱自由」にまとめられる。

つまりよく出来たタイムマシーンだ！


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2370








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
brew cask uninstall で definition is invalid: invalid 'depends_on macos' value: ">= :leopard" エラーの対策

# 問題

```
$ brew cask uninstall sequel-pro
Error: Cask 'sequel-pro' definition is invalid: invalid 'depends_on macos' value: ">= :leopard"
```

# 環境

```
$ brew -v
Homebrew 2.1.11
Homebrew/homebrew-core (git revision 01d9f7; last commit 2019-08-30)
Homebrew/homebrew-cask (git revision bdb2f; last commit 2019-08-30)
```

# 解決

```
$ /usr/bin/find "$(brew --prefix)/Caskroom/"*'/.metadata' -type f -name '*.rb' -print0 | /usr/bin/xargs -0 /usr/bin/sed -i '' '/depends_on macos:/d'
```

# 参考

- [brew-cask-depends_on-macos.md](https://gist.github.com/muumin/0f335739cc0a06a0decc004141a6b4e8)
Werckerでslackに通知を送る方法

Werckerでビルド完了通知を受け取る方法になります、
公式サイトで進捗確認できますが、一々確認するのも面倒ですし
ないよりはあったほうがマシなので
うぇるかーと呼ぶと聞いたのですがわーかーと呼ばれてたりよく分からないです
結構気になるので誰か教えてください。

##プロジェクトの設定
wercker.ymlにてまずは`steps`の後ろに`after-steps`を追加しましょう。
そこで`slack-notifier`の設定をします。
何やら細かいオプションは色々あるようですが、
最低限url, channel,usernameを設定すればまずは大丈夫でしょう。

```wercker.yml
deploy-dev:
    steps:
         #色々省略してます
        - script:
            name: deployer
            cwd: deploy/
            code: dep deploy -vvv dev
    after-steps:
        - slack-notifier:
            url: $SLACK_URL
            channel: "#wercker"
             username: werckerbot
```

urlには任意のキーを、丸写しで構いません。
Channelには通知を入れたいslackのチャンネルを、#は必須のようです
Usernameには送り主の名前を、こちらも任意のもので構いません。
環境変数の設定をどこでやるの？とか色々と悩みましたが、
プロジェクト上の設定はこれだけで後はslackとwerckerのブラウザ上からの設定になります。

##Slackの設定
先にslackの設定をしましょう！
設定したいワークスペースに移動して、好きなチャンネル(なんでもいいです)から右上の歯車を選択、
そのあとに`アプリを追加する`を選択してください。

￼![スクリーンショット 2019-08-30 13.38.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489160/ece30f23-ce17-2d30-52c5-ae945b9d3301.png)

アプリ検索から`incoming-webhook`を検索して追加しましょう！

￼![スクリーンショット 2019-08-30 13.39.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489160/52f469f2-cd75-0c16-87c1-00a8f5cf9c43.png)


私の環境だからなのかなんかワカメみたいなのありますが、下の方の三角形のコメントしづらい方を追加しました。
`outcoming`もありますが、今回は通知を受け取る方なので`incoming`です。
アイコン同じ？だったのでお気をつけて。

![スクリーンショット 2019-08-30 13.41.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489160/e31d04f7-d8ac-cddf-b7d6-b1187be53444.png)

アプリを表示するから設定ボタンあるのでそれを押すとブラウザが開きます。
￼
![スクリーンショット 2019-08-30 13.44.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489160/2df2a9b1-1155-7d64-ce5f-7725c598a5d1.png)
￼
開かれたブラウザ上で大事な部分はここです！
通知を送りたいチャンネルを設定してください、当然先ほど`wercker.yml`で設定したものと同じチャンネルです。
そしたらURLをコピーして一番下までスクロールして設定を保存しましょう。

##werckerの設定
最後にwercker上の設定になります。
ブラウザからwerckerにログインしてください。
(色々な情報丸見えになるので、スクショ少なめで)

Pipelines上からプロジェクトを選択して`Enviroment`を選択したら
環境変数の設定項目になります。
￼
![スクリーンショット 2019-08-30 13.59.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489160/40064e7c-9c57-5512-6d63-c76e725f40a3.png)

後は追加でkeyには`wrecker.yml`で設定した環境変数の名前と同じものを
ValueにはslackのページからコピーしてきたURLを貼り付けて設定完了です。

##テスト
試しにテキトーにwercker動かしましょう。
指定のチャンネルにこんな奴が届いたらオッケーです！
![スクリーンショット 2019-08-30 14.02.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489160/b9c11d45-7a87-da67-2fad-a11ae1e924e6.png)
git pullでのエラーと対処法

# エラー内容
`git pull`をしたら、以下のエラーが表示された。

```Git
$ error: The following untracked working tree files would be overwritten by merge:
```

# ローカルの修正を捨ててしまっていいときの対処法

```Git
$ git fetch --all
$ git reset --hard origin/master
```
MySQL8.0.x に Sequel Pro で接続する

## 問題

Sequel Pro 1.1.2 バージョンでは MySQL8.0 に接続できません。

- Homebrewからインストール
  - `brew cask install sequel-pro`
- 公式サイトからインストール
  - https://sequelpro.com/download

通常のインストール方法だと正式版のSequel Pro 1.1.2がインストールされます。

メニュー > Sequel Pro > SequelPro について からバージョン確認

<img width="502" alt="スクリーンショット 2019-08-30 14.23.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52879/7d756d78-e483-f823-e738-88ff8fca02ca.png">

## 解決法

- Homebrewからインストール
  - `brew cask uninstall sequel-pro`
  - `brew cask install homebrew/cask-versions/sequel-pro-nightly`
- 公式サイトからテストビルド版をインストール
  - https://sequelpro.com/test-builds
  - 1.1.2と共存させたい場合はこちらがいいかも。

メニュー > Sequel Pro > Abount SequelPro からバージョン確認

<img width="502" alt="スクリーンショット 2019-08-30 14.27.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52879/3649ae5a-bc18-0935-01b3-827123653da8.png">

## Sequel Pro 1.2 から MySQL 8.0 サポートされる！

2017/2/22 に [Need MySQL 8.0 support #2699](https://github.com/sequelpro/sequelpro/issues/2699) こちらのイシューが立ってすでに2年が経過しました...。

執筆時点(2019/8/30) での [Sequel Pro 1.2](https://github.com/sequelpro/sequelpro/projects/2#column-624720) のプロジェクトを見ると 検討中: 3件、 必須: 9件、進行中: 1件 のイシューが残ってます。

まだしばらくかかりそうですね...。
Promiseシンプル構文

非同期処理で使われるPromise関数には`new Promise`と`Promise.resolve`で行う方法があります。
良く紹介されている方法は`new Promise`で行う方法が多いですが、シンプルに書きたいときは`Promise.resolve`で行うとよいです。

###よくある構文
```javascript:
var result = new Promise(function(resolve) {
    resolve('Hello1')
})

result
.then(function(data){
    console.log(data)
    return new Promise(function(resolve){
        resolve('Hello2')
    })
})
.then(function(data){
    console.log(data)
    return new Promise(function(resolve){
        resolve('Hello3')
    })
}).then(function(data){
    console.log(data)
})
```
###シンプルな構文
```javascript:
Promise.resolve('Hello1')
.then(function(data){
    console.log(data)
    return Promise.resolve('Hello2')
})
.then(function(data){
    console.log(data)
    return Promise.resolve('Hello3')
})
.then(function(data){
    console.log(data)
})
```
これからのスタンダード!? VLOOKUPでも、INDEX+MATCHでもなく、XLOOKUP（EXCEL）

## はじめに
EXCELを使っていると、VLOOKUP関数をよく使用します。(どこかでみましたが、SUM、AVERAGEに次いで第3位だとか)

VLOOKUPの不満点を解消した`XLOOKUP関数`というのがアナウンスされたようです（2019/08/29）

**Announcing XLOOKUP**
https://techcommunity.microsoft.com/t5/Excel-Blog/Announcing-XLOOKUP/ba-p/811376

普通に使いたい、と思わせるものなので、これからのスタンダードになるかもしれません。


## VLOOKUPのいまいちな点

VLOOKUPは大変お世話になっていますが、個人的に感じる、いまいちな点は４つあります。

~~~
=VLOOKUP(検索する値, 検索範囲, 検索範囲における列番号, 0)
~~~
※0は、完全一致（0もしくはFALSEと指定する）

###### ① 検索範囲の左端列(1番目)を基準としないといけない
###### ②引数の3番目が、「検索範囲における列番号」を数えるのが大変
- 1つ2つならよいですが、テーブルなどをダウンロードしたあと、表示する値(返り値)が遠く離れていると、3番目の引数に指定するために列数えないといけないです。

###### ③引数の4番目の引数の初期値が「TRUE」となっている（近似値の検索）
- ほとんどの場合は、完全一致の検索なので、0とかFALSEを指定する必要がある

###### ④大量のデータに、VLOOKUPをいれるとEXCELがとても重くなる。


## 対応策：INDEX+MATCH or 高速VLOOKUP

①・②の不満を解消するためにでてくるのが、INDEX+MATCHです。

~~~
=INDEX(表示する列範囲, MATCH(検索する値, 検索先の列範囲, 0))
~~~
ただ、VLOOKUPよりは関数の式がシンプルでなくなってしまいます。


④については、INDEX、MATCH、VLOOKUPを使用して、注意点はあるものの対応することがありました。
下記のページで、**「高速VLOOKUP」**として紹介されています。
https://excel-ubara.com/excel3/EXCEL019.html
（検索先のシートやデータはソートされている必要があります）

例

~~~
=IF(INDEX(Sheet1!$A$2:$A$200001,MATCH($A2,Sheet1!$A$2:$A$200001,1),1)=$A2,VLOOKUP($A2,Sheet1!$A$2:$B$200001,2,TRUE),NA()) 
~~~

## これからは、XLOOKUP

VLOOKUPに比べて、とてもシンプルになりました。

**XLOOKUP 関数**
https://support.office.com/ja-jp/article/xlookup-%e9%96%a2%e6%95%b0-b7fd680e-6d10-43e6-84f9-88eae8bf5929?ui=ja-JP&rs=ja-JP&ad=JP

~~~
=XLOOKUP(検索する値, 検索先の列範囲, 表示する列範囲,[match_mode],[search_mode])
~~~
※後ろ2つはオプション


下記、解説があります（動画もあります）
The VLOOKUP Slayer: XLOOKUP Debuts Excel
https://www.mrexcel.com/excel-tips/the-vlookup-slayer-xlookup-debuts-excel/

また、なぜリリースになったかという理由をみると、「検索範囲の左端列(1番目)を基準としないといけない」「近似値のデフォルトがTRUE」といった問題に対応してくれるものとなっていることがわかります。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167772/b66e11a3-9f29-9ff7-2100-d38ec2ec2b34.png)


長年の癖でVLOOKUPが勝つのか、それとも、XLOOKUPが市民権を得るのか、、楽しみです。
python xlwings 列挿入

余計なインポートたくさんありますがxlwingsがあればいけると思います。

概要：同階層にあるエクセル開いてC列にインサートして右にずらす

```insert.py
import sys
import os
import glob
import re
import os.path
import string
import shutil
import struct
import xlwings as xw
from xlwings import constants
from xlwings import Book
from xlwings import Sheet
from xlwings import Range

def main():
    
    path=os.path.dirname(os.path.abspath(__file__))
    wb = xw.Book(path + "\\test.xlsx")
　　#C列指定のインサートじゃい！
    wb.sheets(1).range('c:c').api.Insert()
    #オプション付き
　　#wb.sheets(1).range('c:c').api.Insert(constants.Direction.xlToRight)

    print("Finish!!!!")

#################################################
if __name__ == '__main__':
	main()
```

一番重要な所はここでVBAとopenpyxlにはRangeクラスにInsertがあるのですがxlwingsには無いです。
wb.sheets(1).range('c:c').api.Insert()
なので「api」を使用してVBAの関数達を呼ばないといけません。罠かよ。
apiでリファレンスにはネイティブオブジェクトを返す。とだけしかないてないのでネイティブオブジェクトなんだよってスルーしてたのですが超重要だった。

apiはインテリセンスが自分の場合は出てこなくてVBAの関数リスト見ながら叩きました。
あとはインサート時に右にずらすとかそういうオプションはconstants.Direction.xlToRightだと思う。

おすすめのデバッグ方法はエクセル開きっぱなして実行していった方が良いです。
最終的にはsave closeよばないとですが開発中で見ながらできるので分かりやすい。
実行に失敗するとエクセルのプロセスが貯まってタスクマネージャー開いてわざわざ消さないとなので
面倒くさい。