OmniAICreator/Qiita-1.07M huggingface dataset:
Git LFSのcase sensitivityについて

Git LFSでは、 `.gitattribute` というファイルで、Git LFS管理を行うファイルを指定します。

WinとMacでは、ファイルシステムにおける大文字小文字の区別が異なるため、( **各自「NTFS HFS+ case sensitivity」とかでぐぐってください** )
.gitattribute上でも大文字と小文字を併記しないと、一部のWin版Gitクライアントで正しく動かず、LFSファイルがそのまま通常ファイルとしてコミットされてしまいます。
少なくともWin版TortoiseGitではそんな挙動でした。



`.gitattribute`は

```
*.fbx filter=lfs diff=lfs merge=lfs -text
*.wav filter=lfs diff=lfs merge=lfs -text
*.prefab filter=lfs diff=lfs merge=lfs -text
*.psd filter=lfs diff=lfs merge=lfs -text
*.tga filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text
*.exr filter=lfs diff=lfs merge=lfs -text
*.a filter=lfs diff=lfs merge=lfs -text
*.mat filter=lfs diff=lfs merge=lfs -text
*.shader filter=lfs diff=lfs merge=lfs -text
*.unity filter=lfs diff=lfs merge=lfs -text

```

↑こうではなくて、

```
*.fbx filter=lfs diff=lfs merge=lfs -text
*.wav filter=lfs diff=lfs merge=lfs -text
*.prefab filter=lfs diff=lfs merge=lfs -text
*.psd filter=lfs diff=lfs merge=lfs -text
*.tga filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text
*.exr filter=lfs diff=lfs merge=lfs -text
*.a filter=lfs diff=lfs merge=lfs -text
*.mat filter=lfs diff=lfs merge=lfs -text
*.shader filter=lfs diff=lfs merge=lfs -text
*.unity filter=lfs diff=lfs merge=lfs -text
*.FBX filter=lfs diff=lfs merge=lfs -text
*.WAV filter=lfs diff=lfs merge=lfs -text
*.PREFAB filter=lfs diff=lfs merge=lfs -text
*.PSD filter=lfs diff=lfs merge=lfs -text
*.TGA filter=lfs diff=lfs merge=lfs -text
*.PNG filter=lfs diff=lfs merge=lfs -text
*.EXR filter=lfs diff=lfs merge=lfs -text
*.A filter=lfs diff=lfs merge=lfs -text
*.MAT filter=lfs diff=lfs merge=lfs -text
*.SHADER filter=lfs diff=lfs merge=lfs -text
*.UNITY filter=lfs diff=lfs merge=lfs -text
```

↑こうしましょう。


---

万が一コミットしてしまった場合は

```
git rm --cached *コミットしてしまったファイルのpath*
git add *コミットしてしまったファイルのpath*
git commit
```

などとすれば、LFS管理に戻せます。


---

*そもそも大文字拡張子を使うなという話かもしれませんが……*
Webpackでライブラリを作る

npmには多数のライブラリが存在しますが、自分でライブラリを作ろうとしたところ、正しい設定にたどり着くまでにちょっと手間取りました。

# ライブラリの特徴

ブラウザやNode向けのプロジェクトの場合、ビルドした後は読み込んで使うだけなので、外部との関係性を考える必要はそこまで大きくありません。一方で、ライブラリの場合は、

* ライブラリを読み込む側との連携（CommonJS、ES6 Module、AMD、UMD）
* ライブラリ内で使うライブラリの切り離し（そのままにすると、他のライブラリを取り込む形となってしまい、あとで依存ライブラリを差し替えることができなくなる）

といった処理が必要となります。ただ、これらはWebpackでも実現できます。

# ライブラリモードの利用（&エクスポート）

まず、Webpackをライブラリのビルドに使いたい場合、`output.library`に名前を指定します。この名前は、グローバルにオブジェクトを出すときにも使いますので、JavaScriptの変数名にしておけるものを使うことをおすすめします。

そして、`output.libraryTarget`で、どのようなライブラリ形式にするかを指定します。

* `var`（デフォルト）…`output.library`で指定した変数を宣言して、そこに代入する
* `this`・`window`・`global`…それぞれ指定したオブジェクトの、`output.library`名のプロパティとして代入する
* `commonjs`…`exports[output.library]`に代入する
* `commonjs2`…`module.exports`に代入する（`output.library`は影響しない）
* `amd`…`define()`で登録する
* `umd`…`exports`、`module.exports`、`define()`、`this`のどれかを使う

Node.jsとブラウザの両対応を考えるなら、`umd`を選んでおくのがいいでしょう。

```webpack.config.js
module.exports = {
  // 他の設定は省略
  output: {
    // 前略
    library: 'SomeLibrary',
    libraryTarget: 'umd'
  }
}
```

# 他のライブラリの利用

