OmniAICreator/Qiita-1.07M huggingface dataset:
SwiftRater を使って好きなタイミングで SKStoreReviewController を表示する


# TL;DR

iOS 10.3 からアプリ内でレーティングできる SKStoreReviewController が使えるようになりましたが表示するタイミングを調整しないといけないですよね。その調整が簡単にできるライブラリ [SwiftRater](https://github.com/takecian/SwiftRater)を作りました。

# SKStoreReviewController

iOS 10.3 からアプリ内でレーティングできるようになりましたね。記事もいくつか出ています。

* [iOS 10.3で追加されたアプリレビューを投稿できるSKStoreReviewControllerを試してみた](http://qiita.com/waytoa/items/9bab33f27c2c24a35803)
* [<Swift> iOS 10.3からアプリ内レーティングが可能に！- SKStoreReviewController -](http://qiita.com/mshrwtnb/items/6b9b7e9850f02f43e254)

ですが、どのタイミングで表示すればいいかは考えないといけないですね。

似たようなライブラリに [appirater](https://github.com/arashpayan/appirater) というものがありますが、
* SKStoreReviewController にはまだ対応していない
* Objective-c で書かれている
だったので Swift で書いてみました。

https://github.com/takecian/SwiftRater

![](https://github.com/takecian/SwiftRater/raw/master/Resource/later1.gif)

## 使い方

Cocoapods か Carthage でインストールします。

### Cocoapods

```
pod "SwiftRater"
```

### Carthage

```
github "takecian/SwiftRater"
```

AppDelegate の中でセットアップをします。

```
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        SwiftRater.daysUntilPrompt = 7
        SwiftRater.usesUntilPrompt = 10
        SwiftRater.significantUsesUntilPrompt = 3
        SwiftRater.daysBeforeReminding = 1
        SwiftRater.showLaterButton = true
        SwiftRater.debugMode = true
        SwiftRater.appLaunched()

        return true
}

```

SwiftRater では レーティングのポップアップを表示するための条件を複数指定できます。

| Property      | Description           |
| :------------- |:-------------|
| daysUntilPrompt      | ポップアップを表示するまでの日数。 |
| usesUntilPrompt      | ポップアップを表示するまでの起動(使用)回数   |
| significantUsesUntilPrompt | ポップアップを表示するまでの重要なアクションの実行回数 |

例えば、「初回起動から10日経つか、15回起動したらポップアップを表示する」という条件にしたいなら

```
SwiftRater.daysUntilPrompt = 10
SwiftRater.usesUntilPrompt = 15
SwiftRater.appLaunched()
```

と設定します。

例えばインスタグラムのような写真投稿アプリの場合で「写真を10枚投稿したらポップアップを出す」という条件にしたいなら、

```
SwiftRater.significantUsesUntilPrompt = 10
SwiftRater.appLaunched()
```

と指定し、写真投稿を実装する部分に、`SwiftRater.incrementSignificantUsageCount()` を追加します。


```
func uploadPhoto() {
    ** upload photo **
    
	SwiftRater.incrementSignificantUsageCount()
}

```

そしてポップアップを表示したい場所に`SwiftRater.check()`を追加します。

```
override func viewDidAppear(_ animated: Bool) {
   super.viewDidAppear(animated)
   SwiftRater.check()
}
```
セットアップの時の指定した条件を満たしていたら（一回だけ）レーティングのポップアップを表示します。

### iOS10.3 未満のデバイスへの対応

iOS10.3 未満のデバイスに対しては Alert を表示して、AppStore へ遷移するようになっています。

![](https://github.com/takecian/SwiftRater/raw/master/Resource/later2.gif)

iOS10.3 未満のデバイスに表示するポップアップにはすぐにはレーティングしない「あとで(Remind later)」も選択できます。「あとで(Remind later)」を選んだユーザーには x 日後に再度ポップアップを表示する(リマインダー)ことができます。この「あとで」の選択肢を表示するかどうか、リマインダーの設定もセットアップ時にできます。

```
SwiftRater.daysBeforeReminding = 1
SwiftRater.showLaterButton = true
```

### 動作確認

開発中に動作確認をしたい場合は、

```
SwiftRater.debugMode = true
```

にして実行すると毎回ポップアップが表示されるようになります。（AppStore に提出するときは false にしておかないと毎回ポップアップが表示されてしまうので注意(デフォルト:false)）

ユーザーのレーティングを集めることは重要なことなのでこのライブラリを使ってどんどんレーティングを増やしてみるのはいかがでしょうか。

[SwiftRater](https://github.com/takecian/SwiftRater)
《Wordpress》Contact Form 7で「ajaxzip3」を使って郵便番号で住所検索する。


入力フォームプラグイン「Contact Form 7」に、郵便番号を入力すると自動で住所を入力してくれる「ajaxzip3」を導入します。

読み込みはCDNから呼び出します。

```html

<script src="https://ajaxzip3.github.io/ajaxzip3.js" charset="UTF-8"></script>

```

郵便番号のフィールドの入力をトリガーとして探しに行くようにスクリプトを記述します。

メソッドの引数には、郵便番号と、出力先の`name`属性を記述します。

```js

(function($) {
  $('#zip').keyup(function(){
    AjaxZip3.zip2addr(this, '', 'pref', 'address'); // .zip2addr(郵便番号（全てor3桁）, 郵便番号（下4桁）, 都道府県, 市区町村)
  })
})(jQuery);

```

WordPressの管理画面のコンタクトフォームの編集画面から以下のコードを入力します。

```html.contactform7

[text zipcode id:zip]
[select pref "--" "北海道" "青森県" "岩手県" "宮城県" "秋田県" "山形県" "福島県" "茨城県" "栃木県" "群馬県" "埼玉県" "千葉県" "東京都" "神奈川県" "新潟県" "富山県" "石川県" "福井県" "山梨県" "長野県" "岐阜県" "静岡県" "愛知県" "三重県" "滋賀県" "京都府" "大阪府" "兵庫県" "奈良県" "和歌山県" "鳥取県" "島根県" "岡山県" "広島県" "山口県" "徳島県" "香川県" "愛媛県" "高知県" "福岡県" "佐賀県" "長崎県" "熊本県" "大分県" "宮崎県" "鹿児島県" "沖縄県" ]
[text address]

```


おわります。
JMeter(GUI)をMacで使ってレスポンスをファイル出力するまでやってみた

特定URLにGETリクエストで1秒間に200リクエストを5秒間実施し、レスポンスをファイル出力するまでを試しました

# 情報

+ Mac OSX 10.11.6
+ Apache Jmeter 3.1.2

# 参考サイト

+ [負荷テスト・パフォーマンス測定ツールのJMeterのインストールと簡単な使い方](http://qiita.com/PlanetMeron/items/a604645d6f89b6ce3a14)
+ [JMeter の利用方法(1) – Ramp－up、スレッド数、ループ回数の誤用](http://keis-software.com/2013/09/02/jmeter-%E3%81%AE%E5%88%A9%E7%94%A8%E6%96%B9%E6%B3%951-ramp%EF%BC%8Dup%E3%80%81%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E6%95%B0%E3%80%81%E3%83%AB%E3%83%BC%E3%83%97%E5%9B%9E%E6%95%B0%E3%81%AE%E8%AA%A4/)
+ [JMeterでSSLしたけど](http://kazu-360.cocolog-nifty.com/blog/2007/08/jmeterssl_5f3e.html)
+ [JMeter - "Save Response to File" Listener](http://gerardnico.com/wiki/jmeter/save_response_to_file)

# インストール

公式ページのダウンロードページから Binary をダウンロードします。
ダウンロード後、解答し、以下のコマンドで GUIが起動します。

```bash
$cd apache-jmeter-3.1\ 2/bin/
$java -jar ApacheJMeter.jar
```

# GETリクエストを投げてみる

以下のサイトを参考に実施

+ [負荷テスト・パフォーマンス測定ツールのJMeterのインストールと簡単な使い方](http://qiita.com/PlanetMeron/items/a604645d6f89b6ce3a14)

ただし、HTTPのリクエスト成功するもののHTTPSのリクエストが失敗(net.ConnectException)。
こちらはググってみると以下のようにする必要がありました。

+ ポート番号:443
+ プロトコル:HTTPS

これで成功。
レスポンスについては「リスナー」->「結果をツリーで表示」で詳細が確認できるためこちらが便利。

なお、どれだけの負荷を掛けるかという設定では以下が参考になりました。

[JMeter の利用方法(1) – Ramp－up、スレッド数、ループ回数の誤用](http://keis-software.com/2013/09/02/jmeter-%E3%81%AE%E5%88%A9%E7%94%A8%E6%96%B9%E6%B3%951-ramp%EF%BC%8Dup%E3%80%81%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E6%95%B0%E3%80%81%E3%83%AB%E3%83%BC%E3%83%97%E5%9B%9E%E6%95%B0%E3%81%AE%E8%AA%A4/)

# 結果(レスポンスBody)をファイルに出力する

[JMeter - "Save Response to File" Listener](http://gerardnico.com/wiki/jmeter/save_response_to_file)

検証の際に負荷をかけ、レスポンスBodyに特定文字列が含まれるかなどを確認したかったので、一旦ファイル出力を行いました。

対応方法ですが、「リスナー」->「シンプルデータライター」を利用することで可能です。
上記画面で 「Configure」->「Save Response Data(XML)」と「Save As XML」を選択する事でレスポンスを含むファイルが出力されます。
AnsibleのRoleで任意のディレクトリを指定する

#はじめに
Ansibleでは各PlaybookをRoleとして独立させることで、汎用性が高まります。

しかし、Role内でのcopyモジュールやtemplateモジュールのsourceディレクトリは、Roleディレクトリ配下のfiles,templatesに限定されてしまいます。

フルパスで指定もできますが、gitなどで管理する都合上、フルパスは現実的ではありません。

そこで、Role内で任意のディレクトリを相対パスで指定する方法を紹介します。


#sample

##ディレクトリ構成

```bash:ディレクトリ構成
site.yml
hosts/inventory_file
roles/
|--role_name/
|  |--tasks/
|  |  |--main.yml
SRC_DIR/
|--SRC_FILES
```


##Role
例として、templateモジュールで任意のディレクトリに置いたテンプレートファイルを指定します。

ここではrolesディレクトリと同じ階層にあるSRC_DIRディレクトリを指定することにします。

###マジック変数inventory_dirを利用

```yaml:roles/role_name/tasks/main.yml
---
- name: sample1
  template:
    src: "{{ inventory_dir }}/../SRC_DIR/SRC_FILES"
    dest: /path/to/dest
```

マジック変数`inventory_dir`にはansible-playbook実行時に指定したインベントリファイルのディレクトリ（例では./hosts）がセットされています。
ここからの相対パスを指定することで任意のディレクトリを指定できます。

###マジック変数inventory_dir+ dirnameフィルタを利用

```yaml:roles/role_name/tasks/main.yml
---
- name: sample2
  template:
    src: "{{ inventory_dir | dirname }}/SRC_DIR/SRC_FILES"
    dest: /path/to/dest
```

また、`inventory_dir`に対して`dirname`フィルタを適用することで`inventory_dir`の一階層上のディレクトリを指定することもできます。

`dirname`フィルタはパスからディレクトリを抽出することができますが、ディレクトリパスに対して適用すると最下層ディレクトリがファイル名として扱われ、結果的に一階層上のディレクトリを抽出することができます。

[公式ドキュメント](http://docs.ansible.com/ansible/playbooks_filters.html)

#まとめ
環境などに依存するファイルをRoleの外に置けるため、Roleの汎用性を保つのに役立つと思います。
Google Apps Scriptのウェブアプリケーションをプロジェクトバージョンを更新せずに最新版を反映させたい

# 内容
Web Appsを使用するためにスクリプトを作成しているとき、作成したスクリプトをWeb Appsで使用するためには毎回プロジェクトバージョンを更新する必要があります。私はときどきこの更新を失念したまま動作確認を行い、動かないと悩まされることがあります。私にとっては毎回の更新作業はとても大変に感じており、タイトルにあるようなGoogle Apps Scriptのウェブアプリケーションをプロジェクトバージョンを更新せずに最新版を反映させたいと思っていました。最近、Web Appsを一部使用したライブラリを作成している際、このような更新をせずとも最新版を反映する方法を見つけましたのでご紹介させていただきます。
もしも既知の情報であれば申し訳ありません。

# 準備
Google Apps Scriptを2つ新規作成します。一つはライブラリとして、もう一つはWeb Appsの起動用として。次のような流れでそれぞれを設定してください。

## ライブラリ側
1. ライブラリとなるプロジェクトのスクリプトエディタを起動
1. スクリプトIDの取得
    1. ファイル
    1. プロジェクトのプロパティ
    1. スクリプトIDをコピー

今の場合、自分で使用するだけなので共有設定は不要です。

## Web Apps側
1. Web Appsを使用するプロジェクトのスクリプトエディタを起動
1. ライブラリの登録
    1. リソース
    1. ライブラリ
    1. 「ライブラリを追加」へスクリプトIDを入力し追加ボタンを押す
    1. バージョンはその時の最新のもの、デベロッパーモードON（← これ重要です）
    1. 識別子を指定する（サンプルとして ``lib``）
    1. 保存
1. Web Appsを使用するプロジェクト内のスクリプト（例えばコード.gs）へライブラリ上の関数を指定します。メソッドがGETの場合はdoGetが、POSTの場合はdoPostが呼ばれます。
    - サンプルとして下記を想定します。下記を入力後はWeb Appsをデプロイする前に必ず保存してください。``lib``は識別子に対応しています。
        - ``function doGet(e) {return lib.doget(e)}``
        - ``function doPost(e) {return lib.dopost(e)}``
1. Web Appsをデプロイします。
    1. スクリプトエディタ
    1. 公開
    1. ウェブアプリケーションとして導入
    1. プロジェクトバージョンを新規作成（変更内容の説明は適当に入力　数字でも文字列でもOK）
    1. 次のユーザとしてアプリケーションを実行は自分にセット
    1. アプリケーションにアクセスできるユーザを全員（匿名ユーザを含む）にセット
    1. 更新ボタンを押す
    1. 現在のウェブ アプリケーションのURLをコピー
        - URLは ``https://script.google.com/macros/s/ ##### /exec`` です。
    1. OKボタンで終了

これで準備は完了です。この後は、ライブラリ側のスクリプトを変更すると、Web Apps側のプロジェクトはプロジェクトのバージョンを変更しなくても反映されます。

# 動作テスト
例えば下記のようなテストを行います。

**Web Apps側 :**　ライブラリの設定（識別子は``lib``）を行い、下記をコピーペーストして保存し、 上記の流れでWeb Appsをデプロイした状態

~~~gas:
function doGet(e) {
    return lib.doget(e);
}
~~~

**ライブラリ側 :**　下記をコピーペースト

~~~gas:
function doget(e) {
  return ContentService.createTextOutput(e.parameters.data);
}
~~~

**``doGet()``の起動 :** curlを使用してデータを送信します。doGetを起動させますので、データはURLのクエリパラメータとして記入します。

~~~
$ curl -L "https://script.google.com/macros/s/ ##### /exec?data=ok"
~~~

okが返されれば動作完了です。同様の方法でdoPostも使用することができます。

後は、ライブラリ側のスクリプトを変更して保存するだけでWeb Appsをデプロイしたプロジェクト側は特に何もすることなく、最新版でdoGet, doPostを使用することができます。個人的にはデバッグはこの方法で行い、実際に使用する際は、Web Apps側に戻すなどの使い方で進めています。
Linux kernel に認識させる、(仮想|物理)サーバーメモリサイズを制限する

# Linux kernel に認識させる(仮想|物理)メモリサイズを制限する

## 調査した背景・目的

- 複数のIaaS環境の仮想マシン性能比較のため、メモリ容量を合わせたかった。
- 一方のIaaSで提供されているスペックが、どうしてもメモリ容量が大きく同一条件にできなかった。
- 致し方ないので、OS(kernel)に認識されるメモリ容量を制限して同一条件に合わせる形とした。
- 具体的には、GRUBブートローダーが kernel を起動する際のオプションを変更し、メモリ容量を制限する方法を取った。

## CentOS 6.x grub 0.97 系 (grub-0.97-84.el6_5.x86_64) での手順

1. /boot/grub/grub.conf を /var/tmp へバックアップ
2. /boot/grub/grub.conf の起動カーネル設定内、kernel 行オプションパラメータに mem=<指定したいメモリ容量(メガバイト単位)>M 追加
3. 再起動、メモリ認識サイズ確認 (free(1), dmesg(1) コマンドなどで確認)

[※参考情報:RHEL 6.8 インストールガイド](https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/s2-trouble-ram.html)

## CentOS 7.x grub2 系 (grub2-2.02-0.34.el7.centos.x86_64) での手順

1. /etc/default/grub を /var/tmp/default-grub.org にバックアップ
2. /etc/default/grub GRUB_CMDLINE_LINUX 変数パラメータ末尾に mem=<指定したいメモリ容量(メガバイト単位)>M 追加
3. sudo /sbin/grub2-mkconfig -o /boot/grub2/grub.cfg 実行、grub.cfg ファイル更新
4. 再起動、メモリ認識サイズ確認 (free(1), dmesg(1) コマンドなどで確認)

[※参考情報:RHEL 7 システム管理者のガイド](https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sec-Customizing_the_GRUB_2_Configuration_File.html)


以上
Ansibleで対象Host全てを含む/etc/hostsを自動生成する

#

https://gist.github.com/rothgar/8793800
ここで議論されてますが、この方法がシンプルで、融通も効きそう。
テンプレートになっているので、他の記述も追加できるし。

```
- name: Generate /etc/hosts file
  template:
    src=files/hosts.j2
    dest=/etc/hosts
```

```files/hosts.j2
# {{ ansible_managed }}
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

{% for item in play_hosts %}
{% set short_name = item.split('.') %}
{{ hostvars[item]['ansible_default_ipv4']['address'] }}  {{ item }} {{ short_name[0] }}
{% endfor %}
```
(メモ) Basic 認証付きのページに、selenium をつかって、ＩＥでアクセスする。

とりあえず、メモです。つっこみどころ満載なので、コメント歓迎です。

selenium で、IE (10〜11)をつかって、Basic 認証を突破しようとすると、レジストリを変更する必要あり。
[ここを参考](https://blog.ham1.co.uk/2016/03/05/selenium-allow-basic-auth-in-ie11/)

**64bit の場合(windows7)**

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_HTTP_USERNAME_PASSWORD_DISABLE
を開けて、DWORD を新規で追加する。
キーの名前は、この２つで、値は、0
iexplore.exe
explorer.exe

うまくいきました。
SalesForce 用の OpenID Connect IdP Registration Handler & SCIM Client サンプル

Gistは埋もれていく & Gistペタペタ系記事はQiitaのが楽なんじゃないか？ということで、久しぶりに Qiita に。

## 前提

* Provisioning は SCIM で。
  * JIT Provisioning はしない。
* Email による紐付けではなく、ちゃんと Federation 用に識別子を発行して紐付けを行う。
  * 再利用の可能性のある識別子を紐付けに使うべきではない。

## SalesForce 向けの SCIM Provisioning サンプルコード。

SCIM の External ID に指定した識別子は SalesForce 側の Federation Identifier に入る。

```ruby
require 'rack/oauth2'

Rack::OAuth2.debug!

client = Rack::OAuth2::Client.new(
  identifier: '<YOUR-CLIENT-ID>',
  secret: '<YOUR-CLIENT-SECRET>',
  authorization_endpoint: 'https://login.salesforce.com/services/oauth2/authorize',
  token_endpoint: 'https://login.salesforce.com/services/oauth2/token',
  redirect_uri: '<YOUR-CALLBACK-URL>'
)

def endpoint_for(resource)
  scim_base_endpoint = 'https://<YOUR-DOMAIN>.my.salesforce.com/services/scim/v1'
  File.join(scim_base_endpoint, resource)
end

module JSONized
  def request_to(resource, method: :get, params: nil)
    response = send method, endpoint_for(resource), params.try(:to_json), 'Content-Type': 'application/json'
    puts JSON.pretty_generate JSON.parse(response.body)
  end
end

authorization_uri = client.authorization_uri(
  scope: [:api]
)
`open "#{authorization_uri}"`

print 'code: ' and STDOUT.flush
code = gets.chop

client.authorization_code = code
token = client.access_token! :body

token.extend JSONized
# token.request_to 'Entitlements' # => ここのレスポンスから適切な Entitlement (e.g. Standard User) の識別子を取得しておく。
token.request_to 'Users', method: :post, params: {
  externalId: '<OIDC-SUBJECT-VALUE>',
  userName: 'some-user@your-idp.example.comp',
  name: {
    familyName: 'User',
    givenName: 'Some'
  },
  emails: [{
    value: 'some-user@your-idp.example.com'
  }],
  entitlements: [{
    value: '<ENTITLEMETN-ID>'
  }]
}
```
https://gist.github.com/nov/782470463001d644a3ce7063ff916c14


## SalesForce の OIDC IdP 向け Registration Handler Apex Script。

Federation Identifier と OIDC の "sub" が一致すれば、その "sub" と当該 SalesForce アカウントを紐付ける。(createUser)
紐付け確定後は特に何もしない。 (updateUser)

```java
public class OIDCRegHandler implements Auth.RegistrationHandler{
  public User createUser(Id portalId, Auth.UserData data){
    List<User> users = [SELECT Id FROM User WHERE FederationIdentifier =:data.identifier];
    if (users.size() == 1) {
      return users[0];
    } else {
      return null;
    }
  }

  public void updateUser(Id userId, Id portalId, Auth.UserData data) {
  }
}
```
https://gist.github.com/nov/be7df5ec71d7eeb93063d2300f28ab90


## 補足

このサンプルでは、OIDC の Issuer はユーザー識別に用いていない。

OIDC は 原理的には Issuer & Subject のペアによりユーザーを一意に識別できることを保証しているのみで、Subject のみでユーザーを一意に識別することは保証しないプロトコルである。(SAML も同様である)

このサンプルは「あなたが当該 SalesForce テナントに設定する OpenID Connect IdP が一つのみであるため、Issuer はチェックせずとも固定値であることが確約されている」ということを前提としている点に注意すること。
MySQLでSTART GROUP_REPLICATIONを実行してもグループに参加できない時

#原因１

hostnameでお互いに通信できていない。
/etc/hostsに登録する。

#原因2

原因１を解決して、START GROUP_REPLICATIONを実行してもだめでした。
/var/log/mysqld.logをみると

```
2017-03-30T05:19:11.108563Z 0 [ERROR] Plugin group_replication reported: 'This member has more executed transactions than those present in the group. Local transactions: 78394537-1501-11e7-8d4e-00155d041427:1-2 > Group transactions: 6e1ebdff-4b6b-44eb-ba75-fdcb479ba0af:1-5,
78707fef-1501-11e7-8eaa-00155d041426:1-2'
2017-03-30T05:19:11.108601Z 0 [ERROR] Plugin group_replication reported: 'The member contains transactions not present in the group. The member will now exit the group.'
2017-03-30T05:19:11.108606Z 0 [Note] Plugin group_replication reported: 'To force this member into the group you can use the group_replication_allow_local_disjoint_gtids_join option'
```

`The member contains transactions not present in the group` 
グループには無いトランザクションを、参加メンバーが持っている事が問題らしい。

このノードは、まっさらな状態なので、本来は、起きないとおもいますが、原因１の時に、一度`START GROUP_REPLICATION`を実行して失敗しているのでこの不整合が起きたと思われます。

追加するノードで、`group_replication_allow_local_disjoint_gtids_join option`オプションをつけることでも解決できるようですが、
RESET MASTER;
START GROUP_REPLICATION;
を実行することでOKでした
Pepperタブレットのフリーズ回避

#この記事の内容
　Pepperアプリでは、たまにタブレットからのイベントが本体で受信できないことがあります。タブレット側のレスポンスを前提にアプリが構築されていた場合、アプリが進まなくなるためフリーズしてしまうおそれがあります。フリーズの回避方法と既存アプリでの確認方法を考えてみたいと思います。

#フリーズ回避方法
　タブレットから送信されたメッセージが本体側で受信できないことにより、アプリがフリーズする場合があります。そのため、タブレットからのメッセージ受信を前提とするアプリではタイムアウトルーチンを設けて、アプリのフリーズが回避できます。
![fig1.png](https://qiita-image-store.s3.amazonaws.com/0/156324/f5825200-1e86-daef-7fd8-4e7459fd9b22.png)
　次のようにプログラムすると、一定時間後タブレットからメッセージが来なかったとしても、アプリの進行は止まることはありません。
![fig2.png](https://qiita-image-store.s3.amazonaws.com/0/156324/6df56827-f74a-9d2f-8f3a-06e37c307823.png)
　正常にメッセージを受信できた場合のタイマー停止をお忘れなく。


#既存アプリでの確認方法
　開発済みのアプリでタイムアウトが実装されているか確認する方法を考えてみたいと思います。以下の3ステップのアプローチが有効と考えられます。

1.raiseEventによるALMemoryキーの確認
2.ALMemoryキーによるボックスの確認
3.ボックスごとの実装の確認

##1. raiseEventによるALMemoryキーの確認
1.ロボアプリの中に含まれているbehavior.xar以外のファイルに対して文字列”raiseEvent”の検索（grep）を行います。

```sh:プロジェクトフォルダ内のgrepコマンド例
> grep -r raiseEvent . | grep -v behavior.xar
./html/js/common.js:   ALMemory.raiseEvent("/Key/AppSample2, val);
```

2.検索結果にマッチしたファイル（JavaScriptあるいはHTML）をリストアップします。
3.該当ファイルのソースコードを確認し、”raiseEvent”に渡されるALMemoryキーリストを作成します。ラッパー等別メソッド経由で呼び出されている場合も同様です。

##2. ALMemoryキーによるボックス名の確認
1.raiseEventによるALMemoryキーの確認で作成されたALMemoryキーリストをbehavior.xarから見つけ出します。behavior.xarをエディタで開き、ALMemoryキーリストを検索します。一般的にbehavior.xarはChoregrapheで開きますが中身はXMLですので、テキストエディタで開けます。
注意：behavior.xarの編集はテキストエディタで編集は意図しない不具合やプログラムの破損に繋がるため、検索のみに留めます。
2.<Box/>エレメント内に関連するALMemoryキーが含まれていた場合、<Box/>エレメントのname属性をボックス名としてリストアップします。
　※複数のbehavior.xarがある場合、behavior.xarごとに同様の処理が必要になります。

##3. ボックスごとの実装の確認
1.Choregrapheでロボアプリプロジェクト（.pml）を開きます。
2.該当のbehavior.xarを開きます。
3.［プロジェクトオブジェクト］パネルから、虫眼鏡ボタンをクリックし、検索窓よりリストアップしたボックス名を検索します。［プロジェクトオブジェクト］パネルが表示されてない場合は、メニュー［表示］-［プロジェクトファイル］より［プロジェクトパネル］を表示させ、パネル下部の［プロジェクトオブジェクト］タブをクリックし表示できます。
![fig3.png](https://qiita-image-store.s3.amazonaws.com/0/156324/701d7b33-4acd-f791-5e42-e1621394b8cf.png)
プロジェクトオブジェクトパネル
4.対象のボックスがダイアグラムの場合、ダイアグラム内にイベントの出力口が確認できます。対象のボックスがPythonスクリプトボックスの場合、タブレット側からのコールバックが確認できます。
5.タブレットからイベントが来なかった場合に備え、タイムアウト等の回避策が実装されているか確認します。
例1）タイムアウト処理を追加：raiseEventと処理の間にタイムアウト処理を追加する。（前掲タブレットタイムアウトで紹介している方法です）
　※複数のbehavior.xarがある場合、behavior.xarごとに同様の処理が必要になります。
classを使わずにクラスを定義する

Ruby 2.3.1 で動作確認

Ruby におけるクラスは Class クラスのインスタンスです。
つまり、 ``Class.new `` を活用すれば、class 構文使わなくてもクラス作れるんじゃね？と思いついたので、class 構文を使わずにクラスをつくってみることにした。


## 普通にクラスを定義する

今回作るクラスは以下の通り。なんとも味気ない……

```ruby
class Dog

  def initialize
    @age = 1
  end

  def bow
    puts("bow")
  end
end
```

このクラスを、class 構文を使わずに定義し、インスタンスを作成する。

## Class クラスをインスタンス化し、定数に格納する。

```ruby
Dog = Class.new do |clazz|

  def initialize
    @age = 1
  end

  def bow
    puts("bow")
  end
end

# 動作確認
dog = Dog.new
dog.bow
```

``class Dog`` が ``Dog = Class.new do |clazz|`` になっただけだが、この変化は非常に重要な意味を持つ。Class クラスのnew は、引数にブロックを受け取る。つまり、上から順に処理が実行されていく。

C++ からruby に移ってきた時の私は、

```ruby
class Sample
  puts("Hello ruby")
end
```
が、なんで問題なく動くのか疑問だったが、上記で納得した。




# 参考にした書籍など
 - [ruby で動的にクラスを作る](http://mgi.hatenablog.com/category/ruby?page=1395669183)
 - [rubyのクラスやらモジュールがモヤっとしている人へ](http://qiita.com/gogotanaka/items/c931360b3f6248959f89)
 - [メタプログラミングRuby](https://www.amazon.co.jp/%E3%83%A1%E3%82%BF%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0Ruby-%E7%AC%AC2%E7%89%88-Paolo-Perrotta/dp/4873117437)
android エミュレータが起動しない原因はdockerだった


android stadio でandroidエミュレータが起動中に停止するので、コンソールから以下の様なエラーが出てました。

```
emulator: ERROR: Unfortunately, there's an incompatibility between HAXM hypervisor and VirtualBox 4.3.30+ which doesn't allow multiple hypervisors to co-exist.  It is being actively worked on; you can find out more about the issue at http://b.android.com/197915 (Android) and https://www.virtualbox.org/ticket/14294 (VirtualBox)
```

virtualboxなんて起動してないけどなあ……と思ったら
![スクリーンショット 2017-03-30 13.29.40.png](https://qiita-image-store.s3.amazonaws.com/0/75491/10528968-1c81-14da-8c22-4580dd310e82.png "スクリーンショット 2017-03-30 13.29.40.png")
dockerがいました……。

停止すると起動した。

kimukouさんのコメントより、
[AndroidエミュレータとVirtualBox、Docker for Macを同時に実行できない問題の対処法](http://qiita.com/rhoboro/items/1c6a1550f0d24e470460)で、

>Intel® Hardware Accelerated Execution Manager(Intel® HAXM)の6.1.1で修正されたようです。こちらから6.1.1を落としてインストールすることで解決します！
https://software.intel.com/en-us/android/articles/intel-hardware-accelerated-execution-manager
Android Studioでもそのうち配布されるようになると思いますよー。
(2017/03/16時点では6.0.5が配布されていますね)

と言うことでした。これで同時に実行できる様になるようです。
Laravelのリリース日と修正期間のまとめ

# バージョンごとの、リリース情報、バグフィックス期限、セキュリティフィックス期限、サポート期間のまとめ

Laravelのリリース日とサポート期限とかそのあたりのデータをまとめています。

| バージョン | リリース日 | バグ修正 | セキュリティー修正 |
|:-:|:-:|:-:|:-:|
| 5.0  | 2015/02/04  | 2015/08/04 | 2016/02/04 |
| 5.1(LTS)  |  2015/06/09 |  2017/06/09 | 2018/06/09 |
| 5.2  | 2015/12/21  | 2016/06/21  | 2016/12/21  |
| 5.3  | 2016/08/23  | 2017/02/23  | 2017/08/23  |
| 5.4  |  2017/01/24 | 2017/07/24  | 2018/01/24  |
| 5.5(LTS)  | 2017/08/30  | 2019/08/30  | 2020/08/30  |
| 5.6  | 2018/02/07  | 2018/08/07  | 2019/02/07  |
| 5.7 | 2018/09/4 | 2019/02/4 | 2019/09/4 |
| 5.8 | 2019/02/26 | 2019/08/26 | 2020/02/26 |
| 6.0(LTS) | 2019/09/03 | 2021/09/03 | 2022/09/03 |
|7|2020/3|||
|8|2020/9|||
|9|2022/2|||
|10|2023/2|||
|11|2024/1|||

公式情報 - https://laravel-news.com/laravel-release-process
Wikipediaよくまとまってます https://ja.wikipedia.org/wiki/Laravel

**LTS** (Long-term support): 長期サポート版

* Laravel5.1などのLTS版は2年の修正期間と、3年のセキュリティー修正期間がある
* それ以外の一般的なリリースは半年の修正期間と、1年のセキュリティー修正期間がある

| version | バグ修正 | セキュリティー修正 |
|:-:|:-:|:-:|
| LTS(Long-term support)  | 2年  | 3年  |
| General  | 半年  | 1年  |


## Laravel5.8の次はLaravel6.0..?どっち使えばいいの？

こちらの記事でよくまとまっています。

[Laravel6系で始めるか、Laravel5系を使うべきか迷う人へ](https://qiita.com/willow710kut/items/ae3fc659a5c7215fc499)

最終的には各チームで判断してほしいですが、いま(2019-10-03)からプロジェクト始めるなら、Laravel5.8じゃなくてLTS版の6.0でいいのではないだろうかと思う。


## もう少し過去のバージョンのリリース日

| version | Release Date |Others|-|
|:-:|:-:|:-:|:-:|
|V1|2011 / 6|
|V2|2011 / 9|
|v3|2012 / 2|
|v4|2013 / 5|
|v5|2015 / 2|
|v5.1|2015 / 9|LTS|
|v5.2|2015 / 12|
|v5.3|2016 / 8|
|v5.4|2017 / 1|
|v5.5|2017 / 7|LTS|リリース予定|

[laravel-news.com](https://laravel-news.com/laravel-release-process)

## Laravelの公式ドキュメントとは…？

https://github.com/laravel-ja/ja-docs-6.x のREADME.md などに書いていますが、基本的に英語のみです。
いつも「Laravel バリデーション」とかのGoogle検索で出てくるありがたい日本語訳は、有志による非公式訳ですので、上記GitHubレポを一読しておくといいかもしれません。
.ssh/configを分割する

```
$ ssh -V
OpenSSH_7.3p1, LibreSSL 2.4.1
```

OpenSSHのバージョン7.3からssh configファイルの分割に対応しているようなので、試してみました。

~/.ssh/configの中で、

```
Include *.conf
```
のようにファイル名を指定すると、~/.ssh/*.confが読み込まれます。

```bash
.ssh
├── aws.conf
├── bitbucket.conf
├── config
├── github.conf
├── id_rsa
└── id_rsa.pub
```

こんな感じでファイルを分割できるようになります。
gitなどで一部のconfを共有できたり、うれしいですね。
備忘録：VBAではまったこと

# VBAを使ったCSV操作でハマったことのメモ
### 長時間マクロを動作させると途中で処理が終了しちゃう
仕事で20万行くらいのCSVファイルに対して一行ずつループ処理してると
なんのエラーや警告もなくVBAの処理が終わっちゃう現象が発生。

###発生時の環境
OS:Windows 7 Professional
Office：Microsoft Offce 2010

###原因
原因を調べてみたけど、よくわからなかった。
ただし、Microsoftのサイトで特定のOSとOfficeの組み合わせで発生することがわかった。

https://support.microsoft.com/ja-jp/help/2484082

OSとExcelのバージョンがばっちり条件に当てはまってた...

###回避策
Microsoftさんの言う回避策をとることに。
4つある回避策のうち、今回は**DoEvents関数**を使用する方法をとった。

```
For i = 1 In 10000
    Worksheets("Sheet1").Cells(i, 1).Value = i
    ....
    DoEvents
Next
```

こんな感じで、時間が掛かるループ処理の中でDoEvents関数を呼び出すだけ。
VBAが途中で停止することはなくなりました。
s3 syncに必要なアクセス権限

# 経緯
ポリシー内で指定できるアクセス権限周りは下記があり、`sync`に必要な権限は何か確認した。

- オブジェクトオペレーションに対するアクセス権限
- バケットオペレーションに関連するアクセス権限
- バケットサブリソースオペレーションに関連するアクセス権限


# 結論
## コンソールベースのアクセス権限が不要な場合(arnは適宜変更)
```json
  policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "s3:ListBucket",
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::*"
    }
  ]
}
EOF
}
```

## コンソールベースのアクセス権限が必要な場合(arnは適宜変更)
```json
  policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": 
        "s3:ListAllMyBuckets",
        "s3:GetBucketLocation",
        "s3:ListBucket",
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::*"
    }
  ]
}
EOF
}
```
migrationでIDにbigintを使用する、外部キーにbigintを指定する

# IDにbigintを使用する方法
createテーブルのキーワード引数(ID)にbigintを渡す

# 外部キーにbigintを指定する方法
t.referencesでlimitを指定してあげる

```ruby
class Users < ActiveRecord::Migration[5.0]
  def change
    create_table :users, id: :bigint do |t|
      t.references :company, foreign_key: true, limit: 8
      t.string :name

      t.timestamps
    end
  end
end

```
[javascript]useragentを使ってAndroid標準ブラウザ判定

以前使用したので共有がてらメモ
以下の２つのサイトの判定基準を使うとほとんどのAndroid標準ブラウザを判定できると思われ。
http://www.rainorshine.asia/2013/06/03/post2422.html
http://qiita.com/narikei/items/ada44891cb0902efc165

コードはこんな感じかな。

```js

var ua = navigator.userAgent;
if ((/Android/.test(ua) && /Linux; U;/.test(ua) && !/Chrome/.test(ua)) ||
    (/Android/.test(ua) && /Chrome/.test(ua) && /Version/.test(ua))) {
        // Android標準ブラウザだったときの処理
}

```

「そうじゃない」という情報があったら、コメントくださるとありがたいです。
React Nativeアプリで標準言語を日本語にする


React Nativeアプリを作っていて困ったこと。

![Kobito.wPf5x4.png](https://qiita-image-store.s3.amazonaws.com/0/53927/920cb5c7-5ca7-006a-b823-830114cacd1a.png "Kobito.wPf5x4.png")

Copy Paste Selectなどが英語になってしまう


![Kobito.G2tN0E.png](https://qiita-image-store.s3.amazonaws.com/0/53927/c1784e60-b016-50a4-21be-044f3365fa6d.png "Kobito.G2tN0E.png")

Shareの際の選択肢も英語になる。

"react native default lang"などでググってもなかなかひっかからなかったので、メモっておきます。
"iOS set default locale" で検索したら出てきた。

# iOS

XCode -> App -> info ->
Localization native development region = Japan


![Kobito.RWNB5u.png](https://qiita-image-store.s3.amazonaws.com/0/53927/74898fe1-ccf1-ed89-24f0-574a9442ecc4.png "Kobito.RWNB5u.png")

![Kobito.T6FLzd.png](https://qiita-image-store.s3.amazonaws.com/0/53927/d3aa312f-8a74-42fb-c2b9-ee6236ae1d9e.png "Kobito.T6FLzd.png")

AndroidはOSの設定で決まるみたいで、必要なさそう。
Build Succeeded なのにエラーが出て結果実機ビルドできない　The certificate used to sign "iosアプリ名" has either expired or has been revoked. An updated certificate is required to sign and install the application.

##実機ビルドで Build Sucseed なのにXcodeエラーが出て結果実機ビルドできない　

エラー文
>The certificate used to sign "iosアプリ名" has either expired or has been revoked. An updated certificate is required to sign and install the application.

翻訳
>「iosアプリ名」の署名に使用された証明書の有効期限が切れているか、取り消されています。アプリケーションに署名してインストールするには、更新された証明書が必要です。

##整理しよう

1.「iosアプリ名」の署名に使用された証明書ってなに？
アプリに付随する証明書ということをいってるので、ProvisioningProfile(以下、プロプロファイルと略します)である可能性がたかい

それってなに？

<img width="864" alt="スクリーンショット 2017-03-30 11.49.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/86930/ebe36995-4843-3b0c-2116-15649ca74c34.png">

これがAutomaticになってなくて指定されたのが入っていたらそれのこと。
Automaticになってたら

縦に　＜　＞　このマークが出てる部分をクリックすると、今自分が持ってるプロプロファイルがでてきます。このいずれか。
言い方を変えると

>Xcode -> Preference -> Account（そのアプリを開発するときに使ってるアカウント） -> ViewDetails 

に入っている、 **Download済み** のいずれかのProvisioningProfile（プロプロファイル）のうちのいずれかです。

どれを使うかはXcodeがよしなにやってくれている？んだと思ってます誰か添削して。


どれがDownload済みなのかどうかは

<img width="515" alt="スクリーンショット 2017-03-30 11.55.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/86930/7e3fa8a2-af3b-3724-2da1-d12e7f6c3693.png">

Actionに表示されていないのでこれがDL済みのプロプロファイルなのはわかりますね。(他のは持ってないからDLできるじょうたいになってるってことです)

で、本題のエラー文内容に戻ります


##「iosアプリ名」の署名に使用された証明書の有効期限が切れているか、取り消されています。アプリケーションに署名してインストールするには、更新された証明書が必要です。

つまり、 **このDL済みのプロプロファイルが更新されてしまっていて、今あなたが持ってるのは古いものなので、新しくしてください** でことです

##更新されるタイミングって？
あるあるなのは、検証デバイスを追加するためのDeviceUDIDの追加。
検証デバイス追加するだけで証明書更新しないといけないの、だるいですよね。
知らない間に更新されることってよくありますよね。

##では古いプロプロファイルを削除し、更新されたプロプロファイルをDLしよう

そこでやり方はいろいろあるのですが、
>Xcode -> Preference -> Account -> ViewDetails -> Download All

という方法で解決されるのです。
でも本来Downloadする必要のないプロプロファイルを持ってる必要はないので、対象になるプロプロファイルを削除して更新しなおせばいいのです。

ちなみに、右クリックでShowInFinderしたやつってのは他プロジェクトのプロプロファイルも入っているフォルダに入ってしまうので、全消しすると対象プロジェクト以外のプロプロファイルも全部消えるよ。

Xcode -> Preference -> Account -> ViewDetails -> 対象のプロプロファイル上で右クリック -> MoveToTrash(すてる) -> 削除されAction部分にDownloadボタンが表示されるのでActionからDownload

これでクリーン（command + K）をして実機につないでXcode左上部分でデバイス選択してRunしてみると解決するはずです。
（じつは自分で陥ったわけではないのでもしなおらなかったら教えてください）


#まとめてきな

>Xcode -> Preference -> Account -> ViewDetails -> Download All

でなおるっていってくりゃええやん

っておもうかなとおもうんですが、なんかちがくて。
ちゃんとこうだからこうなんだよってのをわかって解決しないとなと思うのでかきました。
これはこうして解決した、だけじゃなく、こうだからエラーが出てこうしたから解決できたんだ、という話が聞きたいんだ。
そうじゃないと今後はまり続ける。
私みたいな思考苦手人間は理解が良くないんで、そうしないと思考が止まってしまうので理由考えないといけないと思うんです。

英語読めなくてもがんばろ、翻訳すごいよ。意味を理解することはやめないで。

ポエムでした。

http://qiita.com/90_jill/items/1303dc41ab0b9c3a4056
http://hacknote.jp/archives/20924/
browsersyncでShift-Jisのファイルを使用する

#browsersyncはShift-Jisファイルを読み込むと文字化けする

文字化けせずにbrowsersyncを使用するにはutf-8にエンコードすればいい。
ただ、ファイル自体をエンコードしてしまうのは嫌。。。。

そこで、ググったら以下の記事がヒット
[Shift_JISなサイトをgulp, BrowserSyncで文字化けさせずに表示する](http://qiita.com/rhsk/items/331bcc954e16ab40ca38)

ありがたい。
が、自分の環境では少し修正しないと動かなかったので以下に記します。

まず、上の記事に従って必要なファイルを用意する。
package.jsonやgulpfile.jsですね。
因みに自分の使用した、browser-syncのバージョンは、2.12.12です。
そしたら、gulpfile.jsに以下のように書きます。


```javascript
//サーバー起動
browserSync.init({
	port: 3000,//無くてもいい
	server: {
		baseDir: 'htmlファイルの場所',
		middleware: [
			function (req, res, next) {
				// 仮想サーバーへのリクエストのurlが ~.htmlなら
				// index.htmlの時は / だけになる
				if (/\.html$/.test(req.url) || req.url === '/') {
					// ファイル読み込み
					var absPath='';
					if(req.url === '/'){
						absPath = path.join(__dirname, 'htmlの場所のルート','index.html' );
					}else{
						absPath = path.join(__dirname, 'htmlの場所のルート', req.url);
					}
					var data = fs.readFileSync(absPath);
					// 文字コード判定
					var charset = jschardet.detect(data);
					if (charset.encoding == 'SHIFT_JIS') {
						// shift-jisなら文字コード変換
						var source = iconvLite.decode(new Buffer(data, 'binary'), "Shift_JIS");
						res.setHeader("Content-Type", "text/html; charset=UTF-8");
						res.end(source);
					} else {
						// shift-jis以外
						next();
					}
				} else {
					next();
				}
			}
		]
	}
});
```

自分が加筆したのはほんの一部です。
最初の条件分岐のところですね。
やってることは、

- 仮想サーバーへのリクエストを全部精査して

- htmlファイルがリクエストされたら、そのファイルの文字コードを調べてShift-Jisならエンコードして

- エンコードしたファイルをブラウザに投げる

という感じだと思います。
自分もこんなコード書けるようになりたいっす。
gulpを使ってローカルファイルをS3にデプロイする

![アートボード 1.jpg](https://qiita-image-store.s3.amazonaws.com/0/119598/810034ef-665e-d2a3-84f8-8ebe02542d8f.jpeg)

gulpを使ってS3にWebサイトをアップロードしてみたのでメモ。
今までは作成したWebサイトをプレビューするとき、CyberduckというFTPツールを使用してS3のプレビュー環境にデプロイしていましたが、セキュリティソフトとの相性などが原因で接続が不安定になることが多くなったので、[gulp-s3](https://www.npmjs.com/package/gulp-s3)というプラグインを使用してみました。

## ダウンロード
まずはターミナル画面で
`npm install --save-dev gulp-s3`

## gulpfile.js
次にgulpfile.jsに以下の通り追記。

```js:gulpfile.js
var s3   = require('gulp-s3')
var gulp = require('gulp')
 
var AWS = {
  "key":    process.env.AWS_ACCESS_KEY_ID, //＜＝これでダメなら　"AWS_ACCESS_KEY_ID"　で。
  "secret": process.env.AWS_SECRET_ACCESS_KEY,　//＜＝これでダメなら　"AWS_SECRET_ACCESS_KEY"　で。
  "bucket": "dev.example.com",　//バケット名
  "region": "eu-west-1"　//リージョン名
}
 
gulp.task('upload', () => {
  gulp.src('./dist/**').pipe(s3(AWS));
});
// es6使えないときは下記で
//gulp.task('upload', function(){
//	gulp.src('./dist/**').pipe(s3(AWS));
//});

```

## タスク実行
ターミナル画面で
`gulp upload`

## 参考

- 脱ＦＴＰ！一瞬でS3にファイル転送 https://speakerdeck.com/mi/tuo-ftp-shun-des3nihuairuzhuan-song
- GulpでAWSのS3に簡単デプロイして静的サイトを作成する http://qiita.com/narikei/items/9179cfd234adb20d5da8

## 所感
FTPツールを使うよりも高速にアップロードすることができ便利さを実感。
待ち時間もエラーもなくなりストレスが一つ減らすことができました！
自作Python - Youtube検索プログラム

requestsとBeautifulsoup4だけを使ったシンプルな検索です。

## 使いかた
```
Y = Youtube([query], result=[num])
```

queryは検索単語です。日本語対応。
numは検索結果数です。ページネーションの関係で現時点で最大20。ここら辺は各自でいじってくだしあ。

```
Y.url    >> 検索結果のurlリスト
Y.title  >> タイトルリスト
Y.id     >> IDリスト（ID？っていうの？JaDJbrwi0gkみたいな固有番号）
Y.embed  >> 貼り付け用urlリスト
Y.time   >> 再生時間リスト（需要ないかも）

例）
print(Youtube("アンジャッシュ",result=5).url)

>> ['https://www.youtube.com/watch?v=JaDJbrwi0gk', 'https://www.youtube.com/watch?v=yGPAyqxrado', 'https://www.youtube.com/watch?v=tGl2Dp1v0gw', 'https://www.youtube.com/watch?v=myp35PyYk1A', 'https://www.youtube.com/watch?v=Tt1rkp3h1pM', 'https://www.youtube.com/watch?v=XIJqsqOCorw']
```
```
Y.select() >> 検索結果から1つ選択し、上記の情報について辞書を返します。
key = "url","title","id","embed","time"

例）
movie = Y.select()
print(movie["url"]) >> https://www.youtube.com/watch?v=JaDJbrwi0gk
```

他のダウンロードAPIとかと組み合わせると効率いいかも。

## スクリプト

```python3
import requests
from bs4 import BeautifulSoup

class Youtube():
    def __init__(self,query,result=10): # max20まで
        search_url = "https://www.youtube.com/results?search_query=" + query
        req = requests.get(search_url)
        soup = BeautifulSoup(req.text.encode(req.encoding).decode('utf-8','strict'),"html5lib")
        h3s = soup.find_all("h3", {"class":"yt-lockup-title"})[0:result+1]

        self.data = [h3 for h3 in h3s]
        self.url = ["https://www.youtube.com" + h3.a.get('href') for h3 in h3s]
        self.title = [h3.a.get("title") for h3 in h3s]
        self.id = [h3.a.get("href").split("=")[-1] for h3 in h3s]
        self.embed = ["https://www.youtube.com/embed/" + h3.a.get("href").split("=")[-1] for h3 in h3s]
        self.time = [h3.span.text.replace(" - 長さ: ","").replace("。","") for h3 in h3s]
        self.info = [h3.text for h3 in h3s] # >>タイトル　- 長さ：00:00。

    def select(self):
        values = {"url":self.url,"title":self.title,"id":self.id,"embed":self.embed,"time":self.time}
        info = self.info
        for i in range(len(info)):
            print("%s:%s" % (i,info[i]))
        while True:
            try:
                num = int(input("番号:"))
                break
            except:
                print("番号を正しく入力してください。")
        results = {
            "url":values["url"][num],
            "title":values["title"][num],
            "id":values["id"][num],
            "embed":values["embed"][num],
            "time":values["time"][num],
            }
        return results

if __name__ == '__main__':
    Y = Youtube(input("検索ワード："),result=5)
    movie = Y.select()
    print(movie["url"])

```
Googleカスタム検索エンジンの設置方法

Googleカスタム検索の設置メモです。
V2は後で追記するかもです。
どこか間違いがありましたら、ご指摘いただけると幸いです。
<font color="Red">※2019/4/2更新 \<gcse:searchbox-only>\<gcse:searchresults-only>を使うと[Markup Validation Service](https://validator.w3.org/)に引っかかる為、HTMLタグを使用した方法に変更しました。
属性を追加する場合は、プレフィックス「data-」を付ける必要があります。</font>

#前提条件
- Googleアカウントをこちらで管理していない。
- 別に検索結果ページ作成。
- 検索結果ページは、検索窓と検索結果が別エリア（デザインのレイアウトオプションを2列に設定してもらっている）
- 通常ページは検索窓のみ。

#Custom Search Element Control API
制御にJavaScriptを使用しない方法です。
まずは下記コードを貼り付けます。

```HTML
<script>
  (function() {
    var cx = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
    var gcse = document.createElement('script');
    gcse.type = 'text/javascript';
    gcse.async = true;
    gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
    var s = document.getElementsByTagName('script')[0];
    s.parentNode.insertBefore(gcse, s);
  })();
</script>
```

## 通常ページ
検索窓を表示したい箇所に下記を追加します。

```HTML
<div enableHistory="true" class="gcse-searchbox-only" data-resultsUrl="検索結果ページのURL" data-queryParameterName="search"></div>
```

- 「resultsUrl」で検索結果ページのURLを指定。
- 「enableHistory」でブラウザの[戻る]および[進む]ボタンを押しても履歴が残るようにします。
- 「queryParameterName」でクエリパラメータ名を追加

## 検索結果ページ
### 検索窓

```HTML
<div enableHistory="true" class="gcse-searchbox-only" data-queryParameterName="search"></div>
```

- 「enableHistory」でブラウザの[戻る]および[進む]ボタンを押しても履歴が残るようにします。
- 「queryParameterName」でクエリパラメータ名を追加

### 検索結果表示エリア

```HTML
<div class="gcse-searchresults-only" data-linkTarget="_self"></div>
```
- デフォルトは「_blank」で別ウィンドウで開いてしまうので、「linkTarget」で「_self」に変更。


#参考サイト

[Custom Search Element Control API](https://developers.google.com/custom-search/docs/element)
[Googleカスタム検索によるサイト内検索機能の利用方法](http://www.sibulla.com/faq/faq_tag/2015/10/1544/)
[Google API プログラミング解説](http://so-zou.jp/web-app/tech/web-api/google/search/web/custom-search/v2.htm)
AnsibleでMysqlの初期rootパスワードを変更すると’Your password has expired’で変更できない

#まだ未解決です

##現象

Mysqlをインストールして、Ansibleで初期パスワードの変更時にうまくいかない。

##バージョン
CentOS7.2
ansible-2.2.1.0-1.el7.noarch
mysql-community-server-5.7.17-1.el7.x86_64

##Playbook
```
- name: check root login
  shell: 'echo "quit"|mysql -u root'
  ignore_errors: true
  register: init_flag

- name: Get temporary password from mysqld.log
  shell: cat /var/log/mysqld.log | grep 'password is generated'
  register: result_log
  when: init_flag.rc != 0

- name: debug2
  debug:
    msg: "{{ result_log.stdout | regex_replace('^.*: (.+)$', '\\1') }}"
  register: debug2_out
  when: init_flag.rc != 0

- name: install MySQL-python
  yum: name=MySQL-python state=present
  when: init_flag.rc != 0

- name: change root password
  when: init_flag.rc != 0
  mysql_user:
    login_user: root
    login_password: "{{ result_log.stdout | regex_replace('^.*: (.+)$', '\\1') }}"
    name: root
    host: "{{ item }}"
    password: "{{ mysql_root_password }}"
    priv: "*.*:ALL,GRANT"
  with_items:
    - localhost
```

##結果
```
failed: [mysql-2] (item=localhost) => {"failed": true, "item": "localhost", "msg": "unable to connect to database, check login_user and login_password are correct or /root/.my.cnf has the credentials. Exception message: (1862, 'Your password has expired. To log in you must change it using a client that supports expired passwords.')"}
```

##わかっていること

/var/log/mysqld.logに書かてているパスワードに再設定してから、playbookを実行すると成功する。再設定することで、パスワードが期限切れの状態でなくなるからうまくいく様子。
```
mysql> alter user 'root'@'localhost' identified by '%otOB5EquTw?';
Query OK, 0 rows affected (0.00 sec)
```

期限切れのパスワードでmysql_userを使えないのは、仕様なんでしょうか？
CSSのfont-familyを決める際の考慮項目まとめ

# はじめに
OSにプリインストールされるフォントも増えてきたこともあり、備忘を兼ねて自分用にまとめてみる。
webデザイナーが使うフォントを検討する際に役にたつと思う。

- 結論は各自出してください
- OSでの出し分けは想定しない
- フォント選択はユーザーに主導権がある、という考え方はしない
- フォント選択によってユーザーの感情に影響があるのなら、より良くすることを諦めない
- 特殊環境（Windowsにヒラギノが入っているなど）は強く考慮しない

# 経緯とか論点
## webフォントについて
### ページスピード
少なからずページスピードに影響するので、使用する際には注意すること

### フォントに対するユーザーの慣れ
ユーザーは変化を嫌うとか、学習コストだとかは言わないが、ユーザーが慣れているフォントを使用する方が読みやすいため、テキストが重要なサービスの場合はよく考慮すること

### 日本語webフォント
モリサワ・Adobeなどがwebフォントサービスを提供しているが、下記2点の理由で避ける

- ページスピード
    - ページ内で使用しているグリフをダウンロードするので。*最近は、ほぼ遅延がないらしいので、もう少し調べたい*
- コスト
    - 課金体系がページビューの従量課金であることが多い

下記項目に該当する場合は導入を検討してもよい
- 表現の差が他社優位に繋がるサービス・サイト
- ページビューあたりの価値が低いサービス

## 考慮するOSのバージョン
ローンチしていない場合は下記URLを、ローンチしている場合はアナリティクスを参考にする。

iOS
https://developer.apple.com/support/app-store/

Android
https://developer.android.com/about/dashboards/index.html

デスクトップ
http://www.netmarketshare.com/operating-system-market-share.aspx?qprid=11&qpcustomb=0


## プリイストールされているフォント一覧
|フォント名|OS|
|:--|:--|
|ヒラギノ角ゴシック|macOS, iOS|
|游ゴシック|macOS, windows8~|
|メイリオ|windows|
|モトヤマルベリ|android4,5|
|Noto Sans CJK|android6.0|

## 特殊環境
サービスの特性上、特殊環境を考慮して対応が必要があるか検討する

- Windows+ヒラギノ
    - クリエイティブ系の方がターゲットのサービス
- Mac+メイリオ
    - Officeを入れている人。社会人が多いサービス

## 優先順位
### 游ゴシック vs メイリオ (Windows)

- Windowsでのレンダリングを考慮するなら**メイリオ**
- 可読性の観点で、全年齢対象（特にご高齢）なら**メイリオ**
- レトロっぽい雰囲気を出すなら**游ゴシック**
- OS(WindowsとMacOS)で統一するなら**游ゴシック**（統一する必要があるかは要検討）
- 流行りを意識する(メモ：2017年の流行り レトロ、ギーク、クラシカルなど）なら**游ゴシック**

## 游ゴシックを使う際の注意事項
経緯などは下記を参考
http://qiita.com/RinoTsuka/items/4181efd43d072e246519

## メモ

- [Windows系のフォントにCSSでアンチエイリアスをかける方法を最近知った](http://bokenokao5.blog58.fc2.com/blog-entry-233.html)
- [Can I use(font-smooth)](http://caniuse.com/#search=font-smooth)
    - ※Works only on Mac OS X platform.
Cognosのセキュリティ対策に関する情報

##概要
Cognos BIでのセキュリティ対策について質問を受ける事があります。

例えば、以下のような攻撃に対する対策はCognosではどうなっているか、という質問です。
・クロスサイトスクリプティング対策
・SQLインジェクション対策
・OSコマンドインジェクション対策
・パラメータ改ざん(fuzzing)対策
・バックドアとデバッグオプション対策

以下のTechnoteが一番詳しいと思いますので、紹介しておきます。


##情報リンク
**Cognos BIのセキュリティ対策について**
http://www-01.ibm.com/support/docview.wss?uid=swg21902910

##抜粋
クロスサイトスクリプティング対策を実施していますか？
=> はい。Cognos Application Firewall (CAF) によりクロスサイトスクリプティング対策を行っています。

SQLインジェクション対策を実施していますか？
=> CAFはSQLインジェクションを防ぐため規則を設けています。

OSコマンドインジェクション対策を実施していますか？
=> CAFはインプット検証を行っています。

パラメータ改ざん(fuzzing)対策を実施していますか？
=> ファジング (攻撃 - 脆弱性を発見するための対策) はCAFにより検証されております。

バックドアとデバッグオプション対策を実施していますか？
=> ソフトウェアをスキャン(IBM AppScan)にかけて実施しています
Error対策【Ruby on Rails】


##マイグレートできていない場合##

rake db:migrate:statusコマンドをターミナルで入力することで何がマイグレートできていないかがupとdawnでわかる。

```
$rake db:migrate:status

database: pictweet2_development
Status   Migration ID    Migration Name

   up     20170328065038  Create tweets
   up     20170328134331  Devise create users
   up     20170329021023  Add nikname to users
   up     20170329022213  Add user id to tweets
   up     20170329030957  Remove name from tweets
  down    20170329045124  Create coments
```
Create commentがdawnなのでファイルを調べ修正し、rails g model commentをしてからrake db:migrateする。

今回はcommentの名前自体をミスしていたため一度削除してから再登録することとした。

##ファイルを消す##
rails d "ファイル名" "データ名"
例:rails d model comment


##ファイル場所の検索①##
ページ上で「tweet」がある場所を探したい場合、『command+F』で候補を出せる。


##ファイル場所の検索②##
『command+shift+F』でページ上でなく、ファイル内全検索できるので、そこからError文の場所を探せる。
また、「ログアウト」の工程が怪しいと思えば日本語で「ログアウト」と検索するのも一つの手。


##Vertion Error##
バージョンが古いというErrorが出た時は、bundle updateしてからbundle installを行えば通常大丈夫だが、gemやruby自体のバージョンに限界がある場合があるため、正規のgemファイルの記載をコピペした後にbundle installで対策を行う。


##HTMLメソッドから追う##
文構成としてrails上ではHTMLメソッドは何が使われるべきかあらかじめ定義されている。
ターミナルにて『rake routs』を入力し「_path」に付随するものを洗い出す。例えば、「destroy_user_session」ならば後ろに「_path」が付いたものがSublime Text上に存在する。htmlメソッドは『rake routs』時に表示される「delite」が後ろにないといけない。sublime上何も記載がなければ「get」になるというのがrailsのルールでもある。


##ルーティング##
![006.png](https://qiita-image-store.s3.amazonaws.com/0/169530/5fe7e78e-0d92-9c94-d55e-2f5fefa62faf.png "006.png")


```routes.rb
Rails.application.routes.draw do
get'tweets' => 'tweets #index'
	 パス      コントローラ名　　アクション名
end
```

```コントローラ
tweets.controller
class Tweetscontroller < Applicationcontroller
```
[Laravel]artisanのroute:listでのエラー対応

「php artisan route:list」でエラーを出力するようになったが

```
 [ErrorException]                      
  Trying to get property of non-object  
```
が出力されて何が原因なのかさっぱりわからない

詳細を出力する場合は

```
php artisan route:list -v
```
後ろに「-v」をつけてやるとどこでエラーが出ているかわかるようになる
Deep Learningした言語モデルで分かち書きをしてみた

こんにちは。山田田中商店 情報処理研究室の田中です。
教師なし学習でモデルが何を学んでそれが何に使えるかを日々研究しています。

RNNとLSTMによる言語モデルを作成して分かち書きをしてみました。
学習データはwikipediaの日本語版を5エポック回しました。

下記のサイトにアクセスすると分かち書きの機能を試すことができます。
「入力ミスかも」機能はおまけでお試しでつけてみました。

デモは停止しました。
[Microsoft][Windows] Active Directoryドメインコントローラ移行作業記録(Windows Server 2003から2012 R2へ）

Windows Server 2003で動いていたActive DirectoryドメインコントローラをWindows Server 2012R2へ移行した作業の記録です。

ネームサーバとDHCPサーバも移行します。

# 環境

## 既存マシン

ホスト名: adm00n
IPアドレス: 192.168.1.17/24
OS: Windows Server 2003
機能: ネームサーバ、DHCPサーバ

## 新マシン

ホスト名: adm00c
IPアドレス: 192.168.1.4/24
OS: Windows Server 2012 R2

# はじめに

富士通が詳しい手順書を公開してくれています。ありがたいことです。

[Windows Server 2012 /2012 R2 Active Directory 移行の手引き](http://jp.fujitsu.com/platform/server/primergy/technical/construct/pdf/win2012-active-directory01.pdf)

こちらに従って作業しました。


# 手順記録

## (1) ドメインの機能レベルを確認

ドメインとフォレストの機能レベルを確認します。Windows Server 2003レベルになっていればOKです。

## (2) 既存マシンがFSMOになっていないか確認

FSMOになっていないか確認します。
なっていたら、移動しないといけないです。

## (3) 新マシンをドメインへ参加

いつものやり方で新マシンをドメインへ参加させます。

## (4) 役割のインストール

新マシンに「Active Directory ドメインサービス」の役割をインストールします。 

## (5) 新マシンをドメインコントローラへ昇格

新マシンをドメインコントローラへ昇格させます。

サーバーマネージャの左上に通知が出ていますので、それをクリックします。

既存のドメインにドメインコントローラを追加します。

DNSサーバ、グローバルカタログをインストールします。
サイト名は既存のものにします。

「権限のある親ゾーンが見つからないか、Windows DNSサーバーが実行されていないため、このDNSサーバーの委任を作成できません。云々」
と言われてしまいましたが、気にせず先へ進みます。 

インストールが終わると、自動的に再起動します。 

## (6) 既存マシンを降格

既存マシンを降格させます。

 と、dcpromoを起動したら、「グローバルカタログ」をやっていると出てきました。

いったんやめます。

## (7) グローバルカタログを削除

既存マシンからグローバルカタログを削除します。

やり方はこのあたり ===> https://support2.microsoft.com/kb/295419/ja

## (8) 既存マシンを降格（再チャレンジ）

既存マシンでdcpromoコマンドを起動します。

ウィザードにしたがっていけば大丈夫でした。

うっかりドメイン削除とかしたりしないように〜！

ローカルAdministratorのパスワードも設定します。

## (9) DHCPデータベースの移行

既存マシンで

```
netsh dhcp server export dhcp.txt all 
```

としてファイルにデータベースをエクスポートします。

ファイルを新マシンへコピーします。

新マシンで

```
netsh dhcp server import dhcp.txt all
```

としてファイルを読み込みます。


## (10) IPアドレスの付け替え

既存マシン 192.168.1.17 => DHCP
新マシン 192.168.1.4 => 192.168.1.17 

こうしないと、DNSを静的に設定しているクライアントが面倒ですしね。

最後に全部再起動して動作確認したら終了です。

お疲れ様でした。
[Ruby] Hirbで画面の幅が足りないとき表示を切り詰められないようにする

# やりたいこと

通常、Hirbを使ってActiveRecordオブジェクトを表示すると、テーブル幅＝画面の幅となり、おさまらないフィールドは切り詰められて「...」で表示されるが、切り詰めをやめて全体を表示させるようにしたい。

# 解決法

```
Hirb::View.resize(200)
```

これでテーブル幅を200文字分に設定できる。
Hirbのソースを読んで適当にやってみたらできただけなので、これが正しい解決法かどうか知らない。

あるいは

```
Hirb.disable
```

で一時的にHirbを無効にすることもできる。
【Xcode8】Asset Catalogでベクターを使いたい


Xcode6からベクターが画像が使えるようになっていますが、いざ使ってみようとしたときにXcodeのバージョンによって使い方が違ったので覚書です。

こちら（http://qiita.com/Yuta/items/ad02e5e93694c8add089) では、「Image Set > Type」から「Vectors」が選べましたがXcode8だと変わっているようです。

# Xcode8の場合
![スクリーンショット 2017-03-30 10.05.51.png](https://qiita-image-store.s3.amazonaws.com/0/70430/8ea57756-a344-e13e-90ed-17e4baf22c62.png "スクリーンショット 2017-03-30 10.05.51.png")
Xcode8の場合、「Image Set > Scales」から「Single Scale」を選択するとベクター画像が設定できるようになります。

それぞれのパターンです。
-Single Scale-
![スクリーンショット 2017-03-30 10.11.29.png](https://qiita-image-store.s3.amazonaws.com/0/70430/cd2b670a-6685-a650-944f-b816101e2569.png "スクリーンショット 2017-03-30 10.11.29.png")

-Individual Scales-
![スクリーンショット 2017-03-30 10.11.40.png](https://qiita-image-store.s3.amazonaws.com/0/70430/bc61bc83-ec23-339f-046d-1a576a100e7d.png "スクリーンショット 2017-03-30 10.11.40.png")

-Individual and Single Scales-
![スクリーンショット 2017-03-30 10.11.51.png](https://qiita-image-store.s3.amazonaws.com/0/70430/3e357dcf-e5b8-2119-8467-052b219c7466.png "スクリーンショット 2017-03-30 10.11.51.png")

# その他（Xcode6,7)
Xcode6
「Image Set > Types」
  　・Bitmaps
  　・Vectors
  　・Bitmaps and Vectors
 
Xcode7
「Image Set > Scale Factors」
 　　・Multipe
 　　・Single Vector
 　　・Vector with Overrides
Drupal 管理者パスワードが分からない時の対処法

#### はじめに
この記事は、第3回 Drupal 勉強会@DC で飛び入りLTとして発表した内容です。
https://dgcircus.connpass.com/event/53225/
定期開催なので、興味がある方、お待ちしています。

-----

#### 今日のお話
シングルサインオンでログインできるDrupalサイトの場合、
Drupal直ログインのパスワードが忘れられているときが結構あります。
いつの間にかどのユーザでもログインできない！そんな時に直面した時の対処法です。

----

#### パスワードを変更する
Drushコマンドでパスワードを更新

`$ drush user-password ユーザ名 --password="newpassword"`

---

#### ワンタイムログインURLを発行する
DruahでURLを発行

```
$ drush user-login --uid=[uid] #The user id of the account
$ drush user-login --name=[name] # Name of the account
$ drush user-login --email=[email] # A user mail address to log in as
```
uid=1のユーザはDrupalインストール時にadministratorとして作成されています。
よくわからなければ、uid=1のユーザでログインするのがおすすめです。

---

#### DBの中身を書き換える
##### スクリプトでパスワード文字列生成
* D7 
    * `$ scripts/password-hash.sh newpwd 'newpassword'`
* D8 
    * `$ php core/scripts/password-hash.sh 'newpassword'`

##### DB内を書き換える
* D7 
    * usersテーブル passカラム
* D8
    * users_field_dataテーブルのpassカラム

------
参考
https://www.drupal.org/node/44164

http://eresus.co/blog/alexis-panagopoulos/login-reset-your-drupal-account-drush

http://enzolutions.com/articles/2014/12/07/resetting-the-administrator-password-with-sql-query-in-drupal-8/
SublimeText | 変更差分のテキストをgit チックに色付きで表示する

シンタックスで Diff を選べば良い。(知らなかった)

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/284385ab-054e-dbb8-09af-7e187cd6b453.png)

# Qiita

Qiitaでも使える。

## 入力

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/1d9fb875-f3f1-e109-7aea-bfdf8964ccc9.png)

## 結果

```diff
  変更なし
- 削除された
  変更なし
+ 追加された
  変更なし
```

# 環境

- SublimeText3

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/33df3187-c212-df8d-9242-e5ed5bf0c6a1.png)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Python > default argumentにおいてmutableなobject (例: list)を初期化しない / 定義時に初期化されるため

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 2550 / 12833)

> Default argument values are calculated when the function **is defined**, **not** when it **is run**. 
A common error with new (and sometimes not-so-new) Python programmers is to use a mutable data type such as a list or dictionary as a default argument.

例として
http://ideone.com/66DaME

```py
def buggy(arg, result=[]):
	result.append(arg)
	print(result)
 
buggy('a')
buggy('b')
```

```txt:結果
['a']
['a', 'b']
```

以下のようにするとのこと。

http://ideone.com/9bsPfY

```py
def nobuggy(arg, result=None):
	if result is None:
		result = []
	result.append(arg)
	print(result)
	
nobuggy('a')
nobuggy('b')
```

```txt:結果
['a']
['b']
```

参考?: [引数の解釈と値の構築](https://docs.python.jp/3/c-api/arg.html?highlight=%E5%BC%95%E6%95%B0)

「デフォルト引数」としては標準ドキュメントで検索できなかった。