OmniAICreator/Qiita-1.07M huggingface dataset:
メモ：NTFSアクセス許可と共有フォルダーアクセス許可

## メモ

自分の備忘です。
記事内の画像はワークショップで立ち上げた検証機のものなので何が見えても怖くないです。

## NTFSアクセス許可

ここで見えているのがNTFSアクセス許可。
さらに深掘りをしたければ「詳細設定」から。

![FSxワークショップ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155963/62f74a3a-8aef-cb91-98ef-b580e6bb1359.png)

「アクセス許可」タブの内容が該当。

所有者を気にするといいことがある場合もあるらしい。（ここではドメインAdministratorsグループに含まれているドメインユーザーAdminが設定されている。）

![FSxワークショップ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155963/e1224c8c-3d20-e592-8f9b-a7d65b90532c.png)

NTFSアクセス許可は上位フォルダから継承する。
アクセス許可を削除したいときは一度継承を無効化してから新たに付与し直す、と言った工夫が必要らしい。

複数のグループに所属するユーザーいてグループごとに異なるアクセス権が付与されているケースを考えると、「累積」という考え方になる。

ただし拒否は一番強い。

## 共有フォルダーアクセス許可

「共有」タブから確認できる部分は「共有フォルダーアクセス許可」と呼ばれる。

ここでは継承という概念はない。

![FSxワークショップ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155963/6079d162-8cf2-ab08-8f5d-0b2f1bb11afb.png)

「共有フォルダーアクセス許可」と「NTFSアクセス許可」は制限が厳しい方が適用される。
（なので共有フォルダーアクセス許可ではEveryoneで許可を入れ、NTFSアクセス許可でコントロールするケースが多い印象。）

「累積」や「拒否が一番強い」のは上に同じ。
【Oracle】EE 12c から SE2 12cに Dump移行する際の partition 有効オブジェクトインポートエラーへの対応

# 環境
+ 移行元
    + OS：RHEL 7.6
    + DB：Oracle EE  12.1.0.2
+ 移行先
    + OS：RHEL 7.6
    + DB:Oracle SE2 12.1.0.2

# 状況
移行元(EE)からtablespaceモードのexpdpでDUMPファイルを生成し、以下コマンドで移行先(SE2)にimpdpを実施した。
※DUMPファイルの移動・配置の手順は割愛

```
[expdp from EE]
expdp hoge/hoge2@SourceSB tablespaces=SourceTableSpace directory=DATA_DUMP_DIR dumpfile=hogehoge.dmp logfile=ExportEE.log

[impdp to SE2]
impdp hoge/hogehoge2@TargetDB TABLESPACES=TargetTableSpace DIRECTORY=DATA_PUMP_DIR DUMPFILE=hogehoge.dmp LOGFILE=ImportSE2.log TABLE_EXISTS_ACTION=replace
※SourceTableSpaceとTargetTablespaceの名前は同じ
```

上記のimpdpを実施すると、partition機能が有効な table・index がインポート不可。

```
ORA-39083: オブジェクト型TABLE:"owner"."tablename"の作成が次のエラーで失敗しました:
ORA-00439: 機能は有効ではありません: Partitioning
```

# 対処
impdpのオプションに `PARTITION_OPTIONS=MERGE` を追加する。

```
impdp hoge/hogehoge2@TargetDB PARTITION_OPTIONS=MERGE TABLESPACES=TargetTableSpace DIRECTORY=DATA_PUMP_DIR DUMPFILE=hogehoge.dmp LOGFILE=ImportSE2.log TABLE_EXISTS_ACTION=replace
```

なお、上記 impdp でも index インポート時にエラー出力されるが、インポート処理は実施されている模様。
Unicessingを動かしてみる

#実行環境
・Unity 2018.3.14f1
・Unicessing ver0.21

エディター:VScode

#Unicessingとは
Unicessingは2016年に@n_ryota氏がリリースした、UnityでProcessingライクにオブジェクトを生成することができるアセットです。

Processingはプログラミングによる視覚的な表現の技法をやさしくするために生まれたもので、
setup()で初期値を与え、draw()で次フレームの更新を行う直感的に記述しやすいものです。
直感的で記述しやすいメリットを持つProcessingの記法をUnityで使えるようにAPIを作成されたものが
Unicessingです。

#Unicessingを動かすよ
今回はUnity 2018.3.14f1でプロジェクトを作成してUnicessingを使います。
作成したプロジェクトにAsset StoreからUnicessingをImportします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1433245/c6239255-3d3d-e797-22f2-3a657f0d111a.png)

早速サンプル動かしてみるが...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1433245/ee592210-dd1b-ad12-39b8-14348772a707.png)

UConstants.csにおいてエラーが発生する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1433245/2020d584-c526-2b5f-a08c-f7c64aa5df2a.png)

推測ですがVRが着用されているのかそうじゃないのかのif文でエラーが発生していると考えてます。
今回はVRを用いないのでこの設定は必要ないですね。
そこで、UConstants.csからVR関連の設定を消していきます。

UConstants.csの89行目から関連しているコードを消していきます。

```UConstants.cs
public static bool isVR { get { return UnityEngine.VR.VRSettings.enabled; } }
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1433245/0592dabf-048f-2fba-832d-9aa560482611.png)

3つreferencesが出てきます。
UnicessingのサンプルシーンのMenuは今回動かさないので
ScriptsのSamplesにあるUnicessingMenu.csを消します。

UInputs.csで116行目と169行目の該当箇所を修正します。
(VSCoedからべた張りなので見づらくてすみません)

116行目修正前

```UInputs.cs
        public RaycastHit raycastScreen(float distance = INFINITY, int layerMask = -1)
        {
            if(isVR && targetCamera)
            {
                return raycast(targetCamera.transform.position, targetCamera.transform.forward, distance, layerMask);
            }
            return raycastScreen(cursorX, cursorY, distance, layerMask);
        }
```
修正後

```UInputs.cs
        public RaycastHit raycastScreen(float distance = INFINITY, int layerMask = -1)
        {
         return raycastScreen(cursorX, cursorY, distance, layerMask);
        }
```

169行目修正前

```UInputs.cs
            if (isVR)
            {
                ray = new Ray(targetCamera.transform.position, targetCamera.transform.forward);
            }
            else
            {
                ray = targetCamera.ScreenPointToRay(Input.mousePosition);
            }
```

修正後

```UInputs.cs
            Ray ray;

            ray = targetCamera.ScreenPointToRay(Input.mousePosition);
```


最後にUConstants.csの89行目を消すとエラーが発生しなくなるはずです。

試しにサンプルシーンのSeaを動かしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1433245/64b3c0f3-1c4b-bdb2-a273-33010f8db2cf.png)

コンパイルエラーもなく動いてくれました。

以上、Unicessingを動かしてみました。
OpenProcessingにあるコードをUnityで動かしてみると面白そうですね。
Windows TerminalでPengwinを使っていたら、ロゴが背景に出てくるようになったので消す

私は普段、WSLに最適化されているPengwinというDistributionをWindows Terminal上で使っています。

最近Pengwinのアップデート(21.5.4)が来たみたいで、このアップデートにてWindows Terminalの背景を自動で設定してくれちゃいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255755/898ff3f5-055e-7525-3834-36a622dca53f.png)

正直にいうと邪魔なので、消しちゃいます。Windows TerminalのVersionは1.7です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255755/5a65fd62-4206-71e7-cad2-10a0b3d81df6.png)

Windows Terminalの上部下印から"設定"を選び、左タブの **プロファイル** にある Pengwin を選びます。

右画面上部にあるタブの **外観** をクリックし、下の方にスクロールすると **背景画像** という項目にパスが書かれています。このパスを消して保存とすると、背景ロゴが消えます。

更に、このアップデートで背景がくすむようになってます(また、背景色も濃い紫になっていますので、これはプロファイルを変更してください)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255755/f85d40b6-1064-7087-9ccc-4f7b992d25e4.png)

くすみ取りには、設定更に下にある **アクリル** をオフにします。

プロファイルも変更し、これで前まで使っていたものに治りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255755/357d94e0-5d71-b1e5-2803-fa3ff5a8e487.png)


因みにですが、Windows Store上でPengwinがアップデートされたら、shellで

```shell-session
$ pengwin-setup update
```

を打ってLinuxのアップデートを行った方が良いみたいです。
undefined method `name' for nil:NilClassの解決策

#はじめに#
はじめまして、プログラミング歴２ヶ月足らずの者です。同じエラーが発生した方のお力になれたらと思い、初めての投稿をさせていただきます。もし、記事内容に間違った内容などございましたらご指摘いただけると幸いです。


#背景#

productとその名前や値段などを表にして表示し、商品の管理画面を作成しようとしていました。




#エラー内容#

