OmniAICreator/Qiita-1.07M huggingface dataset:
【Android】this view is not constrained horizontally ...

 - constraintlayoutを使用した時にたまに見るエラーメッセージ
 - 「水平制約、垂直制約をつけてください」という意味
 - 下記を追加してあげればOK

 ```hoge.xml
app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
```
Pythonでn番目に大きい値を取り出す方法

競技プログラミングとかで割と使うので備忘録程度に。
2パターンあります


# 1.重複を含む
Input

```
numbers = [9,2,5,4,7]
numbers.sort()
print(numbers)
print(numbers[-2])
```

Output

```
[2,4,5,7,9]
7
```

# 2.重複を含まない

Input

```
numbers = [8, 8, 1, 4, 3]
a = sorted(set(numbers))
print(a)
print(a[-2])
```

Output

```
[1 ,3 ,4 ,8]
4
```
Android 内部テスト方法（2020/01/27版）

Androidで内部テストを行う際の注意点です。
基本的には[ここの公式サイト](https://support.google.com/googleplay/android-developer/answer/3131213)を見ながら行えば良いのですが、招待リンクは自分で送る必要があります。

公開して暫くすると下図のオプトインURLが表示されるので、テスターを登録してからテスターに対してメールを送り、リンクを開いてもらえればアプリが使えるようになります。

<img width="468" alt="スクリーンショット 2020-01-27 17.17.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56144/303d528c-c407-11fd-6862-9ada7dda4c4d.png">

ブラウザにURLを直打ちしてもエラー画面が出てきますので、URLを開くのではなくクリックするようにしましょう。
文系出身エンジニアが学ぶshellについて

#記事を書く背景
仕事をしているとshellという単語をよく聞くのですが、shellとターミナルの違いであったり、bash/zshの言葉の意味がよくわかっていなかったため自分がわかりやすいようにまとめてみました。

#shellについて一言でまとめると？
ユーザー（私たち）がOSに命令するためのインターフェースの役割を担うソフトウェア。

#さらに詳しく
図にすると下記のような構造になります。
ユーザーがコマンドプロンプトやiTerm2などのターミナルを通してコマンドを打つと、
直接カーネルに命令されるのではなく、shellを通してカーネルに命令がいきます。
そして、その命令の結果をshellが受け取りユーザーに返します。
つまり、カーネルとユーザの仲介役を担うのがshellです。

カーネルには、直接勝手に触られると困るプログラムがたくさんあります。
そのカーネルを直接操作できないよう保護（仲介）する役割を担っています。
※貝殻が中の生物を守るのと同じような意味合いから貝殻（シェル）という名前がついたそうです。

【用語の説明】
■カーネル
OSの中核部分に位置するソフトウェア。
ハードウェアとソフトウェアの仲立ちをしてくれるもの。
下記URLの説明がわかりやすいです。
https://qiita.com/uguis410/items/17ec1e447e9716bfdca7
<img width="1019" alt="スクリーンショット 2020-01-27 16.23.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513534/5aefb554-2d64-df03-67f6-fb1e0931c57d.png">

#shellとターミナルの違い
そもそもshellとターミナルは別のソフトウェアです。
それぞれの役割としては下記です。

・ターミナル：ユーザーの命令文（コマンド）を受け付け、出力するソフトウェア
・shell：ターミナルで受け付けた命令文をカーネルに伝えたり、カーネルの処理結果を解釈するソフトウェア


#shellの種類
そんなshellもソフトウェアの一種なので、いくつか種類があります。
bashやzshはshellの種類のひとつなんです。

|  Shellの種類     | 概要 |   
|:-----------------|------------------:|
| sh            |              古くからあるシェルで、多くのOSで利用できる。 |    
| bash           | もっともスタンダードなシェル。Linux標準シェル。 |  
| tcsh          | 　CシェルにTenexの機能を組み込んだのがTCシェル。| 
| zsh            |              万能系シェル。Macのデフォルトshell。 |   

#参考文献
https://orizuru.io/blog/os/shell/
https://eng-entrance.com/linux-shellscript-what
https://qiita.com/uguis410/items/17ec1e447e9716bfdca7
https://academy.gmocloud.com/keywords/20170324/4010
【Windows版】RubyとRailsのインストール方法

# はじめに
2020年1月27日時点で、``Ruby 2.5.0``と``Rails 5.2.3``をWindows 10 home（64bit）にインストールした。
RubyやRailsのインストール方法については色々な記事が存在するが、個人的に良いと思った記事に沿って、一部補足しつつ手順を説明する。

なお、本記事の内容は複数バージョンの切り替えには対応していない。
少し古いが、[この記事（[2017年]WindowsでRuby on Rails環境構築の概要を知ろう！[Ruby]）](https://gabekore.org/windows-ruby-rails-overview)などで紹介されている、``Chocolatery``を使う方法が良いのかもしれない。

## Rubyのインストール
Progateの[この記事（Rubyの開発環境を用意しよう！（Windows用））](https://prog-8.com/docs/ruby-env-win)を主に参考にした。

1. まず、MSYS2をインストール
2. Rubyinstallerのダウンロード
    3. [こちらのRubyのダウンロードページ](https://rubyinstaller.org/downloads/archives/)から、インストールしたいバージョンのファイルをダウンロード。
    4. 私の場合は、Devkitなしのをダウンロードした。
3. ダウンロードしたファイルを開き、Rubyをインストール。
4. 完了したら、コマンドプロンプトを開いて、``ruby -v``でバージョンが表示されることを確認。
5. 以上。

## Railsのインストール
Progateの[この記事（Ruby on Railsの環境構築をしてみよう！（Windows用））](https://prog-8.com/docs/rails-env-win)を主に参考にした。

1. sqlite3のインストール
    2. 私の場合はすでにインストールされていたので、詳しくは述べられない。
2. コマンドプロンプトから、``gem install rails -v "インストールしたいバージョン"`` で、インストール。
3. コマンドプロンプトで、``rails -v``でバージョンが表示されることを確認。
4. 以上。

## さいごに
取り急ぎ、備忘録として記事を書いた。
このインストール方法で後々のRailsアプリ開発に不具合が生じてきたら、内容を修正する。

## 参考サイト
* https://prog-8.com/docs/ruby-env-win
* https://prog-8.com/docs/rails-env-win
「Are you sure you want to continue connecting」を聞かれなくする

オートスケールインスタンスなどへrsyncする際など、初回だと聞かれてバッチが失敗するのでその対策

.ssh/configの設定に

```
StrictHostKeyChecking no
```

を対象ホストへの設定へ追加する

20/01/28追記
EC2起動時のユーザーデータでのrsyncが上手くいかなかった
「/var/log/cloud-init-output.log」「/var/log/cloud-init.log」を確認したところ以下のログが

```
Host key verification failed.
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(226) [Receiver=3.1.2]
```

これはユーザーデータ起動時の実行ユーザーがrootのために起こるのだが、同じ方法で解決が可能だった
jQueryとphpを使い、WordPressの絞り込み検索結果をページ遷移なしで表示する

忘れないように自分用メモを残します。

おそらくWordPressに限定せずとも
phpで同じようにdataを返してやればいろいろな結果を返せると思われます。
※絞り込み検索については既に実装している前提です。


```js
function getData(){
  //フォームの値を.serialize()で変数に格納
  var params = $('form').serialize();
  $.post(
    //絞り込み検索を定義してあるPHPファイルにフォームの値を渡す
    "<?php echo site_url( '/' ); ?>search.php?" + params, 
        
    //search.phpからの値を取得し、指定要素に出力
    function( data ) {
      //.view内にsearch.phpの結果が出力される
      jQuery('.view').html(data);
    }
  );

}
```
`getData()`はonclickなどのイベントハンドラで適当なボタンに実行させるだけです。
onchangeを使うとフォームに何かしらの変更があった瞬間に毎回実行されます。
検索結果の件数だけを瞬時にかえすので賃貸物件検索サイトのような役割の検索フォームにはいいかもしれません。

`<?php echo site_url( '/' ); ?>`を使って、ルートディレクトリ直下のsearch.phpをリクエストしています。
この場合wp-load.phpをincludeさせておかないと動きません。

最初は`<?php print get_template_directory_uri(); ?>`を使って、テンプレートディレクトリ内にファイルを置いてリクエストすればいけるかと思っていたんですがなぜか表示されず、エラーメッセージも出ないのでとりあえずこうしてます・・理由がわかる方いらっしゃいましたら教えてください・・
WordPressに固定ページテンプレートとしてファイルを認識させればいけるのかもしれませんが検証していません。

セキュリティもなにか心配なので改善を考える必要があります・・
#Vue で変数を利用した外部リンクを作る ( v-bind:href="variable" )


`linkPath = "https://example.com"` のように外部サイトの絶対パスを変数代入しておいて使いたい時


```vue
<a v-bind:href="linkPath">
  Link
</a>
```

```vue
<a :href="linkPath">
  Link
</a>
```

router link はアプリケーション内リンク用なので使えない

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ノーコーディングのススメ

# 概要

私はいわゆるプログラミングする人ですが、個人的にはプログラミングしなくて良いならしない方が良いと思います。

ノーコーディングはバグワードで定義が曖昧です。
ここでいうノーコーディングとは、**コーディングしない（または少ないコード）で機能実装すること**です。ここで、少ないコードでと言っているのは、結局のところ、難しいことをしたくなるとプログラミングする必要が出るということに暗に言っています。こういうこともあるので「ローコーディング」とも表現したりします。

**※注意**
**これはいわゆる職業プログラマになりたい人向けの記事ではありません。職業プログラマになるのであれば、真面目にプログラミング言語を勉強すると良いと思います。**

ここでは、以下のものを対象としています。分類は結構適当です。

- フォームアプリ系
    - kintone
    - App Maker
    - Zoho
    - Bubble
- その他
    - Node-red
    - Scratch

内容はそのうち追記などする予定。基本的に自分の独断と偏見で記載しています。


# フォームアプリ系

イメージ的にはVisual Basicみたいなようなもの。

## kintone

サイボウズが提供しているプラットフォーム。DBとフォームが強い紐づけされているイメージ。ドラッグ&ドロップでフォームを作成、それに伴い裏でDB定義が出来る。また、テンプレートの数も多いので、プログラマでなくても簡単にアプリ開発が出来る。国産なのでとっつきやすい。

## App Maker

Googleのサービス。kintoneと同様のサービスですが、日本語の情報はあまりない。Googleのサービスと簡単に紐づけできるようなので、Googleのサービスを積極的に利用したい場合は採用を考えても良いかもしれない。

**注意**
**以下のニュースが出ていました。私はよく分かりま線が、「AppSheet」の方の採用が良いかもしれません。**


Google、「App Maker」を2021年終了　買収した「AppSheet」への移行を推奨（2020年1月29日現在）：[https://www.itmedia.co.jp/news/articles/2001/28/news060.html](https://www.itmedia.co.jp/news/articles/2001/28/news060.html)


## Zoho

Zohoのサービス。ノーコーディングのプラットフォームではとても有名な様子。ただ、日本語のドキュメントが少ないため、取っ付きにくい部分がある。

## Bubble

よくTwitterのようなアプリのサンプル紹介があるため、そういったものを作成する際にはいいかもしれない。見るとMapアプリなどの作成もサンプルがあるため、作成しやすそうです。これも日本語の資料が少ないので、取っ付きにくい部分がある。

# その他

## Node-red

IBMが開発したプラットフォーム。日本では日立が開発を主導している様子。機能をノードと言われる単位で考え、ノードとノードを矢印で繋げて一つのアプリケーションを作成する。導入にはnode.jsが必要なので、少しばかりハードルはある。商用利用にも耐えうるので、勉強していてあまり損はない。

##Scratch

教育用プラットフォームとしてとても有名なもの。あくまで教育用途でのプラットフォームであるため、業務上の利用は難しい。将来的なことを考えると、ある程度慣れたらNode-redを勉強すると良いと思う。
[HTTP] GETとPOSTの違い

HTTP通信において、GETとPOSTはWebサーバに値を渡すことができる。

##パラメータの渡し方
GETメソッドは渡す値をURLの後ろに付けて、リクエストする。
例）http://url?param1=value1&param2=value2

POSTメソッドはbodyに含めて、リクエストする。目で見ることはできない。

##使用目的
GETメソッドはデータを取得するときに使う
POSTメソッドはデータを登録するときに使う

##渡せるデータ量
POSTメソッドのほうが渡せるデータ量が多い。

##履歴
GETメソッドは渡したデータが履歴に残る。

参考URL
・https://wa3.i-3-i.info/diff7method.html
・https://www.bing.com/search?q=post%20get%20%E9%81%95%E3%81%84&FORM=IENTSH&PC=HCTE&refig=7a7fc89c54fa44a085e9e9ad7567c1ee&httpsmsn=1&msnews=1

##感想
GETはデータを取得して、POSTはデータを送るのだと勘違いしていたので、調査した。しっかり覚えておきたい。
Laravelでリレーション先のカラムによってソート(orderBy)する方法

環境：Laravel5.8,MySQL5.7

Laravelでリレーション先のカラムによってソートする方法。

Laravelでデータベースからリレーションを利用してデータを取得して並び替えをする時に、
親ではなく、子の情報で並び替えをしたい時があると思います。

例えば、Twitterの、自分のいいね欄に登録されているツイートの順番は、
ツイートが投稿された順番ではなく、自分がツイートをいいねした順番で並び替えされています。

これは、ツイート(親)に紐づく、Like（子）が作られた時間によって並び替えが行われている状態と考えられます。

ここでは、自分がいいねしたツイートを、いいねをした順番で取得する方法をまとめます。

###条件
Tweet(親)→Like(子)と、
User(親)→Like(子)は、1対多の関係で結びついてるとし、
LikeはTweetのidと、Userのidを含んでいます。

Tweetを取得する際に、Likeのcreated_atをDESCの順で並び替えたいものとします。(新しいいいねが一番上に来る)

```php
$posts = Tweet::select('tweets.*')
  ->join('likes', 'likes.tweet_id', '=', 'tweets.id')
  ->where('likes.user_id', Auth::user()->id) //ログインしている自分自身のid
  ->orderBy('likes.created_at', 'DESC')
  ->get();

return $posts;
```
Lightroomで書き出した写真が、GooglePhotoで撮影日順にならないのを解決する。

#課題
GooglePhotoにアップロードした画像が撮影日順じゃなくて、編集(書き出し)した順になってしまうのがとてもうざい。
たぶん、世界でも1000人くらいは同じ問題でムカついているひとがいるだろうと思いました。
イイネと思ったらイイネしてください。ぼくの存在意義になります（笑）

# 解決方法
書き出し時の設定で、寸法をフルサイズにする。
![Lightroom書き出しフルサイズ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445408/a6706cbb-d83d-45e0-22ed-95303b1ac2c0.png)

これで、なぜかしらないけど、更新日時と撮影日が同じになります。
なお環境は
Windows10、
Adobe Photoshop Lightroom Ver3.1

※CCのほうは知りません。Macでも試してません。
※アプデで仕様変わるかもしれません。

#感想
もーこれ、詳細設定のすべてのメタデータのところだと思うじゃんな？？？
一応、すべてのメタデータにもチェック入れています。
なによフルサイズって。画質とちゃうんかい！？
igataをPWA化する２

# はじめに
[前回](https://qiita.com/ufoo68/items/83e877d3b901b513c073)の続きです。まだまだ先は長そうです。

# 内容
今回は[Firebase](https://firebase.google.com)にigataのアプリをデプロイしてみました。その流れについてまとめます。

# FirebaseへのデプロイとHostingの設定
まずは[Firebase CLI](https://firebase.google.com/docs/cli)をインストールする必要があります。今回は以下のようにnpmで行いました。

```
npm i -g firebase-tools
```

インストールできたらログインをします。

```
firebase login
```

ここまでできたら準備は完了です。あとは前回作った[igata-pwa](https://github.com/aYutaMatsunaga/igata-pwa)のディレクトリ上で以下を実行します。

```
firebase init
```

基本聞かれたことに`yes`で問題ありませんが、`Which Firebase CLI features do you want to setup for this folder`の選択肢では`Hosting`を選択します。

あとはigataは`public`のフォルダを勝手に作ってそこにbundleしたhtmlやらの必要ファイル一式があるのでそのままデプロイしても問題ありませんがこのままではルーティングができません(TODOアプリからlogoutすると`Page Not Found`になるはずです)。
そこで`firebase.json`を以下のように書き換えます。

```json:firebase.json
{
  "hosting": {
    "public": "public",
    "ignore": ["firebase.json", "**/.*", "**/node_modules/**"],
    "rewrites": [
      {
        "source": "**",
        "destination": "/index.html"
      }
    ]
  }
}
```

この`rewrite`の設定を書き加えることで常にどのパスでも`index.html`だけにページを向けるようにさせます。
ここまででigataがデプロイ先でもSPA的な振る舞いができるようになりました。

# さいごに
デプロイ先は[ここ](https://igata-pwa.firebaseapp.com/)です。ここまででPWA(あとはSPA)の最低限の下地処理ができたのでここからアプリを作っていこうと思います。
heroku run rails db:migrateするとbash: heroku: command not foundと出た時の対処法

##事象
railsチュートリアル2章の「2.3.5 アプリケーションをデプロイする」において、
$ git push herokuはできていましたが、
$ heroku run rails db:migrateをすると
``bash: heroku: command not found
``と出てしまいました。

##原因
environmentディレクトリ（別の階層）でherokuをcreateしていたからでした。

##対処法
ec2-user:~/environment/toy_appに移動してから
herokuのインストールコマンドを実行。

```ec2-user:~/environment/toy_app
$ source <(curl -sL https://cdn.learnenough.com/heroku_install)
```

その後、
herokuの新しいアプリケーションを作成。

```ec2-user:~/environment/toy_app
$ heroku create
```

これにより、Railsアプリケーション専用のサブドメインが作成。

push先が前回はenvironment配下（上の階層）だったため、
herokuのpush先を変更。

```ec2-user:~/environment/toy_app
git remote set-url heroku {ここに変更するURLを貼り付け}
```

※herokuのアプリケーション用URLではなく、herokuのgitのURL(heroku→Settings→Info→Heroku Git URL)を入れます。


改めてgit pushします。

```ec2-user:~/environment/toy_app
$ git push heroku
```


再度をheroku run rails db:migrate行います。

```ec2-user:~/environment/toy_app
$ heroku run rails db:migrate
```


すると
`Running rails db:migrate on [herokuの固有ドメイン名]... up, run.2996 (Free)`
と出て問題なくアプリケーションをデプロイできました。

##参考
・https://railstutorial.jp/chapters/toy_app?version=5.1#sec-deploying_the_toy_app
・https://qiita.com/Tattsum/items/b86c9d698b0727934836
Creating default object from empty valueというエラーの原因

## 背景
Laravelで更新機能を作っており更新ボタンを押すとこのエラーに遭遇した。

```
Creating default object from empty value
```

![スクリーンショット 2020-01-27 16.37.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223280/4e71729c-ad4d-632d-2818-863d23ff3427.png)

### 該当コード
```:PostController
$post->user_id = auth()->id();
$post->title = $request->title;
$post->clearTime = $request->clearTime;
$post->save();
```

## 原因と解決方法
$postのクラス宣言をしていないため。

```
$post = new Post; #追加
$post->user_id = auth()->id();
$post->title = $request->title;
$post->clearTime = $request->clearTime;
$post->save();
```
を最初に追加してあげる
baserCMS 記事にGoogle Mapを表示させるまで

早速いきます。

まず、googleCloudPlatformへの登録が必要になります。

[こちら](https://qiita.com/Brutus/items/22dfd31a681b67837a74)などを参考に、クレカとひもついた有料アカウントを作成して下さい。

有料と言ってもリンク先にあるように、gcpには無料トライアル期間があり、google様が3万円ただでくださるのです。ありがたく使い切りましょう。
ちなみに私はawsの無料枠で構成できるEC2インスタンスが弱すぎたのでgcpの東京リージョンに乗り換えましたw

登録したら、まずapiの有効化が必要になります。

左のハンバーガーメニューから、「APIとサービス」→「認証情報」

![スクリーンショット 2020-01-27 15.43.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502344/ac45c0ae-30a9-68b5-d5dc-bb7768587d8f.png)

で、「認証情報の作成」→「APIキー」をクリックします。

![スクリーンショット 2020-01-27 15.55.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502344/119022f7-d1e8-58a5-45e3-5e2bc6e64726.png)


![スクリーンショット 2020-01-27 15.56.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502344/62ef45be-0162-8fb4-a000-571cd2efcd51.png)

めちゃめちゃ簡単です。
次にいきましょう。

このままだとapiキーは誰にでも使えてしまうので、制限をかけます。
（googleさんは優秀なのでこの状態のキーだと実際に使う時にエラー吐きます。）

![スクリーンショット 2020-01-27 16.00.09（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502344/e1eb9cbf-ddd6-8d9e-1f48-2b04c8cabafd.png)

画像の赤枠で囲った部分を制限します。

##http制限

まず、今回使うキーはbasercmsから叩く時に使用するので、httpアクセスのみに制限する為にhttpリファラ制限を指定します。

![スクリーンショット 2020-01-27 16.04.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502344/90e48107-65f5-ba44-24ea-46a1753620f2.png)

画像のように`http://ドメイン/*`という風に制限をかければそのサイトからのみアクセスできるようになります。
もちろん、画像のように`localhost/*`と指定してやればローカル環境でテストができます。


##api制限

次に、このapiキーをGoogle Map APIでのみ使用できるように制限をかけます。

ダッシュボード左のハンバーガーメニューより、「googleマップ」→「API」

![スクリーンショット 2020-01-27 16.06.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502344/5751026b-f2d0-5b8b-4c59-d477cb1e5d55.png)

こちらより、Google Map APIを有効化します。
今回有効化するのは三つです。
「Maps JavaScript API」（記事中でjsとして読み込む為）
「Geocordind API」(住所を緯度経度に変更させる為)
「Maps Static API」(スマホに対応させる為)

![スクリーンショット 2020-01-27 16.11.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502344/0b6caf1a-3651-bfbb-73b9-5cf0a649dc8b.png)

このような状態になればOKです。テストで何回かしようしたのでリクエストがありますけど気にしないで下さい

先ほどのapiキーの画面に戻り、制限をかけます。

![スクリーンショット 2020-01-27 16.20.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502344/a2726cc5-30e7-b385-912f-af11397c5469.png)

こんな感じです。

ここまで設定できればやっとbaserCMSに戻ります。
管理画面を開き、「基本設定」より外部サービス設定を開いてください。

![スクリーンショット 2020-01-27 16.13.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502344/43058cac-8d25-428e-0c63-9b65ce8fc67c.png)

赤で塗りまくって訳わかりませんね。
上の欄に住所、(ex. 福岡県福岡市中央区1-1-1)
下の欄に頑張って設定したAPIキーを入れてください。

保存すれば準備完了です。記事を見てみましょう。
記事はデフォルトテーマについている会社案内ページです。
他のページに表示したい時は記事に`<?php $this->BcBaser->googleMap(['width' => '任意の値', 'height' => '任意の値'])?>`を挿入すると表示されます。ヘルパー最高！！！

![スクリーンショット 2020-01-27 16.18.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502344/10304a00-75da-5fcc-968c-9e78b6aef9d5.png)

できました。

以上です。今回使った住所はテストで適当に考えた場所なので特定の人物等に全く関係ありません。フィクションというやつです。

wordPressは記事を表示させるのにプラグインを入れるか記事に直接html入れなきゃいけないんですよね、baserCMSは管理画面から設定するだけでデフォルトの会社案内ページに表示されます。ﾍﾞｰｻｰｽｹﾞｰ



#参考
https://photo-tea.com/p/how-to-googlemapapi-localdev/
https://empoh.com/2019/03/02/538/
https://complesso.jp/1485/
RailsでCSS読み込もうとしたらエラー吐かれた

#やろうとしたこと
Railのビューファイルは、デフォルトでそのコントローラのCSSファイルを読み込むようになっているが、別のCSSを指定したくなった。

#吐かれたエラー
そこで、`<%= stylesheet_link_tag 'post' %>`をビューファイルのheadタグに書いてみたがエラー。(postはCSSファイルの名前)
![SnapCrab_Action Controller Exception caught - Google Chrome_2020-1-27_16-12-59_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551999/6309215b-6277-b79a-317e-91a525773483.png)

#対処
？？？となったがなんのことはない、`Add `Rails.application.config.assets.precompile += %w( post.css )` to `config/initializers/assets.rb` and restart your server`と言われているのでその通りに対処するだけだった。'config/initializers/assets.rb'に'Rails.application.config.assets.precompile += %w( post.css )'をコピペしてあげるとすんなりCSSを読み込んでくれた。
Railsのエラーコメントって優しい。
alpineを使用しているときのgitインストール


Vue.jsのローカル環境を構築している際にコンテナで`npm install`を実行するとgitがなくて怒られた。
`apt-get`がないので`apk add git`でいけるみたい。

```Dockerfile
FROM node:8.11.4-alpine

WORKDIR /var/www/app

RUN apk update && \
    npm install && \
    npm install -g npm && \
    npm install -g vue-cli && \
    npm install -g http-server && \
    apk add git


EXPOSE 8080

CMD [ "http-server", "dist"]
```

初見のシステムの環境構築難しい。。。
#Rails で レコードが更新・保存されたかどうかを確認する ( saved_changes? )

```rb
# Model Instance
user = User.first

user.saved_changes?
# => false

user.update!(name: "Alice")
# User Update (0.8ms)  UPDATE `users` SET `name` = 'Alice', `updated_at` = '2020-01-26 05:35:18' WHERE `users`.`id` = 1

user.saved_changes?
# => true

user.reload
user.saved_changes?
# => false

# When nothing commit on DB
user.update!(name: "Alice")
# (0.6ms)  BEGIN
# (0.5ms)  COMMIT

user.saved_changes?
# => false
# Then saved_changess?

user.update!(name: "Bob")
user.saved_changes?
# => true


user.reload
user.saved_changes?
# => false

user.name = "Carol"
user.saved_changes?
# => false

user.has_changes_to_save?
# => true

user.save!
user.saved_changes?
# => true
```

# Ref

Rails 5.1 で attribute_was, attribute_change, attribute_changed?, changed?, changed 等が DEPRECATION WARNING - Qiita
https://qiita.com/htz/items/56798d53ec5988733fc6

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
#Rails ActiveRecord / detect updated DB records on instance / saved_changes?

```rb
# Model Instance
user = User.first

user.saved_changes?
# => false

user.update!(name: "Alice")
# User Update (0.8ms)  UPDATE `users` SET `name` = 'Alice', `updated_at` = '2020-01-26 05:35:18' WHERE `users`.`id` = 1

user.saved_changes?
# => true

user.reload
user.saved_changes?
# => false

# When nothing commit on DB
user.update!(name: "Alice")
# (0.6ms)  BEGIN
# (0.5ms)  COMMIT

user.saved_changes?
# => false
# Then saved_changess?

user.update!(name: "Bob")
user.saved_changes?
# => true


user.reload
user.saved_changes?
# => false

user.name = "Carol"
user.saved_changes?
# => false

user.user.has_changes_to_save?
# => true

user.save!
user.saved_changes?
# => true
```

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ふわっと表示させるスライドショー的なものを作る

#ふわっと表示させるスライドショー的なものを作る
今回は3つのコンテンツを一定の時間ごとに表示していくスライドショーを作りたいと思います。

## コード
html

```.html
  <div class="slide" data-slide="">
    <div data-slide-item="" class="slide__item slide__item--first">1</div>
    <div data-slide-item="" class="slide__item slide__item--secound">2</div>
    <div data-slide-item="" class="slide__item slide__item--third">3</div>
  </div>
```

scss

```.scss
.slide {
  position: relative;

  &__item {
    width: 100%;
    height: 50px;
    
    &--first {
      position: absolute;
      top: 0;
      left: 0;
      background: #ff0000;
    }
    &--secound {
      position: absolute;
      top: 0;
      left: 0;
      opacity: 0;
      background: #ff00ff;
    }
    &--third {
      position: absolute;
      top: 0;
      left: 0;
      opacity: 0;
      background: #00ff00;
    }
  }
}

@keyframes opacity-start {
    0% {
        opacity: 1;
    }
    100% {
        opacity: 0;
    }
}

@keyframes opacity-end {
    0% {
        opacity: 0;
    }
    100% {
        opacity: 1;
    }
}
```

javascript

```.js
const slide = document.querySelector('[data-slide]');
const slideItem = document.querySelectorAll('[data-slide-item]');
let current = 0;


const slideImage = function(){
  slideItem[current].style.animation = "opacity-start 2s linear";
  slideItem[current].style.opacity = "0";

  if (current < 2) {
    current += 1;
  } else {
    current = 0;
  }

  slideItem[current].style.animation = "opacity-end 2s linear";
  slideItem[current].style.opacity = "1";
}
setInterval(slideImage, 5000);
```
ラズパイ で Adafruit Python BluefruitLE が動きました。

# はじめに
技術書典 7 で野良バッジ初号機を数量限定で頒布したのですが、購入者の方から「ラズパイとのインテグレーション」についてコメントをいただきましたので、技術書典 8 の記事にすることにしました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/e08a2e6e-eac3-85ab-a67d-dd76e60919bb.jpeg" width="30%">
どうせなら Mac と Linux (ラズパイ) の両方で同じライブラリとソースコードで動作する開発方針で、その過程で直面した問題とその解決方法をメモに残しておきます。

# やはり動きませんでした
技術書典 7 で ESP32 用のサンプルコード (C) と Chrome ブラウザの Web Bluetooth API を利用したサンプルコード (JavaScript) と USB-HID 版 LED Badge のメッセージ表示プログラム (Python) があったので、node.js と Python で開発することにしました。

## 環境
- Mac: macOS Mojave バージョン 10.14.6 (18G1012) + Xcode 11.3 (11C29)
- Linux: Raspberry Pi Zero W / Raspberry Pi 3 Model B+ (Raspbian GNU/Linux 10 buster)

## Adafruit Python BluefruitLE ライブラリ
node.js は noble ライブラリを採用してうまく動き、Python は Adafruit Python BluefruitLE を採用して Mac ではうまく動いたのですが、ラズパイ では「<A HREF="https://qiita.com/nanbuwks/items/32143951bca3cd676587">Adafruit Python BluefruitLE が動きませんでした</A>」の記事に遭遇し、案の定、やはり動きませんでした。

## BlueZ(5.38)以降のパッチ
調査を進めると Linux は BlueZ(5.50) を使用しており、BlueZ(5.38)以降はD-Bus Object Managerの仕様に変更が加わったため、パッチを適用する必要がありました。2020 年 1 月 26 日時点で本家にはマージされていませんでしたので、次の手段で解決する必要があります。
(参考)
<A HREF="https://github.com/donatieng/Adafruit_Python_BluefruitLE/commit/af46b05cbcfd82110c8bbd08ed3d483de128fed1">Fixed incompatibility with BlueZ version >= 5.38</A>

### 環境
- Linux: Python 3.7.3 + BlueZ(5.50) + Adafruit Python BluefruitLE (donatiengパッチ)

# 動きました
解決方法としては 2 つの手段があります。

- 既に Adafruit Python BluefruitLE ライブラリがインストールされている場合は手動でパッチを適用する。または、一度アンインストールしてパッチが適用された Adafruit Python BluefruitLE ライブラリをインストールする。
- まだ Adafruit Python BluefruitLE ライブラリをインストールしていない場合はパッチが適用された Adafruit Python BluefruitLE ライブラリをインストールする。

## 手動でパッチ適用

```bash
$ cd /usr/local/lib/python3.7/dist-packages/Adafruit_BluefruitLE/bluez_dbus/
$ sudo mv gatt.py gatt.py_org
$ sudo wget https://raw.githubusercontent.com/donatieng/Adafruit_Python_BluefruitLE/master/Adafruit_BluefruitLE/bluez_dbus/gatt.py
```

### Adafruit Python BluefruitLE ライブラリのアンインストール

```bash
$ sudo pip3 uninstall Adafruit-BluefruitLE
```

### パッチ適用済み Adafruit Python BluefruitLE ライブラリのインストール

```bash
$ git clone https://github.com/donatieng/Adafruit_Python_BluefruitLE
$ cd Adafruit_Python_BluefruitLE/
$ sudo python3 setup.py install
```

# まとめ
<A HREF="https://techbookfest.org/event/tbf08">技術書典 8</A> は「光と音をハックする」をテーマに絶賛執筆中です！ ( 2020 年 1 月 27 日現在)
2 日目「か40」で出店しますので、ぜひ当日お会いしましょう！！
<img width="50%" alt="img_005.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/c0e3d8db-45e3-5195-f7db-2ff3720aec3c.png">
■メッセージ for ファン を使ってみた件

##**■はじめに**
・秋葉原を散策していた時、安売りしてた”メッセージ for ファン”を使ってみたので、使い方を備忘録として残します

###**■■ここで出来るようになること**
・”メッセージ for ファン” の基本的な使い方

▲初投稿：2020-01-26

##**■やってみよう！**
・”メッセージ for ファン” って言うのは、デスク扇風機にLEDがついていて回転しながらメッセージを表示するガジェットです

![IMG_8914.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224568/2e029ff1-ee86-3fb9-907d-9828b081dcf1.jpeg)

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">メッセージ for ファン <a href="https://t.co/ApY0ztsBTf">pic.twitter.com/ApY0ztsBTf</a></p>&mdash; KenS@ReBOOT (@KSxRDevelop) <a href="https://twitter.com/KSxRDevelop/status/1221416543868731392?ref_src=twsrc%5Etfw">January 26, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

###**■■とりあえず使ってみよう**
・表示用メッセージを作るには専用アプリケーションをパソコン（Windows10）にインストールします。ファンとはUSBで接続してデータを送ります

・専用アプリを起動すると下記のような画面が表示されます。各々の説明は

![a001-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224568/aabfa9d3-3c25-fbc0-a975-5c901f623534.png)

① メニュー
開く：以前保存した設定ファイルを開く
保存：今回設定した情報をファイルに保存する
削除：表示部分を全削除する
② 対応言語
　・英語
　・中国語
　・韓国語
　・日本語
　・フランス語
　・ドイツ語
　・イタリア語
　・スペイン語
③ 表示メッセージ内容の登録
　・全角１２文字
　・半角２０文字
　２０パターン
④ 文字（ビットパターン）編集エディタ
![a006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224568/75326981-55f7-8dad-4081-697ff87dbf44.png)
　・文字色
　赤、緑、青、黄、紫、水色、白
⑤ メッセージ表示動作指定
　・開き方（表示開始時）
　　左から右に開く
　　右から左に開く
　　上から下に開く
　　下から上に開く
　　内から外に開く
　　外から内に開く
　　そのまま開く
　　反時計回りに開く
　　時計回りに開く
　・途中のアニメーション（表示中）
　　反時計回り
　　時計回り
　　３回点滅
　　そのまま
　・閉じ方（表示終了時）
　　右から左に閉じる
　　左から右に閉じる
　　下から上に閉じる
　　上から下に閉じる
　　外から内に閉じる
　　内から外に閉じる
　　そのまま閉じる
⑥ 表示動作確認
　・スタート:表示シミュレーション開始
　・停止:表示シミュレーション終了
　・送信:設定データをファン側に送信
　・終了:アプリケーション起動終了

###**■■ファンにデータを送ってみよう**
・ファンに表示させるメッセージの設定が出来たら。データをファンに送リます
・ファンの背面に３つのモードに切り替えるスイッチがあります

![IMG_E8910.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224568/4aa67990-d50e-d987-2210-8f8e0c1ede9c.jpeg)

・FAN：ファンだけを回す・・・左に倒す
・EDIT：アプリからデータ送信を受ける・・・どちらにも倒さない
・LED：ファンを回しLEDにメッセージを表示させる・・・右に倒す

・パソコンからデータを送る時はEDITにして画面⑥内にある”送信”ボタンを押します
 　データ送信中はファンのLEDが点滅しますので、消灯するまで待ちます

###**■■メッセージを表示させてみよう**
・背面のスイッチをFANにします。正常にデータが送信されていれば、メッセージが表示されます

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">メッセージ for ファン <a href="https://t.co/ApY0ztsBTf">pic.twitter.com/ApY0ztsBTf</a></p>&mdash; KenS@ReBOOT (@KSxRDevelop) <a href="https://twitter.com/KSxRDevelop/status/1221416543868731392?ref_src=twsrc%5Etfw">January 26, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

・電源はUSBからとります。スマホのバッテリーからでも動きます（当然電源供給でも）

・ちょっとした、目を引く小道具として使うのには十分だと思います。アイデア次第というところもあるので皆さんも色々と試してみてください！

##**■参考**
・商品サイト AREA ・・・ [こちら](https://www.area-powers.jp/product/others2/4580127694833/)　

・Qiita(KSxRDevelop)　・・・　その他の情報は[こちら](https://qiita.com/KSxRDevelop)
[WIP]自然言語処理における前処理のメモ

この記事は[自然言語における前処理](https://qiita.com/Hironsan/items/2466fe0f344115aff177)を読んだ際の備忘・メモ書きです。

### 数値の置き換え
99や1.235などを0にするように、数値も正規化するんですね。確かに自然言語処理で分析したいこととは関係ないことが多そう。

### ストップワードの除去
これに限った話ではないですが、コードサンプルがあっていいですね。
あと、ストップワードの選び方も意味ベースや頻度ベースと復習にちょうどいい。

### 前処理ありとなしの比較
実行時間差が大きい。精度よりも重要じゃなかろうか。
もう大丈夫！エンジニアでもUIデザインが出来る時代が来た！！！

### 自分はエンジニアだし、デザインなんて...

# もう大丈夫！ 何故って？ [私](https://uizard.io/i/vVjpg)が来た！！！
### [uizard](https://uizard.io/i/vVjpg)
<a href="https://uizard.io/i/vVjpg" target="_blank">
<img width="1440" alt="スクリーンショット 2020-01-27 14.45.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224153/acb3b215-710e-e19c-a98c-ee6519c0472a.png">
</a>

# どういうツール？
言葉で説明するより
youtubeの動画見てくれた方が早いかもです。
[![uizard how to](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224153/db927793-11f6-99f4-1727-a70cc9c89f1e.png)](https://www.youtube.com/watch?v=V3GPXRfYjgA)

このように、落書きのようなUI画面を
紙や、ホワイトボードに書き、スマホで撮影するだけで
AIがいい感じのUI画面を作ってくれちゃうわけです。

もちろん、イラレとかお絵かきツールで書いて
pngとかで保存した落書きからも作ってくれちゃいます。
[![uizard how to2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224153/27bce462-2764-b0e6-44fe-8f5a48497993.png)](https://www.youtube.com/watch?v=DapKYJ6niCM)


# 実際に使ってみた？

実を言うとまだ試せていない
どうやらこのツール、現在まだベータ版で認知度を上げるために
SNSやらブログやらメールやらでシェアして
一定数の登録者を案内してくれた人にアカウントを差し上げますよ！
と言う状態のようです。

広め方賢い...
(なんかア●ウェイっぽいな)

これは、ただでさえみんなに教えたいツールだと言うのに
記事にせずにはいられんよ！

決してネズミ講とか...
ア...アフィリエイトとかでもないから安心してくれ！
「(ただ、私のアカウントが使えるようになるだけさ)」(小声)

試してみたいという人はぜひ
↓↓↓こことか
https://uizard.io/i/vVjpg

↓↓↓こことか
https://uizard.io/i/vVjpg

↓↓↓あるいは、ここからアカウント申請をしてみてくれ！
https://uizard.io/i/vVjpg


# まとめ
要は、何が言いたいかと言うと
uizardがあればエンジニアもUIデザインを恐れることはないと言うことと
最近、ヒロアカにハマっていると言うことだ！
![オールマイト](https://base-ec2if.akamaized.net/w=500,a=0,q=90,u=1/images/item/origin/432284a33fcb5767ccb960d1379fec89.jpg)
ポエム/BIツールにおけるグラフ表現の覚書

## 想い
* 世の中にあるダメグラフってドキュメントが前提とされていることが多い
    * ダメグラフはダメ、ゼッタイ
    * ただ、BIツールにおけるグラフは**インタラクティブに描画される**ため、前提が違うはず
* ExcelではできるがBIツールではできない表現があるという前提を共有したい
* <del>過去に自分が構築したダッシュボードについての懺悔と言い訳</del>

## まとめ
* 世の中で言われるグラフ描画とは異なるプロセスを辿って作成されるので、前提がそもそも違う
    * ドキュメントを想定したグラフ：数字 → 伝えたいメッセージ → グラフ
    * BIツールにおけるグラフ：数字 → グラフ → 伝えたいメッセージ
* 探索的にグラフの海を泳ぎながら示唆を得られるのがBIツールの良さ

## インタラクティブであることのメリットとデメリット（ユーザー）
#### メリット
* 自分の見たい条件に絞って集計された結果が得られる
    * 例: 集計期間とか、担当地域とか
* 上手く作られたダッシュボードだと、深堀も適切かつ容易
    * 例: 課題のあるセグメントの抽出〜セグメントに所属するユーザー一覧の取得等

#### デメリット
* 何を知りたいか目的を持って見始めないと何も示唆を得られない
* 何の条件でフィルタがかかっているかを念頭に置きながら分析しないとミスリードする

## インタラクティブであることのメリットとデメリット（開発者）
#### メリット
* ユーザーの要件に合わせた切り口の数のグラフを作らなくて良い

#### デメリット
mysqldumpでssh(多段)ごしにリモートサーバにmysqlのバックアップを取得する

# mysqldumpでssh(多段)ごしにリモートサーバにmysqlのバックアップを取得する

## はじめに

リモートのDBサーバ（多段sshの先にある）から手元の環境にssh越しにバックアップを取得しました。

## ネットワーク的にはこんな感じ

 ローカル　→　[fumidai]踏み台（ssh入り口)　→　[webserver]Webサーバー　→　[mydatabase]DB

 ※DBには、Webサーバーからしか接続できない

仮にこうします）
 ※ DBのホスト名（IP)= AAA.BBB.CCC.DDD
 ※ DB接続ユーザー名= root
 ※ DB接続パスワード= prootpassword

## セットアップ

ssh経由でのリモートサーバーの接続する際に利用される設定ファイルを使います。

[.ssh/config]には、以下のように多段の設定を行います。

```
Host fumidai
  HostName xxx.xxx.xxx.xxx # 踏み台のアドレス
  User qiita_tarou # 踏み台にログイン許可されたユーザー(sshのキーは登録されている前提）

Host webserver
  HostName xxx.xxx.xxx.xxx # Webサーバーのアドレス
  User centos # Webサーバーにログイン許可されたユーザー（今回は、centosユーザーとする）
  IdentitiesOnly yes
  IdentityFile ~/.ssh/webserver.pem # pemキー
  ProxyCommand ssh -W %h:%p fumidai
```

この状態で、sshで、webserverにログインできることを確認

```
$ ssh webserver
[centos@webserver ~]$ 
```

## ローカルから実行するコマンド

```
ssh {.ssh/configに設定している接続先名} 'mysqldump --single-transaction -h {DBのホスト名 or IPアドレス} -u{DBユーザー名} -p{DBパスワード} {データベース名} | gzip' | cat > ./backup.sql.gz
```

なので、今回の例だと以下の様になる

```
ssh webserver 'mysqldump --single-transaction -h AAA.BBB.CCC.DDD -uroot -prootpassword mydatabase | gzip' | cat > ./mydatabase.sql.gz
```
楽しい因数分解

こんにちは。
今回は楽しい因数分解です。

#初めに
某Nチャンネルにお題スレというモノがありそれの問題を解いたものです。
環境はVCです。

用途は知りません。何に使うんですかね？？

#解説
ループを回してiを増やしていきます。そのiで入力であるNを試し割して余りが無かったらNを割ります。それをするのは試し割がうまくいったらiは数字を構成するための因数なのでひたすら因数の役割で割り続けます。
試し割が成功しなかったら割り算はやめてiを増やしていきます。
Nを割るとループもショートして短くなっていきます。
割るたびに上限が下りてきます。そうすることで高速化に寄与します。
意図はしてないですが、割と素因数分解のような動きになりそうです。
組み合わせた因数が欲しければ、素因数を保存して任意に合成してください。

#コード

```cpp:main.cpp
#include <iostream>
#include <cstdint>

int main() {
	std::uintmax_t N = 24;
		for (std::uintmax_t i = 2; i <= N; i++) {
			while (N % i == 0 && N != 0) {
				N /= i;
				std::cout <<i<< ":どんだけー。" << std::endl;
			}
		}
	return 0;
}

```
#おまけ
この世に不確定でも合成数を判定しない不確定な素数判定法があったとしたら、それで非常に最適化されます。
最後に巨数の素数が残りがちなのでそれを落とすことができたら大体の場合、瞬時に決まります。


#終わりに
楽しんでいただけましたでしょうか。
解説がつたないのは慣れてないからです。
ありがとうございました。

#追記
素因数分解ではない因数分解を書いたので一応載せておきます。

```cpp:main.cpp
#include <iostream>
#include <cstdint>
#include <vector>
#include <algorithm>

typedef std::vector<std::uintmax_t> DType;

DType Facterlizer(std::uintmax_t N) {
	DType D;
	std::uintmax_t L = (N / 2) + 1;
	for (std::uintmax_t i = 2; i <= L; i++) {
		if (N % i == 0) {
			D.push_back(i);
			D.push_back(N / i);
		}
		if (D.size() == 0 && i == L) {
			L = N;
		}
	}

	std::sort(D.begin(), D.end());
	D.erase(std::unique(D.begin(), D.end()), D.end());
	return D;
}

int main() {

	std::uintmax_t V = 2 * 3 * 5 * 7 * 11;
	auto D = Facterlizer(V);

	std::cout << V << ':';
	for (auto& o : D) {
		std::cout << o << ',';
	}
	std::cout << std::endl;

	return 0;
}

```
#追記II
どこかで見たような素因数分解です。
一説によると意思決定に使う向きがあるらしいので、書いておきます。
どこかのおうちの秘伝のタレだそうです。

```cpp:code.cpp
#include <iostream>
#include <vector>
#include <cstdint>

template<class F>
bool SayYes(std::uint64_t N, F Fn) {
//	std::uint64_t X=0xdeadbeef;//debug constant.
	std::uint64_t X;

	X %= (N + 1);

	std::vector<std::uint64_t> V;

	for (std::uint64_t i = 2; i <=X; i++) {
		if ((X % i) == 0) {
			V.push_back(i);
			X /= i;
			i--;
			
		}
	}

	if (V.size()==0) { V.push_back(X); }

	return Fn(V);
}

int main() {

	bool F = SayYes(10000, [](auto& A) {return true; });


	return 0;
}

```
export defaultとimport

基本的に共通の判定用関数、固定値などは固有ファイルではなく共通化していきたいので
export、importを活用中。切り出しているうちにexportの仕様を調べたのでメモ。

# JS
```js:切り出した設定・ロジック
const HAT = 'M'
const HIGE = 1
const isM = (hat) => hat === HAT
const isHige = (player) => player === HIGE
```

# まとめてimportしたい場合

## import側
```js
import 'game' from '/path/to/game'
// game { HAT: 'M', HIGE: 1, isM: function(), isHige: function() }
```

## export側
export defaultを設定する（デフォルトエクスポート）

```js
const HAT = 'M'
const HIGE = 1
const isM = (hat) => hat === HAT
const isHige = (player) => player === HIGE

export default {
  HAT,
  HIGE,
  isM,
  isHige
}
```

# メソッド等を個別にimportしたい場合
## import側

```js
import { HAT, isHige } from '/path/to/game'
// HAT = 'M'
// isHige = function()
```

## export側
defaultをつけずにexport設定を書く（名前付きexport）

```js
const HAT = 'M'
const HIGE = 1
const isM = (hat) => hat === HAT
const isHige = (player) => player === HIGE

export {
  HAT,
  HIGE,
  isM,
  isHige
}
```

# 個別・まとめてどちらも使いたい
## import側

```js
import game from '/path/to/game'
```

```js
import { HAT, isHige } from '/path/to/game'
```

## export側
デフォルトエクスポートも名前付きエクスポートもどちらも書く

```js
const HAT = 'M'
const HIGE = 1
const isM = (hat) => hat === HAT
const isHige = (player) => player === HIGE

export {
  HAT,
  HIGE,
  isM,
  isHige
}

export default {
  HAT,
  HIGE,
  isM,
  isHige
}

```

# まとめ
- 名前付きエクスポートとデフォルトエクスポートでimport時の挙動が異なる。
- デフォルトエクスポートだけ書いていると名前指定のimportはできない。
- デフォルトも名前付きも両方使いたい場合、 export部分に具体的なロジックを書くと2回記述が必要なので、ロジックは別途定義しておいて変数だけ指定する形が良さそう。

# 参考
- [export - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/export)
redis で 既読/未読 フラグを全員に通知する

ユーザーが 10,000人。

ユーザーAが質問を登録したら、
10,000人に "未読あり" フラグを送る。

各ユーザーごとに 未読/既読 とする。


# 新規投稿した時に全員に未読を通知

既読ユーザーを全員削除して、全員未読ということに。

```

Redis::del('questionFlag');

```


# セットされてりゃ既読(ユーザーID 1000 は未読or既読？)

```

Redis::sIsMember('questionFlag',1000);

```

これが 1 なら 既読。
0 なら 未読。

# 既読にする(ユーザーID 1000 が既読した)

```

Redis::sAdd('questionFlag','1000');

```

こんな感じの流れですね。
Bootstrapのmodalとmmenuを一緒に使うときの注意

BootstrapのModalとmmenuを使った実装をした際にIE１１で見るとModalの要素が前面に表示されないという問題が起きた。

結論から先に書くとmmenu側で使用しているunsetがIEで対応していなかったのが原因。

```css
    z-index: unset;
```

そのため以下のようにautoの値をセットした。

```css
.mm-slideout {
    z-index: auto;
}
```

地味にハマってしまった・・・
IEさんは早く引退して欲しい。
LT（ライトニングトーク）やってみた

先日人生初のLTしてきたので、流れをまとめました。
日記のようなとりとめのないものになりそうですが、お許しください。

#やるまでの流れ
- 前年から社外の勉強会に参加するようになって、LTを知った
- 発表は学生時代から得意ではなかったが、キャリアアップする上でアウトプットは必須だと思ってた
- Qiitaで記事を書くのもアウトプットだけど、もっと身近で一字一句こだわらなくていいアウトプットができるならいいなと思った
- 単純におもしろそうだと思った
- 社内以外のコミュニティに入りたくなった

でもでも恥ずかしいしネタがないし、ともじもじしてる間に時は経ち、自分とは別に勉強会に参加した社員がLTをやる約束をしたと聞いて[笹食ってる場合じゃねえパンダ](https://www.google.com/search?q=%E7%AC%B9%E9%A3%9F%E3%81%A3%E3%81%A6%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%98%E3%82%83%E3%81%AD%E3%81%88&tbm=isch&source=iu&ictx=1&fir=eelea71fPUumlM%253A%252CGzbhMbfsp6_rRM%252C_&vet=1&usg=AI4_-kTO6nKbneGpPv6MVZcCYWiQb5C77g&sa=X&ved=2ahUKEwjc7KakjqPnAhUbyosBHX2lCCMQ9QEwBHoECAkQDA#imgrc=_&vet=1)よろしく自分もLT枠で申し込みをしてました。


#準備
Qiitaを読みました。
改めて書くのもいいけど、参考にしたのはこちらです。
[ライトニングトーク準備の参考資料まとめ](https://qiita.com/moomooya/items/45398e06f189d4a26227)
[はじめてのLT（ライトニングトーク）で気をつけた21のこと（申込、準備、資料作成、練習、発表までのまとめ）](https://qiita.com/yokoyan/items/670a9eea7117c8fc3283)
[はじめてのLＴ(ライトニングトーク)の進め方](https://qiita.com/naosumi_tech/items/f2a96b9fdad7150a2bed)

話すネタはもじもじしている間にいくつかできてたんですが、ビビリなもので「ウケなかったらどうしよう」とか、「やってること古いって思われたら恥ずかしい」とか、すごい人目を気にしたんですけど**事実なんでしょうがない**ですよね
~~でも今回はメイン領域から外した内容にしました。~~

文章ばかりのスライドにならないように写真とか図とかで退屈にならないようにしたかったんですが、
全然そんな余裕なかったです。

発表練習はその社員と行いました。
見知った相手でも緊張しました。

#発表
[新潟デルタ vol.5 - type: discussion!](https://ddd-ng.connpass.com/event/159489/)　にて発表しました。
スライド資料は[speakerdeck](https://speakerdeck.com/rmrmnrm/cai-yong-xian-chang-nimaketeinguzhan-lue-woqu-riru-retahua)　にアップしました。

パワポに話す内容はすべてカンペ用意していたんですが、あがってしまいあまり読めず、練習と違うことばっかり喋ってました。へへへ・・・
あと人見知りも発動してました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ひとみしりはつどう～</p>&mdash; あしも (@rmrmnrm_hsm) <a href="https://twitter.com/rmrmnrm_hsm/status/1220920974989647873?ref_src=twsrc%5Etfw">January 25, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<script async class="speakerdeck-embed" data-id="7e80c00cdc6849f9a52e1675379a9434" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>
でも本番直前にぶっこんだ自宅の水漏れの話がウケたのでよかったです。
いいんです。内容なんて。

#その後
終わればあっという間で、私の話の出来栄えを気にするのは私だけで、みなさん心優しく受け入れてくださいました。
味をしめたのでまたやりたいなと思います。
今度はちゃんと自分のメイン領域の話ができたらな。

LTのネタのために仕事をすることもあるかもしれない。
**LTは麻薬**（かも）
Python2でTemporaryDirectoryを使いたい

# Python2でTemporaryDirectoryを使いたい

Python3で一時ディレクトリーを作成する場合、 [tempfile.TemporaryDirectory()](https://docs.python.jp/3/library/tempfile.html#tempfile.TemporaryDirectory) を使えば簡単です。使い方は以下のページがわかりやすいです。

[Pythonで一時ディレクトリを作って安全に後始末する](https://qiita.com/everylittle/items/aa7c6f612ff0a9db7f01)

こちらのページにも書かれていますが、Python2では `tempfile.TemporaryDirectory()` が使えませんので、代わりの方法を調査しました。



# backports.tempfileを使えばよかった

調査をしていると、以下の記事を見つけました。

[stack overflow / tempfile.TemporaryDirectory context manager in Python 2.7](https://stackoverflow.com/questions/19296146/tempfile-temporarydirectory-context-manager-in-python-2-7)

[backports.tempfile](https://pypi.org/project/backports.tempfile/) というライブラリを使えば、 `tempfile.TemporaryDirectory()` がそのまんま書けそうです。

まず、ライブラリをインストールします。

```bash
# pipの場合
pip install backports.tempfile

# pipenvの場合
pipenv install backports.tempfile

# poetryの場合
poetry add backports.tempfile
```

以下のように使います。

```python
import os
from backports import tempfile

# 一時ディレクトリー作成
with tempfile.TemporaryDirectory() as temp_dir:
    print(os.path.exists(temp_dir))
```

無事に一時ディレクトリーが作成できました！




# さいごに

本記事作成にあたり、以下のページを参考にしました。ありがとうございました。

- [PyPI / backports.tempfile](https://pypi.org/project/backports.tempfile/) 
- [Pythonで一時ディレクトリを作って安全に後始末する](https://qiita.com/everylittle/items/aa7c6f612ff0a9db7f01)
- [stack overflos / tempfile.TemporaryDirectory context manager in Python 2.7](https://stackoverflow.com/questions/19296146/tempfile-temporarydirectory-context-manager-in-python-2-7)
インターフェイスなど

##【抽象クラス】
→```abstract```を修飾子に持つクラス
→new演算子でオブジェクトを生成できない
→必ず処理内容が定義されていない抽象メソッドを持つ（演算子abstractをもつメソッド）

#####(抽象クラスの利用)
→サブクラスに拡張して利用
→必ず抽象メソッドをサブクラスで定義してオーバーライドする

```
//抽象クラス
abstract class Car{
abstract void show(); //抽象メソッド
}

//抽象クラスを引き継ぐサブクラス
public SuperCar extends Car{
System.out.println("スーパーカーを作成しました");
//抽象メソッドをオーバーライド
}

//この流れで抽象クラスを継承したサブクラスが使える
//抽象クラスは、抽象メソッドを必ず書くこと以外普通のスーパークラスとして処理を記述できる
```

→同名の抽象メソッドを必ず持っていることから抽象クラスを使えばそのサブクラスをまとめて簡単に扱うことができる

#####(instancsof演算子)
→抽象クラスではたくさんのサブクラスを扱う場合があるため、instanceof演算子を使うことでオブジェクトのクラスを調べられて便利

```
//抽象クラス
abstract class Car{
abstract void show(); //抽象メソッド
}

//抽象クラスを引き継ぐサブクラス
public SuperCar extends Car{
System.out.println("スーパーカーを作成しました");
}

//単独のクラス
class Home{
public Home(){
System.out.println("新しい家が建ちました");
}
}

class Main{
public static void main(String[] args){
SuperCar spcar = new SuperCar();
Home home = new Home();

if(spcar instanceof SuperCar){
System.out.println("SuperCarクラスです");
}
else{
System.out.println("SuperCarクラスじゃないです");
}//出力結果:「Carクラスです」

if(Home instanceof Car){
System.out.println("Carクラスです");
}
else{
System.out.println("Carクラスじゃないです");
}//出力結果「Carクラスじゃないです」
}
}
```

##【インターフェイス】
→```interface```を修飾子にもつクラス
→インターフェイスのフィールドは自動的に```public static final```をもつ
→インターフェイスのメソッドは自動的に```abstract```をもつ
→原則としてメンバの内容を変更できない
→newを使ってオブジェクトを作成できない
※ただしインターフェイス型の変数は定義できるが、オブジェクトは生成できない

#####(インターフェイスの実装)
→インターフェイスはクラスと組み合わせて使う

```
class クラス名 implements インターフェイス{}
//インターフェイスのメンバを受け継ぐ
```

→インターフェイスを引き継いだクラスを利用するには、インターフェイスのメソッドをすべて定義する必要がある
→抽象クラスと同様に、サブクラスをまとめて扱うことができる
※原則として、メンバの内容は変更できないので抽象クラスとの違いに気を付ける

##【クラスの階層】
#####(多重継承)
→Javaでは```class クラス名　extends A,B```のような多重継承はできない
→しかしインターフェイスなら二つ以上実装することが可能

```class クラス名 implements A,B```

#####(インターフェイスの拡張)
→インターフェイスも```extends```を使うことで拡張可能

```
interface サブインターフェイス名 extends スーパーインターフェイス名{}
```

※なおサブインターフェイスを実装するときは```extends```を使うので注意　
※抽象クラスやインターフェイスは拡張する必要の多い大規模なプログラムで使われる
IntelliJ IDEA のAndroid プロジェクトの設定でハマったので備忘録

## 環境
Mac OSX 10.14.6 Mojave
IntelliJ IDEA ULTIMATE 201903
マルチモジュールでのプロジェクト

### 問題１ Network ErrorでActivateされない
IntelliJをUpdateしようが、Activateさせようがいきなりネットワークエラーでつながらなくなる現象が起きた

### 対応
Macを再起動する
私はなぜか2回再起動することでこの現象を解決することができました。
なので一発で解決できるかは不明です。

### 問題２ `ClassNotFoundException: JAXBException` でcompileエラー

java9以降をsdkとして設定しているとJava9からJAXBExceptionが消えているので
compileエラーが発生する.

### 対応

1.ProjectTabに切り替え → Project rootを右クリック → Open Module Setting → Project Structure → dependenciesタブに切り替え → Module SDKをJava9未満に合わせる project SDK でも x.xでもいい。
それらをmoduleすべてあわせる。

※Javaの設定は下記を参照する
[homebrew-caskでJava8をインストールする - Qiita](https://qiita.com/d_forest/items/290bb05bb929e5d74647)

上記だけでうまく行かない場合は下記を試すとうまくいった

1. Preferences → Invalidate Caches & Build Runでキャッシュを消す
2. `.gradle`フォルダ, 各モジュールの `build` フォルダを削除する
3. `/Users/xxxxx/.gradle/caches`を消す 

だれかのお役に立てれば幸いです。
Chromeのユーザエージェント固定された時のUA文字列

Blinkの開発者用メーリングリストで「[Intent to Deprecate and Freeze: The User-Agent string](https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/-2JIRNMWJ7s/yHe4tQNLCgAJ)」とアナウンスされた通り、Chromeでユーザエージェントを固定する計画が発表されました。

具体的にどのような文字列になるか確認する

## 開発版で試す
開発版であるChrome Canaryでは `chrome://flags` より設定することで、これを有効にできます
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32425/386d7745-c109-1542-f2d3-0914cfef23e8.png" width="600">

有効とする以下のようなユーザエージェントがつくようになります。
User Agent Client Hints([参考URL](https://asnokaze.hatenablog.com/entry/2018/11/30/064817))ではChrome 81になっています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32425/fb16f4fa-75ce-c1ae-6361-02ae8719ace4.png" width="600">


## 文字列定義
#### PC 
`Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3764.0 Safari/537.36`
#### Android
 `Mozilla/5.0 (Linux; Android 9; Unspecified Device) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3764.0 Safari/537.36`
#### mobile
 `Mozilla/5.0 (Linux; Android 9; Unspecified Device) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3764.0 Mobile Safari/537.36`

定義はここから確認できます
https://cs.chromium.org/chromium/src/content/public/common/user_agent.h?q=frozen_user_agent_strings&dr=CSs&l=17
【R】rstudio-serverのインストール

##Rstudio-serverのインストール

```
[root@localhost ~]# wget https://download2.rstudio.org/server/centos6/x86_64/rstudio-server-rhel-1.2.5033-x86_64.rpm
[root@localhost ~]# sudo yum install rstudio-server-rhel-1.2.5033-x86_64.rpm
[root@localhost ~]# systemctl start rstudio-server
[root@localhost ~]# systemctl enable rstudio-server
```
公式サイト見た方がいいかもです→https://rstudio.com/products/shiny/download-server/redhat-centos/

```
[root@localhost ~]# firewall-cmd --add-port=8787/tcp --permanent
[root@localhost ~]# firewall-cmd --reload
[root@localhost ~]# ip a
```
ip:8787　へアクセス
![Image_00111.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193056/9a15a3b9-9a5a-119a-e9ca-bbb5523d0216.jpeg)

おお・・・まずは通過点
この時点で、Rstudioをweb上で使えるようになります。

ちなみにrootでログインできないみたいなので、他のユーザーがない場合は作成する必要があります。

```
[root@localhost etc]# useradd hoge
[root@localhost etc]# passwd hoge
ユーザー hoge のパスワードを変更。
新しいパスワード:ここでパスワードを入力。ご随意に。
よくないパスワード: このパスワードは 8 未満の文字列です。
新しいパスワードを再入力してください:ここでパスワードを入力。ご随意に。
passwd: すべての認証トークンが正しく更新できました。
[root@localhost etc]#
```

ここで作成したユーザーとパスワードを、rstudioの画面で入力するとログインできます！
vpsにインストールすれば、R言語をスマホで触ることが出来るのと、ターミナルも操作できるので色々なものがsshで出来るようになります！

ipはデフォルトの8787ではなく、変えて利用しましょう(￣▽￣)ﾉ
【R】Shiny-Serverのインストール

##ことの顛末##
Shinyを使うシーンとして、RStudioで使うことが多いようですが、自分としてはwebサーバ上で使いたいのです。
phpをメインで利用しているので、phpで作られたシステムから収集されるDB情報を元に統計などをグラフ化するために挑戦しています。
いきなり会社のサーバに入れる勇気は絶対ないので、まずはVirtualBoxや自前のvpsで使えるようになってからです。

※この記事は、先日出来ない出来ないと嘆いてた時の記事を削除して、書き直したものです。

##環境
・さくらvps
・CentOS7.7
・R3.6

##Rのインストール##
https://qiita.com/qyuser/items/88a00298ca6aad2423db



##shiny-serverのインストール
```
[root@localhost ~]# yum -y install readline-devel 
[root@localhost ~]# yum -y install libXt-devel 
[root@localhost ~]# yum -y install Xvfb
#上三つはいらないかも知れない
[root@localhost ~]# yum -y install libcurl-devel
```


```
[root@localhost ~]# sudo su - -c "R -e \"install.packages(c('shiny', 'rmarkdown'), repos='http://cran.rstudio.com/')\""
```

```
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core) #当方の環境
[root@localhost ~]# wget https://download3.rstudio.org/centos6.3/x86_64/shiny-server-1.5.12.933-x86_64.rpm
[root@localhost ~]# yum -y install --nogpgcheck shiny-server-1.5.12.933-x86_64.rpm
[root@localhost ~]# systemctl start shiny-server
[root@localhost ~]# systemctl enable shiny-server
```

Shinyの設定ファイル（後でこれを復元します）

```
[root@localhost ~]# cat /etc/shiny-server/shiny-server.conf
# Instruct Shiny Server to run applications as the user "shiny"
run_as shiny;

# Define a server that listens on port 3838
server {
  listen 3838;

  # Define a location at the base URL
  location / {

    # Host the directory of Shiny Apps stored in this directory
    site_dir /srv/shiny-server;

    # Log all Shiny output to files in this directory
    log_dir /var/log/shiny-server;

    # When a user visits the base URL rather than a particular application,
    # an index of the applications available in this directory will be shown.
    directory_index on;
  }
}

```

```
[root@localhost ~]# firewall-cmd --add-port=3838/tcp --permanent
[root@localhost ~]# firewall-cmd --reload
[root@localhost ~]# systemctl restart shiny-server
```

```
[root@localhost shiny-server]# /opt/shiny-server/bin/deploy-example user-dirs
Configuration file already exists at /etc/shiny-server/shiny-server.conf. Are you sure you want to overwrite it? [yN]y
Copied /opt/shiny-server/config/user-dirs.config to /etc/shiny-server/shiny-server.conf.
Installing sample apps...
/srv/shiny-server/index.html already exists. Not overwriting.
/srv/shiny-server/sample-apps already exists. Not overwriting.
Done installing samples.
Restarting Shiny Server...
Waiting...

The user-dirs config is all setup now. Enjoy!
```

上記を実行するとconfファイルが初期化されて動かない状態になる。
もう少し上に書いたconfファイルではなくなるので、元に戻す。
まだ試してないけどuser-dirsの部分で引数をもっと入れれば最初から動かせるようになるのかも知れない。



ip:3838へブラウザでアクセス

![00000200632.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193056/143678f4-0675-cb5a-d2c5-645092103e4a.jpeg)
画像は127.0.0.1になっていますが、VirtualBoxで試した時の画像なので勘弁してください(;´Д｀)
ポート番号3838はデフォルトのものではなく、変えて利用しましょう。

##戯言
phpを混ぜられたらいいなぁ・・・ダメですよねきっと(´・ω・`)
本当はゲットパラメーターで値を引き渡したいのですが、無理だと思うので考えます。。
元システムからのリンクを全部別個のhtmlファイルで作成して、そのアドレスによってアプリが変わるとか？
phpで遷移する時特定のページへ遷移させて、そこで取得したPOSTの値をjsonファイルに書き込んでからRのURLに遷移させて、そのjsonファイルを読み込んでRで処理するとか？
jsonじゃなくてもいいか。user_app.Rみたいなファイルにrプログラムを自動で生成するphpのスクリプトを書いて、それをR側でrequireみたいなことすれば出来そうか。
呼び出し元関数名取得方法

以下はどちらもbと出力される。
inspectがいかなるものかよく調べていないが、
とりあえず動いたことだけは確認できたのでメモを残しておく。

```python
import inspect

def a():
    print(inspect.getouterframes(inspect.currentframe(), 2)[1][3])

def b():
    a()

b()
```

```python
import inspect

class c(object):
    def a(self):
        print(inspect.getouterframes(inspect.currentframe(), 2)[1][3])

    def b(self):
        self.a()

d = c()
d.b()
```
PyPIにパッケージを公開するときに　「HTTPError: 400 Client Error: File already exists.」と表示される


# はじめに

[こちらの記事](https://qiita.com/icoxfog417/items/edba14600323df6bf5e0)を参考に自作パッケージをPyPIに投稿しました．

- [ACOCrawler](https://pypi.org/project/ACOCrawler/)

このとき，更新したパッケージを投稿しようとしたところ

```bash 
twine upload dist/*
HTTPError: 400 Client Error: File already exists. See https://pypi.org/help/#file-name-reuse for url: https://upload.pypi.org/legacy
```

というメッセージが出力され，アップロードできませんでした．

# 対応策

```bash
twine upload dist/*
```

というコマンドはtwineのupload機能を利用して
dist以下のすべてのwhlファイルを投稿しようと試みます．

`ACOCrawler-0.2.0-py3-none-any.whz`のようにまだ投稿していないものに関してはエラーが出ないのですが
すでに投稿していた`ACOCrawler-0.1.0-py3-none-any.whl`などをもう一回投稿しようとしてしまいます．

そこで，

```bash
twine upload --skip-existing dist/*
```

上記のオプションをつけると，すでにPyPI上にあるものは投稿しないためエラーが起きません．
自動デプロイ（手抜き編）

# やりたいこと
git pullでデプロイしている時に、gitへのプッシュをトリガーに自動でpullさせる

# 前提
* ```git pull```はSSHユーザで実行する（以下、SSHユーザを```my-ssh-user```とする）
* CloneはSSHのプロトコルで行う  
	例) ```git clone git@github.com:user/repo.git```
* Nginx ＆ PHP 環境
* gitにwebhookの機能がある

# 手順
## 1. sudo で nginxユーザにmy-ssh-userユーザでgitコマンドを実行する事を許可する

```diff
# visudo
+ nginx ALL=(my-ssh-user) NOPASSWD:/usr/bin/git
```

## 2. webhook.php をドキュメントルート直下に配置
```
<?php

$command = 'cd /documentroot & sudo -u my-ssh-user git pull';

$result = exec($command);

print($result);
```


## 3. URLでwebhook.phpを実行して動作確認

例） https://my-domain.example.jp/webhook.php

正常に動作し、最新のソースであれば下記がレスポンスされる

```
Already up to date.
```

## 4. gitのwebhookに3のURLを設定


以上！