OmniAICreator/Qiita-1.07M huggingface dataset:
API Gateway 経由で Lambda 呼び出して CORS ではまったのでメモ。

## 概要
Vue.js から API Gateway 経由で Lambda 関数を呼び出したら CORS のエラーが出てはまったので書きます。状況としては、Vue.js で axios の get を使用して、認証ありの API Gateway 経由で Lambda 関数を呼び出したら、console に "Access to XMLHttpRequest at '< API の URL >' from origin '< フロントの URL >' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource." というエラーが出ました。ちなみに、API Gateway で CORS の有効化は既に行なっている状況でした。

## CORS を有効化
念のため、CORS を有効化するところから書きます。詳しい方法は AWS 公式ドキュメントの [こちらのページ](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/how-to-cors.html) の 「API Gateway コンソールを使用してリソースで CORS を有効にする」 に載っています。
　まず、「アクション」 から 「CORSの有効化」 をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274610/ae892862-640e-4203-9916-dcb783677f51.png)
次の画面で、「CORS を有効にして既存の CORS ヘッダーを置換」 ボタンをクリックします。その次の画面で、「既存の値を置き換えます」 ボタンをクリックします。すると CORS が有効化されます。

## エラー時の状況と解決方法
エラー発生時は、Lambda 関数を以下のように書いていました。

```python:sample.py
...省略
def lambda_handler(event, context):
    table = dynamoDb.Table(<テーブル名>)
    # DynamoDB からデータを取得 
    response = table.query(
        KeyConditionExpression=Key('<key>').eq('<条件>')
    )
    return response
```

以下のように、テーブルから取得した値を json.dumps() を使用して JSON 形式に変換し、headers として Access-Control-Allow-Origin に '*' を指定して返すようにすると上手くいきました。

```python:sample.py
...省略
def lambda_handler(event, context):
    table = dynamoDb.Table(<テーブル名>)
    data = table.query(
        KeyConditionExpression=Key('<key>').eq('<条件>')
    )
    response = {
        'statusCode': 200,
        'body': json.dumps(data),
        'headers': {'Access-Control-Allow-Origin': '*'}
    }
    return response
```
Thano入門　関数の定義と自動微分

