OmniAICreator/Qiita-1.07M huggingface dataset:
ScriptからSortingLayerを追加する

オレオレライブラリ、と言うかオレオレ開発環境を構築する上で、SortingLayerを自動的に設定したい場合が有ります。
そのための手順を調べたのでメモしておきます。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ScriptからSortingLayerを追加するテスト。<br>Qiitaの記事用に動画を張り付け。 <a href="https://t.co/YRx4EQKcjr">pic.twitter.com/YRx4EQKcjr</a></p>&mdash; MIYAKE (@ScreenPocket) <a href="https://twitter.com/ScreenPocket/status/1447920356124205057?ref_src=twsrc%5Etfw">October 12, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

先に参考資料を貼っておきます

https://stackoverflow.com/questions/49270205/how-to-add-sorting-layer-via-script

↑の記事にあるコードと、コメントにある修正部分を参照してメソッドを用意します

```cs:SettingWindow.csの一部
        /// <summary>
        /// SortingLayerの準備
        /// </summary>
        private static void SetupSortingLayer()
        {
            string[] sortingLayerNames = {"UI","SystemUI"};//←追加したいSortingLayerをご自由に
            foreach (var sortingLayerName in sortingLayerNames)
            {
                CreateSortingLayer(sortingLayerName);
            }            
        }
        
        /// <summary>
        /// SoringLayerを追加
        /// </summary>
        /// <param name="layerName">追加したいSortingLayerの名前</param>
        private static void CreateSortingLayer(string layerName)
        {
            var serializedObject = new SerializedObject(AssetDatabase.LoadMainAssetAtPath("ProjectSettings/TagManager.asset"));
            var sortingLayers = serializedObject.FindProperty("m_SortingLayers");
            for (var i = 0; i < sortingLayers.arraySize; i++)
            {
                if (sortingLayers.GetArrayElementAtIndex(i).FindPropertyRelative("name").stringValue.Equals(layerName))
                {
                    Debug.LogWarning($"Already Exists SortingLayer! name:{layerName}");
                    return;
                }
            }

            sortingLayers.InsertArrayElementAtIndex(sortingLayers.arraySize);
            var newLayer = sortingLayers.GetArrayElementAtIndex(sortingLayers.arraySize - 1);
            newLayer.FindPropertyRelative("name").stringValue = layerName;
            newLayer.FindPropertyRelative("uniqueID").intValue = (int)System.DateTime.Now.Ticks;
            serializedObject.ApplyModifiedProperties();
        }
```

という事でSerializedObject経由でFindPropertyを使って設定できるようです。
uniqueIDの設定方法が少々癖があるっぽいですね。
上記コードは参考資料のコメントのまま記載しましたが、
オレオレライブラリ内でSortingLayerを継続利用したい場合はuniqueIDを名前とワンセットで揃えておいた方が良いかもしれませんね。
[memo] smooth docker stop, exec, run

docker run

```shell
docker images | peco | awk '{print $1}' | read image_name &&  docker run $image_name
```

docker stop

```shell
docker ps | peco | awk '{print $1}' | xargs docker stop
```

docker exec

```shell
docker ps | peco | awk '{print $1}' | read process_id && docker exec -it $process_id /bin/bash
```
jsでobjectのキーの順序を変更する

https://teratail.com/questions/106913

```js
{
    address:'',
    age:'',
    client_name:'',
    customer_id:'',
    first_visit_date:'',
    prefecture:'',
}
```

jsのobjectのキーを自分の指定した、順序に並び替える方法。

```js
//json並び替え key_orderの順番に並び替える
 let key_order = ['address','client_name','first_visit_date','prefecture','customer_id','age']
 let hash = {}
 let items_data = key_order.map(function(x){
   return json.items[0][x]
 })

 for (let [i,j] of zip(key_order,items_data)){
   hash[i] = j
 }
 json.items[0] = hash
```


参考文献：
https://teratail.com/questions/106913

https://python.ms/javascript--zip/#%E4%BD%BF%E7%94%A8%E4%BE%8B
wpにてdebugする


```wp-config.php
define( 'WP_DEBUG', true );
//ここをtrueにすることにより、デバッグ機能が動く

if ( WP_DEBUG ) {
  define( 'WP_DEBUG_LOG', true );
  define( 'WP_DEBUG_DISPLAY', false );
  @ini_set( 'display_errors', 0 );
}
//ここを記述することにより、debug.logにエラーなどのlogが表示される。
//そのため、検証が可能になる。
```

参考：

https://www.nxworld.net/wp-debug-log.html
Microsoft Endpoint Configuration Manager MECM（旧SCCM）コマンド【10/21更新】

#あいさつ
ども、こんにちは。
そこらへんにいるしょっぱいサーバインフラエンジニアを謳ってるけいしーです。_(:3 」∠)_

今日はちょっとガチで大事な備忘録なので、書くといった次第です。
思ったよりMECMのコマンド調べてみると出てこないもんですね。
要領掴んできたので、どんどん追加していく予定です。

随時更新していきますので、要まめチェックです。(/・ω・)/

###PowerShell を使用して Configuration Manager へ接続する

```PowerShell:PowerShell
Set-Location ‘C:\Program Files (x86)\Microsoft Endpoint Manager\AdminConsole\bin’
Import-Module .\ConfigurationManager.psd1
Set-Location <サイトコード>:
```
※1行目の’C:\Program Files (x86)\Microsoft Endpoint Manager\AdminConsole\bin’はデフォルトの値のため、ダウンロード先にあわせて任意でファイルパスを変更してください。


###対象のサイトコードに接続していることの確認

```PowerShell:PowerShell
Get-CMSite
```

#マルウェア対策ポリシー
##マルウェア対策ポリシーの確認

```PowerShell:PowerShell
Get-CMAntimalwarePolicy -Name "PolicyName"
```

##スケジュールされたスキャンの確認

```PowerShell:PowerShell
Get-CMAntimalwarePolicy -Name "PolicyName" -Policy ScheduledScans
```

###スケジュールされたスキャン-スキャンの種類[クイックスキャン(1)]

```PowerShell:PowerShell
Set-CMAntimalwarePolicy -Name "PolicyName" -ScheduledScanType QuickScan
```

###スケジュールされたスキャン-スキャンの種類[フルスキャン(2)]
```PowerShell:PowerShell
Set-CMAntimalwarePolicy -Name "PolicyName" -ScheduledScanType FullScan
```

###スケジュールされたスキャン-スキャンを実行する前に、最新のセキュリティ インテリジェンス更新ファイルであるかどうかをチェックする[有効]

```PowerShell:PowerShell
Set-CMAntimalwarePolicy -Name "PolicyName" -CheckLatestDefinition $true
```
※`$`を付け忘れるとエラーで返されます。気を付けてね。

###スケジュールされたスキャン-スキャンを実行する前に、最新のセキュリティ インテリジェンス更新ファイルであるかどうかをチェックする[無効]

```PowerShell:PowerShell
Set-CMAntimalwarePolicy -Name "PolicyName" -CheckLatestDefinition $false
```
※`$`を付け忘れるとエラーで返されます。気を付けてね。

##スキャンの設定の確認

```PowerShell:PowerShell
Get-CMAntimalwarePolicy -Name "PolicyName" -Policy ScanSettings
```

##既定の設定の確認

```PowerShell:PowerShell
Get-CMAntimalwarePolicy -Name "PolicyName" -Policy DefaultActions
```

##リアルタイム保護の確認

```PowerShell:PowerShell
Get-CMAntimalwarePolicy -Name "PolicyName" -Policy RealTimeProtection
```

##除外の設定の確認

```PowerShell:PowerShell
Get-CMAntimalwarePolicy -Name "PolicyName" -Policy ExclutionSettings
```

##詳細設定の確認

```PowerShell:PowerShell
Get-CMAntimalwarePolicy -Name "PolicyName" -Policy Advanced
```

##脅威のオーバーライドの確認

```PowerShell:PowerShell
Get-CMAntimalwarePolicy -Name "PolicyName" -Policy ThreatOverrides
```

##Cloud Protection Serviceの確認

```PowerShell:PowerShell
Get-CMAntimalwarePolicy -Name "PolicyName" -Policy MicrosoftActiveProtectionService
```

##セキュリティ インテリジェンスの更新の確認

```PowerShell:PowerShell
Get-CMAntimalwarePolicy -Name "PolicyName" -Policy DefinitionUpdates
```

##随時更新中！！(´・ω・｀)



###参考資料

https://cloudsteady.jp/post/43314/

https://docs.microsoft.com/ja-jp/powershell/sccm/overview?view=sccm-ps

#あとがき
情報は随時更新します。
よろしくおねがいします！(/・ω・)/
【初心者のHTMLメモ】リストをVSCodeでたくさん書くときに便利な記述

# VSCodeでリストを一個一個記述するのが大変な時用のメモ
VSCodeのEmmet機能を使う事！

