OmniAICreator/Qiita-1.07M huggingface dataset:
Windows向けBase64デコードのバッチ作成

POWLOAD（マクロ有効化するとPowershell起動して通信）の検体を解析する際に
powershellで実行される引数がBase64でエンコードされていることが多いので、効率化のためにバッチを作成したので共有です。

#使い方
1.バッチを実行するとコピペ待ちになるので、デコードしたい文字列を貼り付け
2.デコードされた文字列がクリップボードにコピーされます

#バッチファイルの中身
```
@ECHO OFF
setlocal

pushd "%~dp0"
REM 変数定義
SET /P BASE64_STR="Input encoded strings: "
SET BASE64_START=-----BEGIN CERTIFICATE-----
SET BASE64_END=-----END CERTIFICATE-----
echo %BASE64_START%%BASE64_STR%%BASE64_END% > before.txt

REM Decodeを実行する、元ファイルの削除、デコード結果のクリップボードコピー
certutil -decode before.txt after.txt
del before.txt
type after.txt | clip
del after.txt

ECHO Succesfully encoded. Check your clipboard.

pause
```

#参考情報
WindowsのCertutilコマンドを使っています。

共有フォルダ上で実行することが多そうだったので冒頭でpushdでカレントパスを指定しています。
これでネットワークファイル共有上でもエラーが出なくなるっぽいです。

#追記
powershellを呼び出すことでワンラインでシンプルに実行可能というアドバイスを頂きました！
@kfjt さんありがとうございます！

```
@ECHO OFF

SET /P BASE64_STR="Input encoded strings: "

powershell -command "[Convert]::ToBase64String(([System.Text.Encoding]::Default).GetBytes('%BASE64_STR%'))" |clip

ECHO Succesfully encoded. Check your clipboard.

pause
```


また、フォルダパスに＆が含まれた際にエラーが発生すること可能性がありましたので、下記のようにダブルクオーテーションで囲むように修正しました。
pushd %~dp0　→　pushd "%~dp0"
@zarukishi さん、ありがとうございます！
Flutter AndroidでもiOS風の画面遷移とスワイプで戻るを有効にする


## PageTransitionsTheme

`ThemeData.pageTransitionsTheme` を設定することで、画面遷移のトランジション（アニメーション）を `Theme` 経由で制御できる。

デフォルトでは`PageTransitionsTheme` というクラスが使われ、内部では以下のようなMapになっており、Androidでは `FadeUpwardsPageTransitionsBuilder` が使われる。

```dart
<TargetPlatform, PageTransitionsBuilder>{
  TargetPlatform.android: FadeUpwardsPageTransitionsBuilder(),
  TargetPlatform.iOS: CupertinoPageTransitionsBuilder(),
  TargetPlatform.macOS: CupertinoPageTransitionsBuilder(),
};
```

コンストラクタでプラットフォームごとの `PageTransitionsBuilder` の対応Mapを渡せばカスタマイズできる。もし AndroidでもiOS風の遷移をさせたければ `CupertinoPageTransitionsBuilder` を使う。

```dart
MaterialApp(
  theme: ThemeData(
    pageTransitionsTheme: const PageTransitionsTheme(
      builders: <TargetPlatform, PageTransitionsBuilder>{
        TargetPlatform.android: CupertinoPageTransitionsBuilder(), // iOS風
        TargetPlatform.iOS: CupertinoPageTransitionsBuilder(),
        TargetPlatform.macOS: CupertinoPageTransitionsBuilder(),
      },
    ),
  ),
  home: const YourHomePage(),
);
```

あるいは `PageTransitionsTheme` を継承して `buildTransitions` をoverrideしてしまう方法もある。

```dart
class MyPageTransitionsTheme extends PageTransitionsTheme {
  const MyPageTransitionsTheme();

  // すべてこれを使う
  static const PageTransitionsBuilder builder = CupertinoPageTransitionsBuilder();

  @override
  Widget buildTransitions<T>(
    PageRoute<T> route,
    BuildContext context,
    Animation<double> animation,
    Animation<double> secondaryAnimation,
    Widget child,
  ) {
    return builder.buildTransitions<T>(route, context, animation, secondaryAnimation, child);
  }
}
```

## MaterialPageRoute

なお `PageTransitionsTheme` を参照してくれるのは `MaterialPageRoute` なので、遷移時は `MaterialPageRoute` を使う。

```dart
Navigator.of(context).push(MaterialPageRoute<void>(
  builder: (BuildContext context) => const YourSecondPage(),
));
```

## 他のPageTransitionsBuilder

Flutterに最初から用意されている `PageTransitionsBuilder`

* FadeUpwardsPageTransitionsBuilder: FlutterにおけるAndroidの標準
* CupertinoPageTransitionsBuilder: iOS 風
* OpenUpwardsPageTransitionsBuilder: Android P 風
* ZoomPageTransitionsBuilder: Android 10 風
EC2(インスタンス)が削除されて残ってしまったボリュームの削除


#問題
複数ボリューム持ちのAMIからインスタンス作成時、「終了時に削除」にチェックを忘れると、インスタンスを終了してもボリュームが迷子になって残る。
存在監視より定期的に掃除しましょう。

#lambda

```python:python3.8
import json
import boto3

def lambda_handler(event, context):
    client = boto3.client('ec2', region_name='ap-northeast-1')
    
    res = client.describe_volumes(
        Filters = [
            {'Name': 'status', 'Values': ['available']}
            ,{'Name': 'tag:lambda', 'Values': ['delete me']} #status条件だけで足りない時
        ]
    )
    #print(res)
    
    for vol in res['Volumes']:
        volId = vol['VolumeId']
        print(volId)
        
        volres = client.delete_volume(
            VolumeId=volId
            #,DryRun=True|False
        )
        print(volres)

    return {
        'statusCode': 200,
        'body': json.dumps('OK')
    }
```

# トリガー
 * CloudWatchで毎日キック
 * 削除なので開発環境で確認してさらに、本番リリースは手動実行後、一日祈ってからトリガーを追加した^^;;

```bash:cron
0 1 * * ? *
```


#ロール

EC2, CloudWatchの権限追加

