OmniAICreator/Qiita-1.07M huggingface dataset:
iPod touch(1st generation)(iOS 9.3.5) でのアプリ動作状況

・動作するアプリ(十分に検証した訳ではない。)
ドライブ (Google)
Gmail
prime video (アマゾン)
radiko
NHK ラジオ
NHK ニュース防災
iCloud Drive
Buncho for Twitter
Amazon Music
Amazon Drive
Amazon Photo

・動作しないアプリ
OneDrive
Youtube

[Twitter]
※ 何かのタイミングで「アップデートが必要」→「もうアップデートできない」という状態になりますが、暫くすると使えるようになったりします。
※ フリート / スペースには対応しておらず、表示もされません。

・期待通りにならない挙動
[mobile.twitter.com へのアクセス]
Safari / Edge  → 「このブラウザは現在サポートされていません。」となる。

[youtube.com へのアクセス]
Edge → 動画再生がすぐに停止する。→ 何故か最近はきちんと再生できています。(2021/11/5)


※適宜、加筆していきます。
composer updateしたらcomposer dump-autoloadができなくなった。

#症状
laravel8でパッケージを削除してcomposer updateをしたらartisanが開けないよと言われた。

```
# composer dump-autoload
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Could not open input file: artisan
Script @php artisan package:discover --ansi handling the post-autoload-dump event returned with error code 1

```
<br>


artisanといわれているのでコマンドを叩いてみる


```
#　php artisan route:list
Could not open input file: artisan
```
<br>
artisanファイルがないか確認してみる

```
# ls
app  bootstrap	composer.json  composer.lock  config  database	node_modules  package.json  package-lock.json  phpunit.xml  public  README.md  resources  routes  server.php  storage  tests  vendor  webpack.mix.js
```

なぜかなくなっている。

#解決
なくなっているので作成する
下記のlaravel公式リポジトリから
https://github.com/laravel/laravel/blob/8.x/artisan

```php:artisan
#!/usr/bin/env php
<?php

define('LARAVEL_START', microtime(true));

/*
|--------------------------------------------------------------------------
| Register The Auto Loader
|--------------------------------------------------------------------------
|
| Composer provides a convenient, automatically generated class loader
| for our application. We just need to utilize it! We'll require it
| into the script here so that we do not have to worry about the
| loading of any of our classes manually. It's great to relax.
|
*/

require __DIR__.'/vendor/autoload.php';

$app = require_once __DIR__.'/bootstrap/app.php';

/*
|--------------------------------------------------------------------------
| Run The Artisan Application
|--------------------------------------------------------------------------
|
| When we run the console application, the current CLI command will be
| executed in this console and the response sent back to a terminal
| or another output device for the developers. Here goes nothing!
|
*/

$kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);

$status = $kernel->handle(
    $input = new Symfony\Component\Console\Input\ArgvInput,
    new Symfony\Component\Console\Output\ConsoleOutput
);

/*
|--------------------------------------------------------------------------
| Shutdown The Application
|--------------------------------------------------------------------------
|
| Once Artisan has finished running, we will fire off the shutdown events
| so that any final work may be done by the application before we shut
| down the process. This is the last thing to happen to the request.
|
*/

$kernel->terminate($input, $status);

exit($status);
```
なおった。。
mix release で ram_file.compress/1 is undefined or private とエラーが出たときの対処

## はじめに

先ほど起こったエラーです

解決方法は elixir forum にありました

https://elixirforum.com/t/cannot-create-release-file/39705

## 実行環境

Elixir 1.9.2 (compiled with Erlang/OTP 23)

## エラー内容

表題の通り、サーバーで `mix release` を実行すると、 以下のようなエラーが返ってきました

```shell
18:54:03.260 [error] Task #PID<0.5821.0> started from #PID<0.93.0> terminating
** (UndefinedFunctionError) function :ram_file.compress/1 is undefined or private
    (kernel) :ram_file.compress({:file_descriptor, :ram_file, #Port<0.6>})
    (mix) lib/mix/release.ex:722: Mix.Release.strip_beam/1
    (mix) lib/mix/release.ex:693: anonymous fn/5 in Mix.Release.copy_ebin/3
    (elixir) lib/enum.ex:1948: Enum."-reduce/3-lists^foldl/2-0-"/3
    (mix) lib/mix/release.ex:688: Mix.Release.copy_ebin/3
    (mix) lib/mix/tasks/release.ex:1163: Mix.Tasks.Release.copy/2
    (elixir) lib/task/supervised.ex:90: Task.Supervised.invoke_mfa/2
    (elixir) lib/task/supervised.ex:35: Task.Supervised.reply/5
    (stdlib) proc_lib.erl:226: :proc_lib.init_p_do_apply/3
```

## 対処

Elixir のバージョンを最新にすることでエラーを回避できました

更新後のバージョン

```shell
$ elixir --version
Erlang/OTP 24 [erts-12.0.2] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1]

Elixir 1.12.2 (compiled with Erlang/OTP 24)
```

## まとめ

ビルド用環境はこまめに更新しましょう
極値「x^2+x*y+y^2-4*x-2*y」をwolframalphaとsympyで求めたい。

オリジナルリンク

https://qiita.com/momo10/items/3596cb8b10532b2a84eb

https://www.sci.kanagawa-u.ac.jp/math-phys/hmatsu/lecture.html

松澤寛先生の講義資料第７回5頁より

https://www.sci.kanagawa-u.ac.jp/math-phys/hmatsu/Analysis3Lec-07.pdf#page=5


#wolframalphaで(ヘッセ行列式?も)

https://www.wolframalpha.com/input/?i=x%5E2%2Bx*y%2By%5E2-4*x-2*y&lang=ja




最小値:
(x, y) = (2, 0) のとき, min{x^2 + x y + y^2 - 4 x - 2 y} = -4


https://www.wolframalpha.com/input/?i=x%5E2%2Bx*y%2By%5E2-4*x-2*y%E3%81%AE%E3%83%98%E3%83%83%E3%82%BB%E8%A1%8C%E5%88%97%E5%BC%8F&lang=ja

https://www.wolframalpha.com/input/?i=x%5E2%2Bx*y%2By%5E2-4*x-2*y%E3%81%AE%E3%83%98%E3%83%83%E3%82%BB%E8%A1%8C%E5%88%97&lang=ja

結果:
3



#sympyで
勉強中

#参考
https://qiita.com/IshitaTakeshi/items/c7b0db1c73d65f9707ea
ActiveHashの特定の数字を表示させない（条件分岐）

#はじめに
![スクリーンショット 2021-07-20 19.52.30（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264460/d25d4289-5da3-e119-7d27-0b325c5531dd.png)
![スクリーンショット 2021-07-20 19.52.54（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264460/00ce6d09-2d25-1183-e73a-92fed6949612.png)

```hotel_type.rb

class HotelType < ActiveHash::Base
  self.data = [
    { id: 1, name: '選択して下さい' },
    { id: 2, name: '宿泊施設ではない' },
    { id: 3, name: 'ホテル' },
    { id: 4, name: '旅館' },
    { id: 5, name: 'コテージ' },
    { id: 6, name: 'メゾネット' },
    { id: 7, name: 'アネックス' },
    { id: 8, name: '民泊' },
    { id: 9, name: 'キャンプ' },
    { id: 10, name: '農家民泊' },
    { id: 11, name: '国民宿舎' },
    { id: 12, name: '休暇村' },
    { id: 13, name: 'その他' }
  ]

  include ActiveHash::Associations
  has_many :model
end
```

このように`宿泊施設ではない`を選んだ時`-`が出るようにしたいなと思い、条件分岐を使って表示させました。

最初から` { id: 2, name: '-' }`こうしろよと意見があると思いますが意味があってこのようにしたのでご了承下さい・・・

#やった事

- `宿泊施設ではない`を選んだ時、`-`が表示される

- それ以外は通常通り表示される

この事から条件分岐が必要とする事が分かりました。

```erb
<% if 条件式%>
  <p>-</p>
 <%else%>
  <%= @model.hotel_type.name %>
<% end %>
```

こんな感じになると思います。

#結論
ActiveHashは数字がDBに保存されます。なので数字で条件式を作ります。

```.rb
if @model.hotel_type_id == 2
```

この条件式では`hotel_type_id`のidが2だった場合という形になります。
Vue.jsでJestを導入する際に詰まったところまとめ

# 概要
Vue.jsのUT実施のためにJestを採用
設定関連でたくさん詰まったのでエラーと解決方法をまとめる。

# 前提
### package.jsonに以下の設定を行い「npm test」でテストを実行できる状態にする
`"test": "NODE_ENV=test jest",`

