OmniAICreator/Qiita-1.07M huggingface dataset:
GoogleAppsScriptでサーバー要らずのSlackBotを作る(後編)

#はじめに
「[GoogleAppScriptでサーバー要らずのSlackBotを作る(前編)](https://qiita.com/dotcat/items/3214ec8244a043bf7cb0)」からの続きになります。
後編では、前編で作成したbotに天気予報を通知する機能を追加していきます

#天気予報API
無料で使え、ユーザー登録などの手間がかからないということで
[Livedoor Weather Web Service](http://weather.livedoor.com/weather_hacks/webservice) を使うことにしました

`http://weather.livedoor.com/forecast/webservice/json/v1?city=`+`地域のID`
でアクセスできます。地域IDはAPI公式サイトから見ることができるので探してみてください

#GASを書いていく

```WeatherNotification.gs
//初期化
var weatgerResponse = UrlFetchApp.fetch("http://weather.livedoor.com/forecast/webservice/json/v1?city=130010");
var weatherJson = JSON.parse(weatgerResponse.getContentText());

//今日の天気
function TodayWeatherMessage()
{
  var message;
  message = ":sunny: 今日の天気は *"+weatherJson["forecasts"][0]["telop"]+"* にゃ\n";
  message += weatherJson["forecasts"][0]["image"]["url"]+"\n";
  if(zeroIfNull(weatherJson["forecasts"][0]["temperature"]["max"]))message += "最高気温："+weatherJson["forecasts"][0]["temperature"]["max"]["celsius"]+"℃\n";
  if(zeroIfNull(weatherJson["forecasts"][0]["temperature"]["min"]))message += "最低気温："+weatherJson["forecasts"][0]["temperature"]["min"]["celsius"]+"℃\n";
  message +="```\n";
  message +=weatherJson["description"]["text"]+"\n";
  message +="```\n";
  
  PostMessage("general",message);
}

//明日の天気
function YesterdayWeatherMessage()
{
  var message;
  message = ":sunny: 明日の天気は *"+weatherJson["forecasts"][1]["telop"]+"* にゃ\n";
  message += weatherJson["forecasts"][1]["image"]["url"]+"\n";
  if(zeroIfNull(weatherJson["forecasts"][1]["temperature"]["max"]))message += "最高気温："+weatherJson["forecasts"][1]["temperature"]["max"]["celsius"]+"℃\n";
  if(zeroIfNull(weatherJson["forecasts"][1]["temperature"]["min"]))message += "最低気温："+weatherJson["forecasts"][1]["temperature"]["min"]["celsius"]+"℃\n";
  
  PostMessage("general",message);
}

//nullチェックをする関数
function zeroIfNull(a) {
  return a === '' ? 0 : a;
}
```

例として東京の天気を取得しています。
今日の天気と天気アイコン、最低/最高気温、天気概況文を表示するようにしました。
次の日の天気は明日の天気と天気アイコン、最低/最高気温を表示します

#仕上げ
<img width="428" alt="スクリーンショット 2019-04-25 午後1.22.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212160/e96f367a-59de-f007-7993-5df32f1202a1.png">
トリガーを設定してお好みの時間にメッセージを送信するようにします。
画像の丸印のボタンを押して、TodayWeatherMessageとYesterdayWeatherMessageのトリガーを追加します。

参考までに、うちのbot子は今日の天気は**5:30**、明日の天気は**19:30**に設定しています。


#出来た！
<img width="890" alt="スクリーンショット 2019-04-25 午後1.34.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212160/d55e3699-33ed-2d1f-9ec6-9c8b51005af6.png">
GoogleAppsScriptでサーバー要らずのSlackBotを作る(前編)

#はじめに
https://tech.camph.net/slack-bot-with-gas/
を参考に（というよりほぼなぞってるだけですが）天気を通知するbotを作ります

#用意するもの
- googleアカウント
- Slackのアカウント

以上！

#Slackのトークンを取得する
https://api.slack.com/
まずは右上の**GoSlack**をクリックしてログインします
https://api.slack.com/custom-integrations/legacy-tokens
出来たら↑のリンク先に飛び、**Create token**をクリックして、
好きなワークスペースのトークンを取得します

# Google Apps Scriptのプロジェクトを作る
<img width="656" alt="スクリーンショット 2019-04-25 午後0.48.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212160/d870b5de-b43f-668f-a9aa-8ad38bdfdde9.png">

GoogleDriveにアクセスして **新規**→**Google Apps Script**

次にこちらのライブラリを導入します
[Slack BotをGASでいい感じで書くためのライブラリを作った](https://qiita.com/soundTricker/items/43267609a870fc9c7453#bot%E3%81%A8%E3%81%97%E3%81%A6%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B)
メニューの**リソース**→**ライブラリ**
**ライブラリの追加**に「**M3W5Ut3Q39AaIwLquryEPMwV62A3znfOO**」を入力
バージョンを選択します（今回は1番新しいものを使用しました）

# botから投稿してみる

```SlackPostMessage.gs
//初期設定
var token = PropertiesService.getScriptProperties().getProperty('ここにトークンを入力');
var slackApp = SlackApp.create(token);
var bot_name = "ボットの名前";
var bot_icon = "http://ボットのアイコンにしたい画像のURL.jpg";

//slackにポストする関数
function MessageSender(Channel,Message){
  slackApp.postMessage(Channel, Message, {
    username: bot_name,
    icon_url: bot_icon});
}

//テストメッセージ
function TestMessage() {
  MessageSender("@ユーザー名","<!channel> 今日は *可燃ごみ* の回収日ですにゃ");
}
```

保存したらメニュー下の**関数を選択**→**TestMessage**を選択した後
実行ボタンを押してみましょう

<img width="377" alt="スクリーンショット 2017-12-14 18.28.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/212160/cbea91e1-f8c9-7104-2148-62d5eb71b7a0.png">

出来た！

#まとめ
ボットからメッセージを送信することが出来ました。
トリガー（メニュー下の時計みたいなマーク）で回収日の早朝に設定すれば、これだけでもゴミの日通知ボットとして機能します。
サーバー上で動いているのでPCを閉じてもしっかり通知してくれます。

[後編](https://qiita.com/dotcat/items/6a46926019dde8a7630c)ではいよいよ天気予報のAPIを取得してみます
Node.js v12をyumでインストールしてみた。(CentOS 7)

# Node.js v12がリリース
node.js v12 (LTS予定）がリリースされました。
v8エンジンがアップグレードされたり、TLS1.3がサポートされたりと、色々変わっているようです。
詳しくは、リリースノート（英語）をみましょう。
https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V12.md#12.0.0

# Node.js v12 をインストール
取り敢えず、リポジトリを追加。

```
# yum install https://rpm.nodesource.com/pub_12.x/el/7/x86_64/nodesource-release-el7-1.noarch.rpm
```

念のため、yum でnodejsのどのバージョンが対象になっているか確認。

```
# yum info nodejs

Installed Packages
Name        : nodejs
Arch        : x86_64
Epoch       : 2
Version     : 12.18.0　<-ココが重要
Release     : 1nodesource
Size        : 58 M
Repo        : installed
From repo   : nodesource
Summary     : JavaScript runtime
URL         : http://nodejs.org
License     : MIT and ASL 2.0 and ISC and BSD
Description : Node.js is a platform built on Chrome's JavaScript runtime
            : for easily building fast, scalable network applications.
            : Node.js uses an event-driven, non-blocking I/O model that
            : makes it lightweight and efficient, perfect for data-intensive
            : real-time applications that run across distributed devices.
```

問題なさそうなので、インストールする。

```
# yum -y install nodejs
```

最後に、バージョンを確認しておしまい。

```
# node --version
v12.0.0
```

enjoy！
RiderでXamarin.Macがビルドできない時に確認する事

# 前提
Visual Studio for Macで作成したソリューションをRiderで動かす事が前提です。
RiderでXamarin.Macのプロジェクトを新規作成しても、いろいろ足りないようでエラーが出ます。これに関してはまだ未解決です。
![スクリーンショット 2019-04-25 9.36.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212587/1ea90559-7d2f-5c0a-c0e3-60bd53dfc64b.png)

# 症状
- Xamarin.Macを使うソリューションを開くとRiderがハングアップする。下の画面の状態で止まる。
![スクリーンショット 2019-04-25 9.41.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212587/b265ecc4-9dee-a8a3-d35c-bce4845a728c.png)

- Run/Debug設定を開いて項目を追加しようとしても、Xamarin.Macのアイコンをクリックしたらハングアップする。

# 結論
プロキシ環境下の人はプロキシ設定をRiderに入力しましょう。これで実行ができるようになります。

# 環境
## JetBrains Rider 2018.3.4
JRE: 1.8.0_152-release-1343-b28 x86_64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
macOS 10.14.4

## Xamarin.Mac
Version: 5.8.0.0 (Visual Studio Professional)
Hash: 0aa84521
Branch: d16-0
Build date: 2019-04-02 16:01:19-0400

Rider+Xamarin.Macという非常にコアな環境で問題が発生したため、解決するのに非常に時間がかかりました。
情報も少ないし探してもiOSばっかりだし・・・
ランタイムが足りないとかRiderのバグとかフレームワークのバージョンとか色々疑ったのですが、まさかプロキシとは思いませんでした。

この情報が、同じく非常にコアな環境でやっている方の助けになれば幸いです。
Unity 2019.1.0f2で作ったゲームをAndroidでビルド時の注意点

今回はこの「Unity で Android アプリをビルドするには」[https://framesynthesis.jp/tech/unity/android/](https://framesynthesis.jp/tech/unity/android/)に沿って設定をしていきました。

使ったAndroid Studioは**Version 3.4**で、Androidは**Version 9**です。
(もしかしたら、上記のリンクでも書いてあるように2019年以降のVersionではUnity内で
JDK,SDKがインストールできるのでAndroid Studioのダウンロードもいらないかも…)

ただ今回はAndroid Studioをダウンロードしていたので使ってみました。

そしてUnityでEdit->Preferencesを開たときに次に注意する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405108/81dfb38b-f9d1-6b2c-7178-b3e56fdbe15a.png)


あとは上記のリンクに従ってビルドすると上手くいきました。
自分用GitHub関係でよく使うコマンド整理

<p>初めてQiitaで記事を書いてみます。自分がよく忘れるGitHubのコマンドを整理しておきます。</p>

<h4>新しいリポジトリをremoteに反映させる</h4>
GitHubで新規リポジトリを作成して、書いてあることをよく読もう。ちゃんと読もう。

```terminal
$ cd [ 追加したいディレクトリ ]
$ git init
```
このあとは手元のコードをremoteにプッシュする方法と一緒。

<h4>手元のコードをremoteにプッシュする</h4>
あとでgit.ignoreの書き方もまとめたい。

```terminal
$ git add .  // 変更済みのコードをremoteに追加する
$ git commit -m "message"
$ git push origin master
```

<h4>remoteを手元にコピーする</h4>
どのディレクトリにコピーしてくるのか気をつけよう。

```terminal
$ git clone [ url ]
```
2回目以降は、

```terminal
$ git pull origin master 
```
追記: 学内環境にリモートをクローンしたディレクトリで、変更内容をcommitしてないことに気づかず、pullしたらちゃんと変更が引っ張ってこれてなかった。今後はしかと気をつけよう。
swiftで継承関係を無視したクラス比較の方法

## 概要
swiftで継承関係を無視してclassの比較を行う為には、

```swift
type(of: 対象クラス) == 比較クラス.self
```
で比較を行う事ができる。

```swift
対象クラス is 比較クラス
```
だと継承しているかのチェックになるので注意。

## 補足
遥か昔、swift2.2までは

```swift
対象クラス.dynamicType == 比較クラス.self
```
で行なっていた内容です。
WordPress メディアファイル一括登録

[WP-CLI](https://wp-cli.org/ja/) で提供されていても良いと思いますが、（多分）ないのでスクリプトを用意しました。

```php
<?php
require_once __DIR__ . '/../../../wp-load.php';
require_once __DIR__ . '/../../../wp-admin/includes/media.php';
require_once __DIR__ . '/../../../wp-admin/includes/image.php';
require_once __DIR__ . '/../../../wp-admin/includes/file.php';

$source_directory      = $argv[1];
$destination_directory = $argv[2];

foreach (glob($source_directory . '*') as $file_name) {
    if ( ! is_file($file_name)) {
        continue;
    }

    $destination_file_name = $destination_directory . basename($file_name);
    rename($file_name, $destination_file_name);

    $file_type_map = wp_check_filetype(basename($destination_file_name), null);
    $attachment    = [
        'guid'           => $destination_file_name,
        'post_mime_type' => $file_type_map['type'],
        'post_title'     => preg_replace('/\.[^.]+$/', '', basename($destination_file_name)),
        'post_content'   => '',
        'post_status'    => 'inherit'
    ];
    $attachment_id = wp_insert_attachment($attachment, $destination_file_name, 0);
    wp_update_attachment_metadata($attachment_id, wp_generate_attachment_metadata($attachment_id, $destination_file_name));

    printf("%d : %s\n", $attachment_id, $destination_file_name);
}
```
Macで OKI COREFIDO c811dn で両面印刷をする方法

## 解決したい問題

Macで OKI COREFIDO c811dnで印刷しようとするとシステムのプリントダイアログの「レイアウト（Layout）」タブでは「両面印刷（英語表示だとTwo-sided）」の部分が選択できず、両面印刷ができない。

<img width="652" alt="Screen Shot 2019-04-25 at 12.48.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18504/0f50bc5b-6322-a8d5-1514-fb038a91bfc4.png">

## 前提

- OKI c811dn 用のドライバーはインストールしてある

## 解決策

「レイアウト（Layout）」をクリックしてプルダウンメニューを表示し、「基本設定 (Set up)」に切り替える。

<img width="709" alt="Screen_Shot_2019-04-25_at_12_50_28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18504/6e3126b8-28fb-f79c-5fde-5b84912e263f.png">


そして、「両面印刷(Duplex)」のプルダウンメニューから、「長端綴じ (Long-Edge Binding)」か「短端綴じ (Short-Edge Binding)」

<img width="598" alt="Screen_Shot_2019-04-25_at_12_54_36__2_.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18504/689da559-fca8-24fd-52e1-eb474694ea3c.png">


## 今回の方法がうまくいくことを確認した環境

- macOS Mojave (10.14.4)
- macOS High Sierra (10.13.6)
Djangoの開発サーバーをプロダクション環境で使わないように、という話

# TL;DR

* Djangoの開発サーバーはあくまで開発用、プロダクション環境では使わないこと
* プロダクション環境では、GunicornやuWSGIなどのWSGIサーバーを使うこと

# Djangoの開発サーバー

Djangoには、`runserver`で起動できるWebサーバーが付属しています。

[開発用サーバー](https://docs.djangoproject.com/ja/2.2/intro/tutorial01/#the-development-server)

この開発サーバーはPythonで書かれており、またアプリケーションを変更しても（ある程度）リロードしてくれる、開発中に便利なツールになっています。


# 開発サーバーをプロダクション環境では使わないこと

この開発サーバーをプロダクション環境で利用することは、推奨されていません。というか、禁止されています。絶対に使うな、という感じです。

> ここでちょっと注意しておきましょう。このサーバは開発中の利用だけを考えて作られています。絶対に運用環境では 使わないでください (筆者たちの専門は Web フレームワークであって、Web サーバではありません)。

> Now’s a good time to note: don’t use this server in anything resembling a production environment. It’s intended only for use while developing. (We’re in the business of making Web frameworks, not Web servers.)

[The development server](https://docs.djangoproject.com/en/2.2/intro/tutorial01/#the-development-server)

なのですが、この開発サーバーをプロダクション環境で使ってはいけないの？他のサーバーとなにが違うんですか？という質問はややあるようです。

[Why should I use nginx server or apache on production vps but not just manage.py runserver?](https://www.reddit.com/r/django/comments/6j7b6p/why_should_i_use_nginx_server_or_apache_on/)

[Django: Difference between using server through manage.py and other servers like gunicorn etc. Which is better?](https://stackoverflow.com/questions/35657332/django-difference-between-using-server-through-manage-py-and-other-servers-like)

[Is it OK to use "python manage.py runserver" in production?](https://github.com/django/channels/issues/142)

別にミドルウェアなどを用意する手間が嫌だ、みたいな話なんでしょうかね。

でも、パフォーマンス出ませんよ、と。


# WSGIサーバーを使おう

では、開発サーバーを使わない場合はどうするの？という話ですが、GunicornやuWSGIなどのWSGIサーバーを使い、こちらにアプリケーションをデプロイします。

[Gunicorn](https://gunicorn.org/)

[uWSGI](https://uwsgi-docs.readthedocs.io/en/latest/)

さらに言うと、これらのWSGIサーバーの前段にリバースプロキシとしてnginxなどのWebサーバーを配置することが推奨されています。


# 自身で困ったこと

で、なんでこういう記事を書いたかというと、身の回りに割とCPUを使うアプリケーションがDjangoで書かれていて、複数リクエストを全然さばけない状態のものがあったのですが、これがこそっとDjangonの開発サーバーで動いていました。

CPUバウンドな処理なので複数CPUを使ってくれないと困るのですが、これをやるにはGunicornやuWSGIを使って複数プロセスでアプリケーションを動作させる必要があります。
※PythonはGILの制約があるので、ひとつのプロセス中で同時に動かせるスレッドはひとつだけです

これをなんとかするために、この環境ではuWSGIでアプリケーションを動かすことにしました。

もちろん、サーバーを変更して動作するかという確認は必要になるのですが…。

結果、無事に複数CPUを使ってある程度リクエストをさばけるようになりました、と。

開発中の構成と、プロダクション向けの構成は、ちゃんと考えましょうね、という話でした。
モノビットエンジンでリアルタイム通信のオンラインゲームを作る：座標同期を行う

どうもnisokaです。
モノビットエンジン(MUN)を使ってリアルタイム通信ゲームを作ってみる！ということで。
これまでルームマッチングについて触れてきましたが、最低限のマッチング機能は一通りつくることができました。
今回からは簡単なミニゲームを使って、いよいよ実際にゲームの同期処理をつくっていきたいと思います。

##はじめに
題材となるゲームは世界一シンプルなものが良いと思いまして「PingPongゲーム」にしました。
オンライン処理を行うことに焦点を絞ってまとめたいので、PingPongゲームの作り方などは今回は割愛したいと思います。
代わりにゲーム制作で参考にさせていただいたリンクページを貼らせていただきます。
[参考：Unity 2D Pong Game in 20 Minutes](https://www.youtube.com/watch?v=1oY--Zk9b6w)
環境は以下の通りです
*win10 64bit, Unity2018.3.3f1, Monobit Unity Networking2.0 v2.6*
![image1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401086/df0cd45e-2c02-dc47-0620-d6d6dab023bb.png)

##やること
基本的なオフラインのPingPongゲームができている前提で話を進めます。
まず、各クライアントで**パドルの移動の同期**を取りたいと思います。
各プレイヤーが端末でパドルを動かしたときに、それぞれの端末画面でリアルタイムにパドルが動くということです。
これはモノビットエンジンを使えば比較的簡単に実装できます。

##準備
###MonobitView.csとMonobitTransfomView.csを追加する
![image5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401086/9e60eb94-112b-84f5-0f66-ff2e3d31ccb0.png)
パドルの同期をとるためにはモノビットエンジンがパドルを監視する必要があります。
そのためにはまず、パドルに該当するコンポーネントに**MonobitView.cs**をアタッチします。
![image3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401086/bdd1c1f2-241f-11e1-f8c8-b77aabe2d0e5.png)
続いて、移動の同期をとるためにパドルに該当するコンポーネントに**MonobitTransformView.cs**をアタッチします。

###MonobitView.csとMonobitTransfomViewをアタッチする
![image4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401086/521ee6de-72fd-277d-607e-aacb523b7a56.png)
MonobitView.csのAdd Observed Componen List Colunボタンを押してListを増やします。
次にMonobitTransformView.csをドラックしてアタッチします。
([参考：MUN公式-MonobitTransformViewコンポーネント](http://www.monobitengine.com/doc/mun/contents/Component/MonobitTransformView.htm))

###MonobitEngineを継承させる
最後にパドルに該当するスクリプトを変更し、以下のようにMonobitEngine.MonoBehaviourを継承させます。
これにより、モノビットエンジンが仲介役となってオブジェクトのTransform情報を他クライアントへ送る準備ができました。

```C#:
using MonobitEngine;
public class Paddle : MonobitEngine.MonoBehaviour {
    // クラスの処理
}
```
##各クライアントにパドルを生成
```C#:
if (MonobitNetwork.isHost)
{
    // 球を(他クライアント上にも)生成
    Ball ball = MonobitNetwork.Instantiate("Ball", Vector3.zero, Quaternion.identity, 0).GetComponent<Ball>();
}
// 自プレイヤーを(他クライアント上にも)生成
Paddle paddle = MonobitNetwork.Instantiate("Paddle", Vector3.zero, Quaternion.identity, 0).GetComponent<Paddle>();
```
上記のコードはあくまでサンプルですので、ご自身の環境に合わせて適宜変更お願いします。
まず、各クライアントは`MonobitNetWork.Instantiate`で自身のパドルを生成します。
`MonobitNetwork.isHost`で自身がホストかどうか取得できるます。
ゲストは自身のオブジェクトを生成して終了ですが、ホストの場合はついでにボールも生成します。
`MonobitNetWork.Instantiate`を使用することにより、他クライアント上にも同時に生成されます。
このとき生成したクライアントがそのオブジェクトの所有権を手にします。
所有権については後ほど後述しますが、簡単にいうと**「自身のオブジェクトを動かせる権利」**を指します。

##isMineで自分だけのオブジェクトを操作する
このままだと、複数クライアントで動作させたときに不具合があることはすぐにわかります。
自身のパドルを動かそうとすると、相手プレイヤーのパドルまで同時に動いてします。
これは**「全員のパドルを、プレイヤー全員で動かそうとしている」**ことが原因です。

```C#:
// パドルクラスUpdate
void Update()
{
    if(monobitView.isMine)
    {
        // パドルの更新処理
    }
}
```
そこで上記のように`monobitView.isMine`を使います。
各クライアントは**自身が所有権を持つオブジェクトだけを更新**し、他人に自身のオブジェクトを触らせないようにします。

[参考：MUN公式「自身が所有権を持つプレイヤー」だけを動かすようにする](http://www.monobitengine.com/doc/mun/contents/Tutorial/IsMine.htm)

##最後に
お疲れさまでした。
以上がモノビットエンジンを使って移動同期をとる手順紹介でした。
次回はボールを跳ね返す処理をやりたいと思います。
MySQLのPrimaryKey（id）を振り直す

# MySQLのPrimaryKey（id）を振り直す

PrimaryKeyを振り直す時のメモ

```sql
ALTER table [table_name] drop column id;
ALTER table [table_name] add id int(11) primary key not null auto_increment first;
ALTER TABLE [table_name] AUTO_INCREMENT =1
```

## 解説
#####1行目
指定したテーブルのカラム名idをドロップ（削除）する。

#####2行目
指定したテーブルにカラム名idのカラムを追加する。

下記の指定は重要
`int(11) primary key not null auto_increment first`

#####3行目
AUTO_INCREMENTを1から始める
numpy.arraysの和集合・差集合まとめ

# 概要
numpyのarrayを使った和集合と差集合のまとめです。
nunique・appendなどのメソッドや、set型を組み合わせれば、工夫次第で実現できますが、用意された関数が既にあるようなので、それを使ってしまいましょう！

# 準備
```python
In [1]: import numpy as np

In [2]: array_a = np.array([1, 2, 3, 4, 5])

In [3]: array_b = np.array([1, 3, 5, 7, 9])
```

# 和集合（Union）
np.union1d(A, B)は、np.array型の新しい集合`A∪B = {x|x∈A 又は x∈B}`を返します。

```py
In [4]: np.union1d(array_a, array_b)
Out[4]: array([1, 2, 3, 4, 5, 7, 9])
```
# 差集合（Difference set）
np.setdiff1d(A, B)は、np.array型の新しい集合`A\B = {x|x∈A かつ x∉B}`を返します。

```py
In [5]: np.setdiff1d(array_a, array_b)
Out[5]: array([2, 4])
```
firebaseの公式サンプル

https://github.com/firebase/quickstart-js/tree/master/firestore#cloud-firestore-quickstart

READMEの通り
英語分からんとか書いてる通り試したけどだめだったので知りたい的なひといたら(ニーズあったら)コメントに書いてくれれば追記します
firestoreのサンプルのデプロイ結果は↓のスクショ

![スクリーンショット 2019-04-25 12.35.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193662/d3eb86fe-a8ef-d57a-cbf8-8ab2049235d1.png)
![スクリーンショット 2019-04-25 12.35.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193662/bd2f07b4-f800-8568-8f7e-ff9184c49927.png)
iOSで入力ボックスがある画面はだいたいこうするといいよ！

# はじめに

iOSで入力ボックス（`UITextField`, `UITextView`など）をおいて、実際入力しようとしてみるとキーボードが重複して次の画面に進めなくなった！
みたいなこと、ありますよね。

とくにiPhone SEとか。iPadとか。

そういうとき、なんかviewの座標移動させてみたり、スクロールビューおいたり、いろいろしたりするかと思います。

個人的にはいつも

```
- ScrollView
    - UIView
        - UIStackView
            - その他のView1
            - その他のView2
```

という階層構造を持ったコンテナを作っていて、大体のレイアウトが割と柔軟に作れて、困ったことはあまりないので、紹介します。

UIStackViewは必ずしも必要ではないですが、
あるとかなり便利です。

UIStackViewに関しては別の記事に書きましたので、こちらを参照ください！
[普通の画面をUIStackViewでよりロバストに](https://qiita.com/_ha1f/items/3b3c70a84263aca210ad)

# Content Insets

キーボードのために座標を動かすよりは、UIScrollViewのContentInsetsを調節するのが良いと思います。
実装上のイメージとしては、スクロールビューのコンテンツに、になにもない領域をそれだけ追加するような感じです。

navigationBar等があるときは自動的に上に付いてると思いますが、それと同じです。

キーボードが表示されている間、キーボードの高さ分のinsetsを追加することで、それだけスクロールできるようにすることができます。

### contentInsetAdjustmentBehavior

contentInsetはデフォルトでは自動でsafeAreaとかに合わせて調整されるようになっています。
が、我々はキーボードに合わせて変化させたいので、これを無効化します。

iOS11より前はUIViewControllerの`automaticallyAdjustsScrollViewInsets`　で設定していましたが、iOS 11以降は各scrollViewに対して設定できるようになりました。
`containerScrollView` は上の構造でいう一番親になっているscrollViewです。

```swift
if #available(iOS 11.0, *) {
    containerScrollView.contentInsetAdjustmentBehavior = .never
} else {
    automaticallyAdjustsScrollViewInsets = false
}
```

(viewDidLoadで設定します)

### scrollIndicatorInsets

右とか下とかにあるindicator用のインセットです。
これも同じように設定しておかないと、indicatorがコンテントの外にはみ出します。

なぜ別々に設定できるのかわからないですが、基本的にcontentInsetと同じ値をセットしておけばOKです。

# KeyboardSizeObserver

insetsをキーボードの高さに合わせるためには、キーボードのサイズを監視する必要があります。

Appleの[Managing the Keyboard](https://developer.apple.com/library/archive/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html)が参考になります。

以下の４つの通知があり、observeするとKeyboardの変化を監視することができます。

- UIKeyboardWillShowNotification
- UIKeyboardDidShowNotification
- UIKeyboardWillHideNotification
- UIKeyboardDidHideNotification

この中で、[RxKeyboard](https://github.com/RxSwiftCommunity/RxKeyboard)の実装を見てみると、

- UIKeyboardWillShowNotification
- UIKeyboardWillHideNotification

の２つだけをobserveしてるみたいなので、参考にして、これだけ監視するコードを作りました。

Gistはこちらに置きましたのでご参照ください。
https://gist.github.com/ha1f/d4fbacab1166a0c31907a0b6999fa58b

通知からはフレーム（CGRect）が渡されるんですが、上に貼ったAppleのdocを見てみると、サイズ以外意味ないみたいなことが書いてあるので、
サイズのみを監視できるようにしています。

# SafeArea × Keyboard

２つともを考慮して設定する必要があります。

結論としては、各エッジに対して、大きい方をセットすれば良いとわかります。

scrollViewにたいして全画面になるように制約をつけている場合は、以下のようになります。

```swift
let newInsets = UIEdgeInsets(
    top: view.safeAreaInsets.top,
    left: 0,
    bottom: max(keyboardSize.height, view.safeAreaInsets.bottom),
    right: 0
)
scrollView.contentInset = newInsets
scrollView.scrollIndicatorInsets = newInsets
```

キーボードは下にしかないので、下だけ考慮しています。
左右はinsetをつけても良いですが、例えば横に突き抜けて背景色をつけたい場合などに障害になることがあって、
自分は左右に関してはcontentInsetはつけずに、コンテンツのViewごとにSafeAreaを考えることが多いです。

これをキーボードもしくはsafeAreaが変わるたびに呼び出して更新します。

組み合わせのソースはこちらに置きましたのでご参考ください。
https://github.com/ha1f/KeyboardSizeObserver/blob/de407d2b25ea2aa8fd4bae9449b8c5c1e225143a/KeyboardFrameObserver/ViewController.swift
PowerApps でオブジェクトを画面の中央に配置する計算式

PowerApps もレスポンシブレイアウトなアプリが作成できるようになってきていますが、そうした場合に、ボタンなどを常に画面の中央に配置するためには位置を計算式で指定する必要があります。

#PowerApps のオブジェクトの配置
PowerApps では、オブジェクトの表示位置を X や Y のプロパティとして指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167110/762d550a-3e39-3594-c570-f2da1c82fad6.png)

通常、ここには数値が入っています。しかしながら、この方法では画面が縦の場合と横の場合では、表示される位置に不都合があることがあります。

たとえば縦向きの場合は真ん中に表示されていても…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167110/53caba3f-5fb0-5ef1-03db-674221c3daf2.png)

横向きだとこんな感じになってしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167110/e4b076ae-d4a1-244d-646b-c5e3573c5b26.png)

これだとイマイチなので、位置を計算式で指定します。

#X と Y の計算式
画面の中央に配置したい場合、X と Y に指定する計算式は次のようなかたちです。

```PowerApps:X
(Screen1.Width - Button1.Width)/2
```

```PowerApps:Y
(Screen1.Height - Button1.Height)/2
```

要は、スクリーンの幅や高さから、オブジェクトの幅や高さを引いた値を 2 で割ったものです。

こうしておくと、縦向きでも横向きでも画面の中央に配置されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167110/893df356-031f-a943-8cef-fd9b788c29a3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167110/4867d95c-e8c2-42b3-ebf8-b974edbd0b8a.png)

バッチリでした。

#さいごに
こうしたテクニックは、スマートフォンやタブレットで利用する場合のほかにも、iframe で SharePoint Online や他の Web アプリなどにアプリを埋め込む場合にも役立ちます。

おぼえておくと利用できる機会がありそうです。
docker コマンドの --build-arg で設定した値を Dockerfile の CMD で利用する方法

Docker 初心者のメモ書きです。

# tl;dr

- ENV で環境変数に設定する。

# 詳細

- Dockerfile 内で コマンドで渡された引数 ARG は Build 時のみ参照可能で、実行時には参照できない。
- 実行時には参照するために、渡した引数を ENV で環境変数へ設定する

`docker build --build-arg HOGE=${hoge}`

```Dockerfile
# HOGE変数のデフォルト値の設定
ARG HOGE="default-value"