```html
ul>li*3>ul>li*2
```
これをすくなくとも末尾の2は必ず手打ちでやるってすぐにTabキーを押すと

```html
   <ul>
       <li>
           <ul>
               <li></li>
               <li></li>
           </ul>
       </li>
       <li>
           <ul>
               <li></li>
               <li></li>
           </ul>
       </li>
       <li>
           <ul>
               <li></li>
               <li></li>
           </ul>
       </li>
   </ul>
```
上記の様に変換される

自分の所持しているVSCodeだとコピペにした場合、インデントが生じるだけなので
```ul>li*3>ul>li*2```の末尾だけは手打ちでやった方が良い。
railsチュートリアル第七章 flash

###flash
ユーザー登録フォームが実際に動くようになった。
それにより登録することができるよになった。
登録完了後に表示されるメッセージを二度目以降に表示させないようにさせる。
それを使うには
```flash```という変数を使う。　ハッシュのように使う。
####ユーザー登録ページにフラッシュメッセージを追加する
app/controllers/users_controller.rb

```rb
class UsersController < ApplicationController
.
.
.
  def create
    @user = User.new(user_params)
    # 外部メソッドを使う
    if @user.save
      # 保存の成功をここで扱う。
      flash[:success] = "Welcome to the Sample App!"
      # 成功時一度だけ表示されるメッセージ
      redirect_to @user
      # urlを指定して表示する
      # 保存成功したらurlを表示する
    else
      render 'new'
      # 保存に成功しなければnewアクションに移動する
      # 失敗したらまた戻る
    end
  end
  
  private
  #外部から使えないようにする
  
    def user_params
    # Usersコントローラの内部でのみ実行される
    # Web経由で外部ユーザーにさらされない
       params.require(:user).permit(:name, :email, :password,
                                   :password_confirmation)
    end
end
```

```rb
>> flash = {success: "It worked!", dager: "It failed." }
# ハッシュを作った。
=> {:success=>"It worked!", :dager=>"It failed."}
>> flash.each do |key, value|
# each文を作成　繰り返し
?>   puts "#{key}"
>>   puts "#{value}"
>> end
success
It worked!
dager
It failed.
```

:successキーのメッセージが表示される場合、適用されるCSSクラスは次のようになります。

```html
alert-success
```



####flash変数の内容をWebサイトのレイアウトに追加する
app/views/layouts/application.html.erb

```html
<!DOCTYPE html>
<html>
  <head>
    <title><%= full_title(yield(:title)) %></title>
    <%= render 'layouts/rails_default' %>
    <%= render 'layouts/shim' %>
  </head>
  <body>
    <%= render 'layouts/header' %>
    <div class="container">
      <% flash.each do |message_type, message| %>
        <div class="alert alert-<%= message_type %>"><%= message %></div>
        <!--これがデータ送信成功時メッセージのためのHTML-->
        <!--message_typeにsuccess代入, message 成功時メッセージに代入-->
      <% end %>
      <%= yield %>
      <%= render 'layouts/footer' %>
      <%= debug(params) if Rails.env.development? %>
      <!--デバッグ情報はRailsの3つのデフォルト環境のうち、開発環境（development）だけで表示されるようになります-->
    </div>
  </body>
</html>
```
###演習
1.コンソールに移り、文字列内の式展開（4.2.1）でシンボルを呼び出してみましょう。例えば"#{:success}"といったコードを実行すると、どんな値が返ってきますか? 確認してみてください。

```
>> "#{:success}"
=> "success"
```

2.先ほどの演習で試した結果を参考に、リスト 7.28のflashはどのような結果になるか考えてみてください。

```rb
>> flash
=> {:success=>"It worked!", :dager=>"It failed."}
#ハッシュのキーとバリュー
>> "#{flash[:success]}"
#ハッシュのキーでバリューを呼び出す
=> "It worked!"
>> "#{flash[:dager]}"
=> "It failed."
```
railsチュートリアル第七章 ユーザー登録成功

##ユーザー登録成功
新規ユーザーを実際にデータベースに保存できるようにし、ユーザー登録フォームを完成させる。
ユーザー情報は自動的にデータベースに登録させる。
ブラウザの表示をリダイレクトして、登録されたユーザーのプロフィールを表示
ウェルカムメッセージも表示させる。

###登録
```rb
require 'test_helper'

class UsersSignupTest < ActionDispatch::IntegrationTest
  test "invalid signup information" do
    get signup_path
    # signupのページにアクセス
    assert_no_difference 'User.count' do
    # ユーザー数が変わらないかをテストする
      post users_path, params: { user: { name:  "",
                                 # ハッシュのハッシュのようになっているように見える
                                         email: "user@invalid",
                                         password:              "foo",
                                         password_confirmation: "bar" } }
      # postリクエストを送信 フォーム送信をテストする
      # データの投稿した後 assert_no_difference で違いを比べるらしい。
    end
    assert_template 'users/ne  end
end
````

```rb
redirect_to @User 
```
上と下は等価のコード

```rb
redirect_to user_url(@user)
```

###演習
1.有効な情報を送信し、ユーザーが実際に作成されたことを、Railsコンソールを使って確認してみましょう。

```
>> User.second
  User Load (0.2ms)  SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ? OFFSET ?  [["LIMIT", 1], ["OFFSET", 1]]
=> #<User id: 4, name: "aa", email: "abc@def.com", created_at: "2021-10-04 13:16:25", updated_at: "2021-10-04 13:16:25", password_digest: [FILTERED]>
```

2.リスト 7.26を更新し、redirect_to user_url(@user)とredirect_to @userが同じ結果になることを確認してみましょう。

```rb
class UsersController < ApplicationController
.
.
.
  def create
    @user = User.new(user_params)
    # 外部メソッドを使う
    if @user.save
      # 保存の成功をここで扱う。
      redirect_to user_url(@user)
      # urlを指定して表示する
      # 保存成功したらurlを表示する
    else
      render 'new'
      # 保存に成功しなければnewアクションに移動する
      # 失敗したらまた戻る
    end
  end
  
  private
  #外部から使えないようにする
  
    def user_params
    # Usersコントローラの内部でのみ実行される
    # Web経由で外部ユーザーにさらされない
       params.require(:user).permit(:name, :email, :password,
                                   :password_confirmation)
    end
end

```
新しくデータを保存して同じ画面が表示されたので確認
railsチュートリアル第七章 失敗時のテスト

###失敗時のテスト
有効、無効のデータどちらでも正常にアプリが動くようにする。
アプリケーションの変更をするたびにテストを繰り返さなければならず大変である。
Railsではフォーム用のテストを書くことができ、こういったプロセスを自動化することができる。

今回は無効の送信をした時に正しい振る舞いについてテストを書いていく。

####新規ユーザー登録用の統合テストを生成する
統合テストのファイル名はusers_signup

```
rails generate integration_test users_signup
```

####無効なユーザー登録に対するテスト 
test/integration/users_signup_test.rb

```rb
require 'test_helper'

class UsersSignupTest < ActionDispatch::IntegrationTest
  test "invalid signup information" do
    get signup_path
    # signupのページにアクセス
    assert_no_difference 'User.count' do
    # ユーザー数が変わらないかをテストする
      post users_path, params: { user: { name:  "",
                                 # ハッシュのハッシュのようになっているように見える
                                         email: "user@invalid",
                                         password:              "foo",
                                         password_confirmation: "bar" } }
    　# postリクエストを送信 フォーム送信をテストする
    　# データの投稿した後 assert_no_difference で違いを比べるらしい。
    end
    assert_template 'users/new'
  end
end
```
テストは、ユーザ数を覚えた後にデータを投稿してみて、ユーザ数が変わらないかどうかを検証するテスト

```
ubuntu:~/environment/sample_app (sign-up) $ rails t
Running via Spring preloader in process 8623
Started with run options --seed 50070

  20/20: [==============================] 100% Time: 00:00:01, Time: 00:00:01

Finished in 1.38444s
20 tests, 40 assertions, 0 failures, 0 errors, 0 skips
```
テスト成功

###演習
1.リスト 7.20で実装したエラーメッセージに対するテストを書いてみてください。どのくらい細かくテストするかはお任せします。リスト 7.25にテンプレートを用意しておいたので、参考にしてください。

```rb
require 'test_helper'

class UsersSignupTest < ActionDispatch::IntegrationTest
  test "invalid signup information" do
    get signup_path
    # signupのページにアクセス
    assert_no_difference 'User.count' do
    # ユーザー数が変わらないかをテストする
      post users_path, params: { user: { name:  "",
                                 # ハッシュのハッシュのようになっているように見える
                                         email: "user@invalid",
                                         password:              "foo",
                                         password_confirmation: "bar" } }
      # postリクエストを送信 フォーム送信をテストする
      # データの投稿した後 assert_no_difference で違いを比べるらしい。
    end
    assert_template 'users/new'
    assert_select 'div#error_explanation'
    assert_select 'div.alert'
  end
