OmniAICreator/Qiita-1.07M huggingface dataset:
Android / Kotlinのlazyを使ったdata classをシリアライズすると落ちてしまう

# TL;DR
- lazyを使ったdata classをシリアライズする処理を含んだAndroidアプリをR8でminifyすると落ちるよ
- Proguardのルールに追加すれば落ちなくなるよ  
```
-keep class kotlin.SynchronizedLazyImpl { *; }
```

# 環境
- Android Studio3.4.1
- Kotlin 1.3.31
- Android 9

# data classとlazy
APIからのレスポンスをオブジェクトとして落とし込むためにdata classを作成します。

```kotlin
data class User(
  val familyName: String,
  val givenName: String
)
```

アプリで表示する時はフルネームで表示することが多いので、姓と名をくっつけてくれるfullNameというプロパティが生えていると便利そうです。
fullNameの書き方はいくつかあります。

(1)

```kotlin
val fullName = "$familyName $givenName"
```

この書き方が一番シンプルです。Userインスタンスが生成されたタイミングでfullNameに値が代入されます。

(2)

```kotlin
val fullName: String
  get() = "$familyName $givenName"
```

`get() =` という書き方は値取得時に毎回計算されます。fullNameを表示するために毎回名前を組み立てることになります。

(3)

```kotlin
val fullName: String by lazy { "$familyName $givenName" }
```

lazyを使うとfullNameが必要になったタイミングで1回だけ処理が走り、以降は結果だけを返します。
fullNameを必要としない場合は計算されず、また何度も呼ばれても初めの結果をそのまま返すので計算量が減ります。

さて、このクラスが非常に便利なのでActivity間でインスタンスごと渡したいとします。
IntentはSerialiableを受けつけてくれます。

```kotlin
data class User(
  val familyName: String,
  val givenName: String
) : Serializable {
  val fullName: String by lazy { "$familyName $givenName" }
}
```

送る時はputExtraにそのまま渡すことができます。

```kotlin
val user = User("Qiita", "Taro")
Log.i("MainActivity", user.fullName) // Qiita Taro

val intent = Intent(this, DetailActivity::class.java).apply {
  putExtra("user", user)
}
startActivty(intent)
```

受け取る時は型をキャストします。

```kotlin
val user = intent.getSerializableExtra("user") as User
Log.i("MainActivity", user.fullName) // Qiita Taro
```

このコード、デバッグだと動くのですが、いざProguardをかけてビルドするとなんと実行時に落ちてしまいます。

# 原因
スタックトレースを見ると、

```
 java.io.NotSerializableException: b.i
```

という謎のメッセージが。
普通シリアライズ対象のクラスはデシリアライズできるようProguardの対象から外します。

```proguard-rules.pro
-keep class com.example.sample.** { *; }
```

しかしそれでもNotSerializableExceptionが発生してしまいます。
つまりシリアライズできない要素がUserクラスにあるということです。

(1)と(2)の書き方では問題ないので原因はlazyにあるのではないかと推測しました。
そこでlazyの実装を辿ってみると `kotlin.SynchronizedLazyImpl` というクラスを見つけました。

```kotlin
package kotlin

public actual fun <T> lazy(lock: Any?, initializer: () -> T): Lazy<T> = SynchronizedLazyImpl(initializer, lock)

private class SynchronizedLazyImpl<out T>(initializer: () -> T, lock: Any? = null) : Lazy<T>, Serializable {
  // 実装内容は省略
}
```

この関数がProguardによって難読化された結果うまくシリアライズできないのであれば、このクラスをProguardから外せばうまくいきそうです。

```proguard-rules.pro
-keep class com.example.sample.** { *; }
-keep class kotlin.SynchronizedLazyImpl { *; } # 追加
```

実行すると問題なく動作できました。
Oculus Quest の映像をテレビに映したりキャプチャする方法

#概要
Oculus Quest でプレイしている動画をキャプチャしたい！
けど、無線だし、外部出力もないけどどうやればいいの？
を解決するいくつかの方法をまとめます。

Oculus Quest のプレイ動画を録りたい
プレイしている映像を周りの人にも見せたい
ライブ配信したいなどなど。

![スクリーンショット 2019-06-01 11.07.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265518/d313cd0a-f1e0-9a49-2025-12d533d1888d.png)

##1. Chromecast 3 / Ultra にキャストする
#####必要なもの : Chromecast 3 / Ultra
いろいろ試した中で、この方法が一番よかったです。
ただし、アプリによってキャストできないものがあるので注意。（BeatSaberは無理でした）
私は Chromecast Ultra を利用していますが、3 でもできるようです。

1. Chromecast を映したいテレビに接続します。
1. Oculus Quest 内のシェアからキャストを押します。
1. Oculusアプリを開いて、右上のミラーリングボタンを押します。
1. ミラーリング先を Chromecast にして、ミラーリングを開始すると、テレビに Oculus Quest の中と同じ映像が表示されます。

![IMG_5168.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265518/38ca36f8-9dba-4c8b-91b8-2134e65d59c3.jpeg)

##1.ex キャストしたものをPCにとりこむ
#####必要なもの : HDMIキャプチャー機器、HDMIスプリッター
上では、Chromecast をテレビに接続しましたが、これを HDMIキャプチャー機器に接続します。
※ ただし、間にHDCP解除するスプリッターが必要になります。Chromecast → スプリッター → キャプチャー機器
私が利用している HDMIキャプチャー機器は AVT-C878 というものです。

あとは OBS などで取り込めれば、録画や生配信をすることが可能です。

![questobs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265518/fa3ff827-b7cd-462d-2b1e-7d22fb9ce1d8.png)

###2. スマホにキャストする
画質が見れるレベルではなかったので個人的にはなしでしたが、最もお手軽
1. のミラーリング先を「この携帯電話」にするだけ。
スマホにキャストしたのを、PCにミラーリングすることで大画面に映したり、録画することが可能。

###3. Oculus Quest 内の録画を使う
最もシンプルで簡単だが、現状は音ズレ酷いので編集必須でオススメできない。生配信などには使えない。
メニューのシェア → 録画 で録画をする
プレイ中に右上に赤丸が常に出る（録画される動画には映らない）

