OmniAICreator/Qiita-1.07M huggingface dataset:
RealmSwiftを使ってみよう！！Part１

みなさんこんにちは。夢はフリーランスエンジニアのあがです！！
今回はデータベース管理としてとても優秀なRealmSwiftについて紹介しようと思います！！
#RealmSwiftは何ができるの？？
RealmSwitはcocoapodsのライブラリーツールの中の１つで主にデータベースを管理することができます！！
cocoapodsではいろいろな操作を簡単に導入できるのでぜひインストールしてみるのをおすすめします！！
主にJASON形式で保存をすることができ他のコードでもデータを取得することができるそうです！！
『[cocoapodsでできることとは？？](https://qiita.com/kohei1218/items/275fcee7406395919885)』
『[cocoapodsのインストールについての記事](https://qiita.com/ShinokiRyosei/items/3090290cb72434852460)』
『[JASON形式とは？？についてのわかりやすい記事](https://dev.classmethod.jp/articles/concrete-example-of-json/)』
#RealmSwiftをインストールしてみよう！！
早速インストール！！ってことで『[公式サイト](https://realm.io/docs/swift/latest/)』を覗いてみてインストール方法をまとめてみました！
[YouTube](https://youtu.be/8vy98GP4jwY)で動画でも残しておくので是非参考にしてみてください！！
とりあえずターミナルを開いてください！！

```ターミナル.
cd 自分のインストールしたいファイルのディレクトリーを入れる！（ポイントは後ろの"/"まで切り捨てること）
pod init
open podfile
```
恐らくこのようなファイルが開いていると思います...
下のように『ここに追加してね！！』の部分に下のコードをコピペしてください！！

```podfile.
target 'PhotoLibrary' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for PhotoLibrary
ここに追加してね！！！！！！！
 （これを追加）→→ pod 'RealmSwift'
  
  target 'PhotoLibraryTests' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'PhotoLibraryUITests' do
    # Pods for testing
  end

end
```

またターミナルに戻って以下のコードを入力してください！！

```ターミナル.
pod install
```
これでインストールは完了しました！！
てことで今開いているファイルを全て閉じてください！！
え？なんで閉じるの？？？？と思うかもしれませんが
実は新しいファイルができているのでそのファイルを開くためです！！
これまでできていたファイルとは別に[.xcworkspace]というファイルができていると思います。
今回からこちらを立ち上げてください！！
<img width="600" alt="スクリーンショット 2020-08-19 0.40.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679508/0a2f9243-b913-272b-8ec6-fcb402de4e89.png">


というのも・・・
今までのファイルではpodfileを一緒に扱うことができないためこのファイルで扱うことができるからです！！

#まとめ
今回はインストール方法についてまとめてみました。
扱い方については『[次の記事]()』で紹介しようと思います！！
CSSでwidthの注意点とheightは使わないほうがいい理由

#プログラミングの勉強日記
2020年8月19日　Progate Lv.226
　CSSでwidthとheightの指定はわかりやすいので、簡単なプロパティだと思いがちだが、実際にはあまり使用しないことを知った。その理由をまとめておく。
　原則のルールとして親要素の範囲を超えて指定してはいけない。

#width:100%について
　<font color=blue>理由の一つとしてコードが長くなることが上げられる。</font>
　`width:100%`は無駄なコードである。ブロック要素であれば横幅いっぱい広がっているのにも関わず、ブロック要素に`width:100%`を指定しても意味がない。ブロック要素にこの指定は無意味であり、無駄なコードになってしまう。

　また、以下のように初期値である`width:auto`ではpaddingは幅に含まれるが、width:100%にしてしまうとpaddingの分だけ幅を超えてしまう。
![0819.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/8c9bea8b-2e0f-4c45-2b66-140f8bb584bc.png)
　これを避けるために`box-sizing: border-box`を記述しなくてはいけなくなり、コードの量が増えてしまう。
　
#heightを使用してはいけない理由
　[こちらの記事](https://qiita.com/mzmz__02/items/ba36d3a70d90eaaa0b6b)でも扱ったようにレスポンシブデザインを考えることが必要不可欠である。レスポンシブとは、同じコードでPCやタブレット、スマホなどのマルチデバイスに対応させることである。
　レスポンシブはwidthとheightによって変わる。要素のheightを固定してしまうと、以下のように固定した高さを超えてはみ出してしまう可能性や余白が余ってしまう可能性がある。
![0819-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/2afbc5ac-7f21-3780-7931-7603bff7ca8d.png)

　<font color=blue>なのでheightは指定しないほうがいい！</font>

#参考文献
[widthとheightの使い方まとめと注意点について【CSS初心者入門】](https://blog.mimipen.net/entry/2019/09/15/064012)
【初心者向け】laravel学習方法


##【まず初めに】
　今年の４月に新卒で入ったIT総合商社で、6月まで営業部にいましたが、希望を出し社内転職という形でバックエンドエンジニアとして働き、早１ヶ月が立ちました。
業務で使うlaravelを二週間かけて学習したのですが、phpを経験したことなかった僕は、つまずく事が多かったので、
これからphpや、laravelの学習を始めるよ！って人のために僕なりに学習方法をまとめてみました。
参考程度にご覧ください！！
##【laravel とは】
　phpフレームワークであり、MVC(Model, View, Controller)の各機能に分けてwebアプリケーションを実装します。
機能多彩であり、通常であれば何か月とかかる開発を大幅に短縮でき、世界中のwebアプリケーション開発に良く使われています。phpのフレームワークとなっているので、先にphpを学習してから、始めましょう！笑
##【学習方法】
　実際スクールに行かなくても学習できる方法はいくらでもあります、、
お金がある人はスクールに通ってもいいと思いますが、今回は、学習コストを抑えた点で紹介します。

①progate、dotinstallでphpの基礎を学ぶ。
　→月額1000と格安で、様々なプログラミング言語を学びたい放題です。本気出せば、どの基礎講座も１ヶ月以内には終わります。特に終盤のclassは複雑かつ、laravelでも重要になってくるので、公式サイトやググってよく理解しましょう。

②MAMPを使ってlaravelをインストールし、学習する。
　→開発環境は初めはMAMPがオススメです。 学習方法に関しては、Youtubeに参考動画がたくさん載っているので、リンクを貼っときます。

https://www.youtube.com/watch?v=yaitzPzBzuI
-環境構築から簡単なブログ管理アプリの実装を紹介しています！

https://www.youtube.com/watch?v=M7ZV0GKm4lI
-MVCの使い方や文法説明の動画です！

これらの動画を見ながら実装をしていけば、laravelでのWEBアプリケーションの流れをつかめると思います！
もっと細かいところや、複雑な機能を実装したければ、ググってみたり、参考書を買ってみるのもいいと思います！
またudemyというサービスも、実力者たちの解説付きの動画(基礎から応用編)を購入してみれるので、
チェックしておくといいでしょう！
僕はdotinstall、Youtube、Google、udemyこの４つを使って学習しました！

##【最後に】
　まだエンジニアになって日も浅く、覚えなければいけない事だらけです。
今回の投稿が初投稿なので、さらっと紹介させていただきました！
周りにエンジニアの知人がいなく、学習方法など分からず遠回りした経験もしました。
そういった事経験を生かし効率のいい情報を発信していきたいと思い、
少しずつ投稿していきたいと思います！
負荷分散とは？

#負荷分散とは？
サーバーを複数台並列に配置し、リクエストを振り分けて平行で実行させることで、各サーバーの負荷を軽減する方法のこと。

負荷分散は**ロードバランサー**が行う。(中にはapacheなどのソフトウエェアにもロードバランサーの機能を持つものがある)

#負荷分散のメリット

- サーバーごとの処理量が減るため、各サーバーの性能が低くてもシステム全体では多くのアクセスを処理できるようになる。

- 複数のサーバーで同じ処理を実行するため、いくつかのサーバーが故障しても１つでもその役割を担うサーバーが残っていればサービスが継続できる。

以下にて負荷分散の方法について解説する。

#ラウンドロビン方式
- 各サーバーに順番にリクエストを割り振る方式のこと。

- 各リクエストの処理負荷が同等で、各サーバーの性能が同一であれば、負荷は均等になる。

#動的分散方式
- サーバーの負荷を監視し、負荷が少ないサーバーに優先してリクエストを振り分ける方式のこと。

#パーシステンス
- 同一クライアントからのアクセスを判別し、常に同じサーバーへ転送する機能のこと。

- 同じクライアントからのリクエストが１つのサーバーに集中するので、セッション管理がやりやすくなる。
【Flutter】画面サイズに応じて文字サイズを自動で適用する方法

#この記事を読んで習得できること
画面サイズに応じて文字サイズを自動で変えることができるようになる。
結構使うことになるので備忘録として。

#結論
`Text`を`FittedBox`配下に置く。

```sample.dart
FittedBox(
  fit: BoxFit.fitWidth,
  child: Text(
    "あああああああああああああああああああああああテトラポット",
    style: TextStyle(fontSize: 32),
  ),
),
```


![スクリーンショット 2020-08-18 23.42.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389553/51168828-0ce2-6c2d-63e2-9c3da2b14e74.png)

#FittedBoxがなかったら
折り返したり、画面からはみ出たりして、画面がぶっ壊れてしまう。

```sample.dart
Text(
  "あああああああああああああああああああああああテトラポット",
  style: TextStyle(fontSize: 32),
),
```

![スクリーンショット 2020-08-18 23.41.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389553/c501796f-eb07-daac-a55b-46825f0ad8ee.png)

なので、この方法を覚えておくといいかも。

Swiftだとどうやって書くんだっけ？
interface builderでいつも設定してたから覚えてないや…
復習しないとな…
変数命名でよく迷うやつ

#個人的変数命名
今後、どんどん追加していきたい。
コメントも反映します⭐︎

##複数形
| 変数 | 解説 |
|:-:|:-:|
| index  | インデックス (i, idx)  |
| indexes  | indexの配列 (ids) |
| articles  | 記事の配列  |
| article_id  | 記事のID  |
| article_ids  | 記事IDの配列, article_id + s  |
| articles_id  | いくつかの記事をまとめたID  |
| 関数  | 動詞  |
| get_article  |  一つの記事を取得する |
| get_articles  |  複数の記事を取得する |


##よく使う単語
| 関数 | 解説 |
|:-:|:-:|
| get_〇〇  | 〜を取得する  |
| calculate_〇〇  | 〜を計算する |
| generate_〇〇  | 〜を生成する |
| display_〇〇  | 〜を表示する |
| format_〇〇  | 〜を整形する  |
| fetch_〇〇  | 〜を取得する  |
| import_〇〇  | 〜をインポートする  |
| convert_〇〇  | 〜を変換する |
| complement_〇〇  | 〜を補完する |
| save_〇〇  | 〜を保存する |
| show_〇〇  | 〜を表示する |

##Boolean
| Boolean  |   |
|:-:|:-:|
| created_article  |  記事が作成されたか or not |
| is_method〇〇_enabled  |  手法が有効か or not |
リモート接続する手法 telnetとssh

#趣旨
自分のプロジェクトではプログラムなどの資産を別サーバにて管理し、アクセスをSSHで行うようにしています。ここではリモート接続でアクセスする方法をまとめます。
SSHの他リモート接続する方法としてtelnetにて接続する方法もあり、それも含めまとめます。

#telnetとは
「telnet」とは、通信内容・データが暗号化されていないリモート接続を行う通信プロトコルです。
通常 ポート23番 を使用して、暗号化されていない平文で通信を行います。

#sshとは
「SSH」とは、通信内容・データが暗号化されているセキュアなリモート接続を行う通信プロトコルです。
ログインする際「ユーザー名+パスワードによる個人認証システム」があるため、「telnet」よりもセキュリティーレベルが高くなっています。
加えて ポート22番 を使用して暗号化通信を行いますが、ポートは後から変更もできます。

#telnetとsshの違い
現在のリモート接続のほとんどは、セキュリティー上の問題から「telnet」ではなく「SSH」が使用されていますが、「telnet」にも「簡単で利用しやすい・通信速度が速い」などの利点もあります。

「telnet」は「通信内容が暗号化されていない遠隔操作の仕組み・プロトコル」ですが、「SSH」は「通信内容が暗号化されているセキュアな遠隔操作の仕組み・プロトコル」という違いがあります。
サイトにgoogleマップ30秒で埋め込む方法

#この記事の対象者
・独学でウェブ開発の勉強をしていて、Google mapを埋め込んで見たと思ったけど、難しくてよく分からない人
・サイト内で目的地までの地図を示した人
#google mapの埋め込みは簡単
自分も始めはGoogle Maps APIを使って地図を表示させようとしていましたが手間が多すぎるのでおすすめしません。そこで、もっと簡単な方法でGoogle Mapを埋め込めないか調べた所簡単な方法を見つけたので紹介します。
※**自分が見た限り**ページに埋め込むだけなら商業利用でも問題はないと思います
#google mapを埋め込もう
まずは、[google map](https://www.google.co.jp/maps/?hl=ja)と検索してmapを開く。
次に自分のページに乗せたい場所を検索して![スクリーンショット 2020-08-18 23.28.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/5ecfe5cc-4ceb-9825-6969-37d4b59c3af6.png)
（今回は例なので適当にNIMSと検索しました特に意味は無いです。）
共有の左から5番目にある共有をクリックして、さらに**地図を埋め込む**を埋め込むをクリック
![スクリーンショット 2020-08-18 23.30.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/bfc294c9-921f-ea67-031a-5e93448000e3.png)
そうすると、こん感じの画面が出るので**HTMLにコピー**を押して下さい。
最後にこれをhtmlの任意の場所に貼り付けて完成です。
何もいじっていないhtmlに貼り付けるとこんな感じになります。
![スクリーンショット 2020-08-18 23.39.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/70fa0b01-4cbe-89b0-0ff1-d9be8984fd2a.png)
コード

```html
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>

<body>
    <iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d25792.406650459066!2d140.10625505215506!3d36.09224890527196!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x60220cc2a33e07a3%3A0x7c1de3ba4bdf8e2a!2z5Zu956uL56CU56m26ZaL55m65rOV5Lq654mp6LOq44O75p2Q5paZ56CU56m25qmf5qeL77yITklNU--8ieWNg-ePvuWcsOWMug!5e0!3m2!1sja!2sjp!4v1597760967057!5m2!1sja!2sjp" width="600" height="450" frameborder="0" style="border:0;" allowfullscreen="" aria-hidden="false" tabindex="0"></iframe>
</body>

</html>
```
ちなみに最後らへんにあるwidthやheightの値をいじる事で大きさをいじる事も出来るらしいです。
#終わりに
最後まで記事をご覧いただきありがとうございました。
他の記事でもこれ違うだろなどと思った方がいたら遠慮せずにコメントをくれたら嬉しいです。
今回参考にさせてもらった[サイト](https://support.google.com/maps/answer/144361?co=GENIE.Platform%3DDesktop&hl=ja)
【初心者でもわかる】スマホの画像は、倍のサイズじゃないとボケる。

# どうも7noteです。レスポンシブサイトを作成する時の画像サイズに注意！

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

https://naruweb.com/technique/imagesize/
SCC で MIP のラベル操作ログを出力する。

## この記事は
MIP (Microsoft Information Protection) は Office 365/Microsoft 365 のポータルから管理されます。
SCC (セキュリティアンドコンプライアンス) の監査ログで、MIPLabel という MIP に関するログを出力する方法を記載します。

## 画面では
機密度ラベル、秘密度ラベルに関する アクティビティでは、このフィルタが提供されていますが、少し荒いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94849/e6cd8414-ff55-8e2e-b66b-a1904d447688.png)

## CUI では
* Exchange Online Powershell V2 モジュールを端末にインストールします。
https://docs.microsoft.com/ja-jp/powershell/exchange/exchange-online/exchange-online-powershell-v2/exchange-online-powershell-v2?view=exchange-ps#install-the-exo-v2-module 

* Exchange Online に接続します。

```
$UserCredential = Get-Credential

```

3.  以下のコマンドで、ExchangeOnline のセッションに接続します。

```
Connect-ExchangeOnline -Credential $UserCredential -ShowProgress $true
```

4. 下記のコマンドで、監査ログを CSV 形式で出力します。MIPLabel のレコード値のみが出力されます。

```
Search-UnifiedAuditLog -StartDate "04/28/2020 00:00" -EndDate "05/01/2020 00:00" -ResultSize "5000" -Formatted -RecordType "MIPLabel" | Export-Csv -NoTypeInformation -Encoding UTF8 -path "c:\mip\export.csv"
```
https://docs.microsoft.com/en-us/powershell/module/exchange/policy-and-compliance-audit/search-unifiedauditlog?view=exchange-ps
 
＜コマンド実行後の CSV ファイル出力例＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94849/7ea31f14-64ab-d7c2-793d-8ccf2df630eb.png)
VuePressにTailwind CSSを導入する方法

## 最低限トップページをVuePressで表示させる

VuePressでトップページを表示させる手順は公式ドキュメントに沿って行ってください。

[VuePress 公式ドキュメント](https://v1.vuepress.vuejs.org/guide/getting-started.html)

この時点でのディレクトリ構成は以下の通りです。

```
.
├── docs
│   ├── README.md
├── package.json
```

## Tailwind CSSの導入

手順は基本的にTailswind CSSの公式ドキュメントに記載された通りです。

[Tailwind CSS 公式ドキュメント](https://tailwindcss.com/docs/installation)

1. npm or yarnでTailwind CSSをインストールする

ルートディレクトリで以下コマンドを実行

```
# Using npm
npm install tailwindcss

# Using Yarn
yarn add tailwindcss
```

2. ./docs/.vuepress/styles/index.styl を作成

```
mkdir ./docs/.vuepress
mkdir ./docs/.vuepress/styles
touch ./docs/.vuepress/styles/index.styl
```

ちなみに、上記ディレクトリ構成でindex.stylを配置すると、vuepressが自動的にindex.stylを認識、デフォルトのCSSファイルとして扱ってくれます。

この時点でのディレクトリ構成は以下の通りです。

```
.
├── docs
    ├── README.md
    ├── .vuepress
        ├── styles
            ├── index.styl
├── package.json
```

3. ./docs/.vuepress/styles/index.styl に Tailwind CSSの設定を追加

./docs/.vuepress/styles/index.styl に以下を追加

```css
@tailwind base;
@tailwind components;
@tailwind utilities;
```

自分で全体に効かせるCSSを書きたいときは、
@tailwind components; と @tailwind utilities; の間に記述しましょう。

```
@tailwind base;
@tailwind components;

（ここにCSSを記述）

@tailwind utilities;
```

4. ./docs/.vuepress/config.js を作成して設定を追加

```
touch ./docs/.vuepress/config.js
```

./docs/.vuepress/config.js の内容を以下の通りにします。

```javascript
module.exports = {
  plugins: [
    // ...
    require('tailwindcss'),
    require('autoprefixer'),
    // ...
  ]
}
```

この時点でのディレクトリ構成は以下の通りです。

```
.
├── docs
    ├── README.md
    ├── .vuepress
        ├── styles
            ├── index.styl
        ├── config.js
├── package.json
```

5. サーバーを再起動して確認

もしサーバーを起動している状態なら再起動しましょう。

これでVuePressでTailwind CSSが使えるようになりました！
javascript ２つの配列の平均値

複数の数値が定義されている配列data1とdata2から「data1とdata2を合わせた平均値」と「平均値以上の数値」を表示するプログラムを作成する。

```javascript

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>課題</title>
    <script>
        var data1 = [59, 39, 100, 2, 15, 40, 84, 97];
        var data2 = [63, 18, 64, 97, 50, 98];
        var sum = 0;
        
        for(var i = 0; i < data1.length; i++) {
            sum += data1[i];
        }
        for(var j = 0; j < data2.length; j++) {
            sum += data2[j];
        }
        var ave = sum/(data1.length+data2.length);
        document.write('<p>data1とdata2を合わせた平均値:'+ave+'</p>');
        document.write('<p>平均値以上の数値は以下</p>')
        
        for(var i = 0; i < data1.length; i++) {
        　if(data1[i]>=ave) {
            document.write('<p>data1:'+data1[i]+'</p>');
          }
        }
        for(var j=0; j<data2.length; j++){
        　if(data2[j]>=ave) {
            document.write('<p>data2:'+data2[j]+'</p>');
        　}
        }
        
    </script>
</head>
<body>
</body>
</html>

```

初めて学習したときはこれでもかなり苦戦ししました。for文とif文をある程度理解していればかんたんになりますねぇ。
【Rails 】マイグレーションファイルについて

# マイグレーションファイルとは
マイグレーションファイルとはデータベースに加える変更内容を記載するファイルです。

## 基本のコマンド

```:command

# モデル作成
$ rails g model モデル名

# マイグレーションファイル作成コマンド
$ rails g migration クラス名
 ```
マイグレーションファイルはモデル作成時に作成されます。
マイグレーションファイル単体でクラス名を指定し作成することも可能です。
クラス名は「アクション+テーブル名」で作成するのがわかりやすくていいですね！
これで/db/migrate/タイムスタンプ_クラス名.rb というファイルが作れる。ここに、スキーマの変更点を記載しましょう！

## テーブルの作成

```:command
$ rails g model モデル名　カラム名：データ型
```

モデル作成時にマイグレーションファイルに記載する内容を「カラム名：データ型」で指定します。

指定できるデータ型は下記の通りです。

* string : 文字列
* text : 長い文字列
* integer : 整数
* float : 浮動小数
* decimal : 精度の高い小数
* datetime : 日時
* timestamp : タイムスタンプ
* time : 時間
* date : 日付
* binary : バイナリデータ
* boolean : Boolean

## マイグレーションファイルをDBへ反映させる

```:command

# マイグレーションファイルの実行
$ rails db:migrate
```
このコマンドを実行するとDBへマイグレーションファイルの内容が反映される。

## マイグレーションファイルのロールバック

```:command
# マイグレーションファイルをロールバックする
$ rails db:rollback
```
実行したマイグレーションファイルをロールバックする。

## マイグレーションファイルの確認
```:command
# 実行したマイグレーションファイルの確認
$ rake db:migrate:status
```
このコマンドで実行したマイグレーションファイルの内容確認ができる。
Xcode11でObjective-CをMRCで動かす

# 環境

- macOS Big Sur 11.0 Beta
- Xcode 11.6

# Objective-C言語でMRC有効方法

- Xcode11ではARCがデフォルト有効なため、`PROJECT` -> `Build Settings` から `Objective-C Automatic Reference Counting` の値を `NO` に変更する
![スクリーンショット 2020-08-18 23.02.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237942/52fa4f11-e3ca-e19b-6617-14b7552a7e96.png)


- 上記だけだとXcode11では、main.mのmain()でEXC_BAD_ACCESSが発生してしまう。
![スクリーンショット 2020-08-18 23.03.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237942/2611eaba-ed70-a509-9a9f-889af57f1bb3.png)

- main()を以下のように変更するとMRC環境で実行が可能となる。

```objectivec
int main(int argc, char * argv[]) {
    NSString * appDelegateClassName;
    @autoreleasepool {
        // Setup code that might create autoreleased objects goes here.
        appDelegateClassName = NSStringFromClass([AppDelegate class]);
        return UIApplicationMain(argc, argv, nil, appDelegateClassName);
    }
}
```
AmazonLinux2 に mongo をインストールして mongo コマンドを使えるようにする。

前提としてec2で connect sshしておく

```bash

$ sudo yum update -y

$ sudo vi /etc/yum.repos.d/mongodb-org-3.2.repo
```

```
[mongodb-org-3.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.2.asc
```

:wq で抜けて保存、 sudo をコマンドが抜けていたら保存できないので、:q!でもう一度

```bash

$ sudo yum install -y mongodb-org -y

$ sudo service mongod start
```

# 停止

```bash

$ sudo service mongod stop
```

# 再起動

```
$ sudo service mongod restart
```
# mongo シェルの起動

```
$ mongo
```

参考サイト＋さらに詳しくはここ
https://dev.classmethod.jp/articles/mongodb-on-ec2/
Enterprise A2019.15 リリースノートの一部和訳


先月に続き、新バージョンのA2019.15のリリースノートが公開されていたので、新機能の部分だけひとまず和訳します。
正確な翻訳ではないので、細かな部分は原文もチェックしてください。
https://docs.automationanywhere.com/bundle/enterprise-v2019/page/enterprise-cloud/topics/release-notes/release-a2019-15.html


**リリース日： 2020年8月14日**
A2019.15 (ビルド 5933)
IQ Bot (ビルド 5931)
Discovery Bot (ビルド 5931)


#Enterprise A2019
### 新機能
#####Discovery BotとAutomation Anywhere Robotic Interface
#####11.x と 10.x から A2019 へのマイグレーション (現在はMigration Early Adopter Programに参加の組織向け)
現在、Enterprise A2019への移行は、一部のお客様のみがMigration Early Adopter Programを介して利用できます。 このプログラムの詳細や、すべてのお客様が移行を利用できるようになる時期について知りたい場合は、Automation Anywhereの担当者にお問い合わせください。
#####Perform an action on multiple objects of the same type
AISenseレコーダーのvariable anchorを使用すると、同じタイプの複数のオブジェクトに対してアクションを実行できます。
※このセクションは実際試したあと、アップデート予定

#####11.x botのEnterprise A2019からの実行。
V11 TaskBotパッケージを使用すると、Enterprise A2019から、11.x Enterprise Control Roomへ11.x Botの実行指示が出せます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/293b874f-11d9-95e2-bd88-7fa3f03c7f38.png)

#####Interactive formsの機能強化
Interactive formsには、次の更新が含まれます。

- Change labelアクションでDynamic elementも操作可能になりました。
- Dynamic areaアクション：
 - Add row in Dynamic area[動的エリアに行を追加]アクションで、最大4つのエレメントを追加できます。
 - Add element  [エレメントの追加] の設定画面で、Checkbox, Dropdown, File, Snapshot, RadioButton, Text Area, TextBox といったエレメントを追加出来るようになりました。

※このあたりは実際試してみたほうが早い。

#####Oracle EBSのテーブルの操作に対応
Universal RecorderまたはRecorder> Captureアクションを使用して、Oracle EBSテーブルからデータを読み取ります。 以下のアクションがサポートされるようになりました。

- Get Total Row
- Get Total Column
- Get Cell text by Index
- Get Cell index by text
DockleのGitHub Action作った

KubeConでも話題に上がっていたTrivyやDockleはもうみなさんご存知ですよね?w
CI/CDのサービスとしてGitHub Actionsを利用しているのですが、もっと手軽にTrivyやDockleを使用したいなと思っていました。
Trivyの方は公式で[trivy-action](https://github.com/aquasecurity/trivy-action)がありますが、Dockleはなかったので作成してみました。
リポジトリはこちら -> [dockle-action](https://github.com/hands-lab/dockle-action)
trivy-actionに合わせてdockle-actionとネーミングしてみました (~~パクリとは言わせないぞ~~

~~公開しようとしたらMarketplaceへの公開許可がいるようで、さらに管理者権限ないとダメみたいなので、まだ公開できていません~~
~~かっさらうのは今がチャンス~~

**GitHub Actions Marketplaceに公開しました** :tada::confetti_ball:
https://github.com/marketplace/actions/runs-dockle

# actionを作成する上でのハマりポイント

以前にいくつかTypeScriptでactionを作成したことがあるのですが、今回はdockerを使用してactionを作ることにしました。そこでハマったポイントを紹介したいと思います。
最初は以下のように書いていました。

```yaml
runs:
  using: 'docker'
  image: 'docker://goodwithtech/dockle:latest'
  args:
    - '--exit-code ${{ inputs.exit-code }}'
    - '--exit-level ${{ inputs.exit-level }}'
    - '${{ inputs.image }}'
```

これでGitHub Actions上でテストしたら `flag provided but not defined: -exit-code 0` というエラーメッセージがdockleが出力しました。[こちら](https://github.com/hands-lab/dockle-action/runs/998387501?check_suite_focus=true)でGitHub Actionsのエラーの全容を見ることができます。
なぜエラーになったかまだわかっていないのですが、trivy-actionを参考にさせていただき以下のように修正してみました。具体的にはargsパラメータに定義しているフラグと値の間をスペースから=に変更しました。
そしたらテストは無事パスしました。[こちら](https://github.com/hands-lab/dockle-action/runs/998497846?check_suite_focus=true)から確認できます。
これからactionを作成する方は気をつけてください。

```yaml
runs:
  using: 'docker'
  image: 'docker://goodwithtech/dockle:latest'
  args:
    - '--exit-code=${{ inputs.exit-code }}'
    - '--exit-level=${{ inputs.exit-level }}'
    - '${{ inputs.image }}'
```
SQL 更新前と更新後のテーブルの状態を比較する

# 合ってそうだけどダメなやり方

```shell
mysqldump -u admin -h hostname -ppassword DBname tablename > before.ret

//ここで何かしらの更新処理

mysqldump -u admin -h hostname -ppassword DBname tablename > after.ret

diff before.ret after.ret

```

# 正しいやり方

mysqldumpを使わず、select文の結果を出力して比較します

```shell

mysql -u admin -h hostname -ppassword DBname < select_tablename.sql > before.ret

//ここで何かしらの更新処理

mysql -u admin -h hostname -ppassword DBname < select_tablename.sql > after.ret

diff before.ret after.ret

```

▼select_tablename.sqlの中身

```sql
select * from tablename;
```
Singletonパターン

###Singletonパターン
インスタンスが1つしか存在しないことを保証するパターンのこと。

###Singletonの役
Singletonの役は唯一のインスタンスを得るためのstaticメソッドを持つ。
このメソッドはいつも同じインスタンスを返す。

````java
package singleton;

public class Singleton {
	private static Singleton singleton = new Singleton();

    // コンストラクタをprivateにすることでクラス外からコンストラクタを呼び出すことを禁止する
	private Singleton() {
		System.out.println("インスタンスを生成しました");
	}

    // インスタンスを返すstaticなメソッドを提供する
	public static Singleton getInstance() {
		return singleton;
	}
}
````

###呼び出し元

````java
package singleton;

public class Main {

	public static void main(String[] args) {
		System.out.println("Start");
		Singleton obj1 = Singleton.getInstance();
		Singleton obj2 = Singleton.getInstance();
		if (obj1 == obj2) {
			System.out.println("同じインスタンス");
		} else {
			System.out.println("同じインスタンスではない");
		}
		System.out.println("End");
	}
}

// Start
// インスタンスを生成しました
// 同じインスタンス
// End
````

###サンプル

````java
package singleton;

public class TicketMaker {
	private static TicketMaker ticketMaker = new TicketMaker();
	private int ticket = 1000;
	private TicketMaker() {
	}

	public static TicketMaker getInstance() {
		return ticketMaker;
	}

	// 複数のスレッドから呼び出せれた場合でも正しく動作するようsyncronizedを付与
	public synchronized int getNextTiketNumber() {
		return ticket++;
	}
}
````

###インスタンスの数が3つに限定されているクラス

````java
package singleton;

public class Triple {
	private static Triple[] triples = new Triple[] {
			new Triple(0),
			new Triple(1),
			new Triple(2),
	};

	private int id;

	private Triple(int id) {
		System.out.println("The instance" + id + " is created");
		this.id = id;
	}

	public static Triple getInstance(int id) {
		return triples[id];
	}

	public String toString() {
		return "[Triple id = " + id + "]";
	}

}
````

````java
package singleton;

public class Main {

	public static void main(String[] args) {
		System.out.println("Start");
		for (int i = 0; i < 9; i++) {
			Triple triple = Triple.getInstance(i % 3);
			System.out.println(i + ":" + triple);

		}
		System.out.println("End");

	}
}
// Start
// The instance0 is created
// The instance1 is created
// The instance2 is created
// 0:[Triple id = 0]
// 1:[Triple id = 1]
// 2:[Triple id = 2]
// 3:[Triple id = 0]
// 4:[Triple id = 1]
// 5:[Triple id = 2]
// 6:[Triple id = 0]
// 7:[Triple id = 1]
// 8:[Triple id = 2]
// End
````

こちらを参考にさせていただきました。
<a href="https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88Java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80-%E7%B5%90%E5%9F%8E-%E6%B5%A9/dp/4797327030/ref=sr_1_1?ie=UTF8&qid=1454743284&sr=8-1&keywords=java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80">増補改訂版Java言語で学ぶデザインパターン入門</a>
【Laravel】ORM

こちらの記事は以下の書籍を参考にアウトプットとして執筆しました。
[PHPフレームワーク Laravel入門 第2版](https://www.amazon.co.jp/dp/B08625YD7H/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)

#モデルの更新・削除・保存
##モデルの新規保存
1. モデルのインスタンスを作成
2. 値を設定
3. インスタンスの保存

やり方はイトイとあるが、結局はインスタンスを作成して値を設定してsaveするという流れ
##モデルの更新
モデルを保存する点に関して新規作成と同じ
違いはモデルクラスをnewではなく、`モデルクラス::find`でインスタンスを用意する点
##モデルの削除
deleteメソッドを呼び出すだけ

```
モデルインスタンス->delete();
```
#モデルのリレーション
リレーションは複数のテーブルを関連付けること
##2つのテーブルの関係について
###主テーブルと従テーブルの関係

|種類|説明|
|---|---|
|主テーブル|外部キーを持たないテーブル|
|従テーブル|外部キーにより主テーブルとの関連情報を保管しているテーブル(外部キーを持っているテーブルのこと)|

##has One結合
2つのテーブルが1対1の関係で関連付けられている
主テーブルから従テーブルを取得する

hasOneメソッドの返り値を返すことで定義できる
##has Many結合
1対多の関連付け
hasManyメソッドを使う
##belongs To結合
上記の2つは主テーブルから従テーブルを取り出すもので、belongs Toはその逆
従テーブルから主テーブルを取り出す
基本的に1つだけ取り出される。
##関連レコードの有無
###特定のリレーションの値を持つ
```
モデル ::has(リレーション名)->get();
```
###指定のリレーションの値を持たない
```
モデル ::dosenthas(リレーション名)->get();
```
##withによるEagerローディング
```
モデルクラス名:all
```
これで全レコードの取得ができるが、これはDBにとってはアクセス回数が多くなることから負担になる。

DBへのアクセスを減らすにはwithメソッドを使う

```
モデル ::with(リレーション名)->get();
```
これはRagerローディングと呼ばれ、一回のallメソッドで膨大なアクセスを行うときに劇的な効果を得る
PHP学習メモ②



###　条件分岐

```PHP:PHP
$score = 55;

if($score >= 80){
  echo "Great!" . PHP_EOL;
}elseif($score >=60)
  echo "Good!" . PHP_EOL;
else{
  echo "OK!" . PHP_EOL;
}

# ifの場合には、「;」はいらない
# {}で囲まれている内容をブロックという
```

###　論理演算子

```PHP:PHP

# 悪い例
$score = 60;
$name = "taguchi";

if($score >= 50 ){
  if($name === "taguchi"){
    echo "Good job!" . PHP_EOL;
  }
}

# 《論理演算子》
# && and なおかつ
# || or  もしくは
# !  〜ではない

# 良い例
$score = 60;
$name = "taguchi";

if($score >= 50 && $name === "taguchi"){
    echo "Good job!" . PHP_EOL;
}
```

###　条件分岐

```PHP:PHP
#悪い例
# 「===」が並んでいるときはswichを使う
$signal = 'blue';

if ($signal === 'red') {
  echo 'Stop!' . PHP_EOL;
} elseif ($signal === 'yellow') {
  echo 'Caution!' . PHP_EOL;
} elseif ($signal === 'blue'){
  echo 'Go!' . PHP_EOL;
}

```

```PHP:PHP
#良い例
$signal = 'blue';

switch($signal){
  case "red":
    echo 'Stop!' . PHP_EOL;
    break;
  case "blue":
    echo 'Go!' . PHP_EOL;
  break;

  case "yellow":
    echo 'Caution!' . PHP_EOL;
  break;
}
```

```PHP:PHP
# 指定したケース以外の場合
  default;
  echo "Wrong signal" . PHP_EOL;
  break;
```

###　繰り返し構文

```PHP:PHP
for ($i = 1; $i <= 5; $i++){
  echo "Hello" . PHP_EOL;
}
```

```PHP:PHP
for ($i = 1; $i <= 10; $i++) {
  if($i === 4){
    continue;
  }
  echo $i . PHP_EOL;
}

# 「continue」を使って、4の処理だけをスキップできる
```

```PHP:PHP
for ($i = 1; $i <= 10; $i++) {
  if($i === 4){
        break;
  }
  echo $i . PHP_EOL;
}

# 「break」を使って、4までの処理で止める
```

```PHP:PHP
$hp = 100;

while($hp > 0){
  echo "Your HP:$hp" . PHP_EOL;
  $hp -= 15;
}
# 条件を書き忘れると、無限ループ
```
【R】 C++を使って関数を書く

R初心者なのですが、tidyverseなどの登場でプログラミングがだいぶ楽になったように思います。R自体はそこそこの計算速度はあるのですが、部分的にはC++で書ければと思いSWIGとc++で関数を書いてみました。

###1. C++で関数を書く
例として次のような関数を書いてみました。C++で書いた普通の関数です。

twicefold: 整数ベクトルxsを二倍した値を返す(Rからは浮動小数点型で良いが整数に変換してから計算する)
addv: ベクトルxsにyを加えた値を返す
string_length: 文字列のベクトルを渡し、文字列の長さのベクトルを返す

```c++:test.cpp
#include "test.hpp"
using namespace std;

vector<int> twicefold(vector<int> xs){
    vector<int> result;
    for(const auto& x : xs){
        result.push_back(x*2.0);
    }
    return(result);
}

vector<double> addv(vector<double>xs, double y){
    vector<double> result;
    for(const auto& x : xs){
        result.push_back(x+y);
    }
    return(result);
}

vector<int> string_length(vector<string> str_ary){
    vector<int> lengths;
    for(const auto& str : str_ary){
        lengths.push_back(str.length());
    }
    return(lengths);
}
```

```c++:test.hpp
#include <string>
#include <vector>
using namespace std;

vector<int> twicefold(vector<int> xs);
vector<double> addv(vector<double>xs, double y);
vector<int> string_length(vector<string> str_ary);
```

ヘッダファイルも作っています。Rの関数の引数は、ベクトルを受け取れる方が使える範囲が広くなりますので、なるべくそのように書いた方が便利です。

###2. SWIGのインターフェース定義ファイル作成

```test.i
%module test
%{
#include "test.hpp"
%}

%include <std_string.i>
%include <std_vector.i>
%template(stringVector) std::vector<std::string>;
%include test.hpp  // 上の行の%template~より後に
```

vector\<string>の引数や戻り値があるときには、下から2行目の%template...を最終行の%include...の前に入れておいてください。名称は重ならなければ何でも良いです。
vector\<int>やvector\<double>の場合には必要ないようです。

###3. 拡張ライブラリを作成
以上のファイルを同じフィルダに入れて、次のコマンドを実行します。
2行目のCPLUS_INCLUDE_PATHはRdefines.hのあるフォルダを指していますので、環境に応じて書き換えてください。

```
swig -c++ -r test.i
CPLUS_INCLUDE_PATH=/usr/include/R R CMD SHLIB -fPIC test.cpp test_wrap.cxx
```

test.Rとtest.so(拡張子はOSにより異なる)ができます。他のファイルもできますが実行にはこの2つのファイルが必要です。

###4. テスト用のプログラム

```R:test01.R
dyn.load(paste("test", .Platform$dynlib.ext, sep=""))
source("test.R")
cacheMetaData(1)

print(twicefold(2))
print(twicefold(c(2,3,4)))
print(addv(c(2,3,4),2))
print(string_length("12345"))
print(string_length(c("12345", "678")))

library(tidyverse)
c(2,3,4) %>% addv(2) %>% print()
```
最初の3行はライブラリを読み込む時に必要ですので忘れないように。
以上で拡張ライブラリができるはずです。

###5. クラスのメンバ関数を作る
C++でクラスを定義し、メンバ関数を作ると最後のtest02.Rに書いてあるような使い方ができます。
上と同じフィイル名を使っていますので、別のフォルダを作成して試してみてください。

```C++:test.cpp
#include "test.hpp"
using namespace std;

Test::Test(double x){
    num=x;
}
vector<double> Test::mul(vector<double> ys){
    vector<double> result;
    for(const auto& y : ys){
        result.push_back(num*y);
    }
    return(result);
}
```

```C++:test.hpp
#include <vector>
using namespace std;

class Test{
private:
    double num;
public:
    Test(double x);
    vector<double> mul(vector<double> ys);
};
```

```test.i
%module test
%{
#include "test.hpp"
%}

%include <std_vector.i>
%include test.hpp
```

拡張ライブラリを作成するためのコマンドは上と同じです。

テスト用プログラム

```R:test02.R
dyn.load(paste("test", .Platform$dynlib.ext, sep=""))
source("test.R")
cacheMetaData(1)

v <- Test(4.0)
print(v$mul(3.3))
print(v$mul(c(2,3.3)))

library(tidyverse)
c(2,3.3) %>% v$mul() %>% print()
```

CentOS 8.2
macOS 10.13.6
SWIG 4.0.2
R 4.0.2
Traditional WebのWidgetに動的にクラスを適用する

 Version 11環境のTraditional Webでの実現方法を検討。

# 確認環境
Personal Environment(Version 11.9.0 (Build 16900))
Service Studio(Version 11.8.4)

以下で示す実装例では、特定の条件を満たすときだけ、以下のクラスを適用してみます。

```css
.Button-on {
    font-weight: bold;
    font-size: 24px;
    background-color: #f00;
}
```

# If Widgetを利用する方法
分岐がシンプルな場合に使うパターンです。

## 実装方法
If WidgetのConditionに分岐条件を設定し、True側に「あるクラスを設定したWidget」、False側には、「また違うクラスを設定したWidget」を配置しておきます。

式を使わないので、切り替えを行っていることが保守担当者にも比較的わかりやすいので、可能な場合はこの方法が良いと思います。

## 実装例
If WidgetのConditionにToggleButtonに紐付けたローカル変数を設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/1262c742-bdbc-7c1d-eac8-c3cf04fbe111.png)

Toggle ButtonがONのときに表示するButton (クラス名は、Style Classesプロパティに半角スペース区切りで複数設定できる）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/60b2ad06-764a-a5df-712e-ad43d117bbda.png)

OFFのときに表示するButton
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/33bba14f-255d-34cb-2b35-07218c682a68.png)

実行例（表示するのはIfのTrue/Falseの一方のみ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/d74687e4-2885-59f0-ccd9-e95c1eac8c20.png)

# Extended Propertiesを使う方法
クラス名を式で書ける方法です。
柔軟な記述ができますが、式の記述は保守担当者に見落とされがちなので気を付ける必要があります。

## 実装方法
WidgetのExtended Properties (プロパティエディタの一番下）に記述します。
Widgetがブラウザに表示されるときにはHTMLのタグに変換されますが、そのタグの属性を任意に指定できるプロパティです。

Propertyにclass、Valueに特定の条件式で出力を変更するIf文を記述。
OutSystemsの式としてclass属性に指定する値を書けるため、だいたいどんな条件でも書けます。

## 実装例
IsOnというBoolean型変数の値がTrueのときに、classに「Button」「Button-on」クラスを付与し、Falseのときに「Button」のみを付与する例。

```
If(IsOn, "Button Button-on", "Button")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/e7963df5-9b0e-f1e2-b9b3-c2210d3a3e3a.png)

実行例（HTMLタグ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/d0e0cb10-8f87-999d-1e32-30482e6f1795.png)

# JavaScriptを利用する方法
好きなロジックを書けますが、Low-Codeらしさが活かせないのと、保守担当者にJavaScriptの知識も要求してしまうので避けたい方法。
Traditional Webであれば、jQueryが組み込まれているため、これを使うのが簡単ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/083ecfea-b526-3284-580c-8c465bdcd938.png)

この例では、ButtonのJavaScriptのクリックイベントをExtended Properties「onclick」で拾って、クリックしたButton自身にclassを追加しています。
最後の「return false;」は本来のイベント処理を中止（PreparationやScreen Actionが動かないように）しています。

もし、他のWidgetを操作したいときは、WidgetのIdプロパティでHTML上でのid属性が取得できるのでこれを利用してください（Nameプロパティを設定する必要あり）。

また、Server ActionからJavaScriptを動かしたいときは、RunJavaScript Action (HTTPRequestHandler) が使えます。
Rustのデータ型について


# まえがき

この記事はRUSTチュートリアルをZerobillbank社内メンバー（有志）で勉強がてら、可能な限りわかりやすく内容を書き出す企画の一部です。

なお、初学者のため（略）という免責を打ちつつ間違いなどあればコメントで教えていただけますと一同嬉しく思います！

本項は変数と可変性について記載します。
https://doc.rust-jp.rs/book/second-edition/ch03-01-variables-and-mutability.html

# データ型

まずRustは静的型付き言語ですので、コンパイル時に全ての変数の型が判明している必要があります。
今回は基本となる「スカラー型」と「複合型」についてかきます。

## 型推論

2つの型の前に型推論についてです。

Rustには型推論があるので、基本は値や使用法に基づいてコンパイラが自動で型を判別します。


```rust
let guess: u32 = "42".parse().expect("Not a number!"); 
```
ただし、複数の型になる可能性がある場合は型注釈が必要です。


```rust
let guess = "42".parse().expect("Not a number!"); // この場合は型が推論出来ずにコンパイルエラー

error[E0282]: type annotations needed
              (型注釈が必要です)
 --> src/main.rs:2:9
  |
2 |     let guess = "42".parse().expect("Not a number!");
  |         ^^^^^ cannot infer type for `_`
  |               (`_`の型が推論できません)
  |
  = note: type annotations or generic parameter binding required
    (注釈: 型注釈、またはジェネリクス引数束縛が必要です)
```

## スカラー型

### 整数型

整数は符号あり or 符号なしとサイズによって以下の型があります。

| 大きさ | 符号付き | 符号なし |
|--------|----------|----------|
| 8-bit  | i8       | u8       |
| 16-bit | i16      | u16      |
| 32-bit | i32      | u32      |
| 64-bit | i64      | u64      |
| arch   | isize    | usize    |

isizeとusizeは実行環境のCPUアーキテクチャに合わせてサイズが決まる型のようです。


### 浮動小数点型

浮動小数点数は2種類の基本型があります。
f32型、f64型です。

下記のとおり、明示的に型を指定しない場合は64bitになります。

```
fn main() {
    let x = 2.0; // f64
    let y: f32 = 3.0; // f32
}
```

### 論理値型

```
fn main() {
    let t = true;
    let f: bool = false;
}
```

### 文字型

文字型としてchar型が用意されています。
char型はユニコードのスカラー値を表します。

```
fn main() {
   let c = 'z';
   let z = 'ℤ';
   let heart_eyed_cat = '😻';
}
```

Stringなどの文字列型は別の記事で紹介します。

## 複合型

### タプル型

複数の値を一つにまとめることができます。
また、まとめた値は分解することができます。

```
fn main() {
    let tup = (500, 6.4, 1);
    let (x, y, z) = tup; //　分解
    println!("The value of y is: {}", y);
}
```

### 配列型

一般的な配列です。
ただし、Rustの配列は固定長なので注意が必要です。後からサイズを伸ばすことも縮めることもできません。

```
fn main() {
    let a = [1, 2, 3, 4, 5];
}
```

1年の月の名前を扱うプログラムなどの場合は月を追加したり削除する必要はないと思うので、
配列が適してるかもしれません。

```
let months = ["January", "February", "March", "April", "May", "June", "July",
              "August", "September", "October", "November", "December"];
```

可変長のコレクション型を使いたい場合は標準ライブラリで用意されているベクタ型を使う必要があります。

#### 配列の要素にアクセス

```
fn main() {
    let a = [1, 2, 3, 4, 5];

    let first = a[0];
    let second = a[1];
}
```


## さいごに



ZEROBILLBANKでは一緒に働く仲間を募集中です。
[ZEROBILLBANK JAPAN Inc.](https://zerobillbank.com/%e3%81%8a%e5%95%8f%e3%81%84%e5%90%88%e3%82%8f%e3%81%9b/)
[JavaScript] reduceは可読性が悪くループで置き換え可能なので使わないようにしている話

# reduceは使いこなすのが難しい？

reduceを見ても、なんだこりゃ？という感じで、使うのが難しいなと思っていました。

なので、自分が reduce を使いこなせないとよいプログラマではなく、reduce を使いこなすのがよいプログラマなのか？と感じたこともありました。

で、下記のような話を目にしました。

[なぜGuidoはmap() やfilter(),reduce() そしてlambdaをPython 3から取り除きたかったのですか？ - Quora](https://qr.ae/T9OeHv)

> Pythonの作成者であるGuido van Rossumは、関数型プログラミングがあまり好きではありません。このことは周知の事実です。
>
> Guido:「私は現実世界でのコードの読みやすさと有用性を重視しています。map()とfilter()が適切な場合もいくつかありますが、他のケースではPythonのリスト内包表記があるのです。わたしがreduce()を嫌いになったのは、それを使うとほとんど常に「（a）sum()を実装するのにしか使われていない」「(b)読み取り不可能なコードになってしまう」ということからです。

Python作成者の方はとても天才の部類にはいる方だと思いますが、その人でも難しいというか、読み取り不可能なコードになるということをすっぱりと見抜いていたのですね。

私は Python についてはよく知らないのですが、リンク先記事でのGuido氏の判断は見事だと思います。

JavaScriptではsumは組み込み関数ではないですが、関数化してしまえばいいわけですし、sumをreduceではかけなくてもループなら簡単に書けます。そして、sumする以外の場面でreduceが有効な場面はあまりありません。

# reduceはループ回数が読み取りにくい

MDNで紹介されている非常に簡単なサンプルです。
[Array.prototype.reduce() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)

```js
const array1 = [1, 2, 3, 4];
const reducer = (accumulator, currentValue) => accumulator + currentValue;

// 1 + 2 + 3 + 4
console.log(array1.reduce(reducer));
// expected output: 10

// 5 + 1 + 2 + 3 + 4
console.log(array1.reduce(reducer, 5));
// expected output: 15
```
初見でreducerが何回実行されるのか、を知るのはかなりわかりにくいです。この例では配列の個数が固定なのでわかりやすいかもしれませんが、現実のコードでは配列長は変化することが多いのでコードの読み取りはより複雑になります。

reduceの第二引数の有無によってreducerの実行回数が変わり、currentValueが何回目のreducerの実行によって呼び出されるのかが変わるというコードはかなり読みにくいです。第ニ引数は必ず指定するべき、という自分ルールをつけておいた方がよいかもしれません。

# reduce は簡単にループで置き換え可能

reduceを使わなくてもおそらく全ての場面においてループ処理で記載でき、そのほうが読みやすいので、わざわざreduceを使う必要がまずありません。

関数型的な、array.forEachや、array.map、array.filter、array.find、array.findIndex、これらは使いやすく直感的なので私はよくつかいます。なので、関数型的なコードを否定するわけではないです。

その関数型プログラミング的なものの中でも、reduce は圧倒的に使いにくく読みにくく、置き換え可能なので使う必要がないだろうと思っています。reduce は forEach, for ,for of などで置き換え可能です。そして置き換えたほうが可読性があがり、修正も機能拡張も高いだろうと思います。

# 他の人にも読みやすいコードがよい

forではなくreduceを使って「こんな新しい構文使いこなせる俺すげー」的な記事を、両手の指の数くらいは見てきたと思います。ループでは数行かかるけど、reduce使えば1行で短いぜ、みたいな記事も多いです。

for は変数間違いを引き起こしやすいという点があるので避ける理由があるにせよ forEach や、for of は多くのプログラマが慣れているので十分読みやすく、reduceは慣れてないプログラマには結構読むのが苦労する場面もあるでしょう。

数行を減らして可読性を落としている気がするのでもったいないなと思います。
プログラムは書くよりも読む方がむずかしく、少しでも読みにくいコードになると、そしてそれが大量に積み重なると不具合を見抜くのが少しずつ少しずつ難しくなり潜在的に不具合の温床になっていくことがあります。

業界がより効率化するためにも、シンプルなことをシンプルに実装する、読みやすいコード書く人が増えて欲しいと思います。
WSL + tmux + vim で背景色がおかしくなることについて．


 ~~何にもしてないのに~~ vimが壊れました． 

Windows10上のWSLで(tmuxを使わずに)vimで適当にファイルを開くとこんな感じになってました．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139546/bef7f60e-10f1-5da8-3168-0fd2723fba78.png)

カラースキームはNeoBundleでmotekiにしてました．
まぁ，ググると同じような悩みを抱えている人がいますね．
https://vi.stackexchange.com/questions/21274/vim-unknown-colored-block
https://superuser.com/questions/399296/256-color-support-for-vim-background-in-tmux

[issue](https://github.com/microsoft/terminal/issues/832)が立っているので，参考にしました．


[指示](https://github.com/microsoft/terminal/issues/832#issuecomment-493747616)通り，

```vim.vc
set t_ut=""
```

を加えます．する今度は，vimをスクロールするとき，画面がチラ，チラとちらつくようになりました．これについても [issueのxtremeperfさんのコメント](https://github.com/microsoft/terminal/issues/832#issuecomment-502454504)にあるように

```vim.vc
 if (&term =~ '^xterm' && &t_Co == 256)
      set t_ut= | set ttyscroll=1
 endif
 set termguicolors
 let &t_8f = "\<Esc>[38;2;%lu;%lu;%lum"
 let &t_8b = "\<Esc>[48;2;%lu;%lu;%lum"
```

を加えると解決しました．

よっし，これで一件落着！と思ったのですが，tmux上でvimを立ち上げると，ちらつき現象再び...! なぜtmuxを経由するとちらつくのだ...

![gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139546/2a5a86f2-bfc4-2f12-59bc-dfbe2b1ac917.gif)


色々ぐぐりましたが，これは解決方法を見つけられなかったです．所かしこで，ターミナルエミュレータの問題ではというコメントを貰ったので，[wsltty](https://github.com/mintty/wsltty/)に乗り換えました．Windowsへのインストールは簡単です．wslttyのgithubのトップページから，[ダウンロードページ](https://github.com/mintty/wsltty/releases/tag/3.3.0)にとんで，ダウンロードしたファイルをダブルクリックして，「セキュルティー問題ない？」みたいなアラートでるけど，（自己責任で）OK押せば，インストール完了．デスクトップに現れたアイコンをクリックして，自動的にwslにつなげる．ここで，tmux + vim でも，あら，不思議，ちらつきもなにもない．


完結．
JavaScriptでいま何歳？

いま何歳？
年齢とか何周年？を計算するためのコードを書いたのでメモ。

### Dateオブジェクトを使う

```javascript
const now = new Date()
const thisYear = now.getFullYear()
const thisMonth = now.getMonth() + 1
const today = now.getDate()
const calcAge = birthday => {
  let target = thisYear * 10000 + thisMonth * 100 + today
  return Math.floor((target - birthday) / 10000)
}

console.log(`いま${calcAge(20001221)}歳です`)
```
参考：MDN: [Date](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date)

### Moment.jsを使う
moment()を呼び出すと、DateオブジェクトをラップするMomentオブジェクトを生成してくれる。

```javascript
import moment from 'moment'

const now = moment()
const birthday = moment('2000-12-21')
const calcAge = now.diff(birthday, 'year')

console.log(`いま${calcAge}歳です`)
```
Dateオブジェクトを使うよりも、シンプルに日付関連を扱えそう。


参考：公式ドキュメント: [Moment.js Documentation](https://momentjs.com/docs/)
[Ruby]eachの入れ子

#概要
入れ子でeachメソッドを使用する際の方法を学習用としてまとめます。
※eachメソッドが何かについては本内容では触れません。

#環境
Ruby 2.6.5

#内容
例として、下記のような配列に対し

```ruby
vegetables_price = [["tomato", [120, 150, 80]], ["potato", [50, 60, 40]], ["carrot", [120, 150]]]
```
下記のような出力結果を求めるとします。


```terminal
tomatoの合計金額は350円です
potatoの合計金額は150円です
carrotの合計金額は270円です
```

記述内容

```ruby
vegetables_price = [["tomato", [120, 150, 80]], ["potato", [50, 60, 40]], ["carrot", [120, 150]]]

vegetables_price.each do |vegetable|　#配列vegetables_priceにeachメソッドを使用する。
  sum = 0　#合計値を入れておく変数sumを定義
  vegetable[1].each do |price|　#変数vegetable[1]に対しeachメソッドを使用。[1]には価格が入っている。
    sum += price　#eachを回して価格を足していく。
  end
  puts "#{vegetable[0]}の合計金額は#{sum}円です"　#vegetable[0]にはvegetableの名前が入っている。
end
```

※備考
添字の０には野菜の名前、1には価格が入っていることになる。

```ruby
vegetables_price = [["tomato", [120, 150, 80]], ["potato", [50, 60, 40]], ["carrot", [120, 150]]]
   (添字)                0              1
```

以上
用語集

# 趣旨
オープン系プロジェクトに参画し、使用される言葉が全く以前と違います。
なので日々わからなかった単語を記憶するため用語を整理し書き留めます。
#用語集(日本語)
- **ア行**
- **カ行**
    - コベリティ
    - コンテナ：OS上に作られた隔離された領域
- **サ行**
- **タ行**
    - デプロイ
- **ナ行**
- **ハ行**
    - プッシュ
    - ブランチ
- **マ行**
    - マウント：接続した機器を認識させて使える状態にすること。
- **ヤ行**
- **ラ行**
- **ワ行**

#用語集(英語)
 - Jenkins
 - GIT
 - Docker
 ：Linux上で独立した別のLinuxシステムを起動するコンテナ型仮想化を利用するための管理ソフトウェア
 - CI/CD
 - Oracle GoldenGate
 : Oracle社の製品。異機種データベース間でデータをほぼリアルタイムでデータ連携/レプリケーションが可能。ソースシステムにほとんど負荷をかけずに高速に転送出来る。
　　[＜Link → Oracle GoldenGate製品説明＞](https://docs.oracle.com/cd/E92689_01/ggcon/introduction-oracle-goldengate.html#GUID-EF513E68-4237-4CB3-98B3-2E203A68CBD4)
 - SSH 【Secure SHell】
 : リモート接続を行うための通信プロトコル。暗号化通信を行うためセキュリティレベルが高い。
　　[＜Link → telnetとsshの違い＞](https://qiita.com/soone_honest/items/f5ac28bca1774b003147)
初めてのpush時に出たエラーの対処法まとめ

# 背景
ローカルリポジトリを作成してからGitHubのリポジトリにpushをしようとした際にエラーが発生した。

# 前提
GitHub上にリポジトリを作成しておく。（リポジトリ作成時にREADME.mdも作成した)

# 今回出たエラー
1. ローカルリポジトリとリモートリポジトリとの紐づけ忘れエラー
2. rejectedエラー
3. mergeエラー

# やったこと
（★だけ追っていけばエラーを出さずにpushできる）

### １．ローカルリポジトリ作成(★)
```
$ git init
```

### ２．ファイルを作成(★)
最初にコミット＆プッシュする為の適当なファイル(RubyTraining.md)を作成。

### ３．ステージングエリアにmdファイルを登録(★)
```
$ git add RubyTraining.md
```

### ４．コミット(★)
```
$ git commit -m "RubyTrainingStart"
```

### ５．プッシュ
**エラー発生。**
**原因**：GitHub上のリポジトリとの紐づけを行わずにプッシュしてしまったため。

```
$ git push origin master

fatal: 'origin' does not appear to be a git repository
fatal: Could not read from remote repository.
```

### ６．GitHub上のリポジトリとの紐づけ(★)
```
$ git remote add origin GitHub上のリポジトリのURL
```

### ７．プッシュ
**rejectedエラー発生。**
**原因**：フェッチとマージをしていなかったため。

```
$ git push origin master

Enter passphrase for key 'SSH Keyの保存場所':
To github.com:teraokamai/RubyTraining.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'リモートリポジトリのURL'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```

### ８．フェッチ(★)
```
$ git fetch origin
```

### ９．マージ
**mergeエラー発生**
**原因**：mergeコマンドのオプションで--allow-unrelated-historiesをつけていない為。
(Git 2.9から mergeコマンドとpullコマンドでは，--allow-unrelated-historiesを指定しない限り，無関係なヒストリを持つ２つのブランチをマージすることはできなくなった。)

```
$ git merge origin/master

fatal: refusing to merge unrelated histories
```

### １０．マージ(★)
```
$ git merge --allow-unrelated-histories origin/master
```

### １１．プッシュ(★)
成功！

```
$ git push origin master
```

# 最後に
方法が本に載っていなかったため試しにやってみたところエラーがたくさん出てきた。
最初にGitだけで管理していたけれど、途中からGitHubで管理したくなった場合にはこの流れで進めれば問題ないと思う。
ゼロから作るなら、GitHubでリポジトリ作成をしてクローンする方が簡単。
Unable to process Runner.app.dSYM at path /Users/...省略.../Runner.app.dSYMが発生した場合の対処

Firebase Crashlyticsを導入してみたけど、うまく取得できないなーと思っていたら、エラーはいていた。

対応
[この手順](https://firebase.google.com/docs/crashlytics/find-missing-dsym?hl=ja)を実施したらエラー無くなりました。

>
1. Xcode でプロジェクトを開きます。
2. Xcode ナビゲータでプロジェクトを選択します。
3. [Build Settings] タブを開きます。
4. タブの上部にある [All] をクリックします。
5. 「debug information format」を検索します。
6. [Debug Information Format] を [DWARF with dSYM File] に設定します。

>
上記の手順が完了したら、アプリを再度ビルドして、Crashlytics が dSYM を検出できることを Firebase コンソールで確認します。

以上
初めてのチーム開発に取り組んだ振り返り

初めてのプログラミングに事前の知識なしで取り組んだ振り返りをまとめました。
HowTo本はいくつかありますが、あえて手を出さずに起きた問題に向き合って解決していく姿勢で取り組みました。

期間：２週間(並行して別言語のカリキュラムを進めている)
個人目標：チーム開発の進め方を体感する
メンバー：４人

良かったこと
・GitHubの使い方を理解→コードのバックアップができる。誰がいつどこの部分を修正したのかが分かる。
・メンバーの思考を理解する：チームには必要不可欠。お互いの性格や考え方、現状のスキル確認、物事の整理の仕方を理解することで伝わる情報が性格になる。特に言葉の認識のズレは影響が大きいため、専門用語で縛るあるいは全く使わないなどのルールを儲けることでミスコミュニケーションは少なくなる。
・作るプロダクトのワクワク感を全員が持っている。作ることのモチベーションが落ちないので最後まで走りきれる。


悪かったこと
・言語選択→最低２人が基本をしっかり理解している言語を選択して進める→進捗に遅れがあるとフォローできない。
 エラーの解決ができない。負荷が1人に偏らない。
・開発スケジュール計画が甘かった。最初に最低限の機能を作り、その後やりたい技術を作る。
・報連相が少なかった。個人が何をやっているのか分からない。


改善すること
・プロトタイプを早く作り制作イメージを持つ。
・初回のアイデア出しにはもっと時間を使っても良かった。
・２週間あったので、最初は新しい技術にチャレンジするための勉強時間をとっても問題なかった。
・共通の開発環境を構築する。開発環境がバラバラな場合、別の問題が発生し時間を取ってしまう。
・タスク/やることを視覚化して共有する。
【SQL入門】NOT IN や <> ALL での NULL の挙動

## NOT IN と <> ALL 演算子

右辺に列挙された値のどれとも一致しない場合に真となる。

```sql
SELECT * FROM movie WHERE genre NOT IN ('アクション', 'ホラー', 'アニメ');
SELECT * FROM movie WHERE genre <> ALL ('アクション', 'ホラー', 'アニメ');
-- genre が「アクション」でも「ホラー」でも「アニメ」でもない行を抽出
```

## NOT IN の右辺に1つでもNULLが含まれる場合

```sql
SELECT * FROM movie WHERE genre NOT IN ('アクション', 'ホラー', NULL);
```

- 右辺に列挙された値を不等号を使って1つずつ比較し、全ての値と等しくないことを判定する。

```sql
SELECT * FROM movie WHERE (genre <> 'アクション') AND (genre <> 'ホラー') AND (genre <> NULL);
```

- `=` や `<>` などの通常の比較演算子は、もともと値と値を比較するためのもの。
よって、「値ではないNULL」を比較すると、不明な結果である **UNKNOWN** になる。

```sql
SELECT * FROM movie WHERE (genre <> 'アクション') AND (genre <> 'ホラー') AND UNKNOWN;
```

- (条件式) AND UNKNOWN の結果は UNKNOWN または FALSE になる。

```sql
SELECT * FROM movie WHERE UNKNOWN(または FALSE);
```

- WHERE句による絞り込みは、条件式が TRUE となる行だけが選ばれる。条件式が FALSE や UNKNOWN となる行は処理対象にならない。

よって、**NOT IN の右辺に1つでもNULLが含まれると、処理結果は1行も得られない。**
<> ALL も同様の挙動となる。

参考図書：[スッキリわかるSQL入門 第2版](https://www.amazon.co.jp/dp/4295005096/ref=cm_sw_em_r_mt_dp_IGtnFbPQ9MTVT)
Goの環境構築

ターミナルでの操作手順
1 homebrewをインストールする。
2 ```brew install go```
3 ```go version ```　インストールバージョンの確認
4 echo $GOPATH　でパスが通っている先を確認
5 出てこない場合パスを編集
vim source ~/.zshrc
export GOPATH=$HOME/.go を追加
6 source ~/.zshrc パスファイルを更新
echo $GOPATH　出てくることを確認
コマンドラインアプリケーションを実行して結果をメールで送付する

# TL;DR

- PowerShellでコマンドラインアプリケーションを実行しその結果をメールで送付する方法について記載する。

# 環境

- Microsoft Windows Server 2016 Standard (10.0.14393 N/A ビルド 14393)
- PowerShell (PSVersion 5.1.14393.3471)

# 内容

## ソース

以下は`tasklist`を使用し、メモリ使用量をメールで送付している例。
メモリリークが発生しサーバーが停止する場合などに原因を調査する際などに使用する。

```posh:runcommandandsend.ps1
function ExecCmd([string]$strCmd)
{
  $p = [System.Diagnostics.Process];
  $pi = [System.Diagnostics.ProcessStartInfo];
  $output = [string];

  $pi = New-Object System.Diagnostics.ProcessStartInfo;

  $pi.FileName = [System.Environment]::GetEnvironmentVariable("ComSpec");
  $pi.Arguments = "/c " + $strCmd;
  $pi.UseShellExecute = $false;
  $pi.RedirectStandardOutput = $true;

  #コマンドを実行し標準出力の内容を取得する
  $p = [System.Diagnostics.Process]::Start($pi);
  $output = $p.StandardOutput.ReadToEnd();
  $p.WaitForExit();

  return $output;
}

$output = [string[]];

$output = ExecCmd("tasklist");

Send-MailMessage -To "example@example.com" -From "example@example.com" -Subject "実行結果" -Body $output -SmtpServer example.com -Encoding ([System.Text.Encoding]::UTF8)
```
参考：http://blog.livedoor.jp/hentaiga/archives/51615192.html

## タスクスケジューラーでの登録例

「プログラム」に`powershell`、「引数の追加」にps1ファイルのフルパスを指定する。
実行前に[PowerShellのスクリプト実行許可](https://qiita.com/Targityen/items/3d2e0b5b0b7b04963750)を与えておくこと

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/05c0ef40-900e-cd8a-10e9-51e2df2f7b5e.png)

# 参考

http://blog.livedoor.jp/hentaiga/archives/51615192.html
https://qiita.com/arachan@github/items/e93c2fec8fe5f7f66bfa
https://qiita.com/nfujita55a/items/73a1fc870ccacbb85df2
https://qiita.com/Targityen/items/3d2e0b5b0b7b04963750
グレースケールと輝度平滑化

#実行環境
[Google Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)

#Google Colaboratoryで画像を読み込む為の準備
```python:
from google.colab import files
from google.colab import drive
drive.mount('/content/drive')

```

#必要なライブラリの読み込み
```python:
import cv2 #opencv
import matplotlib.pyplot as plt 
%matplotlib inline
img = plt.imread("/content/drive/My Drive/Colab Notebooks/img/Lenna.bmp")
#↑この記事からplt.imreadで読み込むことにしました。
```

#いろんな変換
```python:
plt.figure(figsize=(9, 6), dpi=100,
           facecolor='w', linewidth=0, edgecolor='w')

#オリジナル画像
plt.subplot(3,3,1)
plt.imshow(img)
plt.subplot(3,3,4)
color = ('b','g','r')
for i,col in enumerate(color):
    histr = cv2.calcHist([img],[i],None,[256],[0,256])
    plt.plot(histr,color = col)
    plt.xlim([0,256])

#グレースケール
plt.subplot(3,3,2)
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) 
plt.imshow(gray)
plt.subplot(3,3,5)
plt.hist(gray.ravel(),256,[0,256])

#輝度平滑化
plt.subplot(3,3,3)
dst = cv2.equalizeHist(gray)
plt.imshow(dst)
plt.subplot(3,3,6)
plt.hist(dst.ravel(),256,[0,256])

plt.show()
```
##結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610285/bb22fd86-0575-04e9-b685-bd81057caf04.png)

左から、
オリジナル / グレースケール / 輝度平滑化

文法
グレースケール

```python:
cv2.cvtColor(src, cv2.COLOR_RGB2GRAY) 
```
輝度平滑化

```python:
cv2.equalizeHist(src)
```

輝度平滑化することでヒストグラムが満遍なく広がり、
明暗がわかりやすくなりましたね。
特徴を検出するにはこの処理をしたほうが良さそう。