OmniAICreator/Qiita-1.07M huggingface dataset:
関係データベースにおける実表と導出表

応用情報技術者平成28年秋期 午前28

関係データベースにおける実表と導出表に関する記述のうち，適切なものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/183fd76e-2560-436a-a191-d882dfecd610.png)


１、導出表は、
1つ以上の基礎となる実表(DBに実データを持つ表)から関係演算・集合演算といったSQL問合せによって作成される仮想的な表全般を指します。

・SELECT文で得られる結果の他にも、
・GROUP BY句や
・WITH句を処理する際に
内部的に作られる一時的な表も導出表の1つです。

・ビューは導出表の一つの形態であり、導出表に名前を付けて実表と同じように参照(条件次第では更新も)できるようにしたものです。

・導出表は実データを持たず、参照・更新要求の度に、実表に関係演算・集合演算を行って作り出されています。

２、
・実表に対する射影，結合などによって導出表が得られる。
⇒○。導出表は、1つ以上の実表に関係演算等を行って得られる表です。

　　・選択(selection) → 行の抽出
　　・射影(projection) → 指定した列を抽出
　　・結合(join) → 複数の表を結合して1つの表にする


・導出表は，データを参照する場合だけに用いる。
⇒×。
　　・UPDATE文やINSERT INTO文において副問合せの結果である導出表を利用することがあるように
　　　参照だけに用いるわけではありません。
　　・また、条件さえ揃えば更新可能なビューを作成することもできます。 ←これは初めて聞いた！吃驚！


・導出表は，複数の実表から得られる表である。
⇒×。必ずしも複数ではなく「1つ以上」の表から得られる表です。

・導出表は，元の実表の列だけからなる。
⇒×。元となる表や他の導出表のデータを組み合わせたり、算術演算や集計関数により得られる列を定義したりすることが可能です。


参照：

https://www.ap-siken.com/kakomon/28_aki/q28.html

更新可能なビューの作成方法
https://qiita.com/jiyu58546526/items/4a355c0080d62f801ef9
【シェル】複数のディレクトリを作成する関数

# はじめに
複数のディレクトリを作るshell関数を自作してみましょう〜


# 1. 準備
ターミナル（windowsの場合、Git Bash）を開いて、以下のコマンドを実行。
.bash_profileにbashrcを読み込むように設定。

```
echo 'source ~/.bashrc' >> ~/.bash_profile
```

# 2.関数の登録
受け取った引数分のフォルダを作る関数を登録

```
echo 'function mymkdir(){ for i in `seq $1 $2`; do mkdir ${i}; done' } >> ~/.bashrc
```

# 3.bashrcの読み込み

```
source ~/.bashrc
```

# 4.実行
フォルダを作りたいディレクトリまでに移動して、以下のコマンド実行。10個ファイルができます。

```
mymkdir 1 10
```


# まとめ
もっとアレンジすれば, 「ファイル名を任意の文字列に変更する」「a〜zでファイル名を作る」など簡単にできます.もう少し踏み込んだもの作りたい方は、以下を参考にしてください。ファイル名も引数で受け取ってもいいのかなと思っている次第です.


# 参考