```products.index.html.erb
 <% @products.each do |product| %>
            <tr>
                <td scope="row"><%= product.id %></td>
                <td><%= image_tag "/images/dummy.png", class: "img-fluid h-10" %></td>
                <td><%= product.name %></td>
                <td><%= product.price %></td>
                <td><%= product.category.name %></td>
                <td><%= product.category.major_category_name %></td>
                <td><%= link_to "編集", edit_dashboard_product_path(product), class: "dashboard-edit-link" %></td>
                <td><%= link_to "削除", dashboard_product_path(product), method: :delete, class: "dashboard-delete-link" %></td>
            </tr>
            <% end %>
```

7行目のproduct.category.nameのnameメソッドが見当たらないとのエラーメッセージが出ました。


#解決策#
```
rails db:reset
```

一度データベースの全てのテーブルをdropし、テーブルを再作成したところ、表が表示されるようになりました。


#考えられる原因#
開発途中で、試験的にデータベースのレコードを削除したりしていたので、productのレコードとcategoryのレコードの関係性が崩れたことが原因だったと考えられます。


↓　参考記事

https://qiita.com/peco4107/items/96bb6beda330064145e9
AWSクラウドプラクティショナー取得に向けて

夏までにAWSクラウドプラクティショナーを取得しなければいけないので、現状と勉強方法についてまとめようと思います。

#現状
昨日、とりあえずUdemyの模擬試験をやってみたところ...

**正答率42%**

....70%以上で合格なので全くダメですね。
正直、半分は取れるだろうとなめてました。
ただ試験時間に関しては90分あるうち22分しか使わなかったので、時間は見直しも含め十分あることがわかりました。