撮影した動画は、Oculus Quest 内のライブラリから見ることができる。
PCに移したい場合は、USBで接続し、[Android File Transfer](https://www.android.com/filetransfer/) を利用して移す。

###4. [scrcpy](https://github.com/Genymobile/scrcpy) を使う
今回説明する中で最も画質がいいです。
少し手順が面倒なのと、両目の映像になります。
あらかじめ、Oculusアプリから開発者モードをオンにしておいてください。

![scrcpy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265518/3c0b20d5-2383-e899-b02d-dc57354e6788.png)

####Mac の場合

```
# scrpy インストール
$ brew install scrcpy

# adb を使うために必要
# もし、Unity で Android 向け開発などをしていて、Android Studio をインストールしていたら不要
# （/Users/ユーザー名/Library/Android/sdk/platform-tools にあるはず）
$ brew cask install android-platform-tools
```

Mac と Oculus Quest をUSBで接続した状態で以下を実行すると、Mac上に映像がうつります。

```
$ scrcpy
```

録画は以下のようなコマンドで。

```
$ scrcpy --record file.mp4
```

####Windows の場合
[scrcpy](https://github.com/Genymobile/scrcpy) からダウンロードして解凍。
Quest と PC を有線で接続した状態で scrcpy.exe を実行するだけ。
録画する場合は、Mac同様コマンドラインから実行する。

無線接続をする方法

```
# まだ有線でつないだ状態

# adb は解凍した中にあります。
# Quest の IP を確認する
$ adb shell ip addr show wlan0

$ adb tcpip 5555

# ここでケーブルを抜く
$ adb connect さきほど取得したIP:5555
```

これで、scrpy を実行すると、無線状態で映像を取得できます。
Mac では、無線状態での挙動が不安定であまり使えそうにありませんでした。

Windows の場合は、挙動は問題ないのですが
録画終了時に Ctrl + C で正常に終了できず、正しい mp4 が生成されないため
$ adb disconnect をする必要がある。（別のコマンドプロンプトを開いて、adb disconnect する）

配信をする場合は、録画ではなく、画面に表示したものを OBS で取り込んで使う。片目部分だけ使うなどする。


###5. 番外 [ALVR](https://github.com/polygraphene/ALVR) を使う
#####必要なもの : PC版VRゲームを動かせるスペックのPC
ALVR は Steam VR をリモートプレイするものです。
最近の Alpha バージョンで、Oculus Quest にも対応したため
Oculus Quest で PC版の VRゲームが遊べるようになりました。
リモートプレイなので、わずかに遅延があります。
ALVR の設定については、github の手順を参考に。

PC版のVRゲームをやっているだけなので、Steam VR でディスプレイミラーしたものを OBS にとりこんで使う。
もはや Oculus Quest で遊ぶの域を超えているので、番外とした。
基本的なクラスの定義と各メソッドの呼び出し

#達成したいこと

以下の文章をターミナルに表示させる。

```
掛けた瞬間、それとわかる首振り
私は「ライギョ」が大好きです
日本には「カムルチー」「ライヒー」「コウタイ」が生息しています
```

#クラスの定義確認

1.クラスFishを以下のように定義していく

クラス変数   

| 変数  |    値 |    
|:-----|------:|
| type | ライギョ |     

インスタンス変数

| 変数 | 値 |    
|:----|---:|
| argus  | 　カムルチー　| 
| maculata  | ライヒー　| 
| asiatica  | コウタイ　| 

    

クラスメソッド

| メソッド名 | 処理 |    
|:----|---:|
| head_shake  | "掛けた瞬間、それとわかる首振り"　とターミナルに出力する|  

インスタンスメソッド

|         メソッド名　　    　　 |         処理               |    
|:-----------------------|---------:|
|  introduction       | "私は「type(クラス変数)」が大好きです"とターミナルに出力する　  |   
|    tell_difference    | "日本には「argus(インスタンス変数)」「maculata(インスタンス変数)」「asaitica(インスタンス変数)」が生息しています"とターミナルに出力する　|  
 
#手順

###1,クラスとクラス変数の定義
```ruby

class Fish
  @@type = "ライギョ"
end
```
クラス名は頭文字を大文字にし、クラス変数は@が２つであることを忘れず。

###2,Fishクラスのインスタンスを生成
```ruby

class Fish
  @@type = "ライギョ"
end

fish = Fish.new
```
インスタンスの生成はこのあとインスタンスメソッドを呼び出す際に必要不可欠。

###3,インスタンス変数の定義
```ruby
class Fish
  @@type = "ライギョ"

  def initialize
    @argus = "カムルチー"
    @maculata = "ライヒー"
    @asiatica =　"コウタイ"
　end
end

fish = Fish.new
```
initializeメソッドを使用。
これでインスタンス変数はインスタンス(fish)が生成されたときに定義された。
もちろん、

```ruby
class Fish
  @@type = "ライギョ"

  def initialize
    @argus = "カムルチー"
    @maculata = "ライヒー"
    @asiatica =　"コウタイ"
　end
end

fish = Fish.new
fish.snakehead
```
みたいな感じにオリジナルのメソッド名をつけて後から処理を行わせることも可能です。
###4,クラスメソッドとインスタンスメソッドの定義
```ruby
class Fish
  @@type = "ライギョ"

  def initialize
    @argus = "カムルチー"
    @maculata = "ライヒー"
    @asiatica =　"コウタイ"
　end
  
 def self.head_shake
    puts "掛けた瞬間、それとわかる首振り"
 end

 def introduction
   puts "私は「#{@@type}」が大好きです"
 end

 def tell_difference
  puts "日本には「#{@argus}」「#{@maculata}」「#{@asiatica}」が生息しています"
 end

end

fish = Fish.new
```

これでメソッドの定義が完了しました。
クラスメソッドには_self._をつけます。呼び出す際の記述がインスタンスメソッド とは異なるので注意です。

###5,メソッドの呼び出し（完了！）
では一気にメソッドを呼び出していきます。

```ruby
class Fish
   @@type = "ライギョ"

 def initialize
   @argus = "カムルチー"
   @maculata = "ライヒー"
   @asiatica = "コウタイ"
 end
  
 def self.head_shake
    puts "掛けた瞬間、それとわかる首振り"
 end

 def introduction
   puts "私は「#{@@type}」が大好きです"
 end

 def tell_difference
  puts "日本には「#{@argus}」「#{@maculata}」「#{@asiatica}」が生息しています"
 end

end

fish = Fish.new
Fish.head_shake
fish.introduction
fish.tell_difference
```

###感想
久々にRubyのアルゴリズム問題を解いていて、理解が曖昧になっていたのに気が付いた。
慣れてないので記事書くのに２hほどかかってしまうが、確実に覚わるのでいいね。


###※追記　initializeメソッドに引数を渡すパターン
```ruby
class Fish
  @@type = "ライギョ"

  def initialize(name1, name2, name3)
    @argus = name1
    @maculata = name2
    @asiatica = name3
  end

def self.head_shake
   puts "掛けた瞬間、それとわかる首振り"
end

def introduction
  puts "私は「#{@@type}」が大好きです"
end

def tell_difference
 puts "日本には「#{@argus}」「#{@maculata}」「#{@asiatica}」が生息しています"
end

end

fish = Fish.new("カムルチー", "ライヒー", "コウタイ")
Fish.head_shake
fish.introduction
fish.tell_difference
```
ファンクションジェネレータ　WF1947/1948　ドライバのダウンロード方法・探し方


#はじめに
　この記事では、ファンクションジェネレータのデバイスドライバダウンロード方法を記載します。先日、幣研究室でデバイスドライバをダウンロードした際に手間取ったので、備忘録がてらまとめておきたいと思います。

#目次
- ファンクションジェネレータとは
- WF1947/1948用デバイスドライバのダウンロード




#ファンクションジェネレータとは

>ファンクションジェネレータ（function generator）とは、任意の周波数と波形を持った交流電圧信号を生成することのできる電気計測器である。
:Wikipedeaより引用

　このように、ファンクションジェネレータとは任意の波形を生成する機械です。とはいっても知っている人はわかりますが、知らない人はわからないと思います。理系のちょっと勉強した人に向けて説明するならば、『音や光を出す時に、その基となる波形(声紋や光の明るさを表す波)を自分好みに設定してスピーカーやライトに送る機械です。』普通に生活している分には使わないですが、信号処理の研究だったりしていると、とても便利です！

　という事で、この記事ではこのファンクションジェネレータをPCから使うために必要となるデバイスドライバのダウンロード方法をまとめます。今回紹介するファンクションジェネレータ(FG)は、エヌエフ回路設計ブロック社さんのWF1947/1948の物となります。こちらのデバイスドライバはNational Instruments社から提供されていますので、その説明を行います。


#WF1947/1948用デバイスドライバのダウンロード
　前項で書いた通り、WF1947/1948のデバイスドライバはNational Instruments社から提供されています。そのため、製造元とは異なるため、注意が必要です。

　ダウンロード方法としては、『NIドライバ』とググります。すると、『NIドライバのダウンロード』というページが見つかると思います。そこから、『NI-VISA』というドライバを選択し、最新版をダウンロードすれば、問題ありません。

#最後に
　デバイスドライバのダウンロード方法と銘打ちましたが、簡単な簡単なググり方を載せるにとどまりました。ただ、ダウンロード自体はあまり難しくないと思います。
SQL DeveloperのData Modelerでデータベースに接続してテーブルの構造を出力する

**■■■Oracle Cloudのウェビナーシリーズは→[こちら](https://bit.ly/2VJS8pU)■■■**

SQL Developerには、データモデリング作業を支援するData Modelerというツールが内包されています。
昔からある機能なので、特段新しい話...というわけではないのですが、最近機会があったので。

出力例): Oracle Autonomous Data Warehouseのサンプルスキーマである SSB にあるテーブル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297987/23db19aa-de4d-a498-c683-8ff94f36e4ac.png)

# 作成方法

SQL Developerを起動し、
**ファイル > Data Modeler > インポート > データ・ディクショナリ**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297987/0aa8db6b-e4bd-859e-5ebd-5b0f01efc817.png)


**ウィザードに従って、接続先のデータベース、スキーマ、出力したいテーブル名を指定**します。
![スクリーンショット 2019-06-01 16.46.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297987/55ff1547-0a0c-8187-2840-37fa2524a1c0.png)


すると、以下のように欲しいテーブルの構造が得られます。FK（外部キー制約）が張られている場合はリレーションも描かれるので、ER図っぽくなります。

**図としてファイル出力するには、ウィンドゥ内で右クリック → 「ダイアグラムの印刷」**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297987/a7555aab-f3ad-c77c-1e8e-72b3bb5357a7.png)

イメージファイル(PNG等)や、PDF, SVG, HTMLが選択できます。

# 最後に

