OmniAICreator/Qiita-1.07M huggingface dataset:
Python カードを裏返せ

#問題
1 ~ 100までの番号が書かれた100枚のカードが順番に並べられています。
最初、全てのカードは裏返しの状態で置かれています。
ある人が2番のカードから、1枚おきにカードを裏返していきます。
すると、2, 4, 6,・・・, 100番のカードが表を向くようになります。
次に、別の人が、3番のカードから2枚おきにカードを裏返していきます。
（裏向きのカードは表を向き、表を向いているカードは裏返されます。）
また、次の人が、4番のカードから3枚おきに、カードを裏返していきます。
このようにn番目のカードからn - 1枚おきにカードを裏返す操作を、
どのカードも向きも変わらなくなるまで続けたとします。

カードの向きが変わらなくなった時、
裏向きになっているカードの番号をすべて求めてください。

```カードを裏返すイメージ.
| | | | | | | | | |・・・
   ↓   ↓   ↓   ↓
| |2| |4| |6| |8| |・・・
     ↓     ↓     ↓
| |2|3|4| | | |8|9|・・・
       ↓       ↓
| |2|3| | | | | |9|・・・
```

> 引用「プログラマ脳を鍛える数学パズル　著者 増井 敏克」


#回答
```answer_1.py
n = 100
cards = [False] * n

for i in range(2, 101):
    j = i - 1
    while j < n:
        cards[j] = not cards[j]
        j += i

for i in range(n):
 if not cards[i]:
     print(i + 1)
```

```answer_2.py
for i in range(1, 101):
    flag = False
    for j in range(1, 101):
        if i % j == 0:
            flag = not flag
    if flag:
        print(i)
```

#つまづいたところ
今までと比べるとスムーズに解くことができました。
強いて申し上げるなら、この書籍の回答ではrubyで書かれていたのですが、
その中の`!cards[j]`の意味を調べるのに時間がかかりました。
「ビックリマーク」とか「おったまげンションマーク」としか知らなかったのですが、
「感嘆符（かんたんふ）」もしくは「エクスクラメーションマーク」というんですね。
なんだ、「おったまげンションマーク」って笑

話がそれてしまいましたが、
この`!cards[j]`の`!`は否定（not）を表していることがわかりました。
pythonではrubyのように感嘆符 + 変数名では書けない※ので、
これをpython形式に書き換えます。
その形が`not cards[j]`です。
※2分ぐらいしかググっておりません。誤っているようでしたらお申し付けください。

もともとこの`cards`には`false`が100個入っています。
カードが裏返っている状態を`false`として表しているので、
`true`が表向きの状態となりますね。
その`false`をwhile文の中で`not`を使い、
`false`から`true`にしたり、`true`から`false`にしています。
プログラム中の最後に裏向きのカードを出力するようにしているので、
`if not cards[i]:    print(i + 1)`という書き方になります。

さて、この`answer_1.py`からこの問題の答えが出ましたが、
書籍中にも書かれておりますポイントがこの問題にはあります。
それは、
> 左から順番に処理をするということは、
「すでに通過した部分については反転しない」と言い換えることができます。
引用「プログラマ脳を鍛える数学パズル　著者 増井 敏克」

ということだそうです。
それを踏まえて書き直したのが`answer_2.py`になります。

どういう風に`true`と`false`を繰り返しているのかというと、
ここですね。`if i % j == 0:    flag = not flag`
解説はぜひこの著書を読んで欲しいのと、
数学的な部分が関わり私では説明できないので割愛しますが、
「平方数」やら「約数」やらが関わっているそうです。

それでは以上になります。
今回もご拝読ありがとうございました。
nginxの特徴についてまとめてみた

すぐ忘れちゃうので自分用のメモ。
nginxはエンジンエックスと読むそうです。

#特徴
###NGINX
・Workerプロセスによるシングルスレッドの処理
　＃Workerプロセスは複数起動できる。デフォルトでは、
　　autoになっておりCPUコアの数だけ起動する。

・MasterプロセスがWorkerプロセスを管理
・リクエストを非同期で処理する

###Apache
比較のために記載。
・preforkにしろworkerにしろ、１リクエスト毎に
　プロセスまたはスレッドを立ち上げる
・リクエストの同期処理


##結論
・軽量な静的コンテンツの配信であれば、NGINXで高速化が期待できる。
　＃動画とかは苦手です。

・非同期処理のため、遅い処理があっても引きずられてほかのリクエストが
　遅くなることがない。

・アプリケーション実行やDB処理がある場合は、Apacheを利用するか、
　別サーバに重い処理をさせ、NGINXはリバプロとして利用することが望ましい。
　＃重い処理をNGINXにさせると非同期処理によってキューがどんどんたまってしまいます。

・リバプロでキャッシュや負荷分散するのに優れている。
TemplateタグがIEで動かない時

TemplateタグがIEで動かない時の書き換え方法についてです。

## 元のコードサンプル

templateメソッドを利用してJavaScriptではそれをimportNodeをしてNodeをコピーしています。

```html:htmlファイル
<body>
    <a href='#' onclick='listRefresh();'>リスト更新</a>
    <div id='example'>
        <ul>
        </ul>
    </div>
    <template id="test_template">
        <li class="item" >
            <p class="text">
                <span class="name"></span>
                <span class="address"></span>
            </p>
        </li>
    </template>
</body>
<script src="./template.js"></script>

```

```javascript:jsファイル
let listRefresh = function() {

    let json = [
            { name: "鈴木 太郎", address: "東京都千代田区1-1"},
            { name: "山田 花子", address: "大阪府大阪市1-1"}
    ];

    let template = document.getElementById('test_template');

    let example = document.getElementById('example').querySelector('ul');
    example.textContent = null;

    json.forEach((val) => {
        let clone = document.importNode(template.content, true);
        clone.querySelector('li.item p.text span.name').textContent = val.name;
        clone.querySelector('li.item p.text span.address').textContent = val.address;
        example.appendChild(clone);
    });
}
```

この方法だとモダンなブラウザ（Chormeなど）では動作するのですが、IEだと`importNode`やそもそもHTMLの`templateタグ`でエラーが発生して動きません。
また、IEの場合templateタグの中はそのまま表示されてしまう状態です。

なので以下のように書き換えてあげれば良いのかなと思います。

## 改善後

### ポイント
* templateタグ  
 templateタグは`<script type="text/template">`に置き換えます
* importNode  
 importNodeについては、新しくファンクションを作成してその中でinnerHTMLをコピーして新しくNodeを作成して返却するという流れになります。

### コード

```html:htmlファイル
<body>
    <a href='#' onclick='listRefresh();'>リスト更新</a>
    <div id='example'>
        <ul>
        </ul>
    </div>
    <script id="test_template" type="text/template">
        <li class="item" >
            <p class="text">
                <span class="name"></span>
                <span class="address"></span>
            </p>
        </li>
    </script>
</body>
<script src="./template2.js"></script>
```

```javascript:jsファイル
let listRefresh = function() {

    let json = [
            { name: "鈴木 太郎", address: "東京都千代田区1-1"},
            { name: "山田 花子", address: "大阪府大阪市1-1"}
    ];

    let template = document.getElementById('test_template');

    let example = document.getElementById('example').querySelector('ul');
    example.textContent = null;

    json.forEach((val) => {
        let clone = getCloneNode(template);
        clone.querySelector('li.item p.text span.name').textContent = val.name;
        clone.querySelector('li.item p.text span.address').textContent = val.address;
        example.appendChild(clone);
    });
}

let getCloneNode = function(source) {
    let clone = document.createElement('div');
    clone.innerHTML = source.innerHTML;
    return clone;
}
```

これで無事IEでもtemplateが利用できるようになります。
僕たちがテスト駆動開発をする理由