#参考
 * [delete_volume(**kwargs)](https://aws.amazon.com/jp/premiumsupport/knowledge-center/ebs-volume-snapshot-ec2-instance/)
 * [EBS ボリュームまたはスナップショット情報を一覧表示](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ec2.html#EC2.Client.delete_volume)
React-Nativeのinitを実行しようとしたら、Error: Cannot find moduleとエラー表示がされる。(windows10)

##実行環境

・OS: Windows10
・react-native-cli: 2.0.1
・react-native: 0.61.5
・Python 3.7.0
・javac 11.0.2
・Android Debug Bridge version 1.0.41
　Version 29.0.5-5949299


公式ページ
######https://facebook.github.io/react-native/docs/getting-started.html
になぞらえてReact-Nativeを始めようと思ったら、最初のinitでいきなり躓きました。

起きたエラーというのが、

######npx react-native init AwesomeProject

というコマンドを実施すると↓のように表示されるというもの。
![react-native-error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520057/f437821c-840a-5c3b-6c87-facb4e10de5d.png)

######Error: Cannot find module 'C:\Users\user\AppData\Local\Temp\rncli-init-template-＊＊＊＊＊＊\node_modules\react-native\template.config


解決策としてyarnで実行してみる、
react-nativeとcliのバージョンを変えてみる、
npm uninstall -g react-native-cliを実行した後、再度インストールし直すなど、
色々と試しましたが、このエラーは消えませんでした。

しまいにはwindow10では現時点ではエラーが発生するため、
次のバージョンアップを待つしかない、といった記事も見つけたりして途方に暮れていました。

しかしそんなとき、以下の方法で試してみたら、
無事上手くいきました。

#####コマンドプロンプトを「管理者として実行」する。
#####↓
#####npm uninstall -g react-native-cli
#####↓
#####npm install -g react-native-cli
######↓
#####react-native init MyApp

これで無事成功しました！

![react-native.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520057/331eb047-0925-c6ec-eec6-3a5e7efb7c47.png)


解決策がまったく見つからなかったので記事にしてみました。
お困りの方は是非試してみてください。

(実は公式の一番上に、管理者で実行するよう書いてあるのですが、
pythonとjdkが導入済みだったためスルーして気づきませんでした。)
Controller createアクション ストロングパラメーター

#Controller createアクション#
###ストロングパラメーターとは###

Web画面から送られてきたデータを保存(create)する時に､安全に保存する仕組み｡
"groups_controller.rb"のprivateよりも下の部分。

```rb:groups_controller.rb

  def create
    @group = Group.new (group_params)  #paramsメソッドを使用。 ストロングパラメータを引数として記述。
    if @group.save
      redirect_to root_path, notice: "グループが作成されました"  #cretaeされたらrootに移動。
    else
      render :new
    end
  end
　　・・・
　　(省略)
　　・・・
private  #まずはprivateを記述。
  def group_params  #privateを記述してにストロングパラメーターを定義。
    params.require(:group).permit(:name, user_ids: [])  #reguireメソッドとpermitメソッドを使用
  end
```

###params
送られてきた値を受け取るメソッド

###.requireと.permit
requireメソッドでオブジェクト名を定義する。
permitメソッドで保存処理を許可する項目のキーを記述。

これで､Web上から悪意のあるデータが送られてきたとしても､許可している項目しか保存処理されない｡
RaspberryPi Bluetoothレシーバー(スピーカー)構築について

この間 "balenaOSを用いて簡単にラズパイBluetoothレシーバを構築する" という記事を書いた。改めてこの記事について深堀りしたいと思う。

この間の記事
https://qiita.com/ksmndevelop/items/39bbb650ef21798f89fb

#そもそもbalenaOSとは
balenaCloudについてはここでは触れない。
検索しても日本語のページが少ないため一応簡単に説明しておく。

balenaOS公式ページに書いてある。
https://www.balena.io/os/

> "最新のソフトウェア開発ツールを接続ハードウェアの世界にもたらすプラットフォームであるbalenaCloudの構築を目指して、2013年にDockerをARMチップに移植することから始めました。"

と記載どおりDockerをARMに移植するために始めたとのこと。
要するにほぼDockerコンテナだけを動かすOSと言えるだろう。
Dockerだと簡単にIoT環境構築できるためとても汎用的。

公式からの画像
![flow-desktop@1x-291bec507a7c6ed12a8d2d7e282c4a0b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543063/c5115c44-d777-44b9-3c1c-442fac157cf2.png)

#balenaOSの利点
 - Dockerコンテナをほぼ直接動かしているため動作が軽快（X Window などGUIではなくCUI環境のためOSが軽い）
 - ラズパイのようなシングルボードコンピュータにほぼ対応していおり同じ環境が簡単につくれる
 - balena Cloud上でコードデプロイするためネット環境さえあればどこでも遠隔操作が簡単に可能
 - balena Cloud上でデバイスの状態をGUIで監視、操作するため複数のデバイスを誰でも簡単に管理操作ができる。
 - 
 つまりIoT環境がとても簡単に構築できるということ。

#balenaOSでできること
ラズパイでBluetoothレシーバを構築したように他にも様々なプロジェクトを構築できる。

・WEBフレーム
　YouTubeやGoogleフォトに保存した画像等をディスプレイに表示する。"balena DASH"というプロジェクトコードを利用する。
30分でつくれると書いてある。。
https://www.balena.io/blog/make-a-web-frame-with-raspberry-pi-in-30-minutes/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543063/1f463e5a-9517-420b-2fcc-c3dcafd34d78.png)

・エアーモニター
　室内環境をセンサーを用いて監視できるようにする。"balena Sense"というプロジェクトコードを利用する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543063/97734aaa-2529-d860-f40a-d6b8dfdc35ab.png)

この他たくさん構築出来るようなのでbalena blogを参照してほしい。
https://www.balena.io/blog/

#今回構築したラズパイBluetoothレシーバの詳細
構築方法しか書かなかったためここでコードについて少し記述する。
balana Soundのコード(Github)
https://github.com/balenalabs/balena-sound/

Bluetoothについてのコードを見てみる。
https://github.com/balenalabs/balena-sound/blob/master/bluetooth-audio/Dockerfile.template
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543063/1d08715d-0a5c-dfc0-0ab7-d1c38e1da27d.png)
`RUN install_packages` の行をみると `alsa-utils` `bluealsa` `bluez` `python-project` `python-dbus` `python-gpiozero` `mplayer`を利用していることがわかる。
ラズパイで一般的にraspbian上でレシーバー化するにはbluezを使うのだが、balena Soundもやはりbluezを利用していた。
raspberianでコマンドをそれぞれ打ってインストールしてやるより簡単ではあるが、ほぼ環境は同じと言えよう。

次にAirplayのコードを見てみる。
https://github.com/balenalabs/balena-sound/blob/master/airplay/Dockerfile.template
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543063/cc83533b-4bd2-8415-3a83-58afe96a3bc8.png)
これもラズパイで一般的にAirplayを利用する際に使われる`shairport-sync`が使われている。

さらにSpotifyConnectのコード。
https://github.com/balenalabs/balena-sound/blob/master/spotify/Dockerfile.template
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543063/d9437c5a-339b-d2f6-ffa1-c82d9fa67648.png)
どうやら"raspotify"が使われているらしい。
raspbianでも構築可能。(もともとそっち用)
https://dtcooper.github.io/raspotify/

言わずもがなであるがraspbianで構築した方法とほぼ一緒だった。

#まとめ
今回は以前の投稿の詳細として追記した。raspbianでも同じような環境を作れると思うがbalenaOSでとても簡単にできることがより一層理解できたと思う。
超使いやすい掲示板を無料かつ一時間で作ってみた　（「東大生用のBBS」と「京大マップ掲示板」の避難所を作成しました）

# 「京大マップBBS」が話題に

https://twitter.com/kyodai_map/status/1221575091420459008

> 京大マップ
@kyodai_map
【新機能追加】
京大マップでは新しい機能として京大マップ掲示板をリリースしました！誰でも匿名でスレッドを作ったり、そのコメントに対してコメントすることができます。普段はつながれない人とつながれるかも!?
掲示板のサイトはこちら→https://bbs.kyodaimap.net

これを見て東大にも匿名掲示板が欲しくなりました。また、京大マップBBSが落ちていたので、ついでに避難所も作りました。（詳しくはhttps://qiita.com/utokyobbs/items/e6d04d1473b72768f5fc を参照）

# 作成の方針

モダンなdjango等でオートリロード等機能がある掲示板を作ってもpythonが動きライブラリなどインストールできるサーバーは無料でなさそうだし、（あったら教えてください）サイトは重くなりそうです。

ところで５ちゃんねるは２０年間ほぼUIが変わっていませんが、専用ブラウザが使いやすいため今も人気な掲示板の一つです。

専用ブラウザの使用感はこんな感じ。画像のサムネ表示などもできます。（https://solodc2011.com/android-app/2chmate/to-do-first-2 より引用)

<img src=https://i1.wp.com/solodc2011.com/wp-content/uploads/2016/09/2ch113-e1475142401672.png" width=50%>


シンプルで軽量な５chと互換性のあるシステムを設置し、専用ブラウザを利用するのが一番楽かと思いました。AAもはれるし。

# 作成方法

無料のサーバー
https://www.000webhost.com
に登録し、File Managerから

PHP製BBSスクリプト（絆板）
http://age.s22.xrea.com/kizuna/readme.html
を設置します。
（詳しい設置方法はurl参照）
（著作権は放棄していると明記してあります）


古い（２０１４年製）スクリプトなので000webhostの設定でPHPのバージョンを５.*にしておかないと動きません。

あとはboardnameというフォルダをコピーして好きな板を追加するだけ！

これで終了です。僕は一時間くらいかかりましたが、作成方法を知ってからは１０分くらいでできると思います。

ipアドレスのログをとったりなど細かい部分は自分好みにphpのスクリプトを書いていきます。

# 実際の使用感

生urlでアクセスすると古めかしいサイトになっています。

そこで2chの歴史が生んだ専用ブラウザを利用します。

android用
https://play.google.com/store/apps/details?id=jp.co.airfront.android.a2chMate&hl=ja

iOS用
https://apps.apple.com/jp/app/janestyle-for-5ちゃんねる-5ch-net/id1157926535


