OmniAICreator/Qiita-1.07M huggingface dataset:
【Swift5】メモ：既存のプロジェクトにCoreDataを追加する

## はじめに

アプリ作成時に「Use Core Data」にチェックをつければ自動でこれらが追加されますが、後から使いたくなった時は少し面倒だったので、コピペで使えるようにまとめておきます。

## AppDelegate.swift


```Swift
import CoreData
```

iCloudにデータを保管できるようにする場合は` NSPersistentCloudKitContainer`、そうでない場合は`NSPersistentContainer`を使います。

```Swift
// MARK: - Core Data stack

lazy var persistentContainer: NSPersistentCloudKitContainer = {
    /*
    The persistent container for the application. This implementation
    creates and returns a container, having loaded the store for the
    application to it. This property is optional since there are legitimate
    error conditions that could cause the creation of the store to fail.
    */
    let container = NSPersistentCloudKitContainer(name: "coredataSample")
    container.loadPersistentStores(completionHandler: { (storeDescription, error) in
        if let error = error as NSError? {
            // Replace this implementation with code to handle the error appropriately.
            // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
              
            /*
            Typical reasons for an error here include:
            * The parent directory does not exist, cannot be created, or disallows writing.
            * The persistent store is not accessible, due to permissions or data protection when the device is locked.
            * The device is out of space.
            * The store could not be migrated to the current model version.
            Check the error message to determine what the actual problem was.
            */
            fatalError("Unresolved error \(error), \(error.userInfo)")
        }
    })
    return container
}()

// MARK: - Core Data Saving support

func saveContext () {
    let context = persistentContainer.viewContext
        if context.hasChanges {
            do {
                try context.save()
            } catch {
                // Replace this implementation with code to handle the error appropriately.
                // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
                let nserror = error as NSError
                fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
            }
      }
}

```
【Java】Mapのキーと値のペアを拡張for文を使って取得する

#はじめに
Map のキーと値のペアを`Map.entrySet`を使って取得する方法です。
Map のキーと値を取得する方法は他にも`keySet`や`values`があります。
これらはキー・値のどちらかを取得するだけですが、`entrySet`を使うとキーと値のペアを取得することが出来ます。

#entry.Set の使い方

###Mapに値を設定

```java
		Map<String,String> animal = new HashMap<>();
		animal.put("monkey", "猿");
		animal.put("dog", "犬");
		animal.put("cat", "猫");
```

###Mapのキーと値のペアを取得

以下の処理ではentrySetメソッドを使用してキーと値のペアを取得し、getKeyメソッドでキーを、getValueメソッドで値を取得しています。

```java
	      for (Map.Entry<String, String> animalNameInJapanese : animal.entrySet()) {

            System.out.println(animalName.getKey() + "は日本語で" + animalName.getValue() + "です。");
        }
```

###出力
```
monkeyは日本語で猿です。
dogは日本語で犬です。
catは日本語で猫です。
```