**追記(2019/11/2)**
今回の記事で深く扱えなかったリファクタリングに関する記事を書きました。
[「汚いコード、綺麗なコードって何？」リファクタリングを考えてみる](https://qiita.com/yuno_miyako/items/dd0a2d91bb96d1ce2630)

# テスト駆動開発とは
テスト駆動開発とは、**「テスト => 実装 => リファクタリング」**という流れを何回も何回も繰り返してプロダクトを成長させていく開発手法です。
もう少し詳しく説明します。次の３段階を繰り返します。

### 1. テストケースを考えるフェーズ

これは設計を考えることに等しいフェーズです。このオブジェクトがどんな機能を持っていて欲しいか、どういう風に使われるか、そしてその時にどんな結果を返して欲しいか、という思いをテストケースに込めます。
重要なのはこの時に実装のことは一切考えず、**どう使われるかを考える**ことです。

### 2. 実装するフェーズ

テストをパスするためだけの最低限度の実装をします。この時も抽象化やキレイなコードなどを考えてはいけないのがルールで、とにかく１で書いた**テストを通すことだけを考えて実装**します。
極端にいうと　`sum(1,1) => 2` というテストを通したい時にはsumの実装はただ2を返すだけのメソッドにしてもいいわけです。

### 3. リファクタリングするフェーズ
２のフェーズで犯した罪を償うフェーズです。抽象化できるところを抽象化したり、酷い変数名を直したり、コピペしたところをメソッド化したりします。
この時のポイントは１箇所直したらすぐにテストを実行して、**テストがパスすることを確かめながらリファクタリングをする**ことです。これによって振る舞いが変わっていないことを確かめながらコードをリファクタリングすることができます。

## なぜテスト駆動開発をするのか？
かなり異質な開発手法なので、初見の人にとってはかなりとっつきにくいというか、なんでそんなことをするのだろう？という風に思われると思います。

しかしテスト駆動開発はアジャイル開発の基本的スタイルであり、一度やり方に慣れてしまえば**むしろ「なぜテスト駆動でやらないのか？」という風に思うようになります**。
今回の記事では、なぜテスト駆動開発をやるのかという理由を言語化してみて、その中でも**自分が重要だと思った４つ**を紹介したいと思います。

### １、高い品質でプロダクトを作ることができる
一番わかりやすいのはこれだと思います。
テストを書いてから実装をするので、一般的にテスト駆動開発のテストカバレッジは**100%に近い値**になります(リファクタリング時にメソッド切り出しなどをするとそこがテストされないことがあり得ます）。
それだけでなく、**テストを書くフェーズでバグのことを考える**ことができるのも品質を向上させることに一助しています。テストを書くというのは利用時のことを考えることになるので、「もしここの値がnullだったらエラーを返して欲しいな」など**利用時に起こりうるエッジケースの発想が湧きやすくなります**。結果的に早い段階でエラーケースをカバーできることがあります。


### ２、必要なものを必要なだけ実装できる
実装フェーズでは、現在パスしていないテストをパスすることだけを考えるので、**テストケースに表現されていない仕様は実装しません**。
テストを書かずに実装から始めると、よくあるのは過度な抽象化をしてしまうことがあります。もしかしたら今後使うかもしれない、と思って余計な機能を足してしまい、結果使われなかったということがよくあります。
**余計な機能を書いてしまうというのはコードの可読性を下げるだけでなく、バグを生み出しやすい原因になります**。
実装しすぎも悪いですが、当然実装しなさすぎ(仕様漏れ)もよくありません。テストケースでしっかりと仕様が表現できていれば、**実装側はテストとシンクロしているので仕様を全て満たしていることが確認できます**。理想は仕様書のドキュメントを書かず、テストを仕様書にすることです。仕様書のドキュメントに書かれているけど実装されていない、のようなギャップは、テストそのものを仕様書だとした時には絶対に起こりえません。

### ３、リファクタリングを安心して行える
リファクタリングは全てのテストがパスしている段階で行っていきます。
そして１箇所変更したらすぐにテストを回して、全てのテストがパスしたままかどうかを確認します。
これによって**「自分の行った変更が他の箇所に影響を与えていないか」というリグレッションテストができている**ので、安心して変更をすることができるようになります。
その自信が大胆なリファクタリングを後押ししてくれます。

### ４、安全に確実に短いステップで開発できる
テスト => 実装 => リファクタリングを繰り返すことでゆっくりと**インクリメンタルに開発を進めていく**ことができます。
途中で大きく詰まってしまったり、他のテストを壊してしまっても、**全てのテストをパスするところまでundoすればやり直せます**。
つまりテストが**セーブポイント**になるわけです。
短いステップで開発をすることは他にもメリットがあります。人間は大きく物事を考えることが苦手です。「〇〇を作ってくれ！」と突然言われると、人は白いエディタの上にいきなり放り出され、どこから何を始めればいいのか全く分からず、最初の一歩さえ踏み出せなくなります。しかし「〇〇ということはまずこういう仕様があるよな」という風に考えてテストケースをかき、それだけを実装することに専念をすれば一歩を踏み出すことができます。**人は問題を小さくして、それにだけ集中すればできる**生き物です。短いステップとは、そういう**スコープの切り出し**の意味もあるわけです。

## 最後に
テスト駆動開発をペアプログラミングでやることは、プログラミング教育にも向いていると考えています。
熟達者がテストケースを書いてそれを学習者が実装し、リファクタリングの段階で熟達者が指導することで技術力が向上します。
テストケースの歩幅を熟達者が調整できるので、難易度を調整しながら進めることができます。
また従来のように結果しか見ないプログラミング課題を解かせるよりも、プロセスを見ながらフィードバックをすることも教育的効果が高いと考えています。プログラミングは結果よりもむしろそのプロセスの方が重要で、そこが改善することで生産性が高まると思っています。

それでは。
Git 痒いところに手がとどくコマンドまとめ

## 修正状態のフィルターに応じた抽出
`git diff --name-only --diff-filter=M`
filter=の後の部分はフィルタリングしたい内容を入力

| フィルタ | 意味 |
|:--|:--|
| M | 修正 |
| A | 追加 |
| C | コピー |
| R | リネーム |
| D | 削除 |

`git diff --name-only --diff-filter=M|xargs git add`
上コマンドの場合、修正したフォルダだけをステージ場にaddできる。
BufferのAPI変更(？)によるMicrosoft Flowの対応

先日BufferのAPIが変更(？)されて、Microsoft Flow上から接続をやり直す必要が発生しました。

その頃からか、Twitterに長すぎる文字列を投稿しようとすると、Bufferが「Hmm, it looks like the message is too long for Twitter.」というエラーを返すようになりました。前は向こうで勝手に文字数を切ってくれていたのか、それとも実は昔からこうだったのかは不明です。


# Flowでの文字の切り取り
というわけで本題。Microsoft Flowで「文字数が長くなったときは一定文字数まで文字を切り詰める」という処理を実装します。今回は仮に、90文字としました(記事タイトル最大37文字＋投稿文最大90文字＋省略記号1文字＋URL11.5文字という計算)。

切り取りしたい文字列は、事前に変数「投稿文」に格納済みとします。

```
if(greater(length(variables('投稿文')), 90), concat(take(variables('投稿文'), 90), '…'), variables('投稿文'))
```

Microsoft Flowには、「文字列を前半からn文字切り取る」という`take`関数があるので、それを使います。他のプログラム言語などと違って、＞で比較をすることはできず、`greater`という関数を使う必要があるので注意。
VBSでJIS第3水準以上の漢字を判定する

# はじめに
あるシステムに`山﨑様`と入力したら、JIS第3水準以上の漢字`﨑`が化けてしまい、クレームになったことが…そこで、事前にJIS第3水準以上の漢字を判定するスクリプトを書いてみました。

# スクリプト

```vb:test.vbs
Option Explicit

'宣言
Dim str
Dim str_count
Dim i
Dim flg
Dim tmp
Dim char
Dim char_code

'代入
str = WScript.arguments(0)
str_count = Len(str)
flg = False

'処理
For i = 1 To str_count
    char = Mid(str, i, 1)
    char_code = Asc(char)
    If char_code > &HEAA5 And char_code < &H0 Then
        flg = True
        WScript.echo char
    End If
Next

'出力
If flg Then
    WScript.echo "がJIS第3水準以上の漢字です。"
Else
    WScript.echo "JIS第3水準以上の漢字は含まれていませんでした。"
End If
```

# 使い方
```shell:cmd
C:\>cscript test.vbs Qiitaは便利♪
Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.

JIS第3水準以上の漢字は含まれていませんでした。

C:\>cscript test.vbs 山﨑髙橋
Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.

﨑
髙
がJIS第3水準以上の漢字です。

C:\>
```
PreferenceFragmentCompatをEspressoを使ってテストする

Googleで検索するとすぐにいくつか情報が見つかるのですが、次のようなものが多いです。

```kotlin

onData(
    allOf(
        `is`(instanceOf(Preference::class.java)),
        withKey("setting_key_runpo")
    )
).perform(click())
```

しかしこの方法だと色々記述を変えて試しても`NoMatchingViewException`となってしまいます。

```
androidx.test.espresso.NoMatchingViewException: No views in hierarchy found matching: is assignable from class: class android.widget.AdapterView
```

[こちら](http://45.76.113.195/?a/45176390)を参考にすると、どうやら今は内部でRecyclerViewを使っているので、onDataを経由する方法は使えないようです。
そこでこのようにテストを書くことで無事に実行できるようになりました。

```kotlin
onView(withId(R.id.recycler_view)).perform(RecyclerViewActions.scrollToPosition<RecyclerView.ViewHolder>(0))
onView(withText("表示されている文字")).check(matches(isDisplayed()))
```

`R.id.recycler_view` は固定でこの値です。
キーでアクセスができないので少し不便ですが、とりあえずテストがかけるようになったので良しとしましょう。
[Python]AWS Lambdaから出力したログ(JSON)がCloudWatch Logで出力すると改行される


## 現象

Pythonのログライブラリ logging を使ってJSONの文字列をCloudWatch Logに出力すると改行される
<img width="992" alt="CloudWatch Log画面.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406177/7cb54026-286e-2c86-8d7e-533c10268f4e.png">

コード

```
from logging import getLogger, INFO
from ask_sdk_model import Response

logger = getLogger(__name__)
logger.setLevel(INFO)

# Request and Response Loggers
class RequestLogger(AbstractRequestInterceptor):
    """Log the request envelope."""

    def process(self, handler_input):
        # type: (HandlerInput) -> None
        request = handler_input.request_envelope.request
        logger.info (request)
```

## 原因

AWS Lambda の Python 3.7 Runtime 環境では改行コードとしてCR(\n) を含む文字列が出力された場合、行を分割して CloudWatch Logs 上に出力される

## 回避策

出力したい内容をJSON 文字列に変換し、CRを削除して出力する

コード

```
#### [追加] jsonライブラリのインポート ###
import json
####
from logging import getLogger, INFO
from ask_sdk_model import Response

logger = getLogger(__name__)
logger.setLevel(INFO)

# Request and Response Loggers
class RequestLogger(AbstractRequestInterceptor):
    """Log the request envelope."""

    def process(self, handler_input):
        # type: (HandlerInput) -> None
        request = handler_input.request_envelope.request

        #### [追加]requestオブジェクトを文字列に変換し、CR(\n)を削除 ####
        request_str = json.dumps(request.__dict__, ensure_ascii=False, indent=2, default=str)
        logger.info (request_str.replace('\n', ''))
        ####
```

## 補足

上記、AWSサポートより、提示していただいた方法だが、注意点としてAWS Lambda としては上記のような改行コードの扱いについて一定の出力結果になることを明示的に保証していないとのことなので、将来的には変更される可能性があるとのこと
Shift-JISの文字化け解消

#今なお残るShift-JISの世界
MAMPでローカルホストを立てて、
文字コードがshift-JISのページを
ブラウザで見ると文字化けすることがありますよね・・

ちなみに文字コードはHTMLのメタで確認できます。
`<meta charset="Shift_jis">`

#解消するためにいろいろ設定をいじる
[MAMP PHP文字化け対処法](https://qiita.com/redamoon/items/28e7bbe1ccbf58cbbd04)
こちら参考にphp.iniを設定しましたが、文字化け治らず・・・

[MAMP cgi shift jisの文字化け解消](https://www.yoshidablog.com/2017/05/02/mamp-cgi-shift-jis%E3%81%AE%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91%E8%A7%A3%E6%B6%88/)
追加で、httpd.confの記載も変更
`<Directory />
Options Indexes FollowSymLinks
AllowOverride none
</Directory>
↓
<Directory />
Options Indexes FollowSymLinks
AllowOverride All
</Directory>`

しかし、文字化け治らず・・

困った。

#いっそ表示してから変更した方が早いのでは！
Chromeの拡張機能を探してみた。
[テキストエンコーディング](https://chrome.google.com/webstore/detail/set-character-encoding/bpojelgakakmcfmjfilgdlmhefphglae)

こちらをインストール！
インストール後の使用方法
`右クリックでテキストエンコーディングを指定するメニューが出ます。
ご覧になっているページ内のどこかで右クリックすればテキストエンコーディングを指定できるメニューが出ます。選択したエンコーディングは自動的に同一サイトのすべてのページに適用されます。その効果をキャンセルするには、「自動判別に」選んでください。`

上記の通りで、エンコード完了！
どうも自動判別できないページには、この対策が一番早いのかも。。。
C#でWindows Serviceを作る（２）

#概要
前回の記事[C#でWindows Serviceを作る（１）](https://qiita.com/yossihard/items/46f72af754915b242bed)の続き。


#環境
Windows 10
Visual Studio 2017 Community

#手順
ここからは、インストーラーコンポーネントを追加します。
ServiceTest.csをデザイナーで開いていない状態の場合は、
ソリューションエクスプローラでServiceTest.csをダブルクリックしてください。
デザイナー上で、右クリックメニューを表示し、「インストーラーの追加」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/9fdc3722-dfec-7959-22ac-c90d6b06b107.png)

そうするとプロジェクトにProjectInstaller.csが追加されます。
コンポーネントとして、ServiceProcessInstallerとServiceInstallerが追加されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/c390d457-9d3e-7e5c-6d37-40e56789a285.png)

続いて、コンポーネントのプロパティを編集していきます。
これらは、どのようなサービスとしてインストールするかを設定するものです。

まずはServiceProcessInstallerから。
デザイナー上で「serviceProcessInstaller1」を選択して、右側のプロパティタブをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/d3dc4854-9c26-5f5d-9ce4-5d04e8d0fec0.png)

ここでは、Accountを設定します。
プロパティタブ内のAccountの右側をクリックし、
サービスをどのアカウントで実行するかを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/36d582fc-f471-6950-686f-da9d1e1be5e8.png)

（こちらも必須ではないですが）名前を変えます。
プロパティタブ内の(Name)の右側を適宜変更します。
ここでは、serviceProcessInstaller1をserviceProcessInstallerにします（1を削除）。

次にServiceInstallerのプロパティを変更します。
デザイナー上で「serviceInstaller1」を選択して、右側のプロパティタブをクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/e2d9fe95-8d16-dbdd-e112-d2d2d52b724a.png)

主に変更するのは以下のプロパティ
・DelayedAutoStart：他の自動的に開始されるサービスが実行されるまで、サービスの開始を遅延するかどうか
・Description：サービスの説明
・DisplayName：サービス管理ツール等での表示用の名前
・ServiceName：サービス識別名
・StartType：サービスの開始タイミングを指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/0b182928-49b3-04e8-3b98-745c3d98e70b.png)

StartTypeのプルダウンについては、詳細は以下のページを参照してください。
https://docs.microsoft.com/ja-jp/dotnet/api/system.serviceprocess.servicestartmode?view=netframework-4.8
AutomaticかManualを選択することになると思います（BootとSystemはドライバ用）。

（そしてこちらも必須ではないですがｗ）名前を変えます。
プロパティタブ内の(Name)の右側を適宜変更します。
ここでは、serviceInstaller1をserviceInstallerにします（1を削除）。

今回はここまで。
次回は開発したサービスを実際にWindows 10にインストールして、
サービス管理画面で確認してみます。
C#でWindows Serviceを作る（１）

#概要
前回の記事でC#で作ったWindows Serviceのインストール用コードを書きましたが、
Windows Serviceの作り方自体を忘れてしまうので、その備忘録。

#環境
Windows 10
Visual Studio 2017 Community

#手順
Visual Studioを起動し、ファイルメニューから新規作成->プロジェクトを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/28a06dc9-81fb-6b90-e185-71f81934e597.png)