Oracle Cloud の Autonomous Database なら、SQL DeveloperのWeb版（ブラウザベースのSQL Developer Web）が、すぐに利用できます。Web版でも、この Data Modeler 使えます。使い方はこちらから↓
- [Oracle Cloud Infrastructure の Autonomous Databaseで使える SQL Developer Web (ブラウザベース)](
https://qiita.com/mikika/items/c16842e19aed0e1b90d9#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%A2%E3%83%87%E3%83%A9%E3%83%BC%E3%82%82%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B)
シェルスクリプトにおける　ダブルクォートとシングルクォートとバッククォートの扱い

Linux CentOS7でシェルスクリプトを書き始めた初心者向けです。
戒めを込めてシングルクォート、ダブルクォート、バッククォートの扱いについて書き残しておきます。

‘：シングルクォート：囲った中身を文字列として出力する
“：ダブルクォート：囲った変数の中身を文字列として出力する
`：バッククォート：囲った変数の中身をコマンドとして処理し、その結果を出力する

ミスはgetoptsコマンドを使いオプション処理の過程でshiftコマンドを使ったときに発生しました。shift 数値　に対しシングルクォートを用いたためにエラーになりました。原因がわからず時間を食ってしまいました...

私と同じように参考書で見間違わないように....
WSL上のコマンドがKasperskiに弾かれる

# 問題
gitなどのコマンドがネットワーク接続に失敗する。
環境はWindows 10 Home内のUbuntu 18.04LTS(WSL)。
セキュリティソフトはKaspersky 19.0.0.1088を使用。
私自身はaptやnpmは失敗しないが、失敗する環境もあるらしい。

例えばgit cloneが以下のように失敗する。

```
fatal: unable to access 'https://github.com/hoge/piyo': gnutls_handshake() failed: The TLS connection was non-properly terminated.
```

# 原因
なぜかと思いながら検索していたところ、[WSLが9月頃からおかしくなった...](https://qiita.com/Y_Aowashi/items/d355d90945305d925a3c)がヒットした。
どうも443(https)と80(http)のポートがKasperskyに監視されていて、そこで何かしらの不具合が起こっているか、パケットが落とされているのではないかという気がする。

# 解決
一般的な対策はKasperskyを終了すること、[先述の記事](https://qiita.com/Y_Aowashi/items/d355d90945305d925a3c)ではこれらのポートの監視を無効にすること、ですり抜けていた。
私自身はgitだけで問題が起こっているので、gitコマンドで使うプロトコルをhttpsではなくsshにすることで抜けることができた。

公開鍵を新しく作る場合には以下のようなコマンドで公開鍵暗号のキーペアを作る。

```
ssh-keygen -t rsa -b 4096
```

その後、```~/.ssh/id_rsa.pub```の内容をgithubの、[Settings -> SSH and GPG keys](https://github.com/settings/keys)からNew SSH keyボタンを押して登録する。
私自身はecdsa 521を使ってキーペアを作ったが、このへんは安全だと言われている暗号アルゴリズムと鍵長を選んでほしい。

あとはgit cloneをするときのURLを以下のように変更する。
もとは```https://github.com/hoge/piyo```や```https://hoge@github.com/hoge/piyo```のように記述していたものを、

```
git clone git@github.com:hoge/piyo.git
```

とすればよい。
これでうまく行っているということは、おそらくhttp/httpsのポート監視は厳しすぎて弾かれるものがあるが、sshが使う22番は監視が厳しくない（あるいはsshプロトコルのやり取りをKasperskyが安全だとみなしている）のではないだろうか。
maven installで「Perhaps you are running on a JRE rather than a JDK?」

maven installを実行した時にタイトルのエラーが発生しました。
> 「No compiler is provided in this environment.Perhaps you are running on a JRE rather than a JDK?」

説明の通り、jreでなくjdkのパスを選択すればこのエラーは解決。

**でも実はパスを変更しなくても通る場合がある。**理由はわからないですすみません。

ビルド・パス→ソースタブ→
src/main/resources
が除外(**)されてないか確認する。
ここが除外になっている場合、除去ボタンを押下して(なし)の状態にした後、再度maven installを実行すると通った。

# 環境
- STS4
- jre1.8
- jdk1.8
- maven2
クリックするとボタンのvalue属性を変更するDOM

おはこんばんちわ。
気付いたら厄過ぎてた、プログラミング初学者のオジサンです。

現在、JavaScriptでミニアプリを作成しています。
そのアプリでは、クリックするとそのボタンのvalue属性を変更させる機能があります。

今回はボタンをクリックすると、「O」が「X」に、「X」が「O」に変わるコードを作ってみました。

##1.HTML（index.html）
今回はボタンをDOMで作ります。
そのため、bodyタグの中にはJavaScriptを呼び出すscriptタグしかありません。
このようなコードばっかり書いてたおかげか、だいぶDOMを理解できるようになりました。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>クリックしたボタンのvalueを変える</title>
  <link rel="stylesheet" href="css/styles.css">
</head>
<body>
  <script src="js/main.js"></script>
</body>
</html>
```

##2.CSS（css/styles.css）
なくてもいいのですが、テストするときの見やすさが欲しいので、少しボタンの体裁を整えました。

```css
/* ボタンの体裁を整える */
input {
  display: flex;
  margin: 10px;
}
```

##3.JavaScript（js/main.js）
最初のパラグラフはDOMでinputタグを作ってます。
createElement()でinputタグを作り、setAttribute()でtype属性とvalue属性を付け、最後にappendChild()でbodyタグの子要素に入れてます。これをfor文で4回繰り返し。
なお、初期設定としてボタンは「O」にしています。

```javascript
  // Aボタンを４つ作り、bodyタグの子要素に入れます
  for (let i = 0; i < 4; i++) {
    const input = document.createElement('input');
    input.setAttribute('type','button');
    input.setAttribute('value','O');
    document.body.appendChild(input);    
  }
```
次のパラグラフでボタンを変えるコードを書いてます。
まず、querySelectorAll()を使って、inputのNodeListを取得します。
そしてfor文を使って、クリックされたNodeを探すaddEventListenerを入れました。
その後、if文でクリックされたNodeのvalue属性によってボタンを切り替えるコードを書いています。

```javascript
  // ボタンがAならBに、BならAならにします
  const input = document.querySelectorAll('input');
  for (let i = 0; i < input.length; i++) {
    input[i].addEventListener('click', ()=> {
      if (input[i].value == 'O') {
        input[i].value = 'X';
      } else {
        input[i].value = 'O';
      }
    });
  }
```
##4.最後に
うまくコードの説明ができていないところがあるかもしれないので、後で見直そうと思います。
もし、分かりにくいところがありましたら、ご指摘いただきますと助かります。

拙文に最後までお目通しいただき、ありがとうございました！
Rails Consoleの使い方_まだメモ用です。

#Ruby Consoleの使い方
rails console で確認
user1 = User.find(1)
micropost1 = Micropost.find(1)

#favoritesテーブルに保存されるか確認
user1.like(micropost1)

#trueが返り値となるか確認
user1.favpost?(micropost1)

#favoritesテーブルから削除されるか確認
user1.unlike(micropost1)
micro:bitで時間経過を扱う方法

micro:bitで時間経過を扱う方法を紹介します。

■micro:bitで時間経過を扱う方法
入力＞その他＞で稼働時間(ミリ秒)ブロック、もしくは稼働時間(マイクロ秒)ブロックを利用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71746/f0394795-4504-0466-c733-6a1e958717a6.png)


稼働時間は電源オンにしてからの時間なのでプログラムの動きとは連動していません。

ステップ１：計りたい時間のスタートタイミングの稼働時間ブロックの値を変数に保存(たとえばストップウォッチアプリならスタート時)
ステップ２：ある時間経過後、その時点で　経過後の稼働時間ブロックの値から保存した変数の値を引くと経過時間がわかる

■サンプルコード
下記ではスタートタイミングの稼働時間(ミリ秒)を変数"Starttime"、その後の経過時間は"Time"としています。
"Time"はずっとのループ内にいるため、常に更新されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71746/7c9de187-f72d-2c47-ea95-57be9b7386eb.png)
スタイルシート

# 自動カーニング


```css:スタイルシート
font-feature-settings : "halt";
```

# iOSで滑らかなスクロール

__-webkit-overflow-scrolling__


```css:スタイルシート
.content {
  overflow: scroll;
  -webkit-overflow-scrolling: touch;
}
```

# Safari（Webkit）向けに、フォントのレンダリングを調整

Safari（Webkit）向けに、フォントのレンダリングを調整

```css:CSS
-webkit-font-smoothing: none;
-webkit-font-smoothing: antialiased;
-webkit-font-smoothing: subpixel-antialiased; /* Safari での Default値 */
```


# IE10ではテキストフォーム入力時に「クリアボタン」や「パスワード確認ボタン」非表示

__概要__

IE10ではテキストフォーム入力時に「クリアボタン」や「パスワード確認ボタン」が表示されます。
消す場合は下記スタイルシートを指定します。

__:-ms-clear , :-ms-reveal__


![ms-clear.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43894/3de77b24-0a9f-4a41-5baf-6906f59528de.jpeg)


__スタイルシート__

```css
input::-ms-clear { // クリアボタン非表示
    display:none;
}
input::-ms-reveal {// パスワード確認ボタン非表示
    display:none;
}
```

# テキスト入力時のIMEの状態を指定する（IE独自仕様）

__ime-mode__


__プロパティ値__

|プロパティ値 |説明 |
|---|---|
|auto	|特に指定しません。|
|active	|初期値が日本語入力モードになります。|
|inactive	|初期値が英数字入力モードになります。|
|disabled	|英数字入力モードになります。ユーザーの操作によるモードの変更はできません。|

```html
<input style="ime-mode: auto;" type="text" />
<input style="ime-mode: active;" type="text" />
<input style="ime-mode: inactive;" type="text" />
<input style="ime-mode: disabled;" type="text" />
```

# モバイル端末、テキストの自動拡大制御

__概要__

モバイル端末で横向きにした時に、テキストが自動拡大するのを防ぐ

```css:CSS
-webkit-text-size-adjust: 100%;
```

# 英語テキストの大文字、小文字指定

__text-transform__

英語テキストの大文字表示、小文字表示を指定する際に使用

__プロパティ値__

|プロパティ値|説明|
|------------|-------------|
| none | 記述した通りに表示します。これが初期値です。 |
| capitalize | 単語の先頭文字を大文字で表示します。 |
| lowercase | 全てを小文字で表示します。 |
| uppercase | 全てを大文字で表示します。 |
| initial | デフォルト値には、このプロパティを設定します。 |
| inherit | 親要素からこのプロパティを継承します。 |

# iPhoneリンクを長押しした時のポップアップメニューを出さない


__-webkit-touch-callout__


__プロパティ値__

|プロパティ|説明|
|---|---|
|default|記述した通りに表示します。これが初期値です。|
|none|呼出を無効にします。|
|inherit|親要素からこのプロパティを継承します。|

__スタイルシート__

```css
-webkit-touch-callout:default;
-webkit-touch-callout:none;
-webkit-touch-callout:inherit;
```


# フォント指定

```css:CSS
@font-face{
	font-family: "Original Yu Gothic";
	src: local("Yu Gothic Light"),local("游ゴシック Light");
	font-weight: 300;
}
@font-face{
	font-family: "Original Yu Gothic";
	src: local("Yu Gothic Medium"),local("游ゴシック Medium");
	font-weight: 500;
}
@font-face{
	font-family: "Original Yu Gothic";
	src: local("Yu Gothic bold"),local("游ゴシック bold");
	font-weight: bold;
}
@font-face {
	font-family: "Helvetica Neue";
	src: local("Helvetica Neue Regular");
	font-weight: 100;
}
@font-face {
	font-family: "Helvetica Neue";
	src: local("Helvetica Neue Regular");
	font-weight: 200;
}

html {
	font-family: -apple-system, BlinkMacSystemFont, "Original Yu Gothic", "Yu Gothic", YuGothic, Verdana, "Hiragino Kaku Gothic ProN","メイリオ", "M+ 1p",Osaka, sans-serif;
}
```
[機械学習の勉強1日目]超入門

何から初めていいかわからず、まずは入門記事を読む。

●機械学習超入門(わかりやすい)
https://qiita.com/ishizakiiii/items/d422019b52d973e0e28d

●AI、機械学習、ディープラーニングの違いを説明できますか？機械学習と統計の違いは？
https://markezine.jp/article/detail/29471?p=3

●日本国内でのディープラーニング成功事例４選
https://nissenad-digitalhub.com/articles/ai-for-deep-learning-japanese-examples/

●【保存版・初心者向け】独学でAIエンジニアになりたい人向けのオススメの勉強方法
https://qiita.com/tani_AI_Academy/items/4da02cb056646ba43b9d


どこから手をつけたらいいのかと悩んだものの、必要追うな素養として以下６つ
出てきました。①⑤⑥はある程度何とかなりそうですが、②③④がヘビーです。
数学やろうとして続かなかったことがあるので、②③④を並行して進めようと思います。

①プログラミングスキル
②数学
③統計の知識
④機械学習の基礎知識
⑤SQLを使ってデータベースを操作する知識
⑥クラウドの知識
LaTeXでタイプライター風に ”_” (アンダーバー)を出力する方法

# _を素直にエスケープして書くとどうなるか

LaTeXでは アンダーバー(アンダースコア)`_` は下付き文字を表すのでエスケープして `\_`とするのだが、素直に

```tex:tex
{\tt under\_bar}
```

と書いて出力するとアンダーバーがタイプライター調にならない、、(QiitaではLaTeXではなくMathJaxを使っていてこの方法でうまくいったのでここでは表示していない)
これは、LaTeXでは`\_`によるアンダーバーが線分として定義されていて、フォントという概念がそもそも存在しないためらしい。


# 解決法

入力した文字をそのまま出力するコマンド`\verb|foo|`を使って

```tex:tex

{\tt \verb|under_bar|}
```

とすれば

```math

\texttt{under}\_\texttt{bar}
```

とアンダーバーもタイプライター調になって出力される!
初夏のJavaScript祭2019 in メンバーズキャリア 発表資料まとめ

## JavaScript祭？
https://javascript-fes.doorkeeper.jp/events/90894
今年で6年目になるJavaScriptのイベントです！
チケットは全て懇親会付きで、ビールを飲みながらJavaScriptを語れます！

### 日時
2019-06-01（土）14:30 - 20:00

### 会場
株式会社メンバーズキャリア 
東京都品川区西五反田７丁目２５−５

### 公式Twitter
[@javascript_fes](https://twitter.com/javascript_fes)

### ハッシュタグ
[#jsfes](https://twitter.com/search?q=%23jsfes)

## 発表

### jQueryからElmまで
- Izumiさん[@sy_izumi](https://twitter.com/sy_izumi)
- [ブログ](http://izumisy-tech.hatenablog.com/)
- [発表資料（SpeakerDeck）](https://speakerdeck.com/izumisy/jquerykaraelmmade)

### SemanticUIを使って工数をかけずにサービス開発
- フジワラさん [@Fujiyama_Yuta](https://twitter.com/Fujiyama_Yuta)
- [発表資料（SpeakerDeck）](https://speakerdeck.com/fujiyamayuta/semanticuiwoshi-tutegong-shu-wokakezunisabisukai-fa)

### Nuxt.js × Atomic Designのサービスデザインフロー
- 井村さん [@imura_design](https://twitter.com/imura_design)
- [発表資料（SpeakerDeck）](https://speakerdeck.com/keisukeimura/nuxt-dot-js-x-atomic-designfalsesabisudezainhuro)

### Gridsome で作る JAMStack な サーバーレス Web Front
- lulzneko (ラルズネコ)さん [@lulzneko](https://twitter.com/lulzneko)
- [発表資料](https://riotz.works/slides/2019-javascript-matsuri/)
- [ブログ](https://riotz.works/articles/2019/06/01/made-presentation-about-jamstack-with-gridsome-at-javascript-matsuri/)

### SSRを検討する際にSSGも検討しませんか？
- もっとさん [@mottox2](https://twitter.com/mottox2)
- [発表資料（SpeakerDeck）](https://speakerdeck.com/mottox2/ssr-or-ssg)
- [ブログ](https://mottox2.com/posts/340)

### JavaScript初心者が紹介するデバイスやアプリで楽しむIoT
- 豊田さん [@youtoy](https://twitter.com/youtoy)

## LT枠

### Finally Riot.js @4 has been released
- Riotお兄さん [@kuwahara_jsri](https://twitter.com/kuwahara_jsri)
- [発表資料（SpeakerDeck）](https://speakerdeck.com/clown0082/finally-riot-dot-js-at-4-has-been-released)

### How to control the behavior of JavaScript imports
- しずひこさん [@sizuhiko](https://twitter.com/sizuhiko)
- [発表資料（SpeakerDeck）](https://speakerdeck.com/sizuhiko/jsfes-2019-06)
Rspecの導入手順

## はじめに
新しいプロジェクトを作成するさいにrspecの導入手順を毎回調べるのが面倒だったのでメモがてら残しておきます。

## 前提
・Ruby on Rails 5.2.3
・Ruby 2.5.1
・```rails new``` した直後の状態であること(controller、model等が作成されていない状態である)

## Gemfileへ追加
何はともあれGemfileへ追加しなければはじまらない。

```ruby:Gemfile
group :development, :test do
  gem 'rspec-rails', '~> 3.6.0'
end
```
本番環境(デプロイした状態)ではテスト実行することはないため、development、testへ上記コードを追加してください。

```
$ bin/bundle install
```

bundle installを実行し、rspecをインストールします。

## テストデータベースの作成
もしテスト用データベースの設定をしていなければ設定する必要があります。

```:database.yml
test:
  <<: *default
  database: hogehoge_test
```

test箇所にdatabase名を設定しましょう。(hogehogeの箇所は自分のプロジェクトによって適宜修正)

```
$ bin/rails db:create:all
```
rails:db:createの実行。
allをつけることによってdatabase.ymlに記述している全てのデータベースの作成ができます。


##Rspecの設定
Rspecをインストールしていきます。

```
$ bin/rails db:create:all
```
無事インストールされると下記４つのファイルが生成されます。

```
      create  .rspec
      create  spec
      create  spec/spec_helper.rb
      create  spec/rails_helper.rb
```

それぞれ、Rsepc用の設定ファイル(.rspec)、Rspec関連のファイルが格納されていくディレクトリ(spec)、Rspecのヘルパーファイル(spec_helper.rb、rails_helper.rb)になります。

また、好みで以下の設定を.rspecファイルに追加していきます。

```:.rspec
--require spec_helper
--foramat documentation
--warning
```

## bintstubの設定
springを利用してRspecのテスト時間を短縮するための設定をしていきます。（ここら辺は設定しなくても大丈夫です）

```:Gemfile
group :development do
  gem 'spring-commands-rspec'
end
```

bundle installの実行

```
$ bin/bundle install
```

bintstupの設定

```
$ bundle exec spring bintstub rspec
```

## 正常にインストールされているか確認
以下のコマンドでRspecがインスールできているかどうか確認できます。

```
$ bin/rspec
```

あとは普通にmodel、controller等を追加、rspecコマンドでテスト生成をできるようになります。

### 参考文献
- Everyday Rails - RSpecによるRailsテスト入門
ハードリンクとシンボリックリンクのメモ

それぞれ実行したときのdfの結果が気になったのでメモ。
仕様を考えると、当然の結果といえるが、検証が大事。

##ハードリンクを作成する
dfの結果は変わらない。
inodeは同じで、元データが同じだから、増えないのだろう。

```shell
# ls -li base*
77 -rw-------. 2 root root 51313888  5月  3  2018 base
# df -h | grep boot
/dev/sda1                1014M  251M  764M   25% /boot
# ln base baseh
# ls -li base*
77 -rw-------. 3 root root 51313888  5月  3  2018 base
77 -rw-------. 3 root root 51313888  5月  3  2018 baseh
# df -h | grep boot
/dev/sda1                1014M  251M  764M   25% /boot
```


##シンボリックリンクを作成する
dfの結果は変わらない。
リンクファイルの分だけ増えていると思われる。
ハードリンクの場合も、実は微妙に増えている？？覚えていたら調べてみる。

```shell
# ln -s base bases
# ls -li base*
 77 -rw-------. 3 root root 51313888  5月  3  2018 base
 77 -rw-------. 3 root root 51313888  5月  3  2018 baseh
100 lrwxrwxrwx  1 root root        4  6月  1 16:10 bases -> base
# df -h | grep boot
/dev/sda1                1014M  251M  764M   25% /boot
```

##コピーする
dfの結果は、コピーした分だけ増えている。

```shell
# cp base basec
# ls -li base*
 77 -rw-------. 3 root root 51313888  5月  3  2018 base
101 -rw-------  1 root root 51313888  6月  1 16:15 basec
 77 -rw-------. 3 root root 51313888  5月  3  2018 baseh
100 lrwxrwxrwx  1 root root        4  6月  1 16:10 bases -> base
# df -h | grep boot
/dev/sda1                1014M  300M  715M   30% /boot
```
【JavaScript】jQueryをnativeに移行

#jQueryをnativeに移行

__概要__

jQueryに依存しないJavaScript開発をするための置き換え方法

``` js
jQuery.noConflict();
var j$ = jQuery;
```

## AJAX

__JSON__

__jQuery__

```js
$.getJSON('/my/url', function(data) {

});
```
__IE9+__

```js
var request = new XMLHttpRequest();
request.open('GET', '/my/url', true);

request.onload = function() {
  if (request.status >= 200 && request.status < 400) {
    // Success!
    var data = JSON.parse(request.responseText);
  } else {
    // We reached our target server, but it returned an error

  }
};

request.onerror = function() {
  // There was a connection error of some sort
};

request.send();

```

## POST

__jQuery__

```js
$.ajax({
  type: 'POST',
  url: '/my/url',
  data: data
});

```

__IE8+__

```js
var request = new XMLHttpRequest();
request.open('POST', '/my/url', true);
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
request.send(data);

```

## Request

__jQuery__

```js
$.ajax({
  type: 'GET',
  url: '/my/url',
  success: function(resp) {

  },
  error: function() {

  }
});

```

__IE9+__

```js
var request = new XMLHttpRequest();
request.open('GET', '/my/url', true);

request.onload = function() {
  if (request.status >= 200 && request.status < 400) {
    // Success!
    var resp = request.responseText;
  } else {
    // We reached our target server, but it returned an error

  }
};

request.onerror = function() {
  // There was a connection error of some sort
};

request.send();

```

## EFFECTS

__Fade In__

__jQuery__

```js
$(el).fadeIn();
```

__IE9+__

```js
function fadeIn(el) {
  el.style.opacity = 0;

  var last = +new Date();
  var tick = function() {
    el.style.opacity = +el.style.opacity + (new Date() - last) / 400;
    last = +new Date();

    if (+el.style.opacity < 1) {
      (window.requestAnimationFrame && requestAnimationFrame(tick)) || setTimeout(tick, 16);
    }
  };

  tick();
}

fadeIn(el);
```

__Hide__

__jQuery__

```js
$(el).hide();
```

__IE8+__

```js
el.style.display = 'none';
```

__Show__

__jQuery__

```js
$(el).show();
```

__IE8+__

```js
el.style.display = '';
```
numpy 多項式関連　python

#poly
polyは、与えられた根の配列を持つ、多項式の係数を返す。
 
```py
print(numpy.poly([-1, 1, 1, 10]))        #Output : [  1 -11   9  11 -10]
#-1, 1, 1, 10を根とする多項式は x^4-11x^3+9x^2+11x-10=0
```

#roots
rootsは、指定された係数を持つ多項式の根を返す。

```py
print(numpy.roots([1, 0, -1]))           #Output : [-1.  1.]
#x^2-1 = 0　の根は 1, -1
```

#polyint
polyintは、多項式の不定積分を返す。

```py
print(numpy.polyint([1, 1, 1]))          #Output : [ 0.33333333  0.5         1.          0.        ]
#x^2+x+1をxに関して不定積分すると1/3x^3 + 1/2x^2 + x + C（Cは積分定数）Cは、デフォルトでは0にされる
```

#polyder
polyderは、多項式の導関数を返す。

```py
print(numpy.polyder([1, 1, 1, 1]))       #Output : [3 2 1]
#x^3+x^2+x+1をxに関して微分すると、3x^2+2x+1
```

#polyval
polyvalは、特定の値で多項式を評価する。

```py
print(numpy.polyval([1, -2, 0, 2], 4))   #Output : 34
#x^3-2x^2+2に、x=4を代入した結果は34
```
【JavaScript】jQuery

# ajaxを途中で止める

__概要__

Ajax通信を途中で止めたい場合

__スクリプト__


Ajax通信を変数「request」

```js:jQuery
request = $.ajax({
  url: xxx.xml,
  type: "GET",
  dataType: "xml",
  timeout: 10000,
  cache: false,
  error: function(){
    // 失敗したとき
  },
  success: function(xml){
    // 成功したとき
  }
});

```

__停止方法__

停止したい場合「request」をabort

```js
request.abort();
```

---

# Ajaxで画像アップロード

jQueryのAjaxで画像をアップロードする場合

__使用方法__

```js
var formData = new FormData( $('form')[0] );
var url = 'test_api.php';

var opt = {
    type: 'POST',
    url: url,
    dataType: 'json',
    timeout: 10000,
    cache: false,
    data: formData,
    processData: false,// Ajaxがdataを整形しない指定
    contentType: false // contentTypeもfalseに指定
};

$.ajax(opt).done(function (response, textStatus, jqXHR) {
    //通信が成功したとき
}).fail(function (jqXHR, textStatus, errorThrown) {
    //通信に失敗したとき
}).always(function (jqXHR,json) {
    //通信が完了したとき
});
```

__解説__

jQueryのAjax通信する場合、jQueryがPOSTデータを整形するため、整形しない設定にする必要があります。

---

#要素が削除された時のカスタムイベント

__概要__
jQueryで要素が削除された時にイベントを発火させる

__スクリプト__
** JavaScript **

```js
(function($){
    ////////////
    $.event.special.onremove = {
        remove: function(o) {
            if (o.handler) {
                o.handler.apply(this, arguments);
            }
        }
    };
})(jQuery);
```

__使用方法__


```js
$(element).on('onremove',function(e){
	//要素が削除されたあとの処理
});
```

---

# jQueryとprototypeの両方を使う時にやるべきこと

__概要__

jQuery.jsとprototype.jsの両方をサイトで使用している場合
jQuery側の「$」関数を別の名前にする

```js
jQuery.noConflict();
var j$ = jQuery;
```

__使用方法__

```js
j$(function(){
	//処理
});
```

---

# カスタムイベント

__概要__

jQueryでカスタムイベントを使用する場合

__スクリプト__

「customEvent」というイベントを作成しましす。

```js
//イベント設定
$(window).on('customEvent', function() {
  //イベント処理
});

//発火
$(window).trigger('customEvent');

```
特異クラスってなんでしょう。

#特異クラスについて考える前に
特異クラスについて学ぶ前に、まずは特異メソッドとメソッド探索について知っておく必要があります。

##特異メソッドとは
特定のオブジェクトに対して定義されたメソッドのことです。

```ruby:qiita.rb
wareki = "heisei"

def wareki.is_reiwa?
  self == "reiwa"
end

wareki.is_reiwa? #=>false
```
ここで定義したwareki.is_reiwa?はStringクラスの他のオブジェクトに影響を及ぼすことはありません。warekiというオブジェクト(正確には"heisei")に対してのみ適用されるメソッドです。
特異とは普通と異なり特別なことです。特異メソッドはその言葉通り、普通のメソッドとは異なり、特別に定義されたメソッドのことです。
(英語ではsingular methodと呼称されている。singularには「個別の」という意味があるので、「個別に定義されたメソッド」と理解する方がしっくり来るかもしれません)


#クラスメソッドと特異メソッドの関係
```ruby:qiita.rb
class Hoge
  def self.class_method_a
    puts "class_method_a"
  end
end

Hoge.class_method_a #=> "class_method_a"
```
プログラミング言語を少しでも触ったことのある人なら、上のコードが何をやっているかわかると思います。
Hogeクラスにclass_method_aクラスメソッドを定義しています。
これを先の特異メソッドと見比べてみてください。

「なんか似てない？」

実はクラスメソッドも一種の特異メソッドなのです。

「え？でも特異メソッドってオブジェクトに対して定義するものじゃないの？」
「クラスってオブジェクトじゃなくね？」

と思うかもしれないが、実はクラスもオブジェクトです(ややこしい)。
もっとややこしい言い方をすると「HogeクラスはClassクラスのオブジェクト」です。

クラスメソッド = Hogeクラス(Classクラスの「オブジェクト」)に定義されたメソッド
特異メソッド = 特定のオブジェクトに対して定義されたメソッド
クラスメソッド == 特異メソッド

以上のことからクラスメソッドも特異メソッドの一種なのです。


# メソッド探索
メソッド探索とは、その名の通り、呼ばれたメソッドを探すことです。

```ruby:ruby.rb
class A
  def hoge
    puts "hoge"
  end 
end

class B < A; end

obj_b = B.new
obj_b.hoge #=> "hoge"
```

obj_bがhogeを呼んだ時rubyの中では何が起こっているのでしょうか。
rubyは以下の２つのことを行います。

・メソッドを探す(メソッド探索)
・メソッドを実行する

ではメソッド探索をする時、rubyはどのように動いているのでしょうか。

※レシーバ : 呼び出したメソッドが属するオブジェクト。hogeで言うobj_b
rubyはレシーバの「クラス」に入り、目的のメソッドが見つかるまで継承チェーンを上っていきます。

「ん？レシーバのクラスに入る？」
「レシーバ自体は探索しないの？」

そうです。メソッド探索はレシーバのクラスから探索を始めます。
ここにrubyの秘密があります。
実はオブジェクトのメソッドは全てクラスに属しており、オブジェクトはクラスが持っているメソッドを参照しているだけなのです。
だからメソッド探索は「レシーバのクラス」から探索を始めるようになっています。

obj_b.hogeの話に戻ります。
ではobj_b.hogeを呼んだ時、rubyはまず何処を探すでしょうか？

そう、obj_bのクラスであるBです。
しかし、クラスBにはhogeメソッドが定義されていません。
では次に何処を探すでしょうか？

rubyは「目的のメソッドが見つかるまで継承チェーンを上っていく」ので、次に探すのはクラスAです。
クラスAを探して、ついにhogeメソッドを見つけることができました。

以上がrubyのメソッド探索です。
ここで覚えておくべきことは

・rubyはレシーバのクラスに入り、目的のメソッドが見つかるまで継承チェーンを上っていく。
・メソッドは全てクラスが持っている。オブジェクトはクラスが持っているメソッドを参照しているに過ぎない。

以上の２つです。

# 特異クラスとは
ここからやっと本題に入ります。
特異クラスとはなんなのでしょうか。
特異クラスの存在を認識するために、まずは特異メソッドを定義してみましょう。

```ruby
class MyClass; end

obj = MyClass.new
def obj.singleton_method; puts "singleton"; end 
```

これでobjの特異メソッドとしてsingleton_methodを定義することができました。
ではこのメソッドはどこに定義されたのでしょうか。
メソッド探索のルールに従うと、rubyはレシーバのクラスに入り、目的のメソッドが見つかるまで継承チェーンを上っていきます。
ということは、singleton_methodはobjのクラスであるMyClassに定義されたということでしょうか。
いや、MyClassに定義されていたとしたら、それはMyClassのインスタンスメソッドになります。特異メソッドではありません。
では、どこに定義されたのでしょう。

ここで登場するのが特異メソッドです。
実はobjはMyClass以外にもクラスを持っていおり、それが特異クラスと呼ばれています。
特異クラスは、インスタンスのクラスを調べるためにいつも使うObject#classの結果には現れません。
Object#singleton_classを使うと特異クラスを参照することができます。

```ruby
str = "abc"
str.class #=> String
"abc".singleton_class #=> #<Class:#<String:0x00007f84af86fcf0>>
```

特異クラスには特徴が３つあります。
１つ目に、特異クラスはインスタンスを１つしか持つことができません。
２つ目に、特異クラスは継承することができません。
最後に、特異クラスはオブジェクトの特異メソッドが存在する場所です。

特異クラスの特徴を理解した上で、クラスメソッドについて考えてみましょう。
先にクラスメソッドは特異メソッドという説明をしました。
特異メソッドということは、それは特異クラスに定義されたメソッドである必要があります。
つまりクラスそのものにも特異クラスが存在するのです。

```ruby
class Hoge
  self.p
    puts "hogehoge"
  end
end
```

このようにHogeクラスに対してクラスメソッドpを定義した時、そのメソッドはHogeクラスの特異クラスに定義されます。
特異クラスはインスタンスを１つしか持つことができないので、クラスメソッドpはHogeクラスのみに適用されます。
Railsのannotateでハマった話

###環境
Ruby ruby 2.6.1p33 (2019-01-30 revision 66950)
Rails 5.2.3
annotate v2.7.5

###事象
RailsのModelを作成し、annotateを実行したところ以下エラーが発生していました。
＄RAILS_TOPはRuby on Railsのルートディレクトリです。

```Gemfile.
・・・
  gem 'annotate'
・・・
```

```.Gemfile.lock
・・・
    annotate (2.7.5)
・・・
```

```shell
$ bundle exec annotate
bundler: failed to load command: annotate ($RAILS_TOP/vendor/bundle/ruby/2.6.0/bin/annotate)
NoMethodError: undefined method `delegate' for #<Class:Rake>
Did you mean?  DelegateClass
＄RAILS_TOP/vendor/bundle/ruby/2.6.0/gems/rake-12.3.2/lib/rake/rake_module.rb:21:in `singleton class'
・・・
```

delegateというメソッドが宣言されていないというエラーのようです。。。

###解決方法

＄RAILS_TOP/vendor/bundle/ruby/2.6.0/gems/rake-12.3.2/lib/rake/rake_module.rb
に'active_support/core_ext/module'を読み込ませるようにする。

```rake_module.rb
require 'rake/application'
require 'active_support/core_ext/module'
・・・
```


全然理由がわからなかったんで調べた結果、以下フォームを見つけました。
https://stackoverflow.com/questions/27109766/undefined-method-delegate-for-capybaradslmodule


こちらを置いておきます。
![30750012.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388313/292a8348-c6f8-9c75-1262-a8a90f11c5fd.jpeg)
-初心者でもわかるエラー解決- form_forエラー　ActionController::UrlGenerationError in Posts#show

# ActionController::UrlGenerationError in Posts#show

form_forを使っていたら上記のエラーが発生しました。。。

```show.html.haml
.form
 = form_for [@odai,@post,@comment], url: odai_copy_comments_path do |f|
```


```posts.controller.rb
 def show
    @copy = Copy.find(params[:id])
 end
```

form_forの引数をコントローラーで指定してなかった。。。

```posts.controller.rb
 def show
    @post = Post.find(params[:id])
    @odai = Odai.find(@post.odai_id)
    @comment = Comment.new
  end
```
【JavaScript】デバイス

# タッチデバイスか調べる

``` js
var isTouch = ('ontouchstart' in window);

if(isTouch){
  //タッチデバイス用スクリプト
}else{
  //タッチデバイス以外のスクリプト
}
```

---

# ポインタデバイスか調べる

``` js
var isPointer = ('onpointerenter' in window);

if(isPointer){
  //ポインタバイス用スクリプト
}else{
  //ポインタデバイス以外のスクリプト
}
```

#モバイルか調べる

``` js
var isMobile = (/iphone|ipod|android|blackberry|opera mini|opera mobi|skyfire|maemo|windows phone|palm|iemobile|symbian|symbianos|fennec/i.test(navigator.userAgent.toLowerCase()));
if(isMobile){
  //モバイル用スクリプト
}else{
  //モバイル以外のスクリプト
}
```

#タブレットか調べる

``` js
var isTablet = (/ipad|android 3|sch-i800|playbook|tablet|kindle|gt-p1000|sgh-t849|shw-m180s|a510|a511|a100|dell streak|silk/i.test(navigator.userAgent.toLowerCase()));
if(isTablet){
  //タブレット用スクリプト
}else{
  //タブレット以外のスクリプト
}
```

#Web Assemblyが使用できるか調べる

``` js
var isWasm = ('WebAssembly' in window);
if(isWasm){
  //Web Assembly用スクリプト
}else{
  //Web Assembly以外のスクリプト
}
```

#indexedDBが使用できるか調べる

``` js
var isIndexedDB = ('indexedDB' in window);
if(isIndexedDB){
  //indexedDB用スクリプト
}else{
  //indexedDB以外のスクリプト
}
```
【JavaScript】マウス

#要素内のマウスの位置を調べる

__概要__

要素内のマウスの位置を調べる

__スクリプト__

```js
function getpos(e){
    var isFirefox,pageX,pageY;
    var isTouch = ('ontouchstart' in window);
    if(navigator.userAgent.indexOf('Firefox')!=-1){
        isFirefox = true;
    }else{
        isFirefox = false;
    }

    if(isTouch){
        if('originalEvent' in e){
            if('pageX' in e.originalEvent){
                pageX = e.originalEvent.pageX;
                pageY = e.originalEvent.pageY;
            }else if('touches' in e.originalEvent){
                pageX = e.originalEvent.touches[0].pageX;
                pageY = e.originalEvent.touches[0].pageY;
            }

        }else if('changedTouches' in event){
            pageX = event.changedTouches[0].pageX;
            pageY = event.changedTouches[0].pageY;
        }else  if('pageX' in e){
            pageX = e.pageX;
            pageY = e.pageY;
        }

    }else{
        pageX = e.pageX;
        pageY = e.pageY;
    }

    return {
        pageX : Math.round(pageX),
        pageY : Math.round(pageY)
    }
}
```

---

# 右クリック禁止

__概要__

右クリックでコンテキストメニューを表示させたくない場合

__施策__

**右クリック禁止**

```js
document.addEventListener('contextmenu', function (e) {
    e.preventDefault();
}, false);
```

**特定のタグのみ禁止**

```js
document.addEventListener('contextmenu', function (e) {
    var tagName = e.target.tagName.toLowerCase();
    if(tagName==="img") { //imgタグ上で右クリック禁止
        e.preventDefault();
    }
}, false);
```
AWS Cloud9でPython3を使うための設定（詳細版）

AWS Cloud9でPython3を使うための設定手順メモ。
https://qiita.com/acecrc/items/fb34a12b265122816d4b を元に自分向けに詳細化した。

2019/6/9追記：
設定コマンドの（なんちゃって）ワンライナーを[新規章](https://qiita.com/r-wakatsuki/items/bcaab62850944b1d605a#%E3%83%AF%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%8A%E3%83%BC)で追記

# 前提条件

- AWS Cloud9 （Platform: Amazon Linux）

# 手順

### 現在の既定のPythonバージョンを確認。

```shell
$ python -V
Python 2.7.16
```

### Cloud9の既定のPythonバージョンの設定を変更

IDE画面右上の歯車をクリックして[Preferences]コンソールを開く。
[Python Support]タブを選択して開き、[Python version]を「Python3」に変更する。

![スクリーンショット 2019-06-01 14.32.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258416/0411473a-b19b-57cc-8f0a-44347e688b34.png)

※ここから先の設定は[ワンライナー](https://qiita.com/r-wakatsuki/items/bcaab62850944b1d605a#%E3%83%AF%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%8A%E3%83%BC)でも可能

### 現在のpythonエイリアスのバージョンを確認。

```shell
$ cat ~/.bashrc
〜中略〜
# User specific aliases and functions
alias python=python27
〜中略〜
```

### pythonエイリアスのバージョンを変更。

```shell
$ sed -i -e "s/alias python=python27/alias python=python36/g" ~/.bashrc

$ cat ~/.bashrc
〜中略〜
# User specific aliases and functions
alias python=python36
〜中略〜
```

<details><summary>おまけ vimで.bashrcを編集する場合</summary><div>

OSX 10.13.6の場合

- `vi ~/.bashrc`を実行　#vimで.bashrcを開く
- 「i」を押下　#インサートモード開始
- `python27`を`python36`に書き換える
- 「Control＋C」を押下　#インサートモード終了
- 「:wq」を押下　#上書き保存、vim終了

</div></details>

### .bashrcの変更を反映

```shell
$ source ~/.bashrc
function
```

### pyhtonコマンドで利用される既定のプログラムを変更

番号の選択で「2」を入力。

```shell
$ sudo update-alternatives --config python

There are 2 programs which provide 'python'.

  Selection    Command
-----------------------------------------------
*+ 1           /usr/bin/python2.7
   2           /usr/bin/python3.6

Enter to keep the current selection[+], or type selection number: 2
```

### 変更後の既定のPythonバージョンを確認。

```shell
$ python -V
Python 3.6.8
```

Python3が既定で使えるようになった。

# ワンライナー

```shell
$ sed -i -e "s/alias python=python27/alias python=python36/g" ~/.bashrc;source ~/.bashrc;sudo update-alternatives --set python /usr/bin/python3.6
```

# 参考

https://qiita.com/acecrc/items/fb34a12b265122816d4b
https://qiita.com/inouet/items/aa7626aead5e5e41b848

以上
CLIなしでHerokuのログを見る

# はじめに
こんにちは。
初の投稿となりますので、ミス等ありましたらご指摘頂けると幸いです。
検索するとHPや他の記事で紹介が沢山あるため[Heroku](https://jp.heroku.com/what)についての解説は割愛します。
この記事でCLIとは[Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli)を指します。
2019年6月1日時点での情報です。

# 前提条件
- Herokuアカウントの所持
- PC or スマホ　※CLIがインストールされている必要はありません。

# 経緯
最近Slackのbot開発に初めてHerokuを利用しました。
外出先で開発中botが上手く動作していないことに気が付き、
今すぐに理由が知りたかったのでWEB上でアプリケーションログが確認したくなりました。
ですが、開発中はCLIの`heroku logs`コマンドを使用していたため確認方法が分からず。
どうにか見えないかなーと模索しました。

### Heroku dev center を確認
まず、[Heroku dev center ロギング](https://devcenter.heroku.com/articles/logging#build-logs)にアクセス。
私「どうせすぐ見つかるやろー」とか、思いつつ画面をスクロールしているとそれっぽい図を発見しました。
<img width="604" alt="ビルドログ取得.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276566/3c94ae2a-ba31-ae15-f8c9-5399b1f8bd49.png">

私「なんか図だけ見たらそれっぽいの出てきた！！！！やっぱりあるよねー:relaxed:」
と思ったのも束の間、少し読むとビルドログについての記載でした。
ビルドログじゃないんだ・・・。

更に下へスクロールして[ログ取得](https://devcenter.heroku.com/articles/logging#log-retrieval)を確認しました。
<img width="591" alt="ログ取得.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276566/770fc09e-2160-8747-3093-76bb53293722.png">

私「おっ、ログ取得っぽいこと書いてある。まさにこの事でしょ！どれどれ・・・」
Heroku「CLIのコマンド`heroku logs`を使うんやで」
私「うわあああああああああああ！やっぱりCLIだああああああ:sob:」

以上、該当ページではWEB画面でログを見る事に関して確認できませんでした。

### 管理画面を探す作戦に
答えはすぐ見つかりました。
Heroku上にある自身のプロジェクト画面にアクセスし、右の方にある[More]をクリック。
<img width="957" alt="Herokuプロジェクトトップ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276566/33fdbe71-e86d-3ffb-2d8d-009015e02263.png">
すると中から[View logs]の文字列が！！！
<img width="197" alt="More.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276566/13ad7359-295e-61e5-46e2-732349bca2ff.png">
[View logs]をクリックすると・・・
<img width="917" alt="アプリケーションログ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276566/6ce525c6-7ab6-e4ef-a555-740046bd7511.png">
あぁ！これこれ！！
以上、無事確認出来ました:sob:
これで外出中にログが確認出来るようになりました・・・。
【AWS】 IAMのassumeロールした権限をPrincipalでアクセス制限をかける方法

## TL;DR

assumeロールした権限をアクセス制限をかける場合は`session name`と`role name`での２つのフィルターをかける必要がある

```json
"arn:aws:sts::123456789123:assumed-role/{role_name}/{session_name}",
"arn:aws:iam::123456789123:role/{role_name}"
```

## やりたいこと

1. ロールAからロールBにassumeロールする
2. assumeロールした権限でs3にアクセスする
3. s3には特定のロールのみアクセスを許可させたい

## はまった部分

### 初めにやった構成

- ロールAにはassumeを許可する設定

```json:iam_policy
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": [
                "arn:aws:iam::123456789123:role/{dest_assume_role}"
            ]
        }
    ]
}
```

- ロールBにはロールAからのアクセスを許可して、s3へのアクセスを許可

信頼関係

```json:信頼関係
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::123456789123:role/{source_role}"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

