OmniAICreator/Qiita-1.07M huggingface dataset:
【laravel6 】ログイン後にマイページにリダイレクトさせる方法

#はじめに
https://note.com/akina7/n/naa77c7020363
上記の優秀な記事の通りに実装しても上手く行かなくて詰まったので、備忘録として`ログイン後にマイページにリダイレクトさせる方法`をまとめておきます



# 前提

## 開発環境
 - laravel 6系

##パス

```web.php

Auth::routes();

Route::get('/', 'HomeController@index')->name('home');
Route::get("login/{provider}", "Auth\LoginController@redirectToProvider")->name('login.{provider}');
Route::get('login/{provider}/callback', 'Auth\LoginController@handleProviderCallback');
Route::resource('/locations', 'LocationController', ['except' => ['index']])->middleware("auth");
Route::prefix('users')->name('users.')->group(function () {
    Route::get('/{name}', 'UserController@show')->name('show');
});
```

```login.php
protected $redirectTo = RouteServiceProvider::HOME;
```
 
#【結論】ログイン後にマイページにリダイレクトさせる方法
  
```login.php
    public function redirectTo()
    {
        if (!Auth::user()) {
            return '/';
        }
        return
            route('users.show', ['name' => Auth::user()->name]);
    }
    protected function authenticated($request, $user)
    {
        return redirect(route("users.show", ["name" => Auth::user()->name]));
    }
```
少し粗手ですが、、、、
ポイントは、 `authenticated()`を使って、認証後にやりたい処理を書くことで、リダイレクト先を変更していること！
【UiPath】Excel - 図形のテキストを取得する

# はじめに

この投稿は、RPAツールのUiPathで、Excelの図形（オートシェイプ）のテキストを取得する方法についての投稿です。

「Excel操作を.NETのコードでやってみよう」シリーズです。他の投稿はこちら。

https://qiita.com/miya_g/items/02230dc5774818f24e90

https://qiita.com/miya_g/items/1c3bb14583110ccac14b

https://qiita.com/miya_g/items/8341d6cc0cf0fb77ac31

https://qiita.com/miya_g/items/e4bf3de19c8b0c4225ca

# 図形（オートシェイプ）とは

「図形（オートシェイプ）」とは、エクセルの図形描画機能のことです。
長方形や円などの形を選ぶことが出来て、テキストも埋め込めるので、見栄えの良い資料作成では欠かせません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/94478e19-e00f-986d-ef5c-46354df021c1.png)



今回はこの「図形（オートシェイプ）」をUiPathから操作する方法の紹介です。


# 図形（オートシェイプ）にしなければ操作は容易

UiPathで図形（オートシェイプ）を参照する方法は、標準ではありません。

そもそも、図形（オートシェイプ）を使用せすに、セルに直接記述してくれれば操作できます。
見た目の問題なら、図形の背景を透明にしてセルにテキストを書けば、それっぽく見えます。

ただ、何らかの理由で「図形（オートシェイプ）」に記述したいケースもあります（少ないですが）
その場合、頑張って図形（オートシェイプ）のテキストを操作する必要があります。


# 図形（オートシェイプ）を操作する方法

UiPathで図形（オートシェイプ）を操作する方法は、以下の2つです。

| No | 方法 | メモ |
|:-:|:-|:-|
| 1 | InvokeVBAでVBAコードで実施  | ネット上に沢山の実例あり。マクロ実行セキュリティ設定が必要 |
| 2 | InvokeCodeで.NETコードで実施  | ネット上に情報が少ない|

ネットで検索すると「1．VBAコードで実施する」サンプルコードが多いようですが、「2．NETコードで実施する」サンプルは見つかりませんでした。
なので、今回は「InvokeCode」でチャレンジしてみたいと思います。

# .NETで、図形（オートシェイプ）のテキストを取得

以下はVB.NETのコードです。
実行すると「図形（オートシェイプ）のテキスト」がリストで取得できます。

```VB
'// 対象エクセルファイルの情報
Dim bookPath As String = "C:\temp\exceltest.xlsx"
Dim sheetName As String = "Sheet1"

Dim shapeTextList As New List(Of String)
Dim ap As New Microsoft.Office.Interop.Excel.Application
Dim wb As Microsoft.Office.Interop.Excel.Workbook
Dim ws As Microsoft.Office.Interop.Excel.Worksheet 

Try
    '// ブックを開く
    wb = ap.Workbooks.Open(IO.path.GetFullPath(bookPath))
    '// シートループ
	For Each ws In wb.Sheets
		If ws.Name.ToUpper() = sheetName.ToUpper() Then 
			For idx As Integer = 0 To ws.Shapes.Count -1
				Dim shape As Microsoft.Office.Interop.Excel.Shape = 
					CType(ws.Shapes(idx), Microsoft.Office.Interop.Excel.Shape)
				If shape.TextFrame2.HasText = Microsoft.Office.Core.MsoTriState.msoTrue Then
				    '// テキストをリストに追加
					shapeTextList.Add(shape.TextFrame2.TextRange.Text)
				End If
			Next
		End If
	Next
	wb.Close
Catch ex As Exception
	Console.writeLine(ex.ToString)
	Throw(ex)
Finally
	'// ブックを閉じる
	If Not(wb Is Nothing) Then wb = Nothing
	ap = Nothing
End Try
```

呼び出し可能なxamlファイルにしたものを用意しました。以下からダウンロードできます。

https://github.com/miyag/UiPath.ReusableCode/blob/master/ExcelGetAutoShape/GetAutoShape.xaml

# 終わりに

InvokeCodeで実施すると、VBAのようなマクロセキュリティ設定も不要で、簡単に実行できます。
Excel図形（オートシェイプ）を操作したい場合に、参考になれば幸いです。

最後までお読みいただき、ありがとうございました。
【Laravel】ルーティングをグループ化する

# Laravelのルーティングをグループ化
```web.php
<?php

Route::name('user')
  ->group(function(){
    Route::get('/', 'UserController@index')->name('index');
    Route::get('/user/{id}', 'UserController@show')->name('show');
  });
```
LaravelにはRoute::nameというメソッド?が用意されているらしい。
Route::nameという記述をすることで、この中のルーティングはどこのコントローラーへのルーティングを定義しているのかをすぐに読み解くことができる。
要するに、可読性を高めることができる。
HTMLで埋め込んだYellowfinのJSAPI3で効かせたフィルターを表示させない方法

#どのような時に使われるか
主に、ログインした人によってあらかじめフィルターを絞った状態で表示させたいが、フィルターの内容は表示させたくないといった状況です。
その人の所属してる店舗の情報のみ表示したい・・など。こういったものはYellowfinの機能の一つであるアクセスフィルターを使って製品保証された状態で使うのが普通だと思うのですが、どうしてもという場合にこういう方法があるかなという提案です。(もちろん非公式です！)

#まずフィルターであらかじめ絞った状態でダッシュボードを表示させる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223443/52e28426-2ee3-44c3-8100-156f11853c94.png)


```html:htmlタブ.html
<html>

<head>
    <meta charset="utf-8" />
    <style type="text/css" id="style0"></style>
</head>
<script type="text/javascript" src="http://localhost:8940/JsAPI/v3"></script>

<body>
    <div id="dashboard"></div>
    <script>
        window.yellowfin.init().then(() => {
            window.yellowfin.loadDashboard({
                dashboardUUID: '82b33f61-7ce9-4e83-b26a-425520124d49',
                element: 'div#dashboard',
                filterValues: [{
                    filterId: 'Region',
                    valueList: ['Asia']//人によってvalueの内容を変える
                }],
                showGlobalContentContainer: true,//左側のフィルター表示
                showFilters: false//上のバーのフィルターボタン表示
            }).then(dashboard => {
                console.log(dashboard);
                window.dashboard = dashboard;
                let filter = dashboard.filters.getFilter('Region');
                let uuid = filter.uuid;
                console.log("フィルターUUID : " + uuid);

            });
        });
    </script>
</body>
</html>

```

#どうやってフィルターを非表示にするか
Yellowfinのフィルターは、ダッシュボードを更新するとUUIDが変わってしまうので注意が必要です。これに合わせて指定するフィルター部分のIDも変化するため、ダッシュボードを更新するたびにCSSタブも変更しないといけないです。

具体的にはこのように確認設定します。Yellowfinのダッシュボード編集画面で消したいフィルターのIdを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223443/4753768e-9d24-9819-110c-a6f7b4792c87.png)

これをCSSタブで非表示にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223443/ddcaf33e-2119-388d-d1d8-4bef60ff60ba.png)

#これでYellowfin埋め込み時でも非表示にできます。
もう一度いいますが、基本はアクセスフィルターを使っ他方がいいと思います！フィルターのIDもダッシュボードを更新すると変わっちゃうので・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223443/ed55462f-d9f2-63bd-7b81-b28661bf806a.png)
C#でGraphQLを試したい

GjangoでGraphQLのライブラリを使ったところ思ってたよりも簡単に書けたので、これはC#でも行けるのでは？と思い試しにサンプルコードを動かすに至りました。
やることは簡単、Schemaを定義してQueryとMutationを書けばGraphQL APIの完成です。

C#でGraphQLを試すサンプルコードがあったのでそれを参考にして備忘録です。

