OmniAICreator/Qiita-1.07M huggingface dataset:
MyDNSのIP自動更新

# はじめに￼

自宅サーバーにドメインアクセスできるよう、DDNSサービスであるMyDNSを利用することにしました。MyDNSへ、自動的にIPを通知するために、2つの方法を試したので、解説します。

# MyDNSのIP通知方法

MyDNSへIPアドレスを通知するには、HTTPで、以下のURLにベーシック認証でアクセスするだけです。

```
https://www.mydns.jp/login.html
```

ベーシック認証のユーザー、パスワードは、MyDNSに登録した際に通知されたマスターID、パスワードを使用します。
IPアドレスを定期的に通知するには、なんらかの方法で、以下のcurlコマンドを定期実行すればよいだけです。

```shell
curl -u master_id:password https://www.mydns.jp/login.html
```

※MyDNSでは、上記以外にもIP通知の方法があります。詳しくは[公式サイト](https://www.mydns.jp/?MENU=030)の「STEP 4. Send  IP ADDRESS」を確認してください。

# cronによる定期更新

cronで定期実行する場合は、以下のようなエントリをcronに登録します。

```shell
crontab -e
```

```
# 毎日01:00にIPアドレスを通知する
0 1 * * * curl -u master_id:password https://www.mydns.jp/login.html
```

# systemd timerによる定期実行

CentOS 7以降でサービスの管理で使うsystemdには、timerという定期実行の仕組みがあるので、それを使うこともできます。

```:/etc/systemd/system/mydns.service
[Unit]
Description=MyDNS IP Update

[Service]
Type=oneshot
ExecStart=/usr/bin/sh -c 'curl -u master_id:password https://www.mydns.jp/login.html'
```

```/etc/systemd/system/mydns.timer
[Unit]
Description=Run mydns.service at 01:00

[Timer]
OnCalendar=01:00
```

`mydns.service`で、実行するコマンドの内容を定義して、`mydns.timer`で、スケジュールを定義する感じです。
あとは、作成した`mydns.timer`を有効化して起動すれば良いです。

```shell
sudo systemctl enable mydns.timer
sudo systemctl start mydns.timer
```

# 参考サイト

- [systemd/タイマー - ArchWiki](https://wiki.archlinux.jp/index.php/Systemd/%E3%82%BF%E3%82%A4%E3%83%9E%E3%83%BC)
RxSwiftを使って動的なTextViewを作る

# 実装するもの：TextViewを動的に可変するやつ
![rxswift.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302458/9369926b-12dc-468d-2e02-611629f6cd2c.gif)

↑これをRxswiftで実装していきます。
（ネットにあまり情報がなかったので、初学者のために掲載します.)


# 早速はじめましょう。

## ①配置とオートレイアウト
以下のようになっています。

TextViewを可変にするにあたって重要な点は、<font color="Red">**Heght**</font>を変動させることです。
今回の仕組みはこれが全てです。
しっかりオートレイアウトをしましょう。

<img width="1422" alt="スクリーンショット 2019-11-05 21.45.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302458/89225699-38d1-9c69-57e6-e9f758e6c4a2.png">


## ②コーディング

全体は以下のようになっています。

```HogeViewController.swift
class HogeViewController: UIViewController {
    
    @IBOutlet weak var textView: UITextView!
    
    @IBOutlet weak var textViewHeightConstraint: NSLayoutConstraint!
    private let disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()
        setup()
    }
    
    private func setup(){
        
        textView.rx.text
            .asDriver()
                .drive(onNext: { [ weak self ] _ in
                    let size:CGSize = self!.textView.sizeThatFits(self!.textView.frame.size)
                    self!.textView.frame.size.height = size.height
                    self!.textViewHeightConstraint.constant = size.height
                    self!.view.setNeedsLayout()
                    
                    }, onCompleted: {
                        print("完了")
                }) {
                    self.disposeBag
            }
    }

}
```


一文ずつ見てもらえれば、だいたいわかるので特に解説はしないのですが、
一つだけ注意点として

```
@IBOutlet weak var textViewHeightConstraint: NSLayoutConstraint!
```
これは、TextViewのオートレイアウトで固定したHeghtだってことです。


# 終わりに
RxSwiftでUIを制御するのはとても便利なのですが、やはり初学者にとっては難しい場面もあります。
API周辺を交えたものをプロジェクトに組み込めるところまで、頑張りましょう、、、、💦
Linuxが突然起動しなくなったときの対処法

# はじめに
長くLinuxを使っていると様々な要因でLinuxが正常起動しなくなることがあります．
特にWindowsとLinuxをデュアルブートして使っている方には，そういった経験があるのではないでしょうか．
本記事では，普段自分がそういった場合に行っているルーチンを紹介します．

注意：本記事ではGrubを使っていることを仮定しています．

# 準備
まずはじめに，起動可能なLinux環境（USB，CD-ROMなど）を用意します．オススメは[Arch LinuxのインストールISO（archlinux-20xx.xx.xx-x86_64.iso）](http://ftp.jaist.ac.jp/pub/Linux/ArchLinux/iso/latest/)です．シェルを立ち上げられるものなら，これ以外でも大丈夫です．

Linuxインストール時と同様の手順で起動し，シェルを立ち上げます．

# 実践
普段使っているLinux環境へアクセスし，環境の修復を試みます．
修復準備をその１・その２で行い，その３で修復を試みます．

## その１：ディスクを読み込む（mount）
まず，インストール済みのディスクを以下のコマンドで確認します．
以下は自分の環境での実行例です．

```bash
$ lsblk

NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0    7:0    0 513.1M  1 loop /run/archiso/sfs/airootfs
sda      8:0    0 111.8G  0 disk 
├─sda1   8:1    0   512M  0 part
└─sda2   8:2    0 111.3G  0 part
sdb      8:16   0 465.8G  0 disk 
├─sdb1   8:17   0   450M  0 part 
├─sdb2   8:18   0   100M  0 part 
├─sdb3   8:19   0    16M  0 part 
├─sdb4   8:20   0 463.4G  0 part 
├─sdb5   8:21   0   564M  0 part 
├─sdb6   8:22   0   788M  0 part 
└─sdb7   8:23   0   507M  0 part 
... （中略）
sde      8:64   1  15.1G  0 disk 
├─sde1   8:65   1   627M  0 part /run/archiso/bootmnt 
└─sde2   8:66   1    64M  0 part                                                  
```

この例の場合，/dev/sda2がrootパーティーション，/dev/sda1がbootパーティーションです．また，/dev/sdbがWindowsのディスクです．この構成は環境によって異なります．
容量で見分けがつかない場合は`lsblk -f`でフォーマット形式を確認しながら判断します．

次に，これらのパーティーションを読み込みます．
以下に例を示します．

```bash
$ mount /dev/sda2 /mnt
$ mount /dev/sda1 /mnt/boot
```

Arch Linux以外のLive環境を使っている場合は，加えて次のコマンドを実行します．

```bash
$ mount -t proc /proc /mnt/proc
$ mount --rbind /sys /mnt/sys
$ mount --rbind /dev /mnt/dev
```

## その２：普段の環境へアクセスする（chroot）
環境の修復をするために，普段使っているLinux環境へアクセスします．

### Arch Linux ISOを使用する場合
```bash
$ arch-chroot /mnt
```

### それ以外の場合
```bash
$ chroot /mnt /bin/bash
```

## その３：修復
この時点で普段使っているLinux環境に移っています．
ここからは原因によって内容が変わりますが，ここでは一番ありがちなGrubのトラブルに対する対処方法を紹介します．
以下のコマンドをその１が適切に行われていないときに実行すると状況が悪化する場合があるので心配な場合は詳しい人に聞いてください．

次のコマンドでGrubを再インストール・再設定します．

```bash
$ grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=grub --recheck
$ grub-mkconfig -o /boot/grub/grub.cfg
```


## その４：再起動
chroot環境を抜けて再起動します．
再起動時にUSB（またはCD-ROM）を抜き取ります．

```bash
$ exit
$ reboot
```

大抵はこれで直ります．
これで直らない場合は，その３からググりながら頑張ります．
英語で出てきたエラー文を含めてググると対処法が見つかりやすいです．

# まとめ
本記事ではLinuxが突然起動しなくなったときに自分が行うことについて紹介しました．
皆さんのトラブル解決の参考になりましたら幸いです．

# 参考
[chroot--ArchWiki](https://wiki.archlinux.jp/index.php/Chroot)
[GRUB--ArchWiki](https://wiki.archlinux.jp/index.php/GRUB)
rails 基本その1　基本作成

要所での内容がほとんどなので
ここで基本に立ち返って、railsの立ち上げ基本について書こうと思います。

※railsの導入がされてること前提です。
※projectsディレクトリに導入されているとします
※導入例としてhome/indexを作成します。

## その1,rails導入ディレクトリに移動
```bash:ターミナル
　
  # 「projects」ディレクトリに移動　
  $ cd projects

  # 現在のディレクトリのパスを表示して現在のパスを確認
  $ pwd
```
## その2,アプリケーションとデータベースを作成
```bash:ターミナル
　$ rails new アプリケーション名
  # アプリケーションを新規作成

  $ rails new アプリケーション名 -オプション名
  # オプションを付けてアプリケーションを作成

  $ cd アプリケーション名
  # アプリケーション名のディレクトリに移動

   #データベースの作成
   $ rake db:create
   #エラーが出る場合は
　　$ bundle exec rake db:create

  $ pwd
  # 現在のディレクトリのパスを表示

作成例
  $ rails _5.2.2.1_ new test -d mysql
  # 「test」を「mysql」オプションで作成。バージョンを5.2.2.1で作成。
```

## その3,ルーティング(アドレス)の設定
```ruby:config/routes.rb
 #home/indexでページに飛べるように設定します。　
  Rails.application.routes.draw do
    get 'home' => 'home#index'
  end
```

## その4,コントローラーの作成(任意のデータ抽出、並び替えをここで行う)
```ターミナル:ターミナル
　$ rails g controller コントローラ名
  # コントローラを作成
```

```ruby:app/controllers/home_controller.rb
 class homeController < ApplicationController

    def index
    end

  end
  # アクションの作成
```

## その5,ビューの作成(ここがないと始まらない)
app/viewsに
homeディレクトリを作成しindex.htmlを作成します。
試しに下記のようなコマンドを打ち込んでください。

```html:app/views/home/index.html
　$ <h1>Hello world</h1>
  # プログラミングの超基本コマンドです。
```

## その6,立ち上げ
```ターミナル:ターミナル
　$ rails s
  # これで立ち上がります。
```

あとはプラウザで
http://localhost:3000/home
で表示されれば完成です。
ノーコードでBotが作れる Power Virtual Agents の Action が最強すぎて、素敵すぎたので、使い方をまとめました

# 前回の続きです

前回記事は[こちら](https://qiita.com/rnakamuramartiny/items/d1999bda574eb9e78bdf)です
つたない記事にもかかわらず、トレンドに乗るほど多くの「いいね」をいただき、ありがとうございます！
Power Automate と並び、非常に素晴らしい製品であることは間違いないので
これだけのいいねを頂けたのではないかと思っております。
また、本日Facebookにて、ユーザーグループを作成させていただきましたが
そちらも、わずか1日足らずで100名以上の方が参加するという盛況っぷり。
ほんとありがたいものです！
ご参加いただけていない方はぜひこちらのリンク先よりご参加ください！
[Japan Power Virtual Agents User Group](https://www.facebook.com/groups/JPVAUG/)

さて、今回は前回の続きです。
Botを作ることは説明しましたが、ただそれだけだと面白くありません。
Power Virtual Agents は Power Platform の一員。
連携できなければ意味がいないのです。

今回はその連携に使用する「Action」についてご説明します。

# Actionの作り方
Microsoft の Docs に既に上がっておりますが
こちらの記事をご覧いただくと、あらかた書いております。
[Add actions to your bot using Power Automate](https://docs.microsoft.com/ja-jp/power-virtual-agents/how-to-flow?fbclid=IwAR388qT2H1ZpZ0MFOvEzEfGSKe39Zbv6S5nVjf8BAqCC9La17J6F_JlgVgA)

基本的な作り方はそちらをご確認いただくとして、いくつかわかりづらいところをピックアップします。

## Flowはソリューション内で作ること
**ソリューションの中で作成したPower Automate Flow**のみ使用可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/f2bbd74a-db40-82aa-b740-7110cc7ae3b0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/5168f977-0d69-34ab-9ba7-55530a4c0bc5.png)

## FlowとPower Virtual Agentsとの関係性

図解すると以下のようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/2e780fea-ef94-4304-194f-ceb9086fd94c.png)

1. User Responses でユーザーが入力する文字列を「tenkiinput」として変数に格納
2. Actionにて「tenkiinput」を、Flowのスキーマにて指定している「State」プロパティに渡す
3. Flowにて、実行したい処理に「State」プロパティの値を渡す
4. 実行した結果は応答のプロパティとして「tenki」に格納する
5. ActionのOutputとして、「tenki」変数が自動生成されているので、その値を次の処理に渡す

という感じです。

なので、Flowを作成するときにJSONスキーマを宣言する必要はありますが
これさえ理解できれば、あらゆるクラウドサービスとの連携や
Power Automate UI Flowを使用した、Desktopアプリの処理への引き渡しなど
無限の可能性を秘めたパワフルなBotとして使用できるはずです！

ぜひ皆さんもご自身でスペシャルなBotをつくってみてください！

お困りの際には、ぜひユーザーグループまで！

# Special Thanks
@yugoes1021 [縄神様](https://twitter.com/twit_ahf?s=17)
Markdownで箇条書きの間に文章とかコードブロックを書きたい

# やりかた

[コチラ(本記事のMarkdown表示)](https://qiita.com/matoruru/items/79bdb93776079007ff40.md)からご覧ください。

1. 箇条書き１です

    ```haskell
module Main where
.
.
.
```

1. 箇条書き2です

    こんな感じで最初の1行の先頭に4つ空白を入れます。

1. 箇条書き3です

    PureScript楽しいです。

1. 箇条書き4です

    ```
.
.
.
```

1. 箇条書き5です

    まだまだ書けます。
realmがimportでエラーになるからcarthageを導入してみよう

#はじめに
最初はcarthageなんて全く導入する気がなかったのですが、今ではこんなに便利なツールがあるんだなととても関心しています。せっかく導入したので手順を記録しておきます。

#なぜ導入する必要があったか
きっかけはXcodeを11.2にアップデートしたことでした。
今までビルドできていたRealmを使っているプロジェクトがビルドできなくなりました。
エラーメッセージは「Module compiled with Swift 5.1 cannot be imported by the Swift 5.1.2 compiler」との表示でした。

xcodeやswiftに詳しくない私は全く意味が理解できませんでしたが、よくよく調べてみるとswiftはimportしているフレームワークをビルドしたコンパイラーとxcodeで使用しているコンパイラのバージョンが少しでも異なると動かないとのことでした。
それなら最新のrealmを使えばいいのだと思い、realm公式サイトから最新のバイナリをダウンロードしてきてframeworkファイルを入れ替えましたが未だバージョンが違うようでエラーは消えませんでした。

どうしたらいいのか色々考えていた結果、githubに上がってるrealmのソースを最新のコンパイラでビルドしてやればいいとやっと気づきました。基本中の基本だと思いますが今までオープンソースの世界で育ってない私には理解するまでかなり時間がかかってしまいました。
そんな理解のまま色々探っているとcarthageにたどり着きました。
carthageはrealmのソースをgithubからダウンロードしてきてビルドまでをコマンド一つでやってくれます。なんて便利なんでしょうか。

#導入手順
まずはbrewのパッケージを最新化します。

```
brew update
```

carthageをインストール

```
brew install carthage
```

realmを使ってるプロジェクトのパスに移動して、Cartfileファイルを作る

```
cd 〜〜〜〜〜〜〜
touch Cartfile
```

viで「github "realm/realm-cocoa"」を書き込んで保存

```
vi Cartfile
```

updateでgithubからソースを落としてきてビルドまでしてくれます。
platformでビルドする対象を指定できます。

```
carthage update --platform ios
```

私の環境ではupdate中に「error: unable to find utility "xcodebuild", not a developer tool or in PATH」のような内容が表示されてエラーになりました。が下記のようなコマンドを流すとうまくいきました。どんな意味なのか詳しく理解していませんが、コマンドライン上でxcodeを使う場合のxcodeのパスを指定しているようです。

```
sudo xcode-select -switch /Applications/Xcode11.2.app/Contents/Developer
```

何分か経ってから処理が完了し「/プロジェクトのフォルダ/Carthage/Build/iOS」の下に「Realm.framework」「RealmSwift.framework」がビルドされました。

ビルドされたファイルの使い方は下記の記事の通りで特に変わりなさそうです。
[SwiftでRealmを動かしてみる](https://qiita.com/swiftman/items/03027e62c322a94b05d3)


#さいごに
まだまだ知らない便利なものが世の中にあるんだなと感激した内容でした。
Io言語をインストールしてHello Worldする

# はじめに

ビルドとインストールの方法も載せます。

単純にHello Worldしたら1行で終わってつまらないので、Hello World用のメソッドを持たせたオブジェクトのインスタンスを作って実行します。

# インストール方法

## ダウンロードする

--recursiveオプションを忘れずに。

```bash
$ git clone --recursive https://github.com/IoLanguage/io.git
```

## ビルドする

```bash
$ cd io
$ mkdir build
$ cd build
$ cmake ..
$ make
```

## インストールする

```bash
$ sudo make install
```

以下のコマンドが動けば成功です。

```bash
$ io --version
Io Programming Language, v. 20170906
```

# Hello Worldする

1. ioと入力してインタプリタを起動します。

    ```bash
$ io
Io 20170906
Io> 
```

2. 空のオブジェクト、FirstObjectを作る

    ```io
Io> FirstObject := Object clone
==>  FirstObject_0x55eaf4b78e30:
  type             = "FirstObject"
```

3. FirstObjectにHello World用のメソッド、firstMethodを持たせる

    ```io
Io> FirstObject firstMethod := method("Hello, world!" println)
==> method(
    "Hello, world!" println
)
```

4. FirstObjectのインスタンス、firstInstanceを作る

    ```io
Io> firstInstance := FirstObject clone
==>  FirstObject_0x55eaf4eb3d30:
```

5. firstInstanceのfirstMethodを呼び出す

    ```io
Io> firstInstance firstMethod
Hello, world!
==> Hello, world!
```

Hello Worldできました:hugging:！

# おまけ

名前を受け取って挨拶してくれるメソッド、secondMethodを作ってみます。

1. firstInstanceにsecondMethodを持たせる

    ```io
Io> firstInstance secondMethod := method(name, writeln("Hello, ", name))
==> method(name, 
    writeln("Hello, ", name)
)
```

    firstMethodのときは元となるオブジェクトに持たせてインスタンスを生成しましたが、今回はインスタンスに直接持たせています。

2. secondMethodを呼び出す

    ```io
Io> firstInstance secondMethod("matoruru")
Hello, matoruru
==> nil
```

挨拶された:hugging:！

# まとめ

QiitaにIo言語の構文ハイライトがあることに驚きました...(PureScriptのも用意してください:smiling_imp:！)。

# 参考

- https://github.com/IoLanguage/io
- https://iolanguage.org/tutorial.html
rails サーバー の停止方法　A server is already running. の対処法

#railsサーバーの停止方法

良くRailsサーバーのプロセスの切断方法を忘れるため、
自分への忘備録としてです。

#server.pidの確認

Railsアプリケーション内にある以下のファイルを確認します。


```
/tmp/pids/server.pid
```

このファイルには、
サーバーの使用しているプロセスが記述されていて、

railsサーバー を実行・削除する度にファイルが作られたり、
削除されたりしていることが確認できます。


#プロセスの削除

プロセスの番号がわかった所で、
削除をしていきます。

```
kill -9  [プロセス番号]
```

以上でサーバーの停止ができます。

調べたところ、server.pidを削除するだけでも停止させることができるようです。
/var/crash と /var/spool/abrtd に同じ vmcore が作られる問題

#/var/crash と /var/spool/abrtd にも同じ vmcore が残ってるのでなんとかしたい

マジックSysRqキーを使って kdump の動作確認を実施してたら
vmcore が重複して作成されているようだった。

机上とは言え、計算上はギガを超える無駄な重複データが出来てしまう場合もあるのでなんとかしたい。

次のような手順で動作確認していた。

### 手順
crashdump を手動で出力する。~~秘孔を突くコマンドでゲロを吐かせます。~~

```shell
[root@localhost ~]# echo c > /proc/sysrq-trigger
```
起動後に確認すると
/var/crash と /var/spool/abrtd にも同じ vmcore 残ってる

```shell
[root@localhost ~]# ls -l /var/spool/abrt/vmcore-127.0.0.1-2019-10-24-20\:15\:10/vmcore /var/crash/127.0.0.1-2019-10-24-20\:15\:10/vmcore
-rw------- 1 root root 73008040 Oct 24 20:15 /var/crash/127.0.0.1-2019-10-24-20:15:10/vmcore
-rw-r----- 1 root abrt 73008040 Oct 24 20:18 /var/spool/abrt/vmcore-127.0.0.1-2019-10-24-20:15:10/vmcore
```
パーミッション、グループ、作成時間は若干違うようだがファイルサイズはまったく同じ

```shell
[root@localhost ~]# diff --binary /var/spool/abrt/vmcore-127.0.0.1-2019-10-24-20\:15\:10/vmcore /var/crash/127.0.0.1-2019-10-24-20\:15\:10/vmcore
[root@localhost ~]#
```
念のためバイナリデータで比較してもまったく同じ

```shell
[root@localhost ~]# egrep -v "^#|^$" /etc/abrt/abrt.conf
MaxCrashReportsSize = 5000
DeleteUploaded = no
AutoreportingEvent = report_uReport
AutoreportingEnabled = no
PrivateReports = yes
```
ちなみに abrt.conf には

```shell
# Max size for crash storage [MiB] or 0 for unlimited
```
と記載しているので 5000MiB がデフォルト設定のようだ。

### 調査
調べると、abrt の BugFix対応として記載されていた。
https://bugzilla.redhat.com/show_bug.cgi?id=847227

なんかmvしたら /var/crash がぶっ壊れたからコピーにしとくね（超意訳）
ってことらしい。

abrt-harvest-vmcore の config に CopyVMcore ってやつを追加したよ、とのことなのだが、man に書いてた。

```shell
[root@localhost ~]# man abrt-harvest-vmcore
ABRT-HARVEST-VMCOR(1)                      ABRT Manual                     ABRT-HARVEST-VMCOR(1)

NAME
       abrt-harvest-vmcore - Converts VMCores to ABRT problems

SYNOPSIS
       abrt-harvest-vmcore

DESCRIPTION
       This script is meant to be run once at system startup after abrtd is up and running. It
       moves all vmcore directories in /var/crash (which are presumably created by kdump) to
       abrtd spool directory.

       The goal is to let abrtd notice and process them as new problem data dirs.

FILES
       /etc/abrt/plugins/vmcore.conf
           Configuration file where user can enable copying or moving VMcore to ABRT problem
           directory

SEE ALSO
       abrt-vmcore.conf(5) abrt.conf(5)

AUTHORS
       ・   ABRT team

abrt 2.1.11                                03/20/2019                      ABRT-HARVEST-VMCOR(1)
```
/etc/abrt/plugins/vmcore.conf が設定ファイルらしい。

```shell
[root@localhost ~]# cat /etc/abrt/plugins/vmcore.conf
# Do you want vmcore to be copied, or moved from /var/crash to /var/spool/abrt?
# (default is to copy, but it may duplicate way too much data)
CopyVMcore = yes
```
いました。
/etc/abrt/plugins/vmcore.conf の設定を no に書き換えます。
`CopyVMcore = no`

反映させる必要は特にないので、
もう一度crashdump を手動で出力~~秘孔を突く~~する。

```shell
[root@localhost ~]# echo c > /proc/sysrq-trigger
```
/var/crash
には作成されなくなった。

```shell
[root@localhost ~]# ls -l /var/crash/ /var/spool/abrt/
/var/crash/:
合計 0

/var/spool/abrt/:
合計 8
drwxr-x--- 2 root abrt 4096 Oct 25 15:21 vmcore-127.0.0.1-2019-10-25-15:21:34
```

これで良しとするか。
jQueryを使ってコンテンツをランダムに入れ替える

ページのコンテンツをランダムに表示する機能をjQueryを使って作成しました。HTMLには要素の記述が全部書いてある状態なので、JavaScriptがオフでも順序が入れ替わらないだけで表示はされます。

##HTML
```html
<ul class="contentBox">
  <li>
    <div class="box">
      <h2>見出し1</h2>
        <p class="img"><a href="http://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%81%E3%82%B4" target="_blank"><img src="01.jpg" width="220"height="150" alt="いちご"></a></p>
        <p>イチゴ（苺、莓、Fragaria）はバラ科の多年草。食用として供されている部分は花托（花床ともいう）であり果実ではない。</p>
    </div>
  </li>
  <li>
    <div class="box">
      <h2>見出し2</h2>
        <p class="img"><a href="http://ja.wikipedia.org/wiki/%E3%81%AB%E3%82%93%E3%81%98%E3%82%93" target="_blank"><img src="02.jpg" width="220" heigit="150" alt="にんじん"></a></p>
        <p>ニンジンは原産地のアフガニスタン周辺で東西に分岐し、世界各地に伝播した。オランダを通りイギリスへと西方へ伝来しなが</p>
    </div>
  </li>

～～中略～～

</ul>
```
##CSS
CSSは見た目のみなので省略。

##JavaScript
処理の順序的には、

- ランダムに入れ替えたい要素を配列に入れる
- 配列をランダムに入れ替える
- それぞれの要素があったところを一旦削除
- ランダムに入れ替えた配列を順番に要素があったところに入れる

となっています。

```javascript
$(function(){
  var randomContent = [];
  $('.contentBox li').each(function() {
    randomContent.push($(this).html());
  });
     
  randomContent.sort(function() {
    return Math.random() - Math.random();
  });
  
  $('.contentBox li').empty();
  i = 0;
  $('.contentBox li').each(function() {
    $(this).append(randomContent[i]);
    i++;
  });
});
```

##デモ
[デモ](http://webdrawer.net/sample/js/contentrandom/index.html)

##転載元の記事
[jQueryでコンテンツをランダムに入れ替える](http://webdrawer.net/javascript/contentrandom.html)
既存のDjangoアプリケーションの起動メモ

GithubなどからcloneしたDjangoアプリケーションの起動メモ
仮想環境を使わずにMac上でサクッと動かす方法

# venvでプロジェクト毎のpython環境を準備
venvはプリインされています。

`python3 -m venv [newenvname]`

.gitignoreを見て `[newenvname]`のディレクトリ名を揃えておく

https://qiita.com/fiftystorm36/items/b2fd47cf32c7694adc2e

# mysqlのアップデート

`brew upgrade mysql`
※他のアプリでも利用してる場合は気軽にやらないように


# mysqlでユーザー・DB作成・確認

```sql

mysql.server start
mysql -u root
CREATE USER username@localhost IDENTIFIED BY 'password';
CREATE DATABASE dbname;
GRANT ALL PRIVILEGES ON dbname.* TO username@localhost;
exit
mysql -u username -p

SHOW DATABASES;
```
DBの接続先は `settings.py` を確認。

# 依存パッケージのインストール
`pip install -r requirements.txt`

https://note.nkmk.me/python-pip-install-requirements/

# DBのマイグレーション

`python manage.py migrate`

# スーパーユーザー作成

`python manage.py createsuperuser`

https://python.keicode.com/django/admin-site-enabling.php

# サーバー起動

`python manage.py runserver`

localhost:8000/admin で管理画面にアクセス可能
[iOS13]アプリ内のLight <-> Dark切り替え

UserInterfaceStyleをアプリで変更する方法をメモしておきます。

# デモ

こんな感じのやつ
![dark_and_light.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165815/5c69b7ce-b151-44a8-6427-8688b4887691.gif)

# コード
```swift
import UIKit
 
final class ViewController: UIViewController {
    
    @IBOutlet private weak var userInterfaceStyleSwitch: UISwitch!
    @IBOutlet private weak var userInterfaceStatusLabel: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        userInterfaceStyleSwitch.isOn = UITraitCollection.current.userInterfaceStyle == .dark
        userInterfaceStatusLabel.text = UITraitCollection.current.userInterfaceStyle == .dark ? "Dark" : "Light"
    }
    
    @IBAction private func switched(_ sender: UISwitch) {
        navigationController?.overrideUserInterfaceStyle = sender.isOn ? .dark : .light
        userInterfaceStatusLabel.text = sender.isOn ? "Dark" : "Light"
    }
}
```

# 解説

`overrideUserInterfaceStyle` はViewController単位で変更することが出来ます。
親のViewControllerが変更されたら子のViewControllerにも変更が適応されるので、今回は一番の親であるnavigationControllerのoverrideUserInterfaceStyleプロパティに変更を与えています。
コマンドラインからファイルをコピーするプログラム（C言語）

C言語です。

コマンドラインからファイル名を指定して、そのファイルをコピーするプログラムです。

コピー先ファイルが存在しない場合は、コマンドラインで指定したファイル名で新規作成します。


```
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
	if(!(argc == 3)){
		printf("指定ファイル数が不正\n");
		return 1;
	}

	if(strcmp(argv[1],argv[2]) == 0){
		printf("ファイル名が同一\n");
		return 2;
	}


	FILE *fpr;
	FILE *fpw;
	int c;

	fpr = fopen(argv[1],"r");

	if(fpr == NULL) {
		perror("ファイルが開けませんでした");
		return 3;
	}

	fpw = fopen(argv[2],"w");

	if(fpw == NULL) {
		perror("ファイルが開けませんでした");
		fclose(fpr);
		return 4;
	}

	while((c = getc(fpr)) != EOF) {
		putc(c,fpw);
	}
	printf("ファイル%sをファイル%sにコピーしました\n", argv[1],argv[2]);

	fclose(fpr);
	fclose(fpw);

	return 0;
}
```
【初心者】blenderで日本語化設定を行う（Mac）



## blenderを起動する
<img width="1006" alt="スクリーンショット 2019-11-05 20.25.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346617/0655b07d-dc15-4992-0065-7efb59243c75.png">
今回はsteamから起動しました。

## [File] --> [Performance]

<img width="984" alt="スクリーンショット 2019-11-05 20.26.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346617/3b9c0d6e-9ea6-dad6-8864-a069f564f762.png">

## [Interface] --> [☑︎ Translation] の項目

<img width="719" alt="スクリーンショット 2019-11-05 20.26.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346617/873c3360-a629-a965-e5f5-2cde1bf6c859.png">

[langage]の項目の[Automatic]と記載されているカラムを開いて、[日本語]を選択します。
直下のチェック欄に[interface]とあるので、これにチェックを入れます。

## おわり
<img width="691" alt="スクリーンショット 2019-11-05 20.26.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346617/8f18cb7b-2039-89dc-2f07-889f34af0ec0.png">
Firebaseのユーザー権限周りの話

# TL;DR;
* FireStoreベースとCustomUserClaimベース双方やっておくと便利
* CloudFunctionで同期を取れるようにしておくとなお良し

# Firebaseでのユーザー権限
FirebaseでAdminだったりだとか課金ユーザーだったりとかの、一定の権限を持ったグループを作る場合、
[カスタムユーザークレーム](https://firebase.google.com/docs/auth/admin/custom-claims?hl=ja)を使うのと、
Firestoreに権限管理用のcollectionを作ってセキュリティルールで頑張るパターン(existsなどを書く)があります。

## それぞれのメリットデメリット

### カスタムユーザークレーム
#### メリット
* FireStoreに依存しないので、Storageのルールでも利用できる
* ルールが短くて済む

#### デメリット
* Adminでしか登録できない。(通常SDKでは操作不能)
* 自分の持っているClaim一覧を通常SDKでは取れない

### 権限管理用Collection+exists
#### メリット
* 細かい制御が可能
* 通常SDKでもルール次第で操作可能

#### デメリット
* storageのルールでは使えない

## 推奨したい方法
面倒だけれども、両方使ってしまえばいいとこどりが可能。

* カスタムクレームで済むものはカスタムクレームで済ます
* FireStore上にはクレーム一覧用のテーブルを読み取り専用で持っておく
* クレーム一覧テーブルの更新をトリガーとしてCloudFunctionを設定してカスタムクレームとの同期をとる
RailsプロジェクトでもESLintがしたい！

JS(ECMAScript)のlinterとしては、[ESLint](https://eslint.org/)があります。
しかしながら webpack**er** 環境下でこいつをしっかり動かそうとしてハマりました。

しっかりというのは、ESLintの[airbnbルール](https://github.com/airbnb/javascript/tree/master/packages/eslint-config-airbnb-base)のことなのですが、
こいつは`import`先の存在性確認とかが必須になるようです。(import/no-extraneous-dependencies)

で、ESLint自体はこれを処理できないのですが、プラグインで拡張すればできるわけです。(eslint-plugin-import)
ESLintがwebpack環境でそれをやるには `eslint-import-resolver-webpack`を使うのが良さそうなのですが、
さて、コイツ、webpack.config.js を必要とします。

しかし、Railsプロジェクトには、webpack.config.js がありません。
コマッタ！

# webpack.config.js をひねり出す

で、色々調べたところ、参考になる記事を見つけました。
https://system.blog.uuum.jp/entry/2019/04/12/111803

webpackerがwebpackをwrapする手法としては割合シンプルで、
結局は、`config/webpack/[RAILS_ENV].js` が求めるconfigの`[Object]`のようです。

ESLintを動かす文脈に戻ると、例えばdevelopment環境ならこう書けばいいはず。
で、実際動きました！

```/.eslintrc.js
module.exports = {
  env: {
    browser: true
  },
  parserOptions: {
    sourceType: 'module'
  },
  settings: {
    'import/resolver': {
      webpack: {
        config: './config/webpack/development.js'
      }
    }
  }
}
```

ということはwebpackのデフォルト設定ファイル名でファイルを置いてあげて、上手く切り替えてあげれば、
webpackに依存するツールセットからは、設定ナシで正しく見えるのではないだろうか？
つまりこう。

```/webpack.config.js
let env = process.env.RAILS_ENV || 'development'
module.exports = require(`./config/webpack/${env}.js`)
```

```/.eslintrc.js
module.exports = {
  env: {
    browser: true
  },
  parserOptions: {
    sourceType: 'module'
  },
  settings: {
    // 設定ファイルの指定を省略
    'import/resolver': 'webpack'
  }
}
```

うごきます！！
プロジェクト構成に根差した複雑なlintもちゃんと走るので、とても良い感じ。
あと、この手法は、今後webpackに依存するような複雑なツールを入れる時にも、設定ファイルの位置を毎回指定しないで済むので、嵌り要素が減って良さそう！


# 前略、Railsの上より (あとがき)
TL;DR

Rails側からフロントエンド資産を利用方法として、"なんちゃら-rails"みたいなgemで入れるのがスタンダードだった時期がありましたが、それも今は昔[^1]。
JSが一つの言語系として隆盛するにしたがって、JSの資産はJSでhostされるようになり、
これを利用するためにはJSのビルドシステムと付き合うしかなくなりました。

で、Rails5からwebpacker[^2]という、フロントエンドライブラリの資産をRailsでも使えるヤツーが導入されました[^3]。
webpackerは、RailsのフロントエンドビルドシステムであるSprocketとwebpackをRubyからするといい感じに協働させてくれるのですが、
Railsプロジェクトのconventionに合わせるために、config構成が**ちょっと普通と違う感じ**になっています。

で、それをみて、僕は勝手にJS側のツールと相性がイマイチだと思ってしまった[^4]ワケなんですが、
解決策としては意外とシンプルなものが得られたので、記事にしました。

webpackerとガチで向き合うの今までつらかったんですが、整合性のある設定ファイルが存在することが理解出来たら、そこまでツライ相手でもないかもしれないですね、コレ。

[^1]: rails-assets.org (自動的になんちゃら-railsのgem作るヤーツ)とかも2016年にもう更新止まっています。
[^2]: webpackするマン。
[^3]: Rails5ではoptionalでしたが、Rails6ではもうデフォルトがコッチらしいですね。
[^4]: 実際今回も、めちゃくちゃ嵌った。4時間ぐらい。
マークダウン【自分用】

## 見出しについて

# 見出し１
\#見出し1

## 見出し2
\## 見出し2
### 見出し3
\### 見出し3
#### 見出し4
\#### 見出し4
##### 見出し5
\##### 見出し5
###### 見出し6
\###### 見出し6

## 段落について

### 二回改行
私の名前は、

田中太郎です。
### 二回空白
私の名前は、  
佐藤次郎です。

## 字下げ

>\>一つ字下げ
>>\>>二つ字下げ
このままだと字下げから抜けない。

>\>一つ改行し、浅い字下げで書くと抜ける

抜けた

## 箇条書き
### 番号なし
- ハイフンの後に
- スペースを入れる（*, + でも可能）  

### 番号あり
1. 1.のように
2. 番号とドット+スペースで
3. 番号付きになる


## コードの埋め込み
`バッククオート一つで囲むとこんな感じ`

```code.test
三つで囲むとこんな感じ。
\```code.test  
\○○○○　
\``` 
バッククオート直後にファイル名を書くと、左上にファイル名が表示される。
```

## 字体の変更

*syatai*  ： 斜体は、* 一つで囲む。（漢字の斜体はない？）
**太字** ： 太字は、* 二つで囲む。
***斜体＋太字***：斜体＋太字は＊三つで囲む。
~~打ち消し~~：打ち消しは、~~で囲む。

## リンク

リンク文字列とともにリンクを表示する場合は
\[リンク文字列](リンク先URL)と書く  
[Qiita](https://qiita.com/)  

もしくは、URLを<>で囲む。  
Qiita：<https://qiita.com/>

## 画像の埋め込み
![画像](画像ファイルのパス)

\!\[altの属性](画像ファイルのパス)  
と記述すると、画像を張ることが出来る。


## その他

### 文字色
<font color="Red">赤</font>
<font color="Blue">青</font>

```
<font color="Red">赤</font>
<font color="Blue">青</font>
と書くと色付き文字が可能
```
### テーブル
```
| Left       | Right       | Center       |
|:-----------|------------:|:------------:|
| left       | right       | center       |
```
上のように書くと

| Left       | Right       | Center       |
|:-----------|------------:|:------------:|
| left       | right       | center       |

テーブルになる。

### 水平線

---
水平線は、- を３つ以上
HTMLテーブルからFLASKへのＰＯＳＴ送信

ＨＴＭＬテーブルをＪＳＯＮ変換して、バックエンドでポスト受信して、ＣＳＶ保存をする処理を書いています。

いまＣＳＶファイルのファイル名を、JSONのポストデータに、プラスワンして渡そうとしていますが、
ここではフォームを使わず、JS側のFUNCTIONでＰＯＳＴ送信しています。

ファイル名を渡す方法はないものでしょうか？


```python
@app.route('/csvout', methods=['POST'])
def csvout():

    if request.method == 'POST':
        pdb.set_trace()
        df_s = pd.read_json(request.data)

        filename = request.form["upload_file"]　　←　これが使えない
        df.to_csv("data.csv")
        return render_template('edit1.html', fname=filename, csvname=csvn)
    else:
        return redirect('/')
```

```html
<script type="text/javascript">

		function loading() {

			var data = $('#target').tableToJSON();

			$.ajax({
				type: "POST",
				url: "/csvout",
				contentType: 'application/json; charset=UTF-8',
				data: JSON.stringify(data),
				dataType: 'json',
				success: function (data) {
					console.log(data);
				},
				error: function (error) {
					console.log(error);
				},
			});
		}


	</script>
```
画面遷移まとめ vol.2(どこがコードでどこがStoryboardか)[NavigationController等]

随時追記していくかもです、気まぐれで。

vol.2ではVCの状態保存にも触れていきます。

## 用途によるVCの参照の違い
#### 状態保存しなくてもいい時
とりあえず参照できればいいやという人にはこれ

```swift
let storyboard = UIStoryboard(bundle: nil)
```


## 用途によるNCの生成(設定)の違い
コード: 遷移したタイミングで遷移先以降の遷移がnavigation(push)になってほしい時
storyboard: 遷移がnavigation(push)しかしないと決まっている時(Embed In)

あとで追記

## NC自身とNCをEmbed inしたrootVCの違い
navigatonbarの参照
NavigationController: self.title = "hoge"
ViewController(NCをEmbed InしたrootのVC): self.navigationController?.navigationBar.title = "hoge"

->VCはNavigationControllerに埋め込まれてはいるがNCではないのでこういう参照になる
->NCとNCのrootVCはごっちゃになるのでこの辺注意が必要

あとで追記
UnityHub経由でAndroidビルド時に「Unable to detect NDK version」が出た時の解決方法

# 開発環境
**windows**
Windows10

**UnityHub**
Unity2019.2.0f1

**Android端末**
Pixel3

# 起きた現象
Androidビルドしようとした時に「Unable to locate Android NDK」というエラーが出た
![android_ndk.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77637/5428e48e-e0e6-3dfb-463f-e8b2d0eb66c2.png)

「Edit/Preferences...」を開き、External Toolsを見ると
・Android SDK Tools Installed with Unity (recommended)
・Android NDK Tools Installed with Unity (recommended)
の二つがmissingになっていた
確かUnityHubのバージョンを最新にしてください、的なエラー内容だったはず

（以下の画像は解決してしまった後の為直っています...）
![android_ndk_setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77637/e622324c-78f3-0633-fdf6-9214578fb542.png)

# 解決方法
**UnityHubを開き、対象のバージョンでSDKとNDKをインストールする**

Unityを終了した後、UnityHubを開きなおす
「インストール」タブを開き
![Unityhub.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77637/f6894622-f5e4-257e-c8e9-8ded9989abb5.png)
ビルドしようとしたプロジェクトのバージョンの右上のメニューから「モジュールを加える」を選択
![unityhub_addmodule.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77637/95b3eb03-6293-bb8c-7a22-7209c225c305.png)
「Android Build Support/Android SDK & NDK Tools」にチェックを入れ、実行をすればNDKがインストールできる
（画像はすでにインストールした後です）
![unityhub_addmodule_sdkndk.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77637/d30d62c9-661d-283f-7245-00d8dfdfcc01.png)

これでUnityHub経由でプロジェクトを起動し、再度ビルドすると問題なく実行できました
create-nuxt-appを利用してDocker上にNUXT環境を構築する

# ゴール

Docker環境でNUXTを立ち上げ、TOPページを表示する。

# ハマったところ

## create-nuxt-appを使用するとイメージ作れない

通常、[create-nuxt-app](https://github.com/nuxt/create-nuxt-app)は対話式で設定していくのでイメージ作成時に設定できなかった。

`--answers` オプションを付けて解決しました。

[ここ](https://github.com/nuxt/create-nuxt-app/blob/b66ffbddcbcbdbf6ecc859c37ec1c845e5fcea34/prompts.js)のソースを見ながら設定をしました。

## ブラウザからTOPページが見れない

環境変数を設定する必要がありました。

https://ja.nuxtjs.org/faq/host-port/

```docker-compose.yml
PORT: 3000
HOST: 0.0.0.0
```
を設定しました。


# Dockerfile

```dockerfile

FROM node:13.0.1-stretch

ENV LANG C.UTF-8
ENV TZ Asia/Tokyo

RUN apt-get update && \
    apt-get install -y vim

WORKDIR $HOME/sample

RUN npx create-nuxt-app --answers "{ \
  \"name\": \"sample\", \
  \"description\": \"first app for nuxt\", \
  \"author\": \"hisawa\", \
  \"pm\": \"npm\", \
  \"ui\": \"none\", \
  \"server\": \"none\", \
  \"features\": \"axios\", \
  \"linter\": \"eslint\", \
  \"test\"  : \"none\", \
  \"mode\"  : \"universal\", \
  \"devTools\": \"jsconfig.json\" }"

```

イメージを作成
`docker build -t nuxt:latest .`


```docker-compose.yml
version: '3'

services:
  nuxt:
    image: nuxt:latest
    command: npm run dev
    environment:
      PORT: 3000
      HOST: 0.0.0.0
    volumes:
      - ./sample:$HOME/sample
    ports:
      - 3000:3000
```

起動
`docker-compose up -d`

http://localhost:3000

無事表示されました。

<img width="532" alt="sample.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210817/6263bb0d-45bc-d3f4-f929-7560f7c87691.png">
今日の音声認識研究における実声データ取得の難しさについて

こんにちは，Aです．

今回は音声認識の研究に関してなぜ実際に音声データを録音して解析した論文が少ないのかについて解説していきたいと考えています．

オンライン上にデータが上がっているためという理由はもちろんなのですが，それ以上に複雑な事情が絡んでいるということを実際に体験し実感したので記事にすることにします．

音声データの法的な扱い

改正個人情報保護法施行令：個人情報の保護に関する法律及び行政手続における特定の個人を識別するための番号の利用等に関する法律の一部を改正する法律の施行に伴う関係政令の整備及び経過措置に関する政令（平成28年10月5日政令第324号）に基づく改正後の個人情報の保護に関する法律施行令

によって平成28年10月5日政令第324号に改正個人情報保護法が施行されました．この法律がなかなかの曲者で

身体的特徴（改正個人情報保護法2条2項1号）
　次に掲げる身体の特徴のいずれかを電子計算機の用に供するために変換した文字、番号、記号その他の符号のうち、特定の個人を識別するに足りるものとして「個人情報保護委員会規則で定める基準」に適合するものが政令において個人識別符号と定められます（改正個人情報保護法施行令1条1号イ～ト）。

イ　細胞から採取されたデオキシリボ核酸（別名ＤＮＡ）を構成する塩基の配列
ロ　顔の骨格及び皮膚の色並びに目、鼻、口その他の顔の部位の位置及び形状によって定まる容貌
ハ　虹彩の表面の起伏により形成される線状の模様
ニ　発声の際の声帯の振動、声門の開閉並びに声道の形状及びその変化
ホ　歩行の際の姿勢及び両腕の動作、歩幅その他の歩行の態様
ヘ　手のひら又は手の甲若しくは指の皮下の静脈の分岐及び端点によって定まるその静脈の形状
ト　指紋又は掌紋

ということ．

つまり，

発声の際の声帯の振動も個人情報である

になってしまったということです。そのため，研究機関でデータを扱う際は倫理審査の対象になりえる可能性があります．

世知辛い世の中ですね‥

しかし，今日でも音声認識に関わる研究をできるのは先人たちの努力のたまものです．というのは音響学会が作成した音声コーパス
http://research.nii.ac.jp/src/list.html
があるからです．多種多様な音声データが無償（一部有償）で手に入るのでやり方次第では研究可能であるといえそうです．ただし，その音をいつどんな場所で撮ったかやどのような形式で録音したのか詳細な情報が明確に記載されているものはデータ所有主によって変わってきます．また研究責任者が学生では受け取ることができないようです．学生の場合，指導教員の先生と要相談でデータの入手を行う必要があるので少し注意が必要です．

参考文献
https://business.bengo4.com/practices/274
Lookerのライブチャットの利用方法


Lookerで困ったことがあった場合は、ライブチャットが使えます。
どんな感じなのか？を流れを追って紹介します。

## Lookerのライブチャットとは
- リアルタイムでお問い合わせができる。
- 日本語対応可能での問い合わせ時間は日本時刻9:00~17:00（その後は英語対応のみ）
- チャットのログは即座にメールに残せるので内容を後々読み直せる

## チャットの流れ
１.画面右上のボタンをクリック
２.Chatをクリック
３.Live Support画面が開く
４.知りたい事をチャットで聞いてみる
![ライブチャット001_003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/268a401d-8584-8e69-6958-3af434a5795e.png)

５.チャット終了後にチャット画面の右下のオプションボタンをクリック
６.会話ログをメール送信する画面が出るのでそこをクリック
７.ログの送信先メールアドレスの入力を求められるので入力して、送信ボタンをクリック
![ライブチャット004_006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/71341379-78db-dbea-76e1-e7b78f2504c3.png)

８.終了ボタンを押してチャットが終了すと、７.で入力したメール宛にログが届く
![ライブチャット007_009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/79e07df5-ce49-d4f6-7a8d-a2bcbc1f148a.png)

## Liveチャットを使ってみて

・チャットは即時性が最大のウリ（対応してくれてるカスタマーラブの方は大変だと思います）
・今の所、Lookerは日本語のドキュメントかなり少なめなので日本語で直接情報もらえるのは楽。
・対応者もカスタマーエンジニアなのか結構エンジニアチックな会話が通じた。
・難しい質問をした場合、マニュアルに誘導する形で回答になることも多いので、聞く側にもその手の基礎知識が必要そう。
mac tigコマンド導入方法

# 目的

- macにtigコマンドを導入して実行できるまでの手順をまとめる。

# 参考ページ

- [GitのCUI最強クライアント「tig」のインストール(Mac)](https://qiita.com/uhooi/items/d1300f43f468341fcdc6)
- [【初心者でもすぐわかる】JDKのインストール方法 Mac編](https://eng-entrance.com/java-install-jdk-mac)

# 謝辞

- tigコマンドの導入方法に関しては[@uhooi](https://qiita.com/uhooi)さんの記事[GitのCUI最強クライアント「tig」のインストール(Mac)](https://qiita.com/uhooi/items/d1300f43f468341fcdc6)を参考にさせていただきました。
- 本当に助かりました。改めて御礼申し上げます。本当にありがとうございます。

# この記事のターゲット

- CUIでGitを使用している方でリポジトリの歴史を一目で確認したい方

# 導入概要

1. Javaの導入
1. tigの導入

# 導入詳細

※XとYYYY、MM、DDはそれぞれ任意の英数字が入る。

1. Javaの確認と導入
    1. terminalで下記コマンドを実行してお手持ちのPCにJavaが入っているか確認する。
 
        ```terminal
        $ java --version
        ```

    1. 前述のコマンドを実行して下記のように出力された方は「tigの導入」を実施する。それ以外の出力の方はこのまま進む。

        ```terminal
        # 下記のように出力された方は「tigの導入」から実施する。
        $ java --version
        java XX.X.X YYYY-MM-DD
        Java(TM) SE Runtime Environment (build XX.X.X+X)
        Java HotSpot(TM) 64-Bit Server VM (build XX.X.X+X, mixed mode, sharing)
        ```

    1. 下記のリンク先にアクセスする。
        [https://www.oracle.com/technetwork/java/javase/downloads/index.html](https://www.oracle.com/technetwork/java/javase/downloads/index.html)
    1. 「Java SE Downloads」の画面が表示されていることを確認する。
    1. 画面中央の「Java Platform, Standard Edition」の記載のすぐ下にある「Java SE XX.X.X」をクリックしてリンク先の飛ぶ。
    1. 「Java SE Development Kit XX Downloads」のページが開いたことを確認する。
    1. ページをスクロールしてゆき、下の方に「Java SE Development Kit XX.X.X」の表示があることを確認する。
    1. 「Accept License Agreement」の横にあるラジオボタンをクリックして同意する。
    1. 「jdk-XX.X.X_osx-x64_bin.dmg」をクリックしてインストーラをダウンロードする。
    1. ダウンロードされたファイルを展開して実行する。
    1. 表示されたウインドウに沿ってインストールを行う。
    1. インストール後下記コマンドを実行してインストールが成功しているか確認する。

        ```terminal
        $ java --version
        java XX.X.X YYYY-MM-DD
        Java(TM) SE Runtime Environment (build XX.X.X+X)
        Java HotSpot(TM) 64-Bit Server VM (build XX.X.X+X, mixed mode, sharing)
        ```

1. tigの導入

    1. brewコマンドでも導入可能であるが、筆者はビルドを行なった。
    1. 下記コマンドを実行してtigの取得とビルドを行う。

        ```
        $ cd
        $ git clone git://github.com/jonas/tig.git
        $ cd tig/
        $ make prefix=/usr/local
        $ sudo make install prefix=/usr/local
        Password:
        INSTALL  src/tig -> /usr/local/bin
        INSTALL  tigrc -> /usr/local/etc
        ```

    1. 下記コマンドを実行してtigコマンドがインストールされていることを確認する。(エラーが出なければ導入は完了)

        ```
        $ tig --version
        ```
dialing failed socket: too many open files 

## 概要
ubuntu18.04にて、golangのアプリケーションを動かしていた際に、発生したエラー。
「Too many open files」は Linux でプロセスが開けるファイルディスクリプタの上限に達してしまうと発生するエラーです。

```
[HTTP] http: Accept error: accept tcp [::]:80: accept4: too many open files; retrying in 1s
```

## 解決策

```
# edit the following file
user@ubuntu:~$ sudo vim /etc/security/limits.conf

# add following lines to it
* soft     nproc          65535    
* hard     nproc          65535   
* soft     nofile         65535   
* hard     nofile         65535
root soft     nproc          65535    
root hard     nproc          65535   
root soft     nofile         65535   
root hard     nofile         65535

# edit the following file
user@ubuntu:~$ sudo vim /etc/pam.d/common-session

# add this line to it
session required pam_limits.so

# logout and login and try the following command
user@ubuntu:~$ ulimit -n
65535
```

## 参考
https://medium.com/@muhammadtriwibowo/set-permanently-ulimit-n-open-files-in-ubuntu-4d61064429a

https://stackoverflow.com/questions/20901518/how-to-set-a-global-nofile-limit-to-avoid-many-open-files-error

http://akishin.hatenablog.jp/entry/20130213/1360711554


## 別の解決策
systemdで設定をする。

```
[Service]
LimitNOFILE=65535
```

```
systemctl daemon-reload
systemctl restart <your deamon>
grep "open files" /proc/`pidof <your deamon>`/limits
```

## 参考
http://blog.father.gedow.net/2016/03/28/limits-of-systemd/
Raspberry Pi zero（Raspbian Buster）にwordpress をインストールしました。

Raspberry Pi zero（Raspbian Buster）にwordpress をインストールしました。

Raspberry PiでLXTerminalを開き、以下のコマンドを入力してEnterキーを押します。

0.updateします

```
sudo apt-get update
sudo apt dist-upgrade
```
1．Apacheをインストールします

```
sudo apt-get install apache2 -y
```

2．PHP7.3をインストールします

```
sudo apt-get install php7.3
```

関連をインストールします

```
sudo apt-get install php7.3-fpm
sudo apt-get install php7.3-mysql
sudo apt-get install php7.3-mbstring
sudo apt-get install php7.3-gd
sudo apt-get install php7.3-zip
sudo apt-get install php7.3-xml
sudo apt-get install apache2-mod-php7.3
```

３．MySQLをインストールします(mariadb)

```
sudo apt install mariadb-server
```

４．mySQLにログインします

```
sudo mysql -u root -p
```
パスワードをもとめられますがそのまま　Enter　します
WordPressで使用するDBを作成します。（DB名　例として　wordpress)

```
CREATE DATABASE wordpress;
```

wordpressというDBを操作するユーザーに権限を付与します。（ID　user パスワード　user)

```
GRANT ALL PRIVILEGES ON wordpress.* TO 'user'@'localhost' IDENTIFIED BY 'user';
```

終了します

```
quit
```

５．WordPressをインストールします

```
sudo wget https://ja.wordpress.org/latest-ja.tar.gz`

```
解凍します

```
sudo tar xvfz latest-ja.tar.gz`
```

設定します

```
cd wordpress/
sudo cp wp-config-sample.php wp-config.php
sudo chmod 600 wp-config.php
```

wordpressの設定をします　エディタleafpad 

```
sudo leafpad wp-config.php

define('DB_NAME', '<span class="rmarker">データベース名</span>');
define('DB_USER', '<span class="rmarker">ユーザ名</span>');define('DB_PASSWORD', <span class="rmarker">パスワード</span>');
```
を以下に変更します　データベース名　wordpress 　ユーザー名　user パスワード　user

```
define('DB_NAME', '<span class="rmarker">wordpress</span>');
define('DB_USER', '<span class="rmarker">user</span>');define('DB_PASSWORD', '<span class="rmarker">user</span>');`
```

##WordPressのディレクトリを外部公開用のディレクトリへ移動し、所有者・グループをapachのユーザーに設定します。

```
cd ..
sudo mv wordpress/ /var/www/html/
sudo chown -R www-data:www-data /var/www/html/wordpress
```
６.ここでapache2を再起動します

```
sudo apache2ctl restart
```

７.ブラウザを立ち上げて、以下のURLをアドレスバーに入力してEnterキーを押します。

```
http://Raspberry PiのIPアドレス/wordpress/wp-admin/install.php
```

これで動きました
blenderを使ってVRMをfbxに変換してUnityに入れると黒くなる問題

VRoidStudioをBlenderでインポートし、fbxに変換してUnityにインポートすると、モデルが真っ黒になってしまいます。

#原因
VRMは専用のシェーダーを使用します。
そのため、デフォルト状態のUnityでは真っ黒になってしまいます。

![11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344267/105c314e-1d20-57a7-9201-babbfa0d4dcd.png)
デフォルトシェーダーでは真っ黒になってしまう

![23.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344267/90b9e93e-ddf4-ac66-a841-c0d9afc0e5d6.png)
専用シェーダーが必要

ちなみにVRMのそのままのモデルを使用するのであれば、これをする必要はなくUniVRMでインポートすればOKです。
今回に関してははどうしてもBlender等で加工したモデルを使用したいときに使うとよいと思われます。
普通に使う分であればそのままインポートしたほうが簡単ですし...
#直し方
1.前提として、VRMファイルをUnityで使用できるようにする、UniVRMの導入が必要です。
[ここ](https://github.com/vrm-c/UniVRM/releases)からUniVRMのunitypackageをダウンロードし、Unityにインポートしてください。

2.VRMファイルをインポートします。UniVRMが導入されている状態であれば、projectタブに直接VRMファイルをドラッグアンドドロップすれば、自動でPrefabとマテリアルファイルを生成してくれます。

![332.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344267/d52a0d41-43da-7343-6474-03619b31c6bd.png)
そのままドラッグアンドドロップ
![313131.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344267/c4b4ff57-cede-2449-c2c5-45aa2bdd6dad.png)
Prefabが自動生成される。

3.fbxとvrmのprefabを両方hierarchyに入れます。fbxとvrmを選択し、それぞれのSkinnedMeshRendererのMaterialの名前を見ながらfbxのMaterialをvrmをインポートするときに生成されたMaterialに置き換えます。ちなみに、この時にInspectorが二つあると便利です。
![3313131.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344267/2f5b0753-81f6-ebe0-3eac-b85afaa259eb.png)

以上となります。materialの置き換えは完全に手動なので、なにか良い方法があれば教えてください。
[PHP] SheetAPIでAppendする時にはスプレッドシート側ではフィルターかけてると挙動が変わるので注意

```php5
    /**
     * データ書き込み
     *
     * @param array $data
     * @throws \Exception
     */
    private function append(array $data)
    {
        $value = new Google_Service_Sheets_ValueRange();
        try
        {
            foreach ($data as $val)
            {
                $value->setValues(['values' => array_values($val)]);
                $this->service->spreadsheets_values->append($this->spreadsheetId, "シート1!A1", $value, ['valueInputOption' => 'USER_ENTERED']);
            }
        }
        catch (\Exception $e)
        {
            \Log::error($e);
        }
    }
```

こんな感じでとりあえずA1とかA2にしておくと、入力がすでにある行は無視して直近の空白に埋め込みがされる仕様になっているが、これが出力先のスプレッドシートがフィルター掛けられているとうまく作動しない。
なので、暫定処置として、フィルターを解除するか、毎回最終行をAPIで取得して的確な行にデータを入れておく処理を追加する。
Python3でOpenSSLで暗号化したファイルを復号する

Python3を使ってOpenSSLで暗号化したファイルを復号する方法。

結構ありそうなシチュエーションだけど、ファイルの復号・暗号となると文献が少なくちょっと苦労したのでメモ。

開発環境は以下。
・Python3.7.3
・Windows10
・必要なパッケージは随時 pip install で入れる


### importはこんな感じに書く。（あくまで例）

```python
import binascii
import io
from hashlib import sha256
from Crypto.Cipher import AES
from Crypto import Random
```


## OpenSSLで暗号化されたファイルの復号

```python
@classmethod
def decrypt(self,infile, expf, key_length=32):
    """
    Decrypt the file.

    Parameters
    ----------
    infile : string
        File path before decryption
    expf : string
        File path after decryption
    key_length : int
        key_length

    Returns
        None
    -------
    """

    # Divide password hashed by sha256 to first half  and second half ,set to key and iv. This is OpenSSL specifications.
    key = binascii.unhexlify('E1B85B27D6BCB05846C18E6A48F118E8')
    iv = binascii.unhexlify('9F0C0587140DE9FB3359F8370D0DBA08')

    in_file  = open( infile , 'rb' )
    out_file = open( expf , 'wb' )

    bs = AES.block_size

    cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
    next_chunk = ''
    finished = False
    while not finished:
        chunk, next_chunk = next_chunk, cipher.decrypt(in_file.read(1024 * bs))
        if len(next_chunk) == 0:
            padding_length = chunk[-1]
            chunk = chunk[:-padding_length]
            finished = True

        if type(chunk) is str:
            wk = chunk.encode('utf-8')
        elif type(chunk) is bytes:
            wk = chunk
        else:
            wk = chunk
    
        out_file.write(wk)

    # file close
    in_file.close()
    out_file.close()
```

<br>
<br>
こんどは暗号化。

## ファイルをOpenSSL方式で暗号

```python

@classmethod
def encrypt(self,in_file, out_file,  key_length=32):
    """
    Encrypt the file.

    Parameters
    ----------
    in_file : string
        File path before encryption
    out_file : string
        File path before encryption
    key_length : int
        key_length
    Returns
        None
    -------
    """

    # Divide password hashed by sha256 to first half  and second half ,set to key and iv. This is OpenSSL specifications.
    key = binascii.unhexlify('E1B85B27D6BCB05846C18E6A48F118E8')
    iv = binascii.unhexlify('9F0C0587140DE9FB3359F8370D0DBA08')

    in_file  = open( in_file , 'rb' )
    out_file = open( out_file , 'wb' )

    bs = AES.block_size

    cipher = AES.new(self.key, AES.MODE_CBC, self.iv)

    finished = False
    while not finished:
        chunk = in_file.read(1024 * bs)
        if len(chunk) == 0 or len(chunk) % bs != 0:
            padding_length = (bs - len(chunk) % bs) or bs
            chunk += padding_length * bytes([padding_length])
            finished = True
        out_file.write(cipher.encrypt(chunk))
    
    # file close
    in_file.close()
    out_file.close()
```
【Ruby】パイプを用いたテストの簡略化

# はじめに
今日からアウトプット用に、学習した内容を紹介していきます。
本日はRubyを書いていく中で出たテストに関するTipsを紹介します。

# 環境
Mac OS Mojave 10.14.6
Ruby 2.5.3
エディタ VSCode

# パイプを用いる
入力で受け取った文字を大文字にして出力する下記プログラムの実行についてです。

```ruby:upper.rb
input = gets
puts input.upcase
```

これを実行するとき、ターミナルで


```bash
ruby upper.rb
```

と打ち込み、ここから再度`abcde`などの入力を打ち込んでいました。
しかし下記のようにパイプを用いることで、実行まで一度に済ませることが出来ます。

```bash
echo abcde | ruby upper.rb
```

またこのようにパイプを使うことで、ヒストリを辿って同じテストを行う事が出来るという利点があります。

```bash:出力
ABCDE
```
hamlの隙間を埋める

hamlでビューの編集中にイラっとすることがあったので、その解決法です

## 現象とコード
一言で言えば、隙間がすごく気になっただけです。
1️⃣編集前

```sample.html.haml
平均値を超えた数値は赤くなります
```

![](https://gyazo.com/eb08785e096545d0595514507f7c8580.png)
これを編集して「赤く」の部分の文字色を赤くしようと思いました。

2️⃣編集後

```sample.html.haml
平均値を超えた数値は
%span{style: "color: red"} 赤く
なります
```
spanタグで color: red を当てたところ
![](https://gyazo.com/ad88ce5b4ea636af74f829a9c6cb2698.png)
あら？
思っていたのと違う。

|編集前|編集後|
|:---:|:---:|
|![](https://gyazo.com/96701f1c25607494b0bf86cfbd37b00f.png)|![](https://gyazo.com/51b4c49373fda13f9bfd42724a077951.png)|

marginやpaddingを当てたわけじゃないのに隙間が空いた。
どうやらhamlの仕様で改行したことによって隙間が生じたみたいです。

3️⃣対策後

```sample.html.haml
平均値を超えた数値は
%span{style: "color: red"}> 赤く
なります
```
![](https://gyazo.com/6d997061ff237d3b42ee050290ec951b.png)
spanタグに「>」をつけただけで直りました。
どうやら、「>」はタグの外側の隙間を埋めて、「<」はタグの内側の隙間を埋めてくれるようです。
早い話が、両方つけておけばOKみたいです。

## 参考サイト
[haml公式ドキュメント](http://haml.info/docs/yardoc/file.REFERENCE.html#whitespace-removal--and-)
仮想通貨xGT（クロスゲートトークン）の勉強資料まとめ

#概要
<ul>
<li>xGT（クロスゲートトークン）という仮想通貨に関する情報のまとめ</li>
<li>情報が散らばっているのでここで一箇所にしておく</li>
</ul>

#xGTの要点
<ul>
<li>xGTは配当型ウォレットの一つ</li>
<li>システム開発はシンガポールに拠点があるRevGroup（レブ・グループ）が行う</li>
<li>Revollet（レボレット）というe-wallet（電子財布）に登録の上プロジェクトにxGTをロックできる</li>
<li>xGTはReveX、Bluebeltの2つの仮想通貨取引所に上場</li>
<li>配当目当てで持つ人が多いから今後の高騰が期待できる（主観）</li>
</ul>

#公式サイト
https://xgt.netlify.com/

#関連サイト
http://www.hoovers.com/company-information/cs/company-profile.rev_holdings_pte_ltd.be447e9af70ceb61.html?aka_re=1
https://www.rev-group.com/
http://tradebook.io/
https://thunder-wallet.com/
https://revex.pro/
https://revollet.io/
https://blockching.io/
https://hd.bluebelt.asia/

#参考になりそうな解説記事
https://r-bookslife.com/?p=593
https://www.fina-sol.com/news/109330.html
https://freesyu.net/xgt-investment
https://xn--xnq82j10luzbw4bm40ayg8c76duxc.jp/cryptocurrency/xgt

#今後
<ul>
<li>投機目的の仮想通貨ではないのでどれほど値が上がるか見ていきたい</li>
<li>xGTプロジェクト全体の成長次第で配当が変わるから気になる</li>
<li>投資するからにはなにか「してよかった点」を見出して紹介したい</li>
</ul>
DIPについて復習

## DIPとは
- みんな大好きSOLIDのD
- Dependency Inversion Principle<br>（依存関係逆転の原則） 
- 具象ではなく抽象に依存すると柔軟なシステムになるよ

----
## どういうこと？

----
### 事例1-1
あるアプリケーションがユーティリティを使っている時、
アプリケーションはユーティリティに依存している状態。
![dip1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5514/2016e28a-bcd4-42fc-7e53-6614d3e98894.png)

----
### 事例1-2
この時、ユーティリティのインターフェイスを作って継承し、
アプリケーションからはこのインターフェイスを利用するようにしてみるとこうなる
![dip2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5514/f295032b-6877-f281-0ce5-3a6fd3fac535.png)

----
### 事例1-3
作ったインターフェイスをアプリケーションのグループに入れ、
アプリケーション側が管理するよーとしてみる
![dip3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5514/35d0a199-b366-cea8-45e8-e8bfa9c5dd88.png)

----
### 事例1-4
なんということでしょう。
依存の方向が逆になっているではありませんか。
![dip4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5514/8207db9f-5967-e0e6-18a5-be43fa9d98a7.png)

----
## 何がいいの？
- インターフェイスをどちら管理にするかだけで依存の方向を容易に変更できる
- 依存の方向を単方向に揃えることで、影響範囲や全体の構造がわかりやすくなり、さらに変化に強くなる。

----
### 事例2-1
双方向に依存した複雑なシステムも
![dip5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5514/e2774824-cb29-4c7a-152f-e5339bf76f2d.png)


----
### 事例2-2
分かりやすくて柔軟になる！！（適当なイメージです）
![dip6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5514/9c868d3d-b9e3-7f68-4fd4-4490d0f85604.png)


----
## まとめ
- DIPとはSOLIDのDで、抽象に依存するといいよというもの
- DIPを上手く使うことで依存の方向を管理できる
    - これにより、単方向に依存したシステムを作れば複雑さと戦える

----
## 資料
- [CleanArchitecture](https://www.amazon.co.jp/dp/4048930656)
- [プログラムの依存関係とモジュール構成のこと](https://qiita.com/wm3/items/2c90bfd9e973d368ebd8)
- [SOLID原則：5つ目 依存関係逆転の原則(DIP：The Dependency Inversion Principle)](http://konboi-kun.hatenablog.com/entry/2017/12/03/141419)
plunkerでtensorflow.js その18

#概要

plunkerでtensorflow.jsやってみた。
lstm使ってみた。
xor、学習させてみた。


#サンプルコード


```

tf.setBackend('cpu');
const model = tf.sequential();
model.add(tf.layers.lstm({
    units: 8,
    returnSequences: false,
    inputShape: [2, 1]
}));
model.add(tf.layers.dense({
    units: 1,
    activation: 'sigmoid'
}));
model.compile({
    optimizer: 'adam',
    loss: 'binaryCrossentropy'
});
const xs = tf.tensor3d([[[1], [0]], [[0], [1]], [[1], [1]], [[0], [0]]]);
const ys = tf.tensor2d([[1], [1], [0], [0]]);
model.fit(xs, ys, {
    batchSize: 4, 
    epochs: 1000
}).then((d) => {
    var str = "loss = ";
    str += d.history.loss[0]; 
    str += "<br>1, 1 = ";
    var pre0 = model.predict(tf.tensor3d([[[1], [1]]]));
    str += pre0.dataSync() + "<br>0, 0 = ";
    var pre1 = model.predict(tf.tensor3d([[[0], [0]]]));
    str += pre1.dataSync() + "<br>0, 1 = ";
    var pre2 = model.predict(tf.tensor3d([[[0], [1]]]));
    str += pre2.dataSync() + "<br>1, 0 = ";
    var pre3 = model.predict(tf.tensor3d([[[1], [0]]]));
    str += pre3.dataSync() + "<br>";
    document.write(str);
});
```

#成果物

https://embed.plnkr.co/uhhIByud4wAwgpUzXT4x/

#比較用
tanh
https://embed.plnkr.co/xTaxEW41fcrjvWcxKDxL/

以上。