#参照
[Map Java Platform SE8 #entrySet](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Map.html#entrySet--)
【これを知りたかった】Docker+RailsでRSpec導入〜トップページ表示確認テストの書き方まで

## 背景
* Railsのポートフォリオ作成で、RSpecの導入を検討
* 導入から、トップページの表示を確認するテストの書き方までをまとめました

## 1. Gemのインストール
GemfileにRails用のrspecとfactory_botのgemを加える

```ruby:Gemfile
group :development, :test do
  gem "rspec-rails"
  gem "factory_bot_rails"
end
```

Dockerでbuildし直す

```bash
docker-compose build
```

## 2. rspecの導入
以下のコマンドでRailsアプリに、rspecを導入

```bash
$ bundle exec rails generate rspec:install
      create  .rspec
      create  spec
      create  spec/spec_helper.rb
      create  spec/rails_helper.rb
```

## 3. rspecの生成ファイルの定義
* 設定ファイルはconfig/application.rb
* falseをつけると不要なテストファイルは作成されなくなる

```ruby:config/application.rb
config.generators do |g|
  g.test_framework :rspec, 
        # 不要なテストファイルは以下のようにfalseをつけて書く
        view_specs: false, 
        helper_specs: false, 
        controller_specs: false, 
        routing_specs: false
end
```

## 4. Viewをテストしてみる

### Viewテスト用のrspec作成

```bash
rails g rspec:view Homes
```
ただ、これだけだと``/spec/views/homes/``というフォルダしか作成されない

### テスト用のファイル作成
``/spec/views/homes/``以下に``index.html.erb_spec.rb``を作成し、以下を記述

```ruby:/spec/views/homes/index.html.erb_spec.rb
require 'rails_helper'

RSpec.describe "homes/index", type: :view do
  it 'should display top page' do
    visit "/"
    expect(page).to have_content 'こされ'
  end
end
```
以下補足
* ``visit "/"`` : ルートに遷移
* ``expect(page).to have_content '文字列'`` : 現在の表示ページ上に"文字列"があることを確認

### テスト実行
```bash
$ rspec

homes/index
  should display top page

Finished in 24.64 seconds (files took 7.02 seconds to load)
1 example, 0 failures
```
``0 failures``なので、テストが成功

## RSpecで「NoMethodError: undefined method `visit' for ~ 」と怒られた時
* ``visit``が使えないと言われているエラー
* 以下ファイルに追記する。
* 詳しい理由は以下で記載してあるので、参考にする
    * https://qiita.com/terufumi1122/items/aefd6c965e9e946efc3b

```ruby:spec/spec_helper.rb
...略

require 'capybara/rspec'

RSpec.configure do |config|
  config.include Capybara::DSL # 追記

...略
```

## 参考
* https://qiita.com/Ushinji/items/522ed01c9c14b680222c
* https://qiita.com/terufumi1122/items/aefd6c965e9e946efc3b
React で QRコード表示機能を実装

QRコードを表示する画面を作ったので、そのときのまとめです。
reactでQRコードを生成するライブラリは色々あったので、
hookの書き方に対応しているもので、
古めのコードリーダーでも比較的読み取り易いQRコードを生成してくるものを探しました。

# 検討したライブラリ
react-qrcodes
https://www.npmjs.com/package/react-qrcodes
導入もシンプルで古い機器での読み取りも問題なかったので今回はこれを使ってみることにしました。

react-qrbtf
https://www.npmjs.com/package/react-qrbtf
色を付けたり、コード部分を四角ではなく丸で表現できたり、楽しいのです。
（iPhoneのカメラでは読み取り可能でした）
<img width="200" alt="QRcode_SP — 3.png" src="https://img.esa.io/uploads/production/attachments/2867/2021/01/10/82007/bdc2f9c1-cf3d-4ef9-bb4e-06a577dd13fd.png">

# 実装
まずは、パッケージをインストール

```sh
npm i react-qrcodes
```

QRコードを表示する画面を作っていきます。

```qrcode.js
import React from 'react';
import { useQRCode } from 'react-qrcodes';

function App() {
  const [inputRef] = useQRCode({
    text: 'https://qiita.com/hujuu',
    options: {
      level: 'H', //誤り訂正レベル
      margin: 3, //QRコードの周りの空白マージン
      scale: 1, 
      width: 200,
    },
  });

  return <canvas ref={inputRef} />;
};

export default App;
```

### パラメータについて
**誤り訂正レベル**
誤り訂正レベルは、「どの程度の汚れまでに対応するか」を表しています。
スマホからQRコードを出そうと思ったので、画面のゴミや光の反射など考慮してhighにしてみました。

参考資料：https://www.qrcode.com/about/error_correction.html

**マージン**
QRコードはコードの周りに一定の空白区間がある程度必要です。
空白無く、他のテキストやデザインが描画されていると読み取れない場合があります。

参考資料：https://www.qrcode.com/howto/code.html

## 完成
react-qrcodesで生成したコードはこんな感じになりました。
<img width="200" alt="QRcode_SP.png (289.4 kB)" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8222/4f9a24a7-3959-4354-6923-329541e8b3d9.png">
単一ファイルコンポーネントの原則をrails6のアプリに組み込んでみた。いまいちよくわからん。

# 単一ファイルコンポーネントの原則



コンポーネントごとにvueファイルを作成する開発の進め方のこと。つまりパーツ単位でHTMLをまとめてコンポーネントとして扱いどこでも呼び出せるようにすること、を指すと考えて良さそう。

これの反対をグローバルコンポーネント、といい

```js
new Vue({ el: '#container '})
```

といった形でcontainerをターゲットにしたvueファイルを作り、各ページで読み込む。この書き方は小規模開発では優れているが、大規模な開発になるといくつか不具合が生じる。中でも全てのコンポーネントの変数定義が共通になるのはちょっと避けたい。よって使用するHTMLごとにコンポーネント化する単一ファイルコンポーネントの原則に従って開発するのがベター。



単一コンポーネントでvueファイルを書くとこんな感じ

```js
<template>
  <div class="side_bar">SideBar</div>
</template>

<script>
</script>

<style>
 .side_bar {
  width: 300px;
  background-color: green;
}
</style>
```

templateの部分にHTML、scriptでjs、styleでcssを指定する。これをHTML部品ごとに作る。こうすると部品ごとに一つのファイルで扱えるのでやり直しがしやすい。またこのクラスにあたってるcssどれ？みたいな疑問もなくなる。



作ったコンポーネントをrailsアプリで読み込むわけだが今回は

各コンポーネントを読み込む親のjsがエントリーファイルとなっている。こいつをbuildしてrailsアプリで読み込むと各コンポーネントの設定がアプリに反映される仕組み。

main.js(エントリーファイル)

```js
import Vue from 'vue';
import App from './App.vue';

// App.vueをエントリとしてレンダリング
new Vue({
  el: '#app',
  render: h => h(App)
})
```

App.vue(親コンポーネント)

```js
<template>
  <div class="container">
    <sidebar></sidebar>
    <chat-container></chat-container>
  </div>
</template>

<script>
import Sidebar from './components/Sidebar.vue'
import ChatContainer from './components/ChatContainer.vue'

  export default {
    components:{
      Sidebar,
      ChatContainer
    }
  }
</script>

<style>
.container {
  display: flex;
  margin: auto;
  width: 70%;
  height: 100vh;
}
</style>
```

こいつをwebpackでコンパイルする。webpack.config.jsは以下の通り

```js
module: {
    rules: [
      {
        test: /\.vue$/,
        exclude: /node_modules/,
        loader: 'vue-loader'
      },
      {
        test: /\.css$/,
        exclude: /node_modules/,
        use: ['style-loader', 'css-loader'],
      },
    ]
  },
    (省略)
  resolve: {
    alias: {
      'vue$': 'vue/dist/vue.esm.js' // 'vue/dist/vue.common.js' for webpack 1
    }
  },
  plugins: [new VueLoaderPlugin()]
```

重要なのはloaderとresolveオプションかなと思うので関係ないところ
は省略。ちょっとハマったのはcss-loaderとstyle-loaderを読み込む際にはなぜかloaderオプションじゃなくてuseオプションにしないといけなかったこと。複数loaderを読み込むからなのかな？



コンパイル後にrailsサーバーを立ち上げると画像のように別々のファイルに書いたhtmlとcssがきっちり反映されて一つのビューにまとまっていることがわかる。

![ChatVueApp_と_20200111_md.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652172/68235795-e708-e5b4-a221-8f1545854b74.png)




## 参考

・単一ファイルコンポーネントについての公式ドキュメント

https://jp.vuejs.org/v2/guide/single-file-components.html

・単一ファイルコンポーネントをwebpackを使って実現する方法について

https://qiita.com/tkhr/items/ac22019c891fe8fa5f91
【PyCharm】日本語化の手順（バージョン2020.1.2以降）

PyCharmを無料版から有料版に切り替え、日本語化の手順で少しハマッたのでシェアします。

# 本記事を読んで欲しい人
- PyCharmを日本語化したい
- Pleiadesプラグインだとインストールできなかった

# ハマった事象
【PyCharm 日本語化】で調べると、Google検索結果の上位は【Pleiadesプラグイン】を使う手順が多い（2021/1/11時点）。

手順を試すと、「Pleiades で日本語化可能なアプリケーションを指定してください。」とエラーが表示されました（以下の画像）。
<img width="30%" alt="pleiades_warning" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451461/5b322d90-9b1e-24e9-c94a-8cdb1b6c6afe.png">

<img width="100%" alt="pleiades_warning2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451461/cbe6b86d-b0ad-4cf7-04d8-45e9c1019a91.png">

ただし、PyCharm無料版（Community Edition）だと成功する。
<img width="100%" alt="pleiades_success" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451461/add666f7-fa14-5320-faf4-eae81156d02c.png">

なぜだろう？
私の環境は以下の通り。
- MacOS 11.1 (BigSur)
- PyCharm Professional (2020.3)

# 原因
JetBrains Toolbox経由でインストールした場合、 Pleiadesプラグインでは日本語化できない。頑張ればできるかもしれないが、もっと簡単な方法があったので、今回はそちらを紹介します。

ちなみに、JetBrains Toolboxとは、JetBrains製品管理ツール。PyCharm意外のツールを導入した時にインストールしてみました。バージョンアップ管理が楽になりますね（放置してたけどw）。

Reactなどのフロントエンド系も書く人は【WebStorm】おすすめです！エディタの操作がほぼ同じだから慣れるのも早いです^^

<img width="50%" alt="jetbrains_toolbox" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451461/d75453fb-7f30-44ab-bc40-ff84a083917f.png">


# 日本語化手順
1.PyCharmを開く

2.メニュー > File > Preference を選択
<img width="30%" alt="preference" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451461/ae030267-cc6b-65d7-28b6-c3ac24b5bb7a.png">

3.Pluginsで`Japanese Language Pack`を検索
※検索窓で「japan」と打てばOK!
<img width="100%" alt="plugins_search" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451461/4d907e73-4e64-6822-c0ab-9177f0f8ca7d.png">

4.`Japanese Language Pack`をインストール
※Installedタブから`Japanese Language Pack`が有効になってるか確認してね！チェックが付いてると有効です。
<img width="100%" alt="plugins_japanese_language_pack_install" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451461/9cbf930c-ac1b-1ce0-29f4-8e63554b60a3.png">

5.PyCharmを再起動
PreferencesダイアログをApplyし、OKを選択すると再起動のダイアログが出てきます。【Restart】を選択して再起動しましょう！
<img width="30%" alt="pycharm_restart" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451461/7b1f260f-f2ec-be09-cab0-39827f94a38a.png">

以上！
Pleiadesプラグイン使うより簡単な手順でしたね！

参考記事によると、Pleiadesプラグインを使った日本語化は非推奨のよう。
この手順がGoogle検索で上位になることを祈ります..!

英語慣れしたいけど、日本語の方が直感的で作業スピードが出る気がしますよね!（英語がんばんなきゃw）
それでは、素敵なPythonライフを！

# 参考記事
- [JetBrainsデスクトップ製品の日本語化](https://samuraism.com/jetbrains/localization)
Formオブジェクトを作成するために、ActiveModel::Modelをincludeする理由

# 概要
- ActiveModel::Modelとは
- ApplicationRecordを継承するのだとだめなのか
- 参照

# ActiveModelとは
Action PackやAction Viewと連携する機能を使えるようになる。

Railsガイドによると、モデル名の調査、変換、翻訳、バリデーションといった機能が使えるようになるみたいです。
またActive Recordの場合と同じような方法で、オブジェクトを属性のハッシュで初期化することができるようになります。

コードで記述すると

```ruby:model
class NameList
  include ActiveModel::Model

  attr_accessor :name, :email, :prefecture

  validates :name, :email, :prefecture
end
```
```ruby
 name_list = NameList.new(name: "Tarou", email: "tarou@example.com", prefecture: "青森")

  name_list.name # => "Tarou"
  name_list.email # => "tarou@example.com"
  name_list.prefecture # => "青森"
```

ざっくりな解釈ですが
定義した属性値にバリデーションをかけられて、また属性値をハッシュのキーに持つインスタンスを生成することができるみたい。

ここで一つの疑問が生まれました。
同じような機能をすでに持っているApplicationRecordクラスを継承すればいいのでは？と

# ApplicationRecordを継承するのだとだめなのか
結論、フォームを用意しているViewに遷移すると、エラーが起きます。

```
ActiveRecord::StatementInvalid
Mysql2::Error: Table 'sample_app_development.name_lists' doesn't exis
```
エラー原因は、モデルに紐づくテーブルが存在しないことによるものだと考えられます。

ApplicationRecordの親である、ActiveRecord::Baseにモデルとテーブルを１対１で紐付ける機能がありそうです。

**ActiveModel::Modelをincludeする理由**は、機能実装に必要なメソッドの取得を最小限に留めるためだと考えます。


Formオブジェクトを作成するときはデザインパターン通りにコードを記述するのが良さそう。
疑問が浮かべばあえてエラーを起こして原因を探るのも面白そうです。
何か誤りがありましたらご教示いただけると幸いです。

# 参照
- Railsガイド
JavaScriptで押したボタンの文字を変更する方法

JavaScript初心者のメモとして「JavaScriptで押したボタンの文字を変更する方法」を残します。
様々な場所で使用されているボタンを押したらボタンの文字が変化する方法をメモしておきます。基本的に記載してあるコードをそのままコピーすればパソコンで実装できるように全て省略なしでコードを書いています。

#ボタンを押して文字を変更する方法
ボタンを押して文字を変更するHTMLです。
クリックするボタンを作ります。
ボタンにはid="btnをつけてJavaScriptで取得できるようにしておきます。

```php:hello.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>ToDoリスト</title>
  <link rel="stylesheet" href="css/style.css">
</head>
<body>

//注目部分
  <button id="btn">変化</button>
//
  <script src="js/main.js"></script>
</body>
</html>
```

次にJavaScript全体のコードです。

```php:main.js
'use strict'
 {
  const btn = document.getElementById('btn');
  btn.addEventListener('click', () => {
      btn.textContent = '押されました';
 })
}
```
btnのidを取得して操作ができるようにしておきます。

```php:
  const btn = document.getElementById('btn');
```
addEventListenerでクリックした際にどうしたいかを指定します。
今回はボタンを押したらボタンの文字が変わるように設定します。
textContentを使用し中のテキストを変更します。

```php
btn.addEventListener('click', () => {
      btn.textContent = '押されました';
```

以上がボタンを押した際にボタンの文字を変更する方法です。
これ以外にボタンを押したら、他の箇所の文字を変更したりすることも可能です。
それは改めてメモしたいと思います。

最後までお読みいただきありがとうございました。
データ分析基盤に必要なデータパイプライン


データ分析基盤の理解を深めるために、[ビッグデータを支える技術](https://amzn.to/3q6n5kY)を学習中。
今回は、データパイプラインについてまとめます。

# データパイプライン
**データパイプライン**は、次々と受け渡されていくデータによって構成されるシステム。
![datapipline.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991759/0ec93980-5f99-781c-ec33-bd61e2a76424.png)
データパイプライン全体の動作を管理するために、**ワークフロー管理**が用いられる。毎日決まった時間にバッチ処理をスケジュール実行したり、エラーが発生した場合に管理者に通知したり。

# データ収集

| データ取集方法 | 説明 |
|:--|:--|
|ストリーミング型   |次々と生成されるデータを絶え間なく送り続ける方法。モバイルアプリや組み込み機器などから広くデータを集めるのに使う。   |
|バルク型   |データをまとめて取り出す方法。データベースやファイルサーバーなどから定期的にデータを集めるのに使う。   |

# データ処理

|データ処理方法 |説明 |
|:--|:--|
|ストリーム処理   |リアルタイム処理。リアルタイムデータ。   |
|バッチ処理   |ある程度まとまったデータを効率良く処理。長期データ。   |
|分散データ処理   |分散ストレージに蓄えたデータを処理。MapReduce、クエリエンジン（Hive、Prestoなど）が使われる。ETL（extract-transfer-load）プロセスで加工してデータマートへ。   |

分散ストレージは、多数のコンピュータとディスクから成るストレージの総称。代表的なのは、オブジェクトストレージで、ひとまとまりのデータに名前を付けてファイルとして保存。クラウドサービスのAmazonS3が有名。
Webサイトに使う画像のサイズ変換+容量圧縮を1クリックでやる

はてなブログやWordPressなどでユーザのために読みやすいWebサイトを作るためには、使用する画像の横幅を720pxにする必要があります。また、重くならないためには画像の容量圧縮も必須ですよね。

今回はそんな画像のサイズ変換+容量圧縮を1クリック(正確にはダブルクリックですがw)でやるシェルスクリプトを作成しました。複数の画像でも1回シェルを動かすだけで一気にサイズ変換+容量圧縮が可能です。

容量圧縮は画像の拡張子を「.jpeg」に変えることで行います。多くの画像は拡張子を.jpegに変えるだけでかなり容量が小さくなるのです。

普段からブログなどで画像を投稿する機会がある方には、かなり時間の節約になるはず！これからシェルの内容と使い方を解説をしていくので、ぜひ読んでみてください。
#目次
[1.画像サイズ変換・容量圧縮シェルの内容](#1-画像サイズ変換・容量圧縮シェルの内容)
[2.使うための準備](#2-使うための準備)
#1. 画像サイズ変換・容量圧縮シェルの概要
まず、Webサイトで使いたい画像をデスクトップに作成した「画像リサイズ」というフォルダに入れます。
![画像リサイズフォルダ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993684/a7828386-96c3-6768-ac32-fdad53b32b34.jpeg)
今回は[Unslash](https://unsplash.com/)というフリー画像のサイトから適当に2枚の画像をダウンロードしてきました。シェルを使う前の状態で画像の容量はそれぞれ2.9MB、1.2MBです。

シェル使用前の状態の画像を以下に貼っておきます。

2.9MB画像
![2.9MB画像.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993684/93f0028e-8ec3-a82a-10db-a746f89da8cf.jpeg)
1.2MB画像
![1.2MB画像.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993684/5e3c0362-7180-afbd-000c-32d8f0e60d43.jpeg)
そして画像サイズ変換・容量圧縮シェルをダブルクリックして実行したあとの画像が以下です。

元2.9MB画像
![元2.9MB画像.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993684/e030d4ec-515f-2aaa-36a3-c1925cfbae3c.jpeg)
元1.2MB画像
![元1.2MB画像.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993684/e3e54306-5f15-3e78-2525-f76a5face4d7.jpeg)
どうでしょうか、画質はシェル使用前後でそれほど大差ないですよね。ですが、画像の容量は2.9MB→40KB、1.2MB→47KBと大幅圧縮されています！画像の横幅もちゃんと720pxに調整されていますね。

ちなみにシェルを実行すると、画像リサイズフォルダに入っている画像を更新日が古いものから順に「1,2,3...」とリネームしていきます。
![シェル実行後画像リサイズフォルダ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993684/4c5512f2-3a84-1e34-7ab6-f9f293302ec9.jpeg)
内容が細かい画像の場合は、圧縮によって画質が落ちて見づらくなることがあります。画像リサイズフォルダに入っていた元画像はシェル実行と同時に削除されてしまうので、バックアップをとっておくことをおすすめします。

シェルの内容がわかったところで、ここからこのシェルを使うための準備について解説していきます。一度やってしまえば、あとは画像リサイズフォルダに画像を入れる→シェルをダブルクリック、これだけで画像のリサイズと容量圧縮が一瞬でできるようになりますよ！
#2. 使うための準備
画像サイズ変換・容量圧縮シェルを使える環境について解説していきます。
##①シェルスクリプトが実行可能な環境
私のPCがMacなので、Macでしか動作を確認していません。
##②ImageMagicのインストール
ImageMagicとは、シェルで画像のサイズ変換などを行えるようにするソフトです。ターミナルから以下のコマンドでインストールしてきましょう。

```bash:ターミナル
brew install imagemagick
```
brewコマンドが使えない方は、まず[こちらのサイト](https://qiita.com/zaburo/items/29fe23c1ceb6056109fd)を参考に、Homebrewをインストールしてください。HomebrewとはMacでよく使われているパッケージ管理ソフトです。
##③画像サイズ変換・容量圧縮シェルの作成
好きなテキストエディタを開き、以下のシェルをコピペします。

```bash:resizeConvert.command
#!/bin/bash

files="{画像リサイズフォルダのパス}/*"
savePath="{画像リサイズフォルダのパス}/"
fileNo=1
kakuchoshi=.jpg

#圧縮する画像が置いてあるフォルダへ移動
cd {画像リサイズフォルダのパス}/

#画像ファイル名に半角スペースが含まれるとうまくいかない
#なので半角スペースを_に置き換える
find . -depth -name "* *" -execdir rename 's/ /_/g' "{}" \;

#フォルダの中身を全てリサイズ→jpeg変換
for filepath in $files; do
	mogrify -resize 720x720 $filepath
	convert $filepath $savePath$fileNo$kakuchoshi
	rm $filepath	#圧縮前の画像は削除
	fileNo=$((fileNo+1))
done

#圧縮した画像が入っているフォルダを開く
open {画像リサイズフォルダのパス}

#処理終了
exit 0
```
ファイル名を「resizeConvert.command」として保存してください。拡張子を.commandとすることで、そのファイルをダブルクリックするだけでシェルが実行できるようになります。

デスクトップなど、好きな場所に「画像リサイズ」という名前のフォルダを作成します。その後、作成したフォルダのパスをコピーしてresizeConvert.commandファイルの中の{画像リサイズフォルダのパス}と記載してある部分を全て置換してください。

これで準備完了です。あとはサイズ変換・容量圧縮をしたい画像を画像リサイズフォルダに入れて、resizeConvert.commandファイルをダブルクリックするだけで画像のサイズ変換・容量圧縮ができます。
SQLのALLについて

前回のANY/SOMEと同じ種類の句を発見したので、こちらについてもメモ書き程度に記事を作成しておきます。
ANY/SOMEは「条件に一致するどれか一つにでも一致していれば、そのレコードを抽出する」といったものでしたが、ALLはその真逆で、「すべての条件に一致しているレコードだけを抽出する」という句です。
ひとまず、以下のようなテーブルとSQLを用意します。前回と同じです。

|Div|Name|Price|
|:-----|:-----|:-----|
|01|りんご|200|
|02|ぶどう|100|
|01|なし|150|
|03|みかん|300|
|02|ばなな|250|

```ruby:SQL
SELECT * FROM TABLE1 WHERE Price > ALL (SELECT Price FROM TABLE1 WHERE Div = '01');
```

ALL句の直後に指定されているSELECT句を実行すると、200と150が返されます。
先程も説明しましたが、ALLは比較演算子の条件にすべて一致しているときにだけTrueを返すので、この場合、Priceが200より大きいレコードだけが返されることになります。
よって、上記のSQLを実行すると、以下のような結果が返されます。

|Div|Name|Price|
|:-----|:-----|:-----|
|03|みかん|300|
|02|ばなな|250|

前回のANY/SOMEでは「Priceが150より大きいレコードすべて」が抽出されていたので「Priceが200のりんご」が含まれていましたが、今回はALLですのでりんごは抽出されていません。
これはこれで使い道のありそうな句なので、覚えておくといいかもしれません。
【VR空間サービス Spatial.io】 #4Roomの選択

#サマリ
VR空間サービスSpatialでRoomに入ってみましょう。


##環境
- Windows 10
- Chrome
- Oculus Quest2
- Spatial 1.9

##目次
1. 起動時のRoom選択
1. RoomからRoomの移動

##1.起動時のRoom選択
- 初期画面

初期画面に並んでいるRoomをポイントしてトリガーを押す。
(Roomがたくさんある場合はトリガーを押しっぱなしにして左右にドラッグ可能)

![起動時Room選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933978/f444a9ba-5538-e45a-0180-d486302938a0.png)


##2.RoomからRoomの移動
- メニューを開いて選択

コントローラのAボタンまたはXボタンを押してメニューを開き右から２番目の「Spaces」をポイントしてトリガーを押す。

![Room移動.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933978/bbca3b30-53c8-fa52-c9b8-e22954a7e998.png)

- Roomを選択

行きたいRoomをポイントしてトリガーを押す。
初期画面と同様にトリガー押しっぱなしで左右にスライド可能。

![Room移動時選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933978/a662341d-85e3-7a86-68ce-9a72b82ee6b6.png)


#　
チームハイエナ <img width="120" alt="hyaeninae_tomei.png"  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933978/99b448d3-7ff0-58f3-302b-8528cf339b8d.png">
【Laravel】LaradockでPostgreSQLを起動できないときの対処法

# 事象
psqlでデータベースを作ることを試みるが以下のエラーが発生し、失敗。

```
laradock % docker-compose exec workspace psql -U default -h postgres
psql: could not translate host name "postgres" to address: Name or service not known
```

```
laradock % docker-compose exec workspace psql -U default -h postgres
psql: could not connect to server: Connection refused
	Is the server running on host "postgres" (172.21.0.4) and accepting
	TCP/IP connections on port 5432?
```

# 確認事項と解消法
## 1. 本当にコンテナは起動しているのか？
`docker-compose up -d`コマンドで全てdoneになっていたが本当に起動しているか
`docker-compose ps`コマンドで確認する。

```
laradock % docker-compose ps
         Name                        Command               State            Ports         
------------------------------------------------------------------------------------------
laravel-sns_nginx_1       /docker-entrypoint.sh ngin ...   Up       0.0.0.0:80->80/tcp    
laravel-sns_php-fpm_1     docker-php-entrypoint php-fpm    Up       0.0.0.0:9000->9000/tcp
laravel-sns_postgres_1    docker-entrypoint.sh postgres    Exit 1                         
laravel-sns_workspace_1   docker-php-entrypoint php-fpm    Up       9000/tcp
```
起動できていないことを確認し、`docker-compose up -d`コマンドを再度実行してみる。

```
laradock % docker-compose ps   
         Name                        Command               State                       Ports                     
-----------------------------------------------------------------------------------------------------------------
laravel-sns_mailhog_1     MailHog                          Up      0.0.0.0:1025->1025/tcp, 0.0.0.0:8025->8025/tcp
laravel-sns_nginx_1       /docker-entrypoint.sh ngin ...   Up      0.0.0.0:80->80/tcp                            
laravel-sns_php-fpm_1     docker-php-entrypoint php-fpm    Up      0.0.0.0:9000->9000/tcp                        
laravel-sns_postgres_1    docker-entrypoint.sh postgres    Up      0.0.0.0:5432->5432/tcp                        
laravel-sns_workspace_1   docker-php-entrypoint php-fpm    Up      9000/tcp 
```
全て起動した！

## 2. laradock配下の`.env`ファイルの確認
laradock配下の`.env`ファイルの`DATA_PATH_HOST`を確認。
デフォルトだと以下のようになっている。

```
DATA_PATH_HOST=~/.laradock/data
```
デフォルトのままだとローカルPCの共通のディレクトリを参照してしまうので動きません。
以下のように変更をします。

```
DATA_PATH_HOST=../data
```

## 3. `postgresql.conf`ファイルのポート番号を確認
私はここを確認し、解消しました。
`data`ディレクトリにある`postgresql.conf`ファイルのポート番号を確認。

```
# port = 5432				# (change requires restart)
```

あれ？5433じゃね？しかもコメントアウトされてる...
ということで修正し、`docker-compose up -d`コマンドを再度実行したら
無事データベースを作成できました！:v:

# 参考サイト
https://chobimusic.com/laradock_postgresql/
Xcodeのよく使う便利機能・コマンド

# はじめに
逆効率厨の僕がインターン中にトレーナーに教えてもらった便利機能とコマンドを紹介します！

#### 今開いているファイルをProject Navigatorで表示する
めちゃくちゃでかいプロジェクトファイルを触っている時、どのグループのファイルか行方不明になったこと、ありませんか？そう、僕ですね。
そんな時、**Command + Shift + j**を押せば今開いているファイルをProject Navigatorで表示することができます。

#### 検索
プロジェクト内でファイル検索する
**Command + Shift + o**
Xcodeの検索バーから検索するとコードも表示されるため、ファイルを探したいときはこちらの方が便利です。

ファイル内で検索する
**Command + f**

#### シュミレーターをshake
**Cmd + Ctr + z**
デバッグのときに便利

#### インデントを表示する
Editor < Invisibles
インデントが・・・で表示されて見やすくなります.
![スクリーンショット 2021-01-11 3.13.04 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592713/7cb3601d-7124-e360-820b-8279c26fb12f.png)

#### スペースのみの行を空行にする
Xcode > Preference > Text Editing > While Editingにチェック
ここにチェックを入れるとSwiftLint警察によってslackを荒らす回数が減ります。
ちなみに範囲選択して**Cmd +i**するとインデントも修正してくれます。
![スクリーンショット 2021-01-11 3.18.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592713/e67c6e0e-0e7d-1c09-7474-8da90aacf87f.png)

#### 該当のコードを書いた人を探す
![スクリーンショット 2021-01-11 3.26.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592713/e9866ec9-fb19-6a8c-e87b-a091cde3fb6b.png)
ここから
![スクリーンショット 2021-01-11 3.26.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592713/206bcc0a-ccb1-7925-c09a-a45be427bdaa.png)
誰がいつ書いたコードかを表示することができます。

いい機能を見つけたらもっと追加していきます！
便利だと思ったものがあったらLGTMくれると嬉しいです！！！
ubuntu で　scilab  ,  octave そして R  ,  sympy など


　（冬の入口にはいった時点で）**冬来たりなば 春遠からじ**　（逆境をポジティブに捉える）
##　ubuntuのバージョンは　ubuntu-20.10-desktop-amd64.iso.torrent　を使用

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/9e14b2b6-73c2-b77b-73ca-d4f6447d5e2f.jpeg)

![11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/b698edb4-46b6-e7d7-92be-1d56412382cc.jpeg)
##「姫だるま」はこの美化か、７０歳くらいの秋田の人も子供の頃「エジコ」の中にいたと。　
農作業などで家を長時間離れなければならない時、使われていた。 乳幼児がお漏らしをしても後始末が楽なよう、エジコの底には灰・藁・籾殻・海藻・木炭などを敷き詰めた。さらに、エジコから抜け出さないよう布団や布切れなどで包み固定していた。そのためエジコでの育児は幼児の下半身の発育が妨げられ歩き始めが遅れたり、不潔な状態で長時間放置された。
だが　一家が生きるためには仕方なかったのでせふ。

https://ja.wikipedia.org/wiki/%E3%82%A8%E3%82%B8%E3%82%B3
ーーーーーー

1)

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/42de949f-0866-deaf-0e9b-8be0a986f4c7.png)


##apt install scilab  

##apt install  octave　

## apt install r-base




-----

２）pip
#apt install pip


３）
$ sudo pip install numpy

$ sudo  pip install scipy

$ sudo pip install sympy


４）
https://qiita.com/tyokai/items/d8494fbc8fca00453cd1
もご覧ください



5) arch より　pdf を　ubuntuに転送して　ubuntuで印刷
##ubuntuではサポートしてあるが　archでは　サポートなしの場合です


```


archからubuntuに
$ cat scpPro.bat 
x='139.96.30.150'
ping -c 1 $x
scp $1  ubun2@$x
でおくって

ubuntuで
# cat /etc/cups/printers.conf | grep Printer
# Printer configuration file for CUPS v2.3.3
NextPrinterId 2
<Printer prodesk-810AW>
PrinterId 1
</Printer>
これです

archから　sshでubuntu　に入ってから
./comment-out.bat print-pdf.bat 
lp -dprodesk-810AW $1
で印刷します


```


しかし
https://qastack.jp/unix/83540/installing-a-deb-package-on-arch-is-it-possible
によると
.debファイルは、任意のシステムで圧縮解除できる単なるアーカイブであることに注意してください。インストールプロセスの複雑さによっては、「インストール」するのに十分かもしれません。
なので

|Archのdpkgが存在します。.debarchにパッケージをインストールできるはずですがpacman、の代わりに使用するべきではないので、選択したいくつかのパッケージに対してのみ使用してください。|
|:---
|デフォルトのコマンドは次のようになります。|
|# dpkg -i package.deb |

とかや聞けり

##　（　MX linux の場合　：これdebian系？）でも複雑

```
apt install python3-pip

pip3 install numpy
など

```

```
BUT

# pip3 install --upgrade setuptools
# pip3 install sympy
Successfully installed mpmath-1.1.0 sympy-1.7.1


```

## おすすめは　linux mint

```
統計は
apt install r-base

apt install python3-pip

pip3 install sympy

pip3 install numpy

pip3 install scipy

------

数値計算は
apt install scilab octave


```



##　付録１）　openbsdとの共存
同じ１枚の　nvmeに　ubuntuとopenbsdとを入れてます


![IMG_20210117_110012619.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/0391f611-f282-4de3-32ca-1626f5b7d221.jpeg)

![IMG_20210117_110026619.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/e7ffd75e-c88f-b161-84ef-ab382d2594b8.jpeg)

![IMG_20210117_110034461.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/b63971ce-511d-dfd4-4858-eb48f12030dd.jpeg)

![IMG_20210117_110045962.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/0a5b0faf-590b-55de-f4a8-afc6e152656b.jpeg)

![IMG_20210117_110103662.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/f24fc479-4dba-7984-0178-79e5119f0e2a.jpeg)
nvm × node × shellscript

node環境設定用スクリプト

```install_nvm.sh
# https://qiita.com/ffggss/items/94f1c4c5d311db2ec71a
export NVM_DIR="$HOME/.nvm" && (
  git clone https://github.com/nvm-sh/nvm.git "$NVM_DIR"
  cd "$NVM_DIR"
  git checkout `git describe --abbrev=0 --tags --match "v[0-9]*" $(git rev-list --tags --max-count=1)`
) && \. "$NVM_DIR/nvm.sh"

echo 'export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
nvm use --lts' > ~/.zsh.d/nvm_conf.zsh

source $HOME/.zshrc
# test
nvm -v
```

```update_nvm.sh
(
  cd "$NVM_DIR"
  git fetch --tags origin
  git checkout `git describe --abbrev=0 --tags --match "v[0-9]*" $(git rev-list --tags --max-count=1)`
) && \. "$NVM_DIR/nvm.sh"
```

```install_node.sh
. $NVM_DIR/nvm.sh
nvm install --lts --latest-npm
nvm alias default "lts/*"
```

```update_node.sh
. $NVM_DIR/nvm.sh
nvm install --lts --latest-npm
nvm alias default "lts/*"
nvm install-latest-npm
```

```nvm_conf.zsh
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion

nvm use --lts
```
『OpenCVによる画像処理入門』7章

[『OpenCVによる画像処理入門』](https://www.kspub.co.jp/book/detail/1538290.html)のまとめ続き。

#フィルタ処理
画像処理において、入力画像の「画素値」だけでなく、「その周り（矩形）の画素値」も利用して出力を求める処理を空間フィルタ処理と呼ぶ。

例えば、以下のようなフィルタを作り、入力画像の全画素に対してフィルタを適用する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/198b88c2-b27d-2700-beb2-aba5c3b376dc.png)
表の数値は重み付けの値であり、入力画像の1つ1つの画素に対して、(その画素×-8)+(右隣の画素×1)+(下の画素×1)..のように計算を行い、出力画像を生成する。

周りの画素も考慮して変換するため、画像のノイズ（周りが白いのに1画素だけ黒くなっているような点）をぼかしたり、画像の画素が急激に変わる部分だけを取り出して輪郭を検出するのに使える。
例はすべて白黒画像であり、カラー画像の場合は、チャンネルごとにフィルタ処理を行う。

## フィルタ処理の種類
空間フィルタ処理には、矩形（1画素の周りを含めた9画素）の重み付けに積和演算を用いる「線形フィルタ処理」と積和演算以外を用いる「非線形フィルタ処理」がある。

線形フィルタ処理の公式
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/e3dbdac6-7220-dc48-edf8-6e47e2317bc3.png)
g(i,j)：出力画像、f(i,j)：入力画像、h(m,n)：m列n行目の重み付け係数
元画像：https://www.visco-tech.com/newspaper/column/detail19/

上で書いたように、入力画像の1つ1つの画素に対して、(その画素×フィルタの真ん中の係数)+(右隣の画素×フィルタの右隣の係数)+(下の画素×フィルタの下の係数)..のように計算を行い、出力画像を生成する。

また、フィルタ計算の種類とは別に、目的によってもフィルタ処理は分類される。代表的なものに「平滑化フィルタ処理」と「エッジ検出フィルタ処理」がある。

## 平滑化フィルタ処理
平滑化フィルタ処理は、画像を滑らかにする処理で、画像をぼかしたり、ノイズ除去などに使用される。

<線形フィルタ処理>
__平均化オペレータ__：周辺の画素値の平均を計算し、注目画素の画素値とする。オペレータのサイズによってぼやける。
__加重平均オペレータ__：注目画素に近いほど重みをつける。注目画素の度合いを維持できる。
__バイラテラルオペレータ__：注目画素との近さ+注目画素との画素の差に応じて重み付け。輝度が近い範囲だけ適用されるため、エッジ(輪郭)部分はそのまま残すことができる。

<非線形フィルタ処理>
__中央値フィルタ処理__：注目画素の周辺の画素値をソートし、中央値を画素値をする。ノイズ除去に効果的。

やってみた。

入力画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/f8b46374-f30e-26da-2b67-cab11d790df5.png)

平均化オペレータ（サイズ(3,3) = 矩形のサイズを3×3とする）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/be668cff-9148-6a18-521f-2b407c3a38e1.png)