「Windows デスクトップ」のカテゴリにある、Windows サービスを選択します。
名前を適宜入力して、OKボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/d1cdcebf-88e0-768b-1a43-6d728816244f.png)


ソリューション、プロジェクトが新規作成され、以下のような表示になります。
Service1.csがデザイナーで開かれている状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/c20708e6-fa96-977d-3d14-e696193ae40a.png)


（必須ではないですが）Service1.csの名前を変えてみたいと思います。
⇒そのまま使うことはあまりないでしょうから・・・
ソリューションエクスプローラ上で、Service1.csを選択し、右クリックメニューを表示します。
そこから「名前の変更」をクリックし、適宜名前を入力してください。
ここでは、ServiceTest.csに名前を変更しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/71b8f11e-b581-fafa-2df7-1ade925b1fa0.png)

以下のようなメッセージが表示されるので、「はい」を選択します。
⇒クラス名などもすべて自動で変更されます！ラクチンですね♪
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/7934ec91-6054-ebcc-d9dd-468d1c45c700.png)


今回はここまで。
次回はインストーラーの設定を行います。
MacBookのTouch Barで画面ロック・スリープするショートカット

2019年7月
13インチMacBook Proは、Touch Bar非搭載モデル（TouchBarなしの既存のファンクションキー）
が廃盤になりました。

オフィスやカフェなどどんな場面でも
離席時などは画面ロックしますよね。

今までは`Control + Shift + 電源ボタン（⌃ ⇧ 電源）`でしたが、
TouchBarモデルにしてからこのショートカットが効かずに困ってました。

そして他の方法があることを知ったのでメモです。

`「システム環境設定」→「キーボード」`

の`「Touch Barをカスタマイズ」`でTouchBarの変更ができます。

するとこんな画面が出てきます。

<img width="1265" alt="スクリーンショット 2019-08-15 11.34.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/94680ec8-dedd-e0cc-a561-02f541ae63be.png">

