OmniAICreator/Qiita-1.07M huggingface dataset:
ONLYOFFICE DocumentsのiOS版 v7.2の紹介：手書き認識、文書保護、検索フィルターなど

皆さまに朗報です。

[ONLYOFFICE DocumentsのiOS版](http://www.onlyoffice.com/office-for-ios.aspx?utm_source=blog&utm_medium=article&utm_campaign=onlyoffice_documents_7.2)の最新版がリリースされました！手書き文字認識、文書保護、検索フィルター、編集ウィンドウの再設計など、多くの新機能と改良が加えられています。詳細はこの記事をご覧ください。

Meet ONLYOFFICE Documents v7.2 for iOS: handwriting recognition, document protection, search filters and more

## 手書き文字認識

ONLYOFFICE DocumentsのiOS版は、バージョン7.2より、Appleデバイス上で手書き文字を入力したテキストに変換することができるようになりました。Apple Pencilで入力した内容をアプリが自動的に認識し、文書に挿入するため、キーボードを使用する必要はありません。

現在、この機能は英語のみで利用可能です。

## モバイルビュー

新たに追加されたMobile Viewにより、スマートフォンでより快適にドキュメントを表示、閲覧できるようになりました。

どこにあるのか：「設定」アイコン → 「モバイルビュー」をタップする

Meet ONLYOFFICE Documents v7.2 for iOS: handwriting recognition, document protection, search filters and more

## パスワードによる保護

これからは、文書をパスワードで保護し、信頼できる共同作業者と安全に共有することができます。ただし、注意しなければならないことがあります。パスワードを忘れると、元に戻せなくなります。

どこにあるのか：「設定」アイコンをタップして、「ファイルの暗号化」→「パスワードの設定」

## 新しい検索フィルター

新しいフィルタリングオプションにより、ファイルの検索がより簡単になりました。ローカルにあるファイルを探すときは、ファイルの種類で検索することができます。クラウド上のファイルに関しては、ファイルの種類と作成者で検索できるようになりました。

## スライド背景とチャートの編集ウィンドウを一新

iOS向けアプリのアップデートにより、スライドの背景をより簡単に操作できるようになりました。プレゼンテーションエディタには、グラデーションのカスタマイズ、カスタムテクスチャ、パターンフィルを見つけられる、再設計された編集ウインドウが搭載されています。

どこにあるのか：「ペン」アイコンをタップして、「スライド」→「背景」

また、グラフを編集するときに、ストロークの種類をカスタマイズしたり、グラデーションのカスタマイズ、カスタムテクスチャ、パターン塗りのオプションから塗りを決定することができるようになりました。

どこにあるのか：「グラフ」をタップして、「ペン」のアイコン→「スタイル」

## ドキュメントのデフォルトの表示モード

ONLYOFFICE DocumentsのiOS版は、バージョン7.2以降、デフォルトでドキュメントを表示モードで開くようになりました。同時に、アプリでドキュメントを表示するとき、読みやすくするためにナビゲーションバーは非表示になります。

編集を開始するには、右上の「編集」ボタンをタップするだけです。

注：新しいドキュメントを作成すると、自動的に編集モードで開かれます。

## その他の改善と更新

* TextArtのサポート
* ONLYOFFICEポータルのプッシュ通知
* Dropboxへの正しい接続
* アルメニア語のローカライズ

あなたのiPhoneやiPadですべての新機能を試してみたくなりましたか？ONLYOFFICE Documents v7.2のiOS版は、App Store から入手できます。

[**今すぐダウンロード**](https://apps.apple.com/us/app/onlyoffice-documents/id944896972)
サイトのコーディング中にはまったところ

## ハマリスト
### 1. タイトルにマーカーを引こうとした
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198412/0d401efc-7499-2f57-20c2-9630e04ec7c6.png)

上記のようなタイトルの下半分にtext-decoration: underline;でマーカーを引こうとして詰まった。

```
.title--underline {
    text-decoration: underline;
    text-decoration-color: yellow;
    text-decoration-thickness: 15px;
    text-underline-offset: -5px;
}
```

safariのpcで確認すると、マーカーがテキストの前に出てきてしまっていた。
text-underline-offsetにマイナスの値を指定しているため、前後関係が怪しくなってしまったのではないかという仮説。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198412/e3f297e3-7856-9fbd-3ee1-3dd81c7a0716.png)

結局どうしたか
一行づつspanタグで囲って、それぞれにbackground-imageを指定した

```
.title--underline {
    line-height: 1.7;
    background-image: url(../images/marker-yellow.svg);
    background-repeat: repeat no-repeat;
    background-size: auto 15px;
    background-position: left 0 bottom 3px
}
```

最も良いコーディング方法が知りたい。

### 2. svgの画像がsafariで表示されない
またsafari
svgの画像を挿入したところ、safari(pc,スマホ両方)で豆腐になっていた。
調べてみたが原因は単にsafariがsvgの対応あんまりしていないからという結論ぽかった

結局どうしたか
svgではなく、pngで書き出した。
動きをつけるということもなく、かつ横幅指定を指定した画像であったため拡大・縮小でも崩れないというsvgの利点は特になくても良いと判断しpngにした
AWSのハイブリッドアーキテクチャ設計図をPower pointで描いてみた

# 目次
* はじめに
* 全体像
* 意図
* 難しいところ

# はじめに
先日SAAの試験に落ちまして、手を動かさなきゃいけないなと感じた30歳です。
今回はAWSの公式アイコン集を利用して、アーキテクチャの設計をやってみたいと思います。
Power pointで公開されていたので、設計図もPower pointで作りました。

