OmniAICreator/Qiita-1.07M huggingface dataset:
.htaccess(Apache) の Order Allow,Deny(またはDeny,Allow)について

1. [.htaccess の書き方（リダイレクト編）](http://qiita.com/shotets/items/1f8f308e008dcb96bf43)
2. [.htaccess の書き方（アクセス制御編）](http://qiita.com/shotets/items/17bed9029140a6d925d2)
3. **.htaccess(Apache) の Order Allow,Deny(またはDeny,Allow)について**
4. [.htaccess の書き方（スピードアップ編）](http://qiita.com/shotets/items/a5465fb41623cc3dae94)
5. [.htaccess の書き方（設定変更編）](http://qiita.com/shotets/items/cf0783530a1f2809c4d5)


`.htaccess` や Apache の `http.conf` 等で記述する Order Allow,Deny(またはDeny,Allow) について

## Order は後に記述された方がデフォルトになる

SQLのorderと違って**後方が優先**されます。
`Order Allow,Deny` ならデフォルトはDeny（拒否）
`Order Deny,Allow` ならデフォルトはAllow（許可）

Order しか書かれていなければデフォルトが有効になります。
以下の場合は全てのアクセスが拒否になります。

```apache
Order Allow,Deny
```

デフォルト拒否なので
これに Deny をいくら加えても結果は同じ。

```apache
Order Allow,Deny
Deny from XXX.XXX.XXX.1
Deny from XXX.XXX.XXX.2
```

```apache
Order Allow,Deny
Deny from all
```

これに Allow を加えれば
「デフォルト拒否だけど○○は許可」となります。
以下は特定IPアドレスからのアクセスだけ許可。

```apache
Order Allow,Deny
Allow from XXX.XXX.XXX.1
Allow from XXX.XXX.XXX.2
```

Allow と Deny を入れ替えれば
「デフォルト許可だけど○○は拒否」となります。
以下は特定IPアドレスからのアクセスだけ拒否。

```apache
Order Deny,Allow
Deny from XXX.XXX.XXX.1
Deny from XXX.XXX.XXX.2
```

デフォルト拒否のところに Allow from all を加えると、
「デフォルト拒否だけど全て許可」となるので
結果「全て許可」になります。

```apache
Order Allow,Deny
Allow from all
```

さて、ここで問題。
ここに `Deny from all` を追加するとどうなるでしょう。

```apache
Order Allow,Deny
Allow from all
Deny from all
```

答えは**後方が優先**されるので「全て拒否」になります。
書く順番を変えても結果は同じ。

```apache
Order Allow,Deny
Deny from all
Allow from all
```

Order を後に書いても結果は同じ。

```apache
Deny from all
Allow from all
Order Allow,Deny
```

ただ、この書き方だと混乱を招くので、みんな Order を先に書く習慣になっているんですね。


### 全拒否の記述例

以下は全て全拒否になります。

```apache
# Order でデフォルト拒否
Order Allow,Deny
```

```apache
# Deny で全て拒否
Deny from all
```

```apache
Order Allow,Deny
Deny from all
```

```apache
# デフォルト許可だけど Deny で全て拒否
Order Deny,Allow
Deny from all
```

```apache
# 後方が優先され全て拒否
Order Allow,Deny
Allow from all
Deny from all
```

### 全許可の記述例

以下は全て全許可になります。

```apache
# 何も書いてなければ何もおきない
```

```apache
# Order でデフォルト許可
Order Deny,Allow
```

```apache
# Allow で全て許可
Allow from all
```

```apache
Order Deny,Allow
Allow from all
```

```apache
# デフォルト拒否だけど Allow で全て許可
Order Allow,Deny
Allow from all
```

```apache
# 後方が優先され全て許可
Order Deny,Allow
Deny from all
Allow from all
```

### 一部許可の記述例

以下はデフォルト拒否だけど一部で許可

```apache
Order Allow,Deny
Allow from XXX.XXX.XXX.1
Allow from XXX.XXX.XXX.2
```

```apache
Order Allow,Deny
Allow from XXX.XXX.XXX.1
Allow from XXX.XXX.XXX.2
Deny from all
```

### 一部拒否の記述例

以下はデフォルト許可だけど一部で拒否

```apache
Order Deny,Allow
Deny from XXX.XXX.XXX.1
Deny from XXX.XXX.XXX.2
```

```apache
Order Deny,Allow
Deny from XXX.XXX.XXX.1
Deny from XXX.XXX.XXX.2
Allow from all
```
Shopifyのテーマを作ってみた #01


# まずはじめに

Shopifyで独自のデザインを使いたかったけど、日本語のリソースが全然なくて辛かった。後に続く人の為に蓄積した知見を書き綴ります。（早くShopifyJapan作って！）

まずカスタマイズについてですが、文字サイズや色を変えたいとか、ヘッダの画像やロゴを独自のに変えたいレベルであれば、**Shopify themes**（https://themes.shopify.com/ ）に行って好きなテーマを選んで、管理画面から設定を行うで良いと思います。

そうではなくて、この記事ではショップのデザインを起こしてコーディングして、それをShopifyに乗せる的なカスタマイズの方法をまとめる予定です。

# Slateについて

SlateはShopifyのテーマ開発に使えるコマンドラインツールとフロントエンドのベースになる開発環境です。（Nodeのv4以上が必要）

いままではTimber Frameworkというのが使われてきたのですが、作りがレガシーなので最近の開発環境に慣れている人には使いづらい気がします。

## Slate
GitHub: https://github.com/Shopify/slate
Document: https://shopify.github.io/slate/

基本は上記のドキュメントの通り進めると出来ます。
流れとしては、Slateをインストールしてローカルにテーマを開発できる環境を作り、liquid（Shopifyのテンプレートファイル）やsassやjsなどを書いていくとオリジナルなテーマが作れるみたいな感じです。

# Slateのインストールと設定

グローバルにslateをインストール。

```
$ npm install -g @shopify/slate
```

新しいテーマを作成。theme-nameのところには付けたい名前をどうぞ。

```
$ slate theme theme-name
```

しばらく待つと色々とダウンロードされます。続いて、

`config-sample.yml`を`config.yml`にリネームして、中の`password` `theme_id ` `store `を埋めます。

```yaml:config.yml
development:
  password:
  theme_id: "live"
  store: your-shop.myshopify.com
  ignore_files:
```

- **password**: Shopify内で作成したPrivate Appのパスワード。ここ（https://shopify.com/admin/apps/private ）から作れます。
- **theme_id**: 上書きしたテーマのID。ここ（https://shopify.com/admin/themes ）にいってテーマのカスタマイズを選ぶとURLに9桁ぐらいの数字のIDが付くのでそれを入れます。`"live"`だと現在公開されているものが置き換わるっぽい。
- **store**: 作成したShopifyのURL

# 開発・公開

設定ファイルの入力が完了したら、あとはliquidとかsass,jsとかをいじいじすれば良いです。

```
$ slate watch
```

とすると、sassなどが勝手にコンパイルされてローカルホストで確認が出来るので便利です。
基本的にはwatchしながら開発して、出来た段階で

```
$ slate deploy
```

をする感じかなと。
それでは良いshopifyライフを！



# おまけ： Slateのコマンド一覧

Global

```
slate theme [name] - Generate a new blank theme
slate migrate - Convert an existing theme to work with Slate
slate -h - Options available in your current directory (differs if not in a theme)
slate -v - See your currently installed version of Slate and dependencies
```

Theme

```
slate build — Concatenates JS and SCSS, optimizes SVG icons to be used as snippets, and copies over all other files and folders to a dist folder
slate deploy — Builds your dist folder and replaces the theme set in config.yml
slate watch — Listens for changes to your local source files and deploys them to your shop
slate start — Runs build, deploy, then watch to get you developing on your shop quickly
slate zip — Builds and compresses your dist to a zip file for easy manual upload
SlackにTwitterの検索結果を投稿し続けるScala製ボットを作った

HubotでTwitterの検索結果をSlackに送りつつけるボットが、最近になって動かなくなってしましました。悲しい。直そうと思ってコードを見てみると最新のHubotだと非推奨の機能とかを使っていて面倒くさくなってしまったので、自分でScalaで作ってみました。

|![スクリーンショット 2017-04-07 20.34.31.png](https://qiita-image-store.s3.amazonaws.com/0/2382/c4a70886-bda1-ae7d-e2bb-1388d79bea9c.png) |
|:---:|
| コンソール上での見え方 |

|![スクリーンショット 2017-04-07 20.33.40.png](https://qiita-image-store.s3.amazonaws.com/0/2382/ba7e3a35-92a9-319a-dd7c-67f60d960625.png) |
|:---:|
| Slack上での見え方 |

こんな感じです。 Akka Actorで作っていて、SlackやTwitterとの通信エラーなどが起こった際にも比較的安定して動作をしてくれます。

# ソースコード
[https://github.com/sifue/twisearch_slackbot](https://github.com/sifue/twisearch_slackbot) 

こちらになります。自分でビルドしたりもできます。コードサイズも小さいのでScalaがわかる方は随時自分でいじって利用して下さい。

# 動かし方

とりあえず動かしたいという方は、
[Java8](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html) をインストールしてあることを確認して、
https://github.com/sifue/twisearch_slackbot のルートディレクトリにある `twisearch_slackbot-assembly-X.X.jar`をダウンロードしてください。

その後、`application.conf`というテキストファイルを用意して

```
app {
  slackWebHookUrls = ["https://hooks.slack.com/services/hoge/fuga/hege"]
  intervalSec = 60
  keyword = "\"test\"OR\"テスト\"OR\"hoge\"OR\"fuga\""
  ignoreScreenNames = ["sifue_4466"]
  isSendRetweet = false
  messageFormat = "https://twitter.com/%1$s/status/%2$s"
  consumerKey = "consumerKey"
  consumerSecret = "consumerSecret"
  accessToken = "accessToken"
  accessTokenSecret = "accessTokenSecret"
  hubotWebHookUrl = ""
  hubotWebHookRoom = ""
}
```
以上を設定します。

### 各種設定項目について

`slackWebHookUrl` は、https://api.slack.com/slack-apps にてTwisearch SlackbotのアプリをAppとして作成して、WebHook Incomeを許可し、そこでWebHook URLを特定のチャンネルに対して作成してそれを利用して下さい。 

|![スクリーンショット 2017-04-07 20.36.58.png](https://qiita-image-store.s3.amazonaws.com/0/2382/181d4973-fc3b-80e6-cbbf-f1d659f03022.png)|
|:---:|
| Slackのアプリ作成画面 |

各種トークンは、 https://dev.twitter.com/ より Twitter のアプリケーションを作成して、`consumerKey`、`consumerSecret` を取得、`accessToken`、`accessTokenSecret`は生成してから取得してください。 これらを設定します。

|![スクリーンショット 2017-04-07 20.38.29.png](https://qiita-image-store.s3.amazonaws.com/0/2382/b16a71a7-5395-c26b-7257-f8bedb472b4f.png)|
|:---:|
| twitterのアプリ作成画面 |

`intervalSec` は実行間隔、 `isSendRetweet` はツイートを無視するかのフラグ、 `keyword` は、検索キーワードなので 適宜 `OR` `NOT` `AND` を使って設定して下さい。

SlackはTwitterのURLを展開してくれるので、そのままツイートURLをメッセージフォーマットとしています。

無事`application.conf`が書けたら、 `twisearch_slackbot-assembly-X.X.jar`と同じフォルダに置いて、

```sh
java -jar twisearch_slackbot-assembly-X.X.jar
```

で実行すればOKです。

目的のチャンネルに検索結果が投稿されるようになるかと思います。 検索キーワードは `test` にしておくと、すごくひっかかるのでそれで確認すると良いでしょう。確認できたら、自分で運用しているサーバーがあればバックグラウンド実行、 tmuxやscreenコマンドを利用した実行をして下さい。

Herokuにデプロイする際には、 Java用の`Procfile`と`pom.xml`を置いてjavaとして実行してあげれば良いですが、自分は無料のインスタンスでは動作を安定することができませんでした。 Dokkuでも同様に動作させることができると思います。ただ、運用しているサーバーがあればそこで動かすのが便利そうです。

では皆さん、ハッピーなSlackライフを！
ソケットライブラリについて

面白そうなのでサンプルをコンパイルしました。
makehere.bat はhisファイルがないので空振りします。

mind server socketlib
mind client socketlib

>クライアントからの切断を検出すると、データソケットを切るだけでなく、ｌｉｓｔｅｎソケットまで切って「打ち切り」し、さらにはプログラム終了してしまっていますが、上記の★印の範囲を単に削除するだけで、また次の接続要求に応答でき、ずっとサービスを続けるプログラムになります。
>‥‥のはずです(^^;、私は試していませんのでぜひご自身で確かめてください‥‥

待ちソケットをクローズしなければ、サービスを続行しました。なんだか一つしかない居酒屋のトイレみたいで、長い奴がいると迷惑ですね。
CoreOSでGitLabRunnerが動かないようで動いた話

今日はCoreOSとGitLabRunnerで休日を半日無くした現象が未だにそのままらしいのでイッツシェア 
 
うちのサークル（？）サイトはCoreOS上のDockerコンテナにて稼働している為、サーバー設定等のファイルはdocker-compose.ymlとCloud-config.ymlのみしかありません。 
ここまでシンプルなら自動デプロイとやらも比較的簡単に出来るのではと、GitLabに設定ファイルを管理する事にしました。 
後はGitLab-CIを使用してdevelopブランチからMasterブランチへのマージするだけでビルド出来るようにすればかなりそこはかとなく良い感じに…。 
 
 
動かない…。CoreOS上でShellRunnerが動かない…。
「TERM environment variable not set.」というログでジョブが停止する…。なんでや…。
 
 
悲しみに明け暮れる中、こんなチケットを発見しました。 
「SSH runner failure: TERM environment variable not set.」 
https://gitlab.com/gitlab-org/gitlab-runner/issues/2096 
 
Oh... 
現在CoreOSで確認している限りではSSH、Shellrunnerは最新バージョンは動かないようです。 
1.8.6までバージョンをダウングレードさせる事で何事も無かったように動き出します。 
 
不幸にも私はトラップに引っかかったので皆さんも気をつけて…。


追記
`environment = ["TERM=ansi"]`と環境設定を書く事で問題なく動くようになった模様（未テスト
ABAP Background Job copy program

#Job Copy ABAP sample
I once needed to create so many jobs many times for system benchmark.  I created this program and it is memo of sample program.

#Code
Please create an executable report program.
Input parameters
p_sid: check job id via t-cd:sm37 or table "TBTCO" directory

```abap:Report.abap

PARAMETERS:
  p_sid    TYPE tbtcjob-jobcount DEFAULT'16575000',                         "Job ID
  p_sname  TYPE tbtcjob-jobname  DEFAULT'AQZZ/SAPQUERY/SMCRM_REP_ACT1==',   "Job name(source)
  p_target TYPE tbtcjob-jobname  DEFAULT'AQZZ/SAPQUERY/SMCRM_REP_ACT1==2',  "Job name(target)
  p_num    TYPE i DEFAULT 1.                                                "Number of job copy


START-OF-SELECTION.
  DATA:
     lv_target TYPE tbtcjob-jobname,
     lv_num(3) TYPE n.

  DO p_num TIMES.
    lv_num = sy-index.
    CONCATENATE p_target lv_num INTO lv_target.
    CALL FUNCTION 'BP_JOB_COPY'
      EXPORTING
        dialog                  = 'N'
        source_jobcount         = p_sid
        source_jobname          = p_sname
        target_jobname          = lv_target
      EXCEPTIONS
        cant_create_new_job     = 1
        cant_enq_job            = 2
        cant_read_sourcedata    = 3
        invalid_opcode          = 4
        jobname_missing         = 5
        job_copy_canceled       = 6
        no_copy_privilege_given = 7
        no_plan_privilege_given = 8
        OTHERS                  = 9.
    IF sy-subrc <> 0.
*  implement suitable error handling here
    ENDIF.

  ENDDO.

```
RubyのLoggerを使った効率的なログ管理

- Rubyの `Loggerクラス`を活用すると、システムの動作を追跡したりエラーを検出したりするのが簡単になります。本記事では、Loggerの基本から応用までを紹介します。

## 1. Loggerの基本設定
まず、Loggerを使うにはloggerライブラリをロードし、Logger.newメソッドで新しいインスタンスを作成します。ログの出力先としてファイルや標準出力を指定可能です。

```ruby
require 'logger'

# ファイルにログを出力
logger = Logger.new('application.log')

# 標準出力にログを出力
# logger = Logger.new(STDOUT)
```
## 2. ログレベル
Loggerは、以下の標準ログレベルをサポートしています。デフォルトではINFOレベルが設定されています。

| レベル | 解説 |
|:-:|:-:|
|DEBUG|デバッグ情報|
|INFO|一般的な情報|
|WARN|警告|
|ERROR|エラー|
|FATAL|致命的なエラー|

- 各レベルに応じて、ログメッセージを記録します。

```ruby

logger.debug("デバッグメッセージ")
logger.info("情報メッセージ")
logger.warn("警告メッセージ")
logger.error("エラーメッセージ")
logger.fatal("致命的なエラーメッセージ")
```

## 3. ログレベルの設定
デフォルトのINFOレベルを変更したい場合、logger.levelで設定できます。例えば、DEBUGレベルにするとすべてのログメッセージが出力されます。

```ruby
logger.level = Logger::DEBUG
```
## 4. カスタマイズ
Loggerは、フォーマットのカスタマイズも可能です。例えば、タイムスタンプのフォーマットを変更するには、datetime_format属性を設定します。

```ruby
logger.datetime_format = "%Y-%m-%d %H:%M:%S"
```

## 5. 実際の使用例

以下に、ログを使用した簡単なアプリケーションの例を示します。この例では、数値を割り算する際にログを活用しています。

```ruby
require 'logger'

logger = Logger.new('app.log')
logger.level = Logger::DEBUG

def divide(a, b, logger)
  logger.info("Dividing #{a} by #{b}")
  begin
    result = a / b
    logger.info("Result: #{result}")
  rescue ZeroDivisionError => e
    logger.error("Error: Division by zero")
  end
end

divide(10, 2, logger)
divide(10, 0, logger)
```
- このコードを実行すると、app.logに実行ログやエラーメッセージが記録されます。Loggerを使うことで、アプリケーションの動作を詳細に記録し、後から簡単に追跡できるようになります

---

LoggerはRubyの標準ライブラリに含まれており、セットアップも簡単です。アプリケーションのロギングにおいて、手軽かつ強力なツールとなるため、ぜひ活用してみてください。
《Wordpress》Contact Form 7で「Flamingo」の権限をコントロールする。

入力フォームプラグイン「Contact Form 7」　を使用している際、データベースに情報を保存してくれるアドオン「flamingo」のいろいろな権限をコントロールする方法です。


以下のコードでは、「flamingo」のあらゆる権限を`edit_posts`と同等に扱うよう指定しています。


```php.function.php

/**
* 
* flamingo custom capability
*
*/
function flamingo_custom_cap( $caps, $cap, $user_id, $args ) {
  $meta_caps = array(
    'flamingo_edit_contacts' => 'edit_posts',
    'flamingo_edit_contact' => 'edit_posts',
    'flamingo_delete_contact' => 'edit_posts',
    'flamingo_edit_inbound_messages' => 'edit_posts',
    'flamingo_delete_inbound_message' => 'edit_posts',
    'flamingo_delete_inbound_messages' => 'edit_posts',
    'flamingo_spam_inbound_message' => 'edit_posts',
    'flamingo_unspam_inbound_message' => 'edit_posts',
    'flamingo_edit_outbound_messages' => 'edit_posts',
    'flamingo_edit_outbound_message' => 'edit_posts',
    'flamingo_delete_outbound_message' => 'edit_posts' );

  $caps = array_diff( $caps, array_keys( $meta_caps ) );

  if ( isset( $meta_caps[$cap] ) )
      $caps[] = $meta_caps[$cap];

  return $caps;
}
remove_filter( 'map_meta_cap', 'flamingo_map_meta_cap' );
add_filter( 'map_meta_cap', 'flamingo_custom_cap', 5, 4 );

```

`edit_posts`を任意のものに変更すると、その権限が付与されているユーザーが「flamingo」の閲覧削除などができるようになります。




おわります。
Apexを使ってLambdaファンクション(Python)をデプロイするまでの小さなメモ

# 前提
- OSはUbuntu
- クレデンシャルを登録していること
- 「/usr/local/work/test」ディレクトリをプロジェクトのディレクトリとする
- 「test」という名前のファンクションを作成する
- コンソールに「hello」を表示するファンクション
- 環境変数「ENV」を設定

# 手順
## Apexインストール

```
curl https://raw.githubusercontent.com/apex/apex/master/install.sh | sh
```
※ただし最新手順は公式サイトを参照
http://apex.run/

## 手順メモ

```
# cd /usr/local/work/
# mkdir test
# apex init
※「functions/hello」ディレクトリ、「project.json」が作成される
# rm -rf functions/hello
# mkdir functions/test
# vim functions/test/function.json
# vim functions/test/index.py
# vim project.json
※「nameTemplate」を追記。デプロイされるLambdaファンクション名が「test」となる。（デフォルトではapexのプロジェクト名が付記される）
# apex deploy
```

```function.json
{
  "description": "Test",
  "runtime": "python2.7",
  "handler": "index.lambda_handler"
  "environment":{
    "ENV": "dev"
  }
}
```


```index.py
def lambda_handler(event, context):
    print "test"
```

```project.json
{
  "name": "test",
  "description": "",
  "memory": 128,
  "timeout": 5,
  "role": "arn:aws:iam::xxxxx:role/test_lambda_function",
  "nameTemplate": "{{.Function.Name}}",
  "environment": {}
}
```
Oracle TechNight #7 の資料 と Oracle Database Connect 2017 の資料が公開されました。

ワイ と yoheiaさん（https://twitter.com/yoheia ） が 2017/2/27 に
語った Oracle TechNight #7 の資料が公開されたやで彡(ﾟ)(ﾟ)

[![tn7_title.jpg](https://qiita-image-store.s3.amazonaws.com/0/110066/d119cb50-40c9-f73f-84bc-47f84e1c8309.jpeg)](http://otndnld.oracle.co.jp/ondemand/technight/20170227-12c-optimizer.pdf)

> Oracle Database Technology Night ～集え！オラクルの力（チカラ）～
> http://www.oracle.com/technetwork/jp/ondemand/database/db-new/db-tech-night-3508291-ja.html

資料への直リンクはこちら。

> オラクル・コンサルが語る！SQL性能を最大限に引き出す
> DB 12cクエリー・オプティマイザ新機能活用と統計情報運用の戦略
> http://otndnld.oracle.co.jp/ondemand/technight/20170227-12c-optimizer.pdf

> Technical Discussion Night ～
> 「DB 12cクエリー・オプティマイザ（パフォーマンス・チューニング）」を語ろう ～
http://otndnld.oracle.co.jp/ondemand/technight/20170227-technight-discussion.pdf

次回のTechNightは2017/4/21(金)に開催ですやで。
お題はアップグレード彡(ﾟ)(ﾟ) ↓のリンクからどしどし申し込むやで！

> データベース・アップグレードのススメ for Oracle Database 12c Release 2
> ～ アップグレード成功のために知りたいこと、知っておきたいこと ～
> https://www.oracle.com/goto/jpm170421-1

Oracle Database Connect 2017 の資料もひっそり(草)と公開されてたやで彡(ﾟ)(ﾟ)

> Oracle Database Connect 2017 イベント資料・動画
> http://www.oracle.com/technetwork/jp/ondemand/odc2017-3627481-ja.html

会場に来た人も、来れなかった人も、見てクレメンス彡(^)(^)
Amazon-linuxでログインメッセージを表示させる

# 目的
sshした際、ホスト名を出力させることで、オペレーションミスを防ぐ

# 方法
設定ファイルを作って、itamaeでプロビジョニングする

# 前提
IAMで`describe-instances`が実行できる

# 設定
## itamae構成

```
cookbooks/motd/
├── set-motd.rb
└── file
    └── etc
        └── update-motd.d
            └── 99-server-name

3 directories, 2 files
```


```ruby:set-motd.rb
remote_file "/etc/update-motd.d/99-server-name" do
  source "file/etc/update-motd.d/99-server-name"
  owner "root"
  group "root"
  mode "755"
end

execute "apply motd" do
  command "sudo update-motd"
end
```

```bash:99-server-name
#!/bin/bash

region=$(curl -s  http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e 's/.$//')
myInstanceId=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
tagName=$(aws ec2 describe-instances --region ${region} --query "Reservations[].Instances[?InstanceId==\`${myInstanceId}\`].[Tags[?Key==\`Name\`].Value]" --output text)

cat << EOF

*****************************************
_________________________________________
< This Server is ${tagName} >
-----------------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\n
                ||----w |
                ||     ||
*****************************************

EOF
```
最後にnilを付けてrails consoleで無駄に表示される大量のデータを抑制する


## よくある問題

rails consoleを起動して、データの確認をしたい場合、こういうスクリプトを実行すると・・・

```ruby
# activeなユーザーを表示したい
User.where(active: true).each do |u|
  puts "#{u.id} #{u.name}"
end
```

こんなふうに表示されます。

```
User.where(active: true).each do |u|
  puts "#{u.id} #{u.name}"
end
1 山田花子
2 田中一郎
8 鈴木二郎
・
・
・
1029 伊藤淳一
=> [#<User id: 1, email: "hanako@example.com", created_at: "2014-10-22 05:48:25", updated_at: "2014-12-18 23:46:45", name: '山田花子', active: true>, #<User id: 2, email: "ichiro@example.com", created_at: "2014-10-22 05:48:25", updated_at: "2014-12-18 23:46:45", name: '田中一郎', active: true>, #<User id: 8, email: "jiro@example.com", created_at: "2014-10-22 05:48:25", updated_at: "2014-12-18 23:46:45", name: '鈴木二郎', active: true>, ・・・以下膨大なUserデータがひたすら続く
```

問題は最後の`=>`からうしろの部分です。
場合によってはこの部分が画面全体を覆い尽くしてしまうこともあります。
しかもこちらとしては特に興味のないデータです。

## 解決策：nilを付けて => から後ろの部分を消す

というわけで、処理の一番最後に `; nil` を付けてあげます。


```ruby
User.where(active: true).each do |u|
  puts "#{u.id} #{u.name}"
end; nil
```

こうすると、`=>`のうしろが`nil`だけになります。これでスッキリ！

```
User.where(active: true).each do |u|
  puts "#{u.id} #{u.name}"
end
1 山田花子
2 田中一郎
8 鈴木二郎
・
・
・
1029 伊藤淳一
=> nil
```

`=>`の後ろに表示される出てくるデータが多すぎて困っている人はお試しあれ！

### Special thanks

このTipsは仕事中に@ruziaの画面操作を覗いているときに初めて知りました。
Thanks!
Android-ViewGroupごとフェードイン・フェードアウト

お久しぶりでございます。

PHPとかC#とかLuaとかAndroid JavaとかSwiftとか色々書いてるとまじでこんがらがる。
ってわけでハマった。
AndroidってViewGroupにalphaしても効かないんねー。

```Java:
    private static void fadeViewGroup(final ViewGroup viewGroup, final boolean in, int duration) {
        fadeView(viewGroup, in, duration);

        for (int i = 0; i < viewGroup.getChildCount(); i++) {
            final View view = viewGroup.getChildAt(i);
            if (view instanceof ViewGroup)
                fadeViewGroup((ViewGroup) view, in, duration);
            else
                fadeView(view, in, duration);
        }
    }

    private static void fadeView(final View view, final boolean in, int duration) {
        final ValueAnimator valueAnimator = ValueAnimator.ofFloat(
                in ? 0 : 1,
                in ? 1 : 0
        );
        valueAnimator.setDuration(duration);
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                final float value = (float) valueAnimator.getAnimatedValue();
                if (view.getBackground() == null)
                    view.setAlpha(value);
                else
                    view.getBackground().mutate().setAlpha((int) (value * 255));
            }
        });
        valueAnimator.start();
    }
```
in-app purchaseの自動更新購読型（Auto-Renewing subscription）の期限切れについて（Go言語）

in-app purchaseの自動更新購読型の期限切れを調べるプログラムを書いた際にミリ秒と秒を間違えてハマったのでメモです。

# ハマったところ
`expires_date_ms`のフィールドの値と現在時刻のミリ秒の値を比較して期限切れ有無を調べるプログラムを書いたけどGo言語の`time.Now().Unix()`の値は秒だった。
Goのドキュメントをよく読んでなかったせいで妙にハマってしまった・・・。

# 対処
`expires_date_ms`の値を1000で割って比較する。
ruby製の課金ライブラリveniceもミリ秒を秒に直して使用してる様子。
https://github.com/nomad/venice/blob/d2d94b04cfd544c80b61377871763420e23a54d3/lib/venice/in_app_receipt.rb#L55

# 環境と使ったライブラリ
言語
Go 1.7.4
ライブラリ：
[dogenzaka/go-iap](https://github.com/dogenzaka/go-iap)
※レシート検証APIへレシートをポストするためのライブラリ。今回はAppStoreのレシート検証APIを叩くために使用

# APIで返ってくるレシートの形式
```
{
      "quantity": "1",
      "product_id": "com.test.autorenewable",
      "transaction_id": "1000000288220000",
      "original_transaction_id": "1000000288220000",
      "is_trial_period": "false",
      "app_item_id": "",
      "version_external_identifier": "",
      "web_order_line_item_id": "1000000034760000",
      "purchase_date": "2017-04-06 10:14:19 Etc/GMT",
      "purchase_date_ms": "1491473659000",
      "purchase_date_pst": "2017-04-06 03:14:19 America/Los_Angeles",
      "original_purchase_date": "2017-04-06 10:09:20 Etc/GMT",
      "original_purchase_date_ms": "1491473360000",
      "original_purchase_date_pst": "2017-04-06 03:09:20 America/Los_Angeles",
      "expires_date": "2017-04-06 10:19:19 Etc/GMT",
      "expires_date_ms": "1491473959000",
      "expires_date_pst": "2017-04-06 03:19:19 America/Los_Angeles",
      "cancellation_date": "",
      "cancellation_date_ms": "",
      "cancellation_date_pst": ""
}
```

# 書いたプログラム
```
// タイムゾーンをEtc/GMTにします。
loc, err := time.LoadLocation("Etc/GMT")
if err != nil {
    loc = time.FixedZone("Etc/GMT", 9*60*60)
}
// レシートの期限が切れていないか確認
// receipt.ExpiresDateMsがexpires_date_msになります。
if i, err := strconv.ParseInt(receipt.ExpiresDateMs, 10, 64); err != nil || time.Now().In(loc).Unix() > (i/1000) {
　　// ここにレシートの期限が切れていた場合の処理を書きます。
}
```

# 注意
書いといてなんですが、課金処理はいまいち自信なしです。
【SQLAlchemy】データ読み込み

"python × sql" 初心者なのでまずデータを読み込むところからつまずきました。

これくらい息をするようにできたいところ。

```py:loadDB.py
import pandas as pd
from sqlalchemy import create_engine

df = pd.read_sql_table("テーブル名",create_engine("mysql://root:パスワード@127.0.0.1:3306/データベース名").connect())

```

表の完成。

3306ってのはmysqlのデフォルトのポート番号らしい。

## ポート番号？？

> コンピュータネットワークにおいて、ポート（port）とは、オペレーティングシステムがデータ通信を行うためのエンドポイント（末端）である。(wikipediaより)

・・・はい。

CS専攻としてこれくらい理解できないといけないんだろうな・・・・。
MySQLへの接続を楽にする

# 概要
mysql_config_editorとラッパースクリプトでパスワード入力なしでMySQLへ接続する方法です。

# mysql_config_editorとは
[mysql_config_editor](https://dev.mysql.com/doc/refman/5.6/ja/mysql-config-editor.html)とは、MySQLへの接続情報を**難読化**して保存することで、接続を簡略化できるツールです。

# 使い方

## 接続情報の保存
CLIから以下のようにコマンドを入力します。

```shell-session
$ mysql_config_editor set -G $NAME -h $MYSQL_HOST -u $USER -p

$ mysql_config_editor set -G orenoserver -h orenoserver.example.com -u ore
```

そうすると、```~/.mylogin.cnf```に難読化された接続情報の保存されたファイルが作成されます。

ここで、```-G```オプションは、後述のlogin-pathに当たる名前です。
そのサーバに対するエイリアスだと思って問題ありません。
```-h```、```-u```、```-p```は、通常のmysqlコマンドと同様に、ホスト名、ユーザ、パスワードの対話的入力のオプションです。

login-pathが一意であれば、複数の接続情報を保存できます。

## 接続方法
mysqlコマンドで```--login-path```をオプションで渡すだけです。

```shell-session
$ mysql --login-path=$NAME

$ mysql --login-path=orenoserver
```

簡単ですね。


## ラッパースクリプトにする

こういうことを必要とする人は、たくさんのMySQLへ接続する必要があると思います。
オプションすら打ちたくなく、プロンプトに接続サーバを識別する文字を入れたくなりますので、
以下のようなラッパースクリプトを作成します。

```bash
#!/bin/bash
# MySQL --login-path wrapper script "myconn"

set -eu
export MYSQL_TEST_LOGIN_FILE="$HOME/.mylogin.cnf"

if [ $# != 1 ]; then
    mysql_config_editor print --all
    exit
fi

LOGIN_PATH=$1
export MYSQL_PS1="\\u@$LOGIN_PATH [\\d]>\\_"

mysql --login-path="$LOGIN_PATH" --prompt="$MYSQL_PS1"
```

```shell-session
$ myconn
[orenoserver]
user = ore
password = *****
host = orenoserver.example.com

$ myconn orenoserver
```

これで、引数をログインパスを入力することでログインできるようになります。
また、引数なしで保存された接続情報の一覧が表示できるようになります。

## 補完する
ここまで来るとコマンドライン補完がしたくなります。

zshのサンプルです。

```zsh
#compdef myconn

function _myconn() {
    _arguments -C \
               '1:: :->1' \
        && ret=0

    case "$state" in
        (1)
            compadd `myconn | sed -n -e "s/\[\(.*\)\]/\1/p"`
            ;;
    esac
}
```

これで保存された接続情報が補完に現れるようになります。
Webサイトで画面がちらつく（フラッシングする）原因をChrome Developer Toolsで探す方法

# 概要

* ふと気づいたら自社のサービスの画面が読み込み時に一瞬真っ白になる、ちらつく現象が発生するようになっていいた
* いつから発生するようになったのかわからず、コミットログも多く、原因特定に苦労した
* Google Chrome Developer Tools を使用して、原因を絞り込み、無事検索キーワードを入手した話。

# 使うもの

* Networkツール（公式の[使用方法解説](https://developers.google.com/web/tools/chrome-devtools/network-performance/)）
* Timelineツール（公式の[使用方法解説](https://developers.google.com/web/tools/chrome-devtools/evaluate-performance/timeline-tool)）

# 本当にちらついているか確認する

ちらついているような気がするでは、本当に調査が必要なのかどうか、徒労に終わらないようにするために、
画面がちらついていることを確認します。

1. Developer Tools を起動します
2. 右上のメニューからMore Tools　→　Renderingを選択します
![image](https://qiita-image-store.s3.amazonaws.com/0/65435/40598003-7342-2740-1fc8-b521dcbc25f7.png)
3. Consoleタブの隣にRenderingタブが表示されるので、そこのPaint Flashingをチェックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/65435/c004ce32-ee39-9b61-b3f5-e549de1f5cc7.png)
4. Netowrokタブに移動し、ビデオカメラアイコンをクリックしオンにします。
5. ⌘+Rキーをクリックすると画面がリロードされてネットワークがキャプチャーされます。
![image](https://qiita-image-store.s3.amazonaws.com/0/65435/4839a9f9-94a3-5d2c-9c0f-4c9920348bfe.png)
6. 画面上部に画面読み込みと描画に合わせてスクリーンキャプチャーされます。

参考に乗せた画面を見ていただくと、真っ白になっている箇所があるのがわかります。
間違いなく、真っ白に一回なってから再描画されていることを認識できます。

# 犯人を特定する

1. Timelineタブに移動します。
2. 画面上部の歯車のアイコンをクリックしオプションを表示します。Disable JavaScript SampleとEnable advanced paint instrumentation(slow)にチェックを入れます。
![image](https://qiita-image-store.s3.amazonaws.com/0/65435/e6061c9c-5dd2-41ee-fa7e-119571ff7f81.png)
3. ⌘+Rキーをクリックすると画面がリロードされてTimelineがキャプチャーされます。
    * たまに画面キャプチャーがうまくいかないことがあるので、その場合は何度か⌘+Rキーを試行してください
4. キャプチャーを参考に画面が白くなる時間帯に絞り込みをかけます。
![image](https://qiita-image-store.s3.amazonaws.com/0/65435/d77b2408-0c11-a937-9e6e-1690f19fcd2d.png)
5. なにやら、analytics.jsてのが見えます。ちなみにこの例では、もう少し範囲を広げるとtag.jsも見えます。

# 犯人をググると。。。

* [タグマネージャ導入前に知っておくべき基礎知識（全20回の2）](http://web-tan.forum.impressrd.jp/e/2015/01/05/18965)

> 例えばGoogleアナリティクスのウェブテスト（A/Bテスト）機能がこれに当たります。ウェブテストのタグは、ページが表示される前にJavaScriptの処理が完了していないと、ユーザーに画面がちらついて見えるといった違和感を覚えさせる要因となります。

* [GTMでOptimizelyタグとGAタグ（カスタムHTML）両方を配信して連携を行う方法](https://optimizely.e-agency.co.jp/onlinehelp/gtm-optimizely-ua/)

> しかし、このセットアップでは非同期処理を行っているため、「ちらつき」や、「フラッシング」の可能性は依然として残っています。

弊社でまさにA/Bテストやタグマネジャーを使用していたので、利用をやめたら無事にちらつきがなくなりました。
"Table 'performance_schema.session_variables' doesn't exist"

sqlをいじっていた時にはまったエラー

> "Table 'performance_schema.session_variables' doesn't exist"

確かにsession_variablesというテーブルはありませんでした。

調べてみると、どうやらMySQLをアップデートしていなかったことに起因するらしい

参考：[rails で migrate がコケる](http://sweep3092.hatenablog.com/entry/2015/11/28/180103)

```mysql:terminal
$ mysql_upgrade -u root -p --force
$ mysql.server restart
```

これで終わりです。
ib_logfile(0|1)の更新時刻が両方とも更新され続けるので調査

mariaDB 5.5.52でのお話。全部ではなく一部のホストでこの動作が見られた。
個人的理解だと、ib_logfileは innodb_log_files_in_groupの数でrotateしながら書き込みしていくので、
切り替わりのタイミングくらいでしか両方のタイムスタンプが一致するなんてことはないって認識だった。

ちなみにib_logfileのサイズは1Gあるので、一瞬で書ききってるって可能性は低そう。
replication master <- slave でslaveだけ発生していたりする。

### 結論

https://github.com/MariaDB/server/blob/5.5/storage/innobase/include/log0log.h#L699-L703

ib_logfile0とib_logfile1があった場合、ib_logfile0側の先頭にだけcheckpointの情報をもったfieldが存在するため、
ib_logfile1側にlogを書き込んでいる間でも、ib_logfile0にもcheckpoint情報を書き込む際にioが走る。
ib_logfile0がactiveなときはib_logfile1のtimestampは更新されないっぽい。

たぶん、mariadbとか関係なく、おなじ挙動っぽい。
長いことmysql使ってるのに気づいてなかった...。見てるようで見てないもんだ。
Visual Studio Code ショートカットキー(Mac)


いつも何だっけーと忘れるので残す。

## 本家リファレンス(pdfファイル)
https://code.visualstudio.com/shortcuts/keyboard-shortcuts-macos.pdf

## よく使うコマンド

| コマンド | 内容 | 備考　|
|:--------|:--------|:--------|
|control + shift + P|コマンドパレットを開く|        |
|F2|リネーム||
|F12        |定義へジャンプ|        |
|option + F12|定義を小窓で開く|escで閉じる        |
|command + K F12|定義を分割で開く|        |
|command + D|カーソルの単語を同じワードにカーソルを追加|連打でカーソルが増える|
|command + shift + L|カーソルの単語を一括選択||

## ファイル操作
| コマンド | 内容 | 備考　|
|:--------|:--------|:--------|
|command + shift + T|直前に閉じたエディタを開く|chromeと同じ|
|control + TAB |次のエディタを表示|
|command + K P|アクティブなファイルパスをコピー|        |
|command + K R|アクティブなファイルをFinderで開く|        |


## 移動系

| コマンド | 内容 | 備考　|
|:--------|:--------|:--------|
|control + _ |戻る ||
|shift + control + _ |進む ||
|command + shift + O|ファイル内のシンボルへ移動|rubyでは効かない|
|shift + control + TAB |開いてるタブを選んで移動 |めっちゃ押しにくい|

## サイドバー

| コマンド | 内容 | 備考　|
|:--------|:--------|:--------|
|command + B|サイドバーの開閉|カーソルも移動|
|command + shit + E|エクスプローラーを開く|カーソルも移動|
|command + shit + F|検索を開く|カーソルも移動|
|shit + control + G|Gitを開く|カーソルも移動|
|command + shit + D|デバッグを開く|カーソルも移動|
|command + shit + X|拡張機能を開く|カーソルも移動|
|command + shit + H|検索/置換を開く|置換にカーソルが移動|
|command + shit + J|検索の詳細トグル切替|検索を開いている時のみ有効|

## 下段のパネル

| コマンド | 内容 | 備考　|
|:--------|:--------|:--------|
|command + J|パネルの表示/非表示|カーソルも移動|
|command + shit + M|問題を開く|カーソルも移動|
|command + shit + U|出力を表示|カーソルも移動|
|command + shit + Y|デバッグ コンソールを表示|カーソルも移動|
|command + shit + Y|デバッグ コンソールを表示|カーソルも移動|
|control + @ |端末 |なぜか効かない        |
|shift + control + @ |新しい端末 |カーソルも移動       |

## おまけ
いつも忘れるMacの修飾キー記号

| キー | 内容 |
|:--------|:--------|
|⌘|command|
|^|control|
|⇧|shift|
|⌥|option (alt)|
【PHP】$_SERVERサーバ変数

完璧なブログ　[主なサーバ変数一覧](http://php-beginner.com/practice/server_var/server_var3.html)　を参考になりました。ありがとうございました！！！


（ただコピー）

|サーバ変数                   |解説                                   |
|:----------------------------|:-------------------------------------|
|$_SERVER['PHP_SELF']         |現在実行しているスクリプトのファイル名。ドキュメントルートから取得されます。|
|$_SERVER['GATEWAY_INTERFACE']|サーバーが使用しているCGIのバージョン。例："CGI/1.1"など|
|$_SERVER['SERVER_NAME']      |サーバーのホスト名。|
|$_SERVER['SERVER_SOFTWARE']  |サーバーの 認識文字列、つまりサーバソフト名です。|
|$_SERVER['SERVER_PROTOCOL']  |ページがリクエストされた時のプロトコル名とバージョン。例："HTTP/1.0"など|
|$_SERVER['REQUEST_METHOD']   |ページがリクエストされた時のリクエストメソッド名。例：'GET'・'HEAD'・'POST'・'PUT'など|
|$_SERVER['REQUEST_TIME']     |リクエスト開始時のタイムスタンプ。PHP5.1.0以降で対応。|
|$_SERVER['QUERY_STRING']     |ページがリクエストされた時に、検索引数があればそれが格納される。|
|$_SERVER['DOCUMENT_ROOT']    |現在実行されているスクリプトのドキュメントルートディレクトリ。|
|$_SERVER['HTTP_ACCEPT']      |現在のリクエストのAccept。ヘッダがあればその内容。|
|$_SERVER['HTTP_ACCEPT_CHARSET'] |現在のリクエストのAccept-Charset。ヘッダがあればその内容。例：'UTF-8'|
|$_SERVER['HTTP_ACCEPT_ENCODING']|現在のリクエストのAccept-Encoding。ヘッダがあればその内容。例: "gzip"|
|$_SERVER['HTTP_ACCEPT_LANGUAGE']|現在のリクエストのAccept-Language。ヘッダがあればその内容。例："ja"・"en"|
|$_SERVER['HTTP_CONNECTION']  |現在のリクエストのConnection。ヘッダがあればその内容。例："keep-alive"|
|$_SERVER['HTTP_HOST']        |現在のリクエストのHost。ヘッダがあればその内容。|
|$_SERVER['HTTP_REFERER']     |現在のページの前に参照していたページのURL。ブラウザによりセットされる値であり、またブラウザによってはこの値を変更する機能を持つものもあるので注意が必要。|
|$_SERVER['HTTP_USER_AGENT']  |現在のリクエストのUser-Agent。ヘッダがあればその内容。ユーザエージェントとはまぁ、ブラウザの事。例："Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; DigExt)"など|
|$_SERVER['REMOTE_ADDR']      |ページを見ている人のIPアドレス。|
|$_SERVER['REMOTE_HOST']      |ページを見ている人のホスト名。|
|$_SERVER['REMOTE_PORT']      |ユーザーのマシンからWebサーバへの通信に使用されているポート番号。|
|$_SERVER['SCRIPT_FILENAME']  |現在実行されているスクリプトの絶対パス|
|$_SERVER['SERVER_ADMIN']     |サーバに設定されているSERVER_ADMINの値。|
|$_SERVER['SERVER_PORT']      |Webサーバの通信ポートとして使用されているポート番号。通常は"80"番ポートが多いです。|
|$_SERVER['SERVER_SIGNATURE'] |ページに追加する為にサーバ上で生成された、サーバーのバージョン名とバーチャルホスト名。|
|$_SERVER['PATH_TRANSLATED']  |バーチャルからリアルへのマッピングがなされた後の、現在のスクリプトのファイルシステム上（ドキュメントルートではなく）でのパス。|
|$_SERVER['SCRIPT_NAME']      |現在のスクリプトのパス。スクリプト自身のページを指定するのに$_SERVER['PHP_SELF']とともに重宝します。|
|$_SERVER['REQUEST_URI']      |ページにアクセスするために指定されたURI。例："/index.html"・"/somedir/somefile.php"など|
|$_SERVER['PHP_AUTH_USER']    |PHPをApacheのモジュールとして実行していて、HTTP認証をしている時にそのユーザ名がセットされる。|
|$_SERVER['PHP_AUTH_PW']      |PHPをApacheのモジュールとして実行していて、HTTP認証をしている時にそのユーザのパスワードがセットされる。|
|$_SERVER['AUTH_TYPE'']       |PHPをApacheのモジュールとして実行していて、HTTP認証をしている時にその認証形式がセットされる。|
|$_SERVER['argv']             |スクリプトに渡された引数を配列にしたものです。PHPがコマンドラインから実行された場合にコマンドライン引数としてアクセスする事ができます。GETメソッドを通して呼び出された場合は検索引数が格納されます。|
|$_SERVER['argc']             |PHPがコマンドライン上で実行された場合にスクリプトに渡された引数の数が渡されます。|


*参考：*
[主なサーバ変数一覧](http://php-beginner.com/practice/server_var/server_var3.html)　


`---I Love PHP (｡･ω･｡)ﾉ♡`
WindowsにRedmineのプラグイン開発環境を作る

WindowsにRedmineのプラグインを開発する環境を作る。当初、Bitnamiを使おうかと思ったけど、developmentで動かすのが思いの外手間がかかるので、素直にRailsの環境を作る形に。

この手順でやると、RedmineがSQLite3、かつdevelopmentモードで起動する環境ができる。

ちなみに、これをMacかつHomebrewの環境でやろうとすると、RubyとDevKitのインストールが ``brew install ruby@2.3`` で済む。それ以降は同じ。

## Redmineのインストール
### Rubyのインストール
* [RubyInstaller](http://rubyinstaller.org/) の **Ruby 2.3.3** と DevKitのRuby2.0以上版をダウンロード
* RubyInstallerでRubyをインストール
    * **Rubyの実行ファイルへ環境変数PATHを設定する** と **.rbと.rbwファイルをRubyに関連づける** にチェックを入れる
* PowerShellかコマンドプロンプトで ``ruby -v`` を実行し、Rubyのバージョンが表示されることを確認

### Ruby DevKitのインストール
* ダウンロードしたDevKitのを **C:\devkit** として解凍
* PowerShellかコマンドプロンプトで以下を実行

    ```bat
    > cd c:\devkit
    > ruby dk.rb init
    > ruby dk.db install
    ```

* エラーが出ていなければ成功

### Redmineのインストール
* [Redmine公式サイト](http://www.redmine.org/) からRedmine 3.3.2をダウンロード
* Redmineのアーカイブを任意の場所に解凍
* config/database.yml.exampleをコピーし、 **config/database.yml** とする
    * database.ymlは以下のように編集

        ```yml
        production:
          adapter: sqlite3
          database: db/redmine.sqlite3

        development:
          adapter: sqlite3
          database: db/redmine_dev.sqlite3
        ```

* ``gem install bundler`` でBundlerをインストール
* ``bundle install --path vendor/bundle --without rmagick`` で依存するGemをインストール
* ``bundle exec rake generate_secret_token`` でトークン生成
* ``bundle exec rake db:migrate`` でDBスキーマ作成
* ``bundle exec rake redmine:load_default_data`` で初期データをロード
    * 言語の選択肢は、 **ja** を入力

## Redmine起動確認
* ``bundle exec rails server`` でサーバが起動
* **http://localhost:3000** でRedmineにアクセスできる
* admin/adminでログイン
* 一旦Ctrl+cで停止

## Redmineプラグインのスケルトンを生成する
* ``bundle exec rails generate redmine_plugin プラグイン名（スネークケース）`` でスケルトンを生成
* plugins以下にプラグインディレクトリと関連ファイルができている

## 参考
[GuideDevEnv - r-labs - プラグイン開発環境の準備](https://www.r-labs.org/projects/r-labs/wiki/GuideDevEnv)
CloudTrailから特定の作業を検索 

# CloudTrailのログから特定の作業を検索
たまに使うので個人用メモとして残しておく

## 準備
- aws cliが導入済み
- jqが導入済み
- CloudTrailでログを出力

## 作業
### ログの確認
1. ログを展開

```
# gunzip *.json.gz 等
gzになっているので閲覧出来るようにする
```
### 検索する
2-1. ログから指定のイベントを検索

```
SecurityGroupからの削除を検索
# cat CLOUDTRAIL_LOG_NAME.json | jq '.Records[]|select(contains({eventName:"RevokeSecurityGroupIngress"}))'
API名で検索すればOK
```
2-2. ユーザの名前で検索  

```
admin-user01を検索
# cat CLOUDTRAIL_LOG_NAME.json | jq '.Records[]|select(.userIdentity.userName == "admin-user01")'
```

`.userIdentity.sessionContext.sessionIssuer.userName` の場合もあるからAPIによる？
MySQL文のあるある


## Inner join vs Outer join

### inner join

```sql
Select * from table1 inner join table2 on table1.column = table2.column;

table1のあるカラムとtable2のあるカラムが一致したデータだけ持ってくる
```

### outer join

```sql
Select * from table1 left <outer> join table2 on on table1.column = table2.column;

joinのleft側がメインになってtable2のデータを持ってくるが、共通しないデータと持ってくる

Select * from table1 right <outer> join table2 on on table1.column = table2.column;

leftの逆パターン
```
EC2上のSQL Serverでインスタンスのポート番号を変更する

#設定の背景

SQL Serverで複数インスタンスを立てることになったため、インスタンスごとにポートを分けることになりました。
EC2上のインスタンスにクライアントマシンから接続するのに手こずったので、設定内容を記録しておきます。

#環境
AWS EC2
Windows Server 2008 R2
SQL Server 2008

#リモート接続を許可
下準備として、作成したインスタンスのリモート接続を許可する設定を行います。

1. SQL Server Management Studioでインスタンスに接続し、オブジェクトエクスプローラの
   インスタンス名にカーソルを合わせて右クリック、「プロパティ」を開く
2. 「セキュリティ」ページのサーバー認証を「SQL Server認証モードとWindows認証モード」に
   変更する
3. 「接続」ページのリモートサーバー接続にある「このサーバーへのリモート接続を許可する」に
   チェックを入れる
4. 「OK」を押して画面を閉じる

ここで、クライアントマシンから接続する時に使用するユーザを必要に応じて設定しておいてください。
手順は[(インスタンス名)]→[セキュリティ]→[ログイン]を右クリックして「新しいログイン」から追加します。

#ポート番号変更の手順

###SQL Server 構成マネージャー

1. スタートメニューから[SQL Server 構成マネージャー]を開く
2. 「SQL Server ネットワークの構成」を開き、ポート番号を変更するインスタンスの「[インスタンス名]のプロトコル」を選択する
3. プロトコル名の「TCP/IP」を右クリックし、プロパティを開く
4. IPアドレスタブを下までスクロールし、「IPAll」の中にある「TCPポート」にポート番号を入力する
　　※「TCP 動的ポート」は空欄にする
5. 「OK」を押してプロパティを閉じ、再び「TCP/IP」を右クリックし、「有効化」を選択する(状態が「有効」となればOK)
6. SQL Serverのサービス「SQL Server(インスタンス名)」を再起動する

###ファイアウォール

1. [コントロールパネル]→[システムとセキュリティ]→[Windowsファイアウォール]→[詳細設定]を開く
2. 「受信の規則」を右クリックし、「新しい規則」を選択する
3. 規則の種類は「ポート」、プロトコルおよびポートは「TCP」「特定のローカルポート」を選択して
   ポート番号を入力、操作は「接続を許可する」を選択、プロファイルは「ドメイン」「プライベート」「パブリック」全てに
   チェックをつけ、名前・説明は任意の名前・説明を入力する

###AWSのセキュリティグループ(落とし穴)
色々調べたところ、上記の２つの設定が出てくることが多いのですが、SQL Serverのポート番号とファイアウォールを
設定してもつながらない・・・
エラー内容は確か下記
※インスタンス名がINSTANCE、ポート番号を1435とした場合

```コマンドプロンプトでsqlcmdを実行した場合
C:\Users\Hoge> sqlcmd -U fugafuga -S tcp:XXX.XXX.XXX.XXX\INSTANCE,1435
パスワード: Sqlcmd: エラー: 接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、
接続できませんでした。または接続済みのホストが応答しなかったため、確立された接続は失敗しました。
```

SQL Server Management Studioで接続した場合は下記のようなエラーが返ってきます。

```SQLServerManagementStudioで接続した場合
SQL Serverへの接続の確立中に、ネットワーク関連のエラーまたはインスタンス固有が発生しました。
サーバーが見つけられないか、アクセスできません。インスタンス名が正しいことと、SQL Serverが
リモート接続を許可するように構成されていることを確認してください。
```

Windows Server側でファイアウォール設定を変更しても繋がらない場合はAWSのセキュリティグループで
ポートが空いていない可能性があるため、下記の設定を行ってください。

1. EC2ダッシュボードを開き、「◯個のセキュリティグループ」の部分を選択する
2. 該当するセキュリティグループを選択し、インバウンドタブの「編集」を開く
3. 「ルールの追加」を選択し、タイプを「カスタムTCPルール」、ポート範囲にインスタンスに設定したポート番号を登録
4. 「保存」を押してインバウンドルールの編集画面を閉じる

これでクライアントマシンからEC2上のSQL Serverへリモート接続することができました。

まさかAWSとは・・・っていうか最初から疑えば良かったのに、思い込みって怖い。
CocoaPodsでCocoaHTTPServerとRoutingHTTPServerをインストールしてHTTPサーバを立てる

長い道のりだったけど、ようやくiOSでHTTPサーバを立てることに成功！ちょっと感動したｗ
参考サイト様にはほんと感謝！

#CocoaPodsのインストール
ターミナルを起動。

```
$ sudo gem update --system
$ sudo gem install -n /usr/local/bin cocoapods
$ pod setup
```

#CocoaPodsを使ってCocoaHTTPServerとRoutingHTTPServerをインストール
ターミナルを起動。

```
$ cd ~/targetProject
「xcodeproj」ファイルがあるところ
```
Podfileファイルを作成

```
$ vi Podfile
```

ファイルの中身
※targetProjectはプロジェクト名（xcodeprojファイルの拡張子を含まないファイル名）

```
platform :ios,'10.3'
target 'targetProject'
pod 'CocoaHTTPServer'
pod 'RoutingHTTPServer'
pod 'AFNetworking','~> 2.0'
```

インストール
※おそらくupdateは要らないと思うけど一応

```
$ pod install
$ pod update
```

プロジェクトの起動
下記の名前のファイルができているので、今後はこれを起動

```
targetProject.xcworkspace
```

##プログラム

```AppDelegate.m
#import <RoutingHTTPServer/RoutingHTTPServer.h>

@interface AppDelegate ()

/**
 HTTPサーバーインスタンス
 */
@property (strong, nonatomic) RoutingHTTPServer *httpServer;

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.httpServer = [[RoutingHTTPServer alloc] init];
    
    // ポート未指定の場合ランダムで設定されるので、適当なポート番号を設定
    [self.httpServer setPort:50000];
    
    // Content-Type設定
    [self.httpServer setDefaultHeader:@"content-type" value:@"text/html"];
    
    // ルーティング設定
    [self.httpServer get:@"/world" withBlock:^(RouteRequest *request, RouteResponse *response)
    {
        // ブラウザに表示するメッセージ
        [response respondWithString:@"Hello World"];
    }];
    
    // HTTPサーバーを起動
    NSError *error;
    if (![self.httpServer start:&error])
    {
        NSLog(@"Error starting HTTP Server: %@", error);
    }
    
    return YES;
}
```
##パソコンのブラウザで表示してみる
「http://実機のIPアドレス:50000/world」にアクセスすれば「Hello World」と表示される！！


#参考
[iOSライブラリ管理ツール「CocoaPods」の使用方法](http://qiita.com/satoken0417/items/479bcdf91cff2634ffb1)
[iOS上にHTTPサーバを立ち上げる方法](http://qiita.com/gm_kou/items/cc230ad832400a6d9aeb)
[Cocoapods 1.0.0で注意すること](http://qiita.com/ShinokiRyosei/items/7187ffb71862aba7e240)
CharlesでSSL接続のデバッグが出来ない

#CharlesでのSSL接続デバッグ
Charlesを利用してiOSアプリのデバッグを試みていたんですが、httpsの通信に失敗していました。
通常のhttp通信は参照出来ていて、 
・SSLのRoot証明書Charles Proxy CAをMac側にインストール、全て信頼済み 
・iOS側にプロファイルはhttp://www.charlesproxy.com/getssl/よりインストール済み
・Enable SSLProxingも設定済み

この状態で、変わらず 
SSLHandshake: Received fatal alert: certificate_unknown 
とのエラーが表示されていました。

#結局

iOS 10(.3) 以降？の新しい設定項目の問題でした。

参考URL 
http://stackoverflow.com/questions/42157551/unable-to-use-ssl-proxy-in-charles-4-0-2-on-a-remote-device-with-ios-10-3-beta-2

http://www.macotakara.jp/blog/category-54/entry-30607.html
x-serverでのphpのインクルードとBasic認証【.htaccess】

#問題
x-serverへコーディングデータをテストアップする際に以下の２点が問題になりました。

- htmlファイルでのphpのインクルードをするための記述が効かない
- .htaccessに記述する方法でのBasic認証がかけられない

#状況説明

提供されたhtmlのテンプレートファイルでもともと使われていたphpのインクルードを、そのままxserver上にあげようとしたら機能しませんでした。
また、アップ時に.htaccessに記述する形でBasic認証をかけようとしたら、こちらもエラーに。phpインクルード用の記述が原因かと思い、それを消してみてもダメでした。


#解決策

##インクルード
いくつか調べて、結局下記の記述でインクルードファイルが展開されるようになりました。
（ここら辺の記述に関して全然知識がないため、要勉強です、、）

　`AddHandler fcgid-script .html`

参考：http://www.joeswebhosting.net/support/manual/php/

##Basic認証
こちらは.htpswdのパスに問題があったようです。（先輩エンジニアの方にご指摘いただきました。）

**/home/サーバーID/ドメイン名/public_html/ディレクトリ名/.htpasswd**

上記のように、パスをhomeから記述することで対応できました。
最初は下記のようにFTPパスのみをを記述していました。

`AuthUserfile ドメイン名/public_html/ディレクトリ名/.htpasswd`

しかしドメインを複数管理していてサーバーIDが複数ある場合は、/home/サーバーIDからの記述が必要なようです。


ーーーーーーーーーーーーーーーーーーーー
まだまだ未熟な点が多いため、何か間違い等あるかもしれません。
その場合は、大変お手数ですがご指摘いただけると幸いです。
AWSのEC2関連の各リソースをER図にしてみた

前回の[AWSのIAM関連の各リソースをER図にしてみた](http://qiita.com/hirohero/items/98201dc3d96c7f7ce540)は特に需要は無かったみたいだけど、めげずに自分用メモ。

今回はEC2と、それ関係が深いデバイス系リソース、ネットワーク系リソースの関係をER図にしてみました。

# ER図
<img width="765" alt="スクリーンショット 2017-04-07 16.04.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/145575/9eb84dec-24b9-03aa-d9ee-dfd24543e99c.png">

前回と同じく、カーディナリティが省略されている箇所は"1"です。

# ポイント
- セキュリティグループはENIに対して設定されるもの。


例によって、図に誤りがあればご指摘ください。
心構え > 一次ソースを参照するようにしてみてください

ここ１ヶ月の間に２回、小さなトラブルに見舞われた。

内容としては、２ヶ月前に情報の更新をしたのだが、２回のトラブルともに前の情報を元に動かれていた。
結果として、本来なすべき時になすべきことがされずに、reworkが発生した。

こういうトラブルがなぜ発生するか。それは**「一次ソースを参照していない」**、ということが大きいと思う。

実際に、２つのトラブルの担当者に確認したところ、一次ソースを一緒に参照すると、どちらも新しい情報になっていることを確認できた。作業時に情報のキャッシュを使ってしまい、そのキャッシュの更新がされていなかったようだ。(どの情報に基づいたか答えられない担当者であり、それも問題ではある）。

コーディングをしている中で、何らかの情報を参照することがあると思う。その時に気をつけたいことが以下のようなものだろう。

- 一次ソースの参照先を書いておく
- 式があれば、「それは何の式か」を書いておく
- 一次ソースから何らかのデータ処理をする場合、「どういうデータ処理か」を書いておく

これらをしておくことで、将来の保守やバグの原因特定作業の進み方が改善されると経験している。

何かの計算をしていて、答えはとりあえず出ている、というような場合、将来の機能改善ができないことがある。その計算の制約や間違いにも気づきにくい。

「一次ソースを参照する」ということをよければ考えてみてください。
Angular2 angular-in-memory-web-api で モック と urlアクセスを共存させる方法

# angular-in-memory-web-api とは
WebAPI からのデータ取得部分のモックです。
Angular2 で提供されています。
Angular 公式の TUTORIAL に出てきます。
https://angular.io/docs/ts/latest/tutorial/toh-pt6.html

# ざっくり使い方
- import

```ts:app.module.ts
import { InMemoryWebApiModule } from 'angular-in-memory-web-api';
import { InMemoryDataService }  from './in-memory-data.service';

@NgModule({
	imports: [
		InMemoryWebApiModule.forRoot(InMemoryDataService),
	],
})
```

- モックデータは変数にjsonを設定。その変数をpathと紐づける形で定義します。

```ts:in-memory-data.service.ts
import { InMemoryDbService } from 'angular-in-memory-web-api';
export class InMemoryDataService implements InMemoryDbService {
	createDb() {
		let timesheets = [{ … },{ … }];
		
		return {'timesheets':timesheets};
	}
}
```
- request 部分のコードは実際WebAPIへアクセスする時の形で記述します。但し、urlはangular-in-memory-web-api 用のpathを指定する必要があります。

```ts:timesheets.service.ts
export class TimesheetsService {
    private timesheetsUrl = 'api/timesheets';  // URL to web api

    constructor(private http: Http) { }

    getTimesheets(): Promise<Timesheets[]> {
        return this.http.get(this.timesheetsUrl)
            .toPromise()
            .then(this.extractData)
            .catch(this.handleError);
    }
}
```


# 問題
一部のAPIについてのみ実際のurlアクセスを行いたい場合に、urlを変更するだけでは 404 - Not Found となってしまった。


# 解決方法
Config を設定する必要があります。
`passThruUnknownUrl:true` を指定します。


```ts:app.module.ts
@NgModule({
	imports: [
		InMemoryWebApiModule.forRoot(InMemoryDataService, { passThruUnknownUrl: true }),
	],
})
```
https://github.com/angular/in-memory-web-api#passthru

---
日本語で言及している記述が見つけられなかったので書いてみました。
サイトに入ってきてもらえるように準備する(Rails, SEO)

# サイトに流入が欲しい
ネタサイトや練習サイトであってもちょっとは流入して欲しい、ってことで、にわかSEO対策をしてみることに。

## Google Analytics対応する
まずはこれ。[google-analytics-rails](https://github.com/bgarret/google-analytics-rails)というgemを使う。
1.google analyticsのサイトで新しいアカウントを作成する。
2.すると、トラッキングIDもらえるので、それを`config/environments/production.rb`に書く。

```
# replace this with your tracker code
GA.tracker = "UA-112233-4"
```

3.application.html.erbに以下を入れる。

```
<%= analytics_init if Rails.env.production? %>
```

完了。

## Google Search Console対応する
これ。[Search Console ヘルプ](https://support.google.com/webmasters/answer/4559176?hl=ja)
とりあえず、利用するサイトでアカウント開設して、中身をざっと見てみる。なんかいじってるとgoogleから「検索パフォーマンス改善できます」ってメッセージきて、改善点を指摘してくれた。

## tagを良い感じに対応する
このgemを使う。[meta-tags](https://github.com/kpumuk/meta-tags)
この辺りのブログに導入仕方詳しいので、そちらに譲る。
- [meta-tags で Rails アプリの SEO は万全に](http://qiita.com/kakipo/items/7ebacfa32e19cfd2e9fc)
- [meta-tagsとsitemap_generatorで始めるRails 5.0時代のSEO対策](http://morizyun.github.io/blog/meta-tags-sitemap-generator-rails-seo/)

## site-mapに対応する
Search Consoleのアドバイスでも、「サイトマップあると良いよ」とあったので、対応する。[sitemap_generator](https://github.com/kjvarga/sitemap_generator)というgemを使う。
1.Gemfileに追加して、bundle installする。
2.config/sitemap.rbを作成する

```
$ rake sitemap:install
```

3.sitemap.rbを編集する

```
SitemapGenerator::Sitemap.default_host = 'http://example.com'
```

4.public/以下にsitemap.xmlを生成する

```
# Development/Testの場合(pingをsearchエンジンに送付しない)
$ rake sitemap:refresh:no_ping
# Productionの場合(pingをsearchエンジンに送付する)
$ rake sitemap:refresh
```

[追記]  
5. heroku使ってたんだけど、herokuでsitemap.xml扱えなかったので、S3に送って対応するというのをやる必要あり（後日アプデする）

# ひとまず
こんなところで様子見る。気が向いたらアップデートする。
litecore-nodeの導入方法

litecore-nodeの導入方法(ブロックエクスプローラーinsightの導入方法)
# litecore-node

* litecore-node v3.1.7を対象にしています

## litecore-nodeとは？

litecoin版のbitcore-node

## 事前準備

### 動作環境

bitcoreとおなじ

### ubuntu14.04LTS事前用意

```
apt-get install build-essential libtool autotools-dev automake autoconf pkg-config libssl-dev git
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.29.0/install.sh | bash
nvm install v0.12
```

### centos7事前用意

* [nodejsのインストール](http://qiita.com/you21979@github/items/4c9c382b9536effc590d)

```:zeromqのインストール
yum install -y zeromq3-devel
```

### install

```
npm install -g litecore-node
```

### ブロックチェーンディレクトリを作成

```
litecore-node create mynode
```

### プラグインインストール（任意）

```
cd mynode
litecore-node install insight-lite-api insight-lite-ui
```

## 起動

```
cd mynode
litecore-node start --daemon
```

※ブロックチェーンの同期には時間がかかります

### 同期の確認

```
tail -f mynode/data/debug.log
```

## 自動再起動スクリプト

### centos7

```/etc/systemd/system/litecore-node.service
[Unit]
Description=litecore-node
After=syslog.target network.target

[Service]
Type=simple
ExecStart=/bin/litecore-node start -c /home/centos/litecore/mynode/litecore-node.json
WorkingDirectory=/home/centos/litecore/mynode
KillMode=process
Restart=always
User=centos
Group=centos

[Install]
WantedBy=multi-user.target
```

## おまけ　insight 導入サイト

https://insight.litecore.io/
web-console gem勉強

ブラウザーでrails console使えるgem

github: https://github.com/rails/web-console

![屏幕快照 2017-04-07 下午3.36.34.png](https://qiita-image-store.s3.amazonaws.com/0/114912/e8aadf11-bad5-5c79-c1fa-195652cc12ec.png)


## Modelを使いたい場合、requireする必要があるようです。

```rb
require "user"
User.cout
```

## consoleが表示するためには、whitelisted_ips（安全リスト）の設定が必要
```rb
config.web_console.whitelisted_ips = '192.168.1.133'
```

設定するIPは　logsファイルで見つけることができます。
> Cannot render console from 192.168.1.133! Allowed networks: 127.0.0.0/127.255.255.255, ::1
最高の.rubocop.ymlを求めて

3年ぶりのrubyでもはやnoob過ぎるので、最高のrubocop環境が欲しい。
RubyMineにrubocopのプラグインがあるので、それを入れている。で、デフォルトの設定を上書きする.rubocop.ymlをどんな感じにすると一番最高なのか知りたい。見つけたやつを以下に置いておく。

#### qiita
2013年と前のやつだけど、qiitaでの.rubocop.ymlが置いてある。
[Rubocopを使ってコーディングルールへの準拠チェックを自動化](http://qiita.com/yaotti/items/4f69a145a22f9c8f8333)

#### rails
railsのrepositoryに.rubocop.yml置いてあった。
[rails/.rubocop.yml](https://github.com/rails/rails/blob/master/.rubocop.yml)
これを使うと、single qoute, double quoteのところで、ruby規約とrails規約でぶつかる事例があった。

### おまけ
- ruby style guideの日本語訳
[fortissimo1997/ruby-style-guide](https://github.com/fortissimo1997/ruby-style-guide/blob/japanese/README.ja.md)

- rails style guideの日本語訳
[satour/rails-style-guide](https://github.com/satour/rails-style-guide/blob/master/README-jaJA.md)