OmniAICreator/Qiita-1.07M huggingface dataset:
[1日目] 初心者が作るアプリ開発 ~ionicのセットアップ~

# [1日目] 初心者が作るアプリ開発 ~ionicのセットアップ~

## はじめに

これまでアプリを作ったことない自分でも、一度アプリを作ってみたくて作ってみました。
ただし、Swift、Object-C、Javaも触ったことがないので、そこら辺を学習するにはめちゃくちゃ時間かかりそうだということで、Web屋でもできる範囲でアプリを作ってみたいと思います。
（これまでWeb系しか触ったことがないもので:thermometer_face:）

そこで、今回は自分でも触れるツールはないかということで、下記をつかってみたいと思います。

- ionic
- AngularJS

## ionicとは

- [ionic](https://ionicframework.com/)

ionicとは、Web屋でも簡単にアプリが作れるアプリ開発フレームワークです。
Web（HTML/CSS/Javascript）でも、ハイブリッドアプリ（iOS/Android）が簡単に作れます。
ionicは、CordovaとAngularJSがベースに作られています。

## 1日目（環境構築）

まずは、下記のものを全て最新版をいれます

- Node.js(v8.1.0)
- npm(v5.0.3)
- ionic(v3.3.0)

### Node.jsのインストール

nodebrewをいれてnode.jsとnpmの最新版をいれます

- [nodebrew公式](https://github.com/hokaccha/nodebrew)

```
$ curl -L git.io/nodebrew | perl - setup
...
========================================
Add path:

export PATH=$HOME/.nodebrew/current/bin:$PATH
========================================
```

```
$ nodebrew install-binary v8.1.0
$ nodebrew use v8.1.0
```

これでnode.jsとnpmの最新版が入りました

### ionicのインストール

まずは、npmでcordovaとionicのCLIをインストールします
プラス、今回はiOSのシミュレーターも入れます

```
$ sudo npm install -g cordova ionic
$ sudo npm install -g ios-sim
```

### ionicのプロジェクトを作成

次に、これらを入れたら今度はプロジェクトを作成していきます。

```
$ ionic start appName tabs
```

いまはtabsを選択しておりますが、他にもblankとsidmenuがあるみたいです

```
$ cd appName
$ ionic cordova platform add ios 
```

では、実行していきましょう

```
$ ionic serve
```

![スクリーンショット 2017-06-10 14.57.09.png](https://qiita-image-store.s3.amazonaws.com/0/52154/74d4ed4e-4ca3-e3c9-de97-f6088303ee0c.png)

serveを行うと、ブラウザ上で開いて確認ができます！
超便利ですね！

とりあえず、1日目はここまでです
次はソースを変更して行きたいとおもいます
(初心者向け)Swift3.0で初アプリ - iPhoneからNode-REDヘアクセス

Swift3.0を使って簡単なiPhoneアプリを作ってみます
[(初心者向け)Swift3.0で初アプリ - 外部ライブラリを使ってみる - CocoaPods, Carthage](https://qiita.com/egplnt/items/80760f5c6a009e109876)でAlamoFireを使えるようにしました
[(初心者向け)Swift3.0で初アプリ - iPhoneからMacbookへアクセス](https://qiita.com/egplnt/items/603673d6018b197c75ac)でiPhoneからMacbookへアクセスできるようにしました
次は、iPhoneから自分のMacbookで稼働しているNode-REDへアクセスできるようにします

#1. Node-REDを動かしておきます
- 自分のMacbookでNode-REDを起動しておきます。Node-REDを未インストールのかたはこちらをご参照ください → [Node-REDをインストールする](https://qiita.com/egplnt/items/cf79f49660f2df1c54cc)
- MacbookのFirefoxで`http://localhost:1880`を開きます

<img width="980" alt="スクリーンショット 2017-10-05 11.30.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/1f4039ac-cd83-29d7-c3ba-8ad77bc37ad3.png">



#2. フローを用意します
- 下記のフローをコピペします。Node-REDでのフローのコピペの手順はこちら → [Node-RED - フローをコピーする方法](https://qiita.com/egplnt/items/00bbda990c5babaeaa86)

```
[{"id":"9b870ffa.731eb8","type":"http in","z":"a10ea29a.e50e7","name":"","url":"/test10","method":"get","upload":false,"swaggerDoc":"","x":130,"y":60,"wires":[["cdbab1fe.9ce738","4ac383a.04b44fc"]]},{"id":"68c15cd3.abb544","type":"http response","z":"a10ea29a.e50e7","name":"","statusCode":"","headers":{},"x":570,"y":60,"wires":[]},{"id":"cdbab1fe.9ce738","type":"template","z":"a10ea29a.e50e7","name":"htmlを返す","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"<html>\n    <body>\n        <h1>\n        祝！開通！！\n        </h1>\n    </body>\n</html>","output":"str","x":370,"y":60,"wires":[["68c15cd3.abb544"]]},{"id":"4ac383a.04b44fc","type":"debug","z":"a10ea29a.e50e7","name":"","active":true,"console":"false","complete":"false","x":310,"y":120,"wires":[]}]
```
<img width="864" alt="スクリーンショット 2017-10-05 12.22.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/2d2f415c-6acc-6482-6a11-9a9071244a1d.png">



#3. ローカルからアクセスして確認します
- Macbookのブラウザから下記をアクセスし、画面が表示されることを確認します

```
http://localhost:1880/test10
```
<img width="363" alt="スクリーンショット 2017-10-05 12.30.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/66aa6ee4-bcdc-f421-bd49-ac9b43021cae.png">

- localhostの指定は、`127.0.0.1`でも構いません


#3. iPhoneからアクセスしてみます
- iPhoneのブラウザからアクセスしてみます

```
http://（ネットワーク名).local:1880/test10
```
もしくは

```
http://192.168.2.1:1880/test10
```
<img width="375" alt="IMG_0556.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/125842/d7e4300d-a2e6-ed0a-593d-ab361bc0d386.jpeg">



- 「祝！開通！！」が表示されれば開通です
PowerShellで、特定サイトのファイルを一括ダウンロードする

## 用途
あるページに、PDF等が大量に置いてあるが、一つ一つダウンロードする手間が惜しい。
シェルとかで、一気にダウンロードできたらなー、という時に使います。

ただ、PDFである必要はなく、書き直せば他のファイル形式でも可能です。

## バージョン
`PowerShell 3.0`以降で利用してください。

## 必要な処理
**指定ページの内容を解釈する処理**と、**ファイルをダウンロードする処理**が必要です。

## 処理
`Invoke-WebRequest`を使います。

なお、下記の例で出てくる`$url`変数には、対象とするサイトのURLが入ります。
また、例外処理は省いています。

### 指定ページの内容を解釈する
PowerShellを使う場合、`Links`プロパティによってリンクの一覧を取得できるため、解釈作業はこれだけで済みます。

```ps1:SiteCrawl.ps1
#Webページから、PDFへのリンクを取得
$response = Invoke-WebRequest -Uri $uri -UseBasicParsing

$links = $response.Links | Where-Object {$_.href -like "*.pdf"} | Select-Object -ExpandProperty href
```
リンク一覧→.pdfのみ→hrefのみ、とリストを作成します。

### ファイルをダウンロード
```ps1:SiteCrawl.ps1
#個々のファイルダウンロード
foreach($link in $links){
    #ファイル名抽出
    $fileName = Split-Path $link -Leaf
    
    #保存先パス作成（フォルダ + ファイル名）
    $outFilePath = Join-Path $savePath $fileName

    #DL対象ファイルのURL取得（Uriの機能で、絶対パスと相対パスをくっつける）
    $downloadUrl = New-Object System.Uri ($uri, $link)
    
    Invoke-WebRequest -Uri $downloadUrl.AbsoluteUri -OutFile $outFilePath
}
```

絶対パスと相対パスの結合は、手作業では辛いので、.NETの`Uri`クラスを使います。

また、ファイルをダウンロードする場合は、`Invoke-WebRequest`に`-OutFile`を付けます。

## SSL/TLSのエラーが出る場合
処理を開始する前に、以下の文を実行してみましょう。

```ps1:SiteCrawl.ps1
# SSL/TLSのエラーが発生する場合
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
```

参照：[リンク](https://social.technet.microsoft.com/Forums/ie/ja-JP/77a771fe-69c4-4d61-b87f-b2915cc31102/invokerestmethodinvokewebrequest?forum=powershellja)

## 全文（GitHubリンク）
https://github.com/piroron/FileDLByPowershell
プログラミングをする上で覚えておくべき原理原則

# はじめに
コードを書き始めると参考書や自己流の規則に染まってしまいますが、早い段階から原理原則を学ぶことによって、今後チーム開発をする際の共通認識となり便利かと思います。本記事では７つの原則をメモしていますが、個人的にエッセンスを抽出・解釈すると以下の３つが大切だと感じました。

> Minimality（最小性）
> Reusability（再利用可能性）
> Readability（可読性）

それでは詳しく各原則をみていきましょう。

# 説明
**KISS : Keep it simple, stupid**
// シンプルにしておけ！この間抜け

- コードを書くときに簡潔・単純にすることを意識する
- それが本当に必要なコードなのかを吟味する
- 今、必要とされているコードだけを書く
- 勝手に要件を付け加えない

**DRY : Don't Repeat Yourself**
// 繰り返しを避けろ

- それぞれのコードに唯一無二で明確な意味を持たせる
- オブジェクト指向プログラミングを活用する
- コードの再利用によって生産性を高める

**YAGNI : You Ain’t Gonna Need It**
// それはきっといらないよ

- ソフトウェアの変化予測は不可能である
- 不必要なコードを書くことは複雑性を生む
- 今、必要とされているコードだけを書く

**PIE : Program Intently and Expressively**
// 意図が明確に読み取れるコードを書け

- ソフトウェアの動作を完全・正確に知ることのできるものはコード以外存在しない
- 書いていた時間よりも読まれる時間の方が長い
- 読むときに効率を上げるためにWhy, What, Howをコメントする

**SLAP : Single Level of Abstraction Principle**
// 抽象度を統一せよ

- 抽象度によってコードを分離するべきである
- 外部公開されたユーザー側のコードは高水準である
- 処理や計算、API利用に関わる非公開のコードは低水準である
- 序文（コメントによる要約）、目次（関数の一覧）、セクション、章、段落

**SRP : Single Responsibility Principle**
// 単一責任の原則

- クラスを変更する理由は複数存在してはいけない
- 変更の理由が変更の理由たるのは、実際に変更の理由が生じた場合だけである
- 結合している役割を見つけそれらを分離する作業は、ソフトウェア設計の本質である

**OCP : Open-Close Principle**
// オープンクローズドの法則

- モジュールは拡張に対して開いていなければならない
- モジュールは修正に対して閉じていなければならない

参考： [【脱初級プログラマ】プリンシプル オブ プログラミング まとめ - Qiita](https://qiita.com/ShuntaShirai/items/a209562fce3dead27416)
【超厳選】Chromeに大量のタブを生成してしまう人向けの設定ランキングTop5

# 【超厳選】Chromeに大量のタブを生成してしまう人向けの設定ランキングTop5

エンジニアたるもの、googleさんでバシバシ検索することは当たり前かと思いますが、知らないうちにタブが大量に発生してしまい、ファビコンすらも出てこなくなる経験はあるでしょう。

そこで、今回はそんな `Chromeに大量のタブを生成してしまう人向け` に、おすすめのchromeの設定をランキングで発表したいと思います。

<img width="1660" alt="Screen Shot 2017-10-10 at 1.05.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/e148040b-444a-c27e-2d01-d20bf15619fb.png">


## 第1位 cmd+Qの前にアラートを出す
<img width="1700" alt="Screen Shot 2017-10-10 at 1.08.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/be0df1e1-43d2-76b3-eef6-52fb438d906b.png">

タブを大量に開いていて、よく起こるのが cmd+Wでタブを消すつもりが間違ってcmd+Qを押してしまいChromeがkillされてしまうケースです。
さらに、大量のタブを閉じるためPCがフリーズしてしまい、作業すら止まる場合があります。

この設定をしていると、間違えてcmd+Qを押してももう一度押さないと消えないため、間違って消すことがなくなります！！


<img width="331" alt="Screen Shot 2017-10-10 at 1.12.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/7c40d079-3bad-f1dc-911c-412019c205e2.png">

ここにチェックを入れてあげると、警告が出るようになるのでぜひ設定しておきましょう！！


## 第2位 使用していないタブを停止してくれる「The Great Suspender」
<img width="978" alt="Screen Shot 2017-10-10 at 1.17.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/fdd506bc-3bb1-592f-0a52-ad4c03e05dd7.png">

これは拡張機能ですがこれを使うことで使用していないタブを停止（スリープ）状態にすることができます。
タブが停止するまでの時間はオプションで設定可能で、最短で20秒から選ぶことができます。

また、他にも固定タブは停止しないとかタブにフォーカスしたら停止解除するといったオプションも用意されており、「Whitelist」という項目を使えば特定のページを開いている時は停止しないといった設定も可能です。

- [設定方法の詳細](http://bamka.info/greatsuspender)

## 第3位 開いていたタブを全て一つのタブにまとめる「One Tab」
<img width="988" alt="Screen Shot 2017-10-10 at 1.22.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/8db979cb-94bc-b5e5-177e-475f0b9c988b.png">

クリックするだけで、開いていたタブを全て一つのタブにまとめられるのが「One Tab」の魅力。
これにより最大で95％のメモリ消費を減らすことができるそうです。

一つにまとまったタブはサブタイトルとともに一覧になっているので、まとめたからとはいえ、参照するのも簡単に行えます。

## 第4位 どこでも翻訳 Translate Anywhere
<img width="981" alt="Screen Shot 2017-10-10 at 1.30.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/79a85ccb-febb-70d0-7e69-4c9831637926.png">

英語ページ全体ではなく、一部分だけを日本語に翻訳できるツールです。
別のタブを開いて翻訳にに行って、また違うページでの翻訳を新しいタブで...っとなる前に、
翻訳したいテキストを選択し、右クリックで［文章を翻訳する］をクリックすれば、そのすぐ下に日本語訳が表示されます。

### 第5位　キャッシュを一瞬で削除できる Clear Cache
<img width="643" alt="Screen Shot 2017-10-10 at 1.32.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/70ec9cc3-2d50-f3bc-2794-123d96c839fb.png">

1クリックで簡単にキャッシュを削除してくれます。「CSSが反映されない」ときに便利。拡張機能をいれなくても検証モードを開いて削除ができるのですが、1クリックで実行できるのは便利です


### 番外編　人気者になれるChrome拡張

あるとき適当に拡張期を探しているとこのような拡張を見つけました
その名も、「webcockroach」

リンクはこれです。
https://chrome.google.com/webstore/detail/webcockroach/amifealhlhbmakepjknjchoilpcbndng

どうやら、リロードするたびに画面の左上からGが画面を這い回りますが、一瞬で通り過ぎますｗ
ドラッグするとつかめるようですｗ

会社で導入したのですが、「えっ？さっきの何？」とMTG中でも会話が盛り上がり本題に進まなくなるデメリットがありますが、一躍有名人です。

## その他便利なChrome拡張まとめ記事
- おすすめ具合などを参考にさせていただきました。ありがとうございます！
- [【2017年版】これは便利！おすすめのChrome拡張機能30選](https://saruwakakun.com/it/web/chrome-extensions)
- [Chromeユーザー向け：タブを沢山開くタイプの人に便利な拡張機能 8](https://www.nxworld.net/services-resource/8-google-chrome-tab-manager-extensions.html)

## まとめ
- タブは開きすぎないようにしましょう！！！！
Typescript　環境構築メモ

環境構築のやり方が毎回分からなくなるので、忘れても良いように記載。
おかしな所は随時訂正します。

# 前提条件
1. Node.jsはインストール済み

# 手順
1. gulpとgulp-typescriptのインストール
`npm install gulp gulp-typescript --save-dev`

2. TypeScript コンパイラをインストール
`npm install typescript --save-dev`

3. gulpfile.jsにtaskを定義

```js:gulpfile.js
var gulp = require('gulp');
var typescript = require('gulp-typescript');
gulp.task('ts', () => {
    return gulp.src('./src/typescrippts/*.ts') //tsファイルを置いてるところを設定
        .pipe(typescript({
            target: 'ES5', //ECMAScript構文を指定。（デフォルトはES3）
            removeComments: true
        }))
        .js.pipe(gulp.dest('./src/js')); //jsファイルの出力先を記述
});

gulp.task('watch-ts', function() {
	gulp.watch (['./src/typescripts/*.ts'], ['ts']); //tsファイルの変更を監視し、変更された時はtsタスクが走る
});
```

minifyしたjsを出力するためには、別途作業が必要。
【Python】Webスクレイピング urllib.request / urlopen() でダウンロード

#はじめに
[Pythonによるスクレイピング&機械学習 開発テクニック BeautifulSoup,scikit-learn,TensorFlowを使ってみよう](http://amzn.to/2wHBJ7d)を一通り勉強させていただき、自分なりに工夫したアウトプットと学習ログを残しておこうと考えたため、本稿を記述しています。

###Web上の情報を取得する方法
Pythonでは、Webサイトにあるデータを取得するために**urllibライブラリ**を使います。このライブラリを使うと、HTTPやFTPを利用してデータをダウンロードすることができます。

**urllib**は「URLを扱うモジュールを集めたパッケージ」で、その中でも**urlib.requestモジュール**は「Webサイトにあるデータにアクセスする機能を提供」します。認証やリダイレクト、Cookieなど、インターネットで使われるさまざまなリクエストや処理に対応しています。

#urllib.requestを使ったダウンロード
Webサイトから直接ファイルをダウンロードするには、urllib.requestモジュールにある**urlretrieve()関数**を利用します。

以下は、Web上にアップロードされているPNGファイルを「test.png」という任意の名前でファイルに保存するという例です。


```.py
#ライブラリの読み込み --- (＊1）
import urllib.request

#URLと保存パスを指定 --- （＊２）
url = "https://goo.gl/1kw79Y"
savename = "test.png"

#ダウンロード --- （＊3）
urllib.request.urlretrieve(url, savename)
print("保存しました")
```

Pythoでライブラリを利用するためには、import文を利用してライブラリを取り込む必要があります。

プログラムでは（＊１）の部分でurllib.requestモジュールを取り込んでいます。「urllib.request」のように「.」で区切ってモジュールを指定していますが、これは「urllibパッケージの配下にあるrequestモジュールである」という意味になります。

プログラムの（＊２）の部分で、ファイルをダウンロードしています。urlretrieve（）の第１引数にURLを、第２引数に保存先のファイルパスを指定しています。




#urlopen()を使ってファイルに保存する方法
上記はrequest.urlretrive()関数を使ってファイルに保存しましたが、下記は**request.urlopen()**を使う方法です。

request.urlopen（）を使うと、直接ファイルに保存するのではなくデータがPythonのメモリ上に取得されます。



```.py
import urllib.request

#URLと保存パスを指定
url = "https://goo.gl/1kw79Y"
savename = "test.png"

#ダウンロード --- （＊１）
nem = urllib.request.urlopen(url).read()

#ファイルへ保存 --- （＊２）
with open(savename, mode="wb") as f:
   f.write(png)
   print("保存しました") 
```


（＊１）の部分では、urlopen()関数でPNGファイルのURLリソースを開きます。そのあとread()メソッドでデータを読み取ります。

（＊２）では、ファイルを開くopen()関数を使ってファイルを開きます。このとき、ファイルの読み書きモードを表すmodeを「wb」にしてファイルを開きます。「w」は書き込みモード、「b」はバイナリーモードを意味します。

最後に、write()メソッドでダウンロードしたバイナリーデータをファイルに保存しています。
Laravelで新しく名前空間を登録する方法

オートロードの仕組みはなんとなく知っていたのですが、実際に名前空間を新規で追加する際に少し迷ったので手順をメモしておきます。

##1.ファイルを作成して名前空間を定義

例えば、Laravelのプロジェクトフォルダ直下に`packages`というフォルダを作成し、その下に色々ファイルを作成して、以下のように名前空間を定義します。

```php
///packages/Shop/Domain/Cart/Cart.php
namespace Shop\Domain\Cart;
```

##2.`composer.json`に新しく作成したフォルダ名を登録

```json
"autoload": {
    "classmap": [
        "database",
        "packages" //新しく追加したフォルダ
    ],
    "psr-4": {
        "App\\": "app/"
    }
}
```
これで追加したフォルダ内にあるファイルをオートロードしてくれるようです。

##3.`dump-autoload`実行

```
composer dump-autoload
```

##4.`autoload_classmap.php`で確認
以下のような感じで登録されていればOK

```php
'Shop\\Domain\\Cart\\Cart' => $baseDir . '/packages/Shop/Domain/Cart/Cart.php',
```

参考：Laravelで名前空間を指定してオートロードされなかったら見る場所。
https://qiita.com/niiyz/items/5b83ef5255a1ec64d9d6
ROBOCOPYコマンドでファイルデータ移行

WindowsのコマンドROBOCOPY。

開発屋のときは使ったことがなく、聞いたこともなかったけれど、
インフラ屋ではお馴染みのコマンドらしく、データのバックアップや移行でよく使う。

```bat:基本構文
ROBOCOPY コピー元 コピー先 [ファイル [ファイル]...] [オプション]
```

ROBOCOPYコマンドには多数のオプションが用意されている。
オプションは、

- コピーオプション
- ファイル選択オプション
- 再試行オプション
- ログオプション
- ジョブオプション

に分類されており、きめ細かな指定ができる。

参考までに、ファイルサーバー移行で、
ファイルサーバーから外付けHDDへデータコピーした際に
使用したオプションは以下のとおり。

```bat:使用例
ROBOCOPY コピー元 コピー先 /MIR /COPYALL /R:0 /W:0 /NP /V /LOG+:ログファイル
```

| オプション | 説明 |
|:----------|:-----|
| /MIR      | ディレクトリツリーをミラー化する。 |
| /COPYALL  | ファイル情報を全てコピーする。 |
| /R        | 失敗したコピーに対する再試行回数。 |
| /W        | 再試行時の待機時間。 |
| /NP       | 進行状況を表示しない。 |
| /V        | スキップされたファイルの詳細出力を作成する。 |
| /LOG+     | ログファイルに状態を出力する。(追記) |

ミラー化により、コピー元で削除したファイルはコピー先でも削除される。
コピー元とコピー先を間違えて逆に書くと大惨事となるので要注意。

【参考】
[Robocopy - TechNet - Microsoft](https://technet.microsoft.com/ja-jp/library/cc733145(v=ws.10).aspx)
新卒就活をやってみて感じたこと

# 企業のスタンスについて雑に書きます

## 簡単な自己紹介
4年制大学の情報系学部４年  
プログラミングは好き  
受けた業界・業種はWEB系からメーカー系、大手SIerまでいろいろ

## 前提
後輩に就活の話を聞かれて答えたら受けが良かったので、公開してみようと思いました。
情報系大学を出てこの業界に飛び込もうと思う人向けです。業界説明とか職種の話はしません。
私の就職活動での体験や周囲の友人からの声を踏まえています。個人視点なのでちょっと変な解釈が入っているかも.... 
話がぴんと来ないタイプの方は読まなくてよいと思います。

## 企業のスタンス
一部比較する次元が違うと感じる方もいらっしゃるかもしれませんが....
私が出会った企業を分類すると大まかに分けて３種類くらい（もっと多いかも）

### 推薦重視の企業
理系には多い教授推薦等を重視する企業です。
私は院生ではないので詳しくはわかりませんが、リクルーター等が早期から研究室やOB経由で接触してくるようです。
研究職系や大手メーカー系にはこういった企業が多いのかもしれません。

私はあるメーカーの子会社の2次面接ぐらいでこんな感じのことを聞かれました。  
「現在は○○さんは一般応募ですが今後弊社が推薦書の提出をお願いしたら提出していただけますでしょうか。」

当時の私はもっと多くの企業を見て回りたいとも考えていたので、その旨を伝えていまのところ推薦書の提出予定はないと答えました。

後日お祈りメールが来ました。それなりに大きな会社で応募者も多そうな企業だったので確実に入社してくれそうな人だけに絞っても人数的には充足しているのかなと私は感じました。

同様の経験をした友人も数人いました。そのまま推薦書を提出した人はそのまま内定をもらっていました。  
なぜ推薦を重視するのかは簡単です。**内定辞退を避けるためです。**
別にこういった企業が一般応募の人を軽視しているわけではないと思います。**半端ないポテンシャルを秘めていた人は当たり前のように通っていました。あくまで傾向としてです。**

### 専門的な経験や知識を特に重視していない企業
情報科学専攻の学生に限らず、あまり専門的な経験を求めていない企業です。
どちらかというと教育は入社してからでもよいというスタンスみたいです。  
社内の研修や資格取得を支援する制度なんかも充実してそうなイメージを受けました
面接ではアルバイトやサークルのことなんかもよく聞かれました。

個人的な印象ですが、情報科学専攻だというだけで人事の受けが良いみたいです。  
私はあるまじきことに面接を遅刻してしまったのにも関わらず、なぜか選考を進むことができました。  
研修のコストが低いという意味で、情報科学専攻はおいしい人材と捉えられてたのかもしれません。  
少し不信感を抱いてしまったのでこの企業の選考は辞退しました。

こういった企業には私の周りの友人も多くが内定をもらっていました。  
**彼らは口をそろえてこう言っています。
「理系の情報科学専攻でエンジニア志望なら就活はわりと楽だ」**

### 積極的なアウトプットや技術的な素養を求めている企業
こいうった企業はイベントやコンテスト、ハッカソン、勉強会などでも接触できます。
Web系やベンチャー系、またセキュリティ系の企業に多いタイプです。最先端技術を扱っているところもこういった雰囲気があるかもしれません。  
面接はスーツじゃなくてもよい場合もあります。
Skype面接もあるので地方の学生でも大丈夫です。  

面接でも大学の講義や実験以外でのアウトプットについてアピールしないと印象はよくないみたいです。  
こういうことがやりたいというのは簡単ですが、実際に何かやっている人間のほうがポテンシャルを秘めていると評価されます。  
個人的な印象ですが、面接でうまく答えられなくてもアウトプットが評価されれば選考が進む場合もあります。  
社内外での勉強会等も盛んな印象を受けましたが、研修や教育が充実しているとかそういう意味ではないので受け身の人間にはあまり向いていないと思います。  
**社風も独特の会社も多い** のでしっかりリサーチしてから選ばないと肌に合わなかったりミスマッチが起こった時のダメージがでかい気がします。

## ちょっと残念だったこと
- 自分が作ったりしたプログラムについての質問で「そのプログラムの行数ってどのくらい？」と聞かれたこと
 → おじさんだったので仕方ない気もするが、プログラムを行数で判断しても良いことは何もない気がする

- 面接を遅刻したのに、選考が進んだこと
 → 自分を評価してくれたのかもしれないけれど、面接を遅刻する人間を次の選考に進めてもお互いい気分はしない。

- やたらと他社の選考状況を聞いてきたこと
 → ちらっと聞いてくるのは別にいいけど、「現在何次選考ですか」とか「どういう会社ですか」とか根掘り葉掘り聞いてこられると困る
npm-cdで一瞬でライブラリ間を移動する

コードリーディングをしたいとき、いちいちそのレポジトリを探しに行くのは手間です。例えば、reduxのコードをローカルで少し見たいと思ったときどうするでしょう。githubを検索してreduxを表示してgit clone？面倒です。

そこでnpm-cdを作ってみました。

![npm-cd.gif](https://qiita-image-store.s3.amazonaws.com/0/15319/d2f213e0-a384-0727-fd6b-efa6df166f2c.gif)

GHQが事前にインストールされていることが条件です。

npm-cdはnpmのライブラリがGHQ以下にあれば移動し、なければcloneしてから移動します。

## インストール
npmからインストールできます。

```
$ npm i -g npm-cd
```

[akameco/npm-cd](https://github.com/akameco/npm-cd)

## まとめ
一度、GHQ環境下にインストールすればpecoで移動するのですが、そもそも持ってくる前の段階の探しに行く手間があるのを改善できたので満足です。

何かあればコマンド欄やtwitterまでお願いします。

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">npm-cd npmのパッケージ名でcdする。対象がインストールされてなければcloneしてから移動。要GHQ <a href="https://t.co/Jg00e23HTF">https://t.co/Jg00e23HTF</a> <a href="https://t.co/9nI6hYY9Bm">pic.twitter.com/9nI6hYY9Bm</a></p>&mdash; あかめ@無職.js (@akameco) <a href="https://twitter.com/akameco/status/917441505593221120?ref_src=twsrc%5Etfw">October 9, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">pecoするにしても対象を一回インストールする必要あってそれが面倒すぎて、facebook/reactだっけ？reactjs/reactだっけ？reactjsの方はreduxだっけ？みたいになるのがあれなので最初の一回のためのツールという自分の中の位置づけ</p>&mdash; あかめ@無職.js (@akameco) <a href="https://twitter.com/akameco/status/917452014635819008?ref_src=twsrc%5Etfw">October 9, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
LaravelでもOptional Chainを使いたい、使おう。

# TL;DR
* Laravel5.5からoptional機能が追加されたが、そのまま使うとchainができない
* laravelのmacroを加えてやることでoptional chainチックな動きができる。
* Viewでのぬるぽからついに解放される！

# Laravelのオプショナル機能

[Laravel5.5からオプショナルの様なものが利用できるようになりました！](https://laravel.com/docs/5.5/helpers#method-optional)

これでViewでのヌルポから解放される！と思ったんですが、どうやらOptionalChainできるわけじゃないみたいです。

ただ、[こちらの記事（Laravel 5.5 で導入された Optional クラスについて）](https://qiita.com/nunulk/items/c551b8fe18305ecdd908)にも有りますように、
大元のOptionalClassはmacroが追加できる様になってます。

macroを使ってoptionalChainっぽい動きができないかな、と思っていじってみたら
案外すぐできたので、僕がやったやり方を下でシェアさせていただきます。

# macro追加部分のコード

AppServiceProviderをちょちょっといじってみます。

```php

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Optional;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        Optional::macro('chain', function (string $property) {
            return (is_object($this->value)) ? optional($this->value->$property) : optional(null);
        });
    }
}
```

# 実際に使ってみた

```php


class Address{
    public $zip;

    public function __construct($zip = null){
       $this->zip = $zip;
    }
}

class Customer{
    public $address;

    public function __construct(Address $address){
        $this->address = $address;
    }
}

// Zip実際にあるバージョン
$customerWithZip = new Customer(new Address('xxx-xxxx'));
$zip = optional($customerWithZip)->chain('address')->zip ?? '登録してね☆';
// -> 'xxx-xxxx'

// Zipないバージョン
$customerWithoutZip = new Customer(new Address());
$zip = optional($customerWithoutZip)->chain('address')->zip ?? '登録してね☆';
// -> '登録してね☆'

```

おもったよりも使いやすい！

# まとめ
* chainMacroが思ったよりも便利で会社でアップデート時に実戦投入できそう。
* ~~PHPの言語仕様としてのオプショナルの採用は多分ないだろう。~~
MCP 70-532 を取得しました

MCP 70-532 Developing Microsoft Azure Solutions に合格したので、勉強方法等を書き溜めます。

MCP 70-533 の体験記は以下リンク
[MCP 70-533 受験体験記](http://qiita.com/skwhr/items/2038b63a537b925bab8f)

MCP 70-534 の体験記は以下リンク
[MCP 70-534 を受験しました](https://qiita.com/skwhr/items/927f41125529dcff520b)

# 試験の傾向は？

問題：31問
試験時間：150分

試験の流れは以下の4部作でした。それぞれ次のセクションに進むと見直しはできなくなるので要注意です。

* ケーススタディ：7問
    * 架空の企業システムの概要や問題点が提示され、解決策やより良い手法を回答する形式です。
    * 半分くらいはコードの穴埋め問題でした。
    * 企業の背景やシステム要件に加え、C#のコードがいくつか提示されます。

* 2択問題：3問
    * ある問題に対する答えが正しいか正しくないかの2択です。
    * ここは全て似たような問題で、1問進むと前に戻ることができません。

* 1問1答：15問
    * よくある4択、5択くらいの出題です。
    * 3割くらいはコードの穴埋め問題でした。他は70-533や534で問われるような最適なソリューション（開発者寄り）を答えるような問題です。

* ケーススタディ：6問
    * 1番始めに出題されたケーススタディと似たような傾向でした。

Azureソリューションの開発という試験名の通り、3割～4割はコード(C#/AzureSDK)の穴埋め問題です。が、それ以外のソリューションアーキテクトな問題も半分以上出題されたのは意外でした。


# 公式サイトの試験範囲を把握する

毎度のことですが、まずは範囲を把握しましょう。

[公式サイト]
[Developing Microsoft Azure Solutions](https://www.microsoft.com/ja-jp/learning/exam-70-532.aspx)

* Azure Resource Manager 仮想マシンの作成と管理 (30 ～ 35%)
* ストレージとデータ戦略の設計と実装 (25 ～ 30%)
* ID、アプリケーション、およびネットワーク サービスの管理 (15 ～ 20%)
* Azure PaaS コンピューティングと Web/モバイル サービスの設計と実装 (25 ～ 30%)

試験範囲は広いですが、（たまたまかもしれませんが）533/534に比べると出題されなかった項目が多かったなという印象です。
VM/Storage/AD/Network/可用性 あたりはどの試験でも必ず出てきますね。


# ドキュメントを読み漁り、実際に動かしてみる

これも他の試験対策と同じですね。
とにかく出題範囲のものは触ってみるに尽きます。
インフラエンジニアな私は、これにプラスしてC#の学習をしました。（といっても、入門本を読んだくらいですが）


# まとめ

インフラエンジニアにとっては中々難しい試験だと思いました。
コード問題は正直これかなーと雰囲気で選択して、たまたま当たった問題も多くあったかと思います。
533/534を経ていたことで、Azureにおける可用性や主要サービスは既に理解していたので、そのあたりの取りこぼしがなかったことが大きかったと思います。

難易度は70-533/534よりも高いです。
時間は20分くらい余ったものの、533/534よりも余裕はなかったです。
ペース配分をきちんとしないと危険ですね。

70-532/533/534の3つを取得できたので、目標としていた MCSE:Cloud Platform and Infrastructure に認定されました。

MCSEへの道のりは、533→534→532 の順でした。
難易度は低→高でしたし、534/532の受験時には過去の経験が活きたので、選択順は間違ってなかったなと思いました。

参考になれば嬉しいです。
Unity道場 札幌スペシャル2 講演資料/関連・参考サイトまとめ

[Unity道場 札幌スペシャル2](http://peatix.com/event/286645)の講演資料等を見えている範囲で纏めてます。
※ひょっとしたら公式かどこかで纏められるかもしれませんが、個人用に関連/参考サイト等を含めてメモ。
※記載されていないものは公開され次第に追記予定

### ■文字でカッコいい画面を作ろう！そう、TextMesh Proならね

- 講演資料
    - [【Unity道場スペシャル 2017札幌】カッコいい文字を使おう、そうtext meshならね](https://www.slideshare.net/UnityTechnologiesJapan/unity-2017text-mesh-81010276)
- 関連/参考リンク
    - [TextMesh Pro](https://www.assetstore.unity3d.com/jp/#!/content/84126)
    - [UnityのText Mesh Proアセットで日本語を使うときの手順](https://qiita.com/thorikawa/items/03b65b75fa9461b53efd)
    - [TextMeshProReplacer](https://github.com/jackisgames/TextMeshProReplacer)        
        - uGUIのTextをTextMeshProに置き換えてくれる
    - [【Unity】TextMeshProのMaterial Presetを増やす方法](http://tsubakit1.hateblo.jp/entry/2017/09/19/233349)
    - [【Unity道場 2017】ゲーム開発者のためのタイポグラフィ講座](https://www.slideshare.net/UnityTechnologiesJapan/ss-77467062)
    - [【Unity道場スペシャル 2017博多】TextMesh Pro を使いこなす](https://www.slideshare.net/UnityTechnologiesJapan/text-meshprounity)



### ■超初心者向け！Unityのオーディオ機能を使ってみよう

- 講演資料
    - [【Unity道場スペシャル 2017札幌】超初心者向け！Unityのオーディオ機能を使ってみよう](https://www.slideshare.net/UnityTechnologiesJapan/unity-2017unity-80687485)



### ■アーティストのためのTimeline/Cinemachine活用術

- 講演資料
    - [【CEDEC2017】アーティストのためのTimeline活用術](https://www.youtube.com/watch?v=1D1grhD7b50)
        -  ※CEDEC2017での講演動画(内容自体は大体同じかと思われる)
- 参考/関連リンク
    - [Cinemachine](https://www.assetstore.unity3d.com/jp/#!/content/79898)
    - [Post Processing Stack](https://www.assetstore.unity3d.com/jp/#!/content/83912)



### ■乱数完全マスター

- 講演資料
    - [【Unity道場スペシャル 2017札幌】乱数完全マスター](https://www.slideshare.net/UnityTechnologiesJapan/unity-2017-81056841)
- 参考/関連リンク
    - [ハッシュ関数 xxHash の入力を32bitに限定した場合に重複した値が出ないことを確認したい](https://qiita.com/yuji_yasuhara/items/adefc967c51a6becca08)



### ■最適化をする前に覚えておきたい技術

- 講演資料
    - [【Unity道場スペシャル 2017札幌】最適化をする前に覚えておきたい技術 -札幌編-](https://www.slideshare.net/UnityTechnologiesJapan/unity-2017-80569090)
- 参考/関連リンク
    - [MemoryProfiler](https://bitbucket.org/Unity-Technologies/memoryprofiler)
        - 45ページ目参照
    - [StringBuilderTemporary](https://github.com/wotakuro/StringBuilderTemporary)
        - 72～90ページ目のstringのメモリ消費の項目を参照
    - [ProfilerBinarylogSplit](https://github.com/wotakuro/ProfilerBinarylogSplit)
    - [UnityProfilerIntervalSave](https://github.com/wotakuro/UnityProfilerIntervalSave)
        - 136ページ目参照



### ■おっさんでも美少女になれる？！　VRアイドルの作り方

- 講演資料
    - [【Unity道場スペシャル 2017札幌】おっさんでも美少女になれる？！VRアイドルの作り方](https://www.slideshare.net/UnityTechnologiesJapan/unity-2017vr)
- 参考/関連リンク
    - [あいえるたん3Dモデル](https://www.infiniteloop.co.jp/special/iltan/3d-dl.php)
        - [株式会社インフィニットループ 代表取締役社長3Dモデル](https://www.infiniteloop.co.jp/special/ceo/)
    - [Final IK](https://www.assetstore.unity3d.com/jp/#!/content/14290)
    - [SteamVR Plugin](https://www.assetstore.unity3d.com/jp/#!/content/32647)
    - [Voice Changer Filter](https://www.assetstore.unity3d.com/jp/#!/content/54963)
1行でtableをXLSXでダウンロードさせる「ExcellentExport.js」を導入してみる

[テーブル定義書をWebでぽちぽちしながら作れるやつ作ったんやで](https://qiita.com/nnahito/items/5bfd4d7bb099e73ff42c)に導入してみました。
（ちなみに、[デモはこちら](https://tsumari.zapto.org/crud/)）

SQL文をWebでポチポチして作った後、テーブル定義書として手元に残しておきたい。
そんな時のために、テーブル定義書をダウンロードできるように何か無いかと探していたら「[ExcellentExport.js](https://github.com/jmaister/excellentexport)」に出会いました。
ほぼ学習コスト0で導入できたので、ご紹介します。

# 導入
[こいつ](https://github.com/jmaister/excellentexport/tree/master/dist)をダウンロードして、

```html
<script src="./js/excellentexport.js"></script>
```
のように書いてファイルを読み込む。

そして、ボタンが押されたときなどのイベントの最後に

```js
return ExcellentExport.excel(this, 'ファイル名', 'シートの名前');
```
を追加するだけ。

めっちゃ簡単でしょ！！！
Android　アプリ実装TIPS、参考サイトまとめ（レイアウト編）

文系出身新卒１年目、java、Android未経験者が
Androidアプリを作成していく上で参考になったものまとめですっ！　（レイアウト編）

おすすめ記事があれば今後も随時更新予定です！！

# ＜レイアウトTIPS集＞

##EditTextのデザイン変更 <br>

端末によってEditTextのカーソルの色が変わるので、統一したいときはxmlで指定する

[EditTextの色変更箇所まとめ](https://qiita.com/konifar/items/47d467e3574c9228fdc8)

[Change the color of the cursor of an EditText in Android across all the sdk](https://stackoverflow.com/questions/11523494/change-the-color-of-the-cursor-of-an-edittext-in-android-across-all-the-sdk)


##RelativeLayoutにおいて50%配置をやりたい <br>

空のビューを利用することで可能。便利。

[RelativeLayout の子の View の width を 50% にする](http://dev.classmethod.jp/smartphone/android/android-tips-37-relative-layout-view-width/)

##親ビューの中にある複数のビューの状態を更新するには・・・<br>

こういうときはfindViewWithTag()が便利。
例えば親ビューの中に10子のビューがある時に、10個分findbyしなくても
xmlでタグをつけておいてfor文回せばOK。

[findViewWithTag()の使い方](http://koga-app.tumblr.com/post/49431453714/findviewwithtagの使い方)

##影をつける<br>

API21以上を対象とするならxmlでelevationが使える。
それいがいではxmlを作成して対応する。

[How would I get a ListView Item to be elevated?](https://stackoverflow.com/questions/29725855/how-would-i-get-a-listview-item-to-be-elevated)

##[Android] アスペクト比が固定のビューを作成する<br>

1:1とか4:3とか、横幅を基準にして高さがその何倍かを決められるカスタムビュークラス。
使い勝手最高。

[[Android] アスペクト比が固定のビューを作成する](http://dev.classmethod.jp/smartphone/android-aspect-ratio-view/)

##px から dp へのの変換<br>

コードでサイズ指定するときは単位が px になる。dp　に直したいときは以下を参考に。

[コード上で高さを数値で設定するときに、デバイス毎に高さが変わってしまう問題](http://buchi.hatenablog.com/entry/2015/04/21/123008)

##ListViewで、行ごとに違うViewを使う <br>

AdapterでgetItemViewType()をoverrideし、getView()内でcase文を使ってinflateするviewを変える

[ListViewで、行ごとに違うViewを使う](http://assam-at-night.blogspot.jp/2013/04/listviewview.html)


##リストビュー、リストの中身にあるもの（ボタンとか、画像とか）を触る <br>

[リストの中身を触る](http://tomstay.hatenablog.jp/entry/20110421/1303391426
)

##ListViewのitem間のスペースについて <br>

```
<ListView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:divider="@null"
    android:dividerHeight="10dp" />
```

[AndroidのListViewの区切り線を消す方法と要素ごとのスペースを設定する方法](http://sandragon.hatenablog.com/entry/2013/07/07/144051)

##リストビュー、リストの中身にあるもの（ボタンとか、画像とか）を触る <br>

[リストの中身を触る](http://tomstay.hatenablog.jp/entry/20110421/1303391426
)

##ダイアログの背景を透明にする<br>

```
getDialog().getWindow().setBackgroundDrawable(new 
ColorDrawable(Color.TRANSPARENT));

```

[Can't make the custom DialogFragment transparent over the Fragment](https://stackoverflow.com/questions/8045556/cant-make-the-custom-dialogfragment-transparent-over-the-fragment)


##RecyclerViewで区切り線（divider）をつける<br>

[RecyclerViewで区切り線（divider）をつける](http://tomstay.hatenablog.jp/entry/20110421/1303391426)
Ubuntuの古いカーネルイメージを削除する

# カーネルの更新と`/boot`

- `apt-get`でカーネルを更新すると、古いバージョンのカーネルが残る場合がある。
    - `/boot`の領域を消費してしまう。

## スクリプト

- 現在利用中のバージョン以外のカーネルイメージを削除するシェルスクリプト。

```bash
v="$(uname -r | awk -F '-virtual' '{ print $1}')"
i="linux-headers-virtual|linux-image-virtual|linux-headers-${v}|linux-image-$(uname -r)"
sudo apt-get --purge remove $(dpkg --list | egrep -i  'linux-image|linux-headers' | awk '/ii/{ print $2}' | egrep -v "$i")
```

### 参考

- [How do I remove old kernel versions to clean up the boot menu?](https://askubuntu.com/questions/2793/how-do-i-remove-old-kernel-versions-to-clean-up-the-boot-menu)
- [How to Easily Remove Old Kernels in Ubuntu 16.04](http://ubuntuhandbook.org/index.php/2016/05/remove-old-kernels-ubuntu-16-04/)
- [古いカーネルの削除方法メモ](https://qiita.com/ytkumasan/items/d6cc70f151f130d58e9b)
ElectronでjQueryがundefinedになる問題への対策その2

フォーク元: https://qiita.com/pirosikick/items/72d11a8578c5c3327069
参考: https://qiita.com/Chayata/items/be0f7f8d371039ab9fdd

## node-integration: false の問題

フォーク元では、`node-integration: false`が良いと書いてあるが、
これだとrequire()が使えなくなるため、ipc通信等ができなくなってしまう。

そこで、参考元に書いてあるように、
`npm install --save jquery`
とした上で、

```:index.html
const $ = require('jquery');
```
とすることで解決した。
WinMergeについての個人的まとめ

#この記事について#
自分の備忘録として、WinMergeについて調べたことを記載していきます。
ほぼリンク集として使用。
経験が浅いので、間違っていることもあると思いますがご容赦ください。

#ツールの概要#
差分検出ツールです。
ソース修正前とソース修正後を比較し、修正箇所をレビュー時に説明するときに便利です。


#小技

| 事項       |       説明|       参照|
|:-----------------|:------------------|:------------------|
|3画面比較|本番機、開発機、ローカルで比較できるので便利です。<br>ファイル>開く|-|
|ディレクトリ比較|ディレクトリの配下に対して、差分があるかを一覧で出します|[WinMergeで配下すべてのファイルの差分を出力する方法](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1088695045)|
|html出力|差分をhtmlファイルで出力します。結果が残るので、後で見返せます。<br>ツール>レポートの作成|-|

#ダウンロード#

[WinMerge 日本語版](http://www.geocities.co.jp/SiliconValley-SanJose/8165/winmerge.html)
fish shellでgvm導入

gvmでgoを導入しようとしたときに
fish shellが原因で
少しハマったのでメモ

ちなみにgvmはgoのバージョン管理ツールです。

## 環境
* [gvm](https://github.com/moovweb/gvm)
* MAC
* go 1.9.1
* [fish shell](https://fishshell.com/) ※すでに導入済みとします
* [fisherman](https://github.com/fisherman/fisherman)

## 参考
[Fish shell環境でgvmを導入する](http://hsuzuki.hatenablog.com/entry/2017/03/01/165708)

## gvmをインストール
↓が通常のインストール方法ですが、bashでないため使えません。

```
$ bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
```

別方法があるので、[この記事](http://hsuzuki.hatenablog.com/entry/2017/03/01/165708)を参考にして進めていきます。

### fishermanインストール
fish shellを使ってる方なら入ってると思いますが、未導入ならこの先必要になるので↓でインストールしてください
```
$ curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs https://git.io/fisher
```

### bassインストール
Fish shell環境でbashを利用するためのプラグインをインストールします

```
$ fisher edc/bass // bassのインストール

$ bash            // bash環境に入ります

// 先程のgvmをインストールするコマンドを実行
$ bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
```

gvmのインストールが終わったら
~/.config/fish/config.fish に以下を追記します。

```
function gvm
  bass source ~/.gvm/scripts/gvm ';' gvm $argv
end
```

### goインストール
gvmがインストールできたので
goをインストールしていきます

```
// goのバージョン1.9.1をインストール
gvm install go1.9.1 -B     

// goのバージョン1.9.1をデフォルトで使うように設定
gvm use go1.9.1 --default  //fish shell だとここでエラー
```

fish shellだとdefault設定ができません。
ターミナルにログインするたびに↓のコマンドを打たなければなりません。

```
gvm use go1.9.1
```

ですので、先程編集した、~/.config/fish/config.fishに追記していきます

```
function gvm
  bass source ~/.gvm/scripts/gvm ';' gvm $argv
end

function go                      # 追記
  gvm use go1.9.1 ';' go $argv   # 追記
end                              # 追記
```

これでターミナルにログインするたびに、↓のコマンドを叩く必要はありません

```
gvm use go1.9.1
```
gemを読むときの前提知識

## そのgemを使うアプリケーションはgemのコードはどう読み込むか（ざっくり）
active_storageで説明する (https://github.com/rails/rails/tree/master/activestorage)
1, まず `lib/active_storage.rb` を読む
2, そこでrequireされているものを読む
3, そこで `autoload` されているやつは必要になったら読む

## autoloadとは(ActiveSupport::Autoload)
- gemを読んでいる時に `autoload :Attached` みたいに `autoload`メソッドにぶつかる
- そのmoduleが必要になった時に読み込みをしてくれる
- Module.autoloadの拡張
- パスを渡さなくても、ファイル名で判断してくれる
「悪い設計」の定義について考えたことはあるか

DDD連載記事
* [なぜDDD初心者はググリ出してすぐに心がくじけてしまうのか](http://little-hands.hatenablog.com/entry/2017/09/24/005903)
* [ドメイン駆動設計の定義についてEric Evansはなんと言っているのか](http://little-hands.hatenablog.com/entry/2017/09/27/014403)
* [モデルでドメイン知識を表現するとは何か](http://little-hands.hatenablog.com/entry/2017/10/04/201201)
* [ドメイン駆動設計で実装を始めるのに一番とっつきやすいアーキテクチャは何か](http://little-hands.hatenablog.com/entry/2017/10/04/231743)
* [ドメイン駆動 + オニオンアーキテクチャ概略](http://little-hands.hatenablog.com/entry/2017/10/11/075634)

# はじめに
設計の善し悪しについて日々色々と議論することはあると思いますが、「良い設計」「悪い設計」について明文化した定義はあるでしょうか。各々の頭の中にぼんやりと、もしくは断片的にはあるものの、チームで良し悪しについて定義まですることはあまり多くないのではないでしょうか。

各プロジェクトで議論することには価値があると思いますが、一つ基準になるものがあると議論しやすいと思います。そこで一つ、オブジェクト指向の原則を提唱したUncle BobことRobert Cecil Martinが提唱している「悪い設計」の定義について参照してみましょう。

# Uncle Bobについて
そのまえに、Uncle Bobについて紹介します。

[Robert Cecil Martin(wikipedia)](https://en.wikipedia.org/wiki/Robert_Cecil_Martin)

有名な「クリーンコード」の著者、と言えばわかりやすいでしょう。そのほかにも、オブジェクト指向の設計原則であるSOLID原則の提唱者であったり、[アジャイルソフトウェア開発宣言](http://agilemanifesto.org/iso/ja/manifesto.html)の共著者であったりと、ソフトウェア業界に与えた影響は計り知れない方ですね。

(余談ですが、[ドメイン駆動設計で実装を始めるのに一番とっつきやすいアーキテクチャは何か](http://little-hands.hatenablog.com/entry/2017/10/04/231743)で紹介したアプリケーションアーキテクチャ「クリーンアーキテクチャ」の提唱者もこの方です。運営されているサイトも[Clean Coder](https://sites.google.com/site/unclebobconsultingllc/)という名前で、クリーンという名称にはこだわりがあるみたいですね。クリーンアーキテクチャの"クリーン"ってどこから来たのか？と思ったらここからだったようです。納得。)

# 原典
今回の参照する原典は、[古いUncleBobのサイト](http://butunclebob.com/)の[The Principles of OOD](http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod)のページのさらに中、[The Dependency Inversion Principleの記事](https://drive.google.com/file/d/0BwhCYaYDn8EgMjdlMWIzNGUtZTQ0NC00ZjQ5LTkwYzQtZjRhMDRlNTQ3ZGMz/view)の中で紹介されていたものです。こちらの内容を引用・要約したものになります。

# 「悪い設計」とは

すべてのエンジニアが合意できると思われる、以下のような3つの性質を持つ設計を「悪い設計」と言っています。

>1. Rigidity : <br>It is hard to change because every change affects too many other parts of the system.
2. Fragility: <br>When you make a change, unexpected parts of the system break. 
3. Immobility: <br>It is hard to reuse in another application because it cannot be disentangled from the current application. 

和訳し、その後に記述があった詳細について一部意訳、要約を記述します。

#### 1. Rigidity(硬さ)：
> 一つ一つ変更がシステムの他の多くの部分に影響を与えるため、変更するのが難しい。

一つの変更のために、依存モジュールに連鎖的に修正を加えないといけないことが原因となります。<br>修正を加える必要が有る範囲を設計者が予測できない場合、その影響やコストが予測できなくなります。そうすると、権限者は変更の承認を嫌い、変更に硬直的な圧力が働きます。

対策「依存するモジュールを少なくすること」、「依存するモジュールが論理的に推測できる範囲にすること」と言ったことが考えられるでしょう。

対照的な性質は、Flexibility(柔軟性)です。


#### 2. Fragility(脆さ)：
> 変更を加えると、システムの予期しない部分が壊れる。

しばしば、変更時に概念的に関係がない領域にて新しい問題を生じさせることがあります。これにより、保守チームの信頼性の低下を引き起こします。開発を続けるほど、無関係に見えるところでの障害発生が発生し、その修正をするたびにまた別の障害が発生し・・・と、メンテナンスに掛かる工数が継続的にかかりづつけてしまいます。

対策は「概念的に関連があるモジュールのみに依存するようにすること」、1と同じく「依存するモジュールが論理的に推測できる範囲にすること」と言ったことが考えられるでしょう。

対照的な性質は、Robustness(堅牢性)です。


#### 3. Immobility(移植性のなさ)：
> 現在のアプリケーションとの結合が強く、別のアプリケーションでの再利用が難しい。

実装の一部が業務的に固有なものに大きく依存する場合、その実装の再利用性は低くなります。設計者が実装の再利用について調べると、モジュールの分離、再利用のために必要な作業が非常に多いことが判明し、多くの場合は再利用することを諦めます。

対策は「モジュールの凝集度を高めること」でしょうか。

対照的な性質は、Reusability(再利用容易性)です。

# まとめ
いかがでしょうか。「良い設計の定義」よりも、意外と「悪い設計の定義、の裏返し」で考えたほうがイメージがしやすいこともあるのではないでしょうか。

また、これを元に自分自身の考えや、チームの方針を再検討する土台としても使えるかもしれませんね。
SECCON2013 Quals Cryptanalysis

楕円曲線知識ゼロのところから少し勉強してみたのでまとめてみた．

## 問題概要
本問題では，数式が手書きされた画像が渡されるのでそれを解く．画像から得られる情報は以下である．

$ y^2 = x^3 + 1234577x + 3213242$ $($ mod $7654319)$
$Base = (5234568, 2287747) $
$PublicKey = (2366653, 1424308) $
$CryptedData = ((5081741, 6744615), (610619, 6218)) $
$ PublicKey = Secret Key \times Base$
$ Crypted Data = (Rand() \times Base, Plain + Rand() \times PublicKey)$
答えは，$Plain_x + Plain_y$

## 基礎知識
楕円曲線($y^2 = x^3 + ax + b$)上の加算は以下のように計算することができる．

$ x_3 = \lambda^2 - x_1 - x_2 $
$ y_3 = \lambda(x_1 - x_3) - y_1$

この時，$\lambda$は加算する2点$P,Q$により計算方法が異なる．

* $P \neq Q$の時
    * $ \lambda = \frac{y_2 - y_1}{x_2-x_1}$
* $P = Q$の時
    * $\lambda = \frac{3x_1^2+a}{2y_1} $

減算は，例えば点$P(x,y)$を引きたい場合，$P^{'}(x,-y)$を加算すれば良い．
また，スカラー倍する際には，スカラー$d$を用いて，$d-1$回$P$を加算する．

## 解き方

$PublicKey=SecretKey \times Base$より$CryptedData_y = Plain + Rand() \times SecretKey \times Base$となる．
$CryptedData_x = Rand() \times Base$より$CryptedData_y = Plain + CryptedData_x \times SecretKey$となる．
つまり$SecretKey$が分かれば$Plain = CryptedData_y - SecretKey \times CryptedData_x$として計算することが可能である．

今回$PublicKey = SecretKey \times Base$なので， ここから$SecretKey$を導き出すことは楕円曲線上における離散対数問題(ECDLP: Elliptic Curve Discrete Logarithm Problem)となる．これに対するアプローチは複数あるが，今回は最も簡単な列挙法を用いる．列挙法は名前通り，順番に$SecretKey$の値を変化させていき上記の数式が成り立つ場合を見つけるものである．

本問題を解くために書いたプログラムが以下である．Rubyで多倍長を計算するgemのgmpを利用している．また加算を計算する際に少し式変形をしているのでそれについて言及しておく．以下のプログラムにおいて変数tは上記の式の$\lambda$に相当するものだが，プログラムでは以下のような計算を行っている．($P \neq Q$の時について取り上げてみる．数学徒にとっては当たり前なのだろうけど気づくまでに時間がかかったので・・・)

$ \lambda = (y_2 - y_1) \times (x_2 - x_1)^{M-2}$ mod $M$
これを少し式変形すると以下のようになる．
$ \lambda = (y_2 - y_1) \times (x_2 - x_1)^{-1} \times (x_2 - x_1)^{M-1}$ mod $M$
$ \lambda = \frac{y_2 - y_1}{x_2 - x_1}\times (x_2 - x_1)^{M-1}$ mod $M$
ここでフェルマーの小定理について思い返してみると，$p$を素数とし，$a$と$p$が互いに素な時は以下が成り立つ．
$a^{p−1} ≡ 1 ($ mod $p)$
したがって，最終的な$\lambda$は同じ答えになるというものである．単純に逆元を取ると途中で計算エラーになってしまったが，こうすることでそれを防げた．
最終的な答えとしては5720914が出てきた．

```rb
#!/usr/bin/env ruby
require 'gmp'

# from attached file
A = 1234577
B = 3213242
M = 7654319
base = [5234568, 2287747]
pubic_key = [2366653, 1424308]
crypted_data =  [[5081741, 6744615], [610619, 6218]]

# Public key = Secret key * base
# crypted_data = (rand() * base, plain + rand() * public_key)

def add_on_elliptic_curve(u, v)
  
  return u if v == [0,0]
  return v if u == [0,0]
  
  x1, y1 = u
  x2, y2 = v

  if u != v
    t = (y2 - y1) * GMP::Z(x2-x1).powmod(M-2, M)
  else
    t = (3 * x1 * x1 + A) * GMP::Z(2 * y1).powmod(M-2, M)
  end
  x3 = t * t - x1 - x2
  x4 = t * (x1 - x3) - y1
  
  [x3 % M, x4 % M]
  
end
 
x = [0,0]
M.times do |i|
  puts "[+] Calc #{i}"
  if x == pubic_key
    secret_key = i
    puts "Secret key: #{secret_key}" #=> 1584718
    break
  end
  x = add_on_elliptic_curve(x, base)
end

# tmp = secret * base * rand()
# tmp = secret * crypted[0]
tmp = [0, 0]
secret_key.times do |i|
  puts "[+] Calc #{i}"
  tmp = add_on_elliptic_curve(tmp, crypted_data[0])
end

# crypted[1] = plain + tmp
# plain = crypted[1] - tmp
ans = add_on_elliptic_curve(crypted_data[1], [tmp[0], tmp[1] * -1])

puts ans.inject(:+) # [2171002, 3549912].inject(:+) = 5720914
```
進捗確認しながらtarで圧縮/解凍

よく使うけど、結構ぐぐるので、メモ

# アーカイブ

圧縮はしない
元々圧縮されている画像ファイルとかをまとめるときに使う

```
$ tar cf data.tar data/
```

## 進捗を表示

```
$ tar cf - data/ | pc > data.tar
41MiB 0:27:21 [ 196KiB/s] [                                        <=>               ]
```

`pv`に`s`オプションをつけると残り時間とかを表示してくれる

```
$ tar cf - data/ | pv -s $(du -sb data | awk '{print $1}') > data.tar
7.76MiB 0:00:42 [ 172KiB/s] [>                                        ]  0% ETA 22:20:37
```

# 圧縮

`j`オプションをつけると、bzip2で圧縮

```
$ tar jcf data.tar.gz2 data/
```

## 進捗を表示

```
$ tar cf - data/ | pv | bzip2 > data.tar.bz2
```

```
$ tar cf - data/ | pv -s $(du -sb data | awk '{print $1}') | bzip2 > data.tar.bz2
```

# 解凍

```
$ tar xf data.tar
```

## 進捗を表示

```
$ pv data.tar | tar xf -
```
エンジニアが持つべきビジネス思考①市場規模とは


## はじめに

- エンジニアであまりビジネスサイドの話が出来る人がいないのがもったいないと感じる機会が多くなりました
- エンジニアは基本的に頭がよく、地頭も良い人が多いと思いますので、よりビジネス思考を強めれば結果的に良いプロダクトの開発に繋がると私は考えています
- そんな人々に、ビジネスを理解し、自分の仕事の領域を広げるきっかけを与えるのが目的です
- 初回の今回はビジネスする上で基本の、`市場規模`を調べる・試算する方法についてお伝えします

## 市場規模とは

```
業界や商品など、特定分野における市場の大きさ
```

市場の大きさと言われてもよく分かりませんし、正確な値を出すのは大変難しく、
大抵は国家の各省庁や民間の調査団体から推定値が発表されています。

では、この`市場の大きさ`とは何を表すのでしょうか。

簡単に言えば、

**1年間での総売上金額**

です。

## 市場規模はどう調べるのか

このように省庁や民間の調査団体がレポートを出している市場規模ですが、
自動車・鉄道・鋼材等の大きな市場は財務省や経産省がレポートを出しています。
(これらは基本無料で見る事が可能です)

ただ、民間の調査結果に関しては、有料な場合があります。

数万円くらいするので、会社で調べるには問題ないですが、個人的に少し気になる市場の市場規模を調べるにはハードルが高いです。

ただ、安心して下さい。
ざっくりですが、市場規模を自分で計算する事が可能です。
就職面接で出てきたフェルミ推定よりも遥かに簡単な方法で。

## 市場規模を自分で算出する方法

- 1社の売上高とシェアから算出
- 市場上位プレイヤーの売上高の総和とシェア
- 顧客数 x 顧客単価 x 頻度

練習として、カーシェアリング業界の市場規模をざっくりと算出してみます。

国内のカーシェアリング企業は現状大きく4社あります。

- Times Car Plus
- careco
- Orix Car Share
- Earth Car

これらを元に算出してみましょう。

#### 1社の売上高とシェアから算出

まずはTimes Car Plusの1年間の売上とシェアを出してみます。
このサービスは、パーク24という駐車場運営会社のサービスですので、
この会社の決算から売上を調べます。

[2016年10月決算の決算説明書](http://v4.eir-parts.net/v4Contents/View.aspx?template=ir_material&sid=62440&code=4666)から見ると、Times Car plusの年間売上は約186億円です。

(因みに、17年10月の予測では235億と、126%成長予定と書かれていました。本当は17年の4半期毎の売上を見ながら達成可能かを見てみると面白いですが、時間の関係で割愛します)


では、シェアをどう調べるか。

とりあえず、カーシェアのビジネスモデルから、会員数を元にシェアを割り出して見ようと思います。

サービス|会員数|シェア
---|---|---
Times|72万人|74.15%
Careco|5.7万人|5.8%
Orix|17万人|17.5%
Earth Car|2.4万人|2.47%

先程、Times Car Plusの年間売上が186億円でしたので、シェアを元に市場規模を出してみます。

`【業界総売上】 x 74.15% = 186億円`
→ `【業界総売上】 = 186億円 / 74.15%`
→ `業界総売上】=250.84億円`

この算出方法によると、日本国内のカーシェアリングビジネスの市場規模は250億円程度であることが分かります。

(因みに、直接的なライバルになりそうなレンタカー業界は、おおよそ5-6000億円程度の市場規模ですので、カーシェアリングの伸びしろはかなり大きいと考えられます)

#### 市場上位プレイヤーの売上高の総和とシェア

今回のカーシェアリング業界の場合は、上位プレイヤーが4社だったので、上記の算出方法と変わらないと思いますので割愛します。

#### 顧客数 x 顧客単価 x 頻度

これも、正確に、`顧客あたり利用単価`が分かれば出せますが、おおよそ、`売上 / 会員数`で、顧客1人あたりの単価を出してみます。

**Timesの場合**

`【顧客1人あたりの単価】 = 186億円 / 72万人 = 25833円`

こんなに使われるかな・・・という感じがありましたが、1ヶ月単位で考えると2000円ちょっとで、全体で馴らしたら妥当な感じかなという印象です。

では、この顧客1人あたりの単価から、業界全体の会員をかけ合わせて、市場規模を出してみます。

`【市場規模】 = 25,833円 x (72万 + 57.万 + 17万 + 2.4万) = 25,083,843,000円`

約250億円という結果になりました。

最初に出した方法と同じ結果になりました。


## 結果

調べてみると、矢野研究所という所がカーシェアリング業界の市場規模を報告しているようでしたが、ちょうどメンテナンス中で見れませんでした。。

ただ、他のサイトの情報を見ると、2014年に154億円で、2020人は295億円という予測があるとの記載もありあました。

故に、2016年で大体250億円という市場規模は妥当な数値だと思います。

## 考察

今回は、Times Car plusが圧倒的なシェアで、次ぐ2位のOrixが頑張り、３，４位のcarecoとEarth Carが食らいつくような構図が見れました。

Times Car Plusは元々Timesという駐車場を運営しており、その空きスペースを使う事で、駐車場の売上を下げる事なく、カーシェアで一気にシェアを取ってるような状況でした。
TimesやOrixは車両台数の増加や、会員数の増加をめざし、Carecoは他社にはないラインナップで差別化したり、Earth Carはフランチャイズ展開もして、駐車スペースを持て余しているオーナを増やすなど、独自戦略で上位に勝負を掛けている姿が見れました。

このように、業界の市場規模やシェアが見えてくると、業界全体の課題や、各社がどのような戦略を取っているかが見えてきます。
自社に当てはめて考えてみると、まずは客観的に自社がどこに位置しており、どのような戦略を取るべきなのかが見えてくるかと思います。
面白いので是非自分の業界でもやってみると良いかと思います。
I2CのHUBを作る。


[この](https://qiita.com/clses/items/9f7d3d598d6cb2502c90)I2C機器。

<img src="https://qiita-image-store.s3.amazonaws.com/0/199149/ff717297-08d6-6796-49f6-d5b88075855a.jpeg" width="400">

最終的に箱に入れたりしたいのでブレッドボードから外してケーブルに置き換える必要がある。
I2Cは全部繋げられるので単純にHUBを作ってみた。


##■HUB作成
普通のピンヘッダで作ってみたけど、左右間違えるから
ちゃんとしたコネクタにした方が良かったかも。


オスピン側にラズパイを接続、メスピン側にI2Cを接続するようにした。
[こっちで書いたシャットダウンボタン](https://qiita.com/clses/items/e701c1cb6490751a6040)もついでに実装している。

<img src="https://qiita-image-store.s3.amazonaws.com/0/199149/086b11db-3103-0b13-f11e-29d16ce331a3.jpeg" width="400">

<img src="http://qiita-image-store.s3.amazonaws.com/0/199149/e43f25ea-793b-ed5b-bd53-2b93e857de94.jpeg" width="400">
Rubyで単純なQueueクラスを使いたい

グラフアルゴリズムを使ったプログラムを書く時、Queueという名前と機能を使ったソースを書きたい

しかし、それには２つ問題がある

* 一般的なQueueのプログラムでの挙動は Arrayの [#push](https://docs.ruby-lang.org/ja/latest/method/Array/i/push.html) [#shift](https://docs.ruby-lang.org/ja/latest/method/Array/i/shift.html) で実装されているので、Queueクラスは作る必要がない
* Queueというクラス名はスレッドプログラミング用の[Thread::Queue](https://docs.ruby-lang.org/ja/latest/class/Queue.html)というクラスに使われている

というわけで、単純にaliasを使うことにする。

```ruby
# enqueue = 後入れ、 dequeue = 先出し
class Array
  alias_method :enqueue, :push
  alias_method :dequeue, :shift
end

queue = [1,2,3]

puts "original !"
puts queue.to_s

puts "enqueue! 4"
#queue.push(4)
queue.enqueue(4)
puts queue.to_s

puts "dequeue! 1"
#queue.shift
queue.dequeue
puts queue.to_s
```

出力

```
ruby test.rb
original !
[1, 2, 3]
enqueue! 4
[1, 2, 3, 4]
dequeue! 1
[2, 3, 4]
```

Stackについても同様な実装ができそうだ
ちょっとずつ読むドメイン駆動設計 第ニ部 モデル駆動設計の構成要素 第六章 ドメインオブジェクトのライフサイクル2(集約) 

# 集約(Aggregates)

文章がわかりずらいですね。。。何度読んでも・・・

簡単に言えば、データベース・トランザクションの範囲だが、データベースのみを基準にすると混乱するし、うまくいかない。モデルにも目がいかなくなってしまう。

> 実際、この種の問題に対するバランスの取れた解決策を見つけるのには、ドメインに対する深い理解が必要である。(第二部 第六章 より)

トランザクションの範囲の問題ではなく、モデルの境界を定義する。モデルから解決策を導くということですね。

- 集約とは関連するオブジェクトの集まり
- データを変更するための単位
- 各集約にはルートと境界がある
- ルートは集約に含まれている特定の１エンティティ
- 集約の外部のオブジェクトが参照を保持してよいのはルートだけ
- ルート以外のエンティティは集約の内部で一意であればいい
- ルートのエンティティはグローバルに一意でなければならない

![クラス図3.png](https://qiita-image-store.s3.amazonaws.com/0/150455/7e4a0efd-3e11-c5ae-f769-15cdeac8829b.png)

このドメインでGoodsがドメインのルートとすると、外部のOrderはGoodsしか参照しません。
GoodsColorSizeは内部のEntityなので、そのなかだけで一意になればいいということですね。

明日も集約の続きを読みます。
Google週報 - 10月第1週にあったいろいろ

# 翻訳

Google Pixcel Budsが発表された。
耳につけて、リアルタイム翻訳が聞けるデバイス。

https://www.youtube.com/watch?time_continue=6&v=Q5bA12koB-g

# OK google

Google Home Maxが発表された。

# 論文

Jeff Dean - 今週も10件以上引用された。
ピックアップ
https://www.ideals.illinois.edu/bitstream/handle/2142/98441/SU-DISSERTATION-2017.pdf?sequence=1
分散システムへの攻撃方法について(イリノイ大学)
https://arxiv.org/pdf/1710.00310.pdf
ファジーテキスト検索の改善について(中国企業)

Sanjay Ghemawat - 今週も10件以上引用された。
ピックアップ
https://arxiv.org/pdf/1710.00112.pdf
バイオインフォマティクスでの機械学習のユースケースについて(イリノイ大学)
自作アプリ Ｎｏ.1, No.2 (2個)

#No.1 簡単に作れるおみくじアプリ


```python:omikuji.py
# coding:utf-8

#おみくじアプリ

import random                                     # ライブラリの取り込み

x = random.randint(1,101)                         # 1 ~ 100 までの数値がランダムでｘに入る

print("選ばれた数字が"+ str(x) +"なので")           # strでｘを囲むことによって数値を文字列に変換している。

if  91 < x < 100:                                 # x が 【　92 ~ 99　】
    print("大凶")

elif 81 < x <= 91:                                # x が 【　82 ~ 91　】
    print("凶")

elif 41 < x <= 81:                                # x が 【　42 ~ 81　】
    print("吉")

elif 1 < x <= 41:                                 # x が 【　2 ~ 41　 】   
    print("中吉")

elif x == 1 or x == 100:                          # x が 【　1 or 100 】  
    print("大吉")
```

---
#No.2 簡易的なロト７の数字を選んでくれるアプリ

```loto7.py
# coding:utf-8

# ランダムな数字を7つ選んで小さい順から表示

import random

number = list(range(1,38))               # １から３７までが入っている箱を生成

number7 = random.sample(number, 7)      # 数字を７つ取り出す

number7.sort()                           # 数字を小さい順に整理

print(number7)                          # 結果表示


```


list(range(1,38))やrandom.sample(number, 7)の

38, 7の数字を変更することでロト６などにも対応可能。
境界線のズレを相殺する


```css
div {
	height: 20mm;
	width: 50mm;
    border: 1px solid black;
}
```

のように境界線を引くと先の太さ分 外側に大きくなりズレてしまう。
そんなときは以下のように太さと同一のサイズで負のマージンを設定すると相殺されてズレなくなる。

```css
div {
	height: 20mm;
	width: 50mm;
    border: 1px solid black;
    margin: -1px;
}
```

#### 追記

コメントで教えてもらったので調べました。
元々、印刷用のレイアウトで mm 単位で指定した時に困ったのですが、`box-sizing: border-box;`を指定すると境界線が指定したサイズの内側に引かれるようになるためずれなくなる。

```css
div {
	height: 20mm;
	width: 50mm;
    border: 1px solid black;
    box-sizing: border-box;
}
```

上の方法と挙動が若干違うので使い分けると便利そうですね。
hakuho01 さん、ありがとうございました。
CreateJS 1.0.0のVideoBufferクラスを使う

HTMLビデオをシークしたりループするとき、新しいフレームを表示するまでに少し間が空いたりします。それは、Canvasで再生するビデオが点滅してしまう原因のひとつです。 EaselJS 1.0.0から新たに備わった[`VideoBuffer`クラス](http://createjs.com/docs/easeljs/classes/VideoBuffer.html)は、ビデオの各フレームをオフスクリーンCanvasに描画することにより、前のフレームを保持してこの問題を解決します。

#Bitmapクラスでビデオを表示する
まず、`VideoBuffer`クラスは使わずに、EaselJSでビデオをCanvasのうえで再生しましょう。[`Bitmap()`コンストラクタ](http://createjs.com/docs/easeljs/classes/Bitmap.html#method_Bitmap)にvideo要素([`HTMLVideoElement`](https://developer.mozilla.org/ja/docs/Web/API/HTMLVideoElement))を渡し、インスタンスは`Stage`オブジェクトに加えます。つぎのコードが、ビデオを再生するサンプルです(図001)。

```js
var stage = new createjs.Stage(canvasElement);
var videoElement = document.createElement('video');
var bitmap = new createjs.Bitmap(videoElement);
stage.addChild(bitmap);
videoElement.src = 'assets/video.mp4';
videoElement.autoplay = true;
createjs.Ticker.timingMode = createjs.Ticker.RAF;
createjs.Ticker.addEventListener('tick', stage);
```

####図001■Canvas上で再生されるビデオ
![1710001_001.png](https://qiita-image-store.s3.amazonaws.com/0/128949/1acd8e4d-dc54-83b4-5e23-6621a3a8815d.png)

#VideoBufferクラスで描画フレームをバッファする
`VideoBuffer`クラスで毎フレームの描画を保つには、コンストラクタにvideo要素を渡します。そして、つくられた`VideoBuffer`インスタンスを、`Bitmap()`コンストラクタの引数にすればよいのです。

```js
buffer = new createjs.VideoBuffer(videoElement);
bitmap = new createjs.Bitmap(buffer);
```

前掲のサンプルのコードは、`VideoBuffer`クラスを使うとつぎのように書き替えられます。実際の作例は、「[EaselJS 1.0.0: Using VideoBuffer class](http://jsdo.it/FumioNonaka/Aqs6)」としてjsdo.itに掲げました。

```js
const stage = new createjs.Stage(canvasElement);
const videoElement = document.createElement('video');
const buffer = new createjs.VideoBuffer(videoElement);
const bitmap = new createjs.Bitmap(buffer);
stage.addChild(bitmap);
videoElement.src = 'assets/video.mp4';
videoElement.autoplay = true;
createjs.Ticker.timingMode = createjs.Ticker.RAF;
createjs.Ticker.addEventListener('tick', stage);
```
Android　アプリ実装TIPS、参考サイトまとめ（AndroidOS特有編）

Androidアプリを作成していく上での基本的事項まとめです。
随時更新。

# Android特有のこと

- **ライフサイクル** <br>

アクティビティが生成されてなくなるまでどんなメソッドがどんな順で走っているか確認する

[アクティビティのライフサイクル](https://www.javadrive.jp/android/activity/index2.html)


- **タスクとスタックについて** <br>


[タスクとバックスタック](https://developer.android.com/guide/components/tasks-and-back-stack.html?hl=ja)

（タスクとバックスタックの管理）
[intent.setFlagsメソッドの引数について](http://androidroid.info/android/activity/568/)

- **端末のフォントサイズ** <br>

Androidでは端末の設定からフォントサイズを設定できます。「小」「中」「大」「最大」とか。textSizeをsp設定にしているとその設定の影響を受けてアプリ内のフォントサイズも変更される。
⇨フォントサイズが変わるとレイアウト崩れが起こることも・・・

なのでそうなることを考慮したレイアウト設計が必要。

[Android　TextView の setTextSize() は sp 単位だよ！](http://y-anz-m.blogspot.jp/2012/02/androidtextview-settextsize-sp.html)

[[Android]テキストサイズの指定方法](http://wada811.blogspot.com/2014/04/android-text-size.html)