OmniAICreator/Qiita-1.07M huggingface dataset:
Phalcon3.4セットアップメモ (Amazon Linux2)

## 目的

PHPのフレームワークの中でも高速と言われている「Phalcon」のセットアップを行う

## ベース環境

OS : Amazon Linux 2
nginx : 1.12
php : 7.2

※ 以下ページで作成した環境をベースとする
https://qiita.com/knymssh/items/15bb876da0688db5feb1

※ EC2インスタンスタイプは「t2.micro」だとソースコードからのコンパイル時にメモリ不足となるため、「t2.medium」で実行

## Phalcon(3.4)のインストール

#### ソースコードからコンパイル

※ 手順は公式サイトを参考
https://docs.phalconphp.com/ja/3.4/installation#installation-sources

コンパイルに必要なパッケージをインストール

```
sudo yum install -y gcc make php-devel git
```

ソースコード取得、コンパイル実行

```
git clone https://github.com/phalcon/cphalcon
cd cphalcon/build
sudo ./install
```

#### /etc/php.d/phalcon.ini (新規ファイル)

モジュール読み込みの設定を追加

```
echo 'extension=phalcon.so' | sudo tee /etc/php.d/phalcon.ini
```

#### /etc/nginx/conf.d/phalcon.conf (新規ファイル)

※ 公式サイトの記載を参考に設定
https://docs.phalconphp.com/ja/3.4/webserver-setup#nginx

#### サービス再起動

```
$ sudo systemctl restart php-fpm
$ sudo systemctl restart nginx
```

#### 確認

phalconモジュールが正常に組み込まれていることを確認

```
$ php -r 'print_r(get_loaded_extensions());' | grep phalcon
    [34] => phalcon
```

また、ブラウザからphpinfoにアクセスして、「phalcon」のセクションが追加されていることを確認

## 補足

phalconはremiリポジトリからもインストールできますが、
今回のベース環境ではphalconが有効にならなかったため、この手順は使用していません。

```
# 外部リポジトリを追加(epel,remi)
$ sudo amazon-linux-extras install -y epel
$ sudo yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

# リポジトリ確認
$ ll /etc/yum.repos.d/ | grep remi-php72
-rw-r--r-- 1 root root 1314  6月 19 17:28 remi-php72.repo

# Phalconのパッケージ検索
$ yum search --enablerepo=remi-php72 phalcon | grep php72
php72-php-phalcon3.x86_64 : Phalcon Framework

# Phalconのバッケージをインストール
$ sudo yum install -y --enablerepo=remi-php72 php72-php-phalcon3

# インストール確認
$ yum list installed | grep phalcon
php72-php-phalcon3.x86_64      3.4.1-2.el7.remi               @remi-safe
```

## 参考サイト

https://docs.phalconphp.com/ja/3.4/installation
https://docs.phalconphp.com/ja/3.4/webserver-setup
https://blog.apibank.jp/make_php_framework_phalcon/
Laravel5.7、mysql8の環境でDB接続が失敗する場合の対応 

Laravelのmysql接続でちょっとハマったのでメモ。

## 環境

Laravel 5.7.13
mysql 8.0.12

Laravelをmysqlに接続するにはconfig/database.php、.envを修正する必要がある。
ホスト名、ユーザー名、パスワードの変更をする。

サクッと変更して、さっそく簡単な接続テストを・・・とページにアクセスすると以下のエラー。


```
SQLSTATE[HY000] [2006] MySQL server has gone away
```

なんでや！と思って設定を見直すも、database.phpや.envに問題は見当たらない・・・。
少しググってみると、以下のような記事がいくつかヒットした。

