OmniAICreator/Qiita-1.07M huggingface dataset:
HTML基礎

#html
- strongタグ＝重要なとこ
- br＝改行。閉じタグなし
- span＝テキストの一部にスタイリングや処理を行うためのもの
- a　＝リンクを貼るためのタグ　hrefもしくはtarget
    - href="http://...." target="_blank"←新しいタブ
    - href="#idの名前"でページ内リンク
- img＝画像リンク　閉じタグなし
    - 画像のファイル指定＝src属性を使う
    - width,heightで横とたての長さを決める
    - altで画像リンクの代替を指定
- table＝表組を作る
    - thead
    - tbody
    - tr: table row
    - th: table header
    - td: table date
    - <td calspan="列の数">文章</td>で結合して文章を打てる
- form＝アンケートの作成
    - acrion=どこに送るか
    - method=get / postでどちらに送るか
    - input=どこに受け付けるか
        - メールアドレス：inputタグ type属性="text" name="email"
        - input type="submit" value="送信"
- input
    
    - text sizeは入力欄の幅 maxlength入力できるマックス文字数 placeholderは入力欄にうっすら入るガイドの文字
    - submit
    - password　パスワードを入力
    - hidden　いちいち入力させない？ユーザの情報を隠して送信する？
    - textarea name="comment" でテキストの記入欄
    - colsで幅 rowsでたて　を指定できる
    - button type="button"で何らかの処理ボタンを作れる。strongで強調できる。有効化するにはJavaScriptが必要
    - disableタグで全ての入力を禁止できる
    - checkbox　複数選べる　checkedであらかじめチェックを入れられる
    - radio　一つしか選べない
    - labelタグでラベルをクリックするだけでチェックを入れることができる
    - label for="idの名前"で離れたところにあるラベルを関連づける
    - selectで選択肢の欄を作る
    - optionで選択しの名前をつける
    - multiple属性であらかじめ複数の選択肢を表示できる
    - sizeで表示する数を指定できる
    - email
    - number
    - date
    - requierd属性で入力を必須にする
    - novalidateは属性のエラーを表示しないようにする
- 文字参照
    - 意図しない非表示を表示させる　
    - 数値文字参照　&#（パウンド）60;
    - 文字実体参照　&l（エル）t;
    - &quotと;を使うと；が表示される
    - &にamp;を使うと＆が表示される

##HTML５

- タグ
    - カテゴリー；　どの部類か
    - コンテンツモデル；　どのカテゴリーのタグを利用できるか
        - W3Cで確認するといい
    - トランスペアレント；親要素のコンテンツモデルを利用する必要
【初心者向け】Node.jsを使って5分でファイルアップローダを作成

本稿はNode.jsでmulterを使ったファイルアップローダを実装するためのメモである。
ターゲットとしては初心者向けを想定している。
流れは以下の通り。

1. ライブラリのインストール
2. クライアントアプリ作成
3. サーバアプリ作成
4. サーバアプリ実行&試す

## ライブラリのインストール

以下のようにnpmコマンドで必要なライブラリをインストールする。

```$ npm install express```
```$ npm install multer```

npmコマンドは、JavaScriptのパッケージマネージャのコマンドである。
(RubyのgemやPythonのpipのようなもの)

## クライアントアプリ作成

クライアントアプリには以下のようなコードを使用する。

```up.html
<!doctype html>
<html>
  <head>
    <title>ファイルアップロード</title>
  </head>
  <body>
    <h1>File Upload</h1>
    <p>サンプル ファイルアップロード</p>

    <form action="http://127.0.0.1:58080/file_upload" method="POST" enctype="multipart/form-data">
      <input type="file" name="file">
      <input type="submit" value="Upload">
    </form>
  </body>
</html>
```

ポイントはformタグやinputタグである。
formタグのaction属性はHTTPでファイルをアップロードする際のURLなので、
環境に応じて適切な値を記載する。

## サーバアプリ作成

サーバアプリには以下のようなコードを記載する。

```server.js
var express = require('express');
var app = express();
var multer = require("multer");

app.post('/file_upload', multer({dest: '/tmp/samplefup/'}).single('file'), function (req, res) {
    // multerが/tmp/samplefup/配下にファイルを作成
    
    // req.file.pathでmulterが作成したファイルのパスを取得可能
    console.log(req.file.path, req.file.originalname);
    res.end("upload!");
});

var server = app.listen(58080, function() {
    console.log("listening at port %s", server.address().port);
});
```

上記は、ファイルを受信して標準出力にアップロードされたファイルのパスと、
アップロードされたファイルのファイル名を出力するサーバアプリである。

気にするポイントはapp.post()で、multerと関連付けを行っている部分である。
single()は単一のファイルを受信するためのメソッドで、引数はinputタグのnameに対応する。

ひとまず試すだけであればnodeコマンドを実行して張り付ければ十分である。


## サーバアプリ実行&試す

サーバアプリは以下のように起動する。

```$ node server.js```

起動後、クライアント(up.html)をWebブラウザで開き、
ファイルを選択して「Upload」ボタンを押下すればファイルのアップロードを行うことができる。


## おまけ

up.htmlをHTTP経由で提供するには、
Webサーバを使用したり、expressを使用したりすれば良い。
例えばserver.jsの「app.listen()」の上部に以下のようなコードを書けば良い。

```
app.get('/up.html', function (req, res) {
    res.sendFile(__dirname + "/" + "up.html");
});
```
php-master-changes 2018-08-07

今日は少なめ

# 2018-08-07
## weltling: Fix stack underflow in phar
- https://github.com/php/php-src/commit/b053beee7efb64b8e439fb3639de839e615ba89c
- ext/phar でのスタックアンダーフローを修正