end
```
ちょっとわからない。　解けなかった。
横にページングするScrollViewを作成（UIScrollView）

#今回の内容

<img width="150.5" alt="40DE6522-01CF-4CF2-9D2A-74BF6AD45650_1_201_a.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466343/2f273e9e-0bc5-4272-31d7-22561d63942c.jpeg"> <img width="150" alt="5859CC6F-616D-45CA-B4AE-C744B5A36F9F_1_201_a.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466343/1fecad0f-645d-c0e8-e2df-82739fbe594e.jpeg"> <img width="148" alt="AEA980AA-097C-447E-BF5E-44470B16650B_1_201_a.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466343/433ca10c-3f7d-1f24-a887-f52b62006e73.jpeg">



#コードと簡単解説

* 横にだけスクロールさせたいので、`.contentSize`を` CGSize(width: view.frame.width * 3, height: view.frame.height)`を設定します。

* ページングさせるので、`.isPagingEnabled = true`で設定します。

```Swift:
import UIKit

class ViewController: UIViewController {
    
    let scrollView = UIScrollView()
    
    override func viewDidLoad() {
        super.viewDidLoad()
       
        scrollView.frame = CGRect(x: view.frame.minX, y: view.frame.minY, width: view.frame.width, height: view.frame.height)
        scrollView.contentSize = CGSize(width: view.frame.width * 3, height: view.frame.height)
        scrollView.isPagingEnabled = true
        scrollView.backgroundColor = .systemIndigo
        view.addSubview(scrollView)
        
        let leftView = UIView(frame: CGRect(x: view.frame.minX, y: view.frame.minY, width: view.frame.width, height: view.frame.height))
        leftView.backgroundColor = .systemGreen
        scrollView.addSubview(leftView)
        
        let centerView = UIView(frame: CGRect(x: view.frame.maxX, y: view.frame.minY, width: view.frame.width, height: view.frame.height))
        centerView.backgroundColor = .systemRed
        scrollView.addSubview(centerView)
        
        let rightView = UIView(frame: CGRect(x: view.frame.maxX * 2, y: view.frame.minY, width: view.frame.width, height: view.frame.height))
        rightView.backgroundColor = .systemTeal
        scrollView.addSubview(rightView)
    }

}
```

# 終わり
ご指摘、ご質問などありましたら、コメントまでお願い致します。
js drag&dropとinput fileに情報を入れ込む

drag & dropしたら、画像情報がinputに入る仕組みを作成。
調査していると、input fileの中身はいじることができないような記事が出てきたがなんとか実現。

```html
<form>
<input id="upload" type="file" accept="image/*" name="image">
<input type="submit" value="送信">
</form>
```

```js
$("#upload").on("drop", function(e){
        e.preventDefault();
        document.getElementById("upload").files = e.originalEvent.dataTransfer.files;
    });
```

dropした時に、イベントが発火する形にします。
id = "upload"を指定して、取得。

filesオブジェクトを取得し、そこへ`e.originalEvent.dataTransfer.files`を挿入。
すると、inputに画像データが入り、formで送信することができるようになる。

しかし、これだけだとdrag & dropしても動かない時があります。というのも普通dropエリアは広げることを前提に作成するかと思います。drop areaというやつでしょうか。
その際、dropすれば、ブラウザ側が反応して画像をブラウザが開いてしまうことがあります。
そのために、dragoverした際の処理も追加しておきます。
```js
$("upload").on("dragover",function(e){
  e.preventDefault;
  e.stopPropagation;
})
```

drop-area参照:https://css-tricks.com/drag-and-drop-file-uploading/


以上ですが、dropした際に、画像の名前を表示させたい場合もあると思います。
それと総合して、全文が以下になります。



```js
let form = $("#upload");
let labels = $(".labels")
//html上にlabelsが存在している場合

let showFile = function(files){
  $labels.text(file.length > 1 ? files[files.length-1].name:files[0].name)
}
//画像は1つだけしか許可しないため、複数dropされたら最後の画像の名前を反映

$form.on("dragover",function(e){
  e.preventDefault;
  e.stopPropagation;
});

$form.on("drop",function(e){
  e.preventDefault;
  e.stopPropagation;
  dropfile = e.originalEvent.dataTransfer.files;
  showFiles( dropfile );
  document.getElementById("file").files = dropfile;
})
```

多分、`e.originalEvent.dataTransfer.files;`が重要なんだろうけど.....

追記：
`e.oroginalEvent`はイベントのプロパティが入っているらしい。
中身は、eventごとに微妙に違うぽく、clickの時、drop時色々違う。
今回は、dropの時にdataTransferプロパティの中にinputのfile情報が入っているためそこを利用する形だと思われる。
e.targetとかで取れない時にはみてみるといいかも。

参照：https://honey8823.hateblo.jp/entry/2018/08/29/125121
https://html5exam.jp/measures/dojo_1_08.html

drag drop参考：http://www.it-view.net/drag-and-drop-file-upload-jquery-178.html
SQLの検索結果の加工をおさらいしてみた

#SELECT文だけに可能な修飾
SQLの４大命令は下記の表で整理できます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1265227/e7ec10cb-f387-9b81-be4e-c3dbd4b2be14.png")>
検索結果の加工に使われる主なキーワード↓
![スクリーンショット 2021-10-12 21.51.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1265227/f815197f-3b4b-dee0-c686-1b3cedfc6029.png)


１つずつ詳しく見ていきましょう！

##DISTINCT
DISTINCTキーワードをSELECT文に付加すると検索結果の中から内容が重複している行があればその重複を除いてくれます。DISTINCTはテーブルに何度も同じ種類が存在する時にどのような種類があるかを確認する時に便利です。↓の表を見てください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1265227/39de5cc7-7b4a-d1f9-df3f-5095e22da9f7.png" width=20%>
これをパッと見た時部活の種類が三種類だとわかりますが（少ないので）この表が100行だったとしましょう。そうなると表の部活の種類を目で追うのは非常に苦労します。そんなときにDISTINCTを使えば

```sql:sql
SELECT DISTINCT 部活　FROM 名簿
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1265227/fa87c000-2f5f-ad67-b578-011b2f91f647.png" width=20%>

のように部活は３種類しかないことがすぐにわかります。
なおDISTINCT修飾は他の修飾とは異なりSELECT分の最初に記述する必要があることに注意しましょう。

##ORDER BY
ORDER BY句を記述すると、指定した列の値を基準として検索結果を並べ替えて取得することができます。

```sql:sql
SELECT 列名 ・・・ FROM テーブル ORDER BY 列名  並び順
```

並び順は、昇格にする場合はASC、降順にする場合はDESCを指定します。並び順を省略した場合はASCになります。
ランキングなどの表示はこのORDER BYが使われています。

##LIMIT
検索結果の全行ではなく、並び替えた結果の一部の行だけを得られれば良いケースの場合が考えられます。例えばランキングのTOP3を表示したいときとかです。そんなときにLIMITをつけることによって簡単に実現することができます。

```sql:sql
SELECT 列名 ・・・ FROM テーブル ORDER BY 列名 並び順 LIMIT 3
```

上記のように書くと![スクリーンショット 2021-10-12 21.51.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1265227/f38ea1bb-0a8b-82a9-6c0b-2a9c77569599.png)
取得した列を並び変えた（ASC,DESC）あとに、件数を３に限定することができます。

##UNION
UNION演算子は最も代表的な集合演算子です。２つのSELECT文をUNIONで繋いで記述すると、それぞれの検索結果を足し合わせた結果（和集合）が返されます。

```sql:sql
SELECT 文１
　UNION (ALL)
SELECT　文２
```

UNIONにはALLというキーワードを付加すると、和集合の結果に重複があった場合には重複行をそのまま返すことができます。
集合演算子を使う条件として、選択列のリストの列数とそれぞれのデータ型が一致していなければなりません。
逆に言うと列数とデータ型さえ一致していれば、まったく異なるテーブルや列でもひとまとめにして抽出することができます。

##参考
書籍： スッキリわかるSQL入門 第2版 ドリル222問付き！　
　　　 中山 清喬　著/飯田 理恵子　著

##次回
- 次回は[【SQLの関数をおさらいしてみた】]です！
Railsチュートリアルでbundle installがうまくいかないときは

# 簡潔にまとめます
- railsのバージョンやGemfileでのバージョン指定を確認しましょう
- エラーログで検索してみましょう
- Gemfileのバージョン指定を変更してみましょう


# 概要
ローカル環境でRailsチュートリアル6版の2週目に挑戦中です。3章まで終わりましたが、Gemfileの内容を更新した後のbundle install / updateが度々エラーになります。対処法と原因についてまとめてみます。

以下は今回出てきたエラーの一例です。

```
$ bundle update

Fetching gem metadata from https://rubygems.org/............
Resolving dependencies...
Bundler found conflicting requirements for the Ruby version:
  In Gemfile:
    Ruby

    guard (= 2.16.2) was resolved to 2.16.2, which depends on
      Ruby (>= 1.9.3)

    listen (= 3.1.5) was resolved to 3.1.5, which depends on
      Ruby (>= 2.2.3, ~> 2.2)

    pg (= 1.1.4) was resolved to 1.1.4, which depends on
      Ruby (>= 2.0.0)

```