### jest.config.jsを以下のように記載(パスは環境により書き換える)
```
module.exports = {
  moduleNameMapper: {
    '^@/(.*)$': '<rootDir>/$1',
    '^~/(.*)$': '<rootDir>/$1',
    '^vue$': 'vue/dist/vue.common.js'
  },
  moduleFileExtensions: ['js', 'vue', 'json'],
  transform: {
    '^.+\\.js$': 'babel-jest',
    '.*\\.(vue)$': 'vue-jest'
  },
  collectCoverage: false,
  collectCoverageFrom: [
    '<rootDir>/components/**/*.vue',
    '<rootDir>/pages/**/*.vue'
  ]
}
```

### 以下のコマンドで必要なパッケージをインストールしておく
```
npm i --save-dev vue-jest
npm i jest --save
npm i @vue/test-utils
```

## [エラー①]Requires Babel "^7.0.0-0", but was loaded with "6.xx.x"
```
Requires Babel "^7.0.0-0", but was loaded with "6.xx.x". If you are sure you have a compatible version of @babel/core, it is likely that something in your build process is loading the wrong version. Inspect the stack trace of this error to look for the first entry that doesn't mention "@babel/core" or "babel-core" to see what is calling Babel.
```
npm test実行時に上記のエラーが発生。

https://github.com/babel/babel/issues/8482

上記より以下のコマンドを実行することにより回避

`npm install --save-dev "babel-core@^7.0.0-bridge.0"`

ただし、babel-coreのバージョンを変更することになるので、既存バージョンを考慮した上で変更すること。

## [エラー②]Your test suite must contain at least one test.
npm test実行時に上記のエラーが発生。

以下のコマンドを実行して、jsdomをインストールすることにより回避
`npm install --save-dev jsdom jsdom-global`

対象のテストファイルに記載(setupファイルがあればそちらに記載する)
`require('jsdom-global')()`

## [エラー③]Cannot read property 'child' of undefined
jest.config.js直下に以下の設定を追加
`testEnvironment: "jsdom",`
https://github.com/vuejs/vue-test-utils/issues/1192
AzureFactory備忘録

- factory備忘録を書く
↓今回の流れ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960226/997f5a59-8250-a4d0-e073-96afe5613516.png)

1. 管理（鞄のマーク）＞リンクサービス＞追加
リンクサービスで接続先を定義する(Azureサービスで作ったDBとか、KeyVaultとか・・・・)
DataFactoryはAzurePortalから独立してる存在のようなものなのでAzureサービスとFactoryをつなぐ作業が必要

2.作成者（ペンのマーク）＞データセット
リンクサービスでつないだものをセットする
※作業用の変数に入れるようなイメージ？
コンテナーにつなぐ変数、DBにつなぐ変数など

3.パイプラインの作成

4.パイプラインをいつ流すかのトリガーを設定する
ideapad duetにjupyter labを入れるまでの覚書

## はじめに
　先日ideapad duetを衝動買いしました。軽いPCなので出先で気軽にpythonをポチポチできたらな〜と思っていたのですが、jupyterの導入に難儀した+意外とまとまった情報が見当たらなかったので、備忘も兼ねてjupyter labの導入までを記します。
##Linuxの有効化
　chromebookでは「設定→デベロッパー」からLinuxを有効化することができます。適当にディスクサイズを指定して、指示どおりボタンを押せば勝手にインストールされます。簡単便利！
##jupyter labの導入
　anacondaを使ってpythonの環境を整えたかったのですが、ideapad duetはARM系の何かしらを使っているらしく、どうやら素直にインストールすることができないようです(無知)。そのため、pipでちまちまインストールしていきます。

が、まずはそのpipを使えるようにします。

```
sudo apt-get update
sudo apt-get install python3-pip
```
jupyter lab(とその他周辺機器)をインストールします。

```
sudo apt-get install build-essential libssl-dev libffi-dev python3-dev
sudo pip3 install jupyter
sudo pip3 install jupyterlab
```
動けばOK

```
jupyter lab
```

##おわりに
おわり！！
とりあえず動く環境を入手するところを目指しました。
マズいところがあれば有識者の方々コメントください。
mix deps.get  で ssl.cipher_suites/1 is undefined or private とエラーが出たときの対処

## はじめに

先ほど起こったエラーです

解決方法は elixir forum にありました

https://elixirforum.com/t/keep-getting-the-error-function-ssl-cipher-suites-1-is-undefined-or-private/40043/3

## 実行環境

Elixir 1.9.2 (compiled with Erlang/OTP 23)

## エラー内容

表題の通り、サーバーで `mix deps.get` を実行すると、 以下のようなエラーが返ってきました

```shell
$ mix deps.get

18:45:07.804 [error] Task #PID<0.160.0> started from Hex.UpdateChecker terminating
** (UndefinedFunctionError) function :ssl.cipher_suites/1 is undefined or private
    (ssl) :ssl.cipher_suites(:openssl)
    (hex) lib/hex/http/ssl.ex:124: Hex.HTTP.SSL.filter_ciphers/1
    (hex) lib/hex/http/ssl.ex:66: Hex.HTTP.SSL.ssl_opts/1
    (hex) lib/hex/http.ex:41: Hex.HTTP.build_http_opts/2
    (hex) lib/hex/http.ex:16: Hex.HTTP.request/5
    (hex) lib/hex/update_checker.ex:31: anonymous fn/0 in Hex.UpdateChecker.handle_cast/2
    (elixir) lib/task/supervised.ex:90: Task.Supervised.invoke_mfa/2
    (elixir) lib/task/supervised.ex:35: Task.Supervised.reply/5
Function: #Function<0.121230294/0 in Hex.UpdateChecker.handle_cast/2>
    Args: []
```

## 対処

以下のコマンドで Hex を更新するとこでエラーが解消しました

```shell
mix local.hex
```

## まとめ

ビルド用環境はこまめに更新しましょう
PythonでSwitchBot温湿度計のデータ取り込み、GoogleAppsScriptでスプレットシートへの記録を自動化をする