# HOGE変数を環境変数に設定
ENV HOGE ${HOGE}

# 実行環境で HOGE を参照
CMD echo ${HOGE}
```

# ハマったところ

`CMD []` の実行形式だと変数が展開されない。下の例。

```Dockerfile
CMD ['echo', '${HOGE}']
# 実行時
# > HOGE
```

ドキュメントにもはっきりと書かれていました。

>シェル 形式と異なり、 exec 形式はコマンド・シェルを呼び出しません。つまり、通常のシェルによる処理が行われません。例えば CMD [ "echo", "$HOME" ] は $HOME の変数展開を行いません。シェルによる処理を行いたい場合は、 シェル 形式を使うか、あるいはシェルを直接使います。例： CMD [ "sh", "-c", "echo", "$HOME" ] 。

http://docs.docker.jp/v1.11/engine/reference/builder.html#cmd

# RUN じゃダメなの？

`RUN` だと変数展開できて `CMD` だと展開できないのなら `RUN` でいいじゃん。と思ったのですが、こちらの記事に違いが書いてありました。

https://qiita.com/YusukeHigaki/items/044164837daa5e845d50
この図がわかりやすかった。

# 参考
https://stackoverflow.com/questions/35560894/is-docker-arg-allowed-within-cmd-instruction
jupyterにおけるデータの抽出その１

#データの表から一部を抽出する方法
<img width="297" alt="スクリーンショット 2019-04-25 11.59.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396628/55982123-6ab5-2c59-05ac-cf83e9a1041e.png">
①　例えば、このデータからカレーのデータのみを抽出したい場合は、

店舗A.料理.str.contains('カレー')

とすれば良い。

②　しかし、このままではポークカレー、インドカレーのみでなく、カレー味チキンも含んでしまう。そういう時は、

(店舗A.料理.str.contains('カレー')) & (~店舗A.料理.str.contains('味'))

とすると、カレーを含みつつ、味という文字を含まないものを抽出できる。

③　カレーとラーメン両方を抽出したい場合は、

店舗A.料理.str.contains('カレー|ラーメン')

とすると、ポークカレー、味噌ラーメン、インドカレー、塩ラーメン、カレー味チキンを抽出することができる。②の方法と合わせて、

(店舗A.料理.str.contains('カレー|ラーメン')) & (~店舗A.料理.str.contains('味'))

とすれば、ポークカレー、味噌ラーメン、インドカレー、塩ラーメンを抽出できる。
pandasについて

#pandas
pandasは、Pythonにおいて、データ解析を支援する機能を提供するライブラリである。

##pandasのimport
*pandasにpdという名前をつけてimportする*

```python