加重平均オペレータ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/49107940-28eb-090e-16aa-af92afa108d3.png)

バイラテラルオペレータ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/e09f7b89-f565-580d-660f-b1c1b5a7a8ed.png)

中央値フィルタ処理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/a486b421-f391-5c8b-c535-0da40f0a3fb0.png)
ノイズ画像を使ってないのであまりありがたみがわからん。

## エッジ検出フィルタ処理
画像の中で急激に変わった部分を取り出す処理。

__微分オペレータ__：画素値に対して微分演算を行い画素の勾配を求め、大きな勾配を持つ部分を抽出することで画像の境界を際立たせる。
__Sobelオペレータ__：微分オペレータ+平滑化
__2次微分オペレータ__：2次微分を用いて境界をさらに際立たせる。

Sobelオペレータ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/6c275625-d233-8150-0c94-5a8c3ebb39aa.png)

2次微分オペレータ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/f537834c-2f90-7a6b-b4a0-5ea061e1bc07.png)
こっちは色々と役に立ちそうな予感。

##鮮鋭化フィルタ処理
入力画像から2次微分画像を引くと、輪郭が消え、急激に画素値が変化する画像が出来上がる。
画素値の変化を強調することで鮮明な画像を得る処理を鮮鋭化という。

鮮鋭化オペレータ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/d059edd2-a74f-0ea5-2339-b7e9a7d1a399.png)
[2021Jan] AWS の Windows Server 2016 は専用コンフィグかもしれない