2 url追加　-> 入力画面で　https://utokyo.hostingapp.com/utokyo/ と入力して見られるようになります。
(京大マップの場合は　https://utokyo.hostingapp.com/kyotou/)


imgur経由で写真の投稿、サムネ表示ができたり、ジェスチャーでほとんどの操作ができたり、スレッド中の人気のレスや自分の投稿が着色されたり、スクロールバーでスレッドの流れがわかるなど、大変使いやすいものだと実感できると思います。

chmateの使い方は下のサイトがわかりやすいです。

https://solodc2011.com/android-app/2chmate/to-do-first-2

* 絆板のスクリプトを書かれた方は新たに汎用のブラウザ上で専ブラのようなUIを実現した掲示板を作っているみたいです。

https://qiita.com/economist/items/c48cf3a195298f857b3d#_reference-f90ca75e3b5676a5d944
IBM Cloud (softlayer) の仮想サーバーの RedHat のサブスクリプションとyumレポジトリを変更する

###3行で
- IBM Cloud の仮想サーバーの RedHat では
- サブスクリプションや yum の実行に都合が悪いことがあったので
- 変更してみた

NFR を使って OpenShift v3 を VSI にインストールしたい時などに役立つかもです

###サブスクリプションを変更してみる

サブスクリプションを変更する場合、先に Red Hat カスタマーポータルで有効なサブスクリプションがあることを確認しておきます
https://access.redhat.com/

###まずは状況確認
`subscription-manager status`
`subscription-manager config --list`

出力の中身は書きませんが、出力内の hostname や baseurl を見ると、IBM Cloud 内のドメインが指定されています。/etc/rhsm/rhsm.conf に指定があるので、これを変更していきます

- IBM Cloud で提供されているサブスクリプションを外す

`subscription-manager unregister`

＊ rhsm.conf を編集してから unregister するとしくじるので、先に unregister します。
＊一度 unregister すると戻せない？様に思います。(subscription-manager subscribe --force とか効きません）よく考えてから実行しましょう

rhsm.conf のバックアップを取って、新たに空ファイルを作る

`mv /etc/rhsm/rhsm.conf /etc/rhsm/rhsm.conf.bak`
`touch /etc/rhsm/rhsm.conf`

rhsm.conf は存在しなくてもサブスクリプションの変更はできますが、yum 実行時に使うので作っておいてください

`subscription-manager config --list`

rhsm.conf を空にしておくと、すべてデフォルト値が指定されます。[]で括られた値がデフォルト値です
都合が悪い部分があれば、バックアップした rhsm.conf.bak の中身を見ながら、空の rhsm.conf に追記します

- 新しいサブスクリプションを適用する
`subscription-manager register --force`

RedHat カスタマーポータルのユーザーIDとパスワードを入力します

- 使用したい poolid の確認。複数のpoolidがある場合、どれを利用したいか選択します
`subscription-manager list --available`

- poolid の割り当て
`subscription-manager subscribe --pool= xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`

- 確認
`subscription-manager status`

### yum の動作確認
`yum update`

エラーになります
 [Errno 14] curl#77 - "Problem with the SSL CA cert (path? access rights?)"

### pem ファイルの指定
/etc/rhsm/rhsm.conf.bak から以下の二つの行をコピーして /etc/rhsm/rhsm.conf にコピーする。二つの行は離れていますので、それぞれコピーします。

[rhsm]
repo_ca_cert = /etc/rhsm/ca/redhat-uep.pem

### 改めて動作確認
`yum update`

うまくいけば完了です

###最後に
※1 サブスクリプションのライセンス上、正しい所作なのかわかりません。自己責任でお願いします。

※2 OpenShift v4 では CoreOS の導入が必要ですが、通常のVSIだと、OSなしとかCoreOSとかは選択できないので、ベアメタルかVPCを使ってやればいいのだと思います（まだやってない）
element ui dialog を component にするとエラーが出る

element ui。
子要素にダイアログを設定するとエラーが出る。

```

app.js:112146 [Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: "visibleFlag"

found in

---> <TuuhouComponent> at resources/js/components/TuuhouComponent.vue
    <Question> at resources/js/components/Question.vue
        <Root>


```


ということで、エラーを回避するテンプレートを。

```top.vue

<template>

    <div>
        <tuuhou-component :visible="visible" @onModal="onModal(false)"></tuuhou-component>
        <el-button type="primary" @click="onModal(true)">モーダル表示</el-button>
    </div>

</template>

<script>

    export default {
        components: {
            'tuuhou-component': () => import('./TuuhouComponent.vue')
        },
        data() {
            return {
               visible: false
            }
        },
        methods: {
            onModal(visible) {
                this.visible = visible
            },
            showModal() {
                this.$emit('onModal')
            }
        }

    }
</script>

```


tuuhouComponent.vue

```

<template>

    <div>
        <el-dialog
                :visible.sync="$props.visible"
                :before-close="hideModal"
        >
              <el-button type="info" @click="hideModal">閉じる</el-button>
        </el-dialog>
    </div>

</template>

<script>
    export default {
        props: {
            visible: {
                type: Boolean
            }
        },
        methods: {
            hideModal() {
                this.$emit('onModal')
            }
        }
    }
</script>



```
python decorator使い方メモ

# decoratorに何ができるか

decoratorを使うと関数の実行前、実行後に処理を追加できます。

一度 decorator関数を定義すればdecorateしたい関数の前に@関数名と書くだけで処理を追加出来るので、部分的に違う関数をたくさん書いたり、処理をちょこっと追加したいときに便利です。

# decoratorの例

以下では関数の実行時間を測るdecorator関数check_execution_time()を定義し、適当な関数test()をdecorateしています。

```python:python
import time

def check_execution_time(func): # funcがdecorate対象
    def wrapper(*args, **kwargs): # decorate対象への引数がここに入る
        time1 = time.time() # 実行前の時間
        
        res = func(*args, **kwargs) # ここで受け取った関数を実行
        
        time2 = time.time() # 実行後の時間
        erapsed_time = time2 - time1 # 実行時間を算出
        return res, erapsed_time # 実行結果を返す
    return wrapper

@check_execution_time # decoratorを設定します
def test(n): # decorateされる関数
    sum_n = 0
    for k in range(n):
        sum_n += k
    return sum_n

sum_n, erapsed_time = test(1000000)
print('sum_k: %d' % sum_n)
print('erapsed_time: %1.3f' % erapsed_time)
```

```:output
sum_k: 499999500000
erapsed_time: 0.052
```

レッツトライ！
Objective-Cでの三項演算子

#三項演算子ブーム
iOSを書いていると三項演算子ブームがやってきませんでしょうか？

変数に入れたい値がnilだったら代わりのテキストを入れるというものです。

Objective-Cだとこう書きます。

```
NSString *str = nil;
NSString *string = str ? str: @"nilだったので代入";
```

変数が複雑になるとちょっと書きづらいですが、基本的な構造は一緒なので落ち着いて書きましょう。
baserCMSでhtmlメールをプラグインから送信するときに気をつけること

# 追記

プルリクを送り、マージされました！！
https://github.com/baserproject/basercms/pull/1340
今後はhtmlメールを送るときに以下のことをやるのは必要ないです笑

##問題
何回テストメールを送信しても

`This email was sent using the CakePHP Framework, https://cakephp.org.`
って挿入されて

ぐあああああああ

って思ってた今日この頃です。

↑をエンジニア向けに翻訳すると、
baserCMSのBcAppController->sendMail呼ぶときに、どうしてもcakePHPのデフォルトのレイアウトが読まれてしまってたのです

もともと、basercmsはhtmlメールに対応してないです。
いえ、正確に言えば対応してるんですけど↑のようになっちゃいます。
では、どうしたか。

##解決法

シンプルです。
`$option`で渡せばいいのです。


```PHP:HogePlugin/Controller/HogeController
$options = [
	'Layout'		=> 'Hoge.default',
	'template'		=> 'Hoge.template',
	'format'		=> 'html',
];
$this->sendmail($to,$subject,$viewVars,$option);
```

僕の失敗はレイアウトを指定していなかったことが問題でした。
(もちろん参照元のレイアウトはプラグインフォルダ内に作ってくださいね！)

baserにhtmlメールのプルリク送ろうかなあ、、defaultのレイアウト作るだけやもんな

##参考

https://qiita.com/materializing/items/9d7fe54435c9922a0472
https://book.cakephp.org/2/ja/core-utility-libraries/email.html#id6
[PostgreSQL]セッションをちゃんと切らないといけないよという話

##ある日

いつものようにPostgreSQLに接続しようとしたらこんなエラーが出た。
>FATAL: sorry, too many clients already

？？
謝られるようなことはしていないはずだ。
調べるとクライアントがDBの設定を超過しているらしい…。

ここでまた疑問。
自分がテストで使っているだけなのでそんなことになるはずがないのだ。

一応``select * from pg_stat_activity;``で調べてみる。

>1234 datname.hoge 0000 postgres 000.000.0.000 2020/1/29 00:00
>1234 datname.hoge 0000 postgres 000.000.0.000 2020/1/29 00:00
>1234 datname.hoge 0000 postgres 000.000.0.000 2020/1/29 00:00
> ... 以下100件

うん…使ってたねごめんね。こっちがsorryって感じだね。

原因としては。使っているサーバサイドのJavaのプログラムでDB接続を連続で行う場合

```java:db.java
try {
    Class.forName("org.postgresql.Driver");
    conn = DriverManager.getConnection(DBURL, user, password);
    Statement stmt = conn.createStatement();
    String sql = "1つ目のSQL文";
    ResultSet rs = stmt.executeQuery(sql);
    rs.close();
    stmt.close();
}catch (SQLException e){
}catch (Exception e){
}

try {
    Class.forName("org.postgresql.Driver");
    conn = DriverManager.getConnection(DBURL, user, password);
    Statement stmt = conn.createStatement();
    String sql = "2つ目のSQL文";
    ResultSet rs = stmt.executeQuery(sql);
    rs.close();
    stmt.close();
}catch (SQLException e){
}catch (Exception e){
}finally{
    try{
        if (conn != null){
            conn.close();
        }
    }catch (SQLException e){
      	    // 例外処理
    }
}
```

って感じで最後にcloseしてただけなんだけど毎回しなきゃだめだよね。
当たり前だよねってお話でした。あほすぎる。
Objective-Cで文字列の連結方法

# Swiftの記事ばかり
iOSアプリを作るときは基本的にSwiftを使いますが、仕事によってはオブCも使わざるを得ません。
そこで使い方を調べるとなかなか調べるのが困難だったりします。
たかが文字列の連結も、Swiftなら

```swift

var str1 = "ハンバーグ"
var str2 = "師匠"

var str = str1 + str2
print(str) // "ハンバーグ師匠"
```

と書けばいいのに、オブCだと

```objective_c

NSString *str1 = @"ハンバーグ";
NSString *str2 = @"師匠";

NSString *str = [NSString stringWithFormat:@"%@%@",str1, str2];
```

という書き方をしないといけません。

%@は繋げたいテキストの数だけ書きましょう。今回は2回記入です。

#追記：他の記法
```objc

NSString *str = [str1 stringByAppendingString:str2];
```
や

```objc

NSMutableString *str = @"ハンバーグ";
NSString *str2 = @"師匠";
[str appendString:str2];
```

等の方法も紹介していただけました！

やっぱりSwiftで開発をしたいですね。。。(´;ω;｀)
VSCodeでC#とF#混在プロジェクトでインテリセンスを効かせる

#結論
[VSCode OmniSharp/C# intellisense does not see Ionide/F# lib modules/namespaces][]参照

#はじめに
VSCodeにて、F#で作成した型を、C#から参照またはインテリセンスを効かせようと思ったんですけど

```powershell
dotnet add ~~.csproj reference ~~.fsproj
```

で単純に追加しただけでは見れませんでした。
方法について日本語での記事がなかったので紹介してみます。
手順の原典は
[VSCode OmniSharp/C# intellisense does not see Ionide/F# lib modules/namespaces][]
を見てください。

#試した環境

+ .NET Core SDK (global.json を反映): Version:   3.1.100
+ VSCode バージョン: 1.41.1 (system setup)

#方法

## ビルドしたfsprojのdllの位置をReferenceとしてcsprojに追加する

例を記載すると

```xml:csprojの例
  <ItemGroup>
    <Reference Include="domain.dll"> <HintPath>..\domain\bin\Debug\netstandard2.1\win10-x86\domain.dll</HintPath></Reference>
    <ProjectReference Include="..\domain\domain.fsproj" />
  </ItemGroup>
```

VSCodeで使用しているOmniSharpがF#を理解してくれないので中間言語にしてから理解させている認識です。
なので参照先はF#のコードそのものではなくC#風に変換された型になります。
またF#のコードを修正した場合は、F#単品でビルドしてからOmniSharpを再起動させないと反映されません。

#まとめ
インテリセンスが効くのと効かないのでは天地の違いがあるため、この方法を知ることができて大変助かりました。


[VSCode OmniSharp/C# intellisense does not see Ionide/F# lib modules/namespaces]:https://stackoverflow.com/questions/57666251/vscode-omnisharp-c-intellisense-does-not-see-ionide-f-lib-modules-namespaces
Sourcetreeでプッシュしてるのに反映されないとき

#ブランチ名とタグ名は別のものにするべし

見出しの通りです。
ブランチ名とタグ名を一緒にしていたら反映されませんでした。
気をつけましょう。

##Couldn't posix_spawn: error 13
この問題に対応している際にmasterブランチをマージしてみたりと色々試す中で
``Couldn't posix_spawn: error 13``というエラーが出ました。

これは大量のファイルを一気にコミットしようとすると表示されるエラーらしく
特になにもせず再度マージを試したところうまくいったのでメモリの問題でもあるようです。
エラーが出ても、落ち着いてもう一度実行したら通るかもしれません。
【rails】CarrierWave 保存できなくて嵌められる

Macを買い替えた後に、railsのcarrierwaveを使って保存できなくなってしまった。

いろいろ調査するが、だいたい「multipart: true」にする記事ばかり、、、

地道に調査を進めると、答えにたどり着いた。

```ruby:uploaders/imageuploader.rb
   include CarrierWave::MiniMagick
   process resize_to_fit: [400, 400]
```

これ！
これを消すだけでした。。

MiniMagickのgemを使うには、imagemagickのインストールとかのした準備が必要らしい。。

画像が保存できないだけで、7,8時間無駄にしてしまったので、共有です。

以上
Node cron 実行スケジュールをランダムにしたいです

 
Nodecron、puppeteerrecorderを使って、自動化プログラムを作ったのですが
実行スケジュールをランダムに実行したいです。
毎分の実行や、毎分何％の確率で実行などは調べて出てきたのですが、
分、秒数をランダムで実行したいです。

例えば
プログラムを実行したら毎分30分ごとに
29分48秒で実行
17分26秒で実行
10分54秒で実行
のようにしたいと思っております。


const cron = require('node-cron');
cron.schedule('*/30 * * * * ', () =>

この後にプログラムを書いているのですが、これですと毎分きれいに30分ごとの実行になってしまいます。
プログラミングを始めたばかりで質問も初めてなのですが、よろしくお願いいたします。
firebaseui で TypeError: Cannot read property 'auth' of undefined って言われる時

# 現症
firebaseui を使おうとすると以下のようにエラーになる

## Chrome
```bash:
webpack-internal:///./node_modules/vue/dist/vue.runtime.esm.js:620 [Vue warn]: Error in mounted hook: "TypeError: Cannot read property 'auth' of undefined"

TypeError: Cannot read property 'auth' of undefined
```

## Safari
```bash:
[Vue warn]: Error in mounted hook: "TypeError: undefined is not an object (evaluating 'new firebaseui__WEBPACK_IMPORTED_MODULE_1__["default"].auth')"

TypeError: undefined is not an object (evaluating 'new firebaseui__WEBPACK_IMPORTED_MODULE_1__["default"].auth')
```

##Firefox
```bash:
Vue warn]: Error in mounted hook: "TypeError: firebaseui__WEBPACK_IMPORTED_MODULE_1__.default is undefined"

TypeError: "firebaseui__WEBPACK_IMPORTED_MODULE_1__.default is undefined"
```

# 対処
firebase と firebaseui の import を以下のように変える

```vue:
/*
import firebase from "firebase";
import firebaseui from 'firebaseui';
import "firebaseui/dist/firebaseui.css";
*/

import "firebaseui/dist/firebaseui.css";
import * as firebase from "firebase/app";
import "firebase/auth";
import * as firebaseui from 'firebaseui';
```

# references
https://stackoverflow.com/questions/56659510/firebase-auth-typeerror-module-is-undefined/56791881#56791881
python *args, **kwargs 使い方メモ

## 何ができるのか

いくつ来るか分からない引数をまとめて受け取れます。

## 位置引数
*args にtupleで入ります

```python:python
def test(*args, **kwargs):
    print(args)
    print(kwargs)
    
test(1, 2, 'hoge')
```

```:output
(1, 2, 'hoge')
{}
```

## キーワード引数
**kwargs にdict()で入ります。

```python:python
def test(*args, **kwargs):
    print(args)
    print(kwargs)
    
test(1, 2, 3, 4, 5, col=4, row=5)
```

```:output
(1, 2, 3, 4, 5)
{'col': 4, 'row': 5}
```

## 該当する引数がない場合

空のtuple()と空のdict()になります。

```python:python
def test(*args, **kwargs):
    print(args)
    print(kwargs)
    
test()
```

```:output
()
{}
```

## **kwargsから値を受け取る

kwargs.get('hoge')とすると引数が渡されなかった場合はNone、引数が渡されている場合は値を受け取ることが出来ます。

```python:python
def func(*args, **kwargs):
    print(kwargs.get('a'), kwargs.get('b'))

test(a=10)
test(b=123)
```

```python:output
10 None
None 123
```

## wrapper関数で使うと便利

受け取った引数をそのまま渡せちゃいます

```python:python
def func1(a, b, c=2):
    d = a + b * c
    return d

def func2(*args, **kwargs):
    d = func1(*args, **kwargs)
    return d

print(func2(1, 2))
print(func2(1, 2, c=5))
```

```:output
5
11
```

## 引数名は変更できる

じつは * の数が同じなら引数名は自由に変更できます。*argsの代わりに *a, *hogeなどでも良いし、**kwargsの代わりに **b, **fuga などでも同様に動きます。

```python:python
def test(*a, **b):
    print(a)
    print(b)
    
test(1, 2, 3, 4, 5, col=4, row=5)
```

```:output
(1, 2, 3, 4, 5)
{'col': 4, 'row': 5}
```

レッツトライ！
【Unity(C#)】UniRxを使った無敵時間の実装

##無敵時間

ゲームを作っているとよく実装したくなる無敵時間ですが、
UpdateとOnTriggerEnterなどで実装するとなると少し頭を捻ります。
(少なくとも私は。。。)

そこで、UniRxを使うことにしました。
特に当てはなかったのですが、UniRxならいい感じのオペレーターが既にあるだろう
と思って探してみたら、やはりありました。

下記リンクで「まさにこれだ！」ってのがあったので
メモ残します。

【参考リンク】：[UniRx オペレータ逆引き](https://qiita.com/toRisouP/items/3cf1c9be3c37e7609a2f#%E6%99%82%E9%96%93%E3%81%AB%E7%B5%A1%E3%82%93%E3%81%A0%E5%87%A6%E7%90%86)

##ThrottleFirst
直訳(最初の一回の絞り弁)通りの意味で
最初に発行された値が通ったあと、
引数で指定した時間分だけ値を遮断してくれます。

```C#
 this.OnTriggerEnterAsObservable()
            .Where(collision => collision.gameObject.tag == "Enemy")
            .ThrottleFirst(TimeSpan.FromSeconds(遮断したい秒数))
```

あとは`Subscribe`の中でコルーチンを動かして
残りの細かい処理を委譲して完成です。


##コード

コルーチンを使っているので重複して動かないようにだけ気を使いました。

Rxの導入により非常にシンプルに実装できました。

```C#
using System;
using System.Collections;
using UnityEngine;
using UniRx;
using UniRx.Triggers;
using System.Linq;
/// <summary>
/// Playerにアタッチ
/// </summary>
public class PlayerDamaged : MonoBehaviour
{
    [SerializeField]
    Material damageMaterial, normalMaterial;

    [SerializeField]
    AudioSource damageSound;

    Coroutine damageEffectCoroutine;

    float invincibleTime = 1.0f;

    MeshRenderer playerMeshRenderer;

    void Start()
    {
        playerMeshRenderer = this.gameObject.GetComponent<MeshRenderer>();

        //敵に当たったら音が鳴ってマテリアル変更→無敵時間を作って終わったらマテリアルを元に戻す
        this.OnTriggerEnterAsObservable()
            .Where(collision => collision.gameObject.tag == "Enemy")
            .ThrottleFirst(TimeSpan.FromSeconds(invincibleTime))
            .Subscribe(_ =>
            {
                if (damageEffectCoroutine != null)
                {
                    StopCoroutine(damageEffectCoroutine);
                }

                damageEffectCoroutine = StartCoroutine(DamageEffect());
            })
            .AddTo(this);;
    }

    IEnumerator DamageEffect()
    {
        Debug.Log("Damage");

        damageSound.Play();

        playerMeshRenderer.material = damageMaterial;
        yield return new WaitForSeconds(invincibleTime);
        playerMeshRenderer.material = normalMaterial;

        if (damageEffectCoroutine != null)
        {
            damageEffectCoroutine = null;
        }
    }
}
```

##デモ

音が無いのでわかりにくいですが、
しっかりと無敵時間が反映された挙動となりました。

![CubeAdventure5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/933d4054-1bba-f8a9-2539-9264bfab9725.gif)
二重for文で九九

```java
    
public class Sample {

	public static void main(String[] args) {
		for(int i=1; i<=9;i++) {
			for(int j=1; j<=9; j++) {
				//i*jが１０未満なら前後に空白
				if(i*j<10) {
				System.out.print(" "+i*j+" ");
				}
				//i*jが１０以上なら後ろに空白
				else {
					System.out.print(i*j+" ");
				}
			}
			//jの値が９の時に改行
			System.out.print("\n");
		}
	}}
論文の執筆

# はじめに
卒論が近づいてきました．
備忘録として論文の執筆する手順を残しておきます．

# 対象
理系

# 執筆手順
1 [松尾ぐみの論文の書き方](http://ymatsuo.com/japanese/ronbun_jpn.html)を30分を目処にざっと読む．
2 ライティングの教科書を読む．
3 それぞれの概要から書き込んでいく．
4 subsectionレベルの細かい内容の記述も行っていく．
流れ解析のための有限要素法

`

```{r}

#p.26 修正中です

N=10

x=c(1:N)

u=sample(1:100,N,replace=T)

a_b=array(0,dim=c(2,N-1))

lam=1

integral=c()

for(i in 1:(N-1)){
  
u_vec=u[i:(i+1)];x_vec=x[i:(i+1)]

mat=cbind(rep(1,2),x_vec)

alpha=solve(mat)%*%u_vec

a_b[,i]=alpha

u_f=function(x){
  
N=c((x_vec[2]-x)/(x_vec[2]-x_vec[1]),(x-x_vec[1])/(x_vec[2]-x_vec[1]))

return(lam*sum(N*u_vec))
  
}
  
u_f2=function(x){

l_k=c(-1/(x_vec[2]-x_vec[1]),1/(x_vec[2]-x_vec[1]))

N=c((x_vec[2]-x)/(x_vec[2]-x_vec[1]),(x-x_vec[1])/(x_vec[2]-x_vec[1]))

return(as.numeric(l_k%*%t(t(u_vec)))*as.numeric(N%*%u_vec))

}

#monte carlo integral

Y1=0;Y2=0

n=100000

x1=sample(seq(x_vec[1],x_vec[2],0.001),n,replace=T);x2=sample(seq(x_vec[1],x_vec[2],0.001),n,replace=T)

for(j in 1:(n)){
 
Y1=Y1+u_f(x1[j]);

Y2=Y2+u_f2(x2[j])  
  
}

#monte carlo積分値
print(Y1/n);print(Y2/n)

integral=c(integral,Y1/n+Y2/n)  
  
}


u_dif=u[2:length(u)]-u[1:(length(u)-1)]

cor(integral,u_dif)

```

```{r}

#p.48

x=c(0,1,2);y=c(1,0,2)

pthi=sample(1:10,3)/10

mat=cbind(rep(1,3),x,y)

a=solve(mat)%*%pthi

delta=det(mat)/2

A1=(x[2]*y[3]-x[3]*y[2])/(2*delta)

A2=(x[3]*y[1]-x[1]*y[3])/(2*delta)

A3=(x[1]*y[2]-x[2]*y[1])/(2*delta)

B1=(y[2]-y[3])/(2*delta)

B2=(y[3]-y[1])/(2*delta)

B3=(y[1]-y[2])/(2*delta)

C1=(x[3]-x[2])/(2*delta)

C2=(x[1]-x[3])/(2*delta)

C3=(x[2]-x[1])/(2*delta)

#N1==1

A1+B1*x[1]+C1*y[1]

#N2==1

A2+B2*x[2]+C2*y[2]

#N3==1

A3+B3*x[3]+C3*y[3]



B=c(B1,B2,B3);C=c(C1,C2,C3)

#(3.33)

G=(t(t(B))%*%t(B)+t(t(C))%*%t(C))*delta


#重みの最適化(pthi_e,pthi_k)でよいか？

Q_k=c(10,20)

#境界をc(0,1)->c(2,2)

L_k=sqrt((x[3]-x[2])^2+(y[3]-y[2])^2)

H=L_k*matrix(c(2,1,1,2),ncol=2)/6

pthi_e=rep(1,3);pthi_k=rep(1,2)

cost=function(pthi1,pthi2){
  
return((as.numeric(t(c(pthi1))%*%G%*%pthi)-as.numeric(t(c(pthi2))%*%H%*%Q_k))^2)  
  
}


ite=100

r=0.001

for(l in 1:ite){
  
vec=pthi_e

for(j in 1:length(pthi_e)){
  
vec_sub=vec;vec_sub[j]=vec_sub[j]+0.01

pthi_e[j]=pthi_e[j]-r*(cost(vec_sub,pthi_k)-cost(vec,pthi_k))/0.01
  
}

vec=pthi_k

for(j in 1:length(pthi_k)){
  
vec_sub=vec;vec_sub[j]=vec_sub[j]+h

pthi_k[j]=pthi_k[j]-r*(cost(pthi_e,vec_sub)-cost(pthi_e,vec))/0.01
  
}
  
print(cost(pthi_e,pthi_k))

}



```
vue.js 子要素から親要素へdata値を渡す

子要素。
つまり、読み込んだコンポーネントから親要素を操作したい。

# 子要素

```

methods: {

    hoge(){
        //親要素 の tuuhouClose を動かす
        this.$emit('tuuhouClose');
    }
},

```

# 親要素

```

<tuuhou-component @tuuhouClose="tuuhouClose"></tuuhou-component>

---

methods: {

    tuuhouClose(){
        this.dialogVisible = false;
        this.tuuhouVisible = false;
    },


```

これで 子要素の hoge() を動作させた時、親要素の tuuhouClose() を動作させることができる。
evernoteでgmailの自動転送をする

外部サービスを使わず、Gmailとevernoteのみでメールを自動転送するやり方をメモ。ただし、要プレミアムプラン。

# 追記(2020/02/11)
自動振り分けの精度が低く、あまり当てにならないかもしれない……

# はじめに
evernoteを使い始めて5年、来年からの社会人生活も考慮し、プレミアムに課金してしまった。早速、記憶が間違っていなければプレミアム特権のメールの転送を、使ってみたいと思う。

ここでは外部サービスを使わず、私的なGmailアカウントのスター付きメールを受信次第、すぐに転送して、自動振り分けしてくれるように設定する。

# ステップ1「Gmailに転送先アドレスを登録する」

1. Evernoteでメールの転送先を確認する
    - Web版ならアカウント>アカウントの概要に記載されている
    - Windows版なら使用量>メールの転送先
    - 右クリックでコピーできる
1. Gmailで「設定」から「メール転送とPOP/IMAP」を選択する
1. 転送>転送先アドレスを追加から、Evernoteの転送アドレスを入力する
1. Gmailから確認コードがEvernoteに送られてくるので、確認コードをGmailに入力する
    - ノートの形で送られてくる(初めは戸惑う)
1. 入力が正常であれば、Gmailに転送先アドレスが登録される

# ステップ2「Gmailにフィルタリングと処理を登録する」
1. Gmailで検索ボックス「メールを検索」で「is:starred」と検索する
1. 検索ボックス右側の▼(三角マーク)を押し、条件を確認し「フィルタを作成」
    - 注意書きが出るので、確認した後、OKを選択する
1. 「この検索条件に一致するメールが届いた時」で「次のアドレスに転送する」から「アドレスを選択」でステップ1のevernote転送アドレスを選択
1. フィルターと処理を登録したら、設定で確認
    - 下の画像のようになっていればOK(一部加工済)
![evernote_white.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263888/2618a715-e80d-063a-7ecb-556a1cb7e8f0.png)


つまり「is:starred」でメールを絞り込みし、そのメールに対し転送の処理をかけている。絞り込み条件は下記も参考に、「重要なメール」「特定のタグ」「特定の送り主」なども指定可能。
[https://support.google.com/mail/answer/7190?hl=ja](https://support.google.com/mail/answer/7190?hl=ja)
# ステップ3「Evernoteの自動振り分けを許可する」
ステップ2までで基本はOKなものの、これをやると「既定のノートブック」として登録されている場所に、スター付きメールが押し寄せることになる。この為、メール転送の自動フィルタリング設定を変更する。

1. EvernoteのWeb版を開く
1. アカウント>個人設定>自動フィルタリングから「メール転送で作成されたノートの保存先やタグを自動提案します。」にチェックを入れる

これで、何度か振り分ければ、勝手に処理してくれるはず。便利！
# 参考リンク「手動転送なら自動振り分けも可能」
Evernote公式の情報によれば、件名に以下のようなものを指定すると、自動タグ付けや自動ノートブック振り分けができるという。
>「!」リマインダー: エクスクラメーションマーク（!）を使用するとリマインダーを設定できます。リマインダーに日時を設定するには、明日の場合は「!tomorrow」を挿入します。具体的な日付の場合は、年月日の数字をスラッシュで区切り、たとえば「!2013/06/24」のような形式で挿入します。

>「@」ノートブック: 例えば「@旅行」のように @ マークとノートブック名を使って指定しない限り、デフォルトのノートブックに送信されます。ノートブックの名前に空白スペースがある場合、例えば「@海外旅行」のように、そのまま記載してください。
>「#」タグ: 例えば「#札幌」「#北海道」のようにハッシュ記号 (#) を使用してタグを追加します。

引用元:[https://help.evernote.com/hc/ja/articles/209005347](https://help.evernote.com/hc/ja/articles/209005347)

ということなので、こちらも使用機会がありそう、ぜひ確認したい。

# 番外編「Evernote for Gmailアプリを導入する」
自動転送ではないものの、これも便利なのでご紹介。GmailのアドオンにEvernoteがある。

1. WebブラウザでGmailを開く
1. サイドパネルを開き、アドオンを取得から「Evernote for Gmail」を取得
    - 多分右側にある
    - この際、evernoteの認証を求められる

# 番外編「IFTTTやZapierなどの自動化ツールを使う」
- どうやらIFTTTはGmailと連携できなくなった模様
    - [https://internet.watch.impress.co.jp/docs/yajiuma/1176187.html](https://internet.watch.impress.co.jp/docs/yajiuma/1176187.html)
- zapierは使用可能のはず、ただ試していない

# その他Evernoteの活用方法
下記なども確認のこと

[https://evernote.com/blog/jp/11-ways-save-stuff-evernote/](https://evernote.com/blog/jp/11-ways-save-stuff-evernote/)
NNの中間層の値の取得

今回はオートエンコーダについてやってみた。
オートエンコーダについて簡単に説明すると、入力層と出力層の次元数を一致させて中間層をそれよりも少ない次元で学習させる仕組みのこと。
実際の活用には異常検知であったり、ノイズ除去等の特徴抽出において使われるそう。
#オートエンコーダのモデル
```nn.py
model = Sequential()
model.add(Dense(50, activation='relu', input_dim=len(x_train[0])))
model.add(Dense(len(x_train[0]), activation='sigmoid'))
model.compile(optimizer='adadelta',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
model.fit(x_train, y_train,
            batch_size=100,
            epochs=10,
            verbose=1,
            validation_data=(x_test, y_test))
```
上記でオートエンコーダモデルを作成・学習
中間層は50にしたがどの程度が良いのかは不明

#中間層の抽出
ふと気になり中間層はどうやって取り出したらいいのか気になった。
調べてみたところ、何のことはない。出力層を変えればいいだけのこと。

ちなみに普通に出力する場合はこう。

```
model.predict(data)
```

これを中間層の出力に変えるためにmodelを編集する必要がある。
まず作成したモデルの概要を見てみる

```
model.summary()

'''
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 50)               424500    
_________________________________________________________________
dense_2 (Dense)              (None, 848)               424848    
=================================================================
Total params: 849,348
Trainable params: 849,348
Non-trainable params: 0
_________________________________________________________________
​
'''
```

中間層の名前はdense_1となっている事を確認
そしたらモデルを変える

```
middle_model = Model(inputs=model.input,
                     outputs=model.get_layer(layer_name).output)
middle_output = middle_model.predict(data)
```

middle_modelは入力層と出力層だけの1層になるね
これで中間層の値がmiddle_outputに出る

おしまい
TypeScript+Express+Clean Architectureの開発へ参加する時に読んだ記事

## 概要
新卒で入社してからAndroidアプリエンジニアを約2年半近く続けていましたが、WebアプリやAPIの開発にも挑戦したいと思い、今年からAndroidアプリエンジニアをお休みして、Webの開発に参加しています。

アサインされたプロジェクトでは、TypeScriptやフレームワークとしてExpressが使用されていたのですが、JavaScriptでの開発経験も初学者レベルでしかなかったので、とりあえず文法とか覚えようと思った時に見たやつをメモとして残してます。

## JavaScript
- [(Qiita) イマドキのJavaScriptの書き方2018
](https://qiita.com/shibukawa/items/19ab5c381bbb2e09d0d9)  
- [(Qiita) JavaScript入門
](https://qiita.com/atsuk0r0/items/837df80b81facd2829fa)

## Node.js + Express
- [(公式) Node.js ドキュメント](https://nodejs.org/ja/docs/)
- [(Qiita) Express(Node.js)チュートリアル
](https://qiita.com/marchin_1989/items/856172b2958701d42808)

## TypeScript
- [(公式) TypeScript Documentation](https://www.typescriptlang.org/docs/home.html)
- [(Qiita) TypeScript超入門(2)：構文を理解する](https://qiita.com/ringtail003/items/7ccf992f18b768e0e633)
- [(Qiita) TypeScriptでExpress.js開発するときにやることまとめ (docker/lint/format/tsのまま実行/autoreload)
](https://qiita.com/yuukive/items/012bdf1b9ff3881546b3)
- [(Qiita) 関心の分離を意識してサーバーを作ってみる(TypeScript + Express)
](https://qiita.com/sadnessOjisan/items/ea5590efa3f55ef56edd#%E7%99%BB%E5%A0%B4%E4%BA%BA%E7%89%A9%E3%81%A8%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E6%95%B4%E7%90%86)
Editorでコルーチンを実行するツールを作ってみた【Unity】

# EditorCoroutines

https://github.com/tani-shi/unity-editor-coroutines

```
using UnityEngine.Coroutines;

void Run()
{
    EditorCoroutines.StartCoroutine(YourCoroutine());
}

IEnumerator YourCoroutine()
{
    Debug.Log("Start Coroutine");
    yield return new WaitForSecondsRealtime(1.0f);
    Debug.Log("End Coroutine");
}
```

## Getting started

`Packages/manifest.json`に以下の行を追加してください。

```
"com.tani-shi.unity-editor-coroutines": "https://github.com/tani-shi/unity-editor-coroutines.git#1.0.0"
```

# 最後に

Preview版ですが（１年以上メンテされていない？）、公式にパッケージがあるようです。

https://docs.unity3d.com/Packages/com.unity.editorcoroutines@0.0/manual/index.html
Bitriseで「developにマージされたら○○する」の設定

**[Bitrise](https://www.bitrise.io/)** は、モバイルアプリ向けのCI/CDサービスです。GitHub と Bitrise を連携して、よくある「develop ブランチにマージされたら実機確認のために DeployGate に自動デプロイ」のようなことをやろうとしたら、少し躓いたのでメモします。

# 短いまとめ

GitHub に Bitrise の Webhook が登録されているか確認しましょう！
https://devcenter.bitrise.io/jp/webhooks/adding-webhooks/

セットアップ手順が悪かったのか、Webhook の登録を飛ばしていて、それにしばらく気づかなかったというオチでした:innocent: 

こういった場合に、後から Webhook を追加し、トリガーを設定する手順を説明します。

# 手順

すでに Bitrise にリポジトリの登録や、デプロイのワークフローの作成は済ませてある前提です。

リポジトリの登録: https://devcenter.bitrise.io/jp/getting-started/adding-a-new-app/
ワークフロー: https://devcenter.bitrise.io/jp/steps-and-workflows/getting-started-workflows/

GitHub での操作と Bitrise での操作がそれぞれ必要です。

## GitHubで操作: Bitrise連携アカウントの権限設定

まず、Bitrise と連携している GitHub アカウントに、当該リポジトリの **Admin** 権限が必要です。

> * リポジトリに対する管理者権限があること
> * リポジトリをホストするアカウントがBitriseアカウントとコネクトしていること。
>
> [source](https://devcenter.bitrise.io/jp/webhooks/adding-webhooks/#%E3%82%B3%E3%83%BC%E3%83%89%E3%82%BF%E3%83%96%E3%81%A7webhook%E3%82%92%E8%87%AA%E5%8B%95%E7%9A%84%E3%81%AB%E8%BF%BD%E5%8A%A0)

リポジトリの「Settings」タブ→「Collaborators & teams」から設定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65644/ea0f2813-4df7-832e-5586-97ca633377d1.png)


## Bitriseで操作: Webhookの自動セットアップ

次に、当該 GitHub リポジトリに Bitrise の Webhook を登録します。この操作は（少しややこしいですが）Bitrise で行います。

Webhookとは: https://developer.github.com/webhooks/

Bitrise の当該アプリ管理画面で、「Code」タブ→「INCOMING WEBHOOKS」で、「SETUP AUTOMATICALLY」を選んで「Register Webhook」を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65644/9cfe4278-bed8-055c-2e19-268971437703.png)

こういう表示になれば成功です:ok_woman:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65644/978359f1-a79b-3af1-3945-c6933707df90.png)

## トリガーの設定

あとはビルドを走らせるきっかけの「トリガー」 を、「develop に push されたとき」に設定すれば完了です。

Bitrise の当該アプリ管理画面で、「Workflow」タブ→「Triggers」タブと進み、「PUSH」タブで以下のように設定します（対象のワークフローはお好みで）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65644/c7623f0f-b1b0-e1fa-d720-e7e6ed3c6050.png)

変更したら、右上のボタンでセーブするのを忘れずに:wink:


# おわりに

最初、develop に push されても一向にワークフローが実行されず、リポジトリの連携のときに Webhook も登録されるものと思い込んでいたので、原因を突き止めるのにやや苦労しました。もし似た現象で悩んでいる方がいれば、上記の設定を確認してみてください。
iframeの高さを自動調節する

親サイトにifremeを入れたときにうまく高さが指定できなかったので
参考になるサイトを探しまくりました。

# 要件
iframe。よくあるyoutube、googlemapではなく、別のサイトのiframe（クロスドメインと言う）。

iframe側の高さが動的に変わる場合（例：記事のタイトルとか、日によって文字数がかわるやつ）高さを固定すると変にスクロールがついてしまい、見た目が悪い。

## iframe使ってるってなるべく気づかれたくないときに活用できる

# サンプルコード

``` html:index.html（親）
<script>
  window.addEventListener('message', function(e) {
  var iframe = $("#parentframe");
  var eventName = e.data[0];
  var data = e.data[1];
  switch(eventName) {
      case 'setHeight':
          iframe.height(data);
          break;
      }
  }, false);
</script>
・・・
・・・
<body>
    <iframe id="parentframe" src="http://test-foo.com/" frameborder="no" scrolling="no"></iframe>
</body>
```

``` html:test-foo.html（子）
<script type="text/javascript">
  window.onload = function() {
      var height = document.getElementsByTagName("html")[0].scrollHeight;
      window.parent.postMessage(["setHeight", height], "*");
  }
</script>
```

### tips
`#parentfram`iframeにidを指定します。jsの箇所にもお忘れなく。

`frameborder="no"`はフレームの枠線の表示を非表示に指定してます
`scrolling="no"`はスクロールさせないと言う指定です
ですがどちらもHTML5では廃止されてますのでcssで指定してもいいかと思います。
↑の廃止された指定でも効くっちゃ効きます。

### 期待する結果
親のiframeに`style="height: 150px;"`とか、高さが自動で修得されてたら完成です。

``` html:index.html（親）
<iframe id="parentframe" src="http://test-foo.com/" frameborder="no" scrolling="no" style="height: 150px;"></iframe>
```

### tips
ちなみに`height: 150px`はiframeのデフォルトの高さです
おそらく最小の高さと思われます。



## 参考サイト
 [iframeに異なるドメイン（クロスドメイン）のコンテンツを読み込んで高さを自動調節する方法](http://tomoosuzuki.blogspot.com/2016/08/iframe.html "iframeに異なるドメイン（クロスドメイン）のコンテンツを読み込んで高さを自動調節する方法")
 [HTML5タグリファレンス HTML4.01からHTML5へのバージョンアップによる変更点](http://www.htmq.com/html5/iframe.shtml "HTML5タグリファレンス")

これらの参考サイトのおかげで本当に助かりました。ありがとうございます:ok_hand:

今回は使用してませんがクロスドメインでなければこちらも参考になるかもしれません
[iframe の高さが動的に変わっても親画面でスクロールバーを表示させない方法](https://webllica.com/set-iframe-height-dynamic/ "iframe の高さが動的に変わっても親画面でスクロールバーを表示させない方法")
Bitriseで「could not get icons for app」のエラーが出るときの解決法

# 問題
BitriseにSwiftUIのプロジェクトを新規追加しようとした時に、`「could not get icons for app: /bitrise/src/{ProjectName}/{ProjectName}.xcodeproj, error: not found app icon set (AppIcon) on paths: [{18BEF98823E125EA005ED009 Preview Assets.xcassets} {18BEF98523E125EA005ED009 Assets.xcassets}]」`というエラーが発生する。

# 原因
SwiftUIのプロジェクトでは、プロジェクトディレクトリの中にPreviewContent/Preview Assets.xcassetsというアセットディレクトリが存在するが、この中身が空のためにBitriseのプロジェクトスキャンのパースでエラーを吐いているようす。(Bitrise内部挙動はわからないのでエラー内容からの推測です)

# 解決法
1. Assets.xcassetsに空のAppIconのアセットを追加する。
2. 名前が本番用のAppIconとコンフリクトしてテストエラーになるのを避けるために、名前を「AppIcon」以外にする。(自分はPreviewAppIconとかにしました。)

ディレクトリごと削除しても問題なく動くが、Preview用のアセットを使いたくなったらまた問題は起こるので、空アセット追加の方が良さそうに見える。

# その他
SwiftUI利用時ではなくても、何かのミスでアプリアイコンのアセットを削除してしまった場合はこのエラーが発生しそうなので、追加してあげれば解決します。
Docker + Mysqlのdumpとrestoreでつまづいたこと色々

いろいろつらみだったので後で忘れないように残しておく

## エラー `Warning: Using a password on the command line interface can be insecure.` が出るとき

`/etc/my.cnf` とかにuserとpasswordを書いたものを読み込ませる方式にする。

```
[client]
user=ユーザー
password=パスワード
host=127.0.0.1
```

## そもそもmysqlにつなぐコマンド
↑を設定したらこんな感じでいける
`mysql --defaults-extra-file=/etc/my.cnf -P 3316`

## いろいろやってもエラーが解決されないとき
dumpしたファイルにおかしなものが混ざっていないか確認する。
エラー文だけを読んで、コマンドに問題があるのかと調べていたがdumpファイルの中でエラーが起きていた…

## restoreするコマンド
`mysql --defaults-extra-file=/etc/my.cnf -P 3316 flow_development < flow_docker20200128.sql`
Amazon Linux2 に Ansible をインストールする

# はじめに
Amazon Linux の EOL(2020/12/31まで延長された)対応ということで、
Jenkins サーバを Amazon Linux 2 へ移行!!
そんななかやった作業 Ansible のインストールのメモ
(2020/01/28 時点)
他の作業は、別エントリーで書く予定

# 環境

```
$ cat /etc/os-release
NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora"
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2"
HOME_URL="https://amazonlinux.com/"
```

# epel インストール

```
$ sudo amazon-linux-extras install epel
```

# Ansible インストール

```
$ sudo yum install ansible
```

# インストール確認

```
$ ansible --version
ansible 2.9.2
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/home/ec2-user/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.16 (default, Dec 12 2019, 23:58:22) [GCC 7.3.1 20180712 (Red Hat 7.3.1-6)]
```
AIプラットフォームからGCS上のcsvをDataFrameに格納する

#はじめに
Google Cloud PlatformのAIプラットフォームからGoogle Cloud Strage上にあるcsvを読み込み、pandasのDataFrameに格納する方法を記載します。

#実装
csvが以下に格納されているとします。

```
gs://bucket_name/folder/file_name.csv
```

上記にcsvが格納されている場合、以下のコードでDataFrameに格納することが出来ます。

```python
project_name = 'your_project_name'
bucket_name = 'bucket_name'
file_name = 'folder/file_name.csv'

#プロジェクト名を指定してclientを作成
client = storage.Client(project_name)
#バケット名を指定してbucketを取得
bucket = client.get_bucket(bucket_name)
#Blobを作成
blob = storage.Blob(file_name, bucket)
#DataFrameを作成
data = blob.download_as_string()
df = pd.read_csv(BytesIO(data))
```

#まとめ
当初、以下のように、folderをbucket_nameに記載していました。もちろん、エラーになります。

```python
project_name = 'your_project_name'
bucket_name = 'bucket_name/folder'
file_name = 'file_name.csv'
```

あとは、GCSのリージョン周りで躓いたりしたので、エラーが起こったら、その辺りを確認すればいいかなと思います。
Ubuntu 19.10へのWine5.0インストール

#はじめに
Windows7ではなんとか動いていたものの、Windows10では動かないソフト(主にゲーム)がたくさんあります。
そこでLinux上でWindowsソフトを動かすことができるWineの出番です。
アプリを動かしたいWindowsのバージョンもXp時代のものから選べます。
Ubuntu18.04LTSにはWine 3.0が入っていますが、それだとちゃんと動かない事が多いです。
Wine 5.0で(主にゲーム周りの)互換性が向上したとのことなので、入れてみようと思いました。

#Ubuntu 18.04LTSへのインストールの失敗
普通にリポジトリ追加して、aptでinstallしようとしたけど、依存関係がなかなか解決できません。
色々調べて、解決したって方法を試したんですが、それでもうまく行かず諦めました。

#Ubuntu 19.10へのアップグレード
色々調べると19.10には素直に入るとのことなので、まず19.10へのアップグレードをしました。
##まず18.04LTSを最新化します。更新がなくなるまでやります。

sudo apt update
sudo apt upgrade

そして念の為再起動

##LTS版以外にもバージョンアップできるように設定変更
LTS版をバージョンアップしようとすると次のLTS(20.04LTS)を探しにいきます。
まだ20.04LTSは出ていないので、そのままだとバージョンアップできません。
なのでLTS以外のバージョンにもアップグレードできるように、設定変更します。

[ソフトウェアとアップデート]を開き、[アップデート]タブを選択。
一番下の[Ubuntuの新バージョンの通知:]を"すべての新バージョン"にします。

![Screenshot from 2020-01-29 13-04-55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418454/6dcabbe8-9214-93d9-fdcc-e1897e31ba94.png)

##19.10(現在の最新)へのバージョンアップ
以下コマンドでアップグレードします。
2コアのAthlon　4GBメモリ　256GB SSDな環境で1時間ぐらいですかね。

sudo apt dist-upgrade

※割と途中で「適所で再起動していい？」って聞かれます。
終わりの方で「いらないファイル消していい？」とか「上書きしていい？」
とも聞かれますので、放置してたら終わらないです。

#Wine5.0のインストール
そうしたら以下を順番に実行するだけで、インストールできます

1. 32ビットアーキテクチャの有効化
`sudo dpkg --add-architecture i386`

2. リポジトリのキーのインストール
`wget -nc https://dl.winehq.org/wine-builds/winehq.key; sudo apt-key add winehq.key`

3. Wineのリポジトリを追加し、最新化
`sudo apt-add-repository 'deb https://dl.winehq.org/wine-builds/ubuntu/ eoan main'`
`sudo apt update`

4. Wine5.0のインストール
`sudo apt install --install-recommends winehq-stable`
これで終わりです。

5. 32ビット版のwineにする場合
wineを一回でも起動していない状態で
`WINEARCH=win32 wineboot`
※すでに起動してしまった後なら、.wineを消してから

#さいごに
自分の問題は解決しませんでした。
**電車でGO!2高速編 Windows版** 
上にメニューバー(ファイル(F)みたいのが出るグレーのバー)が出てくる分、ゲームの画面が削られて、肝心なところが見えません…
**電車でGO!プロフェッショナル2 for Windows98/Me/2000/XP**
マスコンの音とか警笛が最初だけですぐに鳴らなくなる。
→なぜか鳴るようになりました。メニュー画面では音が途切れるけど。
**A列車で行こう3 Windows95/98対応**
BGMが鳴らないぐらいですかね。効果音は鳴ります。

**電車でGO!プロフェッショナル仕様 Windows版**
こちらについては、全く問題なく動きます。
Pythonを用いてBigQueryのテーブルをGCSにダンプする

テーブルをCSVのGZIP圧縮形式でGCSにダンプする。

環境
* python3.7
* google_cloud_bigquery==1.9.0

コード

```python
from google.cloud.bigquery import Client
from google.cloud.bigquery.job import ExtractJobConfig, DestinationFormat, Compression, ExtractJob

client = Client(project="your_prject_id", location="US")
job_config: ExtractJobConfig = ExtractJobConfig(
    compression=Compression.GZIP,
    destination_format=DestinationFormat.CSV
)
extract_job: ExtractJob = client.extract_table(
    source="your_dataset.your_table",
    destination_uris="gs://your_bucket/hoge.csv.gz",
    job_config=job_config)

extract_job.result() # 完了を待つ
```
掲示板システム「 UTokyo BBS 」を作って見た

# 「UTokyo BBS（東大掲示板）」と「京大マップ掲示板避難所」の使い方

1 5ch互換アプリ（androidならchmate、iosならJane style）をインストール

CHMATE 
https://play.google.com/store/apps/details?id=jp.co.airfront.android.a2chMate&hl=ja
JaneStyle
https://apps.apple.com/jp/app/janestyle-for-5ちゃんねる-5ch-net/id1157926535

2 url入力画面で　https://todai.000webhostapp.com/utokyo/  と入力して見られるようになります。

(京大マップの場合は　https://todai.000webhostapp.com/kyotou/)

**楽しく使ってね！**

# 板一覧

東京大学板
https://todai.000webhostapp.com/utokyo/

京大マップ掲示板避難所
https://todai.000webhostapp.com/kyotou/


admin板
https://todai.000webhostapp.com/admin/

# 運営の目的・方針などはこちら

https://qiita.com/utokyobbs/items/ab15ae39698475e0bac7

# その他

* 東大生が匿名で話し合える環境があると楽しいかなと思い、動かしてみました。

* 掲示板の書き込み内容について、管理者は責任を一切負いません。違法な書き込み等あれば以下のスレッドでおしらせください。

管理・要望
https://todai.000webhostapp.com/test/read.cgi/admin/1580237611/

* UTokyoという名前ですが当然東京大学とは無関係です。東大王みたいなものです。

* 掲示板スクリプト
http://age.s22.xrea.com/kizuna/readme.html

* サーバー
https://www.000webhost.com
Homestead環境に複数プロジェクト作るやり方

# composerでlaravel/homestedのインストール

```
composer require laravel/homestead --dev
```

# VagrantfileとHomestead.yaml生成

```console_local
# これはwindows
vendor\\bin\\homestead make
```

```
# macはこっち
php vendor/bin/homestead make

```
nil全般について

#blank?、present?、nil?、empty?とは

##nil?
変数の値がnilまたは、値なしの場合、真となります。

##empty?
変数の値が""（文字列の場合）や値が空白の場合、真となります。
nil?との違いは、empty?は変数の値はあることはあるが、その値が空を示している、という点です。

##blank?
nil?が真となる場合、または、empty?が真となる場合に、blank?は真となります。
簡単に言えば、blank?は値といえるものがない場合、真となります。

##present?
present?は、blank?全く逆の動作をします。present?は、値といえるものがある場合、真となります。


ちなみにnilに対してto_sメソッドを実行したものが''になる。
nil.to_s == ''
=>true
今日の疑問一覧

#20200129
関数の返り値がvoidがダメはどっかで見たことを覚えてるけど、参考文献を忘れた。どこで言われてるんだろう？

#20200503
Vscodeの既定のタスクがおかしい。コンパイルが通らないものが入っているのを解消したいがこれがどこで設定できるのかさっぱりわからん。