OmniAICreator/Qiita-1.07M huggingface dataset:
railsでリクエストが2回飛んでハマった話（超初心者向け）

## はじめに
Ruby on Railsでwebアプリを作成している最中にしょーもないことでハマったのでメモしておきます。
ちょー初心者向けなのでご了承ください。

## 状況
webアプリ内のあるページにアクセスして見るとDBから取得したレコードを表示するはずのところが、まっさらなページが表示されていました。
そこでサーバのログを見てみると

```
Started GET "/datings/32" for 119.106.25.164 at 2019-01-08 12:28:23 +0000
   (0.1ms)  SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
  ↳ /usr/local/rvm/rubies/ruby-2.4.1/lib/ruby/gems/2.4.0/gems/sprockets-rails-3.2.1/lib/sprockets/rails/quiet_assets.rb:13
Processing by DatingsController#show as HTML
  Parameters: {"id"=>"32"}
  Dating Load (0.2ms)  SELECT  "datings".* FROM "datings" WHERE "datings"."id" = ? LIMIT ?  [["id", 32], ["LIMIT", 1]]
  ↳ app/controllers/datings_controller.rb:81
  Rendering datings/show.html.erb within layouts/application
  Spot Load (0.2ms)  SELECT "spots".* FROM "spots" INNER JOIN "dating_spots" ON "spots"."id" = "dating_spots"."spot_id" WHERE "dating_spots"."dating_id" = ?  [["dating_id", 32]]
  ↳ app/views/datings/show.html.erb:36
  Rendered datings/show.html.erb within layouts/application (22.2ms)
  Rendered layouts/_header.html.erb (0.7ms)
  Rendered layouts/_footer.html.erb (0.3ms)
Completed 200 OK in 367ms (Views: 326.1ms | ActiveRecord: 1.8ms)


Started GET "/datings/class=%22date-detail-pic%22" for 119.106.25.164 at 2019-01-08 12:28:24 +0000
Processing by DatingsController#show as HTML
  Parameters: {"id"=>"class=\"date-detail-pic\""}
  Dating Load (0.1ms)  SELECT  "datings".* FROM "datings" WHERE "datings"."id" = ? LIMIT ?  [["id", 0], ["LIMIT", 1]]
  ↳ app/controllers/datings_controller.rb:81
Completed 404 Not Found in 2ms (ActiveRecord: 0.1ms)
```

Started GETが2回??
なぜかコントローラのshowメソッドが2回呼ばれているようでした。。。
なおかつ２回目のGETではなぜか"/datings/class=%22date-detail-pic%22"にアクセスしていました。

## 解決までの道のり
binding.pryで取得されているレコードを確認したり、chromeで検証から生成されたhtmlを見たり、showメソッドにlogger.debugを入れたりと色々試しました。

logger.debugでshowメソッド呼び出し回数を確認したところ、実はshowメソッドが２回呼ばれていない。。コントローラよりviewがおかしいのかなと見返してみると、画面に表示する部分をこのように書いていました。

```ruby:view.html.erb
<% @dating.thmeme %>
#正しくは　<%= @dating.thmeme %>
```
こんな初歩的なことでした。
なぜshowメソッドが２回呼ばれたのかは分かっていませんが、一応解決しました。
もし同じような方がいたら参考にしてもらえればと。
建築のためのRhinoceros入門（UU_CD会）

# はじめに
　この記事はUU_CD会（宇都宮大学内の建築学生のためのパラメトリックデザインの勉強会）の成果としてまとめる記事です。この記事の最後に各発表者の発表内容に対するリンクが貼ってあるので参考にしてください。
　また実際には毎週の勉強会に出て、ディスカッションすることを前提としている部分もあるのでわかりにくいところもあるかと思いますが、難解でもっと説明が欲しい内容についてはその都度コメントください。