# 全体像
Power pointをスクショして貼りました。
![スクリーンショット (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2773852/54043ee8-0194-8c77-c32f-2fd5200d9e63.png)
こんな感じのオンプレ環境を
![スクリーンショット (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2773852/281ab2f5-5936-da2d-78a9-483658a60526.png)
こんな風にしてみました。
![スクリーンショット (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2773852/82289422-6251-8efb-e789-37eacaeb630f.png)
プライベートサブネットはこんな感じで耐障害性も考慮してみました。

# 意図
パブリックサブネットはNLBとNATを配置することも考えましたが、今回は極力コストを抑えてみよう、ということでEC2一台のみを設置しています。
オンプレ環境なら外部とアクセスしたくない部分もあるよなあ、と思いつつプライベートサブネットはDirect connectを利用しています。でも使ったことないのでこの置き方であっているのか不安。
プライベートサブネットにはELBを置いて、データベースをレプリケーションしています。

# 難しいところ
* コストの許容範囲
パブリックサブネットのNATゲートウェイとか、データベース部分のサービス選択とか、コストをどこまで許容するかによって賛否が分かれる、と思いました。
実際に仕事する際には複数提案して、顧客に選んでもらうんじゃないかと妄想しています。

* 環境構築
実際に案件を受けたわけではないのであれですが、IPアドレスの指定とかロールの割り振りとか、作業がどれくらいかかるのんだろうな、と考えています。早く仕事してみたいなあ。

今回は以上になります。
お読みくださり、ありがとうございました。
Apexの集計レコードとMapの基本使いポイント

### 要件
Apexの基本ポイント
①Countなどの集合変数
　 List\<AggregateResult\> 
   AggregateResult.get('fieldName expr0,1,2')
②Mapの使用方法
　Map\<id,Account\> accounts = new Map\<id,Account\>( [Select Id, Name from Account Where Id IN :recordIds])
    map.keysets().map.values(), map.get(key)

```
public class AccountProcessor{
  @future
  public static void countContacts(List<Id> recordIds) {
    Map<id,Account> accounts = new Map<id,Account>( [Select Id, Name from Account Where Id IN :recordIds]);
    
    List<AggregateResult> arr = [select accountid,count(id) 
                             from contact Where accountid  IN :recordIds group by accountid ];
                             
    For (AggregateResult ar : arr){
        System.debug( ar.get('AccountId') + '---' + ar.get('expr0'));
        String accId = ar.get('AccountId').toString();
        accounts.get(accId).Number_Of_Contacts__c =  (Decimal)ar.get('expr0');
    }
    
    update(accounts.values());
  }
}
```

Countだけをとるとき
```
List<AggregateResult> arr = [Select count(id) CNT from account];
System.debug(arr.get(0).get('CNT'));
```
Or
```
AggregateResult arr0 = [Select count(id) CNT from account];
System.debug('Count:' + arr0.get('CNT'));
```
FLOCSSで初めてコーディングした際の流れ等

## 始めに
FLOCSSの形式でサイトの製作を行なった。
書き方で悩んだところや、導入するまでに行なったことを記載する

## FLOCSSの学習参考
- [【Dart Sass対応】LPをつくって学ぶSass×FLOCSS](https://zenn.dev/yurukei20/books/10e7322a762178)
- [CSS設計手法「FLOCSS」を適用して出てきた疑問を自分なりに考えて進めた結果と得た知見と失敗と](https://qiita.com/SYM_simu/items/bda9a2a527d0b1dcfb01#1-%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB)
- [[CSS設計] 私のためのFLOCSSまとめ](https://qiita.com/super-mana-chan/items/644c6827be954c8db2c0)
- [FLOCSSを扱いきれないあなたに贈る、スリムなCSS設計の話](https://webnaut.jp/technology/20170407-2421/)
- [Sassファイルの管理方法。ディレクトリ構造（フォルダ・ファイル構成）
](https://blanche-toile.com/web/sass-project-structure)

##環境構築
- vscode
    - DartJS Sass Compiler and Sass Watcher
        - Sass Bin Path を作成したプロジェクトのパスに変更
- Dart sass


なぜLive Sass Compilerを利用しないのか？
Live Sass Compilerはdart sassの書き方に一部対応していないらしいため

### パーシャルファイルを保存した時もstyle.cssが更新されるようにする。
参考: https://yumegori.com/vscode-dart-sass-setting#chapter-4

```
$ npm init -y
$ npm i -D sass
```

``` setting.json
"dartsass.sassBinPath": "/path/to/node_modules/sass/sass.js"// パスを変更 
```

scssフォルダを右クリックし、watchを押下


## コーディング中に詰まったところ

悩み: どの粒度でファイルを分割するのかがわからない
p-flow というクラス名をつけたら、projectフォルダ配下に _flow というファイルを作成するのか？
sectionタグの一つが基本project(p-hoge)ということでいいのか？

悩み: componentとprojectはどのように分けるのか？
componentは他でも使う時につけると記載をみたが、ほぼprojectになってしまう気がした

悩み: utilityクラスをどのように使うかよくわからない
marginやdipslayという命名で作ったが、3行くらいしか記載されていないファイルがいくつかある

悩み: font-familyは_base.scssに記載する形で良いのか？
_base.scssに記載した

悩み: js用のクラス名(js-)を使った場合どのファイルに記載することになるのか？
いや、js用のクラスなのであればそもそもcss書かないから問題ないな
AWS CloudFront概要

# AWS CloudFront概要
HTMLやファイルや画像、動画などの静的コンテンツをキャッシュし、オリジンサーバの代わりに配信するCDN（Content Delivery Netwark）サービス。
活用することで、サーバの負荷を軽減し、安定したサービスの提供をすることが出来る。

利用にはオリジンサーバ（バックエンドサーバ）が必要で、AWSのサービスでは
・ELB
・EC2
・S3のホスティング機能
がある。
また
・オンプレ環境のサーバ
を指定することも可能。

## ディストリビューション
### 1 ダウンロードディストリビューション
 HTTPやHTTPSを使い、HTMLやCSS、画像を配信する際に利用。

### 2  ストリーミングディストリビューション
 RTMPを使い、動画のストリーミング配信の際に利用。
 ※今後は非推奨のようです。

## キャッシュルール
拡張子やUＲＬパスごとに、キャッシュ機関の指定を行う。
変更頻度が多い　：キャッシュ期間を短く
変更頻度が少ない：キャッシュ期間を長く


## ☆チェックポイント
URLのパスに応じて、異なるオリジンサーバを指定することで1つのドメインで複数のサービス提供が可能。（ドメイン名の統一が可能。）
動的サイトのURLパスは、キャッシュを無効化することでネットワーク経路としてだけ利用できる。
LaravelでURLを取得する方法いろいろ【初心者向け】

## 背景
最近Laravelで開発をすることが多いのですが、レビューでURLを直書きしないように複数回指摘を受けました。
そしてその修正をする中で学んだURLの取得方法を紹介します。

## サイト内のURLを取得したい
Laravelで定義したルートには`nameメソッド`で名前をつけることができます。
```
// 名前付きルート
Route::get('/user/profile', function () {
    
})->name('profile');
```
routeメソッドを使えばURLを以下のように生成することができ、とても便利です。

```
<a href="{{ route('profile') }}">プロフィールへ</a>
```
URL直書きで書いても動作自体は変わりませんが、URLのパスを修正したい時に一つ一つ変更する必要がありとても手間がかかります。名前付きルートであれば変更箇所が１つになって楽ですよね。

## 外部サイトのURLを取得したい
外部のページに飛ばしたい時は、基本的にURL直書きで問題無いと思います。
```
<a href="https://qiita.com/">Qiitaトップページへ</a>
```
ただ、複数回同じURLを使う場合はLaravelヘルパー関数を自作して外部のURLを返すメソッドを作成しましょう。

こういう細かい共通化が後々の自分を楽にしてくれます！

## URLを加工して取得したい
URLを加工して取得する際に便利なのがPHPの`pathinfo`メソッドです。

### pathinfoの使い方
```
<?php
$path_parts = pathinfo('/www/htdocs/inc/lib.inc.php');

echo $path_parts['dirname'], "\n";
echo $path_parts['basename'], "\n";
echo $path_parts['extension'], "\n";
echo $path_parts['filename'], "\n";
?>
```
https://www.php.net/manual/ja/function.pathinfo.php

pathinfoメソッドは引数に指定したURLパスを加工した結果を連想配列で受け取ることができます。
- dirname: ディレクトリのパス
- basename: ファイル名と拡張子
- extension: 拡張子
- filename: ファイル名

上記の４つの要素を全て返すので、必要な要素を指定して使用します。

※日本語などの文字が含まれる場合は文字化けを起こす可能性があるので`setlocale`でロケール情報を指定する必要があります。

## まとめ
ここまでLaravelでURLを取得する方法を紹介してきました。いかがだったでしょうか？

この記事がLaravelの理解の手助けになれば幸いです！
応用情報技術者試験に合格しました

# はじめに

初投稿になります。
タイトル通り、2022年秋期応用情報技術者試験を受けてきました。
受験した経緯としては社内評価のためというのは勿論ですが、恥ずかしながらIT企業に勤めていながら30代にもなって情報系の資格は学生時代に受けた基本情報技術者しか持っておらず転職活動の面接でかなりつつかれた、というのが大きいです。

※言い訳になりますが以前勤めていた職場の労働環境があまりよろしくなく、残業や休日出勤が多かったため資格勉強にあてる時間があったら休みたかったです。現在はワークライフバランスがとりやすい職場ですので安心してください。

# 勉強方法・勉強期間

6月から本格的に勉強を始めました。
勉強方法については @kayabon さんの記事に則って進めてました。

https://qiita.com/kayabon/items/3dc1670f0a44b1f4927d

6～9月前半はひたすら [過去問道場](https://www.ap-siken.com/apkakomon.php) で午前の問題を解いてました。
直近2回を除く過去10回分をひたすら回し、最終的には約2,500問解いていたようです。
![スクリーンショット 2022-10-11 184347.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1579802/11a6e57e-bc40-24a6-028d-d4cda41dcef1.png)

9月後半から午後対策として [2022 応用情報技術者 午後問題の重点対策 (重点対策シリーズ)](https://www.amazon.co.jp/2022-%E5%BF%9C%E7%94%A8%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E5%8D%88%E5%BE%8C%E5%95%8F%E9%A1%8C%E3%81%AE%E9%87%8D%E7%82%B9%E5%AF%BE%E7%AD%96-%E9%87%8D%E7%82%B9%E5%AF%BE%E7%AD%96%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E5%B0%8F%E5%8F%A3/dp/486575251X/ref=sr_1_1?crid=1T0GIK1WO5Y9J&keywords=2022+%E5%BF%9C%E7%94%A8%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85+%E5%8D%88%E5%BE%8C%E5%95%8F%E9%A1%8C%E3%81%AE%E9%87%8D%E7%82%B9%E5%AF%BE%E7%AD%96&qid=1665481596&qu=eyJxc2MiOiIxLjM1IiwicXNhIjoiMC4zNSIsInFzcCI6IjAuNTQifQ%3D%3D&s=books&sprefix=2022+%E5%BF%9C%E7%94%A8%E6%83%85%E5%A0%B1%2Cstripbooks%2C198&sr=1-1) を使って勉強してました。
午後の選択問題の候補4つ（余裕持たせるなら5～6つ）を決めるために各ジャンル1回は読み、最終的に情報セキュリティ（必須）・プログラミング・システムアーキテクチャ・データベース・組込みシステム開発・システム監査に絞って勉強してました。

試験1週間前に前回試験（この場合2022年春期）を模擬試験として問題用紙と解答用紙を印刷し、本番さながらの環境で時間を計測しました。
実際紙に記載してみると、記入箇所がずれたり、受験番号に受付番号記入したり、午後問題の設問選びに失敗したりと問題が発生したので本番で気を付ける箇所が見えて良かったです。

勉強時間としては、午前64時間、午後17.5時間で合計81.5時間ほどになります。

# 試験当日
会場まではバス移動のため時刻表に合わせて8時前には家を出ました。
天気には恵まれたので良かったです。
※受験票届くのが試験1週間前くらいで、そこでやっと試験会場がわかるので何とかしてほしい。。
試験開始1時間以上前に会場ついたのでスマホで過去問道場しながら時間つぶしてました。

■午前問題
思っていたより見たことがない問題が多かった印象です。
後で調べて知りましたが近年は高度試験の問題からも出てくるようなので難度は少しずつ上がってるかも(?)

■午後問題
選択したのはプログラミング・データベース・組込みシステム開発・システム監査です。
今回、組込みシステムがめちゃめちゃ易しかったです。

勉強時間がそこまで多くないこともあり、午前午後どちらも試験終了時間までやりました。

# 試験結果
解答に関して、IPAからは [午前問題の解答](https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2022r04.html) のみ公開されています。
午後問題に関しては [資格の学校 TAC](https://www.tac-school.co.jp/kouza_joho/sokuhou.html) が公開してます。
※2022/10/11 20:00時点

自己採点では午前62/80(=77.5点)、午後62～63点でギリギリ合格かな？という状況です。
（午後は記述問題があったり配点が不明瞭のため点数が出しにくい）
公式の合格発表は12/22とのことなので約2カ月悶々と過ごします…

結果わかり次第更新したいと思います

【2022/12/22追記】
無事合格しました！
予想通り午後ギリギリでしたが合格は合格です。
努力が報われる瞬間は良いものですね。
![合格.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1579802/fe09892b-66b9-fc80-04eb-9d8a16f2e38d.png)

# さいごに
思い返してみると資格試験を真面目に受けたのが社会人になってから初めてな気がします。
30代にもなると記憶の定着にも時間が掛りますし、ぶっ続けで勉強する体力もなくて勉強の効率化が重要になってくると非常に感じました。
また、この歳で応用情報受けることを大っぴらにするのは恥ずかしいので周りには言わずひっそりと勉強してきましたが、一人だと勉強を継続するのが難しかったです。
Studyplusのアプリ使って勉強時間の見える化や同じ目標の方と励まし合いながらモチベーションをキープできたのはとても助かりました。
試験終わったばかりで今は少し休みますが、また何か資格取得を目指そうと思います。
Javascriptでの繰り返し処理

# はじめに
学習中のJavascriptで自分用の備忘録として繰り返し処理をまとめました。
## for文を使った繰り返し
Javascriptでの繰り返し処理の方法の一つとしてforを使った繰り返し処理がある。
基本構文
```javascript
for ([初期化式]; [条件式]; [加算式];){
  //繰り返す処理内容
}
```
になる。
例:出力回数を３回カウントしながら表示を繰り返す処理
```javascript
let count = 1
for (let i = 1; i <= 3; i += 1) {
  console.log(`${count}回目の出力`)
  count +=  1
}
```

## forEachを使った繰り返し処理
配列に格納されている要素に対して繰り返し処理を行うために用いられるのがforEach関数です。
```javascript
配列.forEach( function(value){
  // 処理の記述
})
```
で記述することで、配列の要素を使った繰り返し処理が実行できます。
例:３つのvalueの配列を１つづつ表示させる処理
```javascript
rpg = ['DQ', 'FF', 'Pokemon']
rpg.forEach( function(item) {
  console.log(item)
})
```
実行結果ではDQ、FF、Pokemonが１つづつ表示されます。
【VSCode】外部ターミナルをiTermに変更する方法

## はじめに
VSCodeでコマンドパレットで`Open New External Terminal`を実行すると外部ターミナルを開けます。

![6E5F366F-E9A5-474F-A834-11A48311231E.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/9b521e62-c586-54c6-a7a4-7a77112e0a28.png)

![96DA3742-3818-4618-88B1-0B5722DF92D7のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/ee9f5099-48a7-1ab7-d1e5-f79ec2e5250d.png)

デフォルトではTerminal.appが開きますがこれをiTerm.appにする方法について記載します。

## 設定方法
設定画面を開き、`terminal.external.osxExec`を検索します。

![1D791116-0BA6-4C5B-85D4-0BB5E8DAACDC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/735a6823-ac84-75e0-d6f8-7a8461720f42.png)

`Terminal.app`を`iTerm.app`に変更します。

![271E4E76-6521-448D-BAAA-6987A44EF5A2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/efcbea69-6702-b974-a2c1-1c77410478f5.png)

再度コマンドパレットで`Open New External Terminal`を実行すると以下のようにiTermが開きます。

![8165B670-7680-4478-A2DB-27399D7DC6ABのコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/5497e183-12af-11cf-9aa1-33868bdcdddc.png)
Flutterで開発中の画面を仮表示するためのバツ表示のウィジェット

`Placeholder`という名前。

<img width="100px" alt="placeholder" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168872/3b15e4dc-903c-7171-e09a-641d44c7f4c2.png">

使うときに毎回名前を忘れて検索にも困っていたので、いつも使う検索ワードを含めたタイトルで記事を作っておきます。

https://api.flutter.dev/flutter/widgets/Placeholder-class.html

https://www.youtube.com/watch?v=LPe56fezmoo
Google UXデザイン：エッジケースを予測する

# はじめに

わたしが[Google UX Design Certificateで得られた素晴らしい体験][google]を、特に重要だと思われるポイントを小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ Google UX Design Certificateを受講してみてください。

[google]: https://qiita.com/mapami/items/7a0d0a3d4661c50f8bec

https://www.coursera.org/professional-certificates/google-ux-design

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/3729adea-8dba-b2a3-6127-9b0bf6886e54.png" width="800">

# エッジケースとは

ユーザーストーリーには、２つのタイプがあることを覚えておいて下さい。

- ***Happy Path（パッピーパス）***
    - すべてが期待どおりに進むため、問題のないハッピーエンドのユーザーストーリー
- ***Edge Case（エッジケース）***
    - ***<font color="MediumVioletRed">『標準的なユーザーエクスペリエンスを妨げる稀な状況、または予期しない問題』</font>***


優れたUXは　***<font color="Teal">エッジケースを予測し、物事が計画通りに進まないときに、ユーザーを幸せな道へと迂回</font>***　させます。

エッジケースでは、多くの場合、その障害はユーザーの手には負えません。

### サンプル

ロンドン在住のアイラが、カリフォルニアにいる友人のプリヤに誕生日の花を贈ろうと思ったとします。

彼女はカリフォルニアにあるフラワーショップのウェブサイトを訪れ、プリヤの好きな花束をデザインし、メッセージを書く作業に取りかかります。すべてがうまくいっている。アイラは幸せな道を歩んでいる。

しかし、アイラが住所を入力するとき、出身州を尋ねる欄がある。アイラはイギリスのロンドンに住んでいて、州は存在しません。しかし、州は入力しなければならない。彼女は幸せな道のりで行き止まりになってしまったのです。デザインの世界では、アイラのような人たちをエッジケースユーザーと呼びます。

結局、ウェブサイトを閉じて、別の方法で花を贈るしかありませんでした。

# 解決方法

上記のアイラのような状況に陥らないように、リリース前に潜在的なエッジケースを発見し、解決するためのUXデザインのプロのヒントをいくつか見てみましょう。

#### ペルソナとユーザーストーリーを作成する
UXデザイナーが、さまざまなユーザーと問題を考慮したペルソナとユーザーストーリーを作成すれば、最も脆弱なユーザーでも幸せな道を歩ませることができます。

#### リリース前にプロジェクトを徹底的に見直す
リリースを急ぐあまり、UXデザイナーはハッピーパスだけに目を向けてしまうかもしれません。ユーザーの視点からプロジェクトを最終的によく見直すことで、デザイナーはエッジケースを特定することができます。

#### ワイヤーフレームを使う
ワイヤーフレームはプロジェクトを視覚化するのに役立ち、視覚障害者でない人々にとっても、潜在的なユーザーのペインポイントを特定し、リリース前に修正することが容易になります。必要なものを必要なときに持っている友人というのは、誰にでもいるものです。例えば、遊園地でランチを食べているときにフォークを床に落としてしまったとしたら、その友人は予備のフォークを用意してくれているのです。

# さいごに

UXデザイナーは、すべてのユーザーの「友達」でありたいと願っています。彼らが幸せな道を歩んでいるかどうかに関わらず、どんなニーズがあるのかを予測することができるようになりたいものです。
【AtCoder】RE,MLEが出た時の対処法(灰色コーダー向け)【競技プログラミング】

問題を読み、コードを書き、入力例で確認し、全部OKだった。
意気揚々と提出したら **非道の「RE」「MLE」** 。
どうしたらいいの・・・。

そんな時の対処法をお伝えします。
なお、この記事は初心者～灰色の方向けに書いていますので、茶色以上の人には当たり前に感じることが多いと思います。
また、難易度が高めの問題で起こりがちなRE,MLEも書きません。
**茶色以上の人は勝手に頑張ってくれ。**

# RE
## REとは
実行時エラー(Runtime Error)の略です。
実行時に何らかのエラーが吐かれたらこれになります。

## 原因と対処
競技プログラミングでサンプルは通っているのにREになる原因は主に二つです。

### ・配列外参照
「IndexError: list index out of range」(リスト インデックスが範囲外)
**REは9割これ。**
リストの長さを超えた場所を参照しようとしていますという意味です。

例えば以下のコード。

```python:
A=[1,2,3]
x=A[3]
```

Aの長さは3ですがA[3]を参照しようとしています。
pythonでは先頭をA[0]、次をA[1]、と数えるので長さ3のリストの末尾はA[2]になるわけです。
しかしA[3]という存在しない場所を見ようとしているからエラーになります。

対処法としてはどのような入力のときにこれが起こっているかを確認するということになります。
エラーが出るまで入力をてきとうに作りまくってみましょう。
特に制約の端っこ、例えば1≤N≤10^5であればN=1のケースでエラーになることが多いです。

### ・0除算
「ZeroDivisionError: division by zero」(0で割っている)
残り1割がこれ。

例えば以下のコード

```python:
print(1/0)
```

「1/0を出力しろ」ということなのですが当然0で割れないのでエラーになります。

「制約1≤Ai≤10^5だと思ってたけどよくよく見たら0≤Ai≤10^5だったわ」みたいなパターンで起こります。
問題と制約はしっかり確認しましょう。

# MLE
## MLEとは
メモリ制限超過(Memory Limit Exceeded)の略です。
問題ページの左上にちっちゃーく「メモリ制限: 1024 MB」と書いていますね。
これ以上メモリ使ってるよって意味です。

## 原因と対処
### ・リストでかすぎ
**10割これ。**
長さが10^9以上あるリストを作った場合など、大きすぎるリストを作るとMLEします。

例えばこんなコードです。

```python:
A=[0]*(10**9)
```

これくらいわかりやすいとすぐ見つかるんですが、他には
・二次元配列が10^5\*10^5
・長さが(Aの最大値)のリストを作ろうとしているが制約が1≤Ai≤10^9
などのパターンもあります。

対処法は
・まず大きなリストを作らずとも解けないか考える
・それが無理ならリストではなく連想配列(dict)でなんとかできないか考える
　(リストのA[999999999]は参照できないけど連想配列のキーを「999999999」にした値は取り出せるみたいな使い方です。)

とは言ってもMLEは稀にしか起きない問題です。
問題をたくさん解いていれば自然とMLEの対処法もわかってくるので、まだ起きたことがない人はあまり気にせず精進に励みましょう。

# テストケースは公開されています。
どのケースでREするのか、MLEするのかわからない、という場合。
コンテストが終わった後であればテストケースの入力、出力を確認する事ができます。

https://www.dropbox.com/sh/nx3tnilzqz7df8a/AAAYlTq2tiEHl5hsESw6-yfLa?dl=0

コンテスト後だいたい1週間から2週間程度で公開されるようです。

これでRE、MLEになるケースを直接確認できます。
正解を確認するのも大切ですが、 **なぜ間違っているのか** を確認するのも同じくらい大切です。

皆様も良い競プロライフを！
MotionBoardで「データベース入力」をするときに気にするポイント

# はじめに
Wingarc1st社が提供する、MotionBoardという"ニッチ"なBIツールがあります。
様々な特徴のひとつに「ダッシュボードを閲覧するユーザが、ダッシュボード上のアイテム経由で、接続されるデータベースのテーブルのデータを書き換えられる」点が挙げられます。
使いようによっては危険な気もしますが、知恵を絞りぬいて日々改善し続ける生産現場の多様なニーズに対応できる面白い機能だと思います。
ただ、データベース周りの設定や、Motionboard側の設定など、いろいろ気を付けるポイントがあるので、整理してまとめておきます。


# 気を付けるポイント
大きく分けて「データベース側の設定」と、「Motionboard側の設定」がある

## 概要
1. データベース側
    1. Motionboardの接続定義で使用されるユーザが対象テーブルに対して持つ権限
1. Motionboard側
    1. 外部接続設定での当該データベースおよびテーブルなどに対する更新権限
    1. ユーザやグループに付与されているロールで制限されている機能に対する設定

## データベース側の設定について
Motionboardが当該データベースシステムにアクセスする際に使用されるユーザが、そのテーブルのSELECT/INSERT/UPDATE/DELETE権限を持っているかどうか、要確認。

テーブルとユーザの権限の対応関係は以下のSQLで確認できる
```sql
SELECT grantee, table_name, privilege_type FROM information_schema.role_table_grants
```

もし権限を付与できていなければ、たとえば以下のような命令文で付与できる
```sql
--GRANTする例--
GRANT USAGE  ON SCHEMA schema_name TO hoge_mbuser;
GRANT SELECT ON ALL TABLES IN SCHEMA schema_name TO hoge_mbuser;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA schema_name TO hoge_mbuser;
など……
```

## Motionboard側の設定
### 外部接続設定での書き込み権限設定
オンラインマニュアルでいう以下の設定を確認すること

https://cs.wingarc.com/manual/mb/6.3/ja/UUID-ca9c0897-7aa1-8d90-4512-2b18d04c1a8c.html

### ユーザに付与されるロールの設定

オンラインマニュアルでいう以下の設定を確認すること
「データベース入力（追加、更新、削除）」などがある

https://cs.wingarc.com/manual/mb/6.3/ja/UUID-59467c1e-6666-11a4-5435-9293da67bd3e.html


# もしうまく行ってないときのエラー
原因との対応は撮れていないが、たとえば以下のようなエラーメッセージが出る。
まったくもって原因究明の参考にならないエラーメッセージしか出なくてしびれる。
```
グループにデータの更新権限がありません。
更新対象のデータが存在しません
ユニーク制約エラーです
等…
```


# おわりに
「データベース入力」は、Motionboardが「BIツール」ではなく「アプリケーションビルダー」と呼ばれる所以の理由のひとつだと思ってます。
権限やガバナンスの話が絡んで非常に難しいとおもいますが、非常に特徴的な機能のひとつだと思うので、使ってみるのも手かと思いました。
（（Motionboardじゃなくて別のツールでデータ入力しろよ、、、と思わんでもないですけど、まぁ、そこは、あの、ほら、利用するシステムの数は少ないに越したことはないし、ダッシュボードみつつシームレスにその場で業務したいやんやっぱり、スピード感って大事、だし？うん、、）


# 参考記事

https://membership.wingarc.com/view/post/0/188312
【Discord】Enter=改行, Ctrl+Enter=送信 にする Chrome 拡張

# なぜ作ったのか
Slack や Teams では Ctrl + Enter で送信できるようにしているので Discord でもそうなるようにしたかったためです。
※Discord は Enter=送信、Shift + Enter=改行 というキーバインドになっており変更することができません。

# ソースコード

```json:manifest.json
{
  "manifest_version": 3,
  "version": "1.0",
  "name": "Send with Ctrl+Enter in Discord",
  "content_scripts": [
    {
      "matches": [
        "https://discord.com/*"
      ],
      "js": [
        "script.js"
      ]
    }
  ],
  "permissions": [
    "activeTab"
  ]
}
```

```js:script.js
(() => {
  'use strict';

  const app = document.querySelector('#app-mount');
  const useCapture = true;
  app.addEventListener('keydown', (event) => {
    const isMsgTextbox = event.target.role === 'textbox' && event.target.ariaMultiline;
    if (isMsgTextbox === false) {
      return;
    }

    const pressedShiftEnter = event.shiftKey && event.key === 'Enter';
    if (pressedShiftEnter) {
      return;
    }

    const pressedEnter = event.altKey === false && event.ctrlKey === false && event.key === 'Enter';
    if (pressedEnter) {
      event.stopPropagation();
    }
  }, useCapture);

})();
```

# 解説
デフォルトの Enter 周りのキーバインドは以下のようになっています。
この表における No1 のみをキャンセルしています。

|No|キー|送信|改行|
|---:|:---|:---:|:---:|
|1|Enter|○||
|2|Shift + Enter||○|
|3|Ctrl + Enter|○||
|4|Alt + Enter|||

メッセージ送信のイベントリスナは `#app-mount` に定義されているようでした。(ここ少し自信無いです...)
そのため、メッセージのテキストボックス以外ではデフォルトの挙動になるように `event.target.role` や `event.target.ariaMultiline` を見ています。
また、Shift + Enter もデフォルト通りに挙動になるように `event.shiftKey` と `event.key` を見ています。

その後、単体の Enter が押されたときイベント伝播をキャンセルすることで送信処理をキャンセルしています。
Apple Music APIを使ったアプリをリリースするにあたってしなければならないこと

# どういうことか

Apple Music APIを使用したアプリをリリースしたい場合、なにかする必要があるかどうかを知りたかった
（やらなければリリースを許してもらえない事項があるかどうか）。

https://developer.apple.com/documentation/applemusicapi?changes=latest_minor

結論から言うと、**著作権の観点でApple Musicのコンテンツへのリンクを設置する必要がありそう**。

## 気になっていたこと

以下の2点はクリアする必要はありそうだが、それだけで大丈夫なのか。

* 権利所有者から特定の許可を得ずにマーケティングや広告に使用することはできない
* 音楽の再生やプレイリストに関連してのみ使用することができる

気になる点としては、実際にこのAPIを使用していると思しきアプリは以下のバッジ画像と共にApple Musicへの遷移を実装している。
例えばアプリ内において、APIから取得したアーティスト写真をタップするとアーティストのページに遷移する、といった感じ。
バッジ画像は『このアプリはApple Musicと連携しています』といった意味合いでページに設置されている。
これは実装しなければならないのか？？

![2-21914_listen-on-apple-music-badge-logo-listen-on.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413699/d33a1f61-c5ee-771b-61bb-f806e544047f.png)

## リジェクト例

著作権問題でハネられた実例があったようです。
機械翻訳をかけてみたら「Apple Musicのコンテンツへのリンクを設置する必要がある」とのこと。

https://developer.apple.com/forums/thread/697447
AtCoder緑になりました

<H1>AtCoder緑になりました</H1>
先日のAtcoder Beginner Contest 272を持って緑コーダーになることができたので自分が今までしてきたことを共有していきたいと思います。

![スクリーンショット 2022-10-11 18.48.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467169/1edd18ac-c306-866b-7fb9-d701b5004865.png)


<H2>競技プログラミングをする動機など</H2>
自分はコロナ禍をきっかけに競技プログラミングを始め、半年くらいはまっていたのですが、卒論などが忙しくなるにつれて競技プログラミングに時間が取れなくなり、二年近く競技プログラミングから離れてしまっていました。
しかし、今年に入り就活関係のコーディング試験で解けない問題が意外とあることに気が付き、加えて、就活をする上で何かガクチカ的なものが欲しいと思い、とりあえずAtCoder水色になってみようと思い、再び競技プログラミングを再開しました。

<H2>緑コーダーになるためにやったこと</H2>
ほぼABCだけです。競技プログラミング初心者がまず躓くのはABCのC, D問題あたりだと思います。自分もD問題が全然解けなかったので、とりあえずD問題をAtCoder ProblemsのDifficultyが低い順に解いていきました。
問題を通して出てきたアルゴリズムやデータ構造を調べるといった方法で、本ではあまり熱心に勉強はしていません。
また、D問題だけではなくE問題まで解けると早くレートを上げることができると考えたので、E問題もDifficultyが低い順に解いています。精進の結果は以下の感じです。あと、経験則でわかってきたのですが、茶色の問題は30問も解けばできるようになって、緑も50問で解け始めてきたのですが水色は本番での正答率があまり高くありません。Difficultyが高い問題ほど、そのレベルの問題を多くこなす必要がありそうです（多分)。



![スクリーンショット 2022-10-11 19.03.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467169/d2600a90-a2b6-3bd9-735f-4bc31d6cd83d.png)



![スクリーンショット 2022-10-11 19.04.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467169/86a5d353-03cb-4a6a-aad2-07052b0d187a.png)


![スクリーンショット 2022-10-11 19.05.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467169/3c0f91f8-74de-56f7-ae61-87c6dd135710.png)

<H2>身につけたデータ構造など</H2>
二分探索、UnionFind、ダイクストラ法、幅優先探索、Set、ワーシャルフロイド法、累積和などが主に緑になるために身につけた知識です。覚えたアルゴリズムおよびデータ構造は、紹介されている記事をブラウザでお気に入り登録しておいて必要になったときにコピペして使えるようにしています。


また、C++のmultisetはPythonで代用できるライブラリが見つからなかったことに加えて、競技プログラミングをやる上である程度まで行くとC++で戦うことになるのかなとも思ったので、最近はPythonからC++に乗り換え始めてもいます。

<H2>今後について</H2>
就職活動に間に合うように早く水色コーダーになって自分が希望する企業に入れたらいいなと思います。今はそれが全てです。来年余裕が出てきたらICPCに結局まだ参加できていないので、友達を誘って学生生活最後の記念にICPCとかに参加したいです。

あと、大学を卒業する前にC#でゲームを作りたいという目標もあります。
Docker httpdイメージで.htaccessを有効にする

# はじめに
.htaccessを使いたくてDocker apache .htaccessと検索かけてみたらphp-apacheイメージ使った記事ばっかり出てきた、phpは使ってないんだけどなーな人向けです

# 環境
- Docker version 20.10.14
- docker-compose version 1.29.2

# とりあえず環境作る
```
.
├── docker-compose.yml
├── index.html
└── .htaccess
```
```yml
version: "3"
services:
  web:
    image: httpd:2.4
    ports:
    - "8080:80"
    volumes:
    - .:/usr/local/apache2/htdocs/
    working_dir: /usr/local/apache2/htdocs/
```
コンテナを起動させるとindex.htmlの内容が表示されます。が、.htaccessは反映されません。デフォルトでは.htaccessが無効になっているようです。
# .htaccessを有効にする
## httpd.confを変更できるようにする
.htaccessを有効にするには設定ファイルhttpd.confを変更する必要があります。httpd.confは/usr/local/apache2/conf/にあるので、一旦中身をコピーしてローカルhttpd.confを作ります。
```
.
├── docker-compose.yml
├── index.html
├── .htaccess
└── httpd.conf <-- コンテナ内のhttpd.confの中身コピーして追加
```
docker-compose.ymlいじってローカルとコンテナ内のhttpd.confが同期するようにします
```yml
version: "3"
services:
  web:
    image: httpd:2.4
    ports:
    - "8080:80"
    volumes:
    - .:/usr/local/apache2/htdocs/
    - ./httpd.conf:/usr/local/apache2/conf/httpd.conf # <-- 追加
    working_dir: /usr/local/apache2/htdocs/
```
これでhttp.confを変更できるようになりました。

## http.conf変更する
.htaccessを有効にするために必要な変更は2箇所
```
#LoadModule userdir_module modules/mod_userdir.so
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so <-- コメントアウト外す

<IfModule unixd_module>
```
```
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
#   AllowOverride FileInfo AuthConfig Limit
#
AllowOverride All <-- NoneからAllに変更
```
これで.htaccessが有効になります。めでたい。
VScodeでスニペット登録するときの記号の意味

今後もスニペット登録していくので忘れないようにメモする。
## 各項目、内容
スニペットのファイルを作成すると、こんな風に書かれてる。
~~~
	// Example:
	// "Print to console": {
	// 	"prefix": "log",
	// 	"body": [
	// 		"console.log('$1');",
	// 		"$2"
	// 	],
	// 	"description": "Log output to console"
	// }

~~~

print to console...スニペットの名前(なんでもいい)
prefix...登録するショートカット
body...登録したショートカットで展開するコード
description...メモしたければ書く

### 記号の意味
- 「$1、＄2...」 カーソルの位置を決める。複数入れると、タブで順番に飛ぶことができる。
 - 「\t」 タブを入れる

例
~~~json
	"includeTab": {
		"prefix": "tab",
		"body": [
			"@include mq(tab$1) {",
			"\t",
			"}"
		]
	}
~~~
出力
~~~scss
@include mq(tab) {
  
}
~~~
#### コードの中にダブルクォーテーションを入れたい場合。
シングルクォーテーションをいれる。保存したらダブルクォーテーションになるのでおk。
例:
~~~json
"<img src='' alt=''>"
~~~
出力
~~~html
<img src='' alt=''>
~~~
macOSインストールディスクイメージを作成

MacBiikAirの内蔵SSDにエラーが出ているため、外付けSSDで起動しています。
その為MacBookAirの起動で、VirtualBoxで起動できる方法を知り早速試しました。　
インストールメディアを作る際に手間取った点がありましたので、備忘録を兼ねて記録します。　

下記の記事を参考にしました。　

https://qiita.com/wancom/items/d1ed297c00577ba215ef

この中で、インストーラのコピーという部分が、上手く行かなかったです。　


command not found
とエラーが、出てしまったのです。　
検索したところパスを書く時に、空白が入っているのでは？という記事を見ました。
確認してみましたが、変わりませんでした。

さらに検索を続けたら、公式の記事を見つけました。


https://support.apple.com/ja-jp/HT201372　
Catalinaの場合は、このコマンドで出来ます。　
その他のバージョンのOSは、上記のリンクの公式記事で確認してください。

この記事を試す時は、ダウンロードしたインストーラを実行しない様に気をつけてください。　
インストーラがダウンロードできた後インストーラが開きますが、そのまま続けるのではなく、ドックに表示されているインストーラのアイコンを右クリックして、メニューの中の終了を選択して終了してください。

```bash 
sudo /Applications/Install\ macOS\ Catalina.app/Contents/Resources/createinstallmedia --volume /Volumes/MyVolume
```
私は、USBメモリーで試しました。　
私は、USBメモリーでインストールメディアを作った後、最初に読んだ記事で作った空白のイメージで試しましたが、無事に作ることができました。　
記事に従ってISOファイルに、変えることもできました。　

https://qiita.com/wancom/items/d1ed297c00577ba215ef


上記の記事の中の「catalinaimg」をご自身が設定した名前に、書き換えてください。　
USBメモリーの名前か、空白のイメージにつけた名前に変えてください。

### 書き換え例
```bash 
sudo /Applications/Install\ macOS\ Catalina.app/Contents/Resources/createinstallmedia --volume /Volumes/MAC-USB 
```

## 仮想マシンではAPFSが使えない
仮想マシンのMacOSで、Macで拡張ジャーナルでフォーマットしたUSBメモリをマウントできたのに、MacOSの起動ドライブは認識しないので、調べていました。
MacのEFIが、関係していることが分かりました。

## ラインセンス
MacOSを仮想マシンで使うときのライセンスが、気になっていました。
今回下記の記事をAPFSの検索の際に見つけましたので、シェアします。
https://book.mynavi.jp/macfan/detail_summary/id=87980

コピーを2台までは、仮想マシンで利用してよいそうです。
Next.js製ウェブサイトのTTFB(Waiting for server response)を約900ms縮めた話

自身で運営するウェブサイトのトップページがあまりに重いということがありました。
技術スタックは下記の通りです。
- 言語 : Typescript(Next.js)
- サーバー : Vercel(無料)

ひとまずPageSpeed Insightsでパフォーマンスを計測すると85。悪くない。
ただ、以下の改善項目が記載されておりました。
- 最初のサーバー応答時間を速くしてください : 1.13 s
- 使用していない JavaScript の削減 : 1.05 s

よくわからないので続いて、ディベロッパーツールのネットワークでTimeを確認。
- ドメインのTime : 937ms
- Waiting for server response : 927.47 ms
これはめちゃくちゃ遅い。ちなみにQiitaのトップページだとこのくらい。
- ドメインのTime : 325ms
- Waiting for server response : 244.47 ms

結果として、トップページのindex.tsxでgetServerSidePropsで行なっている処理をgetStaticPropsに書き直すことでここまで改善しました。
- ドメインのTime : 33.2ms
- Waiting for server response : 22.41 ms
頻繁にデータの更新が起こる値をフェッチしているわけではなかったのでgetStaticPropsを使うように直したところ、約900ms、TTFBが縮まりました。
900ms違うとだいぶ違います。1秒以上かかると変なサイトなのかな？とだいぶ不安になるレベルです。
頻繁に更新が走る値をフェッチするならuseEffectを使って一度レンダリングさせた後にフェッチする必要があるのかな。など考えつつ、一旦は課題が解決できたので一件落着です。
Received invalid response at https://github.com/johnno1962/InjectionIII. Please make sure it is a package collection URL.


まずここで検索

![スクリーンショット 2022-10-11 18.12.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494487/315f31cb-be88-bf27-c2cc-29db96f7b0c4.png)


https://github.com/johnno1962/InjectionIII

出てくるので追加

![スクリーンショット 2022-10-11 18.14.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494487/e78a496a-92de-4b22-ea25-48aed73c4be5.png)
Google Cloud Platform BigQuery料金体系及び、抑制策について

こんにちは、NTTデータ先端技術の陰です。
今回は、Google Cloud Platform(GCP)のサービスであるBigQueryの料金体系及び、料金の抑制策について紹介します。
 
## アジェンダ
1 BigQueryとは
2 BigQueryの料金について
3 BigQuery料金の抑制策について
4 まとめ

## 1 BigQueryとは
BigQueryとは、Google Cloudで提供するペタバイト規模の費用対効果の優れたフルマネージド型の分析データウェアハウスです。膨大な量のデータに対してほぼリアルタイムで分析を行うことができるサービスとなります。今回はBigQueryと同じフルマネージド型の分析データウェアハウスであるOracle Cloud提供の Autonomous Database for analytics and data warehousing (ADW)と料金体系を比較してみました。

## 2 BigQueryの料金について
![技術B1[1].png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821879/b64c2b61-e62f-a246-baa9-392a2c06523d.png)
BigQueryの利用料金は、クエリの処理にかかる分析料金と、データの保存にかかるストレージ料金で決まります。

<b>分析料金</b>については、クエリの処理にかかる費用となり、SQLクエリや、ユーザー定義関数を実行した後、実際にクエリがスキャンしたバイトの数に基づいて課金される設定になっています。

<b>ストレージ料金</b>については、BigQueryにデータを保存する際にかかる費用となり、BigQueryに保存されたデータの量に基づいて課金される設定になっています。

BigQueryの分析料金は以下の２つの特徴があります。

<b>①概算見積もりが難しい</b>
ADWはインスタンスの種類（OCPUの数）や使用した時間単位に基づいて課金されるインスタンス料金が設定されているので、簡単に概算を見積もることができますが、BigQueryは、クエリがスキャンしたバイトの数に基づいて課金される分析料金が設定されているので、実環境でどのぐらいクエリが発行されているのか、そして、スキャンされるデータ量はどのぐらいなのか把握できないと概算を見積もることが難しいです。

<b>②場合によってはADWより低価格で利用できる</b>
BigQueryの分析料金はADWのインスタンス料金と異なる体系になっており、クエリの発行数や、データ量が少ない場合は、ADWより低価格で利用できます。
![MicrosoftTeams-image (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821879/4fa02c5e-5b6a-f300-95fa-6a9d5ec87f31.png)
クエリ量、データ量に応じた選定イメージ

## 3 BigQuery料金の抑制策について

BigQueryの料金を抑える方法については、以下の2つがあります。

<b>①クエリの対象を絞る（SELECT *を避ける）</b>
BigQueryは、データがカラム形式で格納されているため、パフォーマンスが高いのが特徴です。ただし、「SELECT *」を使用しデータを検索すると、テーブル中のすべての列に対してクエリが実行されるので、最も高いコストが発生します。
「SELECT *」で全件検索すると、その中には不要なデータが含まれている可能性があります。不要なデータにコストがかからないように必要なデータだけ絞り込んで検索することが大事です。

<b>②テーブルを分離する（テーブルをパーティション化する）</b>
テーブルを分離すると、検索範囲を絞ることができ、クエリ処理のコストを削減することができます。（パフォーマンスも向上できます）

テーブルをパーティション化しないと以下のようにテーブル全体に対してクエリが実行されます。
![MicrosoftTeams-image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821879/583647e3-fd38-8130-d3c0-71609f896c2c.png)
しかし、テーブルをパーティション化すると以下のように検索範囲を絞ってクエリを実行することができるので、読み込まれるデータ量の削減ができます。
![MicrosoftTeams-image (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821879/daa53b51-a970-9b9f-f0ea-17c96a8ea803.png)
なお、BigQueryには、長期間データを保存する場合に適用される自動割引があります。
これは、データが検索及び、更新なしで90日間BigQueryに保存されると料金が自動的に約半額になるとてもお得なサービスになります。

テーブルをパーティション化すると検索範囲を絞るだけではなく、以下のように検索及び、更新がないパーティションに対して長期保存料金が自動で適用されるので、データ保存にかかる料金が約半額になり、ストレージ料金を抑えることができます。
![MicrosoftTeams-image (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821879/847e0370-8937-bc11-3053-f7567748bec2.png)

## 4 まとめ
BigQueryは他クラウドベンダーのフルマネージド型の分析データウェアと比較し、実際にクエリがスキャンしたバイトの数に基づいて課金される特徴があるので、膨大なデータ量に対してクエリの実行回数が少なく、高性能の処理が必要な場合におすすめです。

ユースケースや、アーキテクチャを確認し、各クラウドベンダーごとの料金体系を理解した上で、適切なフルマネージド型の分析データウェアを選定するようにしましょう。
Software Design 2012年12月号の記事「なぜエンジニアは文章が下手なのか」

https://www.amazon.co.jp/Software-Design-%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2-%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3-2012%E5%B9%B4/dp/B009YK3U3Q/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=Software+Design+2012%E5%B9%B412%E6%9C%88%E5%8F%B7&qid=1665477162&qu=eyJxc2MiOiIwLjUyIiwicXNhIjoiMC4wMCIsInFzcCI6IjAuMDAifQ%3D%3D&sr=8-1

背景
最近の課題である文章力を身に着けたいと思って探していたら発見。
私はエンジニアではないのですが、文章を書くに当たってのポイントが書かれているのではないかと思い、購入しました。
かなり古い書籍ですが、結論とてもおもしろい内容でした。

記事のテーマ
エンジニアの書く仕様書、提案書、トラブル報告書は分かりづらいと言われることが多々ある。
エンジニアは本当に文章を書くのが下手なのか？の考察から、実際の書き方まで解説されています。

個人的なポイント
１，仕事の流れとは逆の方向で説明したほうが伝わりやすいこともある
社長「なんのためにこれは必要なの？」
エンジニア「ファイルサーバーの性能を測るためです。」
社長「・・・で？」
というシーンは時々あると思います。
相手がどの段階を意識しているかを考えるといい。
仕事は「実測→予測→計画」で行っていくが、計画から話してあげると理解してもらえたりする。

２，だれがなんのために読むものか？
読み手の関心事にフォーカスする。
エンジニアなら機能がどのような仕組みで成り立っているのか？
ユーザー側なら機能を使うときのベネフィットは何なのか？

３，目的と目標を区別する
目的を達成するための途中の目安が目標。

４，指示待ち人間を生み出す構図
A→B→C→D・・・と作業をしているときにトラブルが発生した。
このトラブルが発生したときはDの作業を実施すればいい。だからA→Dだけ意識してB、Cについては解説を省く。
なんていう手順書があるが、これだけ鵜呑みにするエンジニアがいると指示待ち人間になる。
自分でB、Cまで調べられる人はそうならないが、調べてくれるのが理想。

５，疑問を持っていなければ納得感はない
疑問を持っていない事象に対して、いくら説明しても「なるほど！」とならない。
わかりずらい説明から始まるから「なるほど！」となることもある。

６，用語リストを作る
テーマやどんな人に対して作成する文章か決めたら用語リストを作る。
次にその用語を使う最も適切な順番を考える。

７，図解するには分解、分類、整列、ラベリングをする
原文を分解→項目ごとに分類→ストーリーを作るために整列させる→ラベリングして図にする
この流れだと分かりづらい文章もわかりやすく図解できる

８，文章を作るときの３つのポイント
一つ、一語で多義の言葉を使わない
二つ、接続詞を多用しない
三つ、主語と述語は近づける

心に残った部分
エンジニアが気にするのは「機能がどのような仕組みで成り立っているのか？」という部分です。
私はエンジニアの経験があまりなく、記事を書くときは手順書のようなものが多かったのですが、エンジニアがこれを知りたいと気づいたとき、「はっ！」としました。
お恥ずかしい。。

エンジニアはお客さんに説明するときも仕組みを知ってないと的確な答えが出せないですし、推測も建てられない。
このあたりを細かく、適切に書いてある記事がエンジニアにとっていい記事、いい本になる。

では、経営層はどうかと考えると、その機能がもたらすベネフィットや費用感、他の製品との違いなどより抽象度の高い段階が気になるのではないかと思います。

今後やること
・記事を書くとき、誰が読むのかをまずは考える
・テーマが決まったら、出てくる専門用語をリスト化し、どの順番で記事を書くか考える
・文章を書くだけではなく、図説も入れる
・分解、分類、整列、ラベリングを使う

まとめ
文章の基本を学んだだけでは見えてこない、より具体的な記事作成論を知ることができたと思います。
説得力を持たせるには論理的に説明するといっても、具体的にどうしたらいいのかは見えてきません。
それを、エンジニアやユーザー視点で説明されることで、何を目的に話を進めればいいのか、この記事を読むと少し見えてくる気がしました。

最近、読解力を身に着けようとしていましたが、これは読む側の視点。
今回書く側の視点で学んでみたものの、まだ違いが見えてきません笑
もう少し、いろんな本を読んでみます。
Rubyで多次元ベクトルの内積を並列計算

例として12次元ベクトルを前半、後半に分けて、前半の内積、後半の内積を２つのTheadを使って求める。２つの内積の和が求めたい内積の値となる。
前半の内積、後半の内積を計算するProc(クロージャー)を作ってQueueに放り込むコードは次の通り。
前半の内積、後半の内積を変数sumに蓄積したいが、この計算はThread安全に行いたいのでクリティカルセクションとしたい。
クリティカルセクションにしたいクロージャーは、Mutexオブジェクトのsynchromizeメソッドの引数に与えれば作ることができる。

```ruby
# 内積の計算を2Threadで実行。
ary0 = [0.4, 0.2, 0.3, 0.5, 0.2, 0.4, 0.5, 0.1, 0.2, 0.4, 0.5, 0.9]
ary1 = [0.1, 0.2, 0.2, 0.2, 0.3, 0.4, 0.4, 0.4, 0.5, 0.5, 0.5, 0.9]
sum = 0
lock = Mutex.new
q = Queue.new
[{:from => 0, :to => ary0.size/2},
 {:from => ary0.size/2+1, :to => ary0.size-1}].each {|e|
  q.push proc {
    t = 0
    e[:from].upto(e[:to]) {|i|
      t = t + ary0[i] * ary1[i]
    }
    lock.synchronize { sum = sum + t }
  }
}
```
Queueからクロージャーを取り出して実行するThreadを2個作る。作った時に返るThreadハンドルは配列に格納しておく。
これで、main Threadとは別のThreadが作られ走り始めるが、作られたThreadが終わるのをmain Threadで待ち構えるためにThreadハンドルが使われる。
```ruby
th = []
0.upto(1) {|i|
  until q.empty?
    th << Thread.start(q.pop) {|e|
      e.call
    }
  end
}
# 0.upto(1) {|i|
#   th << Thread.new {
#     until q.empty?
#       q.pop.call
#     end
#   }
```
2つのThreadが終わるをmain Threadで待って内積の値を表示する。
```ruby
th.each {|t| t.join}
puts sum
```
検算のためにThreadを使わずに内積の計算をして、Threadを使った場合の結果と比較してみる。両者の値はコード末尾の２つの値で一致する。
```ruby
# 2Threadで実行して得た結果と、main Threadで計算して得た結果を比較
checksum = 0 
ary0.each_with_index {|e, i|
 checksum =  checksum + ary0[i] * ary1[i]
}
puts checksum
__END__
2.0600000000000005
2.0600000000000005
```
Laravel5.7→5.8へのバージョンアップでどハマり。Cache::lock()の仕様が変わっていた

Laravel5.8からCache::lock()に第三引数`$owner`が追加されました。
この引数はデフォルトがnullに設定されているので、5.7までのままだと第三引数には自動的にnullが渡されます。
`vendor/laravel/framework/src/Illuminate/Cache/Lock.php`のコンストラクタに
```
        if (is_null($owner)) {
            $owner = Str::random();
        }
```
なんてのが追記されていたため、予期せぬ挙動に...。

ソースコードを追っていくと、**5.7までと同じ挙動にするには第三引数に数字の1を渡す必要**がありました。
[公式のアップグレードガイド](https://readouble.com/laravel/5.8/ja/upgrade.html)にも乗っておらず、えらいハマったので怒りの備忘録を残しておきます。
3行のコードで文章分類が判別できる

## pipeline

Transformersのpipelineを利用して、わずか数行のコードで NLP タスクを実装できる。
今回はとりあえず文章分類タスクの英語版・日本語版を試した内容を記載します。
## 嬉しいこと
最短3行のコードで事前学習済みモデルを利用できる。

## 利用条件
タスク名を指定するだけで簡単にタスクの実行が可能です。
## 実際に試した
１．英語版の文章分類タスク
```:
from transformers import *
sample_sentence_classif=pipeline("sentiment-analysis")

sentences=["I like this movie.", "This movie is so boring"]

#感情分析の実行
results = sample_sentence_classif(sentences)
for result in results:
  print(f"label:{result['label']}, score:{round(result['score'],4)}")
```
二つ文章の予測結果は↓、正しいラベルが予測できました。
```:実行結果
label:POSITIVE, score:0.9999
label:NEGATIVE, score:0.9998
```
2．日本語版の文章分類タスク
```:
from transformers import pipeline, AutoModelForSequenceClassification, BertJapaneseTokenizer

jp_model = AutoModelForSequenceClassification.from_pretrained('daigo/bert-base-japanese-sentiment') 
jp_tokenizer = BertJapaneseTokenizer.from_pretrained('cl-tohoku/bert-base-japanese-whole-word-masking')
jp_sentence_classif = pipeline("sentiment-analysis",model=jp_model,tokenizer=jp_tokenizer)

#感情分析の実行
sentences=["この犬はかわいい", "その本は退屈だ"]

results = jp_sentence_classif(sentences)
for result in results:
  print(f"label:{result['label']}, score:{round(result['score'],4)}")
```
二つ文章の予測結果は↓ 、正しいラベルが予測できました。


```:実行結果
label:ポジティブ, score:0.9919
label:ネガティブ, score:0.9831
```
## 感想
非常に利用しやすい印象です！

##### 参考記事
https://note.com/npaka/n/ne0adde2d7ae8
コンテナ内のDBをVSCodeからGUIで操作する方法

![スクリーンショット 2023-07-28 11.28.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/a1eca4bf-246d-d098-de4a-b856ca99116c.png)
## 前提
- すでにコンテナを作成済み
- MySQLを例に操作説明します
- Dev Containersを設定済み
- launch.jsonを設定済み

上記の設定ができてない、方法がわからない方は下記の記事を参考にしてください

https://qiita.com/shun198/items/9e4fcb4479385217c323

## Dev Containersを使ってコンテナへリモート接続
![スクリーンショット 2023-07-28 11.28.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/8f78758a-d47c-ec90-bd2a-1dd10df45921.png)

## SQLToolsをインストール
![スクリーンショット 2023-07-28 11.28.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/d3619eb6-4852-0340-a1f3-4c89d801c874.png)

## SQLTools MySQL/MariaDBをインストール
今回はMySQLをインストールします
使用できるDBは以下の通りです
- AWS Redshift
- CockroachDB
- MariaDB
- Microsoft SQL Server/Azure
- MySQL
- PostgreSQL
- SQLite

![スクリーンショット 2023-07-28 11.29.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/52b512af-6e33-d7b0-492c-450e41fde038.png)

## Add New Connectionを選択
![スクリーンショット 2023-07-28 11.29.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/f77b2a33-c569-710a-ad05-8ceb2dacadb8.png)


## MySQLを選択
![スクリーンショット 2023-07-28 11.29.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/ad884260-d261-22fc-601d-d398a7bf930c.png)

## 設定を入力
接続する際の設定値を入力していきます
|  項目  |  入力値  | 
|-----|-----|
|  Connection name  | 任意の名前で大丈夫です  | 
| Server Address | DBのコンテナ名を指定します |
| Port | docker-compose.ymlで指定したポート番号を入力します |
| Database | .envに記載しているDB名 |
| Username | .envに記載しているユーザ名 |
| Password | .envに記載しているパスワード |

![スクリーンショット 2023-07-28 11.29.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/efe98a23-86fc-daed-908f-a4a64ffb5fd3.png)

## 接続に成功
成功すると以下のようにDBとテーブル一覧が表示されます
![スクリーンショット 2023-07-28 11.30.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/aff2401b-e9c6-a4f2-4702-12e1154f96ee.png)

テーブルの詳細を見ることができます
![スクリーンショット 2023-07-28 11.30.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/29d9e1ac-b74d-157a-a549-0508f8b381c5.png)

🔍を押すとSelect文が実行され、データ一覧が表示されます
![スクリーンショット 2023-07-28 11.30.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/e5db1a58-b645-6552-69ff-419134543dc6.png)

＋を押すと自動でInsert文を入力できます
![スクリーンショット 2023-07-28 11.31.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/1146172d-526c-c9a5-8ef2-916a35ed2c84.png)

以上です。

## 記事の紹介
以下の記事も書いたのでよかったら読んでいただけると幸いです

https://qiita.com/shun198/items/a66d6214cdab5629029d

https://qiita.com/shun198/items/f6864ef381ed658b5aba

## 参考
https://qiita.com/Midoliy/items/0b254d91aa93763db11a

https://penpen-dev.com/blog/docker-compose-mysql-container-vscode/
AdobeのAe,Prのインストールでエラー Exit Code: 183

# 仕様
M2 MacBook Air

# 経緯
Creative Cloudでインストールしようとするとエラー、Exit Code: 183　が表示され、
インストールできない。

# 試して解決した方法
調べると英語や日本語で解決方法が散見された。
Rosetta2が必要とのこと。
私の場合、Macのターミナルからコマンドで直接ダウンロードしました。
ライセンス契約に同意が必要。
~~~
softwareupdate --install-rosetta
~~~
インストールが終わり再度、CreativeCloudでAe、Prをインストールすると
エラーなくいけました！

＃参考記事
https://qr.paps.jp/vusRM
[Rails] 別モデルのscopeをくみあわせて新しいscopeをつくる


## 環境
- Rails6
- mysql 5.7


## やりたいこと
別モデルのscopeをくみあわせて新しいscopeをつくりたい。
たとえば、吹奏楽部でフルートパート1年の徴収済みの部費を集計したいとします。
(部費テーブルとメンバーテーブルは分かれてるとして、)
```ruby
buhi_table.sum(:buhi).search_1nen_members('flute')
```
こうかけるscopeをつくりたい
その時、メンバーテーブルの既存スコープを組んでつくれると楽だよね。

## やり方
メンバーテーブルのsearch_part、search_1nenというスコープを組みたいとします。
```ruby
scope: :search_1nen_members, ->(part_name) do
  joins(:member).merge(Member.scope_part(part_name).scope_1nen) if part_name.present?
end
```

こう定義することで、

buhi_table.sum(:buhi).search_1nen_members('flute').to_sqlで下のSQLが確認できる :smiley: 

```sql
SELECT sum(buhis.buhi) FROM buhis INNER JOIN `members` ON `members`.`id` = `buhis`.`member_id` WHERE  `members`.`gakunen` = 1 and `members`.`part` = `flute` "
```
VBA で Ruby を動かす

# はじめに
前回の記事で、~~会社支給のパソコンに~~`Ruby`をインストールすることに成功しました。

https://qiita.com/superrino130/items/e2d7b039c8d91a373770

VBA最強ではありますが、速度やネットワーク関連でRubyを呼び出したいところです。

ここでは、次の記事を参照しています。

https://qiita.com/O_LUPAN/items/1ceb5c950ff40f3558ab
# VBAソース
```VB:VBA
Option Explicit

Public Sub puts_Ruby01()
    Dim suji1 As String
    Dim suji2 As String
    Dim rb_file As String
    
    suji1 = "3"
    suji2 = "5"
    
    Dim WSH
    Dim wExec
    Dim cmd_str As String

    Set WSH = CreateObject("WScript.Shell")

    rb_file = ThisWorkbook.Path & "\puts_hello.rb"
    cmd_str = "ruby " & rb_file & " " & suji1 & " " & suji2
    cmd_str = Replace(cmd_str, "\", "/")
    Set wExec = WSH.Exec("%ComSpec% /c " & cmd_str)

    Do While wExec.Status = 0
        DoEvents
    Loop

    Debug.Print Val(wExec.StdOut.ReadAll)  'CMDから結果を受け取る

    Set wExec = Nothing
    Set WSH = Nothing
End Sub
```
ここでは、イミディエイトウィンドウに**Debug.Print**しています。
# Ruby側ソース
```rb:ruby
puts ARGV.map(&:to_i).sum
```
**ARGV**は配列です。
# 実行結果
![20221011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/5ac38a36-790f-4fca-6951-02337d8e3350.png)

# まとめ
+ VBA と ruby の連携を行った
+ @O_LUPAN さん、ありがとう
.Netで開発したライブラリをNuget公開する方法

## はじめに

https://qiita.com/yusuke-sasaki/items/c75e32aadcd297461ef7

こちらの記事で自動での公開を調べていましたが、手動で公開する手順が必要になったので備忘録も兼ねて.Netで開発したライブラリをNuget公開する手順を示します。
MSBuildベースで示すので、dotnet CLI利用する場合は適宜コマンド部分は置き換えてください。

## 準備

- csprojにバージョンや説明、copyrightを記載しておきます。
- csprojのItemGroupに以下を追加し、`Nuget.Build.Tasks.Pack`を参照に追加する
※上記は参照に追加せずとも標準で入っている場合もあるそうですが私の.Net Framework4.6.2のプロジェクトでは必要でした([参考](https://learn.microsoft.com/ja-jp/nuget/create-packages/creating-a-package-msbuild))
```xml
<ItemGroup>
  <!-- ... -->
  <PackageReference Include="NuGet.Build.Tasks.Pack" Version="5.2.0"/>
  <!-- ... -->
</ItemGroup>
```
合せて`PackageOutputPath`をPropertyGroupに追加します。
以下の指定であればcsprojと並列な箇所にnupkgが出力されます。
```xml
<PropertyGroup>
  <!-- ... -->
    <PackageOutputPath>.\</PackageOutputPath>
  <!-- ... -->
</PropertyGroup>
```

## nupkgを作成する

Nugetに公開するにはパッケージ化されたnupkgファイルが必要なので以下の手順で作成します。
csprojのあるディレクトリをカレントにすればパスの指定は不要です。

```
msbuild [csprojのあるパス] -restore /t:pack /p:Configuration=Release
```

## Nuget公開する

### NugetのAPIキーの取得が面倒な場合
（Nuget Galleryアカウントを取得しておく必要はある）

以下から作成したnupkgファイルをアップロードすれば公開できます。

https://www.nuget.org/packages/manage/upload

### コマンドで実行する場合

APIキーを取得しコマンドでNuget公開します。

APIキーの取得の手順は以前の記事でもまとめたので[こちら](https://qiita.com/yusuke-sasaki/items/c75e32aadcd297461ef7#nuget%E3%81%AEapi%E3%82%AD%E3%83%BC%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)を参照ください


```
dotnet nuget push [.nupkgファイル] --source https://api.nuget.org/v3/index.json  --api-key [APIキー] --skip-duplicate
```
機械学習のサーベイに使える分野別githubリポジトリまとめ（協力者求ム）



## はじめに

機械学習の研究をする中で、一つ一つの面白い研究や論文よりも、その研究領域全体を知りたい、学びたいという方が多いと思います。個人的に、そのようなときは研究領域全体をまとめたような素晴らしい実装が参考になるので今回は各分野についてそのような実装をまとめてみました。
なお、その分野のpaperだけを知りたい場合は、実装を見るほかにもawesomeリストを調べることで知識を広げられると思います！

## 注意

私は普段画像生成モデルを中心に調べているので、音声や強化学習、自然言語処理などの分野に詳しくありません。
詳しい方がいらっしゃいましたら是非コメントください！

## 機械学習の理論

### Knowledge Distillation (知識の蒸留）
URL
https://github.com/AberHu/Knowledge-Distillation-Zoo/

説明

Knowledge Distillationはいかに大きなモデルの良い性能を小さなモデルに転移させるかに関する手法の一つです。
上記の実装はcifar10, cifar100という非常に使いやすいデータセットに特化して約20種類のKnowledge Distillationに関するコードをまとめて実装しています。


## Computer Vision

### OpenMMLab

URL
https://github.com/open-mmlab/

説明
OpenMMLabシリーズは機械学習全般の実装を分野別に"https://github.com/open-mmlab/???" のようにリポジトリを作っています。
Classificationから生成モデルまでかなり幅広くカバーしているので、便利だと思います！

![188411410-a95bcf39-1d2a-4d41-865c-c725b3d715f0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556683/28059cc3-c3ba-1909-d2a7-a6def275047c.png)
[引用: https://github.com/open-mmlab]

configファイルを変えるだけで既存の実験の設定を自由にカスタマイズすることが出来、実装ごとに便利な機能（ログの生成など）もあります。最初はconfigファイルの書き方などに苦労すると思いますが、リポジトリの説明が充実しているので

### Timm (pytorch-image-models)

URL
https://github.com/rwightman/pytorch-image-models#sponsors/

CV系全般のモデルをカバーしている実装です。ResNetから、最近のものではSwin系の実装もあり、これらをクラス分類タスクに応用しています。評価セットとしてImageNetやその派生物（ImageNet Adversarialなど）を使っています。

### Generative Adversarial Networks (GANs) 

URL
https://github.com/eriklindernoren/PyTorch-GAN/
https://github.com/eriklindernoren/Keras-GAN/

説明

GANsは画像生成の手法の一つです。初期のGANを勉強するにはこのコードがいいでしょう。mmシリーズのmmgenerationはPGGANやBigGANなどの中期以降のGANを勉強するには最適だと思います！

## 音声

募集中

## 強化学習

募集中

## まとめ・感想
私自身が知っている範囲でいい実装をまとめてみたのですが、やはり機械学習の全分野の実装を調べるのは難しいと改めて感じました。
「この分野の勉強にはこの実装がいいよ～」などのコメントがありましたらコメントをください！
【Ruby on Rails】booleanで実装するときとenumを使うときの違いは？(データ型一覧有り)



# はじめに
Ruby on Railsでポートフォリオ作成にあたりテーブル定義書を作成したが、booleanで実装するときとenumを使うときの違いがわからなかったため調べた結果を記録に残しておく。
また、今後のためにデータ型はどんなものがあるのか一覧にしておくことで、調べる時間の短縮を図る。
(実際に何度も実装する内によく使うデータ型は自然と覚えていくと思うが、現時点ではそのレベル感には到達していないため、記録に残しておきます。)


# データ型一覧

- string : 文字列(1 〜 255文字)
- text : 長い文字列(1 〜 4,294,967,296文字)
- integer : 整数型(4バイト)
- bigint ： 整数型(8バイト)
- float : 数値（浮動小数点数）
- decimal : 固定長整数型（精度の高い小数）
- datetime : 日付と時刻(1000-01-01 00:00:00.000000 〜 9999-12-31 23:59:59.999999)
- time : 時刻 (-838:59:59 〜 838:59:59)
- timestamp : タイムスタンプ ('1970-01-01 00:00:01' UTC ~ '2038-01-19 03:14:07' UTC)
- date : 日付(1000-01-01 〜 9999-12-31)
- binary : バイナリ文字列型
- boolean : 真偽
- primary_key : プライマリーキー(主キー)


# booleanで実装するときとenumを使うときの違いは？
<font color=red>※新しく学んだ内容があれば追記します。</font>

#### [booleanの特徴]
・一般的には真と偽のような2つの状態を表すデータ型
・デフォルト値を設定する必要がある

#### [enumの特徴]
・数値に意味を持たせることができる
・大量のデータを安全に管理できる(文字型で管理すると誤入力が発生する可能性があるが、文字型を数値と紐付かせることで誤入力を回避できる)
・データベースに格納する時に、文字型より数値型の方がデータサイズが小さくなる

#### [現段階での見解]
・管理したいデータが2種類しか無い(2種類しか存在させたくない)時に使用するべき。
　(boolean型では”真(true)”と"偽(false)"の2種類しか存在しない。)
　NULLが来たときはRubyでは 「nil と false はどちらも偽」 として扱われるため、思わぬエラーも回避できる。
・2種類のデータをenumで管理することも可能だが、NULLの時にエラーになるかもしれないため、好ましくない。



# 終わりに
調べてみたらbooleanとenumは全くの別物でした。。
NULLの概念についてがややこしいので経験を積む中で少しずつ理解を深めていきたいです！
最後まで読んでくださり、ありがとうございました。

# 参考文献
https://qiita.com/mmaumtjgj/items/b9b04ea64e30a16569fe
https://qiita.com/jnchito/items/a342b64cd998e5c4ef3d
備忘録：Power BI レポート上での日付差分取得について

#### 目的：
勤怠打刻システムから取得したデータの[出勤予定時刻]と[出勤打刻時刻]の差を「分」で取得したい。

#### 対策：
1) Power Query で取得する際、それぞれの列型を「日付/時刻」で取り込む。
2) レポートに追加する。
3) 視覚化＞列＞対象項目のプルダウンをクリックし、下部にある選択肢を「日付の階層」から『対象項目名』に変更する。
4) 【新しい列】をクリックし、列名を「出勤時刻差分」とする。
5) DAX式を次のように記述する。
~~~
　出勤時刻差分 = 
　DATEDIFF(
　　'テーブル名'[出勤予定時刻],
　　'テーブル名'[出勤打刻時刻],
　　MINUTE
　)
~~~

#### 参考文献：

https://note.com/tentomusea/n/n69b6f7a79af0

https://learn.microsoft.com/ja-jp/dax/datediff-function-dax
【TypeScript】 Sliceメソッド　メモ

## Sliceメソッドとは??
配列を一部分だけ抜き出して新しい配列を作れるもの！！（便利）

## 実用例
* 普通の文字列の配列から一部分抜き出す
```typescript
const array1: string[] = ['りんご', 'みかん', 'ぶどう', 'なし', 'もも'];
const changeArray1: string[] = array1.slice(0,2);//0番目から2番目未満の取得
console.log(changeArray1);//[ 'りんご', 'みかん' ]
```

`array1.slice(0,2)`と指定したときは、***0,1,2番目***の要素ではなく***0,1番目***の要素が取得される

* 第一引数のみ指定してみる
```typescript
const array2: string[] = ['りんご', 'みかん', 'ぶどう', 'なし', 'もも'];
const changeArray2: string[] = array2.slice(2);//2番目以降の取得
console.log(changeArray2);//[ 'ぶどう', 'なし', 'もも' ]
```
`array2.slice(2)`と指定したとき、***指定された数の要素***から最後まで取得される
(指定された数の要素も含むことに注意！！)

* 引数にマイナスな値を指定してみる
```typescript
const array3: string[] = ['りんご', 'みかん', 'ぶどう', 'なし', 'もも'];
const changeArray3: string[] = array3.slice(-4,-2);
console.log(changeArray3);//[ 'みかん', 'ぶどう' ]
```
```typescript
const array4: string[] = ['りんご', 'みかん', 'ぶどう', 'なし', 'もも'];
const changeArray4: string[] = array4.slice(-2);
console.log(changeArray4);//[ 'なし', 'もも' ]
```
負の値を配列に当てはめてみると↓のようになる
|| りんご | みかん | ぶどう | なし | もも |
|---|---|---|---|---|--- |
|正の値|0|1|2|3|4|
|負の値|-5|-4|-3|-2|-1|

あとは正の値と同じような法則で抜き出すことができる