OmniAICreator/Qiita-1.07M huggingface dataset:
Swift：macOSで現在のテーマ(Light/Dark)を取得する

```swift:カスタムクラス
import Foundation

fileprivate let kInterfaceStyle: String = "AppleInterfaceStyle"

protocol ThemeManagerDelegate: AnyObject {
    func changedTheme(_ isDark: Bool, _ isDarkMenu: Bool)
}

final public class ThemeManager {
    
    private let dnc = DistributedNotificationCenter.default()
    weak var delegate: ThemeManagerDelegate?
    
    init() {
        // テーマ切り替え時のNotification
        dnc.addObserver(self, selector: #selector(changedTheme), name: NSNotification.Name.themeChangedNotification, object: nil)
    }

    deinit {
        dnc.removeObserver(self)
    }
    
    // テーマが切り替わるタイミングでの切り替わり後の全体のテーマ
    @objc func changedTheme() {
        let isDark: Bool = ThemeManager.isDark()
        let isDarkMenu: Bool = ThemeManager.isDarkMenu()
        delegate?.changedTheme(isDark, isDarkMenu)
    }
    
    // 訪ねたタイミングでの全体のテーマ
    // 全体に対するテーマの概念が導入されたのはMojaveから
    static func isDark() -> Bool {
          if #available(OSX 10.14, *) {
              if let style = UserDefaults.standard.string(forKey: kInterfaceStyle) {
                  return style.lowercased().contains("dark")
              }
          }
          return false
      }
      
    // 訪ねたタイミングでのメニューバーのテーマ
    // 古くからメニューバーにはダークモードの概念があった
    static func isDarkMenu() -> Bool {
          if let style = UserDefaults.standard.string(forKey: kInterfaceStyle) {
              return style.lowercased().contains("dark")
          }
          return false
      }
    
}
```

```swift:使用場面AppDelegate
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
    private let theme = ThemeManager()

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        theme.delegate = self
    }

    // 能動的なテーマ取得
    func checkDarkMode() {
        let isDark = ThemeManager.isDark()
        let isDarkMenu = ThemeManager.isDarkMenu()
        Swift.print(isDark, isDarkMenu)
    }
}

extension AppDelegate: ThemeManagerDelegate {
    // 受動的なテーマ取得
    func changedTheme(_ isDark: Bool, _ isDarkMenu: Bool) {
        Swift.print(isDark, isDarkMenu)
    }
}
```