初めまして、IoTが大好きで、Raspberry Piだのスマート家電だのを買いあさってる人です。
今回は、中国は深センのWonderlabsが出しているSwitchBot温湿度計を使って、
スプレッドシートに自動で温度と湿度を記録できるようにします。
![ondo](https://1.bp.blogspot.com/-PTRKn50Xskk/Ut0BHXqIV2I/AAAAAAAAdSw/NrpoZ--BnVw/s800/ondokei.png)

#事前準備
:::note warn
SwitchBot APIを使用するにはHub Mini,Hub Plusと連携させ、
オンラインサービスを有効にする必要があります。
:::
温湿度計の設定を完了させていることを前提とします。
温湿度計のBluのMacアドレスを控えておいてください。
SwitchBotアプリで開発者用トークンを発行して、控えておいてください
やり方はネットで検索すればたくさん出てきます。~~他人任せ~~

#Pythonのコード、設定
```Python
import requests
import json
import sys

header = {"Authorization": "your_token"}
device_id = "your_mac_address"
url = "https://api.switch-bot.com/v1.0/devices/" + device_id + '/status'

response = requests.get(url, headers=header)
json_dict = json.loads(response.text)

temperature = json_dict["body"]['temperature']
humidity = json_dict["body"]['humidity']

url2 = "your_gas_app_url"
data = {'temp': temperature, 'humi': humidity}
response = requests.post(url2, data=data)
```
これが温湿度計のデータを取得し、GASにデータを送るプログラムです。
your_token には自分のトークンを
your_mac_address には自分の温度計のMacアドレスを入れてください。
your_gas_app_url については次の項で説明します。

#GoogleAppsScriptのコード、設定
Googleドライブにアクセスし、スプレッドシートを新規作成します。
作成したら「ツール」を開いて、「スクリプト エディタ」を開きます。

![google.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887402/5625374e-91fd-68bb-1924-8a5d70ae05fa.png)

表示されたエディタに以下のコードを貼り付けてください

```GoogleAppsScript
function doPost(e) {
  var temp = e.parameter.temp;
  var humi = e.parameter.humi;
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1');
  sheet.appendRow([new Date(), temp, humi]);
}
```
出来たらデプロイ→新しいデプロイを開き、
種類の選択を「ウェブアプリケーション」
アクセスできるユーザーを「全員」に変更してデプロイします。

![スクリーンショット (47).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887402/bfb89d60-98f0-7c13-b739-19485bf38e93.png)

この画面になったら、アクセスを承認して
Googleアカウントでログインします。
警告画面がでたら「詳細」→ 安全ではないページに移動
「Googleアカウントへのアクセスを～」の画面でアクセスを許可
GASのページに戻ると、デプロイIDとURLが表示されているので
URL(script.google.com/macros/なんとか)をコピーしてください。

このURLを先ほどのyour_gas_app_urlの場所に貼り付けてください。
あとはPythonプログラムをcrontabなどで回せば
勝手に記録してくれるようになります。
APIは一日1000回までリクエストが可能です。自分は5分に一回回しています。

あとは煮るなり焼くなりご自由に。:fire:
Amazon S3にある画像のExif情報の削除&向きを自動調整してアップロードするGoのLambda関数

# 概要
S3に格納されているオブジェクト(JPEG画像)をコピーした際に起動するLambda関数。
Lambda関数の処理としては、コピーした画像を読み込んで向きを自動調整し、Exif情報を削除した上でS3にアップロードしている。

# 環境
go1.16.5を使用。
Lambdaのランタイムは `go1.x` 。
# ソースコード

```go
package main

import (
	"bytes"
	"errors"
	"io"
	"log"
	"os"

	"github.com/disintegration/imaging"

	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-lambda-go/lambda"
	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/s3"
	"github.com/aws/aws-sdk-go/service/s3/s3manager"
)

// アップロードされた画像のEXIF情報を削除するのと向きを自動調整し、再アップロードする
func HandleRequest(event events.S3Event) error {
	for _, record := range event.Records {
		bucket := record.S3.Bucket.Name
		key := record.S3.Object.Key

		sess := session.Must(session.NewSession(&aws.Config{Region: aws.String("ap-northeast-1")}))
		//fileの読み込み
		obj, err := s3.New(sess).GetObject(&s3.GetObjectInput{
			Bucket: aws.String(bucket),
			Key:    aws.String(key),
		})
		if err != nil {
			log.Fatal(err)
		}
		buf, err := io.ReadAll(obj.Body)
		if err != nil {
			log.Fatal(err)
		}

		// 向きを自動調整
		decoded_image, err := imaging.Decode(bytes.NewReader(buf), imaging.AutoOrientation(true))
		if err != nil {
			log.Fatalln(err)
		}

		//コピー先の空ファイル名
		// Lambdaでは /tmp/ を付けないとエラーになる
		file_name := "/tmp/tmp.jpg"

		err = imaging.Save(decoded_image, file_name)
		if err != nil {
			log.Fatal(err)
		}

		//imagingで作ったファイルをopen
		f, err := os.Open(file_name)
		if err != nil {
			log.Fatal(err)
		}

		//S3にアップロード
		uploader := s3manager.NewUploader(sess)
		_, err = uploader.Upload(&s3manager.UploadInput{
			Bucket: aws.String(bucket),
			Key:    aws.String(key),
			Body:   f,
		})
		if err != nil {
			log.Fatal(err)
		}
	}
	return nil
}

func main() {
	lambda.Start(HandleRequest)
}
```

# ポイント
* https://github.com/disintegration/imaging の `AutoOrientation` で画像の向きを調整。

* Lambdaでは一時領域として `/tmp` が提供されていて、画像は `/tmp` 配下で処理する必要がある。
　　参考: https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/runtimes-context.html

* ファイルのダウンロード→lambdaで処理→アップロードではなく、ファイルの読み込み→lambdaで処理→アップロードという流れ。
  結局Lambdaのストレージを使用しているので、もしかしたら読み込みにした意味はそこまでなかったかも？

# 最後に
これによって、スマホで撮影したきゃわわなネコチャン🐈の画像が変な向きで表示される...みたいなこともなくなる（はず）。
ちなみにGoは初めて書きました。難しかったです👶
PHP8.1でarray_is_listが追加されたよ

# はじめに
こんにちは。
熱帯夜で全然寝むれず、寝不足だと暑さがより一層堪えますね...筆者です :sob:

さて、今回はPHP8.1で追加された関数`array_is_list`を紹介しようと思います。

# array_is_listとは
こちら↓

https://wiki.php.net/rfc/is_list

0から始まる連続した整数がkeyになっているかどうかを判定する関数です。

# 使用例

```php
<?php
  array_is_list([]); // true
  array_is_list([1, 2, 3]); // true
  array_is_list(['apple', 2, 3]); // true
  array_is_list(['apple', 'orange']); // true
  array_is_list([0 => 'apple', 'orange']); // true
  array_is_list([0 => 'apple', 1 => 'orange']); // true

  // 0から始まっていない
  array_is_list([1 => 'apple', 0 => 'orange']); // false

  // 整数がkeyではない
  array_is_list([0 => 'apple', 'foo' => 'bar']); // false

  // 連続ではない
  array_is_list([0 => 'apple', 2 => 'bar']); // false
```

# おわりに
LaravelのCollectionにもそのうち追加されそうですね :thinking: 
ただ、この関数あったらよかったなぁってこと今までになかったので、今後使うときが来るかはちょっとわかりません :sweat: 

そそれでは！
CocoaPodsでM1非対応ライブラリをOTHER_LDFLAGSから排除してビルドを通す

みなさん もうM1 Macに乗り換えましたよね？？メモリ足りなくないですか？？？と
Google SignInも無事にM1対応のv6へと更新されたらしく、用済み情報になってきた感もありますので以下、公開しときます。

`EXCLUDED_ARCHS[sdk=iphonesimulator*] `の雑対応で済ませてる人もいるんでしょうが、それじゃsimulator使えなくて不便じゃないです?

## CocoaPodsのPodsfileの後処理で、OTHER_LDFLAGSを書き換えてやることでビルド通す方法。

例ではGoogleSignInを消してますが、まだまだ他にも非対応のフレームワークはあるかと思いますので適当に書き換えてどうぞ。


### Podfile

```ruby
...

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      # exclude specified frameworks
      puts target.name
      if target.name.start_with? 'Pods-'
        xcconfig_path = config.base_configuration_reference.real_path
        xcconfig = File.read(xcconfig_path).split("\n")
        oldf = xcconfig.filter{|x| x.start_with?("OTHER_LDFLAGS")}.first
        if ! oldf.nil?
          xcconfig.delete(oldf)
          xcconfig.append oldf.sub('OTHER_LDFLAGS =', 'OTHER_LDFLAGS[sdk=iphoneos*] =')
          xcconfig.append oldf.sub('OTHER_LDFLAGS =', 'OTHER_LDFLAGS[sdk=iphonesimulator*][arch=x86_64] =')
          xcconfig.append oldf.sub('OTHER_LDFLAGS =', 'OTHER_LDFLAGS[sdk=iphonesimulator*][arch=i386] =')
          new_oldf = oldf
          ['GoogleSignIn'].each { |lib|
            new_oldf.sub!(" -framework \"#{lib}\"", '')
          }
          xcconfig.append new_oldf.sub('OTHER_LDFLAGS =', 'OTHER_LDFLAGS[sdk=iphonesimulator*][arch=arm*] =')
          File.open(xcconfig_path, "w") { |f| f << xcconfig.join("\n") }
        end
      end
    end
  end
end
```

### 解説
xcconfigのOTHER_LDFLAGSをゴリゴリ書き換えてます。
sdk/arch指定で、`iphonesimulator*`かつ`arm*`の場合には特定frameworkを排除したのを、そうでないのは元々のを指定しています。
ビルド対象によっては`appletv*`,`watch*`,`macos*`を適当に足してあげてください。

これで`pod install`してやればリンカのエラーは消えるので、あとはひたすら`#ifdef`で頑張ってください。


`framework名`とpodの`repo名`は必ずしも一致／一対一対応していないので、エラーメッセージみつつ適当にどうぞ。
Amazon Location Service はじめました

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2788/eb77adb1-afa8-eb6a-a64d-bdfb8c9eaaea.gif)