# イチから始めるRhinoceros
まず第1回はパラメトリックデザインをおこなためにRhinocerosをまずは使えるようになろうということで日建設計&合同会社髙木秀太事務所で公開している以下のサイトを参考に勉強会を進めました。[→Rhino-GH.com](http://rhino-gh.com/)
とりあえずRhinocerosってなんなのって人もここから始めるとよいと思います。なおこの記事で使っているRhinoのバージョンは5もしくは6です。

## 基本操作のポイント（随時追加予定）
細かい操作はマニュアルや上のサイトで分かるので、みんなのディスカッションで出てきたRhinocerosを始めるうえで「ここが分かると理解が早くなるよね！」ってポイントをまとめていきます。もともと建築用専用のCADではないのでBIMとかそういった情報の構造性とか重視した制作プロセスを1から10までこなすような使用用途には向きません。でも形状のスタディや精緻な曲線によるデザインではかなり有利にはたらくCADだと思います。

### Rhinocerosは右手系
知らなくてもいいことではありますが…。3Dやっている人とかだと気になりますよね。

### shiftキー押しながらビュー名をクリック
RhinocerosはXYZ軸の三面図とパースペクティブのビューの4つのビューが起動時に表示されてます。でも使うのはやっぱりパースペクティブビューのことが多いのでShiftキー押しながら「パースペクティブ」というビュー名をクリックしてワンビューにしましょう。また同じようにShiftキー押しながらクリックすると元に戻りますよ。

### オブジェクトの複数選択はShiftキー押しながら
このあたりはAiとかと同じですね。ちなみにマウスでドラッグしながら範囲を指定して選択するときには**「左下から完全選択・右上から部分選択」**です。ここがArchiCADやAutoCADと微妙に違うので要注意。

### SpaceキーはEnterキー
RhinoではEnterキーと同様の役割をEnterキーで行えます。Spaceキーのほうがキーボードの位置的に手がアクセスしやすいので知っていると便利ですね。

### Rhinoの相対座標の入力
相対座標の入力方法ってかなりCADによって操作が分かれるところだと思いますが、Rhinoは「r100,0,0」みたいに「r」を打ってからXYZ座標をカンマ区切りで打ち込みます。学習初期で慣れておきましょう！めちゃくちゃ使います。

### マウスでアイコンをクリックしても使えるCADだがコマンド慣れ必須
　Rhinoはコマンドプロンプトというウィンドウの上側のテキストボックスに操作を打ち込むことで操作できます。この操作に慣れてください（AutoCAD使っている人は目新しさないと思いますが）。コマンドラインだけで操作できるのがプログラミングと相性よさそうなCADだなって感じします。VectorWorksでもツールバーを消してすべてショートカットキーだけで操作している人を見たことがありますが、慣れてくるとマウスの操作が面倒になってきます。
　ただ**コマンド中には入力項目をあらかじめ把握しておかないと使いづらいものもあるので結構慣れが必要です**。たとえばBoxコマンドは立方体を生成するコマンドですが、「始点座標→x→y→z」の順で値を入力すると知っていないと操作はできないですね。
　あとツールバーのアイコンで操作しようとするとたまに右クリックで起動する機能とかあって「おい！気づかないよ！」ってなるときあります（オブジェクトの3D回転が2D回転のアイコンを右クリックして起動するなどファンクションがバックにセットされている場合）やっぱりコマンド操作に慣れましょう。

### 臨機応変にCADがユーザの操作に応じてくれる
　あまり気にしない人も多いかもしれませんが、各機能の操作がユーザの挙動に対してとても柔軟だなと思います。たとえば任意のオブジェクトを拡大したいときに、最初に対象オブジェクトを指定しておけば「何倍に拡大しますか？」と聞いてくるし、オブジェクトを選択していない状態でファンクションを起動すると「どのオブジェクトを対象にしますか？」と聞いてくれます。地味なことなんですが、こういった操作性のきめ細やかさ大事なんですよね。

### 配列複製はめっちゃ使いやすい
昔ArchiCADを使っていたことがありますが、それに比べてRhinoは配列複製使いやすいなって感じがします。SketchUpみたいな操作感でかなり使いやすいです。その他Rhinoで使いやすいなって思ったのは1D/2D/3Dスケールなどのオブジェクトの拡大・縮小ですね。操作感が統一されていてとても良い感じです。

### 寸法や線種の設定に「スケール」という概念が特殊
　建築用のCADではないせいかスケールに対しての操作がちょっと他のCADと比べて特徴的です。

## Mac版特有トラブル
Windows版とMac版で微妙に挙動の違う操作があります。ここで確認してください（随時追加予定）。
### レイヤの設定で線種の変更ができない？（ver.5）
Mac版ではファイルのプロパティから線種の設定を保存してから、使えるようになります。デフォルトだと線種の種類がないので「標準線種を読み込み」を使ってください。

# もっと知りたい人へ

※もちろんCD会参加したい人も募集してます！
【SQL】集計関数とGROUP BYのサンプルメモ

# 前提

## テーブル構造

```
# \d test2
                Table "public.test2"
  Column  |  Type   | Collation | Nullable | Default 
----------+---------+-----------+----------+---------
 id       | integer |           |          | 
 size     | integer |           |          | 
 category | text    |           |          | 
```

簡単のため最低限…

## サンプルデータ

```
# select * from test2;
 id | size | category 
----+------+----------
  1 |    1 | a
  2 |    1 | a
  3 |    4 | b
  4 |    1 | c
(4 rows)
```

# メモ

まず集計関数なるものがある。

> 集計関数は指定された列の様々な値を集計する関数です．列の合計を求めるSUM関数や, 列の最大値を求めるMAX関数などがあります． DBMSによって様々な集計関数が用意されていますが，SQL92/99で定義されている集計関数は以下の5種類です．

参考：逆引きSQL構文集 - 集計関数を使用する(基本) http://www.sql-reference.com/summary/summary.html

```
rails-test4_development=# select sum(size) from test2;
 sum 
-----
   7
(1 row)

rails-test4_development=# select count(size) from test2;
 count 
-------
     4
(1 row)

rails-test4_development=# select max(size) from test2;
 max 
-----
   4
(1 row)
```

GROUP BYを使うと

> 「GROUP BY」句を使用すると、特定の列をキーにした合計値や平均値などが表示される結果

参考：集計を行う「GROUP BY」句：SQL実践講座（3） - ＠IT http://www.atmarkit.co.jp/ait/articles/0012/22/news002.html

普通に実行すると↓のところが、

```
rails-test4_development=# select category from test2;
 category 
----------
 a
 a
 b
 c
(4 rows)
```

group by を指定すると、キーとして（？）重複無く表示される

```
rails-test4_development=# select category from test2 group by category;
 category 
----------
 c
 b
 a
(3 rows)
```

GROUP BYで指定したまとめりで集計関数で集計できる。

```
rails-test4_development=# select category, sum(size) from test2 group by category;
 category | sum 
----------+-----
 c        |   1
 b        |   4
 a        |   2
(3 rows)
```

ただし、

> SELECT句には，GROUP BY句で指定した列と集計関数のみを指定することができます．

逆引きSQL構文集 - 集計関数を使用する(基本) http://www.sql-reference.com/summary/summary.html
やはり俺のTDDは間違えていた

なぜ早く気づかなかったんだ・・

TDDを諦めた多くの人たちに言いたい。
君たちのTDDの理解は間違えていると。

かく言う私もTDDについて大きく誤解をしていた。
テストファーストという単語に踊らされ、
テスト書いときゃいいんだろ。と思ってた。（ほんとすいません）

私が大いに勘違いし、重要だと思い込んでいたものを今投げ捨てる時が来たようだ。

この機能は簡単ですよ
--

お、いい設計が浮かんできたぞ！そんなこたーない。
小さく始めるんだ。そして小さく失敗する。
何事も慎重に進めるのがTDDだ。
私は違う？一気に作れるって？
でもどうだい？その作ったコードはテストがかけるのかい？
だいたい書けない。
書けたところで、一つのテストを準備するのに10行も書かなきゃならない。
メンテナンスが大変だ。
依存があるからしょうがない？
違う、小さく始めれば依存を切り分けて、テストフレンドリーにできたはずだ。
メンテナンスコストが小さいテスト。
これこそがTDDでの恩恵である。


カバレッジ
--

こいつはクソだ。なんの役にも立たない。
今すぐ投げ捨てろ！TDDにおいてカバレッジは役に立つどころか毒にしかならない

TDDにおいて、テストコードは開発の自信だ。
その自信はどこからくるか、間違いなくカバレッジではない。
作ってきたコードたちが壊れていないかを一瞬で確かめることができる。
それこそが自信だ。

そこにカバレッジは一切必要ない。
カバレッジを気にしなくちゃならない？
それはそのコードがクソな証拠だ！
コードをリファクタリングしろ！
小さく分けて、小さなテストを書くんだ！
ほら、カバレッジはどうなった？


テスト技法
--

同値分割だとか、境界値分析だとか。小難しい奴らだ。
こいつらもクソだ。今すぐ忘れろ！
TDDにおいてはまったく役に立たない。
自分が書こうとしている処理が正しいかを検証することさえできればそれでいい。
それ以外のテストコードは必要ない。むしろ邪魔だ。
重複が増え、見にくくなり、リファクタリングでテストコードの修正が面倒になる。
全く逆効果だ。


**テストファイル1:1の法則**
Hoge.javaに対してHogeTest.java。
実際のところどう言うのかは知らないが
テストが1:1で対になっていることをさす。

これがTDDで犯す一番の間違いだ。
これは、**最終的には1:1に収束する場合が多い**だけだ。
TDDの初期に置いて、設計はミニマムでなければならない。
ファイル名は機能名くらいの粒度でいい。
書こうとしている処理がかなり大きい？
それは、TDDの最初のステップじゃない。
もっと小さなステップに分割だ。
Red Green Refactoring!

この処理とこの処理はすごく似てる。
重複は悪だ。なんとか共通化できないか。
ほら、今こそ構造を作る時だ！
親クラスを定義してみる。似ている箇所を共通化してみる。うまくいった！
TDDに導かれ、クラスが分割され、おぼろげにパターンが見えてくる。
ほら、Factoryが見える！
これこそがTDDの目指すところだ！

まとめ
--

これまでの小話は
[テスト駆動開発](https://www.amazon.co.jp/%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA-Kent-Beck/dp/4274217884) を読んだ感想です。
この本の原著は2002年発売。翻訳本は2003年に発売されています。
15年以上前の本ということに驚きしかありません。
その間私は勘違いを続けてきたわけですが。。

[テスト駆動開発](https://www.amazon.co.jp/%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA-Kent-Beck/dp/4274217884)は同じ原著を2017年に再翻訳し出版されたものです。
昔の本の翻訳だから。とスルーしてはいけません。（1年間してました。すみません）
TDD知ってるけど実践してないと言うそこの人。というかここまで読み進めている人！
買って読んでみてください。（アソシエイトリンクじゃないよ）

読んだばかりなので、興奮冷めやらず勘違いに勘違いを重ねている部分があるかもしれません。
あしからず。
色々な言語のルートクラスまとめ

# ルートクラス

ルートクラスは継承階層の最上位クラスのことです。
例えばC#であれば全てのクラスはObjectを継承しています。

![Root Class Structure (1).png](https://qiita-image-store.s3.amazonaws.com/0/79387/e2d8a17b-d3fd-4a46-904e-e8c17f7b264a.png)

# 言語ごとのルートクラス
言語ごとにルートクラスは違います、次の表にまとめます。
(最近、C#とJavaとKotlinのルートクラスがごちゃごちゃになるんですよね…)

| Language  | Name | Details |
| :---- | :------- | :-------- | 
| C#  | Object   | [Object Class (System)](https://docs.microsoft.com/ja-jp/dotnet/api/system.object?view=netframework-4.7.2)          | 
| Java  | Object   | [Object (Java Platform SE7)](https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html) |
| Kotlin | Any | [Any - Kotlin Programming Language](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/index.html) |
| Python | object | [クラス定義](https://docs.python.org/ja/3.6/reference/compound_stmts.html#class-definitions) |
| etc... | etc... | etc... |

他の言語にもルートクラスってあるんですよね…
誰か分かる人教えてください。
Az PowerShellを使ってみました（１）

# 経緯

これまでは以下からmsiをダウンロードしてインストールしていたのですが、Az PowerShellではリリースされないようなので、これを機にパッケージマネージャーを使ってインストールしてみることにしました。

https://github.com/Azure/azure-powershell/releases

# 環境
* Windows 10 / Version 1803  
https://support.microsoft.com/ja-jp/help/4027391/windows-10-see-which-version-you-have
* PowerShell 5.1.17134.407  
https://docs.microsoft.com/ja-jp/powershell/scripting/install/installing-windows-powershell?view=powershell-6#how-to-check-the-version-of-powershell
* .NET Framework 4.7.2  
https://docs.microsoft.com/ja-jp/dotnet/framework/migration-guide/how-to-determine-which-versions-are-installed#net_d

# インストール
https://docs.microsoft.com/ja-jp/powershell/azure/install-az-ps?view=azps-1.0.0

Powershellを起動して、以下のコマンドを実行します。

```
PS > Install-Module -Name Az -AllowClobber -Scope CurrentUser
信頼されていないリポジトリ
信頼されていないリポジトリからモジュールをインストールしようとしています。このリポジトリを信頼する場合は、Set-PSReposit
ory コマンドレットを実行して、リポジトリの InstallationPolicy の値を変更してください。'PSGallery'
からモジュールをインストールしますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): Y
```

# サインイン

```
PS > Connect-AzAccount
警告: To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code xxxxxxxxx to
authenticate.
```
以降、ブラウザからデバイスログインになります。Azure CLIっぽいですね。

# バージョン確認

```
PS > Get-Module -Name Az*

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Script     1.0.0      Az.Accounts                         {Add-AzEnvironment, Clear-AzContext, Clear-AzDefault, Conn...
Script     1.0.0      Az.Compute                          {Add-AzContainerServiceAgentPoolProfile, Add-AzImageDataDi...
Script     1.0.0      Az.Resources                        {Add-AzADGroupMember, Export-AzResourceGroup, Get-AzADAppC...
```

# スクリプト移行

https://docs.microsoft.com/ja-jp/powershell/azure/new-azureps-module-az?view=azps-1.0.0#migrate-existing-scripts-to-az

以下のようにエイリアスコマンドを使用するか、"AzureRm"を"Az"に置換すればよさそうです。

```
PS > Enable-AzureRmAlias
PS > Get-AzureRmVm

ResourceGroupName  Name  Location          VmSize  OsType           NIC
-----------------  ----  --------          ------  ------           ---
xxxxxxxxxxx       xxxxx japaneast Standard_DS2_v2 Windows xxxxxxxxxxNIC
```

# まとめと次回予告
これまでにAzure PowerShellをインストールしたことのない自宅のPCだったため、何の問題もなくセットアップできました。

（２）で既存のスクリプトを移行したいと思います。
Firebase Authのメールリンク認証を実装する.

# やりたいこと
Firebase Authのメールリンク認証を実装する. 意外と情報がなかったのでまずは雑にメモ.

# Firebase Authの利用準備
[公式ドキュメント](https://firebase.google.com/docs/web/setup?hl=ja)がわかりやすい.

# Firebase UIの利用準備
[公式ドキュメント](https://firebase.google.com/docs/auth/web/firebaseui?hl=ja)がわかりやすい.

# 実装上ポイントになる箇所
```signInOptions```を以下のように渡す. ```signInMethod```を指定する必要がある. [このページ](https://firebaseopensource.com/projects/firebase/firebaseui-web/#configuration)に詳細が書いてあります.

```javascript
signInOptions: [
  // Leave the lines as is for the providers you want to offer your users.
  {
    provider: firebase.auth.EmailAuthProvider.PROVIDER_ID,
    requireDisplayName: false,
    signInMethod: firebase.auth.EmailAuthProvider.EMAIL_LINK_SIGN_IN_METHOD,
  }
]
```

# Nuxt.jsと組み合わせた実装.
[GitHub](https://github.com/kei3238/nuxt-firebase-auth-email-link)に置きました.
Webpackの非同期ローダーの作り方

Webpack のローダーを自作するときに、変換用の関数が非同期だった時の書き方。
ハマったのでメモ。

## TL;DR

`this.async()` を呼び出して戻り値のコールバック関数に値を渡す。

## リファレンス

以下、それぞれの場合のコード例を列挙します。難しいものから書いていきます。

### 非同期版のコード

```js
module.exports = function(source) {
  const callback = this.async();
  transformAsync(source).then({ code, map } => {
    callback(null, code, map);
  }).catch(err => {
    callback(err);
  });
};
```

### 同期版のコード（コールバック版）

```js
module.exports = function(source) {
  try {
    const { code, map } = transform(source);
    this.callback(null, code, map);
  } catch(err) {
    this.callback(err);
  }
};
```

### 同期版のコード（戻り値版）

```js
module.exports = function(source) {
  const { code, map } = transform(source);

  return { code, map };
  // source-map が不要な場合は return code;
};
```
長期インターンで触れた技術の復習を兼ねて、React.jsでポートフォリオを作った話

長期インターンで触れた技術について、復習したいが卒論が立ちはだかる日々.....
言い訳していても仕方がないので、合間を見つけてポートフォリオを作ってみました！笑
[Portfolio Site](https://toshi-studio.glitch.me/)

#動機
今回ポートフォリオの作ろうと思ったのは、大きく分けて２つの理由があります。
1. 長期インターンで触れた技術について基礎から勉強して、自分のものにするため。
2. 社会人になってから、副業にも積極的に取り組んでいきたかった。副業先を探す際に、アピールできるものをまとめておけるサイトがあると役立ちそうな気がしたから。
#実装編
##使用技術
これまで、React+Reduxを用いたSPA開発や、Node.jsによるREST APIを構築をすることが多かったので、全てJavaScriptで実装を行いました。
Next.jsでもよかったのですが、自分好みに開発するには手間がかかりそうだったので、見送りました。
今回はNode.jsを用いて、Universal Javascriptのコンセプトに従って開発し、PWA対応まで行いました。Node.jsはSSRをするのと、メールを送信するAPIに使っています。
主な使用技術は下記の通りです。

**フロントエンド**
1. React+Redux
2. styled-components
3. PWA
**バックエンド**
1. Node.js(express)
2. SSR
###Universal Javascriptとは
Universal Javascriptとはクライアントとサーバサイドで全く同じソースを共有する仕組みです。
**メリット**
SEO対策が可能
最初の読み込みはサーバー側で描画することで初期ロードが高速化
同じ処理のコードを2つの言語で書かなくてすむ・責務の境界が明確に
#内容決め
今回は以下の項目を載せることにしました。
自分が実務で役に立つことをアピールするのがポートフォリオの役目だと考えたので、使用経験のある技術や開発してきたものについて書きました。

- プロフィール
- 使用言語
- 作ったもの
- お問い合わせ

#レイアウトづくり
どんな大きさの画面でも見やすく、使いやすいポートフォリオにするために、レスポンシブ対応を行いました。
**PC画面**
![スクリーンショット 2019-01-08 19.33.44.png](https://qiita-image-store.s3.amazonaws.com/0/218201/13fa1c2e-edea-6ab1-be08-2256533b286f.png)
**スマートフォン画面**
![スクリーンショット 2019-01-08 19.34.01.png](https://qiita-image-store.s3.amazonaws.com/0/218201/b325e271-6a71-fe75-a3a1-9817fb68442f.png)
#Atomic Designを用いた実装
Atomic Designという考え方を取り入れて開発を行いました。
Atomic Designはページ単位で考えるのではなく、コンポーネント単位同士での組み合わせでページを作ります。
Atomic Designの設計は[ここ](https://blog.spacemarket.com/code/atomic-design%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6react%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%82%92%E5%86%8D%E8%A8%AD%E8%A8%88%E3%81%97%E3%81%9F%E8%A9%B1/)を参考にしました。
#ホスティング
ホスティングには[Glitch](https://glitch.com/)を使いました。
ウェブアプリを公開しようとすると、サーバーの設定したりドメインを取得したり...手間がかかるのですが、Glitchを使うとGithubから簡単にウェブアプリを公開することが可能になります。
Glitch は Node.js のアプリを公開するためのサービスです。
#まとめ
半年ぶりに、１からWeb開発をしたのですが、とてもいい勉強になりました！

是非、みなさんもポートフォリオを作ってみてはいかがでしょうか？
最後までご覧いただきありがとうございました。
Rubyの特殊文字一覧

ただただ特殊文字の表を備忘録として…

|特殊文字 |意味  |
|:-:|:-:|
|\t|タブ(0x09)|
|\n|改行(0x0a)|
|\r|復帰(0x0d)|
|\f|改ページ(0x0f)|
|\b|バックスペース(0x08)|
|\a|ベル(0x07)|
|\e|エスケープ(0x1b)|
|\s|空白(0x20)|
|\v|垂直タブ(0x0b)|
|\nnn|８進数表記(nは0〜7)|
|\xnm|16進数表記(nは0〜9,a〜f,A〜F)|
|\cx,\C-x|[Contrl]+x|
|\M-x|[Mata]([Alt])+x|
|\M-x\C-x|[Mata]([Alt])+[Control]([Ctrl])+x|
|\x|文字xそのもの(xは上の文字以外)|
|\unnn|Unicode文字の16進数表記(nは0〜9,a〜f,A〜F)|
A-Frameで始めるWebVR 　いろんなObjectを生成してみよう

##Primitives
前回は「"Hello World"をやってみよう」ということで，Boxを表示する方法を紹介しました．
https://qiita.com/keijipoon/items/f7a6de2225d55fd446a2
そこでは box という Primitiveを使用したのですが，box以外にも多くのPrimitiveが用意されています．
Primitiveとは，図形のライブラリと考えるといいと思います．



###a-sphere


```html
<!DOCTYPE>
<html>
	<head>

		<script src="https://aframe.io/releases/0.2.0/aframe.min.js"></script>
	</head>
	<body>
		<a-scene>
			<a-sphere color="#FF926B" radius="1.5" position="0 0 0">
			</a-sphere>


			<a-sky color="#ECECEC"></a-sky>
		</a-scene>
	</body>
</html>

```
![Sphere.PNG](https://qiita-image-store.s3.amazonaws.com/0/274029/38dd477c-985a-34dd-0481-d6c6a8d28377.png)


###a-cone


```html

<!DOCTYPE>
<html>
	<head>

		<script src="https://aframe.io/releases/0.2.0/aframe.min.js"></script>
	</head>
	<body>
		<a-scene>
			<a-cone color="tomato" radius-bottom="1.5" radius-top="0" height="3" position="0 0 0">
			</a-cone>
			<a-sky color="#ECECEC"></a-sky>
		</a-scene>
	</body>
</html>

```
![Cone.PNG](https://qiita-image-store.s3.amazonaws.com/0/274029/bd57f9de-3f60-bdac-d4bf-ea4d88e5458b.png)





###a-cylinder

```html
<!DOCTYPE>
<html>
	<head>

		<script src="https://aframe.io/releases/0.2.0/aframe.min.js"></script>
	</head>
	<body>
		<a-scene>
			<a-cylinder color="crimson" radius="1.5" height="2.5" position="0 1 0">
			</a-cylinder>
			<a-sky color="#ECECEC"></a-sky>
		</a-scene>
	</body>
</html>

```

![Cylinder.PNG](https://qiita-image-store.s3.amazonaws.com/0/274029/58229356-d434-5ff2-6f62-4dfd513622d0.png)


###a-plane 
```html
<!DOCTYPE>
<html>
  <head>
    <script src="https://aframe.io/releases/0.8.0/aframe.min.js"></script>
  </head>
  <body>
    <a-scene>
      <a-plane position="0 0 -4" rotation="-90 0 0" width="4" height="4" color="#7BC8A4"></a-plane>
      <a-sky color="#ECECEC"></a-sky>
    </a-scene>
  </body>
</html>
```

![Plane.PNG](https://qiita-image-store.s3.amazonaws.com/0/274029/f4fb9047-b0fc-8590-2766-58d91f02d19d.png)



##Sample空間

これらを組み合わせると，A-Frameがサンプルとして表示している空間ができあがります．


```html
<!DOCTYPE>
<html>
  <head>
    <script src="https://aframe.io/releases/0.8.0/aframe.min.js"></script>
  </head>
  <body>
    <a-scene>
      <a-box position="-1 0.5 -3" rotation="0 45 0" color="#4CC3D9"></a-box>
      <a-sphere position="0 1.25 -5" radius="1.25" color="#EF2D5E"></a-sphere>
      <a-cylinder position="1 0.75 -3" radius="0.5" height="1.5" color="#FFC65D"></a-cylinder>
      <a-plane position="0 0 -4" rotation="-90 0 0" width="4" height="4" color="#7BC8A4"></a-plane>
      <a-sky color="#ECECEC"></a-sky>
    </a-scene>
  </body>
</html>

```

![Example.PNG](https://qiita-image-store.s3.amazonaws.com/0/274029/2de5f1f2-81e9-973c-9a4f-1fb1990d4b4f.png)
React typescript tslint.jsonの変更が反映されない

#環境

win10
react
typescript
npm start コマンド使用 http://localhost:3000/

#状況
TSLint公式に書いてある通りにtslint.jsonに変更を加えたのに、変更が反映されない

#解決策

npm startが実行しているターミナルを、ctrl + cで終了してnpm startを実行、で変更が反映されました

書き方間違ったかな？と思って１時間くらいいろんなサイト徘徊してました、、、
DatePickerをコードで作って画面遷移を早くしよう


最近「この画面遷移なぜか遅い...なぜだ...」と思い、真面目に調査したところ、
InterfaceBuilderで作成したDatePickerを持つPickerViewのnibのloadに
凄まじく時間がかかっていることが分かりました。

※画面遷移の遅さを調べるために参考にした記事
https://qiita.com/ken0nek/items/7577d26143a6fe4355f9

## 原因

正直、詳しい原因は分かりませんでした...
もし分かる人がいたら教えてください。m(_ _)m

## 対策: InterfaceBuilderを使わなければ良い！

UIDatePickerをコードのみで生成するようにしてしまえばよいのです！
この記事では、InterfaceBuilderで生成した場合とコードのみで生成した場合の
両方のコードを紹介しつつ、挙動がどれくらい違うかを示します。

### InterfaceBuilderを利用してUIDatePickerを生成

コード: https://github.com/fuwamaki/function_confirm/tree/master/FunctionConfirm/Picker/NibPickerView

InterfaceBuilderを用いる場合は、こんな感じにxibファイルを生成して、

![](https://i.imgur.com/1CckYfG.png)

xibファイルに紐付いたクラスを設けて、
※NibLoadableは拡張クラス。

```swift

import UIKit

final class CustomPickerView: UIView {
    
    @IBOutlet weak var datePickerView: UIDatePicker!
    
    override func awakeFromNib() {
        super.awakeFromNib()
    }
}

extension CustomPickerView: NibLoadable {}
```

用いたいViewから参照して利用します。

```swift

func setupCustomPickerView() {
        customPickerView = CustomPickerView.instantiateFromNib()
        textField.inputView = customPickerView
        customPickerView.datePickerView.addTarget(self, action: #selector(PickerVC.datePickerValueChanged(sender:)), for: UIControlEvents.valueChanged)
}
```

これでDatePickerを実現できます。

### コードのみでUIDatePickerを生成

コード: https://github.com/fuwamaki/function_confirm/tree/master/FunctionConfirm/Picker/CodeOnlyPickerView

xibファイルなどは設けず、UIViewなどのクラスを作成して、

```swift

import UIKit

final class CodeOnlyPickerView: UIView {

    var datePicker: UIDatePicker = UIDatePicker()

    override init(frame: CGRect) {
        let view = CGRect.init(x: 0, y: 0, width: 320, height: 216)
        super.init(frame: view)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    func setupDatePicker() {
        datePicker.datePickerMode = .date
        datePicker.locale = Locale.current
        datePicker.maximumDate = Date()
        addSubview(datePicker)
    }
}
```

用いたいViewから参照して利用します。

```swift

func setupDatePicker() {
        let datePickerView = CodeOnlyPickerView()
        textField.inputView = datePickerView.datePicker
        datePickerView.datePicker.addTarget(self, action: #selector(PickerVC.datePickerValueChanged(sender:)), for: UIControlEvents.valueChanged)
}
```

別にUIViewクラスを特に設けず、 `UIDatePicker` をViewController側のクラスで生成して利用するっていうのでも全然OKだと思います。
ともあれ、これでDatePickerをコードのみで実現できます。

### 比較

最新の端末で比較したら、基本的に誤差レベルです。あまり差はありません。
そこで分かりやすいように、5年以上前の端末（iPhone5S）で動作比較します。

mp4からgifに変換したら全体的に遅くなってしまったんですけど許容してくださいm(__)m
比較すると、コードのみの方が少しだけ早いことが分かります。

<img width=240px src="https://i.imgur.com/2bvNKKw.gif">

## まとめ

この記事を見てカスタムフォントを疑ったりしたのですが、違うようでした。
http://tech-tokyobay.manju.tokyo/archives/358
原因は明確じゃなくてアレな感じですが、この記事がどなたかの役に立てば幸いです。
Athenaでパーティション分割しようとしたら怒られてできなかった


エラーメッセージは下記

```
FAILED: SemanticException table is not partitioned but partition spec exists
```

上記のエラーに対しての対応
---

私の場合はパーティション情報を定義したテーブルを再作成しました。


どういう状況でパーティション分割を実行しようとしたのか
---

* パーティションを分割したい対象テーブルのDDLは少なくとも１年前に記述していた。
* データはEMRで整形した後にS3に `s3://hogehoge/fugafuga/2018/12/` といった年、月でディレクトリをS3に切っていた。
	* この「年、月」でパーティションを区切ろうと思ったのが今回。

実際に怒られたパーティション分割DDL
--- 

```
ALTER TABLE '対象テーブル' ADD PARTITION (year='2018', month='12') location 's3://hogehoge/fugafuga/2018/12/'
```


上記を実行した結果、冒頭のエラーが発生した。

```
FAILED: SemanticException table is not partitioned but partition spec exists
```

上記のDDLにミスがあると思い、いろいろ試したがエラーは解決せず。
そもそも、このテーブルのCREATEはどのように行っていたのか（下記）。

```
CREATE EXTERNAL TABLE `テーブル名`(
 カラムの定義たくさん
 )
ROW FORMAT SERDE 
  'org.openx.data.jsonserde.JsonSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://hogehoge/fugafuga'
TBLPROPERTIES (
  'has_encrypted_data'='false', 
  'transient_lastDdlTime'='1519292270')

```


エラーへの対応
---

テーブルの再作成。`PARTITIONED BY`句を追加。


```
CREATE EXTERNAL TABLE `テーブル名その２`(
 カラムの定義たくさん
 )
PARTITIONED BY ( 
  `year` string, 
  `month` string
 )
ROW FORMAT SERDE 
  'org.openx.data.jsonserde.JsonSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://hogehoge/fugafuga'
TBLPROPERTIES (
  'has_encrypted_data'='false', 
  'transient_lastDdlTime'='1519292270')
```

これでパーティションが考慮されたテーブルが作成される。
この段階で `show partitions テーブル名その２;` と実行してもクエリは成功するが結果は空。

2018/12のパーティションを区切ってみる

```
ALTER TABLE テーブル名その２ ADD PARTITION (year='2018',month='12') location 's3://hogehoge/fugafuga/2018/12/'
```

再度 `show partitions テーブル名その２;` を実行すると１件パーティションが作成された。
クロージャって結局何なのか

Swiftについて勉強していて、クロージャがよくわからなくなった。
サンプルコード見ると、なんとなくやってることはわかるが、
いくつコードを見ても、「じゃあ本質的にクロージャって何なの？」というのがつかめなかった。

ググってみたら、なんかみんな混乱していて、
僕が頭悪いんじゃなくて、普通に難しい概念なんだなというのがわかって一安心した。
ネット記事の「わかりやすいクロージャ」系の記事は、記述がバラバラ過ぎて余計に混乱したので、
自分なりの理解を書きたいと思う。

# 最初の理解（誤解）
JavaScriptは少し心得があった。
JSの解説では、クロージャは、
> 処理が終わっても、変数を保持したいときに使う関数。
ガーベジコレクションの対象外なので、処理が終わっても残る

という説明がされていて、クロージャの存在意義は**静的に変数の中身を保持できること**だと思っていた。

Swiftの解説本（「SWIFT実践入門」）を読むと、以下のように書いてある。
> クロージャは、再利用可能なひとまとまりの処理です。
（中略）
クロージャ式は、名前が不要であったり、
型推論によって型の記述が省略可能であったりと、関数より手軽に定義できます。

「え？！ Swiftにおけるクロージャって無名関数のこと言ってんの？」
と最初思いました。

JSとSwiftでクロージャの仕様が微妙に違うのは事実でしたが、これは勘違いでした。
無名関数とクロージャは全然別の概念でした。

# クロージャってなに？
wikipediaによると、クロージャはこんな定義です。

>クロージャ（クロージャー、英語: closure）、関数閉包はプログラミング言語における関数オブジェクトの一種。いくつかの言語ではラムダ式や無名関数で実現している。

あーなるほどね。
完璧にわかったわ。
読んでる皆も完璧にわかったんじゃない？
関数閉包ね。なるほど〜。

# クロージャってなに？（二回目）
せっかく調べたのでもうちょっと書きます。

クロージャ自体は、情報系における一般的な概念。
思想自体は1960年からあるよう。
乱暴に言ってしまうと、定義した関数の中の変数をそのスコープ外から使っても更新し続けられる、という風な説明になります。
わかりやすいかは微妙ですが、イメージ図を描いてみました。
![IMG_0196.JPG](https://qiita-image-store.s3.amazonaws.com/0/333454/9354d3db-de67-9e94-3125-d0e19583c76d.jpeg)
長方形はメモリ空間のイメージです。
左がクロージャではないプログラムの処理、右がクロージャの処理です。
丸１、丸２が関数を呼び出す処理です。
クロージャを使わない場合、丸１、丸２が更新をかけるのは、元の関数を別のアドレスにコピーした値となります。
故に、丸１、丸２の更新結果は必ず独立しています。


```swift:closureでない場合

@discardableResult //戻り値なくても警告出さないように
func funcIncrement() -> Int{
var count = 0
    count += 1
    return count
}

funcIncrement() //1
funcIncrement() //1
```

これを、クロージャ使ってやると、**スコープ外の呼び出しに対しても変数の値が初期化されず、継続されます。**

```swift:closureの場合

let Increment: () -> Int //(Void) -> Int型のクロージャを定義
var count = 0
Increment = {  //ここから実際のクロージャ定義
    count += 1
    return count
    }

Increment() //1
Increment() //2
```

最初見たとき、countを初期化するんじゃないか？と思ったのですが、
変数のキャプチャをするため、二度目以降は変数が定義されず、
丸１の処理で定義した変数とその値を引き継ぐようです。

# どういうときに使ったらいいの？
初心者なので、イマイチ使いみちが思い浮かばないというのが正直なところです。
ただ他の人が書いてるコード見ると、**引数なり戻り値なり**に使うパターンが多そうです。

# Swiftにおけるクロージャ
>- グローバル関数は、名前があり、値をキャプチャしないクロージャです。
- ネストされた関数は、名前があり、囲っている関数にある値をキャプチャできるクロージャです。
- クロージャ式は、周りのコンテキストにある値をキャプチャできる、軽量シンタックスで記述された名前が無いクロージャです。

[The Swift Programming Language 日本語訳](http://www.studiogalago.com/the-swift-programming-language/language-guide/closures/closures/)

# クロージャの何がうれしいの？
スコープ外から、別スコープの変数を保持できる……というのは、
たしかにうれしいような気がしますが、そもそもスコープが分かれてるのは、
スコープ外から変数を破壊されないようにしたいのでそういう仕組みになっているのだから、
別スコープから使うなや、と僕は最初思いました。
 
ただ結局、最近のプログラミング言語では、引数に関数を入れるとか、戻り値に関数を入れるとかが当たり前になっているので、
そういうときにクロージャを使うときれいに記述できるので、みんなうれしいみたいです。
オブジェクト指向の発想なら、クラス作って、そこに値保持して……としなければいけないようなケースでも、
気にせずクロージャを突っ込んで終わり、みたいな。

個人的には下記の説明が一番納得感高かったです。

>私が思う結論から言いますと、関数型プログラミングの発想でプログラミングをしない限り、クロージャは役に立つものではありません。旧来のJava的な発想のコードなら、たぶん、使うことは無いでしょう。ですが、関数型プログラミングを取り入れようとした瞬間、クロージャ無しで様々な動作を実現することはかなり厳しいと言えると思います。逆に言えば、関数型プログラミングを知らない限り、クロージャのありがたみはあまりわからないという事です。
([クロージャについて詳しく教えてください（teratail）](https://teratail.com/questions/81245))

まだ自分でクロージャを便利に扱える気はしないのですが、
Swiftのコード読むときには焦らないようにしたいなと思います。

※内容に誤りがあれば、ご指摘おねがいします！

# 参考リンク
[クロージャ再考](https://qiita.com/pebblip/items/2ed30f59cd5981513908)
[クロージャについて詳しく教えてください（teratail）](https://teratail.com/questions/81245)
GitHubが無料でプライベートリポジトリを無制限に作れるようになったぞ☆


GitHubが無料でプライベートリポジトリを無制限に作れるようになったぞ:grin:
ありがとうMicrosoft:v:

# ニュース記事
https://blog.github.com/2019-01-07-new-year-new-github/

今までプライベートリポジトリは無料プランでは作成できなかったが
誰でも無制限に作れるようになりました

# 無料プランの制限（有料プランとの違い）ヘルプ記事
https://help.github.com/articles/github-s-billing-plans/#billing-plans-for-personal-accounts
・共同編集者は３人まで
・GitHub Pagesの使用不可
・wikiの使用不可
・Protected branchesの使用不可
・オーナー権限の使用不可
・リポジトリインサイトグラフの使用不可

逆に言えばこれ以外は使えるので
個人で開発する分にはまぁ困らないです:ok_hand:
公開するつもりがないならPrivateにしておくのが安全だと思います[^1] 


# GitHubプライベートリポジトリの作り方
ここから https://github.com/new
Privateをチェックするだけ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/230077/38a605f7-bd8c-b040-ed77-f352892ad773.png)

# GitHub既存のパブリックリポジトリをプライベートリポジトリにする方法
## Settingsに行って
![image.png](https://qiita-image-store.s3.amazonaws.com/0/230077/d62974ff-53d3-bf11-3a8c-bf1152116fa4.png)
## Danger ZoneにあるMake privateボタンをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/230077/31f1a5c3-4d89-2163-bf11-2921dc50e66b.png)
## テキストボックスにプライベートにしたいリポジトリの名前を書く
![image.png](https://qiita-image-store.s3.amazonaws.com/0/230077/31923c2e-c92f-2ca8-35fb-36b1dd2d3e65.png)
注意書きにあるようにwikiなどがあればそれは消されてしまいます
## I understand, make this repository privateボタンで完了

![image.png](https://qiita-image-store.s3.amazonaws.com/0/230077/3be4786b-0aa4-0682-7ce5-9e82719492f2.png)
wikiなどの機能に制限が付いていますね

# おまけGitLabからGitHubへ移行しよう

確認して

``` bash
git remote -v
origin https://gitlab.com/~~~~~~~~~~~
```
下記を実行でOK:thumbsup_tone1::thumbsup_tone1::thumbsup_tone1:

``` bash
git remote set-url origin https://github.com/~~~~~~~~~~~
```


[^1]: [GitHub に AWS キーペアを上げると抜かれるってほんと？？？試してみよー！](https://qiita.com/saitotak/items/813ac6c2057ac64d5fef)
Raspberry Pi 専用カメラでQRコードを取得する

## 内容
・Raspberry Pi の専用カメラを使ってQRコード内の情報を取得します。
・コマンドラインで取得する方法を試します。
・Python のプログラムで取得する方法も試します。

## 環境
実際に用いた環境は以下です。
・本体 Raspberry Pi 3B
・OS Raspbian Stretch Lite 2018-11-13 Kernel version 4.14
・カメラ Raspberry Pi Camera V2

## コマンドラインで取得
・最初に zbar-tools をインストールします。
・raspistill で撮影・保管した画像ファイルから zbar-tools でQRコードを読み込み、情報を表示します。
・撮影する画像はWXGA(1280X800)程度の大きさで十分です。（サイズが小さい方が処理も早い。）

詳細は以下を参照ください。

raspistillにいろいろなオプションをつけて写真を撮影してみる
https://www.kabegiwablog.com/entry/2018/07/15/183846

ZBar でバーコード読み取り
http://99blues.dyndns.org/blog/2010/12/zbar/

```
$ sudo apt-get install zbar-tools
（zbar-tools のインストール）

$ raspistill -o image.jpg && zbarimg image.jpg
QR-Code:09CAB423-633D-1801-99CD-001C4DEAA59E
scanned 1 barcode symbols from 1 images in 3.8 seconds
（QRを撮影し、画像ファイルに保管します。）

$ raspistill -t 1 -w 800 -h 600 -o image.jpg && zbarimg image.jpg
QR-Code:09CAB423-633D-1801-99CD-001C4DEAA59E
scanned 1 barcode symbols from 1 images in 0.39 seconds
（画像ファイルのQRコードの情報を表示します。）
```

## Python プログラムで取得
Python プログラム開発は以下の処理手順で行います。
・最初に python-opencv python-zbar をインストールします。
・OpenCV で処理し易いように /dev/video0 としてアクセスできるようにします。
・/etc/modules に bcm2835-v4l2 を登録しておくと毎回登録する必要がない
・プログラムを実行し、QRをスキャンすると表示（重複表示はしないように）

詳細は以下を参照ください。

Pythonで画像処理をするならOpenCVがオススメ！
https://www.sejuku.net/blog/54272

【python】zbarでバーコードを読み取る(画像→数列) 【お家IT#17】
http://motojapan.hateblo.jp/entry/2018/03/05/090402

OpenCVとZbarでバーコード・QRコード認識(Python)
https://qiita.com/Oside/items/67372ca26f2d9ff77458

ラズパイとカメラモジュールでIPカメラ
http://yagitsawa.github.io/2017/06/17/raspberrypi-camera-rtsp-server/

```
$ sudo apt-get install python-opencv python-zbar
（必要なライブラリィのインストール）

$ ls /dev/video*
ls: cannot access '/dev/video*': No such file or directory
$ sudo modprobe bcm2835-v4l2
$ ls /dev/video*
/dev/video0

$ sudo nano /etc/modules
bcm2835-v4l2
（Raspberry Pi の専用カメラをビデオデバイスとして認識させる）

$ python qrTest.py
09CAB423-633D-1801-99CD-001C4DEAA59E
http://www.soft-village.com/
09CAB423-633D-1801-99CD-001C4DEAA59E
^CTraceback (most recent call last):
  File "qrTest.py", line 19, in <module>
    scanner.scan(image)
KeyboardInterrupt
（Python のプログラムで連続してQRコードを読み込ませた実行結果）
```

### Python のコード
```python:qrTest.py
# -*- coding: utf-8 -*-
import cv2
import zbar

scanner = zbar.ImageScanner()
scanner.parse_config('enable')
cap = cv2.VideoCapture(0)
captured = False
oldQr = ""
qr = ""

while True:

    ret, frame = cap.read()
    gray_img = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    rows, cols = gray_img.shape[:2]
    image = zbar.Image(cols, rows, 'Y800', gray_img.tostring())
    scanner.scan(image)

    for symbol in image:
        qr = str(symbol.data)

    if oldQr != qr:
       print qr
       oldQr = qr

    if cv2.waitKey(1) == 27:
        break

cap.release()
```

## 参照情報
QR Code Scanner compatible for RPi 3 ( https://lb.raspberrypi.org/forums/viewtopic.php?t=178411#p1173647 )
Raspberry Pi のカメラモジュールの使い方 ( https://www.mztn.org/rpi/rpi23.html )
OpenCVとZbarでバーコード・QRコード認識(Python) ( https://qiita.com/Oside/items/67372ca26f2d9ff77458 )
Python zbar.ImageScanner() Examples ( https://www.programcreek.com/python/example/98487/zbar.ImageScanner )
Powershellでファイルの拡張子をドット抜きで取得する方法 get extensionname without dot /Period

#Poweshellは拡張子を取得すると.txtになる
拡張子を取得する方法はいろいろありますが、知る限りピリオドというかドットが付きます。
[PowerShell/ファイルのフルパス,basename,拡張子を取得する方法](https://win.just4fun.biz/?PowerShell/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%83%95%E3%83%AB%E3%83%91%E3%82%B9%2Cbasename%2C%E6%8B%A1%E5%BC%B5%E5%AD%90%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)

#SubstringとLength
ものすごく悩んでいたのですが、最初置換を使うおうかと思って遠回りをしていたようです。
Substringで1文字目から取得します。0からカウントしているので0が必ずピリオドになるためです。
しかし、この方法では字数を取得する必要があります。それがLengthです。
しかし、Lengthをそのまま使うと1文字目のピリオドを除外するので足りず、エラーになります。
そこでマイナス１をします。
##拡張子がない場合は$nullではない
拡張子がないと''つまり文字なしが返ります。$nullではありません。

```powershell

$ofile = Get-Childitem('C:\hoge\hoge.txt')
Write-host  $ofile.extension.Substring(1,$ofile.extension.Length-1)

```

##エラーを除外したサブルーチン用

```powershell

$strFileName ="C:\hoge\hoge.txt" 
if((Test-Path $strFileName) -eq $true){$ofile = Get-childItem -Path $strFileName　#ファイルの存在をテスト
if($ofile.PSIsContainer-eq $false){ #ファイルかフォルダか確認
if([string]::IsNullOrEmpty($ofile.extension)){Write-Host "no extention";$strExtension='' #拡張子がなければNullStringを返す
}Else{
$strExtension = ( $ofile.extension.Substring(1,$ofile.extension.Length-1)) ;
Write-Host $strExtension
}
}
}
```


##参考
[ファイルとフォルダのどちらかを判定する方法-バヤシタ](https://bayashita.com/p/entry/show/229)
それにしてもPsicontainerがfalseがファイルになるなんて・・・

[PowerShellで文字列などの変数のNullまたは空文字を確認するには -  2014-11-20 　- YOMON8.NET](https://yomon.hatenablog.com/entry/2014/11/20/225546)
GitHubでプライベートリポジトリが無償で無制限に使用できるようになった

謎の組織ギフハブから謎の発表がありました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Today(!) we’re thrilled to announce unlimited free private repos for all GitHub users, and a new simplified Enterprise offering: <a href="https://t.co/dFgK6KC0Wc">https://t.co/dFgK6KC0Wc</a></p>&mdash; Nat Friedman (@natfriedman) <a href="https://twitter.com/natfriedman/status/1082345111566970880?ref_src=twsrc%5Etfw">2019年1月7日</a></blockquote>

ぶっちゃけ[ITMediaの記事](http://www.itmedia.co.jp/news/articles/1901/08/news051.html)の方が情報量が多かったりするのですが、以下はGitHubのCEO[Nat Friedman](https://twitter.com/natfriedman)による公式ブログ、[New year, new GitHub: Announcing unlimited free private repos and unified Enterprise offering](https://blog.github.com/2019-01-07-new-year-new-github/)の日本語訳です。


# New year, new GitHub: Announcing unlimited free private repos and unified Enterprise offering

本日、開発者がGitHubをより利用しやすくなるために、二つの大きなアップデートを発表します。
無制限の無償プライベートリポジトリと、よりシンプルで統合されたエンタープライズ製品です。

## GitHub Free

GitHub Freeは無制限のプライベートリポジトリを含みます。
無償開発者は初めてGitHubにプライベートなプロジェクトを作ることができ、またコラボレータは最大3人まで無償で使用可能です。
多くの開発者はプライベートリポジトリを使って仕事に応募したり、サイドプロジェクトに取り組んだり、あるいは公開する前に秘密で何かを試したいと考えています。
今日から、それらのシナリオやより多くの色々なことが、GitHubでノーコストでできるようになります。
公開リポジトリはもちろん無償のままで、こちらはコラボレータも無制限です。


## GitHub Enterprise

GitHub Enterpriseは、Enterprise Cloud(以前はGitHub Business Cloudと呼ばれていた)とEnterprise Server(以前はGitHub Enterpriseだった)を統合した新しい製品です。
クラウドもしくはセルフホスト構成でGitHubを使用したい組織は、片方の価格で両方ともに使えるようになりました。
さらに[GitHub Connect](https://blog.github.com/2018-10-16-future-of-software/#business)を使うと両者を安全にリンクさせることができ、開発者が両方の環境でシームレスに開発できるハイブリッドオプションを提供します。

## [Learn more](https://github.com/pricing)

GitHub Pro(以前のGitHub Developer)、およびGitHub Teamももちろん利用可能で、プロフェッショナルのコーディングやコラボレーション機能を必要とする開発者、チームが利用することができます。
そしてもちろん、オープンソースのコントリビュータはGitHub Teamの無償バージョンを使って、公開リポジトリであらゆる作業を行うことができます。

初めてコードを触ってみようとしている学生、世界中に開発者を抱えているエンタープライズリーダー、オープンソースのメンテナ、みんなにとって、GitHubがコーディング、共同作業、そして開発者同士のコミュニケーションを行うのに最適な場所にしたいと思っています。
本日の発表はGitHubの将来へ向けての大きな投資であり、我々はみんなが2019年に何を築いていくのか楽しみにしています。

フィードバックがあれば[Twitter](https://twitter.com/github)にください。


# 使ってみた

だいぶ放置してる[リポジトリ](https://github.com/NurseAngel)にpushしてみました。
自分から見ると草が生えています。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/26088/28ca0ad3-89d3-3a3a-30b7-bd04ab095f8e.png)


しかし周囲からは活動が見えないようになっています。

![02.png](https://qiita-image-store.s3.amazonaws.com/0/26088/a497aca7-842f-1c45-a554-342d7e972d33.png)

設定からプライベートリポジトリの活動を見せられるようにもできるので、中身は見せたくないけど草を生やしたい人は変更するとよいでしょう。

![03.png](https://qiita-image-store.s3.amazonaws.com/0/26088/049a9f69-6806-f3b7-cdae-2efcf0a1fa79.png)


# 感想

必要があるのだったら月7ドルくらい払えよって思うのですが、そんなに使ってる人が少なかったんでしょうかね。
それにしても無制限はやりすぎな気がするのだがどうなんだ。
10か20に制限とかの方がよかったような気がしないでもない。
少なくとも個人ユーザにとっては課金する意味が全くなくなってしまいましたね。

個人ユーザの課金は元々切り捨ててもかまわない程度しかなかったのか、それとも、シェアやソースを集めることに課金以上のメリットがあると判断されたのか、いったいどちらなのでしょうね。

昨年のGitHubはMicrosoftによる買収が話題になり、一時はみんなGitLabへ移ってるとかいう話もありましたが、総合的には[全く影響ない](https://octoverse.github.com/people#time)レベルだったみたいです。
私は最初からAWSよりAzure使ってるタイプなので全く気にしなかったのですが。

今年のGitHubは、これまでよりももっと成長していくことでしょう。
画像中心で回転させて保存するやつ（Python3.7.0、OpenCV3.4.1、Numpy1.15.1）

画像中心で回転させて保存するやつ

## 開発環境
- python 3.7.0
- opencv 3.4.1
- numpy 1.15.1

## ソースコード
~~~python
import cv2
import numpy as np

dirname = "./"
filename = "lena"
extension = ".jpeg"
img = cv2.imread(dirname + filename + extension, -1)
w, h = img.shape[0:2]
for i in range(0, 360, 1):
    rot = cv2.getRotationMatrix2D((h/2, w/2), i, 1.0)
    img_warp = cv2.warpAffine(img, rot, (h,w), flags=cv2.INTER_LINEAR)
    cv2.imshow("img_warp", img_warp)
    cv2.imwrite(dirname + filename + " - " + str(i) + extension, img_warp)
    cv2.waitKey(1)
~~~

## 結果
1°ずつ360°回転させた画像が保存されていればOK
<img width="811" alt="imgaug.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/63863/0d233d27-78be-ec97-9704-a5d5914aae42.png">
Rust初心者が参考になった記事

# はじめに

ちょっと年末にかけて、Rustをガッツリ書く機会があったんですが、
Rustを触ったのが久々ということもあり、結構苦戦した部分もありました。

そこでまた忘れないように参考になった記事をここにまとめておこうかなと考えました。
僕のようにまだRust初心者である方にとっても参考になったら幸いです。

# 参考になった記事紹介

## エラーについての記事

### [Rustでエラーを合成する](https://qiita.com/termoshtt/items/8c015d9289613ec640f1)
この記事を書いたきっかけといってもいいかもしれない。
**`Result<T, E>`と`Result<T', E'>`のEとE'を合成する**方法について記述されている。
これについて知らないとJsonのデシリアライズなどで困ることになる。
記事の核となる`failure`のリポジトリは[ここ](https://github.com/rust-lang-nursery/failure)にあるのでよかったら見てね。

### [RustのOptionとResult](https://qiita.com/take4s5i/items/c890fa66db3f71f41ce7)

**Optionの便利メソッド**と**Resultの便利メソッド**というのが特にいい。
[std::option::Option](https://doc.rust-lang.org/std/option/enum.Option.html)や[std::result::Result](https://doc.rust-lang.org/std/result/enum.Result.html)あたりの公式ドキュメントと一緒に見るとなおよい。

## テストについての記事

### [Writing Tests](https://doc.rust-lang.org/book/ch11-01-writing-tests.html)
[日本語版](https://doc.rust-jp.rs/the-rust-programming-language-ja/1.6/book/testing.html)もあるが[英語版](https://doc.rust-lang.org/book/ch11-01-writing-tests.html)のほうが若干内容がある。
テストの書き方について教えてくれる。
あとは有名なRustリポジトリの`tests`や`.travis.yml`を見るのがいいと思う。

## 文字列についての記事

### [Rustの文字列操作](https://qiita.com/aflc/items/f2be832f9612064b12c6)

多分一番最初に疑問に思う`&str`と`String`についての違いについてわかりやすく触れている。
`&str`についてはライフタイムなども絡むので疑問に思ったらきちんと潰しておきたい。

### [[Rust] 文字列のフォーマット指定（println! / format!）](https://qiita.com/YusukeHosonuma/items/13142ab1518ccab425f4)
タイトルのまんま文字列のフォーマットに関する記事。
もっと詳しく知りたければ[std::fmt - Rust](https://doc.rust-lang.org/std/fmt/)あたりを参考にするとよいだろう。

## ファイルI/Oについての記事

### [Rustでファイルの入出力](https://qiita.com/fujitayy/items/12a80560a356607da637)

これに関しては参考になったというか**今たまたま「こういう記事が知りたかったんだよなあ。」という感じで見つけた**のであげておきます。
ユースケース別にRustでのファイルIOのサンプルコードをあげています。
[RustのファイルI/OにはBufReader, BufWriterを使いましょう、という話](https://qiita.com/gyu-don/items/50f4239fc856bed00dc4)あたりを最初に頭に入れておくとなおよいかも。

## モジュールとクレートについての記事

### [Rustのモジュールの使い方 2018 Edition版](https://keens.github.io/blog/2018/12/08/rustnomoju_runotsukaikata_2018_editionhan/)
複数ファイルを扱う際のわかりやすい記事がなかなか見当たらなかったが、これはわかりやすい上に`Rust2018`に対応した内容になっている。
バイナリクレートとライブラリクレートでごっちゃにならなければあとは大丈夫だろう。

## その他

### [Rust Cookbook](https://rust-lang-nursery.github.io/rust-cookbook/intro.html)

カテゴリ別にライブラリとサンプルコードの紹介がされてています。
カバー範囲が広めなので困ったら一度ここを調べてみるといいかも。

あとは当たり前ですが使用するライブラリのドキュメントやexamplesは役に立ちます。いうまでもないとは思いますが、、

# さいごに

Rustは進化するのが早いので時間が立ったらもうその方法は古いということがあるかもしれません。
なので当時のベストプラクティスが今のベストプラクティスだというのは怪しいです。
最新のRustだとこっちの方がよいというのもあると思うので自分でも一度調べてみることをおすすめします。

ですが、ここで喚起するのは基本的に初心者に向けてなので割と普遍的内容だとは思っていて
初心者だったらそこまで気にせずまずは書いてみることもいいとは思うのでそこはおまかせします。
rails　webアプリケーションのcloneからrails sまで

#環境
macbook pro 
Mojave
#gitのインストール
まずは、gitをHomebrewからインストールする

```terminal
$ brew install git
```

#gitからcloneする
cloneする前にアプリケーションを設置するディレクトリに移動する
ex) cd Desktop

```terminal
$ git clone URL

```

上記のコマンドを打つとusernameとpassを聞かれるので、入力するとダウンロードが始まる

#rbenvのインストール

```terminal
$ brew install rbenv
```
インストールが終わったらPATHを通す

```terminal
$ cd ~ 
$ ls -la #.bash_profileがあるか確認する.ない場合touchで作成
$ vim .bash_prifile # vimで開く
```
.bash_profileに以下を追記

```.bash_profile
if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi
```

```terminal
# 環境のリロード
$ source ~/.bash_profile

```

#rubyのインストール

```terminal
$ rbenv install -l

# リストにインストールしたいバージョンがあるかを確認
$ rbenv install 2.6.0

$ rbenv global 2.6.0
$ rbenv rehash

#installが終了したら、バージョンの確認
$ ruby --version

```
#bundlerのインストール

```terminal
gem install bundler

#バージョン指定したい場合
gem install bundler -v 'バージョン'

#gem　installでバージョン指定したい場合　-v ''でできる
```

#mysqlのインストール

```terminal
#@のあとにバージョン指定.今回は5.5系
$ bundle install mysql@5.5

#mysqlのpathの確認
$ which mysql
/usr/local/bin #これが成功

```
何も表示されない場合mysqlのPATHが間違っている。
私の場合install時logに/usr/local/opt/mysql@5.5/bin/mysqlとなっていたので
ターミナル上で

```terminal
$ sudo cp /usr/local/opt/mysql@5.5/bin/mysql /usr/local/bin

$ which mysql #これで表示されるはず

#installのlogにserverの起動のやり方が書いてあるのでそれを叩く
$ /usr/local/opt/mysql@5.5/bin/mysql.server start
 #serverを起動
```



#tigのインストール

```terminal
$ brew install tig
```

#bundle install
gitからダウンロードしたきたディレクトリに移動

```terminal
$ bundle install #少し時間がかかります
```
#次にmysqlにデータを入れる
mysqldumpでデータを入手し、新しい環境で使えるようにする.

```terminal
#データベースの作成
$  bundle exec rake db:create

$ mysql -u root -p データベース名 < ファイル名.dump

$ bundle exec rake db:migrate

```
# エラーが起きた場合
##Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
mysql.sockがないというエラーなので作成

```terminal
$ sudo touch /tmp/mysql.sock
```
##Can't connect to local MySQL server through socket '/tmp/mysql.sock'(38)
ディレクトリ権限が無いというエラー

```terminal
$ sudo chown mysql:mysql /tmp
```
これでも上手くいかな時は、以下のコマンドを叩くと上手くいったり、いかなかったりする。
このコマンドは、急にmysqlが起動できなくなった時によく使う。
コマンドの内容は、ファイルの削除を行なっている。

```terminal
$ sudo rm -f /var/run/mysqld/mysqld.sock
$ sudo rm -f /tmp/mysql.sock 
```

##ERROR 1071 (42000) at line 25: Specified key was too long; max key length is 767 bytes
ActiveRecordのString型カラムはvarchar(255)定義され、デフォルトだと最大で767byteまでしか使えない。
mysqlの設定を変更する必要がある。

```terminal
#自分の環境の設定の表示
mysql > show global variables like 'innodb%';

#以下のクエリを行う

mysql >set global innodb_file_per_table = ON; #または1. 1 = ON
mysql >set global innodb_file_format=BARRACUDA ;
mysql >set global innodb_file_format_max = BARRACUDA;
mysql >set global innodb_large_prefix= ON; #または1. 1 = ON

```

#まとめ
bundle installでこけた。nokogiriやmysql2のinstallでコケるとなかなか上手くインストールできない。
どうしても、上手くいかないときは一旦uninstallして、再度やると上手くいくことが多い。
環境構築は気合いですね。
MacのVSCodeでC言語のデバッグをする

#はじめに
- Macでしか試してません
- 1フォルダ1プロジェクトです。
 - ひとつのフォルダにtest.c test2.cみたいなのはダメです
- どこでSegmentation Faultしたかわかるよ！
- 2019/5/21に更新

#いるもの
- VSCode
- VSCode用C/C++の拡張機能
- Xcode Command Line Tools

#やってみよう
### コード
- 実行するとSegmentation Faultが出ます

```test.c
#include <stdio.h>

int main(int argc, char const *argv[])
{
  int i;
  int *pointer;

  for (i = 0; i < 3; i++)
  {
    printf("Hello World!\n");
  }

  *pointer = 1;

  return 0;
}
```

##ステップ1: 環境の選択
1. 適当に保存
1. デバッグ→デバッグの開始を選択
    - キーボードでは(Fn+)F5
    - Touch Bar付きの人は「 ▶︎ 」<img width="1680" alt="スクリーンショット 2019-05-21 18.28.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339688/8be9d85a-7c60-5039-fc88-23ad260f52f6.png">

1. なんか出てくるので「C++(GDB/LLDB)」を押す <img width="1136" alt="スクリーンショット 2019-05-21 18.29.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339688/e4134b77-1636-8b54-4b7e-aefbaf8b30ac.png">

1. 「clang ナンチャラ」か「gcc ナンチャラ」ならどちらでもOK（基本的に大差なし)<img width="1136" alt="スクリーンショット 2019-05-21 18.34.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339688/bf24beae-d13d-20f0-338d-1784f0254ec6.png">

1. Launch.jsonが出来てれば設定は終わり<img width="1092" alt="スクリーンショット 2019-05-21 18.35.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339688/0dc5b816-6b4c-98e1-85d3-a220d1445508.png">
2. 自動的にステップ2に進むかもしれません



##ステップ2: いざデバッグ
1. 書いたソースコードに戻る
1. もう一度「デバッグの開始」
    - (ステップ1の2と同じ)
1. 許可しますか？みたいなことを聞かれたらパスワードを入力
1. Segmentation Faultがあったのでこのように怒られます<img width="1136" alt="スクリーンショット 2019-01-08 19.12.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/339688/c961bfd3-ad78-a1e9-47c9-85b1e8c7fa2d.png">

- このようにBreakpointを設定していれば<img width="1136" alt="スクリーンショット 2019-01-08 19.14.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/339688/d03839cf-5958-e647-d2ab-916b248c10ba.png">

- 該当箇所で止まります <img width="1136" alt="スクリーンショット 2019-01-08 19.15.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/339688/3860c854-d7a1-6fe9-98e3-ac42edc6a068.png">
- 赤丸のボタンを押せば、プログラムを順を追いながら実行できます。
 - ループをしたので青で囲った変数iが増えていますね <img width="1136" alt="スクリーンショット 2019-01-08 19.17.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/339688/172bf6f1-0216-82ac-440c-192ff0fe3e62.png">
 - いい感じの説明を見つけたので引用させてもらいます

>［続行］ボタン：中断したプログラムの実行を続行する
>［ステップ オーバー］ボタン：現在行を実行する。行に関数呼び出しが含まれているときには、その関数を呼び出して、関数呼び出し後の行で実行を中断する
>［ステップ インする］ボタン：現在行を実行する。行に関数呼び出しが含まれているときには、その関数の先頭行で実行を中断する
> -［ステップ アウト］ボタン：現在実行中の関数を最後まで実行して、その関数を呼び出した次の行で実行を中断する
>［再起動］ボタン：デバッグを最初からやり直す
>［停止］ボタン：デバッグを終了する
> [ VS CodeでPythonコードのデバッグも楽々！！ (1/4)：Visual Studio Codeで始めるPythonプログラミング - ＠IT](http://www.atmarkit.co.jp/ait/articles/1806/05/news023_2.html)

- 赤い四角を押せば終了です。お疲れ様でした

#補足
 - scarf()は使わない方が楽です。
 - コマンドライン引数はlaunch.jsonのargs内に書きましょう
 - グローバル変数はわかりません
 
#参考
[VSCodeでC言語を実行 - Qiita](https://qiita.com/hi2lu3/items/58f0df998cc961fe7a50)
[Mac の Visual Studio Codeで C/C++ をデバッグするまで（OSX10.11.6, VSCode1.4.0） - Qiita](https://qiita.com/keita1987/items/f01cf9f307fedfca00c6)
Oracle Database マニュアルの探し方（私の場合）

**■■■Oracle Cloudのウェビナーシリーズは→[こちら](https://bit.ly/2VJS8pU)■■■**

マニュアルとよく呼ぶのですが、正式？には、doc（ドキュメント）でしょうか。
それはさておき、「ブック」で一覧表示するのを好んでいます。

# ブック（一覧表示）へのアクセス方法

まずは探したいバージョンのマニュアルへアクセス。ここでは18cとする。

1. 「oracle 18c マニュアル」でgoogle検索
2. 日本語のOTNのページ(URLにtechnetworkを含む)がヒットするのでクリック
3. （ここで一番上にあるのが、日本語に翻訳済みのマニュアルの中では最新バージョン）
4. 該当するバージョンの「View Library」をクリック

以下のように左側にメニューがあるページになったら、メニュー内の「ブック」をクリック

![18cdoc.png](https://qiita-image-store.s3.amazonaws.com/0/297987/a06e4724-81fa-5ad2-a71d-15dcac095033.png)

すると、そのバージョンのマニュアルの一覧が表示される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/297987/0a2dbc67-0784-d78f-1b22-4b6c03e43a77.png)

※ここに無いもの（例えば、SQL Developerのマニュアル）は、Databaseのマニュアル内には含まれないということです。

# 各マニュアルの概要（やりたいことベース）

よく使うものを抜粋。

やりたいこと → **マニュアル名** 

- 初期化パラメータ(init.ora), データディクショナリ(DBA_xxx), 待機イベントなど調べたい → **データベース・リファレンス** 
- SQL構文（文法）を調べたい　→　**SQL言語リファレンス**
- データをロードしたりエクスポートしたい → **データベース・ユーティリティ**
    - SQL*Loader, expdp/impdp, 外部表など
- ORAエラーを調べたい → **エラー・メッセージ**
    - 例：ORA-07445の意味は？ TNS-12154 の意味は？
- dbms_xxx のような、DBに付属のPL/SQLパッケージの詳細を知りたい → **Database PL/SQLパッケージおよびタイプ・リファレンス**
    - 例：dbms_stats.gather_schema_stats (=統計情報収集) の引数は？
- バックアップを取りたい（RMAN概要）→ **Database バックアップおよびリカバリ・ユーザーズ・ガイド**
- バックアップを取りたい（RMANコマンドの文法）→ **Database バックアップおよびリカバリ・リファレンス**
- 過去バージョンとの機能差分を知りたい → **新機能ガイド**
- tnsnames.ora, listener.ora の書き方を知りたい → **Net Servicesリファレンス**
- SQL*Plusで使える固有のコマンド構文を知りたい → **SQL*Plusユーザーズ・ガイドおよびリファレンス**
    - 例：set timing on, col ename for a30 等

# 英語版のマニュアル

最新情報は英語版。

https://docs.oracle.com/en/database/
から、Oracle Database > 対象のバージョン > 

Access Our Bookshelf の **Browse** をクリック。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/297987/0136284a-b9e6-fb86-c8c6-7938c0ce5fbd.png)

すると、ブック（一覧表示）が表示される。

# Oracle Cloud Infrastructure (OCI) 環境の場合

※Oracle Cloud Infrastructure環境の、Database - Virtual Machines（PaaS）を想定しています。

Cloud環境のマニュアル：
https://docs.cloud.oracle.com/iaas/Content/Database/Concepts/overview.htm

> Bare Metal and Virtual Machine DB Systems
>
> ... 中略 ...
>
> Note
>
> This documentation is intended for Oracle database administrators and assumes familiarity > with Oracle databases and tools. If you need additional information, see the product 
> documentation available at http://docs.oracle.com/en/database/.

にあるように、Cloud環境のマニュアルを参照。追加情報として製品のマニュアル（冒頭のもの）を参照する。