OmniAICreator/Qiita-1.07M huggingface dataset:
ReactのuseRefを使う上での注意点

# はじめに
DOMのバウンディングボックスなどを取得する場合、`hooks`の`useRef`を使いたいケースがあります。しかし、下位のコンポーネントにそれらの情報を渡す場合などは、注意が必要になります。

# 例
次のようにメッセージの右下にいいねボタンを表示したいとします。
<img width="146" alt="スクリーンショット 2020-05-23 10.21.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200228/bd592d64-80d5-cd5d-6cb0-46118488c104.png">

# うまくいかないパターン
`ThumbsUp`コンポーネントに対してボタン位置の基準となる`HTMLElement`を渡し、`ThumbsUp`にてボタンの表示位置を求めています。

```tsx:App.tsx
import React, { useRef } from "react";
import ThumbsUp from "./ThumbsUp";
import "./styles.scss";

export default function App() {
  const ref = useRef<HTMLSpanElement | null>();
  return (
    <div>
      <span ref={ref} className="baloon">
        こんにちは
      </span>
      {ref.current && (
        <ThumbsUp anchor={ref.current} />
      )}
    </div>
  );
}

```
```tsx:ThumbsUp.tsx
import React, { useRef, useEffect } from "react";
import "./styles.scss";

type Props = {
  anchor: HTMLElement;
};
export default function Portal({ anchor }: Props) {
  const ref = useRef<HTMLDivElement | null>(null);
  useEffect(() => {
    if (ref.current) {
      const anchorRect = anchor.getBoundingClientRect();
      const position = {
        top: anchorRect.top + anchorRect.height - 20,
        left: anchorRect.left + anchorRect.width - 10
      };
      ref.current.style.top = `${position.top}px`;
      ref.current.style.left = `${position.left}px`;
    }
  }, [anchor]);
  return (
    <div ref={ref} className="thumbs-up">
      <button>
        <span role="img" aria-label="thumbs-up">
          👍
        </span>
      </button>
    </div>
  );
}
```