## laurence: Fixed bug #76713 (Segmentation fault caused by property corruption)
- https://github.com/php/php-src/commit/2b1d79ce6661efdfae881884ca40b4ca7fc991e7
- オブジェクトの配列を array_column() に渡した際、SEGV が出るケースがある問題の修正
- 修正コードを見ると参照カウントを足しにいっているようなので、array_column() で取得したプロパティが GC されるケースがあったということなのかな
    - [バグ報告の方](https://bugs.php.net/bug.php?id=76713)と話としてはそれで合致しそう
- テストケースを修正適用前の手元の環境で動かしてみたものの、正常動作してしまった

## pmmaga: Fix #76700 - Methods with altered visibility need to be added again
- https://github.com/php/php-src/commit/fadbfbf8e131154071cdbadfe11c86842a031605
- trait T1 の protected/private メソッドを trait T2 が as public で use し、 T1 を use する class A を継承した class B が T2 を use した時、当該メソッドは B のインスタンスでは可視性が変更され、public なメソッドとして呼べなければならないが、呼べなかった問題の修正
- などと説明してもよく分からないと思うので[テストケース](https://github.com/php/php-src/blob/887235773d1848108f842184c978ba37875768f2/Zend/tests/traits/bug76700.phpt)を見てほしい
- もともと [bug #63911](https://bugs.php.net/bug.php?id=63911) があり、同じ trait を use する複数の trait を 同時に use すると、共通部分のメソッド定義が菱型継承的な構図で衝突する、というバグがあった（継承ではないので、いわゆる菱型継承というわけではないけれど）
- #63911 は見ようによってバグというか仕様というか微妙なラインだったものの、ともかく PHP7.3 には[この修正が入っている](https://github.com/php/php-src/pull/2797)
- まず op_array のオペコードを比較して同じ関数なら重ねて処理しないという修正を入れ、ただ public/protected/protected の可視性の部分は op_array と別の部分でフラグを持っていたので別の不具合が発生し、そっちのフラグもあわせて比較することで、可視性の変更も正常に適用されるようになった、というのが今回の修正
BeagleBone BlackにDebian Stretchをインストール

BeagleBone BlackにDebian StretchをSDカードにインストールしました。

# 使ったもの
* BeagleBone Black Rev.C
* SDカード 4GB以上
* Mac OS X High Sierra 10.13.6
* [最新Debian 9.4 2018-06-17](http://beagleboard.org/latest-images)
* [Mac OS X用USBドライバ](http://beagleboard.org/getting-started)  
  Network, Serial用共にインストールしておく
* [Etcher 1.4.4](https://etcher.io/)
* [The Unarchiver](https://itunes.apple.com/jp/app/the-unarchiver)  
  

# 手順
1. 最新Debianを任意の場所にダウンロードする  
   2018年8月7日ではbone-debian-9.4-iot-armhf-2018-06-17-4gb.img.xz
2. MacにSDカードを入れ、Etcherで書き込む  
3. SDカードをMacから取り外し、電源を切ったBeagleBone Blackに刺す
4. Bootボタンを押しながらMacとUSBケーブルで繋ぐ
HDMI, マウス、キーボードを直接繋いでも良い
Bootボタンは[ここ](http://www.elinux.org/Beagleboard:BeagleBoneBlack#Revision_C_.28Production_Version.29)を参照し、LEDが4つとも点燈するまで押しっぱなし
5. sshでログインする
初期パスワードはtemppwdです。

    ```
    $ ssh debian@beaglebone.local
    debian@beaglebone.local's password: 
    
    The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
    
    Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
```

5. Debianのバージョンを確認する

    ```
$ cat /etc/debian_version
9.4
```

# おしまい

この後は煮るなり焼くなりお好きなように！
ダサすぎるnullチェックをやめましょっていう話

## null合体演算子を使おうってだけの話
ちょこちょこ見かけますが、issetやemptyを使って中身があれば代入するような処理ですが、php7以上使ってるならクソコード認定されてしまうので即刻やめましょう！

```KusoCode.php
$str = '';
if(isset($param)){
  $str = $param;
}
```

null合体演算子を使ってこのように書き直しましょう。

```Solution.php
$str = $param ?? '';
```
??を使うと左辺がなければ右辺を使うことができます。ちなみにこれは、issetを使って以下のように書いた時と同様です。

```OldSolution.php
$str = isset($param) ? $param : '';
```

isset使うより??使う方がコード量少なくてスタイリッシュだし可読性も高いですね！
汎用性も高くて、例えば引数で渡す時とか色々な時に使えて便利です。

```Other.php
public function index(){
  //default値を呼び出し側で設定してあげたいときとかにも使える
  $this->call($param ?? 'default');
}

//訳ありで引数にデフォルトを設定できないファンクション
private function call($param){
  echo $param;
}
```

ただそんだけですが、知ってると便利ですよ！
「Lチカ」の次は「リレカチ」で

#Lチカから次がいきなり敷居が高い
というのはよく聞きます。
数行書けば動いたLチカに比べると、サーボ回したりセンサーの値を取ったりするのはスケッチの行数が格段に多く、じゃあLEDの代わりに電池で動くおもちゃでも繋ぐか、と思っても、「モーターを直接繋いじゃいけません、なぜなら突入電流が云々・・・」とか言われ、そもそも小さいモーターじゃないと動きません。

そんな「Lチカ」の次のステップとして、「リレカチ」つまり**リレーをカチカチ**させるのはどうでしょう？という提案です

**マサカリ（有識者からのダメ出し・アドバイス）大歓迎です!**

#リレーとは
ここでいうリレーは、電磁リレー、つまり、電磁石の力でスイッチをオンオフする有接点タイプのリレーです。オンオフする際にカチカチと音がするのが魅力です。

![re.jpg](https://qiita-image-store.s3.amazonaws.com/0/59911/97cbe918-7e4a-fd44-c752-c3ed356d992f.jpeg)

#なぜリレーか
もっとも大きな理由は**Lチカで使ったスケッチをそのまま使いまわせる**ことです。
Lチカで使ったLEDを取り外しリレーを繋ぐだけで、光の代わりにカチカチ音がするようになります。音がするという「動いている感」がモチベーションにつながるだけでなく、Lチカが光で動作を確認できたのと同様、音で動作を確認することができます。

次にリレーの「何でもつなげる感」です。リレーはいわば「スイッチ」なので、回路の外に（外部電源と）モーターが繋がっていてもリレーの回路には何の支障もありません（実際には電磁リレー自体がコイルなのでモーターと同じような問題がありますが、こちらについては後述します）。つまり外部電源を使って**電池で動くおもちゃ類が軒並みLチカのスケッチで動かせるようになります。**

#リレーの問題点
まず第一に、リレーは基本的に**端子がたくさんあります。**
Lチカで使ったLEDは機能的にも実用的にも端子は２つで、+側の脚が長い、というわかりやすいお約束がありましたが、リレーは端子の場所や役割がメーカーによってまちまちで、かつ実用的な用途からたくさんの脚がついています。（素人的に）イケてるリレーだと、側面や底面等にコイルやスイッチの配線図が描いてあったり、上面が透明でカチカチしている様子がわかったりするのですが、大抵のリレーは真っ黒で配線図もなく**型番をもとにネットで調べたりしないとどれが何の端子だかわかりません。**
（その作業が謎解きゲーム的で面白いんじゃん！という声もありますが）

![image1.jpg](https://qiita-image-store.s3.amazonaws.com/0/59911/370d0984-6f21-01c6-5e6e-2519f8b02de9.jpeg)

第二に、前述したように電磁リレーもコイルなのでオン/オフ時に突入電流や逆起電力があります。モーターも電磁石もコイルであることは小学校で習ってみなさんご存知なので、「モーターはダメなのにコイルはいいの？」とか突っ込まれると「も、モーターは回転するから、、」みたいな適当なことを行ってモニョることになりかねません。かと言って最初から「サージ対策でダイオードを負荷に並列にー」とかやると難易度は上がりモチベーションが下がります。

#それでもやっぱりリレカチ
とはいえ、細かいことばかりを言っていては楽しんで電子工作の世界を体験してもらうことができません。
Lチカ(直結)
　　↓
Lチカ(制限抵抗の説明および実装)
　　↓
リレカチ(直結)
　　↓
リレカチ（おもちゃつなぐ）　
　　↓
リレカチ（並列ダイオードの説明および実装）
　　：
のように、順を追って楽しんで進めていくことで、電子工作の世界にハマっていってもらえればいいな、と思います。

[ちなみに自分はこんな楽しみ方をしています](https://youtu.be/FOEu3RapffI)
![2019-06-17_134534.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/7d1d94ff-71ef-e55a-c933-900b89b4b551.png)

[関連](https://qiita.com/ELIXIR/items/e3c22f9088fdacd27ae9)
Tomcatを80番ポートで動かす

tomcatを80番ポートで起動しようとすると権限エラーになる。
これは1024番以下がルート権限でしか使えないから。

iptableを設定することで8080番ポートで動かしているtomcatを80番で公開することが可能

```iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080```
Rubyで独自例外を定義する

### ===環境===

osx 10.12.6
ruby 2.4.3

### ===独自例外の作成===

```error_type.rb

class MyError1 < StandardError
end

```

### ===例外処理を明示的に分けたいときに便利===

```example.rb

class InvalidAccountError < StandardError
 # アカウント情報が違う時にエラーを出したい。
end
class InvalidPageError < StandardError
 # アクセスするページがないときにエラーを出したい。
end

begin
  http     = Net::HTTP.start(host = "hogehoge.com", port = 80)
  req      =  Net::HTTP::Get.new("/")
  req.basic_auth(username, password)
  response = http.request(req)
  raise InvalidAccountError if response.code == "401"
  raise InvalidPageError if response.code == "404"
rescue InvalidAccountError => e
  "#{e.message}"
rescue InvalidPageError => e
  "#{e.message}"
end

```
LinqToEntitiesで自動生成されるクエリを確認する

# EntityFrameworkつかってますかー？？
遅いとか言わないで＞＜；

# LinqToEntitiesとは
EntityFrameworkを使っているとき、DBアクセス処理をSQLではなくC#上でlinqを書くとSQLに変換して発行してくれる仕組みです。
参考（本家）
https://docs.microsoft.com/ja-jp/dotnet/framework/data/adonet/ef/language-reference/linq-to-entities

# DBアクセスが発生するタイミング 
LINQ to Entitiesのクエリは遅延実行の為、linqを書いただけではDBにクエリが発行されません

```C#
var db = new MyContext();
// このタイミングではDBに対してSELECTしない
var samples = db.Samples.Where(x => x.deleteFlg == 0);
// このタイミングでもDBに対してSELECTしない
samples = samples.Where(x => x.category == "タイプA");
```

foreachやFor Each ステートメントでクエリ変数を反復処理に使用、または LINQ 変換演算子（ToList、ToArray、ToLookup、ToDictionary など）を使用することで、クエリが即時実行が発生します。 
上記の遅延実行とは対照的に、シングルトン値を返すクエリ（Average、Count、First、Max）は即時実行されます

```C#
var db = new MyContext();
// このタイミングではDBに対してクエリを発行しない
var query= db.Samples.Where(x => x.deleteFlg == 0);
// このタイミングでもDBに対してクエリを発行しない
query= samples.Where(x => x.category == "タイプA");

// このタイミングでクエリを作成し、DBに対してクエリを発行
sampleList = query.ToList();
```

参考（本家）
https://docs.microsoft.com/ja-jp/dotnet/framework/data/adonet/ef/language-reference/query-execution

# DBに発行したクエリの確認方法

```
System.Data.Entity.Infrastructure.DbQuery<SampleForLinqToEntities.Models.Model名>query.Sql
```

でクエリを確認できるようです（デバッグの時に確認できます）（これはバージョンによって違うかも）

たとえばこんな感じ（JOINしている）

```SQL
SELECT 
    [Extent1].[WorkId] AS [WorkId], 
    [Extent1].[UserId] AS [UserId], 
    [Extent1].[ProcessId] AS [ProcessId], 
    [Extent2].[UserId] AS [UserId2], 
    [Extent2].[UserName] AS [UserName], 
    [Extent2].[CompanyId] AS [CompanyId], 
    [Extent3].[CompanyId] AS [CompanyId2], 
    [Extent3].[CompanyName] AS [CompanyName], 
    FROM    [dbo].[Works] AS [Extent1]
    INNER JOIN [dbo].[Users] AS [Extent2] ON [Extent1].[UserId] = [Extent2].[UserId2]
    INNER JOIN [dbo].[Companies] AS [Extent3] ON [Extent2].[CompanyId] = [Extent3].[CompanyId2]
    WHERE ([Extent2].[UserId] = @p__linq__0) AND ([Extent3].[DeleteFlg] = 0) 
```

DBに対して発行されたクエリやタイミングを確認したい場合は、SQLServerの場合はSQLServer Profilerを用いるなどSQL監視ツールを使うとよくわかると思います。こちらも発行されたクエリを確認できます。

良いクエリが発行されるようにlinqをどう書けばよいかはまた次回にでも。。
OpenSearch を有効活用しよう (3/3)

[　 OpenSearch を有効活用しよう (1/3)](https://qiita.com/ctrlzr/items/4f59628764afa86d3716)
[　 OpenSearch を有効活用しよう (2/3)](https://qiita.com/ctrlzr/items/9b2f6623a0192d7515cd)
⇒ OpenSearch を有効活用しよう (3/3)

[![へた読み辞書](https://heta.undo.jp/img/hetayomi_logo.png)](https://heta.undo.jp)
OpenSearchを最大限に活用したサービスです。

OpenSearchが設定されたサイトで検索すると、次のことが出来ることを説明しました。

- **既定の検索エンジンを変更できる**
- **ショートカットで検索エンジンを変更できる**

既定の検索エンジンを変更すると、使いたくないとき面倒で、ショートカットで変更するのは、デバイスが限られます。いっそのこと、

### **検索ワードによって、検索エンジンを切り替えられるとしたらどうでしょう？**

![ズバリ！できるわけがないッ！](https://ctrlzr.sakura.ne.jp/img/ameblo/dekinai2.gif)
ズバリ！できるわけがないッ！
と、ダービーさんは仰ってますが、あるサービスを既定の検索エンジンに設定すれば、できます。

へた読み辞書は「ひらがな」と「ひらがな以外」で検索エンジンを切り替えていますが、「ぐるなび」「じゃらん」など、一部のひらがなは google検索します。
切り替えルールは何でもありなので、都合のいい検索エンジンを作ってみましょう。画面とxmlは前回の記事を参照してください。

~~例を考えるのが面倒~~イメージが付きやすいのでqiita内の記事を例にしました。
[Chromeの検索バーを強化する](https://qiita.com/kawaz/items/39d29dd5d19207ff5dac)

同じように動作するよう作成したのが以下のサイトです。既定の検索エンジンを設定する手順は前回の記事を参照してください。
http://ny.nyanta.jp


```ruby:search.php
<?php

$q = $_GET['q'];

if (preg_match('/^[a-zA-Z]+$/', $q)) {
  redirect_to('http://eow.alc.co.jp/'.$q.'/UTF-8'); // 英単語のみならalcへ
}

if (preg_match('/\balc\b/', $q)) {
  $q1 = preg_replace('/\balc\b/','',$q);
  redirect_to('http://eow.alc.co.jp/'.$q1.'/UTF-8'); // alcを含んでいればalcへ
}

if (preg_match('/\bej\b/', $q)) {
  $q1 = preg_replace('/\bej\b/','',$q);
  redirect_to('http://translate.google.com/#en|ja|'.$q1); // ejを含んでいればGoogle翻訳｜en→ja
}

if (preg_match('/\je\b/', $q)) {
  $q1 = preg_replace('/\bje\b/','',$q);
  redirect_to('http://translate.google.com/#ja|en|'.$q1); // jeを含んでいればGoogle翻訳｜ja→en
}

if (preg_match('/\bphp\b/', $q)) {
  $q1 = preg_replace('/\bphp\b/','',$q);
  redirect_to('http://php.net/manual-lookup.php?pattern='.$q1); // phpを含んでいればphpへ
}

redirect_to('https://www.google.com/search?q='.$q); 

function redirect_to($url) {
  header('Location: '.$url);
  exit();
}
```

英単語1つならalcへ飛ぶようにしました。これで一手間省けます。キーワードは先頭に限らないので、入力ミスも減るでしょう。
翻訳は、trと英語ならen→ja、trと日本語ならja→enということもできます。それよりも、**重要なのはAndroidとiOSでも使用できる**ことです。
既定の検索エンジンが設定できないのでiOSは一手間多くなりますが、サイトへ移動して語句を入力するより速いはずです。

＃あと5年もすれば、AIが勝手に検索先を選んでくれそうですが、それまでは自前検索エンジンの方が便利です。


おしまい
8/6講座

#PHPクラス
##オブジェクト指向 
部品を組み立てる
クラスは部品
class クラスの名前（大文字で始まる）　{クラスを構築する部品の関数}

- クラスの中にある関数はメソッド
- プロパティは変数のこと
- クラスの継承 inherit 

##インスタンス
- クラスが枠組み
- インスタンスがクラスを利用したもの
- EX）テンプレシートと自分のシート

###コード

class Tire{}
publicが一番オープンな変数<->private
constract　データの関数　引数という
this->weight
→今いるクラス　の　ウェイトのプロパティ
echo=出力
→ブラウザに出力される
文字と変数を結合するときは「.」を利用する
EX）　{echo"重さは".＄weight.}

- インスタンス
- $tire=new Tire();テンプレ
- インスタンスを作るとコンストラクトの関数が実行される

psr2というコードを見やすく書きましょうっていうルール

- 名前空間　部品を作りすぎてどこに何があるかわからなくなった時のためのもの
- namespace Site

![Screen Shot 2018-08-06 at 15.06.32.png](https://qiita-image-store.s3.amazonaws.com/0/274410/1e8b1701-182d-8692-5636-63c71c6e413e.png)
Scrapboxによる国際会議論文共有の勧め

# はじめに
本記事では、情報共有ツールScrapboxのユースケースの１つとして、国際会議論文共有方法を紹介します。

まず、百聞は一見に如かずということで、今回私がお勧めしたい国際会議論文の共有方法を確認して頂きたい。
kdd2018papers: https://scrapbox.io/kdd2018papers/
![image.png](https://qiita-image-store.s3.amazonaws.com/0/264359/2df30fa0-2471-66c5-ccbd-efe268605a3e.png)


こちらは、データマイニング系のトップカンファレンスKDD2018の論文をScrapboxのプロジェクトとしてまとめています。以下のページ(Accepted papers一覧)からスクレイピングすることにより作成しました。
KDD2018 Accepted Papers: http://www.kdd.org/kdd2018/accepted-papers　

# Scrapboxとは

- 以下で紹介する書籍では、次世代の情報共有ツール、知のコラボレーションツールなどと表現されております。まさにその通りで、メモが、カード型でフラットに保存され、非常に簡易に情報を入力、検索することができます。
- 私は、今までにEvernoteやらGoogle Keepやら色々使ってきましたが、Scrapboxに出会ってからはもう他のツールには戻れない状態で心酔しています。(理由はうまく説明できない)
- さらに詳しい紹介は、以下の書籍が詳しいです。Scrapboxの使い方やコンセプトについて解説されています。
- [Scrapbox情報整理術, 倉下 忠憲](https://www.amazon.co.jp/Scrapbox情報整理術-倉下-忠憲/dp/4863542526)

# Scrapboxによる国際会論文共有のメリット/デメリット

### メリット1. 検索機能が使いやすい！
上部の窓へクエリを入力、瞬時に結果が取得可能

![1.png](https://qiita-image-store.s3.amazonaws.com/0/264359/780f8723-6958-199d-6d3d-9ebf94a82039.png)

### メリット2. タグ機能のにより、同一著者の文献をブラウジング可能！
著者以外にも、セッションやキーワードでタグ付けすることによりさらに効果的なブラウジングも可能

![2.png](https://qiita-image-store.s3.amazonaws.com/0/264359/1db7a938-ed97-125a-a55d-b0d10ece6b47.png)

### メリット3. 研究チームでの共有がしやすい！
共同編集機能を利用して、各メンバーが読んだ論文や確認した発表についてコメントをすれば、意見の交換がスムーズに
※以下はScrapboxでの共同編集の例は[Scrapboxで共同日報を書く](https://razokulover.hateblo.jp/entry/2017/12/07/200728)で紹介されています。

### メリット4. 大学の研究室ではPrivate利用も無料！
「個人、家族、趣味のグループ、NPO、大学での授業・研究室・サークル、フリーランス、登記前の組織、企業の主催によらないイベント等で利用」は無料です。非公開、営利目的の場合は有料(1000円 / 月 × ユーザ数)



### デメリット1. 作るのが少しめんどくさいかも
ある程度スクレイピングできる人なら簡単だし、後々の利便性を考えると苦にならない程度だと思う

### デメリット2. 国際会議のページに依存している
現状、スクレイピングによる収集なので学会のページによりできること、できないことがあるかも

# 終わりに
本記事では、ScrapboxおよびScrapboxによる国際会議論文共有方法を紹介しました。自分が学生の時に、こんなツールで共有しながら学会に参加できれば便利だったなと思ったので紹介しました。

スクレイピングやScrapboxにインポートするデータの整形はpythonで行いましたが、たいしたことはしていない(めんどくさい)ので割愛しました。要望があれば、整理して追記しようかなと思います。
[Android]StatusBarを色を変えたい。

# Status Bar の色を変えたかった

やる必要があり、

#どうして

```java:MainActivity.java

 private void setStatusBar(){
        Window window = getWindow();
        // clear FLAG_TRANSLUCENT_STATUS flag:
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        // add FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS flag to the window
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        // finally change the color
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            window.setStatusBarColor(ContextCompat.getColor(this, android.R.color.black));
        }
    }

```
docker

```docker
# 事前にsrcディレクトリに適当にtest.txtを作成
# ホストユーザーのsrcディレクトリをubuntuイメージでマウント
$ docker run -it -v //c/Users/#HOSTUSER/src:/src ubuntu /bin/bash

# コンテナinするので確認
$ [container ID]# cd src
$ [container ID]:/src# ls
test.txt
```
Swift 4 電卓機能の連続計算(同じ四則計算のみ)

#Swift4 電卓アプリの連続計算(同じ四則計算のみ)

*Swiftで電卓アプリの連続計算を行う簡易的な方法の紹介をします。*

連続計算では、2回目以降演算子が押されるごとに計算を行い表示させる必要がある。また、1回目に計算した結果を保存しておいて、2回目に行う計算に利用する必要がある。今回は、number1に計算結果、number2に入力した数値を入れて計算する方法を紹介します。


####*足し算の連続計算の方法*
```Swift:ViewController.swift
   //足し算
 @IBAction func plus1() {
        if ope==1 {
            number1=number2+number1
            label.text1 = String(number1)
        }
        number2 = number1
        number1 = 0
        ope = 1
 }
```

```Swift:ViewController.swift
    //イコールの足し算
   if ope == 1 {
            number1 = number1+number2
            label.text1 = String(number1)
   }
```
上記コードの解説
プラスが押された時にもし2回目が押されたら、1回目の数値と2回目の数値の足し算を行い合計値を表示させるプログラムである。1回目のプラスが押された時は、if文を通さないが、2回目に押された場合は、1回目の計算を行い、計算を表示させる必要がある。



####*引き算の連続計算の方法*
```Swift:ViewController.swift
   //引き算
 @IBAction func minus1() {
        if ope==2 {
            number1=number2-number1
            label1.text = String(number1)
        }
        number2 = number1
        number1 = 0
        ope = 2

 }
```

```Swift:ViewController.swift
    //イコールの引き算
        else if ope == 2{
            number1 = number2-number1
            label1.text = String(number1)
        }
```
上記コードの解説
コードの内容は、プラスの時の処理とほとんど変わらないが、opeの数値を2に変えて、演算子をマイナスに変更する必要がある。特にマイナスの場合は、プラスとは違ってnumber2-number1にしないと計算が逆になって間違った答え出してしまうため注意が必要です。

##まとめ
足し算の結果をnumber1に移行させてnumber2に移し変えてnumber1を初期化する。2回目に四則演算子が押された時は合計値を計算しLabelに表示させています。現時点では、同じ演算子のみでしか連続計算をやり続けることはできない。（ただしこのif文の処理をelse ifでつなげれば簡単にすべての演算子で連続計算できるように変更もできます）かけ算と割り算も同様な手順で行うことが可能です。下記のGithubのリンクを貼ってあるので全コードをダウンロードできます。
[GithubダウンロードURL](https://github.com/tazima10827/Calculator_Swift4)
DirectX12 事始め コマンド周りの生成

今回は、コマンド周りの生成をやっていきます。
コマンドはアロケータがメモリ位置で、リストが実行処理一覧で、キューがリストの一覧を実行していく、
な考えで自分は実装しています。間違ってたらすみません。

それでは作っていこうと思います。
まずはコマンドを作る上での`基底クラス`を作ります。

```c++:Command.h
#include “Obj.h”
// デバイスクラスを参照
class Device;
class Command :
   public Obj
{
public:
   // コンストラクタ
   Command() {
   }
   // デストラクタ
   virtual ~Command() {
   }
protected:
   // デバイス
   Device* dev;
};
```

まずはコマンドキューを作ります。

```c++:Queue.h
#include “Command.h”
class Queue :
   public Command
{
public:
   // コンストラクタ
   Queue(Device* dev);
   // デストラクタ
   ~Queue();

   // コマンドキューの取得
   ID3D12CommandQueue* Get(void) const {
      return queue;
   }
private:
   // コマンドキューの生成
   HRESULT CreateQueue(void);

   // コマンドキュー
   ID3D12CommandQueue* queue;
};
```

```c++:Queue.cpp
#include “Queue.h”
#include “Device”

// コンストラクタ
Queue::Queue(Device* dev) :
   queue(nullptr)
{
   this->dev = dev;

   CreateQueue();
}
// デストラクタ
Queue::~Queue()
{
   Release(queue)
   delete dev;
}
// コマンドキューの生成
HRESULT Queue::CreateQueue(void)
{
   //コマンドキュー設定用構造体
   D3D12_COMMAND_QUEUE_DESC desc;
   desc.Flags    = D3D12_COMMAND_QUEUE_FLAG_NONE;
   desc.NodeMask = 0;
   desc.Priority = D3D12_COMMAND_QUEUE_PRIORITY_NORMAL
   desc.Type     = D3D12_COMMAND_LIST_TYPE_DIRECT;
   //コマンドキュー生成
   result = dev->Get()->CreateCommandQueue(&desc, IID_PPV_ARGS(&queue));

   return result;
}
```

次にコマンドアロケータとリストを作っていきます。
アロケータとリストを1:1の関係にし、リストが複数必要な場合でも管理させやすくなってます。

```c++:List.h
#include “Command.h”
class List :
   public Command
{
public:
   // コンストラクタ
   List(Device* dev);
   // デストラクタ
   ~List();
   // コマンドアロケータの取得
   ID3D12CommandAllocator* GetAllo(void) const {
      return allo;
   }
   // コマンドリストの取得
   ID3D12GraphicsCommandList* GetList(void) const {
      return list;
   }
private:
   // コマンドアロケータの生成
   HRESULT CreateAllo(void);
   // コマンドリストの生成
   HRESULT CreateList(void);

   // コマンドアロケータ
   ID3D12CommandAllocator* allo;
   // コマンドリスト
   ID3D12GraphicsCommandList* list;
};
```

```c++:List.cpp
#include “List.h”
#include “Device.h”

// コンストラクタ
List::List(Device* dev) :
   all(nullptr), list(nullptr)
{
   this->dev = dev;

   CreateAllo();
   CreateList();
}

// デストラクタ
List::~List()
{
   Release(list);
   Release(allo);
   delete dev;
}

// コマンドアロケータの生成
HRESULT List::CreateAllo(void)
{
   result = dev->Get()->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT,
   IID_POV_ARGS(&allo));
   return result;
}
// コマンドリストの生成
HRESULT List::CreateList(void)
{
   result = dev->Get()->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, 
   allo, nullptr, IID_PPV_ARGS(&list));

   //コマンドリストを一時クローズ
   list->Close();
   return result;
}
```

以上でコマンド周りの生成が完了しました。
ここまではすんなり行けるとおもいますが、次回からがややこしくなってきます。
次回はスワップチェインの生成をやっていこうと思います。
RMagick使っててHeroku db:migrateできなかったときの対処


[以前の記事](https://qiita.com/nojishio/items/da249191e9ed9465478b#%E3%81%BE%E3%81%A8%E3%82%81)で、herokuプッシュまでは無事できましたが、

`heroku run rake db:migrate`をしようとして発生したエラー。これググったときにすぐ分かりそうな記事が少ないような。。

```
Running: rake assets:precompile
remote:        /tmp/build_907cf6c8c9a568c0a7a61f789baceb04/vendor/bundle/ruby/2.4.0/gems/activesupport-5.0.1/lib/active_support/xml_mini.rb:51: warning: constant ::Fixnum is deprecated
remote:        /tmp/build_907cf6c8c9a568c0a7a61f789baceb04/vendor/bundle/ruby/2.4.0/gems/activesupport-5.0.1/lib/active_support/xml_mini.rb:52: warning: constant ::Bignum is deprecated
remote:        [DEPRECATION] requiring "RMagick" is deprecated. Use "rmagick" instead
remote:        /tmp/build_907cf6c8c9a568c0a7a61f789baceb04/vendor/bundle/ruby/2.4.0/gems/activesupport-5.0.1/lib/active_support/core_ext/numeric/conversions.rb:138: warning: constant ::Fixnum is deprecated
remote:        DEPRECATION WARNING: ｀config.serve_static_files｀ is deprecated and will be removed in Rails 5.1.
remote:        Please use ｀config.public_file_server.enabled = true｀ instead.
remote:         (called from block in <top (required)> at /tmp/build_907cf6c8c9a568c0a7a61f789baceb04/config/environments/production.rb:25)
```

<br>
**作業環境**  

* Rails　5.0.1
* Ruby　2.5.0
* mysql2　0.4.10　(ローカル環境)　


# エラー：[DEPRECATION] requiring "RMagick" is deprecated. Use "rmagick" instead

いろいろ書いてあるんだけど、どうやらここらしい。

```
[DEPRECATION] requiring "RMagick" is deprecated. Use "rmagick" instead
```
>require: 'RMagick'があると関係するライブラリが更新されないっぽい。
[プロダクトの１周年を記念してrubyとRails最新版に追っついた。](https://qiita.com/soigy/items/9dcd93c8c99ec4a3017f#cap%E3%81%A7%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%99%E3%82%8B%E3%81%A8-deprecation-requiring-rmagick-is-deprecated-use-rmagick-instead-%E3%81%A8%E3%81%8B%E3%81%BB%E3%81%96%E3%81%8F%E3%81%AE%E3%81%AA%E3%82%93%E3%81%A8%E3%81%8B%E3%81%97%E3%81%9F%E3%81%84%E3%83%9E%E3%82%B8%E3%81%A7)


# 対処：Gemfileのrequire以降を削除
 
ということで、ここの記述を

```r:Gemfile
gem 'rmagick', require: 'RMagick'
```
以下のように書き直す。

```r:Gemfile
gem 'rmagick'
```

これで`bundle install`

これで再度herokuにプッシュまで行う  
`git add .`  
`git commit -m "コメント"`    
`git push heroku master` 　　

`heroku run rake db:migrate`　　**これで成功！！**
`heroku open`


# DEPRECATION WARNING: ｀config.serve_static_files｀ is deprecated and will be removed in Rails 5.1.はエラーでなくてただの警告のようだ

ちなみにこの部分はエラーじゃないみたいでした。
>rails5.1で使えなくなる機能なので今のうちに使わないようにした方がいいよという警告です。

>```
DEPRECATION WARNING: `config.serve_static_files` is deprecated and will be removed in Rails 5.1.
Please use `config.public_file_server.enabled = true` instead.
```
<https://teratail.com/questions/60051>

<br>

Hatenaでもエラー備忘録書いてます。
[エラーは食べもの。](http://nojishio-notes.hatenablog.com/archive/category/%E3%82%A8%E3%83%A9%E3%83%BC%E5%82%99%E5%BF%98%E9%8C%B2)

Qiitaでも記事増やしていきたいです。
ここまで読んでくださり、ありがとうございました^^
node から pythonを実行して標準出力に表示

```javascript
const spawn = require('child_process').spawn;
const ls = spawn(pythonPath, ['python', OPTION1, OPTION2, ... ], { stdio: 'inherit' })
ls.stdout.on('data', function(data){
    console.log(data.toString());
});
ls.stderr.on('data', function (data) {
    console.log(data.toString());
});
ls.on('exit', function(data){
    console.log(data.toString());
});
ls.on('error', function (err) {
    console.log(err);
});
```
RustでOSを作るときに便利そうな情報(まとめ中)

# はじめに
OSを自作するにあたって、C言語でできてたけどRustでどーやるの？系の情報を載せていきたい。
大本にしている情報が消えてしまうこともありそうなので
部分的に引用してくる。

# 構造体のメモリレイアウト系
[Rustの構造体メモリレイアウト | ryocheck.blog](https://ryochack.hatenablog.com/entry/2018/03/23/184943)
からコードを引用

### 要約すると
```rs
struct S{
    int32:i32,
    int16:i16,
    int8:i8,
    uint32:u32
}
```

この構造体があった時

* デフォルト  
 メモリ上ではパディングを入れつつ、最小限の大きさに構造体のメンバを詰めていって最適化する。
* repr(C)  
 メンバの順番はメモリ上でもそのままでパディングを入れていく（C言語から触るときそのまま触れて便利）
* repr(packed)  
 パディングを入れないでとにかく詰めていく（pragma pack(1)と同じ感じ）

---

# 特定のポインタを任意の型のスライスとして扱う
[Function core::slice::from_raw_parts](https://doc.rust-lang.org/core/slice/fn.from_raw_parts.html)
メモリ管理機能を作るときに、そもそも管理してないメモリに対してmallocとかできないから自力で手動mallocする必要がある。
例えば、UEFIの場合はメモリマップをとって、任意の空き部分に管理領域（配列やリンクリストの構造体の集合）を割り当てるとかしたい。

### 要約

```rs
use core::slice;
struct Sample{
    hoge:u32,
    fuga:u16,
}
let ptr = 0x1234 as *const Sample; // 何型？
let amt = 10; // 個数
// Sample構造体の要素10個のスライスができる。
let slice = unsafe{ slice::from_raw_parts(ptr, amt) };

```

# メモリ管理(ページメモリアロケータ・デアロケータ)
自分で作ってみたもの。詳細は↓
[はりぼてOSのメモリアロケータのRust移植+改良版](https://qiita.com/segfo/items/8a4e7c2186dcf09fed02)
GitHubは[こちら](https://github.com/segfo/page_allocator)

使い方は上記の記事に記載しているのでそちらを。


# 参考・引用元
[Rustの構造体メモリレイアウト | ryocheck.blog](https://ryochack.hatenablog.com/entry/2018/03/23/184943)
[Function core::slice::from_raw_parts](https://doc.rust-lang.org/core/slice/fn.from_raw_parts.html)
モバイルバッテリー

Raspberry Pi3用に購入した [Anker PowerCore 20100](https://www.amazon.co.jp/gp/product/B011TQQ9RG)は、残念ながら「給電しながらの充電」 (パススルーというらしい)に対応しておらず、給電中でも充電されると給電側がOffになってしまう残念仕様でした。
5V 2.4AはOKのようで、Raspberry Pi3のbootも問題なし。

[RAVPower 20000mAh](https://www.amazon.co.jp/dp/B076KMMZPH)は、パススルーがイケるらしいのだが...
巨大ロジッククラスのリファクタリングをしてみた

# とある巨大ロジッククラスを抱えるAPIをリファクタリングした

## 前提：APIの処理概要
- DBからデータA、Bを取得する
- 分類a,b,cごとに処理が異なる箇所（ロジック①）がある
- 分類a,b,cはAPIのパラメタで特定できる
- データABの値をもとに計算ロジック②、③を行う
- 計算結果をDBに登録する

（本当はループ処理とかたくさんあるけど割愛）

## 変更前
![before.PNG](https://qiita-image-store.s3.amazonaws.com/0/120823/73bba519-1e62-4885-bf04-274f54364dad.png)

## 問題点
- メイン処理がフローとロジックをつめこみすぎている。可読性も最悪
- 全体のフローを追おうとするとAPI→メイン処理といってメイン処理の巨大ソースを上から下まで見ないといけなくなる
- APIとメイン処理の役割分担がちょっと意味不明すぎる
- ロジック①はメイン処理を継承している。APIの最初の方に分類判定（abcのクラス取得）を行っている

## 解決策
- 呼び出し階層を低層化する
  - APIとメイン処理は一緒にしてロジックの呼び出し元を一本にする
  - フローはAPIクラスを見るだけでわかるようにする
- 処理のまとまりごとにクラス化する
 - ロジックに使うデータ取得とか加工をパラメタ作成クラスとして切り出す

## 変更後
![after.PNG](https://qiita-image-store.s3.amazonaws.com/0/120823/3b2542e0-415e-cb46-fb6f-667642f17118.png)

## 良くなった点
- フローはAPIクラスを見るだけでわかる
- 処理内容はAPIクラスが呼んでいるそれぞれのクラスを見ればよい
- 実装内容はそれぞれのロジッククラスを見れば良いのでわかりやすい

## そもそもどうしてこうなったのか（予想）
- もともとかなり複雑な計算処理が必要で複雑なAPIだった
- 追加要件が発生した時に全体最適を考えずにそのままメイン処理に実装した
- 稼働歴が長くなった結果こうなることはよくある。。。

## 感想
- リファクタリングたのしいけどあるべきを探すのは難しい
- 自分が最初に見たときに困ったこと、わかりにくかったことをヒントにするとよい
    - 私の場合はとにかくフローを追うのが大変だった
- もっとよくできるかもしれないけど誰か教えて
- 少なくともフローは見やすくなったと思う。。

## 参考文献（今回参考にしたわけじゃないけど）
リーダブルコード―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice) 
http://amzn.asia/3n7Wss0
新装版 リファクタリング―既存のコードを安全に改善する― (OBJECT TECHNOLOGY SERIES) 
http://amzn.asia/cAMqZdR

## シーケンス図について
boostnoteでかきました。便利ですね！
DjangoのLoginRequiredMixinについて

# Abstract 
djangoのauth関連を書くことが多くて、戸惑うことが多い。
Userにログインを促すためには、DjangoではLoginRequiredMixinを使う必要がある。
適当に継承していたら詰まったので残しておく。

# Prerequisite
OS: macOS
Python: 3.6.4
Django: 2.1

# Situation
ユーザーがindex.htmlにアクセスした時に、user.is_authenticated == Trueになっていなければログイン画面に遷移するという処理を書きたい時に、私は以下のように書いていました。

```python
from django.views.generic import TemplateView 
from django.contrib.auth.mixins import LoginRequiredMixin

# このViewがうまく動いてくれない
class ViewA(TemplateView, LoginRequiredMixin):
    template_name = 'index.html'
    login_url = '/login/'

```

# Conclusion

解決策としては、継承の順番を変更すれば良いでした。

```python
from django.views.generic import TemplateView 
from django.contrib.auth.mixins import LoginRequiredMixin

class ViewB(LoginRequiredMixin, TemplateView):
    template_name = 'index.html'
    login_url = '/login/'

```

そうすると、index.htmlにアクセスした時に、loginに飛ぶことになります。多重継承の問題っぽいのでわかったら追記します（もしくは詳しい方教えてください）
Docker for Mac でさくっと環境を構築する

## 目的

あの言語を触ってみたいなー、といった時にとりあえず実行できる環境を構築する。


## Docker for Macのインストール
https://www.docker.com/docker-mac
↑からダウンロード・インストール。

## Kitematicのインストール
Kitematicとは、DockerをGUIで操作するツールのこと。

+ Dockerをインストールした後、タスクバーに表示されるDockerのクジラアイコンをクリック。
+ 「Kitematic」を選択。ダウンロードサイトに飛ぶ。
+ Appファイルをダウンロードしてアプリケーションフォルダに入れる。

（公式からはDocker　Toolbox対応版しかダウンロードできないみたい）

## Boxをダウンロード
+ Kitematicを開くと様々なBoxが表示されている。
+ 必要なBoxをダウンロード。

## ファイル共有の設定
+ `docker image list` でダウンロードしたイメージの名前を確認。
+ `docker run -it -v ローカルのパス:コンテナのパス image名`でVolumeの設定を行う。
+ 例: `docker run -v /user/docker/shared:/shared hogeimage`
TouchDesignerで相対的に動かしたい

TouchDesignerの小ネタです。

今の位置から毎フレーム2ずつ右に動かしたい、というゲームっぽいものを作りたいときによくやるあれ。
TouchDesignerでPython使わずにどうやるか、調べてもよくわからなかったので作ってみました。

オペレータの接続図がこれ。
![touchCapture.png](https://qiita-image-store.s3.amazonaws.com/0/16457/d1bcf68b-c39c-ef28-8696-3080132a781b.png)

FeedbackCHOPのところが変なつなぎ方になってますが、これで一応できました。
この画面だと、毎フレーム xを0.001、yを-0.001ずつ変化させるようになってます。

どこに需要があるかわかりませんが、 ↓にファイルアップしてみたので、何かに使えそうだったら使ってください。
[→simpleRelativeMoving.toe] (https://drive.google.com/file/d/18E7GrueqnZJenCRoko1JeZyqStxFgEPY/view?usp=sharing)

応用すればこういうのもできます。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">TouchDesignerはグワッと座標を動かすのは得意だけど、毎フレーム指定量ずつ動かすのは苦手な印象。<br>なんとかそれっぽいものができたので、キャラクターがキーボード操作で左右移動とジャンプするようにしてみたけど苦労した...。<a href="https://twitter.com/hashtag/touchdesigner?src=hash&amp;ref_src=twsrc%5Etfw">#touchdesigner</a> <a href="https://t.co/5AkHIow3Ti">pic.twitter.com/5AkHIow3Ti</a></p>&mdash; foka (@foka22ok) <a href="https://twitter.com/foka22ok/status/1026822634724446209?ref_src=twsrc%5Etfw">2018年8月7日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


でも、応用までやってみて思ったけど、必要以上に苦労したので、こういうのは素直にUnity等で普通に作った方が早いですね。
seed-fuのfixtureをフォルダ分けしたくなって

Railsのデータベースに初期データを投入するのに`seed-fu`を使っていますが、書き込むものが多くなって悩みも出てきました。

# `seed-fu`とは

詳しくは[別な人が書いてくれています](https://qiita.com/ko2ic/items/be96e450a33d631e0059)が、データベースの初期値投入を、単に機械的に流すだけでなくて、既存のテーブルと照合しつつ進めていくような仕組みとなっています。

# 投入するものが増えてきて

マスターとしてデータベースにあれば外部キーをかけられるという事情も手伝って、気がつけば`seed-fu`で投入する先のモデルが数十個になっていました。そして、`fixture`をいくつかのファイルに分けて書いていたのですが、定義を探したり[^1]変更したりしようとする際に、目的のものがなかなか見つからない、という事態を招いてしまっていました。

で、1モデルにつき1ファイルに近いぐらいまで[^2]ファイルを分けてみようと考えたのですが、そのままフラットにファイルを置けば、やはりファイル数が多すぎて見通しが良くない状態となりそうです。

# 読み込み方法を調べてみた

ということで、[seed-fuのコードを追ってみた](https://github.com/mbleigh/seed-fu/blob/34c054c914858c3d7685f83d16dea5c0e2114561/lib/seed-fu/runner.rb#L66)ところ、ディレクトリリストは`Dir#[]`でファイルに展開していることが判明しました。ということで、グロブパターンとして`/**/`を入れれば、「指定のフォルダとそれ以下」を拾えそうです。

```config/initializers/seed-fu.rb
SeedFu.fixture_paths = [Rails.root.join('db', 'fixtures', '**')]
```

なお、デフォルトでは`db/fixtures/#{Rails.env}`以下を拾う設定が入っていますが、上のような設定をすればもちろん全フォルダが読み取られますので要注意です。

# 脚注

[^1]: Rails内部にブラウジング機能を実装してしまうのもありかなと考えています。
[^2]: 外部キーがかかっているので順番があるものなど、一部は切り分けが不適当な箇所もありそうです。
rbenv: rails: command not found

# 問題
Rails のバージョンがローカル環境と違かったのでエラーがでた。

```console
$ rails -v
rbenv: rails: command not found
The 'rails' command exists in these Ruby versions:
  2.5.0
```
# 解決策
 ruby 2.5.0のrails ならあるよってことかな？ひとまずRails をインストールします。

`$ gem install rails `

終わったと思っていたら、

```console
$ rails --version
Could not find rake-12.3.1 in any of the sources
Run `bundle install` to install missing gems.
```
rakeがないからbundle install しろということなので、コマンドを実行します。

```console
$ bundle install
$ rails --version
Rails 5.2.0
 ```
無事に終わりました。
ちなみに：
> BundlerはRailsアプリケーションに必要となるGemパッケージの種類やバージョンを管理し、複数のPCで必要なGemパッケージをインストールする仕組みを提供してくれます。link:[Bundlerを使ったGemパッケージの管理](https://www.rubylife.jp/rails/ini/index2.html)
機械学習とは何ぞや

# はじめに
WEBや書籍で得た知識、または勉強した結果を自分勝手にまとめる。
書いてあることを理解できたとしても、自分のものになっているかは別問題なので、改めて考える方が良いと思っている。遠回りかもしれないけど。
自分の思考過程も含め書いてしまうので、他人が見ると分けわからない文章になっているかも。

# 機械学習とは・・・を考える
> 機械学習（きかいがくしゅう、英: machine learning）とは、人工知能における研究課題の一つで、人間が自然に行っている学習能力と同様の機能をコンピュータで実現しようとする技術・手法のことである。
（ウィキペディアの「機械学習」より抜粋）

と書いてある。なんとなく分かる気もするがもう少し教えてほしい。

学習能力とは何かと考えてみる。
学習能力とは、得た知識や情報、経験（練習）などを自分の能力として活用することができる力とでもいいましょうか・・・

例えば、計算ができる、読み書きができる、ボールを打てる、判別できる、予測・推定できる・・・ようになる。ですかねぇ。
確かに人間はいろいろできちゃいますね。

これらと同様なことをコンピュータにやらせてしまえというのが、機械学習なのかな？
ちょっと乱暴ですがｗ

コンピュータにやらせる場合、知識や情報はデータに置き換え、経験（練習）は反復検証して正解に近づける感じかな。

人間は反復検証しながら、何かしらの法則性や特徴を見つけるんでしょうね。

ふむふむ、自分なりにイメージできた。

# まとめ
機械学習とは、データの中から何かしらの法則性や特徴を見つけ出し、ある事柄を判別したり、予測や推定する能力をコンピュータにやらせること。かなｗ
たぶん、学習した範囲しか分らないのではないかと。

まとまった？

今日はここまでｗ

# P.S.
機械学習は、数学で処理するから、知識や情報はすべて数値に置き換えないと処理してくれないのだ！
最初は何でも処理してくれるんだと勝手に思っていましたｗ
でも、それが面白い！　勉強するにつれそれが分かってくる。楽しいぞ！
UnityのShaderとAssetBundleの謎な関係

# ShaderはAssetBundleに含まれるのか？本当のところどうなの？
例えばModelとMaterioalをAssetBundle化して配信したとします。
その時AssetBundleに含まれるのはShaderへの参照のみなのか、それとも？

# 実際に検証してみた
**※検証環境はUnity5.5系です**
**※アプリは検証対象のShaderをストリッピングしないようにしています。**
## 検証１
1. 既存のアプリにはない新規Shaderを適用したAssetBundleを配信してみる
 * この状態では正しくレンダリングされない
2. 新規Shaderを含んだアプリで同じAssetBundleを読み込んでみる
 * 想定した通りのレンダリング結果となる

AssetBundleに含まれるのは参照のようなもので、あくまでアプリ側にShaderが含まれている必要があるように思える。
## 検証２
1. 既存のShaderの処理本体（CGPROGRAM〜ENDCG）を書き換えたアプリで、以前作ったAssetBundleを読み込んでみる
 * 書き換えた通りにレンダリング結果がかわる 
 * また、この時新しいPropertyを追加していたとしても、そのPropertyにアクセスできる（そのままだとデフォルト値だけど）。

このパターンも検証１での結果と同じ結論になりそう。
# 検証３
1. 既存のShaderに対して、ZWriteやZTestなどの設定を書き換えて作ったアプリで、既存のAssetBundleを読み込んでみる。
 * **書き換える前のShaderと同じ動作をする！**

**なぜ！？**
Propertyの値やレンダリング順序に関しては、AssetBundleを作った時のMaterialのプロパティに含まれているため、
そこが参照されるのはわかる。

でも、ZWriteやZTestの変更が適用されないのはなんでだ？
もしやShaderのセッティング（Tagsとか）に関してはAssetBundleに含まれている！？
気のせい！？気のせいなの？
何かミスった？

これだとあとでShaderの実装をまとめて変更しようとした場合、内容によってはすでに配信しているAssetBundleが大量にあったら困っちゃう。

## 検証３のケースへの（とりあえず）対応
アプリの実行時に「Shader.Find(material.shader.name)」的なコードでShaderを再設定してあげると、正しく変更が適用されました。

# 結論
色々ググったりしてみたものの、結局のところAssetBundleにどこまでの情報が含まれているのかは謎。
試した範囲では参照を含んでいるっぽい挙動をしているけど、場合によって変な対応を強いられる。

うーん。。。何かAssetBundleを作るとき（あるいはプロジェクト）の設定によるとかあるのかなー。
本番のDBダンプして、そのバックアップファイルをローカルに持ってくる

#現場でやったことの備忘録

#DBをdumpとは
DBのバックアップを取るということ。
DBの中身をファイルに書き出す。

#①まずSSH接続
poderosaから本番サーバーに接続する。
EIPに接続し、秘密鍵認証で入った。

###補足
＊SSH：暗号や認証の技術を利用して、安全にリモートコンピュータと通信するためのプロトコル。

＊SSHの認証方式：***パスワード認証方式***と***公開鍵認証方式***がある

＊パスワード認証方式：パスワード認証方式は***デフォルトの認証方式***で、***ユーザー名とパスワード***でログインする方式。
ユーザー名とパスワードは***接続先OSのユーザーアカウントの情報***が使用される。

＊公開鍵認証方式：公開鍵認証方式は***公開鍵と秘密鍵***の２つの鍵(キーペア)を使用した接続方式。
サーバーに公開鍵、クライアントに秘密鍵を置いて使用する。
公開鍵認証を使うとパスワード入力なしでログインする事が可能になる。


＊EIP：Elastic IPアドレスは、***AWSに登録したアカウントに紐つけされるIPアドレス***。
IPアドレスは基本的に***パブリックIPアドレス***と***プライベートIPアドレス***の２つに分けることができ、パブリックIPアドレスはインターネットを通じて機器を利用する際に割り当てられるアドレスで、最もポピュラーなIPアドレスと言えます。
一方のプライベートIPアドレスはインターネットではなくローカルのネットワークでのみ割り当てられるIPアドレスで、インターネットからは遮断されたIPです。

#②DBをdump　
```
$mysqldump -u ユーザー名 -p -h ホスト名 DB名 > ファイル名
```
で、パスワード入力を求められたら入力（パスワードがなければ、コマンドの-pはいらない）
上記コマンドで、指定したDBから、バックファイルを「>」でファイルに書き込む。
＊オプション（-u:ユーザ名、　-p:パスワード, -h:ホスト名）はdatabase.ymlに書いてある。
＊msyqldump はリモート接続も出来るので、わざわざdbサーバーまで行く必要がなくなる。

#③WINSCPでファイルを安全に移動させる（本番⇨ローカルへ）
WINSCPにWEBサーバーを接続。
①で入ったのはWebサーバー（public）で、webサーバーからリモート接続してDBをdumpしてた感じ。
なので今回もWebサーバー（public）に接続。
＊接続するIP,秘密鍵認証を間違えないように

で、接続できたらドラッッグ&ドロップで本番からローカルへファイルを移す。

WINSCP:ローカルコンピューターとリモートコンピュータ間で安全にファイルをコピーできるオープンソースプログラム。

#ローカル⇨仮想環境へ
WINSCPで仮想環境に接続。＊IP、パスワード入れて接続
ドラッグ&ドロップでファイル移動。

#④リストア（バックアップファイルを復元ってこと）

```
mysql> create database DB名;　　⇦DB作成
mysql> show databases;　　　　　　　　　　　　　　⇦DBをできてるか確認
```

```
$mysql -u root DB名 < ファイル名    ←本番でdumpしたファイルの中身をDBに流す。矢印の向きに注意！
```


```config/database.yml 
 database: DB名     　←DBの向け先を指定（作成したやつ）
```

上記で本番DBでdump（バックアップ）したDBをローカルに持って来れます。
Multi-stage buildでDockerイメージのサイズを最適化

# はじめに

NodegitというgitのNodejsバインディングを使ってちょっとしたウェブアプリを作っていて、
プルリクごとにnow.shにアプリがデプロイされるようにしているのですが、
最近デプロイに失敗するようになりました :crying_cat_face: 

ログを見ると「イメージのサイズが100MiBを超えているよ！」と怒られていることがわかります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/87888/ee5911d1-4d50-3104-c956-bf106f34ec16.png)

一週間前まではイメージサイズが100MiB超えていたはず、なのにデプロイは成功していました。
そこでnow.shの運営元であるzeitのSlackチャンネルで聞いてみたところ、
「Multi-stage Buildを試してみるといいよ」と言われました。
たまたまその日[Google Cloud Platform Blog](https://cloudplatform.googleblog.com/2018/04/Kubernetes-best-practices-how-and-why-to-build-small-container-images.html)でMulti-stage Buildの話がされていたので、
試してみることにしました。

# Multi-stage Build (MSB)とは

Multi-stage Build (MSB)とはビルドしてできたバイナリが外部ライブラリにほとんど依存しない場合に有用なDockerの機能です。

通常バイナリをビルドする際は、

1. ビルドに必要なライブラリを入れる
2. ビルドしてバイナリを生成

のようなステップを踏みますが、ビルドにのみ必要なライブラリはバイナリ実行用のイメージに含める必要はないはずです。

なのでMSBでは

あるステージでバイナリをビルドして、別のステージにそのビルド結果をコピーします。
そうすることによってバイナリ実行に不要なデータを持たないイメージができます。

# MSBをつかってNodegitを含むイメージを小さく！
NodegitはNodejsのライブラリなのですが、内部ではlibgit2というC言語で書かれたライブラリを使っています。
なので`npm install` する前にlibgit2に必要な共有ライブラリをインストールしておかなければなりません。
その手間を省くためにいろんなライブラリが最初から入っているjessieイメージを使っていました。
が、jessieだと無駄なものも含まれているのでalpineイメージに必要なライブラリだけを入れるようにしました。

もともとのDockerfileはこんな感じでした。jessieにはnodegitに必要なものはすべて含まれているのですが、
その分無駄なものもはいってしまっているので、イメージサイズが大きくなっていました。

```Dockerfile:Dockerfile
FROM node:8.11.3
# jessieイメージを使っている
ENV NPM_VERSION 6.2.0
ENV APP_DIR /opt/wowgit
# now.shだとunsafe-permをtrueにしないとnpm installがうまくいかないよう...
RUN npm config set unsafe-perm true && npm i -g npm@${NPM_VERSION} && mkdir ${APP_DIR}
COPY . ${APP_DIR}/
WORKDIR ${APP_DIR}
RUN npm ci --production && npm run build
EXPOSE 3000
CMD ["npm", "start"]
```

改善後のDockerfileはこんな感じです。alpineイメージをベースにNodegitに必要なライブラリをインストールして、
`npm ci`でnodegitなどをインストールしてます。そして、MSBを使ってnodegitの呼び出しに必要な共有ライブラリをコピーしています。

```Dockerfile:Dockerfile
FROM node:8.11.3-alpine AS dev
ENV NPM_VERSION 6.3.0
ENV APP_DIR /opt/wowgit

RUN apk --no-cache add --virtual .build-deps g++ make python && \
    apk --no-cache add libressl-dev curl-dev && \
    ln -s /usr/lib/libcurl.so.4 /usr/lib/libcurl-gnutls.so.4 && \
    npm config set unsafe-perm true && \
    npm i -g npm@${NPM_VERSION} && \
    mkdir ${APP_DIR}

COPY . ${APP_DIR}/
WORKDIR ${APP_DIR}
RUN npm ci --production && npm run build
EXPOSE 3000


FROM node:8.11.3-alpine AS production

ENV NPM_VERSION 6.3.0
ENV APP_DIR /opt/wowgit

COPY --from=dev ${APP_DIR} ${APP_DIR}
WORKDIR ${APP_DIR}
# nodegitに必要な共有ライブラリのみをコピー
COPY --from=dev /usr/lib/libcurl-gnutls.so.4 /usr/lib
COPY --from=dev /usr/lib/libssh2.so.1 /usr/lib

RUN npm config set unsafe-perm true && \
    npm i -g npm@${NPM_VERSION}

EXPOSE 3000
CMD ["npm", "start"]
```

# 結果
181.6M→**69.8M**と110M近くイメージサイズを削減できました！
ちなみに、docker imagesでサイズをみると削減後も普通に250M以上ありました。
node_modulesが大半を占めているようだったので、now.shはnode_modulesはカウントしない仕様なんですかね。

# まとめ
イメージサイズに困ったら、まずはMulti-stage Buildをお試しあれ！
第三回　Programing夏期講座　PHPクラスとインスタンスについて

#オブジェクト指向とは
モノを組み立てるように表現して、コンピューターに動作をさせる。

##車を作る

###クラス
車を作る際に、タイヤやハンドルといった各部品が必要になってくる。
例えば、タイヤ。タイヤを作る際には下記のような様々な要素が必要になってくる。

```php
class Tire{　←①
  形の関数　←②
　色の関数
　素材の関数
　性能の関数
}
```
①クラスの一文字目は大文字
②関数はクラス内ではメソッドと呼ばれる
③変数はクラス内ではプロパティと呼ばれる

####クラスの継承
上記の`class Tire`で定義したタイヤに、新しい要素を付け加える際にクラスの継承を用いる。

```php
class Goodride Tire extends Tire{
　＋重さの関数
}
```

###インスタンス
タイヤをより具体的にしていく情報。

```php
class Tire{
 public $weight;
 public $size;

 public function _construct($weight,$size){
 $weight = $this->weight;
 $size = $this->size;
}

 public function tireData($weight,$size){
 echo "重さは".$weight."kgです。　大きさは".$size."mです。"
}
}

///↓インスタンス

$tire = new Tire(); テンプレのコピー
$tire -> tireData(15,20);　メソッド（具体的な情報）
```

▶.は文字の結合を意味

**インスタンスを作った際に実行されるのがconstruct関数**

##授業内課題

```php
<?php
class Body{
 public $height;
 public $weight;

 public function _constract($height,$weight){
   $height = $this -> height;
   $weight = $this -> weight;
 }
 public function bodyData($height,$weight){
   echo "未来電子君の身長は".$height."cmで、体重は".$weight."です。";
 }

}

$Mirai = new Body();

$Mirai ->bodyData(160,60);


?>

```

PSR-1とは？
constructの必要性は？
Angular Web Development: Why build a Single Page Application?

Single Page Application provides enhanced user experience. Developers worldwide are embracing Angular web development to build single page applications for companies.
https://blog.thirdrocktechkno.com/angular-web-development-why-build-a-single-page-application-24568cd724aa

![Angularjs.png](https://qiita-image-store.s3.amazonaws.com/0/276950/b03dd993-dd3b-1bed-64ab-71ec5d00520e.png)
アメリカがAI医療機器に世界初の認可を与えた件

2018/4/11にFDA(アメリカ食品医薬品局)がIDx社のIDx-DRというAIで糖尿病網膜症の診断を行う医療機器に認可を与えました。

FDA News
https://www.fda.gov/newsevents/newsroom/pressannouncements/ucm604357.htm
IDx-DR
https://www.eyediagnosis.net/idx-dr

通常は高度な専門知識を持った医師が診断を行いますが、AIが医師の代替として診断を行う時代がついにアメリカから始まりました。

臨床試験で900人分の眼底画像を使用して、90%弱の精度で判定ができたようです。今後はアルゴリズムの変更、画像の高精細化で精度はさらに改善されていくのでしょう。

CT、MRIなどでも同様にAI診断の研究開発は行われているでしょうから、そう遠くない未来には様々な病気をAIが判定する日が来るのでしょうね。
solidity-proxyでcontractコードをupgradeする

#はじめに
コントラクトコードは一度ブロックチェーンにdeployされると変更ができません。
サービスのアップデートと共に、機能追加やバグの改修などの必要性に迫られた場合、
コントラクトを新しく作り直し、向き先を変更する必要がありますが、
solidity-proxyというproxyコントラクトを間に挟むことで、update可能なコントラクトを作ることができます。

#イメージ

![proxy.png](https://qiita-image-store.s3.amazonaws.com/0/43766/9d11e012-1686-3c0a-0cb0-bc7e3b732f13.png)


クライアントは、proxyのcontractに向けて、メソッドをcallしますが、実際には、deleatecallで、
ロジックを記述したコントラクトを制御しています。
このため、クライアントの向き先は常にproxy contractをcallし、proxyの向き先をver.1からvers.2に変更することで、新しいロジックをclientに提供することができます。

#実践
remixを用いて、これらの一連の流れを確認することができます。

使用するコードはこちらから利用させていただきました。
https://hackernoon.com/ethereum-smart-contract-upgradeability-hands-on-ceaf98be070f

一応全体抜き出したもの。
https://gist.github.com/oggata/02a86fd43a45ddc4e5bf4df103f7393f

###1.TokenVersion1をdeployします.
<img width="402" alt="スクリーンショット 2018-08-07 21.20.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/43766/e57bc064-a405-c16a-d609-c797e6d484b4.png">

###2.TokenVersion2をdeployします
<img width="407" alt="スクリーンショット 2018-08-07 21.20.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/43766/0771a977-0329-12d5-0ecf-c0aefc998631.png">

###3.Proxyをdeployして、TokenVersion1のcontractAddressをupgradeToに入れて実行します.
<img width="407" alt="スクリーンショット 2018-08-07 21.20.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/43766/505b34f7-83bc-aad3-b701-5275d3e78b31.png">


###4.ProxyのcontractAddressをAtAddressに入力して、TokenVersion1を読み込みます。
これでProxyとTokenVersion1が紐づけられます.
<img width="424" alt="スクリーンショット 2018-08-07 21.22.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/43766/39916161-9209-1c68-a358-8b5d48e47ed6.png">

###5.mintにアドレス、100と入力して、balanceOfを見ると200となっています.
(元の解説では、これはVersion1のバグと言う設定で、本来は100入力すると100と出てくるのが正しく、Version2でこれを改修すると言う流れになっています。)
<img width="416" alt="スクリーンショット 2018-08-07 21.24.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/43766/1fedc138-b327-b0f9-7352-018cc8be054e.png">

###6.次に、ProxyのupgradeToに、TokenVersion2のcontractaddressを入力します。
implementationを見ると、TokenVersion1のコントラクトアドレスから、2のアドレスに変わっていることがわかります。
<img width="410" alt="スクリーンショット 2018-08-07 21.26.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/43766/efc616d5-9b3a-b34f-4dac-9cf1558f51d7.png">

###7.proxyのcontractaddressをTokenVersion2で実行します

<img width="428" alt="スクリーンショット 2018-08-07 21.28.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/43766/66ad63b0-eaf1-c45a-5bc0-57e89f1cac75.png">

###8.balanceOfをすると、先ほどVersion1で実行した200が残高として残っています。
<img width="405" alt="スクリーンショット 2018-08-07 21.28.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/43766/9e2c44e3-729d-b277-753c-004a67a889ae.png">

###9.アドレス、30とmintに入力して実行すると、残高に30足されています。
これはVersion1のバグで、入力値が2倍に増えていたと言うバグが修正され、入力値がそのままaddされると言う正常の挙動に戻っていることを意味しています。
<img width="406" alt="スクリーンショット 2018-08-07 21.30.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/43766/6a12ed11-8fea-46c8-0bd7-42396b858501.png">

#おしまい

#参考

「Ethereum Smart Contract Upgradeability: Hands-On」
https://hackernoon.com/ethereum-smart-contract-upgradeability-hands-on-ceaf98be070f

「アップグレード可能なスマートコントラクトを実現する具体的なアプローチ」
https://zoom-blc.com/how-to-develop-upgradable-contracts
シェルスクリプトで簡単なオプション解析

自分自身のメモ用に、シェルスクリプトでオプションをパースするコードをメモにします。

```shell:option.sh
#!/bin/bash

parse_option () {
  if [ $1 = "h" ];then
    echo "Usage: option.sh [OPTIONS] ..."
    echo
    echo "Options:"
    echo "  -h"
    echo "  -a"
    echo "  -b"
    echo "  -c"
    echo
    exit 1
  fi
  if [ $1 = "a" ];then
    echo "a option is ${@:2:($#-1)}"
  fi
  if [ $1 = "b" ];then
    echo "b option is ${@:2:($#-1)}"
  fi
  if [ $1 = "c" ];then
    echo "c option is ${@:2:($#-1)}"
  fi
}

commands=$@

echo $commands | tr '-' '\n' | sed '/^$/d' | while read line
do 
parse_option $line
done
```

ここにコマンドで`bash option.sh -a hoge -c fuga -b piyo`ってうつと

```
a option is hoge
c option is fuga
b option is piyo
```

ってなります。

#簡単な説明
commandsに引数全て渡して、オプションはハイフンから始まる事を使って、trでハイフンを改行に変えてます。
一番最初のオプションのハイフンも改行コードになって、空行が上に入ってしまうのでsedで除去しています。

その結果をwhileで改行毎にループ処理をして、parse_optionが呼ばれます。引数は１行毎に与えられます

ハイフンで区切ってるので、関数に渡る一番最初の引数はオプション名になります。その後ろはオプションに渡す引数になるので`${@:2:($#-1)}`で2つ目以降の引数を受け取ります。

#出来ること
オプションの複数指定
オプションのあと付けc
parse_option内で`${@:2:($#-1)}`を`$2`にすることでイチオプションに対して値を一つのみに出来る。`${@:2:($#-1)}`の使いみちは`-name alice bob carol`のようなとき。

#出来ないこと
`-ab`のようなオプションの併記
`--A`のようなロングオプション


#もっと厳密にオプションをパースしたい場合
こちらの記事を参照
[bash によるオプション解析](https://qiita.com/b4b4r07/items/dcd6be0bb9c9185475bb)
Linux Ubuntu — apt-get update / upgrade の違い


## `$ apt-get update`

インストール可能なパッケージの「一覧」を更新する。
実際のパッケージのインストール、アップグレードなどはおこなわない。

## `$ apt-get upgrade`

インストール済みのパッケージ更新をおこない、新しいバージョンにアップグレードする。
「有効なパッケージ一覧」を元に実行されるので、 `apt-get update` と組み合わせて使う必要がある。

## HELP

```
  update - Retrieve new lists of packages
  upgrade - Perform an upgrade
```

## 関連

- [What is the difference between apt-get update and upgrade? - Ask Ubuntu](https://askubuntu.com/questions/94102/what-is-the-difference-between-apt-get-update-and-upgrade)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Django+Heroku+Windowsでﾃﾞﾌﾟﾛｲ時にハマッたこと

#見出し
Djangoを用いてPythonﾍﾞｰｽのWEBｱﾌﾟﾘｹｰｼｮﾝを作るにあたり、ハマッたことを備忘録
的に書きます。

環境は以下です。

- Windows8
- Python 3.6.5
- virtualenv 16.0.0
- Django 2.1

また、アプリ構成は以下の通りです。

```Folder&Files
myProject
├── venv
├── Procfile
├── db.sqlite3
├── manage.py
├── myDjango
│   ├──__pycache__
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── myapp
├── templates
├── static
├── requirements.txt
├── Pipfile
├── Pipfile.lock
├── requirements.txt
├── .gitignore
└── runtime.txt
```

#ハマッたこと
gitを用いて、以下を実施しheroku openすると、Errorになりました。

```ｺﾏﾝﾄﾞ
git add .
git commit 
git push heroku master
```

ここまではError無しで行けますが、heroku openで以下のErrorとなりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/274765/a811abc9-567f-fa4a-f606-6597d3ff84fb.png)

Windowのﾒｯｾｰｼﾞに従い、以下からログを見ると、

```Command
heroku logs
```

以下のエラーが出てました。

```Command
ModuleNotFoundError: No module named 'dj_static'
```

どうやら、heroku上でdj_staticを見つけられていません。

実際、

```Command
(venv) C:\Users\Owner\Desktop\Django\myProject2>heroku run bash
Running bash on ⬢ s-worldcup... up, run.9708 (Free)
~ $ python
Python 3.6.5 (default, May  4 2018, 18:15:35)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import dj_static
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'dj_static'
```

コマンドから、heroku上のPython対話モードを起動しても、dj_staticを見つけられていません。
このdj_staticは、myDjango-wsgi.pyにて参照されています。

```wsgi.py
import os

from dj_static import Cling
from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myDjango.settings")

application = Cling(get_wsgi_application())

application = get_wsgi_application()
```

そこで、wsgi.pyを以下のように修正しました。

```wsgi.py
import os

#from dj_static import Cling
from django.core.wsgi import get_wsgi_application
from whitenoise.django import DjangoWhiteNoise

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myDjango.settings")

#application = Cling(get_wsgi_application())

application = get_wsgi_application()
application = DjangoWhiteNoise(application)
```

これは、[[Python]HerokuでDjangoアプリケーション開発を始めるためのテンプレート](http://dackdive.hateblo.jp/entry/2015/12/22/110707)を参考にさせていただきました。

すると、問題なくアプリケーションを表示させられることができました。