OmniAICreator/Qiita-1.07M huggingface dataset:
配列について

###1.はじめに
---
今まで範囲型やストライド型などを解説してきましたが、最も基本的ともいえるであろう配列について何も触れていなかったので、今回は解説していこうと思います。

###2.配列とは
---
説明は不要だとは思いますが、念のために説明しておきます。
配列とはArray型のことを指していて、Array型とは１つの箱の中に、いくつかのデータが格納されているもののことを言います。このように複数個の要素を格納できるデータ構造のことを、**コレクション**といいます。

###3.コレクションの内容の変更
---
コレクションの内容を変更するには、それが定数ではなく、変数に代入されている必要があります。
今説明しているArray型は構造体として定義されているデータ型で、配列のインスタンスを変数に代入したり、関数に対して引数として渡したりする際、必要に応じて新しいインスタンスが作成され、元の配列の内容に影響しないように動作します。
よってコレクションを変更したい場合、元の配列の値を保持するのか、または変更してもいいのかについて、検討する必要があります。
配列に対する操作には、配列の内容を変更するものと、新しい配列を値として返すものの２パターン用意されている場合があります。
例えば内容を昇順にソートするメソッドには、配列の内容を変更する**sort()**と、ソートされた配列を返す**sorted()**があります。

```Swift:
tmp1.sort()                //変数tmp1の内容が変更される
let tmp3 = tmp2.sorted()   //定数tmp2の内容は変更されず、結果はtmp3に入る
```

###4.配列の部分的な置換
---
配列の添字として範囲を指定しておき、別の配列を代入すると、その部分を新しい内容に置き換えることができます。置き換える前と後の要素の個数は一致していなくても大丈夫です。以下の例を確認してください。

```Swift:
var s = ["春", "夏", "秋", "冬"]

s[0...0] = ["春休み", "お花見", "入学式"]  // s[0]はエラー
print(s)        // ["春休み", "お花見", "入学式", "夏", "秋", "冬"]を出力

s[1...3] = ["梅雨", "夏休み", "プール"]
print(s)        // ["春休み", "梅雨", "夏休み", "プール", "秋", "冬"]を出力

s[3...4] = []   // 削除にも使える
print(s)        // ["春休み", "梅雨", "夏休み", "冬"]を出力
```

###5.部分配列の型
---
先ほど例を示したように、配列の添字に範囲を指定すると部分配列を得ることができます。
片側範囲を指定することもでき、先頭から途中まで、または途中から末尾までの部分配列になります。[...]ですべての要素を含む部分列も指定できます。以下を確認してください。

```Swift:
var days = ["日", "月", "火", "水", "木", "金", "土"]
print(days[2...4])  // ["火", "水", "木"]
print(days[...2])   // ["日", "月", "火"]
print(days[5...])   // ["金", "土"]
print(days[...])    // すべての要素を表示
```

ただし、得られた部分配列の型はArray型ではなく、**ArraySlice型**という型になります。
ArraySlice型も同様に利用できますが、添字を使って要素にアクセスする場合には、部分配列を指定したときの範囲で利用可能になるので、注意が必要です。
つまり必ずしも０から添字が使えるわけではなく、以下の例ならば３、４のみが利用できます。

```Swift:
let sub = days[3..<5]   // subはArrayIndex型。["水", "木"]
print(sub.count)        // 3を出力(要素が３つ)
print(sub.startIndex)   // 3を出力(最初の添え字は３)
print(sub[3])           // "水"を出力
print(sub[4])           // "木"を出力
```

ここでArray型が必要になったときに、ArraySlice型からArray型を得ることができます。

```Swift:
print(sub[3])                 // subはArraySlice型("水"を出力)
let subarray = [String](sub)  // Array<String>のイニシャライザ
print(subarray[0])            // 添字が０からになる("水"を出力)
```

###6.配列同士の比較
---
配列同士を比較するために、「==」と「!=」を利用することができます。
「==」は、２つの配列の要素数が等しく、先頭から順番に対応する要素がそれぞれ等しいときにのみ真になります。以下の例を見てください。

```Swift:
let a = [1, 2]
let b = [2, 1]
a == b                 // false
a + [1] == [1] + b     // true([1, 2, 1]が構成されたため)
```

###7.おわりに
---
応用的な部分にはあまり触れられていませんが、今回は様々な言語でとても中心的な要素となる、配列について解説しました。
利用する機会はすごく多いと思うので、基本的な活用方法などはきっちりと押さえておきましょう。
【SCP】ローカルからリモートマシンへのコピー

もう忘れたのはn回目なので備忘録として残しておく

