OmniAICreator/Qiita-1.07M huggingface dataset:
fishを使ってAWS ECRのリポジトリにImageをPushする方法

まず初めにレジストリに対する Docker クライアントの認証に使用するログインコマンドをAWS CLIを使って取得する必要があります。

AWSのサンプルコマンドは下記のようになっています。

```
$(aws ecr get-login --no-include-email --region ap-northeast-1)
```

しかしfishの場合は

```
fish: Command substitutions not allowed
```
と怒られてしまいますので、

```
aws ecr get-login --no-include-email --region ap-northeast-1 | fish
```

としてあげれば、うまくいきます。
evernoteAPIを使う

CodeZineさんの特集記事[Pythonで使って覚えるEvernote API](https://codezine.jp/article/detail/10055)を参考にまずはevernoteのトークンを取得する。

CodeZineさんの上記の記事では、ここはログインしないと見えないようになっているので省略。

amaconda promptでpyhon2.7環境に移りインストールする。

```
(base) C:\(省略)>activate py27

(py27) C:\(省略)>
```

プロンプトの前が(base)から(py27)に変わったのでpython2.7環境に移動できたようだ。

```
pip install evernote==1.25.2
```
を入力しインストール

```
(py27) C:\(省略)>pip install evernote==1.25.2
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support
Collecting evernote==1.25.2
  Downloading https://files.pythonhosted.org/packages/3b/8e/dba34913e7dbccd868cdf228c514f97ad97d4618994f0c5dd456496ae81/evernote-1.25.2.tar.gz (141kB)
     |################################| 143kB 616kB/s
Collecting oauth2 (from evernote==1.25.2)
  Downloading https://files.pythonhosted.org/packages/a0/6f/86db603912ecd0419af952c38bc08928886cf0e34c723481fa7db98b4b5/oauth2-1.9.0.post1-py2.py3-none-any.whl
Collecting httplib2 (from oauth2->evernote==1.25.2)
  Downloading https://files.pythonhosted.org/packages/ce/2e/87461bfbb7e561203b759b3f7f639e214226604372830d00a8279960ae1/httplib2-0.14.0.tar.gz (219kB)
     |################################| 225kB 3.7MB/s
Building wheels for collected packages: evernote, httplib2
  Building wheel for evernote (setup.py) ... done
  Created wheel for evernote: filename=evernote-1.25.2-cp27-none-any.whl size=163699 sha256=6007855c5731687c940af3fad4d913772d8bd27df21d9c0eb248ce198f60b0ba
  Stored in directory: C:\(省略)\AppData\Local\pip\Cache\wheels\50\9c\ae\6b0b1a0b3b21e23379de28e5a6c78da4681d9b56b5e111466
  Building wheel for httplib2 (setup.py) ... done
  Created wheel for httplib2: filename=httplib2-0.14.0-cp27-none-any.whl size=95106 sha256=d7dddbccaec305b1154b087771e94211ec36a9fa96e228750bdfc54022bdf6b
  Stored in directory: C:\(省略)\AppData\Local\pip\Cache\wheels\51\ab\65\f318b427101923cf7d7c178ac76a8ea4d6e6271fe9f5ba488
Successfully built evernote httplib2
Installing collected packages: httplib2, oauth2, evernote
Successfully installed evernote-1.25.2 httplib2-0.14.0 oauth2-1.9.0.post1
```

一応インストールされたか確認してみる

```
pip list
```

```
(py27) C:\(省略)>pip list
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support
Package      Version
------------ -----------
certifi      2019.9.11
evernote     1.25.2
httplib2     0.14.0
oauth2       1.9.0.post1
pip          19.2.3
setuptools   41.4.0
wheel        0.33.6
wincertstore 0.2

```
2行目にevernoteがあるのでインストールされているようだ。
今日はここまで
初心者によるプログラミング学習ログ 128日目

# 100日チャレンジの128日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

128日目は、

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>128日目<br><br>メンターさんのjavascript課題のみ<br><br>webデザインやる曜日だったんですけど、気分がのらなくてコーディングのほうを選択。<br>あと、台風であんまり集中してできず<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a> <a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1183129452596695041?ref_src=twsrc%5Etfw">October 12, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

例の台風19号が心配で、それどころではなかったというday。
[Rust] Result<T, E> は IntoIterator

今日ハマって時間を無駄にしたこと: `Result<T, E>` は `IntoIterator` です. `.into_iter()` すると, `Ok(_)` なら 1 回だけ中身を返し, `Err(_)` なら何も返さないイテレータとして使えます.

[公式ドキュメント](https://doc.rust-lang.org/std/iter/trait.IntoIterator.html#impl-IntoIterator-35) からの例 (を改変した例). 例えばこのコードは 1 回だけ `5` を表示します.

```rust
fn main() {
    let iter: Result<i32, &str> = Ok(5);
    
    for x in iter {
        println!("{}", x);
    }
}
```

`Err(_)` にすると何も表示しません.

```rust
fn main() {
    let iter: Result<i32, &str> = Err("This is an error.");
    
    for x in iter {
        println!("{}", x);
    }
}
```

ちなみに `&Result<T, E>`, `Option<T>`, `&Option<T>`, `&mut Option<T>` も `IntoIterator` なので同じ使い方ができます. 

よく考えると, `Vec<T>` とか `HashMap<K, V, S>` が `IntoIterator` であるのと同じように, これらも中に要素を持つインスタンスですから `IntoIterator` であるのがある意味自然なのかもしれません. 

# 参考文献

- [std のドキュメント](https://doc.rust-lang.org/std/iter/trait.IntoIterator.html#impl-IntoIterator-35)

[Rustのイテレータの網羅的かつ大雑把な紹介](https://qiita.com/lo48576/items/34887794c146042aebf1) という記事でもこのことは言及されていました.
本番環境でpullしたらコンフリクト？解決法３パターン！【Please commit your changes or stash them before you merge】

#はじめに
本番環境で最新のmasterをpullしようとした際に、エラーが起きた時の対処方法をメモしておきます。
Gitの知識が浅いため、誤った認識の記述があればお知らせください。


#エラー文
SSHに接続して`git pull origin master`をすると

```irb
$ git pull origin master
From https://github.com/user-name/app-name
     * branch　     master       ->   FETCH_HEAD 
Updating e05c05f..050505
error: Your local changes to the following files would be overwritten by merge: 
         Gemfile.lock
         config/initializers/devise.rb
Please commit your changes or stash them before you merge.
Aborting
$ 
```
**「次のファイルに対するローカルの変更は、マージによって上書きされます」**
**「マージする前に変更をコミットするか、隠してください」**
とコンフリクトのエラー文。

# 前提
もちろん、思い当たるブランチや変更があればそちらの確認から。

- エディタで変更→マージ→ローカルのプルは正常にできる→本番環境でプルしてコンフリクトと言われる
- コミットしていない変更は無い状態なのに言われる

などの場合は参考にしてください。

# 対処①ファイルを一度削除する
gemfile.lockなどはバージョンやgem fileに変更があるたびに更新されるため、一度消してしまっても問題ないです。

```irb
# ファイルのあるディレクトリへ移動
$ rm Gemfile.lock
$ git pull origin master
```

#対処②スタッシュで一旦退避
とりあえずコンフリクトと指摘されたものをスタッシュしておき、反映させたい部分を確認することを優先。
マージされたものを本番環境にpullしたいだけなので、正直最新のものは表示できるようになる。
ただし、コンフリクトと言われている以上戻すと同じエラーがでる。

```irb
# 1) コンフり起こしてるファイルを一時退避
$ git stash
# 2) 退避したコミットしていないものが表示されるのでpullする
$ git pull origin master
# 3) スタッシュを戻す
$ git stash pop
```

#対処③強制的にマージする
リモートの最新状況に合わせに行くような強制マージなので、問題になることは無いはずです。
もちろん、pullしようとしていたmasterが正しい前提。

```irb
# 1) リモートの最新を取ってきておいて・・
$ git fetch origin master

# 2) masterを、リモート追跡のmasterに強制的に合わせる
$ git reset --hard origin/master
```

#おわり
使用するgitのコマンド自体はローカルと同じものなので、コマンド操作に慣れている方は問題ないかと思います。
本番環境で起きたこのコンフリクトのエラーはgemfile、gemfile.lockが中心でした。
ズンドコキヨシじゃなくて前前前世チェックしてみた

訓練校でJavaを学んでいるのでリストとか条件分岐の練習で作ってみた

```

import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;

public class zensecheck {
	public static void main(String[] args) {

		System.out.println("君の");

		//比較用のリスト
		String correctStr = "前前前世";
		//ランダムで文字を出力するリスト
		String[] words = {"前","世"};

		//listの初期化
		List<String> list = new LinkedList<>();

		Random r = new Random();

		//格納用の空の配列
		String str = "";
		String word = "";

		while(true) {

			//word前・世をランダムで格納
			word = words[r.nextInt(2)];
			System.out.println(word);
			list.add(word);

			//listの長さが4を超えたらremoveで０番目の要素を削除する
			if(list.size() > 4) {
				list.remove(0);
			}

			//strに直近4回分の前・世を格納
			str = list.stream().collect(Collectors.joining());

			//strとcorrectStrの中身が一緒なら歌詞を表示してループを抜ける
			if(str.equals(correctStr)) {
				System.out.println("から僕は君を探しはじめたよ");
				break;
			}
		}
	}
}

```

クラスでは微ウケでした
Laravel5.0のStorageでFTPを利用できるようにする

# エラーの発生原因と解消方法
レガシーなプロジェクトと戦っている際に遭遇したエラー。
5.1以降だと普通に使えてハマったので誰かの助けになれば…
## そのまま利用しようとすると発生するエラー
Laravel5.0で`Storage::disk('ftp')->files('/')`等を使用すると以下のエラーが発生する。

```
exception 'ErrorException' with message 'call_user_func_array() expects parameter 1 to be a valid callback, class 'Illuminate\Filesystem\FilesystemAdapter' does not have a
 method 'createFtpDriver'' in /sampleApp/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemManager.php:232
```

## エラー原因
Laravel5.0に同梱されている`League\FlySystem`はFTPに対応しているが、`Illumine/Filesystem`がFTPに対応していないのが原因。
※Laravel5.1からは対応している
[Laravel5.0 FilesystemManager APIDoc](https://laravel.com/api/5.0/Illuminate/Filesystem/FilesystemManager.html)
→`createFtpDriver`メソッドが無い
[Laravel5.1 FilesystemManager APIDoc](https://laravel.com/api/5.1/Illuminate/Filesystem/FilesystemManager.html)
→`createFtpDriver`メソッドが有る

## 解消方法
公式ドキュメントに記述がある、カスタムファイルシステムを作成する
[Laravel 5.0 ファイルシステム／クラウドストレージ - カスタムファイルシステム
](https://readouble.com/laravel/5.0/ja/filesystem.html#custom-filesystems)

## 実装方法
### カスタムファイルシステムを定義
```php
<?php

namespace App\CustomFileSystems;

use Storage;
use Illuminate\Support\ServiceProvider;
use League\Flysystem\Filesystem;
use League\Flysystem\Adapter\Ftp;

class FtpFileSystem extends ServiceProvider
{
    public function boot()
    {
        Storage::extend('ftp', function ($app, $config) {
            return new Filesystem(new Ftp($config));
        });
    }

    public function register() {}
}
```
### ServiceProviderに作成したカスタムファイルシステムを追加
`config/app.php`

```php
<?php
return [
    'providers' => [
        'App\CustomFileSystems\FtpFileSystem'
    ],
];
```
### Filesystem用コンフィグにFTP接続設定を記述
`config/filesystems.php`

```php
<?php

return [
    'default' => env('FILE_DISK', 'local'),
    'disks' => [
        'local' => [
            'driver' => 'local',
            'root' => storage_path() . '/app',
        ],
        'ftp' => [
            'driver' => 'ftp',
            'host' => 'hoge.jp',
            'username' => 'user',
            'password' => 'pass',
        ],
    ],
];
```
### 呼び出して動かす
```php
use Illuminate\Support\Facades\Storage;

Storage::disk('ftp')->files('/');
```

レガシープロジェクトからは逃げられないんだなあ　わにを。
脳のモデル研究機関一覧と勉強法

#はじめに
本記事は脳をプログラムで開発することに興味のある人に役立つと思います。


#研究機関
世界の研究機関の中でも私がよくみるサイト３つについて説明します

+ [Brain Initiative](https://braininitiative.nih.gov/)
+ [The Human Brain Project(HBP)](https://www.humanbrainproject.eu/en/)
+ [Whole Brain Architecture Initiative(WBAI)](https://wba-initiative.org/)

その他の機関について下記のサイトでまとめられています
https://www.lifescience.mext.go.jp/files/pdf/n1840_08.pdf




##Brain initiative
Brain Initiativeは、2013年にオバマ大統領によって発表された機関です。
Platformがあるわけではないですが、サイトにはかなりの数の刊行物や分析ツールなどのリソースがまとめられています。

wiki
> Inspired by the Human Genome Project, BRAIN aims to help researchers uncover the mysteries of brain disorders, such as Alzheimer's and Parkinson's diseases, depression, and traumatic brain injury (TBI).
BRAINは、ヒトゲノムプロジェクトに触発され、研究者がアルツハイマー病やパーキンソン病、うつ病、外傷性脳損傷（TBI）などの脳障害の謎を明らかにするのを支援することを目指しています。





##Human Brain Project
EUで作れられた機関で、HBP Collaboratory(HBPC)というシミュレーションプラットフォームを利用できます。このプラットフォームは、アカウント申請をしアカウント取得することで使えます。

wiki
>Fundamental to the HBP approach is to investigate the brain on different spatial and temporal scales (i.e. from the molecular to the large networks underlying higher cognitive processes, and from milliseconds to years). To achieve this goal, the HBP relies on the collaboration of scientists from diverse disciplines, including neuroscience, philosophy and computer science, to take advantage of the loop of experimental data, modelling theories and simulations.
HBPアプローチの基本は、異なる空間的および時間的スケールで脳を調査することです（分子から、より高い認知プロセスの基礎となる大規模ネットワークまで、ミリ秒から年まで）。この目標を達成するために、HBPは、実験データ、モデリング理論、シミュレーションのループを活用するために、神経科学、哲学、コンピューターサイエンスを含むさまざまな分野の科学者の協力に依存しています。

###Human Brain Project Collaboratory

HBPCのプラットフォームを使えば、かなり本格的に脳開発の研究ができると思います。

HBPC Platformのガイドブックは下記のサイトです。
https://hbp-hpc-platform.fz-juelich.de/




##Whole Brain Architecture Initiative
日本の機関であるので、ドキュメントは読みやすくはじめはこのサイトから見るのがいいかと思います。WBAでは今、BriCAという脳モデルを開発する上でのプラットフォームを開発しているそうです。

また、WBAの開発部のSlackにもCLAライセンスの同意で参加が可能です。

特に下記のサイトでWBAの目的、具体的な開発の構図などが載せられています。さらに、脳そのものについての知識も説明されています。
https://wba-initiative.org/wiki/






##その他の勉強について
###おすすめの記事紹介

1. Takuma Senoさんという方のハッカソンでの記事では、海馬モデルの実装についての構想と論文が記載されています。
https://github.com/takuseno/wba-hackathon/blob/master/README.md

2. 脳科学辞典という脳についてのwikiのようなものです。
https://bsd.neuroinf.jp/wiki/%E8%84%B3%E7%A7%91%E5%AD%A6%E8%BE%9E%E5%85%B8:%E7%B4%A2%E5%BC%95

3. Kazuya Gokitaさんという方のブログです。大脳辺縁系や大脳新皮質などの新しめの領域についてのモデル設計が書かれています。
http://kazoo04.hatenablog.com/

###Spiking neural network
Spiking neural network(SNN)は、脳の働きである活動電位をモデルに考えられたニューラルネットワークです。比較的新しい手法であり研究途中の技術なため、まだ応用例が少ない気がします。
ニューロンやシナプスのモデルが簡単に作れますが、Deep Learningの知識や論文を読んでみないと詳しく調べれないだろうから、勉強が大変かなと思います。

下記のtakyamamotoさんの『知識のサラダボウル』というサイトは、SNN関連から医学や量子学に関する面白い記事がたくさんあるので良ければ参考にしてください。
https://omedstu.jimdo.com/


#参考文献
https://en.wikipedia.org/wiki/Human_Brain_Project
https://en.wikipedia.org/wiki/BRAIN_Initiative
OutSystemsでファイルをアップロードする

OutSystemsでファイルをアップロードする方法です。
対象はTraditional Webです。
OutSystems UI Web(OutSystems Version11向けUI Framework)の説明ですが、SilkUI版でも同じようにできるはず。

# 環境
Personal Environment(Version 11.0.606.0)
Service Studio(Version 11.6.2)
OutSystemsUIWeb(Version 1.7.7)

# 利用方法

## FileUpload Widgetの参照を追加する
Service StudioからManage Dependenciesダイアログを開き、ProducerとしてOutSystemsUIWeb、elementsとして[FileUpload](https://success.outsystems.com/Documentation/11/Developing_an_Application/Design_UI/Patterns/Using_Web_Patterns/Controls/FileUpload)を選択してAPPLYボタンをクリック。

![qiita_fileupload1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/005ce64c-e4ab-ba3f-f969-811dae4fb64e.png)

## Widgetを配置
Traditional WebモジュールにScreenを用意しておきます。
画面左側のToolbox上でFile Uploadで検索して、見つかったWidgetをScreen上にドラッグ＆ドロップして配置。

![qiita_fileupload2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/67631772-c6d1-4f1f-218f-fbeb6c634138.png)

配置したFIleUpload Widgetには、UploadWidgetというPlaceholderがあり、ここにOutSystemsに組み込みの別のWidget 「Upload」を配置します。現在のFileUploadはScreenに配置した時点で自動的にUploadも配置されるようです(以前は自分で別途配置する必要があった)。

なお、ファイルをアップロードするためには、サーバに通信を発生させるボタン等のMethodをSubmitにしなければなりません。

また、Upload Widgetだけでもファイルアップロードの機能は実現できます。その場合は、クリックするとファイル選択ダイアログが開くHTMLのボタンのみが表示されます。見た目やドラッグ＆ドロップ対応から、通常はFileUploadを使えばいいと思います。

# アップロードしたファイルの利用方法
Method=SubmitにしたボタンのScreen Action内で、Widgetを経由してファイル名やバイナリにアクセスできます。下の画像はデバッガでアップロードされたファイルの中身をみたところ。

![qiita_fileupload3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/60ee05fd-083b-b80b-663d-7b93180b9106.png)

FilenameはText型、ContentはBinary Data型です。

# アップロードするファイルの種類を指定する
Upload WidgetにはExtended Propertiesというプロパティがあります。
OutSystemsにおいてこの名前のプロパティは、WidgetがHTMLのタグとして出力されるときに付与される属性の指定に使われます。

PNGまたはJPEG画像を指定するように指定した例：
![qiita_fileupload5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/83283d23-4bec-afdc-dd62-988cf3cbd649.png)

この指定をしたときのタグ：accept="image/png, image/jpeg"

ファイル選択ダイアログは初期時点で以下のように画像を指定するオプションが選択されます。
![qiita_fileupload4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/a2c5701f-7fd8-8e88-63d4-36152e73141a.png)


# Reactive Web Appの場合
Readtive Web Appの場合は、OutSystemsUI(Webとつかないほうです)の[WidgetsカテゴリのUpload](https://outsystemsui.outsystems.com/OutSystemsUIWebsite/PatternDetail?PatternId=79)を使います。

これは参照を追加しなくても使えます。
基本的な使い方は同じで、Widget配置時に、File Content(ファイルの中身)とFile NameにLocal Variableを紐づけることが相違点ですね。
セルを指定してCurrentRegionで範囲取得した表を、キー＋配列でDictionaryにブチ込む

セルを指定して、そこの表を CurrentRegion.value で配列にブチ込めます。
これを応用して、範囲取得した表が何行であっても
一番左の列：キー
その他の列：配列
としてDictionaryに格納できるようにしました。
これで、表のデータを取るのがだいぶ便利になります。

下の例で書き方を説明すると、
```dic(菊池)(1)```と書いたら 168、```dic(芦田)(2)``` と書いたら44が呼び出せます。

実質的な本体はたった７行ですが、ものすごく頭を使いました。自分の汗と試行錯誤の結晶です。


---
[テストデータ]
![testdata.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463205/36b7037f-ebff-bcee-128a-affa181f20fb.png)

```vb:testDic.bas
    Dim dic As Object: Set dic = CreateObject("Scripting.Dictionary")
    Dim arr As Variant: arr = Sheets("Sheet2").Range("E6").CurrentRegion.Value
    Dim arrItem()
    Dim maxColNum_0 As Integer: maxColNum_0 = UBound(arr, 2) - 2
    Dim LP1 As Long, LP2 As Long
    
    ReDim arrItem(maxColNum_0)
    
    For LP1 = 2 To UBound(arr, 1)
        For LP2 = 0 To maxColNum_0
            arrItem(LP2) = arr(LP1, LP2 + 2)
        Next LP2
        dic.Add arr(LP1, 1), arrItem
    Next LP1
  
  
'----デバッグ部----
'配列の中身を全部見せ
  Dim i As Integer, j As Integer, str As String
  Dim maxRow As Integer:  maxRow = UBound(arr, 1)
  Dim maxColumn As Integer: maxColumn = UBound(arr, 2)
  
  For i = 1 To maxRow
    For j = 1 To maxColumn
        str = "arr(" & i & ", " & j & ")=" & arr(i, j)
        Debug.Print str
    Next
    Debug.Print
  Next

'Dicの中身を全部見せ
    Dim var As Variant
    For Each var In dic
        Debug.Print "キー:" & var
        For LP2 = 0 To maxColNum_0
            Debug.Print "dic(" & var & ")(" & LP2 & "):", dic(var)(LP2)
        Next LP2
    Next var
End Sub
```

[実行結果]
![imidiate1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463205/35b06285-3e6e-9e4f-07b3-a08892c82cad.png)
![imidiate2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463205/d0f49fb7-a57c-bad2-581c-25f2756fa2e8.png)
Jetson TX2 で ROS のインストールに失敗する

Jetson TX2 で ROS のインストールに失敗したので，解決策をまとめる．

## 環境
Jetson TX2 / JetPack 3.3.1 / Ubuntu 16.04

## 問題
Jetson で ROS の [公式 wiki](http://wiki.ros.org/kinetic/Installation/Ubuntu) に従ってインストールした時に詰まった.

```
sudo apt-get install ros-kinetic-desktop-full
```

とした時のエラーメッセージが下記

```
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 ros-kinetic-desktop-full : Depends: ros-kinetic-desktop but it is not going to be installed
                            Depends: ros-kinetic-perception but it is not going to be installed
                            Depends: ros-kinetic-simulators but it is not going to be installed
                            Depends: ros-kinetic-urdf-tutorial but it is not going to be installed
E: Unable to correct problems, you have held broken packages.
```

## 試したこと
```
sudo apt update
sudo apt upgrade
sudo apt dist-upgrade
```

これでも結果は変わらず...

## やること（解決索）
#### パッケージの追加

```
sudo apt-add-repository universe
sudo apt-add-repository multiverse
sudo apt-add-repository restricted
sudo apt update
```

Ubuntu のパッケージは `main` の他に今回追加した `universe`,`multiverse`, `restricted`などがあるらしい．
[こちら](https://sqlazure.jp/r/ubuntu/857/)で詳しく解説されている．

#### ROS のインストール

```
sudo apt-get install ros-kinetic-desktop-full --fix-missing
```

`--fix-missing` のオプションを付けないと，インストールが最後まで完了しなかった．

## 参考文献
* [ROS installation on Jetson TX2 is failed](https://devtalk.nvidia.com/default/topic/1024080/jetson-tx2/ros-installation-on-jetson-tx2-is-failed/)
* [Ubuntuのパッケージ管理のメモ](https://sqlazure.jp/r/ubuntu/857/)
CentOS6 + Apache + PHP7 on Docker

# 流れ

- Dockerfile などを少しだけ書く
- docker コマンドを叩く
- アクセス可能になる

# 本題

まず、以下の3つのファイルを用意します。

- Dockerfile
- test.html
- test.php


```docker:Dockerfile
FROM centos:6

RUN rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
RUN rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

RUN yum -y install --enablerepo=remi,remi-php71 \
  php \
  httpd

COPY test.html /var/www/html/test.html
COPY test.php /var/www/html/test.php

ENTRYPOINT ["/usr/sbin/httpd", "-DFOREGROUND"]
```

```html:test.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  This is test.html
</body>
</html>
```

```php:test.php
<?php
phpinfo();
?>
```

つぎに、docker コマンドを叩きます。

```bash
$ docker build -t apache-test .
$ docker run -d -p 8080:80 apache-test
```

これでアクセスが可能となります。簡単！

```bash
open http://localhost:8080/test.html
open http://localhost:8080/test.php
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45822/65bb54c0-30b9-d44f-7668-076e8f593025.png)


おわり :lemon:
PlayCanvasのエディターでVueが使える

まず、

PlayCanvasって

なんだ！！！

そんな人は以下のページに飛んでPlayCanvasってなんなのか知って！！！！！！！！
https://qiita.com/utautattaro/items/b3c956be2fbb6bb7c414

---
##PlayCanvasでVueを使う

PlayCanvasでVueを使うとしたら、PlayCanvasのエンジンを使ってVueと紐付けたりすると思います。

でも、PlayCanvasにもコードエディターがあるので、この中で使えないの？って話です。


**使えちゃうんです**

※実はすでにQiitaで記事にもなっていました。こっちはReactを使ってます。
https://qiita.com/yushimatenjin/items/7a64220cceac66843d7d


###実は用意されてたEXTERNAL SCRIPTS

PlayCanvasのエディターからSettingsの中に**EXTERNAL SCRIPTS**と言う項目があります。

![スクリーンショット 2019-10-17 17.56.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109168/dc0c8df0-9e20-98cd-516d-7139189c00a9.png)


これ、PlayCanvasが呼ばれる前にスクリプトを読み込むことができるんです。


実はこれが用意される前はCDNは使えなかったこともありましたが、EXTERNAL SCRIPTSができたことでCDNも使えるようになったんですね。


###コード書いてみる

簡単にVueが動くのか確かめてみました。

`index.html`

```vue
<div id="app">
    <p>{{message}}</p>
    <ul>
    <li v-for="type in e_types" v-bind:style="listStyle">
        <p @click="onTypeClick(type)" v-bind:style="targetStyle">{{type}}</p>
    </li>
</div>
```

`index.js`

```js
var Index = pc.createScript('index');

Index.attributes.add("html", {type:"asset", assetType:"html"});
Index.attributes.add("target", {type:"entity"});

Index.prototype.initialize = function() {
    var self = this;
    var wrapper = document.createElement("div");
    wrapper.style.position = "fixed";
    wrapper.style.top = 0;
    wrapper.style.left = 0;
    wrapper.style.zIndex = 10;
    wrapper.style.width = "30%";
    wrapper.style.height = "100%";
    wrapper.style.background = "#fff";
    document.body.appendChild(wrapper);
    
    wrapper.innerHTML = self.html._resources;
    
    var modelType = self.target.model._type;
    
    var app = new Vue({ 
        el: '#app',
        data: {
            message: 'Hello, PlayCanvas',
            e_types: {
                box: "box",
                capsule: "capsule",
                sphere: "sphere",
                cylinder: "cylinder",
                cone: "cone",
                plane: "plane"
            },
            listStyle: {
                listStyle: "none",
            },
            targetStyle: {
                display: "inline-block",
                padding: "5px",
                border: "1px solid #333",
                cursor: "pointer"
            }
        },
        methods: {
            onTypeClick: function(target) {
                self.target.model.type = target;
                modelType = target;
            }
        }
    });
};
```

以下のページで実際に動くのがみれます。
https://playcanv.as/p/whuMzZ7b/

Primitiveのtypeを取得し変更してあげているだけですが、PlayCanvasのエディター内でVueが
動きました。
工夫すればassets内のmodelを参照して一覧表示させるなんてこともできそうですね。



##終わり

こんな感じでEXTERNAL SCRIPTSからVueやReactなんかもPlayCanvas内のコードエディターで開発できるようになっちゃいます。
UIとかもBootStrapとか導入することも容易になって楽になりそうですね。

まだまだPlayCanvasはアップデートし続けているので、進化が楽しみです。
[ゼロから作るDeep Learning]簡易的なニューラルネットワークを分かりやすく実装してみた

#はじめに
この記事は**ゼロから作るディープラーニング 4章ニューラルネットワーク**を自分なりに理解して分かりやすくアウトプットしたものです。
文系の自分でも理解することが出来たので、気持ちを楽にして読んでいただけたら幸いです。
また、本書を学習する際に参考にしていただけたらもっと嬉しいです。

#ニューラルネットワークの構造
ニューラルネットワークは**入力層・中間層・出力層**の三層で出来ており、そのため**三層ネットワーク**とも呼ばれたりします。
しかし三層とは言っても中間層は一層構造では無く、多層構造なので実際は三層です。多層パーセプトロンのように層を深くしたいときは**中間層**を深くします。
<img width="527" alt="スクリーンショット 2019-10-17 18.21.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510602/c6223877-d15e-58d8-ce49-45af34a99a00.png">
前回も書いた通り、ニューラルネットワークと多層パーセプトロンの違いは活性化関数の違いです。
後の構造はほとんど同じなのです。

ではコードで実装してみます。

```python
#３層ニューラルネットワーク実装
X = np.array([1.0,0.5,2.0])#入力層
B1 = np.array([0.1,0.2])
W1 = np.array([
    [0.1,0.3],
    [0.2,0.4],
    [0.4,0.5]
])
A1 = np.dot(X,W1) + B1 # 各ニューロンの入力信号の総和 + 各ニューロンのバイアス
A1 #各ニューロンの入力値

#中間層一層目
Z1 = sigmoid_function(A1)
Z1#一層目の出力信号

#中間層二層目
W2 = np.array([
    [0.1,0.4,0.6],
    [0.2,0.5,0.8]
])
B2 = np.array([0.1,0.2,0.4])

A2 = np.dot(Z1,W2) + B2
Z2 = sigmoid_function(A2)
Z2#二層目の出力信号

W3 = np.array([
    [0.2,0.3],
    [0.3,0.4],
    [0.4,0.9]
])
B3 = np.array([0.1,0.2])
A3 = np.dot(Z2,W3) + B3
#出力層の活性化関数
def identity_function(x):
    return x

identity_function(A3)

```
今回はまだ学習を実装する前なので重みやバイアスなどのパラメータは手動設定ですが、上のコードでニューラルネットワークの実装ができます。
上を見るとわかるのですが、ほとんどパーセプトロンの構造と同じなので説明はほとんど入りませんよね。
違う部分は活性化関数がstep関数じゃ無くシグモイド関数というところだけです。

後もう一つ出力層がニューラルネットワークにはありますのでそこの解説が必要です。
ですが上の実装だと出力層の説明が全くできていませんので、出力層の解説は次回させていただきます。
#Ruby のキーワード引数を一斉にハッシュで渡すにはアスタリスク二個。 ( **{oh: :yeah, uh :ah} )

```
class A
  def initialize(oh:, uh:)
    puts oh
    puts uh
  end
end

puts A.new(**{oh: :yeah, uh: :ah})

# yeah
# ah
```


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2598








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【勉強会資料】Packet Tracerでスイッチを用いたトラフィック制御 - 全体の流れ

# はじめに

この記事は、2019年10月17日に開催の [サポーターズCoLab](https://supporterzcolab.com/)勉強会「[ネットワーク基礎実験ハンズオン - スイッチを用いたトラフィック制御](https://supporterzcolab.com/event/957/)」のための資料です。勉強目的での利用をしていただくことは構いませんが、内容についてはサポートできかねますのでご了承ください。

# この記事の目的
Ciscoネットワーク機器のはじめの一歩として、パケットトレーサー上で簡単なネットワークを構築して通信を行う実験の手順を説明します。コマンドを含めた解説は[こちら](https://qiita.com/KozyCorner/items/e7c36bfb69a97cae60fb)

## 実験内容

- VLANの設定
- トランクを用いた複数のスイッチ間でのVLANの設定
- VTPを用いた複数のスイッチ間でのVLANの設定（時間があれば）

# 事前準備

以下の記事を参考にPacket Tracerを入手しダウンロード・インストールを行い、起動してください。

[Cisco Packet Tracerの入手方法 - Qiita](https://qiita.com/TigetrB/private/24716eacd2802c6f372c)

# 操作・コマンド集

この記事ではコマンドの使い方やパケットトレーサーの操作方法は解説しません。操作やコマンドについては、都度以下の記事を参照し、必要な変数を書き換えるなどして使ってください。

[Packet Tracerでルータを用いたネットワークの構築 - 操作・コマンド集](https://qiita.com/TigetrB/private/8dd90cec20a9687c2972)

# 手順

## 簡単なネットワークで`ping`を使ってみる

<img width="354" alt="スクリーンショット 0031-10-17 19.05.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326374/e84f39f9-37f5-1b63-9bda-b849f99eca3c.png">


1. 上図の通りネットワークを構築する。使用するスイッチは「2960」（Network Devices > Switches > 2960）、PCは「PC」（End Devices > End Devices > PC）、ケーブルはCopper Cross-Over（Connections > Connections > Copper Cross-Over）。
2. PC0、1のIPアドレスをそれぞれ`192.168.1.1`、`192.168.1.2`に、サブネットマスクをどちらも`255.255.255.0`に設定する。
3. 各PC間で`ping`コマンドを実行し、通信ができることを確認する。

## VLANの設定

<img width="794" alt="スクリーンショット 0031-10-22 20.25.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326374/acab2955-5d9d-3089-128d-e70b236b9340.png">


1. 上図の通りネットワークを構築する。（先ほどのネットワークに2台のPCを足す。）
2. PC0〜3のIPアドレスをそれぞれ`192.168.1.1`〜`192.168.1.4`に、サブネットマスクを全て`255.255.255.0`に設定する。
3. 先ほどの実験と同様に、全てのPC間で`ping`を実行し、通信ができることを確認する。
4. スイッチのコンソールを開き、VLANの設定をする
    - `VLAN2`と`VLAN3`を作成
    - PC0、2が接続されているポートをどちらも`access`モードで`VLAN2`に設定
    - PC1、3が接続されているポートをどちらも`access`モードで`VLAN3`に設定
5. 各PC間で`ping`を実行し、同じVLANグループ内では通信ができて、異なるVLANグループ間では通信ができないことを確認する。

## トランクを用いたVLANの設定

<img width="619" alt="スクリーンショット 0031-10-17 18.08.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326374/f5a7fd10-0cfb-56bd-af56-409fa424aaed.png">


1. スイッチの設定をリセットする。（本来はコマンドを使って解除していくのべきなのですが、今回はシミュレーションなのでスイッチを物理的に再起動します）
2. 上図の通りネットワークを構築する。（先ほどのネットワークを2つのスイッチに分割し、スイッチ同士を接続した状態。）
3. 2. PC0〜3のIPアドレスをそれぞれ`192.168.1.1`〜`192.168.1.4`に、サブネットマスクを全て`255.255.255.0`に設定する。（先ほどの実験と同じ）
4. 全てのPC間でpingを実行し、通信ができることを確認する。
5. VLANの設定をする
    - それぞれのスイッチで`VLAN2`と`VLAN3`を作成
    - PC0、2が接続されているポートをどちらも`VLAN2`に設定
    - PC1、3が接続されているポートをどちらも`VLAN3`に設定
6. 各PC間で`ping`を実行し、通信ができなくなっていることを確認する。
7. 両方の`FastEthernet0/24`を`trunk`モードに設定し、`VLAN2`と`VLAN3`を設定する。
8. 各PC間で`ping`を実行し、同じVLANグループ内では通信ができて、異なるVLANグループ間では通信ができないことを確認する。
JupyternotebookでDisplay関数を使用して多項式を次数の低い順に表示したい

数列を書くプログラム（Pythonからはじめる数学入門pp105より）

#P99: Print a series

from sympy import *
from IPython.display import display 
x,y,z,t,a,b,c = symbols('x y z t a b c')
# y = Symbol('y')
init_printing(use_unicode=True)

# Print the series:
# x + x**2 + x**3 + ... + x**n
#    ____  _____         ____    
#      2     3             n

from sympy import Symbol, pprint
def print_series(n):
    # initialize printing system with
    # reverse order
    # init_printing(order='rev-lex')
    # x = Symbol('x')
    series = x
    for i in range(2, n+1):
        series = series + (x**i)/i
        
    pprint(series,order='rev-lex')
    display(series)
   
    
    
if __name__ == "__main__":
    n = input('級数展開の次数ｎを入力してください')
    print_series(int(n))


プログラムを走らせると
級数の展開項の数の入力が要求され
４を入力すると

級数展開の次数ｎを入力してください4

結果はpprintで次数の低い順にプリントされます。

     2    3    4
    x    x    x 
x + ── + ── + ──
    2    3    4 

あまりきれでないので、display関数で表示させると
美しい字体で表示されますが、次数の高い順になっています。
（ここに表示できないので申し訳ありません）
次数の低い順に表示させることはできないのでしょうか。
他人のふんどしでEC2にownCloudを構築する

ownCloud 構築
===

### 前提
- AWS EC2上に構築する
- AWS マーケットプレイスで提供されるbitnamiスクリプトを使用する

### 手順
- 初めにAWS consoleにログインしておく
- 同じブラウザでマーケットプレイスを開き、owncloudを検索（下記URLクリックでもOK）
    - https://aws.amazon.com/marketplace/search/results?x=0&y=0&searchTerms=owncloud
    - 今回は `ownCloud Certified by Bitnami` を使ってみる

---
- `Continue to Subscribe` をクリック
    - ![](https://s3-ap-northeast-1.amazonaws.com/notes.comware.io-public-images/uploads/upload_46b030dcd56d1656f58e9dba86117972.png)

---
- 利用規約的なのを読んで `Agree` をクリック
    - (スクショ取り忘れた)

---
- `Continue to Configuration` をクリック
    - ![](https://s3-ap-northeast-1.amazonaws.com/notes.comware.io-public-images/uploads/upload_557cc899ca37e7935bb24c9ced3c1a74.png)

---
- Regionを `Tokyo` にして `Continue to Launch` をクリック
    - ※Regionの上にある `Fulfillment Option`と`Software Version` は(こだわりのない場合)そのままでOK
    - ![](https://s3-ap-northeast-1.amazonaws.com/notes.comware.io-public-images/uploads/upload_43834bbfa0a001b3612b682e218b6d1b.png)

---
- 次の画面はちょっと長いが、以下の3箇所を変更する
    - EC2 Instance Type
        - t2.micro （各自お財布と相談して決めてください）
    - Security Group Settings
        - すでに用意があればそれを選ぶ
        - なければ新規作成
    - Key Pair Settings
        - 自分が使っているものを選ぶ
    - ![](https://s3-ap-northeast-1.amazonaws.com/notes.comware.io-public-images/uploads/upload_b1afd12f4d7788aac4241e738b79abee.png)
    - ↑の設定ができたら、一番右下の `Launch` をクリック

---
- デプロイされるまで5分くらいお茶を飲みながら次の工程を確認しておく
    - ※焦ってアクセスすると `信頼されていないドメインからサーバーにアクセスしています。` と警告がでる
        - ※そうなってしまった場合は、時間を置いてアクセスすると警告は消える

---
- AWS console から インスタンスのIPを調べる
    - ![](https://s3-ap-northeast-1.amazonaws.com/notes.comware.io-public-images/uploads/upload_b475fe84c1b4e3a57d7320ef2b5ad832.png)
    - ※画像では `name` 欄に `ownCloud` と自分で入力済みでした。すみません。

---
- ブラウザで上記IPを開く
    - ![](https://s3-ap-northeast-1.amazonaws.com/notes.comware.io-public-images/uploads/upload_3e465b62860795eb4569ccbd94bebe99.png)

---
- 初期パスワードを調べる
    - インスタンスのシステムログを参照する
        - ![](https://s3-ap-northeast-1.amazonaws.com/notes.comware.io-public-images/uploads/upload_92a134cb5810c0d0423a60b435338e2b.png)
    - システムログの割と終盤（8割くらいスクロールしたところ）に↓の画像のようなログがある
        - ![](https://s3-ap-northeast-1.amazonaws.com/notes.comware.io-public-images/uploads/upload_296b7fcc836762ca7a24e1ca8a4f8298.png)
            - ↑の画像の赤枠内、モザイクかかったところに初期パスワードが書かれているのでメモしておく

---
- ブラウザからownCloudにログイン
    - 初期ユーザ名： `user`
    - 初期パスワード: ｛先程コピーした文字列｝

---

お疲れさまでした。

## あとがき
- ownCloud自体の使い方は本家マニュアルを参照してください。
- リクエストがあればファイルをS3に保存する方法も別記事にします。
- External Storage: S3 をインストールする
    - https://marketplace.owncloud.com/apps/files_external_s3
    - ※もう一個似たようなプラグインあるけどNGだった `S3 Object Storage`
    - s3フルアクセス権ではうまく連携できず、Admin的な権限だと連携できた。なぜ・・？
GitHub DesktopからGitLabのリポジトリをCloneする

# 結論
- Mac: できる
- Windows: できない
    - 公開鍵登録とかしても無駄
    - ただし、以下の操作で関連付けは可能

# Windowsでの関連付け手順
- Git for windows などで適当にローカルにclone
- GitHub Desktopで
    - `add local repository`
    - 先程ローカルにcloneしたパスを指定

たったこれだけでリモートブランチも参照可能になっているはずです。
リモートへのpushも問題なし。
【Gimp】いろいろな手法リンク集

# 宇宙
  https://www.pixiv.net/artworks/26212739

#6角形
  [GIMPチュートリアル: 六角形を敷き詰めた近未来的背景](http://alphasis.info/2014/11/gimp-tutorial-hexagonfuturebackground/)
Annotationの引数や、呼び出し元メソッドの引数をaspectに渡したい

##はじめに
Java Spring FrameworkのAOPについてのお話です。

##＠Aspectの利用
たとえば、あるServiceクラスを利用したいクラスが100クラスあって、都度`@Autowired`を付与してDIしても実現できますが、あまりスマートではありませんね。
そこで各所で行いたい処理(`@Aspect`アノテーションを付与したクラス)を定義し、それを利用したいクラスのメソッドなりにアノテーションを付与することで処理を差し込むことでソースコードの見通しを良くしましょう、というのが趣旨です。

##用語の確認
1. `Aspect`　横断的な関心事を示すモジュールそのもの。
2. `Join Point`　横断的な関心事を実行するポイント(メソッド実行時や例外throw時)のこと。
3. `Advice`　特定のJoinPointで実行されるコードで、横断的な関心事の実装部分。
`@Around`が汎用性が高いですが、対象メソッドの処理成功時のみ行いたい処理などタイミングを限定したい場合は目的にあったAdviceを利用したほうがいいかと思います。

```
@Before　対象のメソッドの処理前に処理される
@AfterReturning 対象のメソッドの処理が成功した際に処理される
@AfterThrowing　対象のメソッドの処理で例外が投げられた際にに処理される
@After　対象のメソッドの処理の成否を問わずに処理が完了した際に処理される
@Around　対象のメソッドの処理の前後に実行される
```
4.`pointcut`実行対象のJoinPointを選択する式。条件を指定することで実行タイミングを詳細に絞り込めます。今回は触れません。下記が参考になります。
https://qiita.com/rubytomato@github/items/de1019aeaaab51c8784d

##具体例
####Aspectを利用するコントローラ

```java:MyController.java
@Controller
@RequestMapping("/hogehoge")
public class MyController {

    @GetMapping
    @MyAnnotation(hoge = "test", piyo = false)
    public String doGet(HttpServletRequest req, HttpServletResponse res) {
        // 〜処理たち〜
        return "hogehoge";
    }
}
```

####Annotationの定義
このあたりが参考になりました。
https://itsakura.com/java-annotation-make
引数にはプリミティブ型・String・Class・列挙型・アノテーション、あとはそれらの一次元配列のみ指定可能。
https://www.ne.jp/asahi/hishidama/home/tech/java/annotation.html

```java:MyAnnotation.java
// Annotationの有効範囲。
@Retention(RetentionPolicy.RUNTIME)
// Annotationを付与したい対象。
@Target(ElementType.METHOD)
public @interface MyAnnotation {

    /** 文字列 */
    String hoge();

    /** boolean */
    boolean piyo();
}
```

####Annotationの定義を引数で受け取るAspect

```java:MyAspect.java
@Aspect
@Component
public class MyAspect {

    @AfterReturning("@annotation(myAnnotation)")
    public void after(JoinPoint jp, MyAnnotation myAnnotation) throws Throwable {
        // 呼び出し元の引数を受け取ってみる        
        // ここでは呼び出し元のHttpServletRequest req、HttpServletResponse resが取得できる
        Object[] o = jp.getArgs();
        
        // Annotationの引数を受け取ることができる
        String hoge = myAnnotation.hoge();
        System.out.println(hoge); // test
        boolean piyo = myAnnotation.piyo();
        System.out.println(piyo); // false
    }
}
```

##まとめ

- 呼び出し元メソッドの引数を受け取ることができるが、引数の「値」なので変数名をキーに処理できない

######呼び出し元メソッドの引数を取得したい場合

```
    protected HttpServletRequest getRequest() {
        return ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
                .getRequest()
                .getParameter("hoge");
    }
```

- Annotationの引数で、変数を渡すことはできない（引数
にはプリミティブ型・String・Class・列挙型・アノテーション、あとはそれらの一次元配列のみ指定可能。）
- Annotationの引数を利用する場合としない場合で微妙に書き方が違う
    - 利用する場合 前述のサンプルコード通り
    - 利用しない場合 `@AfterReturning("@annotation(jp.ne.example.MyAnnotation)")` (アノテーションクラスのフルパスを記述)
PHPStormでVirtualBoxのサーバーと連携してリモートデバッグ(Xdebug)の設定方法

#対象者
・開発環境がVirtualBoxにあってマウントしたソースコードを使ってPHPStormで開発を行なっている人
#はじめに
###バージョン
PHP v5.6
VirtualBox v6.0.12

###xdebugのインストール

```terminal
$ sudo yum install php-pear
$ sudo yum install php-devel
$ sudo yum install gcc gcc-c++ autoconf automake
$ sudo pecl install xdebug-2.2.5
```

xdebugのバージョンはPHPのバージョンに依存するため、PHPのバージョンを確認して使えるバージョンを指定してインストールしましょう！

```terminal
$ sudo vim /etc/php.ini
```

###php.iniの設定(Xdebug)
もしかしたら全部必要かわからないですが。。。

```php.ini
・・・
[Xdebug]
zend_extension=/usr/lib64/php/modules/xdebug.so
xdebug.default_enable=1
xdebug.remote_enable=1
xdebug.remote_handler = "dbgp"
xdebug.remote_mode = "req"
xdebug.remote_host='192.168.56.101'
xdebug.remote_port=9000
xdebug.profiler_enable = 1
xdebug.profiler_output_dir = "/tmp"
xdebug.remote_autostart=1
xdebug.remote_connect_back=1
xdebug.max_nesting_level=1000
xdebug.remote_log=/var/log/xdebug.log
xdebug.idekey='PHPSTORM'
```

###PHPStormの設定1
・Preferences...を選択
-Language&Frameworksを選択
-PHPを選択
-Debugを選択
-Serversを選択
-"+"で新しく作成
・Nameは任意の名前を入力しましょう
・Host名はVirtualBoxのサーバー接続時のIP番号を入力(php.iniのxdebug.remote_hostで指定したIP)
・Port名はphp.iniで指定したポートを入力(php.iniのxdebug.remote_portで指定したポート)
・DebuggerはXdebugを選択
・VirtualBoxのサーバー上とローカル環境でフォルダをシンクさせている場合は、Use path mappingsにチェックを入れ、シンクしているディレクトリを選択。(Absolute path on the serverにVirtualBoxのサーバー上にある開発プロジェクトのルートディレクトリを指定してやりましょう)
・ApplyしてOK

###PHPStormの設定2
・Runを選択
・Edit Configurations...
-"+"で新しく作成
-PHP Remote Debugを選択
-Nameに任意の名前を入力
-Serverに先ほど作成したServerを指定
-IDE key(session id)には、PHPSTORMと入力(php.iniのxdebug.idekeyで指定したキー)
・ApplyしてOK

###リモートPHPインタプリタの設定
・Preferences...を選択
-Language&Frameworksを選択
-PHPを選択
CLI Interpreterを設定
自分の場合はデフォルトでPHP7.1があったのでそれを設定
・ApplyしてOK

###デバッグ
・デバッグしたいページを開いておく。
・PHPStormでそのデバッグに使うソースコードを開いてブレークポイントを指定
・Runを選択
-Start Listening for PHP Debug Connectionsを選択
・ページをリロード
この時にPHPStorm側で左下のDebugを選択してVariablesに各変数の値が出てればOK!

#まとめ
仕事で設定したので備忘録として残しました〜。

#参考
[[PHP] Xdebug のリモートデバッグ、理解していますか？](https://qiita.com/castaneai/items/d5fdf577a348012ed8af)
[PhpStormでVirtualBox：CentOS7開発環境のリモートデバッグ！](https://qiita.com/okame_qiita/items/7e51333d5de5ceae91e5)
[PhpStormでXdebugを使えるようにしよう！](https://qiita.com/taniai-lvgs/items/8e9eba112d2d0ed2530f)
[エンジニア婦人ノート VSCodeを使おう！-XAMPP×XDebug×PHP-](https://wm-web-se-pg.com/program_info/visual-studio-code-vscode-xampp-xdebug/#ttl-1)
[Xdebugの設定(PHPStorm公式リファレンス)](https://pleiades.io/help/phpstorm/configuring-xdebug.html)
express + multer + sharpで画像のリサイズ処理をする

# やりたいこと
アップロードされた時に画像をリサイズして保存する。

# 構造

```ruby:tree

nodeApp --- 'node-modules'
        --- 'public/index.html'
        --- 'package.json'
        --- 'server.js'

```

# やる前の準備
npm で sharp を install

```ruby:terminal
$ npm init
```
npm init をした時点で package.json ができます。

# STEP 1. serverを立てよう
以下のコードをpackage.jsonにコピペしましょう。

```ruby:package.json
{
  "name": "image-upload",
  "version": "1.0.0",
  "main": "server.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node server"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.16.3",
    "multer": "^1.3.0",
    "node-inspect": "^1.11.6",
    "sharp": "^0.23.1"
  },
  "devDependencies": {},
  "description": ""
}

```

以下のコードをserver.jsにコピペします。

```ruby:server.js
const express = require('express');
const multer = require('multer');
const sharp = require('sharp');

const destDir = 'uploads/images/';

var storage = multer.diskStorage({
    destination: destDir,
    filename: function (req, file, cb) {
        cb(null, file.originalname)
    }
})

const upload = multer({
    storage: storage
});

const app = express();
const PORT = 3000;

app.use(express.static('public'));

app.post('/upload', upload.single('photo'), (req, res) => {
    if (req.file) {
        res.json(req.file);
        sharp(req.file.originalname)
            .resize(64)
            .toFile(destDir + 'resized' + req.file.originalname, (err, info) => {
                if (err) {
                    throw err;
                }
                console.log(info);
            });
        console.log("file: ", req.file);
    } else throw 'error';
});

app.listen(PORT, () => {
    console.log('Listening at ' + PORT);
});
```

次にpublic/index.htmlを作り、以下のコードをコピペします。

```ruby:terminal
$ mkdir public && touch index.html
```

```ruby:index.html
<!DOCTYPE html>
<html lang="en">

    <head>
        <title>Upload Images to Server</title>
        <meta charset="utf-8">

    </head>

    <body>

        <h1>Upload Image</h1>

        <form action="/upload" method="post" enctype="multipart/form-data">
            <input type="file" accept="image/*" name="photo">
            <input type="submit" value="upload">
        </form>


    </body>

</html>
```

# 実行してみましょう。

```ruby:terminal
$ npm install && npm start
```

serverが立ち上がったので、もう一つのターミナルを開きましょう。
そしたら,curlコマンドで画像をserverにあげたいと思います。

**curlはserverに問い合わせできるものと考えて今は大丈夫です。**

```ruby:terminal
$ curl 'localhost:3000/upload' -X POST -F photo=@cat.jpg
```

ちなみに、ブラウザで「localhost:3000」を開けば upload ページが出てくるので、そこからも試すことは可能です。


# 最終的なフォルダの構造
```ruby:tree

nodeApp --- 'node-modules'
        --- 'public/index.html'
        --- 'uploads/images/resizedcat.jpg
        --- 'package.json'
        --- 'server.js'

```

お疲れ様です。


[参考URL: node server](https://medium.com/@nitinpatel_20236/image-upload-via-nodejs-server-3fe7d3faa642)
[参考URL: sharp](https://blog.kozakana.net/2019/04/sharp-resize/)
Selectionは取得するタイミングによっては反応に遅延が起きる

# Selectionは難しい
Selectionは難しく、同じ入力によるイベントでも種類によってデータが異なる。
また、setTimeoutやPromiseなどの非同期の仕組みを利用した場合にもデータが変わってしまう。
~~おのれSelection~~

# 環境
macOS 10.14.6
Google Chrome 77

# 検証1
## コード
```javascript
const hd = e => console.log(e.type, window.getSelection().focusOffset)
el.addEventListener("keydown", hd)
el.addEventListener("keyup", hd)
```

## 結果
|イベントタイプ|入力したキー|getSelection().focusOffset|期待値|
|----------|---------|--------------------------|-----|
|keydown|->|0|1|
|keyup|->|1|1|
|keydown|<-|1|0|
|keyup|<-|0|0|

## 考察
keyupのみ期待値通りになっていた。
なので、keydownからkeyupの間にgetSelectionの値に変化が出ていたであろう。
では、その間にデータが取れればどうなるだろうか。

# 検証2
## コード
```javascript
el.addEventListener("keydown", e => {
  setTimeout(() => console.log(e.type, window.getSelection().focusOffset), 0)
})
el.addEventListener("keyup", e => console.log(e.type, window.getSelection().focusOffset))
```

## 結果
|イベントタイプ|入力したキー|getSelection().focusOffset|期待値|
|----------|---------|--------------------------|-----|
|keydown|->|1|1|
|keyup|->|1|1|
|keydown|<-|0|0|
|keyup|<-|0|0|

見事にkeydownが期待値と一致した。

# おわり
setTimeoutで実行を遅延することによって、期待値通りの結果を得られた。
エディタ開発の成功を祈って。
タスクスケジューラから起動したプログラムが重いのは優先度が低いからかも

# なんか遅い
Windowsでプログラムを定期実行したい時はタスクスケジューラに登録して実行しますが、
実行されるプログラムがなんか遅い時ってありませんか？

一度、プログラムをタスクスケジューラ経由ではなく手動で実行してみて比較し、
明らかに遅かったらこの先に書く状況がビンゴで、改善できるかもしれません。

# 優先度を確認
タスクマネージャーを起動し、タスクスケジューラから実行したプログラムの「基本優先度」を確認してみてください。
「基本優先度」が表示されていない場合は、項目名のあたりで右クリックし「列の選択」でチェックを入れると表示されるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376864/bfe034b9-4a24-6c42-3c79-8163289cf187.png)

優先度「低」になっていませんか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376864/18af146f-6927-a4d6-f51d-7933ab09bedd.png)

また、リソースモニターの「ディスク」タブにも「I/O優先度」という項目があります。
こちらも優先度が「低」になっていませんか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376864/6fc1bcb5-77f6-02de-60d7-40801d5b5342.png)

優先度「低」になっていたあなた！　ビンゴなのでこの先をお読みください。

# 原因
タスクスケジューラでタスクを登録すると、標準で優先度7に設定されるようです。
（参考）[TaskSettings.Priority property](https://docs.microsoft.com/ja-jp/windows/win32/taskschd/tasksettings-priority)

> The default value is 7. Priority levels 7 and 8 are used for background tasks ...

優先度7はバックグラウンドタスク向け…と書いてありますね。
このため、優先度が高いプロセスが起動されると、CPUやディスクI/Oをそちらに奪われてしまうようです。

# 優先度の設定変更
タスクスケジューラに登録されたタスクを実行する時の優先度を上げることで、
CPUやディスクI/Oの利用優先度を上げることができます。

変更手順は以下の通り。（残念ながらタスクスケジューラからGUIでは変更できないようです…）

1. タスクスケジューラから該当のタスクを右クリックし「エクスポート」する。
2. エクスポートされたXMLを開き「priority」欄の「7」の部分を変更する。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376864/a924917c-62cc-9d88-7e02-47f73ca0e384.png)
3. タスクスケジューラから該当のタスクを右クリックし「削除」する。
4. タスクスケジューラの「タスクスケジューラライブラリ」で右クリックし「インポート」を選択。  
編集したXMLを指定しタスクを登録する。


これで、該当のタスクを実行する際の優先度が変更されます。
priorityを3に設定してタスク登録⇒実行した所、優先度「低」ではなく「標準」で実行されるようになり、
バッチ処理の所要時間が大きく短縮されました。


# その他
* priorityを1に設定しても優先度が「高」にはならず「標準」のままだった。
設定変更しているユーザーの権限が関係するのかも？

* 「サービス」で起動されるプログラムの優先度って変更できるのかな…？
よくわからない。。
dbcli が快適すぎるから使ってみて

データベースを操作するのに [DBeaver](https://qiita.com/nanasess/items/609c7cda4adee344221c) などの GUI ツールももちろん使うんですが、コマンドラインでささっとチェックしたい場合もありますよね。

そんな時は MySQL(or MariaDB) なら mysql コマンド、 PostgreSQL なら psql コマンドをよく使うと思うんですが、 SQL が複数行になったり、結果の列数が多くなったりすると視認性も悪くなり、機能不足は否めません。

**そんな時は [dbcli](https://www.dbcli.com) を使いましょう！**
もちろん Windows でも Mac でも Linux でも使えます。

![mycli](https://d33wubrfki0l68.cloudfront.net/0f0733732e766219aa0a83e631d5cd8b784edabc/5dc57/images/main.gif)

- MySQL は [mycli](https://www.mycli.net)
- PostgreSQL は [pgcli](https://www.pgcli.com)
- SQLite3 は [litecli](https://litecli.com)
- Microsoft SQL Server は [mssql-cli](https://github.com/dbcli/mssql-cli)
- [Athena](https://github.com/dbcli/athenacli) や [VerticaDB](https://github.com/dbcli/vcli) でも使えます

## 自動補完

![Auto-completion](https://d33wubrfki0l68.cloudfront.net/961ffeb8683fce04c0dbb91ff6739fa24ceb6daf/bbeb9/images/keyword.png)

## SQL キーワードと連携した補完

![Smart-completion](https://d33wubrfki0l68.cloudfront.net/7cbe577932ca62b24627e898af087e1dad0c643f/8009c/images/tables.png)

テーブル名に対応したカラム名も補完可能

![Smart-completion](https://d33wubrfki0l68.cloudfront.net/ccde1eb04cdfff9fe15da7cedfee3722ca91e214/8d0ae/images/columns.png)

## エイリアスにも対応

![alias](https://d33wubrfki0l68.cloudfront.net/922d3817b9ff6d0895477a0f1aac435fe31f3b3b/d3fea/images/alias.png)

## シンタックスハイライト

![syntax](https://d33wubrfki0l68.cloudfront.net/73b11835d0eddb6a9095a0a3700e349f0116e5af/cea26/images/syntax.png)

## 結果表示

```~/.bashrc
# 結果の折り返しを無効にする
export LESS="-XFR"

# 結界の折り返しを有効にする
export LESS="-SRXF"
```

結果表示には less コマンドのオプションが利用可能です。列が画面幅を越えてしまった場合は左右の矢印キーで表示可能です。

<img width="682" alt="スクリーンショット 2019-10-17 18.12.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40662/7cd1aa18-1cde-b4af-e94b-7fdd420d9719.png">

## 複数行モード

複数行の長大な SQL も快適に扱えます。

<img width="892" alt="スクリーンショット 2019-10-17 18.41.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40662/fcd1619a-fca0-b915-e35f-3092e1a746d4.png">



## インストール方法

**python** が入っていれば、 pip コマンドで簡単にインストールできます。

```shell
## mycli
pip install mycli
## pgcli
pip install pgcli
## litecli
pip install litecli
```

Mac の方は homebrew でもインストールできます。

```shell
brew tap dbcli/tap

## mycli
brew install mycli
## pgcli
brew install pgcli
## litecli
brew install litecli
```

## 使用方法

起動オプションは mysql コマンドや psql コマンドと互換です。

```shell
## mycli

mycli -u <my_user> -h <my_host.com> -p<my_password> <my_database>

### DSN での指定もできます
mycli mysql://my_user@my_host.com:3306/my_database

## pgcli

pgcli -U <pg_user> -h <pg_host> <pg_database>

## litecli

litecli <lite_database>
```

## 信頼のオープンソース

[GitHub](https://github.com/dbcli) で活発に開発されています。
GUI ダルいという方はぜひ！
Rubyのローカル環境構築について

<h1>今回の学習内容</h1>
まずはRubyのローカル環境構築をしました。

<h1>ローカル環境構築</h2>

https://prog-8.com/docs/ruby-env
今回はプロゲートに書いてあったものを参考に構築しました。
<h2>必要なもの</h2>
・テキストエディタ(Atom)
・ターミナル(Mac標準搭載のもの)

 <h2>構築の手順</h2>
実際の現場ではRubyの複数のバージョン管理が
必要とされるためrbenvというものを使う。
今回はそのrbenvをインストールするためのHomebrewを
インストールするところまでを書きます。


<h3>１.HomeBrewをインストールする</h3>

$/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

<h3>２.HomeBrewのバージョン確認</h3>
$brew -v
(〇〇 -v でバージョン確認)
Home brew 2. 1. 9をインストールしました

<h3>3.rbenvのインストール</h3>
$brew install rbenv ruby-build

<h3>４.rbenvのバージョン確認</h3>
$rbenv -v
Rbenv 1. 1. 2をインストールしました

<h3>５.Rubyのインストール</h3>

$rbenv install --list

インストール可能なRubyのバージョンを表示
↓
$rbenv install 2. 5. 0
Progate指定の2. 5. 0をインストール

<h3>６.Rubyのバージョン確認</h3>
$rbenv versions


<h3>７.使用するRubyのバージョン選択(重要)</h3>
バージョンを選択する際打つコマンド
$rbenv global 2. 5. 0

<h2>学習時間やまとめ</h2>
・約２０分
指示通り行うと２0分もかからず行うことができました。
作業中に出てきた -v や version などのコマンドを
打つことで何が行われているのか、バージョン管理の必要性
など理解しないままとりあえず行いました。

Railsは一瞬で多くの作業ができる分
悪い言い方をすると「あまり理解しないでも作れてしまう」
ことがデメリットとして挙げられるそうです。

現在初学者のためまず挫折しない事を考え「とりあえず制作物を完成させる」
事を目標に学習していきますが、将来実務で利用する可能性も考え
ある程度理解したら立ち戻って深い理解に努めたいと思います。
Nuxt.jsで異なるコンポーネントから共通で利用できる関数を定義する（mixin編）

異なるコンポーネントから共通で利用できる関数を定義したかったので、試してみました。

今回はmixinの機能を利用しましたが、[inject](https://ja.nuxtjs.org/guide/plugins/#%E7%B5%B1%E5%90%88%E3%81%95%E3%82%8C%E3%81%9F%E6%B3%A8%E5%85%A5)の機能を利用することもできるようです。
こちらについても、今度試してみようと思います。

→ [試しました](https://qiita.com/itouuuuuuuuu/items/bcad408842c7723e7ca3)
※ `asyncData` や `fetch` 等のSSR時も関数を利用できるため、こちらの方が良いかもしれません。

# mixinに関数を定義する
`plugins/` 内に `mixin-common-methods.js` というファイルを作成し、ここに関数を定義していきます。
今回は例として `truncate(str, length)` という、文字列が指定された文字数以上の場合は省略する関数を定義するものとします。

```plugins/mixin-common-methods.js
import Vue from 'vue'

Vue.mixin({
  methods: {
    truncate(str, length) {
      return str.length <= length ? str: (str.substr(0, length) + "...");
    }
  }
})
```

# nuxt.config.jsに設定を追加
`nuxt.config.js` に設定を追加します。

```nuxt.config.js
plugins: [
  '@/plugins/mixin-common-methods'
],
```

# コンポーネントからの利用
コンポーネントからは、下記のように利用することができます。

```pages/index.vue
<script>
export default {
  methods: {
    hoge() {
      return this.truncate('省略したい文字列', 5);
    }
  }
}
</script>
```

以上！
Pythonの勉強まとめ Part.3

##formatを使った構文まとめ

①"A is {}".format("B") →Aのカッコ内にBを代入する
<pre>'a is {}'.format('a')         → 'a is a'
'a is {}'.format('test')      →'a is test'
'a is {} {} {}'.format(1,2,3) →'a is 1 2 3'</pre>

②"A is {0} {1} {2]}".format(1,2,3) → インデックスの0,1,2にそれぞれ1,2,3を代入する。
インデックスの番号を変更するとインデックスに対応した値を入れることができる
<pre>例.'a is {2} {0} {1}'.format(1,2,3) →'a is 3 1 2'となる。</pre>

③文字を入れることもできる
<pre>"My name is {0} {1}".format("Mr." "Yoshi") → "My name is Mr. Yoshi"</pre>

④それぞれ変数を代入することもできる
<pre>"My name is {name} {family}.Watashi no namae ha {family} {name}".format(name ="Yoshi",family = "Mr.") →"My name is Yoshi Mr..Watashi no namae ha Mr. Yoshi"</pre>