# 何が起こるか
残念ながら、意図通りにいいねボタンが表示されません。
<img width="126" alt="スクリーンショット 2020-05-23 10.19.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200228/acc17c31-d955-896b-be60-22b9bf127179.png">
これは[公式](https://ja.reactjs.org/docs/hooks-reference.html)にも記載されていますが、`App.tsx`において、`ref.current`が置き換わっても再レンダーは発生しないためです。そのため、`ThumbsUp`はレンダリングされないままの状態となっています。

# 解決策
コールバック式の`ref`と`useState`を使うことで解決することができます。下のように`span`の`ref`に関数を与えることで、`setAnchor`が呼ばれたタイミングで再レンダーを発生させ、意図通り`ThumbsUp`をレンダリングできるようになります。

```tsx:App.tsx
import React, { useState } from "react";
import ThumbsUp from "./ThumbsUp";
import "./styles.scss";

export default function App() {
  const [anchor, setAnchor] = useState<HTMLSpanElement>();
  return (
    <div>
      <span
        ref={elm => { // コールバック関数を与える
          setAnchor(elm);
        }}
        className="baloon"
      >
        こんにちは
      </span>
      {anchor && <ThumbsUp anchor={anchor} /> }
    </div>
  );
}
```
【AngularMaterial】Datepickerをカレンダーからの入力だけ受け付けるようにする

input部分の入力は不可にして、カレンダーからのみの受付にしたいとき

```html
<mat-form-field>
  <mat-label>Choose a date</mat-label>
  <input matInput [matDatepicker]="picker" readonly (click)="picker.open()" />
  <mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
  <mat-datepicker #picker></mat-datepicker>
</mat-form-field>
```
readonlyでinputへの入力をできなくする
(click)でカレンダーを開く。
Javaのtrueとfalse

###trueとfalse
真偽値のデータ型はbooleanです。

```Main.java
class Main {
  public static void main(String[] args) {
    int number = 5;
  }
  if (isEven(number)) {
    System.out.println(number + "偶数");
  } else {
    System.out.println(number + "奇数");
  public static boolean isEven(int a) {
    return a % 2 == 0;
  }
}
```
上記はisEvenメソッドは引数の値が偶数かどうかを調べ、偶数であればtrue、奇数であればfalseを返します。
Docker × Mysqlでユーザー作成出来ない

# 概要
Docker環境でMysqlを使用する際、`docker-compose.yml`に記載した環境変数が反映されず、作業ユーザーを作成出来ないエラーに遭遇しました。

### docker-compose.yml
~~~yml
version: "3.7"

services:

  ~~~省略~~~

  db:
    container_name: db
    build:
      context: ./db
      dockerfile: Dockerfile
    ports:
      - ${DB_PORT}:3306
    environment:
      MYSQL_DATABASE: ${DB_NAME}　　　   # 作成するデータベース名
      MYSQL_USER: ${DB_USER}            # 作業ユーザー名→上記データベースの捜査権限をもつ
      MYSQL_PASSWORD: ${DB_PASS}        # 作業ユーザーのパスワード
      MYSQL_ROOT_PASSWORD: ${ROOT_PASS} # rootユーザーのパスワード
      TZ: ${TZ}
    volumes:
      - db-data:/var/lib/mysql
      - ./db/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
      - ./db/mysql/init:/docker-entrypoint-initdb.d
      - ./log:/var/log/mysql

volumes:
  db-data:
    driver: local
~~~

### Dockerfile
~~~dockerfile
FROM mysql:8.0
EXPOSE 3306
~~~

# そもそもなぜ作業ユーザーを作成するか？
下記記事参照。
・[【MySQL】ユーザーの作成方法について解説！](https://qiita.com/wakahara3/items/28628ba2e3a3d529aec8)

# 原因
前作業でrootユーザーのみでdocker構築をしており、volume機能でデータが永続化していたため、後作業で記述した環境変数が反映されていないというものでした。

ビルドし直しても反映されない！そもそも消えることがないようにvolume機能を使用していたのに・・・

# 解決
### MySQLのデータを初期化
~~~
$ docker-compose down --volumes
$ docker-compose up -d
~~~
`down`コマンド時に`--volumes`オプションを追記すれば、volumeも一緒に削除されます。
次回`up`コマンドで起動すれば、新しいvolumeが再構築されます。
マクロのこのプログラムの意味を教えてください。

Option Explicit
Dim Kazua As Long, Kazub As Long

Private Sub UserForm_Initialize ()
TextBox1.Text
TextBox2.Text
Label1. Caption = ””
Labe12. Caption = ””
End Sub

Private Sub わり算_Click ()
Dim Syo As Long, Amari As Long
Kazua = Val (TextBox1.Text)
Kazub = ※ (Text Box2.Text)
Syo = Kazua \ Kazub
Amari = Kazua Mod Kazub
Label1. Caption Str (Syo)
Label2. Caption =  ※ (Amari)
End Sub
※は解答不要

Private Sub 処理終了＿Click ()
End
End Sub
算法的时间与空间复杂度

算法（Algorithm）是指用来操作数据、解决程序问题的一组方法。对于同一个问题，使用不同的算法，也许最终得到的结果是一样的，但在过程中消耗的资源和时间却会有很大的区别。

那么我们应该如何去衡量不同算法之间的优劣呢？

主要还是从算法所占用的「时间」和「空间」两个维度去考量。

时间维度：是指执行当前算法所消耗的时间，我们通常用「时间复杂度」来描述。
空间维度：是指执行当前算法需要占用多少内存空间，我们通常用「空间复杂度」来描述。
因此，评价一个算法的效率主要是看它的时间复杂度和空间复杂度情况。然而，有的时候时间和空间却又是「鱼和熊掌」，不可兼得的，那么我们就需要从中去取一个平衡点。

下面我来分别介绍一下「时间复杂度」和「空间复杂度」的计算方式。

一、时间复杂度
我们想要知道一个算法的「时间复杂度」，很多人首先想到的的方法就是把这个算法程序运行一遍，那么它所消耗的时间就自然而然知道了。

这种方式可以吗？当然可以，不过它也有很多弊端。
这种方式非常容易受运行环境的影响，在性能高的机器上跑出来的结果与在性能低的机器上跑的结果相差会很大。而且对测试时使用的数据规模也有很大关系。再者，并我们在写算法的时候，还没有办法完整的去运行呢。

因此，另一种更为通用的方法就出来了：「 大O符号表示法 」，即 T(n) = O(f(n))

我们先来看个例子：

for(i=1; i<=n; ++i)
{
   j = i;
   j++;
}
通过「 大O符号表示法 」，这段代码的时间复杂度为：O(n) ，为什么呢?

在 大O符号表示法中，时间复杂度的公式是： T(n) = O( f(n) )，其中f(n) 表示每行代码执行次数之和，而 O 表示正比例关系，这个公式的全称是：算法的渐进时间复杂度。

我们继续看上面的例子，假设每行代码的执行时间都是一样的，我们用 1颗粒时间 来表示，那么这个例子的第一行耗时是1个颗粒时间，第三行的执行时间是 n个颗粒时间，第四行的执行时间也是 n个颗粒时间（第二行和第五行是符号，暂时忽略），那么总时间就是 1颗粒时间 + n颗粒时间 + n颗粒时间 ，即 (1+2n)个颗粒时间，即： T(n) = (1+2n)*颗粒时间，从这个结果可以看出，这个算法的耗时是随着n的变化而变化，因此，我们可以简化的将这个算法的时间复杂度表示为：T(n) = O(n)

为什么可以这么去简化呢，因为大O符号表示法并不是用于来真实代表算法的执行时间的，它是用来表示代码执行时间的增长变化趋势的。

所以上面的例子中，如果n无限大的时候，T(n) = time(1+2n)中的常量1就没有意义了，倍数2也意义不大。因此直接简化为T(n) = O(n) 就可以了。

常见的时间复杂度量级有：

常数阶O(1)
对数阶O(logN)
线性阶O(n)
线性对数阶O(nlogN)
平方阶O(n²)
立方阶O(n³)
K次方阶O(n^k)
指数阶(2^n)
上面从上至下依次的时间复杂度越来越大，执行的效率越来越低。

下面选取一些较为常用的来讲解一下（没有严格按照顺序）：

常数阶O(1)
无论代码执行了多少行，只要是没有循环等复杂结构，那这个代码的时间复杂度就都是O(1)，如：

int i = 1;
int j = 2;
++i;
j++;
int m = i + j;
上述代码在执行的时候，它消耗的时候并不随着某个变量的增长而增长，那么无论这类代码有多长，即使有几万几十万行，都可以用O(1)来表示它的时间复杂度。

线性阶O(n)
这个在最开始的代码示例中就讲解过了，如：

for(i=1; i<=n; ++i)
{
   j = i;
   j++;
}
这段代码，for循环里面的代码会执行n遍，因此它消耗的时间是随着n的变化而变化的，因此这类代码都可以用O(n)来表示它的时间复杂度。

对数阶O(logN)
还是先来看代码：

int i = 1;
while(i<n)
{
    i = i * 2;
}
从上面代码可以看到，在while循环里面，每次都将 i 乘以 2，乘完之后，i 距离 n 就越来越近了。我们试着求解一下，假设循环x次之后，i 就大于 2 了，此时这个循环就退出了，也就是说 2 的 x 次方等于 n，那么 x = log2^n
也就是说当循环 log2^n 次以后，这个代码就结束了。因此这个代码的时间复杂度为：O(logn)

线性对数阶O(nlogN)
线性对数阶O(nlogN) 其实非常容易理解，将时间复杂度为O(logn)的代码循环N遍的话，那么它的时间复杂度就是 n * O(logN)，也就是了O(nlogN)。

就拿上面的代码加一点修改来举例：

for(m=1; m<n; m++)
{
    i = 1;
    while(i<n)
    {
        i = i * 2;
    }
}
平方阶O(n²)
平方阶O(n²) 就更容易理解了，如果把 O(n) 的代码再嵌套循环一遍，它的时间复杂度就是 O(n²) 了。
举例：

for(x=1; i<=n; x++)
{
   for(i=1; i<=n; i++)
    {
       j = i;
       j++;
    }
}
这段代码其实就是嵌套了2层n循环，它的时间复杂度就是 O(n*n)，即 O(n²)
如果将其中一层循环的n改成m，即：

for(x=1; i<=m; x++)
{
   for(i=1; i<=n; i++)
    {
       j = i;
       j++;
    }
}
那它的时间复杂度就变成了 O(m*n)

立方阶O(n³)、K次方阶O(n^k)
参考上面的O(n²) 去理解就好了，O(n³)相当于三层n循环，其它的类似。

除此之外，其实还有 平均时间复杂度、均摊时间复杂度、最坏时间复杂度、最好时间复杂度 的分析方法，有点复杂，这里就不展开了。

二、空间复杂度
既然时间复杂度不是用来计算程序具体耗时的，那么我也应该明白，空间复杂度也不是用来计算程序实际占用的空间的。

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的一个量度，同样反映的是一个趋势，我们用 S(n) 来定义。

空间复杂度比较常用的有：O(1)、O(n)、O(n²)，我们下面来看看：

空间复杂度 O(1)
如果算法执行所需要的临时空间不随着某个变量n的大小而变化，即此算法空间复杂度为一个常量，可表示为 O(1)
举例：

int i = 1;
int j = 2;
++i;
j++;
int m = i + j;
代码中的 i、j、m 所分配的空间都不随着处理数据量变化，因此它的空间复杂度 S(n) = O(1)

空间复杂度 O(n)
我们先看一个代码：

int[] m = new int[n]
for(i=1; i<=n; ++i)
{
   j = i;
   j++;
}
这段代码中，第一行new了一个数组出来，这个数据占用的大小为n，这段代码的2-6行，虽然有循环，但没有再分配新的空间，因此，这段代码的空间复杂度主要看第一行即可，即 S(n) = O(n)

知乎
https://zhuanlan.zhihu.com/p/50479555
how to get search item with v-data-table

# 環境
vuetify 2.2.26

# :o: 修正後
```vue

<template>
...
  <v-data-table
    :search="search"
    ref="refTable"
  >
...
</template
<script>
...
console.log(this.$refs.refTable.internalCurrentItems)
...
</script>
```

# :x: 修正前
```vue

<template>
...
  <v-data-table
    :search="search"
    ref="refTable"
  >
...
</template
<script>
...
console.log(this.$refs.refTable.items)
...
</script>
```

# 参考
https://github.com/vuetifyjs/vuetify/issues/8731#issuecomment-532632255

> this.$refs.tableRefName._data.internalCurrentItems が返すのは
私が見ている現在のテーブルページのフィルタリングされたアイテム。

# 経緯
https://kajirikajiri.hatenablog.com/entry/2020/05/23/115848
vuexfireでbindFirestoreRefすると、idのenumerable属性がfalseになる問題

備忘録を兼ねて

## 問題点

[Vuexfireのドキュメンテーション](https://vuefire.vuejs.org/vuexfire/binding-subscriptions.html#key-id)に以下の記述があります。
>Any document bound by Vuexfire will retain it's id in the database as a non-enumerable, read-only property. 

bindしたデータをそのままviewから呼び出すのであれば、enumerable属性の真偽に関わらず```data.id```でidプロパティにアクセスできるので問題が生じません。しかし、Object.entries等にObjectを渡した際は検出してくれません。


```javascript:vuex.js
const db = firebaseApp.firestore();

state = { data: null } // -> { value: 'hoge', id: 'fuga' }
// idはenumerable: falseとして保存されている

actions = {
  bindData: firestoreAction(async ({ bindFirestoreRef }) => {
    return bindFirestoreRef('data', db.collection('hoge'));
  }),
}
```
```javascript:index.js

for (let [key, value] of Object.entries(this.$store.state.data)) {
  console.log(`${key}: ${value}`); // -> { value: 'hoge' }
}

```

この仕様は、例えばObjectをcomposition-API等に通した際などに問題となり得ます。


```javascript:main.vue

setup(props, context) {
  const data = ref(context.root.$store.state.data);
  console.log(data.value) // -> { value: 'hoge' }
}

```


## 解決法
さて、[VuexfireのAPIReference](https://vuefire.vuejs.org/api/vuexfire.html#firestoreaction)に次の記述があります

> options can contain 
> ```serialize```: a function to provide a custom serialization strategy when a document from firebase is set on the Vue instance. This allows to customize the id key, to transform data, etc. 

さらに[VuefireのReference](https://vuefire.vuejs.org/api/vuefire.html#firestoreplugin)を辿ると次のように記述されています

> ```options.serialize```: The function receives a DocumentSnapshot
as its first argument and is expected to return a plain object to be set on the Vue Instance. Here is the default function that is used when no override is provided:

これに従って```serialize```関数を定義し、callbackとして```bindFirestoreRef```に渡すと```enumerable```属性が```true```になってくれます。

```javascript:vuex.js
const serialize = (snapshot: firestore.DocumentSnapshot) => {
  return Object.defineProperty(snapshot.data(), 'id', {
    value: snapshot.id,
    enumerable: true,
  });
};
actions = {
  bindData: firestoreAction(async ({ bindFirestoreRef }) => {
    return bindFirestoreRef('data', db.collection('hoge'), { serialize });
  })
}
```

```javascript:main.vue

setup(props, context) {
  const data = ref(context.root.$store.state.data);
  console.log(data.value) // -> { value: 'hoge', id: 'fuga' }
}

```
jupyterで仮想環境の切り替えを行う

#1 この記事は

pythonを使用するときに、pythonのversionを切り替えたい場面が出てくると思います。jupyterの仮想環境を使いpythonのversionを切り替えることが便利なのですが、環境設定にはまったのでメモです。


環境
windows10 
anacondaインストール済

#2 内容

jupyterで仮想環境を作る方法は下記記事に記載があります。

https://qiita.com/yoppe/items/38005f415a5b8b884c7d

ただし、この記事の通りに行うと仮想環境に切り替えたときにwin32apiがimportできないとエラーがでてしまいます。「pip install pywin32」にてwin32apiをインストールするとOKです。

スタートメニューからAnaconda promptを立ち上げます。
<img width="301" alt="78.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/809977df-54bc-776a-5975-f51b817bc241.jpeg">


Anaconda prompt起動後、下記のコマンドを入力してください。

```console:
(base) C:\Users\fdfpy>activate python355　　#仮想環境python355に切り替え
(python355) C:\Users\fdfpy>pip install pywin32  #win32apiのインストール
```
追記(20210912) jupyter上で本環境と仮想環境の切り替えの環境を構築する場合、下記を実施することが必要

https://qiita.com/tomochiii/items/8b937f15c79a0c3eae0e
GAE/ActiveStorage/wicked_pdf/image_tagが機能しない

# 環境
- rails 5.2
- ruby 2.5
- ActiveStorageの保存先としてGCS（Google Cloud Storage)
- htmlのPDF化にwicked_pdf
- Bank Model にstampをattach

# 問題
- image_tag
- wicked_pdf_image_tag

共に画像を表示できない？
wicked_pdfがGCSへ直接アクセスできない？

# 結論
画像をGCSからローカル（今回の場合はGAE）のtmpファイルへダウンロードしてからPDFを生成する。

Step1　ヘルパーに以下を追記

```application_helper.rb
  def wicked_image_active_storage_workaround(　stamp )
    if stamp.is_a? ActiveStorage::Attachment
      save_path = Rails.root.join( "tmp", "#{stamp.id}.jpg")
      File.open(save_path, 'wb') do |file|
        file << stamp.blob.download
      end
      return save_path.to_s
    end
  end

```

Step2　PDFのViewでヘルパーを使用

```view.pdf.erb
image_tag(wicked_image_active_storage_workaround(@bank.stamp.attachment)

```

STEP3 tmpファイルのデータを削除(after_actionを使用）

```controller.rb
after_action :tmp_stamp_clear

  def tmp_stamp_clear
    if File.exist?(Rails.root.join( "tmp", @bank.stamp.blob.filename.to_s))
      File.delete(Rails.root.join( "tmp", @bank.stamp.blob.filename.to_s))
    end
  end
```
#試して失敗したこと

以下の内容を試す
①image_tagへ直接書き込む
image_tag(ActiveStorage::Blob.service.send(:path_for, @bank.stamp.blob.key)
ローカル→OK
GAE→NG(
`ActionView::Template::Error (undefined method path_for' for #<ActiveStorage::Service::GCSService:,,,,,,,,>):"`

②HTML imgへ直接書き込む

```view.html
<img src="<%= file.service_url %>">
```
→うまくいかない


# 参考URL
https://github.com/mileszs/wicked_pdf/issues/716
【Swift】QRコードを読み取って文字列を取得する

簡単に実装したサンプルです。参考になると幸いです。
[asa08/QRreader](https://github.com/asa08/QRreader)

## カメラを設定する
`import AVFoundation`して、`AVCaptureSession`をインスタンスを生成します。

```swift
private let session = AVCaptureSession()
```
次に、カメラの設定を行います。

```swift
// カメラの設定
// 今回は背面カメラなのでposition: .back
let discoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInWideAngleCamera], mediaType: .video, position: .back)

let devices = discoverySession.devices
if let backCamera = devices.first {
   do {
      // カメラでQRの読み取りに成功した時の処理
      let deviceInput = try AVCaptureDeviceInput(device: backCamera)
      doInit(deviceInput: deviceInput)
   } catch {
      print("Error occured while creating video device input: \(error)")
   }
}
```
`doInit()`の中でデコードを行います。

```swift
private func doInit(deviceInput: AVCaptureDeviceInput) {
    if !session.canAddInput(deviceInput) { return }
    session.addInput(deviceInput)
    let metadataOutput = AVCaptureMetadataOutput()
        
    if !session.canAddOutput(metadataOutput) { return }
    session.addOutput(metadataOutput)
        
    metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
    metadataOutput.metadataObjectTypes = [.qr]
    
    // カメラを起動
    let previewLayer = AVCaptureVideoPreviewLayer(session: session)
    previewLayer.frame = view.bounds
    previewLayer.videoGravity = .resizeAspectFill
    caputureView.layer.addSublayer(previewLayer)
        
    session.startRunning()
}

func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
        
   for metadata in metadataObjects as! [AVMetadataMachineReadableCodeObject] {
       // QRのtype： metadata.type
       // QRの中身： metadata.stringValue
       guard let value = metadata.stringValue else { return }
            
       session.stopRunning()
       textLavel.text = value
       caputureView.isHidden = true
   }
}
```
これでカメラで読み取ったQRから文字列を取得することができます。
フォルダ内のCSVファイルを一括でDBに取り込む

GTFS-JPを取り込む際、フォルダ内のCSVファイルをすべてDB(PostgreSQL)に取り込む必要性に駆られました。

バイト先の方が、Pandasに取り込んでからDBにそのまま入れられると教えてくださったので、その時のメモです。

```
├─csv_importer.py
└─GTFS
  ├─file1.csv
  └─file2.csv
```

#### csv_importer.py

```
import pandas as pd
import glob
from sqlalchemy import create_engine

engine = create_engine('DB接続用文字列')
file_list = glob.glob("./GTFS/*")

for filename in file_list:
    print(filename[7:])
    df  = pd.read_csv(filename)
    df.to_sql(name=filename[7:],con=engine,if_exists='replace',index=None)
```
CCC: coding crash course (3) 

# 文字列(string)のいろいろな使い方

```python

# 文字列を定義する
A = 'Ichiro'

print(A)

# 文字列の連結

B = "Suzuki" 

C = A+B

print(C)

# 文字列の繰り返し。

say = "This is important."

say_two   = say*2
say_three = say*3

print(say)
print(say_two)
print(say_three)

print("-"*20)

# 長さを示す。

print( len(say) )
print( len(say_two) )
print( len(say_three) )

print("-"*20)


# 文字列の検索

D = "My name is Hideki Matsui."

print( "Is the word *is* included in D?")
print( "is" in D )


print( "Is the word *are* included in D?")
print( "are" in D )

print("-"*20)


# 要素を調べる

print(D[0])

print(D[5])

print(D[10])

print(D[15])

print(D[5:15]) # slice

```


# リスト(list)のいろいろな使い方(1) 


```python

A = [1,2,3,4,5]


print(A[0])

print(A[2])

print(A[-1])

print(A[1:3]) # "slice"

print(A)


B = [100,101,102]


print( A + [100,101,102] )

print( A + [100,] )

print( A + [100] ) 

print(A)

# これはできない：
# print(A + 100) 

# append も使える。
A.append(100)

# extend というのもある。
A.extend([200,201,202])

print(A)


print('-'*20)


print(A)
print(A[2])

A[2] = 2020

print(A)
print(A[2])

print('-'*20)

del A[3] 

print(A)

print(A[3])


print('-'*20)


print( 1 in A )

print( 2 in A )

print( 3 in A )

print( 4 in A )

print( 5 in A )

print('++'*20)

print( 100 in A )

print( 101 in A )


print( 102 in A )


print('=='*20)

print( 2020 in A )

print('..'*20)


```

index メソッドでリストの要素の位置（住所）を調べることができる。

```python

list_names = ['Tom', 'Jack', 'Bob', 'Andy']

print(list_names.index('Jack'))

print(list_names.index('Andy'))

print(list_names.index('ANDY')) 
# これはうまくいかない。これはエラーを起こすので、if 文などを使って回避する。


if ( 'ANDY' in list_names):
    print( list_names.index('ANDY') )
else : 
    print( 'ANDY is an unknown name.')


if ( 'Jack' in list_names):
    print( list_names.index('Jack') )
else : 
    print( 'Jack is an unknown name.')





```
デフォルトユーザーアイコンをrailsで設定する

# この記事でやりたいこと

- userアイコンを設定していないユーザーにデフォルトユーザーアイコンを設定したい
- そのサイト内ならどこでも使えるようにしたい

# 全体設計

- application_helperにメソッドを記述
- 引数にuserを受け取り、user.imageがnilならデフォルト画像を表示するようにする

# application_helper.rbに記述

```ruby
  def user_icon_url(user)
    if user.nil?
      puts "ユーザー削除済み"
      user_icon_url = "/user_default_icon.png"
    elsif user.icon_url.blank?
      puts "アイコン画像なし"
      user_icon_url = "/user_default_icon.png"
    else
      puts "アイコン画像あり"
      user_icon_url = user.icon_url
    end
  end
```
CotEditorで改行なしの日付を挿入する

##CotEditorで日付を挿入するスクリプト

####"YYYYMMDD_"形式の日付を挿入する
#####サンプルスクリプト

```Python:sample.~@e.py
#!/usr/bin/env python
# *-# -*- coding: utf-8 -*-
# %%%{CotEditorXOutput=ReplaceSelection}%%%
from __future__ import print_function
import datetime

d=datetime.datetime.today()
print (d.strftime("%Y%m%d_"), end="")
```

###メモ
MacはデフォルトでPython2なので、Python3で処理できるプリント関数はそのままでは処理できない。

####改行ありでもいい場合
処理できるスクリプトは次の通り。でも、このスクリプトは改行を含んでしまう。改行して問題ないならこれでOK。

```Python:sample.~@e.py
print (d.strftime("%Y%m%d_")
```

####改行を省きたい場合
Python3のprint関数では、’end=""'をprint関数内に記述してあげれば改行を省くことが可能

```Python:sample.~@e.py
print (d.strftime("%Y%m%d_"), end="")
```

でもこのスクリプトはCotEditorで処理できない。
そこで、print関数をPython2でも処理できるように宣言すると、CotEditorでも改行なしで挿入できる。

```Python:sample.~@e.py
from __future__ import print_function
```
Javascript でランダムな正の整数を取得、(後半はくじ引きプログラム)

##Javascript でランダムな正の整数を取得



```Javascript:sample.js
// 0〜100のランダムな数字を取得する
var rand = Math.floor(Math.random() * 101);
```




**Math.random()**
0以上1未満の乱数を取得できます。
例) 0.7422




**Math.ﬂoor()**
これを用いることで小数点以下を切り捨てた数値を取得できます。
例) Math.ﬂoor(81.6398) → 81

複雑に感じますが簡単に言うと

**この2つを組み合わせることで「ランダムな正の整数を取得できる」**ことを覚えておきます。

##くじ引きプログラム

以上をふまえて「ifとelse」を使い、
0〜１のランダムな数字を取得し、
1の場合は当たりと表示
それ以外(今回の場合は事実上0の場合)は外れと表示させるプログラムを書いてみます。

```javascript:sample.js
// 0〜1のランダムな数字を取得
var rand = Math.floor(Math.random() * 2);
 
// 1の場合
if (rand === 1) {
   document.write('当たり');
// 1以外の場合
} else {
   document.write('外れ');
}
```
Nuxt.jsをVue.jsに解体するTips(Vuex編)

# 背景

- Nuxt.jsで動いているSPAアプリをVue.jsに解体してほしい的な話があり、部分部分をTipsとして投稿します。
- APIはLaravel(6.x)です。なおLaravelとNuxt.jsは同一リポジトリです(なぜ)
- Nuxt.jsは2.9。Vueは2.6.10
- 今回はVuex編です。

## まとめ

- nuxt/store/index.jsを解体する場合、`namespacedはfalse`
- nuxt/store/hoge.jsを解体する場合(index.js以外の場合)、`namespacedはtrue`

## nuxt/store/index.jsを解体する場合

### Nuxt.jsの場合

Nuxt.jsでは以下のコードだけで、よしなにやってくれます。

```nuxt/store/index.js
export const state = () => ({
~~省略~~
})

export const mutations = {
~~省略~~
}

export const actions = {
~~省略~~
}

export const getters = {
~~省略~~
}
```

### Vue.jsの場合

モジュール単位で分割して作成します。
ディレクトリ構造は下記のイメージです。

```
resources/js
├── App.vue
├── app.js
└── store
    ├── modules
    │   ├── hoge.js
    │   └── index.js
    └── store.js
```

#### resources/js/store/modules/index.jsの作成

```resources/js/store/modules/index.js
const state = () => ({
~~省略~~
})

const mutations = {
~~省略~~
}

const actions = {
~~省略~~
}

const getters = {
~~省略~~
}

export default {
  namespaced: false, //nuxt/store/index.jsを解体する場合、namespacedはfalseになります
  state: state(),
  getters: getters,
  actions: actions,
  mutations: mutations
}
```

#### resources/js/store/store.jsでVuexの設定をする

```resources/js/store/store.js
import Vue from 'vue'
import Vuex from 'vuex'
import index from '~/store/modules/index'

Vue.use(Vuex)

export default new Vuex.Store({
  modules: {
    index
  }
})
```

#### resources/js/app.jsでresources/js/store/store.jsを設定する

```resources/js/app.js
import Vue from "vue";
import App from '~/App.vue'
import store from '~/store/store'

new Vue({
  store,
  render: h => h(App),
}).$mount('#app')
```

## nuxt/store/hoge.jsを解体する場合(index.js以外の場合)

### nuxt/store/hoge.jsの中身は以下と仮定する

```nuxt/store/hoge.js
export const state = () => ({
~~省略~~
})

export const mutations = {
~~省略~~
}

export const actions = {
~~省略~~
}

export const getters = {
~~省略~~
}
```

### Vue.jsの場合のresources/js/store/modules/hoge.jsのコード

```resources/js/store/modules/hoge.js
const state = () => ({
~~省略~~
})

const mutations = {
~~省略~~
}

const actions = {
~~省略~~
}

const getters = {
~~省略~~
}

export default {
  namespaced: true, // nuxt/store/hoge.jsを解体する場合(index.js以外の場合)、namespacedはtrueになります
  state: state(),
  getters: getters,
  actions: actions,
  mutations: mutations
}
```

#### resources/js/store/store.jsでVuexの設定をする

```resources/js/store/store.js
import Vue from 'vue'
import Vuex from 'vuex'
import index from '~/store/modules/index'
import hoge from '~/store/modules/hoge'

Vue.use(Vuex)

export default new Vuex.Store({
  modules: {
    index,
    hoge
  }
})
```

#### resources/js/app.jsでresources/js/store/store.jsを設定する

```resources/js/app.js
import Vue from "vue";
import App from '~/App.vue'
import store from '~/store/store'

new Vue({
  store,
  render: h => h(App),
}).$mount('#app')
```

## 参考

- [Vuex公式ドキュメント](https://vuex.vuejs.org/ja/guide/modules.html)

## 関連リンク

- [Nuxt.jsをVue.jsに解体するTips(JavaScriptコンパイル編)](https://qiita.com/ProjectEuropa/items/824eb8e0902ee8d93178)
- [Nuxt.jsをVue.jsに解体するTips(Layout編)](https://qiita.com/ProjectEuropa/items/467f043b5ddf1f6c4cdb)
- [Nuxt.jsをVue.jsに解体するTips(Plugin編)](https://qiita.com/ProjectEuropa/items/a03dc1c01dda679d9c73)
Visual Studio 2019 Setup Porgram

セットアップをビルドすると、以下のエラーが発生します。対処方法をご教示頂きたく、よろしくお願いいたします。

ERROR: 'ieframe.dll' should be excluded because its source file 'C:\Windows\SysWOW64\ieframe.dll' is under Windows System File Protection.
mod_rewrite(.htaccess)記載例

##サブドメイン毎にhttpsでリダイレクト

```
# not https start
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^domain\.jp$
RewriteRule ^(.*)$ https://domain.jp/$1 [R=301,L]
	
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^sub\.domain\.jp$ [NC]
RewriteRule ^(.*)$ https://sub.domain.jp/$1 [R=301,L]	
# not https end
```


##特定のディレクトリのみリダイレクト
(開発段階では302リダイレクトにするのがみそ、
301にして間違っていたらブラウザキャッシュクリアするのが面倒)

```
RewriteEngine on
RewriteBase /
RewriteRule ^directory(.*)$ https://domain.jp/directory/ [R=302,L]
```
Django初学者の自分へ（2） - MTVとは -

## **チュートリアル一覧**
| No. | タイトル                                                        |    |
|-----|:---------------------------------------------------------------|---:|
| 1   | [Django初学者の自分へ（1） - プロジェクト・アプリ -](https://qiita.com/Yi-Gaoqiao/items/c5b41d22907016ae1d0f)             |   |
| 2   | **Django初学者の自分へ（2） - MTVとは -**                        |  ☆  |
| 3   | [Django初学者の自分へ（3） - こんにちわ世界！ -](https://qiita.com/Yi-Gaoqiao/items/e63be4937dff961c235b)                |    |
| 4   | [Django初学者の自分へ（4） - メモアプリ作成 -](https://qiita.com/Yi-Gaoqiao/items/d87408e173758672ed11)                  |    |

## **前回のおさらい**

[前回](https://qiita.com/Yi-Gaoqiao/items/c5b41d22907016ae1d0f)は下準備を整えました。 今回は早速コードを書いていこう！の前に Django の仕組みを簡単に整理しておきます。

## **レッツジャンゴ -MTVとは-**
そもそも *Django は Model - Template - View の大きく3つの役割から構成されており、これらの頭文字をとってMTVモデル、あるいはMTVフレームワークと呼ばれています。*  

- Model：データベースに格納するデータの定義を記述し、またデータベースからデータを取得します。（`models.py`）
- Template：テンプレートファイル（HTML）によってデザインされたページのデザインです。（`templates`）
- View：リクエストに応じてデータベースからデータを取得し、それを画面にどのように表示するか決定します。（`views.py`）

......？？  

これだけ読んでもイメージしづらいですよね。何を隠そう1か月前の僕はこれを理解するのに相当苦労していました。以下に簡単な図を示すので一緒に見ていきましょう。
![django_flow.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641843/85c5fdf3-3e3e-7ff3-c0de-3f3491dad582.png)

図について見ていきます。
#### 大まかな流れ  
1. あなた（クライアント）が `https://www.japanese-django.com/about` にアクセスします。（httpリクエスト）
2. `urls.py` では、あなたから要求された URL(**/about**) に応じて、どの **View (returnAboutPage())** で処理をするか決定し、処理を依頼します。
3. 処理を依頼された **returnAboutPage()** は、`models.py` で定義された **About** に関するデータをデータベースから取得します。それらのデータを適当な **Template(about.html)** に乗せ、画面に表示します。（レスポンス）

これらの一連の流れを経て、最終的にあなたは `https://www.japanese-django.com/about` の内容を見ることができたのでした。まだピンと来ていなくても大丈夫です。これから実際にコードを書いていく過程である日突然、「あぁ！！そういうことかあぁぁあ！！わかる！おれはわかるぞおぉ！」ってなります。
## **まとめ**
Django は **MTV モデル** を採用している。

- Model：データベースに格納するデータの定義とデータの取得。（`models.py`）
- Template：テンプレートファイル（HTML）によるページのデザイン。（`templates`）
- View：リクエストに応じた処理（画面にどのように表示するか）。（`views.py`）

[次回](https://qiita.com/Yi-Gaoqiao/items/e63be4937dff961c235b)は Django で「こんにちわ世界！」をやっていきます！

## **参考文献**
- [Techpit](https://www.techpit.jp/p/django-trello)
- [海外のサイト](http://blog.easylearning.guru/implementing-mtv-model-in-python-django/)
- [A-STAR](https://agency-star.co.jp/column/django/)
- [公式ドキュメント](https://docs.djangoproject.com/ja/3.0/contents/)
エディタで複数のファイルを簡単にコピーするコマンドをGoで作った

エディタを使って複数のファイルを簡単にコピーするコマンド[mcp](https://github.com/skanehira/mcp)を作りました。

![](https://i.imgur.com/2D9S6WW.gif)

このコマンドは[ファイルをエディターで一括リネームするツールをGo言語で作った！ ― 機能を増やさない信念と、OSSとの付き合い方](https://itchyny.hatenablog.com/entry/2020/01/10/100000)で`mmv`を知ってしばらく使っていたら、リネームではなくコピーもほしいなと思い作りました。

## 使い方
ファイル名を引数で渡すと`$EDITOR`に設定されているエディタが起動、ファイル名を編集して保存することで編集後のパスにファイルがコピーされます。
ファイル名だけではなく、ワイルドカードも使えます。

```sh
$ mcp *
```

コピー元がディレクトリの場合はそのディレクトリをまるごとコピーします。`cp -r`に相当します。

## さいごに
ブログに記載されている機能を増やさない信念は個人的にともて感銘を受けた言葉です。
これまでツールをいくつか作ってきましたが、どれも機能をたくさん盛り込んできました。一つのツールでなるべくたくさんのことができたほうがよいと思っていたからです。

しかし、ツールが多機能になっていくとその分メンテがめちゃくちゃ大変になっていきます。
便利さと大変さは比例するんだなってこのブログを読んでから気づきました。

今後は新しいものを作るとき、機能を増やさない信念を念頭に入れていこうと思います。
jQueryでパスワードの表示と非表示を切り替える

# はじめに
railsでアプリケーションを行っている初学者のいりふねです。
今回、ユーザー登録画面のパスワード入力欄の表示と非表示を切り替える実装を行いました。ネット上に「カンタン」と書かれた同記事が多くありましたが、自分の環境で実装するのは少し時間がかかりました。
そこで、アウトプット兼自分用メモとして私の環境でうまく動作した手順を書いていきます。

# 開発環境
- Rails 5.2.4.3
- Haml 5.1.2
- jquery-rails (4.4.0)
- form_forを使用して実装しています

# 実現すること
ユーザー登録画面などでデフォルトで非表示になっているパスワードをcheck_boxを使用して表示と非表示を切り替えます。具体的には、以下Gifのような状態を目指します。
![e177a528d227549c89344e4620d8b441.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614723/8accdf04-be27-4d0f-48b4-2ad77c9e26e2.gif)

# 手順
1. check_boxの設置
1. password_fieldにidを付与
1. jsファイルにjQueryを記述

# check_boxの設置
hamlファイルにcheck_boxを記述します。今回は、説明に不要なclass名などは予め外した状態にしています。cssなどをつけるときは別途設定して下さい。

```haml:example.html.haml
= form_for @user, url: user_registration_path do |f|

〜中略、password_fieldの記述などがあります〜

    %p
      = check_box_tag :passcheck
      = f.label "パスワードを表示する"
```

順番に説明します。
まず、pタグで囲ったのは、チェックボックスや「パスワードを表示する」という文字が、直上のpassword_fieldの右に回り込んでしまうためです。cssを編集することでカバーも可能でしょうが、pタグだけで解決するので、今回はこの方法を採用しました。

次に「check_box_tag」の部分です。これは、関連するモデルがない時のチェックボックスの書き方になります。他のフォームの記述に揃えて「= f.check_box」を使用すると、引数として保存先モデルのカラム名の記述が必須となってしまいます。今回のチェックボックスはレコードの保存が目的ではないので、「check_box_tag」を使用しました。

参考にさせていただいた記事[【初心者向け】チェックボックスの書き方あれこれ[Ruby][Rails]](https://azmengineer.hateblo.jp/entry/2019/07/13/153942)

同行後半の「:passcheck」は、nameとidを指定しています。検証ツールで確認すると反映されていることが分かります。idはこの後、jQueryで要素を指定するための使用します。
<img width="583" alt="スクリーンショット 2020-05-23 8.39.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614723/38e38a58-7e75-af6b-a16f-9b49536ac641.png">

# password_fieldにidを付与
password_fieldにjQueryで要素を指定するためのidを付与します。コードの後半部分がidを付与している箇所となります。

```haml:example.html.haml
〜省略〜
= f.password_field :password, autocomplete: "off", placeholder: "7文字以上の半角英数字", id: "js-password"
〜省略〜
= f.password_field :password_confirmation, autocomplete: "off", placeholder: "もう一度入力して下さい", id: "js-password_confirmation"
〜省略〜
```

ここで、idを同じものにしてしまうと、検証ツールのコンソール上で「idが重複しているよ!!」と黄色で警告が出てきます。ページが表示されないほどのエラーにはなりませんが、気持ち良いものではないので、今回はid名を分けて書きました。

# jsファイルにjQueryを記述
jsファイルを作成し、コードを記述します。

```javascript:example.js
$(function() {
  $('#passcheck').change(function(){
    if ($(this).prop('checked')) {
      $('#js-password').attr('type','text');
      $('#js-password_confirmation').attr('type','text');
    } else {
      $('#js-password').attr('type','password');
      $('#js-password_confirmation').attr('type','password');
    }
  });
});
```

実は、jQueryはまだ勉強中なので、十分説明ができません。汗
参考にされていただいた記事[パスワード表示時にマスキング有無を選択できるようにする方法](https://ajike.github.io/password-masking/)

とはいえ、自分なりに言語化してみます。
まずは、先程チェックボックスに指定したid名#passcheckで要素を取得し、changeイベントを設定します。ちなみにイベントはclickに変えても動きました。

次にif文を記述し、取得した要素からcheckedプロパティの有無をpropメソッドで確認します。チェックされていれば真、それ以外なら偽という扱いになります。

if結果が真の場合、つまりチェックが入った状態であれば、フォームに入力されたパスワードの値に対して、attrメソッドを使用して属性を取り出します。チェック済みならtype属性のtextを表示、そうでなければtype属性のpasswordを表示で隠すという具合です。

# 今日の積み上げ
改めて、jQueryの復習が必要であると感じました。
と同時に未熟な私でも機能実装できるようにわかりやすくまとめられた記事の多さに感謝しました。今後もアウトプットを続けて同じ初学者の方のためになればと思います。
yukicoder contest 249 参戦記

# yukicoder contest 249 参戦記

## [A 1057 素敵な日](https://yukicoder.me/problems/no/1057)

初日は前日に食べたケーキがないので素敵な日になりえない. なのでショートケーキとチョコケーキの数が違うのであれば多い方を初日に食べる. 後は交互に食べていけば良い.

```python
A, B = map(int, input().split())

if A == B:
    print(2 * A - 1)
else:
    print(min(A, B) * 2)
```

## [B 1058 素敵な数](https://yukicoder.me/problems/no/1058)

求める数が、 素数ではなく2以上10<sup>5</sup>以下の約数を持たないということなので、要するに10<sup>5</sup>より大きい素数2つの積の小さい順となる.

なので、適当にそういう素数を求め、

```python
>>> for i in range(10**5, 10**5+1000):
...   flag = True
...   for j in range(2, int(sqrt(i))+1):
...     if i % j == 0:
...       flag = False
...       break
...   if flag:
...     print(i)
...
100003
100019
100043
100049
100057
100069
100103
100109
100129
100151
...
```

その積を小さい順に求め、

```python
>>> result = []
>>> for i in [100003,100019,100043,100049,100057,100069,100103,100109,100129,100151]:
...   for j in [100003,100019,100043,100049,100057,100069,100103,100109,100129,100151]:
...     result.append(i*j)
...
>>> print(sorted(set(result))[:10])
[10000600009, 10002200057, 10003800361, 10004600129, 10005200147, 10006000171, 10006200817, 10006800931, 10007200207, 10007601083]
```

ソースコードに埋め込んでおしまい.

```python
N = int(input())

print([1, 10000600009, 10002200057, 10003800361, 10004600129, 10005200147, 10006000171, 10006200817, 10006800931, 10007200207][N - 1])
```

## [C 1059 素敵な集合](https://yukicoder.me/problems/no/1059)

突破できず.

まずコストは0か1である. なぜなら i, i + 1 の組はコスト1だからである. 後はエラトステネスの篩の要領でコストが0になるものを落とせば終わりかと思ったら実はそうではない. 例えば 2, 3, 6 があったとすると、2と3の組ではコストが1になってしまうが、3, 6 の組でコスト0で3を消して、2, 6 の組でコスト0で6を消すと、コスト0で素敵な集合を達成できる. つまり共通の公倍数を持つもの同士もコスト0で消せるのだ. となると Union Find で Union がいくつあるかという問題に帰着し、それで解ける.

```python
from sys import setrecursionlimit


def find(parent, i):
    t = parent[i]
    if t < 0:
        return i
    t = find(parent, t)
    parent[i] = t
    return t


def unite(parent, i, j):
    i = find(parent, i)
    j = find(parent, j)
    if i == j:
        return
    parent[i] += parent[j]
    parent[j] = i


setrecursionlimit(10 ** 6)

L, R = map(int, input().split())

parent = [-1] * (R + 1)
for i in range(L, R):
    if find(parent, i) != i:
        continue
    for j in range(i * 2, R + 1, i):
        unite(parent, i, j)
print(sum(1 for i in range(L, R + 1) if find(parent, i) == i) - 1)
```
bashで複数ファイルを配列に入れる。($())と括弧に入れてねー。

## 目的
- 複数のファイルをbashの配列に入れてファイル名を取り出す方法です。
- 背景：複数の処理を行っていて、例えば巨大なMP3を時間分割して、それをWAVに変換して、WAVからFFTに変換して、そのFFTを元にスペクトログラムのpngに変換してと、中間ファイルがいっぱいできます。この時に処理がどこまで進んだのかを別のプロセスからチェックしたくなりました。そのため拡張子毎のファイル数を勘定しようと思いました。また、このリストをJavascriptに渡したいので配列として取り出したかったです。
- シェルスクリプトらしさにこだわる議論は下記にありますが、動くコードこそ正しいとも思います。適材適所で。

## 参考

- [ファイルの検索結果を配列に入れる方法](https://teratail.com/questions/91192)
- [配列を使用する](#https://shellscript.sunone.me/array.html#配列に値を設定する")


## 確かめた環境
- centOS7/bash 4.2
- MacOS Darwin Kernel Version 19.4/bash: 5.0

## できたコード
```{bash}
list_png=($(find . -name "*.png"))
# ファイルがあると分かっているときはこちらでもいいです。
list_png=($(ls -1 "*.png"))
```
### 説明
- ポイントはコマンドを実行する`$()`を`()`で包むだけです。
- `()`に囲むことで配列に入れられます。これに気がつくまでに３０分悩みましたのでお裾分けです。
- `ls -1`はファイルをそれぞれ１行に出力するオプションです。`ls`はソートして出力するので`find`よりも遅いですが、ソートさせない場合には`ls -U`とかすればいい様です。

## 検証

```{bash}
$ ls -1 190427_18*png
190427_180000-180400.png
190427_180400-180800.png
...
190427_185600-190000.png
$ list_png=($(ls -1 190427_18*png))

# 確認します
$ echo ${list_png[*]}
190427_180000-180400.png 190427_180400-180800.png 190427_180800-181200.png 190427_181200-181600.png 190427_181600-182000.png 190427_182000-182400.png 190427_182400-182800.png 190427_182800-183200.png 190427_183200-183600.png 190427_183600-184000.png 190427_184000-184400.png 190427_184400-184800.png 190427_184800-185200.png 190427_185200-185600.png 190427_185600-190000.png

# ファイル数を確認します
$ echo ${#list_png[*]}
15
# 勿論こっちがシェル的
$ ls -1 190427_18*png | wc -l
15

# ファイル名を取り出します。配列は０から始まります。
$ echo ${list_png[0]}
190427_180000-180400.png
$ echo ${list_png[1]}
190427_180400-180800.png

#ブレースがないと一番最初のファイルだけ表示されました。
$ echo $list_png
190427_180000-180400.png 

#配列の最大値は個数-1です
$ echo ${list_png[14]}
190427_185600-190000.png

# 個数の値を入れても空を出力しますがエラーは起こっていないです。
$ echo ${list_png[15]}

$ echo $?
0

# lsはファイルがないとエラーが起こります。set -xの設定していると止まってしまいますのでfindを使う方がいいです。
$ ls *AAA
ls: %Aにアクセスできません:そのようなファイルやディレクトリがありません
$ echo $?
2

# findは異常終了エラーを返しません
$ find . -name "*AAA"
$

$ echo $?
0
```

どなたのお役に立てれば嬉しいです。
docker imageの削除方法

#はじめに
不要なimageはリソースのムダ使いに繋がる為、削除方法を忘備録として記載。

#前提条件
削除対象のDocker image:`centos`

#Docker image削除手順
###1.Docker image IDを確認する

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              470671670cac        4 months ago        237MB
```
IMAGE IDに表示されている`470671670cac`が今回の削除対象の**Docker image**

```
IMAGE ID
470671670cac　//←このIMAGE IDを指定する
```
###2.Docker imageの削除
Docker imageの削除は下記コマンドで実行可能


```
//$ docker rmi {削除対象のIMAGE ID}
$ docker rmi 470671670cac
Untagged: centos:latest
Untagged: centos@sha256:fe8d824220415eed5477b63addf40fb06c3b049404242b31982106ac204f6700
Deleted: sha256:470671670cac686c7cf0081e0b37da2e9f4f768ddc5f6a26102ccd1c6954c1ee
Deleted: sha256:0683de2821778aa9546bf3d3e6944df779daba1582631b7ea3517bb36f9e4007
```
Deletedと表示されていれば完了

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
```

#※以下のようにエラーが表示される場合
停止中のコンテナが利用しているimageのためエラーとなる為、先に停止中のコンテナを削除する必要がある

```
$ docker rmi 470671670cac
Error response from daemon: conflict: unable to delete 470671670cac (must be forced) - image is being used by stopped container 1ba05d50c062
```
###停止中のコンテナIDを確認する
`$ docker ps`だと停止中のコンテナは表示されない

```
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```
`$ docker ps`に`-a`をオプションをつけることで停止中のコンテナも表示することが可能

```
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
124b0dcc686a        centos              "/bin/bash"         32 minutes ago      Exited (0) 32 minutes ago                       practical_ptolemy
```
下記コンテナIDが削除対象のコンテナID

```
CONTAINER ID
124b0dcc686a //←このCONTANER IDを利用する
```


###コンテナの削除
以下の方法で停止中のコンテナを削除することが可能

```
//$ docker rm {{CONTAINER ID}}
$ docker rm 124b0dcc686a
124b0dcc686a //←上手くいくとCONTANER IDが表示される
```
###改めてDocker imageの削除再実行
```
$ docker rmi 470671670cac
Untagged: centos:latest
Untagged: centos@sha256:fe8d824220415eed5477b63addf40fb06c3b049404242b31982106ac204f6700
Deleted: sha256:470671670cac686c7cf0081e0b37da2e9f4f768ddc5f6a26102ccd1c6954c1ee
Deleted: sha256:0683de2821778aa9546bf3d3e6944df779daba1582631b7ea3517bb36f9e4007
```
Deletedと表示されていれば完了

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
```
Windows 版の TinyGo で SAMD5x CPU の浮動小数点演算でクラッシュする問題への対策

2020/08/06 追記
本件は TinyGo 0.14 で修正されました。
以下は記録として残します。

----


Windows 版の TinyGo のみ SAMD5x の浮動小数点演算を使おうとするとクラッシュします。

この記事の対象は今のところ、 Windows 版の 0.12 ～ 0.13.x です。
他 OS 版はもともとクラッシュしないはずです。
この問題はおそらく TinyGo 0.14 で修正されますが、それまでの間の対策を記載します。

# 対策

以下のいずれかの対策をすることで、クラッシュしなくなります。


## 対策 1 : FPU を有効にする

以下を好きなファイル名 (*.go) で main パッケージのディレクトリに置いてください。
main() 関数が始まる前に FPU を有効化するコードが処理されクラッシュしなくなります。
ビルドする対象のプロジェクト毎に実施する必要があります。

gits にも置きました。
https://gist.github.com/sago35/95c2213093ac3565865be310e5c432a2

```go:enablefpu.go
// +build atsamd51

// Put this file in the main package directory
// https://github.com/tinygo-org/tinygo/issues/944#issuecomment-597065613
// http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0439b/BEHBJHIG.html

package main

import (
	"runtime/volatile"
	"unsafe"
)

func init() {
	enableCortexM4FPU()
}

func enableCortexM4FPU() {
	cpacraddr := (*uint32)(unsafe.Pointer(uintptr(0xE000ED88)))
	tmp := *cpacraddr
	tmp |= (0xF << 20)
	volatile.StoreUint32(cpacraddr, tmp)
}
```

## 対策 2 : `-mfloat-abi=soft` の設定をする

他の環境 (linux や macOS や docker) と同じバイナリを生成できます。
公式にこの設定が有効になるのはおそらく tinygo 0.14 になってからだと思われます。

ただ、自前で LLVM と tinygo.exe をビルドする必要があるので現実的には厳しいと思います。

以下の PR にて対策が行われつつあります。

* arm: make FPU configuraton consistent
    * https://github.com/tinygo-org/tinygo/pull/1105

# 原因

※本項目は読み飛ばして OK です

原因をざくっと書くと、

* Windows 版は LLVM 自前ビルドしていて `-mfloat-abi=soft` がデフォルトオプションになっていない
    * linux や macos はバイナリインストール版の LLVM を使っていてデフォルトとなっている
* ARM マイコン上の設定で FPU を有効にしていない状態で、 FPU を使った浮動小数点演算を実施する

という組み合わせになっているため、です。
FPU を使うコード (例: `x += 0.1` 等) があった場合に、 FPU を有効にしていないのに FPU を使おうとするためクラッシュします。

詳細は以下の Issue / PR に記載されていますので、気になる人は読んでみてください。

* SAM D5x based boards crash when using floating point operations
    * https://github.com/tinygo-org/tinygo/issues/944
* runtime: Enable FPU of SAM D5x
    * https://github.com/tinygo-org/tinygo/pull/1092
* arm: make FPU configuraton consistent
    * https://github.com/tinygo-org/tinygo/pull/1105

# まとめ

とりあえずは、 `enablefpu.go` を置く対策をしておくと良いです。
tinygo 0.14 で修正されているとよいですね。
Windows10でフォルダアクセス権の無いユーザアカウントでアクセス権のあるコマンドを実行する方法

# 必要な場面

+ 社内で通常ユーザーのアカウントとフォルダアクセス権管理アカウントを２つ持っている
+ 普段は通常ユーザーでWindows10を利用する
+ フォルダアクセス権管理が必要な時だけ一時的にフォルダアクセス権のあるアカウントで作業がしたい

# 結論

　`runas`コマンドを使ってフォルダアクセス権のあるユーザーアカウントに一時的にログインし、ターミナルを起動します。

　こうして起動したターミナルからフォルダアクセス権の必要なコマンドを実行する事ができます。

## コマンド

```powershell:powershell書式
runas /user:adminUserAccount@xx.xxxx.co.jp cmd.exe
```
### 例

```powershell:powershell書式
runas /user:admin_taro@ad.teruroom.co.jp cmd.exe
```
パスワードを入力します

```powershell:powershell
admin_taro@ad.teruroom.co.jp のパスワードを入力してください:
```

以下のように表示され、アドミン権限のある新規ターミナルが起動します

```powershell:powershell
cmd.exe をユーザー "admin_taro@ad.teruroom.co.jp" として開始しています...
```
Ubuntu18.04でrmagickをインストールしようとしたらできなかった

備忘がてら・・・。

## 発生した問題

Gemfileに以下を追記して実行したらエラーが発生した。

```
gem 'rmagick'
```

```
No package 'MagickCore' found

ERROR: Can't install RMagick 4.1.2.
Can't find the ImageMagick library or one of the dependent libraries.
Check the mkmf.log file for more detailed information.
```

**MagickCore** が見つからないらしい。

ImageMagick自体はインストール済みだった。

```
 % convert --version
Version: ImageMagick 6.9.7-4 Q16 x86_64 20170114 http://www.imagemagick.org
```

## 解決策

[ここ](https://stackoverflow.com/questions/38200015/package-magickcore-was-not-found-in-the-pkg-config-search-path)に解決策があった

```
sudo apt-get install libmagickwand-dev
```

その後、 `bundle install` を実行したら無事にインストールができた。
kubectl exec -tiの-tiとは

- `-ti`=`-t -i`
    - `-t`: 擬似端末生成
    - `-i`: 標準入力を渡す
    - `-ti`: 標準入力を擬似端末に渡す

つまり、`-t`で対象コンテナに擬似端末を生成し、`-i`で標準入力を擬似端末に渡している。
リンクメモ: Microsoft Build での Blazor WebAssembly セッション

先日開催されていた [Microsoft Build](https://mybuild.microsoft.com/)では、盛り沢山の技術情報が紹介されていました。

このうち、注目の .Net Core の ASP 技術の一つ、Blazor WebAssembly のセッションのリンクメモを貼っておきます。

[Microsoft Build での Blazor WebAssembly の Lesson 一覧](https://mybuild.microsoft.com/sessions?t=%257B%2522from%2522%253A%25222020-05-20T00%253A00%253A00%252B09%253A00%2522%252C%2522to%2522%253A%25222020-05-21T23%253A59%253A00%252B09%253A00%2522%257D&q=blazor&s=%257B%2522name%2522%253A%2522translate.refine.label.sort.relevance%2522%252C%2522type%2522%253A0%257D)

7つのセッションが行われました。主に[Daniel Roth](https://mybuild.microsoft.com/speaker/9bf0c52b-69f2-495d-b506-62215c2fdaad?source=sessions)さんが説明や解説を行っておられます。

* [INT169A: Modern Web UI with Blazor WebAssembly](https://mybuild.microsoft.com/sessions/7e6c0b6e-36b9-4b9b-a409-a0960f67531f?source=sessions)
* [INT169B: Modern Web UI with Blazor WebAssembly](https://mybuild.microsoft.com/sessions/633bbb04-8020-4ea9-8543-b78d47cdf9b9?source=sessions)
* [INT169C: Modern Web UI with Blazor WebAssembly](https://mybuild.microsoft.com/sessions/658ef9b8-e436-407d-b4a7-79e8bc84f392?source=sessions)
* [BOD104: Modern Web UI with Blazor WebAssembly](https://mybuild.microsoft.com/sessions/420ccd3f-6570-4c58-91da-cd760c511171?source=sessions)
* [COM141: Learn Studio Session: Build a WebAssembly app with Blazor & VS Code](https://mybuild.microsoft.com/sessions/b6d02ab0-d1fd-441d-bcb3-8dec25bbc46a?source=sessions)
* [COM144: Learn Studio Session: Build a WebAssembly app with Blazor & VS Code](https://mybuild.microsoft.com/sessions/6e0f00fb-522e-4175-aa85-2a8137b8790a?source=sessions)
* [COM147: Learn Studio Session: Build a WebAssembly app with Blazor & VS Code](https://mybuild.microsoft.com/sessions/ffd09048-9a5c-4342-9400-42c2a85bfeae?source=sessions)

また、Microsoft Learn コンテンツとして、次のものが紹介されていました。環境準備や最初に何かをためしてみるなら、こちらから始めるといいと思います。

* [MS Learn: Blazor WebAssembly と VS Code を使用して Web アプリを構築する](https://docs.microsoft.com/ja-jp/learn/modules/build-blazor-webassembly-visual-studio-code/?ocid=AID3012652&WT.mc_id=Build2020_studiosession)

### 合わせて読みたい記事

* [ASP.NET Core Blazor WebAssembly をホストして展開する](https://docs.microsoft.com/ja-jp/aspnet/core/host-and-deploy/blazor/webassembly?view=aspnetcore-3.1)

dotnet new を実行する際の -ho オプションが紹介されています。-ho オプションを使うと、プロジェクト作成時に、3つのプロジェクト（Shared.csproj、Client.csproj、Server.csproj）が生成されます。

* [ASP.NET Core Blazor WebAssembly を使用してプログレッシブ Web アプリケーションをビルドする](https://docs.microsoft.com/ja-jp/aspnet/core/blazor/progressive-web-app?view=aspnetcore-3.1&tabs=visual-studio-code)

dotnet new での --pwa オプションが紹介されています。


INT169A で紹介されているサンプルプロジェクトをコマンドラインから作成する際は、次のようなオプションを使用します。

```bash
# dotnet new blazorwasm -au Individual -ho --pwa -o [プロジェクト名]
```
Gutenberg で生成されてしまう空の <p></p> タグを the_content() 読み込み時に削除する方法

WordPressの Gutenberg エディターでは、新規ブロックが自動生成されて、空の `<p></p>` が保存されてしまうことがよくある。

この問題には、functions.php などに次のコードを追記することで対処できる。

```PHP
/**
 * [T]he_content() から空の <p></p> を削除する.
 *
 * @param string $content - 投稿本文の HTML.
 * @return string
 */
function street42_remove_empty_p_from_content( $content ) {
	$content = str_replace( '<p></p>', '', $content );
	return $content;
}
add_filter( 'the_content', 'street42_remove_empty_p_from_content' );

```
[^ins1]

[^ins1]: [WordPress のコーディング規約](https://ja.wordpress.org/team/handbook/coding-standards/wordpress-coding-standards/php/#%e3%80%8celseif%e3%80%8d%e3%82%92%e4%bd%bf%e3%81%86%e3%81%93%e3%81%a8%e3%80%82%e3%80%8celse-if%e3%80%8d%e3%81%af%e4%bd%bf%e3%82%8f%e3%81%aa%e3%81%84)を見直していたところ、add_filter() のコールバックにクロージャーを渡すのは禁止されていたので（remove_filter() で削除できなくなるため）、修正しました（2020-08-17）。

これで、`the_content()` で、`<p></p>` が削除された状態の記事本文が読み込まれるようになる。

なお、`get_the_content()` は、フィルターが適応されていない状態の記事を取得するので、要注意。

## 関連ドキュメント

- [関数リファレンス/add filter - WordPress Codex 日本語版](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/add_filter)
- [テンプレートタグ/the content - WordPress Codex 日本語版](https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/the_content)
- [関数リファレンス/get the content - WordPress Codex 日本語版](https://is.gd/Cd5L00)
NimでmaxIndex, minIndexをしっかり取りたい

nimのsequtilsには1.2から `maxIndex`, `minIndex` という配列の最大値、最小値のindexを取得でき便利なメソッドがある。しかし、これは最大値、最小値をとる最初のindexを返すので同値のものが複数含まれる場合はそれが取得できない問題がある。

```nim
import sequtils

const data = [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]

echo data.maxIndex # 3
echo data.minIndex # 0
```

mapやfilterなどをつかってとろうと思ったがmapにもindexを取得する術がない。

# 解決
ないので自前で用意するしかない。
`pairs` iteratorを使えば愚直にindexをとれるので以下のような実装でできた。
これで最大値をとる最後のindexなどが取得できる。

```nim
const data = [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]

proc findIndexes[T](items: openArray[T], value: T): seq[int] =
  var indexes = newSeq[int]()
  for index, item in items.pairs:
    if item == value:
      indexes.add(index)
  return indexes

proc maxIndexes[T](items: openArray[T]): seq[int] =
  return items.findIndexes(items.max)

proc minIndexes[T](items: openArray[T]): seq[int] =
  return items.findIndexes(items.min)

echo data.maxIndexes # @[3, 7, 11]
echo data.minIndexes # @[0, 4, 8]
```

mapやfilterでもindexがほしいので、標準で実装してほしい...
つくられるつもりがなければ、自前でライブラリをつくるかもしれない。
初心者によるプログラミング学習ログ 324日目

#100日チャレンジの324日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
324日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>324日目　2h<br>・ポートフォリオ作成<br>・ふわっとでる演出追加<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1263924815133462528?ref_src=twsrc%5Etfw">May 22, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
MySQLのINDEX削除に時間が掛かる

## 経緯
IT後に試験環境に追加したINDEXを削除しようとしたら一向に終わらない。
MySQL 5.6

## 試したこと
###### MySQLのINDEX削除は絶望的に時間が掛かるらしい
MySQLのALTER TABLEは絶望的に時間が掛かるとの記事が多数。
（INDEX追加はそんなに時間が掛からなかったんだが…）


###### 参照可能って話なのにSELECT出来ない。
更新のみ不可って記事を見たので、それなら実行しっぱなしで帰ればいいか…と思ったが、DROP INDEXを走らせて別窓からSELECTを掛けるも帰ってこない。
SHOW PROCESSLISTで実行中の処理を確認するとWaiting for table metadata lock。
参照できるって話ではなかったのか…。とりあえずKILLしてロック解除。

###### テーブルロックを掛けずに実行する方法を探す
ALTER TABLE に ALGORITHM=INPLACE LOCK=NONE を設定すればテーブルロックを掛けずに実行できるらしい。早速実行。
エラーは出ないので成功かと思ったが、SELECTを掛けると結局参照すら不可。

## 解決策
結局夜間帯に裏で実行させて朝終わってることを確認。（解決してない）
50,000件レコードのINDEX削除に8時間かかりました。

## 参考にさせて頂いた記事
[InnoDBオンラインDDLについて](https://gihyo.jp/dev/serial/01/mysql-road-construction-news/0030)
[mysql 5.6~でのalter tableでやらかさない](https://qiita.com/k_k_hogetaro/items/481dbedfb77842f8e395)
[そのALTER TABLEがオンラインALTER TABLEかどうかを確かめる方法](https://yoku0825.blogspot.com/2016/06/alter-tablealter-table.html)
npm run tsc --init でハマった話

Typescriptのプロジェクト始めようと思って、`npm run tsc --init`でハマった
解決策がほかの時にも気を付けるべき内容だったので、残しておく


# 起こったエラー

typescriptをインストール

```
npm install typescript
```

`package.json`にtscを登録

```json:package.json
  "scripts": {
    "tsc": "tsc"
  },
```

tsconfig.jsonを作成

```
npm run tsc --init
```

あれ？

```:実行結果
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! test@1.0.0 tsc: `tsc`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the test@1.0.0 tsc script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\XXXX\AppData\Roaming\npm-cache\_logs\2020-05-22T18_01_55_736Z-debug.log
```

# 解決策

解決策はこちらにありました。
[npm run (npm run-script) コマンドで実行するスクリプトに引数を渡す。2017](https://qiita.com/tiny-studio/items/ce28bf84c76aba53122f)

こう書かないといけないんですね。

```
npm run tsc -- --init
```

```:実行結果
message TS6071: Successfully created a tsconfig.json file.
```

うまくできました。

今までも`npm run command --option`でできてたと思ってたけど、運よく？運悪く？そういう場面に出会ってこなかっただけだったっぽい