import pandas as pd
```

##csvファイルの読み込み
*URIAGE.csvという名前のcsvファイルを読み込む*

```python
df = pd.read_csv('./data/URIAGE.csv')
```

##データの確認
*dfというデータの最初の１０行を表示する*

```python

df.head(10)
```

*dfというデータの最後の１０行を表示する*

```python

df.tail(10)
```

## 任意の列だけ取り出す##
*TANKAという列とSURYOという列だけ取り出し、上から５行を表示*

```python

df[['TANKA', 'SURYO']].head()
```

##どんなデータが入っているか表示##
unique()により重複しないようにデータを表示できる
*HIN_NMという列のデータを表示(重複なし)*

```python
df.HIN_NM.unique()
```
Link > 秀丸エディタ > 秀丸のCSVモードが超便利 

```txt:動作環境
Windows 10 Pro (64bit) バージョン 1809 (October 2018 Update)
```

すごく便利だったのでシェアします。

### 状況

- とあるデータを読込んで可視化するツールを開発
- 読んでデータが表示されない
- csvファイルであるが、該当項目がエディタで見えにくい

### 情報

- [秀丸のCSVモードが超便利 ](http://blog.segu.jp/2012/05/csv.html)
    - segu様

表示 > タブストップ > CSVモード(カンマ区切り)
その他の詳細は上記リンクを参考に。

情報感謝です。

### 所感

すごく便利です。
:thumbsup:
Error: Uncaught [TypeError: Cannot read property 'options' of undefined]

## エラー概要
ReactコンポーネントのTestファイルにてエラー発生。

```
Error: Uncaught [TypeError: Cannot read property 'options' of undefined]
```

### 関係しそうなライブラリ

- react (16.8.6)
- typescript (3.4.3)
- i18next (11.3.2)
- react-i18next (7.7.0)

以下のように書き出しているコンポーネントをテストするため、

```tsx
export default translate()(NavigationHeader);
```

以下のようにmockを作成しようとしていた。

```tsx
describe('NavigationHeader', () => {
  it('should render', () => {
    const wrapperMounted = mount(
        <NavigationHeader {...mockNavigationHeaderProps} />
    );

    // tslint:disable-next-line: no-console
    console.log(wrapperMounted.debug());
  });
});
```

そしたらガッツリエラー出ました。

### 解決法

react-i18nextに関するエラーでした。
i18nConfigが渡されてないため`options`がないよ、と言われていた模様。


```tsx
const wrapperMounted = mount(
      <I18nextProvider i18n={i18n}>
        <NavigationHeader {...mockNavigationHeaderProps} />
      </I18nextProvider>
    );