このモードで各ボタンを下のTouchBarの領域までドラッグ&ドロップをすると移動が可能です。

（画面外への移動ですごく異次元で変な感覚がします）

- 画面をロック
- スリープ

のどちらかで大丈夫です。

スクリーンセーバ解除時もパスワード要求をONにしている方は`「スクリーンセーバ」`を使用してもいいと思います。


---

そして、Macを新調しましたが

新MacBookProのキーボードがかなり使いにくい…！
打鍵感も浅く、
「Esc」キーが物理ボタンがなくなってるのでコマンド派としては使いづらい。
そして矢印キーもShiftとの間隔が狭くなっていてタイピングミスが起きやすい。
これは慣れるのだろうか。。

キーボード買おうか悩み中
x xor (-x)したらどうなるの？

bitwise xorの競プロ用のまとめを書こうと思っていたら気になったので考えてみたということです。
せっかくなので元々作る予定だった部分も残しておきます。

# xorの基本

## 真理値表

| x | y | out  |
|:-----------|------------:|------------:|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |

足し算の1のくらいに相当するとよく言われていますし、実際僕もそう覚えています。
まず、この真理値表を眺めていてわかるのは、yが1であれば必ずxのbit反転をしたものが得られるということです。そのため

$$
10110 \oplus 00100 = 10010
$$

のように特定の桁を１にしたモノでxorをとることによりねらったbitを反転させることができます。

競プロで使うかと言われるとすぐには思いつきませんが…(難読化くらいか)

## その他性質
可換、結合法則、零元とかそのまわり。

$$
x \oplus y = y \oplus x \\\
x\oplus(y \oplus z) = (x\oplus y) \oplus z \\\
x \oplus x = 0 \\\
x \oplus 0 = x
$$

基本的には大体普通の足し算と変わらないことができるのだが、逆元(x+y=0のときのy)が異なる。自分自身が逆元になるのである。ちなみに下二個の性質を使うと、重複して数の現れる数列の中にもしひとつだけ奇数回現れるものが会った時、全要素xorを取ると、それが取り出せる。

$$
[2,2,3,4,4]\\\
2\oplus 2\oplus 3\oplus 4\oplus 4  = 3
$$

#本題 x xor (-x)

逆元が-xじゃないんなら、$x \oplus (-x)$はどうなるのよという話だが、x = 0のときはマイナスもへったくれも無いので除くとすると、
これはPC内部の負の数の表し方による。1の補数と2の補数である。

## 1の補数のとき
このときは結構簡単で、負の数は自信のbitを全て反転させたものとして表される。
つまり、簡単のため8bit整数を考えると、

$$
00000011 = 3 \\\
11111100 = -3
$$

ということになる。このxorは真理値表から明らかで、

$$
00000011 \oplus 11111100 = 11111111 
$$
となる。これは何bitのときも同じで、-0になる。

**手元に1の補数の環境準備できていなくて未検証なので間違ってたら教えて下さい**

## 2の補数の時
2の補数のときには、マイナスの数は、元の数をbit反転させた上で1を足した数になっている。
同様に8bit整数のときは、

$$
00000011 = 3 \\\
11111101 = -3\\\
00000100 = 4 \\\
11111100 = -4
$$

になるということである。ここで、もとの数の偶奇によって場合を分ける。

### xが奇数の時
もとの数が奇数のときは簡単である。
元の数が奇数の時、bit反転させたものの$2^0$の部分は必ず0になる。そのため、2の補数にするときの1を加算する行為に対して、繰り上がりが無い。

**すなわち、$2^0$の位以外はもとの数のbit反転、2^0の位のみ$1\oplus1=0$になるのである。**

$$
where \  x = 2k+1(k>=0) \\\
x\oplus -x = 111111....10
$$

になる。そしてこれは、符号付き整数では-2に当たるため、結局

$$
where \  x = 2k+1(k>=0) \\\
x\oplus -x = 111111....10　= -2
$$

になるのだ。**なんとxが奇数のときは値に関わらず$x\oplus(-x)$は-2になる**


### xが偶数の時
では偶数のときはどうか？このときは補数を作るときに繰り上がりの影響が出てくるが、この影響が何桁目まで効いてくるかが問題となる。これは、$2^0$からいくつ0が連続するかによる。$2^0$から0が連続している限り、bit反転した結果1が連続してしまい、繰り上がりが連鎖する。この繰り上がりの連鎖は1がbitとして現れると止まる。

$$
......10000 = 2k \\\
......10000 = -2k
$$

そして、$2^0$からの0の連続数は、元の数が最大2の何乗で割り切れるかによる。

$$
00000010 = 2\\\
00000100 = 4\\\
00000110 = 6\\\
00001000 = 8
$$

そして、最大$2^a$で割り切れる時、2の補数表現では、下a+1桁がもとの数と同じで、残りがbit反転された数が得られる事になり、それとのxorを取ると、下a+1桁が0でそれより上は1の数が得られる。

それはすなわち、$-(2^{(a+1)})$になる。

$$
00001000 = 8\\\
11111000 = -8\\\
8 \oplus(-8) = 11110000　= -16\\\
\  \\\
00000110 = 6\\\
11111010 = -6\\\
6 \oplus (-6) = 11111100 = -4
$$

**xが偶数のときは、xを割り切る最大の2のべき乗数が$2^a$である時、$x\oplus(-x)=-(2^{(a+1)})$になる**

# おわりに
この知識使う時来るんですかねぇ…
間違ってる気が結構するので間違ってたら教えてください。
Juliaで超単純にマルチプロセス

最低限系備忘録

* Julia速いと言われるけど、CPU1コアしか使っていないのを見ると損している気分。なんとかしたい。

* Rubyの `parallel` の `map` みたいに、お手軽並列実行をやる。

### 前準備