iam policy

```json:iam_policy

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:Get*"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::test_bucket",
                "arn:aws:s3:::test_bucket/*"
            ]
        }
    ]
}
```

- s3には特定のロールのみアクセスを許可するバケットポリシーを貼る

```json:buckt_policy
    "Version": "2012-10-17",
    "Id": "test",
    "Statement": [
        {
            "Sid": "only-specific-role-access",
            "Effect": "Deny",
            "NotPrincipal": {
                "AWS": "arn:aws:iam::123456789123:role/{dest_assume_role}"
            },
            "Action": "s3:Get*",
            "Resource": [
                "arn:aws:s3:::test_bucket",
                "arn:aws:s3:::test_bucket/*"
            ]
        }
```

が、この設定だとassumeして取得した一時キーでs3にアクセスすると、`Access Denied`で弾かれます。

### 直したところ

公式ドキュメントをよく見てみると、特定ユーザーでは別に設定が必要な模様。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_elements_principal.html


特定の引き受けたロールユーザー
> "Principal": { "AWS": "arn:aws:sts::AWS-account-ID:assumed-role/role-name/role-session-name" }

そこで 以下のように変更してみる。

```json
"NotPrincipal": {
                "AWS": "arn:aws:iam::123456789123:role/{dest_assume_role}"
            },
```
↓