```


こうしたら解決しました。

## 参考

[Uncaught TypeError: Cannot read property ‘options’ of undefined at new Translate (translate.js:63) · Issue #31 · artisavotins/react-redux-i18n · GitHub](https://github.com/artisavotins/react-redux-i18n/issues/31)
DockerでAmazonS3環境を構築

# はじめに

AmazonS3の開発をしたくても、個人で環境を用意するのは敷居が高く諦めていました。
しかし、Dockerでminioというイメージを使えば無料で可能と聞き早速試しました。
Dockerを全く使ったことはなかったですが、これを機に勉強します！！！

# 手順
## Dockerインストール
https://www.docker.com/get-started

## awscliインストール
```bash
brew update
brew search aws
brew install awscli
```

## minioインストール
```bash
# ディレクトリ作成
mkdir /tmp/data
mkdir /tmp/config

# イメージダウンロード
docker pull minio/minio

# dockerコンテナ起動
docker run -p 9000:9000 --name minio \
  -e "MINIO_ACCESS_KEY=AKIAIOSFODNN7EXAMPLE" \
  -e "MINIO_SECRET_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" \
  -v /tmp/data:/data \
  -v /tmp/config:/root/.minio \
  minio/minio server /data

# URL確認（コンテナ起動時に表示される）
docker logs minio
```

## ディレクトリ作成
```bash
# バケツ作成
aws --endpoint-url http://127.0.0.1:9000/ s3 mb s3://bucket01

