OmniAICreator/Qiita-1.07M huggingface dataset:
Ridgepole テーブル定義をsplitオプション付きでエクスポートする際の落とし穴

# はじめに
先日弊社ではRidgepoleを導入したのですが、
[Rails マイグレーションの廃止とRidgepoleの導入・利用方法](https://qiita.com/ayies128/items/c84db2ea41210eae0577)
思わぬところに落とし穴が存在し他ので共有します。

# 出力コマンド
## テーブル定義をSchemafileに出力
これでSchemafileに現在の全テーブル定義がエクスポートされます。
<pre class="command-line"><code class="language-markup">bundle exec ridgepole -c config/database.yml -E development --export -o db/Schemafile</code></pre>

## テーブル定義をテーブルごとにファイル分けして出力
テーブルごとにファイル分けする場合にはsplitオプションをつけます。
<pre class="command-line"><code class="language-markup">bundle exec ridgepole -c config/database.yml -E development --split --export -o db/Schemafile</code></pre>

# 消えたFK (外部キー)の定義の行方は...
テーブル定義をテーブルごとにファイル分けして出力した場合、FKの定義が失踪します。

```rb
create_table "users", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
  t.string "email", default: "", null: false
  t.string "username", default: "", null: false
  t.bigint "team_id"
  t.datetime "created_at", default: -&gt; { "CURRENT_TIMESTAMP" }, null: false
  t.timestamp "updated_at", default: -&gt; { "CURRENT_TIMESTAMP" }, null: false
  t.index ["team_id"], name: "index_users_on_team_id"
end

# add_foreign_key "users", "teams" &lt;- こいつが行方不明
```

<strong>不要な外部キーを削除したくてもapplyでエラーが出るからどこかに存在していることは間違いない！</strong>

# FK (外部キー)の定義の行方と原因
失踪したわけではないのです。ちゃんと存在しています。

結論から言うと、

<strong>アルファベット順で一番最後になるファイルにがっつりまとめて書かれています。</strong>

```rb
create_table "values", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
  t.string "name"
  t.datetime "created_at", default: -&gt; { "CURRENT_TIMESTAMP" }, null: false
  t.timestamp "updated_at", default: -&gt; { "CURRENT_TIMESTAMP" }, null: false
end

# 全定義ここにある
add_foreign_key "users", "teams"
add_foreign_key "japan", "tokyo"
add_foreign_key "tokyo", "shibuya"
.....
```

おそらく/db/schema.rbの生成と同じロジックを使っているためだと思われます。

これに気づかないと詰みますよね...

ブログ記事で見たい方はこちら → <a href="http://nabesys.com/article/2018/01/15295/" target="_blank" rel="noopener">Ridgepole テーブル定義をsplitオプション付きでエクスポートする際の落とし穴</a>
Huawei の端末で Bundle data が消失する

Huawei だけで何故か startActivity するときに渡したデータが消失してクラッシュすることがあったので調査した。

# 結果
ソースコードとかあってゴチャゴチャするので先に結果を書いてしまう。

* 恐らく Huawei の Android 5.0〜6.0.1 の端末のみで発生するバグ。7, 8系とかでは発生しない。
* 発生条件は startActivity() するときに渡す Bundle データに Serializable なオブジェクトを渡すこと。
* アクティビティが破棄されたあとに復帰しようとしたタイミングで発生する。

# 再現方法
## コードについて
* MainActivity は固定値 "first_value" という String を渡して startActivity しているだけ
* SecondActivity ではその String を取得して TextView に設定しているだけ。

## 実際に試す
* 実行前に "開発者向けオプション" から "アクティビティを保持しない" にチェックしておく
* 実行して起動すると "first_value"という文字列が表示される
* アプリをバックグランドに送る
* アプリをタスクから選択して復帰する。すると Bundle に入れておいた "first_value"がnullになっているので、何も TextView に表示されない

```java
package net.test;

import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import net.test.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        startActivity(SecondActivity.createIntent(this, "first_value"));
    }
}
```

```java
package net.test;

import android.content.Context;
import android.content.Intent;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import net.test.databinding.ActivitySecondBinding;

import java.io.Serializable;

public class SecondActivity extends AppCompatActivity {
    public static final String BUNDLE_KEY_FIRST = "BUNDLE_KEY_FIRST";
    public static final String BUNDLE_KEY_SECOND = "BUNDLE_KEY_SECOND";

    public static class MyObject implements Serializable {
    }

    public static Intent createIntent(Context context, String value) {
        Intent intent = new Intent(context, SecondActivity.class);
        intent.putExtra(BUNDLE_KEY_FIRST, value);
        intent.putExtra(BUNDLE_KEY_SECOND, new MyObject()); // この行があると問題が起きる
        return intent;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivitySecondBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_second);
        String firstValue = getIntent().getStringExtra(BUNDLE_KEY_FIRST); // これが null になる
        binding.firstValueTextview.setText(firstValue);
    }
}

```

## ポイント
* この行があると問題が起きると書いてあるところをコメントアウトすると問題は発生しない
* Serializable なデータが一つでも Bundle に入っていると他のデータも含めて全部消される


# 同じ問題でも若干のバラツキがあったり
* HUAWEI MediaPad M3 (BTV-DL09) では必ず再現する
* MediaPad T2 (FDR-A01w) では２回に１回ぐらい再現する

# 対処方法
* わからん。。
* データを設定して Acitivty を起動している全箇所で getIntent().getExtras() != null とかするのか・・？
[Git] 作業内容を破棄する

# 削除対象の確認
`-n`で、対象一覧を表示できる

`$ git clean -df -n`

# 削除対象の設定
`-e`で、削除対象から除外できる

`$ git clean -df -e "hoge/hoge" -e "fuga/fuga" -n`

# 削除を実行
`$ git clean -df -e "hoge/hoge" -e "fuga/fuga"`
ElasticSearch6.0から複数のmapping_typeが許容されなくなっていた

ElasticSearch6.0から色々な制約にチェックが付き始めました。
結構breakingなので5.0の設定を持ってくる場合は注意しましょう。

その変更点の1つに、mapping_typeの将来的な削除があります。
https://www.elastic.co/guide/en/elasticsearch/reference/master/removal-of-types.html

これに伴い、ElasticSearch6.0から複数のmapping_typeの指定でドキュメントが投入された時
以下のようなエラー文言でリクエストが弾かれるようになっています。

```:error_response
{
 'status': 400, 'error':
 {
  'type': 'illegal_argument_exception',
  'reason': 'Rejecting mapping update to [${index_name}] as the final mapping would have more than 1 type: [${doc_a}, ${doc_b}]' 
 }
}
```

私はmapping typeとかあまり気にしないでラフに使っていたため
色々なmapping_typeでドキュメントを投入していました。
（web上を見ていると公式ドキュメントで使われいるrestaurant型になっている人が多いんじゃないかな…）

簡単に解決するのであれば、doc typeをすべて同じにしてしまい
過去のindexを削除すればいいと思います。
ES6上の過去のデータを移行する場合はデータのダンプ＋リストアになるのかな（未検証）。
[WordPress] 固定ページでタグ（カテゴリー、ターム）一覧を出してかつページ送りも実装

# やりたいこと

* タグ（カテゴリー、ターム）一覧を表示したい
* 数が多くなったらページ送りしたい。

WordPressは自動でタグ（カテゴリー、ターム）一覧のページを生成しないのでよしなにやる必要があります。

# コード
単純にWordPress上にあるタグ全ての情報を得るだけなら　[`get_terms()`](https://developer.wordpress.org/reference/functions/get_terms/) でいいけど、ページ送りしようと思うとちょっと面倒よね、という話で。
固定ページに埋め込む想定。`page-{slug}.php` など作って他に影響出ないようにしましょう。

```php
<?php
	$terms = get_terms( 'post_tag', array(
		'orderby' => 'count', 
	));

	if ( ! empty( $terms ) ) {
		$html           = '';
		$posts_per_page = 5; // 1ページあたりのタームの表示数
		$count = 1;
		foreach ( $terms as $term ) {
			$html .= '<div><a href="' . get_term_link( $term ) . '">' . esc_html( $term->name ) . '</a></div>';
			if ( $count === $posts_per_page ) {
				$html .= '<!--nextpage-->';
				$count = 1;
			} else {
				$count++;
			}
		}
		$html = rtrim( $html, '<!--nextpage-->' );
		$post->post_content = rtrim( $html, '<!--nextpage-->' );
	
		setup_postdata( $post );
	}
	the_content();
	wp_link_pages( array(
		'before' => '<div class="page-links">' . esc_html__( 'Pages:', 'iemoto' ),
		'after'  => '</div>',
	) );
	wp_reset_postdata();
?>
```

現場からは以上です。
Ruby: スクレイピングで No method Errorが出たあなたに

## はじめに
題名の通りです。
スクレイピングをしていて、あっている気がするけど、なぜか`NoMethodError`がでるといった場合に見ていただければいいかなと思います。

自分の環境でそのエラーを再現して見ました。次のようなエラー文がおそらくでていることでしょう。

```ruby:Scraping.rb
scraping.rb:36:in `<main>`: undefined method `get_attribute` for #<Nokogiri::XML::NodeSet:0x007fa32bc11710> (NoMethodError)
```

**get_attribute**の部分は、もしかしたら**inner_text**や、**text**かもしれません。

## 解決策
**~~.search()** の部分を **~~.at()**に変更して見ましょう。
コードベースで見ると、

```
elements = page.search()
この部分を

　　　 　↓↓↓↓↓

element = page.at()
こうです
```

単数・複数は、返り値が一つしかないか、複数ある可能性があるかによって変更しています。
**search**は、 `配列が返り値` として返ってくる為に、**each**や**(配列オブジェクト)[0]**などを使って、配列の中の要素にアクセスしないといけないからです。

## どんな時に起こるの？
自分がよくこのエラーに遭遇するときは、**next**ボタンを押すときです。
ついつい癖でsearchを使ってしまいます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/201355/b68f93d8-d99a-db41-b003-0f08eeb5c732.png)

しばらくは同じエラーを出さないとは思うのですが、同じようにつまずいた人にとって、参考になれば嬉しいです。
ansibleの練習 roles

Ansibleの練習用に投稿。

下図の環境でAnsible実装マシン→CentOSの仮想マシンに
playbook実行しています。sshの設定も完了している前提です。

![自分の環境2.JPG](https://qiita-image-store.s3.amazonaws.com/0/113556/3c7f2149-4f96-ecda-a006-f0792ea9255d.jpeg)

実施する内容はbindのインストールです。
playbook構成は下記の感じです。hostsファイルは
webという名でping可能なIPアドレスを設定してます。
また実行ユーザはsudo実行権限設定済です。

```
testrun2.yml
hosts
├── roles/           
│   └── pkg/               
│       ├── tasks/
│       │   ├── main.yml
```

それぞれ内容は下記の通り

```testrun2.yml

---
- hosts: web
  user: hnob
  become: yes
  roles:
    - pkg
```


```roles/pkg/tasks/main.yml

---
- name: newpackage
  yum: name={{ item }} state=present
  with_items:
    - bind
    - bind-utils
```

--checkのオプションをつけてdryrunを行った状態ですが
実行結果は下記の通り。プロンプトは諸事情でちょっと塗りつぶしています。

![掲載com.JPG](https://qiita-image-store.s3.amazonaws.com/0/113556/24059dd0-0d8f-3dc3-8cee-244bf5bf849c.jpeg)

形として未熟ですがひとまず一つのplaybookに値をかかず
infrastructure as a codeが目指す定義ファイルを分割する形を目指し
どんどんよくしていきたい。


####**以上です<(_ _)>**
Circle CI で tag 切ったら動くようにする #circleci

こんな感じで書くと良い。

```yaml
workflows:
  version: 2
  build-and-deploy:
    jobs:
      - build:
          filters:
            branches:
              only: /.*/
            tags:
              only: /.*/
      - deploy-qa:
          requires:
            - build
          filters:
            branches:
              only: master
      - deploy-prod:
          requires:
            - build
          filters:
            branches:
              ignore: /.*/
            tags:
              only: /v[0-9]+(\.[0-9]+)*/
```
Rails Tutorial 拡張(ブラウザのタブに好きな画像を表示)

## はじめに
[Ruby on Rails Tutorial](https://railstutorial.jp/)をやっていて、ふと、ブラウザのタブにRailsのロゴを入れたいなと思い、調べて見ました。案外簡単だったので、使って見てください。

Railsにはもともと、ActionView::Helpers::AssetTagHelperに **favicon** を使用できるように `favicon_link_tag` が定義されているようです。 

## そもそも faviconって。。。？
プログラミング初心者の中には、 faviconという言葉を初めて聞いたという人も多いのではないでしょうか？僕もその一人で、今回これを調べるにあたり初めて知りました。
そんな方でも安心してください！もう今後、 **faviconって何？** なんて絶対に言わなくなります！ **絶対に** です！

### faviconとは、、、
言葉で説明するより、見た方が早いと思うので、こちらの画像を用意しました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/201355/a91e1321-91f2-434a-ddff-e9f6bb168749.png)

見ての通り、よくwebサイトで見る、このアイコンのことです。
それでは、言葉でも説明したいと思います。

faviconとは、

```
fav + icon 
```

のことである！！！！
favとは、 **favorite**　の略で、つまり、どういうことかというと、　**自分の好きな画像**　ってことだね！
何かオリジナルでサービス開発する時には、ここもこだわるといいかもしれません。

## 実際に使って見る。
[API doc](https://apidock.com/rails/ActionView/Helpers/AssetTagHelper/favicon_link_tag)や、[こちらのブログ](http://kazuooooo.hatenablog.com/entry/2016/01/06/004146)を参考にしました。

### favicon.ico を用意
今回は、やはり、Rails Tutorialということもあり、 Rails のロゴがいいなと思い、Rails Tutorialに沿って、ダウンロードします。
ターミナルで、

```shell:Terminal
$ curl -OL http://railstutorial.jp/rails.png
```

と入力し、rails.pngをダウンロードします。
そして、[こちらのサイト](https://ao-system.net/favicon/)へアクセスし、**favicon.ico**を作成・ダウンロードします。

次に、作成した favicon.ico を使用したいアプリケーションの `app/assets/images` 以下に配置してください。

### favicon.icoを読み込ませる。
favicon.icoを使用するためには、基本的に、　`favicon_link_tag` を使用します。このヘルパーは、アセットパイプラインに則っているので、引数に.icoファイル名を指定しただけでも、　**app/assets/images/画像ファイル.ico** を探してくれます。引数に何も指定しないと、**app/assets/images/favicon.ico**を自動で読みに行ってくれるようです。User-firstって感じがしますね〜

```ruby:application.html.slim
doctype html
html
  head
    title
      = full_title(yield(:title))
    = csrf_meta_tags
    = stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload'
    = javascript_include_tag 'application', 'data-turbolinks-track': 'reload'
    = favicon_link_tag 'favicon.ico'
```

この一番下の部分ですね。(Template Engineは、今回 *slim* を採用しています。)

### 確認してみる
実際にロゴが適用されているか確認しましょう。もちろんローカルサーバーと起動し、それぞれ、localhostにアクセスして見てください。
自分の場合はこうなりました。
![](https://gyazo.com/057a4b6e4b1171fe92dc8cdacaa7af82.png)

これで、Rails TutorialにもRailsのロゴが適用されました！！！
皆さんも自分の好きなアイコン(**favicon**)を設定してください。



## 参考にしたサイト
- http://kazuooooo.hatenablog.com/entry/2016/01/06/004146
- http://wa3.i-3-i.info/word14169.html

です。ありがとうございました。アドバイス等々ありましたら、ご指摘いただけると嬉しいです。
Lambdaコードをzipであげたら"Cannot find module"と言われた時

# 現象

`node_modules`を含むLambdaコードを zip に固めてアップロードし、テストしたら、エラーが出て失敗した

# 発生したエラー

```
{
  "errorMessage": "Cannot find module '/var/task/index'",
  "errorType": "Error",
  "stackTrace": [
    "Function.Module._load (module.js:417:25)",
    "Module.require (module.js:497:17)",
    "require (internal/module.js:20:19)"
  ]
}
```

# 失敗したコマンド

`zip -r 【Lambdaディレクトリ】.zip 【Lambdaディレクトリ】/`

# 対処法

```
cd 【Lambdaディレクトリ】
zip -r 【Lambdaディレクトリ】.zip *
```

ディレクトリごと固めるのではなく、中身だけ固めましょう
Github上に同じ日本語名のディレクトリが2つ出来てしまった場合の対処法

# 課題
## Githubで同名のファイルが2つある
日本語の名前を持つファイルをGithubにアップし、別々のマシンから編集して``push``すると以下のような状態になってしまいました。

<img width="534" alt="スクリーンショット 2018-01-15 17.36.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/70437/ed778aa6-e45b-771d-1a87-4f5aca3a16fb.png">

（ちなみに内容は勉強会のメモ）

# 原因
Google先生に聞いてみたところ、同様のことを訴えていた方がいらっしゃいました。案の定、文字コードの問題のようです。

[やっぱり Git 上で日本語ファイル名は使うべきじゃないという話 \- WonderPlanet DEVELOPER BLOG](http://developer.wonderpla.net/entry/blog/engineer/Unuse_Japanese_on_Git/)

しかし、上記の事例とは異なり、ブラウザからのファイル削除で対応できませんでした。**Githubではブラウザからディレクトリを削除する方法が提供されていない**からです。

# 解決策
* リモートをローカルに強制的に一致させる
    * Gitの管理対象ファイルをすべて削除する
    * ローカルのファイルを再度コミットしてpush

本来なら分裂したディレクトリだけを管理対象から消せば良いのですが、同様の分裂が別の箇所で起こっている可能性を考慮して全削除にしました。
「何も考えなくて良いからゴリ押し」というのは案外馬鹿にできないのです。

## 実行したコマンド
ローカルで以下を実行します。
カレントディレクトリはリポジトリ内の最上位のものとします。

```
$ git rm --cached -r . # ローカルにファイルを残したまま、gitの管理対象ファイルを全削除

$ git commit -m "remove all" # 一旦すべて削除した状態をコミット
$ git push -f # リモートもすべて削除された状態に

$ git add . # 再度ローカルの全ファイルを管理対象に追加
$ git commit -m "reset" # 全ファイルを管理対象にした状態をコミット
$ git push -f # プッシュしてリモートに再度ファイルを作成
```

# 注意
かなりの力技なので、**複数人で管理しているリポジトリでは絶対に行わない**ようにしましょう。
備忘録 Ansibleファイルをコピー時のバックアップが簡単でござるの巻

Ansibleでファイルをコピーする際、バックアップが非常に容易であることにびっくり！

#1. Chefの場合・・・

Chefの場合、ファイル操作を行う場合は、自動的に/var/chef/backupに5世代のバックアップファイルを取ってくれます。
しかし、chefをやってない人からすれば、どこに自動的にバックアップを取ってくれるなんてわからない。。。。
なので、私はスクリプトのように自分でタイムスタンプ付の処理を作成していました。
こんなかんじで。

```
mtime = Time.now.strftime("%Y%m%d%H%M%S")
hosts_file = File.join("/etc",node['linuxos']['hosts'])

# backup /etc/hosts
bash "backup #{hosts_file}" do    
    code <<-EOH
       cp -p #{hosts_file} #{hosts_file}.#{mtime}   
    EOH   
    only_if {File.exists?("#{hosts_file}")}
end
```

#2.Ansibleの場合
オプションに backup なるものがあるのですね！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/170871/941ba505-1612-8e02-4a37-2b3afd2fcbac.png)

実際にやってみました。

```test2.yml
---
- hosts: web
  sudo: yes
  tasks:
   - name: copy a directory
     copy:
       src: ../files/test2.txt
       dest: /tmp
       mode: 0577
       backup: yes       ← バックアップファイルを取得
```

テスト用ファイルも合わせて編集

```
test comment1
test comment2
test comment3
```

実行してみます。

`# ansible-playbook -i hosts ./task/test2.yml`

対象ノードの実行結果をみてみると・・・・

```
# ls -l
total 8
-r-xrwxrwx 1 root root 42 Jan 15 17:12 test2.txt
-r-xrwxrwx 1 root root 28 Jan 15 17:02 test2.txt.32248.2018-01-15@17:12:45~
```

タイプスタンプ付きのバックアップファイルが出来ているのがわかります！
中身もこれらのファイルが違うこともわかります。

```
# diff test2.txt test2.txt.32248.2018-01-15@17:12:45~
3d2
< test comment3
```

冪統性の確認をしてみたところ、ファイルがコピーされていませんでしたので、ファイルの編集があった場合のみ、バックアップファイルが作成されます。



バックアップのファイル名をもっと違う名前にしたり、世代管理ができるのかが不明・・・・
そのへん、また時間があったら調べてみるか。
AWS RDS で管理用のマスターユーザー名もパスワードも忘れてしまった場合の対処

aws console から
ユーザー名：　インスタンスの `構成の詳細` で `ユーザー名` として表示されます。
パスワード：　aws console から `インスタンスの操作⇒変更` で変更できます。変更しても再起動はされません。

焦った…
数年コードレビューをしてきた人のコーディングアンチパターン集

## はじめに

この記事は数年コードレビューをしてきた筆者からみたコーディングのアンチパターンを紹介するものです

* 主観（~~のみで構成されています~~）が混じります
* 実際に書いた人を誹謗中傷するのではなく反面教師として自分の成長の糧にしてください
* 新人教育でレビューをしていたことが多かったため新人がやりがちなあるあるパターン多めです
* 言語はとりあえず`PHP`で書いておきます（実際にレビューしたのは`Ruby`だったり`Java`だったり）

## アンチパターン

### パターン1: 

全件取得しその後にループ内でif分岐している

```php
$users = Model_User::find('all');
foreach($users as $user){
  if($user->is_valid === 1){
    //処理
  }
}
```
↓

全件取得するのではなくwhereで条件を絞ったものに対してループをかければ良い

```php
$users = Model_User::query()->where('is_valid', true);
foreach($users as $user){
  //処理
}
```

### パターン2: 

意味のないループ、意味のないif分岐

```php
$user = new Model_User();
$params = ['name' => 'test', 'mail_address' => 'test@test.com'];
foreach($params as $key => $value){
  if($key === 'name'){
    $user->name = $value;
  } elseif($key === 'mail_address'){
    $user->mail_address = $value;
  }
}
$user->save();
```

↓

素直に各属性に値をセットする

```php
$user = new Model_User();
$params = ['name' => 'test', 'mail_address' => 'test@test.com'];
$user->name = $params['name'];
$user->mail_address = $params['mail_address'];
$user->save();
```

### パターン3: 

もしxxxが`true`なら`true`、`false`なら`false`を返すメソッド

```php
function type_1_or_2($type){
    if($type === 1 || $type === 2){
        return true;
    } else {
        return false;
    }
}
```

↓

評価式をそのまま返す

```php
function type_1_or_2($type){
    return $type === 1 || $type === 2;
}
```

ちなみに
上記の例に関してはtype3,4,5と追加された時にorが無限に横に長くなっていくのが気持ち悪いので以下の方がより良いかと思います


```php
function is_valid_type($type){
    $valid_types = [1,2,3,4,5];
    return in_array($type, $valid_types, true);
}
```

注釈: 本来であれば type値は定数やEnumにするのが良いでしょう(ここでは本質的ではないので数値にしました)

### パターン4: 

モデルに対して自分自身のインスタンスを渡しているメソッド

```php
clsas Model_User{
    public function set_name_test($user){
        $user->name = 'test';
        return $user;
    }
}
$user = new Model_User();
$user = $user->set_name_test($user);
$user->save();
```

↓

上記はstaticメソッドなのでインスタンスメソッドに変更する
そのモデルに対して自分自身のインスタンスを引数で渡すのは何かがおかしい

```php
clsas Model_User{
    public function set_name_test(){
        $this->name = 'test';
    }
}
$user = new Model_User();
$user->set_name_test();
$user->save();
```

## おわりに

いかがでしたでしょうか？
ベテランエンジニアの方なら「何当たり前のこと言ってるの？」
中堅エンジニアの方なら「あーあるある、昔やったことあるわ」
新人エンジニアの方なら「昨日書いたコードアンチパターンだったわ…明日直そ…」
とかなってたら成功かなと思います
何故ダメかを理解し、よりよいコードを書いていきましょう:smile:
Ubuntuでのキーマッピングのやり方(ubuntuでパイプが打てない)

# 問題
- VirtualBoxのubuntu 16.04で、|(パイプ)がうてない。
- デスクトップ環境をxfceに変更したりしたせいか、キーボード設定画面（設定＞キーボード）が表示されない。（そもそも選択肢に出てこない）

# やること
1. キーボードで、押したいキーの番号を確認
2. 設定ファイルの編集
3. .bashrcで今回の設定が毎回実行されるように設定する

## 1. キーボードで、押したいキーの番号を確認
```
$ xev
```
で設定したいキーのキーコードが何番なのかを確認する

### 例
[![https://gyazo.com/1b2666fac3864c277ca836e8a876e29b](https://i.gyazo.com/1b2666fac3864c277ca836e8a876e29b.png)](https://gyazo.com/1b2666fac3864c277ca836e8a876e29b)
上記では、"a"を押すと、キーコードが38番であることが確認できますね。

同様に設定したいキーを押して、キーコードを確認します。

（私の場合は、|は、132番でした。）

そして、

```
$ xmodmap -pke
```

このコマンドで、該当する番号を見てみてください。

```
keycode 132 =
```
上記のように番号の右が空白であれば、何もキーが設定されていないので、設定をしていきましょう。
（もし、ここがbackslash bar等正しく設定されていた場合はこの方法では治りません）

## 2. vimで設定ファイルをいじれるようにする
まず、以下のコマンドで、編集ファイルを作ります。

```
$ touch ~/.Xmodmap
```
そして、設定を編集するためのコマンドを打ちます。

```
$ xmodmap -pke> ~/.Xmodmap
```
実際にファイルを開いてみると、先ほどコマンドで確認したキーコード一覧が表示されますね。

```
keycode [割り当てたいキーコード] = [割り当てたい記号]
例）keycode 132 = backslash bar
```
## 3. .bashrcで今回の設定が毎回実行されるように設定する
~/.bashrcに以下を追加します。

```
xmodmap $HOME/.xmodmap
```

そして、今回の変更を反映させるために、以下のコマンドを打ちます。

```
$ . ~/.zshrc
```

# おわりに
以上で、キーマッピングができました。
今回はパイプ"|"でしたが、同じやり方で、ほかのキーも設定することができます。

もっといいやり方がありましたら、教えて頂けたらと思います。
さくらのクラウドでディスク障害


数日前から、mysqlの特定のテーブルにアクセスできなくなる不具合が、断続的に発生するようになりました。`ls` コマンドなどを打つと `Input/output error` が出力されるので、ディスクの不具合が疑われる状況です。fsckのコマンドも中断してしまうような感じ。

```
$ sudo e2fsck -n /dev/vdb1 

Illegal block #1035 (741355576) in inode 6684681.  IGNORED.
Illegal double indirect block (197984768) in inode 6684681.  IGNORED.
Illegal double indirect block (808202284) in inode 6684681.  IGNORED.
Error while iterating over blocks in inode 6684681: Illegal doubly indirect block found
e2fsck: aborted
```

今回、`/dev/vda2` でも `Filesystem still has errors ` と警告が出ましたが、こちらは無害そうなのでスルーしています。


## 復旧手順
以下の手順でCDブートしたLinuxからfsckを実行することで、ファイルシステム自体は正常な状態に戻すことが出来ました。

https://manual.sakura.ad.jp/cloud/server/os-rescue.html

mysqlデータベースの一部ファイルが欠損して、復元ができなかった箇所がありました。


## 教訓
ハードウェア障害だろうと思って、サポートに連絡したら冷たく突き放された回答が…。

> トラブル対応に伴う原因究明や改善手順のご案内などは承っておりません。ご了承ください。

上記の「復旧手順」も同回答の中で案内されているので、実際には的確なアドバイスを貰った格好になるのですが、「クラウド＝メンテナンスフリー」と捉えると痛い目に遭うよ、という事例を身をもって体験しました。オンプレミス（物理サーバ）同様に障害への備えも必要になってきます。

http://support.sakura.ad.jp/mainte/mainteentry.php?id=23360


同じような事例に遭遇している記事も見つかりました。

http://d.hatena.ne.jp/ranekov/20111222/1324480989
http://d.hatena.ne.jp/nnasaki/20111220/1324391155

この辺り、AWSやGCPはどう振る舞うのか気になるところです。
SSH経由でブラウザ表示

ポートフォワーディング設定のメモ。
ip制限かかってるページに入るときにテキストブラウザ使って　w3m http://www.yahoo.co.jp   
 でもブラウザ見れるんだけど見づらくてつらいのでブラウザでも見れるようにした。

#ssh側

```
ssh -v -D 1080 user@10.10.10.10 -p 4000 -i ssh_anykey
```

このsshを繋ぎっぱなしてブラウザ側をいじる。
「説明」何かしらのssh_anykeyで4000ポートのuser@10.10.10.10にsshログイン。1080で橋渡しをする。


#ブラウザ側（chrome）

falcon proxyのアドインを使用した。

<img width="962" alt="スクリーンショット 2018-01-15 16.50.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/64334/24ea1429-654e-5a3c-7e51-457c370efc38.png">

sshで指定した1080を合わせる。
socks v5を指定。

<img width="383" alt="スクリーンショット 2018-01-15 17.40.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/64334/92f81dda-4341-8054-0cb0-aa4908edd718.png">

プロキシをONに。

<img width="377" alt="スクリーンショット 2018-01-15 17.41.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/64334/3d80c531-eab8-1b63-388b-6a112302cf13.png">

以上。


参考
https://qiita.com/toshihirock/items/cd28604ecccc5736063d
http://blog.katty.in/4991
Androidの設定画面にツールバーを表示してみた

## 概要

Android Studio で作成した Setting Layoutの画面上部にツールバーを表示する方法を調査したので記録しておく。

## 環境
IDE：Android Studio 3.0.1
ターゲット：marshmallow以降

## 調査結果

Android Studio のコンテキストメニューから　New>Activity>SettingsActivityを実行して SettingsActivity を追加しても、次のような画面になりツールバーが表示されない。  

![setting.png](https://qiita-image-store.s3.amazonaws.com/0/41649/6eb31851-a20c-4954-d48e-017a788dd1d5.png)

色々調べたところ、[ここ](https://stackoverflow.com/questions/30114730/how-to-add-toolbars-to-appcompatpreferenceactivity/30281205#30281205?newreg=7ba7f05ad56b4f258f02781911ed63a2)に記述されているように、SettingsActivity#setupActionBar()を変更することで、期待する結果になることが分かった。

## 修正コード

```
SettingActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setupActionBar();
}

private void setupActionBar() {
    Toolbar toolbar;
    ViewGroup root = (ViewGroup) findViewById(android.R.id.list).getParent().getParent().getParent();
    toolbar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.view_toolbar, root, false);
    root.addView(toolbar, 0);
    setSupportActionBar(toolbar);    
}

res/layout/view_toolbar.xml

<android.support.v7.widget.Toolbar android:id="@+id/view_toolbar"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
    android:minHeight="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    xmlns:android="http://schemas.android.com/apk/res/android">
</android.support.v7.widget.Toolbar>

```

## 参考
https://stackoverflow.com/questions/30114730/how-to-add-toolbars-to-appcompatpreferenceactivity/30281205#30281205?newreg=7ba7f05ad56b4f258f02781911ed63a2
http://kobashing.hatenablog.com/entry/%3Fp%3D202
[iOS11] AirPlay有効のままScreenRecordingを禁止する

iOS11から追加されたScreenRecording、端末だけで録画ができて非常に便利ですが、音楽や映像を扱うアプリケーションにおいては**大人の事情**で禁止しなければならない場合がありますよね。
そんな時にScreenRecordingを禁止する方法です。

# 前提
ScreenRecording自体を操作するAPIは提供されていません。  
よって、ScreenRecording中かどうかを検知しScreenRecording中の場合の処理をアプリケーションに実装する必要があります。
(ex.再生を停止する、アラートを表示する)

# ScreenRecordingを検知
UIScreenのisCapturedにより検知します。

- [isCaptured - UIScreen | Apple Developer Documentation](https://developer.apple.com/documentation/uikit/uiscreen/2921651-iscaptured)

スクリーンレコーディング中はisCapturedの値がtrueとなります。

NSNotificationのUIScreenCapturedDidChangeを使うことでisCapturedの値が変更された時に通知を受け取ることもできます。

- [UIScreenCapturedDidChange - NSNotification.Name | Apple Developer Documentation](https://developer.apple.com/documentation/foundation/nsnotification.name/2921652-uiscreencaptureddidchange)

isCapturedはAirPlayが有効の時にもtrueとなってしまうため、
AirPlayを区別したい場合は別途AirPlay中かどうかの検知が必要となります。

# AirPlayを検知
## AVPlayerを使用している場合
AVPlayerを使用している場合、AirPlay中はisExternalPlaybackActiveがtrueになります。

- [isExternalPlaybackActive - AVPlayer | Apple Developer Documentation](https://developer.apple.com/documentation/avfoundation/avplayer/1388982-isexternalplaybackactive)

## AVPlayerを使用していない場合
AVPlayerを使用していない場合、多少強引ですがAVAudioSessionを用いて音の外部出力を調べることでAirPlay中かどうかの検知が可能です。

``` objective-c
AVAudioSessionRouteDescription *audioRouteDesc = [[AVAudioSession sharedInstance] currentRoute];
NSArray *outputs = audioRouteDesc.outputs;
[outputs enumerateObjectsUsingBlock:^(AVAudioSessionPortDescription *audioDesc, NSUInteger idx, BOOL *stop) {
    if([audioDesc.portType isEqualToString:AVAudioSessionPortAirPlay]){
        // AirPlay中
    } 
    else {
        // その他
    }
}];
```

# 参考
- [iOS11から搭載されるスクリーンレコーディングでの録画を検知する方法](https://qiita.com/kazuhiro4949/items/e5f5d86b1b18ecac34ee)
配列で padEnd したい

# やりたいこと

配列を任意の長さまで任意の文字列で延長したい。具体的には

```js
// 配列を長さが 5 になるまで "*" で埋める。
padEnd([1, 2, 3], 5, '*') //=> [1, 2, 3, "*", "*"]
```

のような関数がほしい。

# 実装

```js
const padEnd = (array, length, padElement = null) =>
  Object.assign(new Array(length).fill(padElement), array);

padEnd([1, 2, 3], 5, '*') //=> [1, 2, 3, "*", "*"]
padEnd([1, 2, 3], 5) //=> [1, 2, 3, null, null]
```

# 参考

* [Array.prototype.fill()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/fill)
LinuxのUIO(User space I/O) その2

[前回](https://qiita.com/tetsu_koba/items/5cb1f3b61d0b2b6f4e2b)の続き


#デバイスツリーを使わずにUIOを使用する方法

peri_pmcという名のレジスタを0x120a0000からの4KBをユーザー空間からアクセス可能にします。
その情報をセットしてuio_pdrv_genirqのドライバを登録するだけです。

そのコードの全体はgistに貼りました。[ここ](https://gist.github.com/tetsu-koba/f833e06c9c81033f8b89b07881a7dc59)
要点は以下の部分です。
実質的にplatform_device_register()を呼びだすだけです。

```c
static struct uio_info mydev_mem = {
	.name = "my_device",
	.version = "0.1",
	.irq = UIO_IRQ_NONE,
};

static struct resource uio_resources[] = {
	[0] = {
		.name	= "peri_pmc",
		.start	= 0x120a0000,
		.end	= 0x120a0fff,
		.flags	= IORESOURCE_MEM,
	},
	[1] = {
		.name	= "DUMMY",
		.flags	= IORESOURCE_IRQ,
	},
};

static struct platform_device my_dev = {
	.name = "uio_pdrv_genirq",
	.id = -1,
	.dev = {
		.platform_data = &mydev_mem,
	},
	.resource	= uio_resources,
	.num_resources	= ARRAY_SIZE(uio_resources),
};

static int __init uio_init(void)
{
	printk(KERN_INFO "uio_init\n");
	return platform_device_register(&my_dev);
}
```

実際に使用するときには、struct resourceの初期化のところだけを変更すればよいと思います。
このソースをビルドしてカーネルモジュールを作成し、それを insmodコマンドで登録すれば、/dev/uio0 のデバイスファイルが作成されます。
あとは[前回](https://qiita.com/tetsu_koba/items/5cb1f3b61d0b2b6f4e2b)の記事と同様です。

## 注意点

- 割り込みを使用しない場合は、上記のようにstruct uio_info のirqにUIO_IRQ_NONEするとともに、struct resourceの方にもダミーのIORESOURCE_IRQのエントリが必要です。これが無いとinsmodしたときに、"failed to get IRQ" というメッセージでエラー終了してしまいます。

- アクセス可能にするメモリ範囲の情報は struct uio_info ではなくて、struct resourceの方に書きます。

- rmmodするとデバイスを削除することができますが、カーネルのログに"uio_pdrv_genirqのデバイスにreleaseの関数が実装されていない" という旨のエラーメッセージが出ます。

#余談
私が最初にUIOを試してみたのは、数年前のカーネル3.0の頃でした。その当時はまだARMのデバイスドライバのデバイスツリー化が必須ではなかったので、この記事のカーネルモジュールの方式でやりました。
最近になって、またUIOを試してみようとしたのですが、当時のコードはもう紛失していて、かすかな記憶を頼りに思い出すのに苦労しました。やっぱりブログに書いておくのがいいですね。

UIOのカーネル内のドキュメント、[The Userspace I/O HOWTO](https://www.kernel.org/doc/html/v4.12/driver-api/uio-howto.html)は最終更新が2006年12月になっていて、その後の更新が反映されていません。
このドキュメントによると、割り込みを使用せずにメモリのマッピングだけ行いたい場合には"uio_pdrv" というドライバを使用すればよいように書かれています。確かにカーネル3.0の当時はこのドライバは存在しました。
しかし、その後の変更で"uio_pdrv" は削除されてしまっています。おそらくは"uio_pdrv_genirq" でirq=UIO_IRQ_NONE にして使えばよいということだったのでしょう。
その後の変更の履歴は追えていませんが、ARMのデバイスツリーの対応が追加されています。
注意点のところにも書きましたが、uio_pdrv_genirqで割り込みを使用しない場合にはuioinfoのirqをUIO_IRQ_NONEにするだけでは足りなくて、struct resourceの方にもダミーのIORESOURCE_IRQのエントリが必要でした。とてもバグくさい挙動です。
UIO_IRQ_NONEの値は0なのですが、どうやらいろいろな人が建て増し的にコードを追加した結果、uio_infoのirqが0である場合に"割り込みは使用しない"という意味と"割り込みは未設定のため他の情報を参照せよ" の2つの意味がごちゃごちゃになってしまっているようです。
本来なら最新版カーネルでも同様の症状が出るかを確認して、バグをレポートしたいところですが、組み込みLinuxでは簡単に最新のカーネルを動かすことができないのがつらいところです。
Mastodon(開発環境)で画像がアップロードできない

## 問題

Mastodon(開発環境)で画像アップロード周りが全く動かない。
特にプロフィール画像アップロードでは以下のエラーが出た。

```
Cocaine::CommandNotFoundError
```

```ruby:mastodon/app/services/update_account_service.rb
def call(account, params, raise_error: false)
    was_locked = account.locked
    update_method = raise_error ? :update! : :update
    account.send(update_method, params).tap do |ret| # <=ここ
    ...
```
調べてみると`ffmpeg`がnot installという記事が多かったので入れてみる。
が、効果なし。
https://stackoverflow.com/questions/33801072/cocainecommandnotfounderror

## 解決方法

コンソールでaccountを叩いてみたら、`Install ImageMagick`と言われた。
…あれ、入ってなかったの…?

普通にHomebrewで、`brew install imagemagick`で解決。
画像投稿も問題なし。

ただ、何故かgifだけ壊れて表示されない…。
アップロード時のサムネ(smallサイズ)は平気なのに。
Huawei の端末で Logcat にログが表示されない

Huawei の端末はデフォルトで Logcat の出力が無効化されているやつがあるようで、次の謎コマンドから秘密のメニューを開いてログ出力を有効する必要があります。

## 手順（電話アプリ経由）
1. 電話アプリを起動
2. 電話番号を次のように入力
```
*#*#2846579#*#* 
```
3. 以下のような秘密のデバッグ画面が表示されるので Backgorund Settings を選ぶ
<img src="https://qiita-image-store.s3.amazonaws.com/0/7869/96ed3a8e-6157-bfbb-4071-eeb456afef32.png" width=50%>
4. Background Settings をタップすると以下のような画面になる
<img src="https://qiita-image-store.s3.amazonaws.com/0/7869/10fccf3a-b532-e355-90c9-b1cc4b652eba.png" width=50%>
5. Log Settings をタップして有効にしたいやつを有効にする
<img src="https://qiita-image-store.s3.amazonaws.com/0/7869/473ad552-2475-2cfb-51d1-27755b87d034.png" width=50%>
6. 端末を再起動する（重要）

## 手順2（電卓経由）
タブレット端末だと電話アプリが存在しないので電卓アプリ経由で開く
1. 電卓を開く
2. 横に回転する。回転しないと括弧とかが入力できない
3. 次のように入力する → "()()2846579()()="
<img src="https://qiita-image-store.s3.amazonaws.com/0/7869/58bd6dc6-4844-d776-93ff-a9838fa7599f.png" width=50%>
4. 上のスクリーンの状態で = を押した瞬間に秘密のメニューに移行する

## 参考文献
https://stackoverflow.com/questions/18124334/huawei-logcat-not-showing-the-log-for-my-app
【Rails】Heroku上でApplication Error(H10 App crashed)【PostgreSQL】

RailsアプリをHerokuにデプロイしようとしたら、PostgreSQL関連でApplication Errorになったので、備忘録として残しておきます。

# 環境
エラー発生時の環境は以下の通りです。

| 対象 | バージョン |
| --- | --- |
| OS     | Windows10 Pro               |
| シェル | Windows Subsystem for Linux |
| Ruby   | 2.5.0                       |
| Rails  | 5.1.4                       |

# エラー内容
`rails new`で作成したプロジェクトの`Gemfile`に`pg`を追加してデプロイ。

```rb:Gemfile
group :production do
  gem 'pg'
end
```

するとデプロイは成功しますが、`Application Error`が発生。

```
2018-01-15T06:17:41.119766+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=XXX-YYY-ZZZ.herokuapp.com request_id=47bc2299-d9ee-4b14-ab3f-574e9f2af93b fwd="118.103.29.194" dyno= connect= service= status=503 bytes= protocol=https
```

これだけでは原因が分からないので、
`rails console`で詳細のエラーを見てみるとPostgreSQL関連でエラーが出ていました。

```
2018-01-15T06:16:30.567689+00:00 app[web.1]: /app/vendor/bundle/ruby/2.3.0/gems/activerecord-5.1.4/lib/active_record/connection_adapters/connection_specification.rb:188:in `rescue in spec': Specified 'postgresql' for database adapter, but the gem is not loaded. Add `gem 'pg'` to your Gemfile (and ensure its version is at the minimum required by ActiveRecord). (Gem::LoadError)
```

# 解決方法

実際にインストールされている`pg`のバージョンを確認してみると`1.0.0`となっていました。
このバージョンが怪しいと考え、`0.20.0`を試しに設定して、再デプロイ！

```rb:Gemfile
group :production do
  gem 'pg', '0.20.0'
end
```

すると正常に起動:sunglasses:

[HerokuのPostgreSQLに関するページ](https://devcenter.heroku.com/articles/heroku-postgresql#connecting-in-ruby)では特にバージョン指定はなかったので盲点でした。
ビルドの完了をSlackで通知するシェルスクリプトを雑に書いた

## 概要

シェルスクリプトからSlackに通知を送りたいときのメモ。
シェルからAttachment（JSON）を扱うのが結構面倒くさい。

## 詳細

- AWS CodeBuild でビルドの完了を通知するスクリプト
- 通知投げるスクリプトとテンプレート相当のスクリプトを作った

## コード

notify.sh

```shell
#!/bin/sh

set -eu

SLACK_WEBHOOK_URL=""

usage_exit() {
echo "Usage: $0 [message]" 1>&2
exit 0
}

case $1 in
build_start)
ATTACHMENTS=$(sh ./lib/scripts/notify/templates/build.sh start)
;;
build_complete)
ATTACHMENTS=$(sh ./lib/scripts/notify/templates/build.sh complete)
;;
\?)
usage_exit
;;
esac

curl -X POST $SLACK_WEBHOOK_URL -d "$ATTACHMENTS"
```

templates/build.sh

```shell
#!/bin/sh

set -eu

SLACK_CHANNEL="#notice"
SLACK_USERNAME="AWS CodeBuild"
SLACK_ICON=":yuki:"

BUILD_ID=${CODEBUILD_BUILD_ID:-"BUILD_ID"}
BUILD_LOG_URL=""
SOURCE_REPOSITORY_NAME=""
SOURCE_VERSION=`git ls-remote https://github.com/${SOURCE_REPOSITORY_NAME} | cut -f 1`
BUILD_ARN=${CODEBUILD_BUILD_ARN:-"BUILD_ARN"}

case $1 in
  start)
    MESSAGE="イメージのビルドが開始されました"
    COLOR="#2d9ee0"
    ;;
  complete)
    MESSAGE="イメージのビルドが完了しました"
    COLOR="#7CD197"
    ;;
esac

ATTACHMENTS=`cat << EOS
  {
    "channel": "${SLACK_CHANNEL}",
    "username": "${SLACK_USERNAME}",
    "icon_emoji": "${SLACK_ICON}",
    "attachments": [
      {
        "fields": [
          {
            "title": "${MESSAGE}",
            "short": true
          }
        ],
        "actions": [
          {
            "type": "button",
            "name": "build_log",
            "text": "Build Log 🛫",
            "url": "${BUILD_LOG_URL}",
            "style": "primary"
          }
        ],
        "color": "${COLOR}"
      },
      {
        "fields": [
          {
            "title": "Source Repository",
            "value": "${SOURCE_REPOSITORY_NAME}",
            "short": true
          },
          {
            "title": "Source Version",
            "value": "${SOURCE_VERSION}",
            "short": true
          },
          {
            "title": "Build ARN",
            "value": "${BUILD_ARN}",
            "short": false
          }
        ]
      }
    ]
  }
EOS`
echo $ATTACHMENTS
```
Rでシーケンス クラスタリング

Rでシーケンスなクラスタリングをする必要がでてきたので勉強して、まとめておく。
用途としては状態があり、時間によって遷移するものをクラスタリング出来る。例としては、天気予報（前日に晴れ、今日は曇り）でいろんな地域をクラスタリングしたいといった用途やwebページの人の訪れをクラスタリング（LP→カテゴリー１→広告）に行くパターン等々・・・。


・使うパッケージTraMineR・cluser

```sample.R
library(TraMineR)
library(cluster)

# データの読み込み
data("mvad")

#　状態の定義
mvad_alphab <- c("employment", "FE", "HE", "joblessness","school", "training")
# パターンフォーマット変換
mvad_seq <- seqdef(mvad, 17:86, xtstep = 6, alphabet = mvad_alphab)

# パターンの上位にある頻度を計算
seqtab(mvad_seq, idxs = 1:10)

# 遷移行列
mvad_trate <- seqtrate(mvad_seq)
round(mvad_trate, 2)

# 状態のクラスタリング作成
mvad_om <- seqdist(mvad_seq, method = "OM", indel = 1, sm = "TRATE")
clusterward <- agnes(mvad_om, diss = TRUE, method = "ward")
mvad_cl4 <- cutree(clusterward, k = 4)
cl4_lab <- factor(mvad_cl4, labels = paste("Cluster", 1:4))

# 各クラスターの可視化
seqdplot(mvad_seq, group = cl4_lab, border = NA)

# デンドログラムの可視化
plot(clusterward, which.plots = 2, labels = FALSE)

```
サンプルデータでは人が働いているか、無職、学校、トレーニングにいっているかといった事をクラスタリングしている。特に面白いのは人の行動パターンのクラスタリングの可視化である。seqdplotをすると以下のようなグラフが得られる。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/161216/a9b86daa-f464-4f79-48ef-f78dffcb6c66.png)
コマンドプロンプトでファイル名に適用可能な日付と時刻を得る方法

> for /F "tokens=1 delims=." %x in ('^(for /F "tokens=1,2,3 delims=:" %p in ^('echo %DATE:/=%_%TIME: =0%'^) do @echo %p%q%r^)') do @echo %x
Circle Ci2.0でnpm run buildしたファイルをamazonS3にあげる時に困ったこと

初めてCircle Ciを使ってを、npm run buildし、amazonS３へのアップロードの自動化しました！
いろいろ苦労しましたがそれをメモベースでまとめたいと思います。

最終系
<img width="618" alt="最終系.png" src="https://qiita-image-store.s3.amazonaws.com/0/115405/adc704b2-091c-7940-7e7f-97274bd5a15b.png">

## つまずいた箇所は
1. npm run buildを通るように対応
2. amazonS3のキーを登録
3. awsコマンド利用できるように対応

## 1. npm run buildを通るように対応
これは下記のようなErrorがありました。

``` 
An error occured during the build:
Error: No module factory available for dependency type: ContextElementDependency
    at Compilation.addModuleDependencies (/home/circleci/repo/node_modules/@angular/cli/node_modules/webpack/lib/Compilation.js:210:21)・・・・・・・・・
```

こちらの対応として、下記を追加します

```
run: npm uninstall --save-dev webpack
run: sudo rm -R node_modules
run: npm install
run: npm run build
```

## 2. amazonS3のキーを登録
#### 手順
1.AWS CodeDeployを押下する
<img width="298" alt="test.png" src="https://qiita-image-store.s3.amazonaws.com/0/115405/8b41ea9a-13e8-a847-6342-2fa73597c000.png">


2.Access Key ID と Secret Access Keyを設定する
<img width="756" alt="set.png" src="https://qiita-image-store.s3.amazonaws.com/0/115405/6fd2d056-524a-dd0e-a9a0-25967b51a7ef.png">

ここで完了です！

## 3. awsコマンド利用できるように対応
これは下記のようなErrorがありました。
```/bin/bash: aws: command not found```


こちらの対応として、下記を追加します

```
run: wget https://bootstrap.pypa.io/get-pip.py 
run: sudo python get-pip.py |
run: sudo apt-get install python-dev
```
1の対応コードを入力、その後

run:
name: Deploy to S3 if tests pass and branch is [branch名] 
command: aws s3 sync <font color="Blue">アップロードフォルダ</font> <font color="Red">s3:// UPload先</font> --region [region名]

で完了です！

## 終わりに
みなさん、よいCircle Ci生活を！
Cycling'74 Max7を使用した展示運用の備忘録（Mac用）

インスタレーションなどの展示運用時にMacの自起動/システム終了のスケジューリングとCycling'74 Max7(Max/MSP)のパッチの自動立ち上げをさせるシステムについての備忘録

## 環境  
- Mac OS 10.12
- Cycling'74 Max7(ver 7.3.4)

## MacとMaxの設定
### Mac
- **システム環境設定>省エネルギー>バッテリー/電源アダプタ>ディスプレイをオフにするまでの時間**を**しない**
- **システム環境設定>通知**から全ての通知を切る
- **システム環境設定>ユーザとグループ>ログインオプション**から展示運用ユーザの自動ログインを**オン**にする
- **システム環境設定>省エネルギー>スケジュール>起動またはスリープ解除**にMacの起動時間の設定をする

### Max
- **Check for updates automatically**（自動アップデート確認機能）を**OFF**
- **Recover Edits After Crash**（クラッシュ時に編集中だったMaxパッチを復旧させる機能）を**Never**    
- **Restore Windows on Launch**（終了時に開いていたパッチを再起動時に自動で開く機能 ）を**OFF**
![スクリーンショット 2018-01-12 10.11.30.png](https://qiita-image-store.s3.amazonaws.com/0/212299/00dac9fa-ebb6-932d-a233-4a0d7458efcb.png)


## 起動時にMaxパッチを開き、定刻に自動終了させる
Mac起動後にMaxパッチの自動立ち上げと定刻にシステム終了をするためのアプリケーションを作成します。
スクリプトエディタを使って次のAppleScriptを記述します。

```applescript
property patchPath : "/Users/UserName/Desktop/test.maxpat" as POSIX file -- Maxパッチのパス
property endTime : "17 00" -- 終了時刻

delay 60
-- Max起動
tell application "Finder" to open patchPath
delay 20

-- 終了時刻まで待機
property endTimeInSeconds : (((word 1 of endTime) as integer) * hours) + (((word 2 of endTime) as integer) * minutes)
property currentTimeInSeconds : ((hours of (current date)) * hours) + ((minutes of (current date)) * minutes)
set delayTime to (endTimeInSeconds - currentTimeInSeconds)
if delayTime ≤ 0 then
	set delayTime to 1
end if
delay delayTime

-- Max終了
try
	quit application "Max" without saving
on error number -128
	do shell script "pkill Max"
end try
delay 20

-- システム終了
tell application "Finder" to shut down
```

上2行のpatchPathとendTimeはMaxパッチのパスと終了時刻を表しているので適宜変更してください。
この例ではデスクトップ内のtest.maxpatを開き、17:00にMaxを終了した後にシステム終了をするようになっています。
**ファイルフォーマット**を**アプリケーション**にして保存します。
![スクリーンショット 2018-01-15 14.54.56.png](https://qiita-image-store.s3.amazonaws.com/0/212299/dbfb6f3a-4ebc-44a3-6caf-b9a7d0af3917.png)

このアプリケーションを**システム環境設定>ユーザとグループ>ログイン項目**に追加すると起動時に自動でMaxパッチの立ち上げと自動システム終了をするようになります。
<img width="780" alt="スクリーンショット 2018-01-15 14.59.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/212299/26cb14e2-fe68-bb52-7088-a13df99643af.png">


## 参考
https://leico.github.io/TechnicalNote/Mac/exhibit-check
解决nim db_mysql could not load: libmysql.dll的问题



nim中使用db_mysql 操作数据库的代码看起来很简单：

```nim:nimmysql.nim
import db_mysql

let db = open("localhost", "root", "root", "xxx")
echo db.getAllRows(sql"SELECT * FROM `xxx`.`xi_messages`")
db.close()
```
但是编译是提示：
could not load: libmysql.dll
我很绝望。

我的环境是windows 7 x64 & nim 0.17.2 x64。我用Everything搜索了一下libmysql.dll。我电脑上很多工具都带有libmysql.dll 这个文件，并且工作良好。

于是我随手复制了一个libmysql.dll 到 nimmysql.nim所在的目录。编译和运行EXE，仍然could not load: libmysql.dll。

我很绝望。

我搜索相关内容找到这个帖子：
https://stackoverflow.com/questions/37834804/cannot-load-vendor-library-libmysql-dll-or-libmysqld-dll

我不可置信地照这个回答去尝试解决，
先上mysql 网站下载 mysql zip包，https://dev.mysql.com/downloads/mysql/

我的系统和Nim 是x64的。所以我下载x64 的mysql , 解压后找到libmysql.dll，复制到我的代码的目录下。
然后问题解决了。。。

2018-01-15 13:31:14 codegay
JavaScript, Python, Ruby で多次元配列を zip で作ってループする場合のメモ

JavaScript での書き方がぱっと思い浮かばなかったのでメモしておきます。

# JavaScript

[forEach](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach) ので [分割代入](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment) を使うことで複数の引数を取得できる。

```js
// Python の zip や Ruby の Array#zip に相当する関数を作る。
const zip = (array1, array2) => array1.map((_, i) => [array1[i], array2[i]]);
zip([101, 102, 103], ['ヒロ', '沙英', '乃莉']);
//=> [[101, "ヒロ"], [102, "沙英"], [103, "乃莉"]]

zip([101, 102, 103], ['ヒロ', '沙英', '乃莉'])
  .forEach(([room, girl]) => console.log(`部屋 ${room} には${girl}が住んでいます。`));
```
```
部屋 101 にはヒロが住んでいます。
部屋 102 には沙英が住んでいます。
部屋 103 には乃莉が住んでいます。
```

ちなみに Python と Ruby では次のように書けます。

# Python

```pycon
>>> list(zip([101, 102, 103], ['ヒロ', '沙英', '乃莉']))
[(101, 'ヒロ'), (102, '沙英'), (103, '乃莉')]

>>> for room, girl in zip([101, 102, 103], ['ヒロ', '沙英', '乃莉']):
...   print(f'部屋 {room} には{girl}が住んでいます。')
...
部屋 101 にはヒロが住んでいます。
部屋 102 には沙英が住んでいます。
部屋 103 には乃莉が住んでいます。
```

# Ruby

```irb
irb(main):001:0> [101, 102, 103].zip(['ヒロ', '沙英', '乃莉'])
=> [[101, "ヒロ"], [102, "沙英"], [103, "乃莉"]]

irb(main):002:0> [101, 102, 103].zip(['ヒロ', '沙英', '乃莉']) { |room, girl| puts("部屋 #{room} には#{girl}が住んでいます。") }
部屋 101 にはヒロが住んでいます。
部屋 102 には沙英が住んでいます。
部屋 103 には乃莉が住んでいます。
```
Movable TypeでData APIが500エラーになる場合の対応

#サードパーティ製プラグインを無効にしてみる
僕の場合は「MoreAnalytics」が原因でした。

記事の人気ランキング用に導入したのですが、クラウド版のMovable Typeと相性が悪いのか使用できず。諦めてこちらのサイトの記事（[Movable TypeのDataAPIでアクセスランキングを表示する方法](http://www.koikikukan.com/archives/2015/06/04-005555.php)）などを参考にしてコツコツphpを書いていたところ、/authentication/ などのAPIは問題ないのに /sites/~/entries/~ のAPIだけエラーになるので、このプラグインが原因とわかるまでかなり時間を浪費してしまった。

もしかしたら同じように悩んでる方がいるかもしれないので。
Angular で Service のシングルトン化と非シングルトン化

# はじめに

* Angular で Service を扱う際、[チュートリアル](https://angular.io/tutorial/toh-pt4#provide-the-heroservice)の通りにすると Service がシングルトンとなり、アプリケーション内のどこから参照しても同一のインスタンスが参照される。
* 呼び出し元の文脈によって Service に別の状態をもたせたいと思った場合、非シングルトンとして扱いたくなったのでやり方を調べてまとめてみた。

# Service のシングルトン化

* まずはチュートリアルに記載されている通りにシングルトンとして Service を作成し設定し使用してみる。

## Service の作成

```bash
ng generate service hero --module=app
```

## Service が DI 可能になるように設定

* アプリケーション内のどこでも DI で取得できるように `AppModule` の `@NgModule.providers` に登録する。

```ts
@NgModule({
  providers: [
    HeroService, // 作成した HeroService の追加
	MessageService
  ],
})
export class AppModule {
```

## Service の使用

* 任意の Component や Service の constructor() の引数として対象の Service を指定することで DI により Service を取得することができる。

```ts
@Component()
export class BarComponent {
  construtor(
    public heroService: HeroService // この heroService は AppModule でキャッシュされ、アプリケーション内のどこでも同一のインスタンスが参照される
  ) { }
}
```

# Service の非シングルトン化

* Service の作成と仕様の箇所はシングルトンの場合と同様。
* `AppModule` に登録する際に下記のようにすると毎回インスタンスが生成されて非シングルトンとして扱うことができる。

```ts
@NgModule({
  providers: [
    // HeroService の DI 時の動作について定義する
    { 
      // DI で提供するクラス名を指定
	  provide: HeroService, 
      // 初期化処理を指定
      useFactory: () => { return new HeroService(); }, 
      // 初期化処理で DI するクラスを指定
      deps: []
    },
	MessageService
  ],
})
export class AppModule {
```

* HeroService の constructor に引数がある場合は useFactory を constructor に合わせて修正し、deps オプションに依存するクラスを指定する。

```ts
@NgModule({
  providers: [
    // HeroService の DI 時の動作について定義する
    { 
      // DI で提供するクラス名を指定
	  provide: HeroService, 
      // 初期化処理を指定
      // HeroService では constructor(arg1: Arg1Class, arg2: Arg2Class) という定義になっているものとする。
      useFactory: (arg1: Arg1Class, arg2: Arg2Class) => { return new HeroService(arg1, arg2); }, 
      // 初期化処理で DI するクラスを指定
      deps: [Arg1Class, Arg2Class]
    },
	MessageService
  ],
})
export class AppModule {
```

# Service の非シングルトン化その2 〜 キャッシュするスコープをコントロールする

* チュートリアルでは `AppModule` の `@NgModule.providers` に Service の DI 設定をすることでアプリケーション全体で同一インスタンスを参照するように設定したが、任意の Component の `@Component.providers` に同様の設定をすることで、その Component 以下で同一のインスタンスを参照するようになる。

## 例

```html
<component-1>
  <component-2></component-2>
  <component-3></component-3>
</component-1>
<component-a>
  <component-b></component-b>
  <component-c></component-c>
</component-a>
```

* `component-*` がすべて独自に定義した Component のセレクターであり、セレクター同士で親子関係を持つものとする。
* `component-1` の `@Component.providers` に HeroService を設定すると `component-1`, `component-2`, `component-3` で同一の HeroService インスタンスを参照するようになる。
* `component-1` と `component-a` でそれぞれ `@Component.providers` に HeroService を設定したとすると、`component-1`, `component-2`, `component-3` で同一の HeroService インスタンスを参照し、`component-a`, `component-b`, `component-c` で前出のものとは別でグループ内では同一の HeroService インスタンスを参照する。
* `component-*` すべての `@Component.providers` に HeroService を設定したとすると、それぞれ別の HeroService インスタンスを参照することになり、実質的に非シングルトンとして参照することができる。

# 参考資料

* https://qiita.com/lacolaco/items/61eed550d1f6070b36ab を読めば Angular の DI についてもっと詳しくなれる。
* providers に指定できる値の説明は https://angular.io/api/core/FactoryProvider に詳しく記載されている。
arduinoでi2c　その２

#概要
arduinoでi2cやってみた。
twi.h使って、i2cスキャナー、やってみた。

#写真
![CIMG2521.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/967f53be-28ec-5073-194c-67883da060db.jpeg)


#回路図
![image](https://qiita-image-store.s3.amazonaws.com/0/18104/97722675-4311-1b1b-edae-b9f8a1b73454.png)


#サンプルコード

```
extern "C" {
#include <stdlib.h>
#include <string.h>
#include <inttypes.h>
#include "twi.h"
}
uint8_t rxBuffer[32];
uint8_t rxBufferIndex = 0;
uint8_t rxBufferLength = 0;
uint8_t txAddress = 0;
uint8_t txBuffer[32];
uint8_t txBufferIndex = 0;
uint8_t txBufferLength = 0;

void i2c_start(uint8_t address)
{
	twi_init();
	txAddress = address;
}
uint8_t i2c_stop(uint8_t sendStop)
{
	int8_t ret = twi_writeTo(txAddress, txBuffer, txBufferLength, 1, sendStop);
	return ret;
}
void setup()
{
	char outdata;
	outdata = 0x09;
	Serial.begin(115200);
	Serial.println("\nI2C Scanner");
	byte error = 1;
	byte address;
	int nDevices = 0;
	Serial.println("Scanning...");
	for (address = 1; address < 127; address++)
	{
		i2c_start(address);
		error = i2c_stop(true);
		if (error == 0)
		{
			Serial.print("I2C device found at address 0x");
			if (address < 16) Serial.print("0");
			Serial.print(address, HEX);
			Serial.println("  !");
			nDevices++;
		}
		else if (error == 4)
		{
			Serial.print("Unknow error at address 0x");
			if (address < 16) Serial.print("0");
			Serial.println(address, HEX);
		}
	}
	if (nDevices == 0) Serial.println(" No I2C devices found\n");
	else Serial.println("done\n");
	Serial.println("ok");
}
void loop()
{
	delay(100);
}



```

#結果

```

I2C Scanner
Scanning...
I2C device found at address 0x27  !
done

ok

```


以上。
YoctoでLinuxカーネル触るときのTips


ことあるごとに「Yoctoで取ってきたコードで開発しちゃダメ」とはいわれるものの、ビルド環境がある以上はソースを触りたいのが人情。
というわけでYoctoでLinuxカーネル触るときのTipsを記載してみる

以下ターゲットがi.MX6の環境について記載されているので、それ以外のターゲットでは適宜読み替えること。

# 最重要事項: gitリポジトリは作り直される

基本的にdo_unpackタスクが走ると、gitリポジトリごと一から作り直される。
そのためコード修正して**git commitして一安心、と思っていると泣きを見る**ことになる。

do_unpackはdo_cleansstateしたりレシピファイルを修正したりすると簡単に走ってしまうため要注意。

# カーネルソースはどこにあるか

以下で確認可能

```bash
$ bitbake -e linux-imx | grep '^S='
S="/home/user/imx-3.14.52-1.1.0_ga/build/tmp/work/imx6qpsabreauto-poky-linux-gnueabi/linux-imx/3.14.52-r0/git"
```

おまけ
ソースディレクトリに飛ぶワンライナー

```bash
$ cd $(bitbake -e linux-imx | grep '^S=' | sed -e s/^S=//g | xargs echo)
```

# git amでパッチを当てる

gitリポジトリは作り直されてしまうため自前でリモートリポジトリを用意してレシピファイルはそのリポジトリを指すようにしてやるのが良い。

そういった方法が取れない場合はパッチを作成し、do_unpackの後で適用されるようにレシピを書くと良い。
レシピファイル内に`SRC_URI += "hoge.patch"`のように書いておくとdo_unpackの後で自動的にパッチを当ててくれる。しかし、この方法ではコミットまではしてくれない。コミットまで実行して欲しいときは自前でdo_patchを書く必要がある。

```python:sources/meta-local/recipes-kernel/linux/linux-imx_3.14.52.bbappend
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"

do_patch() {
        cd ${S}
        git am ${WORKDIR}/*.patch
}
```

パッチは以下のコマンドで作成する

```bash
$ git format-patch -o <yocto dir>/sources/meta-local/recipes-kernel/linux/linux-imx <start rev>..<end rev>
```

# カーネル用bbappendの作り方

上の例で説明もなくmeta-localが出てきたがこれは自前で作ったYoctoレイヤーである。
`yocto-layer`コマンドで作成できる

```bash
$ cd ../sources
$ yocto-layer create local
Please enter the layer priority you'd like to use for the layer: [default: 6]
Would you like to have an example recipe created? (y/n) [default: n]
Would you like to have an example bbappend file created? (y/n) [default: n]
```

これでmeta-localが作成されるのでbuild/conf/bblayers.confの`BBLAYERS`に追加すれば認識される

```py3:build/conf/bblayers.conf(抜粋)
BBLAYERS += " ${BSPDIR}/sources/meta-local "
```

meta-local以下にbbappendファイルを作るわけだが、bbファイルとディレクトリ階層を合わせる必要がある。
どういうことかというとbbファイルのパスが以下のようになっているとき

```bash
$ bitbake -e linux-imx | grep '^FILE='
FILE="/home/user/imx-3.14.52-1.1.0_ga/sources/meta-fsl-bsp-release/imx/meta-bsp/recipes-kernel/linux/linux-imx_3.14.52.bb"
```

bbappendファイルはmeta-local/recipes-lernel/linux/以下に置く必要がある。
またファイル名はlinux-imx_3.14.52.bbappendもしくはlinux-imx_%.bbappendである必要がある。
（後者はバージョンによらず適用されるbbappendとなる）

# カーネルコンフィグを変更する

`$ bitbake linux-imx -c menuconfig`でカーネルコンフィグを変更できるが、当然do_unpackが走れば初期化されてしまう。
diffconfigというタスクを使えばカーネルコンフィグの変更点をfragment.cfgというファイルに抽出してくれるためこれを利用する。

menuconfig実行後`$ bitbake linux-imx -c diffconfig`し、fragment.cfgをmeta-local/recipes-lernel/linux/linux-imx以下に格納する。

bbappendに`SRC_URI += "fragment.cfg"`を書けば自動で反映してくれるというような記述も見かけるが、i.MXの場合はdo_copy_defconfigで.configが上書きされてしまうためbbappendに以下のように記載した。

```py3:sources/meta-local/recipes-kernel/linux/linux-imx_3.14.52.bbappend(抜粋)
do_copy_defconfig_append() {
        cat ${WORKDIR}/*.cfg >> ${B}/.config
        cat ${WORKDIR}/*.cfg >> ${B}/../defconfig
}
```