#ここまでの勉強
ここまでやった勉強は主に2つ。

 - [AWS Cloud Practitioner Essentials (Japanese) (日本語字幕版)](https://www.aws.training/Details/eLearning?id=66479)
 - [AWS 初心者向けハンズオン](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-hands-on/)

どちらも初心者がAWSサービス全体を把握するにはぴったりだと感じました。
特にCloud Practitioner Essentialsは数分の動画、短い文章、小テストの繰り返しで構成されていてかなり取り組みやすいです。

ハンズオンの方は、動画を見ながらAWSサービスを駆使して簡単なネットワーク構成を組んだり、webアプリを作成したり、といった内容です。
やりがいがあって面白いのですが、私は気が抜けると動画の通り作業するだけになりがちでした。
とはいえ基本的なサービスを一通り実際に触れるのでかなりいい教材だと思います。
あと、ボリュームがすごいです。

#克服ポイント
###アルファベット3文字が全部同じに見える
ECS、ADS、DMS、CLI、EBS、SQS.....
省略されたアルファベット3文字のサービス名たちがなかなか覚えられません。
それぞれの省略していない形を確認することで覚えていきたいです。

###バリエーションが覚えられない
EC2のインスタンスファミリー、EBSのボリュームタイプなどサービスの中で更にバリエーションがある場合もなかなか覚えられないです。
こちらはサービスごとの資料なんかで対応していきたいです。

#ここからの勉強
ここから勉強するつもりなのは以下の2つ。
 - Udemy「[この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（7回分455問）](https://www.udemy.com/course/aws-4260/)」
 - 書籍「[AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー (日本語)](https://www.amazon.co.jp/-/en/%E5%B1%B1%E4%B8%8B-%E5%85%89%E6%B4%8B/dp/4797397403/ref=pd_bxgy_img_2/355-8789472-0077047?_encoding=UTF8&pd_rd_i=4797397403&pd_rd_r=13f5771c-a4a6-4359-8ab9-490598414012&pd_rd_w=eUJZ1&pd_rd_wg=b6D9K&pf_rd_p=105d6769-bacf-43d4-85ea-a25cec858a3c&pf_rd_r=ZJV1G8HH04CV7M0VHK4S&psc=1&refRID=ZJV1G8HH04CV7M0VHK4S)」

より試験対策に力を入れて、確実に合格を狙います！！
laravel で Indirect modification of overloaded element of App\Reserve has no effect

laravelで

DBから取得した結果をいじくろうと思ってたら

```

Indirect modification of overloaded element of App\Reserve has no effect

```

エラーが出た。

対処法

```

//$tmp = $sql->paginate(25);
$tmp = $sql->paginate(25)->toArray();

```

上記のようにデータを配列で取得して `foreach` などをすると良い。
【ExcelVBA】配列をcsvへ、そして保存


参照設定の方法がわからない方はこちら
https://qiita.com/daichi05w/items/c2d827df55bb298e965a

```
'参照設定：Microsoft ActiveX Data Object x.x Library「x.x」には最も数字が大きいものを選択する
Public Const HOZON_PASS As String = "" 'ファイル名を含む絶対パスを指定する

Sub main()

    Dim info_table(0 To 1, 0 To 2) As String
    Dim csv_string As String

    info_table(0, 0) = Cells(1, 1).Value
    info_table(0, 1) = Cells(1, 2).Value
    info_table(0, 2) = Cells(1, 3).Value
    info_table(1, 0) = Cells(2, 1).Value
    info_table(1, 1) = Cells(2, 2).Value
    info_table(1, 2) = Cells(2, 3).Value

    csv_string = array_to_csv(info_table)
    Call write_UTF8(csv_string, HOZON_PASS)

End Sub
Function array_to_csv(ByRef info_table() As String) As String

    Dim i As Long
    Dim j As Long
    
    Dim csv_string As String
    
    csv_string = ""
    
    For i = 0 To UBound(info_table, 1)
        
        For j = 0 To UBound(info_table, 2)
        
            csv_string = csv_string & """" & info_table(i, j) & """" & ","
            
        Next
        
        csv_string = Left(csv_string, Len(csv_string) - 1)
        csv_string = csv_string & vbCrLf
        
    Next
    
    array_to_csv = csv_string

End Function
Sub write_SJIS(ByVal csv_string As String, ByVal pass As String)

    Dim objStream As ADODB.Stream
    Set objStream = New ADODB.Stream
    
    With objStream
    
        .Open
        .Type = adTypeText
        .Charset = "Shift_JIS"
        .WriteText csv_string
        .SaveToFile pass, adSaveCreateOverWrite
        .Close
        
    End With
    
    Set objStream = Nothing
    
End Sub
Sub write_UTF8(ByVal csv_string As String, ByVal pass As String)

    Dim byteData() As Byte
    Dim objStream As ADODB.Stream
    Set objStream = New ADODB.Stream
    
    With objStream
        .Charset = "UTF-8"
        .LineSeparator = adLF
        .Open
        .WriteText csv_string
        .Position = 0
        .Type = adTypeBinary
        .Position = 3
        byteData = .Read
        .Close
        .Open
        .Write byteData
        .SaveToFile pass, adSaveCreateOverWrite
        .Close
    
    End With

End Sub

```
【ExcelVBA】配列をJSONへ、そして保存

不具合あれば教えてください。普段の業務で私は使えています。

参照設定の方法がわからな方はこちら
https://qiita.com/daichi05w/items/c2d827df55bb298e965a

```
'参照設定：Microsoft ActiveX Data Object x.x Library「x.x」には最も数字が大きいものを選択する
Public Const HOZON_PASS As String = "" 'ファイル名を含む絶対パスを指定する。拡張子は「.json」
Sub main()

    Dim info_table(0 To 3, 0 To 2) As String
    Dim keys(0 To 2) As String
    
    Dim json_string As String
    Dim name As String
    
    name = "scouter"
    
    keys(0) = "name"
    keys(1) = "age"
    keys(2) = "power"
    
    info_table(0, 0) = "sato"
    info_table(0, 1) = "58"
    info_table(0, 2) = "100000"
    info_table(1, 0) = "kato"
    info_table(1, 1) = "12"
    info_table(1, 2) = "1152134"
    info_table(2, 0) = "goto"
    info_table(2, 1) = "35"
    info_table(2, 2) = "4115"
    info_table(3, 0) = "muto"
    info_table(3, 1) = "44"
    info_table(3, 2) = "545144"
    
    json_string = array_to_json(name, keys, info_table)
    Call write_UTF8(json_string, HOZON_PASS)
    
End Sub
Function array_to_json(ByVal name As String, ByRef keys() As String, ByRef info_table() As String) As String

     Dim i As Long
     Dim j As Long
     Dim json_string As String

     json_string = name & "= '["

     For i = 0 To UBound(info_table, 1)

        json_string = json_string & "{"

        For j = 0 To UBound(keys, 1)

            json_string = json_string & """" & keys(j) & """ : """ & info_table(i, j) & """ ,"

        Next

        json_string = Left(json_string, Len(json_string) - 1)
        json_string = json_string & "},"

     Next

     json_string = Left(json_string, Len(json_string) - 1)
     json_string = json_string & "]'"

     array_to_json = json_string

End Function
Sub write_UTF8(ByVal csv_string As String, ByVal pass As String)

    Dim byteData() As Byte
    Dim objStream As ADODB.Stream
    Set objStream = New ADODB.Stream

    With objStream
        .Charset = "UTF-8"
        .LineSeparator = adLF
        .Open
        .WriteText csv_string
        .Position = 0
        .Type = adTypeBinary
        .Position = 3
        byteData = .Read
        .Close
        .Open
        .Write byteData
        .SaveToFile pass, adSaveCreateOverWrite
        .Close

    End With

End Sub

```
レポート、ダッシュボードでフィルタがうごかない時の処置

#訳

レポートに何かが表示されない理由は基本的に3つあります。

1.スコープまたはフィルターの基準を満たしていません
2.ユーザーには少なくとも読み取りアクセス権がありません
3.存在しません


#原文
There are basically 3 reasons why something doesn't show up in a Report: 

1. It does not meet the scope or filter criteria
2. The User does not have at least Read access to it
3. It does not exist

Can you post a screenshot of the Report Settings and Filters and a screenshot of a record that is "missing"  from the Report? For questions related to Reports and Dashboards those are really helpful 


https://trailblazers.salesforce.com/answers?id=9064S000000DuuFQAS
[Webを支える技術] atom

# atomとは
RSSと同じく、Webサイトで使われる更新情報を記述するための文書フォーマット。
拡張子は`.atom`

requestで取得する際には`application/atom+xml`を指定します。

## 記述方法
```xml:atom
<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns='http://www.w3.org/2005/Atom' xml:lang='ja'>
<title>blog.jxck.io</title>
<link rel="alternate" href="https://blog.jxck.io/"/>
<link rel="self" type="application/atom+xml" href="https://blog.jxck.io/feeds/atom.xml"/>
<author><name>Jxck</name></author>
<id>tag:blog.jxck.io,2016:feed</id>
<updated>2016-01-28T18:30:02Z</updated>
<entry>
 <title>AMP HTML 対応</title>
 <link href="https://blog.jxck.io/entries/2016-02-01/amp-html.html" rel="alternate" />
 <id>tag:blog.jxck.io,2016:entry://2016-02-01</id>
 <updated>2016-02-01T00:00:00Z</updated>
 <summary>Google が推奨する仕様である [AMP HTML](https://www.ampproject.org/) に、このブログを対応した。言いたいことは色々あるが、とりあえず非常に難しかったため、その対応方法や感想などを残す。</summary>
</entry>
</feed>
```

例引用: 一部改変

https://blog.jxck.io/entries/2016-02-09/atom-feed.html

このように、HTML感覚で文書のメタデータやタイトルなどを記述できるxmlがatomです。
文書の書き方が決まっているため、RSSリーダーやブラウザで取得するときに便利です。また、独自のフォーマットを書くことができます。
atomでは、独自フォーマットは無視するという仕様があるため、RSSリーダーなどでは支障がなく、自分が使うときにはその独自フォーマットを読み込むことができます。

```xml:entry
<entry>
 <title>AMP HTML 対応</title>
 <link href="https://blog.jxck.io/entries/2016-02-01/amp-html.html" rel="alternate" />
 <id>tag:blog.jxck.io,2016:entry://2016-02-01</id>
 <updated>2016-02-01T00:00:00Z</updated>
 <summary>Google が推奨する仕様である [AMP HTML](https://www.ampproject.org/) に、このブログを対応した。言いたいことは色々あるが、とりあえず非常に難しかったため、その対応方法や感想などを残す。</summary>
</entry>
```

atom(RSS)では、<entry>タグの中にメタデータを書いていきます。この中に書いたものがRSSリーダーなどで表示されます。
atom(RSS)では、`<title><id><updated><author>`が必須要素となっています。
wordpressのregister_activation_hookで詰まった

自作プラグインを作っていたら色々詰まったのでメモ。
[ドキュメント](https://wpdocs.osdn.jp/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%A7%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%82%92%E4%BD%9C%E3%82%8B)を参考にしながら`register_activation_hook`に呼び出される関数内で新規テーブルを作ろうとしたが作成されなかった。

#失敗例
```
add_action('init', 'init');
function Init()
{
    register_activation_hook(__FILE__, 'plugin_activation');
}
```
ざっくりこんな記述をしていた。
何が悪かったのかというと`init Hook`で呼び出される関数内で`register_activation_hook`を呼び出していた所。
[英語のドキュメント](https://developer.wordpress.org/reference/functions/register_activation_hook/)を見ると分かりやすいが、

>Registering the hook inside the ‘plugins_loaded’ hook will not work. You can’t call register_activation_hook() inside a function hooked to the 'plugins_loaded' or 'init' hooks (or any other hook). These hooks are called before the plugin is loaded or activated.

そもそもhook内でactivation_hookを呼び出せないようだ。
なのでactivation_hookをhookの外に出せばOK

```
add_action('init', 'init');
register_activation_hook(__FILE__, 'plugin_activation');
function Init()
{
}
```
conda activateでエラーが出る件

# 初めに
環境設定......なにそれおいしいの？
そんな自分が出会った，やらなければいけない事orzについて，備忘録として記載していきます．
（文章力が無いので読みづらい場合はすいません...）

## conda activateでエラー
VS CodeとAnaconda入れたし，仮想環境も作れたので，VS Codeでプログラム書いて行こう！
と意気込んでVS Codeでターミナルを表示すると以下の文が...

```
CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
If using 'conda activate' from a batch script, change your
invocation to 'CALL conda.bat activate'.
```

早速かorz

調べてみるといろいろな方が解決法を記載しているのですが，最新版のVS Codeの記載が見つからずにハマりました．
そこで，以下の記事を参考に色々と試行錯誤をしました．（特に参考にしたのが以下の記事です）

参考：[【Windows】VS Code + Anaconda で Python の開発環境を用意する](https://qiita.com/eyuta/items/d0ece5ae147109db1308)

# 解決編
では，早速解決方法を記載します．

まず，"_Ctrl+&#x20;,_"で設定画面を開きます．
そして検索バーに，_powershell_と打つと以下の図にあるものが出てくるので，_setting.json_を押します．
![setting_json.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1545522/7c0f1508-fa52-3eb6-9430-8fabb431520f.png)
次に，プログラムが色々書いてある中から，以下の文を探して記載してください．
（なんでこんな文を書くのかは，上記の参考記事をご確認ください）

```
terminal.integrated.defaultProfile.windows: "PowerShell",

// どこかにPowerShellってのがあるので，その中にargsを記載
　　"PowerShell": {
            "args":[
                "-ExecutionPolicy",
                "ByPass",
                "-NoExit",
                "-Command",
                "& 'C:\\Users\\ユーザー名\\anaconda3\\shell\\condabin\\conda-hook.ps1'; conda activate 'C:\\Users\\ユーザー名\\anaconda3'"
            ]
　　　　　　　// 他にも色々あるが，それはそのままで
        },

// launchがあればその中に．
// なければ，一番下の行の"}"の前に記載
　"launch": {
        "configurations": [
            {
                "name": "Python: Current File",
                "type": "python",
                "request": "launch",
                "program": "${file}",
                "console": "internalConsole",
　　　　　　　　　// stopOnEntryはデバックしやすくなる文なのでなくても大丈夫（書かない方が無難）
                "stopOnEntry": true
            }
        ],
        "compounds": []
    }
```

これで解決です！

因みに_launch_？_PowerShell_？のどっちかは，Anacondaの設定と連携させる奴だったはず...（覚えてない）
なので，記載しなくてもAnaconda Navigatorの_Home_からVS Codeの_launch_を押せばいけます．（毎回起動時にNavigator開かないといけないですが）

# 最後に
この後，NumPyとOpenCVを使う際にエラーが出たので，それについては以下に記載しています．
[NumPyとOpenCVのimportでエラーが出る件](https://qiita.com/thinknee/items/9489119c8b85d9323132)
Oracle Analytics Cloud ことはじめ：エンタープライズ利用ってなに？

皆さんこんにちは。
今回は第一回目のOracle Analytics Cloudことはじめ（https://qiita.com/T-BIRO/items/a36612de30cd61475c94）でご紹介したOracle Analytics Cloud Enterprise Editionがなぜエンタープライズで利用できるのかについてお話します。

そもそも
Oracle Analytics Cloud PEはセルフサービスBI
Oracle Analytics Cloud EEはエンタープライズBI
というお話でしたが利用者の視点で考えてみましょう。

セルフサービスBIができる人は、一般的に
・データのことをよく知っている
・業務のことをよく知っている
ためにデータを自分で自由に見たい方々といえます。

エンタープライズBIは
・業務推進のために必要な情報をサクッと見たい
・ちょっと条件を変えたい
というニーズが多いのかもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1251127/a10e5970-51dc-aaab-0f30-88cb327dea2f.png)


この、情報をサクッと見たいというニーズに関しては今どきのBIツールですのでインタフェースはどんどん進化していてかなり簡単になっていると思います。
とはいえちょっとしたことでつまずいてしまうと、業務を推進するために必要な情報ですので、つまづかない確実な方法で情報を取得したいという気持ちになるのは当たり前です。

１．スケジュールやしきい値でレポート配信する（デリバー機能）

月曜の朝に欲しいなど、定期的に欲しい情報はスケジュール配信してしまいましょう。
BIツールを使う＝Webブラウザを立ち上げてデータを見る
ということです。
ただでさえ忙しい午前の時間帯ですので、業務のスタートともに必要な情報はメールをあけたらすぐに受け取りたいですよね

その他に、システムにアクセスすれば赤くなっていてすぐに気付く情報でも、「BIにアクセスすれば」という条件がついてしまいます。
そのためしきい値を元にシステムから教えてくれたらラクでいいですよね。

２．一般利用者が簡単に利用するために、裏の仕組みを作っておく

自由にドリルダウンしたいというニーズはあるもののドリルダウンする項目を探すのは大変ですよね。
事前にドリルダウンする順番などを定義しておけば利用者はクリックするだけで済みますので簡単になります。

特に２．で記載した裏の仕組みというところがリポジトリの設定となります。
このリポジトリの設定については別途詳細について別の機会でお話しできればと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1251127/8a253fb9-a4e1-27c8-9f01-bf51182c3980.png)
Cygwinで変更になった一部全角幅文字の扱いを元に戻す

以前のCygwinでは、LANGがja_JP.UTF-8の場合、ギリシャ文字(αβγ)や矢印(⇒→)、罫線(─│)などの[East Asian Width](https://ja.wikipedia.org/wiki/%E6%9D%B1%E3%82%A2%E3%82%B8%E3%82%A2%E3%81%AE%E6%96%87%E5%AD%97%E5%B9%85)でAmbiguous(曖昧)に属す文字は全角扱いされるようになっていましたが、最近のバージョンアップでこのような特別扱いが除去(=半角扱いに変更)されました。(どのバージョンからは把握していないのですが)

参考: [drop ambiguous-wide behaviour from Unicode CJK locales](https://cygwin.com/git/?p=newlib-cygwin.git;a=commitdiff;h=1ed2fe0f03f4c8f9cb663c36720e786a229bcabe)

変更前:
> -These characters have a width of 1 for singlebyte charsets and a width of 2
> -for multibyte charsets other than UTF-8.
> -For UTF-8, their width depends on the language specifier:
> -it is 2 for <<"zh">> (Chinese), <<"ja">> (Japanese), and <<"ko">> (Korean),
> -and 1 for everything else. Specifying <<"cjknarrow">> or <<"cjkwide">>
> -forces a width of 1 or 2, respectively, independent of charset and language.

変更後:
> +These characters have a width of 1 for singlebyte charsets and UTF-8,
> +and a width of 2 for multibyte charsets other than UTF-8. Specifying
> +<<"cjknarrow">> or <<"cjkwide">> forces a width of 1 or 2, respectively.

この仕様変更後も、「曖昧」な文字を全角幅文字扱いしたい場合は、環境変数LANGに「ja_JP.UTF-8@cjkwide」を設定する必要があります。

具体的には以下の設定を追加/変更します。

* Windowsの環境変数設定[^1]で、環境変数LANGに「ja_JP.UTF-8@cjkwide」を設定する。
* MinTTYのオプション→テキストで、「文字セット」の箇所に「UTF-8@cjkwide」を設定する。

[^1]: 開き方はいろいろあるが、例えば、Explorerの「PC」を右クリック→「プロパティ」→「システムの詳細設定」→「システムのプロパティ」ダイアログの「詳細設定」タブ→「環境変数」。なお、設定箇所はユーザー環境変数でもシステム環境変数でもどちらでもよい。
SwiftUIで点線を引く方法

#1.区切り線を引く
◯区切るために線を引くとき
↓
Divider()を使う

1.縦で区切る

```
HStack {
    Text("左左左左左")
    Divider()
    Text("右右右右右")
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670085/a5ee5172-15de-ded8-b693-d80a1355ad44.png)

https://www.yururiwork.net/wp-content/uploads/2020/03/Simulator-Screen-Shot-iPhone-11-Pro-Max-2020-03-28-at-22.41.50-768x1662.png

2.横で区切る
今度は、HStackのところをVStackに("H"orizon から "V"erticalに)

#2.点線の場合
◯線のスタイルはStrokeStyle構造体で定義される
例えば点線のボタンを作るなら、
```
Button(action: {
    print("Hello button tapped!")
}) {
    Text("Hello World")
        .fontWeight(.bold)
        .font(.title)
        .foregroundColor(.purple)
        .padding()
        .overlay(
            Capsule(style: .continuous)
                .stroke(Color.purple, style: StrokeStyle(lineWidth: 5, dash: [10]))
        )
}
```
のようになる。

最後の.strokeのStrokeStyleに注目すると、StrokeStyle(lineWidth: 5, dash: [10]))
となっている。

つまり、これは線の太さが5、長さが10の点線が出来上がることを意味する

点線(破線)はdash[線の長さ, 空白の長さ]で指定する
【Javascriptの基本的な文法を学ぼう③】条件分岐処理編

#はじめに
今回は変数定義についてみていきたいと思います！プログラミングを学習する上で条件分岐処理は基本的な内容となりますので、しっかり押さえておきましょう！


#条件分岐処理
条件分岐処理とは、`条件を満たしているかどうかで実行内容を分岐する処理です。`単に条件分岐とも呼ばれます。この仕組みで、「もし〇〇だったら△△をする」と処理を分けることができます。条件分岐処理において、分岐の条件として記述する式を`条件式`と呼び、条件式には、真偽値になる式を記述します。

#if文
Javascriptの条件分岐にはif(イフ)文という文法を使います。if文は、条件式が正しいか正しくないか、`つまりtrueかfalseかで実行する処理を分岐させることができます`。基本的なif文の書き方は以下です。条件式がtrueになる場合のみ、if 条件式{}の間に記述した処理を実行します。

>
```javascript:例
if (条件式1) {
  // 条件式1がtrueのときの処理
}
```

#else if文
if文で条件式が偽のときに処理を行うには、else ifを使います。条件を満たさなかったときの処理をelse if{}の間に記述します。

>
```javascript:例
if (条件式1) {
  // 条件式1がtrueのときの処理
} else if (条件式2) {
  // 条件式1がfalseで条件式2がtrueのときの処理
}
```

#else文
if文で条件式１と条件式２が偽の時はelseを使います。

>
```javascript:例
if (条件式1) {
  // 条件式1がtrueのときの処理
} else if (条件式2) {
  // 条件式1がfalseで条件式2がtrueのときの処理
} else {
  // 条件式1も条件式2もfalseのときの処理
}
```

条件式を書く時に気をつけることとしては、
・`条件式は()でくくること`
・`条件式の後に続く波括弧{}内の処理が実行されること`
以上２点が挙げられますので、それらの記述のルールを踏まえた上で条件処理分岐を用いるようにしましょう。

#おわりに
今回はJavascript編3回目と言うことで、条件処理分岐について見ていきました！
次回もJavascriptの基本文法をみていきたいと思いますので、次回の記事も是非見てください！
Google Apps Script を使って Quill に「hello world!」を送信する


## これはなに

スレッド重視のチャットツール「Quill」を使ってみて incoming webhook が使えることが解ったので Google Apps Script からメッセージの送信を試してみました。

https://quill.chat/

また、「Quill」と検索するとリッチテキストエディタが多く出てきますがエディタの情報ではありません。

https://quilljs.com/

## Google Apps Script を作成する

以下 URL から Google Apps Script を作成してください

https://script.google.com/home/start

## Script を記述する

今回は、`hello world!` のメッセージを送信するだけなのでとてもシンプルです

```typescript:code.gs
const sendToQuill = () => {
  const body = {
    "text": "hello world!",
    "title": "title here!",
  }

  const options = {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : JSON.stringify(body)
  }

  // Quillの設定画面から発行した `webhooks` URLを指定
  const url = "https://api.quill.chat/webhooks/incoming?channel=dummy&webhook=dummy&nonce=dummy"

  UrlFetchApp.fetch(url, options);
}
```

## 実行してみる

今回作成した `sendToQuill` が選択されていることを確認し「実行」をクリックして下さい

![Screen Shot 2021-05-25 at 9.54.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55950/1d430b6b-f13d-3fa6-2465-2d168cf986ad.png)

実行すると、指定した URL に対してリクエストが送信されメッセージが届きます。
今回は、`Message + Thread` タイプのチャンネルのため Thread 内にメッセージが送信されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55950/2d16ed72-40f3-3581-b4a3-21eb4aa47df4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55950/2ed4150b-cc91-b9e5-cdb4-3d4efc520ed2.png)

## 最後に

今回は、「hello world!」を送信するだけだったが、Reference を読む限り Slack 同様に「attachments」「blocks」等設定出来るようなので、後日試します。

## Reference

https://docs.quill.chat/docs/specification

https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app
API Gatewayでオーソライザーに複数のCognitoユーザープールを設定する

システム構成のイメージはそれほど珍しいものではないとは思ったのですが、
構築するのにひと工夫必要だったため備忘録的にまとめました。

# システム構成
システムの利用者を[Amazon Cognito](https://aws.amazon.com/jp/cognito/)で管理しており、
API Gatewayはリクエストヘッダーに付与されたトークン（Cognitoの認証で得られたもの）を
検証するように設定しています。
これによってシステムの利用者でない者からのリクエストを制限しています。

![資料作成用_before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1139641/37130294-0ed0-f731-16b3-bbe984e6ad3a.png)

API Gateway上での本番/開発環境の切り分けは同一ステージ機能で行なっています。
（別APIにするとリソースの管理がバラバラになるため）
![スクリーンショット 2021-05-25 8.59.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1139641/c3db4a05-894c-8405-85bb-fde79009d81c.png)

# やろうとした事
Cognitoにトリガーを設定してログイン認証後の処理を実装することになったのですが、
本番/開発で同一のユーザープールであると動作検証がやりづらいという事をきっかけに、
開発用のユーザープールを新たに作成し、分けてユーザーを管理することにしました。
（最初からやっとけって話ですが:innocent:）

![資料作成用_after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1139641/136ba7e6-d8d7-01c2-d652-a3bc42f737bc.png)

# ぶつかった壁

AWSのマネジメントコンソール上からAPI Gatewayのオーソライザーに対して
リクエスト検証に使うCognioユーザープールを設定しようとしたところ、
なんと！1つしか設定できないようです。。
![スクリーンショット 2021-05-19 9.09.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1139641/335951a1-a61c-d91e-01a6-fd7d8188e005.png)

# 解決方法
このままではAPIを分けるしかないのですが、それはまた面倒なので諦めずに何か方法がないか調べていると、
AWS CLIのオーソライザー作成コマンド `create-authorizer` のオプションでは複数のユーザープールを指定できる事が判明しました。

https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-authorizer.html
> --provider-arns (list)

### コマンド実行例
```shell
aws apigateway create-authorizer \
--rest-api-id {API GatewayのAPI ID} \
--name {オーソライザーの名前} \
--type COGNITO_USER_POOLS \
--provider-arns {Cognito UserPoolのARN} {Cognito UserPoolのARN} \
--identity-source method.request.header.Authorization
```

provider-arnのフォーマットは以下のとおりで、空白区切りで入力します。
`arn:aws:cognito-idp:{region}:{account_id}:userpool/{user_pool_id}`

コマンドを実行しマネジメントコンソールを見ると指定したUserPoolが設定できていることが確認でき、
ユーザープールを分けることに成功しました。

![スクリーンショット 2021-05-19 9.09.56_モザイク.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1139641/03d537d9-654b-cdd4-bec3-1894920df132.png)

マネジメントコンソール上からできないからと諦めるケースはありがちですが、
CLIだと実現できる可能性はあるのでリファレンスは一見の価値ありです！
for,forEach,for..in,for..ofの違いとはなんぞや

javascript繰り返し処理の種類多すぎないか？
備忘録的にまとめました。
（プログラミングを勉強し始めたばかりなので内容薄い！！どんどん内容濃くしていきたい、、）



通常のfor:relaxed:
初学者でもわかりやすい通常のfor
指定した回数で繰り返し処理をしてくれるのでめっちゃ簡単！
コードが長くなりがちだが、基本全てこれでなんとかなる。


forEach :v:
配列要素に対して繰り返し処理してくれる。
僕は、queryselecterAll()でNodeListを受け取り、それをforEachで回す事が多い。
forEachでcontinue,breakは使えないので要注意。
for ..ofと機能は殆ど変わらない。
この中では唯一、ループ構文ではなくメソッドである。
引数にインデックスを使える。


for..in:raised_hand:
オブジェクトに使用できる繰り返し処理。
for(key（変数名） in obj)という形で回していく。
基本的に要素が入った順で処理が行われるが順番は保証していないのであまり使わない方が良いのかも。
あとデータ量が多いと遅くなるらしい。
配列に回すとインデックスが返される。（for..ofはvalueが返される）

for..of:baby:
foreachとほとんど機能は同じ。
ただ、forEachと違ってcontinue、breakが使用できる上に
イテラブルなオブジェクト（配列、マップ、文字列等）に使用できる点でforEachより幅が広いのかもしれない。
indexを使うにはObject.entriesを使用しkeyとvalueのペアの配列にする



結論、使うならfor,かforEach、for..ofにしましょう。
次回はイテレーター、ジェネレーターとはなんぞやという内容で投稿をしたいです。
VueTailwindを使ってみました

# はじめに

[VueTailwind](https://www.vue-tailwind.com/)を使ってみたので、ハマったことを紹介します。

ちなみに、バージョンは2.2.1です。

---

# VueTailwindについて

VueTailwindはTailwindCSSでカスタマイズ可能なVueコンポーネント群です。コンポーネントごとにバリアントを設定して、異なるデザインを使うことができます。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3635363430392f31363133323736652d666639662d653665652d373636352d3164653232323731366135372e70.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656409/52fe16dd-617c-d493-d62a-837f84dfa839.png)


---

# 導入

[公式の手順](https://www.vue-tailwind.com/docs/installation)通りに進めます。各コンポーネント、バリアントのクラスは、ここでは[Theme Builder](https://www.vue-tailwind.com/theme-builder)のデフォルトの内容から変更せずに使用します。

---

# ハマりポイント1： settingsのクラスにはTailwindCSSのプレフィックスを設定する必要がある


```tailwind.config.js
module.exports = {
  prefix: 'tw-',
}
```

このようにプレフィックスを指定したら、VueTailwindのコンポーネントがうまく表示できませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656409/e57e5075-d77e-f86c-7d97-6eb718bba9a8.png)


---

VueTailwindのコンポーネント・バリアントのクラス定義にもプレフィックスをつける必要があったようです。

```diff
const settings = {
  TInput: {
    fixedClasses:
-      'block w-full px-3 py-2 transition duration-100 ease-in-out border rounded shadow-sm focus:ring-2 focus:ring-blue-500 focus:outline-none focus:ring-opacity-50 disabled:opacity-50 disabled:cursor-not-allowed',
+      'tw-block tw-w-full tw-px-3 tw-py-2 tw-transition tw-duration-100 tw-ease-in-out tw-border tw-rounded tw-shadow-sm focus:tw-ring-2 focus:tw-ring-blue-500 focus:tw-outline-none focus:tw-ring-opacity-50 disabled:tw-opacity-50 disabled:-tw-cursor-not-allowed',
    ...
  },
  ...
}
```

これで問題なく表示されるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656409/35259dc2-217d-c3cc-28fc-1ce2ab7bc5c8.png)

---

# ハマりポイント2： 「$listeners is readonly」のエラーが出た

このエラーで検索するとVueインスタンスが複数作られていることが原因のようで、VueのバージョンをVueTailwindに合わせたらこのエラーは出なくなりました。ただ、この解決方法が正しいのかどうかは私にはわかりません。

```diff:package.json
- "vue": "2.6.11",
+ "vue": "2.6.12",
```

---

# ハマりポイント3: TDatePickerの日時のフォーマットはflatpickrの形式

[TDatePicker](https://www.vue-tailwind.com/docs/datepicker)の日時の表現はflutpickrのトークンを指定します。他の形式をpropに指定しても期待通りに動作しないので、別の日付ライブラリを使っている場合は注意が必要そうです。

後述の問題もあったので、私はTDatePickerをラップしたコンポーネントを作ることにしました。

---

# ハマりポイント4: TDatePickerで日付を入力したとき、時間・分・秒の値は現在時刻の値が用いられる

`dateFormat`にZ（ISO形式）を指定すると、時間・分・秒の値は現在時刻の値が用いられます。

```vuejs
<t-date-picker
  user-format="Y/m/d"
  date-format="Z"
/>
```

例えば上記のコンポーネントで`2021/5/21`を選択した時に、`2021/5/21 00:00:00`とならずに`2021/5/21 09:24:02`のようになります。

00:00:00としたかったので、TDatePickerには表示と同じ形式で保持させ、inputイベントをラップしてISO形式を返すようにしました。

```typescript
onInput(value: string) {
    if (value) {
      value = new Date(value).toISOString()
    }

    this.$emit('input', value)
}
```

2.2からTimePickerも使えるようになり、時刻の初期値を設定する`initialTime`が追加されました。
初期値を設定するプロパティなので当然かもしれませんが、ミリ秒は値が残ってしまいました。

```vuejs
<!-- 以下のようにinitialTimeを0埋めで設定しても、入力時にミリ秒は0埋めされない -->
<t-date-picker
  user-format="Y/m/d"
  date-format="Z"
  initial-time="00:00:00"
/>
```
[unity]The script don't inherit a native class that can manage a script. のエラー解決例

## どんなもの？
よく見かける記事によると、（scriptをAdd Componentしようとした時に出る）ファイル名とclass名が一致してないというエラー

...らしいのですが実際は自分の遭遇時はエラーの内容が違った模様だったので記事にしました。

## 結論
該当のファイル以外のコンパイルエラーがあり、先にそちらを解消してからAdd Componentしたらエラーを出さずにscriptをアタッチできました。

## 原因
おそらくAdd Componentのタイミングもコンパイラーが動いていて、エラーを吐いたら一律で`The script don't inherit a native class that can manage a script.`と出すようにしているのからだと思われます。

## 参考
公式の質問板:
https://forum.unity.com/threads/the-script-dont-inherit-a-native-class-that-can-manage-a-script.1011988/page-2
Apple Silicon（M1）でのCocoaPods

# 背景
システムデフォルトのgemのバージョンではM1に対応したモジュールが入らないようだった。
軽くググってみるとRosettaを利用した解決方法しか見つけられなかったが、
どうにも納得いかず更に調べるとバージョン次第でM1対応版が入れられることがわかった。

# 結論
最初に結論を述べると、
各々最新のバージョンを入れればRosettaを利用しなくてもCocoaPodsは使える！

# 手順
メモのため冗長になっているところもあるがご理解いただきたい。

## 1. homebrewのインストール
環境によってコマンドが変わるかもしれないので、コマンド自体は[公式](https://brew.sh/index_ja)を参照

## 2. rbenvのインストール
```bash
$ brew install rbenv ruby-build
$ brew upgrade rbenv ruby-build
$ echo 'eval "$(rbenv init -)"' >> ~/.zprofile
$ source ~/.zprofile
```

## 3. rubyのインストール
```bash
$ rbenv install 3.0.1
$ rbenv rehash
$ rbenv global 3.0.1
$ rbenv rehash
$ ruby -v  # ここで3.0.1になっていればOK
$ which gem   # ここで「/Users/[アカウント名]/.rbenv/shims/gem」になっていればOK
```

## 4. CocoaPodsの実行
```bash
$ gem update
$ gem install cocoapods
$ rbenv rehash
$ which pod    # ここで「/Users/[アカウント名]/.rbenv/shims/pod」になっていればOK
```

## 5. podの実行
無事に実行できました

```bash
$ pod install
Analyzing dependencies
Adding spec repo `trunk` with CDN `https://cdn.cocoapods.org/`
Downloading dependencies
Installing SwiftGen (6.4.0)
Generating Pods project
Integrating client project

[!] Please close any current Xcode sessions and use `Test.xcworkspace` for this project from now on.
Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.
```
XpdfReaderでPDFから日本語を抽出する方法（さくらのレンタルサーバ）

# 概要

さくらのレンタルサーバ（FreeBSD）で、PDF ファイルから日本語をテキストとして抽出するには、一般ユーザ権限で XpdfReader をセットアップします。

これは、「[PHP - サーバーでPHPのexec関数を実行したい｜teratail](https://teratail.com/questions/338957#reply-466978) に対する私の回答内容から、解決手順を改めて整理・記録・共有するものです。

# 解説

[XpdfReader](https://www.xpdfreader.com/download.html) とは、オープンソースとして公開され、自由に利用できる [^1] PDF ビュアーであり、テキストや画像も変換できるコマンドラインツール群もあります。

この、コマンドラインツールは Windows、Linux、macOS に対応したバイナリが配布されていますが、FreeBSD では配布されていません。

FreeBSD では、 ports を使って Xpdf 関連パッケージが配布されているため、 root 権限がある環境であれば ports で比較的手軽にセットアップできます。

しかし、さくらのレンタルサーバのスタンダート等では、SSH でサーバにログインできるものの、 root 権限がありません。ports が使えない場合は、選択肢として2つあります。

- FreeBSD のパッケージがあれば、それをダウンロードして展開する
- ソースコードからツール群をコンパイルし、実行可能にする

今回は ports で配布されているバイナリがありますので、特段理由がなければ、そのバイナリをそのまま利用します。

[^1]: GPLv2 および GPLv3 の元にソースコードが公開 https://www.xpdfreader.com/opensource.html

# PDF から日本語を抽出する手順

## XpdfReader のセットアップ

FreeBSD 向けのバイナリを含むパッケージ（PDF からテキストを抽出するツール `pdftotext` を含む）があります。パッケージをダウンロードし、展開すると、コマンドは利用可能になります。 

以下の例では `/home/ユーザ名/usr/local/libexec` に展開しています。必要であれば、環境にあわせて書き換えます。

```shell-session
% wget https://pkg.freebsd.org/FreeBSD:12:amd64/quarterly/All/xpdf-4.02,1.txz
% tar xvfz xpdf-4.02,1.txz
% ./usr/local/libexec/xpdf/pdftotext -v
pdftotext version 4.02
Copyright 1996-2019 Glyph & Cog, LLC
```

これで、 PDF から文字を抽出する `pdftotext` コマンドが利用可能になりました。


## 日本語への対応

初期状態では英語の PDF にしか対応していません。そのため、日本語に対応するためのパッケージも、あわせてセットアップします

```shell-session
% wget https://pkg.freebsd.org/FreeBSD:12:amd64/quarterly/All/ja-xpdf-jafont-4.02.txz
% tar xvfz ja-xpdf-jafont-4.02.txz
```

このコマンドを仮に `/home/example/` で実行したいとしますと（ `example` は実際のログインユーザ名に置き換えてお考えください）、 `/home/example/usr/local/share/xpdf/japanese/` 以下に ShiftJIS を扱うために必要な `Shift-JIS.unicodeMap` などのファイルが展開されます。

次に、 `~/.xpdfrc` ファイルを作成するか、既に有る場合は、以下の記述を追加します。※ /home/example/ 以下は、実際のサーバ上のパスを指定します。 

```~/.xpdfrc
unicodeMap Shift-JIS /home/example/usr/local/share/xpdf/japanese/Shift-JIS.unicodeMap
```

（参考：ISO-2022-JP や EUC-JP に対応する場合は、同様に記述の追加が必要です。詳細はパッケージ同梱の `dot.xpdfrc` を参照）

```
% cat dot.xpdfrc
#Japanese PDF resources
cidToUnicode    Adobe-Japan1    /usr/local/share/xpdf/japanese/Adobe-Japan1.cidToUnicode
unicodeMap      ISO-2022-JP     /usr/local/share/xpdf/japanese/ISO-2022-JP.unicodeMap
unicodeMap      EUC-JP          /usr/local/share/xpdf/japanese/EUC-JP.unicodeMap
unicodeMap      Shift-JIS       /usr/local/share/xpdf/japanese/Shift-JIS.unicodeMap
cMapDir         Adobe-Japan1    /usr/local/share/xpdf/japanese/CMap
toUnicodeDir                    /usr/local/share/xpdf/japanese/CMap
```


それから、コマンドラインでの実行をお試しください。

たとえば、次のようにコマンドラインを実行すると、 PDF の変更ができるかどうかを確認できます。 

実行例： `test.pdf` （「これはテストです」という文字がある）から `output.txt` に抽出

```shell-session
% ./usr/local/libexec/xpdf/pdftotext -enc Shift-JIS -raw ./test.pdf output.txt
Config Error: No paper information available - using defaults
% cat output.txt
これはテストです。
```

ただし、「これはテストです」の文字が Shift JIS 形式でターミナル画面に表示されるため、ターミナルが UTF-8 など Shit JIS でなければ文字化けして見えるので注意が必要です。

Enjoy!

# 参考

- [PHP - サーバーでPHPのexec関数を実行したい｜teratail](https://teratail.com/questions/338957#reply-466978)
画面の端へドラッグした時に最大化になるのを無効にする

[画面の端へドラッグした時に最大化になるのを無効にする | Windows 10 | 初心者のためのOffice講座](https://hamachan.info/win10/win/aero.html)

［システム］をクリックか
Windows10の設定を表示するショートカットキーは、［Windows］+［i］

［マルチタスク］をクリックします。
そして、［ウインドウを画面の横または隅にドラッグしたときに自動的に整列する］をオフにします。

なんか毎回PCを新しくするたびにググっていたのqiitaにメモ失礼いいたします。
リレーショナルデータベースにおける「正規化」を大急ぎで復習したい方向けの記事

# 読者対象

- 明日までにリレーショナルデータベースにおける第1～3正規化を自信もってできるようにならないといけない人
- 「昔勉強したけど今はちゃんとは覚えてないや」って人
- 記事では「カラムAが決まればカラムBは自動的に決まる」ってときに$B = f(A)$と表現しますが、こういった表現を自然に理解できる人

# コンテンツ
画像にまとめました。A4サイズなどにプリントしてお使いください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/89adfe95-5f75-eaad-660a-5e503c2dd521.png)

# 参考、表の出典
http://sql.main.jp/
Pyenvで"WARNING: `pyenv init -` no longer sets PATH."が出たので直した

# 使用PC
macOS
(Windowsは知らん)
# Pyenv
Pythonのバージョン管理。HomeBrewでインストールしている。
# 症状
下記のWARNINGが出力される

```shell
WARNING: `pyenv init -` no longer sets PATH.
Run `pyenv init` to see the necessary changes to make to your configuration.
```

# 治療

```shell
# before
export PYENV_ROOT='/usr/local/var/pyenv'
export PATH="$PYENV_ROOT/bin:$PATH"
if command -v pyenv 1>/dev/null 2>&1; then
   eval "$(pyenv init -)"
fi

# after
export PYENV_ROOT='/usr/local/var/pyenv'
export PATH="$PYENV_ROOT/bin:$PATH"
if command -v pyenv 1>/dev/null 2>&1; then
   eval "$(pyenv init --path)"
fi
```
Laravel6 でログイン機能を作成してみた。

Laravelでは簡単に認証が実装できます。私自身、あまり触ったことないですが、短時間で実装することが出来ましたので参考にしていただければ幸いです。

今回作成するのは`Laravel6`の実装方法になりますのでバージョンが違う場合は、上手くかない事がありますので公式ページをご確認下さい。
[こちら](https://readouble.com/laravel/6.x/ja/authentication.html)
#環境

- MAMP
- PHP 7.3.24
- Laravel Framework 6.20.27
- npm 6.14.10
- composer

#プロジェクト作成
```
$ composer create-project "laravel/laravel=6.*" --prefer-dist アプリ名
```

```:.env
DB_DATABASE=任意のデータベース名
DB_USERNAME=root
DB_PASSWORD=root
DB_SOCKET='/Applications/MAMP/tmp/mysql/mysql.sock'
```
MAMPを起動してphpMyAdminでデータベースを作成してください。
`データベース名`と`.nev`の`DB_DATABASE=任意のデータベース名`は同じにしてください。
![phpMyadminデータベース作成の写真です](https://user-images.githubusercontent.com/66851090/119419112-75f6f500-bd34-11eb-9d72-247d8a3b4de0.png)

既に`migrationファイル`が生成されていますのでテーブルの作成していきます。

```
$ php artisan migrate
```

ここまで作成したらLaravelの初期画面が生成されていますのでご確認ください。
`php artisan serve`を実行し、サーバーが立ち上がりますのでブラウザから確認できます。

```
$ php artisan serve
Laravel development server started: http://123.0.0.1:8000
```
---
![Laravelの初期画面](https://user-images.githubusercontent.com/66851090/119419645-b145f380-bd35-11eb-9547-ae768fe929c3.png)
---
この様に表示されていたら成功です。サーバーは止めて頂いて、次は`laravel/ui`を導入しています。
これをすることで認証機能を簡単に作成してくれます。


#laravel/uiの導入
```
$ composer require laravel/ui "^1.2"
```
```
$ php artisan ui vue --auth


Vue scaffolding installed successfully.
Please run "npm install && npm run dev" to compile your fresh scaffolding.
Authentication scaffolding generated successfully.
```

`php artisan ui vue --auth`を実行し、完了しますと`Please run "npm install && npm run dev"`と言われますので
`npm install && npm run dev`を実行します。

エラーになる場合は、一つずつ実行し、確認しながら実行した方がいいです。

```
$ npm install
$ npm run dev
````

導入が成功したら右上にLOGINと表示されています。これで完成です。

![Lravel/ui](https://user-images.githubusercontent.com/66851090/119420091-9d4ec180-bd36-11eb-9431-3ee91fd54f85.png)

#参考
[Laravel公式サイト](https://readouble.com/laravel/6.x/ja/authentication.html)
URI, URL, URN の違い

## 勉強前イメージ

URLはhttps://xxxxでしょ？
それ以外実はよくわかってない

## 調査

### URL

Uniform Resource Locator の略で、
インターネット上に存在するファイルの `場所` を示すものです。
`https://` と記載されるものです。

### URN

Uniform Resource Name の略で、
インターネット上に存在するファイルの `名前` を示すものです。
`urn:xxxxxx` と記載されるものです。

### URI

Uniform Resource Identifier の略で、
インターネット上に存在するファイルを識別する総称のことです。
識別するには、 `URL(場所)` と `URN(名前)` が必要になります。
`URI = URL + URN` という関係性になっています。

## 勉強後イメージ

正直URNって見たことないかも。
たまにURLのことURIって書いてるところもあるけど、あながち間違ってないのか

## 参考

- [URLとURIの違いとは！今更聞けないWebの基礎知識を解説します！](https://www.geekly.co.jp/column/cat-webgame/1911_012/)
- [URL・URI・URNとは？それぞれの違いや意味をご紹介](https://mediaexceed.co.jp/markeblog/26864/)
【Angular】RxJSの理解

#RxJSとは
* **リアクティブプログラミング**を行うJavaScriptライブラリです

###リアクティブプログラミング
* 流れてくるデータ（ストリーム）に関連性と操作を宣言的に記述する手法のことです
    * 非同期処理で流れてくるデータを扱うのに効果的です
* ストリームは`Observable`クラスで扱います 

###Observable
* `Observable`はストリームを扱うクラスです
    * 例：マウス操作やHTTPリクエストでデータ取得するなど
* ストリームは川の様なイメージです🌊
    * `Observable`を使うことで、ユーザがデータを川にながし、流れてくるものを途中で拾って加工したり並び替えたりするという処理を行うことができます🏊‍♀️

###オペレータ
* 川（Stream）の中間で処理する仕組みをオペレータといいます
    * `pipe`メソッドの中で指定している関数がオペレータです
* `subscribe` メソッドで、流れてきたデータを下流でキャッチして、オブジェクト間のデータのやり取りをします

#実際の流れ
1. 返り値のObservableで川を作って上流からデータを流す (この段階ではまだデータは流れていない)

```ts
gettMembers(): Observable<Member[]>{ // 非同期処理のため、rxjsを使用  
  return this.http.get<Member[]>(this.membersUrl)
    .pipe(                            // 中間処理は上から実行
      tap(members => this.log('猫一覧データを取得しました！ (データ取得後に表示してるよん)')), // 取得したことを確認
      catchError(this.handleError<Member[]>('getMembers', [])) // 取得失敗時に実行
    ); 
}
```

2. Observableのsubscribe メソッドで川の流れを発生させて、流れてくるデータを受けます (subscribe()して初めてリクエストが実行できる)

```ts
getMembers(): void{
  this.memberService.getMembers()
    .subscribe(members => this.members = members.slice(1, 5));
}
```


## subscribeメソッドの中身
* 1引数：データ取得時のcallback
* 2引数：エラー時
* 3引数：処理完了時のcallback


```ts
observable.subscribe(
    value=>console.log(value);
    err => {},
    () => console.log('finish!!')
);
```

## async pipe
* Observableをテンプレートで展開する仕組みです
* `subscribe()`は実行せず、テンプレート側で自動でデータを受け取ることができます
* 流れるデータを表示するだけのときに使いやすいです

```html
<li *ngFor="let cat of cats$ |async">
  <a routerLink="/member/{{cat.name}}">{{cat.name}}</a>
</li>
```
加工

library(readxl)
#データ読み込み
parts<-read_excel("./d_parts.xlsx")
d_date<-read_excel("./d_date.xlsx")
d_res<-read_excel("./d_res.xlsx")
d_res_t<-read_excel("./d_res_t.xlsx")
forecast_date<-read_excel("./forecast_date.xlsx")

#対象リスト確認
parts_list<-parts$parts
d_date_list<-d_date$date
forecast_date_list<-forecast_date$date

#大外ループ
for (parts_name in parts_list) {
  print(parts_name)
  
  #内ループ
  for (date_time in forecast_date_list) {
    print(as.Date.POSIXct(date_time))
    
    tar_date<-as.Date.POSIXct(date_time)
    
    #パターン①過去3か月の平均値を予測値
    #x月間のデータを使う
    cal_term<-3
    
    term_res<-data.frame()
    for(term_num in cal_term:1){
      #x月前の読み込み
      #月データから、x月前のデータを取得
      #データリストの中でx月の位置
      tar_month_num<-(1:length(d_date_list))[as.Date(d_date_list[1:length(d_date_list)]) == as.Date(tar_date)]
      tar_before_month_num<-tar_month-term_num
      #x月前月の値
      tar_before_month<-d_date_list[tar_before_month_num]
      
      #x月前の数
      term_d_res<-d_res_t[d_res_t$parts==tar_before_month,parts_name]
      term_d_res_table<-data.frame(tar_before_month,term_d_res)
      
      #計算用データテーブルに保存
      term_res<-rbind(term_res,term_d_res_table)
    }
    
    colnames(term_res)<-c("date","d")
    
    ave(term_res$d)
    
    d_res_t[as.Date(d_res_t$parts)==as.Date(tar_date),parts_name]
    
    class(d_res_t$parts)
    class(tar_date)
    
    #当月予測
    
  }
  
}

for (time_list in date_list) {
  
  print(as.Date.POSIXct(time_list))
  
}
ReactとDjangoでGoogle OAuthログイン【前編】Google Developer ConsoleからクライアントIDとクライアントシークレットを取得する

本記事は、[Ashutosh Panda](https://iamashutoshpanda.medium.com/)氏による「[Google Login with Django & React --- Part 1](https://iamashutoshpanda.medium.com/google-login-with-django-react-part-1-c189bc69a999)」（2021年4月23日公開）の和訳を、著者の許可を得て掲載しているものです。

■シリーズ内容
【前編】Google Developer ConsoleからクライアントIDとクライアントシークレットを取得する
【中編】[Django Rest Frameworkバックエンドを作成する](https://qiita.com/baby-degu/items/51ab5c14ed6af23190e3)
【後編】[Reactアプリを作成する](https://qiita.com/baby-degu/items/6332e21453a9e835fee9)

#Google Developer ConsoleからクライアントIDとクライアントシークレットを取得する
>ReactとDjango Rest FrameworkでGoogle Oauth 2.0を使う方法を確認してみよう。

![](https://miro.medium.com/max/1572/1*rf7K_FsdYWmez3kMayMKBQ.png)
ソースコード：<https://github.com/aashutoshPanda/google-oauth-django-react>

##ステップ1：<https://console.cloud.google.com/>で新しいプロジェクトを作成する

![](https://miro.medium.com/max/700/1*N1qXmWUmI7Bd9NUidwMrqQ.png)
>「プロジェクトを作成」をクリックして、新しいプロジェクトを作成する。

![](https://miro.medium.com/max/700/1*erTwDuG99gYIXuCeeRoF1A.png)
>「作成」をクリックして、プロジェクトを作成する。

##ステップ2：OAuth画面を設定する

「認証情報を作成」をクリックし、「OAuthクライアントID」を選択します。次の画面で「同意画面を構成」をクリックします。

![](https://miro.medium.com/max/700/1*0LVeFpig3_75ud_RtUjzZg.png)
>「同意画面を構成」をクリックする。

![](https://miro.medium.com/max/607/1*aL5NkcMxoo7TE_IAyZiIaA.png)
>「作成」をクリックする。

次の画面でアプリケーション名（例：OAuth Demo）、サポートメール、デベロッパーの連絡先情報を入力し、他の項目は空のままにします。それ以降の画面では、他の項目は何も変更しません。

##ステップ3：クライアントIDとクライアントシークレットを作成する

![](https://miro.medium.com/max/700/1*lYWdTyVmc_4AGtTzbxha9g.png)

ダッシュボードで「認証情報を作成」をクリックし、「OAuthクライアントID」を選択します。以下の項目を選択／入力します。

-   アプリケーションの種類：ウェブアプリケーション
-   名前：Oauth Demo
-   承認済みのリダイレクトURI：[http://localhost:3000](http://localhost:3000/)

注：[localhost:3000](http://localhost:3000/)の後に「/」はつけません。

##ステップ4：クライアントIDとクライアントシークレットをどこかにコピーする

![](https://miro.medium.com/max/597/1*s9DEwUMRXUEkwzSwz9jDmg.png)
>クライアントIDとクライアントシークレットをコピーする。

これで「前編」は終わりです。
この記事が少しでもお役に立てれば嬉しいです✌️

##翻訳協力

この記事は以下の方々のご協力により公開する事ができました。改めて感謝致します。

Original Author: [Ashutosh Panda](https://iamashutoshpanda.medium.com/)
Original Article: [Google Login with Django & React --- Part 1](https://iamashutoshpanda.medium.com/google-login-with-django-react-part-1-c189bc69a999)
Thank you for letting us share your knowledge!

選定担当: @gracen
翻訳担当: @gracen
監査担当: -
公開担当: @gracen

##ご意見・ご感想をお待ちしております
今回の記事はいかがでしたか？
・こういう記事が読みたい
・こういうところが良かった
・こうした方が良いのではないか
などなど、率直なご意見を募集しております。
頂いたお声は、今後の記事の質向上に役立たせて頂きますので、お気軽に
コメント欄にてご投稿ください。[Twitter](https://twitter.com/BabyDegu?lang=ja)でもご意見を受け付けております。
皆様のメッセージをお待ちしております。
統計学1(基礎概念とサンプリング)

統計検定2級のための備忘録
参考テキスト
[『コアテキスト　統計学』]
(https://www.amazon.co.jp/%E3%82%B3%E3%82%A2%E3%83%BB%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E7%B5%B1%E8%A8%88%E5%AD%A6-%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E7%B5%8C%E6%B8%88%E5%AD%A6%E3%82%B3%E3%82%A2%E3%83%BB%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-%E6%9C%80%E5%85%88%E7%AB%AF-%E5%A4%A7%E5%B1%8B-%E5%B9%B8%E8%BC%94/dp/4883841782)

変動係数
→ばらつきと調べる時に有効

```math
変動係数=\frac{標準偏差}{平均}
```

```math
変動係数=\frac{\sqrt{\frac{1}{n}\sum_{n=1}^{i}(n_i-\bar{n})}}{\bar{n}}
```

標準化
→平均0、分散1にデータを変換する

```math
標準化=\frac{X_iを平均で引く}{標準偏差}
```

```math
Z_i=\frac{x_i-\bar{x}}{\sqrt{\frac{1}{n}\sum_{n=1}^{i}(n_i-\bar{n})}}
```

歪度(skewness)
→分布の歪みを調べる


```math
歪度=\frac{1}{n}\sum_{i=1}^{n}({\frac{x_i-\bar{x}}{s}})^3
```

```math
歪度=\frac{1}{n}\sum_{i=1}^{n}({z_i})^3
```

$歪度=0$なら分布は対称
$歪度>0$なら右に裾が長い分布
$歪度<0$なら左に裾が長い分布


尖度(kurtosis)
→分布の尖りを調べる


```math
尖度=\frac{1}{n}\sum_{i=1}^{n}({\frac{x_i-\bar{x}}{s}})^4
```

```math
尖度=\frac{1}{n}\sum_{i=1}^{n}({z_i})^4
```

サンプリング
→標本から母集団の特徴を掴むために行う

1.有意抽出法
標本を調査者が意図的に選び出す方法
ランダムサンプリングよりもコストがかからないため継続的な調査に向いている

2.ランダム・サンプリング
→母集団からランダムに抽出しているため、標本は互いに独立している
<1>単純ランダムサンプリング
対象者に通し番号をつけ(抽出台帳)、ランダムにサンプリングする

<2>系統的サンプリング
対象者に通し番号をつけ(抽出台帳)、最初はランダムに選ぶ。以降は等間隔に抽出。

<3>多段抽出法
対象エリアを選択。さらに詳細な対象エリアを選択。選ばれた場所からランダムにサンプリングを行う
ex)都道府県を選ぶ→市区町村を選ぶ→ランダムサンプリング

<4>層化抽出法
母集団の属性の比率がわかる時人使用される。その比率をベースにサンプリングを行う。
ex)会社絵の帰属意識調査
営業の男女比が2:1→営業から男女比が2:1になるようにn人ランダムサンプリングを行う
Unityで簡単な玉転がしをしてみる(1:ボード動かし編)

初めて記事を書きます。どうもです。
最近、何度も挫折しかけたUnityで簡単なゲームを作ろうを奮闘しています。
ほんとーに簡単なものですが、現段階までをまとめてみました。
![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569010/7c09334a-16cc-56e3-cc8b-69a68fda9af9.gif)

こんな感じの簡単な玉転がしゲームを作ってますので、載せていきます。
#ボードを動かす
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569010/b9960de3-82bd-7b7a-ff00-78f1eee6685f.png)

3Dオブジェクト上にCubeを配置します。そして横に広げます。
![ezgif.com-gif-maker (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569010/b7be2eb0-24cd-68aa-9547-ed7cfd02b69f.gif)
次に上のように↑↓→←でボードを回転させるスクリプトを紹介します。

```c#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class move_board : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    void Update()
    {
        float sense=0.2f;
        float moveHorizontal=Input.GetAxis("Horizontal");
        float moveVertical=Input.GetAxis("Vertical");

    
        transform.Rotate(moveHorizontal*sense,0,moveVertical*sense);   
    }
}
```

スクリプトの説明をします。

```c#
float moveHorizontal=Input.GetAxis("Horizontal");
float moveVertical=Input.GetAxis("Vertical");
```

ここは、それぞれ上下と右左の入力を取得します。-1~1までの値をとります。

```c#
float sense=0.2f;
~~
transform.Rotate(moveHorizontal*sense,0,moveVertical*sense);
```
※~~は途中のコードを飛ばしていることを示します。
senseとは回転する感度を示す変数です。これをそのままRotateにて掛けます。

#完成
![ezgif.com-gif-maker (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569010/626d1d5f-6657-c823-a34e-dd74e0856b77.gif)

ボードは動かせましたでしょうか？次回はまた更に機能を追加していきます。