OmniAICreator/Qiita-1.07M huggingface dataset:
swift-modeでのsmartparensを少し改良する

最近emacsをspacemacsに移行したら、spacemacsにはsmartparensというelispがデフォルトではいっていて、モードに関係なくグローバルに有効になっている。

[smartparens.el での括弧処理](http://kiririmode.hatenablog.jp/entry/20131231/p1)

これがswiftの文字列リテラルにクロージャの評価結果を直接埋め込む`\(...)`という記法と相性が悪くて、

```
\(
```
っていれた途端、

```
\(\)
```
と、対応する閉じ括弧`\)`が自動的に挿入されてしまい、イラッとする。

調べてみたら、smartparensには独自の括弧対応を定義する機能があり、`\(`を入れると自動的に`\）`がはいるよう定義されているのが原因らしい。

モードにローカルな括弧を定義する`sp-local-pair`という機能もあるので、これをつかうと`\(`にたいして普通の`)`を挿入するようにできる。

```lisp
(add-hook 'swift-mode-hook
	  (lambda ()
            ...
            (sp-local-pair 'swift-mode "\\(" ")")
            ....
            ))
```
これで解決。むしろ改善。

かつてLispプログラマだったこともあり、smartparens自体は良く出来ていると思う。
mod_rewrite のログを見る

# ログを出力するには

apache の 2.4 以降ならば以下を httpd.conf などに書く。

```apache
LogLevel alert rewrite:trace4
```

`trace4` -> `trace8` のように増やすと出力されるログが詳細になっていく。

# ログを見る

apache の error_log に出力される

ブラウザをリロードしながらログを見る。
perdir から先だけが見られれば良いので sed で前半部分を削除する。

```bash
tail -f error_log | sed -ru -e 's/.*(.perdir)/\1/'
```

`-u` でバッファしない。便利

参考: 
[grep, awk, sed でバッファしない方法](http://www.techscore.com/blog/2012/12/06/grep-awk-sed-%E3%81%A7%E3%83%90%E3%83%83%E3%83%95%E3%82%A1%E3%81%97%E3%81%AA%E3%81%84%E6%96%B9%E6%B3%95/)
EmbulkとDigdagでJVM最適化オプションを効かせる際のメモ

JVMの最適化オプションを効かせるためのメモ。

# Embulk

### 正
```
$ embulk run -b embulk_bundle config.yml
$ embulk -J-Xmx30g run -b embulk_bundle config.yml
```

### 誤
```
$ embulk -b embulk_bundle run config.yml
```
* これでも動くが最適化オプションが効かない。

## 最適化オプションが効いているかどうかの確認方法

### 正
```
$ pgrep -fl embulk
6337 java -XX:+AggressiveOpts -XX:+UseConcMarkSweepGC 〜
```

### 誤
```
$ pgrep -fl embulk
6338 java -XX:+AggressiveOpts -XX:+TieredCompilation -XX:TieredStopAtLevel=1 -Xverify:none 〜
```

* `UseConcMarkSweepGC`があれば最適化オプションが効いており(実行中のスループットが高い)、TieredCompilationとTieredStopAtLevelがある場合は最適化オプションが効いていない。
  * 後者は起動時間短縮する開発向け。
  * embulk preview 〜の場合も後者となる。


# Digdag

### 正
```
$ digdag -J+O run --project workflow my_workflow.dig
```

### 誤
```
$ digdag run --project workflow my_workflow.dig
```

* digdagの後ろに「-J+O」を付けないとDigdag自体の最適化オプションが動かない。
* DigdagからEmbulkを動かしている場合のEmbulkは無関係。

## 最適化オプションが効いているかどうかの確認方法

### 正
```
$ pgrep -fl digdag
8796 java -Dio.digdag.cli.launcher=selfrun -XX:+AggressiveOpts -XX:+UseConcMarkSweepGC 〜
```

### 誤
```
$ pgrep -fl digdag
8797 java -Dio.digdag.cli.launcher=selfrun -XX:+AggressiveOpts -XX:TieredStopAtLevel=1 -Xverify:none 〜
```

* Embulkと確認方法は同じ
Cognos パフォチュー事例 - ディメンションの統合

##概要
Cognos BIのDMRモデルにおける、レポート実行時のパフォーマンスチューニング事例です。

クロス集計などで、列または行に複数のデータアイテムをネストされた状態で配置する事は多いと思います。
例えば、列に「Company name」「Area name」「Department」の3つのアイテムを置いた場合に、それぞれのアイテムが異なるディメンションに存在する場合、例えば以下の画像の事例では、
Company name = 4種類
Area name = 5種類
Department = 6種類
であった場合に、クロスジョインで全アイテムの全メンバーの組み合わせ(120通り)が計算され、結果セットイメージの仮想キューブを作成する処理が非常に重くなります。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/b892ce66-f612-bd80-e8b2-a77c6975d586.png)

##対応策
以下のように、親子関係を持たせる事ができるデータアイテム同士は、同一ディメンションの同一階層内に配置するDMRモデリングを構成する事により、計算パターンが非常に少なくなり、仮想キューブ作成処理が軽くなりレスポンスが向上します。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/69e2e92a-752d-fea4-7277-07a210dee2a5.png)

「ディメンションの統合」という選択肢は、DMRモデリングでは覚えておいて頂ければと思います。
Herokuでアイドルさせないようにした際のメモ

Herokuでは30分ごとにアイドル状態になってしまうため、定期的にアクセスしてアイドル状態にさせないようにした。
アプリケーションは node.js+exprss で立てたwebサーバー

### webサーバーにstatus：２００を返すよう設定
こんな感じにした

```route/index.js
router.get('/status', (req, res) => {
    res.writeHead(200, {'Content-Type': 'application/json; charset=utf-8'});
    res.end(JSON.stringify({status: 'ok'}));
});
```

