OmniAICreator/Qiita-1.07M huggingface dataset:
~/bin/をサーバ群で同期する。

##概要
[serverを巡回し、各サーバでdf; wを実行しサーバの状況を一括出力するスクリプト](https://qiita.com/lapidem/items/67bd2ad6d56bb120e4d5)と同様の方法で、~/bin/を順次rsyncするスクリプト。
どこかのサーバではスクリプトを更新したのになぁ〜、でもどのサーバだったっけ？と思うことがしばしばあり、作りました。

##環境
- サーバ群：Ubuntu, Debian, CentOS, MacOS, Raspbian

##準備
~/.syncbinに同期するホストを列挙しておく。

```~/.syncbin
host1
host2
.
.
hostn
```

##スクリプト
``` :~/bin/syncbin
#!/bin/bash
HOSTS=`cat ~/.syncbin`
THISHOST=`hostname`
LOG="/tmp/syncbin.log"

for TARGETHOST in $HOSTS;
do
    echo "=================================="
    echo "rsyncing $THISHOST <=> $TARGETHOST"
    echo "=================================="
    rsync -avuz ~/bin/ $TARGETHOST:~/bin/
    rsync -avuz $TARGETHOST:~/bin/ ~/bin/
done |tee $LOG
less $LOG

```
Laravel Debugbarな環境で自作APIがjson_decodeでnullになってしまったときの対処法

[Laravel Debugbar](https://github.com/barryvdh/laravel-debugbar)
Laravelでプロジェクトを作ったらとりあえず入れておくパッケージのひとつです｡
そんな便利なLaravel Debugbarですが､先日これが原因でちょっと困ったことになりました｡(原因はこちらにありますが......)

# 困ったこと
とあるプロジェクトでjsonを返すWebAPIがありました｡
もちろんLaravelです｡

このAPI､フロントで使うこと前提で作ってたのですが､サーバーサイドでも呼び出すことになりました｡
｢はいはい､curlで呼べばいいのね～｣([Guzzle](https://github.com/guzzle/guzzle)使いました)と思いコードを書き､実行してみたところ......

```TestController.php
$url = route('test-api');
$client = new \GuzzileHttp\Client();
// 自己証明書なhttpsなので['verify' => false]
$response = $client->get($url, ['verify' => false]);
$content = $response->getBody()->getContents();
$json = json_encode($content);

// var_dump全部出す
ini_set('xdebug.var_display_max_children', -1);
ini_set('xdebug.var_display_max_data', -1);
ini_set('xdebug.var_display_max_depth', -1);

var_dump($json); // null!!
```

え､なんでや......
レスポンスの中身を確認してみると

```bash
string(3458) ""{
           "status" : "200",
           "data" : [
               "データがいろいろ"
           ]
           "<link rel='stylesheet' type='text/css' property='stylesheet' 
href='//localhost/_debugbar/assets/stylesheets?v=1551204114'><script 
type='text/javascript' src='//localhost/_debugbar/assets/javascript?
v=1551204114'></script><script type="text/javascript">jQuery.noConflict(true);
</script>
.....
```
!?
なんだこれは......

jsonデータに大量のCSSやJavaSctipt､HTMLが含まれていました｡
よく見てみると､`_debugbar`の文字がちらほら
どうやらこれはLaravel DebugbarのHTML部分のようです｡
APIをコールした場合に､debugbarを再表示するために付与されるもののようです｡

# 解決策
ぐぐったら一発でした｡
[Laravel debugbar adding data to my api response.](https://laracasts.com/discuss/channels/laravel/laravel-debugbar-adding-response-to-my-api-response)

```config/debugbar.php
<?php

return [
    // 省略

    'except` => [
        'telescope*',
        // これを追加
        'api*',
    ]

    // 以下省略
]
```
これだけ
`debugbar.php`がない人は以下を実行してください｡

```bash
php artisan vendor:publish --provider="Barryvdh\Debugbar\ServiceProvider"
```
これでAPIのレスポンスにdebugbarの情報が付与されることはなくなりました｡
めでたし

# 根本的な原因
ちょろっと調査したところ､問題のWebAPIはController側で`json文字列`を返していることがわかりました｡

```こんな感じ.php
// 実際はDBから取ってきていろいろしてる
$json = '"status": "200","data": [いろいろ]';
return $json;
```
文字列で返すのが良いのか悪いのかは置いておいて､以下のようにすればdebugbarの情報は付与されずに返ってきます｡

```情報は付与されない.php
$json = [
    'status' => 200,
    'data' => [
        // いろいろ
    ]
];
return $json;
```
わざわざ`string`にしなくてもLaravelがjson形式にしてくれるので､不要な手間をかけずにすみますね｡
(もしくは元ソースの`$jsonをjson_decodeするとか`)
というかこれが普通のやり方だと思うんですが､なぜ`string`なんかになっていたのでしょうか......

何はともあれ､ぐぐって解決策が出てくるということは､稀によくあることだと思うので､備忘録として残してみました｡
以上です｡
rubocopのファイル読み込み設定

###はじめに

初学者のアウトプット備忘録記事です。
ご指摘アドバイスあればよろしくお願いします。



##rubocopがデフォルトのファイルの記述にもエラー判定する

どうも。
rubocop(ロボコップみたいな名前)を使い始めたのですが、プルリク画面でガンガンエラーを報告してくる。インデントやスペースや記述まとめろや的なことを親切に教えてくれる。
しかし、デフォルトで生成されるファイルの記述にもエラー判定したり記述変更の要請してきたりで正直なところ、うざったいです、、、、、
ここのエラーを修正してる時間が非常にもったいないので、

###読み込まないファイルを指定

```ruby

AllCops:
  Exclude:

  -spec/**/*    #読み込みたくないファイル名をExclude:以下記述する

```

読み込まなくなりました。





###もうひとつ面倒くさいクラス定義に対するエラーもスキップさせる

deviseでコントローラー生成したら見事にrubocopがクラス名の定義をエラー報告してくれました。

なので、、


```ruby

# モジュール名::クラス名の定義を許可
ClassAndModuleChildren:
  Enabled: false

```

そんでこれがこうなるのです。

```.rubocop.yml

inherit_from: .rubocop_todo.yml

# モジュール名::クラス名の定義を許可
ClassAndModuleChildren:
  Enabled: false


AllCops:
  Exclude:      
    - spec/**/*     #例えばspecディレクトリのファイルを読み込まない場合
    - bin/*
    - db/schema.rb
    - node_modules/**/*
    - db/migrate/*
    - vendor/**/*
  Rails:
    enabled: true

Style/Documentation:
  Enabled: false

Style/StringLiterals:
  Enabled: false

Metrics/LineLength:
  Enabled: false

Style/FrozenStringLiteralComment:
  Enabled: false

```


これで少しは許容範囲が広くなったかなと思います。
何もかもダメダメってされると効率悪いと感じました。(個人的に)

###参考にした記事

rubocopの設定アレコレ
https://qiita.com/necojackarc/items/8bc16092bbc69f17a16d

.rubocop.yml設定例
https://qiita.com/necojackarc/items/8bc16092bbc69f17a16d
Debian系、RedHat系Linux、MacOSXでパッケージ更新、インストールを共通のスクリプトで実行

##概要
[~/bin/のスクリプトを管理サーバ群(Debian, Raspbian, Ubuntu, CentOS, MacOSX)で同期](https://qiita.com/lapidem/items/110ff7e0c0db11999ed6)させているため、パッケージの更新を一つのスクリプトで対応させた。それぞれ、apt-get, yum, brewの存在を確認して実行しているだけのスクリプトです。

##環境
- サーバ群：Ubuntu, Debian, CentOS, MacOS, Raspbian

##スクリプト
```~/bin/maintain
#!/bin/bash
APTGET="/usr/bin/apt-get"
YUM="/usr/bin/yum"
BREW="/usr/local/bin/brew"

if [ -x $APTGET ]; then
    sudo apt-get update
    sudo apt-get -y upgrade
    sudo apt-get -y autoremove
elif [ -x $YUM ]; then
    sudo yum update
    sudo yum -y upgrade
    sudo yum -y autoremove
elif [ -x $BREW ]; then
    brew update
    brew upgrade
fi    
```
[巡回スクリプト](https://qiita.com/lapidem/items/67bd2ad6d56bb120e4d5)でも使いやすいように[sudoでパスワード入力を行わない](https://www.lapidem.pw/linux/110/debian-password-sudo-su-superuser/)ように設定している。
[CSS]background-clipで文字の形に背景を切り取る

# Apple iPhone XRの商品ページにて

これめっちゃかっこよくないですか？
[iPhone XR - Apple（日本）](https://www.apple.com/jp/iphone-xr/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241738/ca6e8696-de88-d306-936a-797e97553095.png)


# 実は簡単に出来ちゃいます

そう、CSSの`background-clip`属性ならね
[background-clip - CSS: カスケーディングスタイルシート | MDN](https://developer.mozilla.org/ja/docs/Web/CSS/background-clip)

# 使い方

<p class="codepen" data-height="448" data-theme-id="dark" data-default-tab="result" data-user="teinen" data-slug-hash="NmoGYW" style="height: 448px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" data-pen-title="css background-clip">
  <span>See the Pen <a href="https://codepen.io/teinen/pen/NmoGYW/">
  css background-clip</a> by Akira Kanno (<a href="https://codepen.io/teinen">@teinen</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# ブラウザサポート

[Can I use...](https://caniuse.com/#search=background-clip)

> Firefox, Chrome and Safari support the unofficial -webkit-background-clip: text (only with prefix)

MDNによると、`background-clip: text;`はIE11のみサポートしていないようです
~~IE11死すべし~~

# まとめ

みんなも`background-clip`でオサレデザインを楽しもう！
WordPressのjetpackプラグインがセットアップできないエラーを解決する

#WordPressのjetpackプラグインとは？
パフォーマンスを向上させたり
SNSと提携して自動投稿したり
色々出来る凄いやつ。

そんなん、インストールするしかないやん？

##Outbound HTTPS not working
でもエラーが出てセットアップ出来ない…
表示されるエラーログは以下のような感じ

```
Outbound HTTPS not working
Your site could not connect to WordPress.com via HTTPS. This could be due to any number of reasons, including faulty SSL certificates, misconfigured or missing SSL libraries, or network issues.

Jetpack will re-test for HTTPS support once a day, but you can click here to try again immediately: Try again WordPress reports no SSL support

For more help, try our connection debugger or troubleshooting tips.
```

グーグル翻訳すると

```
送信HTTPSが機能しない
あなたのサイトはHTTPS経由でWordPress.comに接続できませんでした。 これは、SSL証明書の誤り、SSLライブラリの設定ミスまたは欠落、あるいはネットワークの問題など、さまざまな原因が考えられます。

Jetpackは1日に1回HTTPSサポートを再テストしますが、ここをクリックして直ちに再試行することができます。再試行WordPressはSSLサポートを報告しない

詳細については、接続デバッガまたはトラブルシューティングのヒントを試してください。
```

HTTPSが機能しないだと？？？

##以下をチェックしても直らない。
ググり散らかして以下のことはやってみた。

- HTTPSは機能してるか→機能してる。
- wp-config.phpの`FORCE_SSL_ADMIN`を`true`にした→改善しない。
- wp-config.phpの`SERVER_PORT`を`443`にした→改善しない。
- 他のプラグインを停止してみる→改善しない。

ダメだ…なんでなんだ。

##神「こうするのじゃ」

- 原因その１
`wp-config-custom.php`の`WP_HTTP_BLOCK_EXTERNAL`。
このパラメータがjetpackの動きを阻害している。
なので値を`false`にするか、コメントアウトする。

- 原因その２
`xmlrpc`へのアクセスを制限している。
jetpackは`xmlrpc`へアクセスしようとするので、制限されるとjetpackの挙動がおかしくなる。
今回は.htaccessで

```
RewriteRule ^xmlrpc\.php$ "http\:\/\/0\.0\.0\.0\/" [R=301,L]
```

と記載していたため、jetpackがセットアップ出来なかった。
コメントアウトする。

#編集後記
入社20日目
WordPressのバグやエラーはホント苦しいです。
ブラックボックス過ぎて直し方が全然分からん。
もっと簡単なブログサービスが流行って欲しい…
GW10連休で荒れた心を癒やします。
System.Math.Atan2関数の計算結果がおかしい

#System.Math.Atan2関数とかいう座標からラジアンが求められる最高の関数
でもドキュメントに書いてあるのと結果が違う。(違いませんでした、追記をご覧ください。4/26 22:35)

以下がドキュメント

[.NET Framework 4.7.1 公式リファレンス](https://docs.microsoft.com/ja-jp/dotnet/api/system.math.atan2?view=netframework-4.7.1)
>- y が 0 で x が負数でない場合は、θ = 0。
>- y が 0 で x が負の場合は、θ = π。
>- y が正で x が 0 の場合は、θ = π/2。
>- y が負数で x が 0 の場合は、θ = -π/2。
>- y が 0 かつ x が 0 の場合は、θ = 0。

そして以下がうちの環境でテストした結果
Visual Studio 2019 16.0.1
.NET Framework 4.7.03056

```cs:test.cs
System.Math.Atan2( 1.0,  0.0); //  1.5707963267949
System.Math.Atan2(-1.0,  0.0); // -1.5707963267949
System.Math.Atan2( 0.0,  1.0); //  0
System.Math.Atan2( 0.0, -1.0); //  3.14159265358979
System.Math.Atan2( 0.0,  0.0); //  0
```

？？？？？？？？？？？？？？？？
基準線が正のx軸ではなくて正のy軸になっているように見える…どうして？（現場猫）

Unity上でクリックしたところの角度を出して、その方向にキャラを移動させようと思ったら見事に明後日の方向に吹き飛んでいきました。かなしい。

#リファレンスはおかしくないし計算結果もおかしくなかった(4/26 22:35 追記)
おかしかったのは自分の頭でした。目かな。

[.NET Framework 4.7.1 公式リファレンス](https://docs.microsoft.com/ja-jp/dotnet/api/system.math.atan2?view=netframework-4.7.1)

```cs:
public static double Atan2 (double y, double x);
```

引数が逆やん！！！！！！！！！！！！！！！！！！！！！！！
どうしてyが先なんですか？（現場猫）

なにはともあれ自己解決。めでたしめでたし。
プログラミング学習記録69〜Wantedly〜

##今日やったこと
- Wantedlyのスコアを上げて応募する
- ProgateのJavaScript１、２をそのまま復習

今日はずっと放置していたWantedlyのプロフィールを埋めて、スコアを上げてみました。
0から29まで上がりました。

ポートフォリオに、以前に作った架空のLPとRuby on Rails5で作ったWebアプリを追加しました。

ただ「勉強してます！」と言うよりも「勉強してこれだけ作りました！」と言った方がウケがいいみたいなので、ポートフォリオを公開するのは大事です。

全然大したことないものでも、あるのとないのとじゃ全然違うそうです。

あと、ProgateのJavaScriptの１、２をそのまま復習しました。
配列やオブジェクトなどの基本事項を復習しました。

for文で変数の範囲を決めるときに使う`配列名.length`がポイントですね。
それ以外は特に注意すべきところはないかなと言う感じです。

今日はポートフォリオを整理できてよかったです。

おわり
viコマンド覚え書き

| コマンド | 動作 | 備考 |
----|----|----|
| i | 入力モードに ||
| esc | 入力モードを終了 ||
| dd | その行を削除 ||
| x | 右の文字の削除 ||
| delete | 削除 | 文字はぱっと見削除されないけれど、入力すると上書きされる。上書きせずにescしても消える。 |
| o | 下に行を追加 | `i`を打って入力モードにならなくても、そのまま入力できる |
| shift + o | 上に行を追加 | 同上 |
| j | カーソルを下に移動 | ホームポジションで打てる。早い。楽。 |
| k | カーソルを上に移動 ||
| h | カーソルを左に移動 | 人差し指を左にずらして打つらしい。 |
| l | カーソルを右に移動 ||
| / | 検索 ||
| :q | viモードを終了 ||
| :q! | 強制終了 | よく使う |
| :wq | 変更を保存して終了 ||
【Gang of Four】Observer

#Observer
**[目次](https://qiita.com/Tonkachi0620/items/03986742efbb7e3a9bbe)**
あるオブジェクトのプロパティが更新されたときに、それを監視している他のオブジェクトに同時になにか処理をさせようというのが本パターンです。

更新されたオブジェクトが監視しているオブジェクトに更新されたことを通知するようなイメージですね。
Android Architecture ComponentsのLiveDataがまさにこれ。

##目的
あるオブジェクトが状態を変えたときに、それに依存するすべてのオブジェクトに自動的にそのことが知らされ、また、それらが更新されるように、オブジェクト間に一対多の依存関係を定義する。 

##構成要素
・Subject 監視される抽象クラス
・Observer 監視したい抽象クラス
・ConcreteSubject 監視される具象クラス
・ConcreteObserver 監視したい具象クラス

##実装
スマホにインストールしているアプリがアップデートされると、自動で更新されるサンプルプログラムを実装します。
play storeがsubjectでスマホがobserverですね。
めんどくさいので抽象クラスは実装しません。

###ConcreteSubject 監視される具象クラス
play storeです。

```PlayStore.kt
package observer

class PlayStore {
    interface UpdateListener {
        fun update(latestVersion: Int)
    }

    private val listeners = ArrayList<UpdateListener>()

    fun update(latestVersion: Int) {
        println("サンプルアプリが${latestVersion}にアップデートされました。")
        listeners.forEach {
            it.update(latestVersion)
        }
    }

    fun addListener(listener: UpdateListener) {
        listeners.add(listener)
    }
}
```

###ConcreteObserver 監視したい具象クラス
本パターンの効果が実感しやすいように、observeするクラスを2つ実装します。

サンプルアプリをインストールしているユーザ一人目

```SnakeSmartPhone.kt
package observer

class SnakeSmartPhone(playStore: PlayStore) {
    init {
        playStore.addListener(object: PlayStore.UpdateListener {
            override fun update(latestVersion: Int) {
                println("スネークのスマホのアプリが${latestVersion}にサンプルアップデートされました。")
            }
        })
    }
}
```

サンプルアプリをインストールしているユーザ二人目

```Raiden.kt
package observer

class RaidenSmartPhone(playStore: PlayStore) {
    init {
        playStore.addListener(object: PlayStore.UpdateListener {
            override fun update(latestVersion: Int) {
                println("雷電のスマホのサンプルアプリが${latestVersion}にアップデートされました。")
            }
        })
    }
}
```

###使う人

```Client.kt
package observer

class Client {
    init {
        val playStore = PlayStore()
        SnakeSmartPhone(playStore)
        RaidenSmartPhone(playStore)

        playStore.update(1)

        playStore.update(2)
    }
}
```

###出力結果
```
[out-put]
サンプルアプリが1にアップデートされました。
スネークのスマホのサンプルアプリが1にアップデートされました。
雷電のスマホのサンプルアプリが1にアップデートされました。
サンプルアプリが2にアップデートされました。
スネークのスマホのサンプルアプリが2にアップデートされました。
雷電のスマホのサンプルアプリが2にアップデートされました。
```

play storeのアプリをアップデートするたび、それをインストールしているスマホも自動でアップデートされています。

以上
GASでNDL(国立国会図書館)のAPIシバいて本の管理をする何かを作った話

## 中身はタイトルの通りです。

　フォームでISBN打ち込んで送信するとスプレッドシートにデータが出てきます(雑)
　まだ2ヶ月の手探り一般人のコードなので、生暖かい目で見て、もし使うなら適宜改良してください。
多分色々とゴリ押してますので。

```gs:NDL.gs
function NDLxml() {
  
  //スプレッドシートを開く
  var Spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  //フォームのシート
  var Form = Spreadsheet.getSheetByName("フォームデータのシート名"); 
  //一覧のシート
  var Sheet = Spreadsheet.getSheetByName("ブックデータのシート名"); 
  //最終行数を取得する
  var LastRowForm = Form.getLastRow();
  var LastRow = Sheet.getLastRow();
  //フォームのデータをコピペする
  var CopyISBN = Form.getRange(LastRowForm, 2).getValue();
  Sheet.getRange(LastRow+1, 1).setValue(CopyISBN);
  //ISBN取得
  var ISBN = Sheet.getRange(LastRow+1, 1).getValue()
  //NDLしばく
  var BookURL = 'https://iss.ndl.go.jp/api/opensearch/?isbn=' + ISBN;
  //れすぽんす
  var Response = UrlFetchApp.fetch(BookURL); 
  //XMLをぱーす
  var xml = XmlService.parse(Response.getContentText());
  //要素を取得
  var Item = xml.getRootElement().getChildren("channel")[0].getChildren("item");
  //なまえくうかん
  var Dc = XmlService.getNamespace("dc", 'http://purl.org/dc/elements/1.1/');
  var DcNDL = XmlService.getNamespace("dcndl", 'http://ndl.go.jp/dcndl/terms/');
  
  //書籍名
  var Title = Item[0].getChildText("title", Dc);
  //しりーず
  var Series = Item[0].getChildText("seriesTitle", DcNDL);
  //おーさー
  var Author = Item[0].getChildText("creator", Dc);
  //出版社
  var Publisher = Item[0].getChildText("publisher", Dc);
  //出版年月日
  var PubDate = Item[0].getChildText("pubDate");
  //本のサイズ・ページ数
  var Size = Item[0].getChildText("extent", Dc);
  //巻数
  var Volume = Item[0].getChildText("volume", DcNDL);
  //版数
  var Edition = Item[0].getChildText("edition", DcNDL);
  //ここはすきにしてください
  var Else = Form.getRange(LastRowForm, 3).getValues();
  Sheet.getRange(LastRow+1, 10).setValue([[Else]]);
  
  //書き込む
  var GetSet = Sheet.getRange(LastRow+1, 2, 1, 8).setValues( [[Title, Series, Author, Publisher, PubDate, Size, Volume, Edition]]);
  }
```
## 解説
　なんやかんやでスプレッドシートで本の管理をしているという記事が見当たらなかったので作ったやつを公開することにしました。
　GAS自体の使い方の説明は省きます。

　どうやってスプレッドシートで管理するのか？
　国立国会図書館しばけばいけるのでは？　出版物はほとんどあそこにあるって聞いたことあるような。
　といった考えから、スプレッドシートからスクリプトエディタを開いてポチポチしました。

　コードのところでほとんど説明してますのであまり書くことはありません。スプレッドシートの1列目にその行の概要とか書くと見やすいと思います。
　あ、Googleフォームは作らないといけません。フォームからスプレッドシート新規作成してもいいですし、フォームの出力先を既存のスプレッドシートにしてもいいです。オススメはISBN入力欄に正規表現オプションです。

　NDLバンザーイ！！！
　お好みに合わせて改造してください。
　技術力が追いつけばバーコードを読み取れるようにしたいです。

## 参考
https://qiita.com/sha9sa9/items/8d10f550c673336ba1f4
https://qiita.com/akoto/items/bd3e4269743cbb8881bb
https://www.ndl.go.jp/

##　2019/10/18追記
　外部サイトにて指摘があったようなので引用しておきます。

https://teratail.com/questions/210493
　この問題は回答者さんもおっしゃっておられる通りトリガーの設定次第で解決できそうな気がしますね。ただ、時間主導トリガにするのならば注意すべきこともありまして、第一にGASには「5分の壁」があること。第二にNDLのAPIは重めでかつ同時リクエスト数に制限があること。この辺は視野に入れておきつつ目的に合わせて好きなようにコード弄ってください。

https://teratail.com/questions/211006
　↑ここに！解答例みたいなコードがあります！！是非ともこっちのスマートなコードを参考にしてください！この記事のコードは愚直すぎるので！
【SAP Fiori】テクニカルカタログ、ビジネスカタログとは

##はじめに
[Fiori App Library](https://fioriappslibrary.hana.ondemand.com/sap/fix/externalViewer/)を見ていると、Technical Catalog、Business Catalogという言葉が出てきます。どちらもカタログを指しているようですが、何が違うのでしょうか。そして、どのように使うのでしょうか？

[Monitor Purchase Order Items](https://fioriappslibrary.hana.ondemand.com/sap/fix/externalViewer/#/detail/Apps('F2358')/S13OP)アプリの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/8172be91-a45e-4f5e-8bff-df9ccb7095c8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/6055eb35-b1ef-4796-5d7a-e52c8a995949.png)

##カタログについて
ラウンチパッドのカタログについて、前回の記事で書きました。
[【SAP Fiori】Fiori Launchpadの権限の概要](https://qiita.com/tami/items/0f17ca103eb2cf975636)
カタログは、アプリを実行するためのタイル、ターゲットマッピングの設定を持っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/5cd84f0b-a947-e4b0-9e4d-64caa40658e5.png)

##テクニカルカタログ、ビジネスカタログとは
同じアプリを複数のカタログで使いたい場合（例えば購買担当者用カタログと購買マネージャ用カタログ）、複数のカタログで同じようにタイル、ターゲットマッピングの設定をするのは煩雑です。
そこで、業務領域ごとにすべてのアプリを集めた基本のカタログを作って、ほかのカタログから必要なアプリを参照するという形がとられます。基本となるカタログがテクニカルカタログで、参照する側のカタログがビジネスカタログです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/54f73c95-c919-7cbc-0eed-1b682186d4d6.png)
一つのテクニカルカタログを複数のビジネスカタログから参照することもできます。ロールに割り当てるのはビジネスカタログで、テクニカルカタログを直接ロールに割り当てることはしません。

##テクニカルカタログを参照してビジネスカタログを作る方法
カタログのメンテナンスはトランザクション：/UI2/FLPD_CONF(Fiori launchpad designer)で行います。
事前にビジネスカタログを登録しておきます。（ガラだけでOK）

①参照したいテクニカルカタログを開く
②自分のビジネスカタログに追加したいタイルをドラッグすると"Create Reference"という領域が現れるので、それをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/b252103e-02e2-40ed-2616-2fe138da84ae.png)
②用意しておいたビジネスカタログを選択する
<img width="156" alt="select.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/23e9a9b6-8538-ece3-00fd-c7ee5254d53d.png">
③ターゲットマッピングへの参照も登録する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/ae87172e-2bf8-32c9-a2d2-28e5216cb8f5.png)

結果、自分のビジネスカタログにタイル、ターゲットマッピングが追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/f7057d67-7937-7d1e-65b9-271b4216d931.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/ad930b80-e5b5-8766-94a2-a87cc89584ff.png)


##感想
操作してみて思ったのは、以下のようなことです。

- 複数のテクニカルカタログを参照する場合もあり、テクニカルカタログ側から参照登録するのは面倒
- ビジネスカタログ側から必要なものを取り込めるとよい
- タイルを選択したらターゲットマッピングも取り込んでほしい
- タイル1つずつではなく、まとめて選択できるとよい

最初に大量のビジネスカタログを登録する際は結構手間がかかりそうです。
ただそれでも、一からタイルとターゲットマッピングの設定をするよりは楽なはずです。
AtomエディタでC/C++競プロ環境構築（macOS）

# はじめに
AtomエディタはGitHub製のエディタで、動作も統合開発環境に比べれば軽く、パッケージもテーマも豊富な使いやすいエディタです。
macOS上のAtomエディタで、競プロでよく使われる

```c++
 #include <bits/stdc++.h>
```

を用いたC++プログラムをF5キーで実行できるようにします。
自分は構築に３日もかかってしまったので、記事にしておこうと思いました。
ターミナルでパスワードを要求されたら、管理者パスワードを入力してください。
homebrew等適用されていない気がしたら、再起動してください。
つたない文章ですみません。。

# XCode のインストール
AppStoreからXCodeをダウンロードします。６ギガ程ありますから結構時間がかかります。
~~重すぎ...泣~~
### どうしてもAppStoreからではうまくいかない場合
[Apple Developer Tools](https://developer.apple.com/download/more/)
ここでAppleIDにログインし、XCode ~ .xipと書かれているところからダウンロードできます。
xipとはzipと似たようなものだそうです。
Safaliの方がよく、データベース要求時間切れなど出てきたらリロードして再度IDを入れなおすと良いです。


# homebrew のインストール

## コマンドライン・デベロッパー・ツールの導入
ターミナルを起動し、
```xcode-select --install```を実行
出てきた画面でインストールをクリックします。
以下のQiita記事を参考にさせていただきました。
[macOSにHomebrewをインストール](https://qiita.com/pypypyo14/items/4bf3b8bd511b6e93c9f9)
## homebrewの導入
[homebrew公式](https://brew.sh/index_ja)
ここからコマンドをコピペし、ターミナルで実行します。

#gccのダウンロード
ターミナルで以下のコマンドを実行します。
```brew install gcc```
/usr/local/bin/　に
　g++-8
　gcc-8
などができていれば良いです。

#Atomのダウンロード
以下の記事が大変参考になります！
[テキストエディタ「Atom」のインストールから日本語化まで](https://qiita.com/akikimur/items/bc342db92dbeb801ee61)

#パッケージのダウンロードと設定
「設定」の「インストール」から、
　gpp-compiler
というパッケージをダウンロードし、クリックして設定を開きます。

そして、 C Compiler の欄に
```/usr/local/bin/gcc-8```

C++ Compilerの欄に
```/usr/local/bin/g++-8```
と入力します。

#実行してみる
適当に、出入力を含むプログラムでも作成して...

```c++

 #include <bits/stdc++.h>
 using namespace std;
 int main() {
   int a, b;
   cin >> a >> b;
   cout << a + b << endl;
   return 0;
 }
```
F5をポチっと押すと...
<img width="580" alt="スクリーンショット 2019-04-26 20.55.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345514/890ec5f6-a529-3001-4739-08d7e6def773.png">



できました！わーい

#おわりに
このやり方ではうまくいかない、また、こうすればもっと良いなどあればぜひコメントしてください。
どなたかのお役に立てたら嬉しいです！
Gitで管理してるディレクトリ名の大文字小文字をgit mvで変更しようとした時の話

先日Gitで管理しているプロジェクトをGitHubにpushしたさい、ディレクトリ名を間違えたままpushしてしまいました。


```
Javascript
```

これでは怒られる！急いでリネームしなければ！

```
$ git mv Javascript JavaScript
// fatal: renaming 'Javascript' failed: Invalid argument
```

なんとエラーが出てしまいました。

> fatal： 'Javascript'の名前変更に失敗しました：無効な引数

無効な引数？何故？

## 解決法

```
$ git mv Javascript _javascript
$ git mv _javascript JavaScript
```

一度`_`なり文字を入れて違うディレクトリ名にしてから、再度修正したいディレクトリ名にするのが現状の解決法らしい。

## 調べてみた

参考にさせてもらったサイト
[頭ん中 : Git でファイル名やディレクトリ名の大文字/小文字を変更する方法](https://www.msng.info/archives/2012/10/git-how-to-change-cases.php)

[DevelopersIO : あれMacって大文字と小文字を区別しないのか](https://dev.classmethod.jp/etc/mac-apfs-ignore-case/)

確かにディスクユーティリティから情報を確認したところ、

```
大文字/小文字を区別: いいえ
```

になってました、これが原因なのかな？`Windows`や`Linux`だとそのまま変えれるのだろうか。
PHP開発者がとにかくDockerを起動させてみた

※Windows環境前提です。（Windows以外も今後対応していきます）

### 手順
* Dockerをインストールする。（インストール手順は割愛）
* どこか適当な場所にPHPのソースファイルを格納するフォルダを作成する。
* PowerShellを起動し、上で作成したフォルダに移動する。
* 以下コマンドを実行し、コンテナを起動させる。

```powershell
docker run -d --rm --name php -p 8080:8080 -w=/var/www/html -v "$(pwd):/var/www/html" php:alpine php -S 0.0.0.0:8080
```

* `x4sfdaes3fs915c3ss76cb1770d85ss～`みたいな文字列が表示されたら起動成功。
* index.phpを設置した上で[http://localhost:8080](http://localhost:8080)にアクセスすると、index.phpの実行結果が返ってくる。
* Dockerを停止する場合は、PowerShell上で`docker stop php`を実行すればOK。

### 上記手順の良いところ
* 手順が簡単。
* 自身のパソコンとコンテナ間でPHPファイルを格納するフォルダを共有しているため、ソースコードの反映が容易。
* ベースイメージがAlpine Linuxのためコンテナイメージのダウンロードが短時間で終わる。

### 注意事項
* 最小限のPHP実行環境であるため、データベース接続はできません。（データベース接続できる手順は現在作成中）
* composerは使えません。
メニューバーにあるQBlockerアイコンを押すと、落ちる件 

　macOS Mojaveにアップグレードしたのはいいけれど、コマンド＋Qで落としたくないアプリを終了しないQBlockerが、不安定になっています。メニューバーにある<a href="https://qblocker.com">QBlocker</a>をクリックした途端、どーんと落ちます。

![スクリーンショット 2019-04-26 21.31.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149387/86157f58-7f80-b693-d63c-b0d321409b82.png)


　ヤレヤレです。触らぬ神に祟りなしということで、設定済みの場合、メニューバーを触らない限り、設定どおり動きます。しかし、設定を変更することは２度とできないということで、困ったことになっていました。ソースコードを直して、リコンパイルするようなテクニックもないしということで、「Karabiner-Elementsがいいんじゃね」という話を耳にして、使ってみるも、なーんか設定が難しすぎる。

　うーん。なんかいい方法がないか、探ってみるとあるじゃないですか。システム環境設定のキーボードです。

![スクリーンショット 2019-04-26 21.33.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149387/87df42e1-32e6-9359-be5b-5abaab31875a.png)

　例えば、Safariの場合、終了メニュー名は「Safariを終了」となっているので、私の場合はオプション＋コマンド＋Qとしておきました。設定後、Safariを見ると、こうなっています。

![スクリーンショット 2019-04-26 21.44.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149387/c46641d5-a1a5-8d48-fbab-0953dfdcbc76.png)

　これで、キーボードのミスタッチで無駄にアプリケーションを終了してイライラ〜、最立ち上げの手間がかからなくて済みます。もちろん、他のアプリでもできます。無駄にメニュー内に半角スペースが入っているアプリケーションもありますので、そこんところ要注意です。

　そして、どうしても終了したくないアプリケーションに関しては、「〜を隠す」メニューに対してコマンド＋Qを割り当てちゃいます。本当に終了したいときは、オプション＋コマンド＋Qとします。どうです。これで完璧ですわ。

 でわでわ。
Kotlinで特定の場所からだけアクセスを許可する

Kotlin 1.2や1.3を使用してます。

## 忙しい人向け
```kotlin
var writeFromAOnly = "read"
    // 許可しないと書き込めないように
    @Deprecated("writeFromAOnly can set only from a", level = DeprecationLevel.ERROR)
    internal set

fun a() {
    // 許可して書き込めるように
    @Suppress("DEPRECATION_ERROR")
    writeFromAOnly = "wriiten"
}

fun b() {
    // error here.
    writeFromAOnly = "wriiten"
}
```

## 解説

これは以下のkotlin機能を使って実装してます
1. `Deprecated`をエラーにできる
2. `Deprecated`エラーを`Suppress`できる
3. `internal`で外部ライブラリから見えなくできる

### `Deprecated`をエラーにできる

`level`引数で独自の`ERROR`またはなかったことにできることを使う。

```kotlin
@Deprecated(<msg>, level = DeprecationLevel.ERROR)
```

### `Deprecated`エラーを`Suppress`できる

`Deprecated`なものは一般的に以下のように警告を消せます

```kotlin
@Suppress("DEPRECATION")
```

しかし`Deprecated`のエラーはこれでは消えません。専用の名前である`DEPRECATION_ERROR`を使用ます。

```kotlin
@Suppress("DEPRECATION_ERROR")
```

### `internal`で外部ライブラリから見えなくできる

しかし自分が作っていないライブラリで`@Suppress("DEPRECATION_ERROR")`を使われてしまったら元も子もないので`internal`にすることで外部からいじられる危険性を抑えます

## 参考

kotlinのレポジトリを検索したらうまく出てきました
[github.com/jetbrains/kotlin の検索](https://github.com/JetBrains/kotlin/search?q=%22DEPRECATION_error%22&unscoped_q=%22DEPRECATION_error%22)
kaminariのviewを編集する

rails でアプリ開発をしていくなかで、Materializeを使いつつkaminariのviewを編集する機会があったので備忘録として記録します。

### kaminariの導入

Materializeは導入済みというところからkaminariをインストールします。

```Gemfile
gem 'kaminari'
```
```terminal
$ bundle install
```

kaminariによってページネーションが表示されました。
しかしMaterializeのcssが適用されていないので統一感のない見た目に。

### kaminariのviewを編集する

まず、kaminariのviewファイルを表示させます。

```terminal
$ rails g kaminari:views default
```
これでviewsディレクトリにkaminariフォルダが表示されたと思います。
あとはそれぞれのファイルにMaterializeのcssを適用していくとうまくいくと思います。
Materializeに限らず、自分でcssを書いたり他のcssフレームワークを使う際にも今回の方法で見た目を整えていけると思います。
ちなみに、`rails g kaminari materialize:views materialize`を実行すれば、これだけでMaterializeにぴったりのページネーションが作成できるようです。
その時々で使い分けていこうと思います。
WordPress簡単データ移行

世のWordPress使いのみなさま、今日もお疲れさまです。 
WordPressのデータ移行ってどうやってやってます？  
ん？WordPressのツールでエクスポートして、インポートして、プラグインのディレクトリコピーして、テーマファイルコピーして...  
なにやっとるんじゃーい！めっちゃ時間かかるやんかーい！ 
(以前の私もそうでした。)  

サイト制作の依頼受けたら、

* ローカル
* テスト環境（ないときもありますね）
* 本番環境

ってあると思うんですけど、
ローカル→テスト環境、テスト環境→本番環境

まあ、１回につき15分くらいは取られますかね。。  
となると、世のWordPress使いのみなさまの今までのデータ移行の時間を合計すると、そりゃもう大変なことですよ！  

## 本題
[All-in-One WP Migration](https://ja.wordpress.org/plugins/all-in-one-wp-migration/)をお使いなさい。  


移行元・移行先どちらにもインストールします。  
...など、記事を書こうと思いましたが、こちらのサイトですばらしくまとめられていましたので、どうぞ！ 
https://www.vektor-inc.co.jp/post/all-in-one-wp-migration/



アップロードサイズの制限がかかる場合がありますので、ぜひこちらのサイトを参考にどうぞ！
https://web-ashibi.net/archives/2560

## まとめ
これもっと早く教えてや〜 
みなさまのデータ移行にかかる時間が短くなりますように...  

参考サイト様、きれいにまとめてくださってありがとうございます。  
こういうの知らないと使えないですからね！
(メモ) RailsアプリをHerokuへデプロイする際につまずいたところとその対応

Rails開発初心者の私が今回RailsアプリをHerokuへデプロイする際につまずいた所とその対応を記述します。


# 開発環境
Rails 5.1.4

Ruby 2.2.7

# Herokuのデプロイエラー

必須ではないが古いバージョンが残っている可能性もあるのでHerokuへデプロイする前に一応Gemfile.lockの内容を全て削除する。

`$ bundle` して更新

`git commit -a -m "commit message"` でコミット

`$ git push heroku master` を実行
**↑しかしここでエラーが発生**

エラー内容は以下のように出力された。

> rake aborted!

> Gem::LoadError: Specified 'postgresql' for database adapter, but the gem is not loaded. Add `gem 'pg'` to your Gemfile (and ensure its version is at the minimum required by ActiveRecord).

# 対応

### Gemfileの確認

Gemfileを開いてgem 'sqlite3'が:developmentと:test環境に設定(記述)されているかを確認。

Herokuに最適なgem 'pg'(PostgreSQL)が:production環境に設定(記述)されているかを確認。


```ruby:Gemfile
group :production do
  gem 'pg'
  gem 'rails_12factor', '0.0.2'
end
```


### database.ymlの確認

DBのYAMLファイルの設定(記述)がされていなかったのでconfig/database.yml を開いてproduction:の部分を以下に変更。


```database.yml
# SQLite version 3.x
# gem install sqlite3
#
# Ensure the SQLite 3 gem is defined in your Gemfile
# gem 'sqlite3'
#

<<省略>>

production:
     encoding: utf8
     adapter: postgresql
     port: ポート番号
     username: ENV['DATABASE_USER']
     host: ホスト名
     database: データベース
     password: ENV['DATABASE_PASSWORD']
```

※(Heroku Add-ons Data StoresのHeroku Postgresがインストールされている事を前提として)データベース名やユーザー名などの情報を見るにはWeb上でHerokuにログイン -> アプリを選択 -> Resourcesをクリック -> Add-onsのHeroku Postgres :: Databaseをクリック -> Settingsをクリック -> Database Credentialsの横にあるView Credentials...をクリックすると出てきます。

変更が終わったら`$ git commit -a -m "commit message"`でコミット。

もう一度デプロイ →　**エラー発生！**

エラー内容は以下のように先ほどと同じ

> rake aborted!

> Gem::LoadError: Specified 'postgresql' for database adapter, but the gem is not loaded. Add `gem 'pg'` to your Gemfile (and ensure its version is at the minimum required by ActiveRecord).


### 再びGemfileの修正

Gemfilelのgem 'pg'が記述されている部分に問題があるみたいなので見てみる。ActiveRecord から要求されるバージョンが最低限必要みたいなので比較的新しいバージョンを追加。


```ruby:Gemfile
group :production do
  gem 'pg', '0.19.0'
  gem 'rails_12factor', '0.0.2'
end
```

### 再度デプロイ

念のため過去の設定が残ってるとエラーの元になるかもしれないのでGemfile.lockの内容を全て削除。
Gemfile.lockの内容を頻繁に削除するのは不具合の原因になる恐れがあるので頻繁にやらない。

`$ bundle` して

`$ git commit -a -m "commit message"` でコミット

`$ git push heroku master` でHerokuにデプロイ　→　**デプロイ成功！**

`$ heroku run rake db:migrate` でHerokuのDBをマイグレーション


`$ heroku open` でブラウザに表示


# まとめ

- デプロイエラーが出た際にまずはGemfileに設定(記述)の不足がないかを確認する。
- config/database.yml内のproduction:設定(記述)に不足や間違いがないか確認する。
- デプロイエラーが出続けている際はGemfile.lockの内容を思い切って全て削除し、$ bundle installで様子を見てみる。(あまりオススメしない)
- HerokuにHeroku PostgreSQLをインストールする事を忘れない。(本記事には記述しなかったが意外と忘れやすい)
- 本記事では記述しなかったが.git/config内[remote "heroku"]内のURLに昔の古いリポジトリのURLが書かれていないかチェックする。

# 参考文献

[HerokuにRailsアプリをデプロイする手順](https://qiita.com/NaokiIshimura/items/eee473675d624a17310f)

[Herokuにデプロイするときのdatabase.ymlの設定](http://togattti.hateblo.jp/entry/2013/05/27/185220)
ドメインモデルのリファレンスモデル集(ほぼiOS)

# はじめに

いわゆるドメインモデルについて。ドメインモデルとは何かとか？ウダウダ考えるより運用されまくっている実物を研究した方が良いと言う事でまとめました。ほとんど(というか全部)iOSになります。iOSはソースコードが公開されていないのが残念!!!

# 分類方法

以下の基準に基づいて分類しています。どれか一つに割り切れると言う事はなく、大抵はどのタイプがどれくらいの割合で混じっているかと言うことになるかと思います（RDDで言うステレオロールタイプのどのクラスが多く占めているか？）。

- データモデリング系：データベース/JSON由来のデータモデリングモデル。ほとんどCRUD系のインタフェースしか存在しない。
- オブジェクトモデリング系：作業成果物であるファイルフォーマット由来（の場合が多い)のドメインモデル。複雑な構造変化を伴ったりする。
- 制御モデリング系：ハードウェア/プロトコル由来（の場合が多い)のドメインモデル　複雑な状態遷移を伴ったりする。
- データフロー系：バッチ処理、データ変換を行うためのドメインモデル。処理フローを動的に構成する。

# [AV Foundation](https://developer.apple.com/documentation/avfoundation)
(オブジェクトモデリング系)動画編集業務を表現した？ドメインモデル。動画ファイルをデシリアライズして抽象化するとこうなる？

# [Media Player](https://developer.apple.com/documentation/mediaplayer)
(データモデリング系)Apple Music/iTunesの楽曲管理を表現したドメインモデル。所謂商品分類的なモデルではなく、個人の音楽コレクションを表現したドメインモデルになる?。

# [Healthkit](https://developer.apple.com/healthkit/)
(データモデリング系)健康管理/測定フレームワーク。タイプオブジェクトパターンを使ってクラスを知識レベルと操作レベルに分けている。マーチンファウラーのアナリシスパターンの観測と測定に出てくるクラス構成とそっくり。

# [Core Bluetooth](https://developer.apple.com/documentation/corebluetooth)
(制御モデリング系)iPhoneをBLE機器化するためのフレームワーク、同じ役割でも自分側と対向デバイス側でクラスが分かれている(CBCentralとCBCentralManager等)。

# [Contacts](https://developer.apple.com/documentation/contacts)
(データモデリング系)電話帳フレームワーク、SNSのアドレスとの統合機能を用意している。

# [AssetsLibrary](https://developer.apple.com/documentation/assetslibrary)
(データモデリング系)廃止になった写真管理ライブラリ、レポジトリ〜フォーストクラスコレクションの良いサンプル。

# [EventKit](https://developer.apple.com/documentation/eventkit)
(データモデリング系)予定表/カレンダー管理フレームワーク

# [PDFKit](https://developer.apple.com/documentation/pdfkit)
(オブジェクトモデリング系)PDFファイルをデシリアライズ?して検索や編集できるようにしたもの。

# まとめ
- データベース由来のクラスは単なるデータアクセスIFしか提供してないし、ファイルフォーマット由来のモデルはクラスに制約/操作がそれなりに付与されているし、デバイス/プロトコル由来のクラスはがっつり状態遷移するという、90年代前半から暗に言われている？ような当たり前の結果になった。
- 作業の成果物生成を目的としたオブジェクトモデリング系は作業工程が目に浮かぶようなクラス構成(PDFKit(ドキュメント編集)、AV Foundation(動画編集))。メンタルモデルとしてのドメインモデルを最も表現している。
- ゲームのモデルは分散型制御の良いサンプルで面白そうだが今回はノーマーク。
- データフロー系も次の機会に。

# 最後に

OSSアプリを色々調べるとドメインモデルは色々出てくる？


# 参考文献

[業務別データベース設計のためのデータモデリング入門](https://www.amazon.co.jp/dp/B009QRF3JQ)
[エンタープライズ アプリケーションアーキテクチャパターン](https://www.amazon.co.jp/dp/4798105538)
[ストリームラインオブジェクトモデリング](https://www.amazon.co.jp/dp/4894715775)
[アナリシスパターン―再利用可能なオブジェクトモデル](https://www.amazon.co.jp/dp/4894716933)
[オブジェクトデザイン](https://www.amazon.co.jp/dp/4798109037)
[UMLモデリングレッスン]
(https://www.amazon.co.jp/dp/4822283496)
[実践UML](https://www.amazon.co.jp/dp/4894716828)
[現場で役立つシステム設計の原則](https://www.amazon.co.jp/dp/477419087X)
RPALT大阪 vol.3

#RPAコミュニティ

connpass登録数2200人（平成最後現在）



#BizRobo

1ヶ月無料版がある
安価版がでた

##RPAの使いどころ

システム投資対象外の業務
諦めて作業している範囲

システム投資しているしている範囲では考えてはいけない

スモールスタートしてできることを想像できるようにする

## RPAは２つある

### RPA

- ロボットによる業務プロセスの自動化
- 複数タスクからなる業務プロセス

### RDA

- パソコン操作の自動化
- 業務プロセスを構成するタスクの一部

# RPAを快適に使いたい

安定動作させるためには、違う操作でも同じことができないかを検討する

- 画像認識がうまく行かない→キーボード操作（タブキー、スペースキー、矢印キーなどで操作）
- 操作が多いときはWindowsのショートカットキーを検討する

それでもだめなら運用ルールを変えるなども検討する。

# forkwell

いつもとパターンが違ってた。

また出たなForkwell
また来てねSONY

# AUTOMATION ANYWARE

エコシステムが最大級

デジタルトランスフォーメーションに対応

- エンドユーザー機能→UI、多彩なコマンド
- セキュリティ機能→ロールベース管理
- スケーラビリティ→仮想化、オートスケール、ディザスタリカバリ

- フローチャートではなく、コマンドベースで管理する
- DOMや画像で判断
- エラーハンドリングが充実
- 画面が変わってもAIで判断できる範囲は追従する
- ボットストアがある

フリートライアル版
CommunityEdition（無償版）

5/16グランフロントでカンファレンスをやる

# UiPath勉強法

必要なもの

- パソコン
- UiPathコミュニティエディション
- モチベーション

# RPAとSPA

OCRで読み込んだPDFをSPAが監視
人間がチェックしながら読み込んだ結果を修正
結果データをRPAがインプットとして登録作業などを自動化する

OCRとRPAは鉄板

# 次回

6月21日　梅田スカイビル
Client with the currently selected authenticator does not support any combination of challenges that will satisfy the CA.

## 概要
Nginx/debian9で立てていたwebサーバーの証明書を更新しようとしたところ発生したエラーについて。

## エラー
```
$ certbot renew 
...省略...
Client with the currently selected authenticator does not support any combination of challenges that will satisfy the CA.
```


## 解決策
```
$ certbot --authenticator standalone --installer nginx -d yourdomain.com --pre-hook "systemctl stop nginx" --post-hook "systemctl start nginx"
```

また、この時ブラウザで確認した際に`ERR_TOO_MANY_REDIRECTS`と言ったエラーが発生した場合、certbotが改変したnginxのconfigファイルが既存の設定と衝突している場合があるので、確認する。

## 参考
**certbot公式より**
https://certbot.eff.org/lets-encrypt/debianstretch-nginx

**SSL web server 診断サイト**
https://www.ssllabs.com/ssltest/analyze.html
gitリポジトリのルートディレクトリを得るスクリプト

# はじめに
Gitリポジトリのルートディレクトリを知りたいことがあって、調べるとだいたい`git rev-parse --show-toplevel`が出てきます。しかしこのコマンドでは、submoduleになっているリポジトリにて親リポジトリのルートディレクトリを得ることはできません。

たとえば`main`リポジトリがsubmoduleとして`sub`リポジトリを含んだケースの場合、以下のようになります。

```console
$ cd /work
$ git clone http://xxx main
$ tree main
main
`-- sub
$ cd main: git rev-parse --show-toplevel
/work/main
$ cd sub: git rev-parse --show-toplevel
/work/main/sub
```

ここでは`sub`ディレクトリにおいても親のリポジトリルート`/work/main`を得るスクリプトを紹介します。

# Git 2.13以降

Git 2.13から`--show-superproject-working-tree`なるオプションが追加されました。これはsubmodule内から親リポジトリのルートを表示するオプションです。しかしsubmodule外では何も出力されないので`--show-toplevel`と一緒に使って両方表示させた上で`head -1`で1行目を抜いてきます。

```sh
git rev-parse --show-superproject-working-tree --show-toplevel | head -1
```

`head`しなかった場合の出力はこんな感じです。

```console
$ cd main; git rev-parse --show-superproject-working-tree --show-toplevel
/work/main
$ cd sub; git rev-parse --show-superproject-working-tree --show-toplevel
/work/main
/work/main/sub
```
# Git 2.13より前

例えばRHEL7/CentOS7ではGitはいまだに1.8.3.1です。ビルドスクリプトとして配布したい場合など、2.13以降を期待するのが難しい場合もありますが、このようにすればルートディレクトリが得られます。

```sh
readlink -f $(git rev-parse --git-dir) | sed 's/\/\.git.*//g'
```

`--git-dir`オプションは`.git`ディレクトリのパスを表示するオプションです。submodule内から見た場合も`.git`ディレクトリは親リポジトリの`.git/modules/sub`になるので、sedで`/.git`以降を削ることで親リポジトリのルートが得られます。

`sed`しなかった場合の出力は以下です。

```console
$ cd main: readlink -f $(git rev-parse --git-dir)
/work/main/.git
$ cd sub: readlink -f $(git rev-parse --git-dir)
/work/main/.git/modules/sub
```

ここで`readlink -f`しているのは`--git-dir`の微妙な挙動を補正するためです。
`--git-dir`は通常`.git`ディレクトリの絶対パスを表示しますが、リポジトリルートで実行した場合に限り`.git`だけを出力します。そのため絶対パスに揃えるために`readlink -f`を使っています。
XDのシンボルについて

XDにシンボルついて少し試してみました。
やりたかったのは、元のシンボルを色だけ保持したままで、サイズを変更できるのか的な、一部の状態を保持したままで、一部の変更ができるのかということ

## 結果
たぶんできないのではないかと。。。。（方法があるのでしょうか？）
ので、別の方法として。

## やってみたこと
- まず普通に1つのパーツをシンボル化
- ↑を複製
- 複製したものを、シンボルを解除
- 色だけ変更して、再度シンボルへ

↑ これなら、普通に新しいシンボルを作ることによって、似たパーツの色違いができる

## 組み合わせ
先ほどの2つで作ったシンボルを組み合わせてさらにシンボルを作ることは可能
グループにしても、シンボルなのは継続されるので、1つを編集するだけで全部変更される。
さらにそのグループをシンボル化すればそのグループでシンボル化が可能。

つまりは、こんなパーツをそれぞれ作成し
<img width="609" alt="img01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287209/89a56ffd-f5c3-5e22-7dd1-ba091dc49e71.png">

赤を変更すると全体の赤が変わり
<img width="600" alt="img02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287209/4978ca7a-65e3-d083-12c1-b7edcdfa7f70.png">

青の色を変更したりサイズを変更すると、同じく全体のが変わり
<img width="603" alt="img03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287209/85e8da2a-6057-5f94-00be-5928f7cfc2c1.png">

右2つのグループのシンボルを変更すれば、右2つは一緒に変わる（青を下げた）※ただし、丸の色とかサイズ変更は全体に反映される
<img width="591" alt="img04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287209/0692f242-98a3-7f72-eb79-e9c3cef2ecf0.png">


## まとめ
うまいことやればもっと幅広くつかえそう。


## 参考記事
https://blogs.adobe.com/japan/web-working-with-symbols-in-adobe-xd/
EC2インスタンスにApache HTTP Serverをインストールする。

# 

前回作成したEC2にApache HTTP Serverをインストールする。
作業前にSSHでインスタンスにログインをしておく。



## Apachをインストールする。

yumからhttpdをインストールする。

```
sudo yum -y install httpd
```

インストールしたhttpdを起動する。

```
sudo service httpd start
```

httpdをOSが再起動したときに自動起動するように構成変更する。

```
sudo systemctl enable httpd.service
```

プロセスの確認をする。

```
[ec2-user@ip-10-0-1-10 ~]$ ps -ax | grep httpd
 3374 ?        Ss     0:00 /usr/sbin/httpd -DFOREGROUND
 3376 ?        Sl     0:00 /usr/sbin/httpd -DFOREGROUND
 3377 ?        Sl     0:00 /usr/sbin/httpd -DFOREGROUND
 3378 ?        Sl     0:00 /usr/sbin/httpd -DFOREGROUND
 3379 ?        Sl     0:00 /usr/sbin/httpd -DFOREGROUND
 3380 ?        Sl     0:00 /usr/sbin/httpd -DFOREGROUND
 3537 pts/0    S+     0:00 grep --color=auto httpd
```

こんな状態になっていれば正常にApacheが動作している。



次にネットワーク状況を確認する。

```
[ec2-user@ip-10-0-1-10 ~]$ sudo lsof -i -n -P | grep httpd
httpd    3374     root    4u  IPv6  21230      0t0  TCP *:80 (LISTEN)
httpd    3376   apache    4u  IPv6  21230      0t0  TCP *:80 (LISTEN)
httpd    3377   apache    4u  IPv6  21230      0t0  TCP *:80 (LISTEN)
httpd    3378   apache    4u  IPv6  21230      0t0  TCP *:80 (LISTEN)
httpd    3379   apache    4u  IPv6  21230      0t0  TCP *:80 (LISTEN)
httpd    3380   apache    4u  IPv6  21230      0t0  TCP *:80 (LISTEN)
```

ポート80番でリスナーが起動していることがわかる。



## ファイアウォールを設定する。

現在の設定ではポート80番がファイアウォールでされていて接続することができないので、AWSマネジメントコンソールからファイアウォールの設定を変更する。



AWSマネジメントコンソールのセキュリティグループをクリックして、作成済みのグループ名WEB-SGを選ぶ。

画面下部のインバウンドタブを選択し、編集をクリックする。

ルールの追加ボタンをクリックしてポートを80に設定し、ソース①に0.0.0.0/0を入力して保存するをクリックする。

![1556271063269.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360148/69696a18-8f09-6f6d-45ab-b1599fe49093.png)




ここまで設定が完了したら起動中のEC2インスタンスのパブリックIPをブラウザのURLバーに入力して接続する。

![1556271132797.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360148/b08160a5-3a6d-e180-4334-e62b2da05aa1.png)

こんなページが表示されたらアクセスOK。



## DNSを有効にする。

AmazonVPCのVPN内名前解決を有効にして、ドメイン名でブラウザからWEBページにアクセスできるようにする。



AWSマネジメントコンソールのサービスをクリックし、VPCをクリック。さらに左側メニューからVPCをクリックする。

既に作成済みのVPC領域の上で右クリックするとEdit DNS hostnamesが表示されるのでクリックする。

DNS hostnamesにチェックを入れてSaveボタンをクリックする。



これでDNSが有効になったので、AWSマネジメントコンソールから起動中のEC2インスタンスの説明を確認してみる。

すると、プライベートDNSが割り振られていることがわかる。

![1556274426171.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360148/c8a50b26-0e32-7134-17e2-4412f9e8fc60.png)

え、長っ...(´･ω･｀)



何はともあれ、パブリックDNSを使ってブラウザからアクセスできるかチェックする。

![1556274477803.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360148/996a59b8-7794-d1d7-f65c-81b7850236bd.png)


アクセスできた。



ここまででやったことをおさらい。
1. EC2インスタンスにApacheをインストールした。
2. ファイアウォールに80番ポートのアクセスを許可した。
3. DNS名を有効にした。
Java初学者の素朴な疑問集

# Java初学者の素朴な疑問集
私はJavaを学習し始めて4か月くらい経ちますが、
学習を始めた頃に書き留めていた疑問メモを見返して
「初学者の時は誰しも、こういう疑問持つよな～」
と思ったので、初学者の皆さんの助けになればと思い共有します。

※本当に基礎の基礎を書いています。

# System.out.print()とSystem.out.println()の違い
System.out.print()は通常の表示。コンソールに出力される。
System.out.println()は最後に改行する出力方法。

例えば

```
System.out.print("ミキ");
System.out.print("です");
```
で実行すると
表示は

```
ミキです
```

となる。

```
System.out.println("ミキ");
System.out.println("です");
```
にすると、

```
ミキ
です
```

になる。

# stringとchar型の使い分け
[Javaのデータ型【String】と【Char】とは？その違いは何？【３９回】](https://www.epano-school.com/blog/mamechishiki-39/)
が分かりやすい。

charはシングルクォートで囲う。
`char a = 'A' `
シングルクォートは１つの文字、ダブルクォートは文字列と判断されるため。

# 数値のデータ型(int,long)の使い分け方

ループ処理で8の20乗を表示する課題で、
コードは合っているのに表示が0になる！
→データ型の許容範囲の問題かも。

整数の場合、
[byte<short<int<long]
という風に、格納できる数値の大きさがそれぞれ異なるので注意が必要。
調べたら、どのくらいの長さの数値を格納できるかは出てきます。
intだと、8の20乗のようにintの容量を超える大きい数値は表示できない。
こういった場合はlongを使うと良い（整数の場合）。
→数値の大きさによってデータ型を使い分ける必要がある。

# Javaクラスにメソッドを書いても動かない！？(Mainメソッドについて)
メソッドは、Mainメソッドが一番最初に処理される。
※Mainメソッドとは、
`public static void main(String[] args){ }`
のこと。

Mainメソッド以外の他のclassメソッドは、必要に応じて呼ばれたら動くので、そうでない限りいくら書いても動かない（基本的に）。

なのでメソッドをいっぱい作るときは、
1. Mainメソッド作成
2. MainメソッドにAメソッドを呼び出す記述
3. AメソッドにBメソッドを呼び出す記述
...
といった風に書いていくと良い。

Mainメソッドについては、この記事が分かりやすい。
[【Java入門】mainメソッドとその引数(args)、戻り値について解説](https://www.sejuku.net/blog/65082)

# 「インスタンス生成」って結局なんなの？
「インスタンス」とは、クラス内のオブジェクトのこと。

例えば、

``` test.java
//クラス名 作りたいインスタンス名 = new クラス名(); ←Userクラスで使いたいモノを入れるハコ
User mycards = new User();
```
と書く。

すると、メモリの中にUserクラスと同じ構造の領域が確保され、その領域をプログラム上でmycardsと呼ぶことになる。
要は、使いたいモノがあるクラスを呼び出して、使えるようにするための箱を作るということ。
mycardsはUserクラスの構造と同じなので、その中にUserクラス内のフィールド（cardsとか）領域を持つ。
また、Userクラス内のメソッドも使うことができる。
（フィールドやメソッドが「private」とかのアクセス制限されたものでない限り）

# 「void」って何？
英語で言う「void」は、「空の」「無効な」とかいう意味。
これと一緒で、Javaでのvoidは、そのメソッドに「戻り値が無いよ」って意味。

``` test.java
public static void testMethod(引数1,引数2){
    System.out.print("hogehoge");
}
```
この時は、戻り値がいらない、ただの「testMethod」という処理なので戻り値はvoid（無効化）するよ！となっている。
この時、メソッド名にStringとかの型はつかない。
というか、voidは「値を返さないメソッドの型」。 
例えば`void`ではなく`int`と書けば「intを返すメソッド」になる。

``` test.java
public static int add(int a, int b){
    return a+b;
}
```
この時、addメソッドは戻り値を使いたいので、voidの代わりにintを使っている。
だから、この時はint型の"a+b"をreturnしてあげる必要がある。

戻り値を使うメリットは、このメソッドの処理結果を呼び出したところで使えること。
例えば、このaddメソッドを

``` test.java
int result = add(2,3);
System.out.print(result); 
```
で「addメソッドおいでー！」と呼び出した場合、ここでそのまま処理結果を使えるので、out.print(a+b)とか書かなくても、表示は
`5`
となる。

「このメソッド式が長いけど、他でも使いたいんだよなー。でもout.printに長々書くのは微妙だし…」って時に戻り値を設定すると、短文で済む。


以上、初学者の時の疑問シリーズでした！
こういう初歩の初歩って、初歩すぎて誰もネットに書いてないんですよね。
それで1時間ハマるとかもったいないです。

GW中に基礎的な疑問は解消しましょう！
他にも、初歩すぎて分からないことがあればコメントください＾＾
AWS Glueがメトリクスを表示しない時の対策

新しいAWS環境にGlueジョブを作成しようとしたら
何度実行してもCloudWatch Metricsに表示されず、ハマった。  
原因はけっこうしょぼかったのだけど、  

- 思えば2か月くらい前にも同じミスをした気がする  
- 困って調べたけどWebにドンピシャの情報がないっぽい  
(結局2回とも先輩に聞いた)  

なので、備忘録として書く。

# 1. ジョブメトリクスを有効化する
初歩の初歩だけど、見えづらいところに設定があるので意外と忘れる。
これはドキュメントをよく読むと書いてある。
https://docs.aws.amazon.com/ja_jp/glue/latest/dg/monitor-profile-glue-job-cloudwatch-metrics.html  
ジョブを作成する時にジョブ自体にパラメータとして付与するパターンと、
ジョブを実行する際に一回限りのパラメータとして付与するパターンがある。
CLIから付与する場合は`"Arguments:[]"`内で`"--enable-metrics":""`と書く。

# 2. IAMで`cloudwatch:PutMetricData`を付与する
権限を細かく管理しようとしてIAMポリシー自作とかするとハマる。
一応このドキュメント↓に存在は書いてあるけど、細かいことが書かれていない。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/permissions-reference-cw.html
いろいろ調べたところ、ターゲットとなる`resource`は`"*"`でいいらしい。  
ちなみに、<a href="https://docs.aws.amazon.com/ja_jp/glue/latest/dg/create-an-iam-role.html">チュートリアル通り</a>にやっていれば
`AWSGlueServiceRole`ポリシーを使ってIAMロールを作っているはずで、
このポリシーには当然`cloudwatch:PutMetricData`も入っているので問題ない。　　
Glueを動かすためには、他にもCloudWatchLogsやEC2の権限なども要るらしく、
はっきり言って厄介すぎるので、素直に既存ポリシーを使った方がいいと思う。

おわり。
TypeScriptのutility typeすぐに使えそうなやつから解説してみる

# TypeScriptのutility-Type把握する
## TypeScriptのutility-Typeとは
TypeScriptが提供する型の変換を加えるのをアシストするラッパーです。
型システムがリッチになるのはとても嬉しい。(ずっと静的型付け言語ばかりやってきたので)
大きなプロジェクトになればなるほどこう言った型システムをはじめとする
多人数開発に向いている機能の価値が高まると思っています。

型システム使いこなしていこ！ってことで早速いってみよう。


公式はこちら
https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Utility%20Types.md#recordkt

## utility-Type一覧
```
- Partial<T>
- Readonly<T>
- Record<K,T>
- Pick<T,K>
- Exclude<T,U>
- Extract<T,U>
- NonNullable<T>
- ReturnType<T>
- InstanceType<T>
- Required<T>
- ThisType<T>
```
## 個人的に使いたいもの
ここからは個人的に使い所がパッと思いついたものをサンプルとともに紹介します。

### Readonly<T>
こいつでラップするとプロパティの値が変更できなくすることができます。
文字通り"読むだけ"です。

```
interface user {
  id:number
  name: string,
  age: number,
  adress: string,
}

const user:Readonly<user> = {
  id: 1,
  name: 'takao-h',
  age: 24,
  adress: '東京都渋谷区桜丘町20-1'
}

user.name = 'hogehoge' //Error: cannot reassign a readonly property
```

### Pick<T, K>
Pick<T>は任意にプロパティのみにアクセスできるようにしてくれる。

```
interface user {
  id:number
  name: string,
  age: number,
  adress: string,
}

type userName = Pick<user, 'name' | 'age'>

const userGroup : userName = {
  name: 'takao-h',
  age: 24
}
```
### Recod<K, T>
2つめの引数の型をもち1つめの引数にとったプロパティをもつ一連のデータを作ることができます。
このユーティリティは任意の型のプロパティを別の型にマップするために使用できます。

```
interface user {
  langage: string
}

type goodAt = 'ES6' | 'Scala' | 'MySql'

const x: Record<user, goodAtlang> = {
  forntend:{langage: 'ES6'},
  backend:{langage: 'Scala'},
  DB:{langage: 'MySql'}
}
```
### Required<T>
このユーティリティは定義したものを必ず入れるように強制します。

```
interface user {
  id:number
  name: string,
  age: number,
  adress: string,
}

cons obj: user = {id: 1}    //OK
const obj2: Required<user> = {id: 1}  //Error : property 'name', 'age', 'adress' missing
```


## まとめ
- 今回は本当に一部しか触れませんでしたが便利な型システムがたくさんあるので調べてみてください。
- 実際にプロダクションで使えそうなものを独断と偏見で選んでいます。UI層に近いところよりもReduxなどのミドルウエアで効果が絶大な印象でした。
- utility-type最高だな！

実際これはかなりミドルウェアでの振る舞いを意識して選定しました。
大規模開発になってきて、Reduxが大きくなり始めるとドキュメントとの照らし合わせが大変な時もあります。
このユーティリティを使ってクリーンに無駄なドキュメントレスな開発ができるといいなと思いました。
前回の記事(ロジスティック回帰分析)の補足コード

#1.要約
　[前回の記事](https://qiita.com/m1t0/items/8dd31f9933d48234055e)で，収束判定を"尤度の値が変わらなくなるまで"と"係数の値が変わらなくなるまで"の2パターン紹介しました．今回の記事は，後者の収束基準に基づくプログラムを載せています．詳しい数理は[前回の記事](https://qiita.com/m1t0/items/8dd31f9933d48234055e)をご覧ください．
#2.サンプルコード


```{Python3}
def calc_p(beta,MatX):
    a,b = MatX.shape
    pxb = np.zeros((a,1))
    for i in range(a):
        pxb[i,0] = np.exp(beta.T.dot(MatX[i,:]))/(1+np.exp(beta.T.dot(MatX[i,:])))
        #pxb[i,0] = np.exp(beta.T.dot(MatX[i,:].reshape(b,1)))/(1+np.exp(beta.T.dot(MatX[i,:].reshape(b,1))))
    return pxb

def losgistic_estimation2(y,data,tol=10**(-4),nstart=30,maxiter=50):
    X = data.astype("float64");n,p = X.shape
    X1 = np.hstack([np.ones(n).reshape(n,1),X]).reshape(n,p+1)
    y = y.astype("float64").reshape(n,1)
    beta_hat = np.zeros(((p+1),1))
    delta_hat = np.Inf
    for _ in range(nstart):
        print("---epoc:%d ---" % (_+1))
        #initial beta
        beta = np.random.randn(p+1).reshape((p+1),1)
        delta = np.Inf
        while True:
            print("  delta: %f" % delta)
            #Newton-Raphson step
            prob = calc_p(beta,X1)
            #print(prob) #for check
            W = np.zeros((n,n))
            for i in range(n):
                W[i,i] = prob[i,0]*(1-prob[i,0])
            #print(W) # for check
            pd2 = -X1.T.dot(W).dot(X1)
            pd1 = X1.T.dot(y-prob)
            new_beta = beta - np.linalg.inv(pd2).dot(pd1)
            print("new_beta: ",new_beta)
            delta = sum((beta - new_beta)**2)
            if delta >= 0 and delta <= tol:
                print("parameters are converged")
                break
            elif np.isnan(delta)==True:
                break
            else:
                beta = new_beta
                continue
        if np.isnan(delta)==True:
            print("ERROR:delta is nan \nStop and go next epoc")
            continue
        if delta < delta_hat:
            beta_hat = new_beta
    return beta_hat

# データ行列の生成
N = 1000;p = 2
np.random.seed(10)
X = np.random.randn(N*p).reshape(N,p)
X1 = np.hstack([np.ones(N).reshape(N,1),X])
#正解ラベルの生成
y = np.zeros((N,1))
np.random.seed(100)
beta = np.random.randn(p+1).reshape(p+1,1)
prob = np.exp(X1.dot(beta))/(1+np.exp(X1.dot(beta)))
prob
for i in range(N):
    np.random.seed(i+8)
    if np.random.rand(1) < prob[i]:
        y[i] = 1
    else:
        y[i] = 0
y

losgistic_estimation2(y,X)
beta

```
ABC - 033- A&B&C

#AtCoder ABC 033 A&B&C
[AtCoder - 033](https://atcoder.jp/contests/abc033)

#A問題

```java
	private void solveA() {
		int numN = nextInt();
		if (numN == 0) {
			out.println("SAME");
			return;
		}
		int res = numN % 10;
		numN /= 10;
		int cnt = 1;
		while (numN > 0 && res == numN % 10) {
			numN /= 10;
			cnt++;
		}
		System.out.println(cnt == 4 ? "SAME" : "DIFFERENT");
	}
```

#B問題

```java
private void solveB() {
		int numN = nextInt();
		String[] names = new String[numN];
		int[] people = new int[numN];
		long total = 0;
		for (int i = 0; i < numN; i++) {
			names[i] = next();
			people[i] = nextInt();
			total += people[i];
		}
		total = (long) Math.ceil(total / 2);
		for (int i = 0; i < people.length; i++) {
			if (people[i] > total) {
				System.out.println(names[i]);
				return;
			}
		}

		out.println("atcoder");
	}
```

#C問題：split Version

 - 最初に思いついた実装
    - `+`で区切る
    - 区切った中は`*`または単純な数値なので、一つでも$0$があったら全体が$0$になる
        - なので、区切った中の$0$の有無を確認し、`0が無かったら1個置き換える`

```java
	 /*
	 * 文字分割を利用したversion
	 */
	private void solveC2() {
		String wk = next();
		String[] multiply = wk.split("\\+");

		int res = 0;
		for (int i = 0; i < multiply.length; i++) {
			String[] inner = multiply[i].split("\\*");
			boolean inZero = false;
			for (int j = 0; j < inner.length; j++) {
				String string = inner[j];
				if (string.equals("0")) {
					inZero = true;
				}
			}
			if (!inZero) {
				res++;
			}
		}

		out.println(res);
	}
```

#C問題：しゃくとり法Version

 - 方針は上のsplitと同じ

勉強のために、split以外での実装を試す。
しゃくとり法の説明は下記サイトを読めばわかる。
※[ABC038-C](https://qiita.com/shihou22/items/a932f144b0484a0d70cd#c%E5%95%8F%E9%A1%8C%E3%81%97%E3%82%83%E3%81%8F%E3%81%A8%E3%82%8A%E6%B3%95)でしゃくとり法勉強したけど、未だ解説読みながらじゃないと微妙

**参考サイト：**[しゃくとり法 (尺取り法) の解説と、それを用いる問題のまとめ](https://qiita.com/drken/items/ecd1a472d3a0e7db8dce)


```java
	/*
	 * しゃくとり法version
	 */
	private void solveC() {
		String wk = next();

		int res = 0;
		int left = 0;
		int right = 0;
		boolean inZero = false;
		while (left <= wk.length()) {

			/*
			 * '+'が出現するまで移動
			 * 一度見つけたら、左と右の位置が揃うまで右の移動は保留
			 */
			while (right < wk.length() && wk.charAt(right) != '+') {
				right++;
				//右を動かし始めたのでゼロリセット
				inZero = false;
			}

			/*
			 * 左を動かしている最中、最後までの間に'0'が出現したら発見
			 */
			if (left < wk.length() && wk.charAt(left) == '0') {
				inZero = true;
			}

			/*
			 * 左右の位置が揃ったときに、
			 * '0'が出現していなかったら
			 * 一個の数値を0に置換する
			 * ゼロが見つかっていないことにする
			 */
			if (left == right && !inZero) {
				res++;
				inZero = false;
			}
			/*
			 * これで左右の位置が揃った場合は右をずらす
			 * 揃っていないときは左を右に近づける
			 */
			if (left == right) {
				right++;
			} else {
				left++;
			}
		}
		out.println(res);
	}
```