OmniAICreator/Qiita-1.07M huggingface dataset:
CognosでPOST形式でレポートを呼び出す際の注意点

##はじめに
CognosのレポートをPOST形式で呼び出すためのカスタムURLを作成していたときに少しはまったことがあったので、備忘がてら投稿します。

##はまったところ
pathRef の 値を入力するところで、日本語を使用しているとレポートの呼び出しに失敗する

##解決方法
日本語名を持つフォルダやレポートに対して英語名を追加し、pathRefの指定を英語のみにすることでレポートの呼び出しに成功

英語名の追加方法
日本語名を持つフォルダやレポートのプロパティから、「全般」 > 「詳細設定」 > 「言語」 を選択し、言語を「英語」に切り替えて英語名を追加する。
※下記のキャプチャでは、「フォルダ1」という名前のフォルダに対して、「Folder1」と英語名を追加しています。

![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/146283/ae095113-5d2e-2ea4-f268-0548afe20cbd.jpeg)

最終的なpathRefです。

```HTML:pathRef
<input type="hidden" name="pathRef" value=".public_folders/Folder1/Report1" style="display: none">
```

※この対応を入れることにより、英語言語で表示されるユーザーはフォルダ名が英語名に切り替わります

##(参考)マニュアル
[Creating custom URLs to display and run Cognos Analytics content](https://www.ibm.com/support/knowledgecenter/en/SSEP7J_11.0.0/com.ibm.swg.ba.cognos.wig_cr.doc/c_wig_cr_create_custom_url.html)

※POST形式のExampleは英語版にしか表記がないので英語にして参照ください
Microsoft Flow の式の記述でシングルクォートをエスケープする

Microsoft Flowで式中のシングルクォート(')に囲まれた文字列内でシングルクォータを記述したい場合があります。

シングルクォートはシングルクォートでエスケープできます。

```
replace(outputs('作成'),'"','''')
```

下記例では、replace式を使用して文字列内のダブルクォート(")をシングルクォート(')に置換しています。

Flow編集画面
<img width="793" alt="無題.png" src="https://qiita-image-store.s3.amazonaws.com/0/258416/5c91861b-803e-cc22-2742-fb2306b2f5d5.png">

Flow実行結果
<img width="820" alt="無題2.png" src="https://qiita-image-store.s3.amazonaws.com/0/258416/da7b010b-27de-b0ba-e587-ed5b620b5ddc.png">
logbackのファイルサイズによるローテート

## 前提
Java(Spring Boot)のログ出力にlogbackを使っている。

「ログが20MBになったらローテートして、過去分は20ファイル保持して欲しい」
と言われたが、やり方が全然わからなかったので調べてみました。

## logback-spring.xml
これを`src/main/resource`配下に置いとくとローテートしました。

```ruby:logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE logback>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <!-- 環境ごとの設定 -->
    <springProfile name="local">
        <!-- ログのディレクトリを指定。仮に/tmp -->
        <property name="LOG_DIR" value="/tmp" />
        <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- ログのファイル名とパス -->
            <file> ${LOG_DIR}/adg.log</file>
            <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
                <!-- ローテート後のファイル名。".zip"とかつけると勝手に圧縮される -->
                <fileNamePattern> ${LOG_DIR}/adg_%i.log</fileNamePattern>
                <!-- ファイルの後につける番号の最大/最小。保持する数 -->
                <minIndex>1</minIndex>
                <maxIndex>20</maxIndex>
            </rollingPolicy>
            <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
                <!-- ファイルサイズによってローテートする -->
                <maxFileSize>20MB</maxFileSize>
            </triggeringPolicy>
            < encoder>
                <!-- ログ出力のフォーマット -->
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%thread]  [%file:%line %method] %msg%n</pattern>
            </encoder>
        </appender>
    </springProfile>

    <!-- 環境ごとの設定(こんな感じで書き分けてみた) -->
    <springProfile name="prod">
        <!-- ログのディレクトリを指定(環境で変えてみた) -->
        <property name="LOG_DIR" value="/var/log" />
        ・・・
    </springProfile>

    <!-- ログレベル -->
    <root level="INFO">
        <appender-ref ref="FILE" />
    </root>
</configuration>

```

## application.properties(抜粋)
```ruby:application.properties
# local環境の設定
spring.profiles.active=local
```

## ログ出力
ちなみに僕と同じくそもそもログ出力どうやるんじゃ?
という人もいるかもなので一応メモ。

```ruby:LogTestController.java
package jp.adg.fuji.log.controllers;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class LogTestController {
    public void logLog() {
        try {
            // これだけでログが出る
            log.info("infoログ");
            // 処理を記載
        } catch (Exception e) {
            // log.warn()もある
            log.error("errorログ", e);
        }
        return;
    }
}
```

## 失敗
・最初はlogback.xmlというファイル名で作成
 →springProfileを使用したところエラーが発生
   →ファイル名をlogback-spring.xmlに変更

・layoutタグを使用していたが非推奨らしいのでencoderに修正
https://logback.qos.ch/codes.html#layoutInsteadOfEncoder

・application.propertiesにもログの出力先を記載していたせいでエラーとなっていた
→application.properties側での記載を削除

・何も考えずに、コピペして
`org/springframework/boot/logging/logback/base.xml`
をincludeしてたら`catalina.out`にも(意図せず)アプリのログが出ていた

## その他
これもあった方がいいよ、
環境ごとの設定はもっとこうした方がいい、
という設定とかあれば教えて欲しいです！
download属性のクリックによるダウンロードはドキュメントに存在しなければダウンロードできない。ブラウザ依存で。

# 要約

```js
<a href="ダウンロードしたいファイルパス or blob" download="ダウンロードファイル名"><a>
```

という`download`属性を使ったリンクは、

`href`,
`download`,
`click`
をJSで操作してもいいものの、a要素自体はdocument下に存在していなければならず、
JavaScript空間のみで`createDocument`しただけのものでは一部ブラウザでダウンロードできない。

確認できたダウンロードできるブラウザは

* Vivaldi 2.2.1388.37

おそらく参考したコード記事からの情報によりChromeも可。

ダウンロードできないブラウザは

* Firefox 64
* IE 9

他のブラウザに関しては下記リンクからテストしてもらえればと思います。

多ブラウザ対応としては、ファイル内容をJSで作るにしてもダウンロード用のa要素を先にHTMLで書いておくか、JSでa要素を作ってもappendChildなどでDOMツリーに追加してやればいいんじゃないでしょうか。

# 発端

[Togetterのツイートまとめをスクレイピングしてコマンドやブラウザから一発で取得する機能の開発 #ファイルダウンロード - Qiita](https://qiita.com/khsk/items/08cbbc6e4143aaaf9037#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89)

>
```js
        downloadText(e) {
            const blob = new Blob([this.$store.state.text], {type: 'text/plain'})
            const link = document.createElement('a')
            link.href = window.URL.createObjectURL(blob)
            link.download = this.$store.state.text.split('\n')[0] + '.txt'
            link.click()
        },
```
>
(投降直前に気づきましたが、この処理はブラウザ依存のようです。
おそらくFirefox64とIE9ではファイルをダウンロードできません。
gif動画でダウンロードしているブラウザはVivaldiです。
理由は簡単なので気が向いたときか要望が出たときにでも直します)


これがブラウザによって動いたり動かなかったりする理由を考えたとき、
「HTML文章上にないものをクリックするというシチュエーションは謎だなあ」と考え、検証してみた。
ただ、結果ではダウンロードの場合に違いが現れ、たとえばクリックでアラートを出すような処理に関しては変数に対するclickでも動作した。

# コード

```html
<button id="document"> Document
</button>

<button id="js"> JavaScript
</button>

<a id="documentElement"></a>

<hr>

<button id="document2"> Document download
</button>

<button id="js2"> JavaScript download
</button>

<a id="documentElement2"></a>
```

```js
function clickAlert() {
  alert('click!')
}

const jsOnlyElement = document.createElement('a')
jsOnlyElement.addEventListener('click', clickAlert)

const documentElement = document.getElementById('documentElement')
documentElement.addEventListener('click', clickAlert)

document.getElementById('document').addEventListener('click', () => documentElement.click())

document.getElementById('js').addEventListener('click', () => jsOnlyElement.click())

/***************************/

function download(a, filename){
  var blob = new Blob(['download!'], {type: "text/plain"})
  a.href = URL.createObjectURL(blob);
  a.target = '_blank';
  a.download = filename + '.txt';
  a.click();
}
const jsOnlyElement2 = document.createElement('a')

const documentElement2 = document.getElementById('documentElement2')


document.getElementById('document2').addEventListener('click', () => download(documentElement2, 'documentElement'))

document.getElementById('js2').addEventListener('click', () => download(jsOnlyElement2, 'jsOnlyElement'))

```

CodePenの匿名埋め込みは出来ないようなのでリンクで失礼。

https://codepen.io/anon/pen/mazBXK
AWS内で完結するウェブアプリケーションの作成 （仮想環境の構築編）

## 作成条件
- 基本的にAWS内で完結させる。ローカルへのアプリダウンロード等は行わない。
- できる限り無料枠を利用する。
- AWSのアカウントを所持していることを前提条件とする。

## 構築手順
AWSにログインし、[AWS マネジメントコンソール](https://us-east-2.console.aws.amazon.com/console/home?region=us-east-2#)に移動する。
![帰社日 画像集 (000).jpg](https://qiita-image-store.s3.amazonaws.com/0/243247/beccb260-a4c3-f84c-48f9-5335b4c676c8.jpeg)

**仮想マシンの起動**をクリックする。
![帰社日 画像集 (00).jpg](https://qiita-image-store.s3.amazonaws.com/0/243247/ccb3d82d-801f-6513-1425-fcd104d68284.jpeg)

ステップ1 Amazon マシンイメージ にて、**Microsoft Windows Server 2016 Base**（無料枠）をクリックする。
![帰社日 画像集 (0).jpg](https://qiita-image-store.s3.amazonaws.com/0/243247/7cb102e7-3539-8c4f-e269-c847020927d1.jpeg)

ステップ2 インスタンスタイプの選択 にて、下図のインスタンスタイプ（無料枠）をクリックする。
![帰社日 画像集 (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/243247/e73c542f-9109-b2d7-b473-3315e65b1be7.jpeg)

ステップ7(2から7に飛ぶ) インスタンス作成の確認 にて、作成ボタンをクリックする。
![帰社日 画像集 (2).jpg](https://qiita-image-store.s3.amazonaws.com/0/243247/d73733b4-a4b7-5b59-5f75-e85edb59b9ad.jpeg)

メッセージボックスが出るので、プルダウンで「新しいキーペアの作成」を選択し、キーペア名に任意の文字列を入力してダウンロードする。
「インスタンスの作成」をクリックする。ダウンロードしたキーは仮想環境を使用する際に必要なので任意の分かりやすい場所に保存しておく。
![帰社日 画像集 (3).jpg](https://qiita-image-store.s3.amazonaws.com/0/243247/e6f6985c-58f7-14e5-ffad-173ec3d3822c.jpeg)

インスタンスの作成には約1時間かかる。1時間たったら「インスタンスの表示」をクリックして状態を確認する。
（インスタンス作成が完了しても画面は自動で切り替わらないので注意！）
![帰社日 画像集 (4).jpg](https://qiita-image-store.s3.amazonaws.com/0/243247/2820129c-a277-abed-c50e-f2f682012d7f.jpeg)

インスタンス作成が完了すると下記の画面が表示される。
・インスタンスの状態  ：running
・ステータスのチェック：(日付）のチェックが終了しました。
![帰社日 画像集 (5).jpg](https://qiita-image-store.s3.amazonaws.com/0/243247/f55591a0-f85d-85e7-505e-b5c9bd9356bc.jpeg)

## 構築完了後
以上で仮想環境構築は完了です。
続きの記事ができましたので、こちらも参照していただければ幸いです。
[AWS内で完結するウェブアプリケーションの作成 （仮想環境へのサンプルアプリケーションの搭載編）](https://qiita.com/MMorioka/items/614452550fb3392d4414)
[AWS内で完結するウェブアプリケーションの作成 （アプリケーションの構築編）](https://qiita.com/MMorioka/items/af392b88a6f0c5951cb3)
逆説的、スケジュールを中途半端にしない、中途半端の感覚


# お昼休みに書いてみたシリーズ
逆説的、スケジュールを中途半端にしない、中途半端の感覚
# この記事の概要
プロジェクトを進めるやり方で、「スクラム」というプロジェクトの進め方があり、

そこで行われるレビューの失敗から、学んだことを、まとめる記事です。

誤字脱字は、ごめんなさい。


# グタグタな、レビューを防ぎたい

スプリントのレビューで、ぐだぐたに、なっているチームは多いのではなかろうかと思う。

中途半端な物では、レビューできない。

もっとわるいのは、レビュー当日の朝まで、修正して、レビュー準備ゼロとかである、

その原因で、身近にあった事例を思い出しながら記事を書いてみたいと思います。


## 見積を正確にする

見積で中途半端にしないところは、

・既存の処理があって、流用できるかどうか判断していること。

・作業分担したときに、ぶれないように、変数名が明確になっていること

ここまで、やるべきだとおもいます。

中途半端でいいかなとおもうのは、

意味がわかるレベルの誤字脱字やスペースや、レイアウト、を気にするよりは、作業スピードを

優先にしたほうがいいとおもいます。


たとえば、APIを作る場合、

工数を２時間前後のタスクで分けてみると、APIをつくるときの

パターンがみえてきます。なので、テンプレート化してしまえば、ある程度の見積項目作成は自動になるので、

誤字脱字もなくなります。


## 正確に見積もってないメンバーの見つけ方

こまるのは、バーンダウンが落ちているのをみて安心していて、

レビュー直前に、「じつは、この見積があまくて、作業量はｘ倍であることがわかりました。」

と、報告を受けることがあった。レビュー直前が近くなると、なにも手をうてない。

スプリント開始時点で、できないもの、むりなものを、明らかにしたほうが、手をうてる。

だいたいこういうメンバーのバーンダウンは、最初のバーンダウンの落ち方がスマートになって、後半

グダグダになるのである。

なので、見つけ方は、見積をみて、内容が文章化されているかどうか、をみないといけない。


# 作業の間隔
## 作業を行う上で中途半端にできないもの
全部のタスクをやりきることが重要

## 作業で中途半端にするのは、ある程度の見切り
作業には、時間の制約があるので、クオリティがある程度であればよしとしなくてはならない

こんな感じのことをおもいました。

よんだくださってありがとうございます。
AWS ML University の 「Amazon Comprehend Medical」 についてのコンテンツを訳してみた

# はじめに
re:Invent 2018で発表されたAmazonAI の新サービス Amazon Comprehend Medical についての概要が「 AWS ML University 」にて公開されているのでこちらを翻訳しながら紹介していきたいと思います。

コンテンツへのアクセス方法は[こちら](https://qiita.com/Yoshiyuki03/items/bfbf416ab47ef5121927)に記載しています。

# Introduction

![image.png](https://qiita-image-store.s3.amazonaws.com/0/321349/63e2ae5f-3939-3e9e-0de9-3fde6d4be6d1.png)

Amazon Comprehend Medicalは、ヘルスケア領域で使用するための優秀なAPIです。これらは医療テキストから必要な情報を取り出したり、新しい情報と組み合わせたりすることが可能です。これを利用することで医療現場でのアプリや既存システムにAIを利用した機能開発に役立てることが可能です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/321349/1e7c6f31-23a1-537b-54fb-3f7575a9f02e.png)

現在は、ほぼ全ての医療現場で Electronic Health Records(EHR) が患者のデータの蓄積に使われています。
しかし特定の情報を取り出そうとすると膨大な作業に追われるため、解析が進まずなかなかできないのが現状です。
これらの問題は Comprehend Medical を利用することで、解決することができます。

# Comprehend Medical の仕組み

![image.png](https://qiita-image-store.s3.amazonaws.com/0/321349/b9082c54-2ad0-444d-e663-d747cef02f69.png)

簡単に説明すると Comprehend Medical は Amazon Comprehend の自然言語処理モデル（NLPモデル）とディープ・ラーニングを使用して、与えられた医療テキストから、ヘルスケア関連の単語や用語を抽出しております。
Amazon Comprehend は機械学習の分野において、最新の情報や知識が備えられているので、とても精度の高い抽出が可能となっております。
Comprehend Medical では以下の2つのAPIが重要な役割を担っております。

- NERe API：抽出した全ての単語や言語の関連性・関係性を JSON に送ります
- PHId API：テキスト内の保護された医療情報のみを抽出します

Comprehend Medical は AWS Glue などのサービスを利用して Sagemaker や S3 などデータパイプラインツールと統合することができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/321349/5d693163-aa2d-b010-d248-e469593fb4e7.png)

Comprehend Medical を利用することで、以下のメリットを得ることができます。

- より高精度に情報がアウトプットされる
- 今までよりも必要な情報を素早く収集
- コストの削減

正確に必要な情報を医療テキストから抽出してくれるAPIとなっているので利用者が自らマシン・ラーニングやディープ・ラーニングを1から学ぶ必要はありません。

# デモ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/321349/c05a2200-8447-46eb-1777-76af96966032.png)

実際に Amazon Comprehend Medical のコンソール画面を見ていきます。この画面では、抽出した単語・情報の内容によって色分けがされています。視覚的に抽出した情報が一目で分かるようになっています。

他にも特定の情報と情報を結びつけることもできます。デモの中では医療と投与に関する情報を結びつけており、患者の投与のタイミングや投与している薬の種類、投与量などを一度に知ることができるようになっております。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/321349/48abd7ab-e905-33df-6b46-aeb191b8c0d6.png)

コンソール画面を下にもっていくと、抽出した情報と、その内容やカテゴリが詳細に表示されております。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/321349/3276ed71-87f8-7bbe-2859-d38987cc2104.png)

JSON方式で抽出した情報の詳細も表示されているので、そこからも抽出した情報詳細について確認することができます。

# まとめ
Amazon Comprehend Medical に関する動画の紹介は以上となります。まだ日本語は対応していない状況ですが翻訳サービス等と連携し使うことで威力を発揮するシーンもあるのではないでしょうか。コンソールから操作することも可能ですのでぜひ体験してみてください！
かっこいいクラスレス CSS フレームワーク Bahunya (バウヒニア)

こんにちは日野澤です。

[バウヒニア (bahunya)][bahunya] というクラスレスの CSS フレームワークを紹介します。

<img width="879" alt="スクリーンショット 2019-01-11 13.15.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/13825/c34f77cd-1e2f-9e6f-1c14-cf0691796dc6.png">

# クラスレス

バウヒニアはクラスレスの CSS フレームワークです。クラスレスとはどういう意味でしょうか? クラスレスとは、つまり html の class 属性を一切使わないということです。バウヒニアのスタイルは全て html の生タグに対して設定されています。

例えば次のような生タグの table を書いたとします。

```html
<table>
  <tr>
    <th>Game</th>
    <th>Year Developed</th>
    <th>Awesomeness</th>
  </tr>
  <tr>
    <td>Insurgency</td> 
    <td>2014</td>
    <td>87/100</td>
  </tr>
  <tr>
    <td>Absolute Drift</td>
    <td>2015</td> 
    <td>91/100</td>
  </tr>
  <tr>
    <td>Street Fighter III</td>
    <td>1997</td> 
    <td>89/100</td>
  </tr>
</table>
```

これはバウヒニアでは次のようにレンダリングされます

<img width="542" alt="スクリーンショット 2019-01-11 13.21.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/13825/ad4c8ab0-3ec4-a8a7-dfe5-5a0b22cd3d4a.png">

なんとなくいい感じですね (少なくとも、ブラウザのデフォルトスタイルよりはかなりかっこいいですよね!)

# なんのためのもの?

バウヒニアはプロダクション環境で使うものではありません。生タグにアクセントの強いスタイルが当たっているので、これは明らかにアンチパターンです。ここからスタイルを拡張していくというものではありません。

では、どこでバウヒニアを使えるのでしょうか? 個人的には結構使い所はあると思っています。それは開発環境とか、プロトタイプとか、製品として出ないところです。例えば、開発環境でちょっとしたポータルサイト (機能はただのリンク集程度) が一瞬で欲しいというような場合です。開発用サイトとはいえ、HTML のデフォルトスタイルはちょっと厳しい。とはいえ、真面目に css を書くのは時間の無駄。きちんとした CSS フレームワーク (bootstrap, bulma など) を持ってくるのも結構面倒くさいです。そんな時にバウヒニアをスッと持ってきて、生タグの html だけで画面を書いていくと、なんとなくいい感じのページが安いコストで出来上がります ✨

ぜひ、バウヒニアを使って、普段スタイルに時間をかけられないページをかっこ良くしちゃいましょう!

# 名前について

バウヒニアという名前は、[公式サイト][bahunya] の画像にある花の名前です。[香港の区旗](https://ja.wikipedia.org/wiki/%E9%A6%99%E6%B8%AF%E3%81%AE%E6%97%97) に載っている花でもあります。

# 関連

バウヒニアに似たクラスレスフレームワークで [tacit](https://yegor256.github.io/tacit/) というものもあります。こちらは白背景でもう少し癖が少ないです。

参考: https://qiita.com/kt3k/items/8a5797d953bb3f8737f5

[bahunya]: https://kimeiga.github.io/bahunya/
map関数を使ってみる

# はじめに
multiprocessingを勉強していたらmap関数が出てきたので、まずは map関数を勉強してみました。

# map関数
https://docs.python.jp/3/library/functions.html#map
>map(function, iterable, ...)
>function を、結果を返しながら iterable の全ての要素に適用するイテレータを返します。追加の iterable 引数が渡されたなら、 function はその数だけの引数を取らなければならず、全てのイテラブルから並行して取られた要素に適用されます。複数のイテラブルが与えられたら、このイテレータはその中の最短のイテラブルが尽きた時点で止まります。

iterable → for文の中に入れられるリストとかタプルみたいなもの。
このiterableに対してfunctionをしてくれる。

# 使ってみる
[1,2,3] に対して+1する

```python
result = map(lambda x: x+1, [1,2,3])
print(result)
```

返ってきた値

```python
<map object at 0x7f26e9a17940>
```
イテレータという形で、私には結果が見えないので、リストに入れてあげる。
※イテレータはリストのコピーみたいなものらしいのですが、難しいのでまた今度。

```python
result = list(map(lambda x: x+1, [1,2,3]))
print(result)
```

```python
[2, 3, 4]
```
+1されて返ってきました＼(^o^)／

# 参考
https://rara-world.com/python-map-filter/
lambdaについて
https://qiita.com/nagataaaas/items/531b1fc5ce42a791c7df
AWS S3のファイルを署名付きURLでアクセスする

EC2からS3にアクセスしてオブジェクトを返却してbase64でエンコードして・・なんて
実装も手間だし(多少処理時間も短縮したいし)なので、
private設定のままクライアント側から直接S3を参照できないものかと実験しました

#環境
+ php 7.2
+ laravel 5.5
+ Vagrant 2.0.2
+ VirtualBox 5.2.6

#準備
AWSコンソールのIAMでS3の権限をもつユーザを作成(readだけで良いはず)
S3はprivateにしておく(デフォルト)

#手順
aws-sdk-phpを使います

◆SDKインストール

```ruby:コンソール
php composer.phar require aws/aws-sdk-php
```

◆Controller

※認証情報は仮で直書きですが.envかconfigにもちましょう！

```ruby:Controller
//認証情報
$s3 = new Aws\S3\S3Client([
    'credentials' => [
        'key'    => 'XXXXXXXXXXX', //アクセスキー
        'secret' => 'SSSSSSSSSSSSSSSSSSSSSSSSS', //シークレットキー
    ],
    'version' => 'latest',
    'region'  => 'us-east-1' //リージョン
]);

$command = $s3->getCommand('GetObject', array(
    'Bucket' => 'bucketName', //bucket名
    'Key' => 'work/test.png', //bucket名以下のファイルパス
));

$request = $s3->createPresignedRequest($command, '+1 minutes'); //有効期限 ※左記は1分で設定

//URL取得
$request->getUri();
```

こんな感じのURLが返却されます

```ruby:URL
https://s3.amazonaws.com/bucketName/work/test.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=XXXXXXXXXXX%2F20190110%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20190110T002959Z&X-Amz-SignedHeaders=host&X-Amz-Expires=60&X-Amz-Signature=3eb4e9937a3bcb42bc48b57694545484842a2645356949b438737aa965d2
```

これをviewに渡してあげて、imgタグに埋め込むと表示できます！
有効期限1分だけアクセスできるので、ロード後(厳密には1分後)には無効なURLになります！


まだまだ勉強中なので、もし間違っていたらご指摘いただけますと幸いです。(´;ω;｀)
VBA_Dictionaryの書き換え

#1.概要
Dictionaryでデータ書き換えの際ハマった

#2.ソースコード
```vb

'Dictionaryでハマったら追記
Sub Dictionary備忘録()
    Dim dic As New Dictionary
    Call dic.Add("a", 1)
    
    'Keys、Itemsで値の更新は出来ない
    dic.Keys(0) = "b"
    dic.Items(0) = 2
    Debug.Print dic.Keys(0) & "：" & dic.Items(0)

    'Key、Itemは値の更新可能
    dic.key("a") = "b"
    dic.Item("b") = 2
    Debug.Print dic.Keys(0) & "：" & dic.Items(0)
```

#3.実行結果
a：1
b：2
PHPUnit: TestCaseのプロパティのリセットについては神経質にならなくても良い

PHPUnitでは`PHPUnit\Framework\TestCase`クラスを継承してテストクラスを作るわけだが、そのテストクラスのプロパティについて次のような疑問があった。

* テストクラスのプロパティは、テストメソッドをまたいで共有されるのか？

どういうことかというと、例えば`$count`というインスタンスプロパティをテストクラスが持っているとする。その初期値は`0`とする。1つ目のテストメソッドで`$count`に`1`に値を変更する。そうしたとき、その後に実行されるテストメソッドでは、`$count`が初期値の`0`に戻っているのか、それとも1つ目のテストメソッドの変更をうけて`1`になっているのか。どちらの振る舞いになるかが疑問になるところだ。

```php
final class PropertiesLifeCycleTest extends TestCase
{
    private $count = 0;

    public function test1(): void
    {
        $this->count = 1;
    }

    public function test2(): void
    {
        // ここで $this->count の値は 0 なのか？ それとも 1 なのか？
    }
}
```

## 予想される振る舞いの仮説

共有仮説: インスタンスプロパティはテストメソッドで共有される
独立仮説: テストメソッドは独立しており、インスタンスプロパティはテストメソッド実行前に必ず初期化される

もし、共有仮説が正しいとすると、インスタンスプロパティをリセットすることに神経を使わなければならない。例えば、`setUp`で初期化するなど:

```php
final class PropertiesLifeCycleTest extends TestCase
{
    private $count;

    protected function setUp()
    {
        $this->count = 0; // 初期化
    }

    public function test1(): void
    {
        $this->count = 1;
    }

    public function test2(): void
    {
        // ここで $this->count の値は 0 なのか？ それとも 1 なのか？
    }
}
```

一方の独立仮説が正しい場合、インスタンスプロパティをリセットする処理を自分で書かなくて済む。

## 仮説を検証してみた

次のようなテストクラスを実装し、テストを実行して「独立仮説」が正しいことを検証してみた。

```php
final class PropertiesLifeCycleTest extends TestCase
{
    private const INITIALIZED = 1;
    private const MUTATED = 2;

    private $property = self::INITIALIZED;

    public function test1(): void
    {
        self::assertSame(self::INITIALIZED, $this->property, 'プロパティは初期状態であること');
        $this->property = self::MUTATED;
        self::assertSame(self::MUTATED, $this->property, 'テストメソッドはプロパティを変更していること');
    }

    public function test2(): void
    {
        self::assertSame(self::INITIALIZED, $this->property, 'プロパティは初期状態であること');
        $this->property = self::MUTATED;
        self::assertSame(self::MUTATED, $this->property, 'テストメソッドはプロパティを変更していること');
    }
}
```

より詳しい検証コードは[GitHub](https://github.com/suin/php-playground/tree/master/PhpUnitLifeCycleOfTestCaseProperties)に公開している。詳細な検証コードではData Providerを使ったパターンや、`setUp`や`tearDown`を組み合わせたときの検証も行った。

## 検証結果

このテストはFAILにならなかった。したがって、独立仮説が正しいことになる。

## 結論

テストメソッドは独立しており、インスタンスプロパティはテストメソッド実行前に必ず初期化される。よって、TestCaseのプロパティのリセットについては神経質にならなくても良い。
編集フォームに変更する前の要素が入ってこないのをmodel,urlダブル指定で解決

愚直すぎてこう考えつくまで時間がかかってしまった

## 失敗した方法
```
<%= link_to '編集', 'edit_board_path(@board)' %>
```
リンク先にローカル変数を送ってフォームで使わせるという方法
modelに@boardを当てるのと同じ効果があるらしいが自分の場合どこかおかしいみたいでうまくいかなかった。

```
<%= form_with  url: "/boards/#{@board.id}/edit", local: true do |f| %>

<%= form_with model: @board, local: true do |f| %>
```

modelやurlを片方でも置いとけば自動推測してくれるという言葉を鵜呑みにしたが動かなかった
あちらを立てればこちらが立たずを繰り返した

# 結局フォームにurlとmodelのダブル指定という形に落ち着いた

```
<%= form_with model: @board, url: "/boards/#{@board.id}/edit", local: true do |f| %>
```

## なぜ動かなかったのか理由がわかれば更新せせてもらいます
今は代替案ということで


読んでくれてありがとう
ChainerCVを用いてSSDの転移学習を試してみた

## 背景と概要
ロボットが自立移動するとして、知らない物体を発見した時その知らない物体を自分で学習して認識できるようにしたい。また、認識できているラベルをさらに細かく認識できるようにもしたい（犬を犬ではなく個体名で認識など）。しかし再学習をすると学習に時間がかかりすぎてしまうため、転移学習を使用して学習時間を短縮する。その前準備として、とりあえず自分たちで集めた画像を用いて、まず転移学習を試してみようと思った。

今回は、手元にあったペットボトルをターゲットという新しいラベルを付けて、転移学習させてみた。単眼カメラを搭載しているロボット([Cozmo](https://www.takaratomy.co.jp/products/cozmo/))を使用して、画像を取得して学習させたが普通のWEBカメラ等でも大丈夫。

## 開発環境
- google colablatory
- python3 
- chainer 5.0.0
- Cupy-cuda 5.0.0
- ChainerCV 0.11.0

## 使用したデータセット
- PascalVOCの学習済みモデル  
- Cozmoに搭載してるカメラから画像を取得し、手動でアノテーションデータを作成した自作のデータセット

### アノテーションデータの作成方法
slowsingleさんの[labeling_for_object_detection](https://github.com/slowsingle/labeling_for_object_detection)を使用してアノテーションデータを作成した。
使い方はこちらの記事に書いてます。
[物体認識用データセット作成支援ツール（Faster R-CNNとかSSDとか）](https://qiita.com/slowsingle/items/9006383145a650c84cb0)

### originalDatasetクラス
作成したデータセットはそのままでは使えないので、CheinerCV内で使われている形と同じになるようにoriginalDatasetクラスを作成した。（内容は[github](https://github.com/junyamahira/SSD_FineTuning/blob/master/ChaienrCV_SSD_new_Fine_tuning.ipynb)へ）


## 使用したネットワーク
今回は,ChainerCVのSSDを使用した。一応Yoloも並行して動かしてみたがCheinerCVのYoloは20クラスしか判別できず、目的に使用できなかったため断念。

## リポジトリ
今回のやったことをまとめたリポジトリ
[SSD_FineTuning](https://github.com/junyamahira/SSD_FineTuning)

## 結果
ターゲットラベルのペットボトルは、はっきり写っている画像では検出スコアがほぼ100%、斜めにしたり見切れていてもきちんと認識できた。誤認識してしまった時や、ノイズが酷い画像の検出スコアは70%前後。色が似ているガムの画像を背景色の影響もあってか誤認識してしまっていた。

### 成功例
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/323581/a5de1455-a418-782a-0b15-38afd6ac1de6.png)
![図5.png](https://qiita-image-store.s3.amazonaws.com/0/323581/1e7439a8-95fe-7430-d953-a0cf11de85cc.png)
![図2.png](https://qiita-image-store.s3.amazonaws.com/0/323581/8cf35830-22d9-5b73-aa84-c32e2f9fe64b.png)
### 誤認識
![図3.png](https://qiita-image-store.s3.amazonaws.com/0/323581/ebff85fe-46c0-ac2e-f606-5c3c8954d805.png)
![図6.png](https://qiita-image-store.s3.amazonaws.com/0/323581/24aa9450-050b-f6e8-9bac-b2f705875e05.png)

## 感想
時間がなく多クラス分類はできなかったが、ターゲットのペットボトルと他のペットボトルの区別ができていた。また、角度がついていたり見切れている画像は、元のPascalVOCの学習済みモデルを使い判別ができなかったが、転移学習を行った結果、角度があったり、見切れているターゲットのペットボトルの画像でも認識できていたので転移学習は成功したと言ってもいいのではないかなと思う。転移学習させていくことで新しく認識できるものを増やすことができると思う。色が似ているものを誤認識していたので、形ではなく色の組み合わせで学習していると考えられる。

## 今後の展望
- 今回はCheinerCVのSSDを使用したが、別のフレームワーク、別のネットワークを試してみたい。
- 背景を何とかして引き算して学習させたい
- 多クラス分類できるように転移学習をさせたい
- 手動でアノテーションデータを作成したが、今回のように認識できているラベルを細分化しようとする場合、SSDで認識できたバウンディングボックスのデータを使うことで効率よくアノテーションデータを作成できそう。
LINE@管理画面にメールアドレスでのログイン画面を表示させたい場合の対処方法

# まえがき
[LINE OFFICIAL ACCOUNT MANAGER(LINE@管理画面)](https://admin-official.line.me/)にログインしようとGoogleなどの検索しアクセスする場合に、スマホ端末などでLINEアプリが入っているとアプリが自動で立ち上がり認証されて簡単にログインができます。
ただ、これの影響で仕事で利用してる別のアカウントをメールアドレス/パスワードでログインしようとして右上にあるログアウトをクリックしても再度LINEアプリで認証されログイン画面が出ず同じアカウントでログインされてしまい無限ループにはまります。もしくは、PCなどでも何かセッションが壊れたり、管理画面に紐付けされてないアカウントが入っているとログアウトのボタンさえも出てこない画面に遷移して何もできず詰みます。
これは困りました。

# 対処方法
## ログアウトのリンクが無くてもログアウトさせたい
- [ログアウト](https://admin-official.line.me/logout)のリンクを利用しセッションをクリアする(LINEアプリが入ってる場合は下の"ログイン画面を表示させたい"を参照してください)
- Cookieなどを削除して初期化状態にする

## ログイン画面を表示させたい
- Googleなどの検索結果、もしくは右上の"ログアウト"のリンクを長押しして出てくる "新規タブで開く" で遷移する
![IMG_0167.PNG](https://qiita-image-store.s3.amazonaws.com/0/4221/95b3e445-6df4-20ed-0eee-cabf324c5da6.png)
- [LINE OFFICIAL ACCOUNT MANAGER(LINE@管理画面)](https://admin-official.line.me/)をブックマークしてLINEアプリでパスコード設定した上で、右上のログアウトをタップし、パスコード入力画面のままでsafariに戻りブックマークで開く
cron.dailyが実行されない、/etc/cron.d/0hourlyと/etc.anacrontabとの時間の食い違い

![centos7_cron_anacron.png](https://qiita-image-store.s3.amazonaws.com/0/82956/517d802c-b380-4a26-45db-1c19f64a0115.png)
# 症状
CentOS Linux release 7.5.1804 (Core)
/var/log/httpd/access_log が30MBも貯まっている事に気がついた。
cron.dailyが実行されていない事により、logrotateも実行されないので各ログファイルが肥大化していた。

# 確認
## /etc/logrotate.d/httpdの確認
/etc/logrotate.d/httpd で毎日チェックし容量が1MB以上あったらローテートし、過去ログは30世代まで残す設定になっている。

ログローテートのテストを行っても

```
[root@sv01 ~]# logrotate -d /etc/logrotate.d/httpd
省略
log needs rotating
```

と容量オーバーしてローテートが必要とでるが、実際はローテートされていない。
その他ログファイル、mysql,mail,messageなどもローテートされず、容量が肥大化していたので「logrotateコマンド自体が叩かれていないのでは？」と思う。

## cronまわりの確認
以前に、収容しているウェブサービスの関係上、デフォルト設定の時間にログローテートやウイルス定義の更新などのcronが実行されてCPUを圧迫するのを避けるために、時間設定を変更したのを思い出す。

```
[root@sv01 ~]# vi /etc/cron.d/0hourly
45 5 * * * * root run-parts /etc/cron.hourly
```

```
[root@sv01 ~]# vi /etc/anacrontab
START_HOURS_RANGE=6-8
```

調べてみると
/etc/cron.daily/logrotateが実行されるまでのフローは

① /etc/cron.d/0hourly

```
# 05時45分に実行する
45 5 * * * * root run-parts /etc/cron.hourly
```

② /etc/anacrontab

```
省略
# 時間指定なし
/usr/sbin/anacron -s
```

③ /etc/cron.hourly/0anacron

```
# 06時～08時のだったら実行する
START_HOURS_RANGE=6-8
# cron.dailyは1日毎で遅延は5分
1       5       cron.daily              nice run-parts /etc/cron.daily
```

④ /etc/cron.daily/logrotate

```
# 時間指定なし
# logrotate実行
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
```

# 原因
[1] 0hourlyの時間の書き方が間違っている。*印が1つ多い。
[2] 0hourlyとanacrontabの時間が食い違っている。
①が05時45分に実行されるが、③で06時～08時と指定されているので、③で停まっており④のlogrotateまで辿りつけていなかった。

# 修正
/etc/cron.d/0hourlyでcron.hourlyが毎時01分に実行するように修正

```
01 * * * * root run-parts /etc/cron.hourly`
```
こうすれば結果的にlogrotateは毎日06時～08時に実行されるようになる。

logrotateを05時45分ジャストに実行する場合は
・cron.dailyの実行時間指定を0anacronで管理せずに、crontabで時間指定する。
・/etc/cron.daily/logrotateを移動させ、crontabで時間指定する。
などの方法も考えられる。
今回は05時45分以降ならいつでもいいので、/etc/cron.hourly/0anacron のSTART_HOURS_RANGEで06時～08時だったらという曖昧条件で行う。
flutterでonResume

# flutterでonResumeする方法
initState内に以下を書く。

```
SystemChannels.lifecycle.setMessageHandler((msg) {
   if (msg == 'AppLifecycleState.resumed') {
     print('Resumed!');
   }
});
```
resumedの部分を変更すれば、pausedやinactiveなども取得できます。
Windows Subsystem for Linux + Hyper を使う

# 概要
クラウドに環境を持たなくても良い時代になったらしいので、ローカル完結のLinux環境をサクッと構築した。

# WSL（Windows Subsystem for Linux）の有効化
コントロールパネルから適当に辿るか、適当に検索して「Windowsの機能の有効化または無効化」を開く。
「Windows Subsystem for Linux」を有効にして再起動したら、Microsoft Store に行って Linux ディストリビューションを検索。特に拘りがなければ、検索結果から Ubuntu を選んでインストールするだけ。

# ターミナルの準備
今回は前から気になっていた Hyper TM をターミナルとして使う。
https://hyper.is/
本家からダウンロードしてインストールするだけで準備は完了という手軽さ。

# Hyper の設定
普通に設定しても良いけど、折角なので WSL 経由で設定を実施する。
とりあえず、インストールした Ubuntu を起動し、指示に従ってデフォルトユーザーを設定したら、Windows 側のログインユーザーのホームディレクトリを確認する。
特に手を加えていなければ、Cドライブ下にあるはず。

```
$ ls /mnt/c/Users/${user_name}/.hyper.js
```

設定ファイルが見つかったら、そのまま編集。ついでに、試したいと思っていたプラグインも放り込む。

```
$ vi /mnt/c/Users/${user_name}/.hyper.js
～～～
module.exports = {
  config: {
～～～
    fontSize: 17,
～～～
    fontFamily: '"YOzFontNF", Menlo, "DejaVu Sans Mono", Consolas, "Lucida Console", monospace',
～～～
    cursorBlink: true, // まあ、カーソルは点滅して欲しい
～～～
    shell: 'c:\\Windows\\System32\\wsl.exe', // WSL のクライアントを Hyper にするための根幹
～～～
    shellArgs: ['~'], // 起動時カレントディレクトリをユーザーのホームに
～～～
    // pokemon setting　（プラグイン用）
    pokemon: 'random',
    pokecursor: false,
    pokemonSyntax: 'dark',
    unibody: false,
    poketab: true,
    // pokemon setting end
～～～
    opacity: { // プラグイン用
        focus: 0.95,
        blur: 0.4,
    },
～～～
  }
～～～
  plugins: [
    'hyper-pokemon',
    'hyper-opacity',
    'hyperlinks',
    'hyper-search',
  ],
～～～
```

Hyper を再起動したら、ゴキゲンな Linux 環境が大体できあがっている。
YOzFontについては[こちら](http://yozvox.web.fc2.com/82A882B782B782DF8374834883938367.html)

# Ansible でセットアップ

自分好みの設定を Shell ガリガリ叩かせて自動反映。
https://github.com/wing-tail/basic_setting
（実行環境：Ubuntu 18.04 LTS）
Ansible の設定が完了したら、Hyper を再起動する。

# 最終結果

![20190112-170311.jpg](https://qiita-image-store.s3.amazonaws.com/0/185376/0d8f91d1-158e-8c5a-eb2f-1bc84ad37b90.jpeg)
最高だぜ！

# 参考
https://matcha-choco010.net/2018/06/30/wsl%E3%81%A8hyper%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%9F%E7%92%B0%E5%A2%83%E3%82%92%E6%95%B4%E3%81%88%E3%82%8B/
https://qiita.com/Ted-HM/items/10b452e434b24d938877
http://www.atmarkit.co.jp/ait/articles/1806/28/news043.html
https://ja.tech.jar.jp/misc/wsl.html
エスケープ処理とは

# エスケープ処理
エスケープ処理をしないと、セキュリティが、、、とはよく聞くものの、なんじゃそりゃ状態だったので、調べてみました。


## エスケープ処理とは
特殊文字や記号を一定の規則に従って別の文字に置き換えること
[参考：エスケープ処理とは](http://e-words.jp/w/%E3%82%A8%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%97%E5%87%A6%E7%90%86.html)

例えば

```javascript
console.log('test1test2');
```

このようなコードを実行した場合、出力結果は

```
test1test2
```
となります。

これを、アレンジして出力したいとします。

例えば

```
test1
test2
```
と表示したいと思い、下記を実行してみました。すると、どうなるでしょう。

```javascript
console.log('test1
test2');
```

```
Uncaught SyntaxError: Invalid or unexpected token
```
エラーが出てしまいました。

キーボードで入力した改行が、コード上の文字列には反映されず、PCに改行するという行動の指示にしかならなかったからです。

改行の他にも、`'`(シングルクウォーテーション)や`"`(ダブルクウォーテーション)などもエスケープすることによって

```javascript
console.log('I'm Taro.');
```

このようなコードもエラーを吐くことなく実行できるようになります。


## なぜエスケープする必要があるのか
とはいえ、別に出力結果を改行する必要なかったり、シングルクウォーテーションの中にシングルクウォーテーションを入れる必要がなければ、いらないのでは？と思う方もいるかもしれません。<br>
私も最初はそう思いました。普通にjs書いてる分には必要ないかなと。

では、次のような状況の時を考えてみましょう。

ページ内にユーザが入力するフォームを設置しました。
エスケープ処理をしないとどういう危険性があるか。
文字を入力するところに、コードを書くことができ、最悪の場合サイトを壊されてしまいます。

これは避けたいですね。

## まとめ
というわけで、エスケープ処理とは文字を変換することであり、入力フォームが悪用されないための最低限のセキュリティ対策であることがわかりました。
この記事は、私がわからないことを調べた備忘録です。もし、なにか間違っていたり、エスケープ処理をするにあたり気をつけたほうがよい注意点等ありましたらコメントいただきたいです。
Docker + Poetry で [Errno 8] Exec format error となるとき

例えばこういうやつ

```
$ docker-compose exec web poetry run python manage.py runserver

[OSError]
[Errno 8] Exec format error
```

Mac 側で virtualenv を作成している時になる。恐らく Poetry が参照しようとしている。

なので

```
rm -rf venv .venv
```

などで解決。
東京公共交通オープンデータチャレンジのバスapi その2

#概要

東京公共交通オープンデータチャレンジの、バスapi叩いて見た。

#odpt:BusroutePatternは、odpt.Busroute:Toei.Ue26でフィルターかける。

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/2/7/S/27Sz.jpg?t=1547120485)

#成果物

http://jsdo.it/ohisama1/27Sz

以上。
inputのdisabled属性とreadonly属性におけるPOST時の挙動の観察

:beginner: 注：PHP初心者の記事です
もっといい解決方法があったら教えてください。

#TL; DR
disable：POSTできない。
readonly：POSTできる。

# 記事に至るまでの紆余曲折
## 経緯
phpでフォームをつくる課題が出た。
確認画面から送信をする時、つまり2回目のPOSTで失敗。
大量の`Notice: Undefined index:`が。
`var_dump($_POST)`で中身をぶちまけると`array(0){}`
要するにPOSTできていない、ということであった。

PHPのせいにしてみたり、送信ボタンのタグのせいにしてみたり、formタグも疑ったりしたが、
結局inputの属性が悪いことが分かった。

## 解決
当方、確認画面で結果表示にinputタグをそのまま使って楽をしようとしていたのだが、
その時にdisable属性を思い出してしまったのが不幸にも黒塗りの高(略。

```php:8h潰した戦犯(お名前欄)
お名前：<input name="name" value="<?php echo $_POST["name"]; ?>" disable>
```

大体はこんなことせずに、ベタで`$_POST["name"]`を表示して、inputを影で作るのが多いようで、
以下のようにしました。

```php:すでに料理したものがこちら(お名前欄)
お名前：<?php echo $_POST["name"]; ?>
<input name="name" value="<?php echo $_POST["name"]; ?>" style="display:none;">
```

#Special Thanks
今回マサカリ投げてもらった → @shoutaWATANABE
Amazon CloudFront

##1.Amazon CloudFrontとは？##
コンテンツ配信用のウェブサービスです。
低レイテンシーと高速なデータ転送速度で、コンテンツを配信することができます。



##2.料金##

以下の点について注意が必要です。

- データ転送とリクエストの料金は地理的リージョンによって異なり、料金はコンテンツが提供されるエッジロケーションに基づきます。
- 実行されるリクエストの数とタイプ、およびリクエストが実行される地理的リージョン。
- Amazon CloudFrontエッジロケーションから送信されるデータの量。
- 使⽤量が最⼤40Gbps／10万RPS超は上限緩和申請が必要です。



##3.特徴##

- コンテンツリクエストは、自動的に最寄りのエッジロケーションにルーティングされるため、可能な限り高パフォーマンスでコンテンツが配信されます。
- オンプレミスにも対応可能です。


##4.ディストリビューション##
Adobeメディアを利⽤する場合はRTMPディストリビューションを利⽤するが、通常はWEBディストリビューションを利用する。

- ダウンロードディストリビューション（WEB）HTTPやHTTPSなどで画像などの配信
- ストリーミングディストリビューション（RTMP）動画のストリーミング


##5.機能##

###Gzip圧縮機能###
エッジ側でコンテンツをGZIP圧縮してより高速に配信可能にする。

###キャッシュコントロール機能###
キャッシュヒット率を上昇させて効果的なキャッシュ活⽤を可能にする。
　パラメータの値が完全一致したキャッシュを指定することができる。
　必要なのないキャッシュを無効化にすることができる。


##6.設計##
キャッシュ対象を決定した上で、キャッシュ時間やセキュリティ制御を設計する。

- コンテンツ利⽤データ分析などを実施して、静的コンテンツ／動的コンテンツへのキャッシュ対象URLを設定する。
- 変更が反映されるまでの時間も考慮して、キャッシュ時間（TTL）を決定する。
- セキュリティ対応等のその他の設定事項の要否を決定（SSL認証の有無／HTTPSの有無）する。


##7.Demo##
[S3 ＋ CloudFront でコンテンツを配信してみた](https://qiita.com/leomaro7/items/5aae69fba8f07555b457)
[CloudFront の動作を確認してみる](https://qiita.com/leomaro7/items/6d7e31442c56f142ace0)
超簡単なビルドツール「Pingy Cli」で開発準備から完了までやってみる

現在フロントエンドの開発に必須となっているビルドツールですが、
いろいろとできることが増える一方、ちょっと開発してみたいデザイナーの方たちには敷居が高くなっているのかな？と思うことがあるので、ものすごくシンプルな「Pingy Cli」というビルドツールについてまとめました。
すごく簡単なので、これでデザイナーの人たちも黒い画面触ってもらえるといいな！

昔一度試してみたとき、WinだけのバグなのかSassをimportするときうまくいかなくて諦めたので
今回はMacでリベンジです！

Pingy Cliの公式ページはこちら
https://pin.gy/cli/

# インストール前に
インストール前に、PCにnpmとNode.jsをインストールしてください。
こちらはぐぐるとわかりやすい記事がたくさん出てくるので今回は省略します。
一回入れればあとは何でもできるのでめんどくさがらずに入れてみてください！

# インストール

とりあえず黒い画面（ターミナルetc）でこのコマンドを叩きます

```
npm install -g @pingy/cli
```

これでPingy Cliがインストールされました。
ここからはもうあとは設定するだけです！

## 設定

次に、

```
pingy init
```

このコマンドを打つと、次々に設定項目が質問されるので、カーソルで自分が使いたいものを選んでENTERを教えていくだけでOKです。

答えていく内容はこちら

### ドキュメントのフォーマットを選びます
* HTML
* Pug
* ejs

から選べます

![1-3.png](https://qiita-image-store.s3.amazonaws.com/0/146963/9d8b8dfe-3648-bb1d-f64b-2d670fcebb17.png)

###　スタイルのフォーマットを選びます

* Sass（.scss）
* Sass（.sass）
* Less
* Stylus

から選べます。

![2-3.png](https://qiita-image-store.s3.amazonaws.com/0/146963/090ffd64-0a84-5577-c510-bb82faa03253.png)

### スクリプトのフォーマットを選びます

* Javascript
* CoffeeScript
* Babel
* Buble
* TypeScript
* LiveScript
* DogaScript

から選べます。

![3-3.png](https://qiita-image-store.s3.amazonaws.com/0/146963/0cbc3469-641b-5b16-2076-18bd026f8c56.png)

### 設定したファイルの構成を確認します。

![4-3.png](https://qiita-image-store.s3.amazonaws.com/0/146963/596dc29c-5398-6626-757f-4f12a519851e.png)

```
Yes， go ahead
```

を選択すると、これでファイルが生成されます！

### インデントの形式

* スペース２つ
* スペース４つ
* タブ

から選べます。

![5-3.png](https://qiita-image-store.s3.amazonaws.com/0/146963/e3330ada-dd44-8e57-9a94-e5c45131d3fa.png)

### インストールします

![6-3.png](https://qiita-image-store.s3.amazonaws.com/0/146963/8e1adca5-57b1-a846-5b6f-eb808dacc257.png)

設定を選んだら、勝手にファイルを生成してくれます。
@pingy/cliとあわせて必要なパッケージもインストールしてくれるので楽です。

あんまりコマンドを叩かない人だと、npm installで使いたいパッケージをインストールする、
というのは少し怖い印象があるので、
最初はnpm installが必要にはなりますが、ここで必要なものをインストールしてくれるのはありがたいですね。

ということで、開発環境が整いました！

では、次は実際の開発フローについてです。

#　開発

```
pingy dev
```

まずはこれを叩いて開発環境を起動します！
とりあえずこれを叩くと勝手にブラウザで開発するページが開いて見れるようになります。

ライブリロード（ファイルを変更すると、ブラウザのリロードボタンを押さなくても勝手にブラウザ側で変更点が反映される）も自動で実装されているので、
開発もリアルタイムでブラウザ上に反映されるようになっています。

>Pingy CLI works with Sass, Less, Stylus, Jade, Pug, Markdown, EJS, Bublé, LiveScript, Babel & Coffeescript with more coming soon.

公式での説明にあるように、
それぞれコンパイルも自動でされるようになっているため、コンパイルをするために何か準備する必要もありません。

簡単な開発は本当にこれだけあればすぐにできるようになります！

ちなみに、構文エラーがあった場合はブラウザ上でわかるようになっているので親切です。
例えば、scssファイルで`}`を余分に付けてしまった場合はこんな感じに

![7.png](https://qiita-image-store.s3.amazonaws.com/0/146963/f5b88670-9902-6cf3-c68c-da16bcb0a5d8.png)

表示自体してくれなくなってしまいます。

# コンパイルする

開発が終わったら、最後にファイルをコンパイルします。

```
pingy export
```

このコマンドを叩いて終わりです。
すごい。

コマンドを叩くと、開発していたディレクトリ配下に`/dist/`というディレクトリが生成されて、
その中にコンパイル後のファイルが入っています。
便利。

ちなみに、以前ハマったsassのimport問題は解決したのかMacだから大丈夫なのかは不明ですが問題なくコンパイルされるようになりました！

これで一通り開発準備→開発→開発完了までいくことができました。

# さいごに

個人的には、最初の設定時にQ&A形式で答えていく方法がとてもわかり易いなと思いました。
開発環境の設定は、設定ファイルに記述するパターンが多いかと思いますが、それすらちょっとハードルが高いな…と思う場合も人によってはあるので、聞かれて答えていったら設定ファイルができていた！というのは分かりやすいです。

使用するコマンドもかなり少ないので
黒い画面が苦手な方もぜひこれぐらいの開発環境からチャレンジすると良いのかな？と思いました！
ビジネスモデル2.0

##資本から資産への変換をビジネスとするなら創造性はどこで？

答えは**無形資産**
- ブランドや信用
- 人材
- アイデア
- ノウハウ


「企業価値の本質はこの無形資産"のれん"を作り出す力にある。」
⇨「伊藤レポート2.0」
⇨「バリエーションの教科書」

①経済合理性は資本から資産への変換
②創造性は資産から無形資産への変換
③社会性は膝いむから無形資産への変換

ただ、マネタイズできなければ会社は死ぬ。

###要はSBCの共存。
- Social
- Bussiness
- Creative
AWS University の Media Connect についてのコンテンツを訳してみた

# はじめに
re:Invent 2018で発表された新サービスである AWS MediaConnect についての概要が「 AWS ML University 」にて公開されているのでこちらを翻訳しながら紹介していきたいと思います。

コンテンツへのアクセス方法は[こちら](https://qiita.com/Yoshiyuki03/items/bfbf416ab47ef5121927)に記載しています。

# AWS MediaConnect について

![image.png](https://qiita-image-store.s3.amazonaws.com/0/321349/8edbf314-b53d-134c-4ab8-c2a1cba9229b.png)

MediaConnectはライブ配信をセキュアに行うことができる、とても信頼性の高いサービスです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/321349/8e625605-83a5-1ef6-2cd1-72d6b6196f75.png)

MediaConnect がとても重要なサービスである理由は3つあります。

- ライブ配信などの報道における重要なコンテツの役に立つ
- クラウドベースのワークフローやB2Bコンテンツの配信との連携
- クラウドのリソースを使うことで世界各国の視聴者にライブ配信ができる

# MediaConnectの特徴

![image.png](https://qiita-image-store.s3.amazonaws.com/0/321349/fbf5b62e-8dab-fe94-0bf1-8460d2a5231e.png)

MediaConnectは以下の特徴があります。

- ビデオを安全に配信することが可能
- ライブ映像を安全にシェアすることが可能
- 付加価値の高い生放送を用意することが可能
- コストの削減が可能

![image.png](https://qiita-image-store.s3.amazonaws.com/0/321349/4692105d-2d02-6f0e-cff2-cc5060455ed3.png)

MediaConnectは様々な分野で利用することができます。報道やメディアだけでなく、政府機関や企業など様々な業界や領域でこのサービスを利用することができます。

# ユースケース

![image.png](https://qiita-image-store.s3.amazonaws.com/0/321349/eb9cbfad-867a-0e1b-c1eb-cfbc5542b47a.png)


AWS MediaConnectには4つのメインとなる使い方があります。

- コントリビューション
    - ライブビデオストリームをAWSのインフラと連携

- ディストリビューション
    - ライブビデオストリームを複数の地域へ配信

- レプリケーション
    - ライブビデオを複製して各国に配信

- エンタイトルメンツ
    - コンテンツデータを安全に利用する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/321349/51ece6a8-c42e-3fb7-b6d3-8df56335b8b7.png)

OTTプロバイダーが視聴者に向けてライブビデオを安全に配信するために、信頼のおけるクラウドベースのサービスを探していました。そこで、AWS MediaConnectを活用することで、その問題を解決することができました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/321349/5bbb133c-90b3-2b76-1981-03af5e810e55.png)

具体的には、
 1. ライブ映像をAWS Elemental Liveにエンコード
 2. それをMediaConnectに転送
 3. 転送した映像をAWS Elemental MediaLiveでエンコード
 4. AWS Elemental MediaPackageでパッケージ化した映像をAmazon CloudFrontで視聴デバイスに配信


今回のケースにおけるメリットは3つあります。
 1. セキュアなクラウドサービス環境内に動画を保存できる
 2. 中間ファイルの状態で放送に対応できるクオリティとなる
 3. 既存のメディアサービスとのシームレスな相互運用性

![image.png](https://qiita-image-store.s3.amazonaws.com/0/321349/66fdf942-2676-2b68-a6a2-74dfb5dbff1e.png)

地方のテレビ局が、別々のタイム・ゾーンで生活している会員にスポーツ中継を配信する必要があったため、AWS MediaConnectを用いてその問題を解決しました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/321349/906e744e-cb22-7f9d-d851-60e5224c6ca0.png)

こちらの解決方法について紹介すると、
 
 1. AWS Elemental Liveより、AWS Region 1 のMediaConnectにライブビデオを配信
 2. 違うRegionにあるMediaConnectに映像を更に配信します

上記により違うタイム・ゾーンに住んでいる視聴者にも配信することが可能となります。

今回のケースにおけるMediaConnectを使うメリットは以下の3つです。

 - ビデオの配信のためのセットアップが1時間以内で可能
 - 国外など、より広い範囲で配信する場合も同じ仕組みで利用が可能
 - 作業の1つひとつがセキュアな環境で行われているので信頼できる

# まとめ
MediaConnect の動画紹介はこれで以上となります。
大規模な投資を行うことなく国内外にライブ配信が可能となるのはクラウドならではですね！
Laravel SQLSTATE[42S22]: 解決メモ

# モデルの新規保存でのエラー
「PHPフレームワーク Laravel入門」のP252のupdateメソッドを書いて実行した際に出たエラーの解決をメモする。

```php:PersonController.php
public function add(Request $request)
{
    return view('person.add');
}

public function create(Request $request)
{
    $this->validate($request, Person::$rules);
    $person = new Person;
    $form = $request->all();
    unset($form['_token']);
    $person->fill($form)->save();
    return redirect('./person');
}
```
フォームを送信すると、

```SQLSTATE[42S22]: Column not found: 1054 Unknown column 'updated_at' in 'field list (SQL: insert into `people` (`name`, `mail`, `age`, `updated_at`, `created_at`)(以下省略)
```
とエラーが発生。調べたところ「updated_atカラム」が無いとのことです。
解決方法はタイムスタンプを無効にすれば良いようです。

```php:PersonController.php
public function add(Request $request)
{
    return view('person.add');
}

public function create(Request $request)
{
    $this->validate($request, Person::$rules);
    $person = new Person;
    $form = $request->all();
    unset($form['_token']);
    $person->timestamps = false;    // 追記
    $person->fill($form)->save();
    return redirect('./person');
}
```

解決方法として良いのか悪いのかわからないがフォーム送信ができ、レコードが追加できたので良かった。

#参考サイト
[【Laravel】タイムスタンプがないテーブルを更新（保存）する方法 | 84LIFE](https://nori-life.com/save-a-data-without-timestamps/)
SDLアプリコンテスト 十一日目

#概要

SDLアプリコンテスト、見つけたので挑戦してみる。
androidサンプルアプリをビルドして、sdl_coreと接続してみた。

#写真

![Screenshot from 2019-01-11 08_19_05.png](https://qiita-image-store.s3.amazonaws.com/0/18104/173b47fa-4796-a6ad-0131-75389c7d628c.png)

![Screenshot from 2019-01-11 08_49_36.png](https://qiita-image-store.s3.amazonaws.com/0/18104/62ef9a1e-3cfd-4271-f568-36b897a953e5.png)

#sdl_coreエミュレータの対応

|  エミュレータ   |  画面  |projection|VehicleData| 
|:-----------------|:---------------|:--------------|:--|
|  ubuntu        |      ○     |     ×      |× |  
|  docker        |      ○     |     ×      |× |  
|   manticore    |      ○     |     ×       |○ |  
|SDLアプリ開発キット|      ○   |     ○        |○ |  

#アプリを0から作る。

SdlReceiver.java　sdlRouterService.java　SdlService.javaをコピペする。
androidmanifest.xmlをコピペ。
bundle.gradleをいじる。
リソースをコピペ。

以上。
[Rails] 多対多のリレーション作成

## 経緯

Railsで、以下のようなことを実現する必要があったので、その時の備忘を。
Userは元からあって、今回の改修でItemSet/Itemを追加することになった感じ

### 要件イメージ
 - Users / Items / ItemSets が存在
 - UserにItemSetIdを持たせる
 - Items/ItemSetsは自由に追加/削除可能
 - Userの情報を参照(API)した時に、対象Item一覧も取得したい

### 最終的なモデルイメージ
```ruby
class User < ApplicationRecord
 # item_set_idを持ってて
end

class ItemSet < ApplicationRecord
 # 1レコードに複数のItemが紐づく
end

class Item < ApplicationRecord
 # ItemSetの複数レコードに紐づく
end
```

### 関係性イメージ
 - User : ItemSet -> 1 : 1
 - ItemSet : Item -> 多 : 多

## やったこと

### UserにItemSetIdを持たせる

indexとか貼らないで、単純にintegerのカラムを追加
nullは許容しないで、デフォルトだけ0を設定して、必要に応じて対応するIDを設定する感じ

```shell
# マイグレーションファイル作成
$ rails g migration addItemSetIdToUsers
```

```ruby
# マイグレーションファイル(xxxxxx_add_item_set_id_to_users.rb)を編集
class AdddItemSetIdToUsers < ActiveRecord::Migration[5.1]
  def change
    add_column :users, :item_set_id, :integer, default: 0
  end
end
```

```shell
# マイグレート実行
$ rails db:migrate
```

### Items/ItemSetsは自由に追加/削除可能

 - **2-1. ItemsとItemSetsを先に作成**

    これは良しなに作成

 - **2-2. 各モデルに関連性を定義**

    ここが一番時間かかったところですね。はい。
    色々ググった結果、[このサイト](https://b.pyar.bz/20141016/many-to-many-table/)が参考になりました。
    少し古い記事ですが、一番まとまっていて理解しやすかったです。
    とりあえず、3つのアプローチがあるみたい。今回は3番目の簡単そうなやつを採用しました。
    本来であれば、DBの設計とか鑑みてもっと熟慮しないといけないと思いますが、
    今回は構造云々よりも、なる早実装が優先度高かったので、採用させて頂きました。

```ruby
# リレーションを追加
class ItemSet < ApplicationRecord
  has_and_belongs_to_many :items
end

class Item < ApplicationRecord
  has_and_belongs_to_many :item_sets
end
```

- **2-3. 中間テーブルを作成**

```sh
# 中間テーブルを作成
$ rails g migration createJoinTableItemSetsItems
```

```rb
# マイグレーションファイルを編集
class CreateJoinTableItemSetsItems < ActiveRecord::Migration[5.1]
  def change
    create_join_table :item_sets, :items do |t|
      t.index [:item_set_id, :item_id]
      t.index [:item_id, :item_id]
    end
  end
end
```

```sh
# マイグレート実行
$ rails db:migrate
```

## まとめ
- とりあえず、裏っ側のやりたいことは実現出来た
- UI部分はほぼ出来てたので、そこと上手いこと繋げて一応要件は満たせたような
- DBの知識もまだまだ浅いなと実感
- APIの要件は別途機会があれば書き残そうかなと思います

## 参考
- [railsで多対多のテーブルを実装する](https://b.pyar.bz/20141016/many-to-many-table/)
Alibaba Cloudアップデート情報　2019年1月

Alibaba Cloudの2019年1月(2019/01/11現在)のアップデート情報です。
こちらに記載している情報は、日本向けの内容となっておりますのでご注意願います。
また、金額や記載している内容に関して今後変更になる可能性があり保証するものではございません。
利用される方は必ず公式ドキュメントでご確認願います。

## ECS Bare Metalインスタンス　日本リージョンリリース
[ECS Bare Metalインスタンス](https://jp.alibabacloud.com/product/ebm)が日本リージョンでも使用できる様になりました。

現在選択出来るのは1種類のみ。(CPU Typeから選択出来ます。)
![BareMetalInstance.JPG](https://qiita-image-store.s3.amazonaws.com/0/254932/c0d3603b-1cfc-803d-1280-2a12fe73b2bb.jpeg)

課金方法は、サブスクリプション課金のみ。
インスタンス作成時にパッケージコストをご確認ください。
ベースの金額(インスタンス1台あたり)約31万円～


## ロンドンリージョン　リリース
ロンドンリージョンで一部機能が利用できる様になりました。
[利用できるプロダクト一覧](https://jp.alibabacloud.com/notice/new-region-20190110)
[リージョンとゾーン一覧](https://jp.alibabacloud.com/help/doc-detail/40654.htm)
![ECS.JPG](https://qiita-image-store.s3.amazonaws.com/0/254932/3b07719b-9a7f-6e23-d89b-63e2fdb3047c.jpeg)
Vagrantで作成したCentOS7環境へVirtualBox Guest Additionsをインストールする

## はじめに
CentOSが公式に提供しているCentOS7のVagrantイメージ(Vagrant box)は、デフォルトでVirtualBox Guest Additionsが含まれていません。

VirtualBox Guest Additionsが無くてもCentOS7を利用することはできますが、VirtualBoxの共有フォルダが利用できない等、VirtualBox Guest Additionsより提供される機能をゲストOS側で利用することができません。

## 対応方法
VirtualBox Guest AdditionsをゲストOSへインストールします。
VirtualBox Guest Additionsのインストール方法は2種類あります。

+ 1.手動でインストールする方法
+ 2.vagrant-vbguestプラグインを利用してインストールする方法

1.の方法では、Vagrantを利用せずにVirtualBoxで仮想マシンを作成した場合と同様に、VirtualBoxのゲストOSのウインドウを開き、Devices - Install Guest Additions…を実行し、マウントされたVirtualBox Guest AdditionsのISOイメージを利用してインストールします。

VirtualBoxのバージョンアップや、ゲストOSのカーネルがバージョンアップされた際は、都度再インストールが必要となります。

2.の方法では、vagrant up時にゲストOSのバージョンに合ったVirtualBox Guest Additionsがインストールされます。

プラグインをインストールするには、ホストOS上で以下のコマンドを実行します。

```
vagrant plugin install vagrant-vbguest
```

VirtualBoxがバージョンアップされた場合は、追従してvagrant up時にゲストOSのVirtualBox Guest Additionsも更新されます。また、ゲストOSのカーネルがバージョンアップされた際も、それに合わせたVirtualBox Guest Additionsに更新されます。
Terraform Resourceのちょっと細かいテストの話 ConflictsWith編@Accテスト

## リソースのテストをしていて思うこと

リソースのテストって、実質Accテストだと思うんですよ、Terraformの世界では。

でも、このテストって、 `正常系のテストしかないのでは？` ・・・ と開発をはじめてからずっと思っていました。

今回、 ``準正常系`` くらいのテストをするにはどうするか・・・というのを書いてみます。

まずは `ConflictsWith` 編です。
（もう１つ `ForceNew編` というのがありますので、そのうち書きます）

## ConflictsWith とは？

特定のパラメータ同士を同時に指定されたくない（されてはいけない）というようなケースで使います。
例えばこういうときです。

```go

func resourceSomething() *schema.Resource {
	return &schema.Resource{
		Create: xxxx

                (省略)

		Schema: map[string]*schema.Schema{
			"param_a": &schema.Schema{
				Type:          schema.TypeString,
				Optional:      true,
				ConflictsWith: []string{"paramB"},  
			},
			"param_b": &schema.Schema{
				Type:     schema.TypeString,
				Optional: true,
				ConflictsWith: []string{"paramA"},  
			}
                (省略)

```

こう書いておくと、 `paramA` と `paramB` を同時に指定した時にエラーとなります。

で、これをAccテストで試験したいというケースです。

まぁ、こういう部分ってそうそう変わる設定ではないと思いますが、うっかりリソース定義を変えちゃって、でCI的に試験してなくてミスった・・・みたいのを防止したいと考えたのが発端です。

## 実際のテスト

判定部分はもっといろいろな手法があるとは思いますが、 `resource.TestStep` の `ExpectError` を使っていわゆる `assertRaises` 的なことをやってます。
今回は双方向(param_a <-> param_b)でConflictsWithを入れているので、エラー的には２行出るんで、それぞれ `pattern1` , `pattern2` で判定しています。

```go
func TestValidateConflictsParamAAndParamB(t *testing.T) {
	pattern1 := "\"param_a\": conflicts with param_b"
	pattern2 := "\"param_b\": conflicts with param_a"
	resource.Test(t, resource.TestCase{
		PreCheck:  func() { testAccPreCheck(t) },
		Providers: testAccProviders,
		Steps: []resource.TestStep{
			resource.TestStep{
				Config: sampleConfig,
				ExpectError: regexp.MustCompile(pattern1),
			},
			resource.TestStep{
				Config: sampleConfig,
				ExpectError: regexp.MustCompile(pattern2),
			},
		},
	})
}

const sampleConfig = `
resource "my_something_v1" "something_1" {
	param_a = "this is param a"
	param_b = "this is param b"
}
`
```

ちなみに、例えば上記の `pattern1` , `pattern2` を適当な値にしておくと、こんなエラーになります。

```go

        config is invalid: 2 problems:

        - my_something_v1.something_1: "param_a": conflicts with param_b
        - my_something_v1.something_1: "param_b": conflicts with param_a
      
        To match:

        (なんか適当に変えた値)
```

本来のテストでは、この文字列を正規表現で拾っている感じです。

次回、 `ForceNew` 編書きます。
tslintの特定のファイルや、ディレクトリの除外の設定方法

tslintで除外をしたかったが、日本語で直球のタイトルで１ページ目に引っかかる記事がなかったので、記す。

`tslint.json`に設定を記述する。

```
{
  "extends": "tslint:latest",
  "linterOptions": {
      "exclude": [
          "bin",
          "lib/*generated.js"
      ]
  }
}
```

> linterOptions?: { exclude?: string[] }:
exclude: string[]: An array of globs. Any file matching these globs will not be linted. All exclude patterns are relative to the configuration file they were specified in.
format: string: Default lint formatter

.tslintignoreとか、記事書いた時点ではなさそう。
Oracleインスタンスのシャットダウン

# Oracleインスタンスのシャットダウンについて

# 手順
## Oracleインスタンスの再起動

```
# su - oracle
$ whoami
oracle
$ ps -aef | grep ora
$ sqlplus / as sysdba
SQL> SELECT sid, serial#, username, status, machine, program, sql_id FROM v$session WHERE username IS NOT NULL and sid != USERENV('SID');
-- statusが「ACTIVE」のものが存在しないこと
-- 「ACTIVE」なセッションが何を実行しているか確認
SQL> SELECT sql_text FROM v$sqltext WHERE sql_id='<sql_id>';
-- killしてもよいか確認し、問題なければ下記コマンドでkillする
SQL> ALTER SYSTEM KILL SESSION '&SID,&SERIAL#' IMMEDIATE;
SQL> shutdown immediate
SQL> startup
SQL> quit
```

## リスナーの再起動
```
$ lsnrctl stop
$ lsnrctl start
$ lsnrctl status
```

## Enterprise Manager再起動
```
$ emctl stop dbconsole
$ emctl start dbconsole
```

# ちょっとした注意事項
SHUTDOWN IMMEDIATEコマンドでのデータベースのシャットダウンが完了しないことがある。

>SHUTDOWN IMMEDIATEは、「IMMEDIATE（即時の）」の名の通り、即時に停止されそうに思えますが、処理実行中のアクティブなセッションが存在した場合は、処理の完了を待機するのです。この待機が1時間を超えるとSHUTDOWN IMMEDIATEはタイムアウトしてしまい、「ORA-01013: ユーザーによって現行の操作の取消しがリクエストされました」が記録されます。

[【Oracle Database】SHUTDOWN IMMEDIATE実行前に本当は確認すべきこと](https://www.ashisuto.co.jp/db_blog/article/201708-shutdown-immediate.html)