## 参考リンク
色々調べた結果たどり着いたリンクたち。

- [GraphQL .NET](https://graphql-dotnet.github.io/)
    - 今回使用するライブラリのドキュメントです。
- [サンプルコード](https://github.com/graphql-dotnet/examples)
    - 今回使用するサンプルコード。examples/src/AspNetCoreに配置されているプロジェクトを使用しました。
- [サンプルデータ](https://starwars.disney.co.jp/character.html)
    - ドキュメントと同じスターウォーズのキャラクターがサンプルデータとして使われています。スターウォーズ見たことない人はこちらを参考に。
- [「GraphQL」徹底入門 ─ RESTとの比較、API・フロント双方の実装から学ぶ](https://eh-career.com/engineerhub/entry/2018/12/26/103000#%E7%94%BB%E5%83%8F%E3%82%84%E5%8B%95%E7%94%BB%E3%81%AA%E3%81%A9%E3%81%AE%E5%A4%A7%E5%AE%B9%E9%87%8F%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E3%81%AE%E6%89%B1%E3%81%84%E3%81%8C%E9%9B%A3%E3%81%97%E3%81%84)
    - GraphQLの用語の説明・実際に使用するときに生じる問題点など、とても参考になりました。

## とりあえず動かしてみる

ソースコードをクローンして動かしてみましょう

```bash
# サンプルコードをクローンします
git clone https://github.com/graphql-dotnet/examples.git
# 使用するプロジェクトへ移動
cd examples\src\AspNetCore
# スクリプトを実行（中身はdotnet CLIのコマンドを実行してるだけ）
./run.sh
```

実行したら[http://localhost:3000/ui/playground](http://localhost:3000/ui/playground)へアクセスします。
![graphql_playground.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235110/ad895bee-9e10-cd4b-e4e4-81c104dc1267.png)
上のような画面が表示されるかと思うのでこれでGraphQLを試す環境が整いました。
以下のコマンドでサンプルコードのテストができます。
### Mutationを実行
```graphql
mutation  {
  createHuman(human:{ name: "hoge_001", homePlanet: "hogehogeplanet"}) {
    name
    homePlanet
  }
}
```

### Queryを実行
```graphql
query {
  human(id:"1"){
    name
  }
}
```

# Schema

## Schema Type
SchemaにはQueryとMutationを定義します。

```C#
    public class StarWarsSchema : Schema
    {
        public StarWarsSchema(IServiceProvider provider)
            : base(provider)
        {
            Query = provider.GetRequiredService<StarWarsQuery>();
            Mutation = provider.GetRequiredService<StarWarsMutation>();
        }
    }
```

またQueryとMutationで使うクラスは以下のようになります。
以下のクラスのプロパティがQueryとMutaitionのフィールド名と対応します。

```C#
    public abstract class StarWarsCharacter
    {
        public string Id { get; set; }
        public string Name { get; set; }
        public string[] Friends { get; set; }
        public int[] AppearsIn { get; set; }
    }

    public class Human : StarWarsCharacter
    {
        public string HomePlanet { get; set; }
    }

    public class Droid : StarWarsCharacter
    {
        public string PrimaryFunction { get; set; }
    }
```

## Query
Queryにはデータを取得するための処理を書きます。

```C#
    public class StarWarsQuery : ObjectGraphType<object>
    {
        public StarWarsQuery(StarWarsData data)
        {
            // クエリあることを設定する
            Name = "Query";

            // heroというクエリを定義　　　　　　　　　　　　　　　　　　↓LINQが書ける
            Field<CharacterInterface>("hero", resolve: context => data.GetDroidByIdAsync("3"));
         }
     }
```

## Mutation
追々書きます。
画像の表示(HTMLとCSS)

HTMLとCSSを使って画像を表示させる方法に関しての記事。
下記2点について書きたいと思う。

・画像を表示する方法
・画像の大きさを調節する方法

### 画像の配置
まずは、画像を配置させる。
下記のようにimageというフォルダ内に画像を配置させる。
[![Image from Gyazo](https://i.gyazo.com/6cabcce8e12e994078ad239d1906c7f6.png)](https://gyazo.com/6cabcce8e12e994078ad239d1906c7f6)

### 画像の表示
画像を表示するためには、img要素を使う。
img要素を用いることで、Webサイト上に画像を表示することができる。
img要素には、画像の場所を指定するsrc属性 、画像が表示されなかった場合に代替テキストなどを表示するためのalt属性も併せて使用する。

```
image src="image.jpeg" alt="imagename" class="classname"
           画像を決める       代替テキスト        css適用のためのセレクタ
```

### 画像の大きさの調整
表示された画像が大きすぎる場合
cssでサイズを調整してあげる。

```css
.classname{
 width: 300px;
 height: 300px;
}
```
【Swift】ビルド時のエラー "dequeueReusableCellWithReuseIdentifier:forIndexPath:"

# これはなに

CollectionViewを使っている際に遭遇したエラー。

エラー全文。適当な場所で改行してます。

```
Terminating app due to uncaught exception 'NSInternalInconsistencyException',
reason: 'the cell returned from
-collectionView:cellForItemAtIndexPath: does not have a reuseIdentifier
- cells must be retrieved by calling
-dequeueReusableCellWithReuseIdentifier:forIndexPath:'
```

`collectionView:cellForItemAtIndexPath: does not have a reuseIdentifier` で検索すると「IBOutletの繋ぎ方が悪い、もしくは繋ぎ直してみる」ことで直る例が出てきますが、今回はそれじゃなかったです。

## 原因

`dequeueReusableCellWithReuseIdentifier` と書いてあるので、セルが作成されるときに何かマズってるということみたいですね。
今回はswitch文で作ってるカスタムセルの数とセルの総数に不整合があったため起こったエラーでした。
`numberOfItemsInSection`、 `didSelectItemAt`、 `cellForItemAt` を見直してみよう。

おわりヽ(´・ω・｀)丿
Beginner's Series to: Node.js - 今から始める Node.js

新型コロナウイルスによるパンデミックが始まってかれこれ１年ちょっとが経過しましたが、皆さんいかがお過ごしでしょうか。

私はサンフランシスコに住んでいるのですが、もうずっと WFH (Working from home) 生活でオフィスのフリー・フードやドリンクが懐かしいというか、遠い昔のような気さえします。以前まで通っていたテック系企業が密集するオフィス街は今はまるでゴーストタウンのようになっています。本当に以前のような活気が戻ってくるのかはわかりません。

## 初心者向け Node.js 動画シリーズの日本語版を作ってみた

さて、私は猫 x2 🐈🐈‍⬛ に邪魔されつつ、この狭い自宅で毎日仕事をしているわけですが、時間がフレキシブルになった分、自由時間も多いので、髪を変な色に染めたりしていたのですが、もっと有意義なことをしたかったこともあり、マイクロソフトの同僚たちがやっていた [**Beginner's Series to: Node.js**](https://channel9.msdn.com/Series/Beginners-Series-to-NodeJS) プロジェクトに参加することにしました。私が参加した頃はすでにコンテンツもできあがっていて動画もほぼ取り終えていたので、私は日本語ローカライズ版をつくることにしました。

あいかわらず猫がふらふらしている部屋で素人のカメラ・ワークで撮った動画を、素人な動画編集で制作した、Microsoft の名前で出して問題ないのかという出来ではあるのですが、なんとか [**Beginner's Series to: Node.js - 今から始める Node.js**](https://www.youtube.com/playlist?list=PLQEKit6tfVVKkp0ELOyKey_v7I89mxYZI) が完成しましたので、まさにこれから Node.js を学んでみたい、という方にみていただければ幸いです。

イントロ。

<iframe width="560" height="392" src="https://www.youtube.com/embed/cSsk6c9CMxk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


動画は全２６話。そんなに見るヒマないわ！と言われそうなのですが、実際は１話がだいたい３分から６分程度の一口サイズになっていますので、比較的気楽に見れるかと思います。

Playlist はここから！
[📺 **Beginner's Series to: Node.js - 今から始める Node.js**](https://www.youtube.com/playlist?list=PLQEKit6tfVVKkp0ELOyKey_v7I89mxYZI)

途中から急に難しくなるかもしれません。私の滑舌もさほどよくなく、わかりにくい箇所もあるかと思われますので、キャプションで日本語をオンにして見ることをお勧めします。

## キャプションを On にする
YouTube 画面の下にある ⚙️ （設定）アイコンをクリックして **字幕** > **日本語**（自動生成ではないほう）を選んでください。
![YouTube 字幕設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663749/329ada1d-cde2-0db4-3ef0-e20a79d92ab6.png)
![YouTube 字幕設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663749/872dd91b-3e01-a6b1-420f-823d20af2ee8.png)

これでより理解が深まるかと思います。

では、みなさん、よかったらみてみてください！
[📺 **Beginner's Series to: Node.js - 今から始める Node.js**](https://www.youtube.com/playlist?list=PLQEKit6tfVVKkp0ELOyKey_v7I89mxYZI)!
EPROMライターいろいろ

構想40年のROMライターを作ろうと思い立ち調べてみたところ、以下のようなものが見つかりました。

http://yuuyuusyumi.blogspot.com/2017/10/eprom.html

http://denshiken.my.coocan.jp/AVR027.html

https://cafe2p54.at.webry.info/201706/article_1.html

https://yoshikiyo.com/2019/10/17/20191017-2/

https://github.com/mkeller0815/MEEPROMMER

https://kohacraft.com/archives/201906091028.html

2716対応のもの

http://star.gmobb.jp/koji/cgi/wiki.cgi?page=2716%CD%D1ROM%A5%E9%A5%A4%A5%BF%A1%BC%A4%CE%C0%BD%BA%EE

https://vintagechips.wordpress.com/2016/03/29/usb2716programmer/

フラッシュがターゲットですが

http://diode.matrix.jp/R16M/ROMWRITER.htm

以前作ったパラレルフラッシュライター

https://qiita.com/yamori813/items/28c3fe71840c3277e409#%E3%83%91%E3%83%A9%E3%83%AC%E3%83%ABflash%E3%83%A9%E3%82%A4%E3%82%BF%E3%83%BC

昔買った「マイコン設計トレーニング」(2716,2732,2764)や「マイコン手作り塾」(2716)にも製作記事がありました。

EPROMライターの肝は、VPPの回路とバスの処理です。VPPはステップアップコンバーターなどを使う方法が一般的で、バスは大型のPICやArduino MegaのようなPINの多いマイコンを使うか74HC164や74HC299や74HC595のような[シフトレジスタ](https://synapse.kyoto/glossary/shift_register/page001.html)を使うかI2C-GPIO変換を使う方法があります。昔は8255(PIO)の8ビットx3ポートを使うのが一般的でした。
【Laravel】Laravelで正しくルート定義ができているか確かめる

# Laravelで正しくルート定義ができているか確かめる
```
$ docker-compose exec workspace php artisan route:list
```
これで、ルート定義が正しくされているか確認することができる。

```
+---------+-------------+------------------+------------------+--------------------------------------------------------------+----------------+
| Domain | Method     | URI                    | Name               | Action                                                                          | Middleware   |
+---------+-------------+------------------+------------------+--------------------------------------------------------------+----------------+
|               | GET|HEAD | /                       | product.index | App\Http\Controllers\ProductController@index   | web               |
+---------+-------------+------------------+------------------+--------------------------------------------------------------+----------------+
```
正しく定義されていれば上のように表示される。

railsの時は```rails routes```とすれば確認できるが、laravelの時は```php artisan route:list```
実はあのソフトでも使われているプログラミング言語" Lua"

# はじめに
この記事はLuaについてのお話をしていきます。プログラミングに関しては全く書かないと思うので
「早くゲーム作りたい！Luaが勉強したい！」っていう人は[Defold目次](https://qiita.com/nonzu/items/73a39368855f3e1e0f28)にとんでください！

Defoldでゲームを作るにあたって絶対必要なのはLuaというプログラミング言語です。
そこでLuaの特徴などを簡単にまとめていこうと思うですが、本当に簡単にしか扱わないのでガッツリ知りたい人は"Lua"でググってみると良いと思います。
# Luaの特徴
Luaはリオデジャネイロ・カトリカ大学のコンピュータ科学科の人が制作した言語です。この言語はもともとC言語に組み込むために作られたもので、**実行が超高速**です。(C言語以外のプログラミング言語でも導入することもできます。)
逆にDefold(Lua)でゲームを作っている時でも逆にJavaやC言語を使うこともできます！
ただライブラリが少ないのがちょっとした欠点だったりするのですが、Defoldでゲームを作成するときはDefold側に大抵の機能は実装されていますので安心してください！

#どんな用途に使われてるの？
Luaはゲーム開発、組み込み系の機械(ルーターとか)、さらには拡張プラグインとして広い用途で利用されていますが、Luaの人気は落ちていて2019年の学ばないほうが良い言語ランキング台4位というなんとも不名誉な実績も持っています。しかし、Luaはその**速さと拡張性や、様々なシステムやIoTの製品への組み込みの易しさ**などの理由から今後需要が高まってくると思っています。 (希望的観測)

#Luaの利用例
+ Wikipedia
+ AviUtl
+ Adobe Photoshop Ligitroom (プラグインだけでなく本体も40％はLuaで書かれている)
+ Roblox
+ Garry's MOD
+ Far Cry
+ ファイナルファンタジーXIV
+ ドラゴンクエスト X
+ VOCALOID3

#参考
https://www.ossnews.jp/oss_info/Lua
https://www.geekly.co.jp/column/cat-technology/1903_062/
https://www.capa.co.jp/archives/23705
https://japan.zdnet.com/article/35135732/
Databricksを活用することで現場における怪我を54%削減 (Databricksユースケース)

[Customer Story: StrongArm Tech \- Databricks](https://databricks.com/customers/strongarm)の翻訳です。

**業界**：製造
**ソリューション**：リスクマネジメント
**ユースケース**：データ投入、ETL、機械学習

多くの労災事故は一夜にして起きるものではありません。危険な動作の繰り返しを通じて、徐々に危険が高まっていきます。そして、最悪のケースにおいては回復しようのないダメージを引き起こします。StrongArm Techは、ウェアラブルデバイスを活用して、この問題に取り組んでいます。装着者の日々の動き、周辺の状況をトラッキングしています。Databricksを活用することで、大量のIoTデータを登録することが可能となり、独自に作り上げた安全スコアの計算とリスクに関連する行動の分類をリアルタイムで行う機械学習を実現しました。これにより、よりスマートかつ安全な環境を実現しています：StrongArmは怪我の発生率を半分以上削減し、顧客及び顧客の従業員の保険コストにおいて数百万ドルの削減を実現しています。

# 作業環境の安全性を改善するためのデータ活用が抱える複雑性

労災事故は、雇用主だけでなく怪我を負った従業員が負わなくてはならない医療費の面からも膨大なコストを引き起こすものとなります。

"製造業においては腰の怪我が一般的なものです。作業員が怪我するたびに、大抵医療費に6万5千ドルを必要とします"と、StrongArm TechnologiesのCIO、Bryant Eadonは説明します。

StrongArmが目指したのは、事故を予測し未然に防ぐために、全ての適切なデータポイント(約１２０万データポイント/日/人)をキャプチャすることです。このような大量のデータがリアルタイムで流れ込んでくることになったため、彼らは信頼性がありかつ高性能なETLパイプラインを構築する必要性に迫られました。インフラストラクチャを維持するためには膨大なリソースが必要となり、大量データを捌くために必要なクラスターを配備するのに、１週間を要するほどでした。

データサイエンスに視点では、単体のラップトップマシンでの作業は、彼らがアドホックのクエリを効果的に実施することを困難にしており、全てのデータを用いてモデルを構築することを妨げていました。

様々なデータチームに渡る人及びシステムのコラボレーションも課題でした。チームのサイロ化により、データプロフェッショナルは既にコラボレーションに苦慮していました。歴史を振り返ってみても、彼らの仕事は主に緊急事態に関するものであり、チーム間コラボレーションに関するものではありませんでした。しかし、必要とされるチームワークを醸成するための適切なツールなしには、状況を悪化させるだけでした。

# 統合されたデータレイク及び能率化された機械学習ライフサイクル

Databricksの統合分析プラットフォームを活用することにより、繰り返しやコラボレーションは、もはやデータエンジニアリングの問題ではなくなりました。データサイエンティストとデータアナリストはこれまで以上に連携して作業できるようになりました。

Delta Lakeにより、様々なデータソースからのIOTデータをリアルタイムに投入できるようになり、データ信頼性の問題を解決しました。シームレスにデータが流れ込んでくるデータパイプラインを活用することで、データサイエンスチームは、機械学習を活用してより容易にイノベーションを起こすことが可能になりました。MLflowは機械学習全体のライフサイクルを能率化し、プロダクションに移行するベストモデルを容易に特定できるようにしました。

"Databricksを使う前は、データサイエンスリサーチプロジェクトを構造化する方法がありませんでした。モデルを20回トレーニングした場合、最初の結果を忘れてしまい、手戻りが何度も発生していました"、StrongArmのデータサイエンティスト、Siva Bommireddyは言います。"MLflowは、データサイエンスで一般的な繰り返し作業を容易に管理してくれます"。

組織をまたがるデータの統合により恩恵を受けた最後のチームは、データアナリストチームです。Mattは、非技術系のチームに対して結果を提供できるようになったことは信じられないほど充実感があることだと付け加えます。"データ中心のチームであろうがそうでなかろうが、全てのチームが納得する結果を15分以内に提供できています。"、彼は言います。"Databricksは多くのデータのユースケースを解決しました"。

# 怪我の発生率を54%削減し、500万ドルのコストを削減

今やStrongArmは、センサーデータから示唆を導出し、それらを、作業員がどのような状況になりうるのか、彼らの顧客がいかに作業環境を改善するのかを明らかにするのに活用しています。

Fortune 100の顧客に対して詳細分析を行なった結果、StrongArmは怪我の発生率は54%に達したと計測しました。コストにおいては$5,347,368の削減を行い、ROIとしては355%となりました。また、StrongArmは怪我のリスクの誤差を23%から5%にまで削減することができました。これは78%の改善となります。

"我々は業界のプロフェッショナルを守るビジネスを行っています"、Eadonは言います。"Databricksを活用することで、作業環境を改善するためのデータと機械学習の能力を解き放つことができました。この結果、より生産的になり、日々お世話になっている数万人の作業員の作業環境を改善することができました"。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
Request specでbase64を用いた画像のdecodeに躓いた

## Reactで実装したフロントエンドから画像をコントローラーに送ってActiveStorageに保存したい

Rails × React SPAの作成に当たり画像データをActiveStorageで扱いたい。しかしActiveStorageに保存するデータ形式は
reactで直接扱えないのでBase64を用いたencodingとdecodeを用いて保存を行う。

```jsx
//画像は事前にvalueを取得できないのでFileReaderを使ってデータを読み取る
const file = e.target.files[0];
const reader = new FileReader()
reader.onload = () => { 
//以下2つはactivestorageの保存に必要
user.avatar.data = reader.result
user.avatar.filename = file.name 
}
reader.readAsDataURL(file) //戻り値はata:image/jpeg;base64,/9j/4AA…のようになる。これをサーバーサイドで複合する            
```
こんな感じの記述でフロント側で画像を読み込むとbase64形式でdataが取得できる。
サーバーサイドではこれを復号化する形でActiveStorageに画像を保存する。

```ruby
def create 
  @user = User.new(sign_up_params)
  if @user.valid?
    if params[:user][:avatar][:data] != "" && params[:user][:avatar][:filename] != "" #画像データ自体は送られてくるので中身が空かどうか判定をする
      blob = ActiveStorage::Blob.create_after_upload!(
        io: StringIO.new(decode(params[:user][:avatar][:data]) + "\n"), #UserModal.jsxでfilereaderを使って取得した文字列を復号する
        filename: params[:user][:avatar][:filename] #filenameはUserModal.jsxで取得
        )
      @user.avatar.attach(blob) #先に作っておいた画像とuserを紐付ける
    end
```

実際フロントからは画像をbase64形式でencodeした文字列dataと、ファイルの名前filenameをリクエストとして送信するため
実行環境やsystem specについては問題なく通っていた。しかしrequest specではうまく通らなかった。

自分が今まで知っていた画像を添付する方法は

```ruby
FactoryBot.define do
  factory :user do
    nickname {Faker::Name.name}
    email {Faker::Internet.free_email}
    password {'Pass1234'}
    password_confirmation {'Pass1234'}
    
    after.build do |user|
      user.avatar.attach…
  end
end
```

のようにfactorybotでafter callbackを用いる方法か

```ruby
user.avatar = fixture_file_upload('spec/fixtures/test_image.jpg', filename: 'test_image.jpg', content_type: 'image/jpg') 
```

のような記述をテストコード上で挿入するかのどちらかだった。

しかしこれらはbase64を用いた形式に合わず、いろいろ不都合だったので修正。

## ①画像データをencodeした文字列を取得

https://lab.syncer.jp/Tool/Base64-encode/

このサイトで画像データをbase64形式にencodeできる。
ここで取得した文字列をspec/fixturesに test_image.jpg.bin のような形式で保存

## ②encodeした画像データをテストコード上で読み込む

Base64形式の文字列は

```ruby
user_params[:avatar][:data] = File.read('spec/fixtures/test_image.jpg.bin') #base64形式でコントローラーで扱うため、encode舌文字列をパラメータにセット
```

このようにFile.readを使うことで読み込むことができる。

こうすることで無事テストが通った。実行環境の動きにも近いのでより保守性も高まったと言えると思う。やったね



### 注意点

modelテストやsystemテストではあくまで画像データを直接読み込むので、画像データそのものは残しておく。



### 参考

RSpecで、Base64エンコードされた画像ファイルをテストする
https://www.malanka.tech/entry/2020/07/18/070000
wordpressの教科書ver.4.xでコメントを入力しても受け付けてくれない時の対処

サイトにコメント機能を追加して動作チェックをしようと自分でコメントしてみるが、
全ての投稿でコメントが拒否されこんな表示がでてしまう。![comment.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571184/04cbcb3a-73eb-39af-248f-a564aac9fff0.jpeg)


このような時に疑うべきポイントは、
１、プログラムの入力ミス
２、wordpressのディスカッション設定
３、function.php のプログラムの引数


＜回答＞
1.と2.に関しては、書籍を見直してもらうか。
googleで”コメント 入力出来ない”とかで検索かけると出てきますので
調べてみてください。

３．が今回ハマった部分になります。
下のコードが書籍に書いてあるコードですが、そのまま入力してもコメントは拒否されます。

```function.php
function comments_allow_only_column($open, $post_id) {
  if(!in_category('column')) {
    $open = false;
  }
  return $open;
}
add_filter('comments_open', 'comments_allow_only_column', 10, 2);
```

では、どうしたら良いのかと言うと？
２行目の" if(!in_category('column')) "の引数に" $post_id "を追加していきます。
下のコードを参照してください。

 ```function.php
function comments_allow_only_column($open, $post_id) {
  if(!in_category('column', $post_id)) {
    $open = false;
  }
  return $open;
}
add_filter('comments_open', 'comments_allow_only_column', 10, 2);
 ```

なぜ、引数がないとだめなのかと言うと、
全てのページに固有IDがあるため,「$post_id」でどのページかを判定しているからです。
今回の場合だと、コラムカテゴリーではない、どのページなのか？をみていると言った感じです。
ページの固有IDは、編集画面に行けば確認できます。![post_id.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571184/5e934b86-0dab-d6c5-d968-8611573d4183.jpeg)

if(!in_category())　{ $open = false; }の意味は、
もし、サイトページから　「コラム（column)」　カテゴリー以外の
ページが開いた時、コメント入力欄を非表示にする条件の設定です。

理由なども書いてみましたが、間違っていたら教えてください。

参考サイトurl：https://xn--t8j3bz04sl3w.xyz/wordpress/post-id/1026/
参考サイトurl：https://www.prime-strategy.co.jp/5796/
MAMP（localhost）接続ができない。

突然、MAMP(localhost)が接続できなくて困っています。
添付ファイルのような表示が出ています。
環境は以下の通りです。

・Mac OS
・Chrome接続

![スクリーンショット 2021-03-23 8.27.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1099611/04c32ee0-fd12-181f-3b49-a44cc6c8d538.png)


接続方法についてご教示をお願いいたします。
よろしくお願いいたします。
【目次】2D最強のゲームエンジン"Defold"を使う！

#Defold
Defoldは「キャンディクラッシュ」などのゲームを制作している **King** が開発しています。なんと元々は社内開発用だったみたいです！
プロのゲーム制作会社が自社のために制作したゲームエンジンを**完全無料でロゴなしで**触れるなんてすごいですよね！(ふとっぱら！)   ([KingのWIKI](https://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%B3%E3%82%B0%E3%83%BB%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E3%83%BB%E3%82%A8%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%86%E3%82%A4%E3%83%B3%E3%83%A1%E3%83%B3%E3%83%88))

ただ問題もありまして。。。

このDefold、、、__日本語の情報が0に等しい！とっつきにくい！！__
なにしろDefoldは日本でとてつもなくマイナーなソフトなので日本語の情報が(もちろんQiitaにも)本当に雀の涙ほど。。。
なので！僕の書く記事では日本語で出来るだけわかりやすく解説していきたいと思います。

(僕は、プログラミング未経験の学生さんでも分かるようにページを作成していきますので、プログラミング経験者の方はどんどん飛ばして言ってもらって大丈夫です。)
各記事は随時追加していくので気長にお待ち下さい。

#お話
[お話](#お話)ではプログラミングやゲーム制作には直接関係ないことを書いていきます。「どんなソフトなんだろう？」「Luaってなに？」って思う人は読んで見ると良いかもしれません。逆に**興味がない人は読まなくても大丈夫**です。(そんな人は[初級](#初級)へいこう！)

[Unityに挫折しDefoldに移行した話](https://qiita.com/nonzu/items/68a964d66f9239563453)
[消えそうで消えないLuaの話](https://qiita.com/nonzu/items/99ea30d1b7e7145ee7b4)
#初級
[初級](#初級)ではDefoldとプログラミングの**基礎の基礎**を扱います。プログラミング未経験から始める人にもわかるように0から書いていきます。
[とりあえずインストールしなきゃね](https://qiita.com/nonzu/items/eae176d34a6766d7c75b)
[Defoldの画面と向き合ってみる](https://qiita.com/nonzu/items/ec456d6b9536798e4bfc)
[プログラムを編集する専用ソフトを使うと便利！](https://qiita.com/nonzu/items/4c3a01c389c7e8a17f5b)
[まだ古いバージョン使ってるの？](https://qiita.com/nonzu/items/579e0e624b5f39217fd5)
[知らなきゃまずい特有の要素一覧](https://qiita.com/nonzu/items/ca6c48fd28738c7f4c11)
[ちょっとだけLuaを書いてみる！！](https://qiita.com/nonzu/items/745563bc840c0ae86683)
[知らなきゃゲームは作れないベクトルの話](https://qiita.com/nonzu/items/058edb37799bed822c78)
[画像を読み込んでゲームオブジェクトにくっつける](https://qiita.com/nonzu/items/99073c977dfb70b260d2)
[キー入力を処理したい！](https://qiita.com/nonzu/items/924b36ea0d1a8c95834c)
[関数を使う](https://qiita.com/nonzu/items/4181361c5e894a08b8be)

#中級
[中級](#中級)ではゲームを作るときに、「これ便利！！」って思えるものを扱っていきます。
#実践
[実践](#実践)では公式チュートリアルを説明したり、実際使えるものを中心に扱っていきます。
#応用
[応用](#応用)では、普通は使わないし、理解が難しいものを扱っていきます。
Unityに挫折した僕がDefoldを選んだ理由

#Defoldとは
もともと、Defoldはキャンディークラッシュなどの人気ゲームを配信している[キング・デジタル・エンターテインメント](https://king.com/ja) ([Wiki](https://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%B3%E3%82%B0%E3%83%BB%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E3%83%BB%E3%82%A8%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%86%E3%82%A4%E3%83%B3%E3%83%A1%E3%83%B3%E3%83%88))が自分の会社で使うために作っていたゲームエンジンなんです。(ただし2D特化型です。)
それを一般公開したのが今のDefoldです。
ちなみにDefoldはJavaで作られています。
#なぜDefold？
この世にはたくさんのゲームエンジンがありますが、なぜ僕がDefoldを選んだのか。
その理由は**完全無料、ロゴ無し**で、自分の作ったゲームが**"Windows, macOS, Linux, HTML5(ブラウザ), iOS, Android, Nintendo Switch"**という
世の中のほぼ全てのデバイスで実行できるというスゴいソフトなんです！

まぁゲーム制作といえば3D、2D問わず制作できる[Unity](https://unity.com/ja)が人気ではありますが、
あのソフト重いしぐちゃぐちゃしていて僕は挫折しました。さらに、Unity無料版はロゴが入るのです。
さらにさらに、お金の話になりますが、Unityはある程度儲けがでるとUnityにお金を払わなければいけません。

その点、Defoldは**概念がわかりやすく、いくら儲けても収益が取られるということはありません！！**
しかも**簡単にクオリティが高いゲーム**が作れます！

#Defoldの長所
+ 2D特化型で実行が超高速
+ 公式チュートリアルのクオリティが高い
+ ソフトの大きさが軽量(全部で370MBもない) ←USBでも余裕で運べます
+ 同じプログラムを書いても上記のデバイスで実行できる
+ 出力したゲームも軽量

#Defoldの短所
+ Luaというマイナー言語を使ってる
+ 日本語の情報が限りなく少ない
+ 日本語(全角文字)の扱いが少し面倒

#さいごに
というわけで今回はDefoldのお話でした。
まぁ僕は高校生の時にゲームを作ることになり、ゲームエンジンを探していた所、今まで聞いたこともないDefoldを見つけました。情報はほぼ全部英語でしたが、勉強がてらやってみようと思って始めたら割と直感的で分かりやすくそれから結構使っています。これから、Defoldの解説記事を作る予定なので、興味のある人は以下の目次から覗いてもらえると嬉しいです。
[Defold目次](https://qiita.com/nonzu/items/73a39368855f3e1e0f28)
#参考
https://kazupon.org/what-is-defold-engine/
https://jp.gamesindustry.biz/article/1704/17041303/
http://prester.org/cf2.5/?p=5473
pi picoでmicropython その18

#概要

picoでmicropythonやってみた。
練習問題、やってみた。

#練習問題

adcで、読んで、グラフ表示せよ。

#サンプルコード

```
from machine import Timer
temp = machine.ADC(4)
tim = Timer()
def tick(timer):
   global temp
   v = temp.read_u16()
   v = v >> 4
   v = v & 0x1f
   print(" " * v, "*")
tim.init(freq = 1, mode = Timer.PERIODIC, callback = tick)


```

以上。
【Laravel】ゲートを使ってみたよ〜

##はじめに
今回は実務で実装していて
ゲートを使って特定のユーザーに対してアクセスを制限させることを
まとめていきます。
ゲートを使わずに実装しようとしたら
10箇所ほどに条件分岐を加えないといけなかったけど
それが一手間で済むのでぜひとも参考にしてみてください！

##認可とは？
そもそも認可ってなんでしょう？
>認可（英: authorization）とは、一般的には情報セキュリティおよびコンピュータセキュリティに関わるリソースへの、とりわけアクセス制御へのアクセス権限を特定する機能である。よりフォーマルにいえば、「認可する (to authorize)」とは、アクセスポリシーを定義することである。例えば、人事部門のスタッフは従業員の記録にアクセスする権限を与えられており、このポリシーはコンピュータシステム内のアクセス制御規則として定式化されているのが普通である。システムはそのアクセス制御規則を使って、（認証された）利用者のアクセス要求を受け入れるか拒否するかを決定する。リソースには、個々のファイルやアイテムのデータ、プログラム、コンピュータハードウェア、コンピュータアプリケーションが提供する機能が含まれる。利用者とは例えば、コンピュータユーザー、プログラム、コンピュータ上のその他の機器を指す。
引用元: フリー百科事典『ウィキペディア（Wikipedia）』

ん〜何が言いたいんだｗ
単純にまとめると
【誰が誰に何の権限を与えるか】
こちらが認可の意味合いになります。

あとから実装していきますが
今回は管理者とユーザーがいて
管理者はどのURLにもアクセスできるけど
ユーザーにはアクセスできるURLに制限をかける
これが今回やりたかった認可になります。

##いざ実装！

```PHP
// App\Models\User
public const ADMIN = 1;
public const USER = 2;
```
上記のようにUserにはroleを設定していて
それを使って認可していきます。

`App\Providers\AuthServiceProvider`クラスの`boot`メソッドに定義をする

```PHP
public function boot()
{
    $this->registerPolicies();

    Gate::define('admin', function (User $user) {
        return ($user->role == User::ADMIN);
    });
}
```
今回はシンプルに権限(role)が`User::ADMIN`と同じだったら認可がおりるようにした。
次に`routes/web.php`で

```PHP
Route::middleware('auth', 'can:admin')->group(function() {
    // 管理者が使用するrouteを定義
});
```
なんとこれだけで管理者以外はアクセスすることが認可されないrouteを定義することが
出来ちゃいます！
ここで注意が必要なのが上記のコードで管理者以外が管理者しかアクセスできないrouteに
アクセスすると403が返ってくるのですがLaravelには403ページが用意されてないので
個別で403ページを作成する必要があります！

##まとめ
今回はゲートについてまとめてみました。
ゲートを知らなかったら各ルートに対して条件分岐を書いて
遅くまで残業するところでしたｗ助かった。

最後まで読んでいただきありがとうございます。
ついでにLGTMをポチッとお願いします。また、誤りや別の良いやり方などありましたら
コメントにて頂けると嬉しいです。
pi picoでmicropython その17

#概要

picoでmicropythonやってみた。
練習問題、やってみた。

#練習問題

adcで、読んで、ws2812を光らせよ。

#サンプルコード


```

from machine import Pin, Timer
import array
import time
@rp2.asm_pio(sideset_init = rp2.PIO.OUT_LOW, autopull = True, pull_thresh = 24, out_shiftdir = rp2.PIO.SHIFT_LEFT)
def ws2812():
   label("loop")
   out(x, 1)
   nop().side(1)
   jmp(not_x, "tugi")
   nop()
   nop()
   nop().side(0)
   label("tugi")
   nop().side(0)
   nop()
   jmp("loop")
sm = rp2.StateMachine(0, ws2812, freq = 5_000_000, sideset_base = Pin(17))
sm.active(1)
temp = machine.ADC(4)
tim = Timer()
def tick(timer):
   global temp
   global sm
   NUM_LEDS = 7
   ar = array.array("I", [0 for _ in range(NUM_LEDS)])
   v = temp.read_u16()
   s = '{:06x}'.format(v)
   print(s)
   for j in range(NUM_LEDS):
      ar[j] = v
   sm.put(ar, 8)
tim.init(freq = 1, mode = Timer.PERIODIC, callback = tick)


```

以上。
Gmailの右ペインの一覧表示を複数行表示に固定するUserScript

# 一応2年位使っています。
なので、もうしばらくは活用はできるかと。

# 環境
* Tampermonkey
* Gmail (左右2ペイン表示時)

# Script
```javascript:user&#x20;script
// ==UserScript==
// @name         gmail Zs
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        https://mail.google.com/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // Your code here...
    document.body.classList.add('Zs');
})();
```
```javascript:bookmarklet版
javascript:(function(){document.body.classList.add('Zs');})();
```

# 🍤 エビデンス
## 変更前
幅を広げると ``右ペイン`` は ``複数行表示`` ⇔ ``1行表示`` で変化する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/56c014c4-c386-92a5-44bc-0faa8f15cddc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/e4a3d1ae-4fae-4bef-7c0b-95900b871e60.png)
## 変更後
幅に限らず、常に ``右ペイン`` は ``複数行表示`` 。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/56c014c4-c386-92a5-44bc-0faa8f15cddc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/a95880d7-57fc-d68f-ccb9-cdad5dc858f6.png)

# 解説
``右ペイン`` の表示スタイルはjavascriptによるイベント制御によって、幅でコントロールされている。javascriptで ``Zsクラス`` を制御し、CSSによってデザイン適用がされており、

* 幅が狭いとき ⇒ ``Zs`` あり ⇒ ``複数行表示``
* 幅が広いとき ⇒ ``Zs`` なし ⇒ ``1行表示``

といった形で切り替えを行っている。また、 ``Zsクラス`` でのスタイル適用は上位の方についており、階層関係が厳密ではないため、 **必ずあるであろう ``bodyタグ``** でもデザインを付け、**デザインを恒常化** させている。

``bodyタグ``に付けた ``Zsクラス`` に付けられるのは、

* pjaxによる画面遷移でも無くならない。
* 本家のイベント制御で消されない
* 最初に1回で付たっきりで良い。

といった恩恵もあり、結構ありがたい構造である。


# あとがき
ウィンドウの1端が画面外に出てしまう操作を行う方ですか？

私は最近、ダメな口だと気づいた。あるウィンドウを隅に寄せるとしても、1端が画面外に出てしまわない様、画面内での移動をを行い、画面のサイズ変更を行う。また、昨今では、Windows10で拡張されたAeroSnapを多様し、ウィンドウを画面内に整列させて使うなどのしている。

画面内に囚われない人であれば、そのまま移動させて終わりなのだろうけど。私の様に苦手なタイプの人間としては、そうでない人に比べて、ウィンドウ サイズを変える頻度が多いので、それによるスタイル変化はUXが悪いケースもしばしばある。もちろんその逆もあるが。

今回のGmailの一覧表示については、割と ``複数行表示`` 自体の視認性も悪くないことから、**常に ``複数行表示`` で固定してほしい** 人も少なくないと思う。 (この場合は、``ウィンドウが小さくなった際に変化するのが嫌`` なのではなく。 ``普段ウィンドウ サイズが小さい方をメインで作業しており、ウィンドウを大きくした際に変化するのが嫌`` 、という塩梅。)

なお、個人的には ``ウィンドウを整列させる`` 機能の延長線ではなく。もっと固く、``ウィンドウの領域を分割する``機能が欲しいなぁ、と思う。Windows8.1の頃はストア アプリ2 + デスクトップで3つまで分割出来たの、なにげに嬉しかったなー。まぁストア アプリ自体にまともなアプリが存在しない (現在形) ので、使い道はそんなになかったのだけど。。。
Qiita Daily Survey memo 2021.03.23

# Qiita Daily Survey memo 2021.03.23
Qiita の記事を可能な限り毎日読むために、読んだmemoを公開することでモチベーションを維持しようという試み。

## [Pythonのみで業務スーパーの各店舗と気象状況を可視化する](https://qiita.com/OgawaHideyuki/items/a0024db39318240a5de7)
hide ogawa(OgawaHideyuki)さんの記事。
業務スーパーの住所をスクレイピングし、加えて気温情報を付与して可視化する…という記事になります。
緯度経度情報から folium のライブラリを使って可視化されており、最初に載っている gif の通り、いい感じの仕上がりになっています。
また、『[Webスクレイピングする際のルールとPythonによる規約の読み込み](https://vaaaaaanquish.hatenablog.com/entry/2017/12/01/064227)』として、スクレイピングするときに気を付けることのリンクも掲載していただいています。
技術的に可能と、法的に可能があるかと思いますが、後者はなかなか勉強する機会がないのでとても助かります…。
Folium を使ったことありませんが、どこかで聞いたなー…と思いメモを読み返していると、以前ランキングにも上がっていた
『[それなりに多い(数万件単位の)位置情報を、簡単に無料で地図上にプロットして確認する方法3選](https://qiita.com/terukizm/items/07bea0cdd25e9b83fc11)』で、トップに紹介されていましたね。
とても使いやすそうなので、触ってみます！


## [無料で使える (癒やされたいだけの) 公開APIリスト: ねこ、いぬ、キツネ、柴犬、ジブリ](https://qiita.com/e99h2121/items/6d5cc72679f43aa37be2)
Nobuko YAMADA(e99h2121)さんの記事。
YAMADAさんの記事で息抜き系と言えば『[イースターエッグの記事](https://qiita.com/e99h2121/items/cece7102a37c189778e8)』と『[js no need](https://qiita.com/e99h2121/items/343b401de01e5bdf5f5c)』の記事が思い浮かびますが、今回は別ベクトルの癒される系です。
非常に有用なAPIのご紹介です。
Twitter で動物の画像や動画をよく見て癒されていますが、こういうのもあるのですねー…。
あひるさんが好きなので調べてみましたが、Gitに公開されているAPIには、いぬさんとねこさんときつねさんしかいないようです…。
また、リンク記事のAPI 48カテゴリもbookやcalendarなど興味のあるものがあるので触ってみたいと思います。


## [総務がGASで請求書業務を半自動化してみた。](https://qiita.com/minamisatomi/items/099957c825dc739ec928)
minami satomi さんの記事。
内容はタイトルの通りなのですが、記事の書き方がストーリー仕立てになっていて、興味深く読ませていただきました。
gasしかり、最近無料になったPower Automate Desktopしかり、これからプログラミングにあまりかかわってこなかった方でも、誰かの話を聞きながら自動化をしていく時代なのかなーと感じました。
業務で総務のExcel資料の作成お手伝いをしたことがありますが、細かいところではショートカット、大きいところでは同じことを何回もするので自動化すれば楽なのになーと強く感じました。
最初から大きくやろうとするとしんどいので、小さいところから少しずつ興味とやり方を学んでもらえば、あとは自分で調べてどんどん改善できそうな感じがあります。
Linux 環境変数を設定してみた（PATHについても少々記載）

_昨日の勉強会でLinuxの環境変数について勉強し、かなり理解が深まったので、
分かりやく書いて行こうと思います！（ところどころ誤りががありましたら申し訳ありません）
自分もよくPATHを通すだの環境変数だの学習しているとマジでよくわかん単語をよく見かけます。
はっきり言っても物凄く嫌いでした(T_T）_
なので今回は環境変数を理解して環境変数を定義してみました。
#目標
環境変数を設定する。
主に初学者に向けての記事です。
##環境
・mac
・シェル（bash)
#まずはPATHとは？
少々タイトルとは異なる内容で申し訳ないです。
「PATH」という環境変数になります。
この「PATH」という環境変数には、コマンド検索パスが保存されていて、コマンドを実行するプログラムを探しに行く場所が定義されているみたいです。
実行すべきコマンド（ファイル）を特定のディレクトリから検索して実行してくれる。
参考記事
https://www.atmarkit.co.jp/ait/articles/1605/09/news013.html
##「PATHとういう環境変数の内容を表示する」
```console
$ echo $PATH
###出力結果
.rbenv/bin:/usr/local/mysql/bin:/Users/hajime/.rbenv/shims:/Users/.pyenv/shims:/Users/.pyenv/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
```
わかりずらいですが、「PATH」という環境変数には、複数のディレクトリが設定されいてディレクトリは「：」で区切られています。
わかりやすく改行したものが下記になります。

```console
/Users/.rbenv/shims
/Users/.rbenv/bin
/usr/local/mysql/bin
/Users/.rbenv/shims
/Users/.pyenv/shims
/Users/.pyenv/bin
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
```
#環境変数とは?
~~なんか、難しい感じがしますが超絶簡単に言うと
__自分のPC（ローカル環境）__で使える変数の事です。
つまり自分のパソコンに設定してある特殊な変数を環境変数と言います。~~

#PATHを通すとは？
結論から言うと、環境変数「PATH」を設定してコマンド検索パスを追加する事です。

#実際に環境変数を設定してみた

```console
###環境変数の内容を表示するコマンド
$ printenv

###実行結果
＊環境変数「PATH」
　│　
PATH=/Users/.rbenv/shims:/Users/.rbenv/bin:/usr/local/mysql/bin:/Users.rbenv/shims:/Users/.pyenv/shims:/Users/.pyenv/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
SHELL=/bin/bash
TERM=xterm-256color
　│　    └変数の中身
変数名
***この他にも多くありますが今回は省略させていただきます。

###環境変数を定義
$ export 「変数名」=「環境変数の中身」
***厳密には exportコマンドには他にもシェル変数を定義したり、一覧表示できるみたいなのですが私の知見不足のため割愛させていただきます。
$ export testPath="hellow Linux Path"

###環境変数がセットされているか確認
$ printenv testPath
###実行結果
hellow Linux Path
###環境変数の一覧から確認する
printenv
PATH=/Users/.rbenv/shims:/Users/.rbenv/bin:/usr/local/mysql/bin:/Users.rbenv/shims:/Users/.pyenv/shims:/Users/.pyenv/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
SHELL=/bin/bash
TERM=xterm-256color
testPath=hellow Linux Path***今回追加した環境変数

###先ほど作った環境変数を削除する
unset testPath
```
#結果
環境変数が無事に設定できた！
#余談
完全に話が違ってきますがふと私が疑問に思った事です。
「ls」や「cat」コマンドなども本来ならプログラムの場所を指定しないと実行できないコマンドなのになぜ、「ls」などだけで実行できるのか？本来なら「/bin/ls」のコマンドで実行しないとできないはずでは？
Linuxでは、コマンド検索パス（環境変数？）登録されているファイルは、パス名を省略してもいい決まりがあるそうです。
すいませんこちらは、全然理解できていないので、説明は割愛させていただきますが
今後はこの事もっと深掘りして何故コマンドが省略できるのかをに説明できるように精進します。
【フロントエンド】CodePenを使ってみた

# CodePenを使ってみるだけ

![codepen-wordmark-display-inside-black@10x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505645/5131b50b-03d2-8c8b-45e2-032b7da44df0.png)

Qiita記事などでよく見かける、ソースコードを簡単に共有できるツールです。

# 1. 公式へ移動してアカウント登録

[CodePen](https://codepen.io/)にてアカウントを新規登録します。
登録はしなくても利用できますが、登録しておくと作成したものを保存したりできるようです。

![スクリーンショット 2021-03-23 045929.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505645/b4c84fdf-b1df-0578-d482-e4124fd015aa.png)

# 2. ソースコードを記述

サイトが用意しているエディターにソースコードを記述していきます。
最初はチュートリアルがあるので、今回はそれに従ってみます。

![スクリーンショット 2021-03-23 050252.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505645/8efe1733-dd82-d579-7c35-ae427601b061.png)

# 3. 出力する

できたものを保存して出力します。
まず、エディター右下にある「Embed」をクリックします。

![スクリーンショット 2021-03-23 050650.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505645/40f1ce10-6e65-b67f-c19f-31954be059ba.png)

すると、次のようなポップアップが表示されます。

![スクリーンショット 2021-03-23 051009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505645/fc48afef-9536-b570-a1ee-3f70a21c58f6.png)

画像の赤枠に出力結果が表示されます。今回はQiitaに乗せたいので、「HTML(recommended)」を選択しました。
必要であれば、幅や色などもここで指定します。

# 4. 共有する

あとは、出力結果を記事に張り付けるだけです。

なお、Qiitaの下書き状態ではCodePenはまだ表示されませんが、公開状態であればちゃんと表示されますので焦る必要はありません。

![スクリーンショット 2021-03-23 052348.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505645/0d6b1037-4a7e-267d-d75b-402e05ea9008.png)

できたものがこちらです！
↓↓↓

<p class="codepen" data-height="259" data-theme-id="light" data-default-tab="css,result" data-user="oioigohan" data-slug-hash="abpbdjx" style="height: 259px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="abpbdjx">
  <span>See the Pen <a href="https://codepen.io/oioigohan/pen/abpbdjx">
  abpbdjx</a> by oioigohan (<a href="https://codepen.io/oioigohan">@oioigohan</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# おわりに

以上、CodePenを使ってみたでした。Angularなどのフロントエンドの記事を書くときに、今後役に立つ気がしています。[StackBlitz](https://stackblitz.com/)とうまく使い分けながら使っていきたいです。
透明なNavigationBarをViewにかさねて表示

NavigationBarとかさねて表示したいViewのTopSpaceのConstraintをsafeAreaではなくsuperViewとの関係で0に設定して、

```swift

navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationController?.navigationBar.shadowImage = UIImage()
navigationController?.navigationBar.isTranslucent = true
```

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

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

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
MacのFinderでプレビューが表示されない時

## Finderでプレビューが表示されない

Macユーザーなら必ず使うFinder、ある時急にプレビューが表示されなくなりました。
画像データやpdfをわざわざ開かずにパッと見できて便利だったのですが、これは困った...

<img width="500px" alt="first.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392018/93992640-18f7-8841-1443-3423a84a867d.png">

## 筆者の環境

- macOS Big Sur バージョン 11.2.3

## 原因 (ショートカットキーの押し間違え)

Finderでは `⌘ + P` がプリントのショートカットキーに相当するのですが、`⌘ + Shift + P` がプレビューの表示・非表示を切り替えるショートカットキーでした。

**結論** `⌘ + Shift + P` を押せば解決します。

<img width="500px" alt="second.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392018/638b04ea-1b25-d58a-cb74-309ce1d21aed.png">
GUIで同じ操作をする場合は Finder の「表示」→「プレビューを表示」を選択してください。

## 「表示オプション」でプレビュー表示を切り替える

`⌘ + J` を押す、あるいは「表示」→「表示オプションを表示」を押すと、このようなメニューが表示されます。

<img width="240px" alt="third.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392018/61a28e69-40fb-6256-e758-846d874c63e0.png">

これの「プレビュー欄を表示」にチェックをつけることでもプレビュー欄を表示させることができます。

---

あまり出番はないと思いますが、 `⌘ + Shift + P` でサッとプレビューを隠したり表示したりができますね！
それでは良い Mac Life を:kissing:
before_actionについて

例えば、こんなクラスがあるとする
これは各メソッドで同じ処理を必ずしているから`before_action`に書いて纏めると良い

```
def index
  @users = User.new 
end

def show
  @users = User.new 
end

def new
  @users = User.new 
end
```

こうなる

```
before_action :set_users

def set_users
  @users = User.new
end
```
各アクションが実行される前に呼ばれる

####特定のメソッドが呼ばれる前に呼びたい時
```
before_action :set_users, {only:[:edit, :update]}
```
onlyを使う時は1件でも複数件でも[]を使う
VimでJSONをフォーマットするカスタムコマンド

`jq`をインストールする

```sh
$ brew install jq
```

.vimrcに以下のカスタムコマンドを定義する

```vimscript:.vimrc
function! JsonFormat()
  set filetype=json
  :%!jq '.'
endfunction
command Json :call JsonFormat()
```

`:Json`コマンドでJSON形式にフォーマットすることができる

![json3333.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145075/03f07443-641c-f734-4f65-9ffeb554af55.gif)
Pillowで絵文字（emoji）が表示されない

# 背景
#### Pillowで絵文字が表示できなくてハマった
Pillowで絵文字をレンダリングしたくてあちこち検索し「**結局使えるの？使えないの？はっきりして！**」と思った頃に**無事出力できた。**

下のような残念な出力結果と格闘している方の時短のためにメモ。
![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565176/74880518-059b-33a6-47c8-dd18b2ab4cb2.png)

# 解決方法
#### 見つけたかったのはこの記事だ
https://github.com/python-pillow/Pillow/pull/4955

①`NotoColorEmoji.ttf`と`seguiemj.ttf`をダウンロードしてきて、下記の`test.py`と同じ階層に入れる。
②`test.py`を実行すると絵文字がレンダリングされて出力される。

```python:test.py
from PIL import Image, ImageDraw, ImageFont

def test(font, out_name):
    fnt = ImageFont.truetype(font, size=109, layout_engine=ImageFont.LAYOUT_RAQM)
    im = Image.new("RGBA", (600, 600), (100, 100, 100, 100))
    draw = ImageDraw.Draw(im)
    draw.text((0, 32), "a\u263A", fill="#faa2", embedded_color=True, font=fnt)
    draw.text((0, 132), "a\u263A", fill="#faa8", embedded_color=True, font=fnt)
    draw.text((0, 232), "a\u263A", fill="#faa", embedded_color=True, font=fnt)
    draw.text((0, 332), "\U0001F3AC\U0001F44B\U0001F3FB\U0001F44B\U0001F3FF", fill="white", embedded_color=True, font=fnt)
    draw.text((0, 432), "a\u263A", fill="#faa2", font=fnt)
    im.show()
    im.save(f"testemoji_{out_name}.png")

test("NotoColorEmoji.ttf", "cbdt")
test("seguiemj.ttf", "colr")
```

お！かわいい感じでレンダリングされている。

2つのフォントの特性を見比べてみて、自分は`NotoColorEmoji.ttf`の方が好みだったので、そちらを使うことにした。

出力したかった、[**令和市**](https://twitter.com/ReiwaCityNews)のカレンダー画像も無事に完成。
![163178705_447821296546538_7330220945816850437_n.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565176/7d5dd48b-709d-55c3-97e6-9afb43a8d581.png)

# 余談
####結果：Pythonistaでは動かなかった.

自分はPythonを使うときに、**iPad×Pythonista**環境を使ってるのだが、PythonistaではうまくPillowがアップデートできなかった。

そのため、`NotoColorEmoji.ttf`を使おうとするとエラーが出て、絵文字レンダリングを完了できなかった。

しかし、Pythonistaで作成したファイルを [**a-Shell**](https://holzschu.github.io/a-Shell_iOS/)で実行したらうまくいった。

Pythonistaはコーディングしやすいし、a-shellは更新しやすいので,この連携は今回以外にも応用が利く気がする。
新技術説明まとめ

## 新技術説明

3次元血管画像認識装置
https://shingi.jst.go.jp/list/3tohoku/2020_3tohoku2.html

多数同時接続と超低遅延を実現する新たな通信技術 WHISTLE
https://shingi.jst.go.jp/list/uec/2021_uec.html

人工知能応用・汎用HPCむけプロセッサコア構成技術
薄膜型THz波高機能制御素子の開発
https://shingi.jst.go.jp/list/riken/2021_riken.html
シェルスクリプト　curl -fsSLの意味

# `curl -fsSL`の意味

Dockerfileを読んでいたときに遭遇したので、自分用のメモとして残します。

## -f, --fail

（HTTP）サーバーエラーでサイレントに失敗します（出力はまったくありません）。

これは主に、失敗した試行をより適切に処理するためにスクリプトなどを有効にするために行われます。

通常、HTTPサーバーがドキュメントの配信に失敗すると、そのことを示すHTMLドキュメントが返されます（多くの場合、理由なども説明されています）。

このフラグは、curlがそれを出力するのを防ぎ、エラー22を返します。

この方法はフェイルセーフではなく、特に認証が含まれる場合（応答コード401および407）、失敗した応答コードがすり抜ける場合があります。

## -s, --silent

サイレントモード。 プログレスメーターやエラーメッセージを表示しません。 カールをミュートにします。

## -S, --show-error

-sとともに使用すると、失敗した場合にcurlにエラーメッセージが表示されます。

## -L, --location

（HTTP / HTTPS）要求されたページが別の場所（Location：ヘッダーと3XX応答コードで示される）に移動したことをサーバーが報告した場合、このオプションはcurlに新しい場所で要求をやり直させます。

## まとめ

- HTTPリクエストがサーバーのエラーにより失敗した時に22というEXIT CODEを返す。
- 進行の状況を表示せず、エラーメッセージは表示する。
- アクセスしたページが移動していた場合、もう１度移動先にリクエストを送る。


## 参考

[explainshell.com - curl -fsSL example.org](https://explainshell.com/explain?cmd=curl+-fsSL+example.org)

[curlのオプション-fsSLを読み解く - hy4yh’s diary](https://hy4yh.hatenablog.com/entry/2018/12/06/183841)
vsIE（ボタンのレイアウトが崩れる編）

# はじめに
前回の記事同様IEに苦しめられた内容を備忘録として残していきます！ 


ということで今回は「**ボタンのレイアウトが崩れる編**」です。 
ボタンの中身の文言をただただ中央に表示したいだけなのに…！

もし他にステキな解決法があれば是非教えてください！！ 
では！早速！ 

# ボタンのレイアウトが崩れるんじゃ…

やりたかったことしては、文字が中央に配置されているような、シンプルにボタンを実装したかっただけです。
（こんなに詰むことになろうとは…）

そんな難しいことではないので以下のような感じで実装しました。

```html:index.html
<div class="contents">
  <button type="button" class="button">buttonタグ</button>
  <a href="#" class="button">aタグ</a>
</div>
```

（contentsについては今は特に気にしないでください。）

```css:style.css
.button {
  display: block;
  width: 100%;
  min-height: 40px;
  padding: 0 1rem;
  color: #FFF;
  text-align: center;
  background-color: #4682b4;
  box-shadow: 0 5px 5px 5px rgba(0, 0, 0, 0.1);
  border-radius: 20px;
}
```

button要素に関しては特に問題なく、理想どおりに表示できます。

![0_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251276/61117c38-d7f5-cb5f-0cfc-1fc08204106b.png)

それにプラスして、今回はa要素もボタンのように見せたかったのでaタグにも同じようなスタイルを当てます。

![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251276/d358b69d-ae55-2c6e-59cf-912f61be0d77.png)

あーa要素だとうまく中央に配置されないな…
それじゃあ…

```css:style.css
.button {
  display: flex;
  justify-content: center;
  align-items: center;
  width: 100%;
  min-height: 40px;
  padding: 0 1rem;
  color: #FFF;
  text-align: center;
  text-decoration: none;
  background-color: #4682b4;
  box-shadow: 0 5px 5px 5px rgba(0, 0, 0, 0.1);
  border-radius: 20px;
}
```

こうしたれ…！

![1_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251276/881b9f11-e4a0-4f9a-48e7-d0dcde00e372.png)

よし！いい感じですね。

じゃあIEで確n…

![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251276/ef74b1fb-bd1f-c886-5849-691b2a1838e9.png)

～END～

## 原因

またまた素晴らしい記事を見つけました。
[IEでflex「align-items」が効かないときの対処法](https://blog.universe-web.jp/5484/)

まさにその通りでmin-heightを使っているのが原因のようでした。
またお前か…
高さをしっかり固定してやらないといけないってことでしょうか…

ただここで問題が。
想定されるボタンのパターンとして、ボタン内の文言が複数行になるパターンがあり、
高さを固定してしまうと、文字がボタンの枠を突き抜けてしまう可能性があります。

どうしたものか…

## 解決策（なのか？）

色々試行錯誤していたところ、あることに気が付きました。

「あれ？ちゃんと中央揃えになってるボタンもあるゾ…？何故？」

違いを確認してみると、親要素に`display:flex;`と`flex-direction: column;`が当たってる事に気が付きました。
一度試してみます。

```css.style.css
.contents {
  /* --追加-- */
  display: flex;            
  flex-direction: column;
  /* ------- */

  width: 300px;
  height: auto;
  background-color: #FFF;
  margin: 1rem;
  padding: 1rem;
}
```

スタイルを当ててやると、

![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251276/2ba08942-79b5-da57-db09-bed093d07d5a.png)

IEでもうまく中央に表示してくれました。


# まとめ

これといった原因がわからないのですが…
おそらく色々な要因が重なってるような気がします。
a要素をボタンのように見せたいが為に、`display: flex;`をあてて中央に揃えていますが、
そもそもbutton要素であれば、`display: flex;`をあてなくても、`text-align: center;`などで中央に寄ってくれます。
そして正直なところ、なぜ親要素に`display: flex;`と`flex-direction: column;`を当てれば中央揃えになってくれるのかは分からないです。。
もっと根本的なところを理解しないとわからないのかな～と思いつつ、~~めんどくｓ~~なかなか手を付けられずにいます。
[PlayCanvas] Spineデータを外部から取得して、再生する

# はじめに
* DMM GAMESにあるようなブラウザゲームを作りたい。
* キャラが増える度に インポート→ビルド をするのは手間。
* とりあえず公式プラグインを使用して実装する。

急遽必要になった実装なので、備忘録的に。

# アセット取得
Spineアニメーションを構成するSkeleton, Atlas, Textureを取得します。
外部リソースを使用するため、[assets.loadFromUrl()](https://developer.playcanvas.com/en/api/pc.AssetRegistry.html#loadFromUrl)を使用してアセットの読み込み、作成をします。

## Skeleton
SkeletonはJson形式なので`pc.ASSET_JSON`で取得できます。

``` javascript
const url = '';
this.app.assets.loadFromUrl(url, pc.ASSET_JSON, (err, asset)=>{
    this.skeleton = asset;
});
```

## Atlas
Atlasは`assets.loadFromUrl()`がサポートする形式ではないので、ファイル拡張子をtxtに書き換える必要がある。
その上で、取得時は第2引数の型に`pc.ASSET_TEXT`を指定します。

``` javascript
const url = '';
this.app.assets.loadFromUrl(url, pc.ASSET_TEXT, (err, asset)=>{
    this.atlas = asset;
});
```

## Texture
`pc.ASSET_TEXTURE`で取得できます。

``` javascript
const url = '';
this.app.assets.loadFromUrl(url, pc.ASSET_TEXTURE, (err, asset)=>{
    this.texture = asset;
});
```

# スクリプトにセット、再生
取得した各アセットを使用してアニメーションを再生します。
再生方法などは調べると出てくるので、ここではセットだけ。

``` javascript
this.entity.script.create('spine', {
    attributes: {
        atlas: this.atlas,
        skeleton: this.skeleton,
        textures: [this.texture],
    }
});

const anim_name = '';
this.entity.spine.state.setAnimation(0, anim_name, false);
```

# まとめ
ここまでの処理をひとまとめにしてみます。

``` javascript
var ExternalSpineAsset = pc.createScript('externalSpineAsset');

ExternalSpineAsset.attribute.add('status', {type: 'number', default: 0});

ExternalSpineAsset.prototype.initialize = function() {
    this.atlas = null;
    this.skeleton = null;
    this.texture = null;

    this.on('attr:status', this.onUpdateStatus, this);

    this.app.assets.loadFromUrl('url', pc.ASSET_JSON, this.onLoadAtlas);
    this.app.assets.loadFromUrl('url', pc.ASSET_TEXT, this.onLoadSkeleton);
    this.app.assets.loadFromUrl('url', pc.ASSET_TEXTURE, this.onLoadTexture);
};

ExternalSpineAsset.prototype.onLoadAtlas = function(err, asset) {
    this.atlas = asset;
    this.status |= 1;
};
ExternalSpineAsset.prototype.onLoadSkeleton = function(err, asset) {
    this.skeleton = asset;
    this.status |= (1 << 1);
};
ExternalSpineAsset.prototype.onLoadTexture = function(err, asset) {
    this.texture = asset;
    this.status |= (1 << 2);
};

ExternalSpineAsset.prototype.onUpdateStatus = function(value, prev) {
    if( value === 7 ){
        this.entity.script.create('spine', {
            attributes: {
                atlas: this.atlas,
                skeleton: this.skeleton,
                textures: [ this.texture ]
            }
        });
    }
};
```

# おわりに
各アセットが１つしかない場合での簡易的な実装になります。
キャラ素材が複雑でテクスチャが複数である場合などは、都度実装を考える必要があります。