以前に[Webpack外からライブラリを供給するために](https://qiita.com/jkr_2255/items/5bff71d71286979e8a4e#webpack%E7%AE%A1%E7%90%86%E5%A4%96%E3%81%AE%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92%E4%BD%BF%E3%81%86)`externals`を使う方法を示しましたが、同じ`externals`は、ライブラリ作成時にも「外部から供給するライブラリ」の指定のためにも使えます。

```webpack.config.js
module.exports = {
  // 他の設定は省略
  externals: {
    // 前略
    riot: 'riot',
    jquery: {
      commonjs: 'jquery',
      commonjs2: 'jquery',
      amd: 'jquery',
      root: 'jQuery'
    }
  }
}
```

前者のように文字列で指定すると、「`import ~~ from 'riot'`や`require('riot')`で参照するものを、それぞれの手法で`riot`という名前で参照させる」ということになります。大文字小文字やハイフン入りなど、ロード方法によって参照すべき名前が違う場合は、それぞれに指定できます。


# 外部リンク
* [Authoring Libraries - Webpack](https://webpack.js.org/guides/author-libraries/)
notepad++ pluginのビルド方法

# ビルドできる環境

- Visual Studio Community 2015 Update3(英語版)
- Windows7

上記以外の環境だと実行時に下記のいずれかのエラーが出てしまい実行できませんでした。

- this ansi plugin is not compatible
- failed to load

![notepad01.png](https://qiita-image-store.s3.amazonaws.com/0/146069/cf5ee737-b2f1-ca8c-aba3-3c93429de5da.png)

- Windows7　－　Visual Studio 2015(日本語版)
- Windows10　－　Visual Studio 2015(英語版)
- Windows10　－　Visual Studio 2017(日本語版)

これらの組み合わせはいずれもＮＧでした。

# テンプレートの入手
1. [ここ](https://github.com/kbilsted/NotepadPlusPlusPluginPack.Net)からテンプレートをダウンロードします。
2. 入手した「NppPlugin.zip」を「My Documents\Visual Studio 2015\Templates\ProjectTemplates\Visual C#\」にコピーします。
3. Visual Studioを起動し、新しいプロジェクトを作成します。この時、notepad++が表示されているはずです。

![notepad02.png](https://qiita-image-store.s3.amazonaws.com/0/146069/edc82024-c86e-ca4a-a8d5-97d8cbcee2fe.png)

# とりあえずビルドしてみる。
1. デフォルトのプロジェクト名(MyNppPlugin1)でプロジェクトを作成します。
2. ビルドが成功したら、「\Projects\MyNppPlugin1\MyNppPlugin1\bin\Debug\MyNppPlugin1.dll」をnotepad++のpluginフォルダへコピーします。
3. notepad++を起動し、エラーが無ければ問題ありません。

![notepad03.png](https://qiita-image-store.s3.amazonaws.com/0/146069/cf7914ca-a549-f095-8b4b-b1d6e3295d05.png)
go言語でHeadlessChromeが使いたい！

#前準備

必要なパッケージは自分でinstallしてね
#セットアップコード

	//多分使うのはこれだけだった（はず）
	import (
	    "github.com/sclevine/agouti"
	)
    // Chromeを利用することを宣言
    agoutiDriver := agouti.ChromeDriver()
    agoutiDriver.Start()
    defer agoutiDriver.Stop()
    var ua = "ユーザーエージェント"
    page, _:= agoutiDriver.NewPage(agouti.Desired(agouti.Capabilities{
        "chromeOptions": map[string][]string{
            "args": []string{
                "--headless",
                "--disable-gpu",
                "--user-agent="+ua+"",
                "window-size=1280x800",
                "--log-level=3",
                "--no-sandbox",
            },
        },
    }),
    )

これで、ベースとなる設定は完了です。
#実行（起動）

	//ページ移動
    page.Navigate("URL")
    //JSの実行
    page.RunScript("動かしたいJS",nil, nil)

基本的にページの移動+JSの実行ができれば満足では？？
以上！
JSONチェック便利ツールなど

##テキストエディタ
http://jsoneditoronline.org/
ブラウザ上で使用可能。Jsonの括弧閉じなどのエラーを指摘してくれるサービス。
（「,」がないんじゃない？みたいに具体的な修正方法までレコメンドしてくれる）

##JSONエラーチェック、整形サービス 
http://www.ctrlshift.net/jsonprettyprinter/
Jsonのエラーを指摘（どこがエラーになっているかのみ表示）し、文法上矛盾がなければ整形してくれるサービス。

##ExcelファイルからJsonファイル作成ツール
http://stabucky.com/wp/archives/7658
https://qiita.com/oinariman/items/61038acafb6b0ca8b38d
https://qiita.com/nuko_yokohama/items/d19059eb04e5faa30a2d
いい加減メモリ監視をできるようになりたい

いつまでもunix系のコマンドが使えないのはダサいので、メモも兼ねて書く。

* topコマンド実行
* 「shift+m」でメモリ順にソート
* 「m」（またはmからのm）でグラフィカルに見れる！

これでメモリの使用率がグラフィカルに確認できる！
Windows Server環境のBitnami Redmine-2.6.9-3のMySQL DBバックアップをやってみる


## まずServerへRDP接続

RDP connect to terget machine host 10.198.xxx.xxx

ID &　PWを入力してRDPログオン

### コンソールでMy SQL backupコマンド
---
cmd console open

C:\Bitnami\redmine-2.6.9-3\mysql\bin>mysqldump -u root -P 9306 -B bitnami_redmine -p >backup.sql

**Access is denied.**

### アクセス拒否・・といわれたら
---
Windows, bitnamiのmysql\binフォルダが書き込み不可と思い
プロパティ＞セキュリティのタブでUserをフルコントロール

でもう１回

C:\Bitnami\redmine-2.6.9-3\mysql\bin>mysqldump -u root -P 9306 -B bitnami_redmine -p >backup.sql

Enter password: ********

mysqldump: Got error: 2003: Can't connect to MySQL server on 'localhost' (10061) when trying to connect

localhost(10061)ではホストに接続できないと？

### -hでホスト名を指定してみる
ならば、-hでホスト名を指定してみる（伏字でXX-XXX-XXXX）

C:\Bitnami\redmine-2.6.9-3\mysql\bin>mysqldump -h XX-XXX-XXXX -u root -P 9306 -B bitnami_redmine -p >backup.sql

Enter password: ********

mysqldump: Got error: 2003: Can't connect to MySQL server on 'XX-XXX-XXXX' (10061) when trying to connect

う～ホスト名指定でもないか

### ポート番号なしでやってみる
ならば、ポート番号なしでMySQL接続できているのかをやってみると

C:\Bitnami\redmine-2.6.9-3\mysql\bin>mysqldump -u root -B bitnami_redmine -p >backup.sql

Enter password: ********

C:\Bitnami\redmine-2.6.9-3\mysql\bin>


・・でbackup.sql正常作成された。　　→^_^;

なーんだポート番号指定誤り？　それともポート番号スイッチーP付きが不機嫌？　まあいずれにせよ結果OKayでこれでバックアップ運用へ
setInterval()の各ブラウザのバックグラウンドでの動作を調べてみた

## 動機
JavaScriptを書いてる際によくお世話になっているsetInterval()。
これがブラウザがバックグラウンドになった際にどんな動作をしているのかちゃんと確認したことが無かったので確認をしてみたくなった。

## 確認した環境

- Mac
    - Chrome(最新版)
    - Firefox Nightly
    - Safari11
- Windows10
    - Edge
    - IE11

## バックグラウンド時の仕様
MDNのドキュメントには以下のようにある。

> バックグラウンドのタブによる負荷 (およびバッテリー消費) を軽減するため、アクティブ状態でないタブでのタイマーの呼び出しは、1 秒 (1000 ms) あたり 1 回までとなります。
>
> Firefox はこの動作をバージョン 5 (バグ 633421 を参照。1000 ms の定数は設定項目 dom.min_background_timeout_value で変更できます) から、Chrome はこの動作をバージョン 11 (crbug.com/66078) から実装しています。
> 
>MDNの[遅延が長い理由](https://developer.mozilla.org/ja/docs/Web/API/WindowTimers/setTimeout#Reasons_for_delays_longer_than_specified)より引用

果たして本当にそうなっているのか。。。

## 確認用コード

```js
let count = 0;
setInterval(() => {
  count++;
  console.log(count);
}, 100);
```

## 結果

- Chrome、Firefox Nightly、Safari11、Edge
    - ドキュメント通りの実装。バックグラウンドでは最小遅延時間が1秒になった。
- IE11
    - 100msの遅延時間は変わらず実行され続けた。

さすがはIE11。ブレない。
ASTERIA WARP Platioコンポーネントのコネクション設定

ASTERIA WARP 1712 が今月リリースされ、1712からPlatioアダプターが正式に追加されています。Platioアダプターは、8月1日にExperimental Buildとしてリリースされていましたが、今回PlatioNotificationコンポーネントとPlatioStartコンポーネントの２コンポーネントを追加して、全５コンポーネントとなっています。

![platio_get.png](https://qiita-image-store.s3.amazonaws.com/0/180278/303368ac-1df2-d6df-1234-07444120f19a.png)　PlatioGetコンポーネント

![platio_put.png](https://qiita-image-store.s3.amazonaws.com/0/180278/2abc7961-2db5-664b-a869-50a73a9de330.png)　PlatioPutコンポーネント

![platio_delete.png](https://qiita-image-store.s3.amazonaws.com/0/180278/f94e82e0-7f30-400b-3e9c-80d4b39b4b2b.png)　PlatioDeleteコンポーネント

![platio_notification.png](https://qiita-image-store.s3.amazonaws.com/0/180278/1984494d-c594-6f60-462b-8aace3a02bf8.png)　PlatioNotificationコンポーネント

![PlatioStart.png](https://qiita-image-store.s3.amazonaws.com/0/180278/842fe876-82ce-8715-3f15-aed885e4ddab.png)　PlatioStartコンポーネント


Experimental Build時からのいろいろな不具合の修正が行われました。その中でも見た目に一番ヒットするのはアイコンが変更されたことです！

![PlatioGet.png](https://qiita-image-store.s3.amazonaws.com/0/180278/0cbeb987-cbf5-caf0-acf8-8b61ae0a5c68.png)「Experimental Build」　→　![platio_get.png](https://qiita-image-store.s3.amazonaws.com/0/180278/9f34ce1c-83f3-8bbf-c358-03eb15319696.png)「1712」

下部に文字があると安定感があるような・・気もしますが、すっきりとPlatioのイメージが大きくなって見やすくなりました。

そんなことはさておき、Experimental Build時から全Platioコンポーネントに影響がある部分として変更になった点に、Platioコネクションがあります。
コネクションのアイコンも変更になっています　![PlatioConnection.png](https://qiita-image-store.s3.amazonaws.com/0/180278/cd62e549-4d50-4076-274e-1397e5e07010.png)　が、今回お伝えしたいのは、プロパティから「Bearerトークン」が無くなったことです。

BearerトークンはBearer認証用のトークンIDだったのですが、<a href="http://doc.plat.io/api/ja/guide.html">Platio API プログラミングガイド</a>には「トークンは、トークンIDと秘密トークンを.で繋げたものです」と記述があるだけなので、確かに分かりづらかったです。
※「Bearerトークン」という言葉はトークンを作成する「開発者向け情報」画面で出てきます。

「Bearerトークン」の代わりに「トークンID」と「秘密トークン」というプロパティが新たに追加されました。

２つのトークンは「開発者向け情報」画面で作成します。

![platio_dev.png](https://qiita-image-store.s3.amazonaws.com/0/180278/17295622-2024-6952-6bf6-b6719829eac4.png)

この環境はすでにAPIトークンが作成されている状態ですが、再作成で作り直せます。

![platio_new_token.png](https://qiita-image-store.s3.amazonaws.com/0/180278/9aeebbfb-252b-c5de-c8aa-fe6665e7dbdd.png)

①トークンID、②秘密トークンをそれぞれ右のアイコンをクリックしてクリップボードにコピーできます。

「トークンID」は、Platioの「開発者向け情報」画面でいつでもコピーできますが、「秘密トークン」は、このAPIトークン作成時にしかコピーできませんので、注意が必要です。

ちなみに「秘密トークン」はパスワードプロパティですので、プロパティエディタから後でコピーとかできません。

なんだよ、プロパティが無くなったりしたら作り直さないとダメなのかよ！っと思った皆さん。
安心して下さい。そのまま使えます。

Experimental Buildで作成したコネクションやFlowは「Bearerトークン」が使われていますが、1712でも修正せずにそのまま使い続けることが可能です。

新たに追加された「PlatioNotification」と「PlatioStart」は別投稿で、個別に説明したいと思います。
Bitnami RedmineでTheme追加して模様替えが簡単だったのを記録（でも結局Default）


## Themeを手に入れる@Oct 22, 2015
farend_fancyをGithubからDL
他のThemeもあるのでGithubから入手可能

## フォルダごと以下に置く、だけ
C:\Bitnami\redmine-2.6.1-0\apps\redmine\htdocs\public\themes

## Themeを選択
管理＞設定＞表示＞テーマ、で置いたThemeが表示されるので選択
・・・だけでOK、楽チン


farend_fancyはメニューが無機質文字だけからアイコン付きになりWebらしくなるがIssue一覧がデフォルトと違い過ぎ感
標準で　Alternate や Classic　もあってA1なども他も試すがイマイチ
・・・で結局慣れ親しんだDefaultに戻してしまった。
Bitnami Redmineでredmine_redirect_to_after_login-masterのPluginをやってみた結果インスコできたがダメものだったを記録


### PluginをDL@Dec 17, 2015
redmine_redirect_to_after_login-master

フォルダ名は-masterを削除、フォルダごとpluginに置いて

### bundleでMigration
cd C:\Bitnami\redmine-2.6.1-0\apps\redmine\htdocs

bundle exec rake redmine:plugins:migrate RAILS_ENV=production

DL is deprecated, please use Fiddle
Migrating clipboard_image_paste (Clipboard image paste)...
Migrating redirect_to_after_login (Redmine Redirect to url after login Plugin)..
.
Migrating redmine_absolute_dates (Redmine Absolute Dates plugin)...
Migrating redmine_issue_templates (Redmine Issue Templates plugin)...
Migrating redmine_local_avatars (Redmine Local Avatars plugin)...

### インスコ完了でも設定が404
例によってFiddle使え、と出るがMigrating・・・ってErrorもなく通った感じ

Thin_redmine, Thin_redmine2ともRestartして

管理＞プラグイン、を見るとあるじゃないですか

でInstall完了　　→^_^;

でも、プラグインの[設定]をクリックしても404が返りダメものじゃん、残念

一応ログイン後必ずマイページになりRedirectされた、ようになったけどこの影響かどうかは不確か、で終わり
typescriptいろいろ

## モジュール関連

### export/importのいろいろ

```typescript
export default class Foo {}   => import x from 'y'
/* or */
class Foo {}
export = Foo;                 => import x = require('y')
/* or */
export class Foo { }          => import { Foo } from 'y' | import * as x from 'y'

import x = require('y');
import x from 'y';
import { x } from 'y'
import * as x from 'y';
```

> 参考: 
[module FAQ](https://github.com/Microsoft/TypeScript/issues/7185) 
[モジュール説明](https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Modules.md)
ターミナル(SSH)でさくらインターネットのレンタルサーバーにログインする

# 1.ターミナルを起動する。
ターミナルを起動しましょう。

# 2.必要な情報の確認。
さくらインターネットのレンタルサーバーにログインするには以下の情報が必要です。

1. 初期ドメイン名
2. ログインするアカウント
3. ログインするアカウントのパスワード

初期ドメイン名とログインするアカウントはログイン済みのサーバーコントロールパネルで確認できます。
<img width="223" alt="スクリーンショット 2017-12-28 時刻 17.58.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/154299/49728e5b-21be-8b5f-62de-1eb323b82ba7.png">

# 3.ログイン
以下のコマンドをターミナルで実行

```
ssh アカウント名@初期ドメイン(xxx.sakura.ne.jp)
```
最初は実行すると`yes/no`か聞かれるので`yes`をタイプ。
そしてパスワードを聞かれるので入力（タイプしても表示されないので注意）
最後に`%`が表示されたらログイン成功。
<img width="144" alt="スクリーンショット 2017-12-28 時刻 18.10.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/154299/b9ec4b06-666d-51a7-3afe-fa0c3d5b728d.png">
Bitnami Redmineでredmine_local_avatarsのPluginを再チャレンジしてみた結果インスコできたを記録

### 原因はhtdocsへのPATH設定・・情けなっ！
以前の[Avatarのpluginインスコチャレンジ](http://qiita.com/ihopeyoufunit/items/718a20e0c75907dd79a0)は未完

所詮avatarsはお遊びなので諦め[inline-attach-screenshot](http://qiita.com/ihopeyoufunit/items/27dc25d426cdd99fe37a)へ移ってごにょごにょ・・・と、bundle通らない＝Plugin問題じゃない切り分け、結局htdocsへのPATH設定が原因明白となり

### Avatorインスコ再チャレンジ@Oct 26, 2015

redmine_local_avatarsをGitHubから再DLし直し<br>
中身が以前のものと違うような・・・<br>
対応を見ると2.1-2.6までとなっていて更に期待感<br>

c:\bitnami\redmine2.6-2.0\apps\redmine\htdocs\pluginsにフォルダごと置いてhtdocsでBundle実行


cd C:\Bitnami\redmine-2.6.1-0\apps\redmine\htdocs<br>
・・htdocs>bundle exec rake redmine:plugins:migrate RAILS_ENV=production<br>
DL is deprecated, please use Fiddle<br>
（いつもいつも芸なく同じ返りで・・）<br>
Migrating clipboard_image_paste (Clipboard image paste)...<br>
Migrating redmine_issue_templates (Redmine Issue Templates plugin)...<br>
Migrating redmine_local_avatars (Redmine Local Avatars plugin)...<br>
C:\Bitnami\redmine-2.6.1-0\apps\redmine\htdocs>

・・・って通った感じ


### インスコ完了Avatarをセット、でも小さっ！
Thin_redmine,Thin_redmine2ともRestart
ログオン正常<br>
管理＞プラグイン、を見るとあるじゃない<br>
Install完了　　→^_^;<br>

管理>ユーザ、を見ると新たにアバタータブもあるじゃないっすか、参照でファイル選択し、保存するとチケットには画像が小さく表示され・・・Happy
EC2インスタンスから自分自身のNameタグを取得(Python版)

[こいつ](https://qiita.com/masahiro_toriumi/items/dd93bcc57aca3f76ae25#ec2%E3%81%A7%E8%87%AA%E5%88%86%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E5%90%8D%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E3%83%AF%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%8A%E3%83%BC)のpython版

```python3
import boto3
import requests

region = requests.get('http://169.254.169.254/latest/meta-data/local-hostname').text.split('.')[1]
instance_id = requests.get('http://169.254.169.254/latest/meta-data/instance-id').text

client = boto3.client('ec2', region_name=region)
for tag in client.describe_tags(Filters=[{ 'Name': 'resource-id', 'Values': [ instance_id ] }])['Tags']:
  if tag['Key'] == 'Name':
    print(tag['Value'])
```
Bitnami Redmineでredmine-inline-attach-screenshotのPluginをやってみた結果インスコできたが動作不良で諦めたを記録

### GitからDL
ファイルを
c:\bitnami\redmine2.6-1.0\apps\redmine\htdocs\plugins
にフォルダごと置いて

C:\Bitnami\redmine-2.6.1-0\apps\redmine\htdocs>
bundle exec rake redmine:plugins:migrate RAILS_ENV=production

DL is deprecated, please use Fiddle
rake aborted!
LoadError: cannot load such file -- application

redmine_local_avatarsと同じ、なので一旦local_avatarsを削除してもう一度

DL is deprecated, please use Fiddle
rake aborted!
LoadError: cannot load such file -- application

で同じエラー、なんで？？


### screenshotだけで
c:\bitnami\redmine2.6-1.0\apps\redmine\htdocs\plugins
フォルダからtemplateも除いてscreenshotだけで

C:\Bitnami\redmine-2.6.1-0\apps\redmine\htdocs>bundle exec rake redmine:plugins:
migrate RAILS_ENV=production

DL is deprecated, please use Fiddle

Migrating redmine_inline_attach_screenshot (Redmine Attach Screenshot plugin)...

・・・で前同様通った感じ。

### 愕然！ 新しいチケット作成できず

でもPluginには追加されてない<br>
のでApplication ManageからRedmineとRedmine2のRestartをかける、そしたら新しいチケット作成できず、愕然！

htdocsフォルダからscreenshotも除いて<br>
templateだけにしてもう一度Restartをかける<br>
と新しいチケット作成OK<br>

screenshotを再度置くとなぜだか設定＞プラグインにscreenshot入ってる、でも期待した表示はなし

結局Chrome、Firefoxでないと表示でない？<br>
意味ないじゃん


### プラグインを削除 

/Applications/redmine-2.5.1-1/apps/redmine/htdocs/plugins/ 以下にあるプラグインをフォルダごと削除。<br>
Redmineを再起動してやればOK。<br>

・・とのことで
screenshotフォルダを削除し<br>RedmineとRedmine2のRestartをかけると<br>
設定＞プラグインのscreenshotは消えた
Bitnami Redmineでredmine_export_with_journalsと redmine_default_columnsのPluginをインスコできたが・・を記録

### PluginをDLしフォルダに置いて

Bitnamiのredmine2.6.9-3環境にGitからDLしたファイルを
c:\bitnami\redmine2.6.9-3\apps\redmine\htdocs\plugins
にフォルダごと置いて

cd C:\Bitnami\redmine-2.6.9-3\apps\redmine\htdocs

### bundle exe、DLをたしなめFiddle使って・・も慣れ

C:\Bitnami\redmine-2.6.9-3\apps\redmine\htdocs>bundle exec rake redmine:plugins:migrate RA
ILS_ENV=production

DL is deprecated, please use Fiddle

Migrating clipboard_image_paste (Clipboard image paste)...<br>
Migrating redmine_absolute_dates (Redmine Absolute Dates plugin)...<br>
Migrating redmine_default_columns (Default columns)...<br>
Migrating redmine_export_with_journals (Redmine Export With Journals plugin)...<br>

C:\Bitnami\redmine-2.6.9-3\apps\redmine\htdocs>

### 無事インスコ

で既に動いているClipboard image pasteとAbsolute Datesも含めMigration無事完了

Redmine＞設定＞Pluginで2個追加されている

### でもdefault columnsは使えない
Pluginのdefault columnsにはConfigureのリンクが用意されそれをクリックすると・・・

Internal error<br>
An error occurred on the page you were trying to access

・・・で使えない（残念）

### export_with_journalsは使えそう

作者のサイト
[履歴付チケット一覧出力プラグインを書いてみた](http://d.hatena.ne.jp/suer/20101003/1286120294)
から使用方法を引用すると

設定は、管理者ログイン＞管理＞ロールと権限<br>
でこの機能を使うロールでExport csv with journalsにチェックを入れて保存、それだけ

出力は、チケットリストの右下に新たにできた「CSV出力(履歴付き)」 をクリックしてexport.csvを保存すればチケット一覧がエクセルになって<br>
後は利用する方の加工次第、すばらしいプラグイン。

但し注意点は、ユーザの全般で言語がEnglish（当方は）だと、CSV出力のリンクが<br>
translation missing: en.label_export_with_journals<br>
となって、CSVの中身がチケットの履歴は日本語大丈夫ですが、他項目は日本語が????で正しく反映されず

なのでCVS作成の時だけは日本語にして使うしろものです
SourceTreeのgitのパスワードを変更する

会社のgit repoをMac版のSoruceTreeで使っていて、アカウントのパスワードが変わった時、困った話。

プッシュなどしようとするとエラーが認証エラーが起こり、SourceTreeのどこをみてもパスワードを変更できない。

そんなときは、KeyChainAccessに保存されているSourceTreeのパスワードを削除すると次回のプッシュ時などにパスワードを聞かれる。
Bitnami Redmineでclipboard_image_paste-master installのPluginをやってみた結果、これは使えるを記録


### 別プラグインに鞍替え、まずはアンインスコ？
[StrangeWill-redmine-inline-attach-screenshot]()
は何とかインスコできたが使えない、のでclipboard_image_paste-masterへ鞍替え

一般発想でまずは同機能のinline-attachを削除してから、の方がスッキリと思い別サイトでまずアンインスコ方法を確認

redmine_pluginという名前のプラグインをアンインストールする場合の例・・・

C:\Bitnami\redmine-2.6.1-0\apps\redmine\htdocs>bundle exec rake redmine:plugins:migrate NAME=redmine_plugin VERSION=0 RAILS_ENV=production

C:\Bitnami\redmine-2.6.1-0\apps\redmine\htdocs>rm -rf plugins/redmine_plugin

### ということは逆にプラグイン指定できる

NAME=を付ければプラグイン指定ができるよな感じ

c:\bitnami\redmine2.6-2.0\apps\redmine\htdocs\plugins
にフォルダごと置いて

C:\Bitnami\redmine-2.6.1-0\apps\redmine\htdocs>bundle exec rake redmine:plugins:
migrate **NAME=clipboard_image_paste-master** RAILS_ENV=production

DL is deprecated, please use Fiddle
**Plugin clipboard_image_paste-master was not found.**

なので、やっぱりNAMEを除いてやって見る

### 愕然!!　ほんと心臓に悪い
bundle exec rake redmine:plugins:migrate RAILS_ENV=production

DL is deprecated, please use Fiddle<br>
Migrating clipboard_image_paste (Clipboard image paste)...<br>
Migrating redmine_issue_templates (Redmine Issue Templates plugin)...

で通った

が、Application ManagerでRestartすると、愕然のInternal error
、がーん真っ青で本当に心臓に悪い

pluginフォルダからclipboard_image_paste-master削除してRestartすると戻った、ほっとする

このRedmine使えない状態と戻るは、まるで天国と地獄のようだ<br>
とても本番環境でやる行為ではない

### フォルダ名変更は常識かよ！

で何気に[Github](https://github.com/peclik/clipboard_image_paste)
を見るとInstallationの項目に<br>

<img src="attach:clipboard">

* download one of:<br>
* latest release zip:https://github.com/peclik/clipboard_image_paste/archive/v1.9.zip
* development zip:https://github.com/peclik/clipboard_image_paste/archive/master.zip
* git:  git clone https://github.com/peclik/clipboard_image_paste.git plugins/clipboard_image_paste
 
* place plugin files into  plugins/clipboard_image_paste  folder (strip possible  -master  or  -version  suffix)

・・って書いてあるじゃないか<br>
フォルダ名変更するなんて常識かよ！


### ついにRedmine画像追加キター
でclipboard_image_paste-masterから-masterを削除し<br>
clipboard_image_pasteにして

c:\bitnami\redmine2.6-2.0\apps\redmine\htdocs\plugins
に置いて

htdocs>bundle exec rake redmine:plugins:migrate RAILS_ENV=production

DL is deprecated, please use Fiddle<br>
Migrating clipboard_image_paste (Clipboard image paste)...<br>
Migrating redmine_issue_templates (Redmine Issue Templates plugin)...

となり<br>
Application ManagerでRedmine、Redmine2をRestart
すると

Internal errorは出ず<br>
設定＞プラグインに入ってるではないか
かつ編集、でファイルのUploadに下に
クリップボードから画像を追加（サイズの上限：5MB)
の表示、キターっ！

ようやくプラグイン2個目追加完了
TwilioからのリクエストであるかチェックするのはFormValidation上で行うとスマートな感じがする

# このページについて
Twilioからのwebhookが、本当にTwilioサーバーから来たのか検査するのは、
FormValidationで行うのがイイんじゃない？という話。

が、何でこれを書こうと思ったのか覚えていない。
下書き漁ったらあったので、とりあえず書いてみます。

# 環境
* PHP 7.1
* Laravel 5.5
* Twilio SDK 5.16

# Twilioサーバーから来たリクエストか検査する方法

本家：https://jp.twilio.com/docs/api/security

## バリデーションの手順
1. 対象の完全URL、プロトコルから始まり、全クエリーストリングを含むもの (https から始まり、 ? で指定するものを全て含む) を取得します。
2. もしリクエストがPOSTの場合、全てのPOSTパラメータをUnix形式の大文字小文字を区別するソート方法で、アルファベット順に並び替えます。
3. ソートしたPOSTパラメータに、URLの最後まで繰り返しパラメータ名と値(区切り文字を使わない)を当て込んでいきます。
4. 最終URLの文字列に、ユーザの AuthToken を鍵として(大文字小文字を区別します)、HMAC-SHA1 形式で署名します。
5. 結果のハッシュ値をBase64でエンコードしてください。
6. 結果のハッシュ値とTwilio側が署名した X-Twilio-Signatureヘッダを比較します。 これらが一致すれば問題ありません。

だそうです。
めんどくさくてやる気にならない・・・

でも大丈夫、僕たちには[twilio-sdk](https://github.com/twilio/twilio-php)がある


## Twilio-SDKを使った実装
\Twilio\Security\RequestValidatorクラスを使う

```php:validation.php
public function twilioValidation()
{
    $token = '12345';

    $validator = new RequestValidator($token);
    return $validator->validate($_SERVER['HTTP_X_TWILIO_SIGNATURE'], url()->current(), $_POST);
}
```

$tokenはTwilioのトークン情報で、本来はDBや設定ファイルに持ってる内容です。
ちなみにこのメソッド、GETでwebhook受けるようにしてると動かないので、
Twilioサーバーからのリクエストかを検査したい箇所は、全てPOSTで受ける必要があります。

RequestValidator::validateについて、
* 第１引数：固定
* 第２引数：webhookのurl 検査という意味だと固定値持たせた方が良いのかもしれないけど、受けたリクエストのURLを突っ込む
* 第３引数：POSTパラメータは全て渡す必要があるため、$_POSTで固定

実装自体はこれだけでOKなのですが、これをどこに置くのが良いか？
というのがこのページの主題です。

# バリデーションの置き場
## ミドルウェア
最初に思ったのはここ。
Twilioとやり取りするルーター定義に、ミドルウェアで設定して一律やったら楽じゃないかと。
設定はルーティングファイルに書けば良いから、バリデーション目的ならここでも構わなかったりする。
が、ここに書くとPOSTされたデータの吸い上げを、コントローラ側の各処理でやらないとイケないから、
それは案外イケてないのではないかと思って辞めました。

## バリデーション（独自ルール）
じゃあ、ということでバリデーションに実装することにしました。
独自のルールとして作るかなぁ、と。
これはあっさり辞めました。
だって、特定のデータに依存しないから。

## バリデーション（FormValidation::autorize）
で、辿り着いたのがここ。
Laravelの認可の標準的な考え方とはずれはするけど、
Twilioサーバーからのリクエストなら認可する、という考え方をするならここだな、と。
ここに置けば、コントローラに渡すRequestの属性値も同時に設定できるし、割とスマートかな、と。

```php:TwilioRequest.php

use Illuminate\Foundation\Http\FormRequest;
use Twilio\Security\RequestValidator;

class TwilioRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     * @throws \Exception
     */
    public function authorize()
    {
        $token = '12345';

        $validator = new RequestValidator($token);
        return $validator->validate($_SERVER['HTTP_X_TWILIO_SIGNATURE'], url()->current(), $_POST);
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'CallSid' => 'required',
            'Caller' => 'required',
            'Digits' => '',
            'From' => 'required',
            'To' => 'required',
        ];
    }
}

```

全容はこんな感じ。

rulesで返している値を見れば、コントローラ側でTwilioのどのパラメータを使っているか判るのがミソ。
使い方は、コントローラのメソッドの引数にこのクラスを書いとくだけ。
webhookで受けるメソッド全てに上記を設定しないといけないけど、
使用しているTwilioのパラメータが何か判ることの方がメリットが大きいと判断しました。

# おわりに
Twilioとのやり取りではなくて、
バリデーションの方法について記載してみました。
CSSのみでモーダルウィンドウを作る

<p class="codepen" data-height="450" data-theme-id="5973" data-default-tab="result" data-user="KazuyoshiGoto" data-slug-hash="eygjpV" style="height: 450px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Only Modal window">
  <span>See the Pen <a href="https://codepen.io/KazuyoshiGoto/pen/eygjpV">
  CSS Only Modal window</a> by Kazuyoshi Goto (<a href="https://codepen.io/KazuyoshiGoto">@KazuyoshiGoto</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

JSを使わないモーダルウィンドウの作り方。

## HTML

```html
<div class="modal">
  <input type="checkbox" class="modal-check" id="modal-check"/>
  <div class="modal-body">
    <div class="modal-window">
      <label class="modal-label" for="modal-check">閉じる</label>
      <div class="modal-inner">
        <div class="modal-content">
          モーダルウィンドウの中身
        </div>
      </div>
    </div>
  </div>
</div>
```
ポイントは2行目の `<input type="checkbox">` の位置。

`modal-body` と隣接する直前にチェックボックスを置くことで、 `.modal-check:checked + .modal-body` というCSSセレクタでチェックの有無による制御ができます。

チェックボックス本来の仕事をしないマークアップがあるのはどうなん？という議論はありますが今回は考えないことに。

## CSS

モーダルウィンドウを形成する部分は省き、表示の仕組みに関わる箇所を挙げます。

```css
.modal .modal-check:checked + .modal-body {
  animation: fadeout .2s 1 forwards, hide .1s .2s 1 forwards;
}
.modal .modal-check:checked + .modal-body .modal-window {
  animation: zoomout .2s 1 forwards;
}
```

上記HTMLの「閉じる」ボタンになる `<label>` をクリックすることで `.modal-check` にチェックが入り、それに隣接する `.modal-body` および `.modal-window` を消すためのCSSアニメーションを設定しています。

アニメーションさせない場合は下記のように `display:none` でバッサリ消しても良いです。

```css
.modal .modal-check:checked + .modal-body {
  display: none;
}
```

複数の `<label>` タグで一つのチェックボックスを参照できるので、サンプルの「Redisplay」のように他の箇所から再表示させることもできます。

## 補足

`visibility: hidden` によって表示上見えなくなっているだけでDOMには存在するので、気になる人はJS使って消しましょう。
PCでもスマホでも崩れないHTMLメールの作り方


通常のwebページを作る場合とは違って、タグの制限が多くて崩れやすいHTMLメール。
styleはインラインで書かなければならないし、flexboxもfloatも使えません（！）

今後のために、作り方と注意点のまとめです。


##基本設定
・基本的なレイアウトはtable組みで。
・Doctypeの宣言は4.01Transitional(strictだとtableが使えない）
・文字コードはiso-2022-jp、改行コードはCRLF（楽天のメルマガはShift_JIS、改行コードはCRLF）
・styleはインラインで書く(scssで書いてgulpでinline化する)
・画像に絶対パス、border: noneは必須


##注意点
・同じパスの画像は使い回しが出来ない
・背景カラーはOK、背景画像はoutlookで表示されないので使わない
・rgbaが有効じゃない環境があるので使わない(どうしても使う場合は#での指定も一緒にする）
・borderも描画されない環境があるので使わない（画像で対応）　
・imgタグにmarginは効かない
・div、p、aタグにpaddingは効かない


##scssで書いてinline化する
styleをinlineで書くのはとっても大変なので、
gulpを使って「scssで書いてinline化」します。
「gulp-inline-css」を「使えば、いつも通りscssで書いても大丈夫！
最終的にはinlineスタイルで書き出すことが出来ます。

「gulp-inline-css」はこちらから。
https://www.npmjs.com/package/gulp-inline-css

こちらの記事が参考になりました。ありがとうございます！
https://qiita.com/k-takam/items/1a58551868a453631bb9


##Outlookだけに対応させたい場合
Outlookでは、max-widthが使えないので、
幅を固定してあげる必要があります。

ただし、スマホで崩れずに表示させるためには
widthは100%、max-widthで最大幅を決めてあげたいですよね。
そんな時は条件付きコメントで対応させます。

例えばこんな感じで、

```html:html
<!--[if gte mso 9]>
	<table width="700" border="0" cellspacing="0" cellpadding="0">
<![endif]-->
```


gteは以上の意味で、「msoバージョン9以上に対応させる」となります。
gteの他に、lteは以下、ltは未満で条件を変更出来ます。

その他のバージョン-----------
Outlook 2000 - Version 9
Outlook 2002 - Version 10
Outlook 2003 - Version 11
Outlook 2007 - Version 12
Outlook 2010 - Version 14
Outlook 2013 - Version 15

 
##各メーラーでチェックする
各メーラーのチェックには「litmus」が便利。
https://litmus.com/pricing(有料）
確認用のデバイスがあれば、無料でメールを送ることも出来ます。
https://putsmail.com/history(無料）

Outlookはwordのレンダリングエンジンを使用していることから、
wordで確認することも出来ます。
https://support.microsoft.com/ja-jp/help/933793/outlook-2010-and-outlook-2007-use-only-word-as-the-email-editor
ただ、tableのborderがcssで制御出来なかったりしたので、
テスト確認位にしか使えなそうです。。

必ずメーラーでのチェックをしましょう！

##その他注意したいこと
各メーラーで表示されない場合に備えて、ブラウザ表示用のリンクを貼ると親切です。
ブラウザ表示用に、metaタグも必ず入れておきます。
ただし、楽天のメルマガではbody直下しか書けない、などの規約があるので
メルマガの規定を必ず確認すること！

おわり。
Bashコマンドラインの操作方法まとめ

Bashコマンドラインを操作するための基礎的なショートカット、コマンドをまとめました。
何か間違っている点や、これも便利だよ！みたいなのがあればコメントでお願いします。

## カーソル移動

| ショートカット  | 動作 |
|:--------:|:-------:|
| Ctrl + f | 右に移動する（→キーと同等） |
| Ctrl + b | 左に移動する（←キーと同等） |
| Ctrl + a | 行頭に移動する（Homeキーと同等） |
| Ctrl + e | 行末に移動する（Endキーと同等） |
| Alt + f  | 右の単語に移動する |
| Alt + b  | 左の単語に移動する |
| Ctrl + xx | 現在の位置を記憶し、前に記憶した位置に移動する |

## 文字の削除・切り取り・貼り付け

| ショートカット  | 動作 |
|:--------:|:----:|
| Ctrl + d | カーソル位置の文字を消す (Deleteキーと同等) |
| Ctrl + h | カーソル位置の前の文字を消す (Backspaceキーと同等) |
| Ctrl + w | カーソル位置の前にある単語を切り取る |
| Alt + d  | カーソル位置の次にある単語を切り取る |
| Ctrl + k | カーソル位置から行末までの文字を切り取る |
| Ctrl + u | カーソル位置の前から行頭までの文字を切り取る |
| Ctrl + y | 切り取った文字を貼り付ける |

## コマンド履歴

| ショートカット  | 動作 |
|:--------:|:----:|
| Ctrl + p | 前に実行したコマンドを表示する（↑キーと同等） |
| Ctrl + n | 次に実行したコマンドを表示する（↓キーと同等） |
| Ctrl + r | コマンド検索モードを開始する（インクリメンタルサーチ） |
| Alt + .  | 前に実行したコマンドの最後の単語を貼り付ける |

| コマンド           | 動作 |
|:----------------:|:----:|
| history | コマンドの実行履歴を表示する |
| !!      | 最後の実行したコマンドに展開される |
| !$      | 最後に実行したコマンドの最後の単語に展開される |
| ![数字]  | コマンドの実行履歴の[数字]番目のコマンドに展開される |
| ![文字列] | 最後に実行した[文字列]を含むコマンドに展開される |

## プロセス制御

| ショートカット  | 動作 |
|:--------:|:----:|
| Ctrl + c | フォアグラウンドで実行中のプロセスを終了する（SIGINTを送信） |
| Ctrl + z | フォアグラウンドで実行中のプロセスを一時停止する（SIGTSTPを送信） |

| コマンド           | 動作 |
|:----------------:|:----:|
| jobs             | 実行中のジョブ一覧を表示する |
| fg %[ジョブ番号]   | 停止しているジョブをフォアグラウンドで実行する<br>ジョブ番号を省略した場合はカレントジョブをフォアグラウンドで実行 |
| bg %[ジョブ番号]   | 停止しているジョブをバックグラウンドで実行する<br>ジョブ番号を省略した場合はカレントジョブをバックグラウンドで実行 |
| stop %[ジョブ番号] | バックグラウンドで実行しているジョブを一時停止する |
| kill %[ジョブ番号] | バックグラウンドで実行しているジョブを終了する |
| [コマンド] &       | コマンドをバックグラウンドで実行する |

## 入出力

| コマンド           | 動作 |
|:----------------:|:----:|
| [コマンド1] &#124; [コマンド2] | コマンド1の標準出力をコマンド2の標準入力に渡す |
| [コマンド] < [ファイル]   | ファイルの内容をコマンドの標準入力に渡す |
| [コマンド] > [ファイル]   | コマンドの標準出力をファイルに出力する |
| [コマンド] >> [ファイル]  | コマンドの標準出力をファイルに追記する |
| [コマンド] 2> [ファイル]  | コマンドの標準エラー出力をファイルに出力する |
| [コマンド] 2>&1         | コマンドの標準エラー出力を標準出力に出力する |
| [コマンド] &> [ファイル]  | コマンドの標準出力および標準エラー出力をファイルに出力する |
| [コマンド] > /dev/null  | コマンドの標準出力を表示しない |

## その他

| ショートカット  | 動作 |
|:--------:|:----:|
| Ctrl + l | ターミナルの表示をクリアする（`clear`コマンドと同等） |
| Ctrl + _ | 一つ前の動作を取り消す |
| Ctrl + / | 取り消した動作を元に戻す |
| Ctrl + j <br> Ctrl + m | コマンド実行（Enterキーと同等） |
| Ctrl + s | ターミナルへの出力を停止 |
| Ctrl + q | ターミナルへの出力を再開 |
| Tab      | ファイル名、ディレクトリ名、コマンドの補完 |

※`Alt + ◯`のショートカットは`Esc → ◯ （Escを押してから◯を押す）`で同様の動作をする
※`Esc`は`Ctrl + [`に置き換えることができる
Project Euler Q58 【螺旋素数】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
$1$から始めて, 以下のように反時計回りに数字を並べていくと, 辺の長さが$7$の渦巻きが形成される.

|<font color="red">37<font>|36|35|34|33|32|<font color="red">31</font>|
|:--|:--|:--|:--|:--|:--|:--|
|38|<font color="red">17<font>|16|15|14|<font color="red">13</font>|30|
|39|18|<font color="red">5</font>|4|<font color="red">3</font>|12|29|
|40|19|6|1|2|11|28|
|41|20|<font color="red">7</font>|8|9|10|27|
|42|21|22|23|24|25|26|
|<font color="red">43</font>|44|45|46|47|48|49|

面白いことに, 奇平方数が右下の対角線上に出現する. もっと面白いことには, 対角線上の$13$個の数字のうち, $8$個が素数である. ここで割合は$\frac{8}{13} ≈ 62\%$である.

渦巻きに新しい層を付け加えよう. すると辺の長さが$9$の渦巻きが出来る. 以下, この操作を繰り返していく. 対角線上の素数の割合が$10$%未満に落ちる最初の辺の長さを求めよ.

## アプローチ
$2～9$を$1$層目、$10～25$を$2$層目(以下同様)とする。
$1$から見て右上、右下、左上、左下方向にあらわれる数字をそれぞれ考える。
$m$を$1$以上の整数とし、いま$m$層目まで巻いているとする。

1.右上方向
あらわれる数字は$3,13,31,57,...$
階差数列は$10,18,26,...$
階差数列は初項$10$,公差$8$の等差数列であり、$k$を$1$以上の整数としたとき、一般項$b_k$は
$b_k=8k+2$
である。
よって右上方向に現れる数字の一般項$a_n$は、$n$が$2$以上の整数とすると

```math
a_n=3+\sum_{k=1}^{n-1}(8k+2)=4n^2-2n+1
```

となる。
これは$n=1$のときにも成り立つ為、$n=m$としてよい。
つまり、$m$層目の右上の値は$4m^2-2m+1$である。

2.右下方向
上記と同様にして、$a_m=4m^2+4m+1$を得る。

3.左上方向
上記と同様にして、$a_m=4m^2+1$を得る。

4.左下方向
上記と同様にして、$a_m=4m^2+2m+1$を得る。

$m$層目での対角線上の値の数は$1+4m$個である。

$m$層目の辺の長さは$2m+1$である。


## 解答

```bash
time seq 99999 |
awk '{print 4*$1^2-2*$1+1,4*$1^2+4*$1+1,4*$1^2+1,4*$1^2+2*$1+1}' |
factor |
awk '{print NF==2}' |
paste -d" " - - - - |
awk '{for(i=1;i<=4;i++){s+=$i};print s/(1+4*NR)}' |
awk '$1<0.1{print 2*NR+1}' |
head -1
26241

real    0m0.249s
user    0m0.449s
sys     0m0.020s
```

`factor`で縦一列になってしまったのを$4$つずつに並べる方法がいい方法がなかった。
最近までは`xargs -n4`を使用していたが、これは(おそらく)`echo`をたくさん呼び出すので遅くなってしまう。
`paste`でできることを最近知ったが、これが$10$個ずつとかになると面倒なので何かいい方法を探したい。

## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/058.html
IP取得

#ipアドレス取得

```javascript
//クライアントipをチェックするための関数
function ipchecker(req){

    var ip ='192.168.0.4.';
    var pointer = 0;
    if(req.headers['x-forwarded-for']) {
      if(req.headers['x-forwarded-for'].indexOf(ip)>-1){
        pointer = req.headers['x-forwarded-for'].indexOf(ip);
        ip = req.headers['x-forwarded-for'].slice(pointer);
        console.log("1mid");
        return ip;
      }
      console.log("1out");
      return req.headers['x-forwarded-for'];
    }

    if(req.connection && req.connection.remoteAddress) {
      if(req.connection.remoteAddress.indexOf(ip)>-1){
        pointer = req.connection.remoteAddress.indexOf(ip);
        console.log(ip);
        ip = req.connection.remoteAddress.slice(pointer);
        console.log("2mid");
        return ip;
      }
      console.log("2out");
      return req.connection.remoteAddress;
    }

    if(req.connection.socket && req.connection.socket.remoteAddress) {
      if(req.connection.socket.remoteAddress.indexOf(ip)>-1){
        pointer = req.connection.socket.remoteAddress.indexOf(ip);
        ip = req.connection.socket.remoteAddress.slice(pointer);
        console.log("3mid");
        return ip;
      }
      console.log("3out");
      return req.connection.socket.remoteAddress;
    }

    if(req.socket && req.socket.remoteAddress) {
     if(req.socket.remoteAddress.indexOf(ip)>-1){
      pointer = req.socket.remoteAddress.indexOf(ip);
      ip = req.socket.remoteAddress.slice(pointer);
      console.log("4mid");
      return ip;
    }
    console.log("4out");  
    return req.socket.remoteAddress;
  }


  return '0.0.0.0';
}
```
C++ Builder 10.2 Tokyo > IDE > Bug > デザイン > 複数のコンポーネントのプロパティを順番に変更する > 最初の変換文字を落とす不具合

```txt:動作環境
RAD Studio 10.2 Tokyo Update 2
RAD Studio 10.2 Tokyo Update 3
```

[C++ Builder XE4 > IDE > 複数のコンポーネントのプロパティを順番に変更する](https://qiita.com/7of9/items/d2b3f712c9c778821277)
の作業を10.2 Tokyoで試してみた。

### 症状1

以下が分かった。

- 英数字入力に問題ない
- 漢字入力時、最初の入力を落とす (不具合)
    - 例として「Kanji」を入力した場合に「anji」の変換になってしまう

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/9144e98f-081c-148e-00de-f40fc8cb07ee.png)

上記を入力しようとしたものが以下となる。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/c97b14e0-242b-2e50-0ec7-7a2d5d873c61.png)



漢字変換のみの問題のため、英数値のプロパティ変更作業には支障はない。

漢字を使う場合は「クイック編集」を使うことで上記の問題の回避はできるかもしれない。

### 症状2

オブジェクトインスペクタの検索機能は上記の連続編集と組み合わせて使用できない。

(Captionなどのキーワードで)検索機能を使った場合、一つのコンポーネント編集後に検索がクリアされる。Captionを編集しようとしていて、次のコンポーネントではActionの編集になってしまう。
glueのpysparkスクリプトでscala製のjarを動かす

比較的に特殊な状況について紹介します。
話題は２つ:

- pyspark経由でどうやってscala製のjarを動かすのか
- glueのpysparkスクリプトではどうやってs3のパスを変数として渡して、glue外の機能を使ってS3に出力させるのか

# pyspark経由でscala製のjarを動かす

この人のブログを見てください。
[Spark - Calling Scala code from PySpark](http://aseigneurin.github.io/2016/09/01/spark-calling-scala-code-from-pyspark.html)

要点だけつまんで云うと

### 手順
- pysparkやspark-shellの実行時に`--jar`でjarファイルを指定していれば、該当クラスが`sc._jvm`に入る
- `sc._jvm.MainClassName.MethodName(*args)`でjarライブラリー内のメソッドを呼べる

### 注意点
自分はここらへんの素人なので、元ブログを読むことをおすすめします。

- `Py4J`経由でやっているので、java経由でやり取りしている。その為、一部そのまま対応しないクラスが存在する。
    - python側でsparkのオブジェクトを変数として渡したい時に、一旦javaのオブジェクトにunwrapしてから渡そう
    - scala側でインタフェースを用意して、受け取ったjavaのオブジェクトをscalaの該当ものにwrapしてからジョブを実行しよう
- jarに`main()`を定義しているのならこの方法で呼べない可能性がある?
    - 何パターンかを試してたのですが、基本的にエラー終了しているので。純粋にコールの仕方が違ってたかもしれません。

# DynamicFrameを使わずにS3に出力する

仕事上は元々

S3入力パス ----(Data Pipeline + EMR + jar in scala)----> S3出力パス
的なことをやってました。

とりあえず同じjarファイルを使って、glueで同じことをしたいですね。

### jarファイルの指定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/167601/cfd2bbbf-c434-df6e-3048-cee657f30793.png)

Dependent jars pathにそのままjarファイルを指定しました。

### スクリプトファイル

使ったものはこういう感じです。

```python
import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

## @params: [JOB_NAME]
args = getResolvedOptions(sys.argv, ['JOB_NAME'])

sc = SparkContext()
glueContext = GlueContext(sc)
job = Job(glueContext)
job.init(args['JOB_NAME'], args)

sc._jsc.hadoopConfiguration().set("mapred.output.committer.class", "org.apache.hadoop.mapred.FileOutputCommitter")

sc._jvm.MainClassName.MethodName("S3 input path", "S3 output path")

job.commit()
```

### 注意点
```
sc._jsc.hadoopConfiguration().set("mapred.output.committer.class", "org.apache.hadoop.mapred.FileOutputCommitter")
```
↑これですけど、[ここを参照しました](https://forums.aws.amazon.com/thread.jspa?messageID=801612&tstart=0)。

そうしないと`Class org.apache.hadoop.mapred.DirectOutputCommitter not found`というエラーでジョブが失敗するためです。

本当はscalaのソースを書き換えて、そのままdataframeを返してくれれば、↓でDynamicFrameに変換することができて、DynamicFrameの仕様に乗ってすんなりS3に出力できるはずです。

```python
new_df = DynamicFrame.fromDF(result_data_frame, glueContext, "new_df")
```
英語でのコメントの書き方メモ

#はじめに
プログラムのコメントは基本的に英語で書いている為、
自分にメモの作成

#クラスヘッダーコメント
##情報を保持する系のクラス
```
/**
 * This class is used to hold the ***.
 */
```
##提供する系のクラス
```
/**
 * Provides ***.
 */
```
##インターフェースクラス
```
/**
 * Defines a *** interface.
 * That any implementation of this interface can be used by inheritor's to handle a ***.
 */
```

#メソッドコメント
##フラグ設定関係
```
/**
 * Sets flag indicating whether *** is ***.
 */
```
##判定関係
```
/**
 * Determines if *** is *** or not.
 *
 * @return Returns {@code true} if *** is ***, {@code false} otherwise.
 */
```
##判定関係2
```
/**
 * Checks whether the given *** can be ***.
 *
 * @return Returns {@code true} if the given *** can be ***, {@code false} if they cannot be ***.
 */
```
##何かを取得する関係
```
/**
 * Gets the *** with the given {@code ***}.
 *
 * @return Returns the ***. Returns {@code null} if *** doesn't have a specified ***.
 */
```

#その他
##enum系
```
/**
 * Enumeration for ***.
 */
```
pythonでスクレイピングをやってみる -システムトレードへの道-

まずスクレイピングをやってみようと思います。スクレイピングとは「web上の情報を抽出する」ことです。株価のデータを取得するために必要なことですね。

##目標
[はてな](http://www.hatena.ne.jp/)のサイトにアクセスして、タイトルの「はてな」を抽出する。

##開発環境
- Windows7 32bit
- Python 3.6.1
- Anaconda 4.4.0
- beautifulsoup4 4.6.0

##ソース

```
# -*- coding: utf-8 -*-
"""
Spyderエディタ

これは一時的なスクリプトファイルです
"""
# 使用するライブラリ urllib.request , bs4 をインポートする
import urllib.request
import bs4

# アクセスするURL
url = "http://www.hatena.ne.jp/"

# URL先のhtmlを格納する
html = urllib.request.urlopen(url)

# htmlをBeautifulSoupで扱う
soup = bs4.BeautifulSoup(html, "html.parser")

# タイトルを取得する → <title>はてな</title>
title_tag = soup.title

# 要素の文字列を取得する → はてな
title = title_tag.string

# タイトルを文字列を出力
print (title)
```

##urllib.requst
URLを開くために必要なライブラリです。これをインポートしましょう。詳細はこちら([urllib.requst](https://docs.python.jp/3.6/library/urllib.request.html?highlight=urllib))に書いてあります。

``` 
import urllib.request
```

##beautifulsoup4
これもAnacondaに入ってます。HTMLやXMLからデータを取得するのに必要なライブラリです。これをインポートしましょう。詳細はこちら([urllib.requst](https://docs.python.jp/3.6/library/urllib.request.html?highlight=urllib))に書いてあります。

``` 
import bs4
```

##ソースの説明
```
url = "http://www.hatena.ne.jp/"
```
「はてな」のURLです。ここにアクセスしたいサイトのURLを入れます。

```
html = urllib.request.urlopen(url)
```
指定されたURLを開き、そのHTMLを取得します。HTMLってどんなものかわかりにくいと思いますので、http://kondou.com/BS4/ を参照下さい。クイックスタートに書いてある html_doc が今回の html に該当します。


```
soup = bs4.BeautifulSoup(html, "html.parser")
```
先程のhtmlを細かくタグごとに分けてくれます。parserというのはhtmlを解析するということなので、タグごとに分けてくれるのかなと思います。

```
title_tag = soup.title
```
これは\<title>タグを抜き出しています。今回の場合は
title_tag = \<title>はてな\</title>
となります。

```
title = title_tag.string
```
先程の「はてな」だけを抜き取ります。


##最後に
本日会社の合間に始めたのでまだまだ時間がかかりそうですが、地道にやっていきます。プログラム初心者なので間違っているところなどあればご指導頂けると幸いです。
シェル・シェルスクリプト(Linux)~基礎のメモ書き~

# シェルとは何か
・シェルとは
>入力されたコマンドを解釈し、Linuxカーネルへと受け渡してくれる子。
<details><summary>カーネルってなに</summary>アプリケーションとハードウェアの橋渡しを行う役割を持っていて、シェルから命令を受け取りOSの核となる部部分に対してコマンドを実行する子。</details>

![image.png](https://qiita-image-store.s3.amazonaws.com/0/147613/53ab38d0-88ed-5150-44f5-0ba92b1d787d.png)

・シェルには色々な種類がある
>Linuxではシェルの選択が可能。（Linuxではbashというシェルが標準的に使われいる）
シェルには様々な種類があり，好みに応じて使い分けることができる。どんなシェルがあるのかは，/etc/shellsファイルを開いてみると見ることが出来る。

・現在使っているシェルを確認

    echo $SHELL

# シェルスクリプトとは何か
・シェルスクリプトとは
>シェルのコマンドをあらかじめ記述しておくファイルのこと

![image.png](https://qiita-image-store.s3.amazonaws.com/0/147613/cdb5d5f2-a829-72ef-23a5-c85817eb5276.png)


・実行するには

>ファイルを作成する
<details><summary>ファイルの拡張子について</summary>スクリプトであることを示すために慣習的に.shとつけている。.bashだったり、拡張子をつけてなくても実行できる。
</details>
   
    vi hello.sh
>スクリプトを記述・・・コマンドラインに入力するコマンドがそのまま書かれている
<details><summary>#!/bin/bashってなに</summary>shebang（シバン）と呼ばれるもので、「bashで動作するぞ！」という印。ファイルの１行目に「#!」を書きその後ろにシェルのフルパス、今回は「/bin/bash」を記述する。
</details>

    #!/bin/bash
    echo 'hello, world!'




>出来た！実行！としたいが
ファイル作成時にはファイルの実行権限がない
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147613/5576d678-5a49-8764-38db-49a48d75e7eb.png)
ユーザーにファイルの実行権限を与えたい


    chmod u+x hello.sh
>ユーザーに実行権限を与えられた
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147613/58b4c542-003a-a78e-ac6f-9601de12f9bd.png)

・シェルスクリプトを実行するコマンド
>作成したシェルスクリプトを実行する
ここでは./でカンレントディレクトリのシェルスクリプトを実行することを明示している
<details><summary>カレントディレクトリってなに</summary>現在作業中のディレクトリのこと</details>


    ./hello.sh
>実行できた
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147613/e5318471-4d69-4378-50fd-747725178e80.png)

<br><br><br>



〜〜今回はここまで、続きはまた〜〜
webサーバーを動かす監視ツール絡みでSELinuxに怒られた話

ちょっと自前の色々動かしているマシンAで検証してたgitlabを専用のマシンBで動かそうとしたときにSELinux絡みで色々ハマった話。
プロセス監視ツールでそういうことあるもんなんですね。

## 環境について

### マシンAについて

* CentOS 7.2.1511
* supervisorでプロセス監視
* rundeckやらgitbucketやらjenkinsやら色々動かしてる
* SELinuxはEnforcingで稼働、特に設定はいじってない

### マシンBについて

* CentOS 7.4.1708
* systemdでプロセス監視
* 1からセットアップ、nginxとdocker, docker-compose以外には入れてない

## ハマった事象について

マシンBでセットアップした際、nginxからdocker内のgitlabへupstreamを行う際にSELinuxがカンカンになった。

```
type=AVC msg=audit(1514365997.822:555): avc:  denied  { name_connect } for  pid=1903 comm="nginx" dest=8088 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:unreserved_port_t:s0 tclass=tcp_socket
type=SYSCALL msg=audit(1514365997.822:555): arch=c000003e syscall=42 success=no exit=-13 a0=d a1=55af561b1f20 a2=10 a3=7ffe38ce41d0 items=0 ppid=1902 pid=1903 auid=4294967295 uid=998 gid=994 euid=998 suid=998 fsuid=998 egid=994 sgid=994 fsgid=994 tty=(none) ses=4294967295 comm="nginx" exe="/usr/sbin/nginx" subj=system_u:system_r:httpd_t:s0 key=(null)
```

検証機を用意してsetools-consoleをインストールして状況を確認すると以下の塩梅だった。httpd_can_network_connectが原因で蹴られている。

```
[test@localhost ~]$ sesearch -A -C -s httpd_t -t unreserved_port_t -c tcp_socket
Found 5 semantic av rules:
   allow httpd_t port_type : tcp_socket { recv_msg send_msg } ;
DT allow httpd_t port_type : tcp_socket name_connect ; [ httpd_can_network_connect ]
DT allow nsswitch_domain unreserved_port_t : tcp_socket name_connect ; [ nis_enabled ]
DT allow nsswitch_domain unreserved_port_t : tcp_socket name_bind ; [ nis_enabled ]
DT allow nsswitch_domain port_type : tcp_socket { recv_msg send_msg } ; [ nis_enabled ]
```

これ自体は`setsebool httpd_can_network_connect on -P`で対応出来た。
だが色々やってるマシンAではこんな設定入れてない。何故動く？

## 解決

マシンAとBでプロセスのセキュリティコンテキストを見比べたら分かった。supervisorで動かした場合とsystemdで動かした場合でプロセスのタイプの部分が異なる。

```:マシンA抜粋
[test@localhost ~]$ ps auxeZ | grep nginx
system_u:system_r:unconfined_service_t:s0 root 3990 0.0  0.0 46100 3668 ?      S    18:03   0:00 nginx: master process /usr/sbin/nginx
system_u:system_r:unconfined_service_t:s0 nginx 3992 0.0  0.0 46676 3492 ?     S    18:03   0:00 nginx: worker process
```

```:マシンB抜粋
[test@localhost ~]$ ps auxeZ | grep nginx
system_u:system_r:httpd_t:s0    root      1902  0.0  0.0  46308  1004 ?        Ss   12:05   0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
system_u:system_r:httpd_t:s0    nginx     1903  0.0  0.0  46892  3488 ?        S    12:05   0:00 nginx: worker process
```

unconfined、ということでsesearchの結果を見ても一切制約がかかってないのが分かる。
それゆえに成功していたということだが、むしろこっちの方が悪くないか……？実質SELinuxをdisabledで稼働させてるのと大差ない
setseboolで個別に許可出すのが最適解なんだろうか。

```
[test@localhost ~]$ sesearch -A -C -s unconfined_service_t -t unreserved_port_t -c tcp_socket
Found 1 semantic av rules:
   allow corenet_unconfined_type port_type : tcp_socket { recv_msg send_msg name_bind name_connect } ;
```

supervisorの下で動かす際のSELinuxのプロセスタイプをどうすりゃ設定出来るのかは結局分からなかった。
ネットのブログだの見ると`setenforce 0`する、なんて記述があり溢れてるしみんなそういうところは気にしないもんなんだろうか？
Vagrantをプロキシ下で動かす


環境は windows です
事前にプロキシの設定をしておくだけ
設定の仕方もハマった、ダブルクオーテーションいらないし、httpとかもいらない

set http_proxy={host}:{port}
set https_proxy={host}:{port}

以下は自分用
set http_proxy=proxy.XXXX.co.jp:8000
set https_proxy=proxy.XXXX.co.jp:8000

vagrant box add centos6 https://github.com/hogehoge
brew bundleでMacのアプリをまとめてインストール・管理

AnsibleでMacのアプリをインストールしたり、管理したりしたが、便利な `brew bundle` コマンドを発見した。
新人のMacの開発環境準備や、自分のMacを変えたり、リセットしたりするときにも楽勝。

# Brewfile

Brewfile を用意して、`brew bundle`を実行すると、アプリを一括インストールできる。

```Brewfile
# Brewfile
cask_args appdir: "/Applications"
tap "caskroom/cask"
tap "homebrew/bundle"
tap "homebrew/core"

cask "google-chrome"
cask "slack"
cask "github"
brew "git"
brew "vim"
brew "zsh"
brew "zsh-completions"
cask "iterm2"
cask "atom"
cask "jetbrains-toolbox"

brew "docker"
cask "docker"
```

さらに、

- `brew bundle cleanup` でBrewfileに入っていないアプリを削除
- `brew bundle dump` でBrewfileにインストール済みアプリのリストを出力
- `--global`オプションで ~/.Brewfile を利用

などができます。

# Mac引っ越しの流れ

## 引越し元Macで

```
cp ~/.Brewfile ~/.Brewfile.bak
brew bundle dump --global --force
gist ~/.Brewfile
```

すると Brewfile が https://gist.github.com/1d0a1d21c58314d4d4546570c3ac77f8 のような URL に保存される。

## 引越し先Macで

- 先に保存した Brewfile をダウンロードし、~/.Brewfile に保存
- brew をインストール
- `brew bundle --global` を実行

# Macアプリ整理の流れ

いつの間にか要らなくなったアプリが増えていませんか？

まず、インストールされているアプリのリストアップ

```
cp ~/.Brewfile ~/.Brewfile.bak
brew bundle dump --global --force
```

次に、エディターで ~/.Brewfile から要らなくなったアプリの行を削除

```
vim ~/.Brewfile
```

いざ、不要アプリの削除を実行！

```
brew bundle cleanup --global --force
```

# アプリの一括更新

```
brew upgrade
```

# 参考

- [Homebrew使い方まとめ](https://qiita.com/vintersnow/items/fca0be79cdc28bd2f5e4): brewのインストールと使いかた
- [Install dev tools for Mac](https://github.com/vochicong/dev-env/tree/master/mac#install-dev-tools-for-mac): RailsやNLPツールをMacにインストール
AWSのUserDataでRHEL起動時にサブスクリプションを自動で追加する

OpenShiftをインストールするときなど、RHEL起動時に`subscription-manager`でシステム登録して、さらにサブスクリプションをアタッチして…という作業が面倒。

`cloud-init`で起動時に自動でサブスクリプションを追加したい。

## cloud-initのrh_subscriptionモジュール

というものがRHEL7.4のcloud-initから使用できます。

http://cloudinit.readthedocs.io/en/latest/topics/modules.html#redhat-subscription

これをUserDataに設定することで起動と同時にシステムを登録してサブスクリプションを追加できます。

## rh_subscriptionをUserDataに設定する

以下の内容をUserDataに設定して、RHEL7.4のインスタンスを起動します。

```yaml
#cloud-config
rh_subscription:
  username: 'xxx@example.com' # RHNのユーザー名
  password: 'xxxxx' # RHNのパスワード
  auto-attach: False # 適切っぽいサブスクリプションを自動的に追加するかどうか
  add-pool: [ 'xxxxxxxxx' ] # 追加したいサブスクリプションのPool ID
```

![rhel-sb-screen.png](https://qiita-image-store.s3.amazonaws.com/0/91422/03a8da3b-e567-ec5b-bf42-2a6fcc521346.png "rhel-sb-screen.png")


## rh_subscriptionのオプション詳細

http://cloudinit.readthedocs.io/en/latest/topics/examples.html#register-redhat-subscription

より。

```yaml
#cloud-config

# RHELベースのOSを登録します。
#
# このcloud-initプラグインではユーザー名/パスワードまたはアクティベーションでシステムを登録することができます。
# また、登録に成功した後、以下のことも可能です:
#  - サブスクリプションのauto-attach
#  - service levelの設定
#  - pool IDを明示してサブスクリプションを追加
#  - repo idでyumリポジトリを有効化する
#  - repo idでyumリポジトリを無効化する
#  - /etc/rhsm/rhs.confのrhsm_baseurlとserver-hostnameを変更する


rh_subscription:
    username: joe@foo.bar

    ## 記号を安全に使いたい場合はクォートで囲んでください
    password: '1234abcd'

    ## ユーザー名とパスワードの代わりに、組織とアクティベーションキーを使うこともできます。
    ## その場合、ユーザー名とパスワードをコメントアウトしてください。
    #activation-key: foobar
    #org: 12345

    ## サブスクリプションをシステムにauto-attachする場合はコメントアウトを外します 
    #auto-attach: True

    ## サブスクリプションのサービスレベルを指定する場合はコメントアウトを外します
    ## (訳注: auto-attachの際に適切なサブスクリプションをフィルタリングするのに使用します)
    #service-level: self-support

    ## poolを追加するにはコメントアウトを外します(PoolIDのリストで指定する)
    #add-pool: []

    ## yumレポジトリを追加したり削除したりするにはコメントアウトを外します(repo-idのリストで指定する)
    ## (訳注: なお、以下のようにアスタリスクも指定できるようです。 disable-repo: [ '*' ])
    #enable-repo: []
    #disable-repo: []

    ## /etc/rhsm/rhsm.confのbaseurlを変更するにはコメントアウトを外します
    #rhsm-baseurl: http://url

    ## /etc/rhsm/rhsm.confのサーバーホスト名を変更するにはコメントアウトを外します
    #server-hostname: foo.bar.com
```