OmniAICreator/Qiita-1.07M huggingface dataset:
Flutterで画面間で値を渡すA(値を渡す)→B(値を取得 / 値を戻す)→A(戻った値を取得)

Navigatorを使って値を次の画面へ渡して、値を返してもらう方法についてメモ

A(値を渡す)→B(値を取得 / 値を戻す)→A(戻った値を取得)

pushとpopで渡すだけで簡単。
B→Aで返してもらう時は非同期処理が必要。今回はasyncだが、futureの方が流行りのはずです。

今回はB画面は画面だがモーダルにする場合はfullscreenDialogをtrueにすればできる。

```
void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: FirstPage(),
    );
  }
}

class FirstPage extends StatelessWidget {
  String resultMessage = "";

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("first page")),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            RaisedButton(
              onPressed: () async {
                var result = await Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) {
                    // second pageに値を渡す
                    return SecondPage('message from first page');
                  }),
                );
                // second pageから戻った値を取得
                print(result);
              },
              child: Text("next page"),
            ),
          ],
        ),
      ),
    );
  }
}

class SecondPage extends StatelessWidget {
  final String message;
  // first pageから値を取得
  SecondPage(this.message);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("second page")),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              this.message,
            ),
            RaisedButton(
              onPressed: () {
                // first pageへ値を返す
                Navigator.pop<String>(context, "message from second page");
              },
              child: Text("go back"),
            ),
          ],
        ),
      ),
    );
  }
}
```
jupyter labを使いやすくしようよ

# jupyter labを使いやすくしていく
自分が現状やっていることを記述していきます．追記あり．

## 追記
### 2021/01/04
フォントを変更しました．