[bashrc、bash_profileのどっちに書く？](https://qiita.com/magicant/items/d3bb7ea1192e63fba850)
[bashのワンライナーループ]
(https://blog.y-yuki.net/entry/2017/01/06/000000)
[bashのfor文](http://www.koikikukan.com/archives/2014/03/03-015555.php)
[Linuxのseqコマンド](https://webkaru.net/linux/seq-command/)
B+木インデックスの探索回数


応用情報技術者平成28年秋期 午前27

B+木インデックスが定義されている候補キーを利用して，1件のデータを検索するとき，データ総件数Xに対するB+木インデックスを格納するノードへのアクセス回数のオーダを表す式はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/86dd3061-73ce-2d24-085a-76c01684b34b.png)


１、B＋木の例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/b3347b8a-729b-0465-d09a-c7b606b84f4c.png)


B+木インデックスでは探索範囲を1／nに狭めながら検索していきますが、B+木の深さはどの葉でも一定であるため、どの値を探索する場合でもほぼ同じアクセス回数になります。この深さは各節点が持つエントリ数(次数)で決まり、深さがh 、次数がbであるB+木における葉の最大数(X)は次の式で表せます。

　b^h＝X (上の例でいえば3^3＝27)

つまりX件のデータを探索する際のアクセス回数を示す深さhは、

　h＝logb^X


参照：
https://www.ap-siken.com/kakomon/28_aki/q27.html
バージョン管理システム

### バージョン管理システムについて

大きく分けると２つのバージョン管理システムが存在する。
一つ目はSubVersionやCSVなどの集中型バージョン管理システム
二つ目はGitのような分散型のバージョン管理システム

以前では集中型バージョン管理システムが使われていましたが、
源氏ではGitへ移行されており、分散型バージョン管理システムが主流になっています。

### バージョン管理システムに言えること

チーム開発において生産性の高いか開発環境を提供できる

- 変更履歴が残る為、後でどのような作業を行なっていたか経緯を追うことが可能。
- 同じファイルを複数人が同時に変更ができる。
- タグによってリリースの成果物を管理できる。
- 過去の任意のバージョンまで戻すこと（リバート）ができる

上記で簡単にバージョン管理システムについて説明してきましたが、
筆者は現在GitLabの学習をしていますので、これからはそちら
情報を投稿していこうと思います。
ドメインの.comとか.jpってなに？

よく、`https://www.example.co.jp`こういうURL見かけますよね。
この、`www.example.co.jp`の中の`.com`とか`.jp`とかあるけど何が違うんだろう？と思い調べました。

## FQDNの部分のお話

`www` `example` `.co` `.jp` にはそれぞれ別の名前がついているのです。

- .jp : トップレベルドメイン
- .co : セカンドレベルドメイン
- example : サードレベルドメイン
- www : サブドメイン

全て合わせて、`www.example.co.jp`で`FQDN(完全修飾ドメイン名)`と呼ばれます。
ちなみに、よく`ドメインを取る`というのを聞きますが、
`example.co.jp`この部分に対して自分が登録者として登録する ということになります。
`www`の部分は、自分(登録者)で決めることが出来ます。

## トップレベルドメイン、セカンドレベルドメイン、FQDN(完全修飾ドメイン名)とは？

### トップレベルドメイン

トップレベルドメインとは住所で言ったら、`東京都`に当たる部分です

- 一般トップレベルドメイン（gTLD） : 世界のどこからでも取得可能なドメイン `.com` `.net` `.info`
- 国別コードトップレベルドメイン（ccTLD）: 国や地域を表したドメイン
    - 汎用JPドメイン : `.jp`は日本国内に住所を持つ組織・個人・団体が取得可能
    - 属性型JPドメイン : `.jp`で終わるドメインのうち、機関や組織を表したドメイン `.co.jp` `.ne.jp` `.ac.jp`

### セカンドレベルドメイン

セカンドレベルドメインとは住所で言ったら`千代田区`に当たる部分です。
トップレベルドメインにも書かせていただきましたが、以下があります。

- .co : 株式会社、有限会社
- .ne : ネットワークサービス提供者
- .ac : 学校法人・大学
- .ed : 小学校・中学校・高等学校

### FQDN(完全修飾ドメイン名)

FQDNは住所で言ったら`東京都千代田区千代田１−１`になります。(ちなみにこの住所は皇居ですw
省略していない、完璧な住所・ドメイン名ということです。
なので、`www.example.co.jp` の省略していないものをFQDN(Fully Qualified Domain Name)と呼びます。

## 肝心の.comとか.jpってなに？

.com、.jpはトップレベルドメイン。

Q : .comとか.jp以外はないの？
A : あります！

自分でドメインを取得しようとするなら有名なのが[お名前.com](https://www.onamae.com/)
ここには、.comや.jpはもちろん、.xyzなどお安くドメインを登録できます。
また、[freenom](https://www.freenom.com/ja/index.html)では無料でドメインを登録できます。
.tkや.ml、.gaがあり、全部ではないかもしれないですが`国別コードトップレベルドメイン`が多いのでは？と思いました。

## 参考

- [.jpと.comって何が違うの？ドメインを決める時に注意すること](https://www.infact1.co.jp/staff_blog/webmarketing/seo/6852/)
- [ドメイン名の種類](https://www.nic.ad.jp/ja/dom/types.html)
- [ドメインの種類-トップレベルドメイン一覧-](https://domain.sakura.ad.jp/guide/top-level-domain/)
- [ドメイン名とホスト名ってなんだろう？](http://co-akuma.directorz.jp/blog/page/10/)
- [ドメインネームとは？ （初心者向け）](https://domainname.jp/report/beginner)
- [FQDNとは？ドメイン名・ホスト名・IPアドレスとの違い](https://www.kagoya.jp/howto/network/fqdn/)
Google Earth Engineで標高

#概要

Google Earth Engineで、標高、計算してみた。

#写真

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/b0dabf77-17e6-3edf-97f9-6e1354f84228.jpeg)


#サンプルコード

```
var srtm = ee.Image('USGS/SRTMGL1_003');
var pt = ee.Geometry.Point(139.7978, 35.6028);
var lines = ee.List.sequence(0, 4000, 200);
var contourlines = lines.map(function(line) {
	var mycontour = srtm.convolve(ee.Kernel.gaussian(5, 3)).subtract(ee.Image.constant(line)).zeroCrossing().multiply(ee.Image.constant(line)).toFloat();
	return mycontour.mask(mycontour);
});
contourlines = ee.ImageCollection(contourlines).mosaic();
Map.addLayer(contourlines, {
	min: 0, 
	max: 5000, 
	palette: ['00ff00', 'ff0000']
}, 'contours');
Map.centerObject(pt, 7);



```


以上。
Vue v3.0.0リリース記念Code name振り返り

Vue v3.0.0 One Pieceが2020/09/18にリリースされました。
https://github.com/vuejs/vue-next

記念に過去からのCode nameをまとめてみました。


| Version | Code name | 作品名 |
|:-----------|:--------------------------|:----------------------|
| v3.0.0     | One Piece                 | ONE PIECE             |
| v2.6.0     | Macross                   | 超時空要塞マクロス     |
| v2.5.0     | Level E                   | レベルE               |
| v2.4.0     | Kill la Kill              | キルラキル            |
| v2.3.0     | JoJo's Bizarre Adventure  | ジョジョの奇妙な冒険   |
| v2.2.0     | Initial D                 | 頭文字D               |
| v2.1.0     | Hunter X Hunter           | HUNTER×HUNTER         |
| v2.0.0     | Ghost in the Shell        | 攻殻機動隊            |
| v1.0.0     | Evangelion                | 新世紀エヴァンゲリオン |
| v0.12.0    | Dragon Ball               | ドラゴンボール         |
| v0.11.0    | Cowboy Bebop              | カウボーイビバップ     |
| v0.10.0    | Blade Runner              | ブレードランナー       |
| v0.9.0     | Animatrix                 | アニマトリックス       |

命名は見ればわかるようにアニメ好きですね
「F,N」を除いてアルファベット順になっています。
急ににわか認定されそうなものが出てきましたが、基本的に有名どころなので次はどんな作品がくるでしょうか
SMIL(Synchronized Multimedia Integration Language：スマイル)

応用情報技術者平成28年秋期 午前25

動画や音声などのマルチメディアコンテンツのレイアウトや再生のタイミングをXMLフォーマットで記述するためのW3C勧告はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/d43e9807-11b4-2425-1f5b-bca30f4af0a2.png)

１、SMIL(Synchronized Multimedia Integration Language：スマイル)は、
WWW上でマルチメディアを表現するためのXMLベースのマークアップ言語です。通常のHTMLと異なり、時間やレイアウトをコントロールすることができる点が特徴で、「○秒経過後に、▲の位置にコンテンツを表示する」といった制御が可能です。
1997年に登場し、W3Cによって1998年6月にSMIL 1.0として仕様勧告、現在のバージョンはSMIL 3.0です。


サンプル：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/7be731c1-675c-016a-439d-61b888596887.png)

２、
・Ajax
⇒Asynchronous JavaScript + XMLの略。JavaScriptとXMLを組み合わせて、非同期通信とインターフェイスの構築などをWebブラウザ内で行う技術の総称です。

・CSS
⇒Cascading Style Sheetsの略。HTMLの要素を、どのように修飾して表示させるかを定義する文書です。

・SVG
⇒Scalable Vector Graphicsの略。XMLによって記述されたベクターグラフィック言語のこと、あるいは、SVGで記述された画像フォーマットのことです。XMLで記述するためWebブラウザでの閲覧が可能で、W3Cでオープン標準として勧告されています。

※SVG(Scalable Vector Graphics)は、ベクター形式の画像やイメージ，テキストなどの2次元CGをXMLで表現するための規格です。
・画像ファイルと異なりテキスト形式で記述するため、
・作成に専用のアプリケーションを必要とすることもありません。
・またJavascriptなどで記述内容を容易に操作することができるためWebページとの親和性が高く、
・インラインSVGをサポートするHTML5の普及に伴い今後の活用が期待されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/568f382e-2a8d-d209-10bc-aa7db953c99a.png)



参照：

https://www.ap-siken.com/kakomon/28_aki/q25.html

SMIL
https://ja.wikipedia.org/wiki/Synchronized_Multimedia_Integration_Language

SVG(Scalable Vector Graphics)、OpenGL、PNG、TIFF
https://qiita.com/lymansouka2017/items/c8ca71fd7088142f723f
Rails6.0ルーティングまとめ

#はじめに

Rails6.0のルーティングのパス名 resouces resourceなどを忘備録を兼ねてまとめます。


#明示的なルーティング指定

```routes.rb
# ルートへアクセスするルーティング
root 'users#show'
root to 'users#show'
root '/', to: 'users#show'
```

```routes.rb
# '/users/:id'でusersコントローラのshowアクションにルーティング
get '/users/:id', to: 'users#show'
```

```routes.rb
# 'hoge'でusersコントローラのshowにルーティング
# as:オプションを使うとルーティングに名前を指定可能
get '/users/:id', to: 'users#show', as: 'hoge'
```

<%= form_with %><%= link_to %>などでurlを指定する際に、直接/posts/:idなどのurlのように指定可能ですが、変更の際に修正箇所が多くなり得策ではありません。
as:で名前を付けることで、修正しやすくなり、コードも読みやすくなります。

#resourcesとresouceの違い

resources(複数)...7つのアクションがid付きで生成されます。
resource(単数) ...indexアクションを除いた6つのアクションがidなしで生成されます。
「写真」「ユーザー」「商品」のようにアプリケーションに複数存在する場合はresources(複数)
「自身のプロフィール」のように一つしか存在せず、idやindexが必要ない場合はresource(単数)

##resources(複数)

```routes.rb
resources :photos
```
のような記述で、以下の7つのルーティングが生成されます。この場合、いずれもPhotosコントローラに対応します。

|動詞|パス|コントローラ#アクション|目的|
|:-:|:-:|:-:|:-:|
|GET|/photos|photos#index|すべての写真の一覧を表示|
|GET|/photos/new|photos#new|写真を1つ作成するためのHTMLフォームを返す|
|POST|/photos|photos#create|写真を1つ作成する|
|GET|/photos/:id|photos#show|特定の写真を表示する|
|GET|/photos/:id/edit|photos#edit|写真編集用のHTMLフォームを1つ返す|
|PATCH/PUT|/photos/:id|photos#update|特定の写真を更新する|
|DELETE|/photos/:id|photos#destroy|特定の写真を削除する|

##resource(単数)

```routes.rb
resource :geocoder
```
以上の記述で以下の6つのルーティングが生成されます。この場合、いずれもgeocoderに対応します。

|動詞|パス|コントローラ#アクション|目的|
|:-:|:-:|:-:|:-:|
|GET|/geocoder/new|geocoders#new|geocoder作成用のHTMLフォームを返す|
|POST|/geocoder|geocoders#create|geocoderを作成する|
|GET|/geocoder|geocoders#show|1つしかないgeocoderリソースを表示する|
|GET|/geocoder/edit|geocoders#edit|geocoder編集用のHTMLフォームを返す|
|PATCH/PUT|/geocoder|geocoders#update|1つしかないgeocoderリソースを更新する|
|DELETE|/geocoder|geocoders#destroy|geocoderリソースを削除する|

###注意点
Railsのルーティングはルーティングファイルの上から順に実行します。そのため、同じ条件のルーティングが複数存在する場合、上のルーティングのみ有効になります。なお、無関係なURLの場合は順番は関係ありません。

#参考
Railsのルーティング - Railsガイド v6.0
https://railsguides.jp/routing.html
調査で使えるgrepコマンド例【随時更新予定】

# 概要
改修時の影響調査やログ解析を行う際、grepコマンドを用いて調査することが多いと思います。
この記事では、状況ごとに使えるgrepコマンドについてまとめていきます。

# この記事で書かないこと

- コマンドについての詳細な説明
- コマンド実行例

#grepコマンド例

## ソースコード内調査の場合
###gitリポジトリ内でgrepを行う
git管理しているリポジトリ内でgrepを実施する際は、「git grep」コマンドを使用することができます。
以下例では、大文字小文字を区別しない際に使用する「-i」オプションをつけた際のコマンド例を記載しています。

```
git grep -i  'targetWord'
```
####参考
[Git - git-grepDocumentation](https://git-scm.com/docs/git-grep)


## ログ解析の場合
###特定のログレベルのログをgrepしたい


```
//ログレベル「ERROR」のログを出力する
grep ERROR target.log

//ログレベル「ERROR」および「WARN」のログを出力する
grep -e WARN -e ERROR target.log

//ログレベル「INFO」以外のログを出力する
grep -v INFO target.log
```

####参考
[運用や調査でログを確認するときによく使うコマンド集](https://qiita.com/ug23/items/308182bf4e60bc81f04e#grep)


###特定時間帯のログをGrepしたい
正規表現を使うことで特定の時間帯のログをgrepすることができます。
以下では「HH:MM:SS」形式で時刻が出力されているログに対してGrepをかけた想定で記載します。

```
//15時台のログを取得する
grep -E "15:[0-5][0-9]:[0-9][0-9]" target.log

//15時台と16時台のログを取得する
grep -E "1[5,6]:[0-5][0-9]:[0-9][0-9]" target.log
```




### 圧縮ファイルに対してgrepを実施したい
以下大文字小文字を区別しない際に使用する「-i」オプションとgrep結果に行番号を出力する「-n」オプションをつけた場合のコマンド例を記載します。

#### ZIP形式
ZIP形式の場合は「zipgrep」コマンドを使用します。


```
//一つのファイルに対してgrepする場合
zipgrep -i -n keyWord targetFile.zip

//ディレクトリ配下に格納されている全てのファイルに対してgrepする場合
zipgrep -i -n keyWord targetDirectory/*
```
##### 参考
[【 zipgrep 】コマンド――ZIPファイルの中を文字列検索する](https://www.atmarkit.co.jp/ait/articles/1809/20/news026.html)

#### Gz形式
Gz形式の場合は「zgrep」コマンドを使用します。


```
//一つのファイルに対してgrepする場合
zgrep -i -n keyWord targetFile.gz

//ディレクトリ配下に格納されている全てのファイルに対してgrepする場合
zgrep -i -n keyWord targetDirectory/*
```
##### 参考
[zgrep - コマンド (プログラム) の説明 - Linux コマンド集 一覧表](https://kazmax.zpp.jp/cmd/z/zgrep.1.html)

※上記以外のファイル形式については未確認です。確認が取れ次第、更新します。
【TIC-80】ゲーム以下を作りはじめて2年が経った（その２）【Lua】

# はじめに
[【【TIC-80】ゲーム以下を作りはじめて2年が経った【Lua】](https://qiita.com/uokagi/items/ed99048ac4ef28d12027)の続き


「[TIC-80](https://tic.computer/)」（
最近新バージョンのBeta版が公開されました！
**v0.80.1344が正式公開されました！**）を触り始めていつの間にか2年が経っていたので出力したGIFアニメに一言添えて作ったものを振り返ってみる。なおほとんどがゲーム未満の模様。

「TIC-80」は**1ボタン（F9キー）でGIFアニメの出力**ができるので、
**しょーもない思いつきをぱっとドット絵GIFアニメにする**のにすごく向いているツールです！
もちろんゲームも楽に作れます。

### 関連

- [【TIC-80】ゲーム（以下）を作り始めて1年経った（その１）【Lua】](https://qiita.com/uokagi/items/9f6939c71cb1abdc1630)
- [【TIC-80】ゲーム（以下）を作り始めて1年経った（その２）【Lua】](https://qiita.com/uokagi/items/b56949197b56437b20e3)
- [【TIC-80】ゲーム以下を作りはじめて2年が経った（その１）【Lua】](https://qiita.com/uokagi/items/ed99048ac4ef28d12027)
- [【TIC-80】ゲーム以下を作りはじめて2年が経った（その３）【Lua】](https://qiita.com/uokagi/items/4d5a166b7d1eecc3f0e1)


### Vibram8327 の模様パターン再現

![vibram8327_s.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284455/67dbbb0d-c847-67af-c552-b9d4fa3c5064.gif)

- Vibram（靴底会社およびブランド）の型番8327 を一つのパタンとそれを90度回転したものを交互に並べることで再現
- 「TIC-80」ではタイルマップ表示時にタイル毎に回転・反転を指定できるので利用
- 元ネタはこちら「[靴修理屋ゆかり 1足目「サンダルの修理」](https://www.nicovideo.jp/watch/sm36862992#6:34)」

ゲームの背景とかにも使えそうかな？

### 円描画のアルゴリズム比較

![circle_s.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284455/d82c33f9-a60a-7c1d-1b16-a5d25af72d67.gif)

- 円描画にも様々なアルゴリズムがある
- 整数の加減算のみで構成されたものは昔のCPUでも高速に動作
- コードはこちらのものを利用させていただいた（[Draw circle function | Code examples and snipets | TIC-80 Wiki](https://github.com/nesbox/TIC-80/wiki/code-examples-and-snippets#draw-circle-function)）

## 番組の途中ですが(?)

どうやらアップロード画像の容量制限いっぱいになってしまったようなので続きは来月にでもあげます。申し訳ありません。
アルバムコレクションの脆弱性

# 執筆背景
アルバムコレクションという画像共有サイトがあるのだが恐らく作者の意図に反して、__誰でも（ユーザ登録していなくても）__ファイルをダウンロードできてしまう。
AWSの認証周りが問題なのだが、勉強する上で良い題材なので何がまずいのかを解説する。
※執筆時点9/20の状況です
# 記事の中身
- 認証なしでファイルをダウンロードする手順の解説
- 何がまずかったのかの解説
- 改善案の提示

# 認証なしでファイルをダウンロードする手順の解説
### 想定環境
windows10
### 使うツール
- git for windows (https://gitforwindows.org/)
- Google Chrome(ブラウザhttps://www.google.co.jp/chrome/)

### 手順
1. git for windowsをインストールする(選択肢は全てデフォルトでOK)
2. Google Chromeをインストールする
3. Google Chromeでアルバムコレクションにアクセスする
4. ログインせずに受け取る画面でIDを入力して受け取るボタンを押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/744732/b111f903-a197-82ec-2b1e-8f5caf470ebd.png)
5. 出力されたモザイク掛かった画像を右クリックし「検証」を押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/744732/58024711-318a-c05b-e023-dadb5c2a00ce.png)
6. imgと書いてある部分を右クリックして「Copy」→「Copy outerHTML」を押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/744732/22dc6ec8-aeb7-f709-9b69-e4300f8182d6.png)
7. 適当なエディタにコピーした文字を張り付けると下記のような文字列を得ることができる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/744732/76ef55ce-c734-41a1-e52b-8c8157112240.png)
8. 文字列の中からhttps以降thumbより前の_(アンダーバー)までを抜き出す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/744732/f89daf1a-09cc-6adf-fa64-761dc4a0a197.png)
ちなみに_の後に1をつけてURL欄に張り付けると1番目の画像にアクセスできることが分かる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/744732/a0b18c88-9d16-d8ae-b5db-740aae41b390.png)
後続の手順では複数ファイルをまとめて取得するため用意している。
9. PCに適当なフォルダを作り、フォルダ内で右クリックし「Git Bash Here」を押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/744732/3c5847f8-08fe-9a9c-14dc-70cd794c2177.png)
10. gitターミナルからcurlコマンドを発行する。[]の中の数字はファイル数を表しており、例えば19ファイルであれば[1-19]とする

```bash
# curl -O 手順8で抽出した文字列[1-ファイル数]
# 例.ファイル数が19個、手順8の文字列が右記URLの時https://s3-us-west-2.amazonaws.com/file.album-collection.net/a3928lsadgd6e498712c3tirca4ba8b5c3b4974
curl -O https://s3-us-west-2.amazonaws.com/file.album-collection.net/a3928lsadgd6e498712c3tirca4ba8b5c3b4974_[1-19]
```
gitターミナルを開いたフォルダにファイルが保存されているので確認する
そのままだとファイル名が長すぎるのと、拡張子がうまく付いていないので下記コマンドを入れる。
ファイル名を変えているのとファイルサイズに応じて拡張子(jpgまたはmp4)を付けている

```bash
i=1
for file in `ls`
do
  size=`ls -l $file | awk '{print $5}'`
  if [ $size -lt 300000 ] ; then
    mv ${file} ${i}.jpg
  else
    mv ${file} ${i}.mp4
  fi
  i=$((i+1))
done
exit
```

# 何がまずかったのか
2つの悪さがあると考えられる

1. アクセス制御がない（URLが分かればファイルが取得できてしまう）
ファイルにアクセス制御がなく誰にでも公開された状態になってしまっている。URL情報からS3を使っていることが明確だが、折角のS3なので署名付きURLなどを使いアクセス制御すべきであるが、それがないところが問題。

2. アクセス先URLが容易に推測できる
たとえアクセス制御がなかったとしてもアクセス先URLが分からなければ容易にはファイルにたどり着けない。本件ではアクセス先URLが容易に推測できてしまうところが問題。

# 改善案の提示
ほぼ上記で記載している内容だが、最善策はS3の署名付きURLを使ってアクセス制御をすると誰でもファイルが取得できる状態が回避できる。
次策はアクセス先URLの生成を工夫し、推測できないようなURLを生成することを提案する。
また、ビジネスよりの話になるが、利用規約に同意していない人がファイルをダウンロードできてしまう状態なので、モザイク版についても利用規約に同意した人だけが実施できるようAPIGatewayの認可の仕組みを取り入れるという改善の余地があると考えている。
化学反応でオイラー法

#数値計算やりたい
数学弱いけど数値計算やってみたい
数値計算は暗黙知的なノウハウが研究室に脈々と伝承され続けてるって聞くけど
極めるには独学じゃ無理かな

#化学反応のシミュレーション
物質Aが一次反応で消失していく場合を考える


```math
\frac{d[A]}{dt} = -k[A]
```

##オイラー法
オイラー法は次の漸化式を解く
$h$は刻み幅、$ \ f(t, y)=\frac{dy}{dt}  $である

```math
y_{n+1}=y_{n}+h*f(t,y)
```

上記の化学反応に当てはめると、次のように表せる

```math
\begin{align}
[A]_{t+1}&=[A]_{t}+h(-k[A]_{t}) \\
&=[A]_t(1-kh)
\end{align}
```
pythonコードはこうなる

```python:euler.py
log=[A]
for i in range(step):
    A=A*(1-k*h)
    log.append(A)
```

##修正オイラー法
修正オイラー法は次の漸化式を解く
$h$は刻み幅、$ \ f(t, y)=\frac{dy}{dt}  $である

```math
y_{n+1}=y_{n}+\frac{h}{2}(f(t,y)+f(t+1,y+1))
```

上記の化学反応に当てはめると、次のように表せる

```math
[A]_{t+1}=[A]_{t}+\frac{h}{2}(-k[A]_{t}-k[A]_{t+1})
```

```math
(1+\frac{h}{2}k)[A]_{t+1}=(1-\frac{h}{2}k)[A]_{t}
```

```math
[A]_{t+1}=\frac{(1-\frac{h}{2}k)}{(1+\frac{h}{2}k)}[A]_{t}
```

pythonコードはこうなる

```python:modified_euler.py
log2=[AA]
for _ in range(step):
    AA=AA*(1-k*h/2)/(1+k*h/2)
    log2.append(AA)
```

#結果
以下のコードを実行

```python:main.py
import matplotlib.pyplot as plt

#初期値・定数記述
A=1
AA=1
h=1
k=0.3
step=20

log=[A]
log2=[AA]

for i in range(step):
    A=A*(1-k*h)
    log.append(A)

    AA=AA*(1-k*h/2)/(1+k*h/2)
    log2.append(AA)

plt.plot([i for i in range(step+1)],[math.e**(-k*t*h) for t in range(step+1)],label="Exact_solution")
plt.plot([i for i in range(step+1)],log,label="Euler")
plt.plot([i for i in range(step+1)],log2,label="Modified-Euler")
plt.legend()
```

![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/476342/213ad5cf-00da-5b1e-ea48-c59ae3b6701c.png)

オイラー法は若干下方向にずれているのに対して、修正オイラー法は厳密解とほぼ重なっている

#まとめ
修正オイラー法の威力が実感できてよかった
式変形あってるか自信ない
あとでルンゲクッタとかもやるかも
プロセス(コマンドの実行)をファイルとして他のプロセスと連携する

## Process Substitution
GNU Bash Manual [3.5.6 Process Substitution](https://www.gnu.org/software/bash/manual/html_node/Process-Substitution.html#Process-Substitution)
### `>(list)`
プロセスをファイルとして、そこに他のstdout/stderrを書き出せる。

```
$ cat <<EOF > >(grep -v b)
> a
> b
> c
> EOF
a
c
```

1. `grep -v b`がasyncに実行され、/dev/fd/xxx (xxxは番号)のファイルとして待ち構えている
1. catのstdoutをファイル( `>(...)`で実行されているプロセス)にリダイレクト
1. catからリダイレクトされた3行がファイル = "grepのプロセス"に書き込まれる
1. `b`以外の`a`、`c`がgrepのプロセスによって出力される

`run_app.sh 2> >(tee log)`のようにすれば、run_app.shのプロセスのstdoutはそのまま出力され、stderrをteeプロセスに書き込みながらlogにも保存できる。
run_app.sh実行時は`error yyy`(stderr)、`info xxx`(stdout)の順のだとしても、run_app.shのstdoutとteeのstdoutは出力順が前後することがあるのは、process substitutionで実行されたプロセスはasyncに実行されるため。

### `<(list)`
プロセスのstdout/stderrをファイルとして、そのファイルを他のコマンドの引数にできる。

```
$ A="a
b
c"
$ B="a
x
c"
$ diff -u <(echo "$A") <(echo "$B")
--- /dev/fd/63	2020-09-26 07:12:48.000000000 +0900
+++ /dev/fd/62	2020-09-26 07:12:48.000000000 +0900
@@ -1,3 +1,3 @@
 a
-b
+x
 c
```

結果からわかるように`echo "$A"`の出力が/dev/fd/63というファイルとして保存され、そのファイルをdiffの1つ目のファイルとしている。
`<(...)`で実行されるプロセスが重い場合、ファイルのEOF = プロセスの終了まで読むのでブロッキングが発生する。複数の`<(...)`を一度に実行(上のdiffはその例)してもすべてasyncに実行されるので待ちの最大は一番重いプロセスの実行時間となる。

### Note
* `< (`とスペースを空けるとsyntax error (そりゃそうだ。redirectionじゃない。)
* multilinesのvariableに対し、`echo $A`と`echo "$A"`の違いにつまずきがち
Datastoreの対象プロパティから組み込みインデックスを除外する

## 前提

- Datastoreのインデックスはは2種に分類されるが、ここでは組み込みインデックスについてのみ取り上げる。
- サンプルコードはGoを利用する。

## インデックスの付与・除外

デフォルトではプロパティに自動的に付与される。タグを付与することで除外できる。除外しても既存プロパティのインデックスが削除されるわけではない。

```go
type Task struct {
        Category        string
        Done            bool
        Priority        int
        Description     string `datastore:",noindex"`
        PercentComplete float64
        Created         time.Time
}
task := &Task{
        Category:        "Personal",
        Done:            false,
        Priority:        4,
        Description:     "Learn Cloud Datastore",
        PercentComplete: 10.0,
        Created:         time.Now(),
}
```

## 組み込みインデックス対象かを確認する

いずれもGCPコンソールから確認することができる。

- GCPコンソール > データストア > エンティティ > GQL
- GCPコンソール > データストア > ダッシュボード

### GQL

組み込みインデックスから除外されている場合は、結果は返却されない。

```sql
SELECT * FROM `kind` WHERE <property_name> = "<value>"
```

### 統計情報

更新時間は約24~48時間とされているため即時確認はできないので注意が必要。（参考：[Consoleで統計情報を表示する](https://cloud.google.com/datastore/docs/console/datastore-statistics?hl=ja)）

## 組み込みインデックスのデータサイズ

[インデックス エントリのサイズ](https://cloud.google.com/datastore/docs/concepts/storage-size?hl=ja#index_entry_size)にある通り、エンティティのデータサイズの2倍のサイズが割り当てられる。

## 所感・課題

結果として公式リファレンスにある通りだが、複合インデックスの解説は多く取り上げられていた分、組み込みインデックスの解説が探しづらかったので整理した。インデックス付与対象のプロパティから除外する場合、過去の不要なインデックスは削除したくなるが、方法が見当たらなかった。

## 参考

* [インデックス](https://cloud.google.com/datastore/docs/concepts/indexes?hl=ja)
Sketchの画像ファイルをFlutterのコードに落とし込む

最近、FlutterでiOS/Androidアプリ開発を行っております。
そこで、`.sketch`ファイル（画像）を用いて、Flutterで使用しているDart言語に変換する事が可能であることを知ることができました。


## 手順
ちなみに今回の掲題の方法は、`macOS`で確認が取れております。


### １．Supernovaをインストールする
今回の目玉であるSketchの画像ファイルをFlutterのコードに落とし込む方法は、
「Supernova」というツールを使って行う必要があります。（以下、ダウンロード画面）

https://legacy.supernova.io/

### ２．Supernovaを起動し、.sketchファイルをインポートする
![520617FF-8E6C-4C1E-8CBA-AACB80B48ED6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425008/5829a232-9531-ac80-5a5c-3522a6d83091.png)


上掲画像の赤枠部分を押下し、スタイルとして読み込みたい「.sketch」ファイルを選択し、インポートします。


### ３．Dart言語に変換する予定の画像を選択する
次に、画像を選択することができるタブが開きますので、
ここでDart言語に変換する予定の画像を選択していきます。

![4B9C4AD4-0F82-4D11-A2DB-721ABD131C42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425008/31e6a8cd-7b94-e9f5-18d1-19b0f3b39ad7.png)


`Shiftキー`にて、複数の画像をいっぺんに選択することもできます。


### ４．コードプレビューボタンを押下して、Dart言語を表示する
![937F86DB-28BD-49D5-B8BF-CF8BD2FA91E8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425008/dbf07b03-f1ba-c5b6-51b7-3390294585f6.png)


上掲画像の赤枠部分を押下します。
すると、上掲画像の右側のように、Dart言語が表示されています。

ちなみに、上掲黄色枠部分の設定ボタンで、Dart言語や他の言語に変換するときの設定を変更することができます。

インデントのスペース数や、行間の有無を決めることができるので、
この設定で、実際のソースコードに落とし込むときにいくらか修正する部分が減りそうです:relaxed:
FrontEndのいくつ技術の用途の取り纏め

FrontEndではいろいろな技術が創造されています。その中に、幅広く使ったものはHTML、JavaScript、CSS、DynamicHTML、DOM、AJAXです。
以下、用途により、説明します。
##HTMLの用途はなんですか##
今はWEB開発が流行しています。WEB開発以前はデスクトップアプリケーションが流行でした。WEB開発に変わってから、何の技術でブラウザにコンポーネントを表示しますか、画面でどのような効果を表示しますか。
この場合、HTMLが登場しました。
HTMLでは、テキストコンポーネント、ボタンコンポーネントが定義されています。文字色、背景色が指定できます。script、cssも組み込めます。
つまり、以下の二点の用途があります。
・画面でデータの輸出と輸入及びユーザ体験のために効果の表示
・script、cssなどほかの技術のインターフェースを持つ
##JavaScriptの用途はなんですか##
HTMLで生成されたページが固定です。変えたい場合、JavaScriptを使ったほうがいいです。例えば、検索した結果、一般的に、テーブル見たいなフォーマットで結果を表示します。JavaScriptを使って、表示する結果が
変わられます、しかも、表示するタイトルも変わられます。
用途にて、以下があります。
・ブラウザ自体の状況をコントロール
・入力したコンポーネントの値をチェック
・変わる結果を表示
下の二点に対してはサーバ側でも実現できるんですが、JavaScriptのほうでサーバ側へ通信の回数が少なくなって、通信のデータ量が少なくなりました。
##CSSの用途はなんですか##
画面の色、フォーマットなどstyleを設計する
##DynamicHTMLの用途はなんですか##
DynamicHTMLとは、DOM(Document Object Model)をサポートするHTMLです。ブラウザに動的な効果が要る場合使います。
ブラウザにDOMサポートしたら、DynamicHTMLのページを作れることは言えます。
##DOMの用途はなんですか##
ブラウザに動的な効果が要る場合使います。
##AJAXの用途はなんですか##
画面全体の刷新ではなく、画面内の一部を刷新したい場合、使います。
Googleの検索機能、検索ボックスに文字を入力中につづりの候補が絞り
込まれ、検索ヒット数と共に表示される
RFID(Radio Frequency IDentification)ーパッシブタグ(受動タグ)、アクティブタグ(能動タグ)


応用情報技術者平成28年秋期 午前20

RFIDのパッシブ方式RFタグの説明として，適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/5f4f0c35-c8eb-c97f-90d6-8c5ffab70dfc.png)





１、RFID(Radio Frequency IDentification)は、ID情報を埋め込んだRFタグ(ICタグ)から電磁界や電波を用いて情報のやり取りを行うための技術です。RFタグは電池の内蔵の有無によって「パッシブタグ」と「アクティブタグ」に分類されます。

・パッシブタグ(受動タグ)
　電池を内蔵せず、リーダ／ライタが発信する電波をエネルギー源として利用して駆動するタグ。リーダ／ライタの電波の一部を反射するときにID情報をのせて返すことで自身の電力で電波を発信しなくとも情報をやり取りすることができる。交信範囲は広くても数十センチメートルという制限があるが安価(10円以下)に製造できる。

・アクティブタグ(能動タグ)
　電池を内蔵し、自らの電力で電波を発信するタグ。交信範囲は数十メートルから数百メートルと広いがパッシブタグと比較すると価格が高い。

２、
・アンテナから電力が供給される。
⇒パッシブタグの説明です。

※パッシブ　passive　受け身であるさま。消極的。

※アンテナ　antenna　天线（空間に電波を放射したり、空間を伝わってきた電波を捕らえたりする装置。）

・可視光でデータ通信する。
⇒可視光通信の説明です。

・静電容量の変化を捉えて位置を検出する。
⇒タッチパネルの説明です。

・赤外線でデータ通信する。
⇒IrDA(Infrared Data Association)の説明です。


参照：
https://www.ap-siken.com/kakomon/28_aki/q20.html
Nuxt.jsで認証認可入り掲示板APIのフロントエンド部分を構築する #3 個別記事ページの作成

←[Nuxt.jsで認証認可入り掲示板APIのフロントエンド部分を構築する #2 NuxtとRailsとの疎通テスト](https://qiita.com/rf_p/items/34cc453c7c232e07a1d7)

# 個別記事ページの作成

```powershell
$ mkdir pages/posts
$ touch pages/posts/_id.vue
```

```vue:pages/posts/_id.vue
<template>
  <v-layout
    column
    justify-center
    align-center
  >
    <v-flex
      xs12
      sm8
      md6
    >
      <v-card>
        <v-card-title class="headline">
          {{ post.subject }} - {{ post.user.name }}
        </v-card-title>
        <v-card-text>
          {{ post.body }}
        </v-card-text>
      </v-card>
    </v-flex>
  </v-layout>
</template>

<script>
export default {
  validate ({ params }) {
    return /^\d+$/.test(params.id)
  },
  async asyncData ({ $axios, params }) {
    const response = await $axios.$get(`/v1/posts/${params.id}`)
    return {
      post: response.post
    }
  }
}
</script>

```

Nuxtでは上記のように`pages/hoge/_id.vue`とすることで、hoge/{id}のような動的ページが作られます。

バリデートは数値型のみ許容するように設定しています。以下、公式ドキュメント参照。
[ルーティング - NuxtJS](https://ja.nuxtjs.org/guide/routing/)

そして`asyncData`というSSR用のメソッドで`v1/posts/${params.id}`とすることで、URLのid部分の数値から固定のpostを取得しているわけです。

なお、今回は`post`の値をVuexのstoreに保存していません。
storeはなんでもかんでも保存を保存しておく場所ではなく、他のmoduleやサイト全体で使う必要があるか考え、そうでなければ不用意に突っ込まないほうがいいです。

もしブラウザで以下の通り表示されたら、とりあえずOKです。

![show.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199678/246ec8f4-6787-df4d-8158-d440aba4f3e5.png)

# indexから個別ページにリンクを設置

indexから個別ページにリンクを貼ります。

```diff:pages/index.vue
       <v-card v-for="post in posts" :key="post.id">
         <v-card-title class="headline">
-          {{ post.subject }} - {{ post.user.name }}
+          <n-link :to="`/posts/${post.id}`">
+            {{ post.subject }} - {{ post.user.name }}
+          </n-link>
         </v-card-title>
         <v-card-text>
```

![list.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199678/7f5be50f-f8a5-0279-1a4f-5456c2befa2b.png)

リンクになっていますね。

# CORS対策

ではindexから個別ページに飛んでみましょう。

![error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199678/0a83f7f4-ccad-c394-262e-9666474604ab.png)

エラーになりましたか？
実はこれがエラーメッセージ読んでも原因が特定しづらく結構厄介なものです。
以前この問題の対応策を書き残していますので、詳細を知りたい方は以下の記事を。
[Nuxt.jsでURL直叩きの時はページが表示されるのに、nuxt-linkやブラウザバックでAn error occurredになる](https://qiita.com/rf_p/items/e52a1ea4273247f051ae)

さて上記記事にも書きましたが、原因はページ遷移した場合はSSR(サーバサイドレンダリング)ではなくCSR(クライアントサイドレンダリング)になるため、CORS(オリジン間リソース共有)の対策が必要です。

```diff:nuxt.config.js
   ** Nuxt.js modules
   */
   modules: [
-    '@nuxtjs/axios'
+    '@nuxtjs/axios',
+    '@nuxtjs/proxy'
   ],
-  axios: {},
+  axios: {
+    proxy: true
+  },
+  proxy: {
+    '/v1/': {
+      target: 'https:/xxxxxxxxxxx.ap-northeast-1.amazonaws.com:8080/'
+    }
+  },
```

targetはご自身のRails APIエンドポイントに置き換えてください。

この設定が済めば、indexも個別ページも、ブラウザバックやn-link(nuxt-link)による遷移時も正常に表示されるはずです。

# 続き

→[Nuxt.jsで認証認可入り掲示板APIのフロントエンド部分を構築する #4 サインアップページの作成](https://qiita.com/rf_p/items/c1162fc121d6a4ef53e6)
【[連載目次へ](https://qiita.com/rf_p/items/0277ae96c5de433b4849#%E7%9B%AE%E6%AC%A1)】
PHPUnit assertStringContainsString アサーションについて

# 目的

- PHPUnitのアサーションの1つであるassertStringContainsStringについてかんたんにまとめる

# すみません

- 本記事は筆者の備忘録的要素が強いためメモ的な簡易的な記事となる。
- 内容が薄い場合は参考文献先などを参考に各自て補填していただければ幸いである。

# assertStringContainsString

- 検査対象の中に指定された文字列が含まれているかをチェックするアサーションである。
- 具体例を下記に記載する。

    ```php
    assertStringContainsString('A', 'B');
    ```
- 上記のようにテストコードが記載された場合、指定された文字列がAで検査対象がBとなる。
- もう少しざっくりとしたコードを日本語を交えて記載する。

    ```php
    assertStringContainsString('検査対象に入っていることが期待されている指定された文字列', '検査対象の文字列や変数')
    ```
- もう少し具体的な例を下記に記載する。
    - `$array`には連想配列が格納されており、キーと値は下記のようになっている。

        ```php
        $array = [
            'id' => 1,
            'name' => 'Hoge Hoge',
        ]
        ```
    - `$array`に「Hoge Hoge」という文字列が格納されているかをassertStringContainsStringのアサーションを使ってテストする際は下記のようになる。

        ```php
        assertStringContainsString('Hoge Hoge', $array);
        ```
    - 上記のテストコードを実行すると「テストOK」となる。

# まとめ

- assertStringContainsStringアサーションは「検査対象の中に指定された文字列が含まれるか」をチェックするものである。

# 参考文献

- [PHPUnitのアサーションについて](https://kanchoworldcup.hatenablog.com/entry/2019/02/17/210000)
- [アサーションの使い方](https://thinkit.co.jp/article/1191/1)
- [1. Assertions#assertStringContainsString()](https://phpunit.readthedocs.io/en/9.3/assertions.html#assertstringcontainsstring)
ラウンドロビン方式のタスクスケジューリング

応用情報技術者平成28年秋期 午前19

タイムクウォンタムが2秒のラウンドロビン方式で処理されるタイムシェアリングシステムにおいて，プロセス1～3が逐次生成されるとき，プロセス2が終了するのはプロセス2の生成時刻から何秒後か。ここで，各プロセスはCPU処理だけで構成され，OSのオーバヘッドは考慮しないものとする。また，新しいプロセスの生成と中断されたプロセスの再開が同時に生じた場合には，新しく生成されたプロセスを優先するものとする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/5d790690-514e-1dd5-7175-58eb91488707.png)

１、ラウンドロビンは、
実行可能状態となった順に従ってタスクに一定のCPU時間(タイムクウォンタム)を与えていくタスクスケジューリング方式です。一定時間内に処理が終わらなかったタスクは、実行可能状態の待ち行列の最後尾に移され、CPU使用権が与えられる順番を待つことになります。

・ラウンドロビン (英: Round-Robin) とは、様々な場面で用いられるが、大抵の場合において「何かの役割・出番をたくさんの物事・人員で交替しあう」というような意味で用いる。 例えば、ラウンドロビンパーティとは参加者各自の習慣で小さなパーティを一つずつ参加者がまわって歩くようなパーティのやり方をさす。

例：DNSラウンドロビン
DNSの負荷分散機能です。具体的には、以下のように同じホスト名に対して複数のAレコードを設定することで、アクセスを複数のコンピュータに（単純に順繰りに）振り分けます。

　www IN A 200.x.y.1
　www IN A 200.x.y.2
　www IN A 200.x.y.3

２、ラウンドロビン方式のタスクスケジューリングでは、
CPUで実行されるプロセスと共に実行待ち行列の状態も考える必要があります。

ラウンドロビンでは実行待ち行列をキュー構造(FIFO)で管理するため、普通に考えれば生成されたばかりのプロセス3は一旦待ち行列の最後尾に配置され、先頭のプロセス1にCPU使用権が与えられるとも考えられます。

しかし、質問にこの条件を注意してくださいね：
「新しいプロセスの生成と中断されたプロセスの再開が同時に生じた場合には，新しく生成されたプロセスを優先するものとする。」


参照：
https://qiita.com/lymansouka2017/items/af488494ad2abe8d3a28

https://www.ap-siken.com/kakomon/28_aki/q19.html
主記憶管理ー可変区画方式、ガーベジコレクション、動的リンキング、動的再配置

応用情報技術者平成28年秋期 午前16

プログラム実行時の主記憶管理に関する記述として適切なものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/671332fe-4fa7-5453-592a-59c0932f74fb.png)

１、可変区画方式
可変区画方式は、実行するプログラムの大きさに応じて主記憶を区画して割当てる方式です。

・メモリコンパクション(またはデフラグ)
可変区画方式で区画の割当てと解放を繰り返していくと、主記憶上に不連続な未使用領域が発生します。
この主記憶の細かな空き領域を結合して一つの連続した領域にすることをメモリコンパクション(またはデフラグ)といいます。

２、ガーベジコレクション
ガーベジコレクション(Garbage Collection)は、プログラムが動的に確保したメモリ領域を回収して、再度使用可能にすることをいいます。ガーベジには「ゴミ」の意があり、メモリ中の使われない部分を集める作業と引っ掛けています。

３、動的再配置
プログラムの実行中に主記憶内でモジュールの格納位置を移動させること

４、動的リンキング
プログラムの実行中に必要になった時点でモジュールをロードすること

動的リンキング（ダイナミックリンキング）は、プログラムの実行中にそのモジュールが必要となった時点で結合して利用する方式です。 主に共用ライブラリやシステムライブラリなどをプログラムで使用するときに使われます。


ーーーーーーーーーーーーーーーーーーーーーーーーー
補足

動的リンキングの機能はどれか。

ア、プログラム実行時に，共用ライブラリやシステムライブラリのモジュールをロードする。
イ、プログラム実行時に，適切なアドレスに目的プログラムをロードする。
ウ、プログラム実行時に，読み込まれたページの論理アドレスを物理アドレスに変換する。
エ、プログラムの実行に先立って，複数の目的プログラムを連係編集(リンケージエディット)する。


・プログラム実行時に，適切なアドレスに目的プログラムをロードする。
⇒動的再配置の説明です。

・プログラム実行時に，読み込まれたページの論理アドレスを物理アドレスに変換する。
⇒動的アドレス変換の説明です。

・プログラムの実行に先立って，複数の目的プログラムを連係編集(リンケージエディット　linkage edit)する。
⇒静的リンキングの説明です。

参照：
https://www.ap-siken.com/kakomon/28_aki/q16.html

https://www.fe-siken.com/kakomon/15_haru/q43.html
VRChatのノイズゲートを無効化する

# 注意

---

:exclamation: 公式でノイズゲート無効化が導入されたので以下の対策は必要なくなりました :exclamation: 

---

# やること
VRChat にはデフォルトでノイズゲートがあって、囁きや残響音のような小さい音は途切れがちになります。
そこで、可聴域外の音(20Hzのサイン波)を流してやることで実質ノイズゲートを無効化します。

アイデアは[memexさん](https://memex.booth.pm/items/1177208)や[よしたかさん](https://tyounanmoti.booth.pm/items/1274926)から頂いてますが、今回はボイチェンやノイズ抑制にVSTプラグインを使ってる人向けにVSTプラグインで実現します。

# つかうもの
- Element (https://github.com/kushview/Element/releases/tag/0.41.1)
- SYNCROOM (https://syncroom.yamaha.com/)
- mdaTestTone (https://sourceforge.net/projects/mda-vst/files/mda-vst/mda-vst-src%20100214/mda-vst-bin-win-64-2010-02-14.zip)

Element と SYNCROOM のセットアップは[別記事](https://qiita.com/naca_nyan/items/f53659c998980a80393a)にあるのでそちらを参照してください。

# mdaTestTone
zip の中にある mdaTestTone.dll を `C:\Program Files\VSTPlugins` に放り込んで、Elementから
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700889/ef745e5c-c917-b00d-9545-77b72c151a86.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700889/00ccc210-86ee-bfaa-8ff9-99715fd85b43.png)
こんな感じにスキャンしてください。

次にmdaTestToneを読み込んで
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700889/6f6f7e7f-0f6d-8416-51d5-d91f6484ca2d.png)
こんな感じに SYNCROOM に流します。

最後に、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700889/c6abd7a5-08f4-b9e0-30eb-afbe829044e2.png)
Mode と F1 を設定して完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700889/434685dd-3b7e-22a0-52b5-207beeb25399.png)
切りたいときはここの電源ボタンで切れます。
仮想サーバの冗長化設計ークラスタリング方式、ライブマイグレーション方式、仮想マシン方式、パーティショニング方式

応用情報技術者平成28年秋期 午前13

仮想サーバの冗長化設計における可用性評価に関する記述のうち，クラスタソフトウェアを用いた評価として，適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/22fcb503-6590-b6c0-a8b0-203770528c18.png)



１、
・OS，アプリケーション及びハードウェアの障害に対応し，障害時に障害が発生していないサーバに自動的に処理を引き継ぐので，切替え時間の短い安定した運用が求められる場合に有効である。
⇒クラスタリング方式の特徴です。

・仮想サーバを停止させずに物理サーバ間で仮想サーバを移動することが可能となるので，メンテナンスなど業務移行の際も含めて業務の停止が全く許容できない場合に有効である。
⇒ライブマイグレーション方式の説明です。

・物理サーバに備わっている機能を利用するので，ハードウェアの障害にだけ対応し，障害時に業務停止が許容される場合に有効である。
⇒仮想マシン方式の特徴です。

・物理サーバのリソース(CPU，メモリなど)をブロック単位に物理的に分割し，あるブロックの障害が他のブロックに影響しないようにするので，障害時に業務の停止が許容できない場合に有効である。
⇒パーティショニング方式の特徴です。

２、サーバー分割技術
1台のサーバを分割して複数の論理的なサーバー環境を作り、複数のシステムを稼働させることをサーバー分割技術と呼びます。

分割技術には「パーティショニング方式」と「仮想マシン方式」があります。
・パーティショニング方式
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/a8114849-1492-959f-c7d0-b986b50ee2f2.png)

※サーバー内の物理的な構成単位をパーティションという単位で分割します。簡単にいうと、使用する機械そのものをサーバー内で別々に構成するということです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/5ec9752a-ee1d-e10d-cb24-bc1ecfd344e2.png)
※サーバー内のハードウェア資源をファームウェア*により論理的に分割します。
この方式では、CPUやメモリなどの資源を論理的に細かく分割して、自由に複数のパーティションに割り当てることが可能です。



・仮想マシン方式
仮想マシン方式は、サーバー仮想化ソフトウェアを使い、物理サーバーに搭載されているハードウェア資源を各仮想マシンに配分して、仮想マシン環境を構築する技術です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/3065f84d-1527-d868-5032-b39915739eb1.png)
※もともと物理的なサーバーで稼働しているOS（ホストOS）上で、仮想マシン内のOS（ゲストOS）を動作させる方式です。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/385575d9-4576-e8d3-e26b-decc91ea0847.png)
※ハイパーバイザー型は、ハードウェア上にホストOSではなくサーバー仮想化ソフトウェアを配置します。


３、ライブマイグレーションとは、
アクティブな仮想マシン（VM）を現在展開中の物理ホストから別の物理ホストへ移行させることを指す。その際、稼働中のサービスの停止またはサーバの停止は発生しない。

４、クラスタリングとは、
複数台の安価なコンピューターを標準的なネットワーク技術で連結することで、まるで1台の高性能な大型コンピューターのように利用するための技術です。多額の投資により大型で高速な専用コンピューターを購入するのではなく、複数の標準化されたコンピューティング技術を活用することで、少ない投資で高速かつ信頼性の高いコンピューティング環境を実現できます。


参照：
https://www.ap-siken.com/kakomon/28_aki/q13.html


パーティショニング方式
https://www.itbook.info/network/virtual2.html

サーバー分割技術
https://avinton.com/blog/2018/01/virtualization/

MicrosoftとVMwareのライブマイグレーション機能を徹底比較
https://techtarget.itmedia.co.jp/tt/news/1411/27/news02.html

クラスタリング
https://bcblog.sios.jp/what-is-clustering/#:~:text=%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%A8%E3%81%AF%E3%80%81%E8%A4%87%E6%95%B0%E5%8F%B0,%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E6%8A%80%E8%A1%93%E3%81%A7%E3%81%99%E3%80%82
Zenn書いてみた

[新サービスZennが面白い！](https://qiita.com/engineerhikaru/items/d3be9d731a5327a1ed70) というのを読んでZennに1ページ書いてみた。

これ → https://zenn.dev/e99h2121/articles/4c064cf70645a66172ce

## 良いところ

下書きをしやすい。Publishにスイッチを入れたうえで公開ボタンを押さないと公開されない。安全。

ポエム記事を書きやすい。技術記事、マネジメント的な記事を公開時に選択できる。

投げ銭オプションがある。笑


## 他、参考

[Zenn が気になったので調べてみたメモ](https://qiita.com/sh1ch/items/b408d524ac3a410f29fc)

Qiita, note 界隈と併せ、これからどうなるのでしょうというところ。
iOS14におけるデバッグメッセージを記録するためのOSフレームワークの使用

ご存じの通り、printを利用するとログメッセージをXcodeのコンソール内に表示させることができますが、printではログメッセージは一切保存されません。

しかしながら、printコマンドで表示されたメッセージに含まれているのはテキストのみです。ログメッセージをさらにオーガナイズしたい場合には、`os` フレームワークの使用が可能です。

この記事では、iOS 14におけるSwiftでの `os` フレームワークの使用について、およびログメッセージを読むための `Console.app` アプリの使用について説明します。

## `os` フレームワークの使用

iOS 14では、`os` フレームワークが向上します。

### まずは、ログインスタンスを初期化します

```swift
let logger = Logger(subsystem: "com.example.OSLogExample", category: "OSLogExample")
```

`Console.app` アプリケーション内で名前を検索することでログメッセージを簡単に見つけることができるように、`subsystem` と `category` に一意の名前を指定する必要があります。

### ログレベル

5つのログレベルがあります。

| 名  | 説明  | Xcode にリアルタイムで表示されますか。  | Console.app にリアルタイムで表示されますか。  |
|---|---|---|---|
| .debug  | 一般的なデバッグメッセージのため | はい  | いいえ  |
| .info  | 情報ログメッセージのため  | はい  | はい  |
| .notice  | 通知メッセージのため  | はい  | はい  |
| .error  | エラーメッセージのため | はい  | はい  |
| .fault  | 障害メッセージのため | はい  | はい  |

```swift
@State var publicLogContent: String = "パブリックログコンテンツ"
@State var privateLogContent: String = "プライベートログコンテンツ"
```

```swift
//.debug
logger.debug("これはデバッグログです: \(self.publicLogContent, privacy: .public) \(self.privateLogContent, privacy: .private)")
//.log
logger.log("これは情報ログです: \(self.publicLogContent, privacy: .public) \(self.privateLogContent, privacy: .private)")
//.notice
logger.notice("これは通知ログです: \(self.publicLogContent, privacy: .public) \(self.privateLogContent, privacy: .private)")
//.error
logger.error("これはエラーログです: \(self.publicLogContent, privacy: .public) \(self.privateLogContent, privacy: .private)")
//.fault
logger.fault("これは不具合です: \(self.publicLogContent, privacy: .public) \(self.privateLogContent, privacy: .private)")
```

`Console.app` アプリケーション内にプライベートコンテンツ `(privacy: .private)` が非表示になります

全てのメッセージのタイプに関して、お持ちのデバイスがコンピューターにつながっている場合、メッセージはXcodeウィンドウで見られます。

<img width="500" alt="image" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/0e0474a1-c1ba-96aa-af20-35429a669250.png">

`.info`、`.notice`、`.error`及び `.fault` については、お使いのデバイスがコンピューターに接続されており、Xcodeコードによってローンチされている場合、`Console.app` アプリケーション内に現れるメッセージを確認できます。

![スクリーンショット 0002-09-26 2.28.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/dcb3a152-488d-82b9-8e48-a1dad4c68bab.png)

Xcodeでアプリが起動していない状態で、デバイスをコンピュータに接続すると、プライベートコンテンツが非表示になります。

![スクリーンショット 0002-09-26 2.28.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/925df731-6ad9-c295-c380-c23ac8271939.png)

## Macで `Console.app` アプリを使用する

Macで `Console.app` を開き、iPhoneから送られてくるログメッセージを読むことができます。場所は アプリケーション > ユーティリティ > コンソール です。

次に、カテゴリ名 `category` を入力します（この例では `OSLogExample` です）。左の矢印アイコンをクリックして、検索条件を「プロセス」に変更します。

![スクリーンショット 0002-09-26 2.25.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/a41d8113-1091-0fa5-c9ff-84767d846122.png)

---

:relaxed: [Twitter @MszPro](https://twitter.com/MszPro)

:sunny: [私の公開されているQiita記事のリストをカテゴリー別にご覧いただけます。](http://mszpro.com/ioskiji/)
<img width="150" src="https://cdn.mszmagic.com/static-web-content/AppClipImage_small.png">
Rustの構造体　その3

# Method Syntax

この記事は以下を翻訳して理解した内容をまとめた物です。
https://doc.rust-lang.org/book/ch05-03-method-syntax.html

メソッドは関数とは異なり、構造体の中で定義される。

## Defining Methods

Rectangleインスタンスをパラメーターとして持つarea関数を変更し、代わりにRectangle構造体で定義されたareaメソッドを作成してみる。

```rs:src/main.rs
#[derive(Debug)]
struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    fn area(&self) -> u32 {
        self.width * self.height
    }
}

fn main() {
    let rect1 = Rectangle {
        width: 30,
        height: 50,
    };

    println!(
        "The area of the rectangle is {} square pixels.",
        rect1.area()
    );
}
```

Rectangleコンテキスト内で関数を定義するには、impl(implementation)ブロックを開始する。
次にarea関数を中括弧内に移動し最初のパラメータをselfに変更する。
メソッドを使用する場合は、インスタンスの後にドットを追加し、メソッド名、括弧、引数を追加する。

areaの場合はRectangleの代わりに&selfを使用する。Rectangle内で定義しているため、Rectangleを認識している。
メソッドの中でインスタンスを変更する場合は&mut selfを使用する。

## Methods with More Parameters

Rectangle構造体に二つ目のメソッドを実装してみる。
Rectangleインスタンスが別のインスタンスを取得し、自分自身に完全に治まる場合はtrue、そうでなければfalseを返すようにする。

```rs
fn main() {
    let rect1 = Rectangle {
        width: 30,
        height: 50,
    };
    let rect2 = Rectangle {
        width: 10,
        height: 40,
    };
    let rect3 = Rectangle {
        width: 60,
        height: 45,
    };

    println!("Can rect1 hold rect2? {}", rect1.can_hold(&rect2));
    println!("Can rect1 hold rect3? {}", rect1.can_hold(&rect3));
}
```

ect2の両方の次元はrect1の次元よりも小さいが、rect3はrect1よりも幅が広いため、予想される出力は次のようになる。

```
Can rect1 hold rect2? true
Can rect1 hold rect3? false
```

メソッド定義のため、impl Rectangleブロック内にあり、メソッド名はcan_holdになり、パラメータとして別のRectangleの不変の借用が行われる。
rect1.can_hold(&rect2)はrect2への不変な借用で、読み取りだけで良い。mainがrect2の所有権を保持してcan_holdメソッドを呼び出した後に再び使用できるようにする。
can_holdの戻り値はブール値となり、自分自身の幅と高さが両方とも他の長方形と大きいかどうかをチェックする。

```rs
impl Rectangle {
    fn area(&self) -> u32 {
        self.width * self.height
    }

    fn can_hold(&self, other: &Rectangle) -> bool {
        self.width > other.width && self.height > other.height
    }
}
```

main関数でこのコードを実行すると、目的の出力が得られる。
メソッドにパラメータを追加して関数と同じように機能する。

## Associated Functions

パラメータとして自分自身を使用しないimplブロック内で関数を定義できる。これは関連関数と呼ばれている。機能する構造体のインスタンスが無いためメソッドではなく、機能となる。
これはコンストラクタによく使用される。例えば一つの寸法パラメータをもつ関連関数を提供し、その高さと幅をもつ正方形を簡単に作成できる。

```rs
impl Rectangle {
    fn square(size: u32) -> Rectangle {
        Rectangle {
            width: size,
            height: size,
        }
    }
}
```

これを使用するには、::構文を使用する。
例えば、let sq = Rectangle::square(3)といった具合。

## Multiple impl Blocks

構造体は複数のimplブロックを持つことができる。

```rs
impl Rectangle {
    fn area(&self) -> u32 {
        self.width * self.height
    }
}

impl Rectangle {
    fn can_hold(&self, other: &Rectangle) -> bool {
        self.width > other.width && self.height > other.height
    }
}
```
【ReactNative】ライフサイクルメソッドがdeprecatedになった

以下のメソッドが deprecated になりました
([recompose](https://github.com/acdlite/recompose)ライブラリを使っている場合でも warning が発生します)

* componentWillMount
* componentWillReceiveProps
* componentWillUpdate


[こちら](https://reactjs.org/blog/2018/03/27/update-on-async-rendering.html)を参考に書き換え
AVFoundationでカメラを使う最小構成

毎回調べている気がするので。

Info.plistにPrivacy - Camera Usage Description追加。

必要なプロパティ。

```swift
var captureSession = AVCaptureSession()
var previewView = UIView()
var previewLayer:AVCaptureVideoPreviewLayer?

var videoOutput = AVCaptureVideoDataOutput() // VideoDataの場合
var photoOutput = AVCapturePhotoOutput()// PhotoDataの場合
```

設定。

動画の場合は、AVCaptureVideoDataOutputSampleBufferDelegateを、写真の場合はAVCapturePhotoCaptureDelegateを使用クラスに設定します。

```swift
class ViewController: UIViewController,AVCaptureVideoDataOutputSampleBufferDelegate,AVCapturePhotoCaptureDelegate {
```

```swift
previewView.frame = view.bounds
view.addSubview(previewView)

captureSession.beginConfiguration()

let device = AVCaptureDevice.default(for: AVMediaType.video)
let deviceInput = try! AVCaptureDeviceInput(device: device!)

captureSession.addInput(deviceInput)

//## 動画の場合
videoOutput = AVCaptureVideoDataOutput()
let queue = DispatchQueue(label: "VideoQueue")
videoOutput.setSampleBufferDelegate(self, queue: queue)
captureSession.addOutput(videoOutput)
if let videoConnection = videoOutput.connection(with: .video) {
    if videoConnection.isVideoOrientationSupported {
        videoConnection.videoOrientation = .portrait
    }
}
//##

//** 写真の場合 
photoOutput = AVCapturePhotoOutput()
captureSession.addOutput(photoOutput)
//**

captureSession.commitConfiguration()

previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
previewLayer?.frame = previewView.bounds
previewLayer?.connection?.videoOrientation = AVCaptureVideoOrientation.portrait
previewView.layer.addSublayer(previewLayer!)
DispatchQueue.global(qos: .userInitiated).async {
    self.captureSession.startRunning()
}
```

撮影。

VideoDataの場合、デリゲートメソッド内でフレームを取得。

```swift
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
    let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)
}
```
Photoの場合、capturePhotoしてデリゲートメソッド内で処理。

```swift
self.photoOutput?.capturePhoto(with: AVCapturePhotoSettings(), delegate: self)
```

```swift
func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
    if let imageData = photo.fileDataRepresentation() {
        let uiImage = UIImage(data: imageData)
    }
}
```

****
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[MLBoysチャンネル]
(https://www.youtube.com/channel/UCbHff-wfjTnB3rtXIP6y0xg)
[Medium](https://medium.com/@rockyshikoku)

[相棒](https://twitter.com/oka_yuuji)
[note](https://note.com/oka_yuuji)
相棒
note
iOS 14 対応

とあるアプリをiOS14に対応した際に起こった問題を書いていきたいと思います。

## DatePickerが配置された画面に遷移するとアプリがクラッシュする...
##### 原因
DatePickerの罫線を表示させたくないため、subviewsを巡り非表示にしているコードがあり、
UIDatePickerのStyleにautomaticが設定されている。
##### 対処
Styleにautomaticが設定されている時の外観が変更されており、wheelsを設定するとクラッシュしなくなった。
根本的には、subviewsを巡り非表示にしているコードを対処する必要がある。いつか...
## PickerViewでselection indicatorが表示される
##### 原因
iOS14ではPickerViewの選択した行がハイライトされるようである。
##### 対処
デザイン上、やはり表示させたくないとの事で次のコードを追加して対応した。

```objectivec
- (void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];
    if (@available(iOS 14.0, *)) {
        self.picker.subviews[1].hidden = YES;
   }
}
```
動物を認識して自動撮影するカメラを作る

![Sep-26-2020 02-43-16.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/2a915b3e-8001-b70e-f86b-5c18a0fdd85a.gif)

犬・猫がフレーム内に現れたら自動でシャッターを切る機能を作ります。

#手順

Visionに動物認識コンピュータービジョンリクエストがあります。
リクエスト結果でフレームに動物がいるか判別し写真を撮るように設定します。

```swift
let animalRequest:VNRecognizeAnimalsRequest = {
    let request = VNRecognizeAnimalsRequest(completionHandler: { (request, error) in
        guard let animalObservation = results.first as? VNRecognizedObjectObservation else { return }
// animalObservationがあれば、動物がいるので、シャッターを切る
        self.avCapturePhotoOutput.capturePhoto(with: settings, delegate: self as! AVCapturePhotoCaptureDelegate)
    })
    request.revision = VNRecognizeAnimalsRequestRevision1 //リビジョン１では、認識できるのは犬・猫のみです。
    return request
}()
```

captureOutputデリゲートメソッド内で、上記のリクエストを実行し、フレームを解析します。

```swift
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
    guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }
    let imageRequestHandler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, orientation: orientation, options: [:])
    do {
        try imageRequestHandler.perform([animalRequest])
       } catch {
        print(error)
       }
}
```

#応用
**同じ手法で他のリクエストを使うと、人間や任意の物体を認識して写真を撮れます。
Observationには、犬猫の場所を示すBoundingBoxも含まれていますので、そこにオートフォーカスしたりもできます。**

****
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[MLBoysチャンネル]
(https://www.youtube.com/channel/UCbHff-wfjTnB3rtXIP6y0xg)
[Medium](https://medium.com/@rockyshikoku)

[相棒](https://twitter.com/oka_yuuji)
[note](https://note.com/oka_yuuji)
相棒
note
Android 11 対応

とあるアプリをAndroid11に対応した際に起こった問題を書いていきたいと思います。

## 外部ストレージにファイル出力できなくなった...
##### 原因
外部ストレージ直下に独自のディレクトリを作成してファイル出力しているが、
ターゲットAPIレベルを29としたため、外部ストレージへのアクセス強化により出来なくなった。
##### 対処
外部ストレージでも、対象範囲別外部ストレージと呼ばれる場所へのファイル出力は引き続き可能であり、
こちらへファイル出力するように変更した。
また、対象範囲別ストレージへのアクセス権は自動で付与されるため、
WRITE_EXTERNAL_STORAGEパーミッションの確認が不要になった。
ISO-8601文字列を日本時間に変換したい

# ISO-8601文字列を日本時間に変換したい
`2020-09-25T18:00:00Z` → `2020-09-26 03:00:00` 

# Pythonでのプログラム

どう考えてもこんなに長いプログラムが必要ではないはずなんだが……

```Python
# coding: utf-8
from datetime import datetime, timezone, timedelta
import dateutil.parser

def time_jst(date_str: str):
    date_str.replace('Z', '+00:00')
    t = dateutil.parser.parse(date_str)
    JST = timezone(timedelta(hours=+9))
    t_jst = t.astimezone(JST)
    ret = t_jst.strftime("%Y-%m-%d %H:%M:%S")
    return ret

s = '2020-09-25T18:00:00Z'
print (time_jst(s))
```
空白文字のみが連続する文字列を禁止するための正規表現

フォームへの入力で空欄を禁止することはあります。
空白文字のみが入力された文字列も禁止するためには、以下の正規表現を使います。
空白と通常の文字の合わさった文字列は通しますが、空白文字のみ場合は弾きます。

```html
<input type ="text" pattern=".*\S+.*"/>
```

```js
 const ok1 ="a";//通る
 const ok2 =" a "; //通る
 const ok3 ="a ";//通る
 const NG ="   ";//通らない
```


全角スペースはページの文字コードがUTF-8であれば、空白文字の範囲に含まれます。

完全に備忘録レベルなので、正しさについては保証しません。
ただ、多分動きます。