OmniAICreator/Qiita-1.07M huggingface dataset:
Python内包表記をprintする際のお作法

# はじめに
本記事は2019/4/8 16:07に投稿した[記事](https://qiita.com/jeyei/private/fd2d10b4274231f71ef6)の改訂版です。
コメントでご指摘頂いた内容を反映する形でごっそり内容を刷新させて頂きました。
目新しい内容は0ですが、よろしければご覧ください。

# 内包表記とprint関数の組み合わせ
こんな感じです。

```Python:printと内包表記の組み合わせ（１）
print([i for i in iterable])
```

ちなみに下の様にも書けます。

```Python:printと内包表記の組み合わせ（２）
[print(i) for i in iterable]
```

ですが（２）は個人的にはNGと思っています。
コードの１文が、例えば`list()`という空シーケンスの宣言と同様に
冗長記載になってしまうからです。　
どうしても書きたいのであれば`_=`で受けるべきだと思います。

追記：とある有識者にも意見を求めた所
「オブジェクトを生成する」という目的のリスト内包表記において
print関数の「標準出力」という副作用そのものが目的になってしまっている事が
シンプルに気持ち悪い、との事でした。

```Python:（２）がNGの理由（モジュール内での記載）
#printの為だけに内包表記を使うのは、言わば空シーケンスの宣言と同じ。
[print(i) for i in iterable]
list()
# どうしても書きたいならこう。でも無理があるから（１）で十分。
_ = [print(i) for i in iterable]
```

```Python:（２）がNGの理由（Pythonコンソール）
# Pythonコンソールで実行すると、Noneのリストが出力されます。
# printの返り値はNoneなので。
>>>[print(i) for i in range(3)]
0
1
2
[None, None, None]
# _で受ければNoneのリストは表示されなくなるけど、長くない？
>>>_ = [print(i) for i in range(3)]
0
1
2
```

# iterableとして適切（然るべき）なオブジェクト
例えば、itertoolsのイテレータ。
でも`list()`で代替できるのでコード量的には`list()`の方がベター。
（じゃあ適切ではないね！）

```Python
>>>import itertools
>>>p = itertools.permutations([i for i in range(3)])
>>>print(p)
<itertools.permutations object at 0x03AAF3C0>
>>>print([i for i in p])
[(0, 1, 2), (0, 2, 1), (1, 0, 2), (1, 2, 0), (2, 0, 1), (2, 1, 0)]
# ただしiteratorを使い果たしてしまうので2度は実行できない。
>>>print([i for i in p])
[]
>>>
# list()で代替できる　（こっちの方がよくない…？）
>>>q = itertools.permutations([i for i in range(3)]) 
>>>print(q)
<itertools.permutations object at 0x05AAB900>
>>>print(list(q))
[(0, 1, 2), (0, 2, 1), (1, 0, 2), (1, 2, 0), (2, 0, 1), (2, 1, 0)]
```

例えば、シーケンス型の表示フォーマットの変更。

```Python
>>>hoge = [for i in range(16)]
>>>print(*[f'{i:04b}' for i in hoge])
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
>>>print(*[f'{i:04o}' for i in hoge])
0000 0001 0002 0003 0004 0005 0006 0007 0010 0011 0012 0013 0014 0015 0016 0017
>>>print(*[f'{i:04x}' for i in hoge])
0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f
>>>print(*[f'{i*0.01:.1%}' for i in hoge])
0.0% 1.0% 2.0% 3.0% 4.0% 5.0% 6.0% 7.0% 8.0% 9.0% 10.0% 11.0% 12.0% 13.0% 14.0% 15.0%

```

# iterableとして不適切（冗長）なオブジェクト
例えば、型の内包表記がインタプリタでサポートされているもの、
つまり、シーケンス型（list）、集合型（set）、マッピング型（dict）を**まんま**出す場合。
記載としては間違いではないですが冗長です。

```Python
>>>hoge = [i for i in range(3)]
>>>print([j for j in hoge])
[0, 1, 2]
# わざわざ内包表記を使わずとも結果は変わりません
>>>print(hoge)
[0, 1, 2]
```


以上。
（適宜追加予定）
Wordpress SimplicityテンプレートでGoogleフォントをIEでも表示する

## GoogleフォントがIE11で正しく表示されない

いまだにIE対応必要なのかよ…という思いはありますが…。

どうしてもIE対応が避けられない場合で、
wordpressでsimplicityのテンプレートを使っていて、
でもフォントはGoogleフォントできれいに表示したい

という方向けの内容です。

## 確認事項1 : 「Notosans Japanese」にフォント指定されているか。

「Notosans JP」ではなく「Notosans Japanese」を指定しないとちゃんと表示されないので注意

![aaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315775/6d78c9e0-4603-7ec4-9f21-3ac35b91ebe6.png)

## 確認事項2 : header.phpに以下のコードを追加しているか

```header.php
<head>
...
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
...
</head>
```

社内でIEがデフォの場合、IE周りの設定で互換モード表示にしている場合もあります。
そんな場合にはこのコードを追加しないとちゃんとフォントが表示されないです。
キーチェーンファイル作成時の注意事項

# キーチェーンファイルのPathは2種類ある

* /Library/Keychains/
    * システムのキーチェーン
* ~/Library/Keychains/
    * ユーザーのキーチェーン
    * **新規にキーチェーンファイルを作成する場合は、通常こちらに作成する**

# キーチェーンの拡張子は2種類ある

* .keychain
    * /Library/Keychains/System.keychain は .keychain を使用している
* .keychain-db
    * /Users/Name/Library/Keychains/login.keychain-db は .keychain-db を使用している
    * **新規に作成する場合は .keychain-db を使用する**

# キーチェーンの作成方法によって、Pathに差が生じる

検証を開始する前に、現状のKeychainsを確認する。

```bash
$ security list-keychains
    "/Users/Name/Library/Keychains/login.keychain-db"
    "/Library/Keychains/System.keychain"
```

## Keychain Access.appで作成した場合

i. GUI(Keychain Access.app) で 新規キーチェーン `名前: aaa` を作成する。

```bash
$ security list-keychains
    "/Users/Name/Library/Keychains/login.keychain-db"
    "/Users/Name/Library/Keychains/C0846352-7006-52CC-9AE2-7026EC51AF35/aaa.keychain-db"
    "/Library/Keychains/System.keychain"
```

ii. GUI で `名前: aaa` を削除する。

```bash
$ security list-keychains
    "/Users/Name/Library/Keychains/login.keychain-db"
    "/Library/Keychains/System.keychain"
```

## fastlaneで作成した場合

i. [fastlane/create_keychain](https://docs.fastlane.tools/actions/create_keychain/) で `name: aab` を作成する。

```bash
$ bundle exec fastlane run create_keychain name:aab.keychain-db password:aabkey

$ security list-keychains
    "/Users/Name/Library/Keychains/login.keychain-db"
    "/Users/Name/Library/Keychains/aab.keychain-db"
    "/Library/Keychains/System.keychain"
```

ii. [fastlane/delete_keychain](https://docs.fastlane.tools/actions/delete_keychain/) で `name: aab` を削除する。

```bash
$ bundle exec fastlane run delete_keychain name:aab.keychain-db

$ security list-keychains
    "/Users/Name/Library/Keychains/login.keychain-db"
    "/Library/Keychains/System.keychain"
```

---

[検証時の環境]

* macos: 10.13.6
* Bundler: 2.0.1
* fastlane: 2.119.0
Alexa Day2019参加レポート: 隣の芝生は青かった？！VoiceUI/UXデザイナーがスキル解剖して気づいたいくつかのこと

こちらは2019/4/6に開催された[Alexa Day 2019](https://alexaday2019.aajug.jp/)で発表された株式会社サイバードの元木 理恵さんによるセッション「隣の芝生は青かった？！VoiceUI/UXデザイナーがスキル解剖して気づいたいくつかのこと」の参加レポートです。

# 概要
株式会社サイバードにてamazon Alexa、Google Assistant、LINE Clovaをあわせた合計18タイトルのリリースをVoice UI/UXデザイナー兼プロデューサーとして行われた元木さんがVUI/VUXの研究のために他のスキルを解剖して得た知見を紹介

# セッション内容をピックアップ

- Alexaスキルを解剖してわかったgoodポイント、badポイント
- Alexaスキルに共通する冒頭部分がある
- Alexaスキルのハッピーパスを考えるワークショップ
- 呼び出し名について

## Alexaスキルを解剖してわかったgoodポイント、badポイント
- 公開されているAlexaスキルの対話フローを分解し、良い点、改善点を分析
- 見つかったgoodポイント
  - 「xxと話すことでooを実行します」といったサジェストが入る
  - 「現在のお気に入り件数はxx件、あとoo件の登録が可能です」といった現在のステータスを説明してくれる
  - 朝の忙しいときに利用されることを想定し、Alexaの発話スピードが早めに設定されている
- 見つかった改善ポイント
  - Alexaの発話から脳内で漢字に変換できず理解しづらい
  - ユーザーの目的に沿わない流れでスキルの利用が提供される

## スキル開始時に使われる冒頭パターン
- スキルの開始にはパターンがある
  - ごあいさつ
  - 自己紹介 → このスキルでできることを説明
  - 利用促進 → では〜と言ってみてくださいなどスキル利用開始へ促す

## Alexaスキルのハッピーパスを考えるワークショップ
実際に元木さんが公開されているスキル「イケメンとおしゃべり」をお題に先程の冒頭パターンを考えるというもの。
スキルの説明を簡単に聞いた後、各々が紙に自分の考えたハッピーパス（ごあいさつからスキル利用までの対話内容）を記入。
参加者のお一人が発表後、実際のスキルでの内容が共有されました。

### 以下、実際のスキルから参考になったポイント
- 初回利用時と2回目以降で対話内容、フローを変えている
    - 2回目の呼び出し以降は、説明や紹介等を省き、スキル利用までを極力シンプルにしている
- 「困ったときはヘルプと話しかけてください」等、ヘルプの起動方法を説明している点
- ユーザー体験を高めるためにユーザーの発話パターンは同義語でたくさん用意しておく

## 呼び出し名について
- AlexaスキルのUI/UXを考えた場合、呼び出し名は極力シンプルにしたいところ
- 呼び出し名にはブランド／知的財産独自のもの以外の1語での呼び出しは許可されない
- 「イケメンとおしゃべり」の場合は株式会社サイバードが「イケメン」の商標を取っていたことで解決出来た

# セッションを受けて
今まで18ものスキルを作られている経験による内容だけに、会話をデザインする上で実践的な情報がたくさんありました。またセッションのはじめにAlexaのサードパーティ製スキルを利用している人で手を上げている人がほとんどいなかった（Alexa端末使ってる人は9割くらいいた）のが印象的でした。確かに自分もスキルってそんなつかってない。。
今回登壇された元木さんは5/31に目黒で開かれるVoiceUI Showにも参加されるそうで、興味のある方はこちらから参加登録を！
https://vui-show.connpass.com/event/125901/

# 公開されたスライド
[隣の芝生は青かった？！VoiceUI/UXデザイナーがスキル解剖して気づいたいくつかのこと]
(https://www.slideshare.net/RieMotoki/tenkai190406-alexa-day2019)
Alexa Day2019参加レポート: 交通情報系スキルを事例に見る 日常生活に溶け込むスキル開発のテクニック

こちらは2019/4/6に開催された[Alexa Day 2019](https://alexaday2019.aajug.jp/)で発表されたジョルダン株式会社の山手 政実さんによるセッション「交通情報系スキルを事例に見る 日常生活に溶け込むスキル開発のテクニック」の参加レポートです。

## 概要
全国720社以上のバス時刻を案内するスキルとして公開されている、ジョルダン「バス案内」の開発時に苦労した点、工夫した点を紹介

## セッション内容をピックアップ

- Lambdaのコールドスタートの壁を超えるためにLambdaを捨てた
- 呼びかけから返答までに1秒の短縮に成功
- userId、deviceId、アカウントリンクを使いマルチデバイスに対応

## Lambdaのコールドスタートの壁を超えるためにLambdaを捨てた
- スキルの起動から、返答までのタイムラグが発生する壁にぶち当たる
- Alexaサービスの後ろで動いているLambdaのコールドスタート時の起動時間が影響
- いつ利用されるかわからないスキルに従来の手法で100%回避することは難しい
- LambdaをやめHTTPSで通信するAPIサービスを選択

<img width="630" alt="スクリーンショット 2019-04-08 15.13.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/35271/a38c49f7-0aee-b1d3-dd1b-1fd40ce4c5ce.png">
*発表者スライドより[引用](https://www.slideshare.net/MasamiYamate1/ss-139656149)*

## 呼びかけから返答までに1秒の短縮に成功
- Alexaデバイス上で発話からレスポンスの返答が行われるまでの時間差を計測
- Lambda側がコールドスタート時は1秒の短縮に成功
- ユーザーの間隔としてAlexaとは対話している、会話しているという間隔でありその期待値に応える意味で1秒の価値は大きい
- Lambdaをやめる注意点
  - 公式ドキュメントで記載される詳細な要件をクリアする必要がある
  - 公開には要件を満たしているかの審査が入る
    - クリアできているか検証するためのモジュールが公開されている([alexa-verifier](https://www.npmjs.com/package/alexa-verifier))


<img width="629" alt="スクリーンショット 2019-04-08 15.18.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/35271/039d6f9c-5ebb-2a3d-463c-cdfa1b864d14.png">
*発表者スライドより[引用](https://www.slideshare.net/MasamiYamate1/ss-139656149)*

## userId、deviceId、アカウントリンクを使いマルチデバイスに対応
- 今後Alexaが外に出ていくことも想定し、マルチデバイス対応にはこだわった
- ユーザー+どのデバイスを識別にはuserId、deviceIdを利用
  - スキル内で完結+発話でデバイスとデータを紐付ける場合はこれで対応が可能

## カスタムスロットの上限数が課題になる
- カスタムスロットの上限数5万件に対し、提供したいバス停の数は約23万件
- アカウントリンクを活用し、事前にバス停を登録してもらうことでクリア
- 以下、実現フロー
  - アカウントリンク時にバス停を仮登録（この時点ではデバイスは紐付いていない）
  - 初回スキルの呼び出し時にバス停のお気に入り情報とdeviceIdをペアに本登録

<img width="631" alt="スクリーンショット 2019-04-08 12.33.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/35271/343de97e-ab74-da7f-3c49-0eb9a4abd606.png">
*発表者スライドより[引用](https://www.slideshare.net/MasamiYamate1/ss-139656149)*

## その他
- Alexaが複数人で使う前提になっていないのがつらい

# セッションを受けて
実際に公開されたスキルのお話だけにがっつりリアルな技術面での課題や苦労が見えて、今後スキル開発をする場合に参考になるセッションでした。
特にマルチデバイス対応に対してのアプローチはスタンダードが定まっていないなかで、実践的でとても興味深いお話でした。

# 公開されたスライド
[交通情報系スキルを事例に見る 日常生活に溶け込むスキル開発のテクニック]
(https://www.slideshare.net/MasamiYamate1/ss-139656149)
半角英数字とカンマの組み合わせでline-heightがおかしくなる

# 2020.3.11追記
iOS13以降はこの不具合が解消されました。
かつ、system fontを指定すると明朝体になって全体的にline-heightがおかしくなります。

# 前提
- iOSの言語設定は日本語を選択する
- ReactNativeのバージョン 0.59.3

# 現象
半角英数字とカンマを組み合わせた文章だと、カンマ入りの行だけline-heightがおかしくなる。
<img width="300" alt="スクリーンショット_2019-04-08_15_23_34.png" src="https://qiita-image-store.s3.amazonaws.com/0/44554/a81d45d5-bdce-ead8-ac86-c81047bd75c4.png">


# 解決方法
font-familyのプロパティに `system font` を指定する。

```javascript
const styles = StyleSheet.create({
  text: {
    fontFamily: 'system font', // fontFamilyを指定する
    fontSize: 24,
    color: '#000',
  },
});
```

## 結果
<img width="300" alt="スクリーンショット 2019-04-08 15.32.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/44554/bb927198-0574-f3c3-10de-4b97b5ac4ca3.png">

# 注意点
副作用でfont-weightが指定しても効かなくなる。
Ajaxを用いて画面遷移なく投稿を編集する機能を実装する

初投稿です。

#やったこと
Railsで作っているWebアプリに追加で、編集機能を実装しました。画面遷移することなく、投稿を編集することができる機能です。

![Say_thanks.png](https://qiita-image-store.s3.amazonaws.com/0/348703/ca731b06-2142-2281-32b3-714ef5bea07d.png)
![Say_thanks.png](https://qiita-image-store.s3.amazonaws.com/0/348703/00d92b1b-4e51-fe7e-5dd0-b7b74d4cd228.png)

### 具体的な実装流れ

- Ajaxを用いるため、編集リンクに対して`:remote => true`を記述する
- edit.js.erbを作成して、HTML書き換え処理を記述する

### Controllerでeditアクション定義

```Ruby:posts_controller.rb
def edit
    @post = Post.find_by(id: params[:id])
end
```

### index.html.erbで全投稿表示＆編集リンクを出力

```Ruby:index.html.erb
<% @posts.each do |post| %>
<div class="timeline-item" id='<%= post.id %>'>
	<p><%= post.content %></p>
	<%= link_to "/posts/#{post.id}/edit", :method => :get, :remote => true, :class => "post-edit" do %>
	 	編集 <i class="fas fa-edit"></i>
	<% end %>
</div>
<% end %>
```
ポイントになっているのは、`:remote => true`の部分です。
もう一つのポイントとしては、`<%= post.id %>`で各投稿にidを付与していることです。このidは、この後のjs.erbファイル内で利用します。

### edit.js.erbでHTMLの書き換えを行う

```Ruby:edit.js.erb
$('#<%= @post.id %>').html('<%= form_tag("/posts/#{@post.id}/update") do %><div class="form-wrp form-for-index"><div class="form newpost"><textarea name="content"><%= @post.content %></textarea><input type="submit" value="保存"></div></div><% end %>')
```
選択された投稿のHTMLを、formに書き換える処理を行なっています。

以上です。
【Blockchain】継承

Solidityで書くSmart Contractsは、オブジェクト思考言語ですので、継承を実現することができます。

## 継承する基底Contractを作成
まずは、継承する基底Contractを作ってみましょう。

前回のサンプルで作りましたSmart Contractは、オーナーのアドレスを属性に保持し、オーナーであるかの確認をするmodifierを作りました。
これらの機能は、どのSmart Contractでも必要なものです。
そこで、その機能を一つのContractに作って、それを継承するようにしましょう。

Remixの左側に (+) ボタンがありますので、それをクリックします。
ファイル名を `Ownable.sol` にします。
そして、下記のプログラムを入力しましょう。

```javascript
pragma solidity ^0.4.24;

contract Ownable {
    
    address private owner;
    
    constructor() public {
        owner = msg.sender;
    }
    
    modifier isOwner() {
        require(owner == msg.sender);
        _;
    }
}
```

## 継承して派生Contractを作成
上記で作成したOwnableをMessageStoreに継承してみましょう。

```javascript
pragma solidity ^0.4.24;

import "./Ownable.sol";

contract MessageStore is Ownable {
    
    string private message;
    
    function setMessage(string newMessage) public isOwner {
        message = newMessage;
    }
    
    function getMessage() public view returns (string) {
        return message;
    }
}
```

インポートは、 `import "Ownable.sol";` で行います。
そして、Contractの定義に `is Ownable` を追加します。
これで、オーナーのアドレスを保持する機能とmodifier修飾子である `isOwner` も使えるようになります。
#python で datetime を microsecond までの timestamp に変換する例

`datetime.timestamp()` を使う。簡単。

```py
from datetime import datetime

now = datetime.now()

datetime.timestamp(now) # 1554697779.523136
```

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
CIImageを使ってExif情報を失わずにJPEGファイルを作成する

# 実行環境
- Swift 4.2
- Xcode 10.1
- Deployment Target 11.0

# 本題

`PHCachingImageManager`や`AVCapturePhotoCaptureDelegate`で受け取った画像データをExif情報を損なわずにJPEGファイルに保存する場合は`CIImage`を使用する必要があります。

```swift
func writeToJpeg(to url: URL, data: Data) throws {
    guard let image = CIImage(data: data),
        let jpegData = CIContext().jpegRepresentation(
            of: image,
            colorSpace: image.colorSpace ?? CGColorSpaceCreateDeviceRGB(),
            options: [:]) else {
                // JPEGデータ作成失敗
                return
    }
    try jpegData.write(to: url)
}
```

`UIImage`を使用するとExif情報が失われてしまいます。

```swift
func writeToJpeg(to url: URL, data: Data) throws {
    guard let image = UIImage(data: data),
        let jpegData = image.jpegData(compressionQuality: 1) else {
                // JPEGデータ作成失敗
                return
    }
    try jpegData.write(to: url)
}
```
node_modulesをシンボリックリンクで共有する試み

# 実現したいこと
* npm installを1回だけして、node_modulesを異なる場所から参照して使いまわす。
* グローバルインストールは極力使わない。
* Windows10で動かす。
* **とにかく手を抜く。**120分で検証できなかったらあきらめる。（いちばんだいじなこと）

### 環境その1
* Windows 10
* Node.js v6.9.2
* npm v3.10.9

### 環境その2
* Windows 10
* Node.js v8.11.4
* npm v5.6.0

# 結論
## 環境その1
下記手順で実現できた。
1. 任意の場所にnode_modulesのディレクトリを作る。
2. 使用したいプロジェクトのpackage.jsonのある場所にシンボリックリンクを作成する。
3. `npm install`する。

```
$ フォルダ作成
mkdir C:\npm_modules\projectA\node_modules

$ シンボリックリンク作成
mklink C:\workspace\projectA\node_modules C:\npm_modules\projectA\node_modules

$ npm install
cd C:\workspace\projectA
npm install

$ ビルド
npm run build
```


## 環境その2
環境その1よりも制約が厳しく、以下の手順で実現した。
(他に良い方法をご存知でしたらお教えいただきたいです。。)
1. 使用したいプロジェクトのpackage.jsonのある場所で`npm install`する。
2. 任意の場所にnode_modulesのディレクトリを作り、手順1のnode_modulesをコピーする。
3. 使用したいプロジェクトのpackage.jsonのある場所にシンボリックリンクを作成する。

```
$ npm install
cd C:\workspace\projectB
npm install

$ node_modulesを任意の場所にコピー
robocopy /mir C:\workspace\projectB\node_modules C:\npm_modules\projectB\node_modules

$ シンボリックリンク作成(projectAとprojectBは同じ資材)
mklink /D C:\workspace\projectA\node_modules C:\npm_modules\projectB\node_modules

$ ビルド
cd C:\workspace\projectA
npm run build

```

# なぜ二つの環境で検証したのか
npmのバージョン5より前のときは自由にシンボリックリンクでnode_modulesの場所を指定していろいろできたが、5以降はできなくなったという噂を聞いたので。
[npm install fails when node_modules is a symlink](https://github.com/npm/npm/issues/10013)

今回の簡単な検証ではバージョン5以降ではシンボリックリンクで事前にnode_modulesを設置して`npm install`ができなくなっていた。
また、バージョン5にて使用したいプロジェクトにて`npm install`をすると、シンボリックリンクが上書きされてローカルに中途半端なnode_modulesが作成される＋シンボリックリンク先のモジュールが壊れてしまった。
Railsチュートリアル 12 PasswordResets メモ

#はじめに
Railsチュートリアルを**自分が理解しやすい表現に置き換える目的**で利用しています。　手順を示す記事ではありません

##hidden_fieldで値を保持しておく
パスワード再設定の送信メールにはeditとupdateアクションでメールアドレスとキーとしてユーザーを探す。これは両方のアクションでメールアドレスが必要になるから
だが、editアクションでメアドを取得し、フォームから一度送信してしまうと、この取得した情報（メアド等）が消えてしまい、updateアクションでエラーが出てしまう。
これを解決するには取得した値を保持すればよい。これを解決するのが

```ruby:password_resets/edit.html.erb
<% provide(:title, 'Reset password') %>
<h1>Reset password</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_for(@user, url: password_reset_path(params[:id])) do |f| %>
      <%= render 'shared/error_messages' %>

      <%= hidden_field_tag :email, @user.email %>

      <%= f.label :password %>
      <%= f.password_field :password, class: 'form-control' %>

      <%= f.label :password_confirmation, "Confirmation" %>
      <%= f.password_field :password_confirmation, class: 'form-control' %>

      <%= f.submit "Update password", class: "btn btn-primary" %>
    <% end %>
  </div>
</div>
```

の

```ruby
hidden_field_tag :email, @user.email
```
この部分
このhedden_field_tagでは取得した値を保持するために隠しフィールドとして**ページ内**に保存される
これで他の情報と一緒にメールアドレスが送信されるようになる

###ちなみに
今までは

```ruby
f.hidden_field :email, @user.email
```
というコードを書いていたが今回は

```ruby
hidden_field_tag :email, @user.email
```
と異なっている。これは前者ではメアドが**params[:user][:email]**に保存されるが、後者では**params[:email]**に保存されるという違いがある

##errors_add
エラーメッセージを追加するコード

```ruby
@user.errors.add(:password, :blank)
```
このコードは@userに対して**パスワードが空だった場合**にデフォルトでエラーメッセージを表示してくれるようになる
というのも、以前Userモデルでパスワードが空でもいい（allow_nil)を実装したため。今回はパスワードが空だとエラーになる。

##password_reset_expired?
パスワード再設定メール送信に有効期限を付与したい場合、メールを送信してから2時間以上経過しパスワードが再設定されなかったら期限切れとする処理を行いたい
Rubyで表すと次のようになる
*reset_sent_at -> datetime

```ruby
reset_sent_at < 2.hours.ago
```
これは**「～より少ない」**と読んでしまうと困惑してしまうため、**「～より早い」**と捉える
すると「パスワード再設定メールの送信時刻が2時間以上前（早い）」場合となる

```ruby:user.rb
def password_reset_expired?
  reset_sent_at < 2.hours.ago
end
```
これにより、論理値を求めるメソッドが使えるようになる

##テスト ~input~

```ruby
assert_select "input[name=email][type=hidden][value=?]", user.email
```
これはinputタグに正しい名前、type="hidden"、メアドがあるかを確認する
Htmlで表示すると

```ruby
<input id="email" name="email" type="hidden" value="michael@example.com" />
```
を対象としてテストしている
VSCodeでプロジェクト用にスニペットを作ってみる

知らなかった。vscodeのアップデートで使えるようになってたのね。結構前に。
[Project level snippets](https://code.visualstudio.com/updates/v1_28#_project-level-snippets)

人が作ったsassとかそれぞれのmixinを作ってる場合があるから、いちいち打ち込むの面倒。

## 作り方
プロジェクトディレクトリ内の`.vscode`ディレクトリの中に、`*.code-snippets`ファイルを作る。
今回の場合は、scssファイルのスニペットのためscss.code-snippetsを作成。

```
.vscode/
  scss.code-snippets
```

```scss.code-snippets
{
  "media query": {
    "prefix": "q",
    "body": [
      "@include query($$break) {",
      " $0",
      "}"
    ],
    "description": "sass snippet for media query"
  }
}

```

これでscssファイルで`q`と打つと候補が表示されるようになる。
【Excel】今の場所の列アルファベットを取得したい

# 表示されているはずの列アルファベットがすぐさま取得できないのはこれ如何に

![image.png](https://qiita-image-store.s3.amazonaws.com/0/36476/2dec8af8-080b-cf8c-8b17-1fb37ef31c7e.png)

　この文字をそのまま利用したいのですが、Excelではあっさり取得できません。
　以下の関数で取得できます。

```
=SUBSTITUTE(ADDRESS(1,COLUMN(),4,1),1,)
```

　変数：なし
　どこのセルにはっても問題なく表示されます。
riotAPIとdiscordAPIを組み合わせて友人がtiltする前に注意喚起するbotを作った

#概要
コンセプト : タイトル通りriotAPIとdiscordAPIを組み合わせて友人がtiltする前に注意喚起するbotです
tilt : 傾くの意味で使い方的には怒って正常な判断を下せなくなることです
流れは、riotAPIでサモナーネームからサモナーIDを入手→riotAPIでサモナーIDから試合してるか判断→discordAPIで友人に対しメンションしてチャット
#環境
win10
python3
#riotAPIについて
riotAPIとは、riotが運営するlolというゲームの様々な情報を入手できるAPIのことです
https://developer.riotgames.com/api-methods/
リファレンスです　値を入れてPOSTできるのでいろいろ試してみましょう
キーの取り方とか使い方はググってください
#使うriotAPI
SUMMER_NAMEとAPI_KEYとSUMMER_IDは自分のものに変えてね

https://jp1.api.riotgames.com/lol/summoner/v4/summoners/by-name/SUMMER_NAME?api_key=API_KEY
サモナーネームからサモナーIDやいろいろ取得できる　今回はサモナーIDだけ取得　日本語URLはエンコード必要なので注意
https://jp1.api.riotgames.com/lol/spectator/v4/active-games/by-summoner/SUMMER_ID?api_key=API_KEY
サモナーIDから現在試合中なら内容を取得できる
#importするやつ
import urllib.request as urllib2
import urllib.parse
import json
import traceback,sys
import discord
##手順1 riotAPiでサモナーIDを入手
APIkeyを取得したら、まず友人のサモナーネームからサモナーIDを取得します
https://jp1.api.riotgames.com/lol/summoner/v4/summoners/by-name/SUMMER_NAME?api_key=API_KEY
をPOST(SUMMER_NAMEとAPI_KEYは自分のものに変えてね)

```python
API_SUMMONER_REQUEST = "https://jp1.api.riotgames.com/lol/summoner/v4/summoners/by-name/"
SUM_NAME = ""#自分で入れる
SUM_NAME = urllib.parse.quote(SUM_NAME)#エンコードして日本語SN対応
API_KEY = ""#自分で入れる
s = urllib2.urlopen(API_SUMMONER_REQUEST + SUM_NAME + '?' + API_KEY)
summ = json.loads(s.read().decode('utf-8'))
SUMMONER_ID = summ["id"]
```

これでSUMMONER_IDにサモナーIDが入ります
##手順2 riotAPiでサモナーIDから試合してるか判断
サモナーIDが取得できたので試合してるか判断します
https://jp1.api.riotgames.com/lol/spectator/v4/active-games/by-summoner/SUMMER_ID?api_key=API_KEY
をPOST(SUMMER_IDとAPI_KEYは自分のものに変えてね)

```python
try:
    i = urllib2.urlopen(self.API_SPECTATE_REQUEST + SUMMONER_ID + '?' + self.API_KEY)
    is_in_game = json.loads(i.read().decode('utf-8'))
    if is_in_game["gameQueueConfigId"] == 420:
        match_flag=True
    else:
        match_flag=False
except urllib.error.HTTPError:
    match_flag=False
```

active-games/by-summonerのAPIは試合中じゃないとHTTPエラーを返すので、try文で処理しました
ゲームモードはgameQueueConfigIdの値でわかります
https://developer.riotgames.com/game-constants.html
今回はランクなので420です
match_flag変数でtrueなら試合中　falseなら試合中でない　としています
##手順3 discordAPIでメンション付き注意喚起

```python
client = discord.Client()
@client.event
async def on_ready():
	print('success')
	channel_bot_test = [channel for channel in client.get_all_channels() if channel.id == '発言先チャンネルID'][0]

	text="<@メンション先ID> ランクを回すな"
	await client.send_message(channel_bot_test, text)
	await client.logout()
	await sys.exit()
client.run("discordのAPIkey")
```
if文で条件分岐させたのち、discordAPIを使ってメンションしたい人のIDを入力させるとBOTが発言します
discordAPIの使い方はググって下さい
##実行結果
![結果.PNG](https://qiita-image-store.s3.amazonaws.com/0/268938/5d4248f2-b3fd-3646-d9cd-8b5fc9ec08d1.png)
##反省点
スペクテーターAPIは試合していない人でPOSTするとエラーを吐くことを利用して条件分岐したが、なんか雑なやり方になってしまった
今回は手動で実行しないといけないが、定期的に実行させて友人がランクを回した瞬間に通知できるようにしたい
cryptsetupコマンドを使用したディスクの暗号化


# はじめに

- ここでは、Linux環境での、cryptsetupコマンドを使用したディスクの暗号化についてまとめています。
- 以下は、今回の実行環境です。
    - 対象OS：Centos7
    - 対象デバイス：外付けHDD

# 実行手順
## １．cryptsetupパッケージのインストール
```
yum install cryptsetup cryptsetup-libs
```

## ２．デバイスの確認
```
parted -l
```

## ３．対象パーティションの初期化
```
cryptsetup luksFormat /dev/xxxx

WARNING!
========
This will overwrite data on /dev/sde irrevocably.

Are you sure? (Type uppercase yes): YES※大文字で入力すること！
Enter passphrase for /dev/xxxx:※パスワードを設定
Verify passphrase:※パスワードの再確認
```

## ４．初期化したLUKSパーティションをマッピング
```
cryptsetup luksOpen /dev/xxxx testtest
```

## ５．暗号化されたパーティションをフォーマット(初回のみ)
```
mkfs.ntfs -Q /dev/mapper/testtest
```

## ６．マウント
```
mount /dev/mapper/testtest /mnt/hogehoge
```

## ７．暗号化したデバイスを削除する時
##### アンマウント
```
umount /mnt/hogehoge
```

##### LUKSパーティションの削除
```
cryprsetup luksClose testtest
```
## 再度LUKSパーティションを作成する時
- 「cryptsetup luksOpen～」を実行してLUKSパーティションを作成し、マウント(最初に設定したパスワードを聞かれるので注意)
-  フォーマットをする必要はない(データが消えてしまうので注意)
JavaScriptでrange関数作ってみた

# 要件

- 関数名は`range`とする
- 数値型の引数を２つ(`start`, `end`)受け取る
- `start`から始まり`end`で終わる整数値の連番を配列で返す

```javascript
const list = range(2, 5);
console.log(list);
[2,3,4,5]
```

# 実装

# forで回す
```javascript
const range = (start, end) => {
  const list = [];
  for (let i = start; i <= end; i++ ) {
    list.push(i);
  }
  return list;
}
```

# Array.fromを使う

[MDNのサンプルコード](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/from#Sequence_generator_(range))を参考に

```javascript
const range = (start, stop) => Array.from({ length: (stop - start) + 1}, (_, i) => start + i);
```

# スプレッド構文を使う

- 一番短く書けて、実行も早かった

```javascript
const range = (start, end) => [...Array(end + 1).keys()].slice(start);
```

**やっていること**
1. `Array(end + 1)`  => end + 1の長さの配列を作成。[MDN:Arrayコンストラクタ](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array#Parameters)
2. `.key()` => 作った配列のindexを返すArray Iteratorを作成。[MDN:Array.prototype.keys()
](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/keys)
3. `[...Array(end + 1).keys()]` => スプレッド構文でiteratorを配列に変換する。[MDN:スプレッド構文](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax)
4. `.slice(start)` => 0からの連番になっているので、sliceを使ってstart番目から始まる配列のコピーを作成。[MDN:Array.prototype.slice()
](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/slice)

### 一言

`keys()`が[phpのarray_keys](https://www.php.net/manual/ja/function.array-keys.php)と同じで配列返すと思っていたので`Array(end + 1).keys().slice(start)`でもいけるのでは？と思った。
戻り値イテレータだった。`slice`は配列なのに・・・

# スプレッド構文を使う(改良版)

コメントにてパフォーマンス面で無駄があること指摘していただいたので改良しました。
ひとつ前のsliceでカットする方法だと、startが大きくなった時に無駄に配列を確保することになるので直しました。

```javascript
const range = (start, end) => [...Array((end - start) + 1)].map((_, i) => start + i);
```

# おまけ（計測）

## 実行環境

Google Chrome
バージョン: 75.0.3770.142（Official Build） （64 ビット）

## 計測結果

**※実行する環境によって実行速度やパフォーマンスの優劣は異なります。**
　**自身の環境でお試しください。**

| 方法                 | 実行時間                   | 平均(30回) |
| -------------------- | -------------------------- | ---------- |
| forで回す            | 338～430ms（初回呼び出し） | 37ms       |
|                      | 20～30ms（２回目以降）     | -          |
| Array.fromを使う     | 173～260ms                 | 192ms      |
| スプレッド構文+slice | 61～105ms                  | 121ms      |
| スプレッド構文+map   | 35～60ms                   | 44ms       |

<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="js,result" data-user="RyutaKojima" data-slug-hash="NQxaEb" 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="rangeいろいろ">
  <span>See the Pen <a href="https://codepen.io/RyutaKojima/pen/NQxaEb/">
  rangeいろいろ</a> by r-kojima (<a href="https://codepen.io/RyutaKojima">@RyutaKojima</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


### 一言

Chromeではforで回す方法が、初回は時間がかかるけど２回目以降の呼び出しがすごく早かった。
最適化がかかるのか、検証コードが間違っているのか、理由はよくわかりませんでした。
Codableを使うときの注意点。

#Data(json)
```swift
let jsonData = """
  {
    "name": "太郎",
    "age": 20
  }
  """.data(using: .utf8)!
```

この時に大事なところは
**.data(using: .utf8)!**
です。これがないと変換できないとエラーが出ます。

これを使わない場合は

```swift
let decodeData = jsonData.data(using: .utf8)
```
などで***"utf8"***に変換しないといけません。
そして、デコードする構造体Structを定義します。プロトコルでCodableもしくはDecodableを指定することを忘れずに！

```swift
struct Peaple: Codable {
    let name: String
    let age: Int
}
```
#Decode
実際にデコードします。

```swift
let decodeData = try! JSONDecoder().decode(Peaple.self, from: jsonData)
```
これで***"decodeData"***にデータ が格納されたはずです。

```swift
print(decodeData.name)
```
とすると、***"太朗"***と出力されます。

[Swiftで行こう！--CodableでAPIを！](https://note.mu/dngri/n/n3adf8d354c34)
sokol (Сокол)

## sokol (Сокол) [^1] とは

- C言語で書かれた最小主義のヘッダーオンリーライブラリ[^2] (https://github.com/floooh/sokol) で以下で構成されてる
  - sokol_gfx 👈今回はこれにしぼります
  - sokol_time
  - sokol_audio
  - sokol_args
  - sokol_app

---

## sokol_gfx

- 3D API を抽象化したライブラリ
- 以下に対応している
  - OpenGL (3.3 以降)
  - OpenGL ES 2/3 (WebGL 含む)
  - Metal
  - DirectX 11
- sokol の中核

---

## sokol_gfx の構成要素その１

- `sg_buffer`
  - 頂点またはインデックスバッファ
- `sg_image`
  - テクスチャとサンプラ兼用
- `sg_pass`
  - レンダーターゲットまたはフレームバッファに相当

---

## sokol_gfx の構成要素その２

- `sg_shader`
  - 頂点またはピクセルシェーダ
- `sg_pipeline`
  - 上記をまとめた描画設定単位

---

## sokol_gfx 使うと何が良いの

- 小さい
  - dylib で 100KB 弱 [^3]
  - sokol の先駆者といえる bgfx は 1MB 以上 [^4]
- Vulkan ライクな検証レイヤーがある
  - 論理エラーの早期発見が容易
- 独自のデバッガがある

---

## 独自のデバッガ #とは

- 画像貼る

---

## sokol_gfx の問題点

- 日本語情報皆無
  - ぶっちゃけサンプル見れば使い方はほぼ把握できるとはいえ...
- できたてなのでプロダクションの実績が薄い
  - Unity 内でのレクチャー教材 [^5] で使われたりはしてる

[^1]: ロシア語を英語表記したもので日本では「はやぶさ」を意味する
[^2]: 詳しくは [https://github.com/nothings/single_file_libs](single_file_libs) で
[^3]: `metal-osx-ninja-release` でビルドした `libsokol_gfx.a` は 70KB
[^4]: `osx64_clang` でビルドした `libbgfx-shared-libRelease.dylib` は 1.3MB
[^5]: https://github.com/aras-p/dod-playground

---
LINE Clova マイコマンドで「じゃんけん」スキルをつくってみた

#■マイコマンドについて
2019年3月Clovaもやっと、「ねぇクローバ」に続く**任意の言葉で、アクションとして家電を操作したり音楽・ラジオを再生**したりできる「マイコマンド」がリリースされました。その中の一つの**登録したテキストを話してくれる「音声合成」アクションを利用**してじゃんけんスキルを作ってみましたので紹介します。

ちなみに、LINE Clovaの「マイコマンド」は、Google Homeの「ルーチン」、Alexaの「定型アクション」と類似しています。

#■まずはデモ動画から
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/Clova?src=hash&amp;ref_src=twsrc%5Etfw">#Clova</a><br>Clovaprintsやってみた。<br>LINE Clovaの新機能「マイコマンド」だけでジャンケンスキルを作ってみた。子供でもつくれるぐらいの簡単さ。(発話の間合い調整不明。) <a href="https://t.co/Qgryfpzcv7">pic.twitter.com/Qgryfpzcv7</a></p>&mdash; Google Homer (@google_homer_) <a href="https://twitter.com/google_homer_/status/1111053299040415744?ref_src=twsrc%5Etfw">March 27, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
#■マイコマンドを使った「じゃんけ」の仕組み
言葉で説明するよりも下記のマイコマンドのスクショを見てもらった方が分かり易いかもしれませんが、無理して説明もしておきますね。
##【先攻の手】
**「先攻の手」をマイコマンドの「起動名」として**、グー/チョキ/パーの3つのマイコマンドを作成します。
![Clova マイコマンド　じゃんけん.jfif](https://qiita-image-store.s3.amazonaws.com/0/234533/9e40f9ed-e854-5a3a-9211-ebe012d25990.jpeg)
##【後攻の手】
各コマンドの「アクション」として、「後攻の手」のグー/チョキ/パーの3つの「音声合成」アクションを登録します。**一つのマイコマンドに複数の「音声合成」アクションを登録すると、ランダムで一つを選択して実行してくれる事を利用**して「後攻の手」を発生させます。
![Clova マイコマンド1.png](https://qiita-image-store.s3.amazonaws.com/0/234533/03eea312-bd83-b64b-2c1f-bf7e92e159b2.png)
##【勝ち負けの判定】
「起動名が先行の手」なので、先攻の手毎に作成した「後攻の手のアクション」が決定されれば、自動的に判定は求まりますよね。その判定を、後攻の手の発話の後に続けて発話させます。

#■先攻の手「グー」のマイコマンド
![Clova マイコマンド　じゃんけんグー.jfif](https://qiita-image-store.s3.amazonaws.com/0/234533/397e8720-ddab-4537-7979-3f0fd9084abb.jpeg)
##■先攻の手「チョキ」のマイコマンド
![Clova マイコマンド　じゃんけんチョキ.jfif](https://qiita-image-store.s3.amazonaws.com/0/234533/8be79983-a3a3-0d67-52d7-bfa54634063c.jpeg)
##■先攻の手「パー」のマイコマンド
![Clova マイコマンド　じゃんけんパー.jfif](https://qiita-image-store.s3.amazonaws.com/0/234533/0e64a73f-1508-ea2c-dbab-bcc870a2a597.jpeg)

#以上です。よきじゃんけんライフを。
UbuntuでMongoDBCampassを使用する方法【Ubuntu 18.04.2 LTS】

#必要環境
Ubuntu 18.04.2 LTS
MongoDBのインストール（[mongoDBインストール方法](https://lab4ict.com/system/archives/1137)）

#実行までの流れ
1.mongoDBインストール
2.デフォルト設定のまま『Connect』を押す

#注意点
mongoDBをインストールしておかないと、mongoDBCampassで『connect』を押すと、下記のエラーが出る。
>MongoDB not running on the provided host and port

#参考文献
1.mongoDBインストール方法 https://lab4ict.com/system/archives/1137
SSHができなくなった話

# 前回の記事で書いた環境にSSHできなくなる
他者のデスクトップにSSHするよう色々設定した話をしたと思いますが、今回はその環境が接続できなくなったお話です。

前回の記事はこちらです。
[いなくなった人のPCに侵入してその人になり変わる話
](https://qiita.com/Nedward/items/be523807505735f2e927)
## 原因解明の前の考察
- sshd_configでポート解放の記述をする
- 同ファイルでrootログインを禁止する設定をする
- ssh鍵を登録
- SELinuxの無効化

以前接続できて、今回はできないという状況でこの上記のリストの中で問題がある可能性を考えて総チェックしましたが、変更を加えたところは、依然としてそのままであり何も変わっていませんでした。

##　原因解明
ケーブルの問題かもしれないと思い、別のPCからsshを試みてみましたが、なんと、うまくいくんですね。つまり、これ自分のPCがおかしいんじゃないの？という話です。

Macでネットワークを見ると、DHCPサーバーが取得しているIPのネットワーク部分が、

```
**.*.3.***
```
となっており、

```
$ ifconfig | less 
```
を叩くと、LANケーブルから割り当てられているIPは、

```
**.*.11.***
```

となっているんですね、割り当てられているネットワークがそも違うので、sshしようとしても、Time outを引き起こしてしまったようです。

## 解決策
これにはシステム環境設定のネットワークから、DHCPリースを更新というボタンを押して、割り当て直すとうまくいきました。

しかし、なぜこんなことが起こったのか・・・有線と無線の両方使っていたからDHCPサーバーが割り当ての失敗を引き起こしてしまったのだろうか・・・前の接続した時にリース期間が終わって更新されなかったとか・・・

## DHCPサーバー
DHCP（Dynamic Host Configuration Protocol）と呼ばれ、未使用のIPをクライアント側に動的に割り振ってくれる（リース）サーバーのことです。

#### リース期間
DHCPサーバーから割り当てられるIPには有効期限があり、それをすぎると、リースされたIPは解放される。そして、別のIPが割当てられるかもしれないし、同じものが再度割り当てされたりもする。
【PHP】endroid/qr-codeを使ってQRコードを生成してみる

環境はWindows10。
WebサーバーはApache（XAMPP）です。

GitHub：https://github.com/endroid/qr-code
Packagist：https://packagist.org/packages/endroid/qr-code

# インストール

Composerを使ってインストールします。

```
C:\xampp\htdocs\qrcode>composer require endroid/qr-code
Using version ^3.5 for endroid/qr-code
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 10 installs, 0 updates, 0 removals
  - Installing endroid/installer (1.1.5): Downloading (100%)
  - Installing symfony/polyfill-ctype (v1.11.0): Loading from cache
  - Installing symfony/inflector (v4.2.5): Downloading (100%)
  - Installing symfony/property-access (v4.2.5): Downloading (100%)
  - Installing symfony/options-resolver (v4.2.5): Downloading (100%)
  - Installing myclabs/php-enum (1.6.6): Downloading (100%)
  - Installing khanamiryan/qrcode-detector-decoder (1.0.2): Downloading (100%)
  - Installing dasprid/enum (1.0.0): Downloading (100%)
  - Installing bacon/bacon-qr-code (2.0.0): Downloading (100%)
  - Installing endroid/qr-code (3.5.8): Downloading (100%)
symfony/property-access suggests installing psr/cache-implementation (To cache access methods.)
bacon/bacon-qr-code suggests installing ext-imagick (to generate QR code images)
endroid/qr-code suggests installing symfony/http-foundation (Install if you want to use QrCodeResponse)
Writing lock file
Generating autoload files
Endroid Installer detected project type "all"
```

# テスト実行

GitHubに載っているサンプルコードを実行してみます。

```php:index.php
<?php
require_once __DIR__ . '/vendor/autoload.php';

use Endroid\QrCode\QrCode;

$qrCode = new QrCode('Life is too short to be generating QR codes');

header('Content-Type: '.$qrCode->getContentType());
echo $qrCode->writeString();
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96507/32735018-d78a-e2a3-4fb2-3800f30b0938.png)

ちゃんとiPhoneのカメラで認識します。

![IMG_2435.jpeg](https://qiita-image-store.s3.amazonaws.com/0/96507/61143651-f37a-c315-b481-ed0301ef0b82.jpeg)

# 色々試す

```php:index.php
<?php
require_once __DIR__ . '/vendor/autoload.php';

use Endroid\QrCode\QrCode;

// QRコードオブジェクトの生成
// 引数にQRコードにしたい情報の文字列を渡す。
$qrCode = new QrCode('https://qiita.com/danishi/items/fd8038ee373c04b94bf6');

// サイズ設定（ピクセル）
$qrCode->setSize(400);

// 余白の設定（ピクセル）
$qrCode->setMargin(10);

// 前景色の設定（RGBA）
$qrCode->setForegroundColor(['r' => 0, 'g' => 128, 'b' => 0, 'a' => 0]);

// 背景色の設定（RGBA）
$qrCode->setBackgroundColor(['r' => 255, 'g' => 255, 'b' => 255, 'a' => 0]);

// ロゴを設定
$qrCode->setLogoPath('qiita.png');

// ロゴのサイズ設定
$qrCode->setLogoSize(50, 50);

// ファイルに出力
$qrCode->writeFile(__DIR__.'/qrcode.png');

// ブラウザにQRコードを返す。
//header('Content-Type: '.$qrCode->getContentType());
//echo $qrCode->writeString();

// imgタグに表示
$img = base64_encode($qrCode->writeString());

?>
<html>
	<body>
		<img src="data:image/gif;base64,<?= $img ?>">
	</body>
</html>
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96507/409d2f83-8611-f728-f002-dfc644fb2fbb.png)
Commands for Github

Below is the table of Git commands

Command|Description|Example
:--------------|:------------------------|:---------------------
git help      |Show help on a command   |$ git help push       
git config     |Configure Git            |$ git config --global …
source <file>  |Activate Bash changes 	  |$ source ~/.bash_profile
mkdir -p	|Make intermediate directories as necessary|$ mkdir -p repos/website
git status	|Show the status of the repository	|$ git status
touch <name>	|Create an empty file	|$ touch foo
git add -A	|Add all files or directories to the staging area	|$ git add -A
git add <name>	|Add given file or directory to staging area	|$ git add foo
git commit -m	|Commit staged changes with a message	|$ git commit -m "Add thing"
git commit -am	|Stage and commit changes with a message	|$ git commit -am "Add thing"
git diff	|Show differences between commits, branches, etc.	|$ git diff
git commit --amend	|Amend the last commit	|$ git commit --amend
git show <SHA>	|Show the details of indicated commit 	|$ git show abcd123…
php-master-changes 2019-04-07

今日はビルドシステムの修正、ドキュメントの修正、古いシステム用の条件コンパイルを削除する修正があった！

# 2019-04-07
## cmb69: Fix ASAN configuration
- https://github.com/php/php-src/commit/3393ae6e77c485c3ac69a11287432eee3088cd76
- [7.4~]
- Windows 版のビルドシステムで、ASAN の設定が壊れていたのを修正

## petk: [ci skip] Update release process docs to Markdown
- https://github.com/php/php-src/commit/8bcc7acbb027ae156f60618c9dcf38a6d74e4405
- [7.4~]
- docs/release-process.md をマークダウン化しつつ微修正

## petk: Refactor AC_INIT in configure.ac and PHP versions
- https://github.com/php/php-src/commit/afd52f9d9986d92dd0c63832a07ab1a16bf11d53
- [7.4~]
- ビルドシステムで、configure.ac の AC_INIT を Autoconf 2.53 以降にあわせて修正
- バージョン情報とか公式サイトへのリンクが `./configure -h` へ埋め込まれるよーになったそうな

## petk: Remove HAVE_LIMITS_H
- https://github.com/php/php-src/commit/fd1ad1e25a6d0676a560d237ff5f44faa6e1dc87
- [7.4~]
- HAVE_LIMITS_H の条件コンパイルを削除
- limits.h のヘッダ自体は C89 標準のため
- バンドルライブラリで依存しているのがあるので、一部は残してある

## petk: Remove HAVE_SIGNAL_H
- https://github.com/php/php-src/commit/5f8915786f9fc3ec1af1089c9848f65a8d1541f5
- [7.4~]
- HAVE_SIGNAL_H の条件コンパイルを削除
- signal.h のヘッダ自体は C89 標準のため
- libmagic は 5.35 以降で HAVE_SIGNAL_H のチェックをしないようになってるらしい、が、PHP では 5.34 の改変版を使ってるので configure.ac でのチェックは残している
Error: Adaptive Server connection timed outの解決方法

rubyスクリプトを使って大量データWebサーバからロードしたとき下記エラー「Error: Adaptive Server connection timed out」が発生しました。私は下記方法で解決しました。
C:\msys32\mingw32\etc\freetds.confにある
timeout = 10 ※10秒
connect timeout = 10　※10秒
↓変更
timeout = 60
connect timeout = 60
GitHub GraphQL API Explorer の使い方

https://developer.github.com/v4/explorer/
にアクセスして、ログインします。

![github_00.png](https://qiita-image-store.s3.amazonaws.com/0/179446/acece961-839e-10db-85e3-f2bc4f3e52af.png)

1) 次をクリックして、実行します。
![sankaku.png](https://qiita-image-store.s3.amazonaws.com/0/179446/1c57298a-879d-f1a5-aa86-3b4f27feeb3b.png)

実行結果
![github_01.png](https://qiita-image-store.s3.amazonaws.com/0/179446/566782eb-9fa5-670a-a826-3b786a577b32.png)

2) 左の窓のデータを変更して実行

```json
{
  user(login: "ekzemplaro") { name location url}
}
```

実行結果
![gotjib_02.png](https://qiita-image-store.s3.amazonaws.com/0/179446/ea270bfe-1d8b-399b-85f8-7eac3ba5cc45.png)

3)　別のデータを入れてみます。

```json
{
 viewer {
    repositories(first: 1) {
      edges {
        node {
          name
          description
        }
      }
    }
  }
}
```

実行結果
![github_03.png](https://qiita-image-store.s3.amazonaws.com/0/179446/c0de0870-1687-7c5c-18c0-821a0571cdc7.png)

4)　更に別のデータを入れてみます。

```json
{
 viewer {
    repositories(last: 2) {
      edges {
        node {
          name
          description
        }
      }
    }
  }
}
```

実行結果
![github_04.png](https://qiita-image-store.s3.amazonaws.com/0/179446/55c85a4d-3a1a-3095-6788-86c0759b3694.png)

参考
[GitHub で GraphQL を使う (curl)](https://qiita.com/ekzemplaro/items/35f37293cc49cdb09587)
Vueで候補日入力フォームを作る

#Vueで候補日入力フォームを作る
最近作るものによく入れていたので忘れたときに見れる用に備忘録的な感じで書きます。
もっとスマートなやり方を知っている方いらっしゃったら教えてください！
Vueのプロジェクトファイルも公開しています。
余計なもの消してないですけど(-_-;)
[Github](https://github.com/harakeishi/CandidateDateform)

#出来るもの
![ovh87-acmv1.gif](https://qiita-image-store.s3.amazonaws.com/0/323051/3dd334d0-6e8e-48c4-fa66-dc45403f9830.gif)


#とにかく全体コード

```vuejs:CandidateDate.vue
<template>
  <div class="">
    <h1>候補日選択</h1>
    <ul>
      <li
        v-for="(item, index) in CandidateDate"
        :key="'list-item' + index"
        class="item"
      >
      <p class="item_title">候補日{{ index + 1 }}
        <input v-if="(CandidateDate.length > 1)" type="button" @click="deleteItem(index)" class="Dbtn" value="x">
      </p>
      <p>日付を選択</p>
      <input type="date" v-model="item.date">
      <p>開始時間を選択</p>
      <input type="time" v-model="item.start">
      <p>終了時間を選択</p>
      <input type="time" v-model="item.end">
      </li>
    </ul>
    <input type="button" @click="additem" value="候補日を追加">
  </div>
</template>

<script>

export default {
  name: 'home',
  data () {
    return {
      CandidateDate: [
        {
          date: '',
          start: '',
          end: ''
        }
      ]
    }
  },
  methods: {
    additem () {
      this.CandidateDate.push({
        date: '',
        startTime: '',
        endTime: ''
      })
    },
    deleteItem (index) {
      this.CandidateDate.splice(index, 1)
    }
  }
}
</script>

<style media="screen">
.item{
  margin: 5px auto;
  border: solid 2px rgb(83, 148, 154);
}
.item_title{
  font-weight: bold;
  text-align: left;
  height: 50px;
  font-size: 30px;
  width: 100%;
  margin-top: 0;
  color: rgb(255, 255, 255);
  background-color: rgb(83, 148, 154);
}
ul {
  list-style: none;
  overflow: auto;
  max-height: 320px;
  max-width: 500px;
  width: 50%;
  margin: auto;
}
.Dbtn{
  float: right;
  width: 50px;
  height: 50px;
  font-size: 20px;
}
</style>

```
説明とか後々追記していきます
【初投稿】LAMPとは

LAMPとは、Webアプリケーションの実行環境の組み合わせのこと。
OS　：Linux
Webサーバ　：Apache
データベース　：MySQL
スクリプト言語　：PHP（Ruby,Pythonなど）

上記の頭文字をとってLAMPと言う。
ハリーポッター「ダンブルドア軍団」に習うプログラマの組織化。仮説（19）

何か、大きいシステムを設計・構築する際に、一人ではなく何人かで班を作って作業することがある。

どんなふうに班を作ると成功するかを考えるときハリーポッター「ダンブルドア軍団」を参考にするとよいかもしれない。

ハリーポッター「ダンブルドア軍団」は、「ハリー・ポッターと不死鳥の騎士団」（第５巻）に登場する、子供達だけの組織。

ハリーポッター「賢者の石」（第１巻）に出てくる蛇は、Pythonらしい。
https://harrypotter.fandom.com/wiki/Python

Harry Potter and the Philosopher's Stone (First mentioned)
https://www.jkrowling.com/book/harry-potter-philosophers-stone/

主な特徴を記録する

 1. 子供達だけの組織
 2. 教えるのは子供
 3. 主要６人は女性３人（ハーマイオニー、ジニー、ルーナ）、男性３人（ハリー、ロン、ネビル）
 4. 場所は必要の部屋
 5. 魔法省に対立して組織化
 6. 主要構成員のハーマイオニーとロンは監督生という管理組織の一員でもある
 7. 相似な構造の大人の組織「不死鳥の騎士団」
ネビルの両親、ハリーの両親、ロン・ジニーの両親は、第一次不死鳥の騎士団の構成員
 8. ダンブルドア軍団を作るまでは学校教育を受けてきた
影響を与えたと思われる教師

ダンブルドア
マクゴナガル
ハグリッド
ルーピン
スネイプ
（上記５人は不死鳥の騎士団員）

# プログラミングへの応用
## 1. 子供だけの組織
ハリーポッターは11歳の誕生日に魔法使いであることを知る。
経験則では１０歳で職業を自覚するとよい中央値だと理解している。

バイオリニスト、ピアニストは３歳から始める人たちがいる。歌舞伎でも３歳が初舞台の方々がいる。初就職が22歳、24歳では職業人としての自覚が必要な時に仕事をしていないのでは悲しいかもしれない。

子供だけの組織であると、法律的な法人格が得られないかもしれない。
ダンブルドア軍団は、大人の名前を冠し、結果として責任をダンブルドアが取った。

子供だけの組織でも、大人の名前あるいは大人が組織している法人の名前を冠して、その大人または法人に責任を取ってもらえばよい。

## 2. 教えるのは子供
子供が、子供にプログラミングを教えてよい。
教えることによって、自分が何がわかっていて、何がわかっていないかがわかることがある。

## 3. 主要員は女男同数。
性別の比率が50%ぴったりであることは必要条件ではない。
現実に存在数の比率に比例していればよい。

## 4. 場所は必要の部屋
必要な場所は、必要に応じて、大人または法人に用意してもらえばよい。
学校での活動であれば、学校に。学校以外の機関に部屋を用意してもらってもよい。
あるいは、自宅で網を利用してもよい。

## 5. 権力または多数派に対抗して組織化
例えば、Windowsが多数派であれば、Raspberry PI(Raspbian)で組織化するなど、
現在支配的な組織の中だけで活動しないことが鍵かも。

## 6. 主要構成員は現在の管理組織の一員でもある
学校における部活、社会教育組織、産業活動、子供会などの地域活動の一部として活動してもよい。

## 7. 相似な構造の大人の組織
Raspberry PIであれば、Raspberry PI Foundationと相似にしてもよい。

## 8. 学校教育を受けてきた
学校教育で実施していることのうち、役立つものは何でも活用すればよい。
5.で記載した、多数派だけに依存していないことが鍵かも。

# 参考資料追記
新人(学生)を指導するよりも新人(学生)に指導してもらった方が効率的。仮説（139）
https://qiita.com/kaizen_nagoya/items/db993b1536055029f7c8

ハリポタファンによるハリポタファンのための闇の魔術に対する防衛術
https://qiita.com/kaizen_nagoya/items/9ffa23eb73e57aac7dd1

M.S.WindowsにPython3を導入する（７つの方法、7つの罠）2024年版
https://qiita.com/kaizen_nagoya/items/2b6e7643fb164c287f4e

# 文書履歴(document history)
ver. 0.01 初稿 20190407
ver. 0.02 プログラミングへの応用追記 20190408
ver. 0.03 10歳　追記 20190409
ver. 0.04 仮説（19）追記 20190422
ver. 0.05 資料追記 20220313
ver. 0.06 Python追記 20240104
### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
パッケージの利用状況を分析する "cranlogs" Package の紹介

元ネタ記事

https://www.r-bloggers.com/how-many-downloads-does-my-package-have/

久しぶりにR-Bloggersの最新記事を見ていたらキャッチーなタイトル記事が挙がっていたので記載されていたコードを眺めてみました。

https://github.com/metacran/cranlogs

機能としては、目立ったものはないですが、ダウンロード数の期間の設定とかが容易にできるし、コードが直感的に触れる感じが良さそう。

> Everyone that authors an R package is curious about how many users download it. As far as I know there’s still no way to get information on all the downloads, from all the R mirrors. Here I’m using package cranlogs, which only gives information on the downloads from the R Studio mirror. It also does not allow to now from where in the world these downloads were made. However, it has a major advantage: speed! The package cranlogs provides a easy (and way faster) method to get this information without having to download all the log files (which can take a long time).


要約すると通常ならログファイルをダウンロードして情報を入手するしかないところを、RStudio Mirrorを通してめちゃ早く簡単にデータにアクセスできるようにしたパッケージです。

...という感じぽいです。

# 分析準備

```{r}
# install.packages("cranlogs") #初めて使う人はインストールが必要
library(cranlogs)
library(ggplot2) #可視化に使用
library(tidyverse)
```


今回は自分が開発・メンテしているパッケージのダウンロード数を分析してみます。

https://github.com/koki25ando/FlickrAPI

# 分析開始

```{r}
FlickrAPI_downloads <- cran_downloads(packages="FlickrAPI", from = "2019-01-01", to = Sys.Date()-1) #期間は今年の初めから
head(FlickrAPI_downloads)
```

```{r}
         date count   package
68 2019-01-01     0 FlickrAPI
69 2019-01-02     0 FlickrAPI
70 2019-01-03     0 FlickrAPI
71 2019-01-04     0 FlickrAPI
72 2019-01-05     0 FlickrAPI
73 2019-01-06     0 FlickrAPI
```
# 可視化

```{r}
FlickrAPI_downloads %>% 
  ggplot(aes(date, count)) + 
  geom_line(colour = "red",size=1) + 
  labs(title = paste0("FlickrAPI daily downloads ", Sys.Date()-1), 
       x = "Time",
       y = "No. of downloads")
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/83838/ff60d74d-0208-2e53-ecaf-2027839cbc15.png)



ダウンロード数がもっとも多かった10日を表示

```{r}
FlickrAPI_downloads %>% 
  arrange(desc(count)) %>% 
  head(10)
```

```{r}
         date count   package
1  2019-01-31    94 FlickrAPI
2  2019-01-30    67 FlickrAPI
3  2019-04-02    24 FlickrAPI
4  2019-03-27    18 FlickrAPI
5  2019-03-08    17 FlickrAPI
6  2019-03-28    17 FlickrAPI
7  2019-02-12    16 FlickrAPI
8  2019-02-04    15 FlickrAPI
9  2019-02-20    14 FlickrAPI
10 2019-02-25    14 FlickrAPI
```

リリース直後のダウンロード数が94と67でもっとも多かったみたいです。

その次の4月2日には下記のツイートでステッカーを貼ったタイミングのようです。

https://twitter.com/ko25and/status/1112944485162315776



1日平均ダウンロード数

```{r}
mean(FlickrAPI_downloads$count, na.rm = TRUE)
```

```{r}
[1] 7.979381
```
# まとめ

直感的に触れるパッケージなので参考になりましたし、毎日平均では約8ダウンロードもされているみたいなので今後とも頑張ってアップデートしていきます。
Raspberry PiをSIPページングBOX化する

# Raspberry PiをSIPページングBOX化する

某社のIPページングBOXが終売になってしまい、OEM元の製品を見つけたけど、
需要がそこまで有るとも思えず、RasPiで出来るかどうか試しただけだけど、普通に出来たから載せてみます。

## 環境

- RasPi
    - Raspberry Pi 3B+
- OS
    - Raspbian GNU/Linux 9.8 (stretch)

## 環境準備

Asteriskをインストールし、Asteriskユーザがオーディオデバイスを触れるようにグループに追加します。

```
# apt install asterisk
# usermod -a -G audio asterisk
```

## 各種設定

SIP周りの設定は普通なので省略

modules.confは chan_console.so もnoloadにしないと、手元の環境では動かなかった。

```modules.conf
; Load either OSS or ALSA, not both
; By default, load OSS only (automatically) and do not load ALSA
;
load => chan_alsa.so
noload => chan_oss.so
noload => chan_console.so
```

output_deviceはaplay -Lで確認出来るけど、RasPiならたぶん一緒

```alsa.conf
[general]
autoanswer=yes
context=local
extension=s
output_device=sysdefault:0
noaudiocapture=true
```

extensionはこんな感じ
一部、[PAISTページング](https://www.voip-info.jp/index.php/PIAST_%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%B3%E3%82%B0)のページを参考にさせていただきました。
GPIO使えば起動回路も作れると思うけど、そこまでは試してないです。

```extension.conf
[incoming]
exten => _X.,1,Goto(paging,s,1)

[paging]
exten => s,1,NoOp(Paging Start)
;exten => s,n,System(/home/pi/relayon.sh)
exten => s,n,Dial(Console/Alsa,,A(beep))

; Hangup
exten => h,1,NoOp(Paging Hangup)
exten => h,n,System(asterisk -rx 'channel originate Console/Alsa application Playback hello-world')
;exten => h,n,System(/home/pi/relayoff.sh)
```

## ToDo

- 呼び出し側にも冒頭音が聞こえるとベター
- GPIO使って起動回路
- 本機で使うなら、シリアルコンソール使えるようにした方がいいかも。
Androidアプリ内課金 消費税10%対策 【増税】

2019年10月に消費税10%が予定されていますが、Androidアプリのアプリ内課金はどうなるのか8%に増税時のことを踏まえてまとめました。
<font color="red">今回の件は問い合わせをして裏を取ったつもりですが、間違っていても責任等はとれません。</font>
（一応課金関係なので）

###・GooglePlayConsoleの価格設定画面
![zei.png](https://qiita-image-store.s3.amazonaws.com/0/252283/efa02f04-73ab-632f-bc98-540035c35c0f.png)

##〇買い切りアイテムの場合
GooglePlayConsoleの[アプリ内サービス]で[地域別の価格]から日本を選んでGoogleが設定する8%を適応していても、手動で税込み価格を設定していても、増税時に勝手に値上がりすることはありません。
そのため、10%になったら[為替レートを更新]ボタンで10%の税率を適応させるか、手動で数値を入力して更新する必要があります。

しかし、Googleの消費税計算は一桁の数値が切り捨てとも四捨五入とも違うルールなので、手動で入力が良いかと思います。

###・為替レート反映例
税抜 → Google税込 (実際の税込)
190 → 200 (205.2)
191 → 210 (206.28)
199 → 210 (214.92)
200 → 220 (216)
210 → 230 (222.6)
220 → 240 (233.2)
290 → 310 (313.2)
300 → 320 (324)
310 → 330 (334.8)
320 → 350 (345.6)

もちろん値上げしないで、そのままの値段でサービスも考えられます。

##〇定期購読の場合
こちらも増税時に勝手に値上がりすることはありません。
ですが料金を変更すると問題が起きてしまいます。
それは、[為替レートを更新]ボタンで料金を上げても、手動で数値を入力して更新しても、すでに購入済みの定期購読ユーザーに対して、少なくとも30日間の通知期間が設けられて、同意してもらわないと解約扱いになるということです。<font color="red">（為替レート更新でも同意が必要とのこと）</font>

数円の値上げのために定期購読中のユーザーの同意をとるというのは、そうとうきついですね。
あまり使っていないユーザーは、じゃあこの機会にやめようってなるかと思います。

###・対策考察
####1.値上げしない
　- 利益が減りますが、増税時はそのままにしておく。
　- 運営側が泣くパターン。
####2.思い切って税込み料金を変更する
　- サービスを始めたばかり等ダメージが少ないと判断して、ユーザーにGoogleから送られる値上げ内容に同意してもらう。
　- 何か新機能を付けるなどして、値上げを増税前にするのもありかと。
####3.定期購読中の人のアイテムと、これから購入する人のアイテムを分ける
　- 既存のアイテムは値段を変更せず、ユーザーの購入画面にも表示しない。代わりに新定期購読アイテムを作成して、これからは新料金で買ってもらう。
　- 前から買っている人は買い続けている限りお得で、一度何かの都合でやめてしまうと旧料金に戻ることができないので、トラブルの元になる可能性もある。

##〇感想
為替ルートの変更に伴い、勝手に料金があがることを期待したけど、駄目みたいですね。
定期購読中の人全員の同意を取るのは不可能でしょうから、定期購読中の人は旧値段で買い続けてもらうしかないかなぁと。
増税時は国民みんなピリつくので、下手な値上げは炎上しかねないため注意が必要。

##〇おまけ
事前に値上げ対応してみました。
Google Play Consoleで変更した結果、ほぼ即時反映されました。

あと、有料アプリの値段も勝手には上がらないので、手動で変更する必要があります。

##〇URL
・価格やアプリ配布の設定
https://support.google.com/googleplay/android-developer/answer/6334373?hl=ja