### 2021/04/12
こちらの記事([まだJupyter Notebook使ってるの? VS CodeでJupyter生活 (.py)で快適Pythonライフを?!](https://qiita.com/386jp/items/f023de9457c99b964a85))を参考にしてjupyter lab(.ipynb)を使うのをやめてしまいました．

## インデントのスペース数を4にする
Settings > Text Editor Indentation > ☑️Spaces: 4

## スクロールバーを常に表示
Settings > JupyterLab Them > ☑️Theme Scrollbars

## ダークモードにする
Settings > JupyterLab Them > ☑️JupyterLab Dark

## ~~フォントをRictyにする~~
Settings > Advanced Settings Editor > Notebook

```Priferences
{
    "codeCellConfig": {
        "fontFamily": "Ricty Regular",
        "fontSize": 15
    }
}
```

~~個人的にRegularが好きなのでこれでいきます．~~
<font color='red'>~~MacにRictyが入っているのが前提です．~~</font>
~~ここでフォントの**サイズ**も変更できます．~~

## フォントをJetBrains Monoにする
Settings > Advanced Settings Editor > Notebook

```Priferences
{
    "codeCellConfig": {
        "fontFamily": "JetBrains Mono Regular",
        "fontSize": 14
    }
}
```

個人的にRegularが好きなのでこれでいきます．
<font color='red'>MacにJetBrains Monoが入っているのが前提です．</font>
ここでフォントの**サイズ**も変更できます．

フォントを"Ricty Regular"から"JetBrains Mono Regular"に変更しました．それに伴い，フォントサイズも変更しました．

## 行番号をデフォルト表示にする
Settings > Advanced Settings Editor > Notebook

```Preferences
{
    "codeCellConfig": {
      "lineNumbers": true
    }
}
```

これでできますが，他の設定も入れている場合の追加方法は

```Preferences
{
    "codeCellConfig": {
        "fontFamily": "Ricty Regular",
        "fontSize": 16
    },

    "codeCellConfig": {
      "lineNumbers": true
    }
}
```

こんな感じに**区切って**追加していきます.
または，同じ**codeCellConfig**なので

```Preferences
{
    "codeCellConfig": {
        "fontFamily": "Ricty Regular",
        "fontSize": 16,
        "lineNumbers": true
    }
}
```

これでもいけますね．

# おわりに
最後までご覧いただきありがとうございました．参考になれば幸いです．
式展開について。

#式展開
**式展開は、文字列の中に式を入れることができる機能です。**

**式展開の書き方は文字列中で<font color="Red">#{式}</font>とするだけです。**

**式展開をする場合は、文字列を作るときに<font color="Red">ダブルクォーテーション"</font>
で囲む必要があります。**
**<font color="Red">シングルクォーテーション'</font>で囲んだ場合は式展開が行われません。**

#irbで以下のコードを実行してみましょう

式展開を試してみましょう。

```java:irb
# 式展開で文字列に式を含む
irb(main):001:0> "今日で#{20}歳になりました"
=> "今日で20歳になりました"

# シングルクォーテーションだと式展開されない
irb(main):002:0> '今日で#{20}歳になりました'
=> "今日で\#{20}歳になりました"
```

#まとめ

**式とは、Rubyにおいて「文字列」や「数値」、「変数」、「演算子式」などのこと。
式展開とは、文字列の中に式を入れることができる機能。**

#####以上。
GAS_week2

#GAS_week2

##スプレッドシート〜出力（実際にスプレッドシートにGASで記入）〜

はーい！こんにちは！
今回はGASとスプレッドシートを用いた情報社会に強い人材になるための第2歩！

前提
**[GAS_week1](htthttps://qiita.com/babasatoru21/items/7bdb535727c8fc67b884)が完璧**
これみてない人は先にやっちゃいましょう！

では早速やってきましょう！

###引数って？
これ答えれる人は飛ばしちゃってください！
GASを使うに当たって関数と引数を使いこなせると一歩上へ行けます！

例えば，関数f(x)を定義します．

```math
f(x) = x^2 + x + 1
```
この関数に対して，**f(2)**はなんでしょう？
・
・
・
答えは　**f(2) = 7**　ですね！

これっていうのが，

```math
f(2) = 2^2 + 2 + 1
```
って計算してるわけですよ！

この**x**を関数に対して引数って感覚！（変数のこと）

じゃあどんなのがあるのか？ってことで便利な関数を紹介！

```js

 //数字→列名（アルファベット）
function wmap_column_convert(colmun_number) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var result = sheet.getRange(1, colmun_number);
  result = result.getA1Notation();
  result = result.replace(/\d/,'');
  return result;
}
```
これスプレッドシートにGAS組むときめっちゃ便利！
例えば

```js
function main(){
  var example = wmap_column_convert(3);
  Logger.log(example);
}
function wmap_column_convert(colmun_number) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var result = sheet.getRange(1, colmun_number);
  result = result.getA1Notation();
  result = result.replace(/\d/,'');
  return result;
}
```
で **main**を実行すると，ログには**「C」**って出てきます！
これは，wmap_column_convert(3)とすることで，「wmap_column_convert」関数の中に記述している「column_number」に3が代入されて処理が行われます．
そしてこの関数は「main」のなかで行われているんです！
このように関数を別で定義して引数を指定することで便利な処理をやってくれるんです！

ちょっとここは難しかったかな？？

##では本題に戻りましょう！

今回は前回の続きということで下のコードに書き足していきましょう！

![スクリーンショット 2020-11-02 14.30.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550611/bdef0eca-a1b0-55bc-61d8-4a21c68fee83.png)


```js

function myfunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet(); 
  var sheet = ss.getSheetByName('シート1');
  var range = sheet.getDataRange().getValues();
  
  Logger.log(range[1][1]+range[2][1]+range[3][1]+"です");
    
}
```

**では，「B5」に「です」と入力するコードを書きたいと思います！

```js

function myfunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet(); 
  var sheet = ss.getSheetByName('シート1');
  var range = sheet.getDataRange().getValues();
  
  Logger.log(range[1][1]+range[2][1]+range[3][1]+"です");
  //追記
  var message = "です";
  sheet.getRange(5, 2).setValue(message);
  //ここまで
    
}
```
これで「myfunction」を実行すると，

<details><summary>実行結果</summary>
![スクリーンショット 2020-11-02 14.35.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550611/d0e87506-4e36-1729-5a2e-7f902ec54adc.png)
</details>
<details><summary>ログ</summary>
![スクリーンショット 2020-11-02 14.37.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550611/798927eb-10c1-082a-f953-a5786e479af0.png)
</details>

となります！

さて詳しい解説です！

```js
sheet.getRange(行番号, 列番号).setValue(出力するもの);
```
という一文で，スプレッドシートへの記入が行われます！

＊ここで，「range[行番号][列番号]」の時との注意点が！

**range[行番号][列番号]の時は，配列の概念を使うため開始番号が0でした**

しかし，

**getRange(行番号, 列番号)の場合は，配列ではないため開始番号が1です**

この点だけ注意していれば大丈夫！

さあ今回の応用すると色々と作業が自動化できちゃいます！

次回はこれを使った「for文」について書こうと思います！
HTMLとCSSの記述方法(基礎)

#はじめに
プログラミングで最も基礎的なHTMLとCSSの記述方法を記しておきます。


#⭐️HTMLの記述方法(基礎)

　**<要素 属性 = 属性値>**

```html
<meta charset = “UTF-8”>

<p class = “first-message”>
```

##要素
**「< >...</ >」**で囲まれた箇所のこと。
HTMLにおける要素はHTMLを構成するために必要な成分で、いくつもの要素が積み重なってHTMLは構成されます。

##属性
要素に情報を付け加える役割を持ちます。
どんな**種類**の情報を付け加えるかを表します。

##属性値
**属性(種類)**に対して、**具体的な情報**を表します。
**「 ” 」**を忘れずに！


#⭐️CSSの記述方法(基礎)

**セレクタ {プロパティ : 値 ;}**


覚え方は
　**where {what : how ;}**

```css
p {font-size : 24px ;}

.first-message {color : red ;}
```
##セレクタ
CSSによる装飾を**「どこの部分のHTML」**に適用するかを決めるための記述です。

セレクタは**「CSSを適用する場所」**と覚える！
⭐️**セレクタ = where**

##プロパティ
セレクタで指定したHTMLの**「何を変えるのか」**を選択するための記述です。
背景の色や文字の大きさ、要素同士の余白など様々なプロパティが用意されています。

プロパティは**「何のCSSを適用するか指定」**と覚える！
⭐️**プロパティ= what**


##値
プロパティで**「どのような内容を設定するか」**を決めるための記述です。
背景の色を指定するプロパティであれば、値でどのような色にするのかを決めることができます。

プロパティと値の間は**コロン（ : ）**で区切り、値の後には**セミコロン（ ; ）**を入力します。

値は**「どのようなCSSを適用するか指定」**と覚える！
⭐️**値 = how**
webpack-dev-serverでテンプレートエンジンを使う

webpack-dev-serverはExpressが使われているのでejsを組み込むことができます。
クエリパラメータによってHTMLの一部を変えたいときなんかに使えるかもしれません。

```js:webpack.js
const ejs = require('ejs');

module.exports = {
  devServer: {
    before: (app) => {
      app.set('ejs', ejs.render);

      app.get('/cypress', (req, res) => {
        res.render('./index.ejs', {input: req.query.input});
      });
    }
  }
};
```
Big Data Challenges, Solutions, & Benefits for SMEs/SMBs

Big Data is getting bigger and better each day, and every industry is trying to incorporate it in their processes. To let you understand the meaning and necessity of big data for SMBs/SMEs, here is some research and its explanation.
Let us go first with Big Data Definition 

So, what is big data? Big data is a collection of extensive information via all the sources (online & offline), which is non-processable by the traditional methods. The sources can be anything ranging from a document to social media to data from IoT sensors.

From this definition, you could figure out that the information, which offers detailed insights about the marketing campaigns, financial status, & customers. We will now consider, what Big Data implies in small and medium enterprises/businesses.

How big data matters for SMEs/SMBs?

Big data shouldn’t have to be an unnerving challenge for small and mid-sized enterprises/businesses (SMEs/SMBs). There is no size limit for the businesses to access, store, and explore the big data. A humongous amount of data is continuously pounding via the web, streaming video and audio files, social media, data sensors, and what not? Due to these factors the velocity, volume, and variety of the data structure are rapidly changing. So what does this indicate? This scenario suggests that SMBs/SMEs can find out new opportunities from the insights and hit the jackpot and encash the value.

The big data needs to be harnessed, and it is beyond the capability of traditional databases to store, handle, and process all the data in real-time. Here we need ML (Machine Learning), AI (Artificial Intelligence), and IoT (Internet of Things).

If SMBs/SMEs can manage big data in a better way, then it can help in revealing lots of business patterns, data-focused insights, and correlations. Further, the SMBs/SMEs can get almost real-time analysis which shall be predictive and prescriptive.

visit us at: https://www.esds.co.in/blog/big-data-challenges-solutions-benefits-smes-smbs/#sthash.zu8Vf3rA.dpbs
【Ubuntu】ディレクトリを中身ごと削除する方法

## rmdir -r が使えない
CentOSなどでよく使う `rmdir -r` を使おうとすると

```
$ rmdir -r test/
rmdir: invalid option -- 'r'
Try 'rmdir --help' for more information.
```
オプションが無いと怒られます。

## 実行方法
フォルダの中身を削除→ディレクトリを削除という方法で落ち着きました。
### フォルダの中身（ディレクトリ含む）を削除
```
$ rm -r ./*
```

### ディレクトリを削除
```
$ rmdir test/
```
OpenCVのｃ++でのはじめかた。　

##OpenCVのｃ++でのはじめかた。
大学でOpenCVを使うことになったため、メモ代わりにここに残すことにしました。　

##OpenCVのダウンロード

[Visual Studio 2019 + OpenCVの設定は、この人の記事をみればほぼうまくいきます。](https://qiita.com/koteko/items/60936f34f21d7decf0b5)

##OpenCVについて
プログラムで画像を扱うのは本来非常に難しいです。ですがオープンソースであるOpenCVを使うと非常に簡単に画像を扱えるプログラムが書けると思います。趣味から大学などの研究まで汎用性は様々です。ここではあまり記事のないｃ++でのOpenCVの初期段階について書いていこうと思います。

##先にすること


- ｃ++もしくはｃ言語の勉強を少しでもしておくとスムーズに始められます。
- PythonやJAVAやJavaScriptでもできるらしいが、ここではｃ++を書きます。

##私の環境
-　Windows10pro
-　OpenCV4.3
-　Visual Studio 2019

##次回からOpenCVのコードをのせます。
CodeIgniter4でBase URLを動的に設定する。

#動的にBase URLを設定したいってことありますよね？
1つのサイトの実装で、複数のホスト名（www.foo.comとfoo.comや、www.hoo.comとwww.bar.comなど）を運用したいことってよくありますよね？CodeIgniter3（以下CI3）の頃は`config/config.php`の中の`$config['base_url']`を`$_SERVER['HTTP_HOST']`でも`$_SERVER['SERVER_NAME']`でも自由に書き換えて使うことが可能でした。
中身はただのPHPファイルなので条件分岐をしたり何でもアリです。

CodeIgniter4(以下CI4)でも同じように自由に設定することができるのでしょうか？

##CI4ではCI3と違って直接`$baseURL`に`$_SERVER`変数は書けません。
CI4ではホストの初期設定に用いる`Config/App.php`の`$baseURL`は、CI3と違って`BaseConfig Class`を継承したクラスのメンバ変数として定義されているので、直接$_SERVERを利用したり式の形での記述はできません。
そこで次の2種類のアプローチで式を利用できるようにしたいと思います。

##その１:`Config/Constants.php`で定数定義しておきそれを利用する
`Config/Constants.php`ファイルはCI4のシステムの上でかなり早期に呼ばれるファイルです。
どれぐらい早期かと言うと、CI４のブートストラップファイルで最初に呼ばれるくらいには早く読み込まれるファイルです。
当然`Config\App Class`が呼ばれるより早く読み込まれるので、これを利用して`$baseURL`を定数で定義することが可能になります。
ここはクラス定義ではなく、ただのphpのファイルなので条件分岐でも何でも書けます。

以下の例では独自に`MyBaseURL`という定数を事前に定義して、それを`Config/App.php`で利用してます。

```php:Config/Constants.phpの末尾に追記
$s=isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 's' : '';
defined('MyBaseURL') || define('MyBaseURL',"http{$s}://{$_SERVER['SERVER_NAME']}/");
```
##### 2020-12-21追記：上記の方法ではCLIコマンドでFatal errorが発生してしまうので、次のように$_SERVER['SERVER_NAME']の変数セットを確認して適宜値をするようにすることをおすすめします。

```php:Config/Constants.phpの末尾に追記(修正版1、PHPの関数を利用して実行ホストのIPを求める)
$s=isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 's' : '';
$host = isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : getHostByName(getHostName());
defined('MyBaseURL') || define('MyBaseURL',"http{$s}://{$host}/");
```
```php:Config/Constants.phpの末尾に追記(修正版2、CLIの場合はlocalhost決め打ち)
$s=isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 's' : '';
$host = isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : 'localhost' );
defined('MyBaseURL') || define('MyBaseURL',"http{$s}://{$host}/");
```

そして`Config/App.php`では次のように記述します。

```php:Config/App.php
	public $baseURL = MyBaseURL;
```

##その２：`Config\App Class`のコンストラクタで定義
$baseURLは`Config\App Class`のメンバ変数なので、コンストラクタで再定義することも可能です。

```php:Config/App.php
<?php namespace Config;

use CodeIgniter\Config\BaseConfig;

class App extends BaseConfig
{
     .
     .
     .
ーー SNIP ーー
     .
     .
    public $baseURL = 'localhost:8080';
     .
     .
ーー SNIP ーー
     .
     .
     .
    // コンストラクタを追記
    public function __construct(){
        parent::__construct(); // 親のコンストラクタを呼ぶのを忘れずに！
        $s=isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 's' : '';
        $this->baseURL = "http{$s}://{$_SERVER['SERVER_NAME']}/";
    }
}
```

使用者の実装の仕方の好みなどもあると思いますので、お好みの方法で利用していていただければと思います。
SQLAlchemy filter()とfilter_by()の違い

### PythonのO/R Mapperの１つであるSQLAlchemyでDB検索する際にfilter()とfilter_by()の２つの関数があるので違いを説明します。

公式ドキュメントを見れば明白でした。
[filter_by()](https://docs.sqlalchemy.org/en/13/orm/query.html#sqlalchemy.orm.query.Query.filter_by), [filter()](https://docs.sqlalchemy.org/en/13/orm/query.html#sqlalchemy.orm.query.Query.filter)
結論から言うと、fileter_by()の方がコードが短くなる利点があるようです。

filter():{モデル}.{変数名}でテーブルのカラムの値を検索条件に追加可能
filter_by(): モデルなしで、{変数名}だけでカラムの値を検索条件に追加可能

コードで見るとわかりやすいので明記すると

```
# filter()を使う場合の記述例
session.query(MyClass).\
    filter(MyClass.name == 'some name', MyClass.id > 5)

# filter_by()を使う場合の記述例
session.query(MyClass).\
    filter_by(name = 'some name', id > 5)
```

個人的にはfileter_byの方が短く記述できるので、便利かと思いました。

ただ、チームでの開発時やlinterを使う場合、undefined ~ とエラーが出る可能性があるので、その場合はfiler()を使って記述する方が良さそうです。

他にも、filter()はこう言う時に便利だよと言う使い方を知っている方がいれば、コメントで教えてもらえると嬉しいです。
GitHubへパスワード関連データをpushするのを防ぐ

#git-secrets
pushしようとしたコードをチェックし、パスワードだと推定されるような文字列が含まれている場合はそこで処理が中断される仕組み

##インストール
```
% brew install git-secrets
```

##適用
アプリケーションディレクトリで下記を実行

```
% git secrets --install
```
以下のコマンドで一括設定可能

```
% git secrets --register-aws --global
```
設定内容は以下のコマンドで確認可能

```
% git secrets --list
```

以下のコマンドで、今後作成する全てのリポジトリにgit-secretsが適用される。
作成中のアプリディレクトrで実行すること

```
% git secrets --install ~/.git-templates/git-secrets
% git config --global init.templatedir '~/.git-templates/git-secrets'
```

※GitHub Desktop経由の際に利用する場合の追加設定

```
% sudo cp /usr/local/bin/git-secrets /Applications/GitHub\ Desktop.app/Contents/Resources/app/git/bin/git-secrets
```
Cypressで矢印キーを入力する

Cypressで矢印キーを使いたいときは以下の記法で書きます。

```js
cy.get('input').type('{downarrow}')  //下矢印キーを押す
```

セレクトボックスから要素を選択するときに使えたりしますね。
また、矢印キーだけでなくEnterやBackSpaceなど使うことができます。


## 参考
そのほかの記法については以下に詳しく書かれています。
https://docs.cypress.io/api/commands/type.html#Arguments
neo4jでsandbox その18

#概要

neo4jでsandboxやってみた。
rest api叩いて、d3で表示してみた。

#写真

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/2b07db7e-3975-faf3-70f8-ad41a619949c.jpeg)


#成果物

http://embed.plnkr.co/plunk/xRacBMA7KtppiUXr

以上。
IE対応はやめられそう

# はじめに
来たる2020年11月19日(の週)、Microsoft Edgeのバージョン87がリリースされます。
この87では、「**IEと互換性のないWebサイトをIEで開いたとき、Edgeへリダイレクトする**」という機能が追加されます。
現時点でYouTubeやTwitter有名サイトを初めとした、1156サイトで機能します。
これは87に更新した時点で、規定の動作として行われます。
また、この動作を無効にするには、ユーザーがWindowsのグループポリシーを設定する必要があります。

# IE対応は~~やめられない~~やめられそう

## 2020/11/13 追記

こちらのIssueに更新がありました。
*How to join the force-redirect-IE-to-Edge list?*
https://github.com/MicrosoftDocs/Edge-Enterprise/issues/86#issuecomment-726360930

**以下の項目を記載したメールをietoedge@microsoft.comへ送る**ことで、
自分のサイトをIEと互換性のないサイト一覧に追加/削除してもらうことが可能なようです。

### メールに記載する項目

- Owner name
- Corporate title
- Email address
- Company name
- Street address
- Website address

詳細は以下にあります。
*Moving users to Microsoft Edge from Internet Explorer*
https://docs.microsoft.com/en-us/microsoft-edge/web-platform/ie-to-microsoft-edge-redirection

---

このアップデートがリリースされれば、IE用の動作等を記述することなくスマートに
「IE対応をしない対応をした」Webサイトを構築できそうです。

ではIEと互換性があるかないか、どのように判定されるのでしょうか。

以下の記事に全て書いてありますが、
- *「IE」で一部のサイトを開くと「Edge」に転送--脱IEの一環で*
https://japan.zdnet.com/article/35161516/
抜粋すると
> この新機能の核となるのは、2020年の夏にEdgeのインストールファイルに追加された新しいDLLファイルだ。このDLLファイル（ie_to_edge_bho.dll）は、IEのプラグインであるBrowser Helper Object（BHO）だ。

>　追加されたBHOファイルはEdgeフォルダーの中に置かれているが、IEのレジストリーキー経由でIEの起動時にロードされる。

>　このBHOは、ユーザーがアクセスしようとしているウェブサイトを監視するもので、リンクをクリックしたか、アドレスバーにURLを直接したかに関わらず機能する。

>　ie_to_edge_bho.dllファイルは、ユーザーが使用したURLがあらかじめ用意されているIE非互換サイトのリストに一致するかどうかをチェックする。

要約すると
「アップデートで追加されていたDLL内の**IEと互換性のないWebサイト一覧**を参照し、一覧にあるサイトのみリダイレクトする」
ということのようです。

DLL内部では以下のURLが指定されており、その先でIEと互換性のないWebサイト一覧が定義されています。
https://go.microsoft.com/fwlink/?linkid=2133855
このxmlファイルですが、更新があると自動的にダウンロードされるようです。

この一覧はマイクロソフトによって管理されています。
~~つまり、**マイクロソフトが我々のサイトを一覧に追加してくれない限り、IE対応はやめられない**ということです。~~
一覧に追加したい場合はメールを送りましょう。

# おわりに
IE対応については、ビジネス上の理由によりやめられないことがほぼだと思います。
上記のアップデートが我々のサイトに対応したとしても、実態として、やめることは困難でしょう。
マイクロソフトは良い方向を向いているとは思いますが、IE対応をやめることができる時代はまだ遠そうです。

# 参考
*Moving users to Microsoft Edge from Internet Explorer*
https://docs.microsoft.com/en-us/microsoft-edge/web-platform/ie-to-microsoft-edge-redirection

*最新の Web サイトに対応するための Internet Explorer から Microsoft Edge へのリダイレクト*
https://docs.microsoft.com/ja-jp/deployedge/edge-learnmore-neededge

*「IE」で一部のサイトを開くと「Edge」に転送--脱IEの一環で*
https://japan.zdnet.com/article/35161516/

*How to join the force-redirect-IE-to-Edge list?*
https://github.com/MicrosoftDocs/Edge-Enterprise/issues/86
Accessのファイルを開いた時にデフォルトで開くフォームを設定

#バージョン
Access for Microsoft 365 MSO（16.0.13328.20262）32ビット
Windows10 Pro バージョン1909 OSビルド18363.1171

#やり方

左上。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/8ea07fcf-fe7d-f7c4-0ec6-594a8af271a4.png)

左下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/4402a81b-4874-b3ea-6623-1a604e014763.png)

ここ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/b129402d-1bf5-9dd9-d592-156912455192.png)

一度Accessファイルを閉じて、次に開く時から有効になる。
EclipseでPython開発環境を構築(HTMLエディタの追加)

EclipseにHTMLエディタを入れる

ヘルプ
→新規ソフトウェアのインストール
→追加
→Luna - http://download.eclipse.org/releases/luna
→Web, XML, Java EE および OSCiエンタープライズ開発
→Eclipse Java Web開発者ツール


Eclipseを再起動するとHTMLファイルをHTMLエディタで編集することができるようになる。
郵便受けの投函をお手軽に検知したい(スマホに通知が来るように）

# 郵便受けを見に行くのがつらい
正確にはからぶりがつらい。
ふきっさらしの平地で、妙に風が強い地域なのでしょっちゅう投函っぽい音はしているが、見に行くと空振り。
そこはまあ慣れだろうけど、、慣れてないうちに、鉄は熱いうちに打て。

今回は戸建てのケースだが、集合住宅でもwi-fiが届く範囲にポストがあれば使えると思う。
マンションだときつそう。


# 検索すると…
自作キット的なものは出てくる。はんだ付けして作るようなやつ。
あと製品もあったようだがもう売ってないし、大げさすぎるなと思った。
kickstarterのものは失敗しているようだ。

# IoTセンサーを見つける
完成品一発でなんとかならないかな…と思って探していたら、
スマート電球やら出しているとこからスマート人感センサーが売っていた。
これ使えればスマホに通知くるようにできないかな。

【+Style ORIGINAL】スマートセンサー（人感） 動きを検知 人感 センサー 防犯 セキュリティ 室内 wifi ワイヤレス 無線 スマホ 通知 
https://amzn.to/3cvcrjv

パナからも出ているようだが、これはホームユニットとかいうものがないと単体では出来ないっぽいので試さず。
パナソニック 人感センサー KX-HJS200-W
https://amzn.to/3ivO2xW


赤外線で検知してるみたいだし、小さいし、ポスト内に設置しても（暗所でも）大丈夫だよねたぶん。
既にスマート電球は使ってるので最悪でもほかの用途にも使えそうだし、、電池もアマゾンで買えば単三にこだわらなくていいか。
という訳で+Styleのものを購入。

# 到着、テスト、設定
ものが届いて付属の電池を入れる。
丁寧な日本語説明書が付いているので指示に従ってセットアップ。
アプリは指示に背いて「SmartLife」という普段使っているアプリを使う。汎用規格なんだろうしどのアプリでも動くだろたぶん。
https://play.google.com/store/apps/details?id=com.tuya.smartlife&hl=ja&gl=US
アプリへの登録はアプリに従うこと。

動かしていて思ったが、2種類のセンサーが入っているようだ。動き・揺れ。
センサーの前で手を振ったり揺らしてみる。
アプリ設定もそこそこにして郵便受けに設置。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25349/c19961e4-e0ad-ee89-5a8c-8314234c50b2.png)


風で、、結構振動が誤検知されているようです。
このままでは通知が乱打されるので、SmartLifeの自動化機能で
「揺れ＋動き」があるときだけ通知が来るように設定をおこなう。風で揺れ検知してるくらいだしポスト入れたら揺れるやろ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25349/1ba582ac-a75b-39b0-5af0-0f5aab8a4ae8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25349/d3cadc04-aaea-1430-1d41-ee918257fcac.png)