# はじめに

AWS で Windows Server 2016 (Datacenter Edition) を使ってみたら .NET Framework アプリでハマりました。起動しません。
結論としては .NET Framework を追いインストールしたら普通に動きました。あ、結論。


# 諸元

AMI
ami-0532b5a8a610e78e0


# Azure の場合

比較のため Azure でも同じことをしてみましたが、特に何も問題なく同じアプリが動きました。
ポリシーの違いでしょうかね。


# おわりに

AWS は何らかフットプリント削減してるんじゃないかと思います。そういうの、どっかに書いてありますかね？　制限事項は誰の目にも触れるところに書かないとダメですよねぇ。

というか、クラウドイメージ類も、開発用と実行用とで分けたらいいんじゃないでしょうかね。
Udemy LINE BOTの作り方。オウム返しボットを作ろう 

## LINEオウム返しBOTとは・フローチャート

### LINEオウム返しBOTとは
LINEBOTに文章を送ると送った文章がそのまま返信されるBOTのこと。
例）Botに「ハロー」と打つと、「ハロー」と返信が返ってくる。

### フローチャート
1.  **LINE Developers**でチャンネル登録
2.  GASとLINEを連携（オウム返しボット）

## LINE Developersへの登録
1.  [LINE Developes](https://developers.line.biz/en/)に自分のLINEアカウントでログインする。
2.  新しくプロバイダーを作成し、チャンネルの種類をMessaging　APIにする。
3.  チャンネルの基本設定を行う。必要事項などを記入する。
4.  Messaging APIをおすと、QRコードが表示されているので、そこから友達追加を行う。
5.  今回はオウム返しボットを作るので、応答設定で応答メッセージをオフにする。Webhookはオンにする。
6.  チャンネルアクセストークンを発行する。

## google apps scriptとLINEを連携（オウム返しボット）

### オウム返しボットのプログラム
オウム返しボットは以下参照。アクセストークンには、LINE　Developersで作成したチャンネルのトークンを張り付ける。

```js
var CHANNEL_ACCESS_TOKEN = 'アクセストークン';

function doPost(e) {
  var replytoken= JSON.parse(e.postData.contents).events[0].replyToken;
  if (typeof replytoken === 'undefined') {
    return;
  }
  var user_message = JSON.parse(e.postData.contents).events[0].message.text;

  var url = 'https://api.line.me/v2/bot/message/reply';
  UrlFetchApp.fetch(url, {
    'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN,
    },
    'method': 'post',
    'payload': JSON.stringify({
      'replyToken': replytoken,
      'messages': [{
        'type': 'text',
        'text': user_message,
      }],
    }),
  });
  return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
```

### Webhook設定
1.  GASの公開のウェブアプリケーションとして導入をクリックし、不特定多数に人が見れるように設定し許可する。
2.  発行されたURLをLINE DevelopersのWebhook設定のURLの部分に張り付け、Webhookの利用を許可する。
3.  これでボットにメッセージを送るとその文章がそのまま返ってくる。

##最後に
洗練さんでインターン(Udemy LINE BOTの作り方。オウム返しボットを作ろう )です。
[Udemy LINE BOTの作り方。オウム返しボットを作ろう](https://www.udemy.com/course/line-bot-t/learn/lecture/17411818#overview)

[GitHubのレポジトリ](https://github.com/Pkagin/memoStudy/blob/main/study/Udemy%20Gas/LINE%20BOT%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9%E3%80%82%E3%82%AA%E3%82%A6%E3%83%A0%E8%BF%94%E3%81%97%E3%83%9C%E3%83%83%E3%83%88%E3%82%92%E4%BD%9C%E3%82%8D%E3%81%86.md)

最後に
現在ここでインターンしています。
まだまだ駆け出しですが頑張ります！やる気は人一倍です！
[洗練](https://senren.work/)
Intersection Observerの使い方！時間差スクロールイベントのサンプル付き

https://myscreate.com/intersection-observer/
![IOcatch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593842/3a75e476-9d76-e2b0-22ee-6676670829a3.png)
適当にMarkDown記法について

gitにREADME.mdをコミットして中身みたら、いろいろおかしいことに。。。
調べたらMarkDown記法なるものがあるらしい。だる。

####MarkDown記法ってなに？
qiitaで初めての記事です。
なんかqiitaの記事書いてる時点でMarkDown記法らしく、調べる必要ないね。以下、触ってみた。

<details><summary>詳　細
</summary>gitにREADME.mdをコミットしたときに、改行がされず困った。
調べたらMarkDown記法なるものが適用されているらしく、全く知らなかったので触ってみた。
</details>

```html:詳細
<details><summary>詳　細
</summary>gitにREADME.mdをコミットしたときに、改行がされず困った。
調べたらMarkDown記法なるものが適用されているらしく、全く知らなかったので触ってみた。
</details>
```
####結論
適当になんかいい感じに見た目をよくできました。
書き方が豊富すぎて、だるかったけど。
主に使うものだけに焦点をあてれば良さげ。

よく詰まったときに参考にしているサイトが、こんな感じだからMarkDown記法ってよく使われてんのかなーと思った。

####参考
MarkDown記法の参考にしたサイト [By JOHN GRUBER Markdown: Basics](https://daringfireball.net/projects/markdown/basics).
【Swift】xibを使ってUITableViewを実装する

# はじめに
UITableViewを使用する際にカスタムセルを.xibを使用して実装する方法について書きます。
xibを使用することでカスタムセルのcalss内の記述をStoryboardベースで実装することができます。

# この記事でやること
UITableViewCellのxibにあるLabelのテキストを変更する
![Simulator Screen Shot - iPhone 12 - 2021-01-11 at 02.00.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592713/15f2e6e2-2ff3-e4f8-33c1-7c50913be9b0.png)

# 実装
#### TableViewの追加
画面いっぱいにTableViewを追加します。
![スクリーンショット 2021-01-11 2.03.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592713/570a2cd8-768c-1a89-e295-8c4d014977da.png)

#### xibファイルを作成
Cocoa Touch Classを選択し、
![スクリーンショット 2021-01-11 2.05.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592713/a5fbc7af-1d92-8bfa-b267-f354c90b7c5c.png)

UITableViewCellを選択、Also Create XIB fileにチェックを入れ、ファイルを作成する
![スクリーンショット 2021-01-11 2.07.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592713/bc74e49b-d55a-8fba-76a6-b3f870860b5e.png)

#### Labelの追加
CellにLabelを追加し、Outlet接続する
![スクリーンショット 2021-01-11 2.16.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592713/9c764aae-93bd-9b4a-ab85-3d9a97c0baae.png)



#### TableViewを作成
TableViewとコードをOutlet接続し、extensionに一般的なTableViewのコード()を書きます
![スクリーンショット 2021-01-11 2.16.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592713/91c42690-ab36-0e4c-c477-b71f9f3078c1.png)

ここで一般的なTableViewと違うのがRegisterを記述する点と

```swift:ViewController.swift
tableView.dataSource = self
tableView.delegate = self
// registerでxibをidentifierとして設定する
tableView.register(UINib(nibName: "TableViewCell", bundle: nil), forCellReuseIdentifier: "TableViewCell")
```

ここで設定したidentifierを使用する点です。

```swift:ViewController.swift
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell", for: indexPath) as! TableViewCell
    cell.titleLabel?.text = "aaa"

    return cell
}
```

# ビルドしてみる
これで冒頭の通りxibを使用してUITableViewCellのテキストを変更することができたかと思います。
もし参考になればLGTMくれると嬉しいです！
Test&Debug Tips：Pythonで,指定したサイズのファイルを作る

## はじめに
テストやデバッグに使えそうな小技です。
テスト用に、大きいランダムな内容のファイルを作りたい事がありませんか？。しかも即席で。

## コマンドライン１行で"即席"で巨大なファイルを作る

### 1024バイトのファイルを作る
```dosbatch:実行例（1024バイトのファイル作成）
C:\>python -c "import sys; import numpy; sys.stdout.buffer.write(numpy.random.bytes(1024));" > 1024.bin
```

### 1MBのファイルを作る
```dosbatch:実行例（1MB/1,048,576バイトのファイル作成）
C:\>python -c "import sys; import numpy; sys.stdout.buffer.write(numpy.random.bytes(1048576));" > 1048576.bin
```

### 1GBのファイルを作る
```dosbatch:実行例（1MB/1,073,741,824バイトのファイル作成）
python -c "import sys; import numpy; sys.stdout.buffer.write(numpy.random.bytes(1073741824));" > 1073741824.bin
```
Corei7-5500U-2.4GHz/SSD-DISKで1GBのファイルを作成するのに1分くらいかかりました。
（ゼロ埋めのファイルでよければ[fsutil](https://qiita.com/ka2taka/items/25f9094392c91908c620)をどうぞ。一瞬で終わります）

### 結果を見る
```dosbatch:実行結果
C:\work>dir
2021/01/11  10:00             1,024 1024.bin
2021/01/11  10:08         1,048,576 1048576.bin
2021/01/12  19:28     1,073,741,824 1073741824.bin
```

## まとめ
コマンドラインのみで即席で実現する方法を掲載してみました。
忙しい時の助けになれば幸いです。


## おまけ
## sys.stdout.write()だとエラーになる
### エラーになる実行例
```python
>>> sys.stdout.write(numpy.random.bytes(1024))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: write() argument must be str, not bytes
```
出力しようとするとエラーになりました。バイトは駄目とのこと。
numpy.random.bytesは「b'\xe5'」のようなstring型で返すから大丈夫だと思ったのですが。。

### sys.stdoutの型は？
```python
C:\>python
>>> import sys;
>>> print(type(sys.stdout));
<class '_io.TextIOWrapper'>
```
sys.stdoutの型は'_io.TextIOWrapper'です。

### class '_io.TextIOWrapper'とは？
──────────────────────────
[class '_io.TextIOWrapper'](https://docs.python.org/ja/3/library/io.html#io.TextIOWrapper)
A buffered text stream providing higher-level access to a BufferedIOBase buffered binary stream.
It inherits TextIOBase.（**TextIOBaseを継承する**）
──────────────────────────
'_io.TextIOWrapper'はテキスト処理用のクラスでした。**しかたないのでバイト型のインタフェースを探します**。
'TextIOBase'を継承するとあります。

### class io.TextIOBaseとは？
──────────────────────────
[class io.TextIOBase](https://docs.python.org/ja/3/library/io.html#io.TextIOBase)
Base class for text streams. This class provides a character and line based interface to stream I/O. It inherits IOBase. There is no public constructor.
──────────────────────────
このクラスにはバイナリIFにアクセスするbufferというメンバがいました。


### io.TextIOBase.buffer(sys.stdout.buffer)とは？
──────────────────────────
[buffer](https://docs.python.org/ja/3/library/io.html#io.TextIOBase.buffer)
TextIOBase が扱う根底のバイナリバッファ (BufferedIOBase インスタンス) です。
──────────────────────────
バイナリ出力にはbufferを使えば良いようです。
jupyter notebookで複数画像を表示 〜画像名を添えて〜

## はじめに
jupyter notebookで画像を複数表示したい、さらにタイトルに各変数名を表示したいとなった。
変数名のタイトルの方はいつ使うねんという話はある(リスト名で与えるとできないので)


（思いつきで書いたものをそのまま貼り付けるので、もっといい方法はあるのかも。)

## やりたかったこと
画像表示関数を作る。
それに引数として与えた変数名のリストから、変数名をタイトルとして表示する。

## 画像表示関数
jupyter notebookで複数の画像を1つずつplt.show()していては、画像を比較したいときに不便だったので、きれいに表示してくれる関数を作った。

``` python
% matplotlib inline
from matplotlib import pyplot as plt
import numpy as np

#画像のリスト、列数、画像サイズ
def show_imgs(lis,col,size=15):
    row = -(-len(lis)//col)
    fig,ax = plt.subplots(row,col,figsize = (size,size))
    if row == 1:
        for i, img in enumerate(lis):
            ax[i].imshow(img)
    else:
        for i, img in enumerate(lis):
            j = i//col
            k = i%col
            ax[j][k].imshow(img)
    plt.show()
```

## タイトルを変数名にする
`show_imgs([img1,img2,img3],3)`などと与えた時に、タイトルをimg1,img2,...という風に付ける。
`titles = ["img1","img2","img3"]`というリストを用意したり、
`dic = {"img1":img1,"img2":img2,"img3":img3}`という辞書を引数としてもいいが、コンパクトになるなら、という動機。
**(注)引数群を文字列として取得するので、リストが変数で与えられているとできない。**(実用性あるの？)

```python
#画像のリスト、列数、画像サイズ、フォントサイズ
def show_imgs(lis,col,size=15,f=20):
    #引数を取得
    frame = inspect.currentframe()
    stack = inspect.getouterframes(frame)
    arg_names = stack[1].code_context[0].split('(')[1].split(')')[0]   #type : str   ex, ["img1","img2","img3"],arg1
    vals = arg_names.split('[')[1].split(']')[0].split(',')
        
    row = -(-len(lis)//col)
    fig,ax = plt.subplots(row,col,figsize = (size,size))
    if row == 1:
        for i, img in enumerate(lis):
            ax[i].set_title(vals[i],fontsize=f)
            ax[i].imshow(img)
    else:
        for i, img in enumerate(lis):
            j = i//col
            k = i%col
            ax[j][k].set_title(vals[i],fontsize=f)
            ax[j][k].imshow(img)
    plt.show()
```

stackは、以下のようなリストになっている。
> [
FrameInfo(frame=<frame object at 0x7fd979d1fb28>, filename='<ipython-input-275-4d7ef729af1f>', lineno=15, function='show_imgs', code_context=['    stack = inspect.getouterframes(frame)\n'], index=0),
FrameInfo(frame=<frame object at 0x7fdba14d3048>, filename='<ipython-input-275-4d7ef729af1f>', lineno=25, function='<module>', code_context=['show_imgs(["img1","img2","img3"],arg1)\n'], index=0),
...

### 出力例
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396851/64ba4bd5-010d-6744-01a5-0e568f0d26f1.png">

##　おわりに
画像処理をしていて、処理を施しても微小な変化しかない時に並べて比較したかったので作りました。
Python3でExcelファイルを作る

# 動機

自分の目的にあったエントリが見当たらなかったのん

# 概要
Python3でExcelファイルを作る。セルに値を設定する。少し装飾する。ファイルの形になるようにする

# 環境

MacOS
Python3系

# 準備
`openpyxl` というライブラリを使います。

```zsh
pip install openpyxl
```

# 解説

下記のソースに関する解説です。

九九の表を作るプログラムです。
ワークシートは、0始まりインデックスです。

一方、セルは1始まりインデックスです。

左上のA1セルは、

```
ws["A1"]
```

と、ワークシートの配列として取得するか。

```
ws.cell(1, 1)
```

セルの上から1番目、左から1番目として指定するか、の2通りがあります。

# 出来上がりイメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90217/b64dbebc-37bf-ad32-05ef-41668915e3b5.png)

# ソース

```Python3:excel.py
import openpyxl
from openpyxl.styles import Font

# workbookの用意
wb = openpyxl.Workbook()

# worksheetの用意
ws = wb.worksheets[0]

ROWS = COLS = 9

c1 = ws["A1"]
c1.value = "{} x {}".format(ROWS, COLS)
c1.font = Font(bold=True, italic=True)

for y in range(1, ROWS + 1):
    for x in range(1, COLS + 1):
        if y == 1:
            col = ws.cell(1, x + 1)
            col.value = x
            col.font = Font(bold=True)
        if x == 1:
            col = ws.cell(y + 1, 1)
            col.value = y
            col.font = Font(bold=True)

        col = ws.cell(y + 1, x + 1)
        col.value = x * y

# save
wb.save("Sample.xlsx")
```
【Ruby on Rails】RailsでのBootstrapの導入方法

#Bootstrapとは
・Teitter社が開発した`CSSのフレームワーク`の事です。
・サイトのデザインを簡単に作成することができます。
・よく使われるスタイルがあらかじめ定義されているので、定義されたルールに従って利用すれば整ったデザインのページを作成できます。

#Bootstrapの導入方法

##1.gemを追加する
Bootstrapを使用する為に、以下`gem`を追加します。
・bootstrap-sass

```ruby:Gemfile
gem 'bootstrap-sass', '3.4.1' 
```
Gemfileに書き込み、`bundle install`を実行します。
コマンド実行後、最後に**「Bundle complete!」**という文字列を含む節が表示されればインストール完了です。

##2.ファイルにbootstrapを読み込ませる
Bootstrapを適用させたいcssファイルを選択します。
その後、以下のようにコードを入力します。

※cssファイルでは、`「//」`でコメントアウトすることができます。

```css:example.css
//bootstrap-import
@import "bootstrap-sprockets";
@import "bootstrap";
```

コードを入力し終えたら、拡張子を**`「css」`**から**`「scss」`**に変更します。

```css:example.scss
//bootstrap-import
@import "bootstrap-sprockets";
@import "bootstrap";
```

以上で、bootstrapの導入は終わりです。
今後、仕事にありつけない（と聞いている）データサイエンティストについて一言

**ももちゃんのパパです。**

前回は、MLやデータサイエンティストのメンター辞めましたとの記事を書かせていただきました。
色々書きましたが、日本における**データサイエンティスト＝統計士と勘違いされている**ことへの警鐘も考えて記します。

#「AIで新しいビジネスをしたいのだけど？」
#「データサイエンスで分析すれば、儲かるビジネスができるんでしょ」
**よく依頼で聞く言葉です（ここまで、よく丸投げできるなぁとも思いますが）。**

**まず、AIという言葉が「恥ずかしい」。**人工知能＝AIと考えているから、勝手にやってくれると思っているみたいですが
全くのデタラメですので、ご注意を（特に、某コンサルに騙されている会社はｗ）

##人工知能がAIというのならば、とっくの昔にCOVID-19を解決しています（笑）
**イギリスだけでなくブラジル（だったかな？）でも新種が見つかって、またまた新種騒ぎです。**
もうAIというのは嫌なので（ターミネータじゃあるまいし）、ML（機械学習）で世界中の方々がCOVID-19についての
発生予測などを分析しています。富嶽くんも動員してますよね？某TVでは、将棋AIで藤井くんの打ち手を予測しては
あーでもないこーでもないと言ってます。それはそれで、使い方は間違っていないです。

**では、「MLで新しいビジネスをしたいのだけど？」と言う依頼に対して、答えはありません。**
よく依頼で言われるのが**「売上高向上」**です。
では、質問です。*売上高は、何によって構成されて、何によって変動するのか、全て把握されている方手を上げて！！（笑）*
依頼した人達に尋ねると「人件費が」とか「品揃えに問題が」とか「営業が努力が足りない！」とか社長言い出した途端
ものすごい険悪な雰囲気が発生して、その場を逃げ出したくなります（笑）

※社長には、「そう思っているなら、何故今になっていうのですか？」と質問したら、色々言い訳はしていましたが、１つとして正解はありませんでした。
**答えは簡単、「見ているのは、お客様が商品なりサービスを買って頂いた後の満足した顔でなく**
**お客様が持っている金しかみてない」だからです。もう、泥棒ですよねｗ**

##データサイエンティストは、データ分析のプロです。でも、結果がでないことも多いです。
データサイエンティストは、ベイズ統計学に基づくシミュレーションなどを駆使して分析されていると思います。
AICがどうのとか、色々あるでしょう。しかし、**世の中の事象は、全て線形回帰モデルで説明できると誰が言いました？**
*（イエス・キリストが過去に仰ったならお詫びします）*
**もう１つ、目的の数値が出たとして、それが合っていることを証明できますか？**
日本のデータサイエンティストの大半が、職を失うと言われている理由は、この２つが理由だと思います。

海外のデータサイエンティストは、**プロです。生データに関してのプロです。**生データが持つ業界知識は、長い間勉強されたり
経験されたりして、半端ない知識をお持ちの方が多いです。結果についての考察も、非常にロジカルかつスマートです。

データサイエンティストは、単なるデータ分析をよく知っている人ではありません。データそのものが何を意味しているのか
深い造詣をお持ちの方々ばかりです。当然、ビジネスのこと＝お金の話も解ります。この差は、結果判定には歴然とした差となって現れます。
**日本の人は「出ました」、日本以外の人は「出ましたが、こういうデータとの相関関係を考慮すると合っていると推定できる」と説明します。
どちらが、説得力ありますか？**

この話、MLにも言えることです。**MLのプログラムできます！！**と言われても、**「そんなプログラムkaggle見れば転がっていますから（笑）」**

**MLについての話は、次回に記載したいと思います。**
**尚、文句は色々あると思いますが、「プログラムできたらデータサイエンティスト」は、間違いですよ（笑）**
omegaconf で、パラメータファイルの値を関数に渡そう

# 目的

- ファイルからパラメータを読み込んで、引数に追加するデコレータを作成したので、使い方をシェアしたい
    - DLなどのモデルのパラメータ読み込みを簡単にしたい、というのがモチベーション
        - main 関数から引数を連携するコードが面倒なので・・・
- `omegaconf` 便利なので、知らない人には知って欲しい
    - 他にも便利なのがあったら、ぜひ教えて欲しい！

# 環境

- Colaboratory
    - [コードサンプル](https://colab.research.google.com/gist/tkosht/165d8ac128fadab9e93634add041bccc/param-decorator.ipynb)


# コードサンプル(サマリ)

- 準備
    - `omegaconf` をインストール

```
%%bash
pip install omegaconf
```

- デコレータの準備

```
import functools
from omegaconf import OmegaConf


def add_args(params_file: str, as_default: bool = False) -> callable:
    @functools.wraps(add_args)
    def _decorator(f: callable) -> callable:
        @functools.wraps(f)
        def _wrapper(*args, **kwargs) -> None:
            cfg_params = OmegaConf.load(params_file)
            if as_default:
                cfg_params.update(kwargs)
                kwargs = cfg_params
            else:
                kwargs.update(cfg_params)
            return f(*args, **kwargs)

        return _wrapper

    return _decorator
```

- 読み込むパラメータファイルを用意する(yaml or json)
    - `omegaconf` が、yaml, json に対応


```
%%bash
cat <<__YML__ > params.yml
n_encoder_layer: 3
n_decoder_layer: 5
n_heads: 4
n_embedding: 16
__YML__
:
echo "===== [ params.yml ] ====="
cat params.yml
echo "====="
```


- 呼び出し


```
@add_args("params.yml")
def use_params(a, b, n_encoder_layer, n_decoder_layer, n_heads, n_embedding):
    assert a == 0.25
    assert b == "world"
    assert n_encoder_layer == 3
    assert n_decoder_layer == 5
    assert n_heads == 4
    assert n_embedding == 16

use_params(a=0.25, b="world")
print("OK")
```

ここで、`use_params()` 関数に指定しているのは、`a`, `b`  だけだという点です。 

また、以下のように、`as_default=True` をデコレータ引数に指定すると、`params.yml` の設定をデフォルトとして読み込み、プログラムで上書きすることもできます。（ちなみに、`as_default=False`(デコレータのデフォルト)の場合は、プログラムで指定した実引数よりも、設定ファイルの直を優先します。）

```
@add_args("params.yml", as_default=True)
def use_params(n_encoder_layer, n_decoder_layer, n_heads, n_embedding):
    assert n_encoder_layer == 128   # notice !!
    assert n_decoder_layer == 5
    assert n_heads == 4
    assert n_embedding == 16

use_params(n_encoder_layer=128)
print("OK")
```

- その他
    - クラスの `__init__` にデコレートできるのでぜひお試しを
    - `omegaconf` では、環境変数や設定ファイル内の直を変数として参照できる
        - `omegaconf` の詳細は、[こちら] (https://omegaconf.readthedocs.io/en/2.0_branch/usage.html) 参照


# 残課題

- 毎回同じコード書くのも微妙なので、pip install できるようにしたいところ