# 確認すべきこと・原因
「Railsチュートリアルの通りに進めているのに」と思いつつも、実は「RubyやRails、Gemfile各gemのバージョンが異なっている。」なんてことがあります。

　
ちなみに私は以下の環境で進めています。

- ruby 3.0.2p107 
- Rails 6.1.4.1

　
チュートリアルの指定のバージョンではないですね。

…はい、チュートリアルの「エラーが出ないように指定のバージョンを使いましょう」という指示を無視した結果、エラーが出てきます(笑)

　
あとは、コピペしていたら起きにくいとは思うのですが、Gemfileの記述が間違っていないか確認してみましょう。もしかしたら存在しないgemの名前が書かれていたり、凡ミスのような打ち間違いをしているかもしれません。


## 対処法１：エラーログを読む、調べる
上でエラーの一例を示しました。例ではgemのバージョンによる依存関係が原因でエラーが起きているようです。
私は英語が苦手なので、とりあえず「読めない！」と思ったらgoogle先生に翻訳してもらいます。

　
翻訳結果から対処法が分かればいいのですが、初心者故にどうやって対処すればいいのか分かりません。ですので、エラーログをそのままgoogle検索してみます。エラーログが長すぎる場合は、重要な情報を示していそうな部分で調べてみます。

　
同じようなエラーが出ていて、解決方法を公開してくださっている方を見つけることができたらラッキーです。感謝しながら不具合を解消していきましょう。


## 対処法２：Gemfileのバージョン指定を変更する。
Rails newコマンドを実行したときに、Gemfileにはさまざまなgemの名前やバージョンが保存されます。Railsチュートリアルでは、チュートリアルを進める上で必要なgemとバージョンが記載されていますが、Gemfileの中身を見てみると必要なものが入っていなかったり、違うバージョンを指定していることがあります。

　
以下のGemfileのコード（一部）は、私が3章を終えた時点での状態です。Railsによって自動的に記述されたもの、チュートリアルに沿って導入したもの、バージョンの競合が起きたためにバージョンの指定を削除（最新版を導入するように）したものが書いてあります。

```:Gemfile
group :test do
  gem 'capybara', '>= 3.26'
  gem 'selenium-webdriver'
  gem 'webdrivers'

  #以下はチュートリアルに沿って導入。
  gem 'rails-controller-testing', '1.0.4'

  #以下、versionによる衝突を起こしたため最新版を導入
  gem 'minitest'
  gem 'minitest-reporters'
  gem 'guard'
  gem 'guard-minitest'
end
```

- まずはRailsで生成されたGemfile + 足りないものはチュートリアルの指示通りに記述
- うまくいかないときは、gemのバージョン指定を消してみる 

1週目を完走したときは、一部はチュートリアルの指示通りのバージョンにしているものもありますが、ほぼすべてのgemを最新版の状態にしてみました。しかし、特に進行に影響のあるようなエラーが出たことはありません。

私の場合はバージョン指定をつけたり消したりしているうちに、うまくいく場合が多いです。

---

# （おまけ）　第3章の初テスト実行時にエラー
せっかくなのでタイトルとは関係ないのですが、3章で体験した別のエラーについても書いておきます。


中盤に差し掛かってテストを実行した際にエラーが出ました。

```
$ rails test

/Users/(中略)/kernel_require.rb:34:in `require': cannot load such file -- rexml/document (LoadError)
```
　
英語読めないんですけど、なんとなく「読み込めないよ、ロードできてないよ」って言われている気がします。
エラー文の以下の部分をコピペして検索してみます。　


```
`require': cannot load such file -- rexml/document (LoadError)
```