```json
"NotPrincipal": {
                "AWS": "arn:aws:iam::123456789123:assumed-role/{dest_assume_role}/{session_name}"
            },
```

が、これでも動きません。どうやら `role` + `assume-role`どちらも設定が必要な模様。


最終的に両方設定すると無事アクセスすることができました。

```json:これだとOK
"NotPrincipal": {
                "AWS": [
                  "arn:aws:iam::123456789123:role/{dest_assume_role}", 
                  "arn:aws:iam::123456789123:assumed-role/{dest_assume_role}/{session_name}"
                ]
            },
```

## 終わりに

assumeロールした権限をアクセス制限をかける場合は`session name`と`role name`での２つのフィルターをかける必要がある

```
"arn:aws:sts::123456789123:assumed-role/{role_name}/{session_name}",
"arn:aws:iam::123456789123:role/{role_name}"
```

ちなみに`{session_name}`はクライアント側で設定可能な部分ですが、以下のように`*`を使用することができないので、コーディングルールとして`{session_name}`を固定させる必要がありそうです。

```json:ダメな例
"arn:aws:sts::123456789123:assumed-role/{role_name}/*"
```
【JavaScript】数値

# 2点間の距離をもとめる

__概要__

2点間の距離をもとめる。

__スクリプト__

``` js
var distance = function(dot1, dot2) { //２点間の距離
    var x1 = dot1[0],
        y1 = dot1[1],
        x2 = dot2[0],
        y2 = dot2[1];
    return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));
};
```
__使用方法__