# バケツ確認
aws --endpoint-url http://127.0.0.1:9000/ s3 ls

# ファイル作成
date +"%Y-%m-%d %H:%M:%S" > ~/now.txt
cat ~/now.txt

# アップロード
aws --endpoint-url http://127.0.0.1:9000/ s3 cp ~/now.txt s3://bucket01

# アップロード・ファイル確認
aws --endpoint-url http://127.0.0.1:9000/ s3 ls s3://bucket01

# バケツ内のファイル削除
aws --endpoint-url http://127.0.0.1:9000/ s3 rm s3://bucket01/now.txt

# バケツ削除
aws --endpoint-url http://127.0.0.1:9000/ s3 rb s3://bucket01
```

# dockerコマンド一覧
```bash
$ docker container ls
$ docker container stop webserver
$ docker container ls -a
$ docker container rm webserver
$ docker image ls
$ docker image rm nginx
```

# References
+ [Get Started with Docker](https://www.docker.com/get-started)
+ [Get started with Docker Desktop for Mac](https://docs.docker.com/docker-for-mac/)
+ [Get Started, Part 1: Orientation and setup](https://docs.docker.com/get-started/)
+ [AWS S3ライクなオブジェクトストレージMinioを使ってみた](https://qiita.com/togana/items/a7c2a2e1af63054246b3)
+ [miniO](https://min.io)
+ [minioを使ってS3の環境をローカルで再現する](https://swfz.hatenablog.com/entry/2016/08/31/031634)
bits/dims ってなんだよって言われて虚無になったので調べてみた

# これまでのあらすじ
RealNVP なんかの **画像生成系の論文** を友人と共に ~~殴り合いながら~~ 読んでいたときに出てきた、評価手法、bits/dims が気になって夜も眠れなくなった。
我々の明日はどっちだ


# 調べてみたら、良い感じの Reddit が出てきた
[[Discussion] Calculation of bits/dims](https://www.reddit.com/r/MachineLearning/comments/56m5o2/discussion_calculation_of_bitsdims/) で良い感じに議論されていた。どうやら PixelRNN の論文で触れられているらしい。

## PixelRNN の論文へGO
[PixelRNN](https://arxiv.org/pdf/1601.06759.pdf)で該当部を探すと、こんな感じの文章が書いてあった。

> For MNIST we report the negative log-likelihood in nats as it is common practice in the literature. For CIFAR-10 and ImageNet we report negative log-likelihoods in bits per dimension. The total discrete log-likelihood is normalized by the dimensionality of the images (e.g., 32 × 32 × 3 = 3072 for CIFAR-10). 

面倒なので翻訳しよう。

> MNIST については一般的な手法であるから底 e の負の対数尤度(自然対数を nats というらしい、落花生ではないようだ) で報告を行いました。CIFAR-10 や ImageNet に関しては、bits/dims を用いた負の対数尤度で報告を行いました。すべての離散対数尤度は、画像の次元数で正規化が行われました。（例えば、CIFAR-10 の場合では、32x32 = 3072）

つまり**負の対数尤度の一種**として bits/dims ということがあるらしい。画像の次元数で正規化が行われるということは、**画像サイズに関わらない評価を行いたい**、という意図を感じる。感じる。

## 実際に例を上げて計算してみる。
ページを戻してRedditの方で上げられている式を読み解いて、この bits/dims がどういう計算をしているのか見てみよう。

状況は以下を想定する。
- 負の対数尤度 L が 5371.78 
- 画像の次元数 D が 32 x 32 * 3 = 3072

すると、
$\frac{L / D - log_e 128}{log_e2}$
$= \frac{5371.78/ 3072 - 4.852}{0.693}$
$= 4.477$

この $log_e 128 = log_e (256 = 2^8 / 2)$ というのが大変ひっかかるが、これは連続的な確率密度関数 (特にここでは Gaussian pdf)を離散的な尤度値に変換するための暗黙的な手続きとされているらしい。

# どういう値が良いの？
係数がかかっているとはいえ、実質的には負の対数尤度と同じ方向と考えて問題なく、つまり最小化をすることになるので、**小さい値** が良いと判断できる。
それ以外に考える点としては、大きい画像を学習データとしたときに、多少負の対数尤度的に悪くても **画像サイズで割っているため** そのスコアの悪さを緩和できるということが挙げられるだろう。（このあたりが、画像サイズでの正規化、という意味なんだろうか）

# それで、実装的にはどう処理しているの？
[RealNVPは上記の方法で解決されている](https://github.com/taesungp/real-nvp/blob/5ec7a22bbae529e44d60bd6664a7753ae6772dfa/real_nvp/nn.py#L230-L247)、OpenAI の [Glow](https://d4mucfpksywv.cloudfront.net/research-covers/glow/paper/glow.pdf) でもコードを見る限り[同様に処理されている](https://github.com/openai/glow/blob/654ddd0ddd976526824455074aa1eaaa92d095d8/model.py#L153-L186)と思う。


# もっと知りたいときは
Glowの issue で[いい感じの質疑応答](https://github.com/openai/glow/issues/43)があった。
また、この bits/dims 周りのもっと詳しい話（恐らく初出）は [NICE: NON-LINEAR INDEPENDENT COMPONENTS ESTIMATION
](https://arxiv.org/pdf/1410.8516.pdf) にある。
レイをトレースしたい。　第一回　準備

Ray Tracing in One Weekend を勉強しつつ、自作のレイトレをしてみたいなという記事です。
https://www.amazon.co.jp/Tracing-Weekend-Minibooks-Book-English-ebook/dp/B01B5AODD8

内容としては大体沿いつつ、実装自体は割と我流でやっていこうと思います。

使用言語はC++です。

# Eigenのダウンロード
ベクトルや行列の計算が多々出てくるので、C++のヘッダであるEigenを利用します。
Eigenは高速ながらコンパイルがいらないので、パスを通すとか考えなくても使えるのが良いです。

http://eigen.tuxfamily.org/index.php?title=Main_Page

こちらの公式サイトからダウンロード、回答したあとEigenフォルダをソースとおなじところに置きます。
これでincludeを叩くだけで行列やベクトルが扱えます。

# 画像の表示

ビットマップを扱うのは意外とヘッダの書き込みがあったりして面倒なので.pnm形式を利用します。pnm形式はめちゃくちゃ簡単で、

```.pnm
P3  //フルカラーの意味
512 512　//height, width
255 //RGBの最大値
R G B
R G B
R G B
・
・
・
```
RGBの配列をpnmファイルに書き出す関数を用意しました。

```cpp
void write_ppm(vector<vector<vector<int>>> pic){
    ofstream out;
    out.open("test.pnm");
    out << "P3" << endl;
    out << pic.size() << " " << pic[0].size() << endl;
    out << 255 << endl;
    for (int i = 0 ; i < pic.size(); ++i){
        for (int j = 0; j < pic[0].size(); ++j){
            out << pic[i][j][0] << " " << pic[i][j][1] << " " << pic[i][j][2] << endl;
        }
    }

}
```

これだけです。簡単ですね。
この形式で書き込むだけで画像ファイルができます。ただこれを直接開けるエディタは限られているので、pngファイルとかに変換します。変換にはimagemagickを使用し

```
convert hoge.pnm -scale 512x512 hoge.png
```

のようにコマンドを叩くだけで変換してくれます。

# 第一回のソース
インクルードとか思いつく定数とかを定義したのが以下になります。

```cpp
#include <bits/stdc++.h>
include "Eigen/Core"
using namespace std;
using namespace Eigen;