## 備考
Catalinaではライトモードでもダークモードでもないオートモードが追加されており，[こちらのレポジトリ](https://github.com/ruiaureliano/macOS-Appearance)によるとオートの時は取得したモードを反転させないといけないようだが，Catalina beta 9で確認したところ，反転させなくてよさそうだったため，仕様が揺れている可能性がある．
Rails deviseの実装

# 初めに
Railsの場合は、ログイン機能を「devise」というGemを使用することで簡単に実装することができるので、deviseの導入手順を備忘録としてメモ。

# 作業手順
1. Gemをインストールしてサーバーを立ち上げ直す
2. コマンドを利用してdeviseの設定ファイルを作成する
3. コマンドを利用してUsersモデルを作成する

### ① Gemfile deviseの指定
```ruby:Gemfile
gem 'devise'   # 最終行に追記
```
+ bunle installを実行

```ruby:ターミナル
$ bundle install
```
+ ローカルサーバーを再起動

```ruby:ターミナル
$ rails s
```

### ② コマンドを利用してdeviseの設定ファイルを作成する

```ruby:ターミナル
$ rails g devise:install
```
config/initializers/deivise.rb
config/locales/divise.en.yml
の２つのファイルが作成される。
### ③ コマンドを利用してUserモデルを作成

```ruby:ターミナル
$ rails g devise user
```
+ ```config/routes.rb```に以下のような記述が自動的に追記される。

```ruby:routes.rb
Rails.application.routes.draw do
  devise_for :users
#以下略
```
+ ```devise_for```について

devise_forはログインまわりに必要なルーティングを一気に生成してくれるdeviseのヘルパーメソッド。
devise_for :usersの記述によって「ログイン・新規登録」で必要なルーティングが生成される。

+ ```current_user```や```user_signed_in?```などのヘルパーメソッドが使えるようになる。 

### ④ rake db:migrateを実行する
```ruby:ターミナル
$ rake db:migrate
```
以上がdeviseの導入でした。
CentOS 6にPHP 7.3をインストール（Remi's RPM repository）

# はじめに

Remi's RPM repositoryを利用してCentOS6にPHP7.3をインストール
親記事：[PHP, PHP-FPMの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/dfe3823554b7caba6f6a)
参考：[Remi's RPM repository](https://rpms.remirepo.net/wizard/)

## サポート

本手法で導入した場合、[PHP: Supported Versions] (https://www.php.net/supported-versions.php)/[PHP: Unsupported Branches](https://www.php.net/eol.php)より、2021-12-06がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## note

- インストール後の更新は `yum --enablerepo=remi-php73 update`

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
CentOS release 6.10 (Final)

# yum install -y https://rpms.remirepo.net/enterprise/remi-release-6.rpm
... 略

# yum install -y --enablerepo=remi-php73 php
... 略
```

### 各種確認

```shell-session
# which php
/usr/bin/php

# php -v
PHP 7.3.10 (cli) (built: Sep 24 2019 12:36:21) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.10, Copyright (c) 1998-2018 Zend Technologies

# php -i | grep php.ini
Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini

# yum info php
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ty1.mirror.newmediaexpress.com
 * epel: nrt.edge.kernel.org
 * extras: ty1.mirror.newmediaexpress.com
 * remi-safe: ftp.riken.jp
 * updates: ty1.mirror.newmediaexpress.com
Installed Packages
Name        : php
Arch        : x86_64
Version     : 7.3.10
Release     : 1.el6.remi
Size        : 9.4 M
Repo        : installed
From repo   : remi-php73
Summary     : PHP scripting language for creating dynamic web sites
URL         : http://www.php.net/
License     : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA
Description : PHP is an HTML-embedded scripting language. PHP attempts to make it
            : easy for developers to write dynamically generated web pages. PHP also
            : offers built-in database integration for several commercial and
            : non-commercial database management systems, so writing a
            : database-enabled webpage with PHP is fairly simple. The most common
            : use of PHP coding is probably as a replacement for CGI scripts.
            :
            : The php package contains the module (often referred to as mod_php)
            : which adds support for the PHP language to Apache HTTP Server.
```
CentOS 6にPHP-FPM 7.2をインストール（Remi's RPM repository）

# はじめに

Remi's RPM repositoryを利用してCentOS6にPHP-FPM7.2をインストール
親記事：[PHP, PHP-FPMの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/dfe3823554b7caba6f6a)
参考：[Remi's RPM repository](https://rpms.remirepo.net/wizard/)

## サポート

本手法で導入した場合、[PHP: Supported Versions](https://www.php.net/supported-versions.php)/[PHP: Unsupported Branches](https://www.php.net/eol.php)より、2020-11-30がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## note

- インストール後の更新は `yum --enablerepo=remi-php72 update`

# LOG

### インストール

```shell-session
# cat /etc/redhat-release
CentOS release 6.10 (Final)

# yum install -y https://rpms.remirepo.net/enterprise/remi-release-6.rpm
... 略

# yum install -y --enablerepo=remi-php72 php-fpm
... 略
```

### php-fpm起動/停止

```shell-session
# service php-fpm start
Starting php-fpm:                                          [  OK  ]

# service php-fpm status
php-fpm (pid  178) is running...
```

```shell-session
# service php-fpm stop
Stopping php-fpm:                                          [  OK  ]

# service php-fpm status
php-fpm is stopped
```

### php-fpm自動起動設定/設定解除

```shell-session
# chkconfig php-fpm on
# chkconfig --list php-fpm
php-fpm         0:off   1:off   2:on    3:on    4:on    5:on    6:off
```

```shell-session
# chkconfig php-fpm off
# chkconfig --list php-fpm
php-fpm         0:off   1:off   2:off   3:off   4:off   5:off   6:off
```

### 各種確認

```shell-session
# which php
which: no php in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin)

# which php-fpm
/usr/sbin/php-fpm

# php-fpm -v
PHP 7.2.23 (fpm-fcgi) (built: Sep 25 2019 07:49:33)
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

# yum info php-fpm
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp.riken.jp
 * epel: ftp.riken.jp
 * extras: ftp.riken.jp
 * remi-safe: ftp.riken.jp
 * updates: ftp.riken.jp
Installed Packages
Name        : php-fpm
Arch        : x86_64
Version     : 7.2.23
Release     : 1.el6.remi
Size        : 4.2 M
Repo        : installed
From repo   : remi-php72
Summary     : PHP FastCGI Process Manager
URL         : http://www.php.net/
License     : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA
Description : PHP-FPM (FastCGI Process Manager) is an alternative PHP FastCGI
            : implementation with some additional features useful for sites of
            : any size, especially busier sites.
```
CentOS 6にPHP 7.2をインストール（Remi's RPM repository）

# はじめに

Remi's RPM repositoryを利用してCentOS6にPHP7.2をインストール
親記事：[PHP, PHP-FPMの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/dfe3823554b7caba6f6a)
参考：[Remi's RPM repository](https://rpms.remirepo.net/wizard/)

## サポート

本手法で導入した場合、[PHP: Supported Versions] (https://www.php.net/supported-versions.php)/[PHP: Unsupported Branches](https://www.php.net/eol.php)より、2020-11-30がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## note

- インストール後の更新は `yum --enablerepo=remi-php72 update`

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
CentOS release 6.10 (Final)

# yum install -y https://rpms.remirepo.net/enterprise/remi-release-6.rpm
... 略

# yum install -y --enablerepo=remi-php72 php
... 略
```

### 各種確認

```shell-session
# which php
/usr/bin/php

# php -v
PHP 7.2.23 (cli) (built: Sep 25 2019 07:48:51) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

# php -i | grep php.ini
Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini

# yum info php
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: nrt.edge.kernel.org
 * extras: ftp.iij.ad.jp
 * remi-safe: ftp.riken.jp
 * updates: ftp.iij.ad.jp
Installed Packages
Name        : php
Arch        : x86_64
Version     : 7.2.23
Release     : 1.el6.remi
Size        : 9.5 M
Repo        : installed
From repo   : remi-php72
Summary     : PHP scripting language for creating dynamic web sites
URL         : http://www.php.net/
License     : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA
Description : PHP is an HTML-embedded scripting language. PHP attempts to make it
            : easy for developers to write dynamically generated web pages. PHP also
            : offers built-in database integration for several commercial and
            : non-commercial database management systems, so writing a
            : database-enabled webpage with PHP is fairly simple. The most common
            : use of PHP coding is probably as a replacement for CGI scripts.
            :
            : The php package contains the module (often referred to as mod_php)
            : which adds support for the PHP language to Apache HTTP Server.
```
CentOS 6にPHP-FPM 7.1をインストール（Remi's RPM repository）

# はじめに

Remi's RPM repositoryを利用してCentOS6にPHP-FPM7.1をインストール
親記事：[PHP, PHP-FPMの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/dfe3823554b7caba6f6a)
参考：[Remi's RPM repository](https://rpms.remirepo.net/wizard/)

## サポート

本手法で導入した場合、[PHP: Supported Versions](https://www.php.net/supported-versions.php)/[PHP: Unsupported Branches](https://www.php.net/eol.php)より、2019-12-01がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## note

- インストール後の更新は `yum --enablerepo=remi-php71 update`

# LOG

### インストール

```shell-session
# cat /etc/redhat-release
CentOS release 6.10 (Final)

# yum install -y https://rpms.remirepo.net/enterprise/remi-release-6.rpm
... 略

# yum install -y --enablerepo=remi-php71 php-fpm
... 略
```

### php-fpm起動/停止

```shell-session
# service php-fpm start
Starting php-fpm:                                          [  OK  ]

# service php-fpm status
php-fpm (pid  177) is running...
```

```shell-session
# service php-fpm stop
Stopping php-fpm:                                          [  OK  ]

# service php-fpm status
php-fpm is stopped
```

### php-fpm自動起動設定/設定解除

```shell-session
# chkconfig php-fpm on
# chkconfig --list php-fpm
php-fpm         0:off   1:off   2:on    3:on    4:on    5:on    6:off
```

```shell-session
# chkconfig php-fpm off
# chkconfig --list php-fpm
php-fpm         0:off   1:off   2:off   3:off   4:off   5:off   6:off
```

### 各種確認

```shell-session
# which php
which: no php in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin)

# which php-fpm
/usr/sbin/php-fpm

# php-fpm -v
PHP 7.1.32 (fpm-fcgi) (built: Aug 28 2019 13:31:11)
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies

# yum info php-fpm
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp-srv2.kddilabs.jp
 * epel: nrt.edge.kernel.org
 * extras: ftp-srv2.kddilabs.jp
 * remi-safe: ftp.riken.jp
 * updates: ftp-srv2.kddilabs.jp
Installed Packages
Name        : php-fpm
Arch        : x86_64
Version     : 7.1.32
Release     : 1.el6.remi
Size        : 4.0 M
Repo        : installed
From repo   : remi-php71
Summary     : PHP FastCGI Process Manager
URL         : http://www.php.net/
License     : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA
Description : PHP-FPM (FastCGI Process Manager) is an alternative PHP FastCGI
            : implementation with some additional features useful for sites of
            : any size, especially busier sites.
```
CentOS 6にPHP 7.1をインストール（Remi's RPM repository）

# はじめに

Remi's RPM repositoryを利用してCentOS6にPHP7.1をインストール
親記事：[PHP, PHP-FPMの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/dfe3823554b7caba6f6a)
参考：[Remi's RPM repository](https://rpms.remirepo.net/wizard/)

## サポート

本手法で導入した場合、[PHP: Supported Versions] (https://www.php.net/supported-versions.php)/[PHP: Unsupported Branches](https://www.php.net/eol.php)より、2019-12-01がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## note

- インストール後の更新は `yum --enablerepo=remi-php71 update`

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
CentOS release 6.10 (Final)

# yum install -y https://rpms.remirepo.net/enterprise/remi-release-6.rpm
... 略

# yum install -y --enablerepo=remi-php71 php
... 略
```

### 各種確認

```shell-session
# which php
/usr/bin/php

# php -v
PHP 7.1.32 (cli) (built: Aug 28 2019 13:30:46) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies

# php -i | grep php.ini
Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini

# yum info php
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: ftp.riken.jp
 * extras: ftp.iij.ad.jp
 * remi-safe: ftp.riken.jp
 * updates: ftp.iij.ad.jp
Installed Packages
Name        : php
Arch        : x86_64
Version     : 7.1.32
Release     : 1.el6.remi
Size        : 9.1 M
Repo        : installed
From repo   : remi-php71
Summary     : PHP scripting language for creating dynamic web sites
URL         : http://www.php.net/
License     : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA
Description : PHP is an HTML-embedded scripting language. PHP attempts to make it
            : easy for developers to write dynamically generated web pages. PHP also
            : offers built-in database integration for several commercial and
            : non-commercial database management systems, so writing a
            : database-enabled webpage with PHP is fairly simple. The most common
            : use of PHP coding is probably as a replacement for CGI scripts.
            :
            : The php package contains the module (often referred to as mod_php)
            : which adds support for the PHP language to Apache HTTP Server.
```
CentOS 6にPHP 7.0をインストール（Remi's RPM repository）

# はじめに

Remi's RPM repositoryを利用してCentOS6にPHP7.0をインストール
親記事：[PHP, PHP-FPMの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/dfe3823554b7caba6f6a)
参考：[Remi's RPM repository](https://rpms.remirepo.net/wizard/)

## サポート

本手法で導入した場合、[PHP: Supported Versions] (https://www.php.net/supported-versions.php)/[PHP: Unsupported Branches](https://www.php.net/eol.php)より、2019-01-10がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。
(メンテナーの御慈悲でその後もアップデートされているが、いつまで続くかはわからない)

## note

- インストール後の更新は `yum --enablerepo=remi-php70 update`

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
CentOS release 6.10 (Final)

# yum install -y https://rpms.remirepo.net/enterprise/remi-release-6.rpm
... 略

# yum install -y --enablerepo=remi-php70 php
... 略
```

### 各種確認

```shell-session
# which php
/usr/bin/php

# php -v
PHP 7.0.33 (cli) (built: Aug 28 2019 14:24:26) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies

# php -i | grep php.ini
Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini

# yum info php
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp-srv2.kddilabs.jp
 * epel: nrt.edge.kernel.org
 * extras: ftp-srv2.kddilabs.jp
 * remi-safe: ftp.riken.jp
 * updates: ftp-srv2.kddilabs.jp
Installed Packages
Name        : php
Arch        : x86_64
Version     : 7.0.33
Release     : 13.el6.remi
Size        : 8.8 M
Repo        : installed
From repo   : remi-php70
Summary     : PHP scripting language for creating dynamic web sites
URL         : http://www.php.net/
License     : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA
Description : PHP is an HTML-embedded scripting language. PHP attempts to make it
            : easy for developers to write dynamically generated web pages. PHP also
            : offers built-in database integration for several commercial and
            : non-commercial database management systems, so writing a
            : database-enabled webpage with PHP is fairly simple. The most common
            : use of PHP coding is probably as a replacement for CGI scripts.
            :
            : The php package contains the module (often referred to as mod_php)
            : which adds support for the PHP language to Apache HTTP Server.
```

### パッケージ更新状況

```shell-session
# rpm -q -changelog php | head -n 20
* Wed Aug 28 2019 Remi Collet <remi@remirepo.net> - 7.0.33-13
- mbstring:
  Fix CVE-2019-13224 don't allow different encodings for onig_new_deluxe
- pcre:
  Fix #75457 heap use-after-free in pcrelib

* Tue Jul 30 2019 Remi Collet <remi@remirepo.net> - 7.0.33-12
- exif:
  Fix #78256 heap-buffer-overflow on exif_process_user_comment
  CVE-2019-11042
  Fix #78222 heap-buffer-overflow on exif_scan_thumbnail
  CVE-2019-11041
- phar:
  Fix #77919 Potential UAF in Phar RSHUTDOWN

* Tue Jul 02 2019 Remi Collet <remi@remirepo.net> - 7.0.33-11
- use oracle client library version 19.3
- disable opcache.huge_code_pages in default configuration

* Tue May 28 2019 Remi Collet <remi@remirepo.net> - 7.0.33-9
```
n個のコレクションから0～n個取り出す

テスト問題やってる時にでてきたので。勉強ついでに～

例えば、{a,b,c}のn=3であれば、

```
{}
{a}
{b}
{c}
{a,b}
{a,c}
{b,c}
{a,b,c}
```
の8種類を出力したい。
ということで以下のように作成しました。

##n個のコレクションから0～n個取り出すすべてのパターンを列挙
IEnumerableクラスを拡張して作成します。

```Collect.cs
    public static class IEnumerable
    {
        public static IEnumerable<IEnumerable<T>> MultiSelect<T>(this IEnumerable<T> items)
        {
            var cnt = items.Count();

            for (var i = 0; i < Math.Pow(2, cnt); i++)
            {
                var s = Convert.ToString(i, 2).PadLeft(cnt, '0').Reverse().ToList();
                var sOn = items.Where((_, index) => s[index].ToString() == "1");
                yield return sOn;
            }
        }
    }
```

0～2^nまでの2進数の文字列を取得すると、
"…0000","…0001","…0010",～（中略）～"…1111"と入っているはずなので、
**"1"が入っている桁＝取り出す、"0"が入っている桁=取り出さない　**
と判断するだけ。

nullを表示したくなければi=1から始めること。
順番が逆で良いなら.Reverse().ToList()は不要。


使い方は簡単。

```Main.cs
        static void Main(string[] args)
        {
            var i = new int[]{ 1, 2, 3 };
            var iRet = i.MultiSelect().ToList();
        }
```

結果は以下のようになります。

```結果

1
2
12
3
13
23
123
```



####追記

よし出来た！と思ったんだけど、**作ってから気づいた。**
コンビネーション処理をどこかから拾ってきて
nC0+nC1+…nCn（=2^n個）　で計算したほうが楽だった……
【salesforce】Apexでメールにファイル添付作ってみた

前回の機能にちょっと付け加えてみました。

[【salesforce】Apexを使ってメールを送信する機能を実装してみた](https://qiita.com/Mr_Anderson/items/534aa16d3e3453434b49)

```ruby:sample
//添付ファイルの初期化
Messaging.EmailFileAttachment temp = new Messaging.EmailFileAttachment();
//Blob値をセット
temp.setBody(tempFile);
//コンテントタイプを指定
temp.setContentType(cType);
//送信するメールの添付ファイルに作成した添付ファイルをセット
mail.setFileAttachments(new List<Messaging.EmailFileAttachment>{temp});
```

で送信って感じです。

VF側では

```ruby:sample
<apex:inputFile value="{!tempFile}" contentType="{!cType}"/>
```

こんな感じで値を渡しました。

コンテントタイプを指定しないとメールでは見ることができなかったので、
最低限必要なんだろうと思います。

もっと色々できそうですね。

奥が深い。。。

#profile

生まれも育ちも大阪の浪速中の浪速っ子が30才未経験からITエンジニアとして生きるブログもやってます。
よかったらみてください:muscle_tone2:

<a href="https://blogmura.com/profiles/11016817?p_cid=11016817"><img src="https://blogparts.blogmura.com/parts_image/user/pv11016817.gif" alt="PVアクセスランキング にほんブログ村" /></a>
Chrome リモートデスクトップ on Ubuntu

## Chrome リモートデスクトップとは
Windows/Mac/Linux対応のクロスプラットフォーム型リモートデスクトップ接続サービス。
従来はChromeアプリとして公開されていたが、2019年6月にはWeb版が公開され、FirefoxのようなChrome以外のブラウザでも対応可能になった。
利用するためには、Googleアカウントが必要になる。

## ホスト端末設定（リモート接続される側）
1. 下記URLにアクセスし、上部ヘッダーの「リモートアクセス」を選択。
https://remotedesktop.google.com/

2. 「リモートアクセスの設定」と出るため、「オンにする」をクリック。
※ Ubuntuの場合、初回は指示に従い`chrome-remote-desktop_current_amd64.deb`をインストールする。

3. 「名前の選択」は、接続するホスト名がデフォルトで付けられるが、任意で変更できる。
4. 「PINの入力」は、リモート接続するための認証番号。6桁以上の数字を設定する。
5. 「起動」を押してしばらく待つと、ステータスが「オンライン」となり、外部から接続可能状態になる。


## ゲスト端末設定（リモート接続する側）
1. ホスト設定に利用したGoogleアカウントでリモートデスクトップのURLにアクセスすると、先ほど設定したデバイスが表示される。
2. 設定したPINを入力すると、リモートデスクトップ接続が開始される。


## Ubuntu端末にリモート接続すると壁紙しか表示されない場合
まずは[リモートアクセス設定画面](https://remotedesktop.google.com/access)から、ゴミ箱アイコンの「リモート接続を無効にする」を選択。
もしくはコマンドから停止させることも可能。
`/opt/google/chrome-remote-desktop/chrome-remote-desktop --stop`

設定ファイルは`/opt/google/chrome-remote-desktop/chrome-remote-desktop`であり、必要に応じてバックアップを取っておく。

### 1. FIRST_X_DISPLAY_NUMBERの変更
Linuxには「X Window System」というGUIの基盤を提供する技術があり、アプリケーションをどのディスプレイに表示させるかを設定するDISPLAY環境変数がある（ここで言うディスプレイは物理的なモニタのことではない）。
Ubuntuホスト端末で以下のコマンドを打てば確認できる。

```
echo $DISPLAY
:0 // 出力結果 DISPLAY=（ホスト）:（ディスプレイ）.（スクリーン）
```
この場合、ホスト名が省略されているため、localhostの0番ディスプレイと解釈される。

設定ファイルのデフォルトでは使用するX_DISPLAY初期値が20になっているが、上記の結果から0番に変更する必要がある。
`FIRST_X_DISPLAY_NUMBER = 20`
↓
`FIRST_X_DISPLAY_NUMBER = 0`

### 2. get_unused_display_number()の修正
while文の箇所は操作を受け付けないディスプレイをパスする（使えるディスプレイを特定する）部分であり、ディスプレイ番号は先ほど指定したため、コメントアウトする。

```
@staticmethod
def get_unused_display_number():
    """Return a candidate display number for which there is currently no
    X Server lock file"""
    display = FIRST_X_DISPLAY_NUMBER
    while os.path.exists(X_LOCK_FILE_TEMPLATE % display):
      display += 1
    return display
```
↓

```
@staticmethod
def get_unused_display_number():
    """Return a candidate display number for which there is currently no
    X Server lock file"""
    display = FIRST_X_DISPLAY_NUMBER
    # while os.path.exists(X_LOCK_FILE_TEMPLATE % display):
    #  display += 1
    return display
```

### 3. launch_sessionの修正
使用するホスト画面を明示するように修正

```
def launch_session(self, x_args):
    self._init_child_env()
    self._setup_pulseaudio()
    self._setup_gnubby()
    self._launch_x_server(x_args)
    self._launch_x_session()
```
↓

```
def launch_session(self, x_args):
    self._init_child_env()
    self._setup_pulseaudio()
    self._setup_gnubby()
    # self._launch_x_server(x_args)
    # self._launch_x_session()
    display = self.get_unused_display_number()
    self.child_env["DISPLAY"] = ":%d" % display
```

設定を保存したら、ホスト端末からリモートアクセスを再度立ち上げる。

## 参考
https://webnetforce.net/ubuntu-chrome-remote-trouble/
Wikipediaの寄付お願いを閉じるChrome拡張作った

## きっかけ
Wikipediaさん、いつもお世話になってます。
寄付したけどある時Cookie消したらまた寄付しろと言ってきたのでさすがに嫌になって作りました。
適当に作っただけなのでネタ扱いです。
できたら寄付してから使ってください。

公開したもの↓
https://chrome.google.com/webstore/detail/wikidonatecloser/fhbpehoihpnchniinnbkpcgnjfdhoiea?hl=ja

以下開発者向け。

## 拡張を準備する

適当な場所にフォルダをひとつ作り、その中に以下の2ファイルを作成。

- manifest.json
- content_script.js

```json:manifest.json
{
    "manifest_version": 2,
    "name": "WikiDonateCloser",
    "version": "1.0",
    "description": "WikiDonateCloser",
    "permissions": [
        "http://ja.wikipedia.org/*",
        "https://ja.wikipedia.org/*"
    ],
    "content_scripts": [
        {
            "matches": [
                "http://ja.wikipedia.org/*",
                "https://ja.wikipedia.org/*"
            ],
            "js": [
                "content_script.js"
            ]
        }
    ]
}
```

```javascript:content_script.js
window.onload = () => {
    let selectors = [
        `#frb-inline > div.frb-inline-bottombar > button`,
        `#frb-form > div.frb-step.frb-step-1 > button.frb-icon-btn.frb-close`,
        `#frb-nag > div > button`
    ];

    let i = 0;
    let hit = false;

    let id = this.setInterval(() => {
        
        selectors.forEach(selector => {
            let element = document.querySelector(selector);
            if(element) {
                element.click();
                hit = true;
                console.log("Closed!");
            }
        })

        if(hit === true || i == 20) this.clearInterval(id);

    }, 100);
}
```

## 簡単に解説

```javascript
let selectors = [
    `#frb-inline > div.frb-inline-bottombar > button`,
    `#frb-form > div.frb-step.frb-step-1 > button.frb-icon-btn.frb-close`,
    `#frb-nag > div > button`
];
```
閉じるボタンはパッと確認した限り3種類だったので、セレクターを配列にして格納。

```javascript
let i = 0;
let hit = false;
let id = this.setInterval(() => {
...
```
寄付お願いの部分はどうも遅延で読み込まれるみたいなので、20回ぐらいまでリトライするようにしました。
hitはsetInterval止めるためのフラグ。(いいやり方あれば教えてください)

```javascript
selectors.forEach(selector => {
    let element = document.querySelector(selector);
    if(element) {
        element.click();
        hit = true;
        console.log("Closed!");
    }
})
```

用意したセレクターを回して要素があればクリックするだけ。

```javascript
if(hit === true || i == 20) this.clearInterval(id);
```

要素があった時点でclearIntervalしても良かったんですが、それだと1種類目を閉じた段階で抜けてしまうので、下にスクロールすると残ってました。
いいやり方あれば(略

## ローカルインストール

URL欄に`chrome://extensions/`と入力してエンター。
右上の「デベロッパーモード」をON。
作成したフォルダをドラッグ&ドロップ。

## 終わり

Wikipedia使ってる人は寄付しましょう。
Teminal(bash, zsh, ...)上でファイル名をClipboardにコピー

# 概要
ある程度Mac/Linuxをカタカタするようになると、Terminal上でファイル名をコピーして使いまわしたい、、、なんて場面があるはず。以外とググっても出てこなかったので、書き留めておく

# 方法
```zsh
$ ls [filename] | pbcopy
```
# おわり
それだけ、以上
CentOS 6にPHP-FPM 5.3をインストール（OS標準）

# はじめに

CentOS6にPHP-FPMを標準インストール
親記事：[PHP, PHP-FPMの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/dfe3823554b7caba6f6a)

# LOG

### インストール

```shell-session
# cat /etc/redhat-release
CentOS release 6.10 (Final)

# yum install -y php-fpm
... 略
```

### php-fpm起動/停止

```shell-session
# service php-fpm start
Starting php-fpm:                                          [  OK  ]

# service php-fpm status
php-fpm (pid  116) is running...
```

```shell-session
# service php-fpm stop
Stopping php-fpm:                                          [  OK  ]

# service php-fpm status
php-fpm is stopped
```

### php-fpm自動起動設定/設定解除

```shell-session
# chkconfig php-fpm on
# chkconfig --list php-fpm
php-fpm         0:off   1:off   2:on    3:on    4:on    5:on    6:off
```

```shell-session
# chkconfig php-fpm off
# chkconfig --list php-fpm
php-fpm         0:off   1:off   2:off   3:off   4:off   5:off   6:off
```

### 各種確認

```shell-session
# which php
/usr/bin/which: no php in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin)

# which php-fpm
/usr/sbin/php-fpm

# php-fpm -v
PHP 5.3.3 (fpm-fcgi) (built: Mar 22 2017 12:28:05)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

# yum info php-fpm
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
 * base: ftp.riken.jp
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp
Installed Packages
Name        : php-fpm
Arch        : x86_64
Version     : 5.3.3
Release     : 49.el6
Size        : 3.2 M
Repo        : installed
From repo   : base
Summary     : PHP FastCGI Process Manager
URL         : http://www.php.net/
License     : PHP
Description : PHP-FPM (FastCGI Process Manager) is an alternative PHP FastCGI
            : implementation with some additional features useful for sites of
            : any size, especially busier sites.
```
IntelliJ で Spring Boot プロジェクトを作成する方法

## はじめに
分からないことだらけなので、とりあえずrunしてlocalhostで見れるところまでをまとめました。

## 環境
- Java 12(openjdk 12.0.1)
- IntelliJ IDEA 2019.2(無料版,Community で問題なし)
- Mac OS X 10.14.6

## IntelliJ でプラグインを導入
- IntelliJ のトップ（Welcome to IntelliJ IDEA）を開く
  - 別のプロジェクトを開いている場合は、File -> Close Project で閉じる
- 右下 Configure -> Plugins を開く
<img width="775" alt="スクリーンショット 2019-07-30 21.52.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400301/3c8cde70-8cf2-c746-f88c-95ceeefdc106.png">
<img width="354" alt="スクリーンショット 2019-07-30 21.54.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400301/0c91807a-2ad1-4f30-dc34-f2df9e037c34.png">
- Marketplace から**Spring Assistant**を検索で探し、Install
<img width="1552" alt="スクリーンショット 2019-07-30 21.56.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400301/976b5323-7a0b-dec6-4dff-9fddb0f4378c.png">
- IntelliJ をリスタート

## プロジェクト作成 その１

- Create New Project を選択
- 左側に先ほどインストールした**Spring Assistant**があるので選択
- Project SDK で Java のバージョンを選択
- Spring Initializr server は Default のままで OK
  - 他のを選ぶとどうなるか不明なので、各自調べてください
<img width="1552" alt="スクリーンショット 2019-07-30 21.56.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400301/610c8e9c-fb43-8fd0-dcca-2e4d8de35e34.png">


## プロジェクト作成 その２
- Project Type → Gradle Project
  - Gradle しか使ったことがないのでとりあえず
- Langage → Java
- Package → Jar
  - Jar と War の違いが分かりません
- Java version → SDK で選択した Java のバージョンと揃えると思われる
<img width="1552" alt="スクリーンショット 2019-07-30 21.57.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400301/1633a7ad-3979-f401-e958-b213bf8c20fd.png">

## プロジェクト作成 その３
- 依存関係を追加（以下おすすめ）
  - Spring Boot DevTools
  - Spring Web Starter
  - Spring Web Service
  - Tymeleaf
<img width="1552" alt="スクリーンショット 2019-07-30 21.57.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400301/b3d8a7a7-6f6c-8fff-9878-cd556d8eb1c0.png">
- いろんな選択肢があるので、ぜひ調べて使ってみてください
- これはこういう機能などコメントいただけると嬉しいです

## ブラウザで見る
- Application.java は自動的に作成されるので、Controller を作るか、それに準ずるコードを書く必要あり
    - 気が向いたら追記します
- HTML ファイルは、src/main/resources/templatesディレクトリを作成し、その中に入れる
- resources/application.propaties へ`server.port=3000`のように適当な番号を追記すると、デフォルトの 8080 から[localhost:3000](http://localhost:3000/)に変更できる

## おわりに
Springフレームワークはまだまだ分からないことだらけですが、IntelliJさえあればプロジェクト新規作成ができるのは個人的にけっこう便利なのではないかなと思いました！
NetlifyでNextjsのホームページをデプロイするための設定備忘録

### 目的と前提
* NetlifyでNextjsを導入したモジュールをデプロイする。
* GitHubとの連携済みで、デプロイ可能な状態になっている前提。

### コマンド設定
* `package.json` に以下のコマンドを追加する。
 
```
"scripts": {
"dev": "next",
.
.
"export": "next export",
"deploy": "npm run build && npm run export",
}
```
### Netlifyでのデプロイ設定
* publishするディレクトリを設定しないとデプロイが失敗する。
* プロジェクト >> 「Settings」 >> 「Build settings」　にて、下記のように設定する。
* 
```
Build command:    npm run deploy
```
```
Publish directory:    out/
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311215/4eaa6f50-6131-6429-4e12-989239221a48.png)



## 参考URL
* [Deploy Next.js project to Netlify
](https://dev.to/kozakrisz/deploy-nextjs-project-to-netlify-4bd5)
* [公式ドキュメント](https://nextjs.org/docs/)
scssの変数をcssの変数に入れる

以下のようにすると入らない。

```scss
$base0: #839496;

:root {
  --base0: $base0;
}
```

変数展開っぽく書くと展開される。

```scss
$base0: #839496;

:root {
  --base0: #{$base0};
}
```

インターポレーションというらしい、変数展開じゃないのか:rolling_eyes:

## ダークモード対応
ダークモードに対応するときなどには、以下のようになる。

```scss
:root {
  --base3: #{$base3};
  --base2: #{$base2};
  --base1: #{$base1};
  --base0: #{$base0};
  --base00: #{$base00};
}

@media (prefers-color-scheme: dark) {
  :root {
    --base3: #{$base03};
    --base2: #{$base02};
    --base1: #{$base01};
    --base0: #{$base00};
    --base00: #{$base0};
  }
}
```

カラースキームから持ってきたやつを入れればいいだけなので、簡単・便利・安心。
【Rails】created_at、updated_atを日本時間に変更して良い感じに表示する方法

Ruby on RailsでWebサービスを作っていたら、日本時間への設定変更でつまずいてしまいました。

 

2019-07-09 10:00 + 0900みたいな表示になってしまう。
+0900じゃなくて、2019年07月09日 19時みたいな感じにしたい。

 

そこでこの記事では

- タイムゾーンを日本時間に変更する方法
- 良い感じに日本時間を表示する方法

についてまとめてみました。

 

##【Rails】created_at、updated_atを日本時間に設定する方法
以下の４ステップでタイムゾーンを変更できます。

###ステップ1：config/application.rbにタイムゾーンの設定を追加
config/application.rbを開くと、以下のようなコードが記述されています。


 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266250/1726a18a-dcab-034d-44e1-0995f8dbfe24.png)


このファイルに、以下のコードを記述してください。


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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266250/d5cf0f5a-718d-8890-ceb7-973e24d0962f.png)


###ステップ2：サーバーを再起動させる
そして、rails sでサーバーを再起動させます。

そうすると、以下のように日本時間で表示されるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266250/bffb09b4-069e-6661-1d51-6ec43b6b075e.png)


ただ、これだと読みにくいので、さらにコードを記述していきます。

 
###より見やすいように修正する
config/initializers/time_formats.rbというファイルを作ってください。

 

そして作ったファイルに、以下のコードを記述しましょう。

```config/initializers/time_formats.rb
Time::DATE_FORMATS[:datetime_jp] = '%Y年 %m月 %d日 %H時 %M分'
```
コードを書いたら、サーバーを再起動します。


###ステップ４：viewの修正をする
次にやるのがviewファイルの修正。

to_sメソッドを呼び出して、引数にフォーマット名を指定。

ちなみにto_sとは配列を文字列に変換するメソッドで、配列の各要素を文字列に変換して連結した文字列を返します。


以下のコードを日本時間へ修正したい箇所に追加します。

【before】

```任意のview.html.erb
<%= xxx.created_at %>
<%= xxx.updated_at %>
```


【after】

```任意のview.html.erb
<%= xxx.created_at.to_s(:datetime_jp) %>
<%= xxx.updated_at.to_s(:datetime_jp) %>
```


そうすると、以下のようにいい感じに日本時間が表示されるようになります。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266250/01735e32-febf-d1a1-5500-1f3e5d2949c6.png)



##まとめ
日本時間の表示は、設定としてフォーマットを定義しておくと便利です。

このように設定しておけば、楽にタイムゾーンを日本時間へすることができます。
【Swift入門】イニシャライザについて

##1. イニシャライザとは
* __イニシャライザ__とは、クラスの初期設定を実行するメソッドのこと。
* クラスの初期設定とは、「__自身のプロパティに初期値を設定すること__」。
* クラスによっては初期化が必須の場合がある。初期化が必要なクラスについては、インスタンスを生成するタイミングで初期値を設定することが義務付けられており、それを実現するのが__イニシャライザ__。

```swift:架空のIPhoneクラスの宣言
class IPhone {
	var language:String
	var passcode:String
	// イニシャライザ
	init(language:String, passcode:String) {
		self.language = language
		self.passcode = passcode
	}
}
```



##2. イニシャライザの宣言

```swift:イニシャライザ宣言の型
init(<ラベル1> <引数名1>:<型>, <ラベル2> <引数名2>:<型>…) {
	<文>
}
```

```swift:イニシャライザ宣言の例
// イニシャライザ
init(language:String, passcode:String) {
	self.language = language
	self.passcode = passcode
}
```
* イニシャライザ書き方はメソッドと似ているが、「メソッド名」にあたる識別子の記述はない。
* 引数名がない場合は、空の()を書く。{}の中には、初期値を設定するためのコードを記述する。

##3. イニシャライザの呼び出し

```swift:イニシャライザを間接的に呼び出す書式
var <変数名> = <クラス名>(<ラベル1>:<引数>, <ラベル2>:<引数>)
```

```swift:IPhoneクラスのインスタンスの生成とイニシャライザの呼び出し
var iPhone = IPhone(language:"日本語", passcode:"0123")
```
* イニシャライザは、通常のメソッドのように直接呼び出すことはできない。
* イニシャライザは、インスタンスを生成する書式の中で間接的に呼び出される。
* 上記のように書くと、IPhoneクラス内のイニシャライザが呼び出されて、languageプロパティと、passcodeプロパティに初期値が代入される。
* 今回のIPhoneクラスの宣言ではラベルを書かなかったが、「__メソッドの宣言時にラベルを省略した場合は引数名と同じになる__」というルールがあるので、上記のように呼び出し時にはラベルを指定できる。

##3. デフォルトイニシャライザ
* `クラス名()`のように引数は指定せずにインスタンスを生成すると、引数が一つもない「`init()`」というイニシャライザが自動的に呼び出される。
* このイニシャライザは、__クラス内の全てのプロパティに初期値が設定されている場合__に、Swiftが自動的に作ってくれるもの。
* => このイニシャライザのことを、__デフォルトイニシャライザ__という。


```swift:デフォルトイニシャライザの例
class IPhone {
	var language = "日本語"
	var passcode = "0123"
}
var IPhone = IPhone()
```
上記のようになっている場合は`init(){}`を書く必要はなく、インスタンス生成時に引数の指定も不要。

#####■デフォルトイニシャライザの重要なポイント
「全てのプロパティに初期化が設定されている場合、Swiftが自動的にinit(){}を追加してくれる」。
CentOSにnasmをインストール

#CentOSにnasmをインストール

###利用環境
>
VirtualBox 6.0.12 platform packages
CentOS-7-x86_64-DVD-1908.iso
nasm-2.14.02
>

30日でできるOS自作入門 という本も買って勉強している
ちょこっとアセンブラで遊ぶ為に、勉強用のCentOSにNASMを入れてみた。

[NASM公式サイト](https://www.nasm.us/)
から、2019/09/28時点の最新 nasm-2.14.02 のソースコードをダウンロード
解凍はWindows上で実施した。

```
./configure
make
sudo make install
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480709/658e5c57-c2c0-e32f-6e32-52b80a1903f8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480709/6cb79044-0e21-99b3-df05-1200c7ad5275.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480709/430aa536-d43f-c9e8-9aaf-23a55d709201.png)

```
nasm --version
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480709/5529e301-3496-32fd-029b-888ed7477a4e.png)

しかし、Cコンパイラでアセンブラをコンパイルするって
卵が先か鶏が先かみたいで、感慨深いｗ
Virtualbox環境にて、CentOS8を構築する

本記事はCentOS8をVirtualbox環境にインストールしたい人向けの記事です。

# TL;DR

基本的には画面の指示に従っていけば問題なくインストールできますが、いくつか罠があったのでそこだけ注意。

# 環境
Window 10 Home
Virtualbox 5.2.8r
# 手順　

## dvd.isoをローカルPCにダウンロードする
[CentOS公式ダウンロードページ](https://www.centos.org/download/)から。
6.6GBあるので、ゆっくり待ちましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124948/87b265b2-d52c-5466-e7c2-212359995446.png)


## Virtualbox上でインストール

DVD isoをVirtualboxのドライブにセットし、仮想環境を立ち上げてインストールします。
基本的に、画面の指示に従っていけば問題なくインストールできます。

この方が、スクショ付きで解説されているのでご参考まで。本記事ではスクショは割愛します。
[CentOS8 OSインストール/cockpit/リポジトリ追加/Ansible/snappy](https://qiita.com/tukiyo3/items/d87c8752f2b59f73d062)

以下、Virtualboxでインストールする際の注意点です。
### 注意点1
Virtualboxでの仮想サーバ作成時、
メモリはデフォルト1GB(1024MB), ディスクは8GBですが、
CentOS8のメモリ推奨は1.5GB、ディスク必要容量は8GB強あります。

メモリ1GBで怒られるかどうかはわかりませんが、ディスク8GBだと自動パーティションに容量が足りないと怒られます（手動でパーティション調整すればいけるような気がします）

初回の仮想環境作成時に、ディスクは16GB程度確保しておくようにしましょう。

### 注意点2
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124948/f7f23dcc-9491-5b9a-3f07-c556fd64d332.png)

「Server with GUI」を選択してCentOS8をインストールすると、インストールが正常に完了したのち、OSが立ち上がってこなくなります。
「Server」を選択してインストールを行いましょう。

ありがとうございました -> [CentOS 8 リリース待ち→リリースされた2019-09-24(^^)](https://tech.godpress.net/?p=1071)

## Hello, CentOS8 !
これでコンソール画面からの接続ができるようになったはずです。

## ホスト端末からSSH接続を行う
RLogin等のターミナルソフトを使って、SSH接続をしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124948/d3722aa0-88a1-8da3-7c59-9698686e8a5e.png)
設定> ネットワーク > ポートフォワーディングから、いつものようにポートフォワードの設定を入れます。

Ubuntuの場合はこれでよかったですが、CentOSの場合はこれに加え、ネットワークインターフェースの有効化が必要みたいです。

`/etc/sysconfig/network-scripts/`以下の、`ifcfg-enp0s3`等ファイルを編集します。

```
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp0s3
UUID=d3780950-2513-4e68-8c97-ffd4567ce20e
DEVICE=enp0s3
ONBOOT=yes
```
ONBOOTをyesに変更して保存し、サーバをリブート。
ありがとうございました -> [VirtualBox に入れた CentOS のネットワーク設定](https://www.shookuro.com/entry/2018/02/10/172724)

後は、sshコマンド発行すれば入れます。
今回のポートフォワードの設定であれば、発行するコマンドは以下のようになります。

```
ssh root@127.0.0.2 -p 2222
```

## 日本語入力を有効にする

日本語の言語パックをインストールしましょう。日本語の文字化けを防ぐことができます。
dnfのエラーコードを解消することもできます（[詳細リンク](https://qiita.com/takizawafw6o2o/items/d6a15b5ae05d85ae1f41)）。

```
# sudo yum -y install langpacks-ja
```

# 参考

- [VirtualBox に入れた CentOS のネットワーク設定](https://www.shookuro.com/entry/2018/02/10/172724)
- [CentOS 8 リリース待ち→リリースされた2019-09-24(^^)](https://tech.godpress.net/?p=1071)
MongoDB   Oracleのdual表と同じようにダミーCollectionを作って活用しよう

# 概要

Oracleのdual表と同じようにダミーCollectionを作るとAggregationのいろいろなテストが出来る。

# ダミーCollectionの作成

データベース名は**dummy**でCollectionを**dual**とする

**dual**のデータを作成する


```javascript
> use dummy
switched to db dummy
> db.dual.insert({_id:1})
WriteResult({ "nInserted" : 1 })
> db.dual.find()
{ "_id" : 1 }
>
```

# dualを使った例

## データが1件で良い場合

**$indexOfArray**のテスト

```javascript
db.getSiblingDB("dummy").dual.aggregate([
    {$project:{
        idx1:{$indexOfArray:[[1,2,3,4],3]},
        idx2:{$indexOfArray:[[1,2,3,4],5]}
    }}
])
{ "_id" : 1, "idx1" : 2, "idx2" : -1 }
```

上記の**$indexOfArray**をフィールド名を使った例にする。

```javascript
db.getSiblingDB("dummy").dual.aggregate([
    {$project:{
       array:[1,2,3,4],
       idx1: {$literal: 3}
    }},
    {$project:{
        idx1:{$indexOfArray:["$array","$idx1"]},
        idx2:{$indexOfArray:["$array",5]}
    }}
])
{ "_id" : 1, "idx1" : 2, "idx2" : -1 }
```

上記での注意点は`idx1: {$literal: 3}`を`idx1:3`としないことです

## データが複数件必要な場合 

**$group**の例

ここで問題になるのが、**dual**は1件しかないので**$group**は難しいです。まずは複数のデータ作成するところから考えます。

```javascript
db.getSiblingDB("dummy").dual.aggregate([
    {$project:{
      _id: 0,
      idx:[0,1,2,3],
      data:[[2, -1], [1, 20], [2, 1], [1, 10]]
    }}, 
    {$unwind: "$idx"},
    {$project:{
      key: {$arrayElemAt:[{$arrayElemAt:["$data", "$idx"]}, 0]},
      num: {$arrayElemAt:[{$arrayElemAt:["$data", "$idx"]}, 1]}
    }}
])
{ "key" : 2, "num" : -1 }
{ "key" : 1, "num" : 20 }
{ "key" : 2, "num" : 1 }
{ "key" : 1, "num" : 10 }
```

`idx`が`data` の添え字を表し、`data`が`key`と`num`の配列`[[key0,num0],[key1,num1],...]`になっています。その後の`$unwind`で複数ドキュメントを作成して`$project`で整形します。

このデータを使って`$group`を実行します。

```javascript
db.getSiblingDB("dummy").dual.aggregate([
    {$project:{
      _id: 0,
      idx:[0,1,2,3],
      data:[[2, -1], [1, 20], [2, 1], [1, 10]]
    }}, 
    {$unwind: "$idx"},
    {$project:{
      key: {$arrayElemAt:[{$arrayElemAt:["$data", "$idx"]}, 0]},
      num: {$arrayElemAt:[{$arrayElemAt:["$data", "$idx"]}, 1]}
    }},
    {$group:{
        _id:"$key", sum:{$sum:"$num"}
    }}
])
{ "_id" : 2, "sum" : 0 }
{ "_id" : 1, "sum" : 30 }
```

# NumberDecimalの四則演算に活用

mongo shellでNumberDecimalの演算方法が見つかりませんでしたので自分で作ってみます。例は加算(`add`)のみ記載します。以下を`.mongorc.js`に記述します。

```javascript:.mongorc.js
NumberDecimal.prototype.add = function(other) {
  let result = db.getSiblingDB("dummy").dual.aggregate([
     {$project:{
      result:{$add:[this, other]}, _id: 0
     }}
  ]).toArray()
  return result[0].result
}
```

演算例

```javascript
> num=NumberDecimal("123456789012345678901234567890")
NumberDecimal("123456789012345678901234567890")
> num.add(NumberDecimal("1"))
NumberDecimal("123456789012345678901234567891")
```


# 終わりに

死活の確認のために`ping`コマンドの代わりに`dual`を`find`で対応することも可能です。用途はほぼOracle同様の使い方と同じです。 
問題があるとすれば、`$lookup`や`$graphLookup`には使えないことです。これらは複数のドキュメントを持っているCollectionが必要になります。別途`dual`以外のCollectionを作れば対応可能です。
M5Stack BeetleC Robotic Car

##1. 概要

M5Stack BeetleCを購入しました。
制御用にM5StickCを使用するロボットカーです。まず簡単に動作させられたので記事にします。

##2. 購入

https://www.aliexpress.com/item/4000059458353.html?spm=a2g1y.12024536.productList_5885013.pic_11
ここのAliExpressのM5Stack公式ショップから購入しました。
ちなみに中国からシンガポール(why?)を経由して到着まで二週間ほどかかりました。

##3. 写真

このような感じのものです。(BeetleCは台車部分のみになります。M5StickCは必須です）
大きな前輪側をモーターで回転させることができます。ステアリングはありませんが、左右の前輪を別々に回転させられるので、それで方向を変えます。（後述）
![image2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252749/85c84789-4494-0472-b79b-a044dc87bdec.jpeg)

裏側にはLEDがいくつかついていて、赤とか青とか緑で点灯させることが出来ます。（まだ試していませんが、Arduinoサンプルコードを見ると色はプログラムで変更できそうです）
![image1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252749/02fab065-0c92-ea95-93c3-0691745deac4.jpeg)

後ろに電源スイッチがあります。
![image0.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252749/51ced080-13d7-cf84-4414-5f9a7b4ce030.jpeg)

##4.セットアップ

###4.1 とりあえず動かす

https://github.com/m5stack/m5-docs/blob/master/docs/en/hat/hat-beetlec.md
に書いてある通りなのですが、

- M5StickCをbeetleCに接続します。（ピンを曲げないようまっすぐぶすっと差します）
- M5StickCをWindows PCで認識させられるようにする（検索するといろいろあると思います）
- click to download EasyLoaderからEasyLoaderプログラムをダウンロードして実行し、つないだM5StickCにアプリを書き込みます。書き込んだらPCから外してかまいません。
- M5StickCを再起動します。beetleCの電源もオン側にしておきます。再起動すると台車裏のLEDが光ったり、Aボタン(LCD直下の大きなボタン)を押すと前輪が短時間回転します。これが動作確認になるので、LEDが光らないとか車輪が回らないとかあればbeetleCの電源スイッチやM5StickCとの接続を確認します。あ、あとPCから外しているなら充電状況も。
- M5StickCでWiFiのAPが起動しているので、スマホのWiFi画面のAP一覧を見るとbeetleC(MACアドレス)っぽいのが出ていることを確認します
- そのAPに接続します。パスワードは12345678です
- ブラウザを起動し、192.168.4.1/ctl を開きます

![smartphone.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252749/97adcc3b-0ea3-4096-2a21-96988f53ce50.jpeg)
このような画面が出ればOKです。
左右の縦スライダーを動かせば車輪が回転し(上側が前進、下側は後退です)、下のカラー□をタップすると台車下のLEDがその色で点灯します。

###4.2 Arduino IDEでプログラムを動かす

https://github.com/m5stack/M5-ProductExampleCodes
の[Clone or Download]で、PCにサンプル集をダウンロードします。

zipを展開するとbeetleCというフォルダがあるので、そこのbeetleC.inoファイルをArduino IDEで開きます。

で、M5StickCをつないだままビルドして転送すれば4.1項と同様に動作します。
こちらのinoソースを見ればWifiのパスワードとかいろいろ変更することができるのがわかります。

とりあえずここまでになります。

##5. その他

M5StickCとBeetleCは上側のHATピンのみで接続していて、後ろ側(USBポートやGROVEポートがある側)では何も固定されていません。なので、USBケーブルの抜き差しやBeetleCとの抜き差し時にはピンを曲げてしまわないよう気をつけましょう。

以上です。　ありがとうございました。
Herokuで動かすJavaアプリにNew Relicを導入する

あまり日本語の記事も見当たらなかったので、[New Relicの公式ドキュメント](https://docs.newrelic.com/docs/agents/java-agent/heroku/java-agent-heroku)を見ながら作業をした備忘録となります。

## New Relic APMを追加
herokuコマンドでも、画面のConfigure Add-onsからでもよいので、New Relicのアドオンを追加します。
（後でNew Relicの管理画面に行くので、画面からの方が楽かも…？）

## Java Agentを導入
通常であればキーは**newrelic.yml**をjarと同じディレクトリに配置して読み込ませますが、キーのgit管理を避けるためJava Agentを導入します。

### アプリ名を登録
**NEW_RELIC_APP_NAME**というキーでHerokuのConfig Varsにアプリ名を登録します。
settings.gradleや、pomならartifactIdに記載したものでよいと思います。

```
heroku config:set NEW_RELIC_APP_NAME="APP_NAME"
```

### キーを登録
キーはNew Relicの管理画面から取得できます。
<img width="930" alt="スクリーンショット 2019-09-28 18.06.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90107/177df7b6-d3ef-fbab-2da5-13e5e32546a2.png">
APMを選択して
<img width="712" alt="スクリーンショット 2019-09-28 18.09.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90107/808e0d63-f7f5-6f91-f391-4ca1baa69333.png">
Javaを選択するとこの画面になるので、「Reveal license key」を押下してキーを取得します。
そして**NEW_RELIC_LICENSE_KEY**というキーで登録します。

```
heroku config:set NEW_RELIC_LICENSE_KEY="LICENSE_KEY"
```

### Gradle設定
Mavenの場合は公式ドキュメント側に記載されている通りで、Gradleの場合は以下で動作を確認できました。

``` gradle:buld.gradle
dependencies {
  .....
  compileOnly 'com.newrelic.agent.java:newrelic-java:5.7.0'
}
```

（記載時点では5.7.0が最新でした。）

## newrelic.jar導入

jarは先ほどのNew Relicの管理画面から取得してきます。
<img width="712" alt="スクリーンショット 2019-09-28 18.09.14 2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90107/088eca98-bcf0-c87b-46df-c5d8ee295f50.png">
リンクを押下するとzipが落ちてくるので、解凍して「**newrelic.jar**」のみプロジェクトのドコかに配置します。
（Procfileに記載するので、どこでもいいと思います。）

## Procfileの変更

最後にProcfileに**javaagent**オプションを追加します。
例えばSpringbootで、newrelic.jarをプロジェクト直下に配置した場合は

``` :Procfile
web: java -jar build/libs/app-0.0.1-SNAPSHOT.jar
```

↓↓↓↓↓

``` :Procfile
web: java -javaagent:newrelic.jar -jar build/libs/app-0.0.1-SNAPSHOT.jar
```

となります。

## deploy

あとはデプロイすれば、最長でも5分後にはこのような画面となり、アプリを選択するとWeb transactions timeなどが見れるようになります。

<img width="1112" alt="スクリーンショット 2019-09-28 18.32.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90107/299a3449-1cbc-0ea4-c2cc-edf9a223e62e.png">

お疲れ様でした。

## 余談

思ったよりもメモリを使うようです。。。
私のアプリの場合はSpring Batchも動かしているからか、**Error R14 (Memory quota exceeded)**が発生したため、運用を諦めました。
ジワジワと使用されるメモリが増えてきます。
Firebaseでプッシュ通知をする際に画像が添付できない

#Firebaseでプッシュ通知をする際に画像が添付できない
Firebaseを活用してプッシュ通知を打っているんですが、画像を添付するとエラーが出てしまうのですが要因はなんでしょうか？
お助けください！！
kotlinのSingleton

# Singletonとは
Singletonとはクラスのインスタンスが1つしか生成されないことを保証するものです。
kotlinではオブジェクト宣言よって作成されたオブジェクトは、シングルトンオブジェクトとなります。
# kotlinのSingleton(object)の使い方
kotlinではオブジェクトを宣言することでSingletonのオフジェクトになります。

```kotlin
object SingletonObject {
    var text = "hello world"
}

fun main() {
    println(SingletonObject.text)
}
```
実行結果

```
hello world
```
objectはインスタンス化はできません。
よって、オブジェクト宣言によって作成されたオブジェクトは、シングルトンオブジェクトとなります。

```kotlin
object SingletonObject

fun main() {
    val singletonObject = SingletonObject() //インスタンス化できない。コンパイルエラーとなる
}
```
実行結果

```
Error:(8, 27) Kotlin: Expression 'SingletonObject' of type 'SingletonObject' cannot be invoked as a function. The function 'invoke()' is not found
```
### 継承
objectはスーパータイプを持つことができます。

```kotlin
interface MyInterface {
    fun bar()
    fun foo() {
        println("fun foo")
    }
}

object SingletonObject: MyInterface {
    override fun bar() {
        println("fun bar")
    }
}

fun main() {
    SingletonObject.bar()
    SingletonObject.foo()
}
```
実行結果

```
fun bar
fun foo
```
【RPA】自分がRPAをやるうえで使ったXPath

#知らないと困るXPath
RPAでスクレイピングをやっていると特定の部分を指定して抽出するためにXPathも知識が必要になってきます。
今回は自分がスクレイピングをするうえで必要だったXPathを取り上げます。


##XPathとは
XPathとは、XML Path Languageの事でXML形式の文書から、特定の部分を指定して抽出するための簡潔な構文です。
HTML形式の文書にも対応します。

###パスの種類

今回は使ったものだけ記述します。
おそらく皆さんも使用すると思います。


**使った一覧**

.(ピリオド)・・・コンテキストノードを選択する

..(ダブルピリオド)・・・コンテキストノードの親を選択する

//para・・・ルートノードの子孫ノードから要素ノード para をすべて選択する。

//para・・・ルートノードの子孫ノードから要素ノード para をすべて選択する。

para[1]・・・コンテキストノードの 1番目の子要素 para を選択する

chapter[title="Introduction"]・・・コンテキストノードの子要素 chapter のうち、文字列値が Introduction である
　　　　　　　　　　　　　　　　　　　子要素 title を 1個以上持つものを選択する

text()・・・コンテキストノードのすべての子テキストノードを選択する

text()・・・コンテキストノードのすべての子テキストノードを選択する

following-sibling・・・コンテキストノードの後ろにあるすべての兄弟ノードの集合


今回は以上です。最後まで読んでいただき、ありがとうございました。