OmniAICreator/Qiita-1.07M huggingface dataset:
ファイル移動とかしたら日付が更新されてしまうSDとかでぐちゃぐちゃになった写真の更新日時を修正する

ライブラリ名とかよく忘れるので．

注意：
このまんま実行しちゃダメ．
実際にはipythonで書いて，該当する方のループだけ実行するとか工夫すること．


```python
import time
import datetime
import os
import re
import time

from PIL import Image
from PIL.ExifTags import TAGS

# 共通部
dname = 'dirname'
def update_time(f, t):
    os.utime(f, (t, t))

# ファイル名から取得できる場合
pat   = re.compile('(?P<date>\d{8}).*(?P<time>\d{6})')   # yyyymmdd_hhmmss
#pat   = re.compile('(?P<date>\d{4}-\d{2}-\d{2}) (?P<time>\d{2}\.\d{2}\.\d{2})') # yyyy-mm-dd hh.mm.ss

for f in os.listdir(dname):
    mat = pat.search(dname + '/' + f)
    if mat:
        dt = datetime.datetime.strptime('-'.join(mat.groups()),'%Y%m%d-%H%M%S')
        #dt = datetime.datetime.strptime('-'.join(mat.groups()),'%Y-%m-%d-%H.%M.%S')
        update_time(dname + '/' + f, time.mktime(dt.timetuple()))
    else:
        continue

# ファイル名は単なる通番の場合
def created_on(fname):
    im = Image.open(fname)

    try:
        exif = im._getexif()
    except AttributeError:
        return None

    for tag_id, value in exif.items():
        tag = TAGS.get(tag_id, tag_id)
        if tag == 'DateTimeDigitized':
            dt = [map(int, t.split(':')) for t in value.split(' ')]
            return datetime.datetime(*(list(dt[0])+list(dt[1])))
    else:
        # DateTimeDigitizedがない場合
        return None

for fname in os.listdir(dname):
    dt = created_on(dname + '/' + fname)
    if dt is None:
        continue
    else:
        update_time(dname + '/' + fname, time.mktime(dt.timetuple()))
```
VSCode で Markdown のコードブロックを実行する拡張機能を作ってみた

## 作ったもの

Markdown ファイルのコードブロック部分を選択してコマンドを入力すれば勝手に実行してくれる拡張機能を作りました。