const double PI = 3.141592653589793238;
const double PI2 = 6.28318530718;
const double eps = 1e-6;

void write_ppm(vector<vector<vector<int>>> pic){
    ofstream out;
    out.open("test.pnm");
    out << "P3" << endl;
    out << pic.size() << " " << pic[0].size() << endl;
    out << 255 << endl;
    for (int i = 0 ; i < pic.size(); ++i){
        for (int j = 0; j < pic[0].size(); ++j){
            out << pic[i][j][0] << " " << pic[i][j][1] << " " << pic[i][j][2] << endl;
        }
    }

}

int main(void){
    int height = 512;
    int width = 512;
    pic = vector<vector<vector<int>>>(height,vector<vector<int>>(width,vector<int>(3,150)));
    write_ppm(pic);
    return 0;
}
```

実行するとグレーの画像が出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244678/6dc29040-39ae-4cf5-4d0d-016171898189.png)
【備忘録】【iOS】Adhocでexportしたipaが実機にインストールできない時にしたこと

先日遭遇し、ハマったのでメモ。

# 概要
export methodをAdhocにしてipaを吐き出し実機にインストールしようとした際に

```
"iPhone Distribution: [開発元]"はこのiPhoneでは信頼されていません。
この開発元が信頼されるまで、そのエンタープライズAppは使用できません。
```

的なメッセージが出ました。

この際普通は
[設定] > [一般] > [プロファイル] から該当のプロファイルを選択し、信頼することになると思いますが、この時はプロファイルが表示されておらず二進も三進もいかない状態でした。

# 対応
- 対象のiOS端末をMacに接続した状態でXCodeを立ち上げ[Window] -> [Devices and Simulators] を選択
- 画面左側Connectedから端末を右クリック -> [Show Provisioning Profiles] を選択
- インストールしようとしているAppで使用されているProvisioning Profileを選択し [-] を押して削除
- 対象のiOS端末を再起動
- 再度Adhocで吐き出したipaをiOS端末にインストール

これで「信頼されていません」なメッセージが出ず起動できるようになりました。

# まとめ
そもそもAdhocなのに信頼云々のメッセージが出るのはおかしいのでは？等モヤモヤポイントが残っておりますが、解決策として一旦残しておきます。
Notice: Undefined indexエラーの原因と解決方法

# 経緯
- phpでお問い合わせフォームを作成している時にぶつかったエラーです。
- 調べていくうちに、`$_POST`や`$_GET`で値を受け取るときによく発生するエラーみたいなので、その原因と解決方法を書きます。

# この記事で分かること
- `Notice: Undefined index`エラーの原因と解決方法

# Notice: Undefined indexとは
- 未定義の配列の要素を使用した時に出るエラー


## Notice: Undefined indexの原因

- 初回アクセスと2回目以降のアクセスの処理を切り分けができていないから


## コード例

- お問い合わせフォームを作成する際に、送信ボタンをPOSTした時にその下に書かれている処理が実行される場合を想定します

### エラーが表示される場合

```php:index.php
if ($_POST["submit"]) {

//ここに処理が入ります

}
```

#### エラーの原因
この場合、`index.php`に初回にアクセスした場合、`$_POST['submit']`が未定義の状態なので、`Notice: Undefined index`というエラーが発生します。 

### 解決方法

配列の要素が定義されているかどうかを確認することで解決することができます。 

```php:index.php
if (!empty($_POST["submit"])) {

//ここに処理が入ります

}
```

#### 解説
このように`empty関数`を使って「`$_POST["submit"]`に値が入っている場合は」という条件を与えることで、初回にアクセスしたときにエラーがなくなります。
psqlの変数にクォーテーションをつける方法

psqlでファイルからSQLを流して実行するには次のようにする。

```
$ psql -f hoge.sql
```

ここで`hoge.sql`の中で可変にできる部分を変数で置き換えてpsqlの実行時に渡すには次のようにする。

```
$ psql -f hoge.sql -v src_table=users
```

SQLファイルの方は`:`を付けて参照できる。

```hoge.sql
select * from :src_table;
```

テーブル名などクォーテーションが必要ない文であればこれで問題ない。
問題は`copy`の`from`や`to`のようにファイル名を書くべき場所でどうやって参照するかだ。

```
$ psql -f hoge.sql -v user_list_file=users.tsv
```

```hoge.sql
copy users from :user_list_file;
```

これだとNG。エラーが出る。
じゃあ、こうかなと思って書いてみるが、

```hoge.sql
copy users from ':user_list_file';
```

当然、これもダメ。

正解はこうする、

```hoge.sql
copy users from :'user_list_file';
```


えっ、そこって場所にクォーテーションをつける。
型について語る前に

~~型を語る(激寒)~~

## 近年(いつ?)，型が燃えがち

人は一般に任意のトピックについて，基礎的な知識を欠いているのにも関わらず，かなり強めな意見や主張を述べてしまうことがよくあります．

それだけならば普通によいことなのですが[^1]，とかくプログラミングの分野については語気が強めの(ように感じられる)反論が集まってしまいがち[^2]で，双方ともにモヤモヤ・イライラして終わってしまうことが多いです．

[^1]: その分野に詳しい人に直接教授してもらい，正しい知識を得られるかもしれないのですから．

[^2]: 直接コメントしてくる人の多くは特に怒っているわけではないのですが，淡々と反論をしてくるので，自分が否定されているように感じてしまいがちですね．Twitter とかにはイライラのお気持ち表明をしてる人がいるかもしれないので，見ないほうがいいです．

で，プログラミングの中でもそのような自体がかなりの頻度で発生するのが「型」についてのトピックです．

普段から強い静的型付きの言語を好んで使い，一応型システムについて研究している身としては，この状況はあまり好ましくないものだと思っています．

## 「型」の基礎教養は無料で・日本語で・わかりやすくつけられる

しかし！

型は恵まれたトピックで[^3]，日本語で書かれた高品質な教科書「型システム入門」の第一章が，なんと[出版社のウェブサイトで，無料の PDF として公開されています](https://www.ohmsha.co.jp/book/9784274069116/)．

「ダウンロード」から「第1章のサンプルダウンロード」をしてください．

* 型とはなんなのか
* 型のなにがうれしいのか
* プログラム言語の設計で型がどれほど重要な位置を占めるのか
* 型の大まかな歴史

がわかりやすく解説されています[^4]．型システムに関する研究をするのでなければ，この一章を読むだけで必要な教養は十分つく，とわたしは思っています．

型を語る前に！燃える前に！マサカリが飛来してイライラする前に！

あなたと TAPL の一章
今すぐダウンロー
ド

[^3]: なんとか指向プログラミングやモ○ドと違って

[^4]: ただし，かなり誤解されがちな**「型推論」についての解説がほぼない**のがつらいです．なんかいい感じのがあったら教えてください．
無料で読める技術書・エンジニア本まとめのまとめのまとめ

こんな記事を見まして。

「お金を払ってセキュリティを学ぶ」のは平成で終わり？　ある無料教本が神レベルで優れている件 (1/3) - ITmedia エンタープライズ - https://www.itmedia.co.jp/enterprise/articles/1904/24/news032.html

早速iPadにダウンロードしたんですが、他にも読んで勉強になる無料の書籍ってありそうだなーと思って調べてみました。

##無料書籍
[小さな中小企業とNPO向け情報セキュリティハンドブック[みんなでしっかりサイバーセキュリティ]](https://www.nisc.go.jp/security-site/blue_handbook/index.html)
![小さな中小企業とNPO向け情報セキュリティハンドブック](https://image.itmedia.co.jp/enterprise/articles/1904/24/lt_20190423_miyata_book_w290.jpg)


冒頭の記事で紹介されている、内閣サイバーセキュリティセンター（NISC）が公開しているものです。タイトルにあるように、中小以下の規模の企業や団体が意識すべきセキュリティのことが広く深く網羅されている一冊。

[インターネットの安全・安心ハンドブック[みんなでしっかりサイバーセキュリティ]](https://www.nisc.go.jp/security-site/handbook/index.html)![インターネットの安全・安心ハンドブック](https://www.nisc.go.jp/security-site/_src/20588/img20190117100144242342.png)

同様にNISCが公開しているもの。個人向けの、より基礎的なことが書いてあります。まずはこちらを読むだけでも参考になりますし、エンジニアに関係なくPC・スマホを日常利用しているすべての人に読んでもらいたい本です。

[Pro Git 日本語版電子書籍公開サイト](https://progit-ja.github.io/)![Pro Git 日本語版電子書籍公開サイト](https://raw.githubusercontent.com/progit/progit2-ja/master/book/cover.png)

分散型バージョン管理システムであるGitの解説書。体系だった内容の理解はこれ一冊で十分だと思います。pdfのほかにepubやmodi（Kindle形式）でも配布されています。


## ここまでまとめてみて
・・・調べてみると、やっぱり同じようにまとめている人多いですね。そして英語ばっかり。
他のサイトを紹介したほうが早そうなので。。。

##まとめサイト
[エンジニアが無料で読める技術書のまとめのまとめ - 一発屋エンジニアになりたい - http://hc0208.hatenadiary.jp/entry/free-programming-books](http://hc0208.hatenadiary.jp/entry/free-programming-books)
これを紹介したら、このページは「まとめのまとめのまとめ」です。

[free-programming-books/free-programming-books-ja.md at master · EbookFoundation/free-programming-books - https://github.com/EbookFoundation/free-programming-books/blob/master/free-programming-books-ja.md](https://github.com/EbookFoundation/free-programming-books/blob/master/free-programming-books-ja.md)
上記「技術書のまとめのまとめ」で紹介されている、なんというかリンク集です。GitHub上なのでページタイトル長いですが、紹介は日本語でされてます。

[[WIP] エンジニア向け無料電子書籍 - Qiita - https://qiita.com/yoshi389111/items/7a6280bd138c26fd2717#_reference-87e96554c7a1bd8f9195](https://qiita.com/yoshi389111/items/7a6280bd138c26fd2717#_reference-87e96554c7a1bd8f9195)
こちらも、良い感じにまとめてくださっています。


その他、まとめている記事をいくつか紹介します。いずれも2015年とか2016年時点のまとめ記事です。

[技術系の電子書籍を無料配布してるサイト - Qiita - https://qiita.com/zakuroishikuro/items/8ead72cd129e76c53d74](https://qiita.com/zakuroishikuro/items/8ead72cd129e76c53d74)

[無料でダウンロードできるIT技術系電子書籍（EPUB／PDF）一覧【2016年版】 - Build Insider - https://www.buildinsider.net/hub/ebooksfree/2016](https://www.buildinsider.net/hub/ebooksfree/2016)

[無料で読めるIT系書籍 - Man On a Mission - https://oplern.hatenablog.com/entry/2016/04/29/234445](https://oplern.hatenablog.com/entry/2016/04/29/234445)


## おわりに
GW中に読む本を探そうと思ってまとめ始めましたが、まとめている方がいっぱいいたので途中で挫折。。。
ちゃんと読んだら、それぞれをちゃんと紹介しようかなと思いましたまる。
pandasでデータの集計

#はじめに
pandasは今回初めて触ったので、拙いところもございますがご了承ください。

#csvファイルの読み込み
csvファイルを読み込むときはpd.read_csvを使います。

```
import pandas as pd
df = pd.read_csv('〇〇.csv')
```

#集計
データの集計を行うときはgroupbyを使うと便利です。aaaという項目について集計したいときは以下のように書きます。

```
df.groupby('aaa').size()
```

また、複数項目について集計することも可能です。aaaとbbbという項目について集計したいときは以下のように書きます。

```
df.groupby(['aaa','bbb']).size()
```

後ろのsize()の部分を変更すると数量以外のものも表示できます。例えば、mean()を用いれば平均値を出すことができます。
また、降順に整理したいときはsort_valuesを用いますが、これをgroupbyと組み合わせることもできます。

```
df.groupby('aaa').size().sort_values(ascending = False)
```

他にも、head()なんかと組み合わせることもできます。
#JSON を #jq コマンドでソートする、逆順にソートする ( オブジェクトの配列 ) ( ASC DESC 的な )

```
$ echo '[{"count":1},{"count":3},{"count":2}]' | jq 'sort_by(.count)'
[
  {
    "count": 1
  },
  {
    "count": 2
  },
  {
    "count": 3
  }
]
```


```
$ echo '[{"count":1},{"count":3},{"count":2}]' | jq 'sort_by(.count) | reverse'
[
  {
    "count": 3
  },
  {
    "count": 2
  },
  {
    "count": 1
  }
]
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1414








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
一般化線形回帰の拡張