実行時にプログレスバーをみたいので、[ProgressMeter.jl](https://github.com/timholy/ProgressMeter.jl) をインストールしておく。

```julia
Pkg.add("ProgressMeter")
```

`addprocess` で使用するコア数を指定する。

```julia
using Distributed
Distributed.addprocs(15)
```

子プロセスに持っていくパッケージに全部 `@everywhere` をつける。たとえば

```julia
@everywhere using DataFrames
@everywhere using Statistics
@everywhere using CSV
@everywhere using ProgressMeter
using Colors
using Glob
...
```

子プロセスに持っていくfunctionにも全部 `@everywhere` をつける。

```julia
@everywhere function f(x,y)
    x + y
end
```

### 並列実行
`pmap` もしくは `progress_pmap` を使う。Rubyから来た人なので、こういう書き方があるのは助かる。

```julia
result = progress_pmap(cats) do cat
  ...
end
```

`htop` を開いてjuliaが本当にマルチコアで動いているか確認。
Rails consoleでsidekiqが使っているredisの中身を見る調査コマンド

個人的メモ。

sidekiqが使っているredisの中身を見ることになったのでその調査メモ。

# 調査コマンド
## redis info
```rb
Sidekiq.redis_info
```
後述するキーの数もこれでとれる

## キーの数を取得する
```rb
Sidekiq.redis {|a| a.info "Keyspace" }
```

## キーの中身をすべて見る
キーの中身がたくさんあると危険なので、数を調査してから取得する

```rb
Sidekiq.redis {|a| a.keys "*" }
```
c++始めてみた：早速XcodeでAtCoder練習問題をやってみた個人ノート2.0

# 早速XcodeでAtCoder練習問題をやってみた

Xcodeでc++環境を構築したので

環境
>Macbook Air 13 Mid 2013
macOS Mojave Version 10.14.6
Xcode 10.3
c++14[-std=c++14]

早速AtCoder練習問題をやってみた

やってみた問題はAtCoderの「AtCoder Programming Guide for beginners (APG4b)」
という初心者用の練習問題の内の「EX1 - コードテストと出力の練習 / 1.01」
という問題

問題文
次の出力をするプログラムを書いてください。

実行結果


```
こんにちは
AtCoder
```

単純にcoutするだけのコードなのでXcodeでちゃんと動くかテストしてみました。

```こんにちは.cpp
#include </好きなフォルダ/stdc++.h>
using namespace std;

int main() {
    cout << "こんにちは" << endl;
    cout << "AtCoder" << endl;
}
```

ちゃんとビルドして

```
こんにちは
AtCoder
```

を出力してくれたので、このままXcodeでやっていこうと思います。

## 追記 
そういえば、
このコードの処理時間がどのくらいの時間がかかっているのかを調べる為に
Xcodeのプロファイラを使って調べてみたいと思いました。

そこでググってみると
やはりいました、Qiita先輩！

[XcodeのInstrumentsのTime Profilerを使って重たい処理を調べる](https://qiita.com/takusan_009/items/7c6962640435bc884b29)

[Xcode Time Profilerの使い方](https://qiita.com/okamotoke/items/daac6645fc44daadf1dd)

結構やり方は簡単で、上の記事通りにやれば簡単に調べる事が出来ました。

結果は 11.00ms でした。
rubyXL での印刷範囲の設定など

# はじめに
Rubyでどうしてもエクセルを扱わないといけない案件があったのでrubyXLを利用しました
https://github.com/weshatheleopard/rubyXL

個人的にいくつかハマったところをまとめます

# セルの値を代入するchange_contentsがno method_errorになる
change_contentsの使い方としては以下で「test」という文字列がA1セルに代入されます

```
worksheet[0][0].change_contents('test')
```
これがno method errorで利用できない時、以下をrequireします

```
require 'rubyXL/convenience_methods/worksheet'
```

メモリを気にしない場合はこちら

```
require 'rubyXL/convenience_methods'
```

# 印刷範囲の設定
印刷範囲を設定したテンプレートに値を書き込み、値の量によって印刷範囲を動的に変更したい場合は以下のようにテンプレートのエクセルファイルの印刷設定を上書きします。

```
workbook.defined_names.each do |defined_name|
      defined_name.reference = "印刷!$A$1:$T$#{print_row}" if defined_name.reference.start_with?('印刷')
end
```

## 印刷範囲でタイトル行などを指定している場合
ただし、タイトル行などを指定していて印刷範囲がシートに複数ある場合は、上記の方法ではすべて上書きされます。

each内のdefined_nameの中身は以下のようになっており、nameがxlnm.Print_Titlesとなっている設定を上書きしないように、start_with?(xxx)の値をreferenceに合わせて調節します。

```
<RubyXL::DefinedName:0x000055919cacea08 @local_namespaces=[], @name="_xlnm.Print_Area", @comment=nil, @custom_menu=nil, @description=nil, @help=nil, @status_bar=nil, @local_sheet_id="1", @hidden=nil, @function=nil, @vb_procedure=nil, @xlm=nil, @function_group_id=nil, @shortcut_key=nil, @publish_to_server=nil, @workbook_parameter=nil, @reference="印刷!$A$1:$S$117">
<RubyXL::DefinedName:0x000055919cacb5d8 @local_namespaces=[], @name="_xlnm.Print_Titles", @comment=nil, @custom_menu=nil, @description=nil, @help=nil, @status_bar=nil, @local_sheet_id="1", @hidden=nil, @function=nil, @vb_procedure=nil, @xlm=nil, @function_group_id=nil, @shortcut_key=nil, @publish_to_server=nil, @workbook_parameter=nil, @reference="印刷!$1:$13">
```
autocomplete-rubyのatomへのインストール

##atomにautocomplete-rubyのインストール

使用PCはMacbook Air Early2015。
Rubyのバージョンは2.4.0。

[超捗る！AtomでRubyを書く前にいれておいたほうがいいパッケージ5選 + α](https://qiita.com/nishina555/items/d3690b057f4624d39d77)を参考にatomで
rubyの開発するのに必要なパッケージをインストール。

手順としては、下記３手順で手軽にインストールできる。
1.Javaインストール
2.rsenseインストール
3.atomでautocomplete-rubyのパス変更

ただ、インストールする前に
[autocomplete-rubyのrsenseインストールのエラー対応](https://teratail.com/questions/67165)をみて、rsenseインストール前に、一時的にJRubyを使うようにしてしまったところ、インストールがうまくいかず。

普通に初心に戻って、ターミナルを再起動して1〜3の手順に沿ったところ、無事にインストールできました。
Cognos Query Studio でテンプレートの適用をしてもタイトルやフィルター内容を表示する

#Cognos Query Studio でテンプレートの適用をしてもタイトルやフィルター内容を表示する
先日投稿したこの記事の続きです。
**Cognos Query Studio で列幅の指定など細かなカスタマイズをする**
https://qiita.com/shinyama/items/8c2a3a1c57d90d3287c2

テンプレートを適用する機能で、Query Studioの見た目の細かなカスタマイズができて便利なのですが、テンプレートを適用すると、Query Studioが本来持っている赤枠のような、タイトルやフィルター内容の表示の箇所が、きれいさっぱり消えてしまいます。
<img width="960" alt="011.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/6e415386-587e-6c6b-800f-769ad170c705.png">

テンプレートを適用しても、これら「タイトル」や「フィルター内容」の表示をする方法です。

#手順
やや込み入った手順となりますが、以下のようなテンプレートを作成する事で実現可能です。

Query Studioを新規に開き、適当なデータアイテムを配置した状態で、「タイトル」「サブタイトル」「フィルター」が表示されるように編集し保存。
<img width="801" alt="001.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/2a5b654b-21e8-47ed-2b67-50092266dd3a.png">

保存したQueryStudioコンテンツを「レポートに変換」
<img width="433" alt="002.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/23a3027b-48d5-120a-ea7d-5064a3945e42.png">

レポートが開かれるので「テンプレートに変換」
<img width="561" alt="003.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/396b6aaf-c1e1-b2fd-e919-79e1f8ef92df.png">

タイトルのブロック部分を選択し、名前に「RTTitleBlock」
※この名前が重要。この名前を判別して、Query Studioがこれはタイトルだと認識するようです。
<img width="728" alt="004.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/ff491655-4652-54ad-0241-3dd52f63f7a8.png">

タイトルのテキスト部分を選択し、名前に「RTTitle」
<img width="727" alt="005.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/60315b48-dbb7-114d-d506-ec8d20e0840c.png">

サブタイトルのブロック部分を選択し、名前に「RTSubtitleBlock」
<img width="727" alt="006.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/8d54f9e5-a140-621b-4899-d512f448abfb.png">

サブタイトルのテキスト部分を選択し、名前に「RTSubtitle」
<img width="728" alt="007.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/92fcbe7d-fb53-b61e-164b-94d07cfc474f.png">

フィルターのブロック部分を選択し、名前に「RTFilterBlock」
<img width="728" alt="008.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/fbd1c203-a7f2-7431-b672-62bbd521e2cd.png">

フィルターのテキスト部分を選択し、名前に「RTFilterText」
<img width="727" alt="009.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/d430dc3c-a3f8-d988-cc3d-cc71152f8933.png">

フィルターのテキスト部分を選択し、テキストをブランクに。レポートを保存。
<img width="728" alt="010.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/68a4ddd6-9fb0-d5ec-9d11-23a5558ff2a8.png">

保存したレポートをテンプレートとしてQuery Studioに適用すると、「タイトル」「サブタイトル」「フィルター」が表示され、編集が可能となります。
<img width="960" alt="011.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/81636452-1b7f-89ad-2a55-a9cbcafd41ae.png">
【Django】viewsでログインユーザのみの実行を許可をする（クラスベース）

## はじめに
viewsの関数ベースに関しては@login_requiredでできるが、クラスベースに関してはやり方を知らなかったので、備忘録として残しておく。

## やり方
LoginRequiredMixinを使う。
まずは以下のようにLoginRequiredMixinをimportする。

```python:views.py
from django.contrib.auth.mixins import LoginRequiredMixin
```

使用するクラスの引数にLoginRequiredMixinを追加する。

```python:views.py
class PostView(LoginRequiredMixin, View):
```

settings.pyにログインしていない場合のリダイレクト先を設定する。

```python:settings.py
LOGIN_URL = '/accounts/login/'
```

## おわりに
上記のようにすることで、以下のような動作が可能になる。
- ログインしている場合→呼ばれたクラスの関数を実行する。
- ログインしていない場合→LOGIN_URLで指定したURL先へリダイレクトする。
ASP.NETのWebAPI(Post)をPowerShellで叩いてみる

# ASP.NETのWebAPI

ASP.NETでWebAPIのプロジェクトを作るとValuesController.csというWebApiコントローラーがデフォルトで用意されていますが、今回はそれで検証してみました。

なお、当方の環境は大人の事情でASP.NET MVC 5ですが、たぶんCoreでも同じような感じじゃないかと思われます。

```
// POST api/values
public void Post([FromBody]string value)
{
    var hoge = value;
}
```

## PowerShellでPostする
PowerShellでWebAPIを叩く場合、「Invoke-WebRequest」コマンドレットが使えます。
今回はPostメソッドを叩きたいので、-Methodパラメーターに「Post」を指定しています。

```
Invoke-WebRequest -Uri http://localhost:49298/api/values -Method 'Post' -Body @{value="hello"}
```

## Invoke-WebRequestでPostした結果：value = null
ASP.NETのWebAPIアプリをデバッグ実行して、Invoke-WebRequestコマンドレットを実行してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244097/abfa84b1-8f65-165c-4666-280899ed852b.png)

おや、valueがnullになってますね？
-Bodyパラメーターとして、value="hello"を指定していたので、"hello"という文字列が渡ってくるかなと思ったのですが・・・

## パラメーターをJsonで渡す場合、WebAPI側にJsonと合わせたクラスを用意する必要がある

結論ですが、WebAPI側にパラメーターに合わせたクラスを用意してあげる必要があるみたいです。
下記のように、Postメソッドのパラメーターをクラスにしてみたところ、無事valueが取得できました。

```
public class ValuesController : ApiController
{
    // POST api/values
    public void Post([FromBody]JsonParam param)
    {
        var hoge = param.value;
    }
}

public class JsonParam
{
    public string value { get; set; }
}
```

実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244097/38aaf4dc-04df-a6c3-9913-5e3015a082b2.png)


現場からは以上です。
ArchLinux上のXfceでBluetoothを有効にすると起動するたびにパスワードを要求されるときの対処方法

#前提
ArchLinux上のXfce4で、Bluetoothを起動するたびに「RfKillステートの設定には権限が必要です」となる場合の対処方法です。
ネット上に情報がなかったのでまとめてみました。

#この画面

![スクリーンショット_2019-08-15_10-27-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234470/04e37fd2-c93b-8546-dc2b-0a6bdae544de.png)

#対処方法
RfKillでBluetoothを許可すればOKです

```bash
sudo rfkill unblock bluetooth
```
PHP初心者メモ⑤

抽象クラス...他のクラスで継承してもらうために作るクラス

定義..abstract class 抽象クラス名　{
　　　　プロパディやメソッドの定義
     }


````
例) abstract class BaseUser{
      public name;
      abstract public function sayHi() //この時点で必ず実装してくださいと定義
　}

   class User extends BaseUser { 
     public function sayHi() { //実装するためには上記のアクセス権やメソッド名、引数等同じにしないといけない
　　　　echo "hello from User";
Dynamic365 エラーメッセージ逆引き辞典

ログファイルのMessage部をインデックスにしています。
###Can't add members to the default business unit team.Detail
既定のチームにはユーザを追加できません。
別のチームを作成しユーザを追加する必要があります。
https://community.dynamics.com/365/f/dynamics-365-general-forum/285644/can-t-add-users-to-other-teams
既定のチームは所有者に設定できないことも注意が必要です。
Cognos Analytics で Framework Managerが無い環境でのデータ表示制御

#Cognos Analytics で Framework Manager無しでのデータ表示制御
Cognosで、ユーザー名や所属グループベースでの、レポートやダッシュボード内のデータに対するアクセスコントロールは、通常は以下の記事の様なやり方で、Framework Managerを使って行います。
**Cognos 行・列単位でのデータアクセス権限付与**
https://qiita.com/shinyama/items/6f2ca9c6b9db4c319dff

しかしながら、最近増えてきているSaaSや他のパッケージ製品へのCognosの組み込みでの提供方式で、Framework Managerが使えない環境もあります。
データ・モジュールでは、前述の記事のようなデータアクセス権限設定はできず、レポートの機能の中だけで同じような事ができないか、と困った時の対応方法です。

#手順
基本的な方針は、レポート実行ユーザーの「ユーザー名」や「所属グループ」を関数で取得し、条件付きスタイルを使用して、表示・非表示設定を行います。

**例1)：ユーザー名によるリスト全体の非表示**
以下の様なリストのレポートを例とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/f5b42097-5533-ff52-3503-88c4587561f1.png)

リストのクエリーに、以下の定義で「ユーザー名」というデータアイテム(クエリー計算)を追加します。
**\#sq($account.defaultName)#**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/f7a5f106-1bd3-a5a0-dbb8-e55b70495c99.png)

リストのプロパティの「プロパティー」で、「ユーザー名」を含む全アイテムをチェックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/1d0c2259-a96c-af24-eeb3-2ad67e9b2809.png)

リストのプロパティの「条件付きスタイル」で、以下のようにユーザー名が「cogadmin」の場合の条件を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/d5d902d1-93d5-4836-0b3b-f845a17910b6.png)