[Run Snippets in Markdown (GitHub)](https://github.com/statiolake/vscode-markdown-run-snippet)

![run01.gif](https://qiita-image-store.s3.amazonaws.com/0/164379/492181a5-ab68-bee9-d24a-b950a83824a1.gif)

作りました、と言っても、私がやったのはただ言語名部分を取り出して中身を新しい画面に貼り付けるだけで、実際のコード実行は別の拡張機能 [Code Runner](https://github.com/formulahendry/vscode-code-runner) におまかせしています。これは開いているファイルをコンパイル & 実行してくれる拡張機能で、これも個人的にすごく便利に使わせてもらっています。

Markdown のコードブロックの中身をサクっと実行してみて確認したいと思うことはありませんか？

こういった需要はありそうなのになぜかそういう拡張を見つけられず、勉強を兼ねて自作してみることにしました。もし便利な拡張機能が既にあるようでしたら、教えてくださると嬉しいです。

## モチベーション

個人的には実験用コードや例示用コードの確認に使っています。

プログラミング学習中の身なので、何か分からなかったことがあると Markdown ファイルに自分なりの理解をまとめて整理することがあります。こういうとき、ファイル内に書いた実験用のコードが (エラーなく) 正しく動くことを確認したくなります。しかしそれぞれのコードについて一々別ファイルを作って保存してコンパイルして実行して、というのは面倒ですし間違いの元になります。

## 機能

機能はほとんどないのですが、唯一テンプレート機能があります。

C/C++ のように main() 関数が必要となる言語では、実行する前に勝手に囲ってくれたほうが嬉しいことも多いと思い、実装してみました。

```json
"markdown-run-snippet.mdTypeToTemplateMap": {
    "rust": "fn main() {\n    $snippet\n}",
    "c++": "#include <iostream>\n#include <string>\nint main(void) {\n    $snippet\n    return 0;\n}"
}
```

テンプレート機能を使うと、選択したコードブロックの中身をテンプレートのプレースホルダ `$snippet` に流し込むことができます。上の例のように main() 関数の中に設置しておけばいい感じに展開されるという寸法です。テンプレートに \#include, import, use など盛り込んでおくという手もあります。

そして、この `$snippet` は単純に置換するのではなく、この `$snippet` の前にある空白の数をインデントとして、選択部分のコード全ての行の頭に追加します。これで例えば Python のようなインデントベースの言語に対するテンプレートも安心です。

例えば、 Python 用のテンプレートを次のように設定するとします。

```json
"markdown-run-snippet.mdTypeToTemplateMap": {
    "python": "if True:\n    $snippet"
},
```

そして、ある Markdown ファイルに次のようなコードブロックが含まれているとします。このとき、コードブロック部分の全体を (マーカー \`\`\` を含めて) 選択して `Run Snippet in Markdown` を実行すると...

    (何らかの Markdown ファイルの途中)
    ```python
    print("hello");
    print("world");
    ```

コードブロックの言語指定 python を検出し、マーカー \`\`\` を取り払ったコード本体を python に対応するテンプレートに流し込みます。そのテンプレートでは `$snippet` の頭に空白 4 つがあるため、これをインデントとしてコード本体の各行に追加します。結果として次のように展開されます。

```python
if True:
    print("hello");
    print("world");
```

`$snippet` をコード本体に単純に置換すると次のようになってしまいますが、このようにはなりません。

```python
if True:
    print("hello");
print("world");
```

## おわりに

今回は VSCode を使ってみるということ、拡張機能を作ってみること、 github で何か公開してみることなどを目的にしてやってみました。

実は Vim を使っていたとき、 QuickRun という拡張機能を使って自分用に同様の機能を実装したことがありました。そのときは VimScript を使っていろいろしたわけですが、選択範囲を受けとる方法に苦労したり、関数が選択行数分繰り返し呼ばれたりと嵌り続けました。もともとテンプレート機能が QuickRun に備わっていたので言語判別だけだったのに、それですら大分苦労しました。

VSCode で使われる TypeScript は普通の言語で使いやすかったです。選択範囲を文字列として取得する API があることや、文字列を行ごとに split したり配列にしたりと好きなように扱えるということが本当に便利でした。 intellisense も強力で、よく知らない機能でもなんとなく使えるということは面白かったです。

拡張機能のプログラミング以前に、 `yo code` したら拡張機能の雛形ができたり、`vsce` でパッケージングも公開も簡単にできるというのもとても大きいです。便利でした。

とりあえず VSCode 、使ってみようと思います。
TensorFlow nanとは？＜数行で説明編＞

#一行で説明
「Not a Number」の略。

#もう少し詳しく
ウィキペディアに細かく書いてある。
ウィキペディア　https://ja.wikipedia.org/wiki/NaN

#ついでに
この記事に損失関数がNaNになる問題の解決案が書いてあった。
[損失関数がNaNになる問題](http://testpy.hatenablog.com/entry/2017/05/08/003000)
KE-complex_modificationsをsimultaneous対応にした

Macのキーバインドをいろいろ設定できる[Karabiner-Elements](https://github.com/tekezo/Karabiner-Elements)が、Version 11.6でついに修飾キー以外の同時押しにも対応してくれました。これでついにEl Capitanからおさらばできる!と思ってKarabinerの設定をKarabiner-Elementsに移植しようと思ったのですが、同時押しパターンの多さから定義ファイルを一から書くのにくじけました。それでKE-complex_modificationsを使って.erbファイルを使って楽をしようと思ったのですが、KE-complex_modificationsはキー同時押しの記述を実装していなかったので、実装してみた次第です。

## リポジトリ

https://github.com/Shinichi-Ohki/KE-complex_modifications にあります。使い方は本家のKE-complex_modificationsと同じく、src/json/内に.json.erbファイルを置いてmakeするとdocs/json/内に.jsonが生成されます。

## やったこと
KE-complex_modificationsのerb2json.rbにはeach_keyというメソッドが用意されています。(参考:[each_key](https://qiita.com/s-show/items/fb788d90faba7eeb9051#each_key))
これはsource_keys_listとdest_keys_listというArrayに入力と出力を羅列することでcomplex_modificationsの設定を一度に書けるメソッドです。ここにarrayの要素としてarrayを書いたらいいのでは、と思うのですが、例えば
`source_keys_list: [["f","j"]],`
と書いても

```
"from": {
  "key_code": [
    "f",
    "j"
  ],
```

と展開されてしまいます。
これを

```
"from": {
  "simultaneous": [
    {
      "key_code": "f"
    },
    {
      "key_code": "j"
    }
  ],
```

と展開されるようにしました。
また、出力側も
`dest_keys_list: [["g","h"]],`
と書いたら

```
"to": [
  {
    "key_code": [
      "g",
      "h"
    ]
  }
]
```

となってしまうのを

```
"to": [
  {
    "key_code": "g"
  },
  {
    "key_code": "h"
  }
]
```

と展開されるようにしました。これでキーを複数続けて出力するのも記述できます。ただし修飾キー付きで複数キーの連続出力することはなさそうだったのでそっちは実装してません。

具体的にどう書いたかはリポジトリのdiffを見てもらうのがわかりやすくてよいかと思います。
https://github.com/Shinichi-Ohki/KE-complex_modifications/commit/dca19ed8e783f71490f39000b4f05b39d325384c#diff-ec216709002c75751c08467fb890337a
(もっとエレガントな書き方があったらこっそり教えてください)

### 参考
[KE-complex_modificationsを使ってKarabiner-Elementsの設定を楽にする方法](https://qiita.com/s-show/items/fb788d90faba7eeb9051#%E4%BD%BF%E7%94%A8%E4%BE%8B-1)
[Karabiner-Elementsの設定項目をまとめました](https://qiita.com/s-show/items/a1fd228b04801477729c)
Railsでcarrierwaveを用いたファイル登録からファイルダウンロードまで


Railsチュートリアルでは、画像ファイルの登録までだが、画像ファイルのダウンロード処理まで一貫して書いてみる。

ref: https://github.com/carrierwaveuploader/carrierwave

```bash
$ bin/rails -v
Rails 5.1.2
```

`carrierwave`を使用する

```Gemfile
gem 'carrierwave'
```

```routes.rb
  resources :pictures, only: [:create] do
    member do
      get :download
    end
  end
```

```picture_uploader.rb
class PictureUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick
  process resize_to_limit: [128, 128]

  storage :file

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  def extension_whitelist
    %w(jpg jpeg gif png)
  end

end
```

```index.html.erb
  <%= form_for(@picture) do |f| %>
      <label>ファイル</label>
      <%= f.file_field :name %>

      <%= submit_tag '送信' %>
  <% end %>
```

```pictures_controller.rb
  def create
    picture = SlackPicture.new(fileupload_param)
    if picture.save
      @picture = picture
    end
    
    render :template => "pictures/index"
  end
```

ここまでが画像登録、`picture`カラムに画像オブジェクトが入っている。実際は`public/uploads/picture/picture/:id/アップしたファイル名`に画像ファイルがある。128x128でリサイズしてある。

```index.html.erb
  <% if @picture %>
      <%= image_tag @picture.picture.url %>
      <%= link_to "ダウンロード", download_picture_path(@picture) %>
  <% end %>
```

```pictures_controller.rb
  def download
    @picture = Picture.find(params[:id])
    # ref: https://github.com/carrierwaveuploader/carrierwave#activerecord
    filepath = @picture.picture.current_path
    stat = File::stat(filepath)
    send_file(filepath, :filename => @picture.picture_identifier, :length => stat.size)
  end
```

ファイルを出力するときは、`send_file`メソッドを使う。これで、フォームより画像ファイルをダウンロード可能。

`carrierwave`のメソッドは、ここを参照
https://github.com/carrierwaveuploader/carrierwave#activerecord
NTP設定メモ

RHEL6 
ntpdate : ntpdate-4.2.6p5-12.el6.centos.2.x86_64
ntp : ntp-4.2.6p5-12.el6.centos.2.x86_64

で設定したNTPのメモ

# デフォルト値の確認
```console
# /etc/init.d/ntpd start
ntpd を起動中:                                             [  OK  ]
# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 x.ns.gin.ntt.ne .INIT.          16 u    -   64    0    0.000    0.000   0.000
 y.ns.gin.ntt.ne 249.224.99.213   2 u    1   64    1    5.086    4.880   0.000
 nipper.paina.ne 131.113.192.40   2 u    -   64    1    0.437    6.861   0.000
 nipper.paina.ne .INIT.          16 u    -   64    0    0.000    0.000   0.000
```

# 設定するNTPサーバ
以下の3つのNTPサーバーを設定。
1. NICT
http://jjy.nict.go.jp/tsp/PubNtp/index.html
ntp.nict.jp

2. インターネットマルチフィード
http://www.jst.mfeed.ad.jp/about/04.html
ntp1.jst.mfeed.ad.jp

3. Google Public NTP
https://developers.google.com/time/
time.google.com

# /etc/ntp.conf 確認、バックアップ、設定変更
/etc/ntp.confのデフォルトのNTPサーバをコメントアウトする。
上の３サーバを/etc/ntp.confに記載する
参考：iburstの意味
http://d.hatena.ne.jp/incarose86/20110505/1312522379

```console
# ls -l /etc/ntp.conf
-rw-r--r-- 1 root root 1778 12月 18 22:51 2017 /etc/ntp.conf
# cp /etc/ntp.conf /etc/ntp.conf.`date "+%Y%m%d"`
# ls -l /etc/ntp.conf /etc/ntp.conf.20180314 
-rw-r--r-- 1 root root 1878  3月 15 00:02 2018 /etc/ntp.conf
-rw-r--r-- 1 root root 1778  3月 14 23:48 2018 /etc/ntp.conf.20180314
# vi /etc/ntp.conf
# diff /etc/ntp.conf /etc/ntp.conf.20180314 
22,29c22,25
< server ntp.nict.jp iburst
< server ntp1.jst.mfeed.ad.jp iburst
< server time.google.com iburst
< 
< # server 0.centos.pool.ntp.org iburst
< # server 1.centos.pool.ntp.org iburst
< # server 2.centos.pool.ntp.org iburst
< # server 3.centos.pool.ntp.org iburst
---
> server 0.centos.pool.ntp.org iburst
> server 1.centos.pool.ntp.org iburst
> server 2.centos.pool.ntp.org iburst
> server 3.centos.pool.ntp.org iburst
```

# 設定の反映
時刻がずれているとntpdが上手く動作しないため（なぜ？）、手動で時刻を合わせてからntpdを再起動する。
参考：手動の時刻合わせの必要性
http://www.turbolinux.co.jp/products/server/11s/user_guide/x6278.html

```console
# /etc/init.d/ntpd stop
ntpd を停止中:                                             [  OK  ]
# ntpdate ntp.nict.jp
15 Mar 00:12:01 ntpdate[14309]: adjust time server 2001:df0:232:eea0::fff3 offset 0.009183 sec
# /etc/init.d/ntpd start
ntpd を起動中:                                             [  OK  ]
# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*ntp-a2.nict.go. .NICT.           1 u    8   64    1    1.421   -7.424   0.183
+ntp1.jst.mfeed. 133.243.236.17   2 u    7   64    1    0.748   -7.689   0.143
+time4.google.co .GOOG.           1 u    6   64    1   53.146  -14.625   2.835
```
【調べもの】fortranをめぐる並列計算環境とCoarray

# これまで：プロセス並列とスレッド並列
これまで、fortranでは主に「<b>openMP</b>」と「<b>MPI</b>」という二つの並列計算ライブラリが使われてきました。

openMPは<b>スレッド並列</b>方式で、メモリを共有したスレッドという単位で並列化します。共有メモリなので通信が不要であるというメリットがある一方、並列数に上限があります。

MPIは<b>プロセス並列</b>方式で、メモリが固有のプロセスという単位で並列化します。複数のノード上にプロセスを割り当てて硬度に並列化することができる一方、メモリが分かれているために通信が必要となり、そこに工夫の余地が生まれます。

また、両者ともに多かれ少なかれコードに並列化するための工夫が必要であるというデメリットがあります。特にMPIでは顕著で、通信のために大量の固有のサブルーチンを覚えなければならないという苦労が必要でした。

# Coarrayとは
Coarrayはgo言語のgoroutineと同じように「プログラマが特に意識することなく並列計算ができるようにする」ことを目標として制定された仕様です。fortran2008から導入された、最新の機能です。

Coarrayは<b>イメージ</b>制御とセットで導入されました。イメージとは、プロセスやスレッドを包括した、一般的な処理の単位です。Coarrayはそのイメージごとのデータの扱いを、より簡単にできるようにしたものです。

ソースコードはたくさん公開されているので、ここでは割愛します。

# Coarrayを使うには
gfortranでCoarrayを使う場合、外部ライブラリが必要になります。[^1] ライブラリの実装はいくつかあり、MPIでの実装がおそらく現実的かなあと思います。つまり、結局のところ「<b>CoarrayはMPIを簡単に使うためのもの</b>」みたいです。

まずコンパイル時に```-fcoarray=lib```オプションが必要です。コンパイルするために設定しなければならない環境変数はopenMPIとMPICHの場合で異なっているようです。

また、中身はMPIコードなので、実行時は```mpiexec```で実行します。

# 参考サイト
Coarrays via GNU Fortran's Coarray Communication Library
https://gcc.gnu.org/wiki/CoarrayLib

めっちゃ新しもの好き Fortran 2008
http://jjoo.sakura.ne.jp/tips/fortran2008/

Co-array Fortran (wikipedia)
https://ja.wikipedia.org/wiki/Co-array_Fortran

[^1]: single image、すなわち1並列の場合は内蔵機能でできますが、あまり意味がありません。おそらくCoarrayで書かれたコードをそのままコンパイルするための機能だと思われます。
Pythonで絵文字を出力する

どうも。
主にiOSエンジニアですが、他の言語も色々やってます。

今回、Pythonで文字出力してるときにふと絵文字出したくなったのでやってみました。

# 準備
文字コードを熟知して色々やれば、自分でもできるんでしょうが、今回は`emoji`というパッケージ使います。

```
$ pip install emoji
```

# 使い方
あとは使うだけ。
`emoji.emojize`を使って文字を出力します。

```python
import emoji

print emoji.emojize(':smile:', use_aliases=True)
print emoji.emojize(':heart: :zzz: :+1:', use_aliases=True)
```

![スクリーンショット 2018-03-15 0.52.20.png](https://qiita-image-store.s3.amazonaws.com/0/7690/632ae963-91a1-cb3f-2fcb-6e7b1753d9d1.png)

出てます。

`:(キーワード):`という形式で指定するようです。

絵文字として使用できるキーワードは以下を参照してください。
[EMOJI CHEAT SHEET](https://www.webpagefx.com/tools/emoji-cheat-sheet/)
アイコンクリックしたらコピーされます。

`use_aliases=True`にすると、公式のキーワードだけでなくエイリアスも使えるとかなんとか。
基本Trueで良いのではと思います。

以上です。
MonoGameで2Dゲームを作る（前書き）

<h1>Monoとは？</h1>
Mono(モノ)とはGNOMEプロジェクト創設者が開発した、
.NETFramework互換の環境を実現するためのオープンソースのソフトウェアやプロジェクト名です。
Unityの普及などにより「MonoDevelop」というエディタを見かける機会が増えたと思いますが、そのおかげで感覚的にどんなモノかは分かるかなと思います。
要は、どこでもC#(厳密にいうと.NET)っぽく書いちゃおうぜって感じです。
2018年3月現在はマイクロソフトが開発や販売を行っているみたいです。
[Mono公式サイトはこちら][http://www.mono-project.com/]

<h1>MonoGameとは？</h1>
マイクロソフトが開発したゲームエンジンのXNAを
高い移植度で再現しているフレームワークです。
XNAとは2006年にリリースされたマルチプラットフォームのゲーム開発用ライブラリで
非常に優秀で使いやすかったのですが、2014年の春に突然終了してしまいました。

私を含む、困惑したXNA開発者を救う存在として生まれたのが・・・そう！
我らがMonoGameなのです！
（当時はUnityに入り浸入りで正直この存在に気づきませんでしたw）

前述したXNAは優秀なライブラリでしたが
MonoGameになってさらなる進化を遂げたので、以下にその特徴をあげていきます。

<h2>XNAからの移植性</h2>
「XNAで書いたコードがそのまま動く」とよく聞きますがまさにその通りです。
XNAで書いたものが本当にそのまま動いてしまう為、学習コストがかなり低いです。
MonoGameのリファレンスは少ないように感じますが、XNAのリファレンスで十分対応が可能なのです。

また、様々なプラットフォームで動作するようになりました。（Windwos,OSX,Android,iOS...etc)


<h2>シンプルなコードデザイン</h2>
C#で組むため複雑な処理を書く必要がなく、誰でも始めることができるようなシンプルな書き方を可能としています。
また、Unityとは違って画面上に直接配置などではなくコーディングをすることがメインですので、これからC#を始めてみたい人とかにもお勧めかなと思います。
（コンソールじゃつまらないですからねw）

<h2>とにかく・・・。</h2>
触ってみましょう、MonoGame。
という事で、次回は環境構築～プロジェクト立ち上げまで
ご紹介したいと思います。
どうぞよしなに宜しくお願いします。
SHA-3に関するまとめ

## SHA-3とは

一方向ハッシュ関数の一種、KECCAKというアルゴリズムが用いられており、ビットコインをはじめ様々なブロックチェーンで用いられている。生成するビット列の長さに応じてSHA3-224,SHA3-256,SHA3-384,SHA3-512といった規格が定義されている。

## 一方向ハッシュ関数とは

任意長のメッセージを入力すると固定長のハッシュ値を返す関数であるハッシュ関数の一種。ハッシュ値から元のメッセージを推測できない、異なるメッセージに対しては異なるハッシュ値が対応するという特徴を持つ。改竄の検出や電子署名などに用いられている。

##衝突

異なるメッセージが同一のハッシュ値を持つことを衝突と呼ぶ。この衝突は必ず起こるので、一方向ハッシュ関数は衝突を見つけることが事実上不可能である必要がある。衝突の見つけにくさを衝突耐性と呼ぶ。衝突耐性にはあるメッセージと同じハッシュ値を持つメッセージの見つけにくさである弱衝突耐性とハッシュ値が一致する二つのメッセージの見つけにくさである強衝突耐性がある。

## xor

バイト列同士の足し算。0+0=0,0+1=1,1+0=1,1+1=0。

## KECCAK
- スポンジ構造

<img width="540" alt="スポンジ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/116240/6be0c0b2-a4f6-9072-2a73-9b196eba16da.png">

KECCAKでは上図のようなスポンジ構造が用いられている。吸収フェーズと搾出フェーズに分かれており、r+cの長さの内部状態を持つ。メッセージMはpadにてパディング(rで割り切れるように足りないバイト列を足す)を施され長さrの入力ブロックi(1,2,3,,,)に分割される。そして入力ブロックが尽きるまで1から順に長さrの内部状態とxor、関数fによる処理を繰り返す(図では左から順に入力ブロック1,2,3,4が入力として使われる、また長さcの部分は入力の影響を受けない)。搾出フェーズでは長さrの内部状態を出力iとして出力、関数fによる処理を出力iの合計長が出力Zの固定長に達するまで繰り返して結合する。

- 内部状態と関数f

![Keccak-f-State.png](https://qiita-image-store.s3.amazonaws.com/0/116240/636d8e20-986c-d72a-5adb-7cf004b562fb.png)

KECCAKはr+cビットの内部状態を持つが、それは上図のような5*5*(r+c)/25の立方体が集合した直方体として扱われている。
１ビットが一つの立方体である。関数fはこの直方体に対して決められた操作(足したり入れ替えたり)を行うことに相当する。

##参考
https://keccak.team/
[VBScript]Microsoft Office 各アプリケーションをセーフモードで起動する

別にすぐ作れるような気はしますが、クラッシュしたときに一度セーフモードで起動すると安定します。特にExcelはそうです。
そのため、各VBScriptをあらかじめ作って保存しておくとクラッシュしたときにも安心です。特にパワーポイントの実行形式ファイルの名前は中途半端ですよね。:joy:
##VBScriptで起動するとセーフモードかどうか聞いてこない
```vbs
Wscript.Echo buf
```
各スクリプトは上記の部分を削ると、問い合わせなしで起動します。

#Excel

```vb.net
'https://support.microsoft.com/ja-jp/help/881075
Dim objShell,buf
Set objShell = CreateObject("WScript.Shell")
With objShell
buf = "Excel.exe /safe"
Wscript.Echo buf
.run buf , 1, false
End With
set objShell = Nothing
Wscript.Quit
```

#WinWord

```vb.net
'https://support.microsoft.com/ja-jp/help/881075
Dim objShell,buf
Set objShell = CreateObject("WScript.Shell")
With objShell
buf = "Winword.exe /safe"
Wscript.Echo buf
.run buf , 1, false
End With
set objShell = Nothing
Wscript.Quit
```
#Outlook

```vb.net
'https://support.microsoft.com/ja-jp/help/881075
Dim objShell,buf
Set objShell = CreateObject("WScript.Shell")
With objShell
buf = "Outlook.exe /safe"
Wscript.Echo buf
.run buf , 1, false
End With
set objShell = Nothing
Wscript.Quit
```
#PowerPoint

```vb.net
'https://support.microsoft.com/ja-jp/help/881075
Dim objShell,buf
Set objShell = CreateObject("WScript.Shell")
With objShell
buf = "Powerpnt.exe /safe"
Wscript.Echo buf
.run buf , 1, false
End With
set objShell = Nothing
Wscript.Quit
```

#Microsoft Access

```vb.net
'https://support.microsoft.com/ja-jp/help/881075
Dim objShell,buf
Set objShell = CreateObject("WScript.Shell")
With objShell
buf = "Msaccess.exe /safe"
Wscript.Echo buf
.run buf , 1, false
End With
set objShell = Nothing
Wscript.Quit
```
【Python3】AtCoder Beginner Contest 090 問題B

# 概要
3/11(日)のABC90の問題Bについてのメモ

# 問題
[AtCoder Beginner Contest 090 B：Palindromic Numbers](https://abc090.contest.atcoder.jp/tasks/abc090_b)

ざっくり言うと
* 5桁の数字AとBを入力するよ
* AからBの間にある回文数の数を出力してね

# 考えた手順
1. AとB(A≦B)を入力。回文数カウンタを作成
2. AからBまで繰り返し
　2.1. 回文数か否かを判定。真ならカウンタに+1
3. 回文数の数を出力

回文数の判定は
万の位の数==一の位の数 かつ 千の位の数==十の位の数
とした。

# 考えたコード
```python:ABC90_B.py
def main():
    #1. input
    a, b = map(int, input().split())
    
    ans = 0
    
    #2. from A to B
    for i in range(a, b+1):
        #2.1. judge if the number is palindromic
        if (str(i)[0]==str(i)[4]) and (str(i)[1]==str(i)[3]):
            ans = ans+1
        
    #3. output
    print(ans)


if __name__ == '__main__':
    main()
```
## 思ったこと
* あまりにも5桁専用すぎる。問題としてはこれでいいんだろうけど汎用性は低い。
* `range(a, b)`は**aから(b-1)まで**であることに注意する。

## ハマったところ
入力を以下のようにしていてエラーを食らった

```miss.py
a = int(input())
b = int(input())
```
> A
> B

という入力形式ならこれでいいが、今回の入力形式は
>A B

だった。それならば入力は

```correct.py
a, b = map(int, input().split())
```
でなくてはならない。

[こちら](https://qiita.com/lethe2211/items/6cbade2bc547649bc040)を参考にさせて頂きました。ありがとうございます。


# スマートな方々
1 **数をstrに変換せずに回文数か判定**

```smart1.py
a, b = map(int, input().split())
c = 0
for i in range(a, b+1):
  if i//10000 == i%10 and (i//1000)%10 == (i//10)%10:
    c += 1
print(c)
```
//(商)と%(あまり)の演算子を上手に組み合わせられている。
というか、//と%を組み合わせることで任意の桁の数を取り出せる。これは他にも応用が利きそう！


2  **数を本当にひっくり返して判定**

```smart2.py
a, b = map(int, input().split())
ans = 0
 
for k in range(a, b+1):
    kk = str(k)
    if kk == kk[::-1]:
        ans += 1
 
print(ans)
```

注目は```kk == kk[::-1]```という部分
kk[::1]でkkという文字列を反転させられるらしい。何故じゃ！？
[こちら](https://qiita.com/Hawk84/items/ecd0c7239e490ea22308)の記事の[リンク先](http://d.hatena.ne.jp/redcat_prog/20111104/1320395840)が非常に参考になりました。ありがとうございます。

a[i:j:k]という構文が基本で、iからj-1までk刻みで取り出すっていう意味なんだけど、ここに**マイナス**が絡んできたり**iやjが省略**されたりすることで途端にややこしくなる。

文字列のスライスは要勉強。
Twitter APIを使ってツイートを取得(Python)

#事前準備
* Twitterのアカウントを取得
* アプリケーションへの登録（登録ページ：https://apps.twitter.com/）
* アクセストークンを取得（詳しい説明：https://syncer.jp/Web/API/Twitter/REST_API/）

#特定のツイートを取得
Twitter APIを利用する際に便利なPythonモジュール、tweepyを使います。インストールしていなければ```pip install tweepy``` してください。

```python:get_tweets.py
import tweepy

consumer_key    = ""
consumer_secret = ""
access_key      = ""
access_secret   = ""

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_key, access_secret)
api = tweepy.API(auth)

tweets = api.search(q='ホーキング博士', count=10)
for tweet in tweets:
    print(tweet.text, "/n")

```

consumer_key、consumer_secret、access_key、access_secretにはアプリケーションで登録した4つの情報を入れてください。


```api.search ```のq=は検索語、count=は取得するツイート数を指定します。なお、Twitter
 APIには制限があるため気をつけましょう。

> 参考までに
https://qiita.com/mpyw/items/32d44a063389236c0a65
公式APIリファレンス:https://developer.twitter.com/en/docs/api-reference-index
今回使ったAPI:https://developer.twitter.com/en/docs/tweets/search/api-reference/get-search-tweets
《Nuxt.js》CSSのオートプレフィクスをカスタマイズする方法。GridのIE対応も！

Nuxt.js で CSS(Sass) をコンパイルすると、ありがたいことに autoprefixer がベンダープレフィクスを自動で適用してくれます。

面倒で不毛な作業を Nuxt は設定不要でレガシーブラウザに対応してくれるわけですが、さらにこれをブラウザの要件に合わせて実装する tips です。

## autoprefixer の設定をカスタマイズする

要件や好みに合うようにカスタマイズしたい場合は、次のように nuxt.config.js を記述します。



```nuxt.config.js
module.exports = {
  build: {
    postcss: {
      preset: {
        autoprefixer: {
          grid: true,
        },
      },
    },
  }
}
```

かんたん🍟


ただし、Grid でマージンをコントロールするプロパティの `gap` に関しては、ポリフィルを適用することができません。
なので、悲しいけれど、これは捨てるという感じですね、IEでは。。

### 20180515 追記

とか嘆きましたが、なんと [autoprefixer v8.5](https://github.com/postcss/autoprefixer/releases/tag/8.5.0) から、 `gap` に対応してくれるようになりました＊
これで、`gap` のIE用のポリフィルも自動で実装できるようになりました！！いい時代！！！

### 参考

autoprefixer の Grid 対応に関しては @tonkotsuboy_com さんが、詳細を丁寧に解説してくださっています。


* [AutoprefixerがパワーアップしてCSS GridのIE 11対応がバリ楽になってた - Qiita](https://qiita.com/tonkotsuboy_com/items/bce73685cd6b1ea511dc)


### 関連
Grid の素敵さに関しては、以前記事を書きました。

* [《CSS》デザイナーでも簡単便利、Gridの神な実践機能を少しだけ伝えたい。 - Qiita](https://qiita.com/uto-usui/items/ce20624aea0652849981)

## おわりに
Nuxt.js は SSR / SPA を実装するだけでなく、静的なサイトを構築するのに便利なフレームワークで、コンポーネントを実装するとアトミックデザインの流れに乗ることができます。
とても気に入っているのですが、いろいろな知見が要求される場面がおおいので、本格導入するまでの学習コストは少し高い印象もあります。

基本的なことは[公式ドキュメント](https://ja.nuxtjs.org/)に綺麗にまとまっていますが、そこにないような小粒な tips をまとめていこうと思います。

Nuxt.js で Sass の導入についてはこちらに書きました。

* [《Nuxt.js》Sassの共通の変数やmixinを一括で各コンポーネントに読み込む方法。 - Qiita](https://qiita.com/uto-usui/items/6b745203fa6fad577877)

おわります。
enumって何だよ

# はじめに
python3のドットインストール講座を2周くらいして、
人のコードを読んでも雰囲気つかめるようになってきたので、
幅広げるべく色々調べて、理解したことを備忘録としてアウトプットできたらと思います。
全く変なこと言ってたらご指摘ください。

今日はenumについて色々調べていました。

# enumの概要
- 通称、列挙型というらしい。
- 複数の定数を１つにまとめておけるらしい。
- enumで定義する定数を通称、列挙子というらしい。

列挙って、ならべるってことだよね。
普通定数って定義するとなると、１つ１つ定数の箱を作ってあげる必要あるけど、
このenumをつかうと、１つの定義した箱の中で、定数をまとめておけるってことね。

# どんなことできるの？

とりあえず書いてみよ〜ってことで、リファレンスなどを参考に書いてみた。

```python
# ①インポート
from enum import Enum

# ②クラスの引数に Enum を引数で入れるのがお作法らしい。
class Youbi(Enum):
    #③この中で、定数の定義行った。曜日と対応番号をならべた。
    MON = 1
    TUE = 2
    WED = 3
    THU = 4
    FRI = 5
    SAT = 6
    SUN = 7

print(Youbi.MON)        #Youbi.MON が返ってくる。
print(Youbi.MON.name)   #MON が返ってくる。
print(Youbi.MON.value)  #1 が返ってくる。
print(Youbi(1).name)    #MON が返ってくる。

# 月曜日から3日後の曜日が知りたい場合
nanyou = Youbi.MON.value + 3  #月曜日の数値に 3日分足している。

# Youbi(nanyou)のnameを返してメッセージに出力してあげる。
print("MONから3日後は"+Youbi(nanyou).name+"です。") #MONから3日後はTHUです。が返ってくる。
```

# 結局enum使うと何がよくなるの？
色々調べてみたが、結局はコードの可読性（読みやすさ）を向上させる点にしかメリットを感じなかった。

網羅して触ってるわけじゃないので、きっと勉強すればするほど奥深い使い方ができる気ような気がする。

初心者はこのレベルのことを知ってればまぁ十分なのではないかと思った。
（初心者が言う言葉じゃないと思うけど。。。）

# 補習（※2018/03/15追記）
enumの良い点について、コメントいただいたので補習ということでコード書いて勉強してみました。

まず、7of9さんから頂いた内容から
> 動作の処理はそのままで、Enum定義の順番変更により処理の順番を変更できますね。

いろいろ調べてみたら、定期義順のイテレーション（繰り返しの処理）をサポートしてるみたいですね。
実際に書いてみました。

```python

from enum import Enum

class Youbi(Enum):
    MON = 1
    TUE = 2
    WED = 3
    THU = 4
    FRI = 5
    SAT = 6
    SUN = 7

for youbi in Youbi:
    print("name：" + youbi.name + " , value:" + str(youbi.value))

```

```:run
name：MON , value:1
name：TUE , value:2
name：WED , value:3
name：THU , value:4
name：FRI , value:5
name：SAT , value:6
name：SUN , value:7
```
これはかなり便利ですね。
nameやvalueをつけて実行しても、ちゃんと内容が順番通りで返ってきます。


>Python 3.6からはauto()を使えるようです。
これを使えば、列挙子の順番変更時に手作業で番号付けを変える必要がなくなりそうです。

とのことでしたので、pythonのversionをあげて検証してみました。

```python
# autoもimportする。
from enum import Enum, auto

# それぞれの値にauto()を与えてあげる。
class Youbi(Enum):
    MON = auto()
    TUE = auto()
    WED = auto()
    THU = auto()
    FRI = auto()
    SAT = auto()
    SUN = auto()

for youbi in Youbi:
    print("name：" + youbi.name + " , value:" + str(youbi.value))
```

```:run
name：MON , value:1
name：TUE , value:2
name：WED , value:3
name：THU , value:4
name：FRI , value:5
name：SAT , value:6
name：SUN , value:7
```
これはすごい。定義した順番で自動採番してくれてますね。

曜日を使っている機能があちこちであって、
<b> 「月曜始まりを日曜始まりにしたい！」 </b>って要望がでたりしたら、
ここで定義した定数の順番を変えるだけで各所変更が反映できるって感じですかね！
とても勉強になりました。ありがとうございました。

続いてmather314さんから頂いたコメント
>個人的には「問題領域の制限」そのものをコードに落とせる便利な記法の一つだと思っています。

コメントに書いてくださっているURLのページ拝見させていただきました。
比較などを行うにあたって、enumで必要最低限の比較対象を列挙してあげることで、
関数の処理における内容をよりスマートにさせるということですね。

これはちょっとコーディングして確認するすべが思いつきませんでしたが、
イメージつかめました。プログラミングは奥が深いです。ありがとうございました。
Python 2.x と 3.xの違い覚書

## input()関数の型

Python 2.x系では、input関数で取得した値は、適切な型に変換される。

```python:python2.x
a, b = input(), input()
print(a+b)
# a=2, b=3 → 5と表示
```

Python 3.x系では、input関数で取得した値は、str型で取り扱われる。
数値として取り扱いたいときは、型変換する

```python:python3.x
a, b = input(), input()
print(a+b)
# a=2, b=3 → 23と表示

a, b = int(input()), int(input())
print(a+b)
# a=2, b=3 → 5と表示
```

##range関数の取り扱い

Python 2.x系では、rangeを変数で受けると、配列を取り込める

```python:python2.x
a = range(5)

print(a)
# [0, 1, 2, 3, 4]
```

Python 3.x系では、range関数はrangeオブジェクトとして受け取られる。
配列として取り扱うとエラーがでる。
配列として取り扱うときは、list関数で変換すれば、配列として取り扱える。
(頂いたコメントを参考にして修正しました)

```python:python3.x
a = range(5)
a[0] = 1
print(a)
# エラー
# TypeError: 'range' object does not support item assignment

a = list(range(5))
a[0] = 1
print(a)
# [1, 1, 2, 3, 4]
```
PHP 5.3 未満のシステムの単体テストを書く時によくやること (PHPUnit + runkit)

## private function をテストする

HogeClass の private function fuga($arg) をテストしたい場合

~~~php
    // fuga を _fuga にリネーム
    runkit_method_rename(
        'HogeClass',
        'fuga',
        '_fuga'
    );
    // public な fuga を追加し、fuga から _fuga をコールしてやります
    runkit_method_add(
        'HogeClass',
        'fuga',
        '$arg',
        'return $this->_fuga($arg);'
    );
~~~

PHP 5.3 以上の場合はこんなことしなくても [ReflectionMethod](http://php.net/manual/ja/class.reflectionmethod.php) で！

## protected function をテストする

HogeClass の protected function fuga($arg) をテストしたい場合
これは runkit なくてもいけますね

~~~php
// Wrapper を用意。extends した Class から親のメソッドをコールします
class HogeWrapper extends Hoge
{
    public function fuga($arg) {return parent::fuga($arg);}
}

class HogeTest extends PHPUnit_Framework_TestCase
{
    // HogeWrapper です
    private $testClass;

    // テストメソッドごとに 1 度ずつ実行
    public function setUp()
    {
        // Wrapper を new してセット
        $this->setTestClass(new HogeWrapper());
    }

    public function testFuga()
    {
        // テストする時は Wrapper を通して実行
        $this->assertEquals(
            'expectedValue',
            $this->testClass->fuga()
        );
    }
}
~~~
    

## テスト対象の Class にアクセサが無くてテストし辛い

マジックメソッド __get と __set を追加しています

~~~php
    // テスト前にテストデータをセットできるように
    runkit_method_add(
        'Hoge',
        '__set',
        '$member, $value',
        '$this->$member = $value;'
    );
    // テスト後にメンバを取得して assertEquals など
    runkit_method_add(
        'Hoge',
        '__get',
        '$member',
        'return $this->$member;'
    );
~~~

---

runkit を利用した場合は他のテストに影響を及ぼさないように必要に応じて`@runTestsInSeparateProcesses`か`@runInSeparateProcess`を忘れずに付けています
railsデバック方法チートシート

# viewでのデバック

```ruby:例
<%= debug @test %>
```

これでviewに表示されればその値はうまく渡せている

# controllerでのデバック

```ruby:例
logger.debug(@test)
```

これでターミナルにlogが表示される

# byebugでのデバック

https://railsguides.jp/debugging_rails_applications.html

詳しくはここに
ドラゴン桜から学んだメモリーツリーを使ったエンジニアの勉強法

最近漫画アプリでドラゴン桜にはまっているのですが、
~~漫画も勉強だと言い聞かせたく~~とても参考になったのでメモリーツリーを実践してみたところ、
新しく何かを学ぶ時や資格の勉強をするときには良い勉強法だと思いまとめました。

特に今まで体系的に学んできていない人にとっては、芋づる式に学ぶこともできるのでオススメです。

# メモリツリーとは
[wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%BC%E3%83%84%E3%83%AA%E3%83%BC)によると
> メモリーツリーとは勉強法・記憶法の一つ。もともとは、「マインドマップ」の発想法を基にしたもので、根本的なところは「マインドマップ」と同じものである。

[マインドマップ](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%82%A4%E3%83%B3%E3%83%89%E3%83%9E%E3%83%83%E3%83%97)についてはこちら
> 描き方は、表現したい概念の中心となるキーワードやイメージを中央に置き、そこから放射状にキーワードやイメージを広げ、つなげていく。思考を整理し、発想を豊かにし、記憶力を高めるために、想像 (imagination) と連想 (association) を用いて思考を展開する。

## 詳しく知りたい人は

[三田紀房公式サイト](https://mitanorifusa.com/)でメモリーツリーが紹介されているドラゴン桜漫画が読めるようになっているので、興味ある方は読んでみてください。
[ドラゴン桜勉強法⑨ 暗記が苦手ならメモリーツリーを使え！編](https://mitanorifusa.com/articles/examinationstudy/114)
[ドラゴン桜勉強法⑩ メモリーツリーはこうして完成させる！編](https://mitanorifusa.com/articles/examinationstudy/121)

これも勉強ですよ！笑

# 実際にメモリーツリーを書いてみた
CCNAの勉強をしていたので、メモリーツリーを使ってまとめてみました。
![image uploaded from ios 3](https://user-images.githubusercontent.com/11749585/37406858-85fd6304-27db-11e8-96f2-c8b454e99147.jpg)


## やってみて良かったこと
・かなり頭の中が整理される
ある程度の理解がないとそれぞれの関係性などもわからず書けないので、最低限学んだ内容の関係性や全体像というものを、ただ本などを読むよりも把握しやすかったです。

・わからない時に確認がしやすい
それぞれの関係性や全体像が一目見てわかるので、わからないことがあった時にすぐに確認ができました。

・1つの項目からいろいろな項目(知識)が出てくる感覚が面白かった
個人的にこれが一番良かったなと思っていて、メモリーツリーを作るのが面白かったです。
どんどん派生して新しい知識を身につけていけていっている感覚でした。

## やってみて悪かったこと
・やっぱり手書きだと時間がかかる
mind mapを作れればなんでも良いので、PCでも試してみようと思いつつやれてない。。
ただ、頭の中にあるイメージとかもかけたりするので、手書きは良いなと思いました。

・慣れないとどう書くかで迷うので無駄な時間が発生する
これも手書きの悪いところからなと思ったのですが、後で修正がしにくいため、慣れないと構成に悩まされます。
これに関しては全体像を意識することと、必要に応じて次のページに一部を切り出せば良いと割り切ってからあまり気にならなくなりました。

## やる上でのコツ
・綺麗に書こうとしない
悪かったところの部分で、綺麗に書こうとすればするほど時間がかかります。
何回かやって、この書き方をした方が良いという感覚がつかめればそれで良いかなと思います。

・自分なりの工夫を入れないとわかりづらい
全部黒で書いてみたらかなりわかりずらかったので、色を使うようにしました。
あとは文章だけよりも、図とかあると良いかなと。

## まとめ
なんでも書いてもメモリーツリーを使うとコストが高いのですが、理解が難しい部分や時間を書けてもちゃんと理解したい部分などに使うと費用対効果が良いのかなという印象でした。
また人によって良し悪しがあると思ったのですが、早い段階で勉強の仕方を勉強をしておくと良いなあと再認識しました。
【Swift】文字列連結のビルド時間と処理時間

Swiftで文字列を連結するにはいくつかやり方はありますが、どのやり方が最適なのか気になったのでビルド時間と処理時間を比較してみました。

まずは文字列連結の実装です。
今回は以下の4パターンを検証します。

```
var text: String?
let sex = "男"
let picture = "写真"
let number = "三"
let verb = "見た"

// + 演算子を使う方法
func join1() {
    text = "私は、その" + sex + "の" + picture + "を" + number + "葉、" + verb + "ことがある。"
}
    
// 文字列に変数の値を埋め込む方法
func join2() {
    text = "私は、その\(sex)の\(picture)を\(number)葉、\(verb)ことがある。"
}
    
// appendを使う方法
func join3() {
    var str = "私は、その"
    str.append(sex)
    str.append("の")
    str.append(picture)
    str.append("を")
    str.append(number)
    str.append("葉、")
    str.append(verb)
    str.append("ことがある。")
    text = str
}
    
// String(format:)を使う方法
func join4() {
    text = String(format: "私は、その%@の%@を%@葉、%@ことがある。", sex, picture, number, verb)
}
```

これを [BuildTimeAnalyzer-for-Xcode](https://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode) を使ってビルド時間の計測を行います。
結果は以下のようになりました。
![スクリーンショット 2018-03-14 22.01.19.png](https://qiita-image-store.s3.amazonaws.com/0/14751/9a8fc94a-bfa3-f8d0-0b51-c5caf343eae8.png)

「String(format:)を使う方法」　が一番速く、「文字列に変数の値を埋め込む方法」が一番遅いようです。

では処理時間はどうでしょうか？
上記のメソッド上から順に以下のような結果になりました。

```
0.00344204902648926
0.000853061676025391
0.000445008277893066
0.00658690929412842
```
「String(format:)を使う方法」　が一番遅く、「appendを使う方法」が一番速いようです。

上記の実装例では、文字列連結に使う変数が全て `String` でしたが、 `String` 以外が含まれている場合も見てみましょう。
上記の実装例の `let number = "三"` を　`Int` に変えます。

```
var text: String?
let sex = "男"
let picture = "写真"
let number = 3
let verb = "見た"
let strings = ["1", "2", "3", "4", "5"]
    
override func viewDidLoad() {
    super.viewDidLoad()
    join1()
    join2()
    join3()
    join4()
}
    
// + 演算子を使う方法
func join1() {
    text = "私は、その" + sex + "の" + picture + "を" + String(number) + "葉、" + verb + "ことがある。"
}
    
// 文字列に変数の値を埋め込む方法
func join2() {
    text = "私は、その\(sex)の\(picture)を\(number)葉、\(verb)ことがある。"
}
    
// appendを使う方法
func join3() {
    var str = "私は、その"
    str.append(sex)
    str.append("の")
    str.append(picture)
    str.append("を")
    str.append(String(number))
    str.append("葉、")
    str.append(verb)
    str.append("ことがある。")
    text = str
}

// String(format:)を使う方法
func join4() {
    text = String(format: "私は、その%@の%@を%i葉、%@ことがある。", sex, picture, number, verb)
}
```

![スクリーンショット 2018-03-14 23.06.13.png](https://qiita-image-store.s3.amazonaws.com/0/14751/c684fa67-edb8-9878-5078-ed99982e93d0.png)

相変わらず「String(format:)を使う方法」が一番早いですが、 `String` と `Int` が混ざっている場合だと「+ 演算子を使う方法」が一番遅くなりました。
処理速度は以下のようになりました。

```
0.0204509496688843
0.00079500675201416
0.000352025032043457
0.00585699081420898
```

「+ 演算子を使う方法」　が一番遅く、「appendを使う方法」が一番速いようです。

### まとめ
これらの結果から、ビルド時間と処理速度を重視するなら「appendを使う方法」が一番バランスが良さそうですが、実装例を見ても分かるようにコードが冗長で見づらいという難点があります。

ビルド時間を最優先する場合は「String(format:)を使う方法」が良さそうです。
ただし、Objective-Cに馴染みのある人ならそこまで抵抗ないかもしれませんが、Swiftで `「String(format:)` を使うのは好みがあるかもしれませんね。

ビルド時間に悩んでいないうちは「+ 演算子を使う方法」や「文字列に変数の値を埋め込む方法」を使っても良いですが、この2つは `String` だけの場合と、複数の型が混合する場合とで使い分けるのが良さそうです。

Swiftの文字列連結の方法はいくつかありますが、この方法が最適！というものはなく、プロジェクトの状況や実装内容によってケースバイケースということのようでした。
機械学習初心者が画像分類チュートリアルを読み解く

画像分類の学習をしたかったので[TensorFlowのチュートリアル](https://www.tensorflow.org/tutorials/deep_cnn)を読み解きながら進めてみました。
AWSで実行環境を立ち上げてサンプルを動かしてみます。
TensorFlow使うのも初めてだったので、各用語を調べながら進めたメモを残します。

# 学習手法について
ここではCNNという手法が使われています。
CNNは日本語でいうと畳み込みニューラルネットワークといいます。
解説記事がたくさん世の中にあるので詳細な説明は省きますが、理論はそこまで難しい数式が出てくるわけではないように見えたので、興味がある方は是非調べてみると面白いと思います。

# CIFAR-10について
CIFAR-10とは、画像認識のベンチマークとして広く使われているデータセットです。
32*32の画像が60000枚入っていて、airplane, automobile, bird, cat, deer, dog, frog, horse, ship, truckの10種類のラベル付けがされています。
このチュートリアルではこのデータセットを対象に画像分類を行います。

# チュートリアルのコードについて
このチュートリアルのコードは[ここ](https://github.com/tensorflow/models/tree/master/tutorials/image/cifar10/)から入手することができます。
このサンプルコードは大きく分けて３つの部分に分けることができます。

1. モデルの入力生成
2. モデルによる予測の評価
3. モデルの学習

### 1. モデルの入力生成
ここでは学習するための画像の前処理を行っています。
具体的には以下のようなことを行っています。

* 32*32の画像を24*24にランダムに切り取る
* 画像の明るさをそろえる
* 画像に反転や明るさの変更などの加工を行い、学習データを増やす

### 2. モデルによる予測の評価
モデルをもとに、予測結果を評価します。

### 3. モデルの学習
データをN個に分類するための学習モデルとして一般的である多クラス分類ロジスティック回帰を使用しています。
詳細な解説は私も初心者なので書けませんが、理解できた部分部分だけ書くと、

* ニューラルネットワークの出力をソフトマックス関数で変換したものを各クラスに属する確率とする
* 出力された各クラスの確率のベクトルと、正解のベクトルとの間の交差エントロピーを損失関数とし、これを最小化するように学習する
    * 交差エントロピーは正の値であり、正解に近づくほど0に近くなる性質を持つ
* 損失関数を最小化させる重みを最急降下法で学習させる

間違いや補足があったらご指摘いただきたいです...

# サンプルの実行
AWS上でEC2インスタンスを立ち上げてサンプルを実行してみます。
EC2インスタンスをAMIか作ることで、最初から必要なソフトウェアがインストールされた環境を作ることができます。
今回はDeep Learning AMI (Amazon Linux) Version 5.0を選択しました。
試しに動かしてみるだけなので、インスタンスタイプはt2.mediumを選択。
やったことは、

* 立ち上げたEC2インスタンスにSSHでログイン

```bash
source activate tensorflow_p36 #tensorflowの環境を選択、これをしないとtensorflowが使えない
git clone https://github.com/tensorflow/models.git
cd models/tutorials/image/cifar10
python cifar10_train.py
```
* 画像ダウンロードが走った後...

```
2018-03-14 13:50:02.431156: step 0, loss = 4.68 (97.2 examples/sec; 1.316 sec/batch)
2018-03-14 13:50:10.778302: step 10, loss = 4.62 (153.3 examples/sec; 0.835 sec/batch)
2018-03-14 13:50:19.006783: step 20, loss = 4.53 (155.6 examples/sec; 0.823 sec/batch)
2018-03-14 13:50:27.264905: step 30, loss = 4.42 (155.0 examples/sec; 0.826 sec/batch)
2018-03-14 13:50:35.519980: step 40, loss = 4.33 (155.1 examples/sec; 0.826 sec/batch)
2018-03-14 13:50:43.708251: step 50, loss = 4.34 (156.3 examples/sec; 0.819 sec/batch)
...
```

無事動きました。
しかし学習のログからは損失関数の値しかわかりません。
画像分類の正解率を知るためには、評価用のプログラムを動かします。

```bash
python cifar10_eval.py
2018-03-14 14:00:09.476609: precision @ 1 = 0.096
``` 

右に出ているのが正解率です。
今回は学習を短い時間しか動かしていないので9.6%という低い正解率になっていますが、学習途中の正解率を表示することができました。


ここまででtensorflowによるCNNを用いたCIFAR10の画像分類のチュートリアルを動かすことができました。
次は自分で用意したデータセットでの学習や、GCPを用いた画像分類に挑戦したいと思います。
IntelliJ IDEA または WebStorm で既存の React Native プロジェクトが Web プロジェクトとして認識されないときの対処法

# 問題

- React Native プロジェクトを Web プロジェクトとして新規作成はできる
- 既存の React Native プロジェクトを開こうとすると **Javaプロジェクト** として認識されてしまう

仕事のモチベーション削がれてめちゃくちゃ困った。もしかしたら IntelliJ IDEA 特有かもしれないけど一応 WebStorm もタイトルに入れておきました。

<img width="833" alt="スクリーンショット 2018-03-14 23.07.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/25060/01a44190-18e0-b1d3-b0d4-d710db1b6a17.png">

サポートに聞いてもロクな回答がもらえなくてつらかった。Webプロジェクトとして認識されないとESLint動かんのじゃ。

# 対処法

脳筋解決法

1. **`ios` `android` `node_modules` など，ネイティブビルドのためのファイルが入っているディレクトリを別の場所に移す**
2. 空の `node_modules` ディレクトリを作成 
3. **この状態でプロジェクトをインポートすると無事 Web プロジェクトとして認識される**
4. `node_modules` ディレクトリを削除
5. 1で退避したディレクトリを復元する

バカみたいだけどこれで何とかなった。明日から幸せなJetBrains製品による開発が戻ってくる…（Atomで書くのクッソ辛かった）
ヘルプデスクからSEに転向し、転職を考えたときに見返した話

製造業からIT業界へ、しかもITコンサルへと進もうとしている
新人SEが抱える悩み、失敗談をみなさんの参考になればと記事書かせていただきます。

本来のQiitaの使い方とは違うかもしれないけども、ブログみたいに使われてる方もいるのでなんとなーく。

さてそれでは
　1.自己紹介
　2.転職の方向性
　3.まとめ
の3部でお送りします。

<b><i>1.まずはじめに自己紹介</i></b>
　このページに足を運んでいただきありがとうございます。
　初投稿なので読み苦しいかもしれませんが楽しんでもらえればと思います。

　さて、タイトルの通り私は工業高校を出て、入社後工場勤務で現場作業。
　そしてかれこれ3年半ほど前に、趣味でPC組んでたってだけの理由で社内ヘルプデスクとして業務を行う流れに。
　この時点では転職なんてさらさら考えてませんでしたし、VBAのシート見るだけですげぇ、自分には手の届かない所だ・・・と思ってました。
　そんな中、社内は基幹システムをSAPやERP、MESなど幅広く着手。大したサポート体制もなく、トラブルでヘルプデスクはてんてこまい。
　そして流行りのIoTにも手を出し始め、Webカメラのネットワーク接続設定やらを頼まれてテストしたのが始まり。
　ひょんなことから社内で自社ソフト開発や運用保守を一貫してやってる部署から声がかかって、転籍。

　ここからSEとしての道が始まりました。
　プログラム未経験からのいきなりSE。SEというのかすら不明。
　まずは社内システムの言語が基本VB.NET。VB.NETで教則通りのコーディングの基礎知識を習得。
　DOS/Vの時代から、VB6->VB2010と昇華させてきたそう。
　途中ハードウェア開発や製作もしながら、UML・VBA・ネットワーク・電子回路の教育を受けつつ、既存ソフトウェアの仕様把握。
　といっても自社開発、しかも単独開発。仕様や要件定義は開発者の頭の中。
　それを1人で数か月かけてフォームが15種類いくらい、1フォーム3000行ぐらいあるシステムを解析。ある種リエンジのようなものです・・。
　結局上司判断でデータフロー書き出して終わりでした。

　そこからは基本的に別のハードとソフト両方を調整したり、原因の切り分け。
　最近になって、外注に出したシステムの仕様書とかを見るも、それを自社開発のものに適用する時間もなく・・・。
　また、合わせて基幹システムとの連携の話も出てきたりなんかして、要件定義やデザインレビューを作成したのも最近の話。
　それと並行してHoloLensの社内紹介や購入サポート、設定サポートもしたりして。
　こんなことを1年続けてて、社内外の情報を得ていて思うこと・・・<font color=red><b>「この会社いても平社員なのに特殊な立場に居すぎて給料見合わねぇ！」</B></font>

　と、転職を決意したわけです。長くなりすぎました。


<b><i>2.転職の方向性</i></b>

　さて、現在転職活動なうなのですが、なかなか困ってます。
　ヘルプデスクとして社内インフラ・デバッグなどを行ってきました。
　SEとして既存システムの改修や動作検証などを行ってきました。
　といってもプログラムさわりはじめて1年。
　各機器やそれに付随するソフトウェアの技術検討・・そんなことをやってきました。
　ただ一つ言えること。

　<b>「簡単に売り込める資格や自分が主導して取り込んだ実績がない・・・・」</b>

　マネージャという立場でもなく、裁量権も与えられることなく、プログラマとしてもSEとしても未熟。
　経営観はあって、全体の最適化に対する問題点と解決策の着眼はある。が、それだけでコンサルタントは成り立たない。

　HoloLensにかかわる業務がしたいけど、C++もJavaもUnityも使えない。
　そしてWindows系しか触ったことがない・・。

　そんなこんなでITコンサルに進みたいのかどうしたいのか、っていうと一番のポイントは家族の稼ぎ頭としての収入・・。

　という家庭事情なんかも鑑みて、転職活動を続けてますが・・どうなるやら。
　そこはこれからのお楽しみです。

　個人的には、自分たちがハッピーなら周りをハッピーにできる仕事も頑張れるだろう！ということでITコンサルで楽できる人を増やしたいんですよね。

<b><i>3.まとめ

　ある種の失敗談？だと自分のことを思っています。
　30代も半ばに差し掛かってからの転職、しかもここ数年で経験が増えた分野。
　そうはいっても、世の中の流れに緩やかに流されて暮らすくらいなら楽しく生きたいと思うものです。

　これから仕事に就く方も、転職を考えてる方も、意識しておいてください。

　<font color=blue><b>「これからの時代、学歴は入り口でしかなく、実力社会では資格と実績だ」</b></font>

　ということで、ITコンサルとしての立場、現状の日本国内では狭すぎるHoloLensコミュニティを更に活発化させるための基盤づくり、いずれはMicrosoftさんでHoloLensの一大ソリューションを巻き起こすことを夢見て・・・ITIL Foundationから取得に向けて頑張ります。
　ほかにもこれあるといいよ！なんて資格あれば、良ければ教えてください～。

　おわりー、ありがとうございました。
またハマる。ssh接続できない落とし穴

# またはまってしまった
sshでサーバに接続するのはもう慣れたもので、
やれ権限やの、
やれ実行ユーザーやの、
やれ改行コードが混じっているだの乗り越えてきたつもりなんだけど、このパターンもあるのか。

# ssh接続しようとすると
Permission denied (publickey)
うん、よく見たことあるやつ

# 原因
#### windowsで使っていたppkをmacで使おうとしたから
はい、ppkはOpenSSHでないので、macでは使えませんでした

# 変換方法

こちらご参考にさせていだきました
[Macでお手軽にppkをpemに変換する方法](https://qiita.com/harapeko_wktk/items/ffdecc7578fd8b203587)
複数のバージョンのNodeJSをインストール

[NodeJS](https://nodejs.org)は頻繁にバージョンアップされています

複数のバージョンのNodeJSをインストールし
切り替えて使用できるツールを紹介します

- [備考] NodeJSのリリーススケジュール  
  https://github.com/nodejs/Release#release-schedule

# [nvm](https://github.com/nvm-sh/nvm) を利用する (macOS/Linux)
## インストール
#### Homebrewでインストール(macOS)

```sh:
$ brew install nvm
```
#### インストーラをダウンロードして実行

```sh:
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.2/install.sh | bash
``` 

### ディレクトリを作成

```sh:
$ mkdir ~/.nvm
```

### 起動スクリプトを追加
お使いのシェルに合わせて `.bash_profile` や `.zshrc` に以下を追加

```sh:.zshrc
export NVM_DIR="$HOME/.nvm"
[ -s "/usr/local/opt/nvm/nvm.sh" ] && . "/usr/local/opt/nvm/nvm.sh"
```

## 使い方
- インストール可能なバージョンの一覧を表示

```sh:
$ nvm ls-remote
```

- 指定バージョンのNodeJSをインストール

```sh:
$ nvm install 14.3.0
```

- 最新LTSバージョンのインストール

```sh:
$ nvm install --lts
```

- インストール済みのバージョンを確認

```sh:
$ nvm ls
```

- 使用するNode.jsのバージョンを選択

```sh:
$ nvm use 14.3.0
```


# nodebrewを使う(macOS/Linux)

## インストール

```sh:
$ curl -L git.io/nodebrew | perl - setup

$ echo 'export PATH=$PATH:$HOME/.nodebrew/current/bin' >> ~/.bash_profile

$ $SHELL -l
```

## 使い方
- インストール可能なバージョンの一覧を表示

```sh:
$ nodebrew ls-remote
```

- 指定バージョンのNodeJSをインストール

```sh:
$ nodebrew install-binary v8.11.1
```

- インストール済みのバージョンを確認

```sh:
$ nodebrew ls
```

- 使用するNode.jsのバージョンを選択

```sh:
$ nodebrew use v8.11.1
```






# nodistを利用する (Windows)
https://github.com/marcelklehr/nodist

## インストール
[nodistのリリースページ](https://github.com/marcelklehr/nodist/releases)からダウンロードした[NodistSetup-v0.8.0.exe](https://github.com/marcelklehr/nodist/releases/download/v0.8.8/NodistSetup-v0.8.8.exe) を実行

## 使い方
- インストール済みのNodeJSのバージョンを一覧表示

```powershell:
> nodist
```

- インストール可能なNodeJSのバージョンを一覧表示

```powershell:
> nodist ds
```

- 指定バージョンのNodeJSをインストール

```powershell:
> nodist + 8.11.1
```

- 指定バージョンのNodeJSを使用する

```powershell:
> nodist 8.11.1
```
複数ファイルを含んだZIPを解凍してS3に保存してみた

# はじめに
基本的に「zipruby古いし、rubyzip使えばいいじゃん」的な記事は多いのだけど、どれも「複数のファイルを圧縮する方法」や「複数ファイルを取り出す方法」については書かれているのだけど、取り出したファイルを元ファイルとしてS3に直接保存したいと思い、どハマりしたので備忘録としてメモ。

# やったこと
1. ZIPファイルをHTTPで受け取る
2. 元ファイルをS3に保存
3. ZIPファイルを解凍して各ファイルをS3に保存（ここがキモ）

# 実際のコード
## リクエスト
下記のようなリクエストでファイルを送信したと仮定。

```
curl -Ss "[サーバの受信用URL]" -X POST -F "file=@[ファイル名]" -F 'json={"parameter": [{"name":"FileParameter", "file":"file"}]}'
```

## サーバ側のコード
上記のリクエストを送ると、params[:file]でパラメータからファイルを受け取れる。

```
# 基本的に大文字キャメルクラスは定数

def decompress_and_send_file_to_aws
  # AWSへの接続設定
  Aws.config.update({credentials: Aws::Credentials.new(AWS_KEY, AWS_SECRET)})
  Aws.config[:region] = AWS_REGION
  s3 = Aws::S3::Client.new

  # S3に元ファイルを保存
  send_file_to_s3(s3, params[:file], params[:file].original_filename)

  # ZIPの解凍用の設定
  decrypter = Zip::TraditionalDecrypter.new(ZIP_PASSWORD)

  # ZIPファイルを開く
  # ファイルがparams[:file]で取得できるのでpathでファイル名が取れる
  Zip::File.open(params[:file].path, decrypter) do |input|
    input.each do |entry|
      # ZIPファイルの各ファイルごとにoffsetとファイル名を取得
      file_name = entry.name
      offset = entry.local_header_offset
      # ZIPファイルの各ファイルを取り出してS3に保存
      Zip::InputStream.open(params[:file].path, offset, decrypter) do |zip_input|
        zip_input.get_next_entry
        io = zip_input.read
        send_file_to_s3(s3, io, file_name)
      end
    end
  end
end

def send_file_to_s3(s3_client, file, file_path)
  s3_client.put_object(
    bucket: AWS_BUCKET_NAME,
    body: file,
    key: file_path
  ) 
end 
```

「ファイルを開く」と「ファイルを読み出す」が入れ子になっていて無駄な気がするのだけど、Zip::File.openで取得できるEntryオブジェクトのInputStreamではファイルの中身が取れなかったので、おそらく複数ファイルある場合は、InputStreamを生成する際にoffsetを適切に取得してやる必要がある様子。
Androidのwebviewで踏んだAタグのリンクへのフック処理

# 概要
Androidのwebviewで、
Aタグ踏んだときに、
Aタグ指定のURLへ行くのでなく、
指定したURLへ遷移させたい

# 環境
Android Studio 3.1
Android 6と7.1.1
Kotlin

# 結論

```kotlin
shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean

```
を使えば、全てのOSバージョンで呼ばれる。

``` test.kt
            override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
                println("URLに遷移しようとしています。::" + url + "\n\n")

                if(url!!.contains("image")){
                    //URLに"image"文字が含まれているとき
                    view?.loadUrl("https://sakudev1.sysken.tokyo")//遷移
                    return true
                }

                return super.shouldOverrideUrlLoading(view, url)
            }
```

# 考察とか

```kotlin
override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
```
これは、Android7以上でよばれる。
しかし、Android７以上でも

```kotlin
            override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean
```
がよばれる。
OSバージョン分岐すればよいが、めんどい。分けるべきだろうか？
Androidの対応はどうすればよいのか、どれが普通なのか？

# 参考文献
https://ja.stackoverflow.com/questions/12879/webview%E3%81%A7%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%82%92%E3%83%95%E3%83%83%E3%82%AF%E3%81%97%E3%81%A6%E5%BC%B7%E5%88%B6%E7%9A%84%E3%81%AB%E4%BB%BB%E6%84%8F%E3%81%AEurl%E3%81%AB%E9%81%B7%E7%A7%BB%E3%81%95%E3%81%9B%E3%81%9F%E3%81%84

https://stackoverflow.com/questions/36484074/is-shouldoverrideurlloading-really-deprecated-what-can-i-use-instead
C に翻訳限界があるのはコンパイラをチューリングマシンにしないためである

[バグのないソフトウェアの作れない理由](https://qiita.com/yuba/items/0fff6e3396392c493976) を読んで徒然と思ったこと。厳密な議論ではないので悪しからず。

なぜ C には[翻訳限界](https://qiita.com/yuki12/items/26994416162b54c811a1)があるのでしょうか。つまり、なぜ「規格として」定める必要があったのかという話です。
もし、規格に限界が定められていなければどうなるでしょうか。もし限界が無いとすると、例えば、コンパイラは無限にネストしたブロックを受理できなければなりません。もちろん、コンピュータの物理メモリは有限ですから、これは不可能です。従って、規格として「ブロックのネスト回数は無制限である」と書くことは不可能であり、限界を定める必要があったのです。
「無制限と書かなくても『メモリの許す限り』と定めれば良いではないか」と思われるかもしれません。しかし、あるコンパイラがメモリの許す限り無制限のネストを受理できるということを、どうやって証明するのでしょうか？ ある処理系がその規格に適合しているかどうかを検証できないのであれば、それは規格と呼ぶに値しません。
限界を定めるのと定めないのとで何が違うのか。それは限界を定めないとチューリングマシンでしか受理できないが、限界があれば有限オートマトンで受理できるということです。チューリングマシンと有限オートマトンの違いで重要な点は、チューリングマシンは、任意の2つのチューリングマシンが等価であることを証明できないという点にあります。つまり、コンパイラがチューリングマシンでしか実現できないとすると、そのコンパイラが仕様通り動くかどうか、言語規格に適合しているかどうかを数学的に証明できないということになってしまいます。

さて、こう書くと「ではC言語はチューリング完全ではないということか」と勘違いする人が出るでしょう。落ち着いてください。「C言語で書いたあるプログラムがチューリングマシンであるかどうか」と「C言語のコンパイラがチューリングマシンであるかどうか」は全く異なる概念です。明らかにチューリングマシンでなくても受理できるアセンブラのような文法でも、チューリングマシンをプログラムできます。C言語のチューリング完全性は、文法の複雑さからではなく、その背後にある計算モデルから来ているのです。
そもそもチューリングマシンとはどのような物だったかというと、遷移表とか機能表と呼ばれる有限オートマトンと、ヘッドで読み書きできる無限長のテープの組み合わせでした。C言語で「無限長のテープ」に対応するのは、プログラム自体ではなく、「常に読み書きできると仮定できる標準入出力」とか、「決してオーバーフローしないと仮定したスタック」に該当します。つまり、プログラムが無限大と見なせる領域にアクセスできて、それによって動作が変わるということが重要なのであって、プログラム自体がどのような文法の言語で記述されているかによって決まるのではありません。
pyplotで日本語表記するための設定(何周目?)


matplotlibでpyplotする時の日本語を表示するためのフォント設定のハナシ。
一度設定すると忘れてしまうので、別の環境を設定する時にどうしたら良いか分かんなくなってしまうので、メモ。

## matplotlibrc の在り処

matplotlibで使うフォントの設定は、matplotlibrcに設定する必要がある。

```python
import matplotlib
print(matplotlib.matplotlib_fname())
```

macOSとWindowsの場合は、```$HOME/.matplotlib/matplotlibrc```だった。Ubuntuは、```$HOME/.config/matplotlib/matplotlibrc```だった。

## フォントの名前を知る

Windowsだと拡張子が```.ttc```になっているTrueType Collectionファイルは指定できないし、Macだと「ヒラギノ角ゴシック」のような日本語のフォント名になっているものを、どうやってmatplotlibrcファイルに指定したら良いか分からないので、ソレを知るために、```font_manager```からフォント名を取得する。

```python
import matplotlib.font_manager as fm
import pandas as pd
fonts = fm.findSystemFonts()
tmp = []
for f in fonts:
    font = fm.FontProperties(fname=f)
    fname = font.get_name()
    tmp.append((f, fname))
df = pd.DataFrame(tmp, columns=['path', 'name'])
```

すると```df```に、フォントのファイル名とフォント名が格納されるので、フォントのファイル名からフォント名を探す。

例えば、Rictyフォントはどうなってるの？という場合は、次のようにする。

```python
print(df[df['path'].apply(lambda s: 'Ricty' in s)])
```

これで、使いたいRictyフォントがそのまんま```Ricty```だと分かった。

## font.familyの内容の変更

site-packages/matplotlib/mpl-data/matplotlibrcファイルの中身を見ると、199行目には次のように書いてある。

```matplotlibrc
#font.family         : sans-serif
```

つまり、デフォルトのfont.familyはsans-serifである、と。

そして、211行目は次のようになっている。

```matplotlibrc
#font.sans-serif     : DejaVu Sans, Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
```

ということは、自分の```matplotlibrc```は、この```fonts.sans-serif```をoverrideするようにすればいい。

```matplotlibrc
font.sans-serif: Ricty, sans-serif
```

## pyplot()で日本語を設定する

ここまできたら、後はpyplot()に日本語ラベルを設定するだけだ。

```python
import matplotlib.pyplot as plt
import numpy as np

plt.gca().set_aspect('equal', adjustable='box')
plt.scatter(np.random.rand(100)*10, np.random.rand(100)*10, label='青')
plt.scatter(np.random.rand(100)*10, np.random.rand(100)*10, label='橙')
plt.plot(np.random.rand(10)*10, label='青線')
plt.plot(np.random.rand(10)*10, label='橙線')
plt.title('日本語タイトル')
plt.xlim([0, 10]), plt.ylim([0, 10])
plt.xlabel('X軸'),plt.ylabel('Y軸')
plt.legend(loc=0)
plt.show()
```
![matplotlib.png](https://qiita-image-store.s3.amazonaws.com/0/15553/c879e285-a1c1-8239-90b7-3df3b8e8238e.png "matplotlib.png")

おめでとう、オレ。

## 終わりに

ここまでたどり着くまでに、いろんな人のblogやらqiitaへのポストやらを参考にさせていただきました。
コピペしすぎて、出典が分からなくなってしまいました。全てのMatplotlibネタを書かれた人に謝罪と感謝を。
すみませんでした、そして、ありがとうございました。
シェルスクリプトの'{0..10}'って何？

`ブレース展開`と言う
`{}`の中に書いた数字や文字を展開してくれる機能

# 数字

```bash
$ echo {1..10}
1 2 3 4 5 6 7 8 10
```

`for`ループでよく使う

```bash
$ for i in {1..5}; do echo $i; done
1
2
3
4
5
```

# 文字

前述した通り文字も展開できる

```bash
$ echo {hoge,fuga,piyo}
hoge fuga piyo
```

`{}`の前後に文字を繋げると以下の様に展開される

```bash
$ echo aaa{hoge,fuga,piyo}bbb
aaahogebbb aaafugabbb aaapiyobbb
```

これは`mkdir`の様なコマンドと相性が良い

```bash
$ mkdir -p tmp/{hoge,fuga,piyo}
$ tree
.
└── tmp
    ├── fuga
    ├── hoge
    └── piyo
```