検知ごとの個別通知を消す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25349/296bfaf4-ab14-3478-3556-148944274396.png)

自動化に新しいタスクを追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25349/b1da0faa-33fd-61b2-f872-8d9302a63f97.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25349/df6418c5-ba68-5d0e-8230-14b971eaf1b5.png)

通知が来ればスマホにポップアップするように設定した。
通知方法はスマート電球を光らせるとかでもいいと思う。お好みで。

以下のメッセージセンター画面で、履歴は確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25349/c81a124e-bc72-7973-1df3-a2820732ddad.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25349/3167e3dd-a973-87b7-3bdf-4bbb8c5e32db.png)


以下、ハガキをテスト投函。
ばっちり通知が来る。やっぱり10秒くらいタイムラグはある模様。この用途では問題なし。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25349/3476af84-60d7-45c5-c1a4-150f832e20a8.png)
（PushBulletというスマホ通知をPCに飛ばしてくれるアプリを使用しています）


# まとめ
スマートIoTセンサーが簡単に買えて使える時代はいい時代だと思う。
この程度の出費で日々のお悩みを解決できてしまうのだから…
とりあえず電池交換の時期が来る頃には生活に慣れているだろうけども。

# 電池交換してみた
4月と6月に電池を交換した。
+stylesのものは、電池を交換するときにリセットしないほうがいいようだ。
4月の交換時にリセットしてしまったため、アプリ側の登録をやりなおす羽目になった。
6月の交換時にはリセットせずそのまま使い続けてみたら使い続けられた。