すると同じエラーについてまとめてくださっている方を発見しました。

　　
[Rails 6.1 + Ruby 3.0.2でテスト時にエラーがでる](https://next49.hatenadiary.jp/entry/20211010/1633832379)
　
## 対処法：「rexml」を導入　
上記のページを参考に、Gemfileにrexmlを追記

```:Gemfile
#rails test実行時にエラー、必要みたいなので導入
gem 'rexml'
```
　
これでbundle installするとテストが無事実行できるようになりました！
SQLについて

## mysqlコマンドについて

- 「mysql.server start」で起動
- 「mysql -u root」で正しく起動できているか確認
- 「mysql> quit」でターミナルの停止
- 「mysql.server stop」で停止できる
- 「mysql.server restart」で再起動できる

## 基本的なDB扱い
- 「SHOW databases;」でDBを確認できる
- 「CREATE DATABASE DB名;」でDB作成
- 「USE DB名;」でDBの選択ができる
- 「SHOW tables;」でテーブルを確認できる
- 「DESCRIBE テーブル名;」でテーブル構造の確認

## CASEに関して
- 真になるWHERE句が見つかった時点で打ち切られる
- 単純CASE式と検索CASE式の2通りがある
- 各分岐が返すデータ型を統一する必要がある
- ENDは必須なので、書き忘れに注意
- ELSE句は必ず書いたほうが良い。暗黙的に「ELSE　NULL」になる。
- 条件で分類単位で集計し直すときに使える
- SUM、GROUP　BYと相性が良い！

```
SELECT CASE WHEN 条件 THEN 値
       WHEN 条件　THEN　値
　　　　ELSE 値　END
FROM　テーブル名
```
【ツール】マークダウン形式の表とcsvを相互変換するプログラムをpythonで書きました。

どうも、たかふみです。
マークダウン形式の表（行の部分）とcsvを相互に変換するプログラムを書きました。

## ■プログラム例1
「csvで記載されたデータ（左）」を「マークダウン形式の表における行のフォーマット（右）」に変換します。

```
■ プログラムA
タイトル1,URL1      | 1 | [タイトル1](URL1) |
タイトル2,URL2  ⇔  | 2 | [タイトル2](URL2) |
タイトル3,URL3      | 3 | [タイトル3](URL3) |
```

その他、マークダウン形式の表をcsvへ変換するプログラムやヘッダー含めてマークダウン形式の表に変換するプログラムがあります。

プログラムはpython3, 環境構築はdockerでやっています。
PCにdockerを入れれば環境は簡単に構築できますし、プログラム自体も`python {所定のファイル}.py`で実行できます。

## ■github
URL：https://github.com/wallkickers/python3_output_txt_from_csv

## ■環境構築＆使い方
githubのREADME.mdに書きました。
欲しい機能が増えれば随時更新していきます。

## ■作った経緯
プライベートでタスク管理ツール「Backlog」を使っております。
Backlogではタスクの詳細についてマークダウン形式で記述することができ、数十個のURLをマークダウン形式の表にするというタスクをしていました。

初めはURLを一つ一つ **\[テキスト](URL)** の形式で書いていたのですが、ファイル数の増加、順序の変更、テキストやURLの変更が発生する頻度がかなり多かったので**「このやり方は手間すぎる！」**と気づきました。

ブラウザ上で変換できる、既存のwebサービスを使うことも考えましたが、
「自分で色々カスタムしたい」「外部へURLについての情報を渡したくない」という理由で自作しました。

良ければ各自カスタマイズしてお使いください！それでは！
Educational Codeforces Round 115 B. Groups

https://codeforces.com/contest/1598/problem/B

# 題意
- あなたは異なる曜日(月曜から金曜の5日間)の2日に授業をすることにします。
- $2n$人の生徒がいます。それぞれの生徒は授業を受けられる日を1, 出られない日を0としてスケジュールを全員が提出しました。
- あなたは各授業がn人ぴったりであるように授業のクラスを分けたいです。
- 各生徒は2つ授業両方には参加できません。

# こう考えた

総当たりをします。各曜日を総当たりするには、

```Python
for i in range(5):
 for j in range(i+1, 5):
  # i と jの２つの曜日を選んだ
```
とすればよいです。

さて、i,jを定めたとき、以下を求めることができます。

```
numboth: iもjも出席できるの学生
numi: iだけに参加できる学生
numj: jだけに参加できる学生
numng: 両方参加できない学生
```

この時、次のように順に考えます。

- まず、合計の人数が$2n$で$n$人に分けたいのだから$numng$が1人以上いる場合、NGです。(絶対にn人に満たない授業ができてしまいます。)
- numiかnumjがnをよりも多い場合NGです。(もう片方の授業はn人未満になります)
- それ以外の場合、絶対に成立します。$numi+numj+numboth = 2n$なので、$numi + x = n$となる$0 \leq x \leq n$は必ず存在し、$numj + (numboth - x) = n$は明らかです。

この処理をすべてのi,jに対して行い、１つでもOKならYESです。すべてのi,jについて成り立たないならNOです。

# 実装
```Python
def do():
    n = int(input()) // 2
    dat = []
    for i in range(2*n):
        dat.append(list(map(int, input().split())))
    for i in range(5):
        for j in range(i+1, 5):
            cani = canj = canboth = canno = 0
            for ind in range(2*n):
                if dat[ind][i] == dat[ind][j] == 1: canboth += 1
                elif dat[ind][i] == 1: cani += 1
                elif dat[ind][j] == 1: canj += 1
                else: canno += 1
            if canno > 0: continue
            if cani > n or canj > n: continue
            print("YES")
            return
    print("NO")
q = int(input())
for _ in range(q):
    do()
```

https://codeforces.com/contest/1598/submission/131642164
iOS15でAppTrackingTransparency許可ポップアップが表示されなくなる問題解決法

公式フォーラムにて解決方法が提示されておりました
https://developer.apple.com/forums/thread/690762

## 要約すると
AppDelegateクラス内のapplicationDidBecomeActiveメソッド内にてポップアップ処理を記述、とのこと

## その他・雑談
iOS15でポップアップされなくなり審査リジェクトされた方が世界中でいる様子でした
※世界中で困ってた頃のフォーラムは以下でした
https://developer.apple.com/forums/thread/690607

アプリ審査リジェクトされると以下のようなメッセージが来ます(参考までに)

```
Guideline 2.1 - Information Needed

We're looking forward to completing our review, but we need more information to continue. Your app uses the AppTrackingTransparency framework, but we are unable to locate the App Tracking Transparency permission request when reviewed on iOS 15.0.1.

Since you indicated in App Store Connect that you collect data in order to track the user, we need to confirm that App Tracking Transparency has been correctly implemented.
```
Sequel AceをDockerのMySQLをお気に入りに登録して簡単に接続する方法

## 目的

- Sequel AceのDBへの接続設定をお気に入りに登録して簡単に接続する方法をまとめる

## ご注意

- Sequel Aceの導入方法は説明しない。

## 方法

1. 起動画面の左下にある「+」をクリックする。

    ![Sequel_Ace.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/745e7fa7-c3b1-6d19-bf8f-46e017900f68.png)

1. 任意のお気に入り名を入力する。

    ![Sequel_Ace.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/757cfe2e-53a6-cebd-6512-2f2653dd5d3d.png)

1. 「Host」から「Port」の内容を入力する。

    ![Sequel_Ace.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/cccf3b6a-203d-1e2a-1b6f-e7924a9150cc.png)

1. 「Time Zone」は「Use System Time Zone」を選択する。

    ![Sequel_Ace.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/34dbb532-f283-f638-169f-da0d3ac6d8c0.png)

1. 「Test connection」をクリックする。

    ![Sequel_Ace.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/76ae5ab2-aa8a-4388-a6da-4c2845bb41ff.png)

1. 「接続が成功しました」と表示されることを確認する。

    ![Sequel_Ace.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/ae7d4df5-cb71-5a93-40a9-c4f2c2eeee99.png)

1. 「Save changes」をクリックする。

    ![Sequel_Ace.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/dca60fa8-c793-f368-40ae-3b074e3970ad.png)

1. 「接続」をクリックすることでDBの内容が表示される。

    ![Sequel_Ace.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/da02773d-23bb-f991-7790-ddda0f9020d8.png)
[SQL学習①] SQL RDS DBMS SQLインジェクション

<h2>初めに</h2>
SQLの学習を始めたので、まとめていきます。

<h2>RDB</h2>
リレーショナルデータベース
分野を問わず広く使われているデータベース。
→複数の表の形式でデータを管理する。
（商品テーブル、ジャンルテーブルのようにRDBには
複数のテーブルが入っている）

<h2>SQL</h2>
エスキューエル
データベースを操作する専用の言語。
上記のテーブルからデータを自由に取り出したり、書き換えができる。

<h2>DBMS</h2>
データベースマネジメントシステム
（データベース管理システム）
SQLを受け取るのが、DBMS。
受け取ったSQLを元に処理を実行するのがDBMS


<h2>SQLインジェクションって何？</h2>

プログラムがデータベースを操作する際に使用する「SQL」という命令言語を、
外部から意図的に改ざんすることで、データベースから情報を抜き取ったりする攻撃手法です。

<h6>インジェクションは注入という意味です。</h6>

こんな感じで、データベースにアクセスされると、
個人情報を漏洩してしまいます。

![スクリーンショット 2021-10-05 9.14.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/e0bb6c4e-7d60-5b65-e181-df923cae6225.png)

<h2>SQL文の書き方</h2>
<h6>データの取得</h6>
以下のような記述で必要なデータを取得できます。

```
SELECT 列名
FROM テーブル名
WHERE 条件　（金額>500みたいな）
```

<h6>データの追加</h6>

```
INSERT INTO テーブル名
VALUES データ 例('2021-10-12','プリン',８００,７00)
・・数値はシングルコーテーションで囲まない
```

<h6>データの更新</h6>
```
UPDATE テーブル名
SET 列　例：金額=900
WHERE 条件　例：日付='2021-10-12'
```

<h6>データの削除</h6>

```
DELETE FROM テーブル名
WHERE 条件
```

<h2>終わり
【Vue.js】条件分岐 v-show について

#はじめに

こんにちは！　松本　佑大（まつもと　ゆうだい）と申します！
今回はv-showについてアウトプットしていきます！

#v-show　とは
要素の表示/非表示を切り替えることができます。
v-ifと違うポイントとしてはp要素そのものが削除されるのではなく**cssのdisplay プロパティをon/off**されるで表示/非表示が繰り返されます。

#書き方
```HTML:HTML
<div>
  <p v-show="toggle">
     Good night!
  </p>
</div>
```

```Vue.js
var app = new Vue({
    el:'#app',
    data:{
    toggle:true
    }
```

![スクリーンショット 2021-10-10 17.44.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114750/c1b14dc9-6fd5-b630-23bc-18a108555b14.png)

※細かい書き方はv-ifと同じで前記事で解説しているので省略します。

#まとめ
・v-showではdisplayプロパティがon/offされる。
・全体的な書き方はv-ifと一緒。

#最後に
今回はv-showについてアウトプットしました。
今回の記事を読んで気になったこと、質問等あればコメント等頂けると幸いです。

今後ともQiitaにてアウトプットしていきます！

最後までご愛読ありがとうございました！
【JavaScript】非同期処理について

#はじめに
こんにちは。
こちらの記事では、非同期処理についてアウトプットしていきます！
誤っている点がございましたらコメントいただけると幸いです。

##同期処理とは
コードの記述のように上から順番に処理が実行されるのが同期処理。

##非同期処理とは
ひとつの処理の完了を待たず、複数の処理を同時に実行することができるのが非同期処理。処理の完了を待たないので、処理の順番を制御する記述が必要となる。

##非同期処理はなぜ必要なのか
同期処理の場合、全ての処理が完了するまで待たなければいけないので、サイトの表示速度が落ちてしまい、離脱率が上がってしまうことが考えられる。
そのため、非同期処理で実行することでユーザーの使いやすさを考慮した実装をすることができる。

ここでは非同期処理を制御する、コールバック関数 / `Promise` / `async,await`について、1秒ごとに文字を表示する処理で記述の仕方を比較していきます!

<br>

##コールバック関数
コールバック関数でも非同期処理は記述できるが、ネストが深くて見づらくなるという欠点があるため、現在はあまり使用されていない。

```javascript:Vue.js
setTimeout(() => {
    console.log("たまご");
    setTimeout(() => {
        console.log("ひよこ");
        setTimeout(() => {
            console.log("にわとり");
        }, 1000);
    }, 1000);
}, 1000);
```


##Promise
`Promise`を訳すと「約束」という意味を持つ。`.then()`で処理を繋げることができ、コールバック地獄から解放されるきっかけとなった。

```javascript:JavaScript
new Promise(resolve => {
  setTimeout(() => {
    console.log("たまご");
    resolve();
  }, 1000);
}).then(() => {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log("ひよこ");
      resolve();
    }, 1000);
  });
}).then(() => {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log("にわとり");
      resolve();
    }, 1000);
  });
});
```

##async , await
`async`は、非同期関数を定義する関数宣言のこと。
`await`は、`async`関数内で`Promise`の結果（resolve、reject）が返されるまで待機する（処理を一時停止する）演算子のこと。

```javascript:JavaScript
func = async () => {
  await log("たまご");
  await log("ひよこ");
  await log("にわとり");
};

log = (test) => {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log(test);
      resolve();
    }, 1000);
  })
}

func();
```

`Promise`で`.then()`メソッドの記述が多くなる場合、コードが見づらくなるが`async` / `await`を用いることで、さらにシンプルに記述することができるようになった。

<br>


#おわりに
ここまで非同期処理についてまとめました。
非同期処理を行う上で、個人開発でも現場でもよく使われるものだと思うので引き続き復習しながら、アプリ開発も進めていきます！

以上、最後まで読んでいただきありがとうございました！
【初心者のHTMLメモ】要素の属性とは

HTMLの要素の属性

```html
<a href="URL">文字</a> 
```

HTML では、```<a></a>``` の形式で書かれている部分を 「要素」
 ``` href=""``` の形式で書かれているものを「要素の属性」と呼ぶ

href 属性では、ハイパーリンクのリンク先を
 a タグに情報として与えることが可能である。

つまり文字をクリックするとコーディングしたURLのところへ飛ぶことが出来る
イレイジャーコーディング とは

## 勉強前イメージ

RAIDの進化版的な？

## 調査

### イレイジャーコーディング とは

Erasure Coding と書き、日本語では消失訂正符号と訳される
RAIDに変わる技術として期待されています。
数学的関数を使用し、一連のデータを予め冗長性を含む形式に変換する技術で、
データを小さな塊に分割して、パリティを別々に保存することで複数台ディスクが壊れても復旧可能な状態を保ちます。

近年HDDのサイズも大きくなり、RAIDの再構築完了に何日もかかるようなケースもあり
再構築完了までにリスクが増え、性能が低下したりなどすることがあります。
また、近年オブジェクトストレージを扱う場面が増えてきましたが
その拡張性・可用性はデータ保存時のイレイジャーコーディングを採用してできているとのことです。

### イレイジャーコーディングのメリデメ

#### メリット

- 筐体を跨いだストレージを構築できる
- ディスクの復旧が早い
- 複数台のディスクが故障しても復旧・復元が可能

#### デメリット

- 少数のディスクでは組めないので、大規模システム向け
- データごとに符号化、自動回復を行い分散処理を行うので高速処理が苦手
- HDDを複数台つないでスループット性能を向上することができない
- 小さなオブジェクトを扱うと非効率

## 勉強後イメージ

オブジェクトストレージ用の大規模データを扱う際にはいいって感じかな？
筐体を跨いでも出来るのはすごい・・・
ただRAIDに変わるっていっても使い所が違うからすぐには変わらなさそう

## 参考

- [イレージャーコーディング](https://www.networld.co.jp/sp/learn_first/backup/2nd/p25_27.html)
- [ハイブリッドクラウド時代のストレージシステムを考える - (page 2)](https://japan.zdnet.com/article/35126218/2/)
【Laravel】バージョンを確認するときのコマンド

#はじめに
現在自分が使っているLaravelのバージョンを確認する方法を見ていきましょう。

#Laravelのバージョン確認方法

```php:ターミナル
php artisan --version
```

```php:ターミナル
php artisan -V
```

`Laravel Framework 5.8.38`のようにバージョンが表示されればOKです！
UnityのOnCollisionEnter、OnTriggerEnter終止符

っしゃす。

なんか衝突でヒットする記事だいたい間違ってるので、自分のために検証して残しておきます。

検証内容・結果は最後に回します。暇な人は見てください。

# 結論

- 衝突検知にはRigidBodyが必要だが、***どちらかについてれば良い***。
誰ですか、「両方RigidBodyが必要」とか言ってる人は。

- 衝突検知の際には動いてるかに関わらず、***両方の***コールバックが呼び出される。
- 2つともisTriggerがfalseの場合は***OnCollisionEnter***、それ以外は***OnTriggerEnter***が呼び出される。
- なるべく***動く方***にRigidBodyを付ける(結果の表の注参照)

ところで、Colliderは***衝突を検知するため***のコンポーネントだが、RigidBodyは***動くため***のコンポーネントであるため、ステージの「動かない壁」などに用いるのはお勧めしない。ただし衝突検知にはRigidBodyが必要となる。

# 追記

衝突判定はColliderの空間にRigidBodyが含まれる場合に呼び出される。オブジェクトの速度が速すぎてCollider空間に入るフレームがない場合、呼び出されない。

例えばtフレームでcolliderの寸前まで来ていたオブジェクトがt+1フレームでColliderより奥に移動した場合、衝突は発生しない。

銃弾のような速さのオブジェクトの場合、1フレームの移動量分のRaycastで近似することでのみ衝突検知が可能で、自作した方が早い。

# 検証環境

Unity2020.3.1f1
RigidBodyのCollisionDetectionはContinuousSpeculative。


### コード
```cs:ColliderTest.cs
using UnityEngine;

public class ColliderTest : MonoBehaviour
{
    private void OnTriggerEnter(Collider other)
    {
        Debug.Log("OnTriggerEnterが起きたよ", gameObject);
    }
    private void OnCollisionEnter(Collision collision)
    {
        Debug.Log("OnCollisionEnterが起きたよ", gameObject);
    }
}
```

### シーン

![Screenshot 2021-10-12 20-10-40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496596/bcc213e2-11d0-25b0-5ac1-1d977ac9131b.png)

# この表の前提

- ここでは二つのオブジェクトA、Bとする。
- 動くオブジェクトは片方のみか、両方の場合がある。どちらも動かない場合衝突しない。
- Colliderは当たり前だが、２つともついてるとする。
- RigidBody列の〇はRididbodyあり、×はなし。
- isTrigger列は〇はisTrigger=true、×はfalse。
- コールバック列はOnTriggerEnterが呼び出される場合T、OnCollisionEnterが呼び出される場合C、いずれも呼び出されない場合×。

# 結果

|動くオブジェクト|RigidBody(A)|RigidBody(B)|isTrigger(A)|isTrigger(B)|コールバック(A)|コールバック(B)|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| A |×|×|×|×|×|×|
| A |×|×|〇|×|×|×|
| A |×|×|×|〇|×|×|
| A |×|×|〇|〇|×|×|
| A |〇|×|×|×|C|C|
| A |〇|×|〇|×|T|T|
| A |〇|×|×|〇|T|T|
| A |〇|×|〇|〇|T|T|
| A |×|〇|×|×|C△|C△|
| A |×|〇|〇|×|T|T|
| A |×|〇|×|〇|T|T|
| A |×|〇|〇|〇|T|T|
| A |〇|〇|×|×|C|C|
| A |〇|〇|〇|×|T|T|
| A |〇|〇|×|〇|T|T|
| A |〇|〇|〇|〇|T|T|
|A、B|×|×|×|×|×|×|
|A、B|×|×|〇|×|×|×|
|A、B|×|×|×|〇|×|×|
|A、B|×|×|〇|〇|×|×|
|A、B|〇|×|×|×|C|C|
|A、B|〇|×|〇|×|T|T|
|A、B|〇|×|×|〇|T|T|
|A、B|〇|×|〇|〇|T|T|
|A、B|×|〇|×|×|C|C|
|A、B|×|〇|〇|×|T|T|
|A、B|×|〇|×|〇|T|T|
|A、B|×|〇|〇|〇|T|T|
|A、B|〇|〇|×|×|C|C|
|A、B|〇|〇|〇|×|T|T|
|A、B|〇|〇|×|〇|T|T|
|A、B|〇|〇|〇|〇|T|T|

注)結果のうち△は非常に稀にコールバックが確認された。使うべきではない。
SQLの条件式をおさらいしてみた

#WHERE句による絞り込み
SQLは命令は４つしかありませんが、WHERE句のように様々な修飾語をつけることで複雑な処理が可能になります。逆にWHERE句などで絞り込みを行わないと全ての行が処理対象となります。
（※UPDATE、DELETEを扱う際は特に注意が必要です。）
WHERE句の基本構文は

```sql:sql
where 条件式
```
になります。
WHEREのあとにどんな式でも書けるわけではありません。
例えば

```sql:sql
where 預金額　+ 10000
```
のような記述はできません。
条件式の記述方法とルールについて理解しましょう。

#条件式とは
条件式とはその結果が必ず真（TRUE）か偽（FALSE）になる式のことです（ブーリアン型）。
先程の例にあげた「預金額 ＋ １００００」という式の場合はその結果が数値型となってしまいます。
このようにブーリアン型以外は条件式として記述することはできません。
ブーリアン型で使われる比較演算子を表にしました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1265227/d605f393-9aae-9f76-8d0b-9c1f126d30dc.png" width="200" height=456px >
※「=>」のようにイコールを先に書かないように注意してください。
また条件式でNULLかどうかを判定する時に、＝演算子や<>演算子は利用できません。例えば

```sql:sql
SLECT　※ FROM　　残高一覧　　WHERE　　出金額　　＝　　NULL
```

という記述は正しく判定されません。
NULLの判定は

```sql:sql
式　IS　NULL
式　IS　NOT　NULL
```
という記述を使います。このミスは私も多くしてしまいました、、、。

whereは論理演算子と組み合わせることができます。代表的な論理演算子はAND演算子とOR演算子です。

```sql:sql
条件式１　AND　条件式２
条件式１　OR　条件式２
```
AND演算子の場合、条件１が「真」かつ条件２が「真」の場合のみ「真」となります。
OR演算子の場合は、条件１が「真」または条件２が「真」の場合に「真」となります。

#パターンマッチングについて

##Like演算子
```sql:sql
式　LIKE パターン文字
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1265227/9e5feace-8543-a903-2447-5f7bb5c3f54b.png" width="400" height=456px >
「%」は０文字以上の任意の文字列を意味する記述ですから、「％１月％」は１月の前後に０字以上の文字がつく１月という文字列を取得することができます。

##BETWEEN演算子
```sql:sql
式　BETWEEN 値1 AND 値2
```
BETWEEN演算子では、値が「値１以上かつ値２以下」の場合に真になります。値がちょうど値１、値２の場合も真になる点に注意する必要があります。

##IN/NOT IN　演算子
```sql:sql
式　IN （値1、値2、値3・・・）
```
IN演算子は、値がカッコ内に列挙した複数の値のいずれかに合致するかを判定する演算子です。＝演算子は１つの値と比較するのに対し、IN演算子は一度にたくさんの値と比較が可能です。

##ANY/ALL　演算子
```sql:sql
式　基本比較演算子　ANY （値1、値2、値3・・・）
式　基本比較演算子　ALL （値1、値2、値3・・・）
```
ANYやALLは単体ではなく組み合わせで真価を発揮します。それはまだ別の記事で紹介します。

##参考
書籍： スッキリわかるSQL入門 第2版 ドリル222問付き！　
　　　 中山 清喬　著/飯田 理恵子　著

##次回
- 次回は[【SQLの検索結果の加工をおさらいしてみた】]です！
【InterSystems】IRISターミナルをショートカットキー1つで起動する

## はじめに

InterSystems IRISのターミナルの起動をログインも含めて一発で起動できないかと調べていたところ、方法を見つけましたので自分用に残します。

設定すると、対象のネームスペースにショートカット1つでこのように起動することができます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630487/4dcec6f0-1674-86b6-316b-1e18ac3ac085.png" width="800">


## 1. IRISLIBの設定を変更する
このあとの作業のためにIRISLIBの設定を変更します。

管理ポータルから「システム」 > 「構成」 > 「ローカルデータベース」にアクセスしてIRISLIBを選択し、「読み込み専用でマウント」のチェックを外します。
※この一連の作業が終わったらセキュリティ上元に戻しておくことを推奨します
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630487/9adf37af-3d45-0d29-72ca-9214c3271115.png" width="800">


## 2. バッチファイルを作成する
任意のバッチファイルを作成します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630487/c83ba278-e6e3-4809-62c7-e5a352e58330.png" width="800">

バッチファイルの中身に下記を記述します。
※コマンドプロンプトのウィンドウを最小化するためのコマンドも入れています

```iris_terminal.bat
@echo off

:最小化状態で実行する
if not "%X_MIMIMIZED%"=="1" (
    set X_MIMIMIZED=1
    start /min cmd /c,"%~0" %*
    exit
)

cd C:\InterSystems\IRIS\bin
iristerm.exe /console=cn_iptcp:localhost[23] C:\import.scr

exit
```

## 3. IRISターミナル起動後の入力値を設定する
上記作成のコマンドに指定しているimport.scr（ファイル名はなんでもよいです）を作成して下記を記述、C:直下に配置します。
※上記コマンドではC:直下にファイルを置いてますのでそうしてますが、適宜変更ください。

```import.scr
#ログインユーザ名/パスワード入力
send: _system<CR>
send: SYS<CR>
#ネームスペースTESTに移動
send: znspace "TEST"<CR>
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630487/9ad10ea6-c08a-5795-ccf8-79f88b9dcdbe.png" width="800">

## 5. ショートカットキーを割り当てる
3.で作成したバッチファイルのショートカットを作成します。
そしてショートカットを右クリック > プロパティの「ショートカットキー」に好きなショートカットキーを割り当てます。
ショートカットを設置する場所、割り当てるショートカットによって反応がないときがありましたが、自分は下記設定でうまくいきました。

- ショートカットの配置：デスクトップ
- ショートカット　　　：Ctrl + Alt + I

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630487/d98a34e2-e498-f1c3-2010-acf09c15e531.png" width="800">


## 参考資料
-   [Windowsバッチでターミナルスクリプトを実行する方法を教えてください](https://faq.intersystems.co.jp/csp/faq/result.csp?DocNo=410)
-   [ターミナル・スクリプトの使用法](https://docs.intersystems.com/ens20181j/csp/docbook/DocBook.UI.Page.cls?KEY=GTER_scripts_general)


## おわりに
毎日立ち上げるターミナルが1発で起動できると気持ちいいですよね。
どなたかの参考になれば幸いです。
SQLの基本からおさらいしてみた

#データーベースとSQL
データベースに格納されている情報を扱うためには専用の操作言語SQLを利用します。
データベースにデータを挿入したり、検索したりする際に利用します。データベースのなかには、数万・数百万件ものデータが保存されていますが、SQLを使うことで効率的に操作をすることが可能なのです。
私達の身の回りでも至るところでデータベースとSQLは利用されています。
例）
---
![スクリーンショット 2021-10-11 20.03.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1265227/71e0496d-1567-55f2-e436-c3c8a2b574e1.png)


３．4大命令に共通するテーブル指定を先に書く
#基本文法と4大命令
SQLの大命令は「SELECT」、「UPDATE」、「DELETE」、「INSERT」です。整理した表が下記になります。
![スクリーンショット 2021-10-11 20.22.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1265227/e7ec10cb-f387-9b81-be4e-c3dbd4b2be14.png)

4大命令を整理するには下記のポイントを抑えておくと効果的です。
##4大命令の２通りの分類方法を理解する。
###分類法１　検索系と更新系
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1265227/24dea06b-cc07-e320-7011-8f17b7b3c55d.png" width="200" height=456px >

検索系の命令はデータを書き換えることはありません。また、SQLの実行結果が表の形になります。
更新系の命令はデータを書き換えます。当然実行結果は成功か失敗かであり、表が返されることはありません。
4大命令の表の「検索結果の加工」に注目するとSELECT文にしか存在しないことがわかります。それもそのはず、この修飾は実行結果の表に対して加工をするからです（ex.OREDER BY）。当然UPDATE、DELETE、INSERTには指定できません。意味を考えると理解しやすいです。続けてもう一つの分類も紹介します。

###分類法2　既存系と新規系
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1265227/161b90d2-3da4-9429-f791-2823be80e3a5.png" width="200" height=456px>

既存系は既にデータベースに存在しているデータに対してなんらかの処理を行います。
新規系はまだデータベースに存在していないデータについて処理を行います。
4大命令の表の「対象行の絞り込み」のWHEREに注目するとSELECT、UPDATE、DELETEは既存のデータに対して処理を行う命令であるため共通した文法としてWHERE句が利用可能なっていることがわかります。一方INSERTは既存のデータを扱う命令ではないためWHERE句の利用ができません。こちらも意味を考えると理解しやすいですね。


##参考
書籍： スッキリわかるSQL入門 第2版 ドリル222問付き！　
　　　 中山 清喬　著/飯田 理恵子　著

##次回
- 次回は[【SQLの条件式をおさらいしてみた】]です！
オープンソース版 PyMOL を conda で何も考えずにインストール

この方法が良いかどうか知らないけど、案外ググっても他の方法ばかり出てくるのでメモ。

`conda-forge` に普通に `pymol-open-source` というパッケージがおいてある。
なので、`conda-forge` にみんなの知見を集めていく方がいいだろう。

https://github.com/conda-forge/pymol-open-source-feedstock

（大前提として、MinicondaまたはAnacondaはすでにインストールされているものとする。）
念のため環境を新しく作って、

```
conda create -n pymol
```

```
conda activate pymol
```

インストールすれば

```
conda install -c conda-forge pymol-open-source
```

いけるはず。UbuntuやWindowsではいけました。

で、トラブルがあったら

https://github.com/conda-forge/pymol-open-source-feedstock

のissueに投稿して報告。みんなが報告すれば集合知で解消されるはず。

もしも問題を発見した方がいらっしゃいましたら報告お願いします。
SQL Server(T-SQL): 電話番号または郵便番号などの数字文字混在のデータから数字だけを取り出す

## 環境
   SQLServer 2019で動いてますが、もう少し低いバージョンでも大丈夫だと思います。
## 概要

SQLSERVERでは、TRANSLATE関数の置換後の文字（第３引数）と検索文字（第２引数）の文字数をあわせなければなりませんので、[文字列から数値のみを抽出する](https://qiita.com/muro/items/1e5c17b89f5a0fb8c992)　に紹介されている方法では、エラーがでてしまいます。Functionを作成する方法がちらほら見られますが、あえて関数のみで試してみました。

## SQL
```SQL
SELECT REPLACE(
           TRANSLATE(
               dbo.V_顧客.固定電話,
               REPLACE(TRANSLATE(dbo.V_顧客.固定電話, '0123456789', SPACE(10)),' ',''), 
                   SPACE(LEN(REPLACE(TRANSLATE(dbo.V_顧客.固定電話, '0123456789', SPACE(10)),' ','')))
               )
       , ' ', '') 
               AS 電話番号１
FROM dbo.V_顧客
/*REPLACE(TRANSLATE(dbo.V_顧客.固定電話, '0123456789', SPACE(10)),' ','')　は数字を除いたもの
　例：『(03)1234-5678』 ---> 『()-』
```
オブジェクト（dbo.V_顧客）やカラム（固定電話）は適宜、ご自身の環境に合わせてください。

## お礼
日頃、色々参考にさせていただいておりますので、なにかお返しできないかと、投稿させていただきました。
pythonで"""を実行しました。

公式サイトを探しています。

オリジナル

https://qiita.com/mrrclb48z/items/54afad5683f7aaa4c73f


# """について
Qiitaだと、薄い青色でした。(上記より)
pycharmだと、ソースコード内で薄い緑色でした。
live.sympyだと """素敵。

"""
Matrix([[3, 8], [15, 24]])
"""

# live.sympyでpprintを実行してみました。

```
>>> pprint(Matrix([[3, 8], [15, 24]]))
... 
[3   8 ]
[      ]
[15  24]
```

以上、簡単にメモしました。
fetchとかで取ってきた生HTMLからDOMを作ってqueryselector()をしたい。

ブラウザのJavaScriptでただの文字列状態のHTMLをDOM（ツリー、NODE）に変換して色々操作したいって場合を調べたくて検索をかけると
`div = document.createElement('div'); div.innerHTML = textHtml;` って感じにして取り出す感じの記事しか見つからなくて、モヤモヤするのでメモ。

そもそもこの手法だと `<!DOCTYPE html>` とか先頭に入っていると変換もできない。
しかも、imgタグとか不必要なコンテンツも読み込んでしまう。


手法としては `DOMParser` を使う。

```javascript
function convert(textHtml) {
    const parser = new DOMParser();
    const $document = parser.parseFromString(textHtml, 'text/html');
    return $document;
}
```

これだけ。
以上。
【Railsのアクション】newとcreateの違い

こんにちは！テックアカデミーのWebアプリコースを受講している駆け出し高校生エンジニアの安田駿介です。

今回は、「Railsのアクション newとcreateの違い」というテーマで解説していきます。

#createアクション
レコードの新規作成するアクションです。

個々で言う作成とは、データベースにデータを保存するということだと考えてください。

#newアクション
新規投稿用の画面を表示するためのアクションです。

#開発環境
・Cloud9
・Ruby 3.0.0
・Rails 6.1.3.1
【Rspecエラー】unterminated attribute selector for type on line 1009:16 of stdin

##状況

Rsepc実行すると謎のエラーで怒られた

```
Failure/Error: Unable to find stdin to read failed line
     
     ActionView::Template::Error:
       Error: unterminated attribute selector for type
               on line 1009:16 of stdin
       >> .prose ol[type="A" s] {
```

##解決法

（公式Githubのissueが更新されるまではとりあえず解決とする）
gemのバージョンによるエラーらしいのでドリアンのブランチでgemをupdateしてみる

```
gem "tailwindcss-rails", github: "dorianmariefr/tailwindcss-rails", branch: "minimal"
```

```
% bundle update
```

新たなエラー
dockerの容量が少ないようなので使ってない余分なimageを削除
(Macに対してdockerをどれくらいの容量で利用するかの設定を見直すのもおすすめ)

```
failed to copy files: copy file range failed: no space left on device
ERROR: Service 'app' failed to build : Build failed
```

```
% docker-compose build
% docker-compose up -d
```

テスト再実行すると成功！
ありがとうドリアン！！

##参考

https://stackoverflow.com/questions/68898511/tailwindcss-typography-sasscsyntaxerror-error-unterminated-attribute-select

https://github.com/rails/tailwindcss-rails
「【線形代数】行列の乗法(積) in Python」を参考に、「Hadamard productとdot product」をSymPy Liveでやってみた。

オリジナル

https://qiita.com/PuchiCorner/items/201edc833eace5ee9c00

参考

https://docs.sympy.org/latest/modules/matrices/matrices.html#matrix-functions-reference


以下サイトに、ソースコードを貼り付けて、Evaluateです。

https://live.sympy.org/
### 1. アダマール積 (Hadamard product)
```python
from sympy import *
print(matrix_multiply_elementwise(Matrix([[3, 4], [5, 6]]),Matrix([[1, 2], [3, 4]])))
"""
Matrix([[3, 8], [15, 24]])
"""
```


### 2. 通常の行列の積 (dot product)
```python
from sympy import *
print(Matrix([[3, 4], [5, 6]])*Matrix([[1, 2], [3, 4]]))
"""
Matrix([[15, 22], [23, 34]])
"""
```
多変量正規分布に従うデータを生成する

# 多変量正規分布に従うデータを生成する

指定した相関係数行列 $r$ を再現する，$n \times p$ データを生成する。データの各列は平均値=0，標準偏差=1 に正規化する。


```julia
n = 10000;
r = [1.0 0.5 0.6
     0.5 1.0 0.7
     0.6 0.7 1.0];
```

## 指定した相関係数行列を正確に再現するデータ行列を生成する

主成分分析で得られる主成分得点は互いに直行することを利用して，相関係数行列を再現するデータ行列を生成する。


```julia
using LinearAlgebra, StatsBase

function mvnorm(n, r)
    # n × p 正規乱数行列 x を生成する
    x = randn(n, size(r, 1))
    # 各列に対して，平均値=0，標準偏差=1 になるように正規化する
    t = fit(ZScoreTransform, x, dims=1)
    x = StatsBase.transform(t, x)
    # 相関係数行列を計算する
    correlationcoefficients = cor(x)
    # 主成分分析（特異値分解）を行い，主成分得点係数を求める
    eigenvector, eigenvalue, junk = svd(correlationcoefficients)
    coefficient = correlationcoefficients \ (sqrt.(eigenvalue)' .* eigenvector)
    # コレスキー分解の結果をもとに，指定された相関係数を持つデータ行列に変換する
    x * coefficient * cholesky(r).U;
end
```





## 使用例


```julia
data = mvnorm(n, r);
cor(data)
```




    3×3 Matrix{Float64}:
     1.0  0.5  0.6
     0.5  1.0  0.7
     0.6  0.7  1.0



## 指定した相関係数行列を近似的に再現するデータ行列を生成する

Julia の `rand( )` の第1引数は分布関数でもよいことを利用する。多変量正規分布関数は `MvNormal( )`である。

```julia
using LinearAlgebra, StatsBase, Distributions

function mvnorm2(n, r)
    # 多変量正規分布関数
    d = MvNormal(zeros(size(r, 1)), r)
    # 乱数を生成する
    x = rand(d, n)'
    # 各列に対して，平均値=0，標準偏差=1 になるように正規化する
    t = fit(ZScoreTransform, x, dims=1)
    StatsBase.transform(t, x)
end
```




## 使用例




```julia
n = 1000
r = [1.0 0.5 0.6
     0.5 1.0 0.7
     0.6 0.7 1.0];
x = mvnorm2(n, r)
cor(x)
```




    3×3 Matrix{Float64}:
     1.0       0.450953  0.589965
     0.450953  1.0       0.702308
     0.589965  0.702308  1.0



サンプルサイズを大きくすると，近似精度が高くなる。


```julia
cor(mvnorm2(1000000, r))
```




    3×3 Matrix{Float64}:
     1.0       0.502163  0.600687
     0.502163  1.0       0.700792
     0.600687  0.700792  1.0



## 指定された平均値ベクトル，分散・共分散行列を再現するデータを生成する

上述の関数をそれぞれ書き換えてもよいが，相関係数行列と分散・共分散行列の関係から，以下のようにすることもできる。


```julia
function mvnorm3(FUNC, n, μ, Σ)
    # 各列のデータの分散は Σ の対角成分
    d = diag(Σ)
    # 相関係数行列を求める
    r = Σ ./ sqrt.(d * d')
    # mvnorm( ) か mvnorm2( ) を呼ぶ
    x = FUNC(n, r)
    # 標準化の逆を行う
    (x' .* sqrt.(d) .+ μ)'
end
```


使用例




```julia
n = 1000
μ = [10, 20, 30]
Σ = [45 30 22
     30 54 46
     22 46 83];
```

`mvvnorm` を使う場合

```julia
x = mvnorm3(mvnorm, n, μ, Σ)
cov(x)
```




    3×3 Matrix{Float64}:
     45.0  30.0  22.0
     30.0  54.0  46.0
     22.0  46.0  83.0


`mvnorm2` を使う場合


```julia
x = mvnorm3(mvnorm2, n, μ, Σ);
cov(x)
```




    3×3 Matrix{Float64}:
     45.0     29.977   23.5369
     29.977   54.0     45.8874
     23.5369  45.8874  83.0

この場合も，サンプルサイズを大きくすると近似精度が上がる。


```julia
x = mvnorm3(mvnorm2, 1000000, μ, Σ);
cov(x)
```




    3×3 Matrix{Float64}:
     45.0     30.0498  22.011
     30.0498  54.0     45.966
     22.011   45.966   83.0