OmniAICreator/Qiita-1.07M huggingface dataset:
Ruby on Rails チュートリアル 第14章 フォローフォームでのAjaxの採用

#Ajaxの使用法と効果
　ここではRailsチュートリアル14章におけるフォローフォーム作成の際にAjaxを導入する方法及びその効果について説明する。
　まず、Ajaxの導入方法については、フォーム側の更新作業としては

```ruby:app/views/users/_follow.html.erb
<%= form_for(current_user.active_relationships.build, remote: true) do |f| %>
  <div><%= hidden_field_tag :followed_id, @user.id %></div>
  <%= f.submit "Follow", class: "btn btn-primary" %>
<% end %>
```
上記のコードのように、form_forメソッドの引数にremote: trueのハッシュを与えるだけでよい。こうすることでRailsは自動的にAjaxを使うようになる。（＊なお、上記の_follow.html.erbファイルはフォロー用のパーシャルであり、form_forを使ってRelationshipモデルオブジェクトを操作し、PostリクエストでRelationshipコントローラに、現在表示しているプロフィールのユーザーのuser.idをfollowed_idとして送信する）
　つぎにAjaxのリクエストを受け取るコントローラー側に変更を加えていく。

```ruby:app/controllers/relationships_controller.rb
class RelationshipsController < ApplicationController
  before_action :logged_in_user

  def create
    @user = User.find(params[:followed_id])
    current_user.follow(@user)
    respond_to do |format|
      format.html { redirect_to @user }
      format.js
    end
  end
・
・
・
end
```
そして、、、、

 　また、Ajaxを使用することで、webページ上でユーザーをfollowないしunfollowした際に、ページを移動することなくフォローに関するリクエストをサーバーに送信することができる。
Wordpressに大量の画像をアップロードする

wordpressに大量の画像（1万枚以上）をアップロードする必要があり、『Media UP FTP』を使ってやろうとしたが、余りにも多すぎたせいかエラーが出た。そもそも読み込みに時間がかかりすぎて、まともにアップロードが出来なかった。
そこで、pythonでブラウザを操作して、RPA的にWordpressに画像をアップロードすることにした。
なお、WordpressのテーマにはAffinger5を利用している。他のテーマを使ったことがないので、他の環境で動く中は不明。
使用するブラウザはChromeです。


```python

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
from selenium.webdriver.common.keys import Keys
import glob
import os

#ブラウザ操作をいったん止めるための関数
def sleep(sleep_time):
    time.sleep(sleep_time)

#Wordpressにログインする。
driver = webdriver.Chrome()
wordpress_url = "自分のWordperssのURL"
driver.get(wordpress_url)
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "wp-submit")))
# ID/PASSを入力
sleep(0.1)
ID = driver.find_element_by_id("user_login")
ID.send_keys("ログインするID")
sleep(0.1)
password = driver.find_element_by_id("user_pass")
password.send_keys("ログインするパスワード")
sleep(0.1)
# ログインボタンをクリック
login_button = driver.find_element_by_name("wp-submit")
login_button.click()
sleep(0.1)

#投稿画面に移行
driver.get("投稿画面のURL")
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "footer-upgrade")))
sleep(0.1)

#メディアのアップロードに移動
driver.get("URL")

#画像を保存しているフォルダを指定
#今回はJPGのみを指定
imgs = glob.glob(r"C:\img\*.jpg")

#画像をアップロードするコード
#画像をアップロードする前に、自分で同じ手順で画像をアップロードしないといけない
#エクスプローラーを直接操作するので、『ファイルを選択』のボタンを押したら、アップロードしたいフォルダが開いていないといけない。
for img in imgs:
    
    media = driver.find_element_by_id("plupload-browse-button")
    sleep(0.1)
    media.click()
    sleep(0.3)

    #画像の名前は元画像と同じ
    img_name = os.path.basename(img)

    #画像名のコピペ
    pyperclip.copy(img_name)
    pgui.hotkey('ctrl', 'v')
    sleep(0.3)

    #ENTERを押すことで、画像の選択とエクスプローラーを閉じる。
    pgui.typewrite(['enter'])
    sleep(0.1)    
```
自分の動きをパソコンに代行させているだけなので、コードを実行中はパソコンの使用は不可能になります。
また、webdriverを使うためにChromeDriverが必要になりますので、自分の使っているChromeのバージョンに対応したものをダウンロードしてください。
恐らく環境変数の設定も必要かと思います。
そのあたりは他の人が詳しく解説していると思うので探してください。
Dataloader47.0バッチの作成手順について

# はじめに
日々、Salesforceを開発または運用する中で、環境の情報を不定期に複数の環境で複数のオブジェクト対して、同じ問い合わせを実行したい場合があると思います。
そういった場合、ETLツールなどのツールが利用できない場合、候補に上がるのが公式に提供される無料ツール、DataLoaderバッチです。
ただし、利用するには暗号化やプロセス定義などCLIで実行しなければいけない手順があり、時々実行するには少々敷居が高いです。私も何回か作っていますが、バージョンによってオプションが違うので苦手意識がありました。
備忘録として、手順を説明したいと考えています。

# 事前準備
### 環境変数JAVA_HOMEの設定
Dataloaderは去年ごろか、OpenSDKの利用が必須になりました。
また、暗号化バッチ(encrypt.bat)は、内部で、JAVA_HOMEで参照しているので環境変数の設定が必要です。
設定は、[スタート] > [コントロールパネル] > [環境変数]ボタンを押下して設定してください。

JAVA_HOME = C:¥zule（※後ほど正確な格納さきを記載します。）