作成された条件の設定で、詳細設定タブで「ボックスのタイプ」を「なし」とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/b3612d4b-63d2-4a6b-2af8-2e5cbbda12b6.png)

このレポートをcogadminユーザーで実行すると、リストが表示されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/ef32bec0-bf30-2059-e5e3-10f44d81af85.png)

**例2)：所属グループによるリストの特定行の非表示**
リストのクエリーに以下の定義で「所属グループ」を作成します。
**\#sq(CSVIdentityNameList())#**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/0a170a84-bc8b-3885-3f38-e7cfdadc950d.png)

リストのプロパティの「プロパティー」で「所属グループ」を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/3003d0ce-0b6a-d717-a553-6f52a53a91a2.png)

「リスト列の本体」を3列選択し、「条件付きスタイル」で以下の様な条件を作成します。
※「システム管理者」グループに所属し、「数量」が1千万以上の行が対象、という意味になります。
**([クエリー1].[所属グループ] contains 'システム管理者') and ([クエリー1].[数量] > 10000000)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/ffa5ea4c-c29f-db22-f14c-6c86fe221a45.png)

ボックスのタイプは「なし」にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/4fe10f21-c877-ac01-2ef6-9d2f444e44e4.png)

レポートを実行すると、以下のように「システム管理者」がレポートを実行した場合、数量が1千万以上の行は非表示となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/75fd8545-9d2e-4c52-3e04-d2697270d215.png)

どこかでFramework Managerが無い環境でデータ表示制御が必要になった時に、思い出してご活用頂ければと思います。
RDS(MySQL)からBigQueryにデータを移動する際にembulkを使用(Docker)

###初めに
BigQueryを会社で試すことになり、既存のRDSからテストデータを移動する際にembulkを使用したので、そのメモです。

自分の作った環境を共有するのを楽にするためにDockerで環境を作成しました。

##embulk（Docker)の準備
初めにDockerFileにembulkの設定を記載します。

```DockerFile
FROM openjdk:8-jre-stretch　　　　　　　　　　　　　　　　　　　　　　　　　　# embulkはJava8 or 7でないと警告が出ます

ENV LC_ALL ja_JP.UTF-8

RUN wget -q https://dl.embulk.org/embulk-latest.jar -O /bin/embulk \　# embulkを入れる処理
  && chmod +x /bin/embulk

RUN embulk gem install embulk-input-mysql \　　　　　　　　　　　　　　　　# 今回はMySQLからBigQueryなので2つのgemを入れています
 && embulk gem install embulk-output-bigquery

WORKDIR /work
```

```docker-compose.yml
version: '3'

services:
  embulk:
    image: "embulk:latest"
    build: "."
    container_name: "embulk"
    networks:
      - "service_netwroks"
    tty: true
    stdin_open: true
    volumes:
      - "./:/work"

networks:
  service_netwroks:
```

以下のコマンドを実行してください

```
$ docker-compose up -d
```

embulkのコンテナがちゃんと動作し、embulkが実行できるかを試してみてください

```
$ docker-compose exec embulk sh -c 'embulk --version'
```

##embulkの設定前にBigQueryのサービスアカウントを作成へ

embulkからBigQueryへデータを移行する際に権限がないと失敗してしまいます

GCPのメニューにサービスアカウントというのがあるのでクリックし、サービスアカウントを作成をクリックします

その際に役割という項目がありデータオーナーという役割を付与してください

作成するとjsonファイルがダウンロードされるので大切に保存してください
*あとで使います

##embulkの設定ファイル

embulkの設定ファイルを作成します

このファイルの設定でembulkはRDSからBigQueryへとデータを流します

```config.yml.liquid
{% include 'env' %}　　　　　　　　　　　　　　　　　　　　　　　　　　　# _env.yml.liquidというファイルで環境変数などを管理しています
in:　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 # inがMySQLからembulkへの処理部分です
  type: mysql
  host: {{ host }}
  user: {{ user }}
  password: {{ password }}
  database: {{ database }}
  query: >-
    select hoge from hoge;　　　　　　　　　　　　　　　　　　　　　　
out:　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　# outがBigQueryへの記述になります
  type: bigquery
  allow_quoted_newlines: 1　　　　　　　　　　　　　　　　　　　　　　 # MySQLのテーブルデータに/nのような空白などが入っているとエラーが出るので入れている処理です
  auth_method: json_key
  json_keyfile: 〜.json　　　　　　　　　　　　　　　　　　　　　　　　 # 先ほどGCP上で作成したサービスアカウントのjsonファイルpathを記載
  path_prefix: /tmp/ 　　　　　　　　　　　　　　　　　　　　　　　　　 # 一時ファイル作成場所
  file_ext: .csv.gz
  source_format: CSV
  project: {{ project }}                                    　　# GCP上で作成したプロジェクト名
  dataset: {{ dataset }}　　　　　　　　　　　　　　　　　　　　　　　 # dataset名
  auto_create_table: true　　　　　　　　　　　　　　　　　　　　　　　# tableを予め作っている場合はこの設定はいりません
  table: {{ table }}　　　　　　　　　　　　　　　　　　　　　　　　　　# データを入れるtable名
  timeout_sec: 3000　　　　　　　　　　　　　　　　　　　　　　　　　　 # BigQuery側のTimeOut対策
  open_timeout_sec: 3000
  formatter: {type: csv, charset: UTF-8, delimiter: ',', header_line: false}
  encoders:
  - {type: gzip}
```