# 目次
1. [Amazon Location Service とは](#1-Amazon Location Service とは)
1. [住所検索](#2-住所検索)
1. [経路検索](#3-経路検索)
1. [逆ジオコーディング](#4-逆ジオコーディング)
1. [地図の日本語化について](#5-地図の日本語化について)
1. [サンプルサイト](#6-サンプルサイト)
1. [おまけ](#7-おまけ)

#1. Amazon Location Service とは

そもそも Amazon Location Service とは何かという話なのですが
AWS（Amazon Web Services）の各機能に統合できる地図および位置情報のサービスです
GCP(Google Cloud Platform)におけるGoogle Maps Platformみたいなイメージですね
詳しくは以下ページをご覧いただければと思います
https://docs.aws.amazon.com/ja_jp/location/latest/developerguide/what-is.html

Googleの方は自身がデータプロバイダーであるのに対し、Amazonの方はEsriとHEREの2社から選択するような形式になっております
後述しますが、現状(2021年7月)では日本向けの地図スタイルは提供されておらず、日本の地図を表示しても、地名などが英語表記になってしまいますので、日本向けでの利用はこれからといった感じです

今回は住所検索、経路検索、逆ジオコーディングの3種類の機能について紹介したいと思います

#2. 住所検索

あるキーワードを検索対象とし、地図の場所を検索結果として取得できる機能です
レスポンスが非常に良く、テキストボックスのオートコンプリート機能と連携させて、リアルタイムな検索が可能です
![スクリーンショット 2021-07-15 11.18.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2788/070d2c87-3c9d-f2a2-8832-5d281bf2621f.png)© MIERUNE | © OpenStreetMap contributors | © 2021 HERE



#3. 経路検索

位置を複数指定すると、その経路情報を取得できる機能です
今回は２点間のみの経路を取得表示させるものを作りましたが、途中経由する位置も追加可能です
経路情報だけではなく、距離や概算所要時間も取得できます
![スクリーンショット 2021-07-15 11.22.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2788/430c5d53-0dc6-b914-5b43-6123b35a2110.png)© MIERUNE | © OpenStreetMap contributors | © 2021 HERE


#4. 逆ジオコーディング

そもそも逆ジオコーディングとはなんぞやという話なのですが、住所から緯度経度を求めることをジオコーディングと言います
その逆なので、緯度経度の情報から住所を求めることを逆ジオコーディングと言います
この機能は日本語で住所の情報を取得できます
![スクリーンショット 2021-07-15 11.29.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2788/ae25ce99-cc7b-ae83-a5bc-d88c4bc28004.png)© MIERUNE | © OpenStreetMap contributors | © 2021 HERE

#5. 地図の日本語化について

現状でAmazon Location Serviceを日本国内向けに使うにあたって、最大の問題といえるのが、地図スタイルの日本語化です
そこで、私の所属している株式会社MIERUNEにおきまして、日本語化された地図スタイルを絶賛開発しております
現状で進捗は20%ほど。。。という状況なのですが、どのくらい変わるのかをお見せしたいと思います
ベースとしているのはHEREの2.5Dのスタイルです
左がオリジナルで、右が開発中のスタイルになります
![スクリーンショット 2021-07-09 15.43.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2788/46b0df1c-47bf-69e3-1072-52b4e9e6e896.png)© MIERUNE | © OpenStreetMap contributors | © 2021 HERE

日本対応の方法につきましては、以下の記事をご覧ください

https://qiita.com/moritoru/items/c6fc303bf9925de0a3a7

#6. サンプルサイト
今回紹介した機能を全て体験できるwebサイトを公開しています

https://als.mierune.io/

（認証にAWSAmplifyを利用しておりますので、サインアップが必要です）

こちらのサンプルサイトは今後も引き続き更新されていく予定です


#7. おまけ
今回のサンプルサイトは社内ハッカソンにて制作されたものです
そんな会社風土に憧れるという方、一緒に働いてみませんか？

https://mierune.co.jp/recruit/

こちらの記事ですが
「AWSの基礎を学ぼう 特別編　最新サービスをみんなで触ってみる はじめての位置情報サービス」

https://awsbasics.connpass.com/event/215185/

このイベントのLTの内容を掲載しております
【Rails】created_at、日本時間する

Ruby on RailsでWebサービスを作っていて、日本時間への設定変更をしたいケースの解決方です。

2021-07-18 10:00 + 0900みたいな表示になってしまう。
年、月、日、時を使って、わかりやすくしていく。

##日本時間に設定する方法

###config/application.rbを開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/958928/c212f41b-297f-e662-6f02-0ab6885bac24.png)
このファイルに、以下のコードを記述


```config/application.rb
config.time_zone = 'Tokyo'
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/958928/dc12c388-a3fc-a839-188d-4993b27af8a8.png)

サーバーを再起動させる

config/initializers/time_formats.rbというファイルを作り以下を記述

```config/initializers/time_formats.rb
Time::DATE_FORMATS[:datetime_jp] = '%Y年 %m月 %d日 %H時 %M分'
```

viewの修正をする

```
<%= xxx.created_at.to_s(:datetime_jp) %>
<%= xxx.updated_at.to_s(:datetime_jp) %>
```

##まとめ
日本時間の表示は、設定としてフォーマットを定義しておくと便利.
【Unity2019.4.9f1】Appファイルを出力する方法

[:contents]

### PlatformをAndroidにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400627/9861a5d3-f00e-3dbb-1018-ba2a94accfc2.png)

### SDKとNDKにチェックを入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400627/52790a23-f356-6fc9-ad34-fa7254065756.png)
（インストールされていない場合は、Unityhubの「モジュールを加える」からインストール）<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400627/347bcc10-915d-2e44-67c3-8d554fd814b9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400627/8914e528-06f2-5df1-a2f9-7f40a955c4ce.png)

### CompanyName、ProductNameを記入する


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400627/42edf33c-467d-016a-a703-52fd3d812f4a.png)

### keyを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400627/b396b5d3-851f-69d9-54b5-de5ac8400c4a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400627/97d854ac-64d8-dc4b-5689-01f9fb950529.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400627/c46552eb-9189-6e9e-47f4-160d3a16e9b1.png)

### Target API Levelを新しいものにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400627/6c7d1f27-1e45-e8b4-a596-999d2bc1a82e.png)

### ScriptingBackEndをIL2CPPにし、ARM64にチェックを入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400627/9140de90-f0e2-fca5-4ef3-41cdf45701ed.png)

### Run Deviceを設定してDevelopmentBuildにチェックを入れてBuild
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400627/bf7f5a4d-581d-0541-9c08-d8033db68030.png)

これで、実機でテストする際のファイルが出力されます。
### Build App Bundleにチェックを入れてBuild
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400627/a544afec-5dad-32d9-88fa-60f01dad435f.png)

こちらでは、実際にGoogleplayストアに出力する際のファイルが出力されます

### 注意 実機で動作を確認するには、お持ちのAndroidの設定を「開発者モード」にする必要があります。
デバイスを開発者モードにする方法はここでは記事にしないので、書いてくださった方のリンクを載せておきます。
[https://qiita.com/knakamigawa/items/5b8bd2793920b517bf25:embed:cite]

### 書籍紹介
[asin:4862464130:detail]
[GAS] オーナー権限移譲時のメール非通知設定について

## いきなり結論
ＧＡＳにて共有ファイルやフォルダのオーナー権限を移譲する際、**メール非通知でのオーナー権限移譲はできません**。[^1]

[^1]: ＧＡＳ前提であれば、新オーナー側から自身のマイドライブへ`makeCopy()`し、旧オーナーが元ファイルを削除すれば、表面的には目的を果たせます。

Driveのクラスメソッドに`setOwner()`というものがありますが、メールの通知・非通知に関するオプション項目が存在しません。Driveの拡張サービス、Drive API 経由で以下のように設定しても同様です。

```Javascript:Sample01.gs
/* GASにおけるDriveの拡張サービスでは、執筆時現在Drive API V2となります */

Drive.Permissions.insert({
    'role': 'owner',
    'type': 'user',
    'value': email // 対象ユーザーのemailアドレス
  },
  id, // ファイルもしくはフォルダのID
  {'sendNotificationEmails': false} // 通知送信設定
);
```

では、非通知にするにはどうすればよいのでしょうか。Drive APIの公式リファレンスには、以下のように明記されています。

>Whether to send notification emails when sharing to users or groups. This parameter is ignored and an email is sent if the role is owner. 
（[公式リファレンス](https://developers.google.com/drive/api/v2/reference/permissions/insert)より）

上記はAPI V2の記述ですが、「設定」はできても無視され、通知されるとあります。V3ではさらに以下のような記述となっています。

>Whether to send a notification email when sharing to users or groups. This defaults to true for users and groups, and is not allowed for other requests. It **must not be disabled** for ownership transfers.
（[公式リファレンス](https://developers.google.com/drive/api/v3/reference/permissions/create)より、太字は筆者編集）

いくつかのサイトで`sendNotificationEmails`を`false`に設定することで、オーナー権限移譲時にもメール非通知にすることが可能という記述を見つけましたが、上記より、誤った情報と言えます。

現状、ＧＡＳによるメール非通知でのオーナー権限移譲は、正攻法ではできないということですね。

### [参考]
+ [Permissions: insert | Google Drive API | Google Developers](https://developers.google.com/drive/api/v2/reference/permissions/insert)
+ [Permissions: create |  Google Drive API | Google Developers](https://developers.google.com/drive/api/v3/reference/permissions/create)
AWSLambdaとAWSBatchを本番環境と開発環境で分ける

AWS BatchのジョブをAWS Lambdaから実行する時に、本番環境とステージング環境を分けたい場合の構成を作ってみました。

# AWSBatch

コンピューティング環境、ジョブキュー、ジョブ定義を環境別に分けます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1706761/3bf4f2a0-2d6f-bbf5-eb1b-1a58a264f345.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1706761/849fb48e-594b-b235-1ae9-18df4edf6c98.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1706761/014b56db-96f8-0806-4b34-c24dd53459b2.png)


# AWSLambda

AWSLambdaで環境別の実行環境を作るためにエイリアスを利用しました。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-aliases.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1706761/49ceb3fe-c147-40e6-b5f5-194e5143dcf1.png)

Lambdaはエイリアス別に環境変数を定義することができません。(2021.07.03現在)
なので、環境別のAWSBatchの定義を自前で用意します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1706761/5d5c1bf2-2090-bf23-b90c-fa5fa01777eb.png)

```config.ini
[dev]
JOB_QUEUE = arn:aws:batch:ap-northeast-1:xxxxxxxxx-dev
JOB_DEFINITION = arn:aws:batch:ap-northeast-1:xxxxxxxxx:job-definition/xxxx-dev:1

[stg]
JOB_QUEUE = arn:aws:batch:ap-northeast-1:xxxxxxxxx-stg
JOB_DEFINITION = arn:aws:batch:ap-northeast-1:xxxxxxxxx:job-definition/xxxx-stg:1

[prd]
JOB_QUEUE = arn:aws:batch:ap-northeast-1:xxxxxxxxx-prd
JOB_DEFINITION = arn:aws:batch:ap-northeast-1:xxxxxxxxx:job-definition/xxxx-prd:1
```

Lambda実行側ではconfig.iniを読み取ってジョブ定義を取得します。
どのエイリアスが使用されているかはcontext引数のinvoked_function_arnからわかります。

※Lambdaの記述例

```lambda_function.py
import re
import configparser
import boto3


def lambda_handler(event, context):
　　　　mo = re.search(
　　　　　　　　r'func_name:(?P<alias>dev|stg|prd)',
　　　　　　　　context.invoked_function_arn
　　　　)

　　　　config = configparser.ConfigParser()
　　　　config.read('config.ini')
　　　　JOB_QUEUE = config[mo.group('alias')]['JOB_QUEUE']
　　　　JOB_DEFINITION = config[mo.group('alias')]['JOB_DEFINITION']
　　　　JOB_NAME = 'xxxxxxxxx'

　　　　client = boto3.client('batch')
　　　　response = client.submit_job(
      jobName = JOB_NAME,
      jobQueue = JOB_QUEUE,
      jobDefinition = JOB_DEFINITION,
　　　　）
　　　　return {
  　　　　'statusCode': 200,
　　　　　　　　'body': json.dumps('run')
　　　　}
```

# さいごに

AWSLambdaのエイリアス別に環境変数を定義できれば、わざわざconfig.iniを追加する必要ないのにと思いました。
もっと簡単な方法で環境別の構成が作っている方がいたら教えて下さい。


# 参考サイト

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-aliases.html

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/python-context.html
laravel-adminのSSL化方法

# Configの設定を変えるだけで可能

```/config/admin.php
'https' => env('ADMIN_HTTPS', false),
```

local環境もhttpsで構わないという場合は第二引数をtrueにする。

本番環境やstg環境だけSSL化したい場合(こちらの方がたぶん多い)、環境変数で```ADMIN_HTTPS``` を定義して```true``` にする。
これだけでSSL化されます。あら、便利。

あくまでもlaravel-adminの設定なので、管理画面の他に公開画面などのviewを作っている場合は別途そちらもSSL化する必要があります。
ミドルウェア用意したり、リダイレクトさせたり。
https://qiita.com/Yorinton/items/50b9c8e3102ac661f08c
Airflowのマクロの日付を加工して使う

# 背景
Airflowのマクロの日付をさらに加工して使いたい。例えば、execution_dateの10日前を指定してpathを作成したい場合など。

# 方法

execution_dateはpendulumオブジェクトなので、 `{{}}` 内でpendulumを加工するpython処理を書く。 

```py
# ~略~

BigQueryToGCSOperator(
    task_id='hoge',
    source_project_dataset_table="dataset.table",
    destination_cloud_storage_uris=[
        # fstringとjinjaの{{}}を組み合わせるとエラーになるので + で分割する
        f"gs://{bucket}/hoge/" + "{{ execution_date.subtract(days=10).format('YYYY/MM')}}/export.csv"
    ],
    export_format='CSV',
)

# ~略~
```

# 参考

#### [Airflow#Macros reference](https://airflow.apache.org/docs/apache-airflow/stable/macros-ref.html#macros-reference)

#### [pendulum](https://pendulum.eustace.io/)
詳細データベース読書メモ -forceとstealとWAL

## 概要

RDBMSのAtomicityとDurabilityを保障するための、ディスクにフラッシュするためのアプローチ。

## stealとno-steal

### steal

コミットされていないデータでもディスクにフラッシュする。フラッシュしたデータは他のトランザクションがロードできる。
stealを採用する場合、ディスクにフラッシュする前にUNDOログが必須。
ロールバックまたはクラッシュした場合はUNDOログからの復元が必要になる。

### no-steal

コミットされていないデータをディスクにフラッシュすることを許容しない。

## forceとno-force

### force

トランザクションがコミットする時に変更したページがディスクにフラッシュが完了していることを強制する。

### no-force

コミット時に変更したページがフラッシュされていなくてもよい。
その代わりコミット時にREDOログを出力を必須とする。
ディスクにフラッシュ前にデータベースがクラッシュした場合、ディスクのデータにREDOログの内容を適用することで復元する。

## Write-Ahead Logging (WAL)

トランザクションリカバリ、クラッシュに対応するための補助的な仕組み。
ページの変更をキャッシュにバッファリングしつつACIDを保障するために必要。
（WALがないと常にディスクの読み書きが必要になる）

Atomicityを保証するため、ディスクからページをロードした時は必ずUNDOログを確認する。
ロードしたデータに対応するUNDOログがある場合は、それは他のトランザクションがコミット前のダーティなデータである。
UNDOログを適用することでコミット済みのデータを取得できる。

Durabilityを保証するため、コミット時に全てのREDOログを出力する。
ロードしたデータに対応するREDOログがある場合、コミットがディスクにフラッシュされていないデータをロードしたことになる。
REDOログを適用することでコミットしたデータになる。


## 組み合わせ

steal/no-force＋WALの組み合わせが一般的。
仕組みは複雑（REDO、UNDOが必要）になるが、もっともパフォーマンスが出る。
ARIESというアルゴリズムが今日のトランザクション処理のベースとなっている。

no-steal/forceの組み合わせはパフォーマンスが低いがREDO、UNDOが不要になる。
（たぶん、理論上・・・）

## 参考

詳細データベースの本以外に以下のスライドが参考になった。

https://dsf.berkeley.edu/jmh/cs186/f02/lecs/lec25_6up.pdf
img pdfが開発画面では表示されるのに、デプロイすると表示されないのが解決した

imgやpdfがlocalhostでは表示されるのに、いざデプロイすると、画像が表示されたりされなかったり、
pdfの場合、破損して見れなかったりする問題が発生していました。

ただ、同じコードを書いてるのに、片方は表示され、片方は表示されないみたいな。
ほんとに解決方法が謎でした。

デプロイする時にbuildをしてますが、問題ないし、なんで？！？！？！という状態。

ついに原因を突き止めました！！！

今までは作った画像ファイルを一回フォルダの中に入れて、vsコードを開いて開発していました
こんな感じ

![スクリーンショット 2021-07-20 17.16.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/898667/25d41f08-ff77-6d51-6565-b6879711e514.png)

なので、開発画面で開発している状態のところに追加する様にしました

![スクリーンショット 2021-07-20 17.13.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/898667/3468d147-a6d8-419b-d457-b70b5658fbd1.png)

なんとこれで全て解決しました。
ぜんぜんカンケーないでしょって思ってたのですが、これが原因でした、

vue jsのquasar cliを使っているので、開発中に画像を入れた時と、フォルダに入れた状態で開発をするときでちょっとバグが出て他のかもしれません。
開発中に画像を入れた方が、適正な処理をしてくれるっぽいです。


かなり困っていたので解決してよかったです。ほんとに。
AWS Fargate ResourceInitializationError: unable to pull secrets or registry auth: pull command failed: : signal: killed が出た時の対応

# エラーの内容

新しくVPCを作成し、ECSからFargateでサービスを立ち上げようとしたら以下のエラーが出た。

```
AWS Fargate ResourceInitializationError: unable to pull secrets or registry auth: pull command failed: : signal: killed
```

## 解決方法

どうやら、VPC側の設定の問題。VPCのルートテーブルに、インターネットゲートウェイを設定する必要があるようだ。
　
EC2→ルートテーブルより、インターネットゲートウェイを紐付けることで解決した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293892/35722f34-6e46-5d9d-7734-0cba3de43a90.png)
一般のベクトル量とモジュールの扱いについて(グラム行列、射影行列など) vol.1

# Introduction
ベクトルとは2つの性質を併せ持つ数学的要素である。

高校では向きと大きさをもつもの、という風に扱うが、上手に用いるためのイメージとしてはそういったもの、矢印でも構わない。

$$\vec{OA}, \bf{a}$$

大学以降は太字で表す。

# ベクトル空間

教科書的には8つの条件を満たす云々が書いてあるものの上述の通り、矢印のイメージで構わない。

矢印で構成される世界、と解釈してもいいだろう。・・・多分

# 基底

これも教科書的には長くなるが、世界を構成する最小の構成要素のこと。

任意の要素は係数体上、基底の線形結合で書くことができる。

基底の数を次元という。
#成分表示
普段の座標$(x, y)$はどういったものが根底にあるかというと、

$$\begin{pmatrix}x\\\y\end{pmatrix}= x\begin{pmatrix}1\\\0\end{pmatrix} + y\begin{pmatrix}0\\\1\end{pmatrix}$$

これが根底にある。

だから通常の座標$(2, 3)$は
$$\begin{pmatrix}2\\\3\end{pmatrix}= 1\begin{pmatrix}2\\\0\end{pmatrix} + 3\begin{pmatrix}0\\\1\end{pmatrix}$$
基底$$\begin{pmatrix}2\\\0\end{pmatrix}, \begin{pmatrix}0\\\1\end{pmatrix}$$における座標だと$(1, 3)$であり、見かけは異なる。

#ベクトルの「掛け算」
$${\boldsymbol a}= \begin{pmatrix} a_1\\\ a_2\\\ \vdots\end{pmatrix}, {\boldsymbol b}= \begin{pmatrix} b_1\\\ b_2\\\ \vdots\end{pmatrix}$$とする。

高校のベクトルは内積、外積が定義出来た。

これは行列を用いれば、内積は次元$2$の場合、$$({\boldsymbol a, \boldsymbol b})= (a_1, a_2) \begin{pmatrix}1&0\\\0&1\end{pmatrix}\begin{pmatrix} b_1\\\ b_2\\\ \end{pmatrix}= a_1b_1 + a_2b_2$$
外積は
$${\boldsymbol a} \times {\boldsymbol b} =({\boldsymbol a},{\boldsymbol b})= (a_1, a_2) \begin{pmatrix}0&1\\\ -1&0\end{pmatrix}\begin{pmatrix} b_1\\\ b_2\\\ \end{pmatrix}= a_1b_2 -a_2b_1$$

すでに使っている記号だが$(,)_M$または$<,>_M$にベクトルを入れて、ベクトルにペアリングという演算を定義し、
行列$M$に対して
$$({\boldsymbol a}, {\boldsymbol b})_M:= ^t{\boldsymbol a}M{\boldsymbol b}$$とする。

※行列$M$は文脈上推測できるときには省略する。

こうしてベクトルに掛け算っぽいものが定義出来た。

※これを応用して2次形式の標準形を考えることができる。

#グラム行列

この$M$をグラム行列と呼ぶ。訳は計量行列・・・？

これを理論数学方面で応用すると束の理論とか格子暗号の方に適応できる。

これはどういうふうに求めたかというと、回転行列について思い出してもらって、さらに単位べクトル$\boldsymbol e_i$(上から$i$番目のみ$1$で他$0$のベクトル)を考えペアリング$(\boldsymbol e_i, \boldsymbol e_j)$を考えればグラム行列の$i$行$j$列の成分が求まる。

#モジュール(加群)

今考えたベクトルは拡張、つまり制限付けを緩めれば、加群と呼ばれるものが定義できる。

詳細は数学の教科書などを見ていただきたいが、
係数"体"を「掛け算では元に戻すことができない数」の集合に置きなおすと、大雑把ではあるが、加群と呼ばれる対象になる。こうしておくとn回足すと0になる、という性質があったとき、ベクトル空間よりも面白い性質が見られる。(この面白い性質なるものの中身は今後も解説しない。)

vol.2に続く。

vol.2用メモ
線形写像、ベクトル
reviewdogによるコードレビューの省力化



些細な指摘に時間を取られないようにreviewdogを導入してみました。
弊社のプランではGitHub Actionsが利用できないためJenkinsでの導入です。

# 導入の背景
ここ数ヶ月でチームの開発スピードが上がり、PRの数が増えてきました。
PRが増えるということはそれだけコードレビューに割く時間も増えることになります。

そうなってくると些細な指摘をするのが面倒になってきます。

```python
def func():
    ...
    if condition:
        return result
    else:
        return None
```

> 「これ、elseいらないけど。でもわざわざ指摘するほどでもないかな、、」

こういうのは事前にlintして潰しておいてほしいと思いつつも、すべてのPRがlinterの指摘を修正しているとは保証できません。
うっかりlintを忘れることもある。

じゃあ単純にCIでlintすればいいかと言うとそれも難しい。
なぜなら修正範囲外の古いコードまで指摘を受けて、どこがPRに関係する指摘なのかわからなくなるから。

そこで[reviewdog](https://github.com/reviewdog/reviewdog)の出番です。
このツールはlinterの指摘を**変更のあった行だけ**に絞ってくれます。
さらににGitHubにコメントしてくれるので指摘を確認しやすいというオマケ付き。

早速設定していきます。

# reviewdogのインストール
今回はdocker上で動くJenkinsへインストールします。

```dockerfile:Dockerfile
WORKDIR /tmp
RUN curl -sfL https://raw.githubusercontent.com/reviewdog/reviewdog/master/install.sh | sh -s \
    && mv /tmp/bin/reviewdog /usr/local/bin \
    && rm -rf /tmp/bin
```

# GitHubのトークン発行
PRにコメントを残してもらうためにPersonal Access Tokenを発行します。
プライベートリポジトリなのでrepoにチェックをつけます。それ以外の権限は不要です。

![Screen Shot 2021-07-20 at 14.42.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477967/7c2de992-0d64-16a6-295d-12a69f7f6d62.png)

# Jenkinsの設定
予め上で発行したトークンを認証情報に追加しておきます。
![Screen Shot 2021-07-20 at 14.51.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477967/0a00490d-898b-e238-afd7-bfe5df8df16d.png)

reviewdogを動かすプロジェクトを作成してリポジトリをクローンします。
![Screen Shot 2021-07-20 at 15.15.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477967/64a56971-9b00-3d03-f2ff-aa8e01e9d6b9.png)


[README](https://github.com/reviewdog/reviewdog#common-jenkins-local-etc)によると４つの環境変数を設定するだけでGitHubにコメントしてくれるようです。
まず先程の認証情報をプロジェクトの設定で`REVIEWDOG_GITHUB_API_TOKEN`という変数に紐付けます。
![Screen Shot 2021-07-20 at 14.58.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477967/84ba894a-5ed3-c9b8-c4cc-9d11c80bbf8e.png)


続いてプロジェクトの実行コマンドで残りの環境変数を設定します。

```sh
export CI_REPO_OWNER=xxx
export CI_REPO_NAME=yyy
export CI_COMMIT=$(git rev-parse HEAD)
```

最後にpylintの結果をreviewdogに食べさせます。

```sh
pip install pylint
pylint src/ | reviewdog -efm="%f:%l:%c: %m" -reporter=github-pr-review -diff="git diff origin/release"
```

あとはPRに反応してJenkinsプロジェクトを実行する設定ですが、これは省略。
[GitHub Pull Request Builder](https://plugins.jenkins.io/ghprb/)や[Generic Webhook Trigger](https://plugins.jenkins.io/generic-webhook-trigger/)を使って実現できます。
ここは一旦手動で動かします。

# 動かしてみる
冒頭の不要なelseを含むPRを出してみると、

![Screen Shot 2021-07-20 at 16.17.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477967/30bc690e-5c96-61fe-2c9d-eb09d9f59732.png)

できたー🎉

# まとめ
Jenkinsでreviewdogを導入しているケースが少ないので調べるのに時間がかかりましたが、設定自体は簡単でした。

実は執筆時点で数ヶ月運用しているのですが、開発者以上にレビューしてくれることもあり助かっています。

![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477967/4db73ae1-9eb6-5f6b-6f6e-cba0f78059d4.png)

現在はpylintのみ実行していますが、任意のlinterで使用可能なので今後mypyなどにも活用できたらと考えています。
pythonに関する自分用メモ

○画面サイズを取得するには，pipでインストールが必要。
anaconda promptで

```
pip install screeninfo
```



○pyinstallerでアイコンを変更する方法
 --icon==***.ico を加えることで、アイコンを設定。 
exe化する .py と同一ディレクトリに ***.ico ファイルを置いておくと簡単。


○画像をフォルダから選択して表示

```
import tkinter.filedialog as fd
import cv2

global file_path,img1,winName
file_path = fd.askopenfilename(
    title = "画像を選択"
)

img1 = cv2.imread(file_path)
winName = 'image'
cv2.imshow(winName, img1)
cv2.waitKey(0)　　←即時終了防止
cv2.destroyAllWindows()
```


○画像オープンエラー
ファイル名が日本語だと、エラーになることがある。
kintoneの一覧画面をダッシュボード的にしてしまう

# はじめに
[Cybozu User Festival](https://page.cybozu.co.jp/-/userfes) の[エバ枠](https://page.cybozu.co.jp/-/userfes/activities/10498)で登壇させていただきまして、グラフについての説明をさせていただきました。

その中で、もうちょっと詳しく説明欲しいってことだったので、まずはえいやッと書きますね。
(余力があれば、ちゃんと書きます…。)


# 完成イメージ
こんな感じのが作れます！
![dashboard.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319512/b42328d1-89a8-8699-8ebf-05e2d71eec40.gif)



# 作成手順
* 今回はアプリストアにある「案件管理」を使いました
* サンプルデータを含めてアプリを作成すれば、速攻で作れます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319512/b6134808-8d3e-e589-c459-f816e477def4.png)



## グラフのiframeタグをコピーする
* 「確度別案件比率」「製品別売上見込み」「製品ごとの活動量推移」のグラフをそれぞれ開いて、「埋め込み用タグ」内の**iframe**タグをコピーする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319512/e977a565-19f9-2e9d-27a5-72d8837e9956.png)
![iframe.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319512/d874df6d-c7c1-fa9e-71a0-9b0469c52381.gif)



## ダッシュボード用の一覧を作成する
* レコード一覧の表示形式：カスタマイズ にする
* HTML 部分に先ほどコピーした**iframe**を貼り付ける
    * 元々は**「width="800" height="600"」**だったのを**「width="400" height="400"」**くらいにすると、ダッシュボード的に配置した時に割といい感じになります。
    * 複数の**iframe**はそのまま続けて貼り付けるだけでOK
    * こうすることで、画面サイズを変えた時に、それなりに適当に配置されます
    * 固定したかったら、CSSなどを使っていい感じに調整してくださいね

![dashboard_config.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319512/6fda6cbe-1968-510b-dd8c-747c5bce5a9b.png)

## アプリを更新して、当該の一覧を表示すれば立派な(言いすぎ)ダッシュボードの完成！
* 一覧画面にグラフを複数配置して、まるで**BIツール**みたいなことできます！(おおげさ)
* kintoneのグラフの機能をそのまんま使えます！
    * 凡例をクリックすると**表示内容が変化**する
    * グラフの要素をクリックするとそのグラフを構成している**一覧を表示**する
    * グラフや判例をマウスオーバーするとグラフ自体が**強調**される

 
![dashboard.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319512/b42328d1-89a8-8699-8ebf-05e2d71eec40.gif)


# さいごに
簡単だけど、ビジュアル的に動きのあるものは、分かりやすいしインパクト大です！
クリックするとヌルヌル動くのも面白いしね！

グラフを重ねたい(折れ線グラフ＆棒グラフ等)という要望も多いかと思いますが、一気に見れることで「それでええやん！」ってなることも多いハズ！

ちなみに、これを作るにあたっては、いわゆるjavascriptカスタマイズはしておらず、**kintoneの標準機能だけで実現**できます！
ぜひチャレンジしてみてくださいね！
SQL 行数指定

# MySQL
LIMIT句
取得行数の上限を設定

```
SELECT column_name FROM table_name LIMIT number
```
# SQL Server
TOP句
先頭から指定した行数を取得

```
SELECT TOP (number) column_name FROM table_name;
```

# Oracle
ROWNUM句
number1からnumber2行目を取得

```
SELECT column_name
FROM table_name
WHERE ROWNUM BETWEEN number1 AND number2;
```
Eigenの初期化方法について

#モチベーション

C++の行列計算ライブラリであるEigenの初期化方法の設計に慣れなかったので記録しておく。

公式ドキュメント

https://eigen.tuxfamily.org/dox/

以下を<Eigen/Core>をインクルードしていることを前提にする。


```cpp
#include <Eigen/Core>
#include <iostream>
```

#Fixed Matrix

```cpp
Matix<スカラーの型,行数、列数> m;
```

というように指定することで、行列`m`を初期化できる。例えば、

```cpp
Eigen::Matix<double,2、2> m;
```

このとき、係数はstd::vector<T>などと違って空になる。

# Dynamic Matrix

コンパイルタイムに要素数が定まらない場合、行・列またはその両方のサイズに`Dynamic`を指定する必要がある。

```cpp
Eigen::Matrix<double,3,Eigen::Dynamic> m1;
Eigen::Matrix<double,Eigen::Dynamic,3> m2;
Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> m3;	
```

初期化しただけでは係数のメモリはアロケートされない。Dynamic Matrixでのみ、サイズを指定しての初期化も可能である。

```cpp
// 10 * 10 行列
Eigen::Matrix<int,Eigen::Dynamic,Eigen::Dynamic> dynamic1(10,10)
```

コンパイル時に大きさが定まらない場合や行列サイズが大きい場合にも使える。

```cpp
int x,y;
// 色々計算する
Eigen::Matrix<int,Eigen::Dynamic,4> dynamic2(x*y,4)
Eigen::Matrix<int,Eigen::Dynamic,4> dynamic3(1000,1000)
```

# エイリアス

Matrixには型エイリアスがある。例えば

```cpp
typedef Matrix<int, 5, 1> Vector5i;
typedef Matrix<float, 3, 3> Matrix3f;
typedef Matrix<double, Dynamic, Dynamic> MatrixXd;
```

2などの定数か、大きさが動的に定まる場合はXとスカラーの型(dは`double`,fは`float`,iは`int`)を指定する。dはdimensionの略ではないので注意。

```cpp
MatrixXd dynamic4(10,10);
VectorXd dynamic5(10);
```

型エイリアスでも大きさを指定して初期化ができる。

# 係数の初期化

Fixed Matrixならば初期化のとき、サイズ指定の代わりに係数を含められる。

```cpp
Eigen::Vector3i v(1, 2, 3);
std::cout<<v<<std::endl;
/*
  1
  2 
  3
*/
```

もしくは、配列のように添え字で代入することができる。

```cpp
Eigen::Matrix2d m(2,2);
m(0,0)=1;
m(0,1)=2;
m(1,0)=3;
m(1,1)=4;
std::cout<<m<<std::endl;
/*
  1 2
  3 4
*/
```
ここで、［］ではなく()なことに注意する。C++の[]は一つしか引数を取れないので()にする必要がある。また、この初期化方法を使う場合は宣言時にサイズが指定されていて、メモリがアロケートされている必要がある。

ストリームのように`<<`と`,`を使って初期化することもできる。

```cpp
Matrix3f m;
m << 1, 2, 3,
     4, 5, 6,
     7, 8, 9;
std::cout<<m<<std::endl;
/*
  1 2 3
  4 5 6
  7 8 9
*/
```

# まとめ

定義〜初期化は直感的に行えるようになっているが、他では見かけない記法を使うので理解が難しかった。これを乗り越えれば後は簡単に使えそう。終
超初心者がPythonで5分足チャートからPyti使ってMACDを計算してグラフに表示してみた

MACDの計算と表示は以下でもやっている。

https://qiita.com/emilia/items/691f1822044087c1ab6d

これをpytiというライブラリを使ってやってみる。

## コード

``` py
import pandas as pd
import datetime
import mplfinance as mpf
from pyti.moving_average_convergence_divergence import moving_average_convergence_divergence as macd_func

df = pd.read_csv('./temp_historical_data/USDJPY.csv', nrows=500)
df.columns = ['Date', 'Open', 'High', 'Low', 'Close', 'Volume']
df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)

# 5分足再計算
df5 = pd.DataFrame()
rule = '5T'
df5['Open'] = df['Open'].resample(rule).first()
df5['Close'] = df['Close'].resample(rule).last()
df5['High'] = df['High'].resample(rule).max()
df5['Low'] = df['Low'].resample(rule).min()

# MACD計算（本題）
macd = pd.DataFrame()
macd['Close'] = df5['Close']
data = macd['Close'].values.tolist()
macd['MACD'] = macd_func(data, 12, 26)
macd['Signal'] = macd['MACD'].ewm(span=9).mean()

macdplot = mpf.make_addplot(macd[['MACD', 'Signal']])

mpf.plot(df5, type='candle', addplot=[macdplot],
        datetime_format='%Y/%m/%d %H:%M', xrotation=90, style='yahoo', savefig=dict(fname='./figures/draw_macd.png',dpi=100))

```

## 所感

残念ながらシグナルは計算してくれないのでそちらは従来通りの計算方法。pandasだけで使って計算するより２行くらい短くなった（白目）
文全体を中央寄せして、文字を左寄せ


```index.html


	<div class="wrapper">
		<ul>
			<li>コンテンツ１</li>
			<li>コンテンツ２</li>
			<li>コンテンツ３</li>
		</ul>
	</div>

```


```stylesheet.css

.wrapper {
    display: flex;
    justify-content: center;
}

.wrapper .ul{
    text-align: left;
}

```
python exe化

こちらを参考に
https://techacademy.jp/magazine/18963

anaconda prompt を起動し
>pip install pyinstaller
を実行する。

最後に警告がでる
WARNING: You are using pip version 21.1.2; however, version 21.1.3 is available.
You should consider upgrading via the 'C:\Users\rie-s\anaconda3\python.exe -m pip install --upgrade pip' command.

とあるので，書いてある通り

>C:\Users\rie-s\anaconda3\python.exe -m pip install --upgrade pip

のコマンドを入力すると，なんかめっちゃエラーでる
ERROR: Exception:
Traceback (most recent call last):
  File "C:\Users\rie-s\AppData\Roaming\Python\Python38\site-packages\pip\_internal\cli\base_command.py", line 180, in _main
    status = self.run(options, args)

pipのアップデートしてみる

>pip install -U pip

同じエラーがでる。

spyder を終了してやってみる。→変わらずエラー

警告だったので，とりあえずexe化を試してみる。

pyinstaller MeasureJudge.py

結構時間かかる。５分くらい？
buildとdistというフォルダが作成される。
dist\MeasureJudge.exe　ファイルが作成されている。

pyinstaller MeasureJudge.py --onefile
オプション--onefileで単体EXEを作成

いらないライブラリは--exclude-module panda　で除ける。
pyinstaller --onefile --exclude-module numpy --exclude-module pandas example.py

コンソール非表示
--noconsole
超初心者がPythonで5分足チャートからボリンジャーバンドを計算してグラフに表示してみた

pyti（パイタイ）というライブラリを利用するのでpipでインストールしておく。

## 参考

https://qiita.com/katafuchix/items/84ea97b0dc3b34847a05

下のコードとほぼ一緒です。

https://qiita.com/emilia/items/691f1822044087c1ab6d

## コード

```

import pandas as pd
import datetime
import mplfinance as mpf
from pyti.bollinger_bands import upper_bollinger_band as bb_up
from pyti.bollinger_bands import middle_bollinger_band as bb_mid
from pyti.bollinger_bands import lower_bollinger_band as bb_low

df = pd.read_csv('./temp_historical_data/USDJPY.csv', nrows=500)
df.columns = ['Date', 'Open', 'High', 'Low', 'Close', 'Volume']
df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)

# 5分足に変換
df5 = pd.DataFrame()
rule = '5T'
df5['Open'] = df['Open'].resample(rule).first()
df5['Close'] = df['Close'].resample(rule).last()
df5['High'] = df['High'].resample(rule).max()
df5['Low'] = df['Low'].resample(rule).min()

# ボリンジャーバンド計算
bb = pd.DataFrame()
data = df5['Close'].values.tolist()
period = 20
bb['Close'] = df5['Close']
bb['Up'] = bb_up(data, period)
bb['Mid'] = bb_mid(data, period)
bb['Low'] = bb_low(data, period)

bbplot = mpf.make_addplot(bb[['Close', 'Up', 'Mid', 'Low']])

mpf.plot(df5, type='candle', addplot=[bbplot],
        datetime_format='%Y/%m/%d %H:%M', xrotation=90, style='yahoo', savefig=dict(fname='./figures/draw_bb.png',dpi=100))

```

## 出来上がったグラフ

![draw_bb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69727/05d449d2-b9bc-1b5b-ccc1-086e6d7eda7b.png)

## 説明

ptytiで簡単。pytiはMACDの計算もできる。以下の通り。

```

from pyti.moving_average_convergence_divergence import moving_average_convergence_divergence as macd_func

macd = pd.DataFrame()
macd['Close'] = df5['Close']
data = macd['Close'].values.tolist()
macd['MACD'] = macd_func(data, 12, 26)
macd['Signal'] = macd['MACD'].ewm(span=9).mean()

macdplot = mpf.make_addplot(macd[['MACD', 'Signal']])

```
CPythonのmain関数

こんにちは。今回は最も普及しているPythonの処理系CPythonのソースを読んでいるとmain関数を見つけたので、少しだけそのことを書こうと思います。

# main関数とは

C言語を書いたことがある人ならば誰でも知っているであろうmain関数。
これはプログラムで始めに実行される関数です。(厳密には違うらしい？)
コマンドの引数などはここで受け取ります。
CPythonはC言語で書かれているのでmain関数があるのは当然なんですが、あれほど大きいプロジェクトでも基礎通りなんだな～と感心したのでこの記事を書こうと思いました。
## main関数の実装

[CPython](https://github.com/python/cpython)のレポジトリのPrograms/python.cにあります。

```c:Programs/python.c
/* Minimal main program -- everything is loaded from the library */

#include "Python.h"

#ifdef MS_WINDOWS
int
wmain(int argc, wchar_t **argv)
{
    return Py_Main(argc, argv);
}
#else
int
main(int argc, char **argv)
{
    return Py_BytesMain(argc, argv);
}
#endif
```

`#ifdef MS_WINDOWS`があるので、Windowsはwmain関数でそれ以外は普通にmain関数が呼ばれるみたいです。
wmainとはワイド文字のコマンドライン引数に対応したmainらしいです。
どうしてこのような実装にしたのかはわからないです...
wmainとmainはそれぞれPy_Main, Py_BytesMain関数を呼び出しているのですが、その内部では両方がコマンドライン引数の情報を_PyArgv構造体に入れてpymain_main関数を実行していました。興味がある方は処理を追ってみてください。



# 参考

https://github.com/python/cpython/blob/main/Programs/python.c

https://docs.microsoft.com/ja-jp/cpp/c-language/using-wmain?view=msvc-160
cx_Freezeを使ってEXE化

１．anaconda promptでcx_Freezeをインストール

```
pip install cx_Freeze --upgrade
```
https://tomomai.com/python_cx_freeze/
を参考。


２．setup.pyファイルを作る。アイコンをつけたい場合は，icoファイルを作成する。
　　以下，setup.pyファイル。

```
# coding: utf-8
# cx_Freeze 用セットアップファイル
 
import sys
from cx_Freeze import setup, Executable
 
base = None

# GUI=有効, CUI=無効 にする
if sys.platform == 'win32' : base = 'Win32GUI'
 
# exe にしたい python ファイルを指定
exe = Executable(script = 'MeasureJudge.py',
                 base = base, icon='kabutomusi.ico')
 
# セットアップ
setup(name = 'Image_Judge',
      version = '0.1',
      description = 'Image_Judge',
      executables = [exe])

```


３．setup.py と exe化したい Pythonファイル（MeasureJudge.py）を所定の同じフォルダに入れる。アイコンをつけたい場合は，同じフォルダに入れる。


４．anaconda promptでsetup.pyがあるフォルダまで移動して
（移動は，cd コマンドを使う。場所確認は dir コマンド。）

```
python setup.py build
```

を実行する。新しくフォルダが作成され，exeファイルとlibフォルダが作成されている。