### Dataloaserのバージョン
バージョン毎に暗号化バッチ(encrypt.bat）のオプションが違うので記載します。
作業を割り振る場合や自分でやる場合にもオプション部分が一番苦労します。
DataLoaderバージョン：47.0

# 作成手順
実行までの作業手順を記載します。

### 暗号化鍵の生成
パスワード暗号化する際に利用する暗号化鍵を生成します。
パスワードを複合化する際にも利用するので、binフォルダにまずは作成します。

[公式ドキュメント：コマンドラインからの暗号化](https://developer.salesforce.com/docs/atlas.ja-jp.dataLoader.meta/dataLoader/loader_encryption.htm)


```
encrypt -k dataloader.key #(鍵ファイル)
```

### パスワードの暗号化
Salesforceにログインするパスワードを、生成した暗号化鍵で暗号化します。
実行すると暗号化された結果が画面に表示されますのでメモ帳などで書き留めます。
後ほど、プロセス設定ファイル（process-config.xml）に各プロセス毎に設定します。

```
encrypt.bat -e {sf.password} dataloader.key
```

### プロセス定義
dataloaderのホームディレクトリには、バッチ用のサンプルプログラム(samlple)が格納されています。
定義(conf)のプロセス定義ファイル(process-config.xml)に登録、更新、削除、照会のプロセスが記述されていますので、ログインエンドポイント、sf.userIdとsf.passwordを変更することで動作を確認することができます。
[公式ドキュメント：設定パラメータ](https://developer.salesforce.com/docs/atlas.ja-jp.dataLoader.meta/dataLoader/loader_params.htm)


### プロセス実行
デフォルトは、”../conf”に設定されています。dataフォルダで実行する場合は、confの設定を省略することも可能です。

[公式ドキュメント：バッチモードでの実行：Salesforce開発者ドキュメント](https://developer.salesforce.com/docs/atlas.ja-jp.dataLoader.meta/dataLoader/loader_batchmode_intro.htm)


```
process ../conf accountMasterProcess
```
# 注意事項
多くの場合、実際に運用するのは多くのエンドユーザです。
初期段階からパスワード変更や、バージョン管理、端末の格納先を設計する必要があります。
配布してから、場当たり的に設計するのはやめましょう！

# 最後に
いかがだったでしょうか、Dataloderバッチは身近になったでしょうか？
日々の作業では、他の作業もあることから情報を取得する作業はあまり時間をかけられません。
しっかりとデータ見せ方を考えるために、データ取得にはあまり時間をかけたくないものですね。
自分の負荷を下げるためにはいろいろ工夫していきましょう。では！！
アプリ試作や個人制作を効率化するSwiftPMの運用

Xcode11で **「ねんがんのSwift Package Manager(SwiftPM)をてにいれたぞ！」** となったことで、iOS/iPadOS/macOSアプリ開発における外部パッケージの導入のハードルが大きく下がりました。

CocoaPodsやCarthageの場合、パッケージ導入にあたって必ず

* Podfile/Cartfileを用意し、依存パッケージを記述する
* ターミナルでパッケージのインポートコマンドを実行する

という手順をあらかじめ踏む必要があったため、初心者だけでなく、小さなアプリの立ち上げや試作においても煩雑に感じていたのではないかと思います。

> 少なくとも自分はそう思っていた！

また、プロトタイピングなどを行う際に、各々「秘伝のレシピ」から便利なユーティリティクラスやextensionを必要なだけコピーして使っていたりしていたのではないでしょうか？

> 少なくとも自分はそうだった！！

SwiftPMを上手に使うことで、これらの課題は大きく解決できます。
今回はその方法を紹介したいと思います。

## 非公開パッケージで運用を簡素化する

一度パッケージを公開すると、[Semantic Versioning](https://semver.org/lang/ja/)のルールに従ってバージョン管理を行っていかなければなりません。今回のような目的でこの運用を行うのは手間がかかるだけで、効率化の目的から外れてしまいます。

なのでまずは非公開パッケージから始め、自分と限られたユーザ間でのみ有効な運用方法で進めていきましょう。

## 「秘伝のレシピ」をSwiftPMに移行する

Swift Packageの作り方は [WWDC2019 Session 410](https://developer.apple.com/wwdc19/410) で詳しく解説されていますので割愛します。

> WWDC2019から、動画に日本語字幕がつくようになったので大変わかりやすい！

### 非公開パッケージのGit運用

`master` ブランチを伸ばし続けるのも暴力的なので、せめて `develop` ブランチくらいは分けて運用したほうが良いかと思います。

* `develop` ブランチにレシピを追加(commit/push)する
* このパッケージを参照するアプリの節目で `git tag` を打つ
  - 参照アプリ側Version Ruleを `develop` からタグ名に変更
  - ある程度整っているなら `master` にマージ

## アプリからパッケージを参照する

公開パッケージをインポートする場合は通常バージョンを指定しますが、今回の場合は `develop` ブランチを指定します。

<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25727/6a04d77b-a8fd-8da4-986f-465e25b43279.png">

### 進行した `develop` ブランチに相当するパッケージへの更新

メニューから

File > Swift Packages > Update to Lastest Package Versions

することで更新されます。

## Xcodeプロジェクト一式を納品する場合

顧客や依頼主に(Gitから切り離して)Xcodeプロジェクト一式を納品する場合、非公開パッケージを含めて渡す必要があります。

Xcodeに統合されたSwiftPMには "Overriding Dependencies" という仕組みがあり、ローカルにあるパッケージの参照を追加すると、リポジトリを参照しているパッケージの代用として参照するようになります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25727/2be20028-4901-8bf4-40b0-e5dd65cb38a0.png">

これを行うには、以下のようにします。

* パッケージをローカルにコピー
  - GitHubから `develop` ブランチ、または指定のタグのプロジェクト一式をダウンロード
  - アプリ側のプロジェクトフォルダ配下に追加
* ローカルのパッケージをXcodeプロジェクトに追加

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25727/8a58f882-d881-bbed-ef02-8225a92137cf.png">

## まとめ

SwiftPMがXcodeに統合されたことで、外部パッケージ導入ハードルが下がっただけでなく、自身が書いたライブラリやextensionの管理にも利用できるようになり、ソフトウェア資産が活用しやすくなりましたね！
プログラミング言語の人気・ランキングの鉄板な調べ方


プログラミング言語やそれに関わる情報（フレームワークなど）の「トレンド」を調査する際に鉄板なソースをまとめてみました。

#「エンジニアが支持している」トレンド
[GitHub - Star Ranking](https://github.com/search?q=stars:%3E1&s=stars&type=Repositories)
GitHubにアカウントを持っている人（エンジニア）がスターをつけた（支持した）リポジトリをインデックスしたもの。言語やフレームワークごとのランキング。

[StackOverflow Sirvey](https://insights.stackoverflow.com/survey/2019)
プログラミング技術などを中心に世界各地の開発者が集うナレッジコミュニティ「StackOverflow」。毎年１０万人のユーザーを対象にアンケートした調査結果。

[Octoverse GitHub](https://octoverse.github.com/)
過去12か月間に開かれたGitHubプルリクエストの数に基づいた集計結果。

#「検索エンジン」のトレンド
[TIOBE Software - TIOBE Index](https://www.tiobe.com/tiobe-index/)
複数の検索エンジンの検索結果を集計。言語がどれだけ検索されたかのインデックス。

[PYPL PopularitY of Programming Language](http://pypl.github.io/PYPL.html)
Google検索エンジンで「チュートリアル」が検索された回数のインデックス。各言語のチュートリアルの検索回数を人気度と位置づけてランキングしている。

#「求人」のトレンド
[Coding Dojo](https://www.codingdojo.com/blog/the-7-most-in-demand-programming-languages-of-2019)
Indeed.com（米国最大の求人情報収集会社）でのプログラミングの仕事の数でランク付けされた言語。

[TrendySkills](https://trendyskills.com/)
米国、英国、ドイツ、スウェーデン、スペイン、アイルランド、オランダ、オーストリア、チェコ共和国、ベルギー、フィンランド、インドなどの国を含む、「主要な求人広告Webサイト（Monster.comなど）」から需要のある言語のランキング。
Git操作まとめ

バージョン管理システムのGitについて、勉強しつつまとめていこうと思います。勉強しながらなので、少しずつですが記事を追加していきます。

プログラムを組む際に必要となるものは数多くありますが、Gitも欠かせないもののうちの一つだと考えています。
複数人数での開発ではもちろんのこと、ひとりで開発する際にも効果的に開発を進めていくために有効なツールです。

今回、Ubuntuのターミナル画面でのGit操作についてまとめていきますので、WindowsOSをお使いの方とは、多少差異があるかと思いますが、ご了承ください。

この記事では、Ubuntu18.04LTSにインストールしたGit(version 2.17.1)を使用しています。

## 個人でGitを使う
1. [Gitのインストールとセットアップ](https://qiita.com/tsweblabo/items/1d508489a904fc3f081e)
1. [Gitでのバージョン管理開始(git init)](https://qiita.com/tsweblabo/items/63221eb07b3d1b04e01d)
1. [Gitの基本コマンド(git add / git commit / git status)](https://qiita.com/tsweblabo/items/2a3cf554f98fd2576a21)
1. [Gitのコミット履歴確認(git log)](https://qiita.com/tsweblabo/items/732f04d53236f831ef81)
1. [Gitをターミナルで使う場合の設定](https://qiita.com/tsweblabo/items/918cbed88f00215c4800)
1. [コミット履歴に名前をつける(git tag)](https://qiita.com/tsweblabo/items/320508008b70bc75959c)
1. [ブランチ操作(git branch)](https://qiita.com/tsweblabo/items/1dd715c5481582847c38)
1. [編集差分を調べる(git diff)](https://qiita.com/tsweblabo/items/2000b9518cc9f7af4416)
1. [変更内容の取り消し(git reset)](https://qiita.com/tsweblabo/items/926f93ddc2b1129db327)
1. [Gitのバージョン管理が必要ないファイルやディレクトリを除外する(.gitignore)](https://qiita.com/tsweblabo/items/194affcbb573be018426)

---

## 複数人数でGitを使う
  1. [リモートリポジトリ](https://qiita.com/tsweblabo/items/d2ed2e0473dc74006192)
  1. [リモートリポジトリを使う(git pull / git push](https://qiita.com/tsweblabo/items/7e79125ad240e8349615)

---
### 参考書籍
- わかばちゃんと学ぶ Git使い方入門 湊川あい 著 / DQNEO 監修

### 参考サイト
- [Git公式サイト](https://git-scm.com/)
- [サルでもわかるGit入門 〜バージョン管理を使いこなそう〜](https://backlog.com/ja/git-tutorial/intro/01/)
- [Qiita Gitコマンド一覧](https://qiita.com/fukumone/items/73e1a9a62c5e4454263b)
- [Qiita:Gitをインストールしたら真っ先にやっておくべき初期設定](https://qiita.com/wnoguchi/items/f7358a227dfe2640cce3)
- [Qiita:git configについて](https://qiita.com/RyochanUedasan/items/5bf5223c0d9fef1adae5)
- [Qiita:【Git】tag関連コマンド](https://qiita.com/chihiro/items/cba40015b1aa2c73b78a)
- [Qiita:git branch関連コマンド](https://qiita.com/starlabo/items/3a0b65e06394aa94dd05)
- [Qiita:プロンプトをカスタマイズしてgitブランチを表示する](https://qiita.com/caad1229/items/6d71d84933c8a87af0c4)
- [Qiita:忘れやすい人のための git diff チートシート](https://qiita.com/shibukk/items/8c9362a5bd399b9c56be)
- [Qiita:[git reset (--hard/--soft)]ワーキングツリー、インデックス、HEADを使いこなす方法](https://qiita.com/shuntaro_tamura/items/db1aef9cf9d78db50ffe)
- [Qiita:git-resetは結局何を戻すのか](https://qiita.com/fnobi/items/ec036c1b5d7ee5a8517c)
OutSystemsのFileUploadで、ファイル名をクライアント側で扱う

FileUpload Widgetで、「ユーザーが指定したファイル名をクライアント側(ブラウザ内)で扱う方法」を複数回聞かれたのでメモしておきます。

FileUpload自体の一般的な使い方：[OutSystemsでファイルをアップロードする](https://qiita.com/jyunji_watanabe/items/e32d4267bc01edd71fc9)

# サンプル
Forgeコンポーネント：https://www.outsystems.com/forge/Component_Overview.aspx?ProjectId=7064
FileUploadFileNameHandler Screenを参照してください。

# 環境
Personal Environment(Version 11.0.606.0)
Service Studio(Version 11.6.6)

Traditional Web。

# まずは標準的な方法を検討してみる
部品(Widget)自体の機能を使えると、信頼性や保守性の観点でうれしいので、まずは部品にその機能が備わっていないかチェック。

しかし、画面に配置したFileUploadにも、Uploadにも、そういったことができそうなプロパティがありません。

なお、FileUploadはMethod=Ajax Submitのボタンをクリックした場合、ファイル名もファイルのコンテンツもサーバに渡しません。

# JavaScriptを使って対応する
## Extended Properties
OutSystemsの各種Widgetには、Extended Propertiesというプロパティが含まれることがあります。
ここに指定した設定は、HTMLとして出力されるときにタグの属性になります。
そこで、ここにJavaScriptのイベントハンドラーを登録することにします。

![qFileUpload2_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/dea23192-e6d3-ac95-6bb6-06085bb9b405.png)

[Upload Widgetのドキュメント](https://success.outsystems.com/Documentation/11/Reference/OutSystems_Language/Traditional_Web/Web_Interfaces/Designing_Screens/Upload_Widget)

## UI
違うファイルが指定されるたびに、そのファイル名を別のInputに書き込むことにします。
以下のように、ファイルパスをそのまま表示するInputと、ファイル名を切り出して表示するInputを用意してみました。

![qFileUpload2_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/78a617ea-2bdf-a29e-0420-8b87f90339d8.png)

後のJavaScriptで触るためにInputのNameプロパティを設定しておく必要があります。

## JavaScriptの例
Upload WidgetのExtended Propertiesにonchangeを追加し、そのValueに以下の文字列を追加します。
上のコードは、InputFilePathというNameがついたInputに設定されたファイルパスをそのまま表示する例。
下のコードは、ファイルパスからファイル名部分だけを切り出しています。

`"$('#" + InputFilePath.Id + "').val(this.value);" +
"$('#" + InputFileName.Id + "').val(this.value.substr(this.value.lastIndexOf('\\') + 1));"`

ここに書くコードを実際の要件に合わせて修正してください。

# 動作確認
Chromeで動作確認したところ。
![qFileUpload2_3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/4a3a4bb2-6693-5f2f-118e-1728b56d9efd.png)

ファイルパスにC:\fakepath\と表示されるのは、ブラウザのセキュリティのためのようです。
Chromeに限らず、Internet Explorerでも発生しました。
Internet Explorerでは、実験サイトを信頼済みサイトに登録すれば、フルパス表示されるようになりますが、普通は必要ないですね。
AWS Elastic Beanstalkが正常に稼働しているのにデプロイに失敗するケースの対処

社内向けに機械学習のサンプルアプリケーション運用しています。そのアプリケーションが何らかの原因で以下のエラーを出してデプロイに失敗するようになってしまいました。この対処をしばらく行っていました。

> アプリケーションバージョンをデプロイできません: Environment named ***** is in an invalid state for this operation. Must be Ready.

最初に結論から書くと以下の通りです。

* 何らかの原因でCloudFormationのステータスが正常ではなくなった
* 対処法は環境を再作成すること

## 対処方法

[こちらのフォーラム](https://serverfault.com/questions/720039/aws-environment-named-is-in-an-invalid-state-for-this-operation-must-be-re)を参考にしながら、AWSサポートに問い合わせて確認したところ、次のような状況だったようです。

Beanstalkのステータスが正常でも、Beanstalkが利用しているCloudFormationスタックが失敗 （`CREATE_FAILED`ステータスだった）する場合がある。この場合に当初のエラーメッセージが出ることがある。

また、この状態になった原因は分からないのですが、誤ってアプリケーションが正常に動作しないネットワーク設定のままデプロイをしようしてしまったことがあり、その際にCloudFormationのステータスが `CREATE_FAILED` になってしまったんじゃないかと考えています。

この記事が、同様のエラーが出てしまった方の助けになると嬉しいです。
移動距離と移動時間を比例させる！(timeclock DAY2))

#移動距離と移動時間
昨日説明したクリックした場所に要素を移動させる[https://qiita.com/toga364/items/bbbdcad49258a5f3540f]
のつづきとして紹介していく…
初心者が初心者のために作ったものなので無駄に長くてまとまってないかも…
あんま参考にしないでね！

##どういうこと？？
タイトルだけじゃよくわからないと思うので、どんな機能をつけるかまとめる
1.要素を移動させる
2.要素の移動距離を取得
3.要素の移動距離に応じて移動にかける時間を設定
こんな感じです…まぁ詳しくはコードみてね！

##実際のコード
```javascript
/*ここまでは前回で触れたよ！
(リンクは上にあります)
contents.addEventListener("click",function(){
   var x = event.x;
   var y = event.y;
*/
   var left = ball.style.left;
   var top = ball.style.top;　
var leftNum = left.slice(0,left.length-2);
   var topNum = top.slice(0,top.length-2);
   var distanse = Math.sqrt(Math.pow(leftNum,2)+Math.pow(topNum,2));
ball.style.transitionDuration　= distanse*1.5 + "ms";
 /*ここも前回で触れたよ！
   ball.style.left = x + "px";
   ball.style.top = y　+ "px";
   */
    },false)
```
この5行ぐらいのコードが今回説明するために新たに必要になるものです。
2行位ずつで分けて説明します。

###変数の指定(left,top)
```javascript
var left = ball.style.left;
var top = ball.style.top;　
```
ここの部分。
ここでは現在のボールの位置を取得して変数に代入してます。
一応確認すると、ball要素のstyle のleft、heightからの距離を取得してます。
ちなみにここではpxが単位としてつきます。consoleで確認してみてね！
まあまだ簡単…
*leftは左からのx軸方向の距離、
　topは上からのy軸方向の距離を分けて求めてるよ！
###sliceの部分
```javascript 
var leftNum = left.slice(0,left.length-2);
   var topNum = top.slice(0,top.length-2);
```
ここだね！
ここではひとつ前で取得した変数からpxを抜き出しています。

```
要素.slice(開始位置,終了位置)
```
で終了位置のあとをなくした状態の変数(数字)を取得できます。
変数を使っていく上でさっきの状態ではpxがついているため、*文字列*だったけど、今回設定すると*数字*になったよ！
だからこれは*文字列*を*数字*にするための処理です。
文字列の状態では足し算、引き算ができないのでこう変化(数字にする)を加えてます。　

###変数(distanse)は何してる？？
```javascript 
var distanse = 
Math.sqrt(Math.pow(leftNum,2)+Math.pow(topNum,2));
```
ここだよ！
みた感じすごい難しそうだけど紐解いていくと簡単で、中学のときの三平方を利用して*もとの場所と移動する場所の距離*を求めてます。

まず、謎の関数たちの説明！

```javascript 
Math.sqrt(平方根を求める対象);
```
ここで()のなかの値の平方根を求められる。

```javascript 
Math.pow(累乗する対象,指数);
```
ここで累乗した値を求められる。

これでわかった人がいるかもしれないけど、単純に中学のときの三角形の直角があるときに使える三平方の定理を利用してる
三平方の定理
A^2=B^2+C^2
変形後
A=√B^2+C^2
単純にこれをしているだけです…

関数郡のせいで難しそうだけどx方向の距離とy方向の距離を分けててにいれたものをここで処理して、要素の過去、現在の座標の距離を求めているよ！

##最後の指定は？？　
```javascript 
ball.style.transitionDuration　= distanse*1.5 + "ms";
```
ここではスタイルを通じてアニメーションにかける時間を設定しています。

```css
transition-duration: 時間;
```
でアニメーションにかける時間を設定するのと同じ感じ…( ;´･ω･`)
この時間のところにさっきてにいれた変数(distanse)を使用して、数字を求めています。
今回は一ミリ秒で1500px動くようになっている…はず…

##まとめ
大まかな流れ
1,現在位置を求める
2,位置を数字化する
3,位置の距離を三平方使って求める
4,最後に秒速設定！
って感じ！
質問あったらよろしくぅ！
休憩の大切さ

#ポケモンのお話
ジムに挑む前や次の町へ向かう前に、ポケモンセンターへ寄って全回復しますよね。
なぜなら、キズを負った状態で戦うと負けてしまうから。

#現実世界でも同じ
プログラミングって頭めっちゃ使います。
当然脳は疲れます。
そこでこまめにポケモンセンター = 休憩 を取るんです。
休憩を怠ると難しい課題は解けません。それどころか普段ならなんなく解ける課題すら解けなくなってしまいます。
非常にもったいないです。

僕は25分学習したら、5分休憩を取ります。
いわゆるポモドーロテクニックです。
めっちゃポケモンセンターに駆け込みます。

#休憩のとり方
休憩を勘違いしている人がいます。
スマホでSNSをいじるのは休憩ではありません。
ちゃんと脳はダメージを食らっています。

僕はつっぷして寝ます。
実際には寝れなくても目を閉じてぼ～っとするのが大事です。

目を開けていると大量の情報が入ります。
目の疲れは脳の疲れに一番直結します。
寝るor瞑想がベターだと思います。


さぁ、Qiita書いたし寝よっと。おやすみ。
【salesforce】データローダを使って共有設定へ一括挿入【備忘録】

#共有設定をする際に一括挿入するやり方

##項目名

- ParentID
- objectNameAccessLevel
- RowCause
- UserOrGroupId	

標準オブジェクトの場合は、
ParentIDがそれぞれのオブジェクトIDになる。(ContactId、AccountIdなど)
objectNameAccessLevelは

- Edit
- Read
- All

を設定可能。
UserOrGroupIdにはユーザもしくはロールに関連つけられた公開グループまたは共有グループ。
もしくはテリトリーグループが設定可能。

データローダで上記を指定して一括で編集が可能。

大量に組織の共有をすることがあったため備忘録として。

#profile

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

<a href="https://blogmura.com/profiles/11016817?p_cid=11016817"><img src="https://blogparts.blogmura.com/parts_image/user/pv11016817.gif" alt="PVアクセスランキング にほんブログ村" /></a>
言語化すると結局何が嬉しいのか？

Twitterでエンジニアが「言語化」が大事だと呟いているのをよく見かけるようになった。

「あー、言語化するのは大事なんだな」と思って自分の考えを言葉にすることに取り組んだ。しかし、「**なぜ言語化が大事なのか？**」について実はあまりメリットを考えていなかった。そこで、言語化のメリットについて考えた。

結論から言うと、**言語化のメリットは「不安が減る」ことだ。なぜなら、言葉にすると自身の悩みを可視化できるからだ**。

例えば自分の場合、プログラマかマネージャかで転職を悩んでいた。しかしキャリアカウンセリングを受けた結果、マネージャとしてのキャリアが無いのでいきなりマネージャとして転職するのはハードルが高いことに気が付けた。**悩みのせいで脳に大きな負担が掛かっていたのだ**。しかし言葉にすることで、負担を軽減できた。悩みを外に吐き出せたからである。

キャリアカウンセリングを受けた経験から、自分のことを一番見えてないのは自分自身だということに気が付いた。今後は積極的に、自身の状況を可視化するようにしてゆきたい。

##参考資料
- [『マイクロカウンセリング技法―事例場面から学ぶ』](https://www.kinokuniya.co.jp/f/dsg-01-9784759916379)
    - 第2章 第4節 意図性
pythonでXMLRPCを使ってFC2ブログ等を更新する方法

pythonでXMLRPCを使ってfc2ブログを更新する例です。
自動でブログを投稿したい時なんかに非常に便利だと思っています。

```
import xmlrpc.client
# xmlrpcで使用するドメイン
DOMAIN = "http://blog.fc2.com/xmlrpc.php"
# xmlrpcで使用するBLOG_ID
BLOG_ID = ""
# xmlrpcで使用するUSERNAME
USERNAME = "xxxxx@xxx.xxx"
# xmlrpcで使用するPASSWORD
PASSWORD = "xxxxx"

contents = {}
contents["title"] = "タイトル"
contents["description"] = "記事"

proxy = xmlrpc.client.ServerProxy(DOMAIN)
proxy.metaWeblog.newPost(BLOG_ID, USERNAME, PASSWORD, contents, 1)
```
visual studio code で、babel-node(@babel/node)をデバッグ

# 確認した環境
visual studio code: 1.39.2
babel-node: 7.2.2


# launch.jsonを開く
画面右端からデバッグアイコンをクリックし、デバッグの設定アイコンをクリック、プルダウンリストから「Node.js」を選択すると、デフォルトのlaunch.jsonが表示されます。
![sas.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395902/029c1fe5-fc9c-a2a7-14e8-a848d36a63e6.gif)
デフォルトのlaunch.json

```
{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "type": "node",
            "request": "launch",
            "name": "プログラムの起動",
            "program": "${file}"
        }
    ]
}
```


# launch.jsonを編集
launch.jsonに以下のように編集します。※メインのjsが`index.js`である前提です。異なる場合は、"program"の値を書き換えてください。

```
{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "type": "node",
            "request": "launch",
            "name": "babel-nodeのデバッグ",
            "program": "${workspaceFolder}/index.js",
            "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/babel-node",
        }
    ]
}
```

# デバッグの実行
画面右端からデバッグアイコンをクリックし、上で編集した設定名("name")が選択されているのを確認し、デバッグの開始アイコンをクリックします。
![qq.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395902/cf72093f-4bd9-6383-ba9f-6396d7c5c875.gif)
Sure-thing Principle 当然原理について説明してみた

#Sure-thing Principle（当然原理）の定義
あなたがXとYのうちどちらかを選ばなくてはいけない時、その決定がある事情Eによるとして

 - Eが起こるならXを選びたい
 - Eが起きないならXを選びたい

とするならばあなたはEが起きるか否か知らなくともXを選ぶべきである

## 効用最大化との関係
もし意思決定者が効用最大化にのっとってある行為を選んだ場合、その行為は当然原理に則していなければならないということが数学的に証明されている。
このことからある意思決定が当然原理に反していた場合その効用も最大化されていないということが言える
husky が .git/hooks/* を作ってくれなかったが git の version が古いせいだった

# つまり
- husky は git の pre-commit （とか）のための hooks script を `yarn` したタイミングで作ってくれる
- が，作ってくれないことがある
 - 例えば husky 3.0.9 だと git version が古い（<2.13.0）と作ってくれない
- debian 9 だったので git が古かった (2.11.0)
- git をソースからビルドして入れ直したら作ってくれるようになった
  - Mac とかならもっと楽に brew で新しいバージョン入ると思う 

# 背景（蛇足）
開発環境を新しく作り直したので，リポジトリからもソースコードを `git clone` しなおし，幾つかコミットをしてみると，pre-commit が働いていない．どうも `./git/hooks` が初期状態のままだ．普通なら `yarn` のタイミングで husky が hooks script を作ってくれるはずだが，それが作られていなかった．

なんだなんだと色々調べてみると，husky の github repository ページ (https://github.com/typicode/husky) で以下のような記述を見つける．

```
Existing hooks are kept. Requires Node >= 8.6.0 and Git >= 2.13.0.
```
手元のマシンの git は確かに 2.11.0 だ． debian 9 でテキトーに `apt install git` で入れただけだったのでかなり古かったのだ．ただ，2.11.0 でも今まで動いてたのに！と思い git の履歴で `package.json` を調べてみると，3ヶ月前に husky のバージョンが1系から3系に上げられていたのだった...

git のバージョンを上げるのは debian 9 でちょっと面倒くさかった
https://linuxize.com/post/how-to-install-git-on-debian-9/

# References
- https://github.com/typicode/husky
- https://linuxize.com/post/how-to-install-git-on-debian-9/
- https://linuxize.com/post/how-to-install-node-js-on-debian-9/
- https://qiita.com/seibe/items/36cef7df85fe2cefa3ea
kafka-proxy-ws を経由して Node.js へデータを渡す

こんにちは。
[kafka-proxy-ws](https://github.com/microsoft/kafka-proxy-ws) を見つけたので、[react-websocket](https://github.com/mehmetkose/react-websocket) （クライアント ```App.js```）へデータを渡してみました。ただし、```"1\n2\n3"``` を渡して結果表示を見ると、最後の ```3``` だけが処理されたように見えました（加算が  ```3``` だけです）。

```Count: 1 → 4 → 7```

```console
$ mkdir kafkaProxy
$ cd kafkaProxy
$ vi server.js
$ vi package.json
$ npm install
$ node server.js &
$ echo -e "1\n2\n3" | kafkacat -P -b localhost -t test
$ echo -e "1\n2\n3" | kafkacat -P -b localhost -t test
```

```console
$ npx create-react-app react-websocket
$ cd react-websocket
$ vi src/App.js
$ npm start
```

```App.js
import React, { useState } from 'react';
import Websocket from 'react-websocket';

function App() {
  const [count, setCount] = useState(1);

  function handleData(data) {
    JSON.parse(data).forEach(res => {
      setCount(count + Number(res.message));
    });
  }

  return (
    <div>
      Count: <strong>{count}</strong>
      <Websocket url='ws://localhost:9999/?topic=test&consumerGroup=group1'
          onMessage={handleData.bind(this)}/>
    </div>
  );
}

export default App;
```

```server.js
'use strict';
const KafkaProxy = require('kafka-proxy');
let kafkaProxy = new KafkaProxy({
    wsPort: 9999, 
    kafka: 'localhost:9092/',
});
kafkaProxy.listen();
```

```package.json
{
  "name": "kafkaProxy",
  "version": "1.0.0",
  "scripts": {},
  "description": "WebSockets based proxy for Kafka",
  "author": "lawrips <lawrips@microsoft.com>",
  "dependencies": {
    "debug": "^2.2.0",
    "kafka-proxy": "^1.0.0",
    "no-kafka": "^2.5.5",
    "path-to-regexp": "^1.2.1",
    "ws": "^1.0.1"
  },
  "main": "server.js",
  "devDependencies": {
    "commander": "^2.9.0",
    "should": "^9.0.2"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/Microsoft/kafka-proxy-ws.git"
  },
  "keywords": [
    "kafka",
    "proxy",
    "reverse proxy",
    "ws",
    "websockets",
    "websocket",
    "socket",
    "sockets"
  ],
  "license": "MIT"
}
```
pipのライブラリーを一括で自動更新するコマンド

自分用の備忘録です。
他の方も参考になれば幸いです。




updateできるライブラリーがあるか、確認する。
コマンドプロンプトで入力する

```
pip list --o
```

アップデートが一つしかない場合は以下のコードを入力

```
pip install -U パッケージ名
```

<h1>本題</h1>
<h5>まとめてアップデートしたい場合は、新しくライブラリーを入れます。</h5>


```
pip install pip-review
```


<h5>インストール完了後、以下のコマンドでアップデートが開始されます。</h5>
```
pip-review --auto
```
cradle で CouchDB にDBを作成しても save ができなかった(ように見えた)件

## だめな例

```javascript
var conn = new(cradle.Connection)(
  constants.DB_URL,
  constants.DB_PORT
);
var db_master = conn.database('ddntj');
db_master.create();
db_master.save('hoge', { data:huga } , callback(){...});
```
……とベタ書きするとこいつは **saveしてくれません** 。
原因は create() でDB作るのに(CouchDB側で)少しだけ時間がかかるのにその前にsaveが走るからです。
まぁ、当たり前っちゃ当たり前なのですがこれエラーも何も吐かないのでちょっと原因を探るのに時間かかりました。
create()でcallback関数が設定できればいいんですがどうやらそんな引数は無い模様。

## 動いた例

……で、どうしたかっていうと

```javascript
var conn = new(cradle.Connection)(
  constants.DB_URL,
  constants.DB_PORT
);
var db_master = conn.database('ddntj');
db_master.create();
setTimeout(()=>db_master.save('hoge', { data:huga } , callback(){...}),1000);
```
単純ですが……これはアカンやつやろな……一応issueは送っておきました。実装してくれればいいんだけど。
匿名リンク作成の監視設定

# はじめに
前回、PPAPを無くしたいがためにSharePointの匿名リンクを作成する方法を記事にまとめました。
[SharePointで外部の人とファイルを共有](https://qiita.com/fukasuke/items/f0f9cf435dbfaa9be5d0)
管理者としては匿名リンクを作成されたことを検知したいはずです。多分きっとしたいはずです。

# 匿名リンクのログ
Microsoft365管理センターからセキュリティをクリックすると、Office365セキュリティ/コンプライアンス画面が表示されます。メニューの検索から監査ログの検索をクリックします。
<img width="299" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/5a223e08-78f5-5b09-6f73-d25ad2f96b98.png">
しかし、、、この記事を書いていたらメニューから「監査ログの検索」が表示されなくなってしまいました。
URLをたたけば現時点では表示されます。
https://protection.office.com/unifiedauditlog

<img width="579" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/942026a5-4c66-7b4d-c5f8-6825c3b3c4a8.png">
監査ログの画面が表示されるので、アクティビティのドロップダウンをクリックします。匿名リンクで検索すると、以下のように表示されるので。「匿名リンクの作成」を選択します。
<img width="660" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/77324735-cf77-2775-212d-7fd1e0b6778b.png">
※匿名リンクの作成だけではなく、他のログも検索できます。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/e2319710-019e-4c90-f5fa-ec134e9347f8.png)
検索ボタンをクリックして、しばらくすると検索結果が表示されます。これでどのIPから誰がどのアイテムの匿名リンクを作成したかが分かります。

# 通知
匿名リンクが作られる度に管理者に通知することも可能です。上記のログの検索結果の「新しい通知ポリシー」をクリックします。
<img width="774" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/b38516c4-d4b7-ea4b-fa65-1ae079bd6a1b.png">
こんな感じの画面になるので適当な値を設定します。画面下部の受信者に通知先を設定します。グループアドレスも設定できます。
注意したいのは「名前」に全角文字を入れると、実際のメールが文字化けしてしまいます。なので、「名前」は半角文字を設定しておきます。
このアラートの設定は保存してから実際に反映されるまで相当時間がかかります（体感で半日以上）。

実際の通知は以下のようなメールが送られてきます。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/f3c43d62-a20e-143b-357d-8ce5f7539270.png)
どういうわけか、「Details」は文字化けしてしまいます。
この通知は設定画面で都度やある程度まとめて通知するなど設定できるので、そこはお好みで。
通知の設定をしていると誰に対して共有したかも分かります。
pprofのweb viewでパフォーマンス測定

### 概要
pprofでサーバーのパフォーマンス検証する時、
web viewで簡単にボトルネックを特定できます。
### pprofとは
go toolに入っているプロファイラーツール
関数単位でボトルネックになっている処理を特定できます
https://golang.org/pkg/net/http/pprof/
UI上で処理の流れがこんな感じに見れます

![pprof.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254185/ee5aa2f6-7b35-c776-4c08-bcd9ab160230.png)

## 使用ツール
1. Go


```
go version
go version go1.13 darwin/amd64
```

2. [graphviz](http://www.graphviz.org/)

dotファイルとかをいい感じに可視化してくれるツール
今回は吐き出されたプロファイルを見やすくしてくれる

``` shell
brew install graphviz
```

3. コードに変更を入れる

``` main.go
import (
        "context"
 　     "log"
        "net/http"
        "os"
        "os/signal"
        "syscall"
        "time"

      _ "net/http/pprof" // これをインポートすることでプロファイル取得用のルーティングがインジェクションされる
 func main() {
// 別スレッドで計測
      go func() {
              l.Println(http.ListenAndServe(":6060", nil))
      }()
```

dockerを使っている時はportを開けるのを忘れないように

```docker-compose.yml
       - ./secret:/secret
     ports:
       - "3001:3001"
+      - "6060:6060" #dockerのネットワークとホストをつなぐ
     environment:
       - ENV=develop
       - DB_HOST=tcp(db:3306)
```

あとはgo.modなど

## 実行
  計測したいリクエストを投げる

## 計測

 ``` shell
go tool pprof -http=: localhost:6060
```

↑は処理時間のプロファイリング
他にもCPU, goroutineのプロファイルなどが可能

``` shell
go tool pprof -http=: localhost:6060 http://localhost:6060/debug/pprof/profile?seconds=30
```

[reference](https://golang.org/pkg/net/http/pprof/)に他の計測指標も載っています。

## まとめ
こんな感じでprofileが簡単な修正でできます。
特に大規模サービスになった時ボトルネックの特定に役立ちそうです。
n番煎じかとは思いますが、なぜかハマってしまったのでまとめておきました。
Ruby on Rails + AASM  gem で initial の時に callback を指定して 元のレコードの情報を得られないのだけど？

LifeCycle の after_enter を initial の callback に指定しても、new 状態のレコード情報しか得られなかった

そもそも aasm の 処理自体が、レコード本体の save よりも前に走るような気がしたが、定かではない

解決策としてはAASM関係なく model の after create として実現した

https://github.com/aasm/aasm#lifecycle

![image](https://user-images.githubusercontent.com/13635059/68478136-8dfe4500-0272-11ea-8e9e-7e00c55b4488.png)

# コード例

割愛

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
DSP FMラジオ RDA5807FP+ATTINY85+AQM0802A その4 AQM0802A

#はじめに
* 電池駆動DSPラジオのその4。LCD（AQM0802A）についての記事です。
* LCDは一般的な1602A+I2Cでも良いのですが、電圧の問題と勉強のために本品を利用しています。

#使用したもの
* AQM0802A-RN-GBW 秋月電子にて購入。これは本体の単品ですが、ピッチ変換キットの購入をお勧めします。
* 安くて小型だったので本品を購入。I2C接続であれば何でもよいと思いますが、3.3Vで動くものが必要です。
* 一般的な1602Aの場合、I2C変換モジュールに加えて3.3Vで動くように改造が必要になります（または、別途5V電源を用意）。

#I2C接続（ピッチ変換）について
* 本品は単体のままではI2C接続できないため、ピッチ変換基板（数個のコンデンサが必要）が必要になります。変換基板の回路はデータシートにのっています。
* 勉強のためとはんだ付けの練習のために変換基板を自作しましたが、面倒なだけなのであまりお勧めしません。
* 秋月電子さんで、変換基板付きのモジュールが販売されていますので、そちらをお勧めします。なので自作の変換基板は公開しないことにします。
* 変換基板を用いる際の注意点。
    * データシートにも書いてありますが、RESETはVDDに接続します。
    * Arduinoで利用する場合は、プルアップ抵抗は（おそらく）不要です。自作基板でも利用していません。

#接続
* 普通のI2C接続なので難しいところはありません。
* SCL、SDAをマイコンに。+3.3V、GNDを電源に接続するだけです。

#ライブラリ
* Arduinoで使う際のコードですが、大変扱いやすい[ライブラリ](https://n.mtng.org/ele/arduino/i2c.html)を使わせていただきました。
* このライブラリの解説ページに懇切丁寧に使い方が書いてありますのでご参照ください。
* 具体的なコードは後日投稿します。

#おまけ
* 上でも触れた「LCD1602A + I2C変換モジュール + 3.3V改造」も作成してみました。これも動いたのですが、サイズが大きくじゃまなので、小型のLCDを選びました。
構造体のsliceはポインタ定義しない方がハイパフォーマンス

# Goで構造体slice
Goの構造体sliceはいつもポインタで定義していましたが、
要素追加の時毎回allocationが走るので初期化時に構造体のsliceにした方がパフォーマンス的に良いそうです。

``` go
package main
import (
    "strconv"
    "testing"
)
type human struct {
    age  int
    name string
}
func BenchmarkPointerSlice(b *testing.B) {
    // 初期化時にslice分のメモリ容量を確保している
    people := make([]*human, 0, b.N)
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        people = append(people, &human{
            age:  i,
            name: strconv.Itoa(i),
        })
    }
}
func BenchmarkSlice(b *testing.B) {
    // ポインタ分の容量のみ確保している
    people := make([]human, 0, b.N)
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        // ここで毎回allocate
        people = append(people, human{
            age:  i,
            name: strconv.Itoa(i),
        })
    }
}
```

検証結果

``` shell
~/.ghq/github.com/0daryo/playground  go test -bench . -benchmem
goos: darwin
goarch: amd64
pkg: github.com/0daryo/playground
BenchmarkPointerSlice-8         15123596                77.8 ns/op            39 B/op          1 allocs/op
BenchmarkSlice-8                46061704                28.7 ns/op             7 B/op          0 allocs/op
PASS
ok      github.com/0daryo/playground    3.471s
go test -bench . -benchmem  4.58s user 0.91s system 148% cpu 3.693 total
```

確かに実体の配列の方が３倍くらい速くてメモリ効率も良い
構造体のコピーコスト < allocation回数のコストだということだと思うのですが、オブジェクトサイズがあまりにも大きい場合はまた別問題かもしれません。
Github ActionsでPipenv + Pytestの自動テストを行った

# 概要
前回[「Travis CIでPipenv + Pytestの自動テストを行った」](https://qiita.com/devara/items/fb0f144ac859f529839a)でTravis CIを使った自動テストを実施したが、[Github Actions](https://help.github.com/ja/actions/automating-your-workflow-with-github-actions/about-github-actions)が使えるようになったので、こちらでも試してみた。
実際に試してみたリポジトリは下記である。
https://github.com/doara-developer/weatherlib

# Github Actions
GithubのCI/CDツール。現在はまだベータ版だが、まもなく標準サポートされる。[ベータ版への参加リクエスト](https://github.com/features/actions)を送ることで利用可能。私の場合は申請してから数日後に通った。
申請が通ると下記のようなActionsタブが表示される。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497222/407db46e-5b7d-9095-f02c-329cf3fc997c.png" width=20%>

# Workflowの作成
基本的には、yamlファイルに「処理が始まるトリガー」と「実行する処理内容」を記述することで、Workflowを作成することが出来る。最初からテンプレートが用意されているので、それをベースに書けばそこまで困らないだろう。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497222/baface30-518d-cd71-a9f5-8dce2c24e7c0.png" width=100%>

最終的に作成したyamlファイルは下記である。本リポジトリではPushをトリガーにPipenvとライブラリをインストールして、Pipfileに書かれているPytest実行用のコマンドを叩くだけ。他にどんなことが出来るか気になる方は[GitHub Actionsのワークフロー構文](https://help.github.com/ja/actions/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions#jobsjob_id)をチェック。

```yaml
name: Run pytest

on: [push]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v1
    - name: Set up Python 3.7
      uses: actions/setup-python@v1
      with:
        python-version: 3.7
    - name: Install pipenv and dependencies
      run: |
        python -m pip install --upgrade pip
        pip install pipenv --upgrade-strategy=only-if-needed
        pipenv install --dev
    - name: Run test
      run: |
        pipenv run tests
```

# Workflowの実行状況を確認
作成後、Actionsタブに行くとWorkflowの動作状況を確認できる。何故かTravis CIの状況も表示された、素晴らしい。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497222/d910808a-41a7-a00d-ebdd-21b38c32eacd.png" width=50%>

# バッジの作成方法
Travis CIと同じように[Github Actionsも状況を確認するためのバッジを作成し、Readmeに貼ることが出来る。](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/configuring-a-workflow#adding-a-workflow-status-badge-to-your-repository)下記がバッジのURLである。

```
https://github.com/<OWNER>/<REPOSITORY>/workflows/<WORKFLOW_NAME>/badge.svg
```

# まとめ
とても分かりやすく、特に詰まることなく実行することが出来た。標準サポートになればわざわざ別のCIサービスを使う必要がなくなってくるので、おそらくGithub Actionsが主流になっていくだろう。
間違えてpushしてしまった時に前のコミットに戻す方法

間違えてリモートリポジトリにpushしてしまって、戻したいコミットidに直した時の備忘録

###ローカルリポジトリ
```terminal:terminal
// コミット履歴の確認
$ git log
// 戻したいコミットIDを指定
$ git reset --hard [コミットid]

```
これで、ローカルリポジトリで戻したいコミットidまで移動できたので、次にリモートリポジトリへpushします。

```terminal:terminal
// リモートリポジトリにプッシュ
$ git push -f origin　[ブランチ名]
```

やはりコマンドを打って理解することは大事ですね...
SeleniumとGruntを使って、初心者がつまづいたポイントまとめ

ここ最近フロントエンド開発に携わっており、テスト自動化を導入してテストコードをひたすら書き進めているのですが、プロジェクトにテスト駆動開発に携わったことのある先人がおらず、いざテストコード書くぞ！という時に苦戦したので、まとめたいと思います。

##Selenium WebDriverとは
ローカルPC上で中継サーバー(Selenium Server)を起動して、ブラウザに現れた要素を操作（取得、書き換え、クリック等）し、想定通りかを判定することができる。

##Gruntとは
作業を自動化して開発やテストを効率化してくれる。
Gruntfile.jsで作業内容を制御し、gruntコマンドで実行できる。

###インストール
```
npm install selenium-webdriver
npm install grunt-cli
```

###環境
・Windows10
・JavaScript
・Mocha(テストフレームワーク）
・grunt(タスクランナー）
・mocha-jenkins-reporter(mochaからJenkins用のテスト結果レポートを出力する)

###Gruntfile
```javascript:Gruntfile.js
module.exports = function(grunt) {
  grunt.loadNpmTasks('grunt-env'); //gruntでタスク指定
  grunt.loadNpmTasks('grunt-mocha-test'); 
  grunt.loadNpmTasks('mocha-jenkins-reporter');
  // 設定内容を記述
  grunt.initConfig({
    selenium: {
      test: {
        JUNIT_REPORT_PATH:'reports/result.xml';
      }
     },
    mochaTest: {
      test: {
       src:['test/*.js'],
       options:{
         reporter: 'mocha-jenkins-reporter',
         noFail: false
       },
      },
    },
  });

  grunt.registerTask('test', ['selenium:test', 'mochaTest']);
};
```

###Grantfileの引数
テスト実行時に自由に引数を渡すことができる。
テスト結果のファイル名をテストコード数に合わせて動的に変えたりしたかったけど…テスト実行ファイルが複数ある場合、一つのファイルとして見なされて実行されるため変えられなかった。
（何か良い方法あれば教えてください…！）

##クリックや値取得の範囲でのつまづき
###1. あるはずの要素が取得できない
基本的に「display: none;」「visibility: hidden;」に設定している要素の値を取得したり、クリックしたりしても見つからない。隠された（非表示）要素になっていないものを操作するようにする。

###2. クリックできない
下記のいずれかの書き方で動作する。

```javascript:test.js
await driver.findElement(By.id(displayButton)).click(); 
// 上記でクリックできない時
await driver.findElement(By.id(displayButton)).sendKeys('\n');
```

###3. 描画されているはずなのに値等が取得できない
SeleniumテストはSeleniumServerで動作する。ローカル画面がテスト対象となるが、ローカル画面はSeleniumServer上でテストされる。そのため自身のローカル環境で画面が表示されていることが確認できてもSeleniumServer上で表示できていない可能性がある。
ネットワーク再接続なども試してみる価値あり。

###4. スクロールがうまく動作しない
高さを指定する。

```javascript:test.js
await driver.executeScript('window.scrollTo(0,500)');
```

##後記
つまづいた点を思い出したら追記予定
学習記録＃7

#今日やったこと

- progate：RubyⅣ-12まで（インスタンスメソッド）



#####読んだものピックアップ

- [なぜ「事実」と「意見」を区別して話せない人がいるのか。](https://blog.tinect.jp/?p=62453)
- [面接で見ているポイント](https://techlog.voyagegroup.com/entry/2019/10/29/080000)
- [【Qiita投稿初心者向け】アドベントカレンダー2019のすゝめ](https://qiita.com/rf_p/items/97f45ba1f08e2f7b2965)

##progate：RubyⅣ-12まで（インスタンスメソッド）

- self.変数でインスタンスで定義する変数をクラス内で定義
-  initializeメソッドはインスタンス生成直後に実行される
mac Rails6 で 「syntax error , unexpected tIDENTIFIER, expecting keyword_end render」が出た話

# 目的

- Rails6を使用してサービスを作成中にコントローラファイルを編集しsyntax errorが出た時の解決談を書く。

# エラー概要

- `render ("users/new")`でsyntax errorが出ている。
- 簡単なrenderの処理を追加しただけでエラーが出たためテンパった。
- 時間をかけたが全く悪い箇所が見つからずにさらに焦った。
- エラーを日本語翻訳しても該当の行に悪い部分は見当たらなかった。→時間かかってどんどん焦っていった。
- 下記のコードをコントローラファイルに記載後、ブラウザで該当ページを確認するとsyntax errorが表示されていた。

```ruby
# 問題のコード
  def create
    @user = User.new(name: params[:name], email: params[:email])
    if @user.save
      flash[:notice] = "登録完了"
      redirect_to("/users/#{@user.id}")
    else
      flash[:notice] = "登録失敗""
      render ("users/new")
    end
  end

# エラー内容(英語)
/Users/admin/workspace/study/rails/eveyDayStudy/app/controllers/users_controller.rb:21: syntax error, unexpected tIDENTIFIER, expecting keyword_end render ("users/new") ^~~~~
/Users/admin/workspace/study/rails/eveyDayStudy/app/controllers/users_controller.rb:21: syntax error, unexpected tSTRING_BEG, expecting keyword_do or '{' or '(' render ("users/new") ^
/Users/admin/workspace/study/rails/eveyDayStudy/app/controllers/users_controller.rb:24: unterminated string meets end of file
/Users/admin/workspace/study/rails/eveyDayStudy/app/controllers/users_controller.rb:24: syntax error, unexpected end-of-input, expecting keyword_end

# エラー内容(日本語)
/Users/admin/workspace/study/rails/eveyDayStudy/app/controllers/users_controller.rb:21：構文エラー、予期しないtIDENTIFIER、keyword_end render（ "users / new"）が必要です^ ~~~~
/Users/admin/workspace/study/rails/eveyDayStudy/app/controllers/users_controller.rb:21：構文エラー、予期しないtSTRING_BEG、keyword_doまたは '{'または '（' render（ "users / new"）が必要です^
/Users/admin/workspace/study/rails/eveyDayStudy/app/controllers/users_controller.rb:24：終了していない文字列がファイルの終わりを満たしている
/Users/admin/workspace/study/rails/eveyDayStudy/app/controllers/users_controller.rb:24：構文エラー、予期しない入力の終わり、keyword_endが必要
```

# エラー原因

- 問題だったのは該当の行`render ("users/new")`ではなく、前の行の`flash[:notice] = "登録失敗""`の最後のダブルクォートが余計だった。
- まさか間違えていないであろう部分が間違えていた。
- 下記に正しいコードを記載する。

```ruby
# 問題のコード
  def create
    @user = User.new(name: params[:name], email: params[:email])
    if @user.save
      flash[:notice] = "登録完了"
      redirect_to("/users/#{@user.id}")
    else
      flash[:notice] = "登録失敗"
      render ("users/new")
    end
  end
```

# まとめ

- 原因はめっちゃしょうもないミスだった。
- エラー原因箇所のみならず、前の処理がどのような書かれ方をしているかも確認す流必要があった。
- エラー解析は焦らないこと(自分向けのメッセージ)
[Catalina] 英語と日本語を混ぜた要素の高さが合わない（フォントのバグ）(Chrome)

## 現象

日本語と英語表記にしたdiv要素を`display:inline-block`で横一列に並べると、以下のように英語が入っている要素のみdivが小さくなっている。

<img width="963" alt="スクリーンショット 2019-11-09 0.05.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142616/a73ff778-c699-d6da-dd66-2f878d98a4cd.png">

## 対象読者
codepenの表示が上のように`Hello` のみ小さく表示されている人

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

## 結論

`Chromeのフォント設定`を変更しましょう

## 方法

これはmac新OSのCatalinaのフォント設定が原因で生じます。macOS Catalinaでヒラギノ角ゴPro/ProNがなくなったことにより、デフォルトで明朝体が設定されるようです。そこで、フォント設定を行いましょう。

Chromeの画面で右上の<img width="36" alt="スクリーンショット 2019-11-09 0.18.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142616/637dde18-d2eb-bfc1-7c8a-88235de4116b.png">を押し、Chromeの設定画面に入る

<img width="363" alt="スクリーンショット 2019-11-08 23.15.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142616/4c871bcb-3d90-d2ee-b8f7-cae2869f9061.png">

`フォントをカスタマイズ`を選択
<img width="709" alt="スクリーンショット 2019-11-08 23.16.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142616/5a0d6cc0-2503-43d8-c825-57455c04ae62.png">


`標準フォント` が`カスタム` となっているので、好きなフォントに設定する（一度フォントを選択するとカスタムはなくなります）

<img width="682" alt="スクリーンショット 2019-11-09 0.16.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142616/cdc6ce0e-c35e-b031-dfd1-41212b319723.png">

自分の場合は`ヒラギノ角ゴシック`を選択しました

<img width="678" alt="スクリーンショット 2019-11-09 0.14.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142616/9f92223f-43e3-992c-e670-a57a2429d6fb.png">

`Sans Serifフォント`もカスタムになっているのでこれも変更してください。
<img width="679" alt="スクリーンショット 2019-11-09 0.38.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142616/4a94a821-8d76-f26b-9a8f-28598edf7a55.png">

再度表示を確認すると、日本語と英語が混ざったdiv要素の高さが揃っていることが確認できると思います。


<img width="964" alt="スクリーンショット 2019-11-09 0.23.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142616/25fcdb22-1815-8607-7d6e-cef90177fd3d.png">
C# 自分用メモ：switch文について

switch文とif文がごっちゃになったので、switch文についてまとめました。

##switch文とは
if文と同じ「条件分岐」の機能があります。
コードの書き方は以下の通りです。

```C#
  switch (---) // ()の中に判断したいものを入れる
        { 
            case ○○○: // 比較するものをcaseの横にいれる
            // caseとbreakの間に処理させたいことを記述します。
            break;
        }
```
注意したいのは、**変数の型が文字列の場合ならcaseの横に置く際に""で囲む**必要があります。

##お試し
試しにプレイヤーの行動を表す一文を出力してみます。

プレイヤーの行動

- こうげき
- ぼうぎょ
- まほう
- アイテム
- にげる


```C#
    void Start()
    {
        string action = "Item"; // Attack,Defense,Magic,Item,Escapeのどれかを""の中に入れる

        switch(action) 
        { 
            case "Attack":
            Debug.Log("こうげきした！");
            break;

            case "Defense":
            Debug.Log("ぼうぎょした！");
            break;

            case "Magic":
            Debug.Log("まほう！を使った");
            break;

            case "Item":
            Debug.Log("アイテムを使った！");
            break;

            case "Escape":
            Debug.Log("にげた！");
            break;
        }
    }
```

実行結果
![Switch文まとめ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507634/ce3fc8c4-2ff1-c60d-1b16-1eb1c3cccf6f.png)
今回はactionに格納した値が"Item"なので、「アイテムを使った！」が出力されました。

###注意事項
C#scriptを作ってPlayボタンを押しただけでは、Consoleに出力されませんでした。
何かしらオブジェクトに貼り付ける必要があるようです。
貼り付け方は、「Hierarcy」の「Create」の中にある [Create Empty」をクリックすると、「GameObject」が生成されるので、そこに作成したC#Scriptをドロップ＆ドロップします。
その状態でPlayボタンを押すと、Consoleに出力されます。
※これを解決するのにすっごく悩んだ。
ラズパイでデジタルフォトフレーム

# ラズパイでデジタルフォトフレーム


## 概要
ちょっと電子工作して遊んだラズパイB+が数ヶ月放置されていたので、
デジタルフォトフレームにした時の手順備忘録

## 1. USBディスプレイをつなぐ
10年前に買ったSAMSUNGの7インチUSBディスプレイが押入れに眠っていたのを思い出したので、ラズパイにつないでみた。
・・・が、ドライバの有効化が結構面倒。
HDMIディスプレイを使う場合この手順は不要なので、これから買う人はHDMIが絶対お勧め。

DisplayLinkのUSBドライバの有効化が必要らしいので、下記のサイトを参考に有効化した。

参考サイト：
http://netbuffalo.doorblog.jp/archives/4580388.html

### 1-1. クロスコンパイル用のUbuntuを用意
VirtualBoxでUbuntuの仮想マシンを作成。下記サイトから「Ubuntu 14.04 LTS」のイメージをダウンロードして利用
https://www.ubuntulinux.jp/download/ja-remix-vhd

仮想マシンが立ち上がったら、Terminalでaptパッケージのupgradeとビルド系パッケージを一通りインストール

```bash
# 古いイメージなのでまずはアップデート
$ sudo apt update && sudo apt -y upgrade
# ビルド系パッケージをとりあえずいろいろ入れとく
$ sudo apt install -y git-core gcc-arm-linux-gnueabi build-essential chrpath gawk wget diffstat unzip texinfo gcc-multilib socat libncurses5-dev libsd1.2-dev xterm whiptail diffstat cpio libssl-dev flex bison kmod
```

### 1-2. クロスコンパイルとX Window Systemの起動
あとは、ほぼ参考サイトの手順通り
(途中で気づいたけど、初めから緑の画面は映っていた=ドライバは有効だった？)

最後のstartxが一般ユーザだとエラーになったので権限を変更

```bash
$ sudo chmod +s /usr/bin/xinit
```

無事、ディスプレイにデスクトップが表示された

## 2. 自動スリープの無効化
デフォルトだと一定時間無操作でスリープしてしまうので、自動スリープを無効にする

lightdmの設定ファイルを開いて

```bash
$ sudo vi /etc/lightdm/lightdm.conf
```

下記設定を追加

```conf
[SeatDefaults]
xserver-command=X -s 0 -dpms
```

再起動

```bash
$ sudo reboot -h now
```

## 3. スライドショーの準備と実行
画像用のディレクトリを作成(適当な画像を置いておく)

```bash
$ mkdir pic
$ chmod 777 pic/
```

Feh(画像ビューワ)をインストール
※fbi1はUSBディスプレイだと使えなそうだった

```bash
$ sudo apt install feh
```

実行(他のPCからSSHで実行すると、PCのディスプレイで表示しようとしてエラーになるので注意)

```bash
$ feh -Y -x -q -D 10 -R 43200 -F -Z -r -z ~/pic/
```

## 4. スクリプト化

いつでも起動できるよう、スクリプトにしておく

```bash
$ vi ~/slide.sh
```

```bash:~/slide.sh
#!/bin/bash
startx
feh -Y -x -q -D 10 -R 43200 -F -Z -r -z ~/pic/
```

```bash
$ sudo chmod +x ~/slide.sh
```

## 完了
自動起動とファイルの同期の仕組みはとりあえず置いといて、今回はこれで完成ということで
USBディスプレイだと画面の回転方法がわからなかったので、縦表示に切り替えは次の課題
年末まで毎日webサイトを作り続ける大学生 〜21日目 段組みレイアウトでタロットカードを配置してみた〜

##はじめに
こんにちは！最近週末は温泉に通っている@70days_jsです！
webサイト制作でお金を稼ぐために年末まで毎日webサイトを作っております。
今日はMDNでcssの段組みレイアウトを学びました。
扱う技術レベルは低いですが、同じように悩んでる初心者の方を勇気付けられれば幸いです。
今日は21日目。(2019/11/8)
よろしくお願いします。

##サイトURL
- https://sin2cos21.github.io/day21.html


##やったこと
まず段組みレイアウトってなんぞやという話なんですが、見たらすぐにわかると思います。
![スクリーンショット 2019-11-08 23.43.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516248/304d7693-9680-4c63-1039-89eda7afc233.png)


これが段組みレイアウトです。新聞記事風に配置できる感じですかね。
flexboxやgridレイアウトでできそう・・・とか思いましたが、まあ見出しと本文があるものを段組みしようと思ったら微妙に手間ですよね。

というわけで今回は、こんな感じのスタイルを使いました↓

```css
        #container {
            column-count: 4;
            column-gap: 80px;
            column-rule: 1em double rgba(50, 200, 50, .5);
            }

        .all_card {
            break-inside: avoid;
           }
```

column-countで何段にするかを指定して、gapは段の間の大きさを指定できます。
column-ruleは段と段の間に線が引けますね。
break-insideは一つのブロック要素を分裂させずに表示します。（これがなかったら記事が途中でも次の段に行って見栄えが悪くなります。）
というわけで今回これを利用して作ったのがこちら↓
![test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516248/5137ff95-8c9d-0ec9-9b4a-7bb32bf1e518.gif)

最近JavaScriptで完結させたい熱が出てきて、htmlはかなりシンプルにしました。html部分はこれだけです↓

```html
<body>
    <h1>タロット占い</h1>
    <div id="container">
    </div>
</body>
```

タロットカードの表示とかは全部JavaScriptで行なっています。

```javascript
let container = document.getElementById('container');
let eventNumber = document.getElementsByClassName('all_card');
let tekitoudesu = [
    '絶好調',
    '危ないかも',
    'うーん、頑張れ',
    'なるほどなぁ・・・',
    'そのままでいい！',
    'その調子だ！'
];

for (var i = 0; i < 8; i++) {
    var divCreate = document.createElement('div');
    var h2Create = document.createElement('h2');
    var number = i;
    var text1 = document.createTextNode(number);
    var text3 = "card" + number;
    var setClass = 'all_card ' + text3;
    divCreate.setAttribute('class', setClass);
    h2Create.appendChild(text1);
    divCreate.appendChild(h2Create);
    container.appendChild(divCreate);
}

for (var i = 0; i < eventNumber.length; i++) {
    eventNumber[i].addEventListener('click', test)
}

function test() {
    let random = tekitoudesu[Math.floor(Math.random() * tekitoudesu.length)];
    alert(`今日のあなたの運勢は"${random}"です！`);
}
```

for文のところで要素を生成しています。画像はあらかじめcssでbackground-imageを用意しておいて、要素にclassをつけているだけです。img要素を作ってつけるのとどっちがいいんだろう・・・？

```css
     .card0 {
            background-image: url("talot/talot0.jpg");
        }
```

あとはクラス名でイベントリスナーをつけてクリックされたら、用意しておいた適当な文言からどれか一つを表示するだけです。

##感想
そろそろ簡単なwebサイト制作の仕事を受注したいなーと考えています。まだまだなのは分かっていますが、実践を通した方が成長スピードがもっと上がるかなとか思っています。いやでも未熟なうちはどうなんだろう・・・。悩ましい。という感じです。

最後までお読みいただきありがとうございます。明日も投稿しますのでよろしくお願い致します。

##参考
1. 段組みレイアウト - Web 開発を学ぶ | MDN (https://developer.mozilla.org/ja/docs/Learn/CSS/CSS_layout/Multiple-column_Layout)

MDNさんありがとうございます！とても分かりやすかったです！
rails+vue ポートフォリオやること

<ul>
   ~~<li>招待ボタン押したあとモーダル作成</li>~~
   ~~<li>チャットに画像を載せられるように</li>~~
   <li>通知機能</li>
   <li>サイドワーク機能</li>
   <li>UI整える</li>