embulkを使う場合は既存データのschema名やデータ型を判断してtableを作成してくれます

ただ、schema名やデータ型を指定して作成したい場合はschema.jsonなどで対応できます

```hoge.json
[
    {"name": "hoge", "type": "integer", "mode": "required"},
    {"name": "fuga", "type": "string", "mode": "required"}
]
```

```
$　bq mk --schema hoge.json -t [dataset名].[table名] 
```

この設定でまずはMySQL側が問題ないかを確認しましょう

```
$ docker-compose exec embulk sh -c 'embulk preview config.yml.liquid' 
```

問題なく、データが表示されましたらBigQueryに移動してみましょう

```
$ docker-compose exec embulk sh -c 'embulk run config.yml.liquid' 
```

GCPのコンソールなどでtableがあり、データが入っていれば大丈夫です
JAX-RS (Jersey) Tips

#### パラメータをリソースクラスのメンバで受け取る

`@HeaderParam`, `@PathParam`, `@QueryParam` は各リソースメソッドで個々に定義する以外にも、コンストラクタに依存注入してリソースクラスのメンバに格納できる（リソースクラスがSingletonでない場合）。

ただし、ボディ（エンティティ）や@FormParam（ボディを参照する）はコンストラクタへの注入はできず、リソースメソッドの引数で受け取る必要がある。


```java
class Resource {
    Resource(@PathParam("path") String pathParam) { ... }
}
```

##### 参考

* [3.5. Rules of Injection - Jersey 2.28 User Guide](https://jersey.github.io/documentation/latest/jaxrs-resources.html#d0e2760)
* [2.12. Rules of Injection - Jersey 1.19.1 User Guide](https://jersey.github.io/documentation/1.19.1/user-guide.html#d4e502)




#### HttpServletRequestを使わずにHTTPリクエストの情報にアクセスする

リソースメソッドの中で、生に近いHTTPリクエスト情報（HTTPメソッドやパス、クエリパラメータ、ヘッダ、ストリーム形式のボディ）を参照するには、`HttpServletRequest` を依存注入して使うのが簡単である。

```java
class Resource {
	@Inject
	private HttpServletRequest request;
}
```

ただしこの方法はServletコンテナに依存するため、JAX-RS APIでやりくりするには以下のようにすればよい。

```java
class Resource {
  @Context Request request;
  @Context UriInfo uriInfo;
  @Context HttpHeaders httpHeaders;

  public Response post(InputStream body) {
    // HTTPメソッド
    request.getMethod();
    // パス
    uriInfo.getPath();
    // クエリパラメータ
    uriInfo.getQueryParameters();
    // ヘッダ
    httpHeaders.getRequestHeaders();
    // ボディ（InputStream）
    body;
    ...
  }
}
```
Haskellでクイックソートとマージソート

最近Haskellを勉強し始めたのでアウトプットのためクイックソートとマージソートを書いてみた。

## クイックソート

```haskell
quickSort [] = []
quickSort [x] = [x]
quickSort (x:xs) = quickSort left ++ [x] ++ quickSort right
    where left  = filter (<  x) xs
          right = filter (>= x) xs

main = do
    print $ quickSort [1, 8, 7, 6, 2, 5, 9, 4, 0, 3]
```

リストの先頭要素をピボットにしてピボットより小さい要素を`left`にピボット以上の要素を`right`に集めます。集めた`left`と`right`にそれぞれ再帰的にソートを作用させます。

## マージソート

```haskell
merge xs [] = xs
merge [] ys = ys
merge (x:xs) (y:ys)
    | x < y     = x : merge xs (y:ys)
    | otherwise = y : merge (x:xs) ys

mergeSort []  = []
mergeSort [x] = [x]
mergeSort xs  = merge (mergeSort (left)) (mergeSort (right))
    where left  = take half xs
          right = drop half xs
          half  = length xs `div` 2

main = do
    print $ msort [1, 8, 7, 6, 2, 5, 9, 4, 0, 3]
```

ソートされた二つのリストから小さい順に値をとりだし、一つのリストにまとめ上げます。

## 結果

むちゃくちゃスッキリしてて書いてて気持ちいい...

## 参考文献

[Haskell 超入門](https://qiita.com/7shi/items/145f1234f8ec2af923ef)
【Python】Qiita APIの認証情報がOSの環境変数に "あれば" セットしてrequestsで問い合わせる

## 結論

### 1. `os.getenv('KEY')` はOSに指定された環境変数がセットされていないとNoneを返す

`os.getenv(key, default=None)` の形式のため、第2引数の `default` に何かセットされている場合は除く。

https://docs.python.org/ja/3/library/os.html#os.getenv

### 2. Qiita APIはリクエストヘッダーが空 `{}` でもリクエストを受け付ける

ということは、始めに **空のdictをリクエストヘッダーとして使い、**

 - 環境変数にアクセストークン(認証情報)がセットされていなければ: そのまま未認証で
 - セットされていれば: `Authorization` キーをdictにセットして認証済で

APIを使うことができる。


## リクエストのコード例

ユーザー情報を取得する [GET /api/v2/users/:user_id](https://qiita.com/api/v2/docs#get-apiv2usersuser_id) を使ってみます。  
[アクセストークン](https://qiita.com/api/v2/docs#%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3) の指定方法は **`Bearer ` の後に続けば良いため** 文字列を結合するだけでOKです。

```python
import requests
import os

# tokenの読み込み
qiita_token = os.getenv('QIITA_TOKEN')
qiita_request_header = {}
if qiita_token:
    print("環境変数の QIITA_TOKEN で認証します")
    qiita_request_header = {'Authorization': 'Bearer ' + qiita_token}

api_url = 'https://qiita.com/api/v2/users/ysd_marrrr'
result = requests.get(api_url, headers=qiita_request_header)

# ヘッダー
print(result.headers)

# レート
print('残り {} 回 / {}'.format(result.headers['rate-remaining'], result.headers['rate-limit']))

# ボディ
print(result.text)
```


## 認証情報のセットの仕方

Qiitaの [設定] -> [アプリケーション] -> [個人用アクセストークン] の「新しくトークンを発行する」から認証情報を取得してください。

＃この例だと `read_qiita` のスコープのみで十分です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216963/3212c267-2214-bd27-6137-bdb21167399a.png)


### bash

```bash
export QIITA_TOKEN="tokentokentoken"
```

### Python

```python
import os
os.environ.set('QIITA_TOKEN', 'tokentokentoken')
```
【Mac】『System Preferencesにより再起動が中断されたため...』と出た時の対応

macOSをアップデートする際に再起動をしようと思ったら、『System Preferencesにより再起動が中断されたため、一部のアップデートをインストールできませんでした。』と出て再起動ができませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140792/a99b1dd2-d1a6-9d76-898e-49adee050e40.png)

## 対応方法
「option」「command」「esc」(Escape)の同時押しで以下のようなアプリケーション強制終了ウィンドウが表示されるので、こちらからアプリケーションを強制終了させればOKです。
![スクリーンショット 2019-08-15 9.16.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140792/c90b5fc6-782d-d080-07f7-4ca936f2f047.png)


## 参考
- [Apple『Mac で App を強制的に終了する方法』](https://support.apple.com/ja-jp/HT201276)
Query関数でクロス集計する表を作りたい

# やりたいこと

↓ 下記のような元データから

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8612/70b4dd28-9403-2ce2-cd56-2519e6a868f2.png)


↓ こんなグラフを書きたいので

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8612/377b311e-f979-cc08-ca3c-535fb5842114.png)


↓ グラフの元になるこんな表を作りたい

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8612/649fae6d-4cdc-bde0-12e4-7bc2810072ba.png)


# やったこと

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8612/ea9471df-cb6c-2d27-19ae-5a40f2fbecfd.png)


上の黄色のセルに下記の式が入っています。

```
=Query(A:C,"select A, sum(C) where A is not null group by A pivot B")
```


そもそも「クロス集計」という言葉をちゃんと理解してなかったです。
やろうとしたことを調べていったらクロス集計っていうんだ、と。

# 参考サイト