[SAS Viya](https://www.sas.com/ja_jp/software/viya.html)で一般線形回帰モデルの拡張を行う方法を紹介します。プログラミング言語はPythonになります。

## モデルの生成

モデルは Genmod メソッドを使います。

```py
cars = conn.CASTable('cars')
genmodModel1 = cars.Genmod()
```

## モデルに対してパラメータの設定

`genmodModel1.model` に対してパラメータを設定します。今回はリンク関数にlogを指定しています。

```py
genmodModel1.model.depvars = 'MSRP'
genmodModel1.model.effects = ['MPG_City']
genmodModel1.model.dist = 'gamma'
genmodModel1.model.link = 'log'
genmodModel1.model.depvars = 'Cylinders'
genmodModel1.model.dist = 'multinomial'
genmodModel1.model.link = 'logit'
genmodModel1.model.effects = ['MPG_City']
genmodModel1.display.names = ['ModelInfo', 'ParameterEstimates']
```

## アウトプットの設定を行う

そして結果の出力用テーブルを用意します。

```py
genmodResult = conn.CASTable('CylinderPredicted', replace=True)
genmodModel1.output.casout = genmodResult
genmodModel1.output.copyVars = 'ALL';
genmodModel1.output.pred = 'Prob_Cylinders'
genmodModel1()
genmodResult[['Prob_Cylinders','_level_','Cylinders','MPG_City']].head(24)
```

結果は次のように出力されます。



<div>
<table border="1" class="dataframe"><caption>Selected Rows from Table CYLINDERPREDICTED</caption>
  <thead>
    <tr style="text-align: right;">
      <th title=""></th>
      <th title="Predicted Value">Prob_Cylinders</th>
      <th title="Response Level">_LEVEL_</th>
      <th title="Cylinders">Cylinders</th>
      <th title="MPG_City">MPG_City</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1.928842e-19</td>
      <td>3.0</td>
      <td>6.0</td>
      <td>17.0</td>
    </tr>
    <tr>
      <th>1</th>
      <td>1.442488e-02</td>
      <td>4.0</td>
      <td>6.0</td>
      <td>17.0</td>
    </tr>
    <tr>
      <th colspan="5">…</th>
    </tr>
    <tr>
      <th>22</th>
      <td>9.999077e-01</td>
      <td>8.0</td>
      <td>6.0</td>
      <td>20.0</td>
    </tr>
    <tr>
      <th>23</th>
      <td>9.999530e-01</td>
      <td>10.0</td>
      <td>6.0</td>
      <td>20.0</td>
    </tr>
  </tbody>
</table>
</div>

## まとめ

SAS Viyaでは簡単に一般化線形回帰が使えますが、よりカスタマイズしたい時にも簡単にできます。ぜひデータ分析に役立ててください。

[SAS for Developers | SAS](https://developer.sas.com/home.html)
SAS Viyaで分析するためのSAS言語を取得する

[SAS ViyaはAIプラットフォーム](https://www.sas.com/ja_jp/software/viya.html)です。SAS言語の他、RやJava、Pythonに対応しています。Pythonであれば機械学習に慣れたエンジニアであれはすぐに使いこなせるでしょう。

今回はこのPythonから、同内容をSAS言語にして取得する方法を紹介します。

## テーブルを開く

まずテーブルを作成、または開きます。

```py
organics = conn.upload('organics.csv').casTable
```

## logisticを実行する

例えばlogisticプロシージャを実行する際に、同時にcodeオプションを指定します。中身は空のDictです。

```py
result = organics.logistic(
    target = 'TargetBuy',
    inputs = ['DemAge', 'Purchase_3mon', 'Purchase_6mon'],
    code = {},
)   
result['_code_']
```

## コードを確認する

結果の `result['_code_']` にコードが入っています。

```sas
SASCode
/*-----------------------------------------
Generated SAS Scoring Code
Date: 11Apr2019:22:53:31
-----------------------------------------*/
	
drop _badval_ _linp_ _temp_ _i_ _j_;
_badval_ = 0;
_linp_ = 0;
  :
```

## まとめ

このコードを使うことで、同じ分析結果がSAS言語でも得られるようになります。Pythonは分かるけれどSAS言語に詳しくない方は、このcodeオプションを使いこなしてください。

[SAS for Developers | SAS](https://developer.sas.com/home.html)
Doorkeeper 5.1.0 + Sorcery 0.13.0 + Rails APIで認証に失敗する問題

## 事象
Doorkeeperを5.1.0に上げると、APIで認証した際に、以下のエラーが出るようになった。

```
NameError (undefined local variable or method `cookies' for #<Doorkeeper::TokensController:0x00007ffeb6604b10>):
```

## 対応
以下のパッチをあてる。

```
module Doorkeeper
  module ApplicationMetalControllerPatch
    def current_user; end
  end
end

Rails.application.config.to_prepare do
  Doorkeeper::ApplicationMetalController.prepend Doorkeeper::ApplicationMetalControllerPatch
end
```

## 原因
- Doorkeeper 5.1.0から`Doorkeeper::ApplicationMetalController`が`ActionController::API`を継承するように変更された
- sorcery 0.13.0から`ActionController::API`にもsorcery関連の処理が追加されるようになった

### 原因から影響を受けた挙動
- `Doorkeeper::TokensController`で`render json`する
- ActiveModelSerializerの`serialization_scope`でデフォルト値の`current_user`が呼ばれる
- sorceryの`current_user`が呼び出され、運悪くremember_meのモジュールとか入れていると、APIなのにcookieを読み込もうとする...
EditTextに文字を打っても文字が反映されないときの対処法

EditTextに文字が打てないというバグに悩まされました。
試行錯誤してもどうしてもうまくいかないときに試してみてください。

結論から言うと

```xml
<EditText
    android:focusedByDefault="true"
/>
```

こいつを設定してみてください。
ちなみに、文字が打てなかったバグが出たシチュエーションなのですが、

①ロック画面にアクティビティを表示していた

```java
@Override
protected void onCreate(Bundle savedInstantState){
    super.onCreate(savedInstantState);
    Window window = getWindow();
    window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED)
}
```

こんな感じでロック中に無理やりアクティビティを表示し、その上にFragment（EditTextがそこにある）を表示するよう書いていました。

②ボタンを押されたときに①で設定したフラグを削除していた

```java
 window.clearFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
```

これをボタンをクリックされた処理の中に入れていました。
そしたら、強引にロック画面上に表示するよう設定されていたものが無効化されてロック解除を要求されるわけですが、そこでEditTextに文字を打ち込むとなぜか文字が表示されないという不具合が出ました。
厳密に言うと、確定ボタンを押すと文字が反映されると言うよくわからない不具合でした。

かなり限定的な不具合なのでなぜ効果があったのかはわかりません。
なので、文字が表示されない不具合があって八方塞がりになったらなんとなく試してみてください。
僕もそんなノリでなんとなく使ってみたら直りました
Docker Swarm (Swarm Mode) を止める

# Swarm Modeとは
簡単にいうとデプロイでクラスタをまたぐ機能らしいです。
KVSのようなものと認識してます

## 止めるには
swarm modeをはじめてしまっている場合、
止め方を説明します。
例えばこんな感じのエラーが出てしまったとします。

```
$ docker-compose up -d
WARNING: The Docker Engine you're using is running in swarm mode.

Compose does not use swarm mode to deploy services to multiple nodes in a swarm. All containers will be scheduled on the current node.

To deploy your application across the swarm, use `docker stack deploy`.

Starting mysql ... done
metabase is up-to-date
```

その場合、強制的に止めるには、こちらのコマンでいけます

```
$docker swarm leave --force
```
WordPressで管理画面にアクセスしたときにリダイレクトループが発生する

# はじめに
WordPressで管理画面にアクセスしたときにリダイレクトループが発生して、解決するまでをまとめました

# 環境
- Version 4.4.2
- ALB（Application Load Balancer）にて、SSL証明書設定
- また、ALBにて、HTTPをHTTPSにリダイレクトする設定をしている

# 解決策
- FORCE_SSL_ADMINをtrueにして、HTTP_X_FORWARDED_PROTOのチェックを行う
- ただし、「require_once(ABSPATH . 'wp-settings.php');」の前であること

```wp-config.php

define('FORCE_SSL_ADMIN', true);
if ( ! empty( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' ) {
       $_SERVER['HTTPS']='on';
}

require_once(ABSPATH . 'wp-settings.php');

```

# 参考
[管理画面での SSL 通信](https://wpdocs.osdn.jp/%E7%AE%A1%E7%90%86%E7%94%BB%E9%9D%A2%E3%81%A7%E3%81%AE_SSL_%E9%80%9A%E4%BF%A1)
Javascriptで特定の要素を取り除く


indexOfとspliceを使って行う
indexOfで位置を見つける
spliceで要素を削除する

## Code

```javascript

const arr = [10,20,30,4,5,6,112,333,4,2,5,66];

function deleteElement(arr, targetNum) {
  let position = arr.indexOf(tagetNum);
  if (position === -1) {
    return null
  }
  arr.splice(position, 1);
}

```
postgresが動かなくなった２

ruby会議2019にて気になったrabbitをインストールしたところ、開発中のシステムが動かなくなった！
いやrabbitのせいじゃないんだけどｗ

```
lib/pg.rb:56:in `initialize': could not connect to server: Connection refused (PG::ConnectionBad)
	Is the server running on host "localhost" (::1) and accepting
	TCP/IP connections on port 5432?
could not connect to server: Connection refused
	Is the server running on host "localhost" (127.0.0.1) and accepting
	TCP/IP connections on port 5432?
```

過去に色々試したpostgres復活の呪文も何も通らず、、、
ただ１つだけ気になるメッセージ発見

```
$ pg_ctl -D /usr/local/var/postgres start
dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.62.dylib
  Referenced from: /usr/local/Cellar/postgresql/10.5/bin/postgres
  Reason: image not found
no data was returned by command ""/usr/local/Cellar/postgresql/10.5/bin/postgres" -V"
The program "postgres" is needed by pg_ctl but was not found in the
same directory as "/usr/local/Cellar/postgresql/10.5/bin/pg_ctl".
Check your installation.
```

/usr/local/opt/icu4c/lib/libicui18n.62.dylib
がロードできないよーと

最終的には[こちら](https://codechord.com/2018/09/solution_for_php_error_after_upgrade_homebrew/)の記事のおかげで解決

```
$ brew switch icu4c 62.1
Cleaning /usr/local/Cellar/icu4c/64.2
Cleaning /usr/local/Cellar/icu4c/62.1
Cleaning /usr/local/Cellar/icu4c/59.1
Opt link created for /usr/local/Cellar/icu4c/62.1
```

たぶん64.2が勝手にインストールされて、そっちを参照するようになってしまったものを62.1を見るようにスイッチしたんでしょう！

よかったー

---

2023/01/17 追記

システムのRubyバージョンアップ（かなり大型）に備えて、brew update して、rbenvを更新して、Rubyをいくつかインストール
その日は特に問題なかったのだが、、、

翌日postgresに接続できなくなった
エラーは上記とほぼ同じなんだけど、brew switch がエラーになった

そこでログをよくみてみたら、新しくアクセスしようとしていたのが
postgresql@14
元々は
postgresql@12
だったはず

```
$ brew services list
```

でインストールされているサービスを確認し、

```
brew services start postgresql@12
```

で無事起動

ただし今まで使っていたDBが全部消えてた・・・
次回から brew update する前にはバックアップを取っておこう。。。
jqで階層構造を持つオブジェクトをCSVにマップする

こんな構造の JSON データを、

```json
{
  "a": "123",
  "b": {
    "bbb": "456",
    "bcc": "789"
  }
}
```

こう出力したいものとする。

```csv
"a","123"
"b.bbb","456"
"b.bcc","789"
```

やや無理やりだが jq でやりたくなったので書いた。

```
jq -c -r \
   'def walk(k): k as $k | \
        to_entries | \
        .[] | \
        {key: ($k + .key), value: .value} | \
        .key as $key | \
        ( select(.value | type | .=="string") // (.value | walk($key + ".")) ); \
    walk("") |\
    [ .key, .value ] |\
    @csv'
```

## to_entries と walk関数

1. to_entries で `key: value` を `{ key: "key", value: "value" }` に変形する
2. select で `value` の値ごとに分岐させる。今回は「文字列だったらそのまま出力、そうでなかったら walk 関数を再帰呼び出し」としている。`A // B` は AがなかったらBが評価されるショートサーキット的な動き。