なぜ短期間に交換するはめになったか。
2か月しか電池が持たないダメ電池を掴んでしまったからである。（●芝の安いやつ。レビューをよく読んでおけばよかった）
パナソニックのやつに6月に交換してみた。これならばスペック通り持つことを期待。
https://amzn.to/3gawBl0
AtCoderBeginnerContest181復習＆まとめ

# AtCoder ABC181
2020-11-01(日)に行われたAtCoderBeginnerContest181の問題をA問題から順に考察も踏まえてまとめたものとなります．
問題は引用して記載していますが，詳しくはコンテストページの方で確認してください．
[コンテストページはこちら](https://atcoder.jp/contests/abc181)
[公式解説PDF](https://atcoder.jp/contests/abc181/editorial)

## A問題　Heavy Rotation
> 問題文
> 高橋くんは今、白い服を着ています。
> 高橋くんは、白い服を着た次の日には黒い服を、黒い服を着た次の日には白い服を着ます。
> $N$日後には何色の服を着るでしょうか？

```python:abc181a.py
n = int(input())
if n % 2 == 0:
    print("White")
else:
    print("Black")
```

## B問題　Trapezoid Sum
> 問題文
> 何も書かれていない黒板があります。 高橋くんは$N$回の操作を行い、黒板に整数を書きます。
_ $i$回目の操作では、$A_i$以上$B_i$以下の整数すべてを$1$個ずつ、合計$B_i−A_i+1$個の整数を書きます。
> $N$回の操作を終えたときの、黒板に書かれた整数の合計を求めてください。

問題文に$B_i−A_i+1$個と書いてあってとても助かりました．
このあたり+1し忘れたりして，ミスること多いので（汗）

```python:abc181b.py
n = int(input())
total = 0
for i in range(n):
    a, b = map(int, input().split())
    total += (b - a + 1) * (a + b) // 2
print(total)
```

## C問題　Trapezoid Sum
> 問題文
> 無限に広い$2$次元平面の上に$N$個の点があります。
> $i$番目の点は$(x_i,y_i)$にあります。
> $N$個の点の中の相異なる$3$点であって、同一直線上にあるものは存在するでしょうか？

一直線上にあるということは，三点$P_1, P_2, P_3$に対して，
$k\overrightarrow{P_1P_2}=\overrightarrow{P_1P_3}$
が成り立つ必要があるため，x成分とy成分の恒等式から$k$を消去することで，成り立つための条件式を得ることができました．

```python:abc181c.py
n = int(input())
x_list = []
y_list = []
for i in range(n):
    x, y = map(int, input().split())
    x_list.append(x)
    y_list.append(y)
flag = 0
for i in range(n - 2):
    for j in range(i + 1, n - 1):
        for k in range(j + 1, n):
            xi = x_list[i]
            xj = x_list[j]
            xk = x_list[k]
            yi = y_list[i]
            yj = y_list[j]
            yk = y_list[k]
            if (xj - xi) * (yk - yi) == (xk - xi) * (yj - yi):
                flag = 1
if flag == 1:
    print("Yes")
else:
    print("No")
```

## D問題　Hachi
> 問題文
> 1 〜 9 の数字のみからなる数字列$S$が与えられます。
> 蜂の高橋くんは、$8$の倍数が好きです。
> 高橋くんは、数字列$S$を並び替えて$8$の倍数を作ろうとしています。
> $8$の倍数を作れるかどうか判定してください。

とある数字列が$8$の倍数となるためには，下三桁が$8$の倍数である必要がある．
そのため，三桁以上の数字列に対して，$8$の倍数である三桁を作ることができるかどうかを調べることで解くことができます．
まず，$0$を含まない$8$の倍数の数字の組み合わせを記録していき，その組み合わせに必要な数字が足りているかを確認して，判定を行いました．
もっと，シンプルなコードが書けると思いますが，提出したものをそのまま載せておきます．

```python:abc181d.py
s = input()
flag = 0
if len(s) == 1:
    if int(s) % 8 == 0:
        flag = 1
elif len(s) < 3:
    if int(s) % 8 == 0:
        flag = 1
    if int(s[1] + s[0]) % 8 == 0:
        flag = 1
else:
    check_list = []
    for i in range(14, 125):
        mozi = str(i * 8)
        if len(mozi) == 3 and "0" not in mozi:
            count_list = [0] * 9
            count_list[int(mozi[0]) - 1] += 1
            count_list[int(mozi[1]) - 1] += 1
            count_list[int(mozi[2]) - 1] += 1
            check_list.append(count_list)
    s_list = [0] * 9
    for suuzi in s:
        s_list[int(suuzi) - 1] += 1
    for count_list in check_list:
        total = 0
        for i in range(9):
            if count_list[i] > 0:
                if count_list[i] <= s_list[i]:
                    total += count_list[i]
        if total == 3:
            flag = 1
            break
if flag == 1:
    print("Yes")
else:
    print("No")
```

今回，D問題までいいペースで解けたのですが，E問題がどうしても'WA'に阻まれて解けませんでした．
方針はあっていたので，次はしっかり解けるようにしたいと思います．

最後まで読んでいただきありがとうございました．
Processing3 + kinectv1 人からkinectまでの距離を測定

ベストな処理かわからないですがメモです。SimpleOpenNI使ってます。

ライブラリとかの設定はこれを参考にやって
https://qiita.com/39_isao/items/7fe6cd7d945d8789859d

```

import SimpleOpenNI.*;
SimpleOpenNI kinect;

// kinectからの距離
float distance;
 
void setup() {
  size(640, 480);
  kinect = new SimpleOpenNI(this);
  
  // RGB カメラon
  kinect.enableRGB();
  
  // 深度カメラon
  kinect.enableDepth();
  
  // 左右反転
  kinect.setMirror(true);
  
  // 赤外線カメラとRGBカメラの位置補正で人物の領域一致
  kinect.alternativeViewPointDepthToImage();
  
  // 人物認識機能on
  kinect.enableUser();
  
  // 人からkinectまでの距離
  distance = 0;

}
 
void draw() {
  
  // 背景白
  background(255);
  
  // kinect情報アップデート
  kinect.update();
  

  int[] userMap = null;
  int userCount = kinect.getNumberOfUsers();
  if (userCount > 0) {
    userMap = kinect.userMap();
  }
  
  loadPixels();
  for (int y=0; y<kinect.rgbHeight(); y++){
    for (int x=0; x<kinect.rgbWidth(); x++){
      int i = x + y * kinect.rgbWidth();
      
      // 人物検知領域の
      if (userMap != null && userMap[i] > 0){
        pixels[i]=kinect.rgbImage().pixels[i];
        
        // 実空間のx,y,zに変換
        PVector r_pos = kinect.depthMapRealWorld()[i];
        
        // 実空間のz座標取得（距離取得）
        distance = r_pos.z;
      }
    }
    
  }
  updatePixels();

  // 約何mmか出力
  println("約" + distance + "mmです。");
  
  
}

```


for文で人物領域全体のピクセル情報見に行ってるので、
もっといい処理あって多少雑かもしれないですが、、、
printlnしたらいい感じの値が返ってきたのでよしとしました。

SimpleOpenNIがツールバーから消えていたので誰かの助けになれば...笑
Processing3 +  SimpleOpen NI + kinectv1 で骨格検知

Processing + kinect v1で顔の位置をとりたく、

SimpleOpenNIとやらが必要となり、
メニューのツールからインストールしようとしたら無くなっていたので、

同じ悩みを抱えてる方いましたらと思ったメモです。


この記事のおかげです感謝
https://qiita.com/kikpond15/items/6c8f8b192c7c21c59b41

>import Libraryから入れ直してみたり，.jarファイルを入れ替えてみたりしたけどだめだった．
>けど，totovrさんがProcessing3.3.6ようにライブラリを作ってくれていました
>SimpleOpenniからダウンロードしてライブラリに入れれば動きました．



[totovrさんのSimpleOpenni](https://github.com/totovr/SimpleOpenni/tree/Processing_3.3.6 "totovrさんのSimpleOpenni")

↑このREADME.mdのとおりライブラリ設定やって

```
import SimpleOpenNI.*;

// SimpleOpenNI
SimpleOpenNI kinect;

void setup(){ 
  size(640, 480);
  
  kinect = new SimpleOpenNI(this);
  
  kinect.enableDepth(); 
  
  kinect.enableUser();
}


void draw(){
  
  kinect.update();
  
  
  // 深度画像取得して表示
  PImage depth = kinect.depthImage();
  image(depth, 0, 0);


  // 検出した人たちをuserListにいれる
  IntVector userList = new IntVector();
  kinect.getUsers(userList);

  // 一人以上検出してたら
  if(userList.size() > 0){
    
    // 一人目のID取得
    int userId = userList.get(0);

    //  一人目の骨格を見にいく
    if(kinect.isTrackingSkeleton(userId)) {

      //  頭の(x,y,z)座標取得 
      PVector headPos = new PVector();
      kinect.getJointPositionSkeleton( userId,SimpleOpenNI.SKEL_HEAD,headPos );

 

      顔の位置入れとくPVector用意
      PVector convertedHeadPos = new PVector();
      
        //丸書くために、現実世界の座標から、スクリーンの2次元のx,y座標に変換（多分）
        kinect.convertRealWorldToProjective( headPos, convertedHeadPos );
        
        // 青丸描画
        fill(255, 0, 0);
        ellipse(convertedHeadPos.x, convertedHeadPos.y,50,50 );
      }
    }
}



// 新しいuser検知した時
void onNewUser( SimpleOpenNI kinect, int userId ){
  println("Detection Start");
  kinect.startTrackingSkeleton(userId); 
}



```
0 SKEL_HEAD    顔の中心
1 SKEL_NECK    首の下
2 SKEL_LEFT_SHOULDER
3 SKEL_RIGHT_SHOULDER
4 SKEL_LEFT_ELBOW
5 SKEL_RIGHT_ELBOW
6 SKEL_LEFT_HAND
7 SKEL_RIGHT_HAND
8 SKEL_TORSO   へそのあたり
9 SKEL_LEFT_HIP
10 SKEL_RIGHT_HIP
11 SKEL_LEFT_KNEE  ひざ
12 SKEL_RIGHT_KNEE
13 SKEL_LEFT_FOOT
14 SKEL_RIGHT_FOOT


多分コメントあってると思いますが...以上。

色々参考  
http://denki.nara-edu.ac.jp/~yabu/soft/processing.html#17
LaTeX の \newcommand を \newcommand してみる

#\newcommand とは
LaTeXでは，`\newcommand`を使ってマクロを定義することができます．

```latex
\newcommand{<new command>}[<option>]{<definition>}
```

`option`は`definition`の中で取る引数の数です．例えばこんな感じです．

```latex
\newcommand{\f}[1]{\fbox{(#1)}} %穴埋め式問題の問題文の四角
```

すると`\f{ア}`と打った時，

```math
\fbox{(ア)}
```

と表示されるようになります．
他にも
`\renewcommand`(すでに存在するコマンドの旧定義を上書き)，
`\providecommand`(定義しようとしているコマンドがすでに存在する場合何もせず，未定義の場合新しく定義)，
`\newtheorem`(定理用の環境を定義)，
`\newenvironment`(新しい環境を定義)
などがあります．

#問題点
これらのコマンドは結構長い．作業中何か思いついたときに`\newcommand`と打つのって結構長いですよね．機械的な部分にはなるべく労力を割かずに，創造的な箇所にエネルギーを使いたいものです．
エディタは Atom を使っていますが自動補完もしてくれないし，手で自動補完の設定を加えたとしてもそれはエディタに依存してしまいます．なるべく他人も使えるように，また自分のファイルを誰かに渡したらそれでその人も助かるような，そんな解決策はないものでしょうか．

# \newcommand を \newcommand する

そこで`\newcommand`を`\newcommand`しちゃいましょう．必要は発明の母です．やってみると実に簡単です，プリアンブルに以下のように書くだけです．

```latex:newcommand.sty
\newcommand{\nc}{\newcommand} %doesn't mean noise cancelling!
\nc{\rnc}{\renewcommand}
\nc{\pvc}{\providecommand}
\nc{\nthm}{\newtheorem}
\nc{\nenv}{\newenvironment}
%\pvc{A}{B}: Only if A doesn't exists, A is defined as B.
```

元々コマンドが存在するのを省略するだけの場合は，引数の指定は必要ないようです．これで無事`\newcommand`を打つのがめんどくさいという問題は解決しました．

ちなみに`\rnc`を使うと元の定義は使えなくなってしまうので，僕は特別の理由がない限り極力`\nc`の方を使うようにしています．
rails学習　6日目その２

##Railsチュートリアル　第４章　まとめ
>to_s

to_sを使うとあらゆるオブジェクトは文字列になる。
例えばnilにto_sを使うと

```
nil.to_s
=>" "
```
nilの文字列" "の空文字になる。

>!!演算子

!!演算子を使うとどんなものでもtureかfalseを返すようになる

```
!!nil
=>false

!!0
=>true
```
※なお、falseを返すのはnilとfalse自身しかない

```
def string_message(str='')
end
```
このように
defメソッド名（デフォルトの引数）
とデフォルトの引数を決めておけばメソッドを呼びだす時に引数を指定しても指定しなくてもどっちでもよくなる。

```
string_message  =>デフォルトの引数が使われる

string_message("foobar")　=>今回の引数のfoobarが使われる
```
Angular ng-templateでngIf を使う方法

#普通のタグでngIfを使う場合
```html
<div *ngIf="ishide">
 </div>
```
こんな感じで`*ngIf`をclassとかと同じようにタグの中に書く。

ただし、`ng-template`で使う場合は少し書き方が異なるみたいだ。。。

#ng-templateでngIf を使う
```html
 <ng-template [ngIf]="!isLocked" [ngIfElse]="notLocked">
    <h2>
      現在ロック機能は無効です
    </h2>
 </ng-template>

 <ng-template #notLocked>
    <h2>
      現在ロック機能は有効です
    </h2>
 </ng-template>
```

こんな感じに`[ngIf]="!isLocked"`のように書くようだ。



#参考
https://ultimatecourses.com/blog/angular-ngif-else-then
サイゼリヤの間違い探し(イタリア食材編)

###はじめに
OpenCVを使いサイゼリヤの[イタリア食材](https://www.saizeriya.co.jp/entertainment/italy.html)の間違い探しをやってみました。

###画像切り出し（手動）
画像2枚について同一ピクセルサイズになるよう注意深く切り出し、png形式で保存します。

###ライブラリのインポート
OpenCVなどのライブラリをインポートします。

```python
import os
import subprocess
from PIL import Image
import cv2
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
```

###画像サイズ調整
切り出した画像ファイルをdir1フォルダに格納します。次に、画像サイズを300*300pxにし、dir2フォルダに格納します。

```python
dir1 = 'png'
dir2 = 'png_resize'

files1 = os.listdir(dir1)
files1.sort()

for file in files1:
    
    if '.png' in file:   
        img0 = os.path.join(dir1, file)
        img0_img = Image.open(img0)
        img1_img = img0_img.resize((300,300)) 
        img1 = os.path.join(dir2, file) 
        img1_img.save(img1)
        print(file)
        
# s1.png
# s2.png
```

![s1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311614/f6eb9c9d-e708-e8df-3cc8-241d24e9f7ac.png)![s2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311614/0a5aee6c-bb2d-044c-2e4a-9e3421b4cac0.png)

###画像分割
画像を縦横300分割してb値を取得します。分割数は300の約数ならばOKですが、Maxである300にすることで差分画像の精度が最高となります。


```python
dir2 = 'png_resize'
files2 = os.listdir(dir2)
files2.sort()

std_data2 =[]
image_data2 = []
grid =300 #分割数

for file in files2:
   
    if '.png'  in file:        
        img = cv2.imread('./png_resize/' + file)
        h, w, c = img.shape    

        v_split = grid
        h_split = grid
        _img = img[:h // v_split * v_split, :w // h_split * h_split]

        image_data =[]
        
        for h_img in np.vsplit(_img, v_split):
            for v_img in np.hsplit(h_img, h_split):  
                b, g, r = cv2.split(v_img)
                value = round(b.mean())/100
                image_data.append(value)
        
        image_data2.append(image_data)
```

###差分画像化
差分を求め画像化します。

```python
image_array2 =  np.array(image_data2)
dif_array = image_array2[0] - image_array2[1] 
dif_image=dif_array.reshape(grid,grid)
plt.imshow(dif_image)    
```

![diff.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311614/82dcf79e-56b8-4fbc-8499-4ed040240a0a.png)

###答え合わせ
分かりにくい箇所もありますが、全て検出できているようです。
![ansfig.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311614/79121f8f-beda-1ea3-5f38-013355d07a2e.png)![diffans.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311614/d00a1104-65ca-7baa-b691-fa38499a14af.png)
![ans.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311614/b3833dd8-b43f-342d-e991-0d9a1168f1e6.png)

###終わりに
シンプルな手法ですが間違い探しには十分使えそうな気がしています。もっと難しい課題にも挑戦してみます。
rails学習　6日目

##Railsチュートリアル　第３章　まとめ
```
git push -u origin static-pages
```

分かれたブランチを分かれたままGitHubに保存する

```
rails g controller StaticPage home help
```
static_pageのコントローラーとそれに伴った様々なファイルが作成される

static_pageコントローラーを消したいとなったらコントローラーファイルを消すだけではそのほか自動生成された様々なファイルは残ったままとなる。そんな時は

```
rails destroy controller StaticPage home help
```
destroyでコントローラ関連のファイルも全て削除される。

```ruby
provide(:title, "Home")
yield(:title)
```

provide(:title,"文字列"）のようにprovideに文字列を入れるとその文字列はyieldに代入される
Pipesライブラリ　超図解

[pipesライブラリ](https://hackage.haskell.org/package/pipes)を図解します。

## Proxy a' a b' b m r
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126131/11b211d9-7d1f-ab03-4fe9-5fdff75d23f4.png" width=500>

```haskell:Pipes.Internalより
data Proxy a' a b' b m r
    = Request a' (a  -> Proxy a' a b' b m r )
    | Respond b  (b' -> Proxy a' a b' b m r )
    | M          (m    (Proxy a' a b' b m r))
    | Pure    r
```

## fb' +>> p
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126131/d412d056-427c-2ddd-17c4-3d1a965e3370.png" width=500>

```haskell:Pipes.Coreより
(+>>)
    :: (Monad m)
    => (b' -> Proxy a' a b' b m r)
    ->        Proxy b' b c' c m r
    ->        Proxy a' a c' c m r
fb' +>> p = case p of
    Request b' fb  -> fb' b' >>~ fb
    Respond c  fc' -> Respond c (\c' -> fb' +>> fc' c')
    M          m   -> M (m >>= \p' -> return (fb' +>> p'))
    Pure       r   -> Pure r
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126131/b10fc9fd-5aad-e66a-dac9-a6deb2c561bd.png" width=200>

## p >>~ fa
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126131/80ca5b6a-e760-57bc-6653-c90492e495db.png" width=500>

```haskell:Pipes.Coreより
(>>~)
    :: (Monad m)
    =>       Proxy a' a b' b m r
    -> (b -> Proxy b' b c' c m r)
    ->       Proxy a' a c' c m r
p >>~ fb = case p of
    Request a' fa  -> Request a' (\a -> fa a >>~ fb)
    Respond b  fb' -> fb' +>> fb b
    M          m   -> M (m >>= \p' -> return (p' >>~ fb))
    Pure       r   -> Pure r
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126131/c0d193eb-015c-0d29-5928-f42509422ae4.png" width=200>


## fb' >\\\\ p
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126131/81ef0b1e-0119-42de-2efd-b0b2658419ee.png" width=500>

```haskell:Pipes.Coreより
(>\\)
    :: (Monad m)
    => (b' -> Proxy a' a y' y m b)
    ->        Proxy b' b y' y m c
    ->        Proxy a' a y' y m c
fb' >\\ p0 = go p0
  where
    go p = case p of
        Request b' fb  -> fb' b' >>= \b -> go (fb b)
        Respond x  fx' -> Respond x (\x' -> go (fx' x'))
        M          m   -> M (m >>= \p' -> return (go p'))
        Pure       a   -> Pure a
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126131/325e5ac9-d274-de97-05cb-ccd86f7bb7b6.png" width=200>


## p //> fa
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126131/4fffd178-98a5-9dc4-2679-54a9204702be.png" width=500>


```haskell:Pipes.Coreより
(//>)
    :: (Monad m)
    =>       Proxy x' x b' b m a'
    -> (b -> Proxy x' x c' c m b')
    ->       Proxy x' x c' c m a'
p0 //> fb = go p0
  where
    go p = case p of
        Request x' fx  -> Request x' (\x -> go (fx x))
        Respond b  fb' -> fb b >>= \b' -> go (fb' b')
        M          m   -> M (m >>= \p' -> return (go p'))
        Pure       a   -> Pure a
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126131/9436ad48-b90e-8ab8-a5ad-1e523da0807f.png" width=200>
【Rails】間違ってローカル環境で本番環境のbundle installをしてしまった時の対策

【Rails】間違ってローカル環境で本番環境の bundle install をして訳分からなくなった時に行なった対策

## はじめに
趣味アプリの開発で、Rails で API を作っていた際、久々にローカルと本番を間違って bundle install をかけました。
ローカルで`bundle install --path vendor/bundle --without test development`を走らせたということです。。。
その時にうまいこと復活できた（多分）ので、まとめました。

## 起こったこと
よく分からないエラーがたくさん出て、`rails s`など様々なことができなくなる。

## 対策

### .vendor/bundle の削除
上記のコマンドを実行すると、おそらくアプリケーション直下に bundle のディレクトリが出来上がっていると思います。怖いと思いますが、まずはそれを丸ごと削除してください。

### Gemfile.lock を書き換える
その状態で`rails s`などを実行すると、先ほどとエラー内容は変わりますが、本番環境で入れようとしていた gem（例えば mysql2 といった本番環境のデータベースに必要な gem など）が無い！と怒られます。
これは、インストールされている Gem と Gemfile.lock に書かれている内容が一致しないことで起こる問題のようです。
ということで、Gemfile.lock の内容を全て削除します。

その上で、github などのバージョン管理ツールから、間違った bundle install をする前の Gemfile.lock の情報をコピーし貼り付けてください。

### 終わり
自分はこちらの方法で直りました！ヤベーやっちまった。。。と焦りがちですが、なんとかなりました。
もし、間違いや危険な行為などがありましたらご指摘お願いします。
【Ubuntu】シェルスクリプトの実行方法

```
$bash ./test.sh
```

```
$sh ./test.sh
```

```
$ ./test.sh
```

## パターン1
### スクリプトの中身
```
$ cat test.sh
echo "test!";
```

### 実行（成功）
```
$ sh test.sh
test!
```

## パターン2
### スクリプトの中身
```
$ cat test.sh
#!/bin/bash

array=(1 2 3);
echo "test!";
```
L3にbashでしか使えない、配列の記法があります。

### 実行（失敗）
```
$ sh test.sh
test.sh: 3: test.sh: Syntax error: "(" unexpected
```
スクリプトの先頭に `#!/bin/bash` を入れているのに、何故かbashが効いていないせいで怒られます。

### 実行（失敗）2
ファイル名の先頭に `./` を入れてみる
```
$ sh ./test.sh 
./test.sh: 3: ./test.sh: Syntax error: "(" unexpected
```
それでも怒られます。

### 実行（成功）
```
$ ./test.sh 
test!
```
`sh` を使わないでファイルだけ指定するか、 `bash` を使うと実行できます。

```
$ bash test.sh
test!
```

### ちなみに
```
$ test.sh 
test.sh: command not found
```
`./` を付けないと、コマンドだと思われて怒られます。

---
## 追記
@hidezzz さんのコメントを参考に、bashコマンドを追記しました。ご教授有難うございました！
【HTML, JavaScript】自動でページをリロードする方法

#プログラミング勉強日記
2020年11月2日
HTMLとJavaScriptのそれぞれのブラウザの自動リロードの方法をまとめる。

#HTMLのみを使った自動リロード
　metaタグでは`http-equiv="refresh"`を定義することで指定秒後にページを自動リロードすることができる。このとき、`content="リロードさせるまでの秒数"を数字で指定する。

```html:サンプルコード
<html>
  <head>
    <title>サンプルコード</title>
    <meta http-equiv="refresh" content="2;url=jikko1.html">
  </head>
  <body>
    <font>最初のページ。２秒後に移動する。</font>
  </body>
</html>
```

　この場合、ヘッダー情報としてheadタグの後に置く通常のmetaタグとは違って、例外的にHTMLファイルの冒頭に置くことになり、htmlタグやheadタグなどの構造は省略される。
　`content="秒数；URL=移動先"`で他ページを表示することもできる。(このときは構造タグは省略されない)


```html:違うページにリロード
<html>
  <head>
    <meta http-equiv=”Refresh” content=”2;URL=https://qiita.com/mzmz__02”>
    <title>デザイナーズ プロジェクト [DSPT]</title>
  </head>
  <body>
    <font>最初のページ。２秒後に違うページに移動する。</font>
  </body>
</html>
```

#JavaScriptを使った自動リロード　
　setTimeout()とlocation.reload()を利用することで間隔でブラウザをリロードできる。

```js:サンプルコード
setTimeout(function () {
    location.reload();
}, 2000);
```



#参考文献
[３章 リンク  ８．ページを自動的に移動させる](http://psy.isc.chubu.ac.jp/~mizunor/semi/homeworks/hirasawa/page3/kaisetu.html)
[ブラウザを自動的にリロードするいくつかの方法](https://www.mitsue.co.jp/knowledge/blog/frontend/201806/29_1525.html)
[指定時間になったら自動でページをリロード（更新）・読み込む](https://www.dspt.net/html_tag/001_data/020.html)
Laravelで、Array to string conversion in ….　と出たときの解決策

#エラー
```terminal:terminal
local.ERROR: ErrorException: Array to string conversion in ….
```
原因は配列型（Array）を文字列型（String）に変換できないこと。

# 解決策
implodeを使用して配列を展開する。

```php:.php

$array = array('name', 'email', 'age');
$conversion = implode(",", $array);

echo $conversion; // name,email,age

```
単純に配列を文字列に変換したいときには便利なメソッドでした。

# 参考文献
[implode - PHP](https://www.php.net/manual/ja/function.implode.php)

##会社の紹介
私は現在、[株式会社ダイアログ](https://www.dialog-inc.com/)という物流×ITの会社に勤務しております。
2020年11月現在、エンジニアの募集はしていませんが、他にも様々な職種を募集しているので、[Wantedly](https://www.wantedly.com/companies/company_3244501)のページをご覧ください。
【TwitterAPI】https化したサイトに「安全ではありません」と出た時の対策

## はじめに

こちらの記事は実務ではなく、趣味アプリを開発していた際に気づいたことです。
何かより良い解決策をご存知の方がいらしたら、ご教示お願いします。

【11/4追加】
バック側で解決する方法を書きました。
https://qiita.com/yuki82511988/items/075508793119d90783b1
https://qiita.com/yuki82511988/items/62acd438e4420ec01be3

### 環境

`Nuxt.js * RailsAPI(gem twitter使用)`

こんなよく分からないタイトルの記事をみていただきありがとうございます。
TwitterAPI を使って趣味の Web アプリを開発していた際、あらかたの開発が終わって cerbot を使ってページを https 化しました。

------しかし、Chrome に「安全ではありません」と言われてしまいました。
console に警告が出ていたので見てみると（すみませんコピーしていませんでした）

> 画像のパスが http だから危険かもしれない
> みたいなことが書いてありました。

画像・・・？と気になって調べたところ、twitterAPI から取得してきている画像のパスが、なんと`http://`から始まっていたのです！どうやらこれが問題でした。びっくりしました。

### 原因のコード

```controller.rb
    client = Authorization.init
    @data = client.search("#hashtag", result_type: "recent").take(4).collect do |tweet|
      {
        "image": "#{tweet.user.profile_image_url}",
```

ここで取得している url が http でした。この段階では文字列になっておらず、本来バック側に変換の処理を書くべきですが今回はフロントに次のようなコードを書いて解決しました。

### 対応策

```javascript:front.vue
  response.data.tweet.forEach(
    (element) => {
      console.log(element.image)
      const str = element.image
      const replaced = str.replace('http', 'https');
      element.image = replaced;
      }
```

もっといい方法があるし、文字列を変えただけなので「ええんか・・・」という感じでしたが、これで画像も表示されたまま警告も消えました。

### まとめ

検証ツールで http の部分を https にした時に画像が消えなかったのでこちらの方法を取りましたが、果たして良かったのでしょうか。。。取り急ぎ解決しましたが、もっと良い方法をご存知の方がいらしたら教えてください。
CakePHP4でenvを有効にする方法

あれ？config/.envを用意したのに環境変数が読み込まれないぞという場合に参考にしてください。

config/bootstrap.phpの下記の箇所を修正してあげましょう。
.envの内容が読み込まれる様になります。

**修正前**

```
/*
 * See https://github.com/josegonzalez/php-dotenv for API details.
 *
 * Uncomment block of code below if you want to use `.env` file during development.
 * You should copy `config/.env.example` to `config/.env` and set/modify the
 * variables as required.
 *
 * The purpose of the .env file is to emulate the presence of the environment
 * variables like they would be present in production.
 *
 * If you use .env files, be careful to not commit them to source control to avoid
 * security risks. See https://github.com/josegonzalez/php-dotenv#general-security-information
 * for more information for recommended practices.
*/
// if (!env('APP_NAME') && file_exists(CONFIG . '.env')) {
//     $dotenv = new \josegonzalez\Dotenv\Loader([CONFIG . '.env']);
//     $dotenv->parse()
//         ->putenv(true)
//         ->toEnv(true)
//         ->toServer(true);
// }
```

**修正後**

```
/*
 * See https://github.com/josegonzalez/php-dotenv for API details.
 *
 * Uncomment block of code below if you want to use `.env` file during development.
 * You should copy `config/.env.example` to `config/.env` and set/modify the
 * variables as required.
 *
 * The purpose of the .env file is to emulate the presence of the environment
 * variables like they would be present in production.
 *
 * If you use .env files, be careful to not commit them to source control to avoid
 * security risks. See https://github.com/josegonzalez/php-dotenv#general-security-information
 * for more information for recommended practices.
*/
if (!env('APP_NAME') && file_exists(CONFIG . '.env')) {
    $dotenv = new \josegonzalez\Dotenv\Loader([CONFIG . '.env']);
    $dotenv->parse()
        ->putenv(true)
        ->toEnv(true)
        ->toServer(true);
}
```
【バブルソート編】PHPでソートと解説を書いてみた

自分なりにPHPの学習の成果としてバブルソートを書いてみました。
もしもこういう方法の方がいいよ！というアドバイスがあればお願いします。

```php:bubble_sort.php
<?php
$numbers = array(1,3,5,4,2);
// バブルソート

// 出力
var_dump(bubble_sort($numbers));

function bubble_sort($array)
{
  // 配列の要素以下の回数繰り返し処理を行う
    for($i = 0; $i < count($array); $i++)
    {
      // 一列分行うから1個目のfor文の中へ
        for($n = 1; $n < count($array); $n++)
        {
          // 1つ目の要素と、その次の要素を比較して、1つめが大きい場合
            if($array[$n-1] > $array[$n])
            {
              // $temp_numberに小さい方の数字を保存
                $temp_number = $array[$n];
              // 大きかった位置に、正しい小さな数字を挿入
                $array[$n] = $array[$n-1];
              // 大きい方の数字を、本来正しい位置に挿入
                $array[$n-1] = $temp_number;
            }
        }
    }
    return $array;
}
```
【Nuxt.js】Vuetifyでoffsetがどうしても効かない時に確認して欲しいこと

# 問題点

Nuxt.js で Vuetify.js をインストールしたものの、なぜか offset が効かない！

## 内容の詳細

Nuxt.js で Vuetify.js を使ってデザインしていたところ、`<v-container>`や`v-col`といったタグ、md などのサイズ指定は反応したのですが、空欄を作り出してくれる offset がどうしても効かず、困っていました。

## 原因と解決方法

一言で申し上げますと`<v-app>`タグで全体を囲んでいないのが原因でした。。。
どうやら Vuetify.js のタグを使う際は全体をこのタグで囲んでいなければ、予想外の動作をしてしまうそうです。

中途半端に他のタグが動作していた分、解決に時間がかかりました。
灯台元暗し。お気をつけください。
Visual Studio Code から外部エディタを開く(Mac編)。

# はじめに
VSCodeから他のエディタを起動して使いたい、というモチベーションでいろいろ調べてもネットにある記事はWindows環境向けの物がほとんどで、Macな人たちのためになれば、と思い記事にしました。めっちゃ短いです。

# 環境
* Mac
* VSCode導入済み
* 拡張機能は[Open in Editor](https://github.com/lahmatiy/open-in-editor)を利用。

# いきなり結論
設定の下の方にある[Open in External Editor configuration]から以下の様に設定します。

```json:settings.json
    "alt-editor.binary": "open",
    "alt-editor.args": "-a {好きなエディタ} {filename}"
```
`open`コマンドを指定して、引数に上記の様にしているだけです。
私は`.md`を[Typora.app](https://typora.io/)で開きたかったので以下の様に指定しています。

```json:settings.json
    "alt-editor.binary": "open",
    "alt-editor.args": "-a Typora.app {filename}"
```

# 動作確認
VSCodeでファイル開いている状態で[Alt+Shift+E]で外部エディタが開きます。たったそれだけ。どこかの誰かの参考になれば何よりです！

# 参考にした記事

[Visual Studio Code から外部エディタを開く。](https://qiita.com/standard-software/items/785e3c27865a8e8d0b92)

とても参考になりました！ありがとうございます。
【Github】git log を見やすくしたい

## 対象者
- git log コマンドをよく使っている方
- git log でのコミット履歴が見辛くてお悩みの方

## これで解決

```bash
git log --graph --name-status --pretty=format:"%C(red)%h %C(green)%an %Creset%s %C(yellow)%d%Creset"
```
[【Git】基本コマンド](https://qiita.com/konweb/items/621722f67fdd8f86a017#%E3%83%AD%E3%82%B0%E3%81%AE%E8%A1%A8%E7%A4%BA)
こちらの記事で紹介されていたコマンドを参考にしました。
いろんな記事でオリジナルのgit logについて紹介されていますが、個人的にはこれが一番見やすい＆わかりやすいと思いました。

git log のオプション等についての詳細は、
[git logのオプションと綺麗にツリー表示するためのエイリアス](https://qiita.com/hirotsugu_kawa/items/41afaafe477b877b5b73)
こちらの記事がとても参考になります。
IBMCloud シングルVRAをHA冗長化構成にアップグレードする手順 (Hint&Tips)

# この記事の目的

IBMCloudではシングルVRAをオーダーした後に、機器をHA冗長化に変更することができます。
オーダー周りの手順はお金がかかることもあり、なかなか気軽に試すことが出来ないので、実際にオーダーした時の画像をメモとして残しました。今後オーダーする人の参考情報となれば嬉しいです。

# オーダー方法

以下に具体的なオーダーした際の手順を記載します。

## シングルVRAへのログイン

* [IBMCloudポータル] -> [クラシック・インフラストラクチャー] -> [ネットワーク] -> [ゲートウェイ・アプライアンス] -> 対象デバイスを選択

* 以下の画面が表示されることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703075/c08deefe-7e13-08a5-04bf-1acd37500711.png)

## HAへのアップグレードを実施する

* [アクション] -> [HAにアップグレード] を選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703075/d966e4ea-7ed8-3f0c-4ae5-9832a8fc6b38.png)


* 確認画面が出るのでアップグレードを選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703075/d07b93f6-5605-9dde-da40-d1f72674b297.png)

## 追加するHAデバイスのオーダー情報を確認、必要に応じてホスト名などを変更し、作成ボタンを押下します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703075/b2d50983-d628-b815-1248-6bceae08638c.png)

* 以上で、オーダー処理は完了となります
    * ポータルのゲートウェイ・アプライアンスの機器情報を確認いただき、対象デバイスが"高可用性"となっていれば正常にオーダーが完了しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703075/f3661aa9-6bf7-4db5-9026-ca532daff05b.png)

    * 上記確認ができましたら、ConfigのSYNC設定や必要なInterfaceでのVRRP有効化などの設定を行ってください。(参考資料をご参照ください）

# 参考

* [IBM Cloud Virtual Router Appliance (VRA) の概要](https://cloud.ibm.com/docs/virtual-router-appliance?locale=ja)
* [高可用性（HA）とVRRPの作業](https://cloud.ibm.com/docs/virtual-router-appliance?topic=virtual-router-appliance-working-with-high-availability-and-vrrp&locale=ja)
Windows10のOSバージョン確認方法

# けんぼー

OSのアップデートによって挙動が変わることもあるから、なんか検証したら『どの環境でやったのか』を記録しておく癖つけといた方がいいかも。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/2064aa01-b8c3-8f61-fab3-176f96392d8f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/2722cdb8-58e2-0ef2-98c0-06482f77cdf8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/ecfdc7f0-eac3-06fd-6f48-a8709e063763.png)