### やったこと
1. [Uptime Robot](https://uptimerobot.com/)に登録
2. "Add New Monitor" をクリック
3. "Monitor Type" に "HTTP(s)" を選択
4. "Friendly Name" は適当に
5. "URL"に "HerokuのURL"/status を入力
6. "Monitoring Interval" は20分ぐらいに設定
VPC Peering使って良かったケース(SSH踏み台、監視)

# 目次
- 良かったケース
- できないこと

# 良かったケース
![スクリーンショット 2017-03-10 8.24.51.png](https://qiita-image-store.s3.amazonaws.com/0/140253/62902bf2-2cb3-9a37-a7e6-0c602a027122.png)

## 踏み台サーバ
AWS上に踏み台用のVPCを作り、各VPCとPeeringする。

これにより、会社など特定のIPアドレスからのアクセスに制限したい場合、個別にセキュリティグループを設定する必要がなくなる。

また、AWSの外に踏み台を作るよりセキュリティを高めることができる。（各インスタンスをSSHのためにインターネットに晒す必要がなくなる。）

AWSアカウントを跨いでのPeeringも可能。

## 監視サーバ 
監視サーバ用のVPCを作り、各VPCとPeeringする。

これにより、監視サーバを統合、一元管理することができ、運用が楽になる。

VPC Peeringは1対1である必要があり、VPC先へルーティングすることはできないが、Zabbixを使っている場合はZabbix Proxyでその先の監視まで実装することができる。

# できないこと
## VPCを跨ぐ通信はできない
peeringしているVPC同士は通信できるが、VPCを跨いでの通信、ルーティングはできない。
![スクリーンショット 2017-03-10 8.55.57.png](https://qiita-image-store.s3.amazonaws.com/0/140253/29010403-c72e-785f-a569-6ab5010190f4.png)

## IWG/VGWへ抜ける通信できない
peering先のVPCから、InternetGatewayやDirectConnect(VirtualGateway)へ抜ける通信はできない。
![スクリーンショット 2017-03-10 9.03.53.png](https://qiita-image-store.s3.amazonaws.com/0/140253/d693ed26-e2cd-a84e-eec9-2c8f29ca8b63.png)
GCP Next17で発表されたサービスと機能の超概要

GCP Next17でビッグデータと機械学習系のサービスに便利な機能が多く追加されたりしてるので、まずは気になったものをメモ程度に記載しておく。

元ネタは以下
https://cloud.google.com/blog/big-data/2017/03/google-cloud-platform-adds-new-tools-for-easy-data-preparation-and-integration

#Google Cloud Dataprep
データを前処理するためのマネージド・サービス。データの前処理はデータ分析するために必須で重要な機能なので、とても気になるサービス。Daterepには以下の特徴がある。
https://cloud.google.com/dataprep/

- 自動検知：値がスキーマにあってるかどうか自動で検知する
- ドラッグ＆ドロップ開発：直感的な操作を提供している
- 追加設定なしでBigQueryやGCSと統合
- フルマネージドサービス

#BigQuery
##Data Transfer Service
Google AdwordsやDoubleClick Campaign Manager, DoubleClick for Publishers、Youtube ContentとChannel Owner reportsから数クイックでデータを取得できる。

##Federated query for Cloud Bigtable
GCSやGoogle Drive、Google Sheetsに加えてBigtableにもBigQueryからクエリをかけられるようになった。

#Python for Google Cloud Dataflow in GA
DataflowでPythonがGAになった。これまでストリーミング処理はJavaしか対応してなかったが、Pythonでもできるようになった。

#Stackdriver Monitoring for Cloud Dataflow (Beta)
Cloud Dataflowジョブ条件によってアラートをあげることができるようになった。

# Google Cloud Datalab in GA
DatalabがGAになった。

# Google Cloud Dataproc updates
以下の機能が追加された。

- 失敗したジョブの自動リスタート
- シングルノードクラスタが作れるようになった
- DataprocクラスタにGPUを付けれるようになった
- Cloud labelsがGAになった
- Regional endpointsが利用できるようになった
- GCSのオペレーションが速くなった

#Cloud ML Engine in GA
Cloud MLがGAになった。

#Video Intelligence API
動画に登場するオブジェクトを自動で認識し、タグ付けしてくれるサービス。
https://cloud.google.com/video-intelligence/

# Cloud Endpoints
## Cloud Endpoints deployment history screen
デプロイ履歴をトラックできるようになった

## Cloud Endpoints Proxy gRPC
APIコンソール、モニタリング、ロギング、トレース、認証機能がgRPCサービスに追加された

##Cloud Endpoints Java and Python frameworks 2.0 GA
これまではNode.jsだけだったが、JavaとPythonがGAになって使えるようになった。
Python > dictionary > values() > Get All Values by Using values()

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

> Get All Values by Using values()

試してみた。


http://ideone.com/LATO2j

```py
mydic = {'7of9' : 'borg', 'Chakotay' : 'human', 'Janeway' : 'human'}
print(mydic.values())
```

```txt:動作環境
['human', 'borg', 'human']
```

dictionaryの場合はセットするペアの順番は保持されないためか、values()で得られた値はセット時の順番とは異なるのが上記から見られる。

http://ideone.com/DRpIPQ

```py
mydic = {'a' : 'zun', 'b' : 'zun', 'c': 'zun', 'd' : 'doko', 'e' : 'zun' }
print(mydic.values())
print('KIYOSHI!')
```

```txt:結果
Success	time: 0.01 memory: 23352 signal:0
['zun', 'zun', 'zun', 'zun', 'doko']
KIYOSHI!
```
技術英語 > , or we can [take it down] if it's off topic. / write it down

@ http://stats.stackexchange.com/questions/154879/a-list-of-cost-functions-used-in-neural-networks-alongside-applications

> , or we can **take it down** if it's off topic.

http://eow.alc.co.jp/search?q=take+down
> `7.` 《イ》〔コンテンツ・ウェブページ・掲示板などを〕消す、削除する

<hr>
関連して思い出したのは

write it down

https://www.merriam-webster.com/dictionary/write%20down
> 1 :  to record in written form
Cloud Functions for Firebaseとは？

やっとGoogle Cloud FunctionsがBetaになり これから色々情報が出てくると思います。
今回は僕が特に注目してるCloud Functions for Firebaseについてです。

# Cloud Functions for Firebaseとは
Firebaseのユーザ認証、データベース、ストレージの追加や変更のイベントを受け取ってサーバ側で何か処理できるサービスです。

現在はNode.jsがサポートされています。

クライアント側にロジックを持たせてしまうと問題のあるようなものをCloud Functionsにすることでロジックを秘匿することができますし、Push通知をするためのAPI Keyもクライアントに持たせるわけにいかないのでCloud Functionsを使えば安全に簡単にユーザの操作を元にPush通知を実装することもできます。

# 使い方

では早速試してみます。
バージョン6.3.1以上のNode.jsを必要とします。

## SDKのインストール

次のコマンドでfirebase-toolsをインストールします。

```bash
$ npm install -g firebase-tools
```

インストールできたら`firebase login`で認証します。

次に、適当なディレクトリを作成してその中で`firebase init`をします。
デフォルトではFunctionsを使うにチェックが入ってると思うのでそのままエンターですすめます。

```bash
$ mkdir functions-test; cd functions-test
$ firebase init
```

作成できるとこのようなディレクトリ構成になると思います。

```
.
├── database.rules.json
├── firebase.json
└── functions
    ├── index.js
    ├── node_modules/...
    └── package.json
```

既存のFirebase プロジェクトにFunctionsを追加したい場合は`firebase init functions`コマンドで初期化できます。

## 関数の作成

今回はデータベースの変更をフックして起動する関数を書いてみます。

```js:index.js
var functions = require('firebase-functions');

exports.helloWorld = functions.database.ref('/test')
    .onWrite(event => {
      const val = event.data.val();
      console.log('helloWorld', val);
    })

```

## デプロイ

次のコマンドでFunctionsだけをデプロイできます。

```bash
$ firebase deploy --only functions
```

Firebase コンソールから`/test`を変更してコンソールか`firebase functions:log`コマンドからログを確認できます。

# 料金

気になる料金ですが [Pricing](https://firebase.google.com/pricing/)で確認してください。

現在は無料プランではGoogleネットワーク外部と通信に制限があるので、どうしても外部と通信したい！と言う場合はプランを上げるかApp Engineと合わせて使う必要がありそうです。

それと従量課金のBLAZEプランでも無料枠があるので気軽に使い始められるかもしれません。

# まとめ

API Keyなどはコードに書かないですむように 環境変数をセットすることもできるようです。

公式でサンプルがあるので[GitHub](https://github.com/firebase/functions-samples)を見てみてください
カスタム認証や支払い処理、バッヂ処理、テキストのNG処理などのサンプルがあります。

~~また 現在は関数の削除は[Cloud Console](https://console.cloud.google.com/functions)からしかできないようです。~~
index.jsから関数を消せば削除されそう（要確認）
Rails4でfilter_parametersのネスト



```ruby
Rails.application.config.filter_parameters += [:name]
```

としてしまうと正規表現が使われているので、nameという文字が入っているパラメータはすべてマスクされてしまいます。

特定の親のパラメータを持っているもののみマスクしたいとき、ありますよね？

残念ならが、[Rails4](http://api.rubyonrails.org/v4.2/classes/ActionDispatch/Http/FilterParameters.html)ではサポートされておらず、[Rails5](http://api.rubyonrails.org/classes/ActionDispatch/Http/FilterParameters.html)からサポートされています。


Rails4の[コード](https://github.com/rails/rails/blob/v4.2.8/actionpack/lib/action_dispatch/http/parameter_filter.rb#L20)とRails5の[コード](https://github.com/rails/rails/blob/v5.0.1/actionpack/lib/action_dispatch/http/parameter_filter.rb#L20)を見くれべて見ます。

差分のコミットは下記の2つ
https://github.com/rails/rails/commit/33b93174f0db9783b3c6c906666923103569c6a3
https://github.com/rails/rails/commit/5bb1d4d288d019e276335465d0389fd2f5246bfd

`CompiledFilter`クラスの中身が少し書き換わっただけです。

ということで、Rails5のコードを下記のようにほぼコピーして`initializers`とかに書けば、

```ruby
Rails.application.config.filter_parameters += ['user.name']
```
のように親のパラメータを指定できるようになります。


唯一の変更点は定数`FILTERED`を`ActionDispatch::Http::ParameterFilter::FILTERED`に書き換えています。

```ruby
class ActionDispatch::Http::ParameterFilter::CompiledFilter
  def self.compile(filters)
    return lambda { |params| params.dup } if filters.empty?

    strings, regexps, blocks = [], [], []

    filters.each do |item|
      case item
      when Proc
        blocks << item
      when Regexp
        regexps << item
      else
        strings << Regexp.escape(item.to_s)
      end
    end

    deep_regexps, regexps = regexps.partition { |r| r.to_s.include?("\\.".freeze) }
    deep_strings, strings = strings.partition { |s| s.include?("\\.".freeze) }

    regexps << Regexp.new(strings.join('|'.freeze), true) unless strings.empty?
    deep_regexps << Regexp.new(deep_strings.join('|'.freeze), true) unless deep_strings.empty?

    new regexps, deep_regexps, blocks
   end

   attr_reader :regexps, :deep_regexps, :blocks

   def initialize(regexps, deep_regexps, blocks)
     @regexps = regexps
     @deep_regexps = deep_regexps.any? ? deep_regexps : nil
     @blocks  = blocks
   end

   def call(original_params, parents = [])
     filtered_params = {}

     original_params.each do |key, value|
       parents.push(key) if deep_regexps
       if regexps.any? { |r| key =~ r }
         value = ActionDispatch::Http::ParameterFilter::FILTERED
       elsif deep_regexps && (joined = parents.join('.')) && deep_regexps.any? { |r| joined =~ r }
         value = ActionDispatch::Http::ParameterFilter::FILTERED
       elsif value.is_a?(Hash)
         value = call(value, parents)
       elsif value.is_a?(Array)
         value = value.map { |v| v.is_a?(Hash) ? call(v, parents) : v }
       elsif blocks.any?
         key = key.dup if key.duplicable?
         value = value.dup if value.duplicable?
         blocks.each { |b| b.call(key, value) }
        end
        parents.pop if deep_regexps

        filtered_params[key] = value
      end

      filtered_params
    end
  end
end
```
PHPフレームワーク「Slim」でMySQLを利用してみる


## 概要
[前回の記事](http://qiita.com/juve_534/items/79877a0cf0b0b6b8298c)に引き続いてSlimを触っていきます。

今回はMySQLに接続してDBからデータを取得していきます。

## 設定
まずは[公式サイトのドキュメント](https://www.slimframework.com/docs/tutorial/first-app.html)を参考にし、DSN情報をsetting.phpに記載します。

```src/setting.php
// db接続情報
'db' => [
    'host'   => 'localhost',
    'user'   => 'ユーザ名',
    'pass'   => 'パスワード',
    'dbname' => 'DB名',
]
```

次に、DBオブジェクト生成を行います。
今回はチュートリアルと同様にPDOを利用します。

```src/dependencies.php
// DB接続
$container['db'] = function ($c) {
    $dsn = 'mysql:host=%s;dbname=%s;charset=utf8mb4';
    $db  = $c['settings']['db'];
    $pdo = new PDO(sprintf($dsn, $db['host'], $db['dbname']),
        $db['user'], $db['pass']);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    return $pdo;
};
```
これで準備は整いました。
それでは実際にDBからデータを取得していきます。

## データ取得
今回はブログの件名と登録内容を格納したpostsテーブルからデータを取得していきます。

先程生成したDBオブジェクトは、routes.php内で$this->dbとして利用することが出来ます。

```src/routes.php
// ブログ登録内容取得
$app->get('/blog', function ($request, $response, $args) {

    $sql = 'SELECT * FROM posts';
    $query = $this->db->prepare($sql);
    $query->execute();

    $data = $query->fetchAll(PDO::FETCH_ASSOC);

    var_dump($data);
});
```

実際にブラウザからアクセスすると下記のようにデータが取得できていました。

```
array 
  0 => 
    array
      'id' => string '1'
      'title' => string '???'
      'body' => string '???lol'
      'created' => string '2016-03-03 01:49:06'
      'modify' => string '2016-03-11 02:25:00'
```

なぜかマルチバイトが文字化けしていますが、データ取得自体は出来たので今回はここまでとします。

## 追記
マルチバイトの文字化けはコメントにてご指摘頂いたようにcharsetの指定漏れでした。
ちゃんとcharsetを指定することで文字化けは解消されました。

```
array 
  0 => 
    array
      'id' => string '1'
      'title' => string 'テスト'
      'body' => string 'テストlol'
      'created' => string '2016-03-03 01:49:06'
      'modify' => string '2016-03-11 02:25:00'
```
mysqlでDBに保存した日本語が?で表示されてしまう

■DBを選択してからテーブルの文字コードを変更する

```sql
mysql> use db_name;
mysql> alter table table_name convert to character set utf8 collate utf8_general_ci;
```

※補足


■文字コードを確認

```
mysql> show variables like "chara%";
```

■DB等の文字コードを変更

```
mysql> set character_set_database = utf8;
mysql> set character_set_client = utf8;
mysql> set character_set_connection = utf8;
mysql> set character_set_results = utf8;
mysql> set character_set_server = utf8;
```

※globalで変更したい場合はsetの後ろに```global```を付ける
Swift3　Storyboardでポップアップビューを実装

こちらの記事をSwift3に書き換えました。
http://qiita.com/dondoko-susumu/items/7b48413f63a771484fbe
Storyboardを使っているのでコードの書き換え部分は数行しかありません。

ModalViewController.swift(Swift3)

```Swift
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesEnded(touches, with: event)
        for touch: UITouch in touches {
            let tag = touch.view!.tag
            print(tag)
            if tag == 1 {
                dismiss(animated: true, completion: nil)
            }
        }
}

@IBAction func didTapClose(_ sender: AnyObject) {
       dismiss(animated: true, completion: nil)
}
```

ViewController.swift(Swift3)

```Swift
@IBAction func didPressButton(_ sender: AnyObject) {
        performSegue(withIdentifier: "modal", sender: nil)
}
```
ガラケーからiPhoneへ、フリガナを含めて連絡先を移行する方法


## TL;DR
1. vcfファイルをガラケーから取り出す
1. vcfファイルのフリガナのkeyを全て「X-PHONETIC-FIRST-NAME」にする
1. 半角カナを全角カナに変換する
1. iPhoneに送って取り込む

## 経緯
ソフトバンクのガラケーを使っていた母（60代半ば）が「電話料金が高い」と言い出したことがきっかけで、楽天モバイルにすることになり、iPhoneにすることになり、あれよあれよという間に諸々の手続きと作業を押し付けられてしまいました。

基本的にただ面倒くさいだけの作業なのですが、連絡先を移行する時にフリガナを含めるのが鬼門で地味にSEスキルが必要だったのでここに書き留めておきます。

SEスキルとは言ってもプログラミングとかではないです。意味不明なテキストファイルをとりあえずいじってみる好奇心が必要です。

## 環境
移行元端末: ガラケー（COLOR LIFE 2 002P）
移行先端末: iPhone6 32G
作業端末: Mac Book Air

※環境が違っても以下手順にそれほど差異はないです。

## 手順
### 1. 連絡先ファイルをガラケーから抽出する
機種によって手順は異なりますが、以下サイトがわかりやすくてほとんどの機種に当てはまりそうなので参考にしてみてください。
http://iphone.f-tools.net/setting/Address-Copy.html

最終的に.vcfと拡張子のついた連絡先ファイルが出来上がれば完了です。
ここではファイル名をcontacts.vcfと仮定して以下を進めます。

### 2. 連絡先ファイルをいじる
フリガナを含めるにはここでの手順が大事です。

手順１で取得したファイルをメモ帳か何かのテキストエディタで開くと、
以下のようなテキストがずらずらと書かれているかと思います。

```contacts.vcf
 : 
 : 
 : 
BEGIN:VCARD
VERSION:2.1
N;CHARSET=SHIFT_JIS:山田　太郎;
SOUND;CHARSET=SHIFT_JIS;X-IRMC-N:ﾔﾏﾀﾞ ﾀﾛｳ
TEL;VOICE:0312345678
NOTE;CHARSET=SHIFT_JIS;ENCODING=QUOTED-PRINTABLE:=00=11=22=33
X-GNO:0
X-GN;CHARSET=SHIFT_JIS;ENCODING=QUOTED-PRINTABLE:
X-CLASS:PUBLIC
END:VCARD
 : 
 : （繰り返し）
 : 
```

一番重要な点は、フリガナが書かれている行の先頭の単語（この例では「SOUND」）です。
これを全て「X-PHONETIC-FIRST-NAME」に書き換えてください。
とはいえたくさんあるので、テキストエディタの一括置換機能を使うと楽だと思います。

以下のようになればOKです。

```contacts.vcf
 : 
 : 
 : 
BEGIN:VCARD
VERSION:2.1
N;CHARSET=SHIFT_JIS:山田　太郎;
X-PHONETIC-FIRST-NAME;CHARSET=SHIFT_JIS;X-IRMC-N:ﾔﾏﾀﾞ ﾀﾛｳ
TEL;VOICE:0312345678
NOTE;CHARSET=SHIFT_JIS;ENCODING=QUOTED-PRINTABLE:=00=11=22=33
X-GNO:0
X-GN;CHARSET=SHIFT_JIS;ENCODING=QUOTED-PRINTABLE:
X-CLASS:PUBLIC
END:VCARD
 : 
 : （繰り返し）
 : 
```
　
また、iPhoneは半角カナに対応していないので、全角カナに書き換えます。
以下のサイトが便利でした。
http://zerothree.sub.jp/php/mbckana_b/

contacts.vcfの全てを丸々コピペして変換し、
変換されたものを丸々コピペしてcontacts.vcfに戻せば完了です。


#### もし仮にフリガナの行が姓と名で分かれている場合
つまり、

```contancts.vcf
 : 
SOUND-LAST-NAME;CHARSET=SHIFT_JIS;X-IRMC-N:ｻﾄｳ
SOUND-FIRST-NAME;CHARSET=SHIFT_JIS;X-IRMC-N:ﾊﾅｺ
 : 
```

となっている場合は、
LAST NAMEを表しているものを「X-PHONETIC-LAST-NAME」
FIRST NAMEを表しているものを「X-PHONETIC-FIRST-NAME」
に変更してください。

以下のようになれば完了です。

```contancts.vcf
 : 
X-PHONETIC-LAST-NAME;CHARSET=SHIFT_JIS;X-IRMC-N:ｻﾄｳ
X-PHONETIC-NAME;CHARSET=SHIFT_JIS;X-IRMC-N:ﾊﾅｺ
 : 
```

#### さらにもし仮に漢字も姓と名を分けて登録したい、という場合
行頭に「N;」もしくは「N:」と書かれている行の漢字の姓と名を「;」で区切ってください。
つまり、

```contancts.vcf
 : 
N;CHARSET=SHIFT_JIS:山田　太郎;
 : 
```

となっているところを

```contancts.vcf
 : 
N;CHARSET=SHIFT_JIS:山田;太郎;
 : 
```

とすれば完了です。

### 3. 連絡先ファイルをiPhoneに取り込む
手順２で加工したvcfファイルをiPhoneにメールなどで添付して送り、iPhoneで開くと「連絡先を追加しますか？」みたいなメッセージが出て追加できます。

もしこれでフリガナが移行されていない場合は、Gmail（もしくはiCloud）とiPhoneの連絡先を同期させて、それ経由でインポートしてみてください。

おわり
「Visual Studio Code」と「Visual Studio」でvbsを実行してみた

①2つの使い分けは、どのようにしておられますか？
②2つの比較のおすすめのサイトを教えて下さい。

# Visual Studio Code
(参考)

http://beachside.hatenablog.com/entry/2016/08/17/004500

(tasks.json)
"command": "python",
↓
"command": "wscript",
(参考)[VSCode]Visual Studio CodeでShift-JISのファイルを開く 

http://qiita.com/devrookiecom/items/faf2b6ee6f9e058022cc

# Visual Studio
(参考)
 
http://sunrisebyeast.hatenablog.jp/entry/2012/08/21/230730

(外部ツール)
タイトル(T):VBSスクリプトの実行
コマンド(C):C:\Windows\System32\wscript.exe
引数(R):$(ItemPath)

(参考)

http://qiita.com/tkdrecord/items/ecc211afe4fd40c809d5
Railsで1つのフォームで複数のモデルを登録・更新させる

アソシエーションとかで紐付いている複数モデルを、1つのフォームで入力させて登録・更新する方法について調べた。

## Model
companyモデルに会社の経理情報を持ったcompany_financialモデルが1対1でリンクしている。
ポイントとしては、company更新時に付随するcompany_financialを、accepts_nested_attributes_forに指定するところ。

```ruby:company.rb
class Company < ActiveRecord::Base
  has_one :company_financial
  accepts_nested_attributes_for :company_financial
end
```
```ruby:company_financial.rb
class CompanyFinancial < ActiveRecord::Base
  belongs_to :company
end
```

## Controller
ポイントは以下の二つ。
- strong parameterに、company_financial_attributesを追加してあげる。（更新時のためにidもパラメータに含めておく） 
- 付随するアソシエーションも同時に登録する場合はbuildであらかじめ作成しておくこと。（has_oneではbuildが使えないのでbuild_~~を使用します）

```ruby:company_financial.rb
class CompaniesController < ApplicationController
  before_action :find_company, only: [:show, :edit, :update, :destroy]

  def new
    @company = Company.new
    @company.build_company_financial
  end

  def edit
  end

  def create
    @company = Company.new(company_params)
    @company.save!
    redirect_to company_path(@company)
  rescue
    render action: 'new'
  end

  def update
    @company.update!(company_params)
    redirect_to company_path(@company)
  rescue
    render action: 'edit'
  end

  private

    def find_company
      @company = Company.find(params[:id])
    end

    def company_params
      params.require(:company).permit(:name, company_financial_attributes: [:id, :bank_info])
    end

end
```

## View
fields_forでネストすることで、アソシエーションのフィールドを設置できる。

```ruby:companies/new.html.slim
= form_for @company, url: companies_path do |f|
  .form-group
    = f.label :name
    = f.text_field :name
  = form.fields_for :company_financial: do |fin|
    .form-group
      = fin.label :bank_info
      = fin.text_field :bank_info
```

## Model間の関係はないが、1つのフォームで複数モデルの登録をしたい場合
strong parameterを分けて、それぞれでsaveすればOK.

```ruby:company_financial.rb
class CompaniesController < ApplicationController
  before_action :find_company, only: [:show, :edit, :update, :destroy]

  def new
    @company = Company.new
    @user = User.new
  end

  def create
    @company = Company.new(company_params)
    @company.save!
    @user = User.new(user_params)
    @user.save!
    redirect_to company_path(@company)
  rescue
    render action: 'new'
  end

  private

    def company_params
      params.require(:company).permit(:name)
    end

    def user_params
      params.require(:user).permit(:name)
    end
end
```

## View

```ruby:companies/new.html.slim
= form_for @company, url: companies_path do |f|
  .form-group
    = f.label :name
    = f.text_field :name
  = form.fields_for @user do |user|
    .form-group
      = user.label :name
      = user.text_field :name
```
angular-cli-ghpagesを使ってみた(ng github-pages:deployが動かなくなった)

#0. ng github-pages:deploy が動かない

```bash
ng github-pages:deploy
The specified command github-pages:deploy is invalid. For available options, see `ng help`.
```

angular-cliを利用してgithub.ioに作ったangularアプリをdeployしたいときに、多分、こういうエラーが出る例が増えて来ていると思う。

angular-cliはこのオプションのサポートをやめたのかもしれない。
その代わり、最近[angular-cli-ghpages](https://github.com/angular-buch/angular-cli-ghpages)というツールが出た。

#1. 代わりにangular-cli-ghpagesを使おう！

現在の自分の環境はこういう感じ。

```bash
ng --version

@angular/cli: 1.0.0-rc.0
node: 7.7.2
os: darwin x64
@angular/common: 2.4.9
@angular/compiler: 2.4.9
@angular/core: 2.4.9
@angular/forms: 2.4.9
@angular/http: 2.4.9
@angular/platform-browser: 2.4.9
@angular/platform-browser-dynamic: 2.4.9
@angular/router: 3.4.9
@angular/cli: 1.0.0-rc.0
@angular/compiler-cli: 2.4.9
```

angular-cli-ghpagesのREADMEに書いてある通りにアプリをビルドして、デプロイしてみた。

```bash
ng build --prod --base-href "https://USERNAME.github.io/REPOSITORY/"
angular-cli-ghpages [OPTIONS]
```

- `Successfully published!`とプロンプトに表示されて、github.ioにアクセスすると、angular2 tutorialで作ったアプリが動いていた。
- `angular-cli-ghpages`の代わりに`ngh`という短縮コマンドでも使えるようです。こっちの方が楽。
- というわけでこれからは`ngh`ですね。
猿でもわかるEmacs入門

Emacsを触りはじめてしばらくたって、だいぶいろいろなことが分かってきたので、Emacsを始めてみようと思っている人向けに（特に物心ついた時にはすでにGUI全盛だった若い世代の人向けに）Emacsとは何ぞや、という入門記事を書きたいと思います。

Emacs初心者がインストール前にこの記事を読めば、このとっつきにくいエディタとわりとすんなり仲良くなれると思います。
#はじめに
Emacsとは基本的にCUI上で動くリッチなテキストエディタです。
基本的にと書いたのはターミナル（Windowsでいうコマンドプロント）以外で動くEmacsもあるよということなんですが、この辺は無駄に混乱するしそんなに大事なことじゃないので説明しません。
あとずっとみんなが話してるVim(vi)との違いについてもずっとみんなが話してるので説明しません。どうしても気になるようだったらwikipediaとかを見てください。

[エディタ戦争 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E6%88%A6%E4%BA%89)


#Emacsを初めて触った人が取り乱さないために
Emacsを始める上で大事なことはEmacsが**文字しか扱えない**ということです。
(世の中にはEmacsで画像表示できるようにしてTwitterとかを見てる人もいますが、そういう人はEmacsの世界にとらえられたかわいそうな人たちなのでそっとしておきましょう)
Emacs上ではAtom(GitHubが作ったテキストエディタ)のようなおしゃれなアイコンも、アニメーションもありません。文字と一部の図形ですべてを表現しています。これはEmacsが、まだ人々がキーボードと文字を表示できるコマンドラインしか使えなかったときに生まれたテキストエディタだからです。

Emacsは文字しか扱えませんが、その代わりに文字をめちゃくちゃ上手に使えます。プログラムを書いているときは文字操作が基本なので、慣れてしまえば爆速でテキスト編集ができます。

#Emacsを使うことのメリット
ここまでの説明では結局Emacsが何なのか、ほかのエディタとどう違うのかがなんだかよくわからなかったと思います。ここからはEmacsを使うことのメリットやデメリットを挙げながら説明していきます。
###ホームポジションで全部の作業ができる
**ぶっちゃけこれにつきます。**マウスもなかったころからあるエディタなので、キーボードで全部の操作が完結するように作られています。さらにEmacsは、テキスト編集に特化した独自のキーバインドを持っていて、手をほとんど移動させずに使うことができます。たとえばCtrlとnの同時押し(EmacsではC-nと書きます)すればカーソルが一行下に移動します。もう遠くの矢印キーをわざわざ押しに行くことはありません。
このキーバインドを使いこなせるようになれば、間違いなくコーディングのスピードが上がります。

###カスタマイズ性が高い
EmacsはEmacs-Lispという独自の言語でカスタマイズすることができます。ほかのエディタやIDE(統合開発環境)だと文字のフォントが変えられたり、背景の色が変えられたりするくらいですが、Emacs-Lispが使えるようにさえなれば思いつくままに本当に何でもすることができます。また、自分で全部の設定をしなくても、世の中のたくさんのEmacs使いたちが自分の作った機能をパッケージとして公開してくれているので、それらを使うだけでかなりのことができます。ほかのエディタでできてEmacsでできないことはほぼないと言っていいでしょう。

###見えない部分のことまでわかる
Atomのような他のエディタはグラフィカルなボタンなどで設定ができて、こちらが少し指示を出してあげれば、めんどうくさいことは裏で勝手にやってくれます。これはとてもいいことなんですが、「何やってるかわからないけど、なんかうまくいく」っていう感じがして、プログラミングの過程にブラックボックスができてしまうような気がしてしまう人もいるでしょう。(もちろんちゃんと調べれば何やってるかはちゃんとわかります)

その点EmacsはあらかじめEmacs-Lispを使って全部こちらが指示してあげなくちゃいけません。設定に手がかかる分、バックグラウンドで何をやっているかがわかりやすいし、自分が気に入らない部分だけ変更することもできます。

#Emacsを使うことのデメリット
逆にEmacsにはいくつかのデメリットもあります。大体は解決策が見つかっているんですが、どうせこれから直面するであろうことなので先に紹介しておきます。

###設定がめんどくさい
なんでもできるということは、なんでもしなきゃいけないということです。ほとんどの設定は起動時に読み込むinit.elというファイルに自分で書き込まなきゃいけません。パッケージをインストールしても「パッケージをインストールしたこと」「パッケージを置いた場所」「そのパッケージをどう使うか」などなどをまたinit.elファイルに書き込まなきゃいけません。これに関しては解決策などありません。せいぜい頑張ってください。

###意外と重い
テキストだけをあつかうものなので圧倒的に軽いかと思いきや、意外とそうでもありません。確かに基本の何もいじっていないEmacsは光の速さで動きますが、いろいろ機能を加えていくうちに重くなっていきます。しかもベースが数十年前からあるままなので、あたらしいエディタなら当たり前にできることもめっちゃ頑張って負荷をかけないとできなかったりします。(たとえば筆者のEmacsは行番号を表示すると目に見えて重くなります。)また、起動時に設定ファイルを一から読み込むので結構な時間がかかります。対処策として軽量化されたパッケージを使うとか、いらない設定を消すとかでだいぶ改善されます。

###Emacsキーバインド以外が使いづらくなる
Emacsのキーバインドは他と比べて独特なので、Emacsに慣れすぎてしまうと他のアプリを使っているときに誤操作が増えます。例えばコピーはふつうCtrl-c(MacではCommand-c)ですが、EmacsではM(Alt)-wです。こんな調子でほとんどのキーバインドがデフォルトと異なるのでEmacsに慣れたてのときはかなり混乱すると思います。ブラウザで上にスクロールしようとして印刷画面が出てきたらあなたも立派なEmacs使いです。どうしても混乱してしまうようなら[keyhac](https://sites.google.com/site/craftware/keyhac-ja)などでOS全体のキーバインドをEmacs風に変えてしまうのも手です。

#おわりに
ここまでEmacsというエディタの基本的なところをざっと説明してきました。歴史が長い分、最近は少し古いような感じもしてきましたが、デメリットを補って余りあるメリットのあるエディタです。めんどうくさいインストールと、ややこしい設定と、慣れるまでしばらくの期間を乗り越えて、最高のEmacsライフを送ってください！
おさいふPonta で クレジットカードがなくても Cloud9 を使おう！

## まえがき

便利ですよね、 [Cloud9](https://c9.io) 。開発環境構築の手を煩わすこともないし、他端末でもそのままつかえるしなによりペアプログラミングの機能（ Cloud9 内でチャットできたり、相手のカーソル位置が見えたり）がめっちゃ充実してる！

使わない手はないですよね。しかし、去年の夏に Amazon が Cloud9 を買収して AWS の一部になってからは新規登録にクレジットカードが必要になってしまいました。

僕はそれよりも前に登録を済ませていたので問題ありませんでしたが、それより後に使用しようとした人、特に多くのカード会社でクレジットカードが持てない学生の方にはきつい条件のように思われます。

しかし、LAWSON の Pontaカードにプリペイド機能がついた おさいふPonta は JCB のクレジットカードとしても（チャージした金額の中で）使えるので、この問題を解決することができます。（Heroku では JCB が使えません）

## おさいふ Ponta の準備
まずは近くの LAWSON に行っておさいふPontaをもらってきましょう。

僕の最寄りの LAWSON ではお菓子などが置いてある棚の横側にありました。目立たないのでわからなければ店員さんに聞いてみましょう。

カードをゲットしたら店員さんにお金をチャージしてもらいます。最小額は1000円で一円づつ値段を設定できます。**チャージをしないとCloud9アカウント作成に失敗してしまうのでご注意ください。**

[おさいふPontaの会員登録ページ](http://www.osaifuponta.lawson.co.jp/member/register/)にて会員登録を行いましょう。詳しくは[公式サイト](http://www.osaifuponta.lawson.co.jp/member/register/)をご覧下さい。

## Cloud9の会員登録
いよいよCloud9です。

[Cloud9](http://c9.io)にアクセスし、右上の「Sign Up」を押してください。（GitHubやBitBucketのアカウントをお持ちの方はそのアイコンをクリックしてください）

名前、ユーザー名を入力し終わったあと、クレジットカードを入力するフォームが出てきます。

「Full name (card holder)」には `OSAIFUPONTA MEMBER` と、 「Card number」にはカード表面の16ケタの番号を、「Expires」には有効期限を、「CVC」には**ウラ面ご署名欄の右端に書いてある7ケタの番号の右3ケタ**をご記入ください。「Postal code」は郵便番号を入力してください。

![image](https://qiita-image-store.s3.amazonaws.com/0/104663/d1543fd5-051c-75ae-c1ff-099e585708b1.png)

送信してreCAPTCHAの非ロボット確認が済み、「Create Account」をクリックするとアカウント作成が完了します。お疲れ様でした！　オンラインIDEライフをエンジョイしましょう！
macOSでCrowiを1.6.0にバージョンアップする

# 概要

- macOSにインストールしているCrowiをバージョンアップ（1.5.0→1.6.0）します。
- 最初のインストール時には以下の投稿を参考にしました。
http://qiita.com/aoksh/items/5dfe5abbe239cd22a1d8

# Crowi 1.6.0
リリースノートは以下の通りです。
https://medium.com/crowi-book/crowi-v1-6-0-1eab6ae913ee

- 英語への対応（英語/日本語の切り替え）
- GitHubライクなdiff機能
- 検索機能の向上

diff機能、便利そうですね。

# node 6.xの導入

Crowi 1.6.0はNode 6.xが必要ということなので、インストールします。
nvmがインストールされているという前提で。

```
$ nvm ls-remote
```

ダウンロード可能なバージョンが出力されます。
v.6.10.0が、Latest LTSのようなので、これをインストールします。

```
$ nvm install v6.10.0
```
バージョンを確認します。

```
$ node -v
v6.10.0
```

# ついでElasticsearch導入

5.xに対応しているとのことなので、ダウンロード
https://www.elastic.co/downloads/elasticsearch

tarを解凍して、起動

```
$ tar zxvf elasticsearch-5.2.2.tar.gz
$ cd elasticsearch-5.2.2
$ ./bin/elasticsearch
```

起動確認。

```
$ curl http://localhost:9200
{
  "name" : "CZsdorE",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "fTJ68jDHSJFOyLPmdJI5g",
  "version" : {
    "number" : "5.2.2",
    "build_hash" : "f98sg74",
    "build_date" : "2017-02-24T17:26:45.825Z",
    "build_snapshot" : false,
    "lucene_version" : "6.4.1"
  },
  "tagline" : "You Know, for Search"
}
```


# Crowiのバックアップ

以下のサイトを参考にしました。
http://www.kunitake.org/chalow/2016-09-06-1.html

```
$ mkdir -p ~/backup/public
$ mongodump --out ~/backup/2017-03-09-01
$ rsync -avz どこか/crowi/public/ ~/backup/public/
```
"どこか"のところは、ご自分のcrowiディレクトリの場所に置き換えてください。
私はApplicationsの中に入れてます。

```
$ cd /usr/local/src/crowi
$ git pull --tags
$ git checkout v1.6.0
$ npm install
```

インストール進んでいきますが、

```
gyp ERR! node -v v6.10.0
gyp ERR! node-gyp -v v3.4.0
gyp ERR! not ok
```
not ok? と思ったらnode-saasが動いて再インストールが始まり、ビルドは終了。

```
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: bufferutil@1.2.1 (node_modules/bufferutil):
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: bufferutil@1.2.1 install: `node-gyp rebuild`
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: Exit status 1
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: utf-8-validate@1.2.2 (node_modules/utf-8-validate):
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: utf-8-validate@1.2.2 install: `node-gyp rebuild`
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: Exit status 1
```
なんかたくさんWARNが出てます。

以下のコマンドを打ってみましたが、変わらず。

```
$ npm rebuild -g node-gyp
```
node_modules削除してもう一度`npm install`したりしましたが、変わりませんでした。
nodejsよくわからんです。
まあビルドできてるしと思ってCrowi起動したら、ちゃんとバージョンアップされてました。

起動コマンドは以下です。

```
$ PASSWORD_SEED=hogehoge MONGO_URI=mongodb://localhost/crowi ELASTICSEARCH_URI=http://localhost:9200 FILE_UPLOAD=local  node app.js
```

そのうちlaunchctlとかに登録したいと思ってます。

今回は、とりあえず動いているので良しとします。
diff view、カッコイイです！
Windows 7上のVagrant 1.9.2とVirtualBox 5.1.16の組み合わせで /sbin/mount.vboxsf: mounting failed with the error: No such file or directory と怒られる

以下の環境で、VirtualBox 5.1.16 (2017/03/08 現地時間 リリース) を使うと、Guest Addition をインストールしても、VirtualBoxの共有フォルダ機能が動作しない。

# 追記
## 2017/03/17
本日（？）リリースされたVirtualBox 5.1.18 では本問題は解決しました。

## 2017/03/11
Debian系だけではなく、RHEL系でも発生している [このIssue](https://github.com/mitchellh/vagrant/issues/8357) の事象。

正にこれが発生した

```
==> puppet: Mounting shared folders...
    puppet: /vagrant => C:/Users/hccpp302/Documents/projects/vagrant-puppet4-oss
Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:

mount -t vboxsf -o uid=900,gid=1000 vagrant /vagrant

The error output from the command was:

/sbin/mount.vboxsf: mounting failed with the error: No such file or directory
```

## 2017/03/11 その２
コメント欄にて @hirdot さんから提供いただいた情報です。ありがとうございます！
vagrant のrbファイルを修正することでの暫定対処できそうです。
恒久対策というか、本対策はvagrantのアップデート待ちですが、お困りの方は以下のStackoverflowの記事もご参照ください。
https://stackoverflow.com/questions/42074246/vagrant-error-unable-to-mount-virtualbox-shared-folders-guest-additions-vboxs/42716556#42716556?newreg=852fc6640e12486dbe238a2655798a57

## 2017/03/15
コメント欄にて @teufelj さんから提供いただいた情報と合わせてとなりますが、VirtualBox側のバグのようです。
情報提供いただきありがとうございます！

https://forums.virtualbox.org/viewtopic.php?f=6&t=82165 
https://www.virtualbox.org/ticket/14651

# 環境
<table>
 <tr>
  <th>ホストOS</th><td>Windows 7 Enterprise</td>
 <tr>
 <tr>
  <th>-</th><td>Vagrant 1.9.2</td>
 <tr>
 <tr>
  <th>ゲストOS</th><td>Ubuntu 16.04</td>
 <tr>
 <tr>
  <th>ゲストOSのカーネル</th><td>Linux 4.4.0、4.8.0、4.10.0 (<a href="https://launchpad.net/~canonical-kernel-team/+archive/ubuntu/ppa">PPA for Canonical Kernel Team</a>) </td>
 <tr>
</table>

# 暫定対策
VirtualBox を 5.1.14 にダウングレードする。(VirtualBoxのExtension PackageやGuest AdditionはそのままでOK)

VirtualBox のアップデート待ちですかね
Rails でデータベース (MySQL) のカラムをユニーク（一意）にする。 migration model test

# 大文字小文字
一意制限はデフォルトでは大文字小文字を区別しません ( A のあとに a はだめ ) 。
大文字小文字を区別したい場合は。
config/database.yml を変更します。

```yaml
default:
  ...
  password:
  collation: utf8_bin
```

のように `collation: utf8_bin` を追加して `rails db:migrate:reset`とコマンドを実行すると、大文字小文字を区別して ( A のあとに a はおｋ )一意制限してくれるようになります。

# migration
`rails g migration AddIndexToUsersName`
コマンドでマイグレーションファイルを生成して、

マイグレーションファイルを変更。

```rb
def change
end
```

↓

```rb
def change
  add_index :users, :name, unique: true
end
```

# validates
モデルファイルを変更。

```rb
class User < ApplicationRecord
end
```

↓

```rb
class User < ApplicationRecord
  validates :name, uniqueness: { case_sensitive: false }
end
```

大文字小文字を区別する場合は、

```rb
class User < ApplicationRecord
  validates :name, uniqueness: true
end
```

# test
以下の Gem を使用しています。
[rspec-rails gem](https://github.com/rspec/rspec-rails)
[shoulda-matchers gem](https://github.com/thoughtbot/shoulda-matchers)

テストファイルを変更。

```rb
RSpec.describe User, type: :model do
end
```

↓

```rb
RSpec.describe User, type: :model do
  it { is_expected.to validate_uniqueness_of(:name).case_insensitive }
end
```

大文字小文字を区別する場合は、

```rb
RSpec.describe User, type: :model do
  it { is_expected.to validate_uniqueness_of(:name) }
end
```
[PHP+JS]マークダウン形式のシンプルなメモ帳サイトを作ってみた！

追記：

現在はVueでリニューアルされています。

---

Gmailの下書きをメモ帳代わりに使うのにも限界を感じてきた。
しかし、リッチテキストが嫌いなのでEvernoteを使う気にもなれず。。

というかマークダウンでメモをとりたい。画像貼れたりとかリッチな機能も全然いらない。ネイティブアプリ版もいらない。

というわけで、そんなサイトいくらでもあるだろうとは察しつつ自作してみました。
完全に自分で使うために作ったものの、せっかくなのでリリースできる形にしています。

『[CosMoNOTE](https://cosmonote.xyz/)』

![memo.png](https://qiita-image-store.s3.amazonaws.com/0/151137/14e9242f-70c4-36f6-5b1b-49873ddc5881.png)

ゲストアカウントがあるのでお試し下さい。

まあ、個人の作ったサイトにメモを保存したがる人はあまりいないと思いますが、一応メモの内容だとかはちゃんと暗号化した上で保持されますし、僕が復元することもありませんのでご安心下さい。

## 使用技術
PHP+MySQL+JS(jQuery)を使いました。

ログイン後のメモ画面はページ遷移せずajax通信で動いています。

## ボタンレスな編集・表示モードの切り替え

メモ画面には、「メモをマークダウンで表示」「メモを編集」という2つのモードがあります。

PCではメモ表示状態でテキストをダブルクリックすると編集モードになります。
編集モードでテキストエリア外をクリックすると表示状態にもどります。

![edit.png](https://qiita-image-store.s3.amazonaws.com/0/151137/abace82a-d320-bff6-bda7-542908d0e83f.png)

この切り替え方法の他に、「編集ボタン」のようなものはありません。

しかし、友人に試用してもらって様子を見たところ、説明なしでこの切り替えができていたので、そのまま採用しました。

## レスポンシブ対応

スマホでは挙動が異なり、「表示」「編集」「メモ一覧」の3つのモードを画面下部のボタンを切り替える方式にしました。

![sp.png](https://qiita-image-store.s3.amazonaws.com/0/151137/3670788e-0331-f199-fc4f-1df215106731.png)

## デザインとか

ダークな配色はSublimeTextをパクらせていただきました。テキストエディタみたいにしたかったんです。。

ロゴのCosMoNOTEはお察しの通りCOSMONAUTとNOTEをアレした感じです。
なんで大文字と小文字混ざっているかというとこちらはConoHaVPSのパクリでございます。

## 自動保存

メモ編集画面は、Qiitaの執筆画面同様に自動で保存されていきます。

この仕組みはこんな感じです。

```js
var saveFlg = false;
$form.find('input, textarea').on('keyup', function() {
	saveFlg = true;
});
setInterval(function() {
	if(saveFlg) saveMemo(); // この関数内で保存成功時フラグオフ
}, 3000);
```

キーアップ時にいちいち保存してたらやばいので、ひとまずセーブフラグをONにするだけ。
3秒毎にフラグをチェックしてONだったら保存を実行。

「3秒毎」の他にも、別のメモに切り替えるタイミングなどでもセーブフラグを確認して保存。

## メモの削除

メモは削除するとDB内では論理削除されます。

そのまま溜まっていくのが嫌だったため論理削除から3日経過したものは物理削除される仕組みです。
（トリガーはログイン時）

しかし今のところ論理削除から復活させるようなゴミ箱的な機能はないので特に意味なし。

## テキストエリア内でのタブインデント

textarea内でタブキーでのインデントをしたい。

これをやるために書いたjsがこちら：
『[textarea内でTabキーでのインデントを可能にするjs（複数行対応）](http://qiita.com/laineus/items/12a220d2ab086931232d)』

半角スペース派を全く考慮していなかったのが難。

## マークダウンの変換

ParsedownというPHPライブラリを使いました。
http://parsedown.org/

## UI的に大事だなーと思ったこと

### ajax通信中であることの合図を表示する

裏で非同期で自動保存されてると言われてもその合図がないとちゃんと保存されているのか不安で仕方がない。

というわけで、ajax通信中は画面上部にローディングアイコンがでるようにしました。

![header.png](https://qiita-image-store.s3.amazonaws.com/0/151137/3db7c3cc-212a-9ee1-d2b0-1d709b622e13.png)

もし、回線が遅くて通信に時間がかかった時も、このアイコンがくるくる回っていれば通信の問題だなーと誰でもわかるかと思います。

### セッション切れを考慮

自分で使っていて気づいたんですが、このメモサイトをブラウザのタブで一日中開きっぱなしにし、しばらく放置してからメモ執筆。

すると、セッションが切れていて保存できない！

ここで編集中のメモが消えてしまうのでは悲しすぎるので、ログインウィンドウがポップアップで登場し、ajaxでログインさせて編集を再開できるようにしました。

![login.png](https://qiita-image-store.s3.amazonaws.com/0/151137/4cf1a5e1-a108-2d21-c2e9-4e36d854010a.png)

# 検討中のアップデート

- 並べ替え機能
- グループ機能
- ゴミ箱機能
- ユーザーがカスタムCSSを設定できる機能
- Qiitaみたいに編集画面と表示画面を横並びで表示

あと、僕が普段使わないマークダウン記法に対してスタイルがついていないかも。。
PythonとRubyのsplit	

Pythonの`split`の挙動

```py:Python
>>> ',,,1,2,3,,,4,5,,,'.split(',')
['', '', '', '1', '2', '3', '', '', '4', '5', '', '', '']

```
は直感通りだが、これと同じ感覚でRubyの`split`を使うと末尾に連続する空要素が除去され、ハマる。

```rb:Ruby
> ',,,1,2,3,,,4,5,,,'.split(',')
=> ["", "", "", "1", "2", "3", "", "", "4", "5"]
```

Pythonと同様の挙動にしたいときは-1を渡すとよい。

```rb:Ruby
> ',,,1,2,3,,,4,5,,,'.split(',',-1)
=> ["", "", "", "1", "2", "3", "", "", "4", "5", "", "", ""]
```

参考

- https://docs.ruby-lang.org/ja/latest/method/String/i/split.html
クラウド時代の インフラエンジニア動向 2017


　以前勉強会で発表した資料が時が経って情報が古くなってきたのでアップデートしてほしいという要望があったので、2017年版にアップデートしました。

　[SlideShare](https://www.slideshare.net/ryoichitaga/2017-72981709) に投稿したものを文字起こしして掲載します。


# クラウドを使う企業が増えてきたことで 発生してきたこと
 - クラウドは簡単！
 - プログラマがインフラもできるんじゃないか？
 - インフラエンジニアを雇うのは人件費の無駄・・・
 - 流行の「DevOps」や「SRE」ってプログラムでやるからプログラマ領域じゃないの？
 - **結果：インフラエンジニア不要論！！**


# プログラマはここを嫌がる
 - サーバーを触るのはイヤ
 - 「デプロイするだけ」まで作ってほしい。
   - コマンド一発デプロイがいい。
 - ネットワーク？ナニソレ？
 - インフラセキュリティーって何のこと？
   - アクセス制御？ナニソレ？


# プログラマにインフラスキルを 「尚可」で求めると失敗する理由
 - プログラマ数人でプロダクト開発をクラウドを使って始めた。
 - 「DevOps」や「SRE」を志向したら、インフラの学習コストが甚大！
 - プログラマ不足になり、インフラで割かれた分の補充に「新しいプログラマを探そうとする」という愚行。（同じことを繰り返す）
 - アクセス集中のスケール計算、セキュリティー制御の計算が甘く、メンテナンスを繰り返して信用を失う。
 - **インフラエンジニアを味方にしたほうがよい！**
 - **インフラとプログラマは世界が違うんです！**


# その結果・・・
 - みんなが不幸になってしまう！
 - 誰も幸せになれない環境に・・・


# インフラエンジニアは プロジェクトの加速装置となり得る
 - Webサイトを運営するための、ドメイン制御(DNS)や証明書設置などは、 インフラエンジニアにお任せ！
 - アクセス制御(セキュリティ)は、インフラエンジニアにお任せ！
 - PaaS領域、ミドルウエア・開発フレームワークより下のレイヤーの設計・設定は、スケール設計とその運用戦略込みで、インフラエンジニ アにお任せ！
 - テストを通した自動デプロイ戦略も相談可能。
 - デプロイを楽にする戦略を一緒に練ろう！
 - プログラムやデバッグ（テストコード含む）以外 の仕事は、インフラエンジニアに振ってもよい！


# 自動運用のキーワード 「DevOps」「SRE(Site Reliability Engineering)」
 - DevOpsとは、開発（Development）と運用（Operations）が協力し、ビジネス要求に対して、より柔軟に、スピーディに対応できるシステムを作り上げるためのプラクティスのこと。(@IT より)
 - 具体的には、デプロイ戦略や自動運用までシステムの一部と考え、開発段階からデプロイから運用までの流れをすべて組み込んでしまうことを言う。
 - 「Chef」や「Puppet」、「Docker」といったツールが中心としてとらえられることがあるが、それだけではなく、クラウドであらかじめ準備されている仕組みを使えば十分実現可能なこともある。
 - 「DevOps」から「SRE」時代になったことにより、やっていることは ほぼ一緒であるが、クラウドにあらかじめ組み込まれた仕組みをうまく使う傾向が出始めた。


# プロジェクトを加速させるための インフラエンジニアとのイイ関係
 - ミドルウエア、開発言語・フレームワークをどれを使うかを洗い出してくれれば、あとはうまく動くようにインフラエンジニアが設計してくれる。
 - 互換があって動けばいいと割り切ることができれば、クラウドにあらかじめ用意された環境をそのまま利用できることも多く、負荷が軽減される。
 - 既にあるサービスをパズルのように組み合わせ、独自構築は避けよう。
 - スクリプトやクラウドに準備されたデプロイの仕組みをうまく利用し、簡単にデプロイ運用ができる環境を作ろう。
 - **イイ関係か築けるところは開発が加速する！**


# まとめ
 - プログラマ領域とインフラ領域は別物であると認識し、無理にプログラマでインフラを作ろうとしない。
 - プログラマにインフラスキルを「尚可」で求めない。
 - 社内開発環境から、パブリックインフラまでをしっかりつないで設計してくれるエンジニアを探そう。
 - 言語環境・フレームワーク整備までインフラエンジニアに任せ、プログラマはデプロイ手法だけ受け取って、プログラム開発に集中しよう！
 - **社内環境の改善・開発の加速！**
GoogleAppsScript から Firebase の DB へアクセス

GoogleAppsScript(以下：GAS) から、Fireabse の Realtime Database へ書き込んだり読み込んだりする方法です。
が、かなり遅い（約15000件を登録するのに5分くらい）上に、何度か試していると、

<b>アップロード帯域の使用量が多すぎるからブロックしました</b>

とかエラー吐いて何もできなくなるので、用法用量を守って正しくお使いください。
（ちなみに、JavaScript で同じことをすると、数秒で終わりました・・・。）

#ライブラリの追加
https://sites.google.com/site/scriptsexamples/new-connectors-to-google-services/firebase
上記の URL を参考に(っていうかまんまこれですが)、スクリプトエディタからライブラリを追加します。
なんのライブラリかというと、GAS で Firebase を扱うためのライブラリです。
※URL先の説明ではバージョン９を選ぶように書いてますが、私が試したときは１１でした。

#実装
https://sites.google.com/site/scriptsexamples/new-connectors-to-google-services/firebase/tutorials/read-and-write-data-in-firebase-from-apps-script
上記のURLを参考に・・・（以下略）
コードを書くわけですが、Firebase のルールの設定で、認証を強制していたりする場合は、このままではうまくいかないです。

```js:
var base = FirebaseApp.getDatabaseByUrl(firebaseUrl);
```
この部分ですが、第2パラメータもあって、そこにシークレットキーを入れることで、認証が通ります。
（しかし、このシークレットキー自体が既に廃止されてると Firebase には書かれてるんですよねぇ・・。でも使える。）
![](https://qiita-image-store.s3.amazonaws.com/0/165132/a114ab98-e9ab-e3de-42ac-a9fbb5a311c3.png)
ここの赤枠で囲った部分にカーソルを合わせると文字列を表示できるので、それをコピペして使用します。

```js:
var base = FirebaseApp.getDatabaseByUrl(firebaseUrl, secret);
```

ライブラリのコードを見る限り、シークレットを使用しない方法もありそうですが、試してないです(^^;
　
　
　
　
と、書いてみたはいいけど、結局サンプルの URL 貼り付けただけだなぁ・・・。
まぁ、自分が調べてたときは日本語の説明とかほぼ見つけられなかったので、これはこれでいいか。
Trelloのボードの内容を雑にMarkdownに加工するRubyスクリプト

```ruby:trello2md.rb
#! /usr/bin/env ruby
require 'trello'
require 'dotenv/load'
require 'pry'

Trello.configure do |config|
  config.developer_public_key = ENV['TRELLO_DEVELOPER_PUBLIC_KEY']
  config.member_token = ENV['TRELLO_MEMBER_TOKEN']
end

board_id = ARGV[0]
if board_id.nil?
  STDERR.puts 'no board id'
  exit 1
end

board = Trello::Board.find(board_id)
board.lists.each do |list|
  puts "# #{list.name}"
  puts
  list.cards.each do |card|
    puts "* #{card.name}"
    card.comments.each do |comment|
      puts "  * #{comment.text.gsub("\n", '<br>')}"
    end
  end
  puts
end
```

```ruby:Gemfile
source 'https://rubygems.org'

gem 'ruby-trello'
gem 'dotenv'
gem 'pry'
```

# 使い方

* [public keyを取ってくる](https://trello.com/app-key)
* 上記ページの *Token* のところがリンクになってるので、そこからsecret keyを取ってくる
* .envに記載する
* 引数にボードID( https://trello.com/b/#{ここの値}/- ）を渡して実行
* 書式などは必要に応じて適当にアレンジしたらいいんじゃないかと思います
* [Githubにも上げてます](https://github.com/skuroki/trello2md)
githubにssh接続しようとしてハマりました。。。

久しぶりにgithubに公開鍵を追加したので、ssh接続して確認しようとしたところハマりました。

```
$ ssh -T github-username@github.com
Permission denied (publickey).
```

接続時のユーザー名にgithubのユーザー名を指定していました。。。
正しくは以下ですね。

```
$ ssh -T git@github.com
Hi github-username! You've successfully authenticated, but GitHub does not provide shell access.
```

サーバのユーザーとgithubのユーザーは全く別物なので分かりますが、なんかモヤモヤしますね。
行削除した際にreloadRowsのアニメーションが影響される事への対処




![20170309.gif](https://qiita-image-store.s3.amazonaws.com/0/40693/8d8e135f-49ea-2072-f313-12742049a0d8.gif "20170309.gif")

上のセクションは下のセクションの行数をリアルタイムで更新するような仕組みがあったとして。

行全体を更新するのではなく、特定のセルのみ更新したいときに使うreloadRowsを使う場合、上のように行削除のアニメーションの影響を受けてしまいます。

```
self.tableView.reloadRows(at: [TopIndexPath], with: .none)
```

これに対処する為、遅延実行を使ってます。

```
   let dispatchTime: DispatchTime = DispatchTime.now() + Double(Int64(0.35 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)
            DispatchQueue.main.asyncAfter(deadline: dispatchTime, execute: {
         
    self.tableView.reloadRows(at: [TopIndexPath], with: .none)
         
   })

```

他にやり方があったような気もしているのですが、どうも思い出せない・・・なかったのかもしれません。
どっちだろう
フォームから画像を挿入してサムネイルを表示、同時にAWS S3へデプロイする

ちょっとやりたいことがあったので調査がてら。

## やること

*　フォームから画像をアップロードして、S3バケットへデプロイ
*　JavaScript で実装する

挙動は以下の通り

1. ファイルが挿入できるフォームを表示
2. コンピュータから画像を挿入
3. サムネイルを生成してフォーム画面上に表示
4. 挿入した画像をAWS S3へデプロイ

## 実装の流れ

* S3バケットとIAMを準備
* JavaScript SDKをつかって実装

## S3バケットとIAMを準備

* S3でバケットを作る
* IAMでS3専用のユーザーを作成する
* S3へのフルアクセス権限を設定

概ね以下の記事の通り。
http://qiita.com/TakeshiNickOsanai/items/ab17c9f28b9f4ee399c3

S3のバケットへCORSの設定をしておく。

CORSの設定

```
<!-- Sample policy -->
<CORSConfiguration>
  <CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
      <AllowedHeader>Content-*</AllowedHeader>
        <AllowedHeader>Host</AllowedHeader>
        <AllowedHeader>*</AllowedHeader>
    <AllowedHeader>Authorization</AllowedHeader>
  </CORSRule>
</CORSConfiguration>
```


## JavaScript SDKを使って実装


```
<!DOCTYPE html>
<html lang="ja">
<head>
  <title>AWS S3へ画像をアップロード</title>
  <meta charset="utf-8">
  <script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
  <script src="https://sdk.amazonaws.com/js/aws-sdk-2.12.0.min.js"></script>
</head>
<body>

  <div class="container" id="container">
    <h2>画像をS3へアップロード</h2>
    <div id="content">
      <p><input id="fileToUpload" name="upload" type="file"></p>
    </div>
    <div id="thumbnail"></div>
  </div>

<script>

// AWS Configure 設定

  AWS.config.update({
    accessKeyId: 'アクセスキー',
    secretAccessKey: 'シークレットキー',
    region: 'us-east-1', // S3バケットのリージョンを指定する
  });

// API のバージョンを指定

  AWS.config.apiVersions = {
    rekognition: '2016-06-27',
  };

// s3 に画像をアップロードする関数 UploadToS3を定義

  const UploadToS3 = function() {
    const s3BucketName = 'バケット名';
    const s3 = new AWS.S3({
      params: {
        Bucket: s3BucketName,
        Region: s3BucketName
      }
    });
    const s3file = document.getElementById('fileToUpload').files[0];
    if (s3file) {
      s3.putObject({
        Key: s3file.name,
        ContentType: s3file.type,
        Body: s3file,
        ACL: "public-read"
      }, function(err, data) {
        if (data !== null) {
          console.log("upload completed");
        };
      });
    }
  }

// 画像の挿入時にサムネイル表示と、S3へのデプロイを行う

  $(function() {
    $("#thumbnail").prepend('<span id=\"image\"></span>');

// アップロードするファイルを選択

    $('input[type=file]').change(function() {
      const file = $(this).prop('files')[0];
      if (!file.type.match('image.*')) {
        $(this).val('');
        $('span').html('');
        return;
      }

// 画像表示

      const reader = new FileReader();
      reader.onload = function() {
        const img_src = $('<img height=\"300\">').attr('src', reader.result);
        $('span').html(img_src);
      }
      reader.readAsDataURL(file);
      UploadToS3();
    });
  });
</script>

</body>
</html>

```

## 注意

サンプル実装なので、アクセスキーとシークレットキーを直接記述しましたが、目に見える形で2つのキーを記述するのは危険です。ご注意ください。

## 参考

http://php.o0o0.jp/article/jquery-preview_thumbnail
http://dev.classmethod.jp/cloud/aws-s3-direct-upload/
https://www.lancork.net/2013/11/aws-sdk-for-javascript-in-the-browser-sample/
iOSがMDMで自動ロック「しない」設定が選べない時に，自動ロックさせない方法

iPhone/iPadを使っていて，展示などの目的で自動ロック（スクリーンロック）をさせたくない場合があります．

自分で作ったアプリの場合は次の記事にあるように対応が可能です．

[[Swift3.0]iOS・tvOSアプリを実行中に画面ロック（スリープ）しないようにする方法](http://qiita.com/toshi586014/items/9a0cd70c542de96ba8f2)

``` swift:
UIApplication.shared.isIdleTimerDisabled = true
```

自分で作ったアプリでなくても，`設定 > 画面表示と明るさ > 自動ロック`で「しない」を選択すれば良いのですが，MDMの制限でこれが選べない時があります．

![IMG_2358.PNG](https://qiita-image-store.s3.amazonaws.com/0/35592/27894e57-7f1f-ef6d-2509-40fd7b3da56c.png "IMG_2358.PNG")

この場合，ちょっとトリッキーですが，アクセスガイドを使うと回避できる場合があります（調べていないですが，MDMでアクセスガイドすら制限されていたらダメかも？）

アクセスガイドは`設定 > 一般 > アクセシビリティ > アクセスガイド`でONにできます．

![IMG_2359.PNG](https://qiita-image-store.s3.amazonaws.com/0/35592/ebfad413-e03d-23de-d063-bb449302e6e0.png "IMG_2359.PNG")

ホームボタンのトリプルクリックでアクセスガイドを開始し，オプションから`時間制限`を最大（23時間59分）に設定します．

![IMG_2357.JPG](https://qiita-image-store.s3.amazonaws.com/0/35592/9d77d246-03c8-377c-79cd-94af959025e9.jpeg "IMG_2357.JPG")

これでガイドアクセスを開始することで，自動ロックが「なし」になっていなくても23時間59分はロックされません．

当然バッテリの消費が多くなるので電源接続した状態で使った方が良いでしょうし，組織ポリシー的に問題がないかどうかなどは確認が必要だと思います．
Elasticsearchの5系をECS上で起動しようとしてエラーになった時の対応方法

ECS上で動いていたElasticsearchを2.3を5.2にバージョンアップしてエラーが出た際の対応記録です。

## メモリエラーへの対応

``` bash:エラーログ
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000085330000, 2060255232, 0) failed; error='Cannot allocate memory' (errno=12)
```

ホスト側で解決するならswap領域メモリの量を増やすことで解決します。
http://qiita.com/waytoa/items/7010cfe2852d816c9513

docker内で解決するならJavaのヒープサイズを設定しても良いようです。

## FDエラーへの対応

``` bash:エラーログ
max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
```

ホスト側の`ulimit`の設定をしてもdocker側には反映されないので、docker起動時の引数で渡す必要があります。

```
docker run --ulimit nofile=1024:1024
```

ECS上ではスクリーンショットのように`NOFILE`のリミットに対して、`65536`を割り当てます。

![Screen Shot 2017-03-09 at 17.15.55.png](https://qiita-image-store.s3.amazonaws.com/0/27027/43428fd4-a5ca-bd4e-801d-d53f1412f628.png)


## メモリマップ数エラーへの対応


``` bash:エラーログ
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
```

ホスト側で設定した値がdocker側にも反映されたので以下で解決します。

```
sudo sysctl -w vm.max_map_count=262144
```
TypeScriptで document.getElementById("hoge").value をすると出るThe property ‘hoge' does not exist on value of type 'HTMLElement' というエラーを解消する

# TypeScriptで document.getElementById("hoge").value をすると出るThe property ‘hoge' does not exist on value of type 'HTMLElement' というエラーを解消する

TypeScriptでElementの値を ``` document.getElementById("hoge").value ``` で取得しようとしたところエラーが出た。


##症状
``` document.getElementById(‘hoge’).value ``` を使用すると、以下のエラーが生じる。

発生したエラー
``` The property ‘hoge' does not exist on value of type 'HTMLElement' ```

---
(意訳)‘hoge'というプロパティは ```HTMLElement ```型の値には存在しない。

---
##エラーになる理由

``` document.getElementById(‘hoge’); ```の戻り値は、HTMLElement型で、エラーの文章にもある通り、この型のインターフェースにはvalueプロパティは存在しない

HTMLElementインターフェースのドキュメント
https://developer.mozilla.org/ja/docs/Web/API/HTMLElement

##どうすれば良いか

HTMLInputElementというHTMLElementを継承したインターフェースには、valueプロパティが存在するので、こちらにType Assertionすれば良い

HTMLElementインターフェースのドキュメント
https://developer.mozilla.org/ja/docs/Web/API/HTMLInputElement

```ts
const element: HTMLInputElement =<HTMLInputElement>document.getElementById(‘hoge');
const value: string = element.value;
```

HTMLInputElementインターフェースのドキュメント
https://developer.mozilla.org/ja/docs/Web/API/HTMLInputElement

## 参考にさせていただいたサイト
[javascript - The property 'value' does not exist on value of type 'HTMLElement' - Stack Overflow](https://stackoverflow.com/questions/12989741/the-property-value-does-not-exist-on-value-of-type-htmlelement)
https://developer.mozilla.org/ja/docs/Web/API/HTMLElement
https://developer.mozilla.org/ja/docs/Web/API/HTMLInputElement