[広島大学ITエンジニアアドベントカレンダー Advent Calendar 2019](https://adventar.org/calendars/4481)の6日目の記事です。

広島大学工学部4年生荒木勇登です！
来年から福岡でITエンジニアします！
いみこというハンドルネームでTwitterをやっていますのでそちらもご確認ください。
（https://twitter.com/es__135 ）

#Thano入門

```Python:
import numpy as np
import theano.tensor as T
from theano import function

x = T.dscalar('x')
y = T.dscalar('y')
z = x + y
f = function([x,y],z)
f(2,3) #array(5.)が出力されます。
```
（より引用http://deeplearning.net/software/theano/tutorial/adding.html#exercise）

5,6行目で下の関数で使う変数を定義して、7行目、8行目で関数を作ります。
慣れないうちはちょっと違和感がありますが書き慣れると書きやすくなってくる書き方です。

これの応用で三平方の定理を書いてみます。

```Python
x = T.dscalar('x')
y = T.dscalar('y')
Pythagoras = ( x**2 + y**2 )**(1/2)
length     = function([x,y],Pythagoras)
length(3,4) #5.0が出力されます。
```

#自動微分
詳しいことはWikipediaを読んで欲しいのですが、定義した関数の微分を計算することができます。

```Python
x = T.dscalar('x')

#y = sin(x) + cos(x)
y = T.sin(x) + T.cos(x)

#yをxに関して微分するの意味
gy = T.grad(cost=y, wrt=x)

f = function(inputs=[x], outputs=gy)

# 具体的なxを与えて微分係数を求める
print (f(0))        #1.0
print (f(np.pi / 4))#1.1102230246251565e-16
print (f(np.pi))    #-1.0000000000000002
```

([この記事](http://aidiary.hatenablog.com/entry/20150518/1431954329)を参考にさせていただきました。この記事では他にたくさんの実例が紹介されていますのでオススメです。)

また、

```Python
x = T.dscalar('x')
y = T.dscalar('y')
z =  T.sin(x) + T.cos(y)
#z = sin(x) + cos(y)

#yをxに関して微分するの意味
dx    = T.grad(cost=z, wrt=x)
dy    = T.grad(cost=z, wrt=y)
dz_dx = function(inputs=[x,y], outputs=dx)
dz_dy = function(inputs=[x,y], outputs=dy)
# 具体的なxを与えて微分係数を求める
pi = math.pi
dz_dx(pi/2,pi/2) #array(6.123234e-17)
dz_dy(0,pi/2)    #array(-1.)
```
このように２変数の微分の計算も行うことができます。
なんとなく使い方がわかっていただけたでしょうか。

#まとめ
すこし特殊な書き方ですが、慣れると意外と書きやすく使いやすいと思いました。
時間があればThanoを使ってニューラルネットワークを実装する記事も書いてみたいと思います。
これが初期のDeepLearingでに使われていたライブラリでここから現代のライブラリに発展していった道のりは想像もつきません笑。勉強します

#参考文献
theano ドキュメンテーション
http://deeplearning.net/software/theano/tutorial/adding.html#exercise

人工知能に関する断創録
http://aidiary.hatenablog.com/entry/20150518/1431954329

github
https://github.com/Theano/Theano
脱出ゲームのようなものを作成するKitのPGM

GASから脱出ゲームについての各ページのデータをJSONで作成し、
そのデータをJavaScriptで読み込ませることで
脱出ゲームを作成できるようなプログラムを作成しました。

脱出ゲームKitのサンプルページURL:https://nanjomiyako.github.io/DasyutuGame1/

脱出ゲーム用の各ページ(とアイテムとアイテム合成)データを
作成するためのGASページサンプル(CreateJsonDataメソッドより作成):https://docs.google.com/spreadsheets/d/e/2PACX-1vQrSTK83cIbQwfRdl2jRlfVjQ49fBsSOtvD0nfJtLKPsw2-bp1K0RIYT0lF1PUfRQN84EhYSKAVQD-Q/pubhtml

GASPGM: https://github.com/NanjoMiyako/SampleGasScripts1/blob/main/DasyutuGame1.txt



作成したJsonデータから脱出ゲームの動作を行うJavaScriptプログラム
のgithubURL(中のindex.htmlをコピーすれば動作可能となることを確認済み)：https://github.com/NanjoMiyako/DasyutuGame1

プレビュー
![preview1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412430/78c9d07b-9123-ba2f-65b7-294ebbb25b78.png)
【PowerShell】バックアップファイルを作成するスクリプト

#1.この記事について
こんなケースを想定。
《バックアップファイルを簡単に作成したい》
《日付ごとにファイルを分けて進捗をチェックしたい》

※Git等のリポジトリが使える環境ならおそらくそっちを使ったほうがいいです。
リポジトリが使えない、もしくは使うまでもない簡易なファイルに対しての場合はなかなか有用かと思われます。
いちいち日付を入力するのはめんどくさいので。

#2.やりたいこと
###①バックアップファイルを作成したい。
###②引数が間違っている場合、ファイルが存在しない場合に警告表示したい。
###③日付の文字列を付与していつ作成したのかわかりやすくしたい

#3.作成したコード

```powershell:make_backup.ps1
Param(
    [string]$sourceFilePath ,  # バックアップするファイルのパス
    [string]$destDirectoryName = 'Backup'   # バックアップ先のフォルダ名.デフォルトが設定されている.
    )

#第一引数がなければ警告表示
if ([string]::IsNullorEmpty($sourceFilePath))
{
    Write-Host "次の形式で引数を入力してください。`r`nmake_backup.sp1 [引数1：バックアップするファイルのパス][引数2（省略可）：バックアップ先のフォルダ名]"
    exit
}


#第一引数のファイル名が存在するかどうか調査する。
if (!(Test-Path -LiteralPath $sourceFilePath))
{
    Write-Host 'ファイル名が存在しません。'
    exit
}

#カレントディレクトリに第二引数のフォルダが存在しなければ作成する。
if (!(Test-Path  -LiteralPath ./$destDirectoryName))
{
    New-Item ./$destDirectoryName -ItemType Directory
}

#ファイルパスからファイル名取得
$sourceFileName = [System.IO.Path]::GetFileName($sourceFilePath) 

#年月日・時間・分・秒の取得
$today   = Get-Date -Format "yyyyMMdd_HHmmss_"

#コピー先のパスを作成
$destinationFilePath = './' + $destDirectoryName + '/' + $today + $sourceFileName

#コピー実行
Copy-Item -path $sourceFilePath -Destination $destinationFilePath

exit
```



#4.コードの解説
###スクリプトの引数について
第二引数は初期値があるため、
もし入力しなければ
カレントディレクトリの「Backup」フォルダにバックアップファイルが作成される。

###[string]::IsNullorEmpty($sourceFilePath)について
引数に対してnullか空欄ならFalseを返す。

###作成されるファイル名について
例えばtest.txtというファイルを引数に取ると、
20191206_225012_test.txtというファイルが新しく作成される。

#5.終わりに
なにか補足がありましたらコメントください。
LaravelのセッションをGoから参照する

この記事は Laravel Advent Calendar 2019 #2 12/7の記事です。
枠が空いてたので前日に入れてしまいました。kubotakです。宜しくおねがいします。

## 前置き
LaravelよりGoな記事です。Laravelerの皆さんすみません。
今回はLaravelでAuth認証を行ったユーザーセッションをGoのアプリケーションから参照するぞ！という記事です。
また、Laravel側ではMemcachedにセッション情報を保持しているケースで説明します。

あとあと、実戦投入したわけではないのであらゆる責任は負いません。参考程度に見てもらえたらと思います。

## このケースのニーズ
Laravelのいわゆる[MPA](https://scrapbox.io/vue-yawaraka/SPAとMPAって何が違うの？SPAにしたほうがいい？)からNextやNuxtのようなSSR機能のあるJavaScriptフレームワークに移行した（い）ケースで、バックエンドのAPIをGoに置き換えたいな、というマイノリティに刺さるかもしれません。

## Next/NuxtからGoアプリケーションへの通信

みんな大好きAxiosで通信する想定で説明します。
まずユーザーがログインしているかどうかは、Laravelが発行するCookieで判断できますよね。
そのCookieをGoのAPI通信時もHTTP Headerにくっつけてあげましょう。

Axiosであればクライアントオプションに以下を追加することで通信にCookieが付属されます。

```js
{
  withCredentials: true
}
```

## GoアプリケーションでCookieを取得
私はサクッと`github.com/gorilla/mux`と`net/http`でREST APIを立てました。
ハンドラーで以下のようにリクエストからCookieが取得できます。

```golang
func Action(w http.ResponseWriter, r *http.Request) {
    cookie, err := r.Cookie("ここにCookie名が入る")
    ...
}
```

Cookie名は`config/session.php`の

```php
'cookie' => env(
    'SESSION_COOKIE',
    Str::slug(env('APP_NAME', 'laravel'), '_').'_session'
),
```

ここで設定されますね。`APP_NAME` + _sessionという名前でCookieが発行されます。

## セッションIDを取得する
Cookieが取得できたらセッションIDを取得したいですね。
ネットをさまよったらまさにというライブラリがありました。

[github.com/chekun/golaravelsession](https://github.com/chekun/golaravelsession)

```golang
sid, err := golaravelsession.GetSessionID(cookie.Value, "LaravelのAPP_KEY")
```

これでセッションIDが取得できました。

## ログインユーザーを特定する
続いてこのセッションIDからmemcachedのセッションデータを取得してユーザを特定したいですね。

Memcachedへの接続はこちらのライブラリを使いました。
`github.com/rainycape/memcache`

```golang
mc, err := memcache.New("127.0.0.1:11211")
```

ローカルのDockerに別途LaravelとMemcachedを立てたのでそちらのMemcachedに接続してます。
先程のセッションIDを利用してMemcachedからデータを取得したいと思います。
LaravelがMemcachedにセッション情報を書き込む際のキーは以下のようになってます。

```php
APP_NAME + '_cache:' + sessionID
```

これに沿って

```golang
it, err := mc.Get("{APP_NAME}_cache:" + sid)
```
これでPHPシリアライズされたデータが取得できます。
先程の`github.com/chekun/golaravelsession`を利用してシリアライズされたデータをデシリアライズします。

```golang
session, _ := golaravelsession.ParseSessionData(string(it.Value))
```

ログインセッションは以下のようなルールになっていて、これをキーとしてユーザーIDが格納されています。

```
login_ + guard名 + _ + 認証で使っているEloquentクラスのSHA-1
```

若干無理やりですが、以下のようにすることでログインしているユーザーのIDが取得できます。

```golang
for s := range session {
    if regexp.MustCompile(`login_web_*`).Match([]byte(s.(string))) {
        log.Print("LoginID: ", session[s])
    }
}
```

どこに需要があるかわからない記事でしたが誰かの参考になれば幸いです。
Text Analytics APIのセンチメント分析で映画のセリフを分析してみた(2019年)

過去にナウシカのセリフでセンチメント分析を行ってみましたが、今回は他のジブリ作品でも試してみます。

- 過去にナウシカでやってみたやつ [Text Analytics APIのセンチメント分析で映画のセリフを分析してみた - Qiita](https://qiita.com/oyngtmhr/items/39045d56d350a61a8784)
- Text Analyticsの使いかた [Azure Text AnalyticsをPythonから使ってみた - Qiita]
(https://qiita.com/oyngtmhr/items/8b305986e7aab823fb62)

#概要
映画のシナリオ作成の理論があって、場面の盛り上がり・盛り上がりの王道パターンがいくつかあり、それに合うよう計算しながらシナリオを組み立てることで「面白い」映画を作ることができるそうです。
今回は、AzureのCognitive ServicesのText Analytics APIを使って映画のセリフのセンチメント、感情のネガポジを判定して、映画全体でどのように推移していくかを見てみます。

# 元データを集めて編集
今回は以下の作品の英語のセリフを用意することができたので、これを使って分析してみます。

- 紅の豚
- 千と千尋の神隠し
- となりのトトロ

データはText Analytics APIで読み込める形式(json)に整形します。
```
{'id': '1', 'language': 'en', 'text': '\n Another village died.\n \n '}
```

# 結果
APIから返ってきたセンチメント値をグラフにします。
縦軸はセンチメント値で上に行くほどポジティブ、横軸はセリフを時系列に並べてます。またセンチメント値は前後合わせて18個のセリフの平均値を取ってプロットしました。
結果を見ていきましょう。

## となりのトトロ
![totoro.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69163/f02250a9-ccc4-033d-44bf-cdea431f119f.png)
盛り上がり、盛り下がりの波が見えます。
最初の引っ越してくるところ、トトロと空を飛ぶシーンのポジティブ度が高く、逆にマックロクロスケに遭遇するドキドキのシーン、お母さんの退院が伸びてサツキが不安になって泣いてしまうシーンがネガティブなシーンと判定されていて、結構正確に判定されてそうです。
## 千と千尋の神隠し
![sentochihiro.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69163/27ce0fea-652b-d152-1774-abd11b9b90f0.png)
トトロより波の上下が細かいです。
かま爺との遭遇、湯婆婆との契約、大けがのハクを助けるシーンなど緊張したりハラハラいしてるシーンがネガティブと判定される傾向があります。
## 紅の豚
![kurenai.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69163/0b854c2c-e229-a9ac-92cc-095fc08d2bab.png)
千と千尋よりさらに上下が回数が大きい傾向があります。
場面が細かく変わる、盛り上がりのシーンも単純な楽しいシーンだけでなく、ちょっと大人向けの話であることがうかがえます。

# まとめ
セリフの出現時間は今回考慮してないので、作品中の位置も考慮してグラフにすれば、もうちょっと傾向が見やすくなるかもしれません。
あと、セリフデータの正規化がいろいろ大変だった。。。
これは機械学習や文書処理のあるあるですね。。。
VCIでPDCAを回す(回転アニメーションの罠) 

#はじめに
この記事は、[VCI Advent Calendar 2019](https://qiita.com/advent-calendar/2019/vci)の6日目の記事です。
VCIでアニメーションで回転を行う場合のやり方と現場(Vキャス)で問題を起こさないための注意点をPDCAを回しながら説明したいと思います

#概要
アニメーションで回転するときはInterpolationをEuler Angles(Quaternion)にしましょう。以上。
以降は蛇足です


#Unityでアニメーションを作成する
まずは[PDCAを回す](https://qiita.com/feath/items/60e6dbe6c771af68e22a)の記事を参考にオブジェクトを作ります。
次にアニメーションを追加したいサブアイテムを選択し、AnimationのタブのcreateからAnimationを作成します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/a21847af-c553-8e98-d2e0-1928bd4b4959.png" width=75%>

作成したらAddPropertyから回転したいオブジェクトのTransform>Rotationを選択し、
回転する確度の設定をしましょう。
例では1秒間に360度回転するようにしています
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/db5e7852-e68c-5a0d-dc90-6a7d03e5e5ba.png" width=75%>

ただし、このままだと回転速度が一定でないため、回転速度を一定にする設定をします
画面下部のCurvesを選択し、曲線の端の部分を右クリック>BothTangents>Linearを選択します
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/acf3ba34-3977-7d78-a93d-4e9b9676bf12.png" width=75%>

これで回転させることが出来ました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/2e433374-b681-a937-14eb-19b7d40b3c16.gif" width=75%>

それではVキャス(現場)へ持っていき回していきましょう
Unity上でも問題なく動作したため現場でも問題なくPDCAは回せるはず…！

#そのPDCA、現場では回らないよ
今回はVCIグリップをした際に回転するようにしようかと思います。
その場合、コードは以下のような形となります

```lua
local pdcaAnimations = vci.assets.GetSubItem("PDCASubItem").GetAnimation()
---[SubItemの所有権&Use状態]アイテムをグラッブしてグリップボタンを押すと呼ばれる。
---@param use string @押されたアイテムのSubItem名
function onUse(use)
  pdcaAnimations._ALL_PlayFromName("Rotation",true)
end
```


では早速回してみましょう！
![gibd3-wpu2v.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/536e263f-f256-6a3d-8733-1ba123bc11ca.gif)

あれ…まわらない。

確かにUnity上ではちゃんと回っていたのに…

#現場でも回せる実用的なPDCA実現方法
実は、今までの設定方法では現場でPDCAを回すことは出来ません
ちゃんと現場でもPDCAが回るようにするには~~無茶な詰め込みをやめて改善のための時間を確保する~~アニメーションの設定を変更する必要があります。
アニメーションクリップで回転アニメーションを選択し、Interpolation>Euler Angles(Quaternion)の順に選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/bc4eb0a3-76e8-8baa-5995-3b9e329155e4.png" width=75%>


これで現場でもVCIが回るようになります！
![panjd-fm73k.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/544004c0-de45-aaf6-a550-ace406a94fb2.gif)


#いかがでしたか？
今回はアニメーションによるローテーションの注意点について紹介しました。
結構ここで回転する原因がわからず苦戦する人も多いみたいです(わたしもそうでした)
この記事でそういう人を減らせればいいなと思います！
Let's enjoy rotation！٩( 'ω' )و
chatspaceを実装する際前の復習　CSS

#はじめに

この記事は、2019/11/1からプログラミング学習を始めた学生がプロのプログラマーになるまでのアウトプットする為の書き込みの場である。

#問題

<img width="1439" alt="スクリーンショット 2019-12-06 22.29.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538355/ad48b616-2874-f796-221a-5ad9bb3b9cb1.png">

#回答

```hello.css

html, body {
  height: 100%;
  margin: 0;
  padding: 0;
}

.contents {
  background-color: gray;
  height: 100%;
  width: 100%;
}

.left-content {
  background-color: red;
  height: 100% ;
  width: 300px;
  float: left;
}
```

#感想
現在lineのようなチャット制作をしています
今までやってきたことを積み合わせた内容になってます
、、、正直とても難しいです( ͡° ͜ʖ ͡°)


##終わりに

もっとこうした方が良いよなどご指摘頂けると幸いです
音声認識するオンラインビンゴゲームつくった

# オンラインのビンゴゲーム
私は[commew（こみゅー）](https://commew.net/)というフリーランスコミュニティーに参加してます。
そこでフリーランス３人でチームを組んで「みんにゃでビンゴ」というWebアプリを作りました！

このビンゴには、遊び心で**音声認識**の機能をつけたので、この記事ではその実装を紹介をします。


ゲームの画面はこんな感じ😊
<img width="814" alt="スクリーンショット 2019-12-06 19.54.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227609/e5edf629-c5b4-16d6-ed97-9482d1229ff1.png">
<img width="981" alt="スクリーンショット 2019-12-06 19.55.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227609/2a00ebba-8747-2911-2005-ddd18c6eb279.png">

ゲームはこちらから試せます！
https://minnya.funspot.tokyo/
https://github.com/daisuke85a/bingo ~~コードは汚いから読まないで~~
JSとPHPで作っています。フレームワークは使ってません ~~当初の僕はフレームワークを使えなかった・・・~~


commewでは、月に１回「フリーランス集会」が開かれています。オンライン飲み会的なやつです。
その集会で**「オンラインでビンゴゲームをしたいよね」**と言う話になったのですが、なにげにWebを探してもいい感じのサービスが見つからないので、**コミュニティー内でチームを組んで作る**ことにしました。


## ゲームの遊び方

音声認識に関わるところだけ抜粋すると

① ゲーム参加者は自分の番号が５個でたら「BINGOさけぶ」ボタンを押して**PCのマイクへ「BINGO!!」と叫びます**
② （ビンゴしている場合は）自分のビンゴカードに順位王冠がつきます（やった！）

ってかんじです！

## 音声認識するコードの説明

ざっと処理を書くとこんな感じです。

①JSで音声をテキストに変換する
②JSからサーバー(PHP)へテキストをPostする
③PHPにてテキストが「Bingo」かどうか確認する
④（Bingoの場合）PHPにてビンゴを叫んだ人が、本当にビンゴしているか確認する
⑤（ビンゴしてた場合）PHPにてビンゴカードに王冠と順位をつける

### JSの処理

ビンゴを叫ぶ前に押すボタンです。

```php:ビンゴ叫ぶボタン
<button id="bingoBtn">ビンゴさけぶ</button>
```

JSで上記のボタンに「マイク音声入力」機能をつけます。

音声をテキストに変換するのは、JSを**9行**書けばできます。

`webkitSpeechRecognition`がキーポイントです。
僕はこれを[この本](https://www.amazon.co.jp/dp/B07L1GJZ1F/ref=cm_sw_em_r_mt_dp_U_UZJ6DbNK7MCYD)で知りました。[この記事](https://qiita.com/progfay/items/e1865ae41006c6a6b17b)にも書いてあります。

```js:jsで音声をテキストに変換してサーバーへPOST

// 音声認識のためのインターフェイスである webkitSpeechRecognitionをnewする
const speech = new webkitSpeechRecognition();

// 言語を英語に設定。最初は日本語(ja-JP）に設定していたが、「ビンゴ」という単語が認識できなかった(泣)
speech.lang = 'en-US';
const bingoBtn = document.getElementById('bingoBtn');

bingoBtn.addEventListener('click', function(){
    // ビンゴボタンが押されたら、PCマイクからの音声入力待ちにする
    speech.start();
});

// 喋り終わったら（声が途切れたら）resultイベントが発火する
speech.addEventListener('result', function(e){
    // textに音声入力した文字が入る（例：Bingoなど）
    const text = e.results[0][0].transcript;
    // サーバーへPostする
    execPost("game.php",  {'bingo':text});
});

```

`execPost`関数はDOM操作で仮想的なformを作りサーバーへsubmitする処理になります。本筋から反れるので省略・・・詳細は[参考サイト](http://fujiiyuuki.blogspot.com/2010/09/formjspost.html)へ

### PHPの処理

POSTされたテキストが「bingo」の場合はビンゴ済みかチェックして、王冠と順位をつけます。

```php:POSTされたテキストを受け取る処理
//"bingo"と音声入力されたかチェックする。英語として解釈するので、発音が悪いと一生ビンゴできない・・・
if ($_POST['bingo'] === "bingo") {
   // 叫んだ人のビンゴカードの５個の数字が、全て出ているかチェック
   if ($bingoApp->checkBingo($_COOKIE['name'])){
      // ビンゴカードに王冠と順位をつける（おめでと！）
      $bingoApp->bingo($_COOKIE['name']);
   }
}
```

## 最後に
これを作ったのは2018年10月〜2019年4月（長期戦だ〜！）になります。
会ったことない人と３人チーム、業務外、フルリモート、仕事に追われてやる暇ない・・・など、いろんな不安要素がありました。

PHPを勉強したての私はリーダー、インフラ、PHP周りを担当。他の２人はデザイン、アニメーション、HTML、CSSを担当していただきました。いろんな反省点~~（PHPコードは汚いし、MVCにもできてないし、GET/POSTの使い分けもできてない。など・・・）~~はあるものの、**作りきれてよかった！！！**という気持ちでいっぱい。

なにより、commewのイベントで活用して頂き、**盛り上がったのがうれしいです😊**
commewでは「デザインかわいい！」「アニメーションかわいい！」と大好評！！！~~（あれ、音声は・・・？）~~

今年のcommewのオンライン忘年会でも、このビンゴゲーム（ https://minnya.fun/ ）が使われそう。
マイク無しでイベント参加する人もいるので、音声以外でもビンゴできるよう改良したいな・・・！

**おわり！**
AWKコマンドを使う上で使う組み込み変数

AWKマスターへの道のり アドベントカレンダーの2日目
https://qiita.com/advent-calendar/2019/awker

### AWKコマンドを使う上で覚えておくべき変数

awkには最初から定義されている変数がいくつか存在します。

AWKを使う上で絶対に覚えておくべきものと、まぁそんなに使わないんだろうなってやつまで色々あるけれど、今回は一応知っている限りはすべて列挙します。

###組み込み変数一覧
######よく使うもの
|変数|役割|デフォルト値|
|---|---|---|
| $0 | ※レコード |  |
| $n | レコードのn番目のフィールド |  |
| FILENAME | ファイル名 | - |
| RS | レコードの区切り文字 | 改行(\n) |
| FS | フィールドの区切り文字 | スペース |
| ORS | 出力レコードの区切り文字 | 改行(\n) |
| OFS | 出力フィールドの区切り文字 | スペース |
| NR | 入力中のレコード数 | 現在の入力ファイル数のレコード数 |
| NF | レコード中のフィールド数 | 現在の入力レコード中のフィールド数 |
※レコードは一行ごとのデータ

######あんま使わないけどあるやつ
|変数|役割|デフォルト値|
|---|---|---|
|CONVFMT||
|RLENGTH||
|RSTART||
|FNR||
|ENVIRON||
|SUBSEP||
|OFMT||
|IGNORECASE *||

####備考
あんま使わないやつについてはまた後日追加で編集致します。。。
Wordpressがメンテナンス中→All In One WP SecurityのMaintenance ModeがON

私がAWS EC2に構築したWordpressのブログがずっと**サイトがメンテナンス中です。しばらく経ってからアクセスして下さい**というエラーメッセージを吐いてました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378457/dde09ac2-d321-e1d8-c272-a2b387d3d78a.png)

## 原因
All In One WP SecurityのMaintenance ModeがONになっていた。要するに設定的にメンテナンスモードになっていたという、とてつもなくしょうもない理由でした。。

## 試した事
"Wordpress" + "メンテナンス中"でググったら、「.maintenanceというファイルを消す」という解決策がヒットしました。

https://hidemaru-note.com/maintenance-mode-wordpress/#3maintenance

PC(MAC)からターミナルでサーバーにSSH接続しました。

```
$ ssh -i 秘密鍵.pem.txt ubuntu@グローバルIPアドレス
```
SSHでログインします。

```
bitnami@ip-XXX-XX-XX-XXX:~$ cd apps
bitnami@ip-XXX-XX-XX-XXX:~/apps$ cd wordpress
bitnami@ip-XXX-XX-XX-XXX:~/apps/wordpress$ cd htdocs
bitnami@ip-XXX-XX-XX-XXX:~/apps/wordpress/htdocs$ find maintenance
find: ‘maintenance’: No such file or directory
```

どうやら.maintenanceというファイルがそもそも存在しなかったようで、解決しなかった。

これを試したところで、ふと思いついて下記のプラグインを無効化してみた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378457/7dcbcba8-dd26-2fa0-a7ea-e0aaaa24cbe0.png)

↓成功。どうやら、All In One WP Securityの設定が邪魔をしている模様。
以前セキュリティの設定のためにAll In One WP Securityを有効化し、不要な設定が残っていた模様。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378457/44b5dcb7-0d04-eda2-93b2-75ebee822061.png)

All In One WP Securityを再度有効化し、設定を調べてみると"Maintenance Mode"がONになっている。すこぶる怪しい。。

↓のEnable Front-end Lockout:のチェックを外す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378457/3f5797b6-b435-a995-1f4b-567feb603e64.png)

↓成功。All In One WP Securityを有効化したまま、普通にアクセスできるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378457/c256b0a9-6c39-a02f-3d9c-a5f2718d9da1.png)
Unityエンジニアによるライブコーディングのススメ

# はじめに
[TechTrain](https://techbowl.co.jp/techtrain/) でメンターをしている @hashikei です。
ゲームネイティブエンジニアとして、ゲームエンジニアを目指しているユーザーのサポートをしています。

私は普段、社内外問わず勉強会としてライブコーディングを行う機会が多く、主にUnityを使って90分でゲームをつくっています。
制作するゲームジャンルとしては、例えば音ゲーや15パズルなど、様々です。

今回はライブコーディングを行ううえで、私が実践していることや、感じているメリットをご紹介します。

また本記事の内容は、あくまで私の私見であり、一般的なライブコーディングとは異なる部分があるかもしれませんがご了承ください。

# ライブコーディングとは
まずはじめに、ライブコーディングとはどういうものかを説明します。
ライブコーディングとは、簡単にいうと **「リアルタイムでプログラミングしている姿を参加者（他人）が見る」** というイベントです。
（もちろんプログラミング以外にも、イラストレーターのライブペインティングなど、職種ごとに様々な種類があります）

ライブコーディングをご存じない方は、以下のリンク先から私がライブコーディングを行なっている姿が見られますので、もしよろしければ少しご覧になって頂けると雰囲気が掴みやすいかと思います。
https://note.com/techbowl/n/n4a5b305d5f74

ちなみに私はいつも参加者に「映画を見にきたくらいの感覚で気楽にご覧ください」と言っています。
私としては、それくらいカジュアルにライブコーディングを見て欲しいと考えています。
（人によっては勉強会に対して気構えてしまうタイプの方がいらっしゃいますが、ライブコーディングはそういった精神的負担が少ないイベントだと思っています）

# ライブコーディングの流れ
私がライブコーディングをする際の流れをご紹介します。

- 最初に「何をつくるのか」という全体のゴールを示す
- ゴールに必要な要素を分解し、次に行うアクションの中間目標として示す
    - 例えば音ゲーの場合、以下のような ゴール/要素 となります
        - ゴール： 音ゲーのインゲーム部分を作成する
        - 要素： ノーツが流れてくる、タイミングよく叩いたらノーツが消える、タイミングに合わせてスコアが加算される、コンボが加算される、タイミングに合わせてPERFECTなどのテキストを表示する、ノーツを流すために譜面をロードする、BGM・SEが再生される
- 分解した要素を順番に実装していく
- コーディング中は、今何をしているのかを定期的に口に出す（場合によっては解説する）
- 参加者からの質問は積極的に拾ってその場で回答する
    - その場で解決しないと、すぐに作業が進行しまうため

# ライブコーディングの準備
次に、ライブコーディングを行うまでの準備についてご紹介します。

- 何をつくるかを考える（時間内で収まりそうなもの）
- あらかじめ軽く実装してハマりどころがないかを確認する
    - スムーズに実装できたり、ハマりどころが解決できれば、当日もある程度スムーズに進行できます
- 実装の流れをイメージトレーニングする
    - ここは人によるでしょうが、私はリハーサルまではしません（事前実装とイメトレがリハーサル代わり）
- **ぶっつけ本番はダメ**
    - 実体験ですが、大概予期せぬ問題が発生して時間内に収められなくなります

# ライブコーディングのメリット
自分が行う場合のメリットと、参加する場合のメリットに分けてご紹介します。
#### 自分が行う場合のメリット

- アウトプットが増える
- 短時間で成果物をアウトプットするため、時間に対して得られる経験値が多い
- 他者に見られながらコーディングすることで、程よい緊張感とアドレナリンが出て、気持ちが引き締まる
- コーディングしながら他者に解説をするため、人に伝える力が鍛えられる
- 制限時間があるため、短時間に取捨選択を迫られることが多く、判断力が鍛えられる

#### 参加する場合のメリット

- **他者がコーディングする際の暗黙知を知れる**
    - 個人的にはこれが一番大きなメリットだと感じています
    - ここでいう暗黙知とは、例えば「エラーが発生した時の解決方法（思考や検索、対応など）」や「ショートカットキーの使い方」など、大小問わず様々な明文化されていない個人のノウハウのことです
    - 特に「実装時の思考」や「デバッグ方法」などを知れるのはかなり大きなメリットだと思います（優劣ではなく、単純に自分と違う考え方を知れるという意味です）
- ゲームの場合、つくったことがなくてもゲーム制作の流れを知ることができる
- 勉強会より精神的ハードルが低い（まるで映画を見るような感覚で）

# まとめ
ライブコーディングは、行う側も参加する側も双方に大きなメリットがあります。
私も過去10回以上ライブコーディングを行ってきましたが、回を重ねるごとに自分が成長していることを実感してきました。

前述の通りですが、特に **暗黙知の共有** ができることが本当に大きなメリットだと感じていて、これは内容の優劣ではなく、単純に自分と違うエンジニアを知ることで、自身の引き出しや視野を広げる大きな糧となり得ます。

もしライブコーディングに興味が出てきたら、まずは友人と一緒にもくもく会を開催するようなノリで試してみるのもよいかもしれません。
例えば友人の前で30分〜1時間くらいで簡単なライブコーディングを行うなど、それだけでもきっと得られるものは大きいでしょう。

そして最後に宣伝です。
私はTechTrainでゲームネイティブエンジニアとしてメンターをしています。
もしゲーム制作をしていて相談したい相手がいないという方がいましたら、お気軽にご相談ください。
あるいはライブコーディングを実際に見てみたい方がいましたら、お気軽にお問い合わせください。
つくってほしいゲームジャンルを添えて頂ければ、90分以内に実装できる範囲でつくりますのでw

それでは、良いライブコーディングライフを！
CentOSで日本語入力

#はじめに
インストール時は英語でインストールしてしまうせいか、導入直後は日本語入力ができません。日本語入力できるようにしていきます。

#パッケージのインストールと設定
ibus-kkc が必要になります。インストールしたら再起動して設定をします。

```
yum -y install ibus-kkc
```

右上選択して出て来る 工具 っぽいボタンが設定です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/415699e2-6771-2e21-fe49-af2225046efc.png)

Region & Language (地域と言語）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/57f35b59-7339-c4fb-fff6-9a07c450aa38.png)
を選んで日本語（かな漢字）を + で追加します。他の 日本語 だけと違って キーボードのレイアウト確認用のボタンの左に 設定 のボタンが出てきます。

IME切り替えのキー指定はここでできます。


# かな漢字のキーボードマッピング

どうも英語キーボードになっていました。XkbLayout に jp,us と指定されていておかしな挙動になっていたようです。00-keyboard.conf を編集してなおりました。今の動作中の設定は、localectl コマンドで確認できます。

```
$ cat /etc/X11/xorg.conf.d/00-keyboard.conf 
# Written by systemd-localed(8), read by systemd-localed and Xorg. It's
# probably wise not to edit this file manually. Use localectl(1) to
# instruct systemd-localed to update it.
Section "InputClass"
        Identifier "system-keyboard"
        MatchIsKeyboard "on"
        Option "XkbLayout" "jp"
EndSection
```

#おわり
Linux入れたあとに設定のしかたを忘れて毎度調べてるのでメモしておきます。
【超入門者向け】VSCodeの日本語化方法（2019/12/06時点）

なんとなく、VSCodeをいれたけど、英語ができんくて死にそうだったが,何とかなったので,この喜びをシェア＆覚え書きしたかった.

ネットで適当に調べたら、コマンド入力等が多く,よくわからなかったけど調べたら見つかった.
#おそらく、最も簡単（自称）



1.画面端の拡張ボタンを押す
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510342/7778361f-b468-c4d0-0fdc-3e8e1d1b01dd.jpeg)



2.検索窓に「Japanese」で検索すると,出てくるので「Microsoft」の公式製品（ダウンロード数を確認して偽物ではないことを確認）を「install」を押す.

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510342/44290307-fb00-a7b8-4d97-0ad931afff06.png)

3.インストールが完了すると画面右下に「Restart Now」と日本語化するための再起動を要求してくるので押す.

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510342/8a743c1f-95bd-1b43-4f61-2ffb8e31f25b.png)


4.完成

※あくまで2019年12月6日時点なので,変更がある可能性があります.

(もし,役に立った方がいましたら温かいコメントを書いていただけると嬉しい.初投稿でした.)
Embree ソースコードのメモ

Embree のソースコードを読解して, Embree でビルドした BVH データを自作のレイトレーサーで使いたいとか, 独自機能をつけくわえたいとかしたい人向けです.

手前味噌ですが, NanoRT https://github.com/lighttransport/nanort のコードを読んでいくと Embree のコードの理解も早いかと思います
(あとは PBRTv3 book http://www.pbr-book.org/ の 2 Geometry and Transformations から 4 Primitives and Intersection Acceleration まで).


hair, subd 周りが後ほど追加されたロシアンな香りただようソースコードで, 実装パートのコードがかなりトリッキーかつコメントがないので読むのに苦労します.
(昔のコードや, API はそれなりにコメントが書かれています)

ソースコードの主なレイアウトは以下です.

```
include/ : ヘッダーファイル. ユーザが見る public Embree API
common/ : 共通コード
  algorithms : `parallel_for` などの実装
  cmake : コンパイラやアーキテクチャごとの cmake 設定
  tasking : タスクスケジューラ. tbb などを使っています.
  math, simd : SIMD 型ライブラリ, vec4 の定義などがあります.
kernels/ : レイトレカーネル(BVH 構築と, traverse, intersection)
  builders :  BVH 構築のアルゴリズム実装があります.
  bvh : BVH traversal, intersector があります.
  common : 
  geometry : 形状
  subdiv : Subdivision surface 周り
```

## 概要

Embree: A Kernel Framework for Efficient CPU Ray Tracing
https://www.embree.org/papers/2014-Siggraph-Embree.pdf

を読みましょう.

以外と結構昔からあるのと, 性能重視なので, ソースコードは C++03 + C++11 を少々, みたいな感じです.

## 用語

* primitive : 形状を構成するプリミティブ. 三角形形状の場合は面(`face`)に対応.
* geometry : 形状(shape, mesh)に対応. primitive から成る.
* instance : geometry のインスタンシング. instance 自体がジオメトリタイプとなる(一旦 scene を作って, それを instancing して新しく scene を作るという段取りになっておりややわかりずらい) 

instanceID については, 交点(`RTCHit`)では複数持つことができる

https://github.com/embree/embree/blob/master/include/embree3/rtcore_ray.h

Multi-level instancing に使える

https://www.embree.org/tutorials.html#multi-level-instancing

(大規模シーン向けかな?)

* intersection filter : ヒットするかもしれない交点が見つかったときに, ユーザ定義のコールバック関数(filter)を呼ぶことができる. 一見これでなんでもできそうだと思ってしまうが, 制約がいろいろあり, 万能ではない.

## common/math

vec4 などの型を定義しています.
SSE, NEON 命令(embree-aarch)などを wrap しています.
したがって基本的には SSE 命令などはこの `math` フォルダ以外では出てきません.
新しいアーキテクチャに対応するときはここと, `common/sys` あたりと, cmake の設定をいじればよいことになります.

## common/sys

atomic や thread の実装, ISA の情報などがあります.

## builders(BVH build アルゴリズム)

* primrefgen : PrimRef 生成
* hair 専用
* heuristic
* SAH builder
* motion blur 用(MB hair)

## bvh

データ構造は

* BVH4(四分岐)
* BVH8(8分岐). AVX が有効の場合のみ.

の二つがあります. 普通の BVH(二分岐)は無いようです.

### builder, intersector

builder, intersector はいろいろあります.

* node_intersector : two-level BVH traverse 用?

 
## geometry

curve primitive は結構特殊です.

* curve
* curveNi : 複数の Curve をまとめて処理
* curveNv
* disc
* grid
* instance
* line
* quad
* sphere
* subdivpatch
* triangle
  * moeller
  * pluecker
  * woop
  * motion blur 対応

### ファイル名命名規則?
 
* `***i.h` : index で primitive にアクセスする場合に利用される
  * fill : プリミティブ情報を格納する
  * update : bounding box アップデート 
* `***v.h` : プリミティブの直接の配列(array of structure. index 無し)バージョン　
* `***_intersector.h` : プリミティブの交差判定コード

### curveNi

Curve prim の情報(primID, geomID, bounds, etc) を `fill` メソッドでメモリにパックしていますが,  メモリレイアウトはハードコードされているので注意ください.


`bounds_vx_x()` などの取得関数は, ハードコードされたメモリレイアウトから, reinterpret cast してデータを返すようになっています.
ロードやストアのアラインメントに制約があるハードではここは移植が面倒かもしれません.

curveNi_intersector.h が実際に交差判定を行う関数が書かれています.

### subdivision surface

subdivision surface は, OpenSubdiv を使わずに自前(!)で処理しています.
Amazon Augmented AI(A2I) 機械学習/AI運用では避けられない有人確認業務をAWSが代替


# はじめに

この記事は株式会社ナレッジコミュニケーションが運営する [Amazon AI by ナレコム Advent Calendar 2019](https://qiita.com/advent-calendar/2019/knowcom-amazonai) の4日目にあたる記事になります。

# 概要
re:Invent2019 では多くの機械学習/AIに関する新サービスが発表されました。
機械学習/AIを運用する上で「ここが大変なんだよな」というポイントをサービスで埋めてくるものがピンポインで出てきた印象です。

そんな中でも本記事で紹介する Amazon Augmented AI (Amazon A2I) は非常に特徴的で強力なサービスです。

## AIを運用する上での課題
例えば画像内にある記号を検出し判別するモデルを作り運用したと仮定します。
モデルが応答した際の値は数値として出るのですが実際に正しい結果だったかどうかはやはり人の目による目視確認が必要となってきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/cfc28213-2efd-c7b2-ef2f-ce2d091a7ff1.png)

AIの技術を使って目視確認業務を減らしたはずが、AIの精度を確かめるための新たな目視確認業務が生まれるという状況です。
通常はモデルの応答値のモニタリングや一部結果を目視確認して精度を見るなどのワークフローが必要でした。

## Amazon A2I による解決
Amazon A2I では AWS のサービスとして分析結果の目視確認と結果共有を行ってくれます。
これにより以下の図のように今までは人が介在することになってしまっていたフローもAWSの世界で完結ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/2974938b-24c6-ff1a-a13c-2fdecf94de34.png)

# 使い方
バージニア北部リージョン(N.Virginia)で利用することが可能です。
日本語では「拡張AI」という表記になっていますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/5c184433-dd41-c422-5841-adc853b8777f.png)

ワークフローを選択し、Textracct、Rekognition、Custom の３種類のタスクのうち1つを選択することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/921a18f4-b63d-114b-4f8a-f67c3492e42c.png)


# 価格
価格はこちらでアナウンスがされております。
https://aws.amazon.com/jp/augmented-ai/pricing/

# まとめ
今までは自動化のために機械学習/AI運用を行うための目視業務が発生することもあったのですが、こういったサービスを組み込むことで目視チェックもAWSのサービスの中に組み込めるというのはすごいこと感じています。
より一層、機械学習/AIが運用されていく世界観がAWSによって進んでいきそうですね！


# 参考リンク
[公式ドキュメント](Announcing Amazon Augmented AI: Easily Implement Human Review for ML Predictions)
VS CodeでWinAVRを使う

# 動機

+ とある演習でWinAVRを使うことになった
+ WinAVRに付いてくるProgrammers Notepadが使いづらかった
+ VSCodeが好きだった

# 前提

+ WinAVRはインストール済み(`make.exe`にパスが通っていること)
+ ビルドに使用するMakefileは準備済み
+ VSCode 1.40.2
+ 使用するマイコンはATmega168

# 実際にやったっこと
+ `フォルダーを開く`で`makefile`があるディレクトリを開いて作業する
+ 以下の2つのファイルを直下の`.vscode`ディレクトリに配置

```c_cpp_propaties.json
{
    "configurations": [
        {
            "name": "avr",
            "includePath": [
                "${workspaceFolder}/**",
                "C:/WinAVR/avr/include",
                "C:/WinAVR/lib/gcc/avr/3.4.6/include"
            ],
            "defines": [
                "__AVR_ATmega168__"
            ],
            "compilerPath": "C:\\WinAVR\\bin\\avr-gcc.exe",
            "cStandard": "c99",
            "intelliSenseMode": "gcc-x86"
        }
    ],
    "version": 4
}
```

```tasks.json
{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "process",
            "label": "make all",
            "command": "make",
            "args": [
                "all",
            ],
            "options": {
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        },
        {
            "type": "process",
            "label": "make clean",
            "command": "make",
            "args": [
                "clean",
            ],
            "options": {
            },
            "problemMatcher": [
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        },
        {
            "type": "process",
            "label": "make program",
            "command": "make",
            "args": [
                "program",
            ],
            "options": {
            },
            "problemMatcher": [
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}
```

# 結果

+ Intelisenseが効くようになった
+ ビルドが楽になった
+ 演習がより楽しくなった

# 参考文献
[c_cpp_properties.json reference - Visual Studio Code](https://code.visualstudio.com/docs/cpp/c-cpp-properties-schema-reference)
[Tasks in Visual Studio Code](https://code.visualstudio.com/docs/editor/tasks)
embulk-input-kintone を作った話

2019 kintone advent calendar2の6日目の記事です。
embulk-input-kintone を作った話です。

## Background

- 小売で、業務システムをkintoneに乗せて運用している。POSはスマレジを使っている。
- kintoneはカラムの変更がしやすいので、分析したい切り口があればデータが追加しやすいので、商品のマスターにkintoneのデータを使用し、売上のデータはスマレジから取り出したデータを結合して使っている。
- 分析を効率良くやるために、データを一箇所で集めなければならない。
    - DWHにはBigQuery(BQ)を使用
- 一番最初は、[cli-kintone](https://github.com/kintone/cli-kintone) をCSVにするscriptを実行後、embulkを使ってBQにデータを入れていた
- kintoneのアプリが増えるとscriptnのメンテが大変、もっと宣言的に書きたい
    - + 高校のクラスメイトの縁あって、embulkを使ったサービスを手伝うことにもなった。

ということで、kintoneのinputがなかったので作りました。

[https://github.com/trocco-io/embulk-input-kintone](https://github.com/trocco-io/embulk-input-kintone)

## embulkとは

バルク処理に特化したplugableのデータローダーです。

クラウドサービス(e.g. s3, sales force), DB(e.g. MySQL, Postgres, SQL Server), ローカルファイル(e.g CSV, JSON) etc からクラウドサービス, DB, ローカルファイルetcにデータを転送(ETL)できるOSSです。

詳しくは下記のリンクを御覧ください。

参考

[http://frsyuki.hatenablog.com/entry/2015/02/16/080150](http://frsyuki.hatenablog.com/entry/2015/02/16/080150)

[https://qiita.com/hiroysato/items/da45e52fb79c39547f69](https://qiita.com/hiroysato/items/da45e52fb79c39547f69)

[Champion Contributor](https://twitter.com/hiroysato/status/1199118721609977856)

## 使い方

    embulk gem install embulk-input-kintone

設定のかんたんな解説

    in:
      type: kintone  
      domain: example.cybozu.com   # ドメインを指定
      username: user　　　　　　　　  # ユーザー名
      password: password　　　　　   # パスワード　　この他にもアプリトークンでの認証も対応してます。　
      app_id: 1                    # アプリ id
      fields:                      # 抽出したいフィールドのフィールドコードと、データタイプを記述
        - {name: $id, type: long}
        - {name: $revision, type: long}
        - {name: foo, type: string}
        - {name: bar, type: long}
        - {name: baz, type: double}
    
    out:
     type: stdout # BigQuery, Redshift, MySQLもプラグインをインスールすれば可能 

## 現実装の制限 20191205時点

- カーソルを使ったデータを取得しているので、カーソルの制限を受ける
    - 同時に作れるカーソルは1ドメインあたり10個まで
    - 一度に取得できるのは10万件まで
    - カーソルの有効期限は、カーソルの作成 または カーソルからレコードを取得 による最終リクエスト時刻から10分です。
    - カーソルの作成にかけられる時間は5分間です。それ以降はタイムアウトします。
- embulkのguessを実装してないので、最初の設定に時間がかかる（将来、対応予定
- サブテーブルのに対応してない（将来、対応予定

## Embulkを使ったデータ転送の今後

embulkのフローを開発と本番で分けるのに環境変数を[liquid](https://www.embulk.org/docs/built-in.html#using-variables) templateつかって切り分けているが、数が増えると管理がめんどくさい。運用は泥臭いので、今後としては

- digdagや、airflowを使って自前で構築
- troccoのようなSaaSを使用
Bootstrapでnav-darkを指定しているのにaタグの文字色が青になってしまう

<a href="https://getbootstrap.com/docs/4.4/components/navbar/">公式のドキュメント</a>を参照したつもりで、以下のように書いてしまいました。

```PHP:header.php
<header class="navbar navbar-expand navbar-dark bg-dark">
<a class="nav-link" href="login.php">HOME</a>
</header>
```
ドキュメントと同じクラス名を指定したのに、HOMEの文字が青になってしまいます。
開発ツールで_navbar.scssを確認しました。（以下抜粋したものです）

```scss
.navbar-dark {
  .navbar-nav {
    .nav-link {
      color: $navbar-dark-color;

      @include hover-focus() {
        color: $navbar-dark-hover-color;
      }

      &.disabled {
        color: $navbar-dark-disabled-color;
      }
    }
  }
}
```
.navbar-darkの中の.navbar-navの中の.nav-linkに文字色が適用されるのですね。
クラス名を指定したら、無条件にスタイルがあたるものだと思い込んでいました。
これで適切な色になります。

```PHP:header.php
<header class="navbar navbar-expand navbar-dark bg-dark">
　<ul class="navbar-nav">
　　<a class="nav-link" href="login.php">HOME</a>
　</ul>
</header>
```
Firebase Storageで画像回転（Exif）に対応する。（クライアント側とFirebase側の2通り）

# この記事について
画像をアップロードして、表示するものをつくったところ、「あ、iPhoneでアップしたら横向きになっちゃった」っていうのは割とアルアルだと思います。対応方法としては、

 - クライアント側（JS）で回転処理してからアップロードする
 - バックエンド側で回転処理をして保存する
 
の2パターンかと思いますが、Firebase,Nuxt(+Vuetify),TypeScriptだったときの、両方についての対応サンプルとなります。

# クライアント側対応版
```blueimp-load-image``` を使いました。[こちら](https://www.npmjs.com/package/blueimp-load-image)

``` vue:pages/index.vue(template部分から抜粋)
<v-img
  :src="previewImageSrc"
  aspect-ratio="1"
  class="previewImg"
></v-img>
<v-file-input
  @change="onChangeFileInput"
  label="画像の変更"
></v-file-input>
```
``` ts:pages/index.vue(script部分から抜粋)
onChangeFileInput(file: any) {
    if (file) {
      BlueimpLoader.parseMetaData(file, (data: any) => {
        const options = {
          maxHeight: 500,
          maxWidth: 500,
          canvas: true,
          orientation: 1
        }
        if (data.exif) {
          options.orientation = data.exif.get('Orientation')
        }
        BlueimpLoader(
          file,
          (canvas: HTMLCanvasElement) => {
            this.previewImageSrc = canvas.toDataURL(file.type)
            canvas.toBlob((blob) => {
              this.imageBlob = blob
            })
          },
          options
        )
      })
    } else {
      this.previewImageSrc = ''
      this.imageBlob = null
    }
  }

```
[全コード](https://github.com/nbfujiwara/sample-firebase-storage-rotate/blob/master/pages/index.vue)
これでプレビュー表示も回転しますし、```this.imageBlob``` をFirebase StorageにアップすればOKだね。という話になります。


# Firebase側対応版
Firebase Functions を使います。Storageに画像がアップロードされたら起動する感じにしておきます。

基本的には、[Firebase公式ドキュメントにサムネを生成するコード](https://firebase.google.com/docs/storage/extend-with-functions?hl=ja)がのっているので、ほぼほぼそれを参考にしました。

``` ts:functions/src/index.ts(抜粋)
await spawn('convert', [
    tempDownloadFilePath,
    '-auto-orient',
    '-thumbnail',
    '600x600>',
    tempConvertedFilePath
  ])
```
[全コード](https://github.com/nbfujiwara/sample-firebase-storage-rotate/blob/master/functions/src/index.ts)

やる前はメタデータのExifでOrientationを取得して。。。みたいなのを想定していたのですが、
まさかのパラメータに```-auto-orient```追加だけで、できてしまいました。感動！！！

注意すべきは

``` ts:
exports.convertImage = functions.storage.object().onFinalize(async (object) => {
```
```onFinalize``` のイベントで実行されるので、変換した画像をStorageに保存するときに、またこのスクリプトが実行されます。なので、下手したら無限ループするやんってことでしょうか(公式サンプルも今回のもファイル名判定してループを止めています)。

なもんで、実際に導入するときはemulatorとかしっかりつかって検証した上でやりましょう。

また、Databaseに変換後のパスを保存したりとか、このFunctionsの変換処理が終わったタイミングってどうやって判断すんだっけとか、色々考えないと、実際のサービスなどでは使えないでしょうね。

# 最後に
どっちがいいかはその時々で違うと思います。クライアント側でやるほうが楽だし、アップロードの通信量を削減できるというメリットもあると思います。

でもバックエンド側でやれば、ゆーてもバリデーション的な位置づけで、変な画像は許可させないぞ、という立ち位置もとれるというのはGoodかなぁと。


ではでは、みなさまメリクリ〜
Github Actionsがorganizationのプライベートリポジトリで動かなかった話

# 序文
微妙にレアケースにも思えるのと、あんまり有意義な情報がひっかからなかったので誰かの役に立てばと思い、投稿。

# 結論
リポジトリ数に応じたレガシーの課金プランだと動かない。
Github Teamに移行する必要あり。

# 現象
プライベートリポジトリでGithub Actionsを動かそうとしたところ、以下のようなエラーが表示されて動かなかった。

```
### ERRORED 09:51:20Z

- Workflows can't be executed on this repository. Please check your payment method or billing status.
```

なにがなんだかわからないので、とりあえず、個人で課金設定してみるも駄目。

Actionsページに戻ったら上部に以下のようなエラーが表示されていた。

```
GitHub Actions workflows can't be executed on this repository.
Actions is not available for legacy per-repository billing plans. Please visit your billing settings to upgrade your account.
```

課金プランを変更し、無事解決。
課金プランを変える理由を説明するのが大変だった…
Swift Network.framework Study 20191206「Server TCP」その2 receiveメソッド使用

# Study

Network.framework
Study：Server側

## 環境

Client：Java、NetBeans
Server：Swift、Xcode

#Client Source Java

```java
package example.java.network;

import java.io.PrintWriter;
import java.net.Socket;

public class ExampleClientSocket {
    public static void main(String[] args) {
        try(Socket socket = new Socket("localhost", 7777);
            PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);) {
            printWriter.println("Example Send Data");
        }
        catch(Exception e) {
            System.out.println(e);
        }
    }
}
```

# Server Source Swift

NWListerを使用する
コネクション確立後のNWConnectionに受信処理登録、開始実施
受信バイト数指定出来るreceiveメソッド使用。
受信したデータ1回分から、maximumLength数分取得しました。
下記の例だと5バイト。
5バイト以上を送信したとしても、6バイト目以降を連続して受信がコールされるわけではない様です。
続きを取れるかは調査中。

## main.swift

```swift
import Foundation
import Network

var networkServer = NetworkServer()

networkServer.startListener()

while networkServer.running {
    sleep(1)
}
```

## NetworkServer.swift

```swift
import Foundation
import Network

class NetworkServer {
    public var running = true

    func startListener() {
        let myQueue = DispatchQueue(label: "ExampleNetwork")

        do {
            let nWListener = try NWListener(using: .tcp, on: 7777)
            nWListener.newConnectionHandler = { (newConnection) in
                print("New Connection!!")
                newConnection.receive(minimumIncompleteLength: 1, maximumLength: 5, completion: { (data, context, flag, error) in
                    print("receiveMessage")
                    let receiveData = [UInt8](data!)
                    print(receiveData)
                })
                newConnection.start(queue: myQueue)
            }
            nWListener.start(queue: myQueue)
            print("start")
        }
        catch {
            print(error)
        }
    }
}
```
Sigfox Callback - Custom Payload Config 応用

>Sigfox Callbackのcustom payload configになじみのない方は、
>
- [Sigfox Callback機能](https://qiita.com/ghibi/items/53259381a30363538a6d)
- [Custom Payload Config機能](https://qiita.com/ghibi/items/361ea55ea04658b4193c)
を読んでください。

LPWAを使ったアプリケーションを開発する際は、如何にデータサイズを抑えるかが、重要なポイントになっています。例えば次のようなデータを送りたいとします。

|データ名|内容|サイズ|データ例|
|:------|:---|:----|:---------|
|Speed|速度情報|8bits（1Byte）|0km/h～255km/h|
|Direction|進行方向|4bits|北、北東、東、南東...北西（8パターン）|
|Status|モノの状態コード|4bits|0～15で表すコード|
これをSigfoxのペイロードに乗せようとした場合、ひとつの方法は、Speed、Direction、Statusで各1バイトずつ使う方法もあります。が、4bitsで十分なデータに8bits(1byte)も使いたくないということがあると思います。
そのような場合、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/a6a21631-a437-3c2b-3ca0-a4c01e73fce5.png)
となるペイロード構成をとることになります。

では、このペイロードをSigfoxのCustom Payload Configで変数定義したい場合、どうなるでしょうか？

#間違ったやり方
まずは、間違った定義をお見せします。
`Speed::uint:8 Direction::uint:4 Status::uint:4`
このように定義すれば、Body内（例えばJSON構文）でcustomData#Speed, customData#Direction, customData#Statusといった変数が使えるようになるから、それでいいと思うかもしれません。
###何が起きるか？
このような定義をした場合、何が起きるのかを説明します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/073386c9-fdd7-8fae-a0ff-a954c9d5cb0b.png)
まずは、
[1] `Speed::uint:8`により、Speed情報は先頭から8ビットをuint型として読み取るため、問題ありません
[2] `Direction::uint:4`により、次のバイトの先頭から4ビットをuint型として読み取るため、これも問題ないでしょう。
[3] 問題は、ここです。[2]でuintを使ったので、自動的に次のバイト（上図でいう"NEXT"）までポインタが飛んでしまいます。
ですので、`Status::uint:4`は、"NEXT"のところから4ビットを取ってきてしまいます。

#解決例
次のようにcustom payload configを定義してみましょう。
`Speed::uint:8 Direction::uint:4 Status:1:uint:4::3`
違いは、Statusのところです。2フィールド目（byte_index）に1が、そして6フィールド目（最後）に3がついています。
`Status:1:uint:4::3`を見てみます。下図の[4][5]です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/c03d3916-427e-918f-9554-df2994b39520.png)
[4] 2フィールド目(byte_index)を"1"にしたため、ペイロードの2バイト目にポインタが移ります。（0にしたら、1バイト目に移ります。byte_indexは0～9のいずれかが使えます）
[5] 最終フィールドを"3"とすることにより、4ビットシフトとなります。
Sigfoxのヘルプを見てみると
>**uint** (unsigned integer) : parameters are the number of bits to include in the value, optionally the endianness for multi-bytes integers, and optionally the bit offset where to start the reading of the first byte. Default is big endian and 7 for the offset.

と書かれています。...optionally the bit offset where to start the reading of the first byte. Default is 7 for the offset. 
ビットオフセットのデフォルトは7ということです。つまり、オフセットしたくない場合が7ということは、4ビットオフセットしたい場合は*7-4=3*でいいですね。

#試してみる
Custom payload configを試すだけであれば、わざわさ、Callbackを作成する必要もありません。
ご自身のデバイスのDeviceTypeを選択し、Edit画面にある**Payload display**に設定するだけで、デバイスのMessages画面で確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/fd5e2a48-f3c3-8c71-040e-63e1e8c9ea88.png)
Payload displayは、表示だけですので、システムに影響を及ぼすこともないかと思いますので、一度、ご自身の環境で試してみてください。

[Sigfox Japan KCCS](https://qiita.com/organizations/sigfox)
08. 暗号文

## 08. 暗号文
与えられた文字列の各文字を，以下の仕様で変換する関数cipherを実装せよ．

英小文字ならば(219 - 文字コード)の文字に置換
その他の文字はそのまま出力
この関数を用い，英語のメッセージを暗号化・復号化せよ．

###Go
```go
package main

import "fmt"

func cipher(s string) string {
	r  := ""
	for i := 0;i<len(s); i++ {
		if s[i] >= 'a' && s[i] <= 'z' {
			r += string(219 - s[i]);
		} else {
			r += string(s[i]);
		}
	}

	return r;
}

func main() {
	s := cipher("AaBcCcDd1234efgEFG");
	fmt.Println(s);
}

```


###python
```python
# -*- coding: utf-8 -*-

def cipher(s):
    r = ""
    for i in range(len(s)):
        if s[i].islower():
            r += chr(219 - ord(s[i]))
        else:
            r += s[i]

    return r

print cipher("AaBcCcDd1234efgEFG")
```


###Javascript
```Javascript
function cipher(s) {
    r = "";
    for (var i = 0; i < s.length; i++) {
        if (s[i] >= 'a' && s[i] <= 'z') {
            r += String.fromCharCode(219 - s[i].charCodeAt(0));
        }
        else {
            r += s[i];
        }
    }

    return r;
}

console.log(cipher("AaBcCcDd1234efgEFG"));
```

## まとめ

微妙に長いソースになった。もっとスッキリ書ける様にしたい。

[トップ](https://qiita.com/naoshin1984/items/3d7814e2f8eb01eea8dd)
RISC-V freedom-e-sdkをSparkFun RED-Vで動かすためのメモ

# 背景

前回、freedom-e-sdkをqemuで動かすことはできたので、次は実際のボードで動かそうと思い、SiFive HiFive1 Rev.Bを購入しようと思ったところ、Shippingが2013/1/1以降になてしまうということがわかりました。HiFive1 Rev.Bは、ESP32も搭載されているし、SiFive FE310の標準環境といえるのでこれはこれで購入をかけたのですが、その後、NuttX contributorで有名なAlanからSparkFun RED-V Thing Plusを紹介され、すぐに発注してみたところちょうど1週間で届きました。

# HiFive1 Rev.Bとの違い

回路図を見ていて気付いたんですが、ESP32が搭載されていない、RGB LEDが搭載されていない、ピンヘッダのアサインが違う、といった大きな違いはありますが、搭載されているCPUはSiFive FE310-0002で、USB-JTAG（J-Link + UART)はNXP MK22FN128、QSPI-Flashは32MbitとHiFive1 Rev.Bと同じでした。なので、SparkFun RED-Vが動かせるようになれば、HiFive1 Rev.Bはそのまま動かせるようになりそうです。

# freedom-e-sdkをSparkFun RED-V向けにビルドする

freedom-e-sdk/bspにはSparkFun RED-Vが存在しませんが、HiFive1 Rev.Bと同じということがわかったので、HiFive1 Rev.B向けにビルドしてみます。

    $ make software PROGRAM=hello TARGET=sifive-hifive1-revb

ちなみに、sifive-hifive1-revb向けにビルドしたhello.elfは、qemuだと動きません。これは、エントリーポイントアドレスが違うからです。sifive-hifive1-revb向けには、エントリーポイントアドレスは0x20010000になっています。

    $ riscv64-unknown-elf-readelf -a software/hello/debug/hello.elf
    ELF Header:
     Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
     Class:                             ELF32
     ...
     Entry point address:               0x20010000

qemuで動かすためには、エントリーポイントアドレスが 0x20400000 でなければなりません。

# USB-JTAGとの接続

MK22FNにはJ-Link向けのfirmwareが書かれているようなので、J-Linkを使う必要があります。今までopenocd + ftdiが長かったため、恥ずかしながらJ-Linkは初めてなんですが、gdb server以外にも色々とツールが揃っていて便利そうだということは知っていました。openocdもinterfaceとしてJ-Linkもサポートしているので、openocd + J-Linkという構成でも良いんですが、せっかくなので、J-Linkのツールを使ってみることにしました。J-Linkのソフトウェアは https://www.segger.com/downloads/jlink/#J-LinkSoftwareAndDocumentationPackBeta からダウンロードして、インストールしておきます（無料です）。



# JLinkGDBServerの起動

筆者の環境はMacBook Pro 2018(macOS Catalina)で、VMware Fusion + Ubuntu 18.04 x86_64もインストールしていますが、今回はJLinkGDBServerをmacOSで動かしてみることにしました。まずは、SparkFun RED-VとMacBook Proをつなげます。ここで注意があります。SparkFun RED-VにはUSB type-Cコネクタがついていますが、これはあくまでコネクタとしてtype-Cを使っているだけなので、MacBook ProのThunderbolt 3（USB-C）に直接type-Cでつなげることができません。その代わり、USB Hubなどを介して、type-A to type-Cで接続する必要があります。ケーブルを接続したら、まずはJLinkConfigを立ち上げて、ボードが正しく認識していることを確認します。

ボードが正しく認識されていたら、JLinkGDBServerを起動すると、Target deviceやTarget interfaceの設定項目が現れます。ここで、Target deviceとしてSiFive FE310を選び、また、Target interfaceとしてJTAGを選んでおきます。OKを選択するとJLinkGDBServerが起動して、gdbからの接続待ちとなります（補足：コマンドライン版では、JLinkGDBServer -device FE310 でOKです)。ログにはポート番号（デフォルトは2331）が出ているので、gdbで接続する際には、このポート番号を指定します。

# picocomでシリアルコンソールに繋ぐ

USBで繋ぐと、USB serial用のデバイスファイルも作られます。macOSの場合、/dev/usb.modemXXXXX というファイルが現れます。ターミナルプログラムとしては、僕がよく使っているpicocomを事前にbrewでinstallしておきます。このとき2つのデバイスファイルが作られますが、1つ目はFE310のUART1につながっており、2つ目は、恐らくHiFive1 Rev.BのESP32向けだと思います（SparkFun RED-Vではどこにもつながっていないです）。理由は起動メッセージをみるとわかります。


# gdbからhello.elfを書き込む

JLinkGDBServerのポートアドレスがわかったので、あとは gdb から target extended-remote でポート番号を指定し、load hello.elf すれば JLinkGDBServer経由でSparkFun RED-V上のQSPI-Flash (4MB)に書き込むことができます。あとは、continueすれば、Hello, World!がシリアルコンソール上に出ます。
【初心者】なるほどわからん。Rubyまとめ

勉強の忘備録に。日々更新していきます。

#配列とハッシュの違い

###【配列】

```配列.rb

fruits = ["りんご" ,"みかん" ,"バナナ"]

puts fruits[1]

```

変数内に複数要素を含める事が出来る。
順に並べた文字列から指定した番号を取得する事が出来る・。
この例で言うと[0]ならりんご、[1]ならみかん。[2]ならバナナ。

**＼＼番号は「1」ではなく「0」からになるから注意！！！！／／**

###【ハッシュ】

```ハッシュ.rb
data = {}

```
空のハッシュを生成する。
左のdataは変数名なので変えるのは自由。

**＼＼配列との大きな違いは値を単純に並べるのではなくてキーとセットに出来る事！！！！／／**

```ハッシュ取り出す.rb

lovefruits = {"fruits" => "りんご", "taste" => "美味しい"}

puts lovefruits 

```
ここで言う「apple」がキー、「りんご」が値。
キーと値は必ずセットになる。並べる場合は配列と同じく「,」で区切る。配列と違って囲むカッコは

 **[コレ]** じゃなくて**{コレ}**

先ほどの物をputsすると

```ハッシュ取り出す.rb

{"fruits" => "りんご", "taste" => "美味しい"}

```
こうなる。
Dask dataframe apply で返り値のない関数を指定する場合のmetaの値

# その前にDaskのインストール
Pythonで並列計算を行う方法の一つにDask dataframe applyがあります. （って昨日Google先生が教えてくれました.) Daskはpipで以下のようにインストールできます. 

```
$ pip install dask 
 ```

これで以下のように普通にimportしますが,

```python
import dask.dataframe as dd
```
僕はこのようなエラーが出ました  

```
ModuleNotFoundError: No module named 'toolz'
```

なので

```
$ pip install toolz
 ```

それでも

```
ImportError: fsspec is required to use any file-system functionality.
```

キレながら

```
$ pip install fsspec
```

これでやっと使えるようになったので本題に移ります.  

# 本題
僕はpandas DataFrameをDask dataframeに変換してから以下のような返り値を持たない関数を行に対してapplyしようとしました.  

```python
import pandas as pd
import dask.dataframe as dd

#A列とB列の値を足した値を標準出力に吐き出す関数
def print_sum(pd_series):
    print(pd_series['A'] + pd_series['B'])

A = pd.DataFrame({'A': [1.0, 1.5, 2.0 ], 'B': [5.0, 2.0, 1.2]},index = [1,2,3])
A_dd = dd.from_pandas(A, npartitions=2)

A_dd.apply(print_sum, axis = 1).compute(scheduler='processes')
```

これで実行すると以下のような警告が出ます. 

```
You did not provide metadata, so Dask is running your function on a small dataset to guess output types. It is possible that Dask will guess incorrectly.
To provide an explicit output types or to silence this message, please provide the `meta=` keyword, as described in the map or apply function that you are using.
```

どうやら`.apply()`に与える関数がどのようなデータ型を返すのかを`meta`という引数に指定しなければいけないようです. でも返り値なしやしなぁ...C++やったら`void`やけどpythonやとなんて書くんやろ...  

調べました！ `'None'`です！  

```python
import pandas as pd
import dask.dataframe as dd

#A列とB列の値を足した値を標準出力に吐き出す関数
def print_sum(pd_series):
    print(pd_series['A'] + pd_series['B'])

A = pd.DataFrame({'A': [1.0, 1.5, 2.0 ], 'B': [5.0, 2.0, 1.2]},index = [1,2,3])
A_dd = dd.from_pandas(A, npartitions=2)

A_dd.apply(print_sum, axis = 1, meta = 'None').compute(scheduler='processes') # meta = 'None'
```

これで解決！長々と書きましたが以上です！
【Swift】Arrayを配列で回しながら、要素だけでなく、その番号も取る方法

# はじめに
どうもこんにちはToshです。Arrayを配列で回すとき、要素数だけでなく、その番号も取りたい時ってありますよね。
その方法を紹介していきたちと思います！

# つまり
```swift
for (index, element) in array.enumerated() {
    //indexが配列の番号
    //elementは配列の要素
}
```

# 説明【初心者向け】
Swiftにおけるfor文の書き方は、

```swift
for i in 0..<array.count {
    //配列の番号はiでとるときは
    print(i)
    //配列の要素をとるときは
    print(array[i])
}
```
でかけると思うのですが、そもそもfor文は配列に対しては、

```swift
for element in array {
    //配列の要素をとるときは
    print(element)
}
```
のような書き方で、容易に書くとこができる。
ただし、この書き方だと、そもそも、要素に対して、その番号を取得することが難しいです。
そういったときに、for文で配列を簡単に書きつつ、番号を取得する方法があります。
それが、こちら、

```swift
for (index, element) in array.enumerated() {
    //indexが配列の番号
    //elementは配列の要素
}
```
このように、配列に対して、`.emurated()`をつけてあげると、配列の順番と要素を取得することができます。
今回は、indexを順番、elementと要素としてとることができます。

# まとめ
このコードを使ってみると、今まで、綺麗でなかったコードが綺麗に書けると思うので、是非使ってみてくださいー！