OmniAICreator/Qiita-1.07M huggingface dataset:
XBRLの構成要素の解説

# XBRLについて
官公庁や金融監督当局などの情報開示・データ授受に利用されているXBRLについての情報をまとめます。

# XBRLとは
XBRL（eXtensible Business Reporting Language）は、事業報告に用いられるXMLベースの言語です。日本語では「拡張可能な事業報告言語」と訳されています。XBRLで扱われる事業報告情報は主に財務情報（バランスシート、損益計算書、キャッシュフロー）が主でしたが、近年では非財務情報（経営情報・企業の社会的責任・環境報告など）にも適用されつつあります。

# XBRLの仕様
XBRLの仕様は [XBRL International](https://www.xbrl.org/) で公開されています。今回の概論については、XBRLの基本的な仕様「[XBRL 2.1 Specification](https://specifications.xbrl.org/work-product-index-group-base-spec-base-spec.html)」をベースに説明しますが、その他応用的なXBRL技術の仕様についても公開されています。詳細は [XBRL Specifications](https://specifications.xbrl.org/specifications.html) の一覧から参照ください。

「XBRL 2.1 Specification」については、JIS規格（JISX7206）として登録されていますので、[JIS検索](http://www.jisc.go.jp/app/jis/general/GnrJISSearch.html)から日本語訳の閲覧が可能です。

# XBRLの構成技術
XBRL(XBRL 2.1 Specificationの場合)のデータは以下の技術を利用して表現されます。

- XML
- XML Namespace
- XML Schema 
- XLink

特にXBRLのタクソノミはXMLSchemaを、リンクベースはXLinkの技術を利用して記述するため、XBRLの内容を紐解くためには上記のようなの知識をある程度有していることが前提となります。

# XBRLの基本構成要素
XBRLは主に2つの要素で構成されています。

- インスタンス文書
- タクソノミ文書

これらの構成要素は「報告内容」と「報告書フォーマット」の対となっており、どちらか片方について中を見たとしても、内容を完全には理解することはできません。このため、通常、XBRLファイルの内容を閲覧する場合は、専用のビューアやエディタを利用する必要があります。

## インスタンス文書
インスタンス文書は報告書を構成する要素の中で言えば「報告内容そのもの」にあたります。インスタンス文書はXMLファイルとして定義され、報告情報はXMLの要素としてタグづけされた状態で表現されます。ただし、項目名や勘定科目などの情報はタクソノミ文書に定義されており、インスタンス文書には含まれません。データの作成者によって、XMLタグに項目を連想できるような名前を付けていることが多いですが、正確な項目名はタクソノミ文書と一緒に閲覧しなければ確認できません。

報告情報の要素に対しては「年度」の情報（コンテキスト情報）、「単位」の情報（ユニット情報）を付与することができます。これらの年度・単位の情報もインスタンスの中に定義します。

なお、インスタンスのファイル拡張子は「.xml」や「.xbrl」等、作成主によって異なる場合があります。

## タクソノミ文書
タクソノミ文書は報告書の「フォーマット」にあたる部分です。タクソノミ文書もインスタンス文書と同様にXMLファイルとして定義されますが、前述のXML技術（XML Schema、XLink）を使用して定義されます。タクソノミ文書は以下の2つの要素により構成されています。

- タクソノミスキーマ（XML Schema）
- リンクベース（XLink）

### タクソノミスキーマ
タクソノミスキーマはインスタンスで表現される項目（要素）の情報をXML Schemaを利用して定義します。具体的には、財務情報であれば勘定科目、非財務情報であれば報告項目、というような単位で項目を定義します。タクソノミスキーマファイルはスキーマなので、ファイルの拡張子は「.xsd」となります。

### リンクベース
リンクベースには、タクソノミスキーマで定義した項目間の関係をXLinkを利用して定義します。XBRL 2.1 Specificationの場合、以下のような内容を各種リンクベースで定義します。

- 各項目の名前：Label Linkbase（ラベルリンク）
- 各項目間の表示順序：Presentation Linkbase（表示リンク）
- 各項目間の関係情報：Definition Linkbase（定義リンク）
- 各項目間の計算情報：Calculation Linkbase（計算リンク）
- 各項目の参考情報：Reference Linkbase（参照リンク）

XBRL 2.1 Specificationに定義されていない応用的なリンクベースも存在しますので、これらを組み合わせてより高度な情報を定義することも可能です。

リンクベースの定義はタクソノミスキーマとは別ファイルとして定義することができます。このときファイルの拡張子は「.xml」となります。
docker コンテナで python 開発

## 概要
以前、[pyenv 利用のまとめ](https://qiita.com/m3y/items/45c7be319e401b24fca8) という記事を書いたのですが、
今でもたまに参照頂いているようでありがたいことです。

ただ最近 python でスクリプト書く際には pyenv ではなく　docker を利用することが多いので、
その方法をメモしておきます

## tl;dr
- docker で python 開発環境構築
- ローカルで編集、コンテナで実行・テスト
- （ほぼ）そのままデプロイ

## 環境
- macOS High Sierra
- Docker CE for Mac

# 準備
- docker for mac をインストール
  - https://store.docker.com/editions/community/docker-ce-desktop-mac
- 準備おわり 

## ディレクトリ構成
以下のようなディレクトリ構成を想定しています

```
.
├── Dockerfile
└── sample.py # 対象のスクリプト
```
上記は簡略化して書いていますが、要は普段利用している構成に Dockerfile を追加しただけ


## 構築と利用

#### 実行環境用 Dockerfile の作成
必要なパッケージをインストールした Dockerfile を作成

```shell:Dockerfile
FROM python:3

RUN pip install requests==2.18.4 click==6.7
```
パッケージのバージョン指定の有無はお好みで。

#### build して、利用する
上記で設定したコンテナを build して、その上で開発していく

```shell
$ docker build -t myproject -f /path/to/Dockerfile
$ docker run --rm -it myproject bash
```

...のですが、これだとろくに設定されていないエディタで作業することになるのでツライ
ローカルとコンテナ内を同期して、書くのはローカルのエディタ、テストや実行はコンテナで行うようにする

```shell
$ docker run --rm -it -v $(pwd):/usr/local/src/myproject myproject bash
root@2156ba4f# python sample.py
```

ただ、毎回 docker コマンドにオプション渡すのも面倒くさいので、
かんたんな wrapper スクリプトを用意

```shell:run.sh
#!/bin/sh

IMAGE_NAME=$1
shift

if [ "${IMAGE_NAME}" = "" ]; then
  exit 1
fi

docker run --rm -it \
  -v $(pwd):/usr/local/src/${IMAGE_NAME} \
  -w /usr/local/src/${IMAGE_NAME} \
  ${IMAGE_NAME} "$@"
```

wrapper スクリプト経由で利用

```shell
$ ./run.sh myproject python sample.py
```

直接コマンド実行でも良いんだけど、
コンテナの立ち上げ時間が気になる場合は `bash` とかで中に入ってしまう（予めコンテナ起動しておく）と良いと思います。

```shell
$ ./run.sh myproject bash
root@2156ba4f# ls
Dockerfile run.sh sample.py
root@2156ba4f# python sample.py
```

## まとめ
この環境で開発するようになってから、
ある程度形になってきたら Dockerfile に スクリプトの COPY とか、
CMDとかENTRYPOINT書くだけで、デプロイできるようになるのでとても楽
ユーザー登録機能つき投稿サイト⑥（header編集：ユーザーページ&投稿者が編集と削除＆dependent: :destroy）

application.html.erbに以下を追加。


```application.html.erb
<header>
    <% if user_signed_in? %>
      <%= link_to current_user.name,edit_user_registration_path %>
      <%= link_to "新規投稿",new_post_path %>
    <% else %>
      <%= link_to "サインイン",new_user_session_path %>
      <%= link_to "新規ユーザー登録",new_user_registration_path %>
    <% end %>
</header>
```
post/show.html.erbに以下を追加。

```post/show.html.erb
<% if @post.user == current_user %>
    <%= link_to "編集",edit_post_path(@post) %>
    <%= link_to "削除",post_path(@post),method: :delete,data:{confirm:"削除してもいですか？"} %>
<% end %>
```
post.rbに以下を追加。

```ruby:qiita.rb
has_many:comments,dependent: :destroy
```
ユーザー登録機能つき投稿サイト⑤（いいね機能追加）

[act as votable](https://github.com/ryanto/acts_as_votable)をつかう。

1,gem 'acts_as_votable', '~> 0.11.1' →　bundle

２、votes tableを作成。
rails generate acts_as_votable:migration
3,post モデルにacts_as_votableを追加。
4,ルーティングに以下を記述。

memberに関しては[2.10.1 メンバールーティングを追加する](https://railsguides.jp/routing.html)を参照。

```routes.rb
resources :posts do 
    member do
      get "like", to: "posts#upvote"
      get "dislike", to: "posts#downvote"
    end
    resources :comments 
  end
```

これにより「/posts/:id/like」と「/posts/:id/dislike」が作成される。

5,posts_controller.rbでbefore_actionとアクションを設定。


```posts_controller.rb
before_action :find_post, only: [:show, :edit, :update, :destroy, :upvote, :downvote]
before_action :authenticate_user!, except: [:index,:show]

:
:
:
:
:
:

def upvote
    @post.upvote_by current_user
    redirect_back(fallback_location: root_path)
end
    
def downvote
    @post.downvote_by current_user
    redirect_back(fallback_location: root_path)
end
```
7,posts/show.html.erbとposts/index.html.erbに以下を追加

```posts/show.html.erb
<p><%= link_to "いいね！", like_post_path(@post), method: :get  %>：<%= @post.get_upvotes.size %></p>
<p><%= link_to "ダメだね!", dislike_post_path(@post),method: :get %>:<%= @post.get_downvotes.size %></p>
```

```posts/index.html.erb
<p>いいね！：<%= post.get_upvotes.size %></p>
```
ハッカソンの効果について

実は最近頭の体操として以前の業界で経験済みで最近復活したハッカソンの効果について書いてみようと思います。
<strong>1.頭の回転が早くなった</strong>
これは実際に今現在おきていることなんですが。
頭の回転がハッカソンに行っていなかったときより約二倍で仕事をできるようになりました。
それはIT業界人として異端の頭脳をJ-Phoneのデータ系の指令業務時代に培った能力でもある右脳・左脳の並列処理ができるように戻って来ました。
これをマスターするのにはかなりの時間を必要とされました。
これはエンジニアだったからできる荒技です。
ウェブエンジニア時代も良くやっていました。
これができるといいことも多いです。
<strong>2.物事の見極めが早くなった</strong>
これも上と同じことなんですが。
見極めが鋭く早くなるとすべてのことが早く進みます。
切り分けが早くなることは良いことだと思います。
仕事をくっきり分けることができるようになります。
<strong>3.時間に鋭くなる</strong>
実はこっそりポドロニングを導入しました。
こっそりと右脳と左脳をわざと切り替え間引きすることができるようになりました。
忙しくなってもこれをしながら実はペースを落とすことなく仕事ができるようになりました。
意識的にペースを落とすこともたまにしています。
その時は営業さんなどに電話する時間やメールをする時間に当て緊密になることが多いですね。
<strong>4.ギブアンドテイクは重要です</strong>
ギブアンドテイクはどの業界でも重要です。
これを疎かにするとろくなことが起きません。
前の業界では社長の独断と偏見に立ち向かいながら親会社の社長と総務部長と仲良くなっていたこともあり実はいまの業界に移った時にもわがままを聞いて頂きました。
そろそろそのわがままを続けている訳にも行かなくなったので復活の待望論が最近多々或る訳です。
いろんな人たちと出会いがありますよ。
<strong>5.頭の体操は重要です</strong>
ハッカソンでの頭の体操は結構疲れますがこれを続けると色んな能力も開花することがあります。
82歳プログラマーの若宮さんの発言実は深いです。
頭の体操であるハッカソンのおかげで若返り効果もあると思います。
頭の体操で仕事改革ができると自分は思っています。

これを期に言いたいことは<strong>仕事を早く進めたい人はハッカソンで頭の体操することをお勧めします。</strong>
会社のSVNを一人だけ脱出してGitを使う


現在開発でSVNを使っています。 
でも色々と不満が。  

- 集中型バージョン管理システムのため、気軽にコミットできない。
- コーディング途中に作った部分を戻したいと思っても、前回コミットしたタイミングまでしか戻せない。
- Gitを導入することを提案したが、大人の事情で不可能…

それでもGit使いたい…  
ということで、git-svnを使いローカル環境でGitを使えるようにしてみます。

# 現在のSVNの状況

社内のSVNの運用について纏めてみます。  

- **リポジトリ周り**
	- 社内のファイルサーバー内のリポジトリ置き場に置いてあるリポジトリからソースを取得。
	- そのためSVNサーバー構築していないので、アクセスは file:// のみ。
- **運用周り**
	- trunkすらない…

この状態を前提として進めていきます。

# 環境イメージ
今回は以下のような環境を作成します。

- リモートリポジトリ：既存のSVN  
- ローカルリポジトリ：Git ←New!

# 構築手順
## ０．参考資料

主に以下を参考にして構築しました。

[現場がSubversionでつらい貴方へ…自分だけこっそりGitで開発する方法](http://interprism.hatenablog.com/entry/git-svn)
[Git for Windows インストール&設定](https://qiita.com/shinsumicco/items/a1c799640131ae33c792)

## １．ツール準備

そもそもPCにGitが入っていなかったので、Git環境の構築から進めます。

準備したのは以下。

- Git for Windows
	- 後にSouceTreeを上げていますが、内蔵のGitではなくシステムの物を使いたいため。
- SourceTree
	- おなじみのGUIクライアントツール。まだGit初心者のため、コマンド操作に不安があるので…

システムのSubversionは既に導入済みのため今回は用意しませんでしたが、svnserveを使えるようにしておく必要があります。

準備したツールの初期設定は割愛します。

## ２．svnserveの設定

過去にも構築にチャレンジしたことがあるのですが、  
ネットワークドライブにアクセスする必要があるからか、 `file://` では `git svn clone`できませんでした。  
`svn://`であればアクセスが可能になるという情報を[ここ](http://d.hatena.ne.jp/naga_sawa/20101114/1289709803)で見つけたので、これを参考にしてみます。

自分のPC内で完結させたいため、svnserveをローカルで立ち上げます。

```
svnserve.exe -d --root [リポジトリのパス]
```

会社のリポジトリ置き場の構成がフォルダ入れ子が酷く複雑なため、大元のリポジトリ置き場に設定しようとした場合、cloneできませんでした。  
そのためリポジトリを直接指定し、svnserveの呼び出しをバッチファイル化してあります。 

裏でコマンドプロンプトが立ち上がりっぱなしになるけど我慢…  
根本的な解決をしたいところ。

## ３．既存のSVNからローカルリポジトリを取得

上記のSVN環境を考え、以下のとおりコマンドを入力。

```
git svn --prefix svn/ svn://localhost [ローカルリポジトリ名]
```
trunkが存在しない上、trunkに相当するディレクトリが存在しないという欠陥SVNのため  
特にオプションを指定していません。  
強いて言うなら `--prefix` オプションとローカルリポジトリ名を指定したくらい。

これでローカルリポジトリでソースをコミットできるようになりました。やったね！

SourceTreeの設定についても特別なことはしていないため、割愛します。

# 現環境の問題点
ローカルコミットはできますが、SouceTreeからSVNにプッシュできない状態に…
ローカルでsvnserveを動かしているのが原因なのかどうなのかをちょくちょく調べています。
早いところ解決しなければ…

# まとめ
まだ全ての問題が解決した訳ではありませんが、現時点で開発自体は大分効率化したと思います。 
ローカルリポジトリ内ならブランチも切り放題だし、これまで不自由してた部分は大分解決しそうです。
PythonでcsvからSQL ServerにINSERTするユーティリティクラスを作った

# この記事の内容

スクレイピングなどで集めたcsvファイルを分析のためにRDBに入れたいということはよくありますね。
ただし、いちいちインポートしたりbulk insertするのも面倒です。そして、なんなら収集と同時に取り込みも自動でやりたいところ。
そういう場合に役立つ道具がほしかったので作りました。

[sawadyrr5/CsvImporter: Easy Csv to RDB Importer.](https://github.com/sawadyrr5/CsvImporter)

## どういう機能があるか

- 最低限, データソースのcsvファイル名と投入先テーブルを渡すと動作します.
- 取り込み時に列名の変換や, 元データに無い列の追加ができます.(データ基準日など)
- 処理速度対策のためにmultiple INSERTを使っています. ローカル環境で109万行を110~140秒程度で処理します.

## How to use
### インスタンス化

DB-APIのconnectionオブジェクトを渡して, インスタンス化します.

```py:csvimporter.py
import pymssql
from csvimporter import CsvImporter

MyConnection = pymssql.connect(
    host="127.0.0.1",
    user="hoge",
    password="fuga",
    database="db"
)

importer = CsvImporter(MyConnection)
```

### csvファイルの読み込みと, 格納先テーブルの指定

`.read_csv()`メソッドで行います.

```py:
importer.read_csv(file, table, header=False, mapping=None, skiprows=0)

```

- `file`: csvファイルパスを指定
- `table`: テーブル名を指定
- `header`: csvファイルのヘッダー有無を指定
- `mapping`: csvファイルのヘッダー名変更を指定
- `skiprows`: 先頭から読み飛ばす行数を指定

headerとmappingの可能な組み合わせは次の通りです.

#### header=False, mapping=None (既定の動作)

csvファイルの列順がテーブルの列順と同じであるものとしてINSERTを行います.
csvファイルとテーブルの列順が異なる場合は正常に動作しません.

#### header=False, mapping=あり

指定できません(エラー)

#### header=True, mapping=None

csvファイルのヘッダーをもとにINSERTを行います.
csvファイルとテーブルの列順が異なっていても対応できます.
csvファイルの列とテーブル列に不一致がある場合は正常に動作しません.

#### header=True, mapping=あり

csvファイルのヘッダーをmappingにしたがって変換した列名でINSERTを行います.
csvファイルとテーブルの列順が異なっていても対応できます. 変換は{"旧列名": '新列名'}の形式で辞書を渡して行います.
変換後の列とテーブル列に不一致がある場合は正常に動作しません.
新列名が重複する場合はエラーとなります.
mappingのkeyに無い列は無視されます.

### 列の追加

`.read_csv()`でファイルを読み込み後、列を追加することができます.

```py:
importer.add_column(option, name, type_code, value=None)
```

- `option`: 追加モードを指定(現在'f'(固定値)のみ対応)
- `name`: 列名を指定
- `type_code`: データ型を指定(1=char/varchar, 3=int/float, 4=datetime, 5=decimal/numeric)
- `value`: 値を指定

例えば, 以下のようにすると, INSERT時に固定値の基準日列を付加することができます.
日次配信されるcsvデータに基準日を付けて保存するような場合に便利です.

```py:
importer.add_column(option='f', name="基準日", type_code=4, value='2018-02-11')
```

### 実行

SQLを発行してRDBに書き込みを行います.
内部的にmultiple insertを利用しており, ローカル環境では109万行を110~140秒程度で処理できました.

```py:
importer.execute()
```

### サンプルスクリプト

まとめると, 以下のようになります.

```py:sample.py
import pymssql
from csvimporter import CsvImporter

MyConnection = pymssql.connect(
    host="127.0.0.1",
    user="hoge",
    password="fuga",
    database="db"
)

file = 'hoge.csv' # ヘッダ有 列A/B/Cから成る
table = '[db].[dbo].[fuga]' # 列A/B/D/基準日から成る(列Dの内容はcsvの列Cと同じ)
mapping = {
    "C": 'D'
}

importer = CsvImporter(MyConnection)
importer.read_csv(file, table, True, mapping)
importer.add_column(option='f', name="基準日", type_code=4, value='2018-02-11')
importer.execute()
```
今更ながら Ruby on Rails Tutorial をやってみた (その3)

## この記事について…

普段はRuby on Railsと無縁なプログラマなんですが、今更ながら**面白そう**という単純な理由から**Ruby on Rails Tutorial**をやってみようと思い立ちました。今回は[前回の記事](https://qiita.com/hideki0145/items/bb1afb0970ab7c07110a)の続きで第3章をやっていきます。
尚、Rails 5.1に対応した第4版を用いて、かつVagrantを使用した環境で進めていきます。

## 第3章 ほぼ静的なページの作成

この第3章からは共通のアプリケーション(sample_app)をカスタマイズしていきます。毎度お馴染みの`rails new`コマンドを利用してアプリケーションを生成します。

前回変数名の単数形・複数形使い分けの話を少ししましたが、他にもコントローラ名はキャメルケース、ファイル名はスネークケースで書くという慣習があるようです。誰が見ても一意に理解できる記法というのは好感が持てますが、実現場でも皆さま守られていらっしゃるのでしょうか？
今回はチュートリアルということもありますが、指示の通り忠実に記法を守って進めていきたいと思います。

さて、第2章では`rails generate scaffold`を駆使しましたが、第3章では次のコマンドを使用します。

```bash
rails generate controller ControllerNames actionname ...
```

`scaffold`ほどは自動生成されるファイルが少ない為、内容は理解しやすかったです。
また、`rails generate`をはじめとしたコマンドには以下の短縮形があります。覚えておきたいですね。

```bash
# rails server
$ rails s
# rails console
$ rails c
# rails generate
$ rails g
# rails test
$ rails t
# bundle install
$ bundle
```

今回はRubyの「DRY」(Don't Repeat Yourself)という原則とテストの書き方を上手く組み合わせて、「まずテストを書く」「コードの繰り返しを恐れず動くものを作る」「徐々に処理の共通化を行う」という流れで学習を行いました。普段技術者として働いている自分はもちろん、初学者でもわかりやすく読み進めることができるんじゃないかと思います。チュートリアルの完成度の高さを感じました。

最後に、第3章で使ったGitコマンドでチュートリアル本文に記載のないものの備忘録。

```powershell
# 演習をcommitしちゃったんで戻す
git reset --hard HEAD^
# helloアクション追加前のファイルを戻す
git checkout <ハッシュ値> .\app\controllers\application_controller.rb

# masterにstatic-pagesをmergeするときfast-forwardしないようにする(コミットログを見易くする為)
# ⇒ --no-ff オプションを merge 時に付ける
git checkout master
git merge --no-ff static-pages
# 不要になったstatic-pagesを削除
git branch -d static-pages
# リモートリポジトリに残っているstatic-pagesを削除
# ⇒ --delete オプションを push 時に付ける
git push --delete origin static-pages

# git branch -r したときにリモートで削除済のstatic-pagesが表示されるのを消す
# ⇒ --prune オプションを fetch 又は pull 時に付ける
git fetch --prune
```

それでは、次回 第4章から再開したいと思います。
クラウド型開発環境(クラウドIDE、Cloud IDE)

# クラウド型開発環境(クラウドIDE、Cloud IDE)

クラウド型開発環境(クラウドIDE、Cloud IDE)では、環境構築することなく、今すぐウェブ開発などをはじめられます。
ここでは、日本語対応のクラウド型開発環境(クラウドIDE、Cloud IDE)の [PaizaCloud Cloud IDE](https://paiza.cloud/) の始め方を紹介します。

## サイトを開く

クラウド型開発環境(クラウドIDE、Cloud IDE)の [PaizaCloud Cloud IDE](https://paiza.cloud/)のサイトを開きます。日本語のページが表示されます。

## サインアップ

「登録無料」をクリックして、サインアップします。Google / Facebook / GitHubのソーシャルログインにも対応しています。メールアドレスで登録した場合は、確認メールをクリックします。

## 新規サーバ作成

新規サーバ作成ボタンを押して、サーバを作成します。サーバ名や、用途を入れて「サーバ作成」ボタンを押します。
3秒ほど待てばサーバが立ち上がります。

## 操作
ブラウザ上で、ファイル管理、ファイル編集、ターミナル、ブラウザなどが使えます。クラウド型開発環境(クラウドIDE、Cloud IDE)は、どこからでも、いつでも同じ環境が使えるのが利点です。
GNU GLOBALを使ったコードリーディング環境の構築

# 前提

* GNU GLOBALを使ったコードリーディング環境をDockerコンテナ上に構築した際のメモです
* Dockerはインストール済みです
* GNU GLOBALによるコードはブラウザで閲覧します
* DockerコンテナはCentOS 6.9を使用します

# 環境
* macOS Sierra 10.12.6
* Docker 17.12.0-ce-mac49
* GNU GLOBAL 6.6.2

# コンテナの準備
* centosイメージのダウンロード
<pre>
# docker pull centos
</pre>
* GNU GLOBAL用コンテナの起動
<pre>
# docker run -it -p 8000:80 --name global centos:centos6.9 /bin/bash
[root@39061ca81695 ~]#
</pre>

以降は基本的にコンテナ内での手順

# GNU GLOBALのインストール
* 依存パッケージのインストール
<pre>
# yum -y install curses ncurses-devel
</pre>
* wgetパッケージのインストール
<pre>
# yum -y install wget
</pre>
* GNU GLOBALパッケージの入手
<pre>
# cd /usr/local/src
# wget http://tamacom.com/global/global-6.6.2.tar.gz
</pre>
* GNU GLOBALのインストール
<pre>
# tar zvxf global-6.6.2.tar.gz
# cd global-6.6.2
# sh configure
# make && make install
</pre>

# ソースパッケージの入手
* /etc/yum.repos.d/CentOS-Base.repoに下記を記述

```
[base-src]
name=CentOS-6.9 - Base - Source
baseurl=http://vault.centos.org/6.9/os/Source/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

#released updates
[updates-src]
name=CentOS-6.9 - Updates - Source
baseurl=http://vault.centos.org/6.9/updates/Source/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

#additional packages that may be useful
[extras-src]
name=CentOS-6.9 - Extras - Source
baseurl=http://vault.centos.org/6.9/extras/Source/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
```
* yum-utilsパッケージのインストール
<pre>
# yum -y install yum-utils
</pre>
* 任意のソースパッケージをインストール
<pre>
# cd /usr/local/src
# yumdownloader --source ファイル名
</pre>

# GNU GLOBAL(htags)によるソースコードのHTMLファイル生成
* その時試していたfileパッケージのソースコード展開を例にしています。
* ソースコードファイルの取り出し

```
# cd /usr/local/src
# mkdir file
# mv file-5.04-30.el6.src.rpm file

# cd file
# rpm2cpio file-5.04-30.el6.src.rpm | cpio -id
# cp file-5.04.tar.gz /usr/local/src
```

* ソースコードファイルの展開
<pre>
# tar zxvf file-5.04.tar.gz
</pre>
* ソースコードへのタグ付けとHTMLの生成
<pre>
# cd /usr/local/src/file-5.04
# gtags -v
# htags -afFnvs
</pre>
* ApacheのDocumentRootにリンクを生成
<pre>
# cd /var/www/html
# ln -s /usr/local/src/file-5.04/HTML file
</pre>

# Apacheの設定
* /etc/httpd/conf.d/global.confにGNU Global用の設定を追加

```apache:/etc/httpd/conf.d/global.conf
<Directory "/usr/local/src">
        AllowOverride None
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
</Directory>
```
* Apacheの起動
<pre>
# /etc/init.d/httpd start
</pre>

# ソースコードリーディング
* ローカル環境のブラウザから下記URLにアクセス
<pre>
http://localhost:8000/file
</pre>

# GNU GLOBAL用コンテナの保存
* コンテナの停止
<pre>
[root@39061ca81695 ~]# exit
#
</pre>
* コンテナの保存
<pre>
# docker commit global xxxxx/centos:global
</pre>
* コンテナの保存を確認
<pre>
# docker images xxxxx/centos
</pre>

# GNU GLOBAL用コンテナの再起動
* コンテナの起動
<pre>
# docker run -it -p 8000:80 --name global xxxxx/centos:global /etc/init.d/httpd start
</pre>
gitのカレントブランチをコピーするワンライナー

## 結論
Macの場合以下コマンドでコピーできます。

```
$ git symbolic-ref --short HEAD | tr -d '\n' | pbcopy
```

## 説明
`git symbolic-ref --short HEAD` はカレントブランチを出力しますが、改行が含まれています。
そのため `tr -d '\n'` で改行を消し、クリップボードにコピーするMacのコマンド `pbcopy` にパイプで渡します。
Debian系では`pbcopy` を `xsel --clipboard --input` に変えれば動くはずです。`xsel` が入っていなかったら `apt-get` でインストールしてください。
CentOSなどはやり方知りません。

```
$ sudo apt-get install xsel
```

`tr -d '\n'` の部分はもう少し良い書き方があるかもしれませんが、私はこの書き方が最初に思い浮かびました。


長いので alias を設定しておくと便利です。

```~/.zshrcなど
alias copy-branch="git symbolic-ref --short HEAD | tr -d '\n' | pbcopy"
```

これでデプロイする際などにブランチをコピーするのが楽チンになりますね！

## 参考
[get current branch name - Qiita](https://qiita.com/sugyan/items/83e060e895fa8ef2038c)
[ターミナルで標準出力をクリップボードにコピーする - Qiita](https://qiita.com/sasaplus1/items/137a70e8f51f97a6636f)
[Mac でも Linux でも一発でクリップボードにコピーする zsh の alias - mollifier delta blog](http://mollifier.hatenablog.com/entry/20100317/p1)
React-navigation で特定のscreenのtransitionアニメーションだけ変更する

# 問題意識
stackNavigation内で特定のページだけ遷移時のアニメーションを変えたかったりする。
が、ぱっとやり方が見当たらなかったのでメモ

# 方法1
ナビゲーションをネストする
https://github.com/react-navigation/react-navigation/issues/707#issuecomment-299859578

```
const MainCardNavigator = StackNavigator(
  {
    Home: { screen: Home },
    CardScreen1: { screen: CardScreen1 },
    CardScreen2: { screen: CardScreen2 },
  },
  {
    headerMode: 'none',
  },
);

const MainModalNavigator = StackNavigator(
  {
    MainCardNavigator: { screen: MainCardNavigator }
    ModalScreen1: { screen: ModalScreen1 },
    ModalScreen2: { screen: ModalScreen2 },
  },
  {
    mode: 'modal',
    headerMode: 'none',
  },
);
```

若干面倒だけれども、シンプルでわかりやすい


# 方法2
transitionConfigでスクリーン名指定で書き換える
https://github.com/react-navigation/rfcs/issues/10
※ もっとスマートな方法が今後議論されるかも。。されないかも。。

```
navigationOptions: {
  transitionConfig: () => ({
    screenInterpolator: props => {
      // Transitioning to search screen (navigate)
      if (props.scene.route.routeName === 'Search') {　//遷移するページを指定して、、
        return CardStackStyleInterpolator.forFade(props); //遷移のアニメーションを指定
      }

      const last = props.scenes[props.scenes.length - 1];

      // Transitioning from search screen (goBack)
      if (last.route.routeName === 'Search') {
        return CardStackStyleInterpolator.forFade(props);
      }

      return CardStackStyleInterpolator.forHorizontal(props);
    },
  }),
}
```

CardStackStyleInterpolatorは下記にあります。function forInitialはexportされていないので、使うなら　forkするなりなんなりするのがいいかもしれない。

```
import CardStackStyleInterpolator from 'react-navigation/src/views/CardStack/CardStackStyleInterpolator'
```

# apendix
もっと複雑なtransitionはどうなるのやら
https://github.com/react-navigation/react-navigation/issues/175

# 結論
取り急ぎ方法2でしのいでいますが、もっといいやり方あれば教えて欲しいです。


# 追記 20180608
v2では少し変わっている
https://github.com/react-navigation/react-navigation/issues/4173
AWSソリューションアーキテクトアソシエイトに1回落ちたけど勉強し直して合格した話

# はじめに

[AWS ソリューションアーキテクトアソシエイト](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/)に2回目の挑戦で合格する事ができました。

ウェブの情報を調べてみると1発合格したと思われる方ばかりで、1度失敗してから合格したという方の情報が少ないようです。そのため

- 初回の受験はどんな準備をしたか
- どうやってスコアを伸ばして合格できたか

について書きます。

# スコアの遷移

総合評点： 53%（不合格） → 74%（**合格**）

| | 初回スコア | 2回目スコア |
|------------| --- | ---- |
| セキュリティ | 45% | 63%（+18) |
| トラブルシューティング | 25% | 40%(+15) |
| 高可用性、コスト効率、対障害性、スケーラブルなシステムの設計 | 60% | 81%(+21) |
| 実装/デプロイ | 50% | 83%(+33) |

トラブルシューティングのスコアがかなり低いですが、占める割合が10%なのでなんとも言えない感じです。

# 初回の受験までにやったこと

もともと AWS のサービスについて EC2/Route 53 を個人的に少しさわったことがあり、S3/CloudFront の存在を知っている程度で、他は全く知識のない状態でした。

受験を決めてから最初に読んだのが次の本でした。

[合格対策 AWS認定ソリューションアーキテクト \- アソシエイト \| 大塚康徳\(日立インフォメーションアカデミー\)](https://www.amazon.co.jp/dp/486594043X/)

現在、国内の試験対策本はこれしかないようです。初学者の自分にとって、試験範囲のサービス全体を俯瞰できるとてもよい本だったのですが、ウェブの情報からこれだけで合格するのは非常に難しいと感じました。

その後、AWS が公開している次の資料を読みました。

- [AWS クラウドサービス活用資料集 \| AWS](https://aws.amazon.com/jp/aws-jp-introduction/)

ただし非常に量が多いため、おそらく全部は読んでいないです。重要と思われるものを（適当に判断して）複数回読んでいきました。EC2, ELB, Auto Scaling, EBS, S3, RDS, VPC, Route 53, CloudWatch, IAM, ... これだけでもかなり多い！

[ホワイトペーパー](https://aws.amazon.com/jp/whitepapers/)は余裕がなくてほとんど読んでいません。

あとは非公式の問題集サービスがあり、こちらを通勤の電車内で解答していました。

- [AWS WEB問題集で学習しよう \| 赤本ではなく黒本の問題集から学習する方向け](https://aws.koiwaclub.com/)

公式の模擬試験もとりあえず受験しましたが、総合評点50%で実力が足りていないことを認識します。

| | スコア |
|------------| --- |
| セキュリティ | 75% |
| トラブルシューティング | 50% |
| 高可用性、コスト効率、対障害性、スケーラブルなシステムの設計 | 33% |
| 実装/デプロイ | 100% |

が、リカバリする時間もないまま受験日を迎えてしまいました。

試験に費やした時間はざっくり**20時間**ぐらいです。

# 2回目の受験までにやったこと

1回目の反省点として、実際にコンソール上でサービスを見たことがほとんどなかったので、単なる暗記になってしまっていたのではないかという思いがありました。

1回目の受験後、運良く通常の業務でサービスを使う経験が増えました。また、AWS では1年間の利用は制限付きで無料なので個人アカウントを登録して色々と構築したりしてみました。

知識としてぼんやりと頭にあったことが、**実際に手を動かすことで具体的な記憶として身についていく実感**が増えました。

だだ、試験範囲のサービスをすべて使うことは個人的にも業務的にも不可能です。

ある時、[Whizlabs](https://www.whizlabs.com) という資格試験のオンライン学習サービスの評判がよかったため購入したところ、これが自分に合っていました。

約$20で558問（60テスト*7回+分野別）の問題があり、一度解いたテストについて「正解のみ」「不正解のみ」「すべて」を解説付きで一覧にして閲覧することができます。一度解いてあとは電車の中でひたすら問題と解説を読んでいました。

ちなみにすべて英語ではありますが、固有名詞が多いのでなんとか読める感じです。

試験に費やした時間は1回目と同じくざっくり**20時間**ぐらいです。

# さいごに

インフラの知識があまりなく、AWS のサービスをほとんど知らなかった自分にとって、この試験は結構難しく感じました。

ただ、すでにAWSに関わる業務を担当されている方にとっては、勘所をつかめば比較的短時間の学習で合格できるのではないかと思います。

ちなみにこれから受験を考えている方は問題が5年ぶりに改定されます。2018年8月12日（タイムゾーンは不明）までは新旧両方を選べるようなのでご注意ください。

- [New AWS Certified Solutions Architect – Associate Exam: Now in General Availability \| AWS Architecture Blog](https://aws.amazon.com/jp/blogs/architecture/new-aws-certified-solutions-architect-associate-exam-now-in-general-availability/)
- [AWS認定のソリューションアーキテクトアソシエイトが5年ぶりに改訂されたのでサンプル問題を日本語訳してみた ｜ Developers\.IO](https://dev.classmethod.jp/cloud/aws/saa-february-2018-sample-questions/)
swift初心者:画面推移時の「whose view is not in the window hierarchy!」の対処方法

#はじめに
初歩的なエラーかと思いますが、初心者のため記録として残したいと思います。

##①whose view is not in the window hierarchy!

```swift:ログ
<famousVoiceApp.ViewController: 0x7f8b16d0ba30> whose view is not in the window hierarchy!`
```

ログ内に表示される上記内容は画面推移のメソッドをviewDidLoad内に記載することにより発生するエラーです。

```swift:誤
override func viewDidLoad() {
     super.viewDidLoad()
        let SecondViewController = self.storyboard?.instantiateViewController(withIdentifier: "Second")
        self.present(SecondViewController!, animated: false, completion: nil)
}
```
ではなく、



```swift:正
override func viewDidAppear(_ animated: Bool) {
     super.viewDidAppear(animated)
       let SecondViewController = self.storyboard?.instantiateViewController(withIdentifier: "Second")
       self.present(SecondViewController!, animated: false, completion: nil)
}
```

以上のようにviewDidAppear内に定義することでエラーが解消されるかと思います。
CORBAがJava SE11で削除されるようです。。。

Java SE11なんて、まだまだ先の話ですが（とはいえ、今年の9月リリース予定:confused:）

Java Code Geeksの[An Early Look at Features Targeted for Java 11](https://www.javacodegeeks.com/2018/02/early-look-features-targeted-java-11.html)の記事によると、この記事が公開された2月5日の時点では4つのJEP(JDK Enhancement Proposal：JDKリリースプロジェクトの長期的なロードマップとそれに関連する取り組み)がJava 11の対象になっていて、そのうちの一つである、[JEP320(Remove the Java EE and CORBA Modules)](http://openjdk.java.net/jeps/320)でCORBAのモジュールを削除することが記載されています。
今、Java SE8を使っているので気づきませんでしたが、Java SE9では既にdeprecatedとなっているようです:rolling_eyes:。

#### そもそもCORBAとは
以前投稿した[CORBAのIDLファイルでメソッドの返り値・引数に配列を指定する方法](https://qiita.com/neriudon/items/60858938d1ad65978239)でも記載しましたが、大まかにいうと異なるOSやプログラミング言語間でも通信ができる仕様です……が、かなり古い仕様で、J2SDK 1.2には既に取り込まれていましたが、今ではレガシーなシステムの保守程度でしか使われていないのでは？と思います。

#### 削除される理由
JEP320をgoogle翻訳を駆使してまとめてみました（誤訳があれば指摘ください:bow:）。

1. CORBAはJavaのコミュニティの外で改善が進められているため、JDKで保守しずらく、またJava EEがサポートする[^1]バージョンと同期させるのは現実的ではない。
2. いまどきJavaでCORBAを使って、**モダンな**アプリケーション開発するケースが少なく、Java EE 8ではCORBA、RMI-IIOP、およびJavaIDLが既に"オプション"という扱い。

CORBAをサポートするメリットが保守するコストに見合わないということのようです。

#### Java SE11でもCORBAを使うには
`java.corba`以下のソースが削除されてしまうため、Java SE11では`idlj`などのコマンドも一切使えなくなりますが、RMI-IIOPのAPIはJava SEに残るため、RMI-IIOPを利用するか、私は使ったことはありませんが[JacORB](https://www.jacorb.org/)というライブラリが最近もメンテナンスされています。

#### 補足
この記事ではCORBAをメインに書きましたが、JEP320のタイトルにあるようにJava EEのモジュールもJava SEから削除されます。こちらは代替策としてMavenで管理されているアーティファクトをJEP320の中でいくつか紹介されているので、そちらを参照してください。

#### その他Java SE11に取り込まれる予定のJEP
頑張ってまとめようと思いましたが、英語力が追い付かず挫折しました:thermometer_face:。

- [JEP 309: Dynamic Class-File Constants](http://openjdk.java.net/jeps/309)
Javaのクラスファイル形式の拡張に関する取り組み。

- [JEP 318: Epsilon: An Arbitrarily Low-Overhead Garbage Collector](http://openjdk.java.net/jeps/318)
新しいガベージコレクション：`Epsilon GC`に関する取り組み。
- [JEP 323: Local-Variable Syntax for Lambda Parameters](http://openjdk.java.net/jeps/323)
暗黙的に型付けされたラムダ式の仮パラメータを宣言するときにvarを使用できるようにする取り組み。

#### 最後に
Java SE11はLTS(Long Term Support)で、～Java SE8から移行されるバージョンになると思うので、Java SE11に追加・変更される仕様は要チェックですね:wave:。とはいえ、この投稿を書いている時点では、まだJava SE10のEAが出たところなので、詳しい解説が出てくるのはこれからでしょう。
あと、普段はJavaを使ったフレームワークを利用して開発しているので、Java自体の仕組みとか読むのに苦戦しました:mask:。

#### この投稿に至った経緯
今携わっているレガシーシステムがCORBAを使っているため、情報収集していたら見つけたので:thinking:。


[^1]: [Java SE Technologies](http://www.oracle.com/technetwork/java/javase/tech/index.html)にはCore ComponentsとしてCORBAが記載されていますが、Java EEの方には見つからないんですよねぇ。ただ[WebLogic](https://docs.oracle.com/cd/E28613_01/web.1211/b65904/appa.htm)や[JBoss EAP](https://access.redhat.com/articles/113373)などのJava EEサーバはCORBAをサポートしている旨が書かれていましたが。
C#で新年会に使えるビンゴマシンを作ってみた

超何となくビンゴマシンとかちょろっと作ってみようと思って作ってみた。ランダムに番号を表示させるだけの簡単なもの。
・開発環境・・・Visual Studio 2017 + Windows 10 Pro
・言語など・・・C#＋WPF
需要ないと思うけどgithubにソリューションファイル一式アップしました
https://github.com/gitk47320/bingo

いや、ほんとにそれだけですｗｗｗｗ
Alexa Skillで利用するLambda関数(Node.js)を、ハマらずに「一から作成」する方法

Alexa Skillで利用するLambda関数の作成では、「設計図」のテンプレートを編集していく方法が広く紹介されています。ただ、テンプレートのAlexa SDKが古かったり、別のライブラリを使う必要があったりするなどで、「一から作成」したいと思うことがあります。ここでは、「一から作成」する方法を説明します。この方法を応用すると、Alexa Skillに限らず、外部ライブラリを含むNode.jsのLambda関数を、インラインエディタで編集できる状態で作成できるようになります。

Node.jsが開発環境にインストールされている前提で説明します。

## Node.jsプロジェクトの作成

開発環境に適当なディレクトリを作ります。

```
$ mkdir SKILLDIR
$ cd SKILLDIR
```

以下のコマンドで、`package.json`を作成します。

```
$ npm init
(案内に従って各種プロパティを設定)
```

`index.js`を作成し、[Alexa SDKのREADMEで紹介されている](https://github.com/alexa/alexa-skills-kit-sdk-for-nodejs#set-entry-point)最小限のコードと、[必須のリクエストタイプ](https://developer.amazon.com/ja/docs/custom-skills/request-types-reference.html)を受け取るハンドラの空実装を入れます。

```js:index.js
'use strict';

const Alexa = require('alexa-sdk');

exports.handler = function(event, context, callback) {
    const alexa = Alexa.handler(event, context, callback);
    alexa.appId = APP_ID // EDIT HERE
    alexa.registerHandlers(handlers);
    alexa.execute();
};

const handlers = {
    'LaunchRequest': function () {
        // EDIT HERE
    },
    'XXIntent' : function() {
        // EDIT HERE
    },
    'SessionEndedRequest': function () {
        // EDIT HERE
    },
};
```

以下のコマンドで、最新の[Alexa SDK](https://github.com/alexa/alexa-skills-kit-sdk-for-nodejs)を`node_modules/`にダウンロードして、`package.json`に参照を追加します。

```
$ npm install --save alexa-sdk
```

(オプション)これから使う予定のライブラリを、同様に追加します。(以下は[axios](https://github.com/axios/axios)の例)

```
$ npm install --save axios
```

## AWS SDKの削除

この時点でZIP化してLambdaコンソールにアップロードしてしまうと、`Lambda 関数 「xxxx」 のデプロイパッケージが大きすぎて、インラインコード編集を有効にできません。`というメッセージが表示されて、インライン編集ができなくなってしまいます。

![symptom](https://qiita-image-store.s3.amazonaws.com/0/10290/4caa972c-58fa-6fe3-844c-00e14b05582c.png)

これは、Alexa SDKをダウンロードする際に、依存ライブラリとして[AWS SDK](https://aws.amazon.com/jp/sdk-for-node-js/)まで`node_modules/`にダウンロードされ、ZIPのサイズが大きくなってしまうためです。

![tree](https://qiita-image-store.s3.amazonaws.com/0/10290/d1ace2e5-0e4e-3c7b-d33e-ebd68370cb2f.png)

これを避けるために、**AWS SDKを削除**します。Lambdaサーバには既にAWS SDKが入っていますので、インライン編集するのであれば、AWS SDKをZIPに含めていなくても構いません。

```
$ npm uninstall aws-sdk
```

## ZIPの作成とLambdaへのアップロード

ZIPで圧縮します。以下は一例です。

```
$ zip -r ../alexa-test.zip *
```

AWSのLambdaコンソールで、関数を「一から作成」します。

関数コードで`コードエントリタイプ`を`.ZIPファイルをアップロード`に変えて、作成したZIPファイルをアップロードします。

![upload](https://qiita-image-store.s3.amazonaws.com/0/10290/5075bf7c-2d6a-a8bd-cfb3-bfa8f7dadb4e.png)

画面右上の`保存`ボタンを押します。うまくいけば、インラインエディタが開きます。

![editor](https://qiita-image-store.s3.amazonaws.com/0/10290/35543159-e960-96af-520f-1352bae69fca.png)


このエディタで、`APP_ID`の部分を編集したり、各ハンドラを正式に実装したりしていきましょう。

## ライブラリの入れ替えが必要な場合

1. 画面上部の`アクション`->`関数のエクスポート`でエクスポートします。
2. エクスポートしたZIPを展開します。
3. 展開されたディレクトリの中で、npmコマンドでライブラリを入れ替えます。
4. `npm uninstall`で**AWS SDKを削除します。**
5. 再度ZIP化してアップロードします。

npmコマンドを実行すると、削除したAWS SDKが復活しますので、必ずZIP化の直前にAWS SDKを削除するようにしてください。
Terminal 上からファイルを GUI アプリケーションで開く（シェルスクリプト）

こんにちは。
macOS の Terminal 上からファイルを GUI アプリケーション（/Applications 内のアプリケーションを想定）で開くためには、```open``` コマンドを使えば良いですが[^1]、これをシェルスクリプト化してみました[^2]。

[^1]: 「[Mac でコマンドラインからアプリケーション起動](https://qiita.com/labocho/items/344b762a30f01aa81759)」も参考になります。
[^2]: なお最初からそのようなコマンドを提供している GUI アプリケーションも多いようです（例えば、[CotEditor](https://coteditor.com) では ```cot``` コマンド）。

```console
$ chmod u+x espr.sh
$ alias espr=espr.sh
$ espr file.html
```

```espr.sh
#!/bin/sh
open -a Espresso "$*"
exit $?
```
pydotplusでgraphvizのパスが解決できない場合の対処法

#はじめに

sklearn.tree.tree.DecisionTreeClassifier を使用すると決定木の結果を.dot形式で出力することができます。これらはpydotplusなどを使って、jupyter notebook上にインライン表示するTipsなどが公開されていますが、

InvocationException: GraphViz's executables not found

といった、Graphvizのパスが解決できないというエラーが出ることがあります。

その問題を解決するTipsを紹介します。

#コード

ポイントは、graph_from_dot_data()の戻り値に対して、dot.exeへのパスをdictionaryで渡す点です。

```python

import io
import pydotplus as pdot
from sklearn.tree import export_graphviz
from IPython.display import Image

dot_data = io.StringIO()
export_graphviz(tree,out_file=dot_data,feature_names=iris.feature_names)

graph = pdot.graph_from_dot_data(dot_data.getvalue())

#dot.exeへのパスをdictで渡す
graph.progs = {'dot': u"C:\\Program Files (x86)\\Graphviz2.38\\bin\\dot.exe"}

Image(graph.create_png())

```
readコマンドなどを使って、txtファイルを読み込み、HTMLファイルを作成する！要はshellscriptを使って流し込みをする。

Web制作などをすると、
流し込みという、原稿を渡されて、原稿のテキストをHTMLに成形?する作業あるじゃないですか？

今思えば、**流し込む原稿の内容**と**HTMLのテンプレート的な**が揃ってたら（内容が決まっていたら）、shellscriptで一瞬じゃないか。

と思い試してみました。:angel_tone2:

# shellscript
```bash:create_html.sh
#!/bin/bash

createHtmlFile()
{
  local textFile="$1"

  # パターンにマッチした部分を取り除いた値に展開する、パラメータ展開
  # ここでは、後方一致のパターンにパス名展開を使い
  # パターンにマッチした拡張子を取り除いて、展開し、
  # 末尾にhtmlの拡張子を追加し、htmlFile変数へ代入。
  local htmlFile="${textFile%%.*}.html"

  # 空のhtmlDrafts配列を作成
  local htmlDrafts=()
  local htmlTemplate=

  while read -r textLine
  do
    # readコマンドで1行分textFile変数（テキストファイル）から、
    # 文字列を読み取って、
    # その内容をtextLine変数へ代入し、
    # textLine変数を配列の要素として、
    # htmlDrafts配列に追加する。
    htmlDrafts+=("$textLine")
  done < "$textFile"

  # ヒアドキュメントを使いシェルスクリプト本体に
  # 配列の要素を参照したテキスト（HTMLの雛形）を埋め込む、
  # 埋め込んだテキストをcatコマンドの標準入力として利用し、
  # コマンド置き換えを実行して、catコマンドの出力を文字列に展開し
  # htmlTemplate変数へ代入。
  htmlTemplate=$(cat << END
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>${htmlDrafts[0]}</title>
</head>
<body>
  <h1>${htmlDrafts[1]}</h1>
  <p>${htmlDrafts[2]}</p>
</body>
</html>
END
)
  # シェルのリダイレクト機能を使って、
  # ptintfコマンドの標準出力先をhtmlFileへ出力し、
  # HTMLファイルを作成する。
  printf '%s\n' "$htmlTemplate" > "$htmlFile"
}

for i in "$@"
do
  createHtmlFile "$i"
done
```

## 使い方
カーレントディレクトリに以下のファイルがあるとします。

* create_html.sh
* sample.txt

```
$ ./create_html.sh sample.txt
```
これで、OKです。

実行後↓のように表示されるかと思います。

```
$ ls
create_html.sh sample.html    sample.txt
```

sample.txtの内容は以下のような内容です。
![sample001.png](https://qiita-image-store.s3.amazonaws.com/0/219420/04c25d14-4855-10da-319e-155691dc63a4.png)

shellscriptで作成したHTMLファイルです。
![sample002.png](https://qiita-image-store.s3.amazonaws.com/0/219420/e4e920a5-40e9-1564-e42f-762911117684.png)

## 終わりに

今回は、とてもシンプルにしましたが、もう少し改良しようかと思います。
よかったら改良して使ってみてください！:clap:
https://github.com/masanorifunaki/create_html
SquashTM インストール手順

# 概要
- 方針
 - aptでお手軽に
 - PostgreSQLを使用(SquashTMはMySQL5.6と5.7非対応)
- 参考  
[公式Wiki](https://sites.google.com/a/henix.fr/wiki-squash-tm/)
- OS  
[lubuntu](https://lubuntu.me/) - lubuntu-17.10.1-alternate-amd64.iso
- [SquashTM](http://www.squashtest.org/en)  
[最新版](http://www.squashtest.org/en/downloads-ressources/contenu-statique/downloads/telecharger-frontpage-3) (1.17.0)

# 手順
## 1. Java

```
sudo apt-get update
sudo apt-get -y install openjdk-8-jdk
```

## 2. Apache2

```
sudo apt-get -y install apache2
```
## 3. PostgreSQL

```
sudo apt-get -y install postgresql
sudo -u postgres -i
psql
CREATE DATABASE squashtmdb WITH ENCODING='UTF8';
CREATE USER squashtm WITH PASSWORD '【DBパスワード】';
GRANT ALL PRIVILEGES ON database squashtmdb TO squashtm;
\q
su 【ユーザー名】
cd ~
```

## 4. DB構築
[公式](http://www.squashtest.org/en/downloads-ressources/contenu-statique/downloads/telecharger-frontpage-3)から一式をダウンロード
以下のSQLファイルを適当なフォルダにコピーした上で、
``squash-tm\database-scripts\postgresql-full-install-version-1.17.0.RELEASE.sql``

```
psql -U squashtm -h localhost -d squashtmdb
\i 【SQLファイル】
\q
```

## 5. SquashTM

```
echo "deb [trusted=yes] http://repo.squashtest.org/debian jessie main" | sudo tee /etc/apt/sources.list.d/squash-tm.list
sudo apt-get --allow-unauthenticated update
sudo apt-get -y install squash-tm
```
- [公式Wiki](https://sites.google.com/a/henix.fr/wiki-squash-tm/installation-and-exploitation-guide/2---installation-of-squash-tm/2---debian-ubuntu-installation)に記載の``2. Import the gpg key:``の通りにgpgキーをインポートしても使えなかった
- DBの選択を迫られるのでMySQLを選択
- エラーが発生し、DBの自動設定をキャンセルできるようになるのでキャンセルする

設定ファイルのDB設定を更新

```ini:/etc/default/squash-tm
DB_URL="jdbc:postgresql://localhost:5432/squashtmdb"
DB_TYPE="postgresql"
DB_USERNAME="squashtm"
DB_PASSWORD="【DBパスワード】"
```

サービス再起動＆確認

```
sudo service squash-tm restart
sudo service squash-tm status
```

http://localhost:8080/squash

# メモ
- adminパスワードのリセット  
``UPDATE AUTH_USER SET PASSWORD='d033e22ae348aeb5660fc2140aec35850c4da997' WHERE LOGIN='admin'``
- 公式ドキュメント  
http://www.squashtest.org/downloads/category/12-docs?lang=en
Swift4環境でのDecodeクラッシュの原因と対応


お久しぶりです。
最近理不尽なクラッシュを起こしてしまい悲しい気持ちになったので何が起こったのかとどうやって回避するかを書きます。
この事象は自分が業務で扱っているアプリをSwift3からSwift4へアップデートした時に起きた不具合になります。

# 事象
タイトルの通りクライアントアプリにローカル保存していたデータのdecode時にアプリがクラッシュします
より詳細に語ると
1. Swift3の頃とSwift4記述は変わっていない
2. Swift3のアプリverからSwift4対応版へのアップデートはクラッシュしない
3. Objective-Cアプリ(で利用していたクラスのDecode)からSwift4対応版へのアップデート時にクラッシュする

このような事象です。
リリース直後なぜか過去のバージョンからのマイグレーション処理でクラッシュするログがでるようになったなと思ったのですが量も少なく(マイグレーション対象のクラスを利用していたアプリは２年以上前のバージョンだったため)、3.の情報がたまたま手に入ったためこの事象がSwift4の由来であると明るみに出ました。

# 原因
1.で述べている通り記述は変わっていない、ビルドも通る。この不思議な状態ですが勘のいい人はピンとくるかと思います。**ランタイム**です
Swift4からObjective-Cランタイムの扱いが変更されObjective-Cから呼び出されるメソッド(変数)もしくはクラスには@objcもしくは@objcMembersアノテーションが必要になりました。暗黙的な@objc推論の廃止ですね。
多々あるSwift4の記事で書かれているようによくあるパターンとして、#selectorのメソッドに@objcが必要になった等の内容で書かれています。
通常であればそもそもビルドが通らなくなるためすぐ気づくことが可能なのですが
[NSKeyedUnarchiver.setClass](https://developer.apple.com/documentation/foundation/nskeyedunarchiver/1409718-setclass)メソッドを利用して以下のような記述をしていた場合クレイモア地雷になります。

```swift
NSKeyedUnarchiver.setClass(LegacyTestClass.self forClassName: "ObjecTestClass")
```

Swift3まではObjective-Cで書かれたObjecTestClassをデコードする際にLegacyTestClassとしてデコードするのですが、Swift4はLegacyTestClass.selfを解釈できずクラッシュします。
どうやらSwift内部的にObjectice-Cから参照しようとしているらしくLegacyTestClassを参照しようとしますが@objc推論が効かないため名前解釈できずクラッシュします

```
NSInvalidArgumentexception: -[AppName.LegacyTestClass initWithCoder:]: unrecognized selector sent to instance 0x1xxxxx
```

# 対応
素直にアノテーションをつけます

```swift

@objcMembers
class LegacyTestClass {}
```

これだけで解決します


# /dev/null
ビルドエラーにしろよ！！！！こんなのリリース前にわからないよ！！！どうやってテストするんだ！！
面積比がそれっぽいベン図を描いてみた(swift)

#はじめに
[与えられた面積比のベン図を描く](https://oku.edu.mie-u.ac.jp/~okumura/stat/170725.html)これをみてそんな計算ができるのかと思いそれっぽい面積比のベン図を描いてみました。

そもそもベン図って面積比を気にするようなものではないと思いますが、面積比がそれっぽいベン図っぽいものを描いてみました。

2019/04/21 せっかくなんでswift5.0対応しました
2019/10/16 せっかくなんでSwiftPM対応しました

#GitHub

[AMVennDiagramView](https://github.com/adventam10/AMVennDiagramView)

#見た目
<img width="625" alt="スクリーンショット 2018-02-17 18.31.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/225999/3f2976db-62e3-8c2f-791b-24c68411092f.png">

#機能
* 円の色の設定ができる
* 円の枠線色の設定ができる
* 円に表示する文字の設定ができる
* 円に表示する文字色の設定ができる
* 円に表示する文字フォントの設定ができる

#使い方
1. 値を設定する
	
	```swift
	@IBOutlet weak private var vennDiagramView: AMVennDiagramView!
	
	vennDiagramView.setupVennDiagram(value1: 1000, value2: 500, commonValue: 200)
vennDiagramView.dataSource = self
	```
	
	値がおかしい場合は図は表示されない。（共通部分がvalue1, value2よりも大きい場合など）
	
2. デリゲートを設定する
	
	```swift
	/// 円の塗りつぶし色を設定
    func vennDiagramView(_ vennDiagramView:AMVennDiagramView, fillColorForSection section: Int) -> UIColor
    
    /// 円の枠線色を設定
    func vennDiagramView(_ vennDiagramView:AMVennDiagramView, strokeColorForSection section: Int) -> UIColor
    
    /// 円に表示する文字を設定
    func vennDiagramView(_ vennDiagramView:AMVennDiagramView, titleForSection section: Int, value: CGFloat) -> String
    
    /// 円の重なり部分に表示する文字を設定(共通部分がない場合は呼ばれない)
    func titleForCommonArea(in vennDiagramView:AMVennDiagramView, value: CGFloat) -> String
    
    /// 円に表示する文字色を設定
    func vennDiagramView(_ vennDiagramView:AMVennDiagramView, textColorForSection section: Int) -> UIColor
    
    /// 円の重なり部分に表示する文字色を設定
    func textColorForCommonArea(in vennDiagramView:AMVennDiagramView) -> UIColor
    
    /// 円に表示する文字フォントを設定
    func vennDiagramView(_ vennDiagramView:AMVennDiagramView, textFontForSection section: Int) -> UIFont
    
    /// 円の重なり部分に表示する文字フォントを設定
    func textFontForCommonArea(in vennDiagramView:AMVennDiagramView) -> UIFont
	```
	
	sectionはsetupVennDiagram(value1:, value2:, commonValue:)のvalue1が0,value2が1に相当する。
		
#さいごに
計算は少し妥協している点があるので共通部分の面積比に多少ずれがあると思いますが、私にはこれが限界でした。

私はほぼObjective-Cしか使ったことがないペーペーのプログラマーなので記事内容やgithubのコードにおかしなところがあればご指摘いただければ幸いです。

#つくったのまとめ
* [アナログ時計を描画してみた（swift）](https://qiita.com/am10/items/0222e6966d58062d2eca)
* [スピードメーターをつくってみた（swift）](https://qiita.com/am10/items/0fe8cffac7dd7659eb2a)
* [めくるカレンダーをつくってみた(swift)](https://qiita.com/am10/items/2a929ca8196f33cb1d4a)
* [グラフを描画してみた(swift)](https://qiita.com/am10/items/aee964a8a7a9712d66f8#_reference-ca2e5485de5acf8eca97)
* [ちからわざで日本地図を描いてみた(swift)](https://qiita.com/am10/items/26de3242ee33b4bd4aae)
* [カラーピッカーをつくってみた(swift)](https://qiita.com/am10/items/82a4adb2267979841c9e)
* [面積比がそれっぽいベン図を描いてみた(swift)](https://qiita.com/am10/items/858041f70be4d8de5090)
* [UIViewを燃やしてみた（swift）](https://qiita.com/am10/items/f7b32ea5725feeb1469f)

##動作確認用にまとめたプロジェクト
* [Carthageで入れたやつ](https://github.com/adventam10/TestCarthage)
* [CocoaPodsで入れたやつ](https://github.com/adventam10/TestCocoaPods)
* [SwiftPMで入れたやつ](https://github.com/adventam10/TestSwiftPM)
Jupyter上においてplt.imshowで画像が表示されないときは

# はまった時の状況
Jupyter notebookでPython3を動かしていて，`cv2.imread()`で読み込んだ画像が`plt.imshow()`（matplotlib.pyplot）で表示されなかった

![image.png](https://qiita-image-store.s3.amazonaws.com/0/201348/0ef962e9-1311-f232-63ba-79f2a63435ae.png)

# 解決策
その時は調べても解決策が見つからなかったが，
これはPythonの書き方自体に問題があるわけではなく，
`%matplotlib inline`の忘れが原因らしい

![image.png](https://qiita-image-store.s3.amazonaws.com/0/201348/68546cc3-2861-9be7-7948-031e8cd6ab02.png)
Swift（基本のキの字）

# はじめに
先日環境を整えたSwift。環境を整えただけで満足しそうだったので、ちょっとは進めてみよう。
プログラム初心者的な記載になるけど、Swiftについてはまるっきりの初心者。他の言語のことは一旦忘れて、初学者の気持ちでやってみる。（完全に初学者にはなりきれないけどね）

# 環境
~~~~
# swift --version
Swift version 4.0.3 (swift-4.0.3-RELEASE)
Target: x86_64-unknown-linux-gnu
~~~~

# 変数
- 変数はvarで宣言
- 基本的には型指定も必要だが、宣言時に初期値を代入する際に推論してくれる。
- 型指定しても初期化しないとNG
- とりあえず、Int（整数型）・String（文字型）・Double（浮動小数型）あたりを覚えておけばいいかな

```swift
var a      // 型を指定していないのでNG
var b:int  // Int（先頭が大文字）じゃなきゃダメ。ケチ。
var c = 3  // 型宣言していないが、初期値として与えた3をIntと推論してくれるのでOK
var height= 129.3 // 小数部があるとDoubleと判断される

var d:Int  // 変数宣言
print (d)  // dは宣言だけで初期化されていないので、NG

var e:Int
e=1       
print (e)  // OK(1)

var f:Int = 2
print (f)       // これでもOK(2)
```

# 定数
- 定数はletで定義する
- 一度定義したものは変更できない

```swift
let a=10
print (a)  // 10
a=a+1      // NG（定数は変更できない）
```

# 出力
```swift
print "Capybara"    // 括弧で囲わないとNG
print ("Capybara")  // OK
print ("I love " + "capybara")   // 出力を連結する場合は、+を使う
print (2 + " capybaras")         // 数値型と文字型を混在して連結はできない
print (String(2) + " capybaras") // 数値型を文字型に変換すればOK
```

# 関数
基本形は

```swift
func 関数名(引数:型[,引数:型 .... ]) -> 戻り値の型 {

// 関数の中身

}
```
戻り値が無い時は、型として`Void`を指定。`Void`の場合は指定しなくてもOK。（もちろんその場合は、`->`も不要）

使用時は、値だけではなく引数名も指定しないとダメっぽい。（ググると指定しないケースもあるけど、過去の記法かもしれない）

```swift
func add(num:Int)->Int {
  num=num+1
  return num
}

var a=17
b = add(a)      // NG
c = add(num:a)  // OK（18)
```
なお、関数に渡された引数は関数内で変更することはできない模様。一部`func add(var num:Int)`のように宣言時に`var`を付ければOKと書かれているサイトもあるが、Swift4ではNGっぽい。

# 制御系
## if文
else ifの記述くらいかな。（`elseif`でも`elif`でも`elsif`でもない）

```swift
var a:Int = 12
if (a % 3 == 0){
  print ("3の倍数")
} else if (a % 3 == 1){
  print ("3で割ると1余る")
} else {
  print ("3で割ると2余る")
}
```

## for文

```swift
var total:Int = 0
for a in 1...10{
  total+=a
}
print (total)  // 55
```

`for var a=1; a<=10;a++{`のような記述は（これまた）昔は出来たみたいだけど、Swift4ではダメ。コンパイル時に`error: C-style for statement has been removed in Swift 3`と怒られる。

他にも色々あると思うけど、気が向いたら追記。

# まとめ
なんか、まじめに書いちゃった。それにつきる。
blenderでｆｂｘを読んでみた。

#概要
blenderでfbxを読んでみた。
バージョンとバイナリー、アスキーの組み合わせで６ファイル試した。

#結果

|version      |       6100 |    7100    | 7500 |
|:-----------------|-------------:|-------------:|--------------:|
| binary             |         ng |       ok        |ng|
| ascii           |            ng |       ng     |ng|


#環境

blender 2.76b

#考察

blenderのfbxインポーターは、腐ってる。

以上。
three.jsでｆｂｘを読んでみる。

#概要
threeでfbxを読んでみた。
バージョンとバイナリー、アスキーの組み合わせで６ファイル試した。

#結果

|version      |       6100 |    7100    | 7500 |
|:-----------------|-------------:|-------------:|--------------:|
| binary             |         ng |       ok        |ok|
| ascii           |            ng |       ok     |ok|


#成果物　

http://jsdo.it/ohisama1/WLf9

#考察

threeのfbxインポーターは、優秀。

以上。
UbuntuにGoogle Cloud Functions 環境構築

公式のドキュメントにUbuntu向けの内容があるので、それに従えばよい。

# GCPプロジェクトの準備

[Quickstart: Using the gcloud Command-Line Tool  |  Cloud Functions Documentation  |  Google Cloud Platform](https://cloud.google.com/functions/docs/quickstart?hl=ja)
Before you beginの1~3を済ませる

# Cloud SDKのインストール

[Google Cloud SDK ドキュメント  |  Cloud SDK  |  Google Cloud Platform](https://cloud.google.com/sdk/docs/?hl=ja)
"DEBIAN、UBUNTU"の内容に従う
gcloud init時先ほど作成したプロジェクトのIDを選択する

内容が重複していそうな↓のページがあるが、こちらはgcloud initについて詳しく書かれている
[Debian / Ubuntu 用のクイックスタート  |  Cloud SDK のドキュメント  |  Google Cloud Platform](https://cloud.google.com/sdk/docs/quickstart-debian-ubuntu?hl=ja)

# Node.js開発環境

[Node.js 開発環境のセットアップ  |  Node.js  |  Google Cloud Platform](https://cloud.google.com/nodejs/docs/setup?hl=ja)

# Hello World

[Quickstart: Using the gcloud Command-Line Tool  |  Cloud Functions Documentation  |  Google Cloud Platform](https://cloud.google.com/functions/docs/quickstart?hl=ja)
Create a function以降を実施

```javascript
/**
 * HTTP Cloud Function.
 *
 * @param {Object} req Cloud Function request context.
 * @param {Object} res Cloud Function response context.
 */
exports.helloGET = (req, res) => {
  res.send('Hello World!');
};
```

デプロイしたい関数は`exports.ほにゃらら`の形で定義する
unityでｆｂｘを読んでみる。

#概要
unityでfbxを読んでみた。
バージョンとバイナリー、アスキーの組み合わせで６ファイル試した。

#結果

|version      |       6100 |    7100    | 7500 |
|:-----------------|-------------:|-------------:|--------------:|
| binary             |         ok |       ok        |ok|
| ascii           |            ok |       ok     |ok|


#環境　

unity5.2.5f1

#考察

unityのfbxインポーターは、優秀。

以上。
glogin.sql に追加している内容 Oracle Client for Windows

```SQL:glogin.sql
-- あらかじめ sys スキーマから
-- GRANT SELECT ON V_$SESSION TO PUBLIC ;
-- を実行しておく。
--
-- $ORACLE_HOME\sqlplus\admin\glogin.sql に追加している内容 Oracle Client for Windows
--
-- 実行計画の表示幅の調整
COLUMN OTHER_PLUS_EXP FORMAT A150
COLUMN PLAN_PLUS_EXP  FORMAT A150
SET NUMWIDTH 13
SET LINESIZE 80
SET LONG 40000
SET LONGCHUNKSIZE 40000
SET PAGESIZE 50000
SET TAB OFF
SET TRIMSPOOL ON
-- SET SERVEROUTPUT ON SIZE 1000000
SET SERVEROUTPUT ON SIZE UNLIMITED
-- UNLIMITEDが使えるのはOracle10.2.0以降。
--
-- DATE関係の書式マスクを変更
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY/MM/DD HH24:MI:SS' ;
ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'YYYY/MM/DD HH24:MI:SSXFF' ;
ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT = 'YYYY/MM/DD HH24:MI:SSXFF TZR' ;
SPOOL alter_system_kill_my_session_&&_CONNECT_IDENTIFIER..sql
SELECT 'ALTER SYSTEM KILL SESSION ''' || TO_CHAR(VS.SID) || ',' || TO_CHAR(VS.SERIAL#) ||
        ''' ;' AS KILL_SESSION
FROM V$SESSION VS
WHERE VS.AUDSID = SYS_CONTEXT('USERENV', 'SESSIONID') ;
SPOOL OFF
-- EDITコマンドで実行されるエディタの指定
   DEFINE_EDITOR = 'C:\Program Files\Hidemaru\Hidemaru.exe'
-- DEFINE_EDITOR = 'C:\Program Files\sakura\sakura.exe'
-- ↓ DEFAULT
-- SET SQLPROMPT "SQL> "
-- sqlplusのPROMPTを"ユーザー名@接続識別子> "に変更
   SET SQLPROMPT "_USER'@'_CONNECT_IDENTIFIER> "
-- SET SQLPROMPT "_USER> "
```
参考
[SQL*Plus ユーザーズ・ガイドおよびリファレンス SQL*Plusの構成]
(https://docs.oracle.com/cd/E82638_01/SQPUG/configuring-SQL-Plus.htm)
永遠のunity

#概要
unity初心者です。
最新版を、追いかけるのが、好きじゃないです。
いつまでも、最新版の
永遠のunityの作り方です。


#写真

![image](https://qiita-image-store.s3.amazonaws.com/0/18104/b813fa25-a0a4-7c24-c0dc-bb0485328bc2.png)


#作り方
１、windows vistaをインストールします。
２、visual studio 2010をインストールします。
３、blender 2.76bをインストールします。
４、unity 5.2.5f1をインストールします。

以上。
【備忘録】条件付きアクセスを設定するときの設定範囲

Azure AD App Proxyを利用すれば、VPNを引かなくても特定のWebアプリを利用できる。
条件付きアクセスで、特定の条件を満たせば利用できるようになり、さらに便利に。

条件付きアクセス
https://docs.microsoft.com/ja-jp/azure/active-directory/active-directory-conditional-access-controls


ただ、意図したアクセスだけを許可したい場合は、対象でない環境からは明示的にブロックしないと、意外な穴が開いてしまう。

EMSライセンスユーザーに「iOSのセキュアブラウザだけ、ある社内アプリの利用を許可許可する」要件において、iOSの条件付きアクセスの設定だけではダメ。例えば、Windowsからアクセス要件を明示的にブロックしないと、WindowsやMacからApp ProxyのURLでアクセスできてしまう。
別に、WindowsやMacからはVPNなくて使えるならOK！ならそのまんまで良いのだけど。


なので、
●ライセンスを持っており、
●かつWebアプリにApp Proxy経由でのアクセスを許可する場合、
●通したいOSは条件付きアクセスを設定
●これ以外のOSは全部許可になるのでブロックする。

最後のブロックを忘れずに。
VisualStudio標準搭載のデータベース(SQL Server LocalDB)の操作方法

# インスタンス名一覧取得方法

- インスタンス名一覧取得コマンド

```
sqllocaldb info
```

# データベースファイル削除方法

- LocalDB停止コマンド

```
sqllocaldb stop [インスタンス名]
```

- インスタンス削除コマンド

```
sqllocaldb delete [インスタンス名]
```

- エクスプローラを使用し、"C:\Users\ユーザ名"直下にあるデータベースファイルおよびログファイルを削除する。
WindowsバッチでFizzBuzz


``` bat:FizzBuzz.bat
@echo off
setlocal enabledelayedexpansion
for /l %%I in (1,1,100) do (
	set /a mod3=%%I%%3
	set /a mod5=%%I%%5
	set /a mod15=%%I%%15
	if !mod15!==0 (
		echo FizzBuzz
	) else if !mod3!==0 (
		echo Fizz
	) else if !mod5!==0 (
		echo Buzz
	) else (
		echo %%I
	)
)
pause
```

#おまじない
Windowsバッチはデフォルトで実行したコマンド自身を全て出力する。
echo off は以降実行したコマンド自身を出力しないように設定する。
しかし echo off というコマンド自身は出力される。
これを回避するため、先頭に @ を付与する。
コマンドの先頭に @ を付与した場合、そのコマンド自身は出力されなくなる。
先頭に @echo off と書いて以降のコマンド自身を出力されなくするのはWindowsバッチによく見られるお約束のパターン。

#for コマンドによるループ処理
for /l %%I in (1,1,N) do *
%%I に 1 ～ N を +1 ずつ変化させて割り当て、* を実行する。
丸括弧で囲むことで、複数行のコマンドを対象にループを行うことができる。

#set コマンドによる環境変数の設定
set a/ [環境変数名]=設定される式
単純な文字列リテラルを設定する場合は /a は不要。
バッチスクリプト内にて単一の % は環境変数の展開として作用するため、% という文字そのものを表現したい場合、 %% と2連続させる。

#if コマンドによる処理分岐 
if コマンドの判定式の中で加減乗除等の計算を行うことはできないため、set /a によって環境変数に計算結果を設定して、その環境変数を if コマンドの判定式として使用する。

if コマンドの丸括弧の終了と else コマンドの丸括弧の開始は同じ行に記述されていなければいけないことに注意。

#環境変数の遅延展開
setlocal enabledelayedexpansion
環境変数の展開を遅延させるために必要。
これがない場合、for コマンドを実行する際にループ内処理の環境変数の展開が行われる。
環境変数 mod3, mod5, mod15 には for コマンド実行時点では値が設定されていないため、if コマンドは以下のように展開される。
if ==0 ( 
echo FizzBuzz
) else if ==0 (
echo Fizz
) else if ==0 (
echo Buzz
)

(補足)値が設定されていない環境変数を展開すると、空文字列となる。

setlocal enabledelayedexpansion は感嘆符 ! によって囲まれた環境変数をコマンドの実行時まで遅延して展開するように設定する。
すなわち、各ループ毎に計算された mod3, mod5, mod15 の値を判定に使うことができるようになる。