[Query関数を使ってデータを集計しよう](https://officeforest.org/wp/2018/11/25/query%E9%96%A2%E6%95%B0%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E9%9B%86%E8%A8%88%E3%81%97%E3%82%88%E3%81%86-%E5%85%B6%E3%81%AE%E5%A3%B1/)
↑ここを読んで、Pivotでできることを知った。

[単純集計とクロス集計](https://www.macromill.com/tabulation/knowledge/gt-cross.html)
↑ ここでクロス集計を理解した。
画像：わかりやすい

画像：わかりやすい
https://dackdive.hateblo.jp/entry/2014/06/10/112629
https://hub.appirio.jp/tech-blog/lightningcomponentdev3
https://www.pasonatquila.com/blog/salesforce-dev/salesforcedx_20170711.html
https://qiita.com/xuwenzhen/items/9d1818fe50847be88ab0
https://www.forcetalks.com/blog/visualforce-vs-lightning-which-to-choose-and-when/
[Mac]Laradockで初期環境設定[MySQL]

[公式を参照](https://laradock.io/)
#laradockインストール
**project_nameは自己設定**

```
$ mkdir project_name
$ cd project_name
$ git clone https://github.com/Laradock/laradock.git
```
インストール後laradock/.envをコピーして.env-example作成しておく。
もしくはenv-exampleをコピーして.envを作成する。

##コンテナを起動
laradock直下

```
#　コンテナ起動
$ docker-compose up -d nginx redis mysql workspace

#　workspaceに入る
$ docker-compose exec --user=laradock workspace bash 
```

##laravelインストール

最新版をインストールする場合

```
$ composer create-project --prefer-dist laravel/laravel project_name
```

## exitしてコンテナ停止
.envを編集する前に、コンテナを停止する。

```
$ exit
$ docker-compose stop
```

##laradockの.envを編集。プロジェクトディレクトリをマッピング

```laradock.env
# Point to the path of your applications code on your host
APP_CODE_PATH_HOST=../project_name
```

##コンテナ再起動。workspaceへ

```
$ docker-compose up -d nginx redis mysql workspace

$ docker-compose exec --user=laradock workspace bash
```

# composerインストール

```
$ composer install
```

##コンテナ再起動

```
$ exit
$ docker-compose restart
```
http://localhost/ にアクセス
起動確認。

##MySQLに接続

**コンテナ停止**

```
$ exit
$ docker-compose stop
```
##laradock/.env　&　project_name/.env編集

お互いの設定を合わせる

```laradock.env
### MYSQL #################################################

MYSQL_VERSION=5.7
MYSQL_DATABASE=default
MYSQL_USER=default
MYSQL_PASSWORD=secret
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root
MYSQL_ENTRYPOINT_INITDB=./mysql/docker-entrypoint-initdb.d
```

```project_name.env
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret
```
##project_name/config/appの設定を編集
タイムゾーンと言語を日本にする。

```
'timezone' => 'Asia/Tokyo',
'locale' => 'ja',
```
## migrationして確認

```
$ docker-compose restart
$ cd laradock
$ docker-compose exec --user=laradock workspace bash
$ php artisan migrate
```
Migration table created successfully.で設定終了
## 後書き
お気づき、ご指摘がありましたら
とても助かります。
よろしくお願いします。
【Python初心者向け】for文の使い方・チートシート

この記事では目的別にfor文の使い方をまとめています。Python初心者である自分のために作ったチートシートではありますが、少しでもお役に立てれば幸いです。

## for文の基本的な使い方
```python:入力
elements = ['a', 'b', 'c']

for element in elements:
  print(element)
```

```:出力
a
b
c
```

## indexを取得する

```python:入力
elements = ['a', 'b', 'c']

for index, element in enumerate(elements):
  print(index, element)
```

```:出力
0 a
1 b
2 c
```

### 応用: indexの開始番号を変更する

```python:入力
elements = ['a', 'b', 'c']

for index, element in enumerate(elements, 1):
  print(index, element)
```

```:出力
1 a
2 b
3 c
```

## 指定回数ループさせる
```python:入力
for index in range(5):
  print(index)
```

```:出力
0
1
2
3
4
```

### 応用: 開始番号と終了番号を指定する
```python:入力
for index in range(1, 5):
  print(index)
```

```:出力
1
2
3
4
```

### 応用: 番号の増加量を指定する
```python:入力
for index in range(0, 10, 3):
  print(index)
```

```:出力
0
3
6
9
```

## 逆順でループさせる
```python:入力
elements = ['a', 'b', 'c']

for element in reversed(elements):
  print(element)

```

```:出力
c
b
a
```

## 条件を満たしたらfor文内を抜ける
```python:入力
for index in range(0, 5):
  if index == 2:
    break
  print(index)
```

```:出力
0
1
```

## 条件を満たしたらfor文内の処理をスキップする
```python:入力
for index in range(0, 5):
  if index == 3:
    continue
  print(index)

```

```:出力
0
1
3
4
```

## 複数のオブジェクトをまとめてループさせる
```python:入力
elements = ['a', 'b', 'c']
values = [10, 20]

for element, value in zip(elements, values):
  print(element, value)
```
```:出力
a 10
b 20
```

※ 3つ指定することも可能です
※ 一番少ない要素の数だけ処理が実行されます

## for文を抜けた後に処理を実行させる
```python:入力
elements = ['a', 'b', 'c']

for element in elements:
  print(element)
else:
  print('finish!')
```

```:出力
a
b
c
finish!
```

※ breakでループから抜けるとelse内の処理が走りません

## 多重ループをスマートに書く
```python:入力
import itertools

elements = ['a', 'b', 'c']
values = [1, 2]

for element, value in itertools.product(elements, values):
  print(element, value)
```

```:出力
a 1
a 2
b 1
b 2
c 1
c 2
```

※ itertoolsは標準ライブラリなのでインストールは不要です
※ 3つ指定することも可能です

## 条件を満たすものをリストで抽出する
```python:入力
values = [1, 2, 3, 4, 5]

result_list = [value for value in values if value % 2 == 0]
print(result_list)
```

```:出力
[2, 4]
```

## おまけ
### リストの各要素に特定の処理を行う

```python:入力
values = [1, 2, 3, 4, 5]

result_list = list(map(lambda x: x * 2, values))
print(result_list)
```

```:出力
[2, 4, 6, 8, 10]
```
【初心者】ReactNative(+Expo)での開発でハマるところとその解決　作成と起動編

#1,アプリケーション起動(exp android)と作成(expo init)
##1-1,作成編
アプリケーションを立ち上げる時は

```
    cd 'アプリケーションのディレクトリ'
    exp start

    androidの場合
    exp android

    iosの場合
    exp ios
  ```
のように<font color="LightSalmon">exp</font>コマンドを使用します。

作成の時に<font color="LightSalmon">exp</font>コマンドを使用して

```
    exp init アプリケーション名
```
としてターゲットにblankを指定した場合に、
<img width="817" alt="スクリーンショット 2019-04-28 20.58.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320677/92ba403d-a6ad-4352-cb11-70d2c39d6f7d.png">
のようなエラー
<font color="DeepPink">
(_xdl || _load_xdl(…)).Exp.downloadTemplateApp is not a function
</font>
が出てきましたが、この場合、
<font color="LightSalmon">exp</font>ではなくて、<font color="DeepPink">expo</font>を使用し、

```
    expo init アプリケーション名
```
とするときちんと作成することが出来ました。

##1-2,起動編
  エミュレータ起動の際に、
- iosの場合

 ```
exp ios
 ```
を実行するとXcodeからエミュレータが自動で起動しますが、
-　Androidの場合
Android Studioからエミュレータ(AVD)を立ち上げた状態で

 ```
exp android
 ```
を実行する必要がありました。  
#2,おまけ(コンストラクタ)

コンストラクタを定義する時には、<font color="Crimson">super();</font>を呼ぶ必要があります。

```App.js
// ... 略

    constructor(props) {
        super();
        //stateの初期化
        this.state = {
            // ... 略
        }
    }

// ... 略
```
これを呼ばない場合、
<font color="DeepPink">
TypeError: undefined is not an object(evaluating of '_this')
</font>
が発生します。


#参考文献

- ReactNative+Expoではじめるスマホアプリ開発 (松澤太郎 著)
PhpStormの「Tools→Deployment」が表示されなくなってしまったときの対処法

昨日から突然、PhpStormの「Tools」メニューに「Deployment」が表示されなくなってしまいました。筆者はこの機能を愛用していて、ファイルを保存したら自動でテストサーバーにアップロードという作業をしている。

対処法は、次の通り。

## 対処法

1. File->Settings->Plugins メニューをクリックして、「Remote」などのキーワードで検索します
2. 「PHP Remote Interpreter」が Disabledになっているので、これを有効にする。ただしその場合「SSH Remote Run」という方も有効にしないといけないようなので、こちらも有効に

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3977/3c71d6ea-6041-73c1-7b2b-b75a5abe110d.png)

これでメニューに登場するようになります。なぜ、Disabledになってしまったのか分かりませんが、最近のアップデートの関係かも知れません。焦りました。