最高にわかりやすいのはこちら→[scpコマンド チートシート](https://qiita.com/rock619/items/2bbbe379ae0fdd2ae00f)
感謝です

私の環境でよくあるのが、クラウドサーバー(AWS, OracleCloud）で建てているインスタンスへディレクトリごとコピーすること。

```shell
$ scp -i ~/.ssh/hoge.pem -r ~/Desktop/hoge username@xxx.xxx.xxx.xxx:~/
```

`-i`で鍵を指定。`-r`でディレクトリを指定
今回はデスクトップのhogeというフォルダごと
`username@xxx.xxx.xxx.xxx`はsshと同じ
最後の`:~/`の部分でどこにコピーするか決めている
今回はホームディレクトリ
Linux Mint 20 を外付けSSDで使う

# はじめに

Linux Mintを外付けSSDに、PC搭載のSSDにWindowsを入れて使うための個人的なメモ書きです
Windowsの端末はセットアップが完了している状態で作業を開始しています。

# SSDにLinux Mintを入れる

空のSSD、または、すべてのデータを破棄していいSSDを用意します。
データを保存しているSSDに新規でパーティションを作成して、Linux Mint を入れようとしましたが、どうしてもうまく行きませんでした。
EFI領域先頭にある、または、ディスクの先頭に1MBの空き容量がある。
どちらかの条件がインストールするための必須条件になったいるように思います。

## Virtual Box をLinux MintのCDで起動

Virtual Box をLinux MintのCDをイメージで起動します。
LiveUSBを作成してもいいのですが、Virtual Boxを使うほうが、

- わざわざLiveUSBの作成をしなくてもよい
- うっかり、PC搭載のSSDにLinux Mintを入れてWindowsを消してしまうリスクがない

と、いう２つの理由から、Virtual Boxを利用して導入をします。

## パーティションの分割

SSDすべての領域を使って、Linux Mintをいれてもいいのですが、
今回利用するSSDの容量が1TBあり、Linux のOS領域にそんな大容量必要ないので、
パーティション分けて、一部をNTFSの記録領域として利用します。

構成は下記の通りです。

| 目的 | 容量 | 備考 |
| --- | ---: | --- |
| 空き容量 |    1MB | 必要性は不明だが、ディスク全体を使ってインストールすると先頭に1MBの空き容量が作成されるため作っておく |
| EFI | 1,024MB | 正直こんなに容量いらないと思うが一応 |
| ブート領域/boot | 1,024MB | /を暗号化するため、/bootのパーティションは分ける |
| OS領域 | 102,400MB |  |
| 記憶領域 | 残り | NTFS |
| 空き容量 |    1MB | 必要性は不明だが、ディスク全体を使ってインストールすると先頭に1MBの空き容量が作成されるため作っておく |

# UEFIブートの設定

Secure BootをOFFにする。
※ キーの登録すればいいはずだが、方法を調査していないため、Secure BootをOFFにして対応する。
　　


```

再起動後、タスクバーの時計をクリックし、日付と時刻の設定で、場所を東京に設定

### 日付のフォーマット変更

1. タスクバーの時計を右クリック
1. 設定押下
2. Date formatに「%m/%d(%a) %H:%M」を入力

## 各種ソフトウェア導入

```bash
sudo apt update && sudo apt upgrade
sudo apt install git docker-compose
```

### Chromeのインストール

インターネットからdebパッケージをダウンロードしてインストール

### remminaのインストール

remmina-plugin-rdpをインストール
※Flathubじゃない方をインストール
（Flathubのは日本語が文字化けした）

### Discordのインストール

flathub のページで検索してインストール

### GitKrakenのインストール

flathub のページで検索してインストール
【Node-RED】デバッグログをコンソールに出す方法


Javascriptでは、デバッグログをコンソールに出力させるのに、

```
console.log('hogehoge');
console.debug('hogehoge');
```

と書きますが、
Node-REDでは、何も反応しません。

<br>
Node-REDでは、これらではなく、

```
node.warn('hogehoge');
```
なら、コンソール画面に表示されました。

ただ、warnという言葉に違和感があります。
もっといいのがあったら、ご指摘ください。

<br>
あと、

```
node.log('hogehoge');
node.debug('hogehoge');
```
では出力されませんでした。
node.debug は。console.debugとは違った使われ方をさせるみたいです。

<br>
UIView の updateConstraints() について知る

今回は View の制約を更新する際などに登場する `updateConstraints()` について簡単にまとめていきます🙃

### なんのメソッド？

このメソッドはUIView のインスタンスメソッドで、View の制約を更新する際に呼び出します。基本的にはシステム側がレイアウトパフォーマンスを考慮したタイミングで呼び出すので、開発者が意図的に呼び出してはいけません。

### いつ使うのか？

ある View に指定する制約が遅くパフォーマンスに影響を与える場合や冗長な変更を多数している場合にのみ、UIView のサブクラスでメソッドを Override して使用します。また、更新処理の最後で`super.updateConstraints()` を呼び出す必要があります。

```swift
    override func updateConstraints() {
        //
        // 制約の更新
        //
        super.updateConstraints()
    }
```

基本的には、あるアクションに伴う制約の更新などをする際は逐次そのスコープで制約を更新した方がシンプルですが、先述の通りパフォーマンスを大きく損なうような制約の更新などの場合は `updateConstraint()` 内で行なった方がいいよ〜とのことです🙃これは、`updateConstraint()` がレイアウトののバッチ処理を行いメインスレッドをブロックしないためです。

### 意図的に呼び出したい場合は？

`setNeedsUpdateConstraints()` という UIView のインスタンスメソッドを使用して、制約更新のフラグをつけることができます。これによって、指定された View とその Subviews がシステムのタイミングによって `updateConstraint()` を呼ぶようになります。また、更新を即座に行う必要がある場合には `updateConstraintsIfNeeded()` を使うことで即座に制約更新を行わせることができます。

### 参考

- https://developer.apple.com/documentation/uikit/uiview/1622512-updateconstraints
- https://medium.com/eureka-engineering/ios%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E5%BF%85%E8%A6%8B-ios%E3%81%AE%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88%E3%81%A7%E6%8A%BC%E3%81%95%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E3%81%93%E3%81%A8-%E7%B7%8F%E9%9B%86%E7%B7%A8-b25342566ccc
- https://qiita.com/shtnkgm/items/f133f73baaa71172efb2
vue.jsでA-Framを使う

vue.jsでA-Framを使用した時に出た警告

`Console`に警告が出てけすのに消すのに手こずるたのでメモ

A-Frameは<a-box>、<a-entity>のなどの専用タグを使用します。
vueファイル内に書くと以下のような警告が出ます。

```
[Vue warn]: Unknown custom element: 
<a-entity> - did you register the component correctly?
 For recursive components, make sure to provide the "name" option.
```

`script`の中に以下を追加する。(使用するa-〇〇をすべて追加)

```
<script>
        Vue.config.ignoredElements = [
      'a-scene',
      'a-entity',
      'a-camera',
      'a-box',
      'a-ring',
      'a-asset-items',
      'a-assets',
      'a-cursor',
      'a-text',
      'a-light',
    ]
</script>
```

以上。
[Flutter]一番簡単にパッケージ名を変更する方法[Android]

#方法
[Change App Package Name for Flutter](https://pub.dev/packages/change_app_package_name )を使用する。

まず、"pubspec.yaml"に"change_app_package_name"を追加。

```yaml:pubspec.yaml:
dependencies: 
  change_app_package_name: ^0.1.2
```

pub getを行い、dependenciesをアップデートする。

```
flutter pub get
```

以下のコマンドを実行。
( [com.new.package.name]に新しいパッケージ名を入れる。)


```
flutter pub run change_app_package_name:main com.new.package.name
```


以下のファイルにおいて、変更がいい感じに自動で行われます。

- AndroidManifest.xml (release, debug & profile用)
- build.gradleファイル
- MainActivityファイル (java と kotlinの両方対応) 
- MainActivityファイルを新しいディレクトリに移動
- 古いディレクトリを削除
。
enebular上のNode-REDで作ったLINE BOTが１時間経ったら動かなくなる件の解決方法


enebularの環境で、Node-REDを使えば、さくっと作れて、ウェブに公開できるので、ハッカソンとかでプロトタイプ作るのにとても便利です。

ただし、<b>１時間という制限時間</b>があります。

<b>リロードか開きなおせば、再度１時間使えます。</b>

##今回の事象

今回、LINE BOTをenebular上のNode-REDで作っていたのですが、１時間経過後、リロードしても、今まで動いてたLINE BOTが動かなくなりました。

##解決方法
実は、リロードするたびに、URLが変わります。
下画像の赤矢印の　i マークをクリックすると、現在のURLが表示されます。
![スクリーンショット 2020-09-14 22.56.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291592/91c07033-5854-ab1f-3fc8-410605be3f8e.png)

<br>
ということは、<b>LINE Developersサイトにて、Messaging APIのwebhookのURLを都度設定しなおす必要</b>があるということです。

さくっとしたプロトタイプならこれでもいいですが、作るものがある程度確定してずっと起動し続けたいなと思ったら、<b>enebular上のNode-REDフローをHerokuで動かせるHeroku Deploy</b>をしたほうがいいです。
<br>
<b>Heroku Deployの方法</b>はこちら
https://docs.enebular.com/ja/deploy/deployflow/heroku/

なお、私がHeroku Deployでハマった点はこちら
https://qiita.com/tatsuya1970/items/37f2c6270b228e9973a8

<br>
クラウドRDBの初期化(DB・テーブル作成)を考える

# 背景

RDS(AWS)やCloud SQL(GCP)を利用する際に、どのようにデータベースやテーブルを作成するかを纏めてみる

# 初期化方法
## (1)DBインスタンスにログインして初期化する

ローカルのDBの初期化をSQLで行う場合はこちらを利用することを考える

 - アプリでORMを使わない場合
 - docker-entrypoint-initdb.dを使う場合

### RDS(AWS)

以下の条件を満たすように設定すれば任意のmysqlクライアントからインターネット経由でアクセス可能になる(ただし初期化後は安全のためアクセスを塞いでおくべきである)

 - RDSがパブリックサブネットに配置されていること
 - VPCのセキュリティグループにmysqlのインバウンドルールが追加されていること
 - パブリックアクセシビリティが許可されていること

あるいは同じVPC内に踏み台サーバを起動し、踏み台サーバ経由でアクセスする方法もある。

 - サーバレスAuroraではインターネットアクセスができないため、この方法か、次節の方法で初期化する。
 - 踏み台サーバは必要な時だけ起動したり、IP制限するとセキュアである

### Cloud SQL(GCP)

Cloud Shellからアクセスして初期化する

## (2)DB初期化アプリケーションを作成して初期化する

アプリケーションで利用しているライブラリとシステムを用いたDB初期化用のアプリケーションを作成・実行する。

例: SQLAlchemyを利用したCloud Runで動くアプリであれば、SQLAlchemyを利用したDB初期化アプリを作成し、Cloud Runで実行する

大抵のORMにはテーブルを作成する機能があるので利用する。

## (3)[Kubernetesの場合]Kubernetesの機能を利用する

アプリケーションがKubernetesで動作している場合は、Kubenetesの機能を用いてデータベースの初期化をすることもできる。

### Init Containerを利用

ネットワーク・ボリュームが初期化された後、アプリケーションコンテナが起動する前に実行されるコンテナ。

起動コマンドとしてSQLコマンドを実行させたり、ライブラリを利用したアプリケーションを実行させたりできる。

https://kubernetes.io/ja/docs/concepts/workloads/pods/init-containers/

### ConfigMapで記述（できないかも）

ConfigMapにSQLをベタ書きして docker-entrypoint-initdb.d にマウントする方法

Cloud SQLを利用していて、cloudsql-proxyを利用している場合に利用できるかは未確認。

参考記事:
[Kubernetes] ConfigMapでコンテナの設定ファイルをVolumeに配置する
https://a-records.info/kubernetes-configmap-for-container-settings/

## まとめ

 - 簡単にやるならDBインスタンスにログインして初期化する
 - 丁寧にやるならアプリやインフラなどからよしなに初期化方法を採用する
 - Kubernetesを利用しているならInitContainerを利用する
Dart のコマンドライン引数は `List<String>`で取得する

# 【目的】

Dart のコマンドライン引数は、`List<String>`である。
`$ stagehand console-full` の実行直後から取得してみる。

- 環境
  - Dart SDK version: 2.9.2 (stable) (Wed Aug 26 12:44:28 2020 +0200) on "macos_x64"


# 【本文】

## 実行ファイル修正

```diff:bin/practice_template.dart
import 'package:practice_template/practice_template.dart' as practice_template;

void main(List<String> arguments) {
-  print('Hello world: ${practice_template.calculate()}!');
+  var numbers = arguments.map(int.parse).toList();
+  print('Hello world: ${practice_template.calculate(numbers)}!');
}
```

```diff:lib/practice_template.dart
- int calculate() {
-   return 6 * 7;
- }
+ int calculate(List<int> numbers) {
+   return numbers.reduce((value, element) => value * element);
+ }
```

## テスト修正

```diff:lib/practice_template.dart
import 'package:practice_template/practice_template.dart';
import 'package:test/test.dart';

void main() {
  test('calculate', () {
-     expect(calculate(), 42);
+     var numbers = [6, 7];
+     expect(calculate(numbers), 42);
  });
}
```

## コマンドラインで実行
```bash
$ dart bin/practice_template.dart 2 2 2 2
> Hello world: 16!
```
Gitチートシート(サクッと調べたいとき用)

## ローカルリポジトリを新規作成
```terminal
$ git init
Initialized empty Git repository in ~~~~~~
```
上記のコマンドでワークツリー上にリポジトリが新規作成されます。

## 変更をステージに追加する
```
#ファイルを追加
$ git add <ファイル名>
#ディレクトリを追加
$ git add <ディレクトリ名>
#変更すべて追加
$ git add .
```

## 変更をリポジトリに反映する
```
$ git commit -m "コミットメッセージ"
```
mオプションでgitのエディターを立ち上げることなく、コミットメッセージをつけることが出来ます。

## 現在の変更状況を確認する
```
$ git status
#現在いるブランチ
On branch master

No commits yet
#ステージに追加されているファイル
Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
	new file:   index.html
#ステージに追加されていないファイル
Untracked files:
  (use "git add <file>..." to include in what will be committed)
	main.css
```
## 変更差分を確認する(ステージ前)
```
$ git diff
diff --git a/index.html b/index.html 
index cef45f3..8d0578e 100644
--- a/index.html
+++ b/index.html
@@ -10,5 +10,6 @@
 </head>
 <body>
     <h1>テスト用のファイルだよ。</h1>
+    <h1>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</h1> 
 </body>
 </html>>
\ No newline at end of file
```
表示されるのはステージされていないファイルのみ。
+の部分は新規で追加された部分
-の部分はもともとあったファイルから削除されたもの。

## 変更差分を確認(ステージ後)
```
# どっちでもいいです
$  git --staged
$  git --cached
```

## コミット履歴を確認
```
$ git log
# 1コミット１行だけ表示(コミットメッセージくらいしかみれない)
$ git log --oneline
# 各コミットの変更差分を表示する
$ git log -p
# コミット数を指定して表示
$ git log -n <コミット数>
```

## リポジトリとワークツリーからファイルを削除する。
```
$ git rm <ファイル名>
# ディレクトリを削除する場合(ファイル名とディレクト名を区別するため)
$ git rm -r <ディレクトリ名>
# リポジトリから削除したいが、ワークツリーには残したい場合
$ git rm -cached <ファイル名>
```
## ファイルを移動(名前の変更もこれできる)
```
git mv <旧ファイル> <新ファイル>
```

## リモートリポジトリを新規追加する
```
$ git remote add origin <リモートリポジトリのURL>
```
別にリモートリポジトリの名前はoriginでなくてもいいです。
## Push(リモートリポジトリにコミットを反映する)
```
$ git push <リモート名> <ブランチ名>
#実例
$ git push origin master
```
上記のコマンドでは、originリポジトリのmasterブランチにpushしている
## コマンドにエイリアスをつける
```
# 実例だけ。適宜変えてください。
$ git config --global alias.ci commit
```
上記のコマンドでは、グローバルに対してcommitをciを略するとしています。

## ファイルへの変更を取り消す(ステージ前)
```
$ git checkout -- <ファイル名orディレクトリ名or.>
```

## ファイルへの変更を取り消す（ステージ後）
```
git reset HEAD <ファイル名>
```
HEADのブランチの特定のファイルをリセットするという意味
## 直前のコミットをやり直す
```
git commit --amend
```
注意！！: リモートリポジトリにpushしたコミットはやり直さないでください。コンフリクトが発生して、地獄を見ます。

## 登録したリモートリポジトリを表示する
```
$ git remote
# 対応するURLを表示したかったら
$ git remote -v
```
## リモートリポジトリから情報を取得してくる
```
$ git fetch <リモート名>
$ git pull <リモート名> <ブランチ名>
```
fetchとpullの違い
fetchはリモートリポジトリの内容をローカルリポジトリに保存するだけ
pullはリモートリポジトリの内容をローカルリポジトリとワークツリーに反映する
## リモートリポジトリの詳細情報を表示する
```
$ git remote show <リモート名>
```

## リモートの名前変更・削除
```
$ git remote rename <旧リモート名> <新リモート名>
$ git remote rm <リモート名>
```
## 新しいブランチを作成
```
$ git branch <ブランチ名>
```
## ブランチの一覧を表示する
```
# ローカルのみ
$ git branch
# リモートリポジトリも表示する
$ git branch -a
``` 

## ブランチを切り替える
```
$ git checkout <ブランチ名>
# ブランチの新規作成と同時に切り替える
$ git checkout -b <ブランチ名>
```

## マージする
```
$ git merge <ブランチ名>
$ git merge <リモート名/ブランチ名>
```

## ブランチの名前変更・削除する
```
$ git branch -m <ブランチ名>
$ git branch -d <ブランチ名>
```
"QNAP to Readynas"なう

今までQNAP TS-212を使っていましたが・・・QTSのEoLが近づいてるのと、電源落として分解しないと復旧ができないのが難点。実際にあったトラブルが
・reboot後、RAIDの状態が変：QTSの不具合なんてのを見たことがあるが、この機種に関してはアップデートによるbug fixはなし・・・。
・diskがダメになった場合、slot0なら問題ないが、slot1が壊れたら入れ替える必要があること

前者に関しては、何度かQNAPのサポートに依頼して修復をやってもらったことが何度も。やっぱりNASといえば電源落とさずにdisk変えられないとということでNASのreplaceを決断。当然ながらヤフオクで購入。

Seagateは信用ならぬ

と前社で散々教えられたこともあり、IronwolfではなくWD Red(2TB)を選択。(4本で30k…)なお4本ささったのに気づいたのか悪名高い？X-raidがRAID5を選択したので再構築はあえてせず。(RAIDのrebuildにまる２日かかってたので諦めた)

なおQNAPのディレクトリ構造もなかなかだけどReadyNASのも（それほどではないが）トリッキー…ディレクトリ名日本語て・・・
<pre>
root@HQ-NAS-2:/data# ls -l
drwxrwxrwx+ 1 guest guest 20 Sep 12 18:36 バックアップ
drwxr-xr-x  1 admin admin 10 Sep 12 18:52 home
drwxrwxrwx+ 1 guest guest 20 Sep 12 18:36 写真
drwxrwxrwx+ 1 guest guest 20 Sep 12 18:36 動画
drwxrwxrwx+ 1 guest guest 20 Sep 12 18:36 文書
drwxrwxrwx+ 1 guest guest 20 Sep 12 18:36 音楽
</pre>

find cpiovi・・・でやってよかったけど相手が空とはいえ怖いっす。どなたか楽な方法をですねぇ・・・
※データがNASの中で重複してる可能性があるため一旦mergeが必要ですねこれがorz(ARM cpuなので負荷はあんまりかけたくない・・・データ移行終わってTS-212をヤフオクに（初期化して）放出できるまでどれくらいかかるのやらorz
Dart アプリケーション用のテンプレートを生成

# 【目的】

Dart を使用して、アプリケーションのテンプレートを生成する。

- 環境
  - Dart SDK version: 2.9.2 (stable) (Wed Aug 26 12:44:28 2020 +0200) on "macos_x64"

# 【本文】

## Dart の実行環境を整備

- 参考: [Get the Dart SDK \| Dart](https://dart.dev/get-dart)

## テンプレート生成用のライブラリを導入

```bash
$ pub global activate stagehand

# 参考: テンプレート一覧
Available generators:
  console-full   - A command-line application sample.
  console-simple - A simple command-line application.
  package-simple - A starting point for Dart libraries or applications.
  server-shelf   - A web server built using the shelf package.
  web-angular    - A web app with material design components.
  web-simple     - A web app that uses only core Dart libraries.
  web-stagexl    - A starting point for 2D animation and games.
```

- 参考: [stagehand \| Dart Package](https://pub.dev/packages/stagehand)

## テンプレートを生成 ( 今回はコマンドライン用テンプレート )

```bash
$ mkdir csv_to_json
$ cd csv_to_json

$ stagehand console-full
```

## 動作確認

```bash
$ dart ./bin/csv_to_json.dart
> Hello world: 42!
```
《未経験→webエンジニア》実務1日目


## この記事の目的
自分がやったこと、知らなかったこと、やるべきことを明確にし
1日あたりの成長速度を速める。

「エンジニアになって、実務始まるとこんな感じなんだー」という
参考にも！

## 【今日やったこと】
・オリエンテーション
・PCの環境設定
・入社後の書類もろもろ


## 【知らなかったこと】

・APIテストってなに？
https://qiita.com/k-penguin-sato/items/defdb828bd54729272ad

・AWSの資格について(知ってたけど、きちんと調べていなかった)
https://proengineer.internous.co.jp/content/columnfeature/13442

## 【明日】やるべきこと

・railsの環境構築
・テストのコードが読めるよう、手を動かす
ネストした form_withの理解を深める

#動機
ネストしていない場合はリダイレクト先を自動推論してくれていたので、ネストしている場合の知識のまとめとして記述

##ルーティングでネストを定義している時の記述例

###前提
userモデル・boardモデル・taskモデルがあり
boardはuserに紐付いている
taskはuserとboardに紐づいている

###書き方

controllerファイル

```
def new
  @board = Board.find(params[:board_id])
  @task = @board.tasks.build
end

def edit
  @board = Board.find(params[:board_id])
  @task = @board.tasks.find(params[:id])
end
```

ポイント
タスクはどれかのボードに紐づいており、
どのボードに書き込まれているタスクなのかが情報として必要

なので、まずどのボードにあるかを取得し、そのタスクを探す

viewファイル

```
<%= form_with model: [@board, @task] do |form| %>
  <%= form.text_field :text %>
  <%= form.submit %>
<% end %>
```

modelの引数は配列として渡す
[(親)@インスタンス変数, (子)@インスタンス変数]の順で記述するようにする
Spring boot + JUnit5で@SpringBootTestアノテーションを使わずにApplicationContextを使う

# この記事の対象
Spring 2.2.x
spring-test 5.2
JUnit 5.6


# なにがしたかったの？
テスト実行をする際に、@SpringBootApplicationによるrunが実行されてしまうことを回避したかったのですが、そうすると、テストコード側でApplicationContextを利用できなくてハマってしまいました。
解決できたので、備忘録として…

# なにゆえにハマったのか？
下記のようなテストコードを書いていました。

```
@SpringJUnitConfig(classes = {ComponentA.class})
@EnableConfigurationProperties(value = {PrimaryConfiguration.class, SecondaryConfiguration.class})
@ExtendWith(SpringExtension.class)
public class ComponentATest {
    @Autowired
    public ApplicationContext ctx;

    @Test
    public final void testA {
        ComponentA testObj = new ComponentA();
        ctx.getAutowireCapableBeanFactory().autowireBean(testObj);
        // テスト対象メソッドの実行
        testObj.exec()
    }
```

上記のテストのようにテスト対象のクラス内にAutowiredしているオブジェクトが存在するため、AutowireCapableBeanFactoryを利用して、インスタンスにDIを注入しようとしたのですが、ApplicationContextがDIされず、nullが返却されるため、テストが出来ないという状態でした。

先の通り、@SpringJUnitConfigを利用せずに、@SpringBootTestを利用すれば良いのですが、諸事情により、本体アプリが実行されてしまうと不都合があるため、@SpringBootTestを使用せずにテストを実行したかったのです。

# 解決方法
@SpringJUnitConfigアノテーションにinitializersを付与するだけでOKです。

```
@SpringJUnitConfig(classes = {ComponentA.class},
    initializers = ConfigFileApplicationContextInitializer.class)
```

ただし、initializersによりテストメソッド実行の度にApplicationContextを再生成するので、テストケースが大量にある場合は、素直にDIオブジェクトをMock/Spyした方が良いと思います。

これだけのために半日を無駄にした私のような犠牲者を出さないために…お役たてば幸いです。
基本情報技術者(午後)

# はじめに

こんにちは！ばーんです。

今回は基本情報技術者試験(午後)について書いていきます。

前回書いた午前試験からの流れなので、読んで頂くと経緯などわかるかと思います。

[前回の記事](https://qiita.com/baan_nasebanaru/items/9f4e5b0e45cdc52bccf8)

## 今回の内容

自分自身は試験にまだ合格していません。

事前試験に合格して1ヶ月後に試験だし、そろそろ勉強するか〜という段階です。

こういう時にガムシャラに取り組まず対策を考えるのが僕の癖です。

色々みて恐らくこれでいけそう！と思った対策を備忘録的に残しておきます。

これで試験落ちてたらすいません。試験落ち太郎に改名します。

## 過去問や対策資料をざっと見た所感

- 基本は午前試験と内容は同じ
- 午前の内容が本質的に理解できていれば、午後は大丈夫そう
- ただし、アルゴリズムとプログラムは別口。しっかり対策しないと厳しい
- 午前は試験時間が余る(体験談)。午後は余らない(経験者談)
- 擬似言語はC言語に構文が似ている
- 午前と違い午後は過去問と同じ問題は出ない

ざっと感じたことや対策資料に書かれてたのはこんなところ。

## やるべき と感じだこと

上記を踏まえて残りの1ヶ月でやろうと感じたこと。

- 試験の時間割り振りを作る(アルゴリズムに30分。選択に20分など)
- 手書きに慣れる。その為の準備をする
- プログラムとアルゴリズムは別枠で対策する。恐らくC言語関連の試験対策書籍買う
- 選択とセキュリティは過去問を問いて問題文に慣れる。分からないところは復習する
- 9月は慣らし期間。1日1hを継続して10月に入ってから時間増やすかジャッジする

### 試験の時間割り振りを作る(アルゴリズムに30分。選択に20分など)

あくまで暫定。配点から機械的に作ってあとは調整。目安。

| 項目 | 配点 | 時間(分) |
|:-:|:-:|:-:|
|  セキュリティ | 20  | 30 |
|  アルゴリズム | 25  | 35  |
|  プログラム |  25 |  35 |
|  選択1 |  15 |  20 |
|  選択2 |  15 |  20 |
|予備|-|10|
|合計|100|150|

試験もこの順番で受けようかと思ってます。上3つが必須。
(60点合格なので、必須が全問OKならそのまま合格)

選択はパッと設問見て決めようかなって思ってます。
個人的にはセキュリティの時間は削れそう。


### 手書きに慣れる。その為の準備をする

本番はマークシートでかつ手書き。時間が足りないのも間違いない。
過去問はネットにあるし、実際に近い形で受ける。
（コンビニで簡単に印字あげられる素晴らしい時代）

恐らくそれで別のコツみたいなのも見つかる。多分。

### プログラムとアルゴリズムは別枠で対策する。恐らくC言語関連の試験対策書籍買う

自分はプログラミング言語JavaScriptしか触ってないので、他の言語の習得が必要です。

前々からこのためにC言語やろうと思っていたので、Cでいきます。
擬似言語もCっぽい構文なのでとても助かりました。
過去問見たら普通に読めたので多分大丈夫そう。
（一応Cは少し前から触ってます。[コチラ](https://qiita.com/baan_nasebanaru/items/a70e630f13009d8d26b6)）

### 選択とセキュリティは過去問を問いて問題文に慣れる。分からないところは復習する

過去問見て思いましたが、問題文が長い！
あと、答える時に必要ない情報が多い多い多い！

問題文はざっと読んで概要だけ掴んで、設問に早くいく練習が必要だと感じました。
できる限り↑で考えた時間配分を意識してやる。

午後の難しいはここが理由だと感じました。
午前と聞かれてること自体は変わりないんですよね。

問題文が難しい。それに慣れれば大丈夫だと思ってます。

### 9月は慣らし期間。1日1hを継続して10月に入ってから時間増やすかジャッジする

感覚的には10月入ってからの2週間で詰めてやれば間に合いそう。
ただし、継続は力なので9月からゆっくりやっていきます。

### プログラム問題に関する補足

プログラムに関しては、そもそも答えを見てプログラムの処理の流れが理解できるか？
という段階を越えなくてはならないとのこと。そりゃそうだ。
いきなり空欄付きで見ずに、答え込みで見て理解できるか？

現時点で理解できない場合はメンター雇って詰め込んだ方がいいかなとは思います。
(60点取ればいいので他で巻き返しでもOKですが)

## さいごに

最後まで読んでいただいてありがとうございました！

恐らく読んだ方は自分と同じく試験受ける方だと思うので、

一緒に頑張っていきましょ〜＾＾

試験終わったら振り返り的な総まとめは書くかもしれません。

それでは/~~
勉強日誌9日目

正答率　76%

env -u
env コマンドのオプションで環境変数の値を1時的に削除

\rm
登録したエイリアス　rm　を一時的に無効にする

env
設定されている環境変数の値を一時的に設定した値に変更して実行する

alias aaa='bbb'
エイリアス機能を使ってaaaと実行するとbbbが自動的に実行されるようにする


正答率74%

TODAY=`date`
TODAY=$(date)
コマンド置換機能

$0
実行したシェルスクリプト名

$1
1番目の引数が設定される

$#
コマンド実行時に指定された引数の数

$?
直前に実行されたコマンドの終了ステータス
個人的なメモ勉強用：File Path \\?\GLOBALROOT\Device\HarddiskVolume1\windows32\wscript.exe

個人的なメモ勉強用

c:\windows\system32\wscript.exe

\\?\GLOBALROOT\Device\HarddiskVolume1\windows32\wscript.exe

実際に拡張表現を試してみよう。

サンプルとして、Windows フォルダ内にある、
win.ini にアクセスしてみよう。

エクスプローラのアドレスバーや、
ファイルを開く汎用コモンダイアログでは、
拡張パス表現に対する対応をしているが、
コマンドプロンプトや「ファイルを指定して実行」は、
そのような制限がないため、入力して試すことが可能だ。

では、コマンドプロンプトを開き、
そこに入力して試してみよう。
ここでは、わざわざメモ帳を起動して試す。

ファイルの中身を書き出す type コマンドもあるが、
このコマンドは、パスに対して特別な処理をしているので、
テストとしては不適当なのだ。

最初は、普通にファイルの中身を表示してみよう。

    > notepad "C:\WINDOWS\win.ini"

メモ帳が起動し、ファイルが表示されたと思う。

次に、パス記号を変えてみる。

    > notepad "C:/WINDOWS/win.ini"

Windows のパスとしては不適当な文字なのだが、
ファイル名の正規化によって / が \ と解釈され、
正常に開くことができることが確認できる。

続いて、メタ表記を使ってみよう。

    > notepad "C:/WINDOWS/../WINDOWS\win.ini"

一度上のディレクトリに移動してから再度戻るパスで、
ディレクトリ区切り記号を混在させても大丈夫である。

そして、余計な文字を追加して試して見る。

    > notepad "C:/WINDOWS./win.ini....  .. . ."

ディレクトリ名の後にある 1 つのドット記号や、
ファイル名の後にある任意数のドットや空白は、
正規化によって除去されることが分かる。

さて、では拡張表現を使ってみよう。

    > notepad "\\?\C:\WINDOWS\win.ini"

実は、これもちゃんと開くことができる。
メモ帳がファイルを開く際には、受け取ったパスを
ファイルを扱う API にそのまま渡しているからである。

では、ファイルを開いた後、ファイルメニューより
「名前をつけて保存」を選んでみよう。
「コモンダイアログエラー」という珍しいメッセージが出る。

メモ帳がファイルを保存する際は、
現在のファイル名を元にコモンダイアログを表示するが、
コモンダイアログでは安全のため拡張表現を受け付けず、
ダイアログを表示する際にエラーとしてあるのである。

次に、拡張表現で、パス記号などを変えてみよう。

    > notepad "\\?\C:/WINDOWS/win.ini"
    > notepad "\\?\C:\WINDOWS\win.ini."

これらの場合は開くことができない。
\\?\ によって正規化が抑制されているので、
上の場合は、「C:/WINDOWS/win.ini」というファイル名、
下の場合は、「win.ini.」というファイル名とみなされ、
ファイルが見つからないと言うエラーとなる。

拡張表現では、C: など、一般的な名前以外の、
DOS デバイス名前空間 (??) の名前も使うことができる。

例えば、?? 空間には、GLOBALROOT という名前があり、
これは、デバイス名前空間のルートへのリンクである。
そのため、GLOBALROOT を経由すると、
あらゆるデバイスパスを使ってアクセスすることができる。

例えば、C: ドライブが、最初のハードディスクの、
最初のパーティションに存在すると仮定すると、
デバイスパスは \Device\Harddisk0\Partition1 である。

このパスを使ってファイルにアクセスするとこうなる。

    > notepad "\\?\GLOBALROOT\Device\Harddisk0\Partition1\WINDOWS\win.ini"

長いパスではあるが、これでもちゃんと表示されたはずだ。
GLOBALROOT から、再度 ?? に戻ることもできる。

    > notepad \\?\GLOBALROOT\??\C:\WINDOWS\win.ini

これも問題なく表示されたと思う。

このように、ファイルアクセス用の API は、
ファイルだけでなく、デバイスへのアクセス構文を持ち、

この機能は、ファイルを開くプログラムで、
標準的に使うことができるということがわかる。
システム同定のためのM系列信号をMatlabで生成してみた

#概要
システム同定のためのM系列信号をMatlabで生成してみた

#使用ソフト
MATLAB                                                バージョン 9.8  
System Identification Toolbox                         バージョン 9.12

#M系列信号とは
M系列信号とは様々な周波数成分を含んだ疑似的な白色信号である。
システム同定をするために理想となる入力信号は全周波数が含んだ信号(白色信号)であるが、全周波数を含む信号を作り出すのは現実的に不可能なので、それに近い信号をつくる必要がある。それがM系列信号である。
M系列信号の生成式は以下であるが

$ x_k =a_1x_{k-1} \quad XOR \quad a_2x_{k-2} \quad XOR ・・・\quad a_nx_{n-3} $
私自身なぜこの式になるかは理解が追い付かず。。。

#MatlabでM系列信号を生成してみた
M系列信号を生成するときにパラメータとしてシフトレジスタnがある
n = 9のときとn=5のときで波形を比較してみる

``` 
n = 9;
N = 2^n;
u = idinput(N,'prbs',[n,1],[-1,1]);

subplot(311)
stairs(u), axis([0 N -1.2 1.2]);
xlabel('time[sec]') 
ylabel('信号') 
title('M系列信号');

subplot(312),plot(covf(u, N)); axis([0 N -0.5 1]);
xlabel('ラグ') 
ylabel('相関') 
title('自己相関関数');
subplot(313), periodogram(u);
title('パワースペクトル');
```

n = 9のとき
M_signal_make![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700308/a1d919c0-625a-f969-171d-c20b8f58003e.png)

n = 5のとき
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700308/b426cc3c-6b9c-b847-c79a-3b4ea03d7143.png)

自己相関関数：
信号の時間をずらして、ずらす前後でどれだけ信号が似ているか
⇒相関が小さいほど周期性のない信号
パワースペクトル：各周波数帯の成分がどれだけ含まれているか
⇒0~1の間で

#わかったこと
上記結果よりシフトレジスタを多くすることで含有周波数が多い


#今後
ノンパラメトリックモデルの同定を学習していく
#参考
Matlabによる制御のためのシステム同定
https://qiita.com/Fuminori_Souma/items/847566b80c47ae7766c1

#最後に
アドバイスありましたら何卒よろしくお願い申し上げます。
Ruby学習1

#　メソッドとか色々1

現在、Ruby技術者認定試験silverを取得するべく勉強中です。
言語に対する理解がまだまだなので、基本的な事からアウトプットしていきます。

## chopメソッド
文字列の最後尾1文字を削除するメソッド。

```ruby
str = "abeshi".chop
p str
=> "abesh"
```
ただし、最後尾が\r\nの場合は、2文字とも削除される。Windows環境のみ、改行文字は\rと\n両方が必要だから、だと思います。

```ruby
str = "tawaba\r\n".chop
p str
=> "tawaba"
```

## sliceメソッド
整数の引数を指定し、配列(Array)、または文字列(String)から、指定した引数のインデックスに相当する値を返す。

```ruby
array = ["abeshi", "tawaba", "uwaraba", "howatya"]
p array.slice(2)
=> "uwaraba"
```

引数をカンマで区切る事で、範囲内の値を返す。

```ruby
array = ["abeshi", "tawaba", "uwaraba", "howatya"]
p array.slice(1,3)
=> ["tawaba", "uwaraba", "howatya"]
```

## sortメソッド
配列の中身を順番に並び替えるメソッド。

```ruby
num = [2, 1, 4, 8, 9, 7, 6, 3, 5]
p num.sort
=> [1, 2, 3, 4, 5, 6, 7, 8, 9]
```

sort!にする事で、破壊的にソートする事が出来る。

## 補足　破壊的メソッドとは
オブジェクトそのものを変更するメソッド

### 破壊的でないメソッド
numの中身がそのままのパターン。

```ruby
num = [2, 1, 4 ,8 , 9, 7, 6, 3, 5]
num.sort
p num
=> [2, 1, 4 ,8 , 9, 7, 6, 3, 5]
```

### 破壊的メソッド
numの中身が変更されたパターン。

```ruby
num = [2, 1, 4 ,8 , 9, 7, 6, 3, 5]
num.sort!
p num
=> [1, 2, 3, 4, 5, 6, 7, 8, 9]
```
【Spring Data JPA】deleteの自動実装されるメソッドでAnd条件は使えるか

## 概要
[【Spring Data JPA】自動実装されるメソッドの命名ルール](https://qiita.com/shindo_ryo/items/af7d12be264c2cc4b252)の記事にある通り、JPAではrepositoryの命名規則に合うメソッでを定義することで、クエリを自動生成してくれる機能があります。今回はその自動生成でdeleteの時にAnd条件を使えるかという話です。


## deleteについて
* [公式ドキュメント](https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.modifying-queries.derived-delete)に記載の通り、deleteでもrepositoryにdeleteByメソッドを定義し条件に使用するプロパティ名を指定することで、クエリを自動生成してくれます。[Spring Data JPA – Derived Delete Methods](https://www.baeldung.com/spring-data-jpa-deleteby)に実装の詳細が解説してあります。
* [[Java][Spring Boot][JPA] データベースを使う - NetBeansで始めるSpring Boot (6)](https://qiita.com/sengoku/items/2424c59f3b4ac94a1cb0)の記事にある通り、deleteでもfindと同じような条件式が使えそうな雰囲気はあります。

## 結論
And条件は使えました。試してはいませんが、おそらく他の条件も使えると思います。
ただ、複雑な条件はNativeQueryとかで実装した方が良いと思います。。

## 実装サンプル
### Entity

```UserPost.java

@Entity
@Table(name = "user_posts")
public class UserPost {
  @Id
  private long id;
  private long userId;
  private String contents;

  public long getId() {
    return this.id;
  }
  public void setId(long id) {
    this.id = id;
  }

  public long getUserId() {
    return this.userId;
  }
  public void setUserId(long userId) {
    this.userId = userId;
  }

  public String getContents() {
    return this.contents;
  }
  public void setContents(String contents) {
    this.contents = contents;
  }
}

```

### Repository

```UserPostRepository.java

@Repository
public interface UserPostRepository extends JpaRepository<UserPost, String> {
    // idとuserIdをAnd条件で指定してレコード削除
    void deleteByIdAndUserId(long id, long userId);
}

```
【備忘録】Eloquentモデルの名前空間が他の階層で重複している時("Cannot declare class 〜, because the name is already in use")

#クラス名重複してるよ〜のエラーメッセージが出る場合...

###①対処法
1:本当に記述している文字列が正しいか確認する
2:namespaceの階層が正しいか確認する(\App\Models\temp...)
3:asで別名を付与(詳細は以下参照)

###②それ以外の場合    とは？
あまり多くないパターンだと思いますが、自分が修正を担当しているプロジェクトのModelsの階層がこんな感じでした。

\APP
　\temp.php(フルパス：\APP\temp.php)

　\Models
　　\temp.php(フルパス：\APP\Models\temp.php)

最初見た時、Laravelはこんなふうになってるのかーと思って特に気にしませんでした。
(Eloquentモデルと通常のModelなので役割はそもそも違います)
が、後々機能を追加するとなったときになって困りました。

```
use APP\Model\Temp
use APP\Temp
```

>Cannot declare class〜〜〜〜, because the name is already in use

これはNGなんですね...。
記述や文字列の誤りがない、階層が違う、としても同名だとそもそもインポートNGのようです。

```
use APP\Model\Temp
use APP\Temp as eloquent_temp
```
***

こんな感じに別名であれば解決します。
なので正確には同名クラスからのインポートがNGというわけではないです。

※そもそも3のパターンは命名の時点でおかしいので、Eloquentモデルの作成時にはmodelと同名にするべきではないです！
TypeScriptとJavaScriptの違いとTypeScriptの特徴

#プログラミング勉強日記
2020年9月14日
JSのフレームワークやライブラリについてまとめてきたが、今回はJSを拡張して作られたTypeScriptについてまとめる。

#TypeScriptとは
　2014年にMicrosoftによって開発されたJavaScriptを拡張して作られたプログラミング言語。TypeScriptで書いたコードをコンパイルするとJSのコードに変換されているので、JSファイルが実行できる環境であればすぐに使うことができ、JSライブラリもTypeScriptから使用できる。
　TypeScriptはチーム開発に向いていて、エラーを防ぎやすいように設計されている。

#JavaScriptとの違い

- JavaScriptは動的型付け、TypeScriptは静的型付け
- TypeScriptはクラスの作成が可能
- TypeScriptはJavaScriptと同様の構文を使うことができる

##JavaScriptは動的型付け、TypeScriptは静的型付け
　変数のデータ型に関するもの。JSでは実行時にデータ型が自動で決まる動的型付けであり、コードを気軽に書けるが、実行しないとエラーがわからない。PythonやRubyも動的型付けである。
　TypeScriptは変数のデータ型をあらかじめ決めることのできる静的型付けであり、コンパイルする時点でエラーがわかるだけでなく、コードが読みやすい。

##TypeScriptはJavaScriptと同様の構文を使うことができる
　TypeScriptはJSの機能を拡張して作られているので、JSの構文を使うことができる。

#TypeScriptの特徴

- JavaScriptより短く読みやすいコードを書ける
- JavaScriptとの互換性がある
- 型を宣言するためのエラーを未然に防ぐことができる
- 学習コストがかかる
- 日本語の情報が少ない

##JavaScriptより短く読みやすいコードを書ける
　TypeScriptではクラスが作成できるので、JSよりも短く読みやすいコードをかける。また、同様の機能を実装する場合は、TypeScriptの方がコードは簡潔で、TypeScriptエディタのコード補完機能を使えばよりスムーズに書ける。

##JavaScriptとの互換性がある
　TypeScriptとJSは互換性があるので、JSの開発環境があれば簡単に導入することができ、JSファイルをTypeScriptから呼び出して使うこともできる。

##型を宣言するためのエラーを未然に防ぐことができる
　変数の型をコード内で宣言できるので、エラーを未然に防ぐことができ、動作も早い。

##学習コストがかかる
　クラスの作り方やデータ型の設定方法といった知識が必要である。ただ、JSができれば難しくは内。

##日本語の情報が少ない
　TypeScriptは比較的新しい言語なので、日本語で書かれた情報が少ない。

#参考文献
[TypeScriptを入門者向けに解説！JavaScriptとの違いや勉強法までわかりやすく](https://udemy.benesse.co.jp/development/web/typescript.html)
[TypeScriptとは？ Webアプリ開発で注目の言語を初心者向けに徹底解説](https://www.sejuku.net/blog/93230)
[Ruby] match / scan の違い

※いくつか類似のページ見つかりますがメモで残しておきます。


# 実際に書いてみる

```bash
# irb
a = "barfoobazfoobaofoo"

# matchの場合
a.match(/ba./)
=> #<MatchData "bar">

# scanの場合
a.scan(/ba./)
=> ["bar", "baz", "bao"]
```

matchは、 `MatchData` オブジェクトが返ってきて
scanは、配列で返ってくる。

## 正規表現でマッチしない場合

```bash
#irb

# match
a.match(/baa./)
=> nil

# scan
a.scan(/baa./)
=> []
```

matchは、nilが返ってきて、
scanは空の配列が返ってくる。


### 考察
#### 考察1
matchは配列を返さないので、結果をループ処理しようとするとエラーになる。
scanは配列を返すので、ループ処理できる。
(と言うかscanはそのままブロックを渡して処理できるからこんなことできる↓)

```bash
# irb
a.scan(/ba./) {|s| p s*2}
"barbar"
"bazbaz"
"baobao"
```


#### 考察2
matchはnilを返すので、条件分岐の時falseになる。
scanは[]なので、条件分岐でtrueになってしまうから注意。


## 参考
https://docs.ruby-lang.org/ja/latest/method/String/i/match.html
https://docs.ruby-lang.org/ja/latest/method/String/i/scan.html
vscodeのコードをgithubにアップロードする

# はじめに
vscode上に作ったプログラムをマネージャーに提出するためにgithubにアップロードしよう

# New repository
インターネット上の保存領域（repository）を確保
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94562/336d08af-7cc5-bdaa-f2de-5e9c455bd079.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94562/dc72c209-56ac-f64e-9ce2-2f9e89024030.png)

# 領域ができた
SSH用のリモートリポジトリのアドレスが確定しました
`git@github.com:veteranschannel/temp.git`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94562/577adcc6-7fe4-03e6-938f-b63da217363c.png)

```terminal:初回（4行目はさっき確定したリモートリポジトリのアドレス）
git init
git commit -m "first commit"
git remote add origin git@github.com:veteranschannel/temp.git
git push -u origin master
```
```terminal:2回め以降
git commit -m "first commit"
git push -u origin master
```

# git初期設定
```terminal:usernameとusername@example.comは変更
git config --global user.name 'username'
git config --global user.email 'username@example.com'
```
【JSDoc】JavaScriptで型補完する

どうしてもJavaScriptで書かないといけない状況に立たされた時、anyを作らないように開発することが大事になってくる。
そういった時にVSCodeなどに型情報を教えるための手段として、JSDocを用いた方法を紹介する。

## 注意
型アノテーションを記述するわけではないので、コンパイルエラーを発生させることはできません。
コンパイルエラーを発生させたいのなら[flow - https://flow.org/](https://flow.org/)などを使う必要があります。
また、このような状況での解決策として、型定義ファイルを作成するのが一般的です。

## JSDoc の `@type`について

ドキュメント

https://jsdoc.app/tags-type.html

変数宣言（メゾットの宣言）の上にドキュメントを書くと、優秀なIDE上ではそのドキュメントを参照することができます。

![Screen Capture_select-area_20200914212023.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273096/589594f1-40ba-4669-b78d-1f0166372355.png)

変数宣言では`@type`、メゾットには`@param`, `@return`で型情報を付けることができます。

![Screen Capture_select-area_20200914212345.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273096/8c75bb03-28a6-98ca-26c9-c76a84a91074.png)

![Screen Capture_select-area_20200914212452.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273096/3c8d1f50-fe62-214f-621a-c4a2b4f26cf5.png)

少しは変数の情報がわかりやすくなったのではないかと思います。

ここで注意ですが、型情報を追加しただけなので、型チェックを行いません。なので以下のようなバグコードを書かないようにしましょう。

![Screen Capture_select-area_20200914212114.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273096/51cf438a-9e73-460c-45c0-523777783b4b.png)

変数aは文字列ですがnumber型であるとの情報をつけたせいで、bの型がnumber型になってしまいました。
実際はstringなので良くないです。

## まとめ

やっぱり生jsは書かないほうがいいと思います。
bluetooth マイク音声aacエンコードするとAudioFormatUnsupportedエラー

# 現象

Airpodsなどのbluetooth micがついてるデバイスで音声データ取得して、aac変換するエンコーダ設定、bitrate設定部分でAudioFormatUnsupportedエラーがでる。


# 理由

bluetooth micの企画samplerateは8khzか、16khzさかサポートしてなくて、エンコーダ設定部分で高いbitrate設定するとエラーがでる。今回は96kbps設定しようとしてました。


MacのAudio MIDI Setupで確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9564/a35a2a65-900a-40de-ad9b-6b7aad108fe7.png)


# 解決方法

bitrate設定を小さくする.
16khz以下場合は32kbpsする. ステレオの場合は*1.5で大丈夫。


``` 
// audioのsamplebufferから取得
 AudioStreamBasicDescription *srcDesc= CMAudioFormatDescriptionGetStreamBasicDescription((CMAudioFormatDescriptionRef)CMSampleBufferGetFormatDescription(sb));

 int samplerate = srcDesc.mSampleRate;
 int bitrate = 96000;

 // 16khz以下の場合はbitrate小さくする
 if(samplerate <= 16000) {
   bitrate = 32000;
 }
 UInt32 sz = sizeof(bitrate);
 OSStatus r = AudioConverterSetProperty(mConverter, kAudioConverterEncodeBitRate, sz, &bitrate)
```



# 参考

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9564/791ace1e-3aa8-9789-0434-ce3dafa66253.png)

bluetooth audio
https://www.silabs.com/documents/login/presentations/Developing-Bluetooth-Audio.pdf
UFTの対応環境について①　～ハードウェア・ソフトウェア編～

# はじめに
テスト自動化ツールである、UFT(Unified Functional Testing)
公式資料を参考にしながら対応環境や推奨環境などをまとめたいと思います。

本記事ではハードウェア・ソフトウェアと一部ブラウザについてまとめます。
次回以降の記事では、対応しているシステムについてまとめたいと思います。

※本記事では、UFT One（Ver.15.00,15.01）についてまとめます。
※公式資料は英語のみです。日本語記事がないので、作成をしてみました。

# ハードウェア要件
## CPU
|CPU|Intel|AMD|
|---|-----|---|
|最小|Core-Duo|Phenom II X2|
|推奨|Core-i3|Phenom II X3|
公式推奨ではCore-i3とありますが、体感ではCore-i5 第7世代以降をオススメします。

## メモリ
|メモリ|スペック|
|------|-------|
|最小|2GB|
|推奨|4GB以上|
公式推奨では4GB以上とありますが、体感では16GBをオススメします。

## HDD/SDD空き容量
|HDD|スペック|
|---|-------|
|最小|2GB以上の空きディスク容量|
|推奨|20GB以上の空きディスク容量|
公式推奨では20GB以上とありますが、運用などを考慮する場合は50GB以上の空きディスクをオススメします。

## その他
|解像度|1024x768以上|---|
|-----|------------|---|
|ブラウザ|IEが必須|対応ブラウザについては後述します|

Macは対象外です！
MacでSafariをテストする場合は、標準機能ではテストが出来ないため対応が必要になります。
※ここでは対応方法については記述しません。

# ソフトウェア要件

下記にソフトウェア要件について記述をいたします。

・Microsoft C++ 2015 Redistributable
・UFT Developer (formerly known as LeanFT)
・Additional software requirements

※UFTではインストーラを起動すると足りないソフトウェアについてDLをしてくれる機能がついています。
そのため、別途用意する必要は基本ありません。

## OS
公式資料から一部抜粋して記述します。

|Version|UFT15.0|UFT15.01|
|-------|:------:|:-----:|
|Win7|○|○|
|Win8.1|○|○|
|Win10 1607(64bit)|○|○|
|Win10 1703(64bit)|○|○|
|Win10 1709~(32/64bit)|○|○|
|Windows server 2016/2019|○|○|

## 仮想環境
仮想環境は下記のものしかサポートしていません。
XenDesktopは7.15以前のバージョンではAPIテストをサポートしていないため注意が必要です。

|Product|UFT15.0|UFT15.01|
|-------|:------:|:-----:|
|Amazon WorkSpace(AWS)|○|○|
|Citrix XenDesktop 7~|○|○|
|Citrix XenAPP 7.15,7.17|○|○|

# 関連サービス

## QC/ALM
Quality Center / Application Lifecycle Managementとは、テスト管理用のアプリケーションライフサイクル管理ツールです。
UFTで作成したテストや実行制御、レポートを管理できるほか、サマリやバグ管理といったものを管理することができます。

|Version|UFT15.0|UFT15.01|
|-------|:------:|:-----:|
|12.01|×|×|
|12.2x|×|×|
|12.5x|○|○|
|12.60|○|○|
|14.00 SaaS|×|×|
|14.01 SaaS|○|○|
|15.0.x|○|○|

## AutoPass(License Server)
AutoPassはコンカレントライセンスを管理するライセンスサーバーです。
コンカレントライセンス（ランタイムライセンス）を使っている場合は、UFTのみのバージョンアップを行うとAutoPassのサポート範囲外となりライセンスが使用できなくなる場合があるので、自動テストの担当者はバージョンについて意識をしておく必要があります。

|Version|UFT15.0|UFT15.01|
|-------|:------:|:-----:|
|< 10.7.0|×|×|
|10.7.0|○|○|
|10.9.x|○|○|
|11.0.0|○|○|
|11.5.0|○|○|

# 対応ブラウザ
IE,Edge,Google Chrome,FireFoxなど主要なブラウザには基本的に対応をしております。
ブラウザのバージョンは日々アップデートされているため、本記事では2020/09/14時点の資料に記載されているバージョンについて記載します。

## IE
|Version|UFT15.0|UFT15.01|
|-------|:------:|:-----:|
|IE 10|○|○|
|IE 11|○|○|

## Edge
|Version|UFT15.0|UFT15.01|
|-------|:------:|:-----:|
|13.10586|○|○|
|14.14393|○|○|
|15.15063|○|○|
|16.16299|○|○|
|17.17134|○|○|
|18.17763|○|○|
|18.18362|○|○|


## Google Chrome
|Version|UFT15.0|UFT15.01|
|-------|:------:|:-----:|
|18 - 30|○|○|
|31 - 68|○|○|
|69 - 85|○|○|
|Headless Chrome|○|○|

## Firefox
|Version|UFT15.0|UFT15.01|
|-------|:------:|:-----:|
|< 38|×|×|
|38 - 53|×|○|
|54 - 79|○|○|

## Firefox ESR
|Version|UFT15.0|UFT15.01|
|-------|:------:|:-----:|
|10 - 31|×|×|
|38 - 52|○|○|
|60|○|○|
|68|○|○|
|78|○|○|

# 参考
■Product Availability Matrix Micro Focus UFT One
https://admhelp.microfocus.com/documents/uft/PAM/UFT_15.X_PAM.html
[初学者向け]Django Rest FrameworkでPOSTリクエストを送信した時、Cannot be null と出たときの至極些細なミス

# はじめに
私は現在、フロントエンドを`React`で、バックエンドを`Django`で成果物を作成しています。
API通信を行い、POSTリクエストを送信する際に、すごくしょうもないですが、初学者ならやってしまいそうなミスに遭遇したので、自分の戒めと、同様のエラーに遭遇した人への情報共有のために記事に残しておこうと思います。

# エラーケース
### 導入

実際に私がエラー時に使用していたコードを基に説明します。

```models.py

class Keyword(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name

    class Meta:
        db_table = "keywords"
```

まずは、`Django`のアプリ内で使うモデルを定義します。
フロント側で`React`や`Vue`を実装する予定なら、`JSON`としてデータをやりとりする必要があるので`djangorestframework`が必要です。
そして、`djangorestframework`でコードを書いていくなら、`JSON`データをやりとりするために`Serializer`を作る必要があります。

ちなみに、`Serializer`の役目は、フロント側から送られてきた`JSON`データをサーバーが読めるように変換し、また逆にサーバーから送るクエリセットを`JSON`データに変換するものです。
どこかでフロントエンドは_JSON色付け係_と揶揄されているTwitterの投稿を見かけましたが、その名の通り近年のモダンなフロント側では`JSON`データがやりとりの元なので、`Serializer`は必須というわけです。

```serializers.py

class KeywordSerializer(serializers.ModelSerializer):
    class Meta:
        model = Keyword
        fields = ["id", "name"]

    def validate_name(self, value):
        if len(value) <= 1:
            raise serializers.ValidationError("キーワードは必ず2文字以上で設定してください")
```

これが`Keyword`モデルの`Serializer`です。
サーバー側のValidationは`Serializer`で行います。
私より優秀な皆様ならどんな内容かこの時点で検討がついたかと思います。笑

### エラーの内容
エラーが起きたのは、題名の通り私がPOSTリクエストを送信した時です。つまり、**`Keyword`モデルを新たに作ろうとした時です。**

```
{
  "name" : "白スニーカー"
}
```

上記の`Keyword`モデルを基に`POSTMAN`等でリクエストを送るのならば上記のようになります(`JSON`形式)。最もシンプルな形と言えるぐらい簡潔なもので、間違えようがありません。

しかし私は、以下のエラーをゲットしました。

**`1048, "Column 'name' cannot be null"`**

値が`null`になっているといわれました。何度やっても同じことが言われるので、モデル作成と関わる`Model`,`Serializer`を確認しました。そこでエラーが判明しました。

```serializers.py

class KeywordSerializer(serializers.ModelSerializer):
    class Meta:
        model = Keyword
        fields = ["id", "name"]

    def validate_name(self, value):
        if len(value) <= 1:
            raise serializers.ValidationError("キーワードは必ず2文字以上で設定してください")
       ## 現場はこちらです
        return value

```

事件は会議室なんかではなく、`Serializer`で起きていた様です。
先ほどValidationは`Serializer`で行うと書きましたが、`Serializer`におけるValidationはメソッドで行われるのでreturnを返さなければいけません。

すぐに原因が判明しましたが、検索をしても案外このケースのエラーはヒットしなかったので共有させていただきました。

# まとめ
**`Serializer`でValidationを実装するときは、もっと言うなら関数を書くときはreturnを書くのを忘れない様に注意する**

この一言に尽きます。

至極しょうもないエラーではありますが、お時間をいただき最後までみてもらいありがとうございました。
間違いや、その他注意した方がいいよくあるエラーなど、なんでも良いのでコメントをくださると嬉しいです。

ありがとうございました。
Cannot use '$this' in non-object context エラーの対処法

Laravelを使用中に、モデル内で$this->を使って当該モデルを参照しようとしたところ
Cannot use '$this' in non-object contextのエラーが出たので備忘録として対処法を残しておきます

結論からいうと当該モデルのgetUser()がインスタンス化されていないのでself::でアクセスするのが正解でした



```Model.php
  public static function getUser($ids){
        return self::whereIn('id', $ids);
    }
```

上記で$this->からself::に変更したらエラーが改善しました

```Controller.php
 public function index()
    {
        $searchResults =  Model::getUser([1,2,3])->get();
        return response()->json([
            'search_results' => $searchResults,
        ], 200);
    }
```

思考停止してしまって、インスタンス化など全く意識せずに何でもかんでも$this->を使っている状態だったので
はまってしまったエラーでした
React Navigationのタブバーのバッジが見えないので背景色を変える

React Navigationのタブバーのアイコンにバッジを表示したくて調べてみたところ、tabBarBadgeというオプションがあるのを発見しました。

Tab navigation | React Navigation
https://reactnavigation.org/docs/tab-based-navigation/

このオプション、@react-navigation/bottom-tabsが5.6.1では存在しなかったような気がするのですが、5.8.0にバージョンを上げたところ使えるようになっていました。

早速tabBarBadgeを試してみたところ、文字色が白で背景色が透明？なのか思うように表示されません。以下のアイコンの右上に"4"てバッジが表示されているはずなんですけどわかるでしょうか？

![スクリーンショット 2020-09-14 21.15.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87068/ede6aa52-9612-d8af-f3bb-a358ea11689b.png)

色の変更については公式ドキュメントにも特に記載が見当たりません。ググってみたところ、以下のチケットで解決方法についてコメントを書いている人を発見しました。

The color for the "tabBarBadge" can't be changed #8812
https://github.com/react-navigation/react-navigation/issues/8812

NavigationContainerにthemeを設定すると、文字色が白で背景色が赤となり綺麗に表示されました。

```
const MyTheme = {
  ...DefaultTheme,
  colors: {
    ...DefaultTheme.colors,
    notification: 'red',
  },
}
```

```
<NavigationContainer theme={MyTheme}>
...
</NavigationContainer>
```

![スクリーンショット 2020-09-14 21.13.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87068/8d6cda49-2c14-0029-7a6c-0c8ad9cb07c2.png)

なお、tabBarBadgeにゼロ"0"を指定するとゼロがそのまま表示されてしまいます。バッジを表示したくない場合はundefinedを指定しましょう。

```
        options={{
          title: 'AAA',
          tabBarIcon: tabBarIconAAA,
          tabBarBadge: someCondition ? undefined : 1,
        }}
```
Boost semantic actionについて少し調べた

Boost semantic actionは「解析時アクション」や「セマンティックアクション」と呼ばれるが、
用は[ ]でくくった18行目の[&display]がポイントである。

この[ ]の中の関数display(7行目で定義)が、入力が整数にである場合(int_p)呼び出される。

     1#include <iostream>
     2#include <string>
     3#include <boost/spirit.hpp>
     4using namespace std;
     5using namespace boost::spirit;
     6
     7void display( int x ) { cout << "you typed: " << x << endl; }
     8
     9struct IntDisplay : grammar<IntDisplay>
    10{
    11    template<typename ScannerT>
    12      struct definition
    13      {
    14          typedef rule<ScannerT> rule_t;
    15          rule_t r;
    16          definition( const IntDisplay& )
    17          {
    18              r = int_p[&display] % ',';
    19          }
    20          const rule_t& start() const { return r; }
    21      };
    22};
    23
    24int main()
    25{
    26    IntDisplay parser;
    27
    28    string line;
    29    while( cout<<"# ", getline(cin, line) )
    30    {
    31        parse_info<string::const_iterator> info =
    32            parse( line.begin(), line.end(), parser, space_p );
    33        cout << (info.full ? "OK" : "fail") << endl;
    34    }
    35    return 0;
    36}

https://github.com/RuoAndo/qiita/blob/master/boost-semantic-action.cpp

実行してみる。。。

<pre>
# g++ boost-semantic-action.cpp -lboost_system
# ./a.out 
# 3
you typed: 3
OK
# 555
you typed: 555
OK
</pre>

これの発展版にディレクティブといふのがある。（｀ー´）b
python ディレクトリ作成 ディレクトリ存在する場合対応

ディレクトリ作成時にディレクトリが存在する場合エラーになる。

```
FileExistsError: [WinError 183] 既に存在するファイルを作成することはできません。
```

# 存在チェックする方法

```python
import os

DIR_NAME = 'dirname'
if not os.path.exists(DIR_NAME):
    os.mkdir(DIR_NAME)
```

# 例外処理する方法

```python
import os

DIR_NAME = 'dirname'
try:
    os.mkdir(DIR_NAME)
except OSError as ex:
    print(ex)
```
【初心者でもわかる】ふちに模様がついてるデザインの時、模様の大きさをキープしたまま可変に対応させる方法

# どうも7noteです。左右などに模様がついたデザインを作る時のちょっとしたコツについて

どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/technique/bg-design/
Djangoを使ったWEBアプリケーションの開発【リクエスト処理編】

[アプリケーション追加編の続き](https://qiita.com/tesla1017/private/25b5ddf28fca2ece1b96)

Djangoのリクエスト処理フロー
-
Djangoのリクエスト処理フローは下記のようになっています。
今回は、ルーティング・ビューだけを使い、ビューの関数に記載した「Hello, World!」を表示する。
フロートしては、ブラウザからのリクエスト→project1.urls→posts.urls→views.indexとなる。
![django_flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313621/c6b1442c-3615-f3ca-91a3-38ba185f5183.png)


ルーティング(urls.py)
-
ブラウザからのリクエストを受けたURLパターンとルーティングファイル内に記述されているパターンからどのファイルを呼び出すかを決める。
アプリ内とプロジェクト内でそれぞれ2つのurls.pyが存在し、それぞれがアプリ内とプロジェクト内の動作振り分けを定義している。

ビュー(views.py)
-
ルーティングで呼び出された関数の動作を返す。
データベースからデータを呼び出す必要があればデータベースへアクセスする記述などを記載する。また、そのデータを必要な形に加工しテンプレートに渡す動作を記述する。

Hello, World!を表示させてみよう！
-
今回作成したproject1フォルダ内にあるpostsフォルダの中あるviews.pyにリクエストを受けた際にHello, World!を返す関数を記述する。

```python:views.py
from django.shortcuts import render
from django.http import HttpResponse #この行を追加

def index(request): #この行を追加
    return HttpResponse("Hello, World!") #この行を追加
```
次に、postsフォルダ内にurls.pyを作成し、アプリ(posts)内での定義を行う。

```python:アプリ名/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
]
```

最後に、project1フォルダ内のurls.pyを編集していく。

```python:プロジェクト名/urls.py
from django.contrib import admin
from django.urls import path,include #includeを追加

urlpatterns = [
    path('admin/', admin.site.urls),
    path('posts/', include('posts.urls')), #この行を追加
]
```
サーバーを起動し、「[http://127.0.0.1:8000/アプリ名/](http://127.0.0.1:8000/posts/)」(今回の場合posts)にアクセスし、「Hello, World!」が表示されていれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313621/6c3e8095-0218-4250-7218-e7c929375230.png)
[テンプレート追加編](https://qiita.com/tesla1017/items/8fbc72f0312f9d445c2c)
iPhoneとAndroidの比較

長らくandroidを使っていましたがiPhoneについて聞かれることも多く、食わず嫌いも好きではないので廉価版の販売されているこのタイミングで使うことにしました。

## 主義主張
- 何事も一強状態ではサービスの向上は望めない
- プロプライエタリな環境のみに依存するべきではない
- LINEは入れない（信用できない）
- なんで各キャリアはzenfoneやpixel4aを販売しないのか…（残念）

##使用前のiPhoneのイメージからの2週間後

- 個人情報の取扱はgoogleよりはマシ　→　どっちもどっち（appleだけは全収集、パートナー企業にはなにも渡さない。）
- 入力も工夫されていて使い易い　→　そうでもない。（ATOKが別途購入なのはつらい）
- バッテリー持ちがよい　→　各アプリに問題がなければ間違いなくバッテリー持ちは秀逸
- 表示が速い　→　多くの場合においてはそのとおり
- 3ヶ月後には「iPhone最高」と言ってる可能性　→　今すぐにでもzenfone7を買いたい！
- アクセサリが豊富　→　かなり安価で良品が多い、ある意味今回iPhoneにして一番楽しいところかもしれない。
- 壊れ安い　→　持っただけで割れ物感がハンパない。androidでは一度も落として壊れたことがないが、本気で保証に入る必要があると感じる。
- システムが安定している　→　たまにフリーズするし、androidとさしてかわらない。

## 考察
- windowsとmacにおいても同じだが、appleは組立を自社のみで行うことでバグフィックスを容易にしているためそこにメリットがある。ただし、シェアが拡大している現状においては、懸念すべき点も増えている。ユーザーを甘やかし「iPhoneしか使えない」状態にしてからの値上げ、個別の課金など近年においてはシェアを低下させるほどである。
- カスタマイズ性については、限定的であり様々なニーズに対応できるとは言えない。
- 撮影した画像のサイズ表示も手間がかかるようになっていて、Cloud購入しないとこれ以上保存できないような表示が頻繁にでるなど営利性がひどくなっている。
- 最初のandroidからの移行アプリがあると書いてあったので、使ったのが間違い、、、googleサーバー、端末のローカルにあるデータすべて根こそぎもっていき、「iCloudを購入してください＾＾」と初っぱなにでる始末。結論移行時あのアプリを使うのはおすすめしない。。
- 海外のiPhoneのシェアが3割に満たないのに対して日本は7割近くなっている。日本人のITリテラシーや機械音痴の異常さが、appleの収益を加速させている気がする。。

#結論
- 今すぐお家に帰りたい＞＜
- でも2年は使う縛り＾＾
- 合い言葉は「使ってからディスる！」
tsxのコードブロックはtypescriptではなくtsxと書こう

## 概要

今回はQiitaのコードブロックのハイライトのお話しです。```` ``` ````の後にプログラミング言語などを`typescript`のように入力するとシンタックスハイライトのcssがあたる仕様になっていますが、ここにはプログラミング言語以外に`tsx`などが指定できるようになっていて、`typescript`と指定した場合と比べて、以下のようにhtmlタグ部分がシンタックスエラーの表示になってしまうのを防ぐことができます。

### BAD: ```` ```typescript ````

```typescript
const Typescript = <div>typescript</div>
```

### GOOD: ```` ```tsx ````

```tsx
const TSX = <div>tsx</div>
```

## ちなみに

これは、javascript / jsxでも同様です。

### BAD: ```` ```javascript ````

```javascript
const Javascript = <div>javascript</div>
```

### GOOD: ```` ```jsx ````

```jsx
const JSX = <div>jsx</div>
```

ほんの少しの気遣いでコードブロックが見やすくきれいになります。ぜひ参考にしてください。
【Rails】オブジェクトの中身を確かめる


オブジェクトとは？
オブジェクトは「箱」のようなもの。
そこで、存在チェックをするときには、

* その箱の中身があるのか？
* そもそも箱そのものがあるのか

という観点で見ていく。



#箱そのものは存在していないのか？　nil?

```ruby:
obj.nil?
```


#箱の中身は空なのか？　empty?

```ruby:
obj.empty?
```


#箱そのものは存在していないのか？してても中身は空なのか？　blank?

「箱が存在していないか、または中身が存在していない状態」
ちなみに、**Railsのみのメソッド**

```ruby:
obj.blank?

# 同義
obj.nil? || obj.empty?
```


#箱そのものは存在しているし、かつ中身も空ではないか？　present?
「箱もある、かつ中身もある状態」
ちなみに、**Railsのみのメソッド**

```ruby:
obj.present?

#同義
!obj.nil? && !obj.empty?
obj.blank?
```
Accessで『ウィンドウを重ねて表示する』と『タブ付きドキュメント』の設定変更方法

#バージョン
Access 2019 MSO （16.0.13127.20266） 32ビット

#場所
左上の **ファイル** 。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/f233f095-fd6c-6712-8b6b-00c3b93af30a.png)
左下の **オプション** 。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/cfa5073b-478e-9b2d-d246-0a99c4331bfe.png)
**現在のデータベース** 。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/6455faa3-63f1-4bac-71e0-56ca45160e0f.png)