``` js
var d = distance([0,0], [100,100]);
```

---

# 2点間の角度を調べる

__概要__

2点間の角度を調べる

__スクリプト__

``` js
function getAngle(x1,y1,x2,y2){
    // p1(x1,y1)とp2(x2,y2)の差を計算
    xDis = x2-x1;
    yDis = y2-y1;
    // そこから角度（ラジアン表記）を計算
    radian = Math.atan2(yDis, xDis);
    // ラジアンを角度に変換
    angle = radian/(Math.PI/180);
    return angle;
}
```

__使用方法__

``` js
var angle = getAngle(0,0,100,100);
```

---
[WIP] ScicosでRTAIコード生成

ScicosのRTAIブロックからコード生成を行えるようにする。

既に、[他で](https://qiita.com/ProjectM_TACCMI/items/000a2fbcce1f7ed6a89a)RTAIブロックの導入はできています。

![Screenshot from 2019-06-01 15-29-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403008/b543fddb-cfe5-1011-7632-0cf7cdff073f.png)

はじめにシミュレーションを試してみようと思ったが、エラーが出て動かない。

http://mail.rtai.org/pipermail/rtai/2010-May/023176.html

によると、シミュレーションは非対応らしい。シミュレーションで動作確認する時は、まずは、RTAIじゃないブロックでつくって、期待通り動くようになってからRTAIのブロックへ差し替えるなどする必要があるみたいだ。


http://mailinglists.scilab.org/Scilab-users-Small-problem-with-Scilab-6-0-1-code-generation-td4039068.html

%a_c が未定義と出たが、これは、6.0.2の不備らしい。

```
edit do_compile_superblock42
// CTRL+F: search the [++"] pattern (without []) and replace ++" => +"
// Save the file
predef clear
Dir = SCI+"/modules/scicos/macros/scicos_scicos";
genlib("scicos_scicoslib", Dir)
```

上記の対応方法を実施で以下のブロックからはコード生成できるように。

![Screenshot from 2019-06-01 15-23-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403008/686ea5cb-4007-6bfd-3b84-0290ee5dadd6.png)

まだ上手くコード生成できないブロックはありますが、前進。
【JavaScript】文字列

# 数字に3桁ずつ、カンマを入れる

__概要__

価格表示する際の数値、「10000」を「10,000」のように、数字に3桁ずつカンマの入った文字列に変換する関数

__スクリプト__

``` js
Number.prototype.addComma = function() {
    return String(this).replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,');
};
```

__使用方法__

``` js
var num = 12345336789;
console.log(num.addComma()); //12,345,336,789
```

---

# カンマが入っている文字列を数値に変換

__概要__

価格表示する際の、「10,000」を「10000」のように数値に変換する関数

__スクリプト__

``` js
String.prototype.removeComma = function() {
    return Number(this.replace(/,/g, ''));
};

```

__使用方法__

``` js
var str = '12,345,336,789';
console.log(str.removeComma()); //12345336789
```

---

# 改行コードを＜BR＞に変換


__概要__

改行コードを＜BR＞に変換

__スクリプト__

``` js
String.prototype.addBr = function() {
    return String(this).replace(/\r?\n/g, "<br>");
};
```

__使用方法__

``` js
var str = '111111\n222222';
console.log(str.addBr());
```

---

# 文字列内のURLにリンクを貼る

__概要__

文字列内のURLにリンクを貼る

__スクリプト__

``` js
String.prototype.addLink = function() {
    return String(this).replace(/(http:\/\/[\x21-\x7e]+)/gi, "<a href='$1'>$1</a>");
};
```

__使用方法__

``` js
var str = 'お問い合わせはhttps://ilr.jp/まで';
console.log(str.addLink());
```

---

# unicode文字を削除

__概要__

unicode文字を削除

__スクリプト__

```js
String.prototype.removeUnicode = function() {
    return String(this).replace(/\x0B|\x03|\x08/g,'');
};
```
【JavaScript】スタイルシート

# javascriptでcss情報を取得する

__スクリプト__

``` js
var element = document.getElementById('box');
var style = (element.currentStyle || document.defaultView.getComputedStyle(element, ''));
style.width;
```
---

# CSSアニメーション後のイベント

__概要__

jQueryで
CSSアニメーション終了後に
イベントを発火させたい場合

__施策__

```js
(function($){
	$.fn.animateCallback = function(callback){
		var alias = "animationend webkitAnimationEnd oAnimationEnd MSAnimationEnd";

		return this.each(function() {
			var ua = navigator.userAgent;

			if(ua.indexOf('MSIE 9')!=-1){
				return callback.call(this);
			}else{
				$(this).bind(alias, function(){
					$(this).unbind(alias);
					return callback.call(this);
				});
			}
		});
	};
})(jQuery);
```

__使用方法__

```js
$('div').animateCallback(function(){
	//CSSアニメーション終了後の処理
});
```
vueコンポーネントで画像リソースを含む時はbase64にして埋め込んだほうが良い

url-loaderを使う時は、vueコンポーネントをnpmにpublishして 別プロジェクトでnpm installして画像が表示されるか確認する必要あり。

```vue:HelloWorld.vue
<template>
  <div>
    <img :src="iconImage">
  </div>
</template>
<script lang="ts">
export default Vue.extend({
  data: function () {
    return {
      iconImage: require("./images/icon-google-docs-doc.svg"),
    };
  },
</script>
```

このような書き方で、`vue-cli-service serve`で画像が表示される事を確認。`vue-cli-service build --target lib`で画像が書き出される事も確認して満足していたら、npm publishして別のvueプロジェクトでcomponentsとして再利用する時に画像が表示されない事が発覚。

他のvueコンポーネントはどうしているのかと色々画像のあるvueコンポーネントを確認したんだけど、画像ファイルを含んでいるvueコンポーネントが全く見つからなかった。
アイコンとかがあるコンポーネントも、簡単なデザインならcssで書いてるし、ちょっと複雑なSNSアイコン程度ならインラインsvgで表示されていた。

そういうものらしいから、画像はjsに埋め込んでおこう。最終的に、1つのjsファイルに全部入っているようにしよう。
結構なサイズのリソースが必要の場合は、ちゃんとnpm publishして別のvueプロジェクトでnpm installして表示される事を確認する事必須。
Qiitaの下書きで、数式プレビューが無効になった？？

困ってます。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/3ba8236c-5053-8a0e-5532-bec2b20753eb.png)




```math
^{\forall} \epsilon > 0 , ^{\exists} \delta > 0 : s.t. \ \  |x-a| < \delta \Rightarrow |f(x) -f(a)|< \epsilon .

```

つい数日前(いま2019/6/1)までは、プレビューでもちゃんと↑このように表示されていたハズなんですが、、、



参考:[Qiitaの数式チートシート](https://qiita.com/PlanetMeron/items/63ac58898541cbe81ada)