[MySQL8.0 認証方式を変更する](https://qiita.com/ucan-lab/items/3ae911b7e13287a5b917)
## mysql8からパスワードの認証方式が変更になった

以前は「mysql_native_password」というパスワード認証方式が使われていたそうだが、mysql8からは「caching_sha2_password」という認証方式に変わったらしい。

そしてLaravelはcaching_sha2_passwordに対応していないため、エラーが起きるとのこと。

ははーん、なるほどね〜、と思いつつ、この認証方式は簡単に変えられるということなので、さっそくmysqlから以下のコマンドで変更を行おうとする。

```
// mysqlユーザーのパスワード認証方式を確認
SELECT user, host, plugin FROM mysql.user;

+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| cakephp3         | localhost | caching_sha2_password |
| laravel          | localhost | mysql_native_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | mysql_native_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | mysql_native_password |
+------------------+-----------+-----------------------+
6 rows in set (0.00 sec)
```

あれ？ ユーザー「laravel」はmysql_native_passwordになってるやん！
なのに繋がらないのはどうして・・・？

## Laravel5.7、かつmysql8の環境では「caching_sha2_password」でしか接続できない・・・？

Laravel側のエラー文をよく見てみると、

```
PDO::__construct(): Unexpected server respose while doing caching_sha2 auth: 109 (0)
```
とあり、caching_sha2での処理中にエラーが起きた的なことが書いてある。
もしかしてLaravel5.7、mysql8の環境ではmysql_native_passwordではなく、caching_sha2_passwordで処理されているのか・・・？
と思い、認証方式を変更してみる。

```
// ユーザーのパスワード認証方式を変更
ALTER USER 'laravel'@'localhost' IDENTIFIED WITH caching_sha2_password BY '***';

// caching_sha2_passwordへの変更を確認
SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| cakephp3         | localhost | caching_sha2_password |
| laravel          | localhost | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | mysql_native_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | mysql_native_password |
+------------------+-----------+-----------------------+
```

この状態で再度接続テスト。結果、動いた！

Laravel5.7から、mysql8の接続にはcaching_sha2_passwordしか認められなくなったのかどうかは定かではないが、とりあえず問題は解決したのでOKということにしておこう・・・。

自分と同じ環境で詰まっている人がいたら、一度mysqlのパスワード認証方式を確認してみるといいかも。
自分用Java初期設定

#インストール
##JRE
Windows版64ビット
https://www.java.com/ja/download/windows-64bit.jsp
##JDK
JREとバージョンを合わせる
https://www.oracle.com/technetwork/java/javase/downloads/index.html
#環境変数の設定
コントロールパネル→システム→システムの詳細設定→環境変数
`JAVA_HOME`に`C:\Program Files\Java\jdk1.8.0_192`などとして追加。
`Path`に`%JAVA_HOME%\bin`を追加。
#動作確認
テキストエディタで

```Java:Hello.java
public class Hello {
	public static void main(String[] args){
		System.out.println("Hello, world.");
	}
}
```
を`Hello.java`として保存し、コマンドプロンプトで
`javac Hello.java`
`java Hello`
として`Hello, world.`が表示されればOK。
ubuntu18.04LTSでopenMPI 4.0.0をcuda有効にしてパッケージ化してインストールする方法

ChainerMNにcuda有効化openMPIが必要だったので，openMPIの最新4.0.0をパッケージ化してUbuntuに入れる方法．

- rpmbuildのオプションに`--with-cuda`を入れ込む
- `--enable-mpi1-compatibility`を入れないと実行時エラーが出た．．．

```bash
wget https://download.open-mpi.org/release/open-mpi/v4.0/openmpi-4.0.0-1.src.rpm
rpm -i openmpi-4.0.0-1.src.rpm
cd ~/rpmbuild/SPECS
rpmbuild -ba --define 'configure_options --with-cuda --enable-mpi1-compatibility' openmpi-4.0.0.spec

cd ~/rpmbuild/RPMS/x86_64/
fakeroot alien openmpi-4.0.0-1.x86_64.rpm
sudo dpkg -i openmpi_4.0.0-2_amd64.deb
```

あとは`pip install mpi4py`すれば`chainer/example/chainermn/`以下のサンプルコードが動く．
思考回路の話 - GitHubへの理解

#はじめに
この記事では、GitHubに対してめちゃくちゃに苦手意識を持っていた個人的経験を振り返ります。
何故にGitHubと理解し合えなかったか、その後どのようにして使えるようになったかをつらつらとお話しして行きます。

#なんでGitHubを使うん？
そもそも論ですね。なぜに私はこれを理解して使わなければならないのか、ここがまず理解できなかった点です。

#なんでやったか
結論、一言で言いますと、**便利だから**、これに尽きます。
GitHubの仕組みを使いながらある程度理解しあとで、なんと便利な代物かと感動した記憶があります。

#理解１　-　有用性を理解する
1. GitHubは『自分の作品を貯めておける倉庫』
2. コードの公開、閲覧が可能
3. バージョン管理システム

以上三点が、私の思うGitHubの有用性です。
まず第一に、GitHubは**『自分の作品を貯めておける倉庫』**だと言う点です。
しかも、サーバ上にあるので公開リポジトリであれば、世界中の人に自分の作品、延いては**自分のコードを見てもらえる**んです。もちろん、自分もたくさんのプログラマのコードを見れる！それでいて作品の製作過程を記録できる**バージョン管理システム**でもある....!!

**もうこれは使うしかないっすね.....!!!!!!!!!**

#理解２　-　もっと有用性を体感する
GitHubへの理解を難しくしているのが、今自分が
1. どこにいて
2. 何のために
3. 何をしなければならないか
が、分からないと言うところに集約されます。

逆に言えば、これらさえ理解してしまえば、GitHubは怖くない!
しかしこれが難しい。。。
頑張ろうぜヽ(^ω^＼)( /^ω^)ﾉ
頑張るぜ、私ヽ(^ω^＼)( /^ω^)ﾉ

#理解３　-　どうやる？
あくまでも個人的見解に過ぎません。その点、ご了承下さいませ。

Step1 - 既に理解している人に**ガンガン聞く**
Step2 - なんとなくの流れをイメージとして掴む
Step3 - とりあえずやってみる

以上です。わかんなーいって思っていても何も解決しません。
唯一、**「解らない」ことが分かっています**。ならばそれを解決するためにできることをするのみです。

#最後に
この記事は、GitHubへの理解を手助けするものです。こんな風に考えたら使いこなすことに一歩近ずくよ〜ってのを書き連ねております。
実際の使い方は気が向いたら別記事に書こうかな。

ではでは〜´ω`)ﾉ
【Unity(C#)】ゲームオブジェクトをA地点→B地点まで動そうとしたら失敗した話

 
　　
　　
　　
この記事は

**『プログラミング完全未経験からUnityでの開発現場に迎え入れてもらえた世界一の幸せ者』**

の記事です。そのつもりでお読みください。


　　
先に言っときますと、unityにはアニメーションという機能がありますので、
**ただ二点間を移動させたいならアニメーションで再現したほうが圧倒的に効率が良い**です。
  
  
  
じゃあ、なんでこんなことをしようと思ったかというと
当時の自分は**覚えたことだけでなんとかしようとしてた**からです。

###もっと楽にできんのか？めんどくさすぎる。
という気持ちが大事だと痛感しました。
　　
　　

##"A地点とB地点の差"がゼロになるまでループ(加算代入、減算代入)させる


```C#
 //遠くに置いたmoveObjectをgoalPointのある座標まで移動させる

    public GameObject moveObject; 
    public GameObject goalPoint;

    Vector3 move_Position;
    Vector3 toGoPoint;

    float moveSpeed = 0.01f; //移動速度　

    void Start()
    {
        move_Position = moveObject.transform.position; //移動させたいオブジェクトの座標
        toGoPoint = goalPoint.transform.position;      //目的地に設置したオブジェクトの座標
    }

    void Update()
    {
        if (move_Position.z > toGoPoint.z)
        {
            move_Position.z -= moveSpeed;
            moveObject.transform.position = move_Position;
        }

    }
```

ちゃんと移動してくれたんですが、ぴったりと目的地に設置したオブジェクトと重なりませんでした。
なぜ重ならないのか調べるために、二点間の距離を`print();`で表示してみました。
![浮動小数点　循環.png](https://qiita-image-store.s3.amazonaws.com/0/244071/35f33503-8b24-4d03-05df-1d7df528347c.png)


途中で細かい数字ですがズレているのがわかりました。


##浮動小数点数型のズレ
[参考サイト](https://dobon.net/vb/dotnet/beginner/floatingpointerror.html)：小数（浮動小数点数型）の計算が思った結果にならない理由と解決法

↑　10進数の小数を2進数に変換すると同じ数字が永遠に循環してしまうそうです。
そのため、**小数は限りなくその数字に近い数値として丸められる**とのことでした。
なのでループで何百回も回した結果、誤差が生じてしまったのだと思います。たぶん。

あと、このやり方だと
"移動させたいオブジェクトの座標の方が目的地に設置したオブジェクトの座標より小さい場合"
"Y座標もX座標も移動させたい場合"
などいろいろ問題が出てきて非常にめんどくさいです。

楽なやり方でやりましょう。
アニメーションは今度まとめまーす。
自分用Vue.js リンク集

ググったときに偶然見つけたりした記事のストック場所
#### prop, emit
https://webman-japan.com/memo/vue-parent-and-child/

#### slotの解説
https://iwb.jp/javascript-vuejs-slot-howto-sample/

#### コンポーネントの切り替えに:isを使うパターン
- https://jsfiddle.net/chrisvfritz/o3nycadu/
- https://jp.vuejs.org/v2/guide/components.html#%E5%8B%95%E7%9A%84%E3%81%AA%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88
- https://jp.vuejs.org/v2/api/#is


#### v-onとかのイベントハンドラ一覧
https://blog-asnpce.com/technology/744
Azure App ServiceでIP制限

##はじめに
開発中のアプリを他者に見させたくないと思いますので、
App Serviceの中でできるIP制限を説明します。
##目次
1. web.configでのIP制限
2. Azure App ServiceのIP制限

## web.configでのIP制限
まず、FTPやkuduを使用して、**D:\home\site\wwwroot**フォルダに**web.config**を作成します。
ホワイトリスト形式でIP制限をする例です。
自身のIPアドレスを確認するには、アクセスログを確認するか、以下のサイトなどで確認できます。
https://www.ugtop.com/spill.shtml

デフォルトで**403(Forbidden)**が返ります。
他のステータスコードを返却したい場合は以下を参考に**denyAction**を設定してください。
https://docs.microsoft.com/en-us/iis/configuration/system.webserver/security/ipsecurity/
※web.configは編集する度に再起動が発生します。

```xml:web.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <security>
      <ipSecurity allowUnlisted="false">
       <!-- YOUR IP Address -->
       <add allowed="true" ipAddress="XX.XX.XX.XX" subnetMask="255.255.255.0" />
      </ipSecurity>
    </security>
  </system.webServer>
</configuration>
```

## Azure App ServiceのIP制限
以下の記事を参考にすれば、基本的に問題なく実施できます。
https://docs.microsoft.com/ja-jp/azure/app-service/app-service-ip-restrictions

利点としては、web.configは編集するたびに再起動が発生しますが、Azure App ServiceのIP制限では再起動が発生しません。
しかし難点もあり、デフォルトで**403(Forbidden)**が返るのですが、現状では他のステータスコードに変更することはできません。
また、403のエラー画面が下記なのですが、カスタマイズができないようです。
※いずれカスタマイズできたらうれしいです。
![403.PNG](https://qiita-image-store.s3.amazonaws.com/0/310126/9ffdf774-a1fa-2b17-11d0-d7e4d85b72fd.png)

おわりです。
サーマルプリンタで印刷する: Chrome拡張編

## 0. 前回までのあらすじ

1. サーマルプリンタをLinuxから印刷できるように[セットアップ](https://qiita.com/yuyakato/items/7d4db1c567d952a7ac91)しました。
2. Raspberry Piから文字、画像を[テスト印刷](https://qiita.com/yuyakato/items/3309b0ede886c2698526)しました。
3. 画像を印刷するための[印刷サービス](https://qiita.com/yuyakato/items/24666dff3ea1a6a86672)を構築しました。
4. HTMLを画像に変換するために[レンダリングサービス](https://qiita.com/yuyakato/items/750364647bbb189016bb)を構築しました。
5. Webブラウザから簡単にHTMLを印刷するために[Webアプリ](https://qiita.com/yuyakato/items/99f09875348539531da4)を構築しました。

これまでの記事については『[目次](https://qiita.com/yuyakato/items/288962fbc39446644668)』をご覧ください。

## 1. Chrome拡張をセットアップする

とても長い道のりでしたが、ここまで来てやっと「WebブラウザからGitHubのIssueをカンバンに貼るために印刷する」ための準備が整いました。

サーマルプリンタ、印刷サービス、レンダリングサービスを使ってWebブラウザ（Google Chrome、Chromium）から印刷するためのChrome拡張を実装しました。名前は雑な感じですが「GitHub Printer」としています。
ソースコードは https://github.com/nayutaya/thermal-printer/tree/master/extension/github_printer をご参照ください。

まず、Chrome拡張のソースコードを取得します。

```text
$ mkdir -p ~/repo/github.com/nayutaya
$ cd ~/repo/github.com/nayutaya/
$ git clone https://github.com/nayutaya/thermal-printer.git

$ cd ~/repo/github.com/nayutaya/thermal-printer/
$ git pull
$ git checkout extension-github-printer-v1.0.0
$ git branch -v
* (HEAD detached at tool-html-print-v1.0.0) f44670c Merge pull request #13 from nayutaya/update_html_print_tool
  master f44670c Merge pull request #13 from nayutaya/update_html_print_tool
```

続いて、Google Chrome（またはChromium）で拡張を追加します。以下、英語版での手順です。

1. メニューボタンをクリックする。
2. 「More Tools」を選択する。
3. 「Extensions」を選択する。
4. 画面右上の「Developer mode」を有効化する。
5. 「LOAD UNPACKED」をクリックする。
6. `manifest.json`が含まれるディレクトリ（`extension/github_printer`）を選択する。

ツールバーに「GitHub Printer」のアイコンが表示されれば完了です。

## 2. WebブラウザからGitHubのIssueを印刷する

Google Chrome（またはChromium）でGitHubのIssueを開いている状態で「GitHub Printer」のアイコンをクリックし、「Preview」ボタン、「Print」ボタンを押下することで、Issueを印刷することができます。

<img width="1120" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/58479/97177b03-d0c5-12d8-8744-3cc7e13a3f7e.png">

印刷されたレシート用紙には、プロジェクト名、Issue番号、Issueのタイトルが含まれています。

![photo.jpg](https://qiita-image-store.s3.amazonaws.com/0/58479/eab3707e-b714-3068-713e-5e7c3bd61478.jpeg)

「GitHub Printer」はGitHubのIssueの他、Pull Requestにも対応しています。また、GitLabのIssue、Merge Requestにも対応していますが、独自ドメインで運用されていることがほとんどだと思いますので、個別に設定（`extension/github_printer/manifest.json`の`content_scripts`）を修正する必要があります。
gem sqlite3がインストールできなかった。

## os情報
Mac Mojava

## bundle install しよっと
```
An error occurred while installing sqlite3 (1.3.13), and Bundler cannot continue.
Make sure that `gem install sqlite3 -v '1.3.13' --source 'https://rubygems.org/'` succeeds before
bundling.
```

## じゃあ `gem install sqlite3 -v '1.3.13' --source 'https://rubygems.org/'` を実施しよ

```
ERROR:  Error installing sqlite3:
	ERROR: Failed to build gem native extension.

    current directory: /Users/#{ユーザー名}/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/sqlite3-1.3.13/ext/sqlite3
/Users/#{ユーザー名}/.rbenv/versions/2.4.1/bin/ruby -r ./siteconf20181125-2414-1pdp28o.rb extconf.rb

*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

To see why this extension failed to compile, please check the mkmf.log which can be found here:

  /Users/#{ユーザー名}/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/extensions/x86_64-darwin-17/2.4.0-static/sqlite3-1.3.13/mkmf.log

```

## じゃあログ見ます・・・

```
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun     at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```

* デベロッパーの権限がない？

## 以下を実行します！
```
xcode-select --install
```

## 再度実行

```
bundle install

Fetching sqlite3 1.3.13
Installing sqlite3 1.3.13 with native extensions
Bundle complete! 5 Gemfile dependencies, 18 gems now installed.
Bundled gems are installed into `./vendor/bundle`
```


めでたしめでたし！
tmux 2.8 install ubuntu16.04

# はじめに

ubuntu 16.04にtmux2.8 (2018年11月で最新) を導入する方法を備忘録で残しておきます



# defaultでinstallされている tmux2.1 を uninstall

```
apt remove tmux
```



# GitHubから tmux 2.8 を導入

前提パッケージ導入

```
sudo apt -y install build-essential libevent-dev libncurses5-dev
```



GitHubのReleaseから 2.8 をダウンロード

```
mkdir ~/tmux
cd ~/tmux
curl -LO https://github.com/tmux/tmux/releases/download/2.8/tmux-2.8.tar.gz
tar xfvz tmux-2.8.tar.gz
cd tmux-2.8/
./configure && make
```



tmux のバイナリをpathにコピー

```
sudo cp -p ~/tmux/tmux-2.8/tmux /usr/local/sbin/
```





# 参考URL

https://github.com/tmux/tmux
Dockerを使用したRails開発⑥(ビュー)

# やること
・CSSフレームワークの設定
・作成する画面ラインナップ整理

# CSSフレームワークの設定
今回は、bootstrapを使用してみようと思います。

Gemfileに以下を追記後、`docker-compose build`を実行

```ruby:Gemfile
gem 'bootstrap'
gem 'jquery-rails'
```

あとは、application.scssとapplication.jsを修正します。

app/assets/stylesheets/application.cssの拡張子をscssに変更し、以下のように修正

```scss:application.scss
*= require_tree . ← これは削除
*= require_self ← これは削除
@import "bootstrap";
```

app/assets/javascripts/application.jsに以下を追記

```js:application.js
//= require jquery3
//= require popper
//= require bootstrap-sprockets
```

これで設定完了！・・・と思いきや

Autoprefixer doesn’t support Node v4.8.2. Update it.
(＝Autoprefixerはノードv4.8.2をサポートしていません。それを更新してください。)というエラーが出て画面が立ち上がりませんでした。

調べたらGemfileに以下を追記することで解決。
正直なんで解決したのか不明。。。

```ruby:Gemfile
gem 'mini_racer'
```

# 作成する画面ラインナップ整理

今更ですが、ツーリング仲間募集サイト（よくある掲示板サイトを多少アレンジしたもの）をテーマに勉強しています。
なので、作る画面は以下の通りです。

- **一覧画面(index.html.erb)**：新規作成・編集・詳細・削除ボタンを配置したよくある掲示板の投稿一覧画面。

- **新規画面(new.html.erb)**：投稿を新規作成する画面。

- **詳細画面(show.html.erb)**：投稿内容の詳細を表示する画面。コメント機能もここに実装。

- **編集画面(edit.html.erb)**：投稿を編集する画面。

- **フォームパーシャル(_form.html.erb)**：新規画面と編集画面はレイアウトがほとんどが同じであるため、２つの画面に埋め込むための共通画面。

これらの画面は全て[前回の記事](https://qiita.com/Nishi53454367/items/487b33b47dd255cd0221)で実行したpost用のジェネレーターコマンドで作成されます。

最終的にMap埋め込んでツーリングのルート表示させたり、投稿者が写真や動画を投稿できる機能も実装していきたいと思います。

# 最後に
これから画面ゴリゴリ作ったり、実務で使いそうなdockerとkubernetes勉強したりするのでこの記事は①〜⑥までで一旦終わり。
自分の理解用にまとめただけなので、大した内容ではありませんでしたが、読んだり編集リクエストくれた方ありがとうございました。
これからは小ネタを中心に役に立ちそうなこと頑張ってまとめていこうと思います！
くっそ使えるpython/jupyterで通知機能を使おう！　notify.run

# 概要
機械学習なり、重い処理を用意してそれを実行してすることはpythonを使っていると割と良くあります。こんなときに、通知が携帯に飛んでくれたらと思うことはあると思います。

それを簡単にやってくれるのが**[notify](https://notify.run/)**です。

# notify
https://notify.run/
このページに行きましょう。すぐに使い方はわかります。

といっても、これじゃ記事の意味ないので解説も載せます。
## 使い方

**install**

```bash
pip install notify-run
```

**使う**

```python
from notify_run import Notify
notify = Notify()
notify.register() # jupyterで実行するとinline上にQRコードが出てきます。スマホで読みましょう
notify.send('Hello notify!') # スマホにHello notify!と通知が届くはず…
```
ReactDOMのrender()とReact.Componentのrender()の違いを理解する

どちらも同じ名前の`render()`というメソッドですが、やっていることは全然違いますね。

## ReactDOMのrender()

### そもそもReactDOMって？
[ReactDOM](https://reactjs.org/docs/react-dom.html)
`react-dom`パッケージは、アプリケーションの最上位のレベルで使用できるDOM固有のメソッドと必要に応じてReactモデルの外に出るエスケープハッチを提供しています。

`render()`以外にも、`hydrate()`, `unmountComponentAtNode()`, `findDOMNode()`, `createPortal()`なんかがあります。

### render()

```react

ReactDOM.render(element, container[, callback])
```

`ReactDOM.render()`はReact要素を指定された`container`の中のDOMにレンダリングし、そのコンポーネントへの参照を返します。(ステートレスの場合は`null`)

React要素がすでに`container`にレンダリングされていた場合、最新のReact要素を反映するために必要に応じてDOMを更新するだけとなります。

`callback`がある場合はコンポーネントのレンダリングまたは更新後に実行されます。

```react

const element = <h1>Hello, world</h1>;
ReactDOM.render(element, document.getElementById('root'));
```

この場合は`root`のIDをもつDOM要素(コンテナ)に`<h1>Hello, world</h1>`という要素をレンダリングします。

`ReactDOM.render()`は、渡したコンテナノードの内容を制御しており、内部の既存のDOM要素は最初の呼び出しで全て置き換えられ、その後の呼び出しでは効率的な更新のために差分を利用します(DOM diffing algorithm)

## React.Componentのrender()

### そもそもReact.Componentって？

[React.Component](https://reactjs.org/docs/react-component.html)
Reactでは、コンポーネントをクラスまたは関数として定義できますが、クラスで定義する時に`React.Component`を`extends`してサブクラスを定義する必要があります。

### render()

```react

render()
```

`React.Component`のサブクラスで定義する必要のある唯一のメソッドが`render()`です。
これば呼ばれると、`this.props`と`this.state`を調べて次のいずれかを返す必要があります。

- React elements
    - 通常であればJSXで作成され、例えば`<div />`といったDOMノードや`<MyComponent />`とったユーザー定義コンポーネントです。

- Array and fragments
    - 複数の要素を返すようにします。詳しくは[Fragments](https://reactjs.org/docs/fragments.html)参照


- Portals
    - 子要素を別のDOMサブツリーにレンダリングさせます。（親要素の階層の外にレンダリング可能）。詳しくは[portals](https://reactjs.org/docs/portals.html)

- String and numbers
    - DOM内のテキストノードとしてレンダリングされます。

- Booleans or null
    - なにもレンダリングしません。(`return test && <Child />`パターンをサポートするため、testはブール値)

```react
class Welcome extends React.Component {
  render() {
    return !!this.props.name && <h1>Hello, {this.props.name}</h1>;
  }
}
```

この場合だと`this.props.name`を調べてから`<h1>Hello, {this.props.name}</h1>`という要素を返していますね(`this.props.name`がない場合は`false`)。

## まとめ
`React.DOM`の`render()`が実際のDOM要素にレンダリングを行なっているのに対し、
`React.Component`の`render()`は`this.props`と`this.state`を調べた後React要素などを返しているだけとなります。
Finished with error: FormatException: Bad UTF-8 encoding 0x92 (at offset 0)

# 解決策
Android StudioのProject EncodingをUTF-8に変更する。

# 手順
File->Other Settings->Default Settings...->Editor->File Encodings

Project Encoding: UTF-8にする。

<img width="1041" alt="Screen Shot 2018-11-25 at 1.40.23 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/130026/ba3bff45-2b26-9089-b803-36ec5fba5eea.png">

# Visual Studio Codeの場合

setting.jsonに以下の設定を追加
```"files.encoding": "utf8",```
UMLを学ぶETロボコンメンバーに送るUML講座１〜UMLを学ぶ意義〜

#UMLを学ぶ上で概要を知っておこう
##UMLってなに？
　UML（Unified Modeling Language）とは、オブジェクト指向によって複雑性を排除したシステムを設計するために用いられるモデリング言語です。
　**開発において、設計を捗らせる効果を持ちます。**
　

#なぜUMLを学ぶ必要があるの？
###設計の重要性がわかればUMLの重要性わかる
####設計の重要性について
　家を建てるときに設計をしない建築家はいません。
　システム開発でもそれは同じことが言えます。

　大きなシステムを作るとき、何も設計をせずに作っていくとどうなるでしょうか。
　最初のうちはいいかもしれません。しかし、コード量が増えるにしたがって、どこにどの処理を書いたのかわからなくなったり、バグが発生した際に、依存関係が整理ができていないがためにバグがどこにあるのかがわからなくなってしまいます。

　最終的に何が残るかというとスパゲッティコードです。
　読みたくないですよね。スパゲッティコード。
　でも、生み出したら最後、あなたはスパゲッティコードと付き合わなければなりません。嫌でしょう？
　もしあなたがスパゲッティコードとのお付き合いを容認するにしても、無計画なコーディングはチームメンバーの作業効率を落とすことにつながりかねません。
　
　そうした事態を避けるために設計を行います。
　そして、その**設計を捗らせるのがUML**です。

####設計におけるUMLの役割
　UMLはソフトウェアが持つ機能、構造、振る舞いを**視覚的に**表してくれます。**視覚的にシステムを俯瞰して見られる**、という点がポイントです。

　**ソースコードだったら俯瞰して見るのははっきり言って無理です。**一面に表示される文字を眺めて、「このSubクラスはBaseクラスを継承しているから、メンバ関数としてfunction1()を持っていて……」という風に、ミクロ的な（非常に狭い範囲での）視点でしかクラス間の関係性を理解することはできません。

 こうした場合、UMLを使っていれば、まず関係するクラス全体が目に入ります。しかもそれらが線でつながっているので、それぞれがどういう関係を持っているのかも一目でわかります。

　こうした特性からわかるように、UMLは**機能、構造、振る舞いといった、それぞれの妥当性を多人数で検討するために有効な手段**です。

 議論はより良いものを作り出すための燃料になります。UMLはその着火剤になります。

##UMLをより理解するために

####UMLの生い立ち
　オブジェクト指向が世の中に浸透し始めた頃、ソフトウェアの構造や振る舞いなどの表現記法は各プログラミング言語ごとにあるというような状態で、一つの言語に使用される表現方法を学んだとしても、他の表現方法を学んだ人との意思疎通が困難になっていました。

　こうした問題を解決するために、オブジェクト指向におけるソフトウェア表現のやり方を統一しよう、ということで生まれたのがUMLです。

####UMLをより理解するために必要なこと
　こうした背景からわかるように、**オブジェクト指向を知ることは、UMLを使う上で必ず必要です**。
　というか、オブジェクト指向があってこそのUMLなので、重要性はいわずもがなでしょう。

　というわけで、オブジェクト指向についても理解するとよいです。

#UMLの主要な図とかんたんな説明
|図の名前|役割　　　　　　　　　　　　　　　　　　　|
|:------------------------:|:-------------------|
|ユースケース図         |システムに関係する役者、機能などを表現|
|クラス図              |クラスのメンバ、メンバ関数を定義し、また、他のクラスとの関係も表現する。|
|シーケンス図           |クラス図で定義されたそれぞれのオブジェクトが実際にどのように呼び出しを行い、機能を実現しているかを表現する。|

　それぞれの図は相互に関係してます。クラス図が変わったら当然、シーケンス図も変更しなければなりません。
　次回以降はそれぞれについて掘り下げていこうと思います。

#〜まとめ〜UMLとは
　　-UMLは、システムを考えるための「言葉」です。
　　-UMLは、システムを表現するための「言葉」です。
　　-UMLは、システムについて議論するための「言葉」です。

#参考文献
「UMLとは？」https://inim.online/2018/08/11/uml/#i
「かんたんUML入門」技術評論社竹政昭利ほか（2017）＜ーおすすめ
[OutLook][VBA][VBS]2019年の追加予定祝日をOutlookに加えるVBAマクロ

# とはいうものの稼働はまだ

実はこの記事を書いている時点ではまだ確定的ではありません。（2018/11/24現在）

##VBSに張り付けたときはここをコメントアウトについて
俗にコメントアウトとは、行頭にアポストロフをつけて半角スペースを入れることを言います。応用としてここからコメントアウトもあります

```vb
Sub HolidaySetting2019Japan() 'VBSに貼りつけたときはここをコメントアウト
```

をコメントアウトするときは

```vb
'Sub HolidaySetting2019Japan() 'VBSに貼りつけたときはここをコメントアウト
```
または

```vb
REM Sub HolidaySetting2019Japan() 'VBSに貼りつけたときはここをコメントアウト
```

今回は複雑になるのでスクリプト（コード）はそのままとしましたが、

```vb
Dim MyITEM 'As Outlook.AppointmentItem 
```
は本当はVBAに貼り付けるときは

```vb
Dim MyITEM As Outlook.AppointmentItem 
```
の方がいいわけですが、VBSとVBAに共通なコードとしてコメントアウトの数を減らしたいので、ここはコメントアウトのままにしました。これでも何をこの変数に入れたいのか、型は決まらなくても人間にはわかります。

```vb

Sub HolidaySetting2019Japan() 'VBSに貼りつけたときはここをコメントアウト
Dim olApp: Set olApp = CreateObject("Outlook.Application")
Dim NS: Set NS = olApp.GetNamespace("MAPI")
Dim oFol: Set oFol = NS.GetDefaultFolder(9): oFol.Display 'Defaulｔのアカウントのカレンダーを表示(複数のアカウントを使用している場合、標準のアカウントのみに作成されます。アカウントが一つでもオンラインとオフラインがある場合、標準にしている予定表に作成されます)
Dim MyITEM 'As Outlook.AppointmentItem 
Dim oPattern 'As Outlook.RecurrencePattern 
Set MyITEM = olApp.CreateItem(1)
MyITEM.Display
olApp.ActiveWindow.WindowState = 2
MyITEM.Subject = "皇太子殿下即位・改元"
With MyITEM
.AllDayEvent = True
.BusyStatus = 1 'olTentative
.Location = "Japan(日本)"
.Start = #5/1/2019#
.End = #5/1/2019#
.Save
.Close 0
End With
Set MyITEM = olApp.CreateItem(1)
MyITEM.Display
olApp.ActiveWindow.WindowState = 2
MyITEM.Subject = "皇太子殿下即位・改元(仮の名称)"
With MyITEM
.AllDayEvent = True
.BusyStatus = 1 'olTentative
.Location = "Japan(日本)"
.Start = #10/22/2019#
.End = #10/22/2019#
.Save
.Close 0
End With
Set MyITEM = olApp.CreateItem(1)
MyITEM.Display
olApp.ActiveWindow.WindowState = 2
MyITEM.Subject = "即位礼正殿の儀の日(仮の名称)"
With MyITEM
.AllDayEvent = True
.BusyStatus = 1 'olTentative
.Location = "Japan(日本)"
.Start = #4/30/2019#
.End = #4/30/2019#
.Body = "2019年5月1日が皇太子殿下即位・改元のための祝日となり4月29日と5月1日で挟まれた30日は国民の休日となる"
.Save
.Close 0
End With
Set MyITEM = olApp.CreateItem(1)
MyITEM.Display
olApp.ActiveWindow.WindowState = 2
MyITEM.Subject = "国民の休日"
With MyITEM
.AllDayEvent = True
.BusyStatus = 1 'olTentative
.Location = "Japan(日本)"
.Start = #5/2/2019#
.End = #5/2/2019#
.Body = "2019年5月1日が皇太子殿下即位・改元のための祝日となり5月3日と5月1日で挟まれた2日は国民の休日となる"
.Save
.Close 0
End With
End Sub  'VBSに貼りつけたときはここをコメントアウト
php-master-changes 2018-11-24

今日は run-tests.php の help 出力修正、不要ファイルの削除、COM オブジェクトのシリアライズ/アンシリアライズの修正、ドキュメントの修正、ext/gd で imagecreatefromjpeg() が壊れた jpeg ファイルを読む際のエラー処理の修正があった！

# 2018-11-24
## nikic: Document --show-mem as a valid run-tests.php option
- https://github.com/php/php-src/commit/62dc39edda2a0a95151d3dc424698ee8b53d3471
- run-tests.php のオプションとして --show-mem （valgrind ログを出力）の記載が --help になかったのを追加

## cmb69: Clean up server-tests.php remains
- https://github.com/php/php-src/commit/1acac320c5a88a54a5965e759f1cb33b6cd71f13
- [以前に削除した server-tests.php](https://qiita.com/sj-i/items/951e46693d1af57adf2a#nikic-remove-server-testsphp) の残留物を除去
- 当初 server-tests.php は [run-tests2.php](http://git.php.net/?p=php-src.git;a=commit;h=b671380b6b5b6e1f4f235e810afa4199e989d2ba) だったのがリネームされた
- その後 server-tests.php は削除されたが、当初一緒に導入された sapi/tests/test00? のテストケースが残っており、run-tests.php で実行すると成功はするけど意味がない、というテストだったので削除
- というかこれも元々導入したの Shane Caraveo の人か、今は全然出てこないけど当時は色々やってたんだなあ
    - Win32 も TSRM も SAPI も元をたどるとこの人、[DBGp の文書](https://xdebug.org/docs-dbgp.php)にも名前出てくるし SOAP もやってた
    - 今は Mozilla なのかな

## cmb69: Fix [#77177](https://bugs.php.net/bug.php?id=77177): Serializing or unserializing COM objects crashes
- https://github.com/php/php-src/commit/115ee49b0be12e3df7d2c7027609fbe1a1297e42
- [7.2~]
- ext/com_dotnet で、COM オブジェクトをシリアライズ/アンシリアライズするとクラッシュする問題の修正
- クラッシュはクラッシュで起きないようにしつつ、com / dotnet / variant のシリアライズ/アンシリアライズは例外を投げるようにして禁止とした

## cmb69: [ci skip] Preliminary fix for NEWS
- https://github.com/php/php-src/commit/2979c6a56ddcf45113dd30ca3ed90880dfabc972
- [7.3~]
- NEWS の 7.3.0 での修正とされていた部分を 7.3.1 に変更
- 最後の RC 版がそのままリリース版となり、バグ修正も入らないという[リリースプロセス](https://wiki.php.net/rfc/releaseprocess)のため

## petk: [ci skip] PHP 7.1 is now security-only branch
- https://github.com/php/php-src/commit/0c82597ae3106d71bb9b959980ffd1ece3c94395
- 7.1 系をセキュリティ修正のみのブランチとするようドキュメントを変更
- 7.1 系は 12 月 3 日にアクテイブサポートが終了となり、7.1.25 は通常のバグ修正が取り込まれる最後のリリースで、そのリリースブランチはすでに切られている

## cmb69: Fix [#77195](https://bugs.php.net/bug.php?id=77195): Incorrect error handling of imagecreatefromjpeg()
- https://github.com/php/php-src/commit/60a9f7a3a3502bfb7118f7fc5c06f9fdf713efad
- [7.2~]
- ext/gd で、[imagecreatefromjpeg()](http://php.net/manual/ja/function.imagecreatefromjpeg.php) が壊れた jpeg データを読む際のエラーハンドリングが変だったのを修正
- `@` 付けてもエラーが出力されたり余分な Notice が出たりしていた
- 余計な Notice が出ていたのを削除、`@` を考慮するよう修正

## cmb69: Fix test case
- https://github.com/php/php-src/commit/5af5f56fc9f56d7f7d9d4a75d4d3aef8dbe63530
- [7.2~]
- ↑の修正でテストケース内にファイルパスがハードコードされていた部分を修正
Azure Functions V2 Runtime (C#) では、ConfigurationManager が使えない

Azure Functions の Runtime が V2 になって、従来の .NET Framework から .NET Core がベースに変更になりました。そして、最初に「おや？」と気が付くのが、以下のように、ConfigurationManager を使って、アプリケーション設定から設定情報を読み込もうとした時に例外が出てしまうことです。

```c#:
var connString = ConfigurationManager.ConnectionStrings["DbConnectionString"].ConnectionString;
```

この部分は、正直、互換にして欲しかったな。。。と思いながらも、.NET Core がマルチプラットフォーム/OS に対応したものであることから、、、仕方ないかなとも思います。.NET Core では、設定情報の受け渡しが、環境変数渡しになっておりますので、以下のようにして取得する必要があります。

```c#:
// DLL 参照
#r "Microsoft.Extensions.Configuration"
#r "Microsoft.Extensions.Configuration.Abstractions"
#r "Microsoft.Extensions.Configuration.EnvironmentVariables"

// 名前空間の参照
using Microsoft.Extensions.Configuration;

public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
{
    // 環境変数からの取得
    var config = new ConfigurationBuilder()
                    .AddEnvironmentVariables()
                    .Build();
    var connString = config.GetConnectionString("DbConnectionString");
    log.LogInformation(connString);

    // ----- 省略 -----
}
```

仕様が変わった時には、どのようにコード変更すべきか明示されて然るべきことだと思いますが、残念ながら、きちんとした情報が出ておらず、試行錯誤するハメになりました。。。

もっと情報公開を頑張ってくれ、Azure さん！
一桁数字連番のファイルを二桁にリネームする


[個人的Linux: ファイル名の一括変更にrenameコマンド](http://mylinux.blog42.fc2.com/blog-entry-571.html)
>rename 変更前文字列 変更後文字列 filename

[Man page of RENAME](https://linuxjm.osdn.jp/html/util-linux/man1/rename.1.html)


```bash
$ touch {1..9}.ini {10..13}.ini

// ソートすると残念なかんじに
$ ls -1
1.ini
10.ini
11.ini
12.ini
13.ini
2.ini
3.ini
4.ini
5.ini
6.ini
7.ini
8.ini
9.ini

// renameコマンドで桁数をあわせる
$ rename '' 0 ?.ini

$ ls -1
01.ini
02.ini
03.ini
04.ini
05.ini
06.ini
07.ini
08.ini
09.ini
10.ini
11.ini
12.ini
13.ini
```
CLIにおける無邪気なワイルドカード使用の恐怖

# 背景
[Shell Style Guide](https://google.github.io/styleguide/shell.xml)を読んでいたらワイルドカードについて書いてあった。そこで初めて知ったことがあったので自己の戒めを兼ねて書く。

# 概要
[Shell Style Guide](https://google.github.io/styleguide/shell.xml)によるとファイル名は``-``から始められるから``*``ではなく``./*``の方が安全と書いてある。検証してみる。検証環境はbash-3.2。

# 検証
まずテキストファイル``a.txt``とディレクトリ``a_dir``を作成して``$ rm *``コマンドを実行する。すると``a.txt``は削除されるが、``a_dir``は``rm: a_dir/: is a directory``と出て削除できない。ここまでは納得。
次にファイル``-f``、``-r``、``a.txt``、ディレクトリ``a_dir``を作成する。ここでも``$ rm a_dir``コマンドは``rm: a_dir/: is a directory``と出る。さて、ここで``*``コマンドを実行してみる。すると…
<img width="307" alt="スクリーンショット 2018-11-25 12.09.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/212284/153a9afd-6c19-ba52-aece-0bad73cc8b14.png">
本来消えるはずのないディレクトリ``a_dir``が削除されてしまっている。念のため``echo``コマンドで確かめてみる。
<img width="284" alt="スクリーンショット 2018-11-25 12.10.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/212284/6d9d5dc9-7050-12ba-1085-355d7e19b1a7.png">

# 考察
ワイルドカードは当該ディレクトリ内のファイルおよびディレクトリを全て展開しているだけだった。そのため、``-f``と``-r``ファイルがオプションとして解釈されてしまっていた。``-r``はディレクトリも削除対象に含むオプションであり、これによって``a_dir``も削除対象となっていた。
「そんなシチュエーションないだろ」という考えもあると思うが、複雑なバッチ処理の最中にこれに似た処理が走る可能性もあるかもしれない。その際もしも何らかの原因でエラーが発生したとしても``-f``オプションによってエラーメッセージが出力されないため、原因の特定は困難になる。そもそも可能性が考えられる時点で安全な``./*``を用いるべきなのだろう。
[Swift 4.2] キーボード表示時に画面をずらして、TextField等が隠れないようにする[iOS 12]

Swift 4.2 では少し違っていたため書きました。

```ViewController.swift
    // MARK: - ライフサイクル

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        configureObserver()  //Notification発行
    }


    // MARK: - Notification

    /// Notification発行
    func configureObserver() {
        let notification = NotificationCenter.default
        notification.addObserver(self, selector: #selector(keyboardWillShow(_:)),
                                 name: UIResponder.keyboardWillShowNotification, object: nil)
        notification.addObserver(self, selector: #selector(keyboardWillHide(_:)),
                                 name: UIResponder.keyboardWillHideNotification, object: nil)
        print("Notificationを発行")
    }
    
    /// キーボードが表示時に画面をずらす。
    @objc func keyboardWillShow(_ notification: Notification?) {
        guard let rect = (notification?.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue,
            let duration = notification?.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? TimeInterval else { return }
        UIView.animate(withDuration: duration) {
            let transform = CGAffineTransform(translationX: 0, y: -(rect.size.height))
            self.view.transform = transform
        }
        print("keyboardWillShowを実行")
    }
    
    /// キーボードが降りたら画面を戻す
    @objc func keyboardWillHide(_ notification: Notification?) {
        guard let duration = notification?.userInfo?[UIResponder.keyboardAnimationCurveUserInfoKey] as? TimeInterval else { return }
        UIView.animate(withDuration: duration) {
            self.view.transform = CGAffineTransform.identity
        }
        print("keyboardWillHideを実行")
    }

```
この方法の問題点は、キーボード表示で一律画面をずらすので、
上の方に配置したTextFieldが隠れてしまうのが問題です。
## 追記
iOS 9 以降ではNotificationの破棄は不要とのことで、削除しました

## 参考
[【Swift】UITextField, UITextViewがキーボードで隠れるのを防ぐ(UIScrollViewを使わずに)](https://qiita.com/ShinokiRyosei/items/06fb30983236d6342b28)
C70K2 レストア日誌 その1 〜 レストア開始

プログラミングに関係ない話題をQiitaに書くのはどうかと思ったが、
他に書き留めておく場所もないので書いておく。

# レストアを開始

## 対象車両
対象車両はこちら。 ホンダ スーパーカブ 70 デラックス （おそらく1976年製）
![MVIMG_20181122_160824 (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/230921/cbcc68ef-f360-d540-8c1f-7d2635d4f212.jpeg)
ヤフーオークションにて落札。
そんなに高値で入札してなかったのでまさか落ちると思っておらず慌てた。
比較的自宅より近場だったので近所の人に軽トラを借り手伝ってもらって引き上げてきた。
実物を見て意外とキレイだったので良かった。

走行距離は2万km弱。
![IMG_20181122_160845.jpg](https://qiita-image-store.s3.amazonaws.com/0/230921/7af68f98-6e11-997c-53e0-58e2094f480a.jpeg)
40年以上前のものとなると走行距離をそこまで気にしても仕方ないか。。。

## 欠品を確認する
ある程度出品情報に欠品がある旨は記載あったので覚悟していたけど
### シートがまるっとない
（写真はサイドカバーがガソリンタンクに載っている）
![IMG_20181122_160836.jpg](https://qiita-image-store.s3.amazonaws.com/0/230921/971097b4-1e96-032d-bf3b-a97929c7a1e5.jpeg)

この時代のカブはシートのヒンジが別体になっており、そのヒートヒンジは残っていた。
シートは、比較的入手性が良いのでなんとかなるだろう。

### メインキーがシリンダーごと無い
商品説明にキーがない旨を書いてあったので覚悟してたけど、メインキーのシリンダーを取っ払って
謎のスイッチが付いてた。 
おそらくキーのON/OFFを直結してたんだろうけど、生きてるかどうかもわからない。
![IMG_0530.JPG](https://qiita-image-store.s3.amazonaws.com/0/230921/e32553cf-c42a-6895-75e5-9e94e7a612f4.jpeg)
しかし、エーモンとはそんな昔からあるのかな？誰かがレストアしようとした痕跡なのだろうか。
メインキーシリンダーも入手性は比較的高いけど、ハンドルロックとヘルメットホルダーのキーはどうしよう。

さしあたって目についた欠品はこれくらいだと思う。優秀優秀。

レストア頑張るぞ！
Computer Vision API (OCR) v2 と Azure Search を用いて、スキャンされた画像文書を検索＆プレビューできるサンプル WPF アプリケーション

今回は、先日アップしていた [Cognitive Services - Computer Vision API (OCR) v2 を使ったサンプル WPF アプリケーション](https://qiita.com/dokums/items/c86e046930e4f0330f1a)の応用編で、せっかく OCR でテキスト情報を抜き出したので、それを [Azure Search](https://docs.microsoft.com/ja-jp/azure/search/search-what-is-azure-search) に入れて、簡単に高速に検索できるようにしてしまおうというサンプルです。

題して、「[Computer Vision API (OCR) v2 と Azure Search を用いて、スキャンされた画像文書を検索＆プレビューできるサンプル WPF アプリケーション](https://github.com/seijim/ComputerVisionOCR-and-Search/)」です。。。(笑)
メチャメチャ長いタイトルで、GitHub に公開しました。

アプリケーション構成としては、以下のようになっております。画像データは Blob Storage にアップロードして、OCR で抽出したテキスト情報を Azure Search に入れます。ついでに、自動タグ付与機能なども加え、ちょっと凝ってしまいましたね。。。(笑)
![app00.png](https://qiita-image-store.s3.amazonaws.com/0/166299/b4d2263f-1ced-0ed5-93f8-e3afd9c16751.png)

ソースコードに関心は無くても、試してみたいという方向けにインストーラーも用意しておりますので、GitHub を覗いてくださいませ。
https://github.com/seijim/ComputerVisionOCR-and-Search
Jestを使ってExpressのルーティングテストを書く

今回はFacebook製のテストフレームワークJestを使って
Node/Expressで設定しているrouteに対してテストを行う方法を書いてみます。
個々のメソッドについてのテストは割愛します。

# supertestのインストール
テスト用にインストールするので--save-devオプションをつけます。
jestを既にインストールされている方はsupertestだけでよいです。

```
npm install --save-dev supertest jest
```

# Express側の準備
テストに使うルーティングは準備できているものとして話を進めます。

```app.ts
import * as express from 'express';
//中略
var app = express();
var router = new Result().router
app.use('/api/v2/result',router);
```

```result.ts
this.router.get('/season/:id(\\d{1,3})',this.showStats)
```

# テストコードの書き方
今回は```/api/v2/result/season/{hoge}```というエントリーポイントを用意しています。

- hogeが整数
  - ステータス200
- hogeが整数でない
  - ステータス404(Bad Requestでもよい気はします)
- hogeで指定したIDにデータがない
 - ステータス404 

以下のテストコードではPromiseを使っています。
URLに対してGETリクエストを投げ、thenでHTTPステータスコードを
受け取って```toBe()```で判定します。

```result.test.js
//コンパイルしたtypescriptの出力先からインポートします
const app = require('../build/src/app')
const request = require('supertest')

describe('result.ts', () => {
    it('正しい引数',()=>{
      request(app).get('/api/v2/result/season/39')
      .then((response)=>{
        expect(response.statusCode).toBe(200);
      })
    })
    it('誤った引数',()=>{
      request(app).get('/api/v2/result/season/a')
      .then((response)=>{
        expect(response.statusCode).toBe(404);
      })
    })
    it('誤った引数',()=>{
      request(app).get('/api/v2/result/season/30a')
      .then((response)=>{
        expect(response.statusCode).toBe(404);
      })
    })
    it('データがない引数',()=>{
      request(app).get('/api/v2/result/season/50')
      .then((response)=>{
        expect(response.statusCode).toBe(404);
      })
    })
   })


```
参考リンク
[How to test Express.js with Jest and Supertest](http://www.albertgao.xyz/2017/05/24/how-to-test-expressjs-with-jest-and-supertest/)
"scikit-learnとTensorFlowによる実践機械学習" で勉強する

こんにちは、chlochan です。そもそもディープラーニングの前に機械学習を勉強すべきでした。なので、この本を使って機械学習の勉強をします。
[scikit-learnとTensorFlowによる実践機械学習、Aurelien Geron著、下田 倫大 監訳、長尾 高弘 訳、
 オライリー・ジャパン、ISBN978-4-87311-834-5](https://www.oreilly.co.jp/books/9784873118345/)
著者の Aurelien Geron さんですが、TensorFlow 2.0 での変更点に関してユーチューブに動画を投稿していたりしますね。
https://youtu.be/WTNH0tcscqo

サンプルコードをダウンロードします。

~~~bash
$ git clone https://github.com/ageron/handson-ml.git
~~~
React+Redux+Firebaseのいい感じチュートリアル紹介

React+Reduc+Firebaseでアプリを作ろうとしているのでいいチュートリアルの紹介
# 経緯
## 軽いノリで試してみようと思いつく
- 普段バックエンドしーしゃーぱーであまりにモダンJS界隈についていけなくなった
- 危機感を感じてとりあえず流行りのFirebaseでなんか作ったろうと思った
- とりあえずよく聞くReactでいいんじゃねという軽いノリ

## とりあえず触ってみようとしてみて挫折
- Qiitaの記事を適当にみてやろうとしたけどうまくいかない
    - 環境がわるいのかミスっているのかわからん
    - 突然出てきたメソッドの意味とかわからなくて泣きそうになる

## 観念して本家のチュートリアルやる
- 当然のように英語だけど頑張る
    - Google翻訳の拡張機能を付けることで解決
    - 慣れると普通によめる
    - チュートリアル系の英語めっちゃやさしいことに気づく
- やったのはこのあたり
    - React：https://reactjs.org/tutorial/tutorial.html
    - Redux：https://redux.js.org/basics

これでなんとなくReactとReduxはわかった（つもり）になったぞ！

## Firebaseでつまずく
- 意外とReact+Redux+Firebaseの組み合わせで良いチュートリアルがなかなか見つからない
- Qiitaに本当にさわりだけやってみた系の記事はあるけど、、、古い記事が多くてなんとも
- Firestoreまでやっているものは少ない（たいていRealtimeDatabase）
- 仕方ないのでまた英語系で役に立ちそうなチュートリアルを探す
- 結局見つけていい感じだったのは英語系だった

## イイ感じだったチュートリアル紹介
- https://medium.com/quick-code/how-to-integrate-react-redux-and-firebase-in-3-simple-steps-c44804a6af38
    - 結構わかりやすく丁寧に解説してくれている
    - ただし手順通りにやってもエラーになるところはある（結構漏れがある）
    - 最新版のGitHubには記事には記載のない認証系が追加されていて参考になる
        - RouteでrequireAuthを呼んでいるところとか
    - componentWillMountとかcomponentWillUpdateの使い方がわかる
- https://www.youtube.com/playlist?list=PL4cUxeGkcC9iWstfXntcj8f-dFZ4UtlN3
    - NetNinja先生の神動画
    - 初心者向けにアプリの開発手順を順番にやってくれてかなり丁寧
        - まず一覧作る（いったん固定値セットする）→logで確認する→DB接続…など
    - VSCodeの使い方もかなり参考になった
        - Terminal便利ですね…（今更）
        - Altで矩形選択できるんですね…（今更）
        - HTML Snippets便利ですね…
    - 全部で40本あるので大変ですが、1本1本は10分以内で短いものが多いので分けてみれるよ
    - かなりおすすめです

## まとめ
新しい技術を習得するときは頑張って英語の文献も見ると理解が広がる！と思います
Google激推しツールweb.devが便利すぎた！

## これはなに？
先日、関西フロントエンドカンファレンスに参加してきました。

そこで、Googleエンジニアの方が先日行われた[Chrom Dev Summit 2018](https://developer.chrome.com/devsummit/)に関してのお話されていました。
Chrom Dev Summitで、今回よくテーマに上がっていたのが、「パフォーマンス」らしくて、
Googleとしてもwebのパフォーマンス向上に力を入れるようです。

[web.dev](https://web.dev/)というツールを激推しされていたので、実際に使ってみました。


## web.devとは

[web.dev](https://web.dev/)は、Googleが開発しているwebサイトのパフォーマンスを分析できるwebアプリです。
[Lighthouse](https://developers.google.com/web/tools/lighthouse/?hl=ja)のwebアプリ版ですね。

<img width="1280" alt="web.dev.png" src="https://qiita-image-store.s3.amazonaws.com/0/150144/727dab90-04d4-cfd9-31f8-565ed85a0c2f.png">


## できること

### 1. webサイトのパフォーマンスを上げるためのドキュメントが丁寧にまとめられているので学習できる

どうやったらサイトを早くできるのか・セキュリティのことなど、webパフォーマンスに関して学ぶことができます。



### 2. 実際のサイトのパフォーマンスを測ることができる。
パフォーマンス分析したいサイトのURLを入力すると、クリックひとつで分析できます。

まあ、実際に分析してみましょう！


## 実際に分析してみる
[自分のサイト](https://workout-engineer.com)のパフォーマンスを分析してみます。

URLを入力して、「RUN AUDIT」をクリックするだけです。

<img width="1280" alt="web.dev_meu.png" src="https://qiita-image-store.s3.amazonaws.com/0/150144/7e46a5db-0aff-dce7-0d47-cc40a772a600.png">



すると、すぐに分析結果が出てきます。⬇︎



## 分析結果


恥ずかしながらパフォーマンスがめっちゃ悪いですね笑

<img width="1280" alt="result.png" src="https://qiita-image-store.s3.amazonaws.com/0/150144/a7c986b5-5126-4a97-5388-2750938cea4a.png">


## 分析結果詳細
以下のサイトで分析結果を解説しています。

参考にしてください。

https://workout-engineer.com/

## まとめ


webパフォーマンスを上げるためのドキュメントも丁寧にまとめられているので、普段バックエンドしかやらないエンジニアにとって非常に勉強になります。
[Scala]illegal start of declarationエラーの対処法

#環境情報
Scalaバージョン:2.12.7

#実行したソースコード
```ruby:defClass.scala
class Example(val x:Int, val y:Int) {
  def +(z: Int):Int {
    this.x + this.y + z
  }
}

object testExample extends App {
  val e1: Example = new Example(1, 2)
  println(e1 + 10)
}
```

#発生したエラーメッセージ
<pre>error: illegal start of declaration (possible cause: missing `=' in front of current method body)
    this.x + this.y + z
    ^
one error found
</pre>

#解決方法
「illegal start of declaration」にある通り、宣言の記述に問題がありました。
メソッドの宣言部分に = を記述すれば解決します。

```
def +(z: Int):Int {
```

を

```
def +(z: Int):Int = {
```

とすれば解決します。
アプリケーションを削除する

Azure Sphereで、チップ内のアプリケーションを削除する手順です。

ハードウェアの結線を変更するときに、不用意にアプリケーションが動いてしまいハードウェアを壊す可能性があります。
必要に応じて、アプリケーションを削除するように心がけましょう。

# アプリケーションを削除

azsphereコマンド と Visual Studio操作 の、２つの方法があります。

## azsphereコマンドでアプリケーションを削除

Azure Sphere Developer Command Prompt Previewで、`azsphere device sideload delete`を実行します。

```
C:\>azsphere device sideload delete
Component '24a6cb2b-a5d1-4ba0-88a2-f08f81eb74a4' deleted or was not present beforehand.
Command completed successfully in 00:00:02.1259363.

C:\>
```

## Visual Studio操作でアプリケーションを削除

ソリューションエクスプローラーにあるAzure Sphereのプロジェクトを右クリックして、コンテキストメニューの`Remove the application from device`を実行します。
確認メッセージが表示されるので`OK`をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/18cab96a-8379-852a-c80a-474131a737fe.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/39825267-500b-55a1-ba9b-d234a066e5cf.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/071d236b-7836-62cc-695d-3e9de9e872e4.png)

# TIPS

チップに入っているアプリケーションは`azsphere device image list-installed`で確認することができます。
gdbserverはサイドローディング可能にする（prep-debugする）とインストールされるもので、アプリケーションを削除しても残っています。支障はありません。

```
C:\>azsphere device image list-installed
Installed images:
 --> gdbserver
   --> Image type:   Application
   --> Component ID: 8548b129-b16f-4f84-8dbe-d2c847862e78
   --> Image ID:     43d2707f-0bc7-4956-92c1-4a3d0ad91a74
 --> Mt3620App1
   --> Image type:   Application
   --> Component ID: 24a6cb2b-a5d1-4ba0-88a2-f08f81eb74a4
   --> Image ID:     3d0503a0-4652-4563-a3c1-9bc22633cb87
Command completed successfully in 00:00:01.3809481.

C:\>
```
JAVA有償化

２０１９年１月をもって<a href="https://www.oracle.com/technetwork/jp/java/eol-135779-ja.html">JAVA8のアップデート終了。</a>今後は、無償のオープンJDkか有償のオラクルJDKからバイナリーを取得する必要があるが、前者では商用使用不可。
したがって、基本２０１９年１月以降は商用で使っているものにはオラクルにライセンス料を支払えと？！
多くのシステムで開発されて抜けれなくなったところで、この処遇。う〜ん、私の中では２０１９年問題としたい。。。

が、しかし逃げ道はあるようです。すでにJAVA8のアップデートはオラクル以外の会社が無償で提供していて２０１９年１月以降も実施可能。
そのうち、次期バージョンも開発中でオラクル以外のページからバイナリーが取得できる時代がくるようです。。
が、しかしあくまで予測でそうなるかはまだわからない。
逆に言えば、他の言語で開発してる人にはビジネスチャンスがあるかも！？私もその口なので、是非とも乗っかりたいですね！

<a href="https://blooming-reef-85835.herokuapp.com/posts/91">マイベージ</a>
IE,Edgeでdocument.querySelectorAllをforEachする方法

以下のブログに移行しました。


https://blog.ryou103.com/post/queryselectorall-foreach/

<!--

# やりたいこと

```javascript
const hoges = document.querySelectorAll('.hoge');
hoges.forEach((el) => {
  // なんらかの処理
});
```

javascriptで.hogeの要素を取得して、なんらかの処理をしたい。
Chromeなどのブラウザならこれでいいのだが、IE,Edgeだと以下のエラーが発生する

```console
Object doesn't support property or method 'forEach'
```

<img width="456" alt="スクリーンショット 2018-11-25 11.03.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/92083/826474a2-825d-349a-ebec-79d3fda87f1a.png">


変数`hoges`にforEachというメソッドがないよ！というエラーが出てしまう。


# 解決策

`Array.from`を使って、配列にしてあげると上手くいく

```javascript
const hoges = Array.from(document.querySelectorAll('.hoge'));
hoges.forEach((el) => {
  // なんらかの処理
});
```

# 原因

`querySelectorAll`では、[NodeList](https://developer.mozilla.org/ja/docs/Web/API/NodeList)というDOM要素を取得できます。

モダンブラウザには、NodeListにforEachが実装されているのですが、IE,Edgeには実装されていないようで、エラーが起こりました。

ですので、一度配列に変換してあげる必要があるみたいです。

# まとめ

IE11とEdgeという無視することができないブラウザで対応していないとは、、、
(2017年9月26日にリリースされた EdgeHTML 16.16299 以降ではforEachに対応しているそうです。)


今後は、`Array.from(document.querySelectorAll())`で習慣つけていく必要がありそうです。

-->
macOSでAutomatorを使ってフォルダ内イメージをpdfに結合する

# 連番イメージをpdfに結合する方法を自動化したい
ちょっとした自動化を行いたかったので、メモがてら投稿する。

<img width="1049" alt="スクリーンショット 2018-11-25 10.51.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/181375/5d48cd07-94ac-0355-4f20-c27a6bc7f991.png">
<img width="1050" alt="スクリーンショット 2018-11-25 10.52.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/181375/9553d274-6f8f-77e6-637a-846567ae94e7.png">

流れとしては
1. Finder項目の選択でディレクトリを指定
2. ディレクトリ名を覚えておく
3. フォルダの内容でサブディレクトリ以下も検索対象に入れる
4. フィルタでイメージを抽出する
5. ファイル名で並び替え
6. pdfに結合
7. デスクトップ上のファイル名の変更をシェルで実施

# rename部分のシェルスクリプト
入力したファイルパスの末尾をdir_nameに入れてpdfのリネームに使う
入力したファイルパスを使って対象にしたディレクトを削除する

```
input_path=$@
echo ${input_path}
dir_name=`echo ${input_path} | awk -F "/" '{ print $NF }'`
echo ${dir_name}

cd ~/Desktop
echo "/Users/myname/Desktop/${dir_name}.pdf"
mv "/Users/myname/Desktop/tmp.pdf" "/Users/myname/Desktop/${dir_name}.pdf"
rm -rf "/Users/myname/Desktop/tmp/${dir_name}"
mv "/Users/myname/Desktop/${dir_name}.pdf" /Users/myname/Desktop/tmp 
```

# 課題
ディレクトリ - サブディレクトリ 1 - 連番jpg
         + サブディレクトリ 2 - 連番jpg
という構成でディレクトリを指定したらサブディレクトリ名pdfにする方法がいまいち分からない。
シェルスクリプト使ってこんな感じに使えたらいいんだけどautomatorへ渡す引数を上手いこと反映させられない

```sh
#!/bin/bash

files="/User/myname/Desktop/*"
for filepath in $files; do
  if [ -d $filepath ] ; then
    automator pdf_converter "${filepath}"
  fi
done

```

# 追記
ディレクトリ内のサブディレクトリごとに変換する方法が上手く行かなかったのでautomatorのフォルダアクションを使って、フォルダに順次```mv``` コマンドを送る方法で実現することにした
【Angular】小ネタ:現在時刻の表示

# はじめに
現在時刻を表示するサンプルソースがなかなか見つからなかったので。
こんな感じでやってますという小ネタです。
イメージはこんな感じです。
![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.amazonaws.com/0/292500/95eb4b92-4fb9-a2a0-42fa-fd178b6ad887.gif)


# コンポーネント側

## ソース
```app.component.ts
import { Component, OnInit, OnDestroy } from '@angular/core';
import { Observable } from 'rxjs/Observable';
@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
})
export class AppComponent implements OnInit, OnDestroy {
  now: Observable<Date>;
  intervalList = [];

  constructor() {
  }

  public ngOnInit() {
    this.now = new Observable((observer) => {
      this.intervalList.push(setInterval(() => {
        observer.next(new Date());
      }, 1000));
    });
  }

  ngOnDestroy() {
    if (this.intervalList) {
      this.intervalList.forEach((interval) => {
        clearInterval(interval);
      });
    }
  }
}
```

## やってること

- observerに毎1秒毎に新たなDateを渡す
- interval IDを保持しておく
- ngOnDestroy時にclearIntervalでリセットしておく

clearIntevalしないと、たとえページ遷移してもずっと呼び出されるのでそこだけ注意です。
intervalIDの保持はリストである必要はありません。
ただ、複数の場所で使用するとその分保持すべきIDが増えるので、リストを使用しています。

# html側

## ソース

```app.component.html
{{ now | async | date:'yyyy年MM月dd日 HH:mm:ss' }}
```

## やってること
- [AsyncPipe](https://angular.io/api/common/AsyncPipe)を使ってDateを受け取る
- 受け取ったDateを、[DatePipe](https://angular.io/api/common/DatePipe)に流してフォーマットする

これだけです。

# 終わりに
これで現在時刻のリアルタイム表示が出来ます。
もっとシンプルな方法や、間違いの指摘等あればコメントよろしくお願いします。
ウェブデザイン検定2級 対策

かなりマニアックな資格だが、故あってウェブデサイン検定2級を受けることになった。
筆記勉強時にまとめた情報を一覧にまとめたので共有。
特にHTMLまわり、規格まわり、JSまわりをまとめた。

# 勉強時使用サイト
https://kakomon.club/webdesign/
このサイトが良かった！過去問ひたすら解ける

# HTMLタグについてまとめ
HTML5タグ一覧
https://www.tagindex.com/html5/elements/
http://www.htmq.com/html5/

HTML5コンテンツモデルガイド
https://webgoto.net/html5/

HTML5なにが入れ子にできるか
https://yoshikawaweb.com/element/

HTML4, HTML5のタグ一覧
http://blog.asterlist.com/2013/01/2301.html

## HTML5で変更・廃止された要素
https://qiita.com/aikumi/items/a727413e912396368cc1

## 2016年HTML5.1勧告時の仕様変更 (引用: http://roka404.main.jp/blog/archives/300)
HTML5.1勧告時の注意すべき仕様変更点は以下の通り。

【追加】
・picture要素とsrcset属性の追加
・details要素とsummary要素の追加
【削除】
・ネストされたセクション要素の見出しに全てh1を置くこと
・tfoot要素をtbody要素の前に置くこと
【変更】
・セクション要素の中のheader/footer要素は入れ子にできる
・figcaption要素はfigure要素のどこに書いても良い
・img要素のalt属性は削除してはいけない（たとえtitle属性がついていたり、友達にe-mailを書くような場合であっても）
など…

［参考：HTML5からHTML5.1への変更点（W3C・英語）］

## 2017年HTML5.2勧告時の仕様変更 (引用: http://roka404.main.jp/blog/archives/300)
HTML5.2勧告時の注意すべき仕様変更点は以下の通り。

【追加】
・dialog要素の追加
・link要素のrel属性値に“canonical”、“noreferrer”、“apple-touch-icon” の値が追加
・WAI-ARIA1.1に準拠
【削除】
・keygen、menu、menuitem要素が廃止
【変更】
・dl要素の直下にdiv要素を記述できる
・body要素内にstyle要素を記述できる（ただしパフォーマンス面の問題から従来どおりhead要素内に記述することを推奨）
・複数のmain要素を記述できる（ただし最初にユーザに見せるのは1つだけで、他はhidden属性で隠す）
・fieldset要素内のlegend要素の中に見出し要素を記述できる
など…

## iframe
HTML4.01 Strict, XHTML1.0 Strict, XHTML1.1では認められていません。

# 規格系まとめ
WAI-ARIA = Web Accessibility Initiative が定めた Accessible Rich Internet Applications の使用
各要素の「Roles (役割)」「States (状態)」「Properties (特性)」の記述を仕様に合わせて記述することにより
、支援技術に伝達することができます。
参考: https://website-usability.info/2014/04/entry_140415.html

# JavaScriptについてまとめ
querySelectorAll()で取得できるのは、配列でなくNodeList

## addEventListener
JSのイベント登録関数
対象要素.addEventListener(イベント種類, トリガー関数, false)

<おまけ>
※ 第3引数は、イベント伝搬の方式を「true / false」で指定するのですが通常はfalseを指定しておきましょう。
trueを指定すると通常の伝搬より先にイベントをcatchできます。(参: http://d.hatena.ne.jp/teramako/20070126/about_useCapture_of_addEventListener)


<代表的なイベント一覧>
イベント種類    内容
load    Webページの読み込みが完了した時に発動（画像などのリソースすべて含む）
DOMContentLoaded    Webページが読み込みが完了した時に発動（画像などのリソースは含まない）
click    マウスボタンをクリックした時に発動
mousedown    マウスボタンを押している時に発動
mouseup    マウスボタンを離したときに発動
mousemove    マウスカーソルが移動した時に発動
keydown    キーボードのキーを押したときに発動
keyup    キーボードのキーを離したときに発動
keypress    キーボードのキーを押している時に発動
change    フォーム部品の状態が変更された時に発動
submmit    フォームのsubmitボタンを押したときに発動
scroll    画面がスクロールした時に発動
引用: https://www.sejuku.net/blog/57625