OmniAICreator/Qiita-1.07M huggingface dataset:
EC2のLaravel6.0環境でメールを定期配信するタスクスケジューラを作成する　AWS/Laravel連載(17)

# はじめに

前回の記事で、コマンドライン上からメール配信できるシステムができました。

[EC2のLaravel6.0環境でメール配信コマンドを作成する　AWS/Laravel連載(16)](https://qiita.com/rf_p/items/036ac4cdb0796ceb2fa2)

# 確認ダイアログ挟まずメール配信できるオプションを追加する

前回の記事ではメール配信時にyes/noの確認を挟んでいました。
Cron実行しようとするとその機能は少々邪魔なので、確認挟まず送信するオプションを用意しましょう。

```diff:app/Console/Commands/SendEmails.php
...
-    protected $signature = 'email:send {user : ユーザーIDを指定}';
+    protected $signature = 'email:send {user : ユーザーIDを指定} {--f : 確認を挟まず送信する}';
...
-        if ($this->confirm($user->name . 'さん[' . $user->email . ']にメールを配信しますか？')) {
+        if ($this->option('f') || $this->confirm($user->name . 'さん[' . $user->email . ']にメールを配信しますか？')) {
...
```

これだけです。

{--hoge}はオプションです。
指定されていないときはfalse、指定された時はtrueが返ります。
なので普通に

```powershell
$ php artisan email:send 1
```

と実行した場合は今まで通りの挙動になります。

そして
if ($this->option('f') || 
としたことにより、オプション --fが指定された場合は確認挟まずメール配信が実行されます。

```powershell
$ php artisan email:send 1 --f
```

# crontabの設定

レガシーなWebフレームワークだと、コマンド一個一個をCronに登録していました。
Laravelではタスクスケジューラが標準搭載されているので、crontabに1行追加するだけで、あとは全てPHPのコード上で実装できます。

[Laravel 6.0 タスクスケジュール](https://readouble.com/laravel/6.0/ja/scheduling.html)

メリットとしては、

* Cronに1行で済むのですっきりする
* 環境によってはCronがバージョン管理されていないこともあり、直接操作はリスクが大きい。その問題をほぼ解消できる
* 本番環境におけるCronの追加・削除忘れ等が起きづらく、コマンド追加したバージョンがデプロイされると同時にタスクスケジュールがセットされる
* コマンドのタスク開始時やタスク終了時にフックができるので、コマンド実行順を担保したい場合にコード上だけで実行できる
* その他バックグラウンド実行やメンテ時の挙動等、複雑な挙動をミドルウェア入れずともフレームワーク標準機能で実現できる

といったところでしょうか。他にもありそうです。

さて、早速設定します。

```powershell
$ crontab -e
```

```config:crontab
* * * * * cd /var/www/blog && php artisan schedule:run >> /dev/null 2>&1
```

cronは分 時 日 月 曜日の順なので、そこが全て*になっています。
つまり「毎分毎時毎日毎月毎曜日」=１分ごとに常にアプリケーションのパスに移動しスケジュールを実行、ということですね。

# Laravel側の対応

既にタスクスケジュール用のファイルはあるので、一行追加するだけです。

```diff:app/Console/Kernel.php
<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
        //
    ];

    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        // $schedule->command('inspire')
        //          ->hourly();
+       $schedule->command('email:send 1 --f')->everyMinute();
    }

    /**
     * Register the commands for the application.
     *
     * @return void
     */
    protected function commands()
    {
        $this->load(__DIR__.'/Commands');

        require base_path('routes/console.php');
    }
}
```

これを実行すると、毎分メールが届くようになります。
さすがに邪魔なので、動作確認できたらコメントアウトしておきましょう。

今回は以上です。
コンテンツが下からスクロールで表示されるjQueryプラグイン

コンテンツが人画面に収まりつつ、スクロールすると次のコンテンツが表示されるプラグインです。

##デモページ
[デモページ](http://webdrawer.net/sample/js/contentScroll/index.html)
HTMLのclass="section"ごとに下からズズッと表示される感じです。


##コンテンツがウインドウサイズより長くても大丈夫
一つのコンテンツがウインドウサイズより長くてもスクロールで見れるようにしたかったのでそのようになっています。内容量を気にしません。
コンテンツ量が少ないとウインドウ幅いっぱいに要素が広がるようになっています。

##実行方法
```javascript
$('#wrap').scrollContent();
```
#wrapの箇所をスクロール表示したい親要素を指定します。

##スクロールバーを非表示にしたい
前途の理由で移動の際にもスクロールバーが出ます。このスクロールバーがない方がいい時は以下のように実行します。

```javascript
$('#wrap').scrollContent({
   type:'noBar'
});
```

##ナビゲーションのclass（id）を変えたい
ナビにつかうclassを変えたい時もあるかなと思い、オプションでナビゲーションのclass(id)を変更できます。指定しないと.navが適用されます。

```javascript
$('#wrap').scrollContent({
   nav:'.nav'
});
```

##ダウンロード
ダウンロードはこちらら
[webdrawer-kashu/contentScroll](https://github.com/webdrawer-kashu/contentScroll)

##この記事の転載元
[コンテンツが下からスクロールで表示されるjQueryプラグイン｜WEB Drawer｜web制作に関するネタの引き出しサイト](http://webdrawer.net/javascript/contentscroll.html)
俺用メモ　Scratch 使い方　猫を歩かせる

#目的
一番シンプルな、猫を歩かせるプログラムを作る。

#方法
スクリプトのところに好きな命令を選んでドラッグアンドドロップする。
緑の旗をクリックして開始。
変更したあとは停止押してから緑の旗をクリックする。

##流れ
1. 緑の旗がクリックされたとき
2. ずっと
3. もし〜なら
4. 右向き矢印が押された時


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298521/dfbb76fd-de0c-abaa-74fb-ae31e7730162.png)

##大事なこと
「緑の旗がクリックされたとき」は必ず始めに入れる。
「ずっと」と「もし〜なら」はセットで使う。
「〜度に向ける」と「〜度回す」は使い分けること。似ているので間違えない。
コードは複製もできる。増やしたいときは複製を使う。

##問題
猫が回転してしまう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298521/868a076a-a388-020b-40fc-b504cf7f189e.png)

解決
回転方向を左右のみにする。

##応用
早く走らせる→歩数を増やす。
上下に移動→上向き矢印と下向き矢印の場合も作ってみる。


##コメント
小学生向けに教えた。
バグありのプログラムをつくって、バグを見つけさせるのもありかも。
Medium on Android で GoldenDict を使う

Medium で記事を読んでいると時折知らない単語が出てくる。そんなとき iOS であれば簡単に辞書を引けるのだろうが、あいにく Android ではこのへんのサービスレベルが低い。ブラウザ上ではアドオンを使って似たようなこともできるようだが、Medium の専用アプリを使っているとこの手も使えない。結局、範囲選択→コピー→アプリ切替→ペーストという冴えない動作が必要になる。[Look Up](https://play.google.com/store/apps/details?id=gaurav.lookup) を使うと英英辞典を引けるらしいが、日本語や非西欧言語は蚊帳の外のようだ。

Medium アプリでは共有メニューから選択範囲を辞書へ渡すことも一応できる。一応、というのは、実際に渡される文字列は ```“選択文字列” by AUTHORNAME https://link.medium.com/ARTICLEID``` となるからだ。これでは辞書を引くことはできない。英語以外の言語も扱う必要から、私は [GoldenDict](https://play.google.com/store/apps/details?id=mobi.goldendict.android) を使っている。

Google 翻訳アプリを導入すると、「タップして翻訳」という機能が使える。これは常駐してクリップボードを監視する。クリップボードへテキストが入り、オーバーレイ表示されているアイコンがクリックされると、Google 翻訳の結果を表示してくれる。使い勝手はなかなかよい。だが、Google 翻訳は辞書ではないので単語を調べるには不向きだ。Google がこちらの操作を監視しているのもなんとなく気持ち悪い。 Android を使っておいてなんだという気もするけれど。

仕方がないので、共有メニューから渡された文字列を適当に加工して再度辞書アプリへ投げる処理を用意する。今回は [Automagic](https://play.google.com/store/apps/details?id=ch.gridvision.ppam.androidautomagic) を使う。トリガーは `Send/Share Intent Received` とし、文字列中に `link.medium.com` があればよけいな部分を除去して単語だけを抽出し、それを GoldenDict へインテントで送る。

![0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485814/dcccbaf0-c4c2-b853-992b-e79c6f8d1bc7.png) ![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485814/6902bc45-e91f-5d69-d7c6-f58aa9b8cb6c.png) ![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485814/ccbc68a4-2d1a-9500-89cc-9e60b8effbde.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485814/891a4a52-3f23-d3f6-6a0f-c2ae4e48d70d.png) ![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485814/6199dffa-a006-e71a-1b74-9011c0c1ad4e.png)

見切れている部分は次のとおり。

`mobi.goldendict.android.PopupActivity`
`putString("android.intent.extra.TEXT", "{text}")`

辞書を引くには、範囲選択→SHARE→Send/Share Intent Received とする。手元の端末では GoldenDict に英和辞典以外の辞書も導入してあるから、いつでも多言語の迷宮に入れる。

MacroDroid でも同じようなものを作ろうとしたが、インテント受信の選択肢はあるのに、なぜか共有メニューで MacroDroid が出てこなかった。調べ方が悪いのか、明示的インテントしか受けられない仕様なのかはわからないが、惜しい。
python3でpip installできなかった

## なにがおきたの？
`pip install` コマンドがうまく使えなかった

pip3コマンドでPython3のpipを呼びだそうとしたのですがcommand not foundになってしまった。

## 解決作
このコマンドを打ったら解決した。

```
sudo chown -R $(whoami) $(brew --prefix)
```

pip install はこのコマンドでした。

```
sudo easy_install pip
```

参考：https://ja.stackoverflow.com/questions/44308/homebrew%E3%81%A7python3%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E3%81%A8pip%E3%81%8C%E4%BD%BF%E3%81%88%E3%81%AA%E3%81%84

https://4to.pics/article/post/54
Rails 作成 初期（個人アプリ用、雛形）

個人のアプリを作成するとして

###1 作りたいアプリのRailsの作成
```
$ rails _5.0.7.2_ new hidden378 -d mysql
$ cd hidden378
```
（hidden378には自分の作品名を入れましょう）

###2 ルート、コントローラーの設定
```
$ bundle exec rake db:create # アプリのDB作成
$ rails g controller messages index # コントローラーの作成 ついでにアクションとビューも
```


###3 コントローラーファイルができるのでインデックスのメソッド追記

```messages.controller.rb
 class messagesController < ApplicationController
   def index
   end
 end
```

###4 ビューにmessagesファイルができているのでindex.html.hamlのファイルを新しく作成しそこに確認用に適当な文字列を入れる
（例）Hello world!   
　　　等

###5 ルーティングの設定を行う、root_pathにアクセスした時messages#indexを呼び出す
(rails g controllerではrootの設定をしてくれないので自分で作らないといけない）

```Rails,routes.rb
Rails.application.routes.draw do
   root to: 'messages#index'
end
```

###6 http://localhost:3000 で確認してみましょう、4で設定した文字列が出てくると思います
【Python3】開発環境構築《Windows編》

# はじめに

Windows で Python を使用する際の、開発環境構築についてまとめました。

# システム構成

- Windows10 Pro 64bit
- Windows PowerShell
- Python 3.8.1
- pip 20.0.2

# 仮想環境（venv）

仮想環境を利用することで、仮想環境毎にPythonパッケージ群を管理することができる。
> ※Python3.4までは**`pyvenv`**が推奨されていたが、Python3.8現在では**`venv`**が推奨されている。
> (**`pyvenv`**はPython3.6から非推奨)

## 作成

```powershell:PowerShell
# python -m venv 作成する環境名
python -m venv venv
```

- プロジェクトルート(アプリケーションルート)で実行する

## 有効化

```powershell:PowerShell
.\venv\Scripts\activate
```

> ##### *PSSecurityException が発生した場合*
> ![powershell.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441624/c58fb02b-efce-4084-39ea-34d77f365945.png)
> PowerShellのデフォルトの実行ポリシーでは、外部ファイルのスクリプト実行が制限されているため、実行ポリシーの変更が必要。
> 
> ```powershell:PowerShell
> # -Scope Process : 現在のプロセスの実行ポリシーのみ適用
> Set-ExecutionPolicy -Scope Process RemoteSigned
> ```

## 無効化

```powershell:PowerShell
deactivate
```

# パッケージ管理（pip）

pip(インストーラ・プログラム)を使用し、PyPI(The Python Package Index)のパッケージを管理する。

## インストール

```powershell:PowerShell
# pip install パッケージ名
pip install black

# pip install パッケージ名==バージョン
pip install black==19.3b0
```

## アンインストール

```powershell:PowerShell
# pip uninstall パッケージ名
pip uninstall black
```

## パッケージ一覧

```powershell:PowerShell
# インストール済パッケージ一覧の表示
pip list

# インストール済パッケージ一覧の出力
pip freeze > requirements.txt

# パッケージ一覧からの一括インストール
pip install -r requirements.txt
```

> ##### *PowerShell でファイル出力する際の注意点*
>
> PowerShell でリダイレクト（>）を使用した場合、出力されるファイルの文字コードは「UTF-16 LE」になる。
> 「UTF-8」でファイル出力するためには、下記コマンドレットを使用する必要がある。
>
> ```powershell:PowerShell
> pip freeze | Out-File -Encoding utf8 requirements.txt
> ```
PythonとNumPyの数値型の継承関係

NumPyの数値型が、対応するPythonの数値型を継承しているかどうか調べてみました。

```py
import builtins
import numpy as np

np_numt = [
    np.bool_,
    np.int_,
    np.intc,
    np.intp,
    np.int8,
    np.int16,
    np.int32,
    np.int64,
    np.uint8,
    np.uint16,
    np.uint32,
    np.uint64,
    np.float_,
    np.float16,
    np.float32,
    np.float64,
    np.complex_,
    np.complex64,
    np.complex128
]

py_numt = ["bool", "int", "float", "complex"]

for np_t in np_numt:
    py_t = next(tstr for tstr in py_numt if tstr in str(np_t))
    print(np_t, py_t, issubclass(np_t, getattr(builtins, py_t)))
```
このコードを実行すると、

```
<class 'numpy.bool_'> bool False
<class 'numpy.int32'> int False
<class 'numpy.int32'> int False
<class 'numpy.int64'> int False
<class 'numpy.int8'> int False
<class 'numpy.int16'> int False
<class 'numpy.int32'> int False
<class 'numpy.int64'> int False
<class 'numpy.uint8'> int False
<class 'numpy.uint16'> int False
<class 'numpy.uint32'> int False
<class 'numpy.uint64'> int False
<class 'numpy.float64'> float True
<class 'numpy.float16'> float False
<class 'numpy.float32'> float False
<class 'numpy.float64'> float True
<class 'numpy.complex128'> complex True
<class 'numpy.complex64'> complex False
<class 'numpy.complex128'> complex True
```
となり、`numpy.float64`(とそのエイリアスの`numpy.float_`)、および`numpy.complex128`(とそのエイリアスの`numpy.complex_`)のみが、それぞれ対応するPythonの型`float`と`complex`のサブタイプのようです。

`numpy.float64`は、標準ライブラリ`json`ではjsonableですが、戻した値は、Pythonの型になっているので注意が必要です。例えば、次の式はPythonの`float`型になります。

```py
import json
type(json.loads(json.dumps(np.float64(64))))
```

それ以外のNumPyの数値型は、デフォルトの`json`では、エラーとなります。
「M5Stack.h」をインクルードする順番を最後にすると『「○○.h」に対して複数のライブラリが見つかりました。』というエラーがなくなるかもしれない。

#M5StackでOSCをしたときの話
Arduino/M5StackでOSCを使う場合には@hideakitaiさんの「ArduinoOSC」を使うのがオススメなのですが・・・
https://qiita.com/hideakitai/items/f50f99e38b520a0ace37

#エラーがでる
M5Satckで「ArduinoOSC.h」をインクルードすると、
**「○○.h」に対して複数のライブラリが見つかりました。**
というエラーが盛大に出てしまいました。
ArduinoとEPS32のライブラリが重複しているという誤認識によるものらしいです。

#インクルードの順番を変える
「M5Stack.h」のインクルードする順番を最後にしてみたら動きました。

```
#include <ArduinoOSC.h>
#include <M5Stack.h>
```

#おわりに
「ArduinoOSC」を使用する際に遭遇したエラーの回避方法でしたが、他のライブラリを使用する場合にも有効かもしれません。
JavaScriptでアプリを開発できることを知り、環境構築し新規アプリ開発に臨むまで

#概要
普段はReact NativeでiOSアプリを開発してます

今回は、初心に帰りiOSアプリを作る際あとあとAnd/roi/dでも作ることを見越してなにかいいフレームワークないかなと作る前に調べた結果ReactNativeを見つけiOSアプリ実装してきたことを思い出しつつその過程のメモを共有していきます


#環境構築...を行う前に
MacOSにて、
基本的に[ReactNative](https://facebook.github.io/react-native/docs/0.54/getting-started)に沿って構築していきます

が下記手順を行う前に長時間かかるであろう、[Xcode]
(https://apps.apple.com/jp/app/xcode/id497799835?mt=12)を並行してインストールし環境構築時間の短縮を試みましょう

#環境構築
では改めて構築していきます


ReactNativeを動かすためのライブラリを[Homebrew](https://brew.sh/index_ja)でのインストールを行います
Homebrewがない場合はこのコマンドから

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

あればこれらのコマンドを打ちます

```sh
brew install yarn
brew install node
brew install watchman
brew tap AdoptOpenJDK/openjdk
brew cask install adoptopenjdk8
```

続いて、npmでのインストールを行います 上記インストール時にはnpmは明記されてませんがnodeインストール時に一緒にされているので扱うことが可能です

```sh
npm install -g react-native-cli
```


上記インストールで全て必要なものが揃いました
以上でReactNativeの環境構築は終了です

#開発開始
ではさっそくReactNative製iOSアプリ開発の第一歩を踏んでいきます

```sh
mkdir rn_workspace ; cd $_ 
#rn_workspaceに移動する
react-native init FirstApp  --version 0.54.0
#rn_workspaceにてFirstAppという名前でReactNative構成フォルダを生成する
```

コマンドが終了したら、下記のようにコマンドを打ちアプリをMacOS内のXcodeシミュレータで起動します

```sh
cd FirstApp
react-native run-ios
```

以上で開発を行えるようになりました

以降は先ほど生成された構成フォルダを[Atom](https://atom.io/)や[Sublime Text](https://www.sublimetext.com/)などのReactNative言語に対応したプラグインの存在するテキストエディタで編集し円滑な開発をしていきましょう

#参考文献
[React Native: getting-started](https://facebook.github.io/react-native/docs/0.54/getting-started)

[Homebrew](https://brew.sh/index_ja)
HTML歴12年の俺が、12年前当時の静的WEBマークアップ事情について書く。

# はじめに
今回は、
12年前当時の静的なWEBマークアップの開発環境と、HTML4.01の個人的な思いを話します。
今では、HTML5が当たり前の時代ですが、逆にHTML4.01時代を知らない人にとっては、ある意味新鮮な感じがするかもしれません。

尚、今回は、12年前の僕(後述しますが、この時中学生です。)の主観で思い出話をするので、あまり詳細な技術トークはしません。ご了承を。

# 序
まず、軽く自己紹介すると、
現在、26歳の専門学校の学生ですが、プログラミング歴は、

Swift: 2年
Ruby: 3年
PHP: 3年
HTML/CSS: **12年** 

です。そう、僕は中学生ぐらいから、HTML/CSSを触ってます。
・・・・そして、一回IT(厳密には、HTMLコーダーに近いか。当時は、WEBに関する知識が乏しかった。)の世界を諦めています。
理由は、当時の技術で勝負できる自身がなかった事と、HTMLに挫折した事でした。

# 12年前にタイムスリップ
まずは、12年前の開発環境について語りましょう。

## エディター
- **Sublime Textがまだリリースされていない(2008年にリリース)。**
- **Atomが存在していなかった。**
- **Brackets?そんなものはない。**
- **Visual Studio Codeってエディターないよ？Visual Studioはあるけど。。**

今では、もはや必需品のエディター勢は、**当時は無いです。**
~~「オレのVS Code、パッケージいっぱい入ってるんですよ〜」とか威張れなかったんだよ。当時は。~~

さて、じゃあ僕はどうやって、HTMLを書いていたのでしょう。

それは、
### メモ帳
です。
(もし違う物使っていた人は、コメで。)

メモ帳使って、気軽にWEBマークアップするのが、**当時の僕は、それがめちゃめちゃカッコ良かった。**
サクラエディタや秀丸エディタは、あまり使いたくなかった。(秀丸に関しては、有料で手が出せない値段だった。)
当時の僕の目からは、
**メモ帳=VS Code,Bracketsなどのフリーエディター**みたいな感覚でした。


## 懐かしき、FFFTP
今は、静的サイトであれば、githubにあげれば、簡単に公開できてしまう時代。
ただ当時は、静的サイトをネットに上げるには、FTPは必要不可欠でした。
その当時、多く利用していたのが、**FFFTP**という物を使っていました。

これが、当時はめんどくさかった記憶がある。GUIの操作に物凄く手こずった。
でも、ネットに公開できた時は、物凄く感動した。
「俺のサイトがネットに上がった！」とワクワクした記憶があります。
余談ですが、当時のWEBサーバーはFC2ホームページを利用していました。
色々あって、最近、利用している人は見かけませんが、
**当時はブログ&ホームページでめちゃめちゃ輝いていました。**
**「とりあえず、ブログ・サイトやるならFC2」**って、感じで使ってました。(個人的ですが。)

## HTML4.01
さて、当時のHTML5ではありません。当時は、HTML4.01というマークアップ言語でした。
大きな違いは、主に**文書型宣言**でしょう。

```:HTML4.01
<!-- 厳密型DTD -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<!-- 移行型DTD -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<!-- フレーム設定型DTD(12年前時点で、邪道扱い) -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
```

正直に言います。
**覚えられるか。こんなの。**
もう当時の僕は、これがすごく嫌だった。
何で、こんな長い文書型宣言を書かなければいけないのか。
そして、僕は当時フレーム型のサイトを作りたかったので、**邪道のフレーム設定型DTDを宣言していた**のは、今となってはいい思い出です。

正直、これが覚えられなかったこともあり、僕はこの時、ITの道には行きませんでした。
まぁ、当時はQiitaみたいなサイトはなかったので、そう簡単にネットで検索してコピペ〜みたいなことはできませんでした。。

# 時は2015年
2015年に、僕は当時勤めていた整体師を辞めて、現在のIT専門学校に入学することになるのですが、この時、久々にHTMLを触りました。
この時点で、HTML5が勧告されていたので、初めて最新のHTML5を触りました。

文書型宣言書いた時、**もう、感動しました。**

```:HTML5
<!DOCTYPE html>
```

**「こ、これで、終わりなのか！？ほ、本当か？」**
と発狂したのを今でも覚えています。

あんな長く、複雑だったDOCTYPEが、

```:HTML4.01
<!-- 厳密型DTD -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<!-- 移行型DTD -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<!-- フレーム設定型DTD(12年前時点で、邪道扱い) -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
```
↓

```:HTML5
<!DOCTYPE html>
```

こんなになってしまうなんて。**電気が走りました。**

#そして、今
僕が、専門学校入学した後、HTMLを含めたIT技術は非常に便利になり、使いやすいものになったと思います。
今では、VS Codeなどの便利なエディターが多く出回っており、昔よりも、とても開発しやすい環境だと思います。

もう、メモ帳は古代の産物となってしまいましたが、**今ではいい思い出です。**
Firebase Dynamic Linksによる起動時の細かい挙動メモ

本当に細かい挙動の話です。

Firebase Dynamic Links(FDL)が起動されるパターンは以下があります

1. アプリ未インストール時、FDLによってGoogle Playからインストールされてから起動される場合
2. アプリがインストールされている時、FDLからアプリを直接起動する場合

## 1. アプリ未インストール時、FDLによってGoogle Playからインストールされてから起動される場合

activity.intent.dataString は空になっており FDLの`FirebaseDynamicLinks.getInstance().getDynamicLink(activity.intent)`からでないとリンクが取得できない。
Google PlayやLauncherなどから起動されてくるので当たり前といえば当たり前なのですが、そうなります。
ちなみにFDLはどのようにリンクを取得してくるかというと、プロセス間通信によって、Google Play Servicesから取得しているようです。

https://github.com/firebase/firebase-android-sdk/blob/master/firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/IDynamicLinksCallbacks.aidl#L8

## 2. アプリがインストールされている時、FDLからアプリを起動する場合

activity.intent.dataStringにもリンクのURLが入っていて、FDLからも取得可能です
そのためリンクを取得するだけであれば、わざわざFDLを使う必要はないです。
しかし、FDLではリンクに[パラメーター`amv`をつけて、`リンクを開くことができるアプリの最小バージョンの versionCode`などを設定でき](https://firebase.google.com/docs/dynamic-links/create-manually?hl=ja)、そのための情報などが渡ってきたりするので、その情報が欲しい場合はFDLから情報を取得する必要があります。
https://developers.google.com/android/reference/com/google/firebase/dynamiclinks/PendingDynamicLinkData
#Mac のターミナルで su sudo コマンドなどで要求されるrootパスワードの記憶時間=タイムアウト時間を設定する

# 手順

```
sudo visudo
```

```diff
+ Defaults    timestamp_timeout=-1
```

![image](https://user-images.githubusercontent.com/13635059/68066177-0f3b7080-fd77-11e9-8e57-35b9df3e101e.png)

# vim の操作

- `a` または `i` でインサートモードに切り替える
- 行を追加したら Esc Keyを押す
- `:x` と入力して Enter を押すと保存される

# NOTE

- iTerm2だとタブを起動するたびに、パスワード記憶状態は解除される様子。あくまで1セッション単位でのお管理なのだろうか。
- mac keep password su sudo remember などとGoogle検索してもなかなかヒットしない。
- Mac su sudo パスワード 記憶 秒数 などとGoogle検索してもなかなかヒットしない。

# 参考

[How to Change Sudo Password Timeout in Mac OS X](http://osxdaily.com/2016/05/05/change-sudo-password-timeout/)

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
tensorflow=2.0.0で「AttributeError: module 'tensorflow' has no attribute 'get_default_graph'」が出た

##はじめに
anacondaからminicondaに変えたら、tensoflowでの問題があり、同じようなエラーに出会った人の参考になればと思い書きました。

##開発環境
```
miniconda
tensorflow=2.0.0
keras=2.2.4
windows10
```
##エラー内容

```commnd
File "predict.py", line 81, in <module>
    main()
  File "predict.py", line 66, in main
    model=build_model()
  File "predict.py", line 23, in build_model
    model=models.Sequential()
・・・一部省略・・・
  File "C:\***\***\Miniconda3\envs\\lib\site-packages\keras\engine\network.py", line 109, in _base_init
    name = prefix + '_' + str(K.get_uid(prefix))
  File "C:\***\***\Miniconda3\envs\tf16\lib\site-packages\keras\backend\tensorflow_backend.py", line 74, in get_uid
    graph = tf.get_default_graph()
AttributeError: module 'tensorflow' has no attribute 'get_default_graph'

```

###解決策
tensorflowのバージョンを下げます。
condaを使ってバージョン指定する方法は[こちら](https://qiita.com/ground0state/items/48f556479b770e31d599)にあります。

###参考
[Anacondaのconda installでビルドを指定する方法](https://qiita.com/ground0state/items/48f556479b770e31d599)
【AWSのEC2にgit入れたい】AWSのEC2でgit cloneできない現象を解決した話【凡ミス系】

#Linuxサーバ構築中の出来事
現在お勉強中の身です。
カリキュラム読みながらLinuxサーバ構築のくだりで、rbenvを入れるコマンドを入力したら、下記のような塩対応が返ってきました。

``` ターミナル
[ec2-user@ip-XXX-XX-XX-XXX ~]$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
-bash: git: コマンドが見つかりません
```
多分、git入ってないんだろうなって調べたんですが、超凡ミスすぎて**ちゃんと読んで実行してればならないエラー**になってしまったがために検索結果では解決策にたどり着かず。

確認してみるとカリキュラムでやらなきゃいけないところを1個飛ばしていたようです。

もう、ドジなんだから❤️

#解決するためのコマンド

```
$ sudo yum install git
```
**sudo：**スーパーユーザーで実行（権限がある人）
**yum:**yumというインストーラーを使って
**install git:** git入れまっせ

ということらしいです。

EC2に何らかをインストールするときはyum経由で入れるらしいですわあ。

##凡ミスする人向け応用もできるこのコマンド

🔍　yum install XXX　できない

EC２に何かをインストールできてない時などは、上記のような検索を行うといろんな記事が出てくるらしいですよ。

ちょっとした検索テクニックですね。

##まごまごしてると...
じゃあ、gitも入れたし実行しようぞ！

```
packet_write_wait: Connection to XX.XXX.XX.XXX port 22: Broken pipe
```
そんなこんなでできないことを色々検索したり、色々試したりしていると、さっきログインしたEC2から、
タイムアウトでログアウトしてるじゃありませんか！

失敗したんじゃなくて、ログアウトしちゃってるだけなので安心してください！

ということで再ログインしましょうか。

```
ssh -i [生成したpem] ec2-user@[生成したElastic IP]
```
これでもう一度ログインして、git cloneをもう一度実行で問題なくinstallできました。

#凡ミスすぎると解決する記事がない事件
記事に書くほどでもないですよね。私もそう思います。
でも、初めてやったことってわからないことばっかりなので、こういう記事も必要だと思います。

と、いうことで投稿しましたとさ。
めでたし。
LND Developer SiteのTutorialでよく起こるエラー

#はじめに



#[lncli] unable to read macaroon path (check the network setting!): open data/admin.macaroon: no such file or directory

単純にadmin.macaroonのpathが間違っている。
私の環境では、`lncli --rpcserver=localhost:10001 --macaroonpath=data/admin.macaroon getinfo
`以下にあったので、チュートリアルで`data/admin.macaroon`と入力するコマンドの箇所を全て、`data/chain/bitcoin/simnet/admin.macaroon`に変えればいい。

例）

```
lncli --rpcserver=localhost:10001 --macaroonpath=data/chain/bitcoin/simnet/admin.macaroon getinfo
```

`.bashrc`にaliasとして登録する部分も同じ。
以下でコピペできる。


```
alias lncli-alice="lncli --rpcserver=localhost:10001 --macaroonpath=data/chain/bitcoin/simnet/admin.macaroon"
alias lncli-bob="lncli --rpcserver=localhost:10002 --macaroonpath=data/chain/bitcoin/simnet/admin.macaroon"
alias lncli-charlie="lncli --rpcserver=localhost:10003 --macaroonpath=data/chain/bitcoin/simnet/admin.macaroon"
```


#panic: Unable to synchronize wallet to chain: -1: Block number out of range
これは一体何なのでしょうか…。分かりません。
これが起きるとノードの接続が強制終了させられます。
何度か起きているのですがそのときは、
１．PCを再起動する
２．admin.macaroonを削除し最初からやり直す→Walletを作り直すとき`--macaroonpath=data/chain/bitcoin/simnet/admin.macaroon`と、ただしいPathでcreateする
のどちらかで起きなく成りました。
原因が知りたい…。





新しいエラーにであったら順次追記していきます。
#docker コンテナでコマンド履歴を保存したいけど出来ないので #Mac 開発なら #Alfred のクリップボード拡張はいかが？

代替利用。いったんコマンドをクリップボード履歴に入れておいて、MacOsからコマンドをコピペする。

![image](https://user-images.githubusercontent.com/13635059/68066014-d9958800-fd74-11e9-89cf-7a215a870860.png)

誤操作のペーストが怖いので利用は開発環境にだけにととどめておいたほうが良いかもね。

# iTerm2 なら

Command+Shift+C -> 範囲選択して Y 

のコピー機能も重宝する。

![image](https://user-images.githubusercontent.com/13635059/68066034-0ea1da80-fd75-11e9-9241-88510baae745.png)


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
GraphCMS & Nuxt.jsで作った BlogでCMS側で自分が登録したSlugでルーティングする

## GraphCMS & Nuxtjs Blogで動的ルーティング

### やりたい事
`https://hogehooge.app/post/`<ここにCMSで自分が登録したSlug名を入れたい。>

よくあるのはprimary keyとかに設定されている自動連番を入れていたりする。
`https://hogehooge.app/post/`1
みたいに。

### Nuxt.jsなので、動的なルーティングは簡単。

```bash
pages
├── index.vue
└── posts
    └── _slug.vue 
```
 よく`_id.vue`とかにするが、分かりやすく`_slug.vue`と名付けてみる。
つまり何でもOK。

### CMS側で`fiels`に`slug`を作って登録
cms側で`slug`を登録しておく。
この時、`unique`と`require`のbalidationをかけておく。

### ルーティングの指定
自分の実装方法は、記事の一覧を取得取得した時点で、詳細ページの情報も全て取得しており、詳細ページに行く際に再度取得せず、`id`や`slug`などのユニークな値を用いて、該当ページに必要な情報を取得する方法であるので、ルーティングのパラメーターの部分を`slug`の値にする。

```js
methods: {
    detail(slug) {
      // console.log(id)
      this.$router.push(`./posts/${slug}`)
    }
  }
```

詳細ページ側で`find`で記事取得。
自分の実装では、heroMenuのコンポーネントと、contents表示のコンポーネントの双方で、findで取得しているので、二つとも同じ事を書く。もっとDRYにできる方法がありそうだ。

```js
computed: {
    ...mapState(['posts']),
    post() {
      const targetPost = this.posts.find(
        v => v.slug === this.$route.params.slug
      )
      return targetPost
    }
  }
```

## まとめ

SEOがよくなるとかあるのか分からないが、自動生成された、idを使うよりも、自分のこんな`slug`がいいなと思ったものが形に出来ると気分がいいし、かっこいい。
実務未経験者がプロジェクトマネジメントについて書いてみた

こんにちは、[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている者です。
もうすぐエンジニアとしての実務に入ります。
その前段階として、プロジェクトマネジメントについて勉強したので、メモします。

##なぜプロジェクトマネジメントが必要なのか

エンジニアの実務の基本はチーム作業です。
時には数十人単位での大きなプロジェクトに関わる場合もあります。
そのプロジェクトの管理者を任されることもあるでしょう。
プロジェクトの成否を決める鍵は、プロジェクト管理にあります。
そのため、チームが目的を達成できるようにするためには、管理者がうまくチームをマネジメントしなければいけません。

##プロジェクトマネジメントに必要なこと

###タスクの担当者と期限日は必ず決める

プロジェクトとは、チームの大きな目標を達成するための長期計画です。
そのプロジェクトでは、一人ひとりにタスクが割り振られます。
その際に、タスクの担当者と期限日は必ず決めておくべきです。
タスクの担当者を決めておかないと、期限日になって誰も手をつけていないタスクが残っていたなんてことになりかねません。
また、担当者を決めておけば、割り当てられた人は、当事者意識を持ってタスクに取りかかれます。
加えて、タスクの期限日も決めておくべきです。
人は追い込まれないとなかなか動かないものです。
タスクの期限を決めておけば、タスクに集中できますし、締め切りまでの日数と進捗を照らし合わせてタスクを見直すこともできます。

###タスクは具体的に

タスクの内容は具体的に決めるべきです。
内容を曖昧にしてしまうと、管理者とチームメンバーとの間で認識のずれが生じ、本来やるべきこととは全く異なることをしていたということになりかねないからです。
また、同様の理由から、タスクの完了条件も明確にしておくべきです。


###タスクの見直しを定期的に行う

タスクの見直しを定期的に行うべきです。
管理者は、全体の進捗状況を把握しておく必要があります。
そのため、タスクの進捗会議を開いたり、時々チームメンバーに進捗状況を尋ねたりします。
もし締め切りに間に合いそうにないタスクがあれば、締め切りの延長・担当者の変更といった対応をとります。

##まとめ

今回は、プロジェクトマネジメントについて書きました。
とはいえ、私はまだ実務未経験者なので、間違いや補足事項があるかもしれません。
その場合はご指摘のほどよろしくお願いします。

##参考文献

https://backlog.com/ja/project-management-guide/
Ubuntu 18.04 LTS Desktop で Alt+` のショートカットが正常に動作しない

# 概要
- Ubuntu 18.04 LTS Desktop の設定がデフォルトの時 Alt+` のショートカットが正常に機能しない
- 原因はデフォルトキーボードショートカット
- メニュー上では Disabled だが、実際には Alt+` に割り当てられている操作がある
- Switch windows of an application のショートカットにキーを割り当てれば良い

# Ubuntu 18.04 LTS Desktop での Alt+` 操作
Linuxを使う際、日本語入力への切り替えに Alt+\` を割り当てている人は多いだろう。しかしながら Ubuntu 18.04 LTS Desktop でこのキー操作を行った場合、画面中央に使用中のアプリケーションアイコンが出現するだけである。

- fcitx などで Alt+\` キーを入力切替用のキーに設定するなど、何かしらの対応をしても Alt+\` キーのショートカット操作は機能しない。

# ショートカットキーが機能しない原因について
この動作仕様は、デフォルトキーボードショートカットで Alt+\` が
`Switch windows of an application`
に割り当てられていることによるものである。この問題を解決するために
`Settings>Devices>Keyboard`
からショートカットの設定を確認する。

# ショートカットキーの表示バグ
`Switch windows of an application`
の項目はデフォルトでは`Disabled`になっているが、実際には Alt+\` キーが割り当てられている。メニュー表示の上でだけ`Disabled`となるバグのようだ。

# 問題の回避
根本的な解決にはならないが
`Switch windows of an application`
に何か別のショートカットを割り当てることで Alt+\` キーが機能しない問題は回避できる。
conoha サブドメイン作成

conohaでサブドメインを作成したい。
今回は test.helpee.club を作る。

# conoha にログインし、DNS 設定

```

タイプ 名称 TTL 値
CNAME test 3600 helpee.club

```


# nginx 設定

```

server {

    listen 443 ssl http2;
    server_name test.helpee.club;
    root   /var/www/html/test.helpee.club/;

}

```

# SSLにする

https://qiita.com/ma7ma7pipipi/items/679c555b66de99e01e58


の

www 無しを www 付きに統一させる nginx

を参考に。


これでOK。
Rust base64自作してみた

# 0. 環境
- rustc 1.39.0-nightly (66bf391c3 2019-09-23)
- binary: rustc
- commit-hash: 66bf391c3aabfc77f5f7139fc9e6944f995d574e
- commit-date: 2019-09-23
- host: x86_64-pc-windows-msvc
- release: 1.39.0-nightly
- LLVM version: 9.0

# 1. 経緯
base64のクレートは既に存在するのですが, Rustの勉強のために自作してみました。
既存のクレート : [https://docs.rs/base64/0.11.0/base64/](https://docs.rs/base64/0.11.0/base64/)

# 2. ソースコード
```rust
use std::collections::HashMap;
use std::io::{stdout, Write};

// 1行取得
fn getline() -> String {
    let mut __ret = String::new();
    std::io::stdin().read_line(&mut __ret).ok();
    return __ret;
}

// base64変換表を作成し, 返す
fn make_conversion_table() -> HashMap<String, String> {
    let mut conversion_table = HashMap::new();

    let values = vec!["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "/"];

    for i in 0..values.len() {
        let bin = format!("{:06b}", i as i32);
        conversion_table.insert(bin, values[i].to_string());
    }

    return conversion_table;
}

fn main() {
    print!("Input : ");
    stdout().flush().unwrap();
    let plain = getline().trim().to_string();        // 変換する文字列を取得

    let mut all_bits = String::new();   // plainをバイナリ化したものを格納

    // plainをバイナリ化してall_bitsに格納
    for c in plain.chars().into_iter() {
        let bin = format!("{:08b}", c as i32);
        all_bits += &bin;
    }

    let mut six_bits: Vec<String> = Vec::new();     // バイナリを6bitごとに分割したもの
    let mut six_bit = String::new();                // six_bitsに格納する6ビット
    let mut count = 0;
    for c in all_bits.chars().into_iter() {
        count += 1;
        six_bit += &c.to_string();

        // bitsに6ビット入れたらsix_bitsに格納し, bitsをクリアする
        if count % 6 == 0 {
            six_bits.push(six_bit);
            six_bit = "".to_string();
        }
    }

    // bitsにビットが入っていたら, 6ビットにしてsix_bitsに格納する
    if six_bit.len() > 0 {
        let add_zero_count = 6 - six_bit.len();
        let mut add_zero_str = String::new();
        for _ in 0..add_zero_count {
            add_zero_str += "0";
        }
        six_bit += &add_zero_str;
        six_bits.push(six_bit);
    }

    let conversion_table = make_conversion_table();     // base64変換表

    let mut base64_str = six_bits.iter().flat_map(|six_bit| conversion_table[six_bit].chars()).collect::<String>();     // base64に変換した文字列

    // 足りない分"="を, base64_strに追加する
    if base64_str.len() % 4 != 0 {
        let mut equal_str = String::new();
        let add_equal_count = 4 - (base64_str.len() % 4);

        for _ in 0..add_equal_count {
            equal_str += "=";
        }
        base64_str += &equal_str;
    }

    // 変換結果を表示
    println!("Base64 : {}", base64_str);
}
```

# 3. おわりに
「ここは、***のように書けるよ」っていうのがあれば教えてください。
#Mac の ターミナル や #iTerm で HTTPS / HTTP プロクシから Webサイトに接続する ( サーバーに #ssh 接続して SOCKS proxy を立てる  ) ( #bash #linux )

# ssh コマンド で SOCKS proxy を起動しておく

例

```
ssh -vND 8888 user@xxx.xxx.xxx.xxx
```

```
ssh -vND 8888 user@xxx.xxx.xxx.xxx -i ~/.ssh/some.pem
```

# 環境変数で HTTPS proxy を指定する

```
export HTTPS_PROXY=socks://127.0.0.1:8888
```

こちらもお好みで

```
export HTTP_PROXY=socks://127.0.0.1:8888
```

# 自分のIPをcurlコマンドで確認してみる

環境情報確認サイト「確認くん」を使ってみる。

昔からお世話になってます！

```
```
$ export HTTPS_PROXY=
$ https://httpbin.org/ip
{
  "origin": "YYY.YYY.YYY.YYY, YYY.YYY.YYY.YYY"
}
```
```

# プロクシを利用しない設定にして自分のIPアドレスを確認する

```
$ export HTTPS_PROXY=
$ https://httpbin.org/ip
{
  "origin": "ZZZ.ZZZ.ZZZ.ZZZ, ZZZ.ZZZ.ZZZ.ZZZ"
}
```

# 切り替えできていたら成功！

# 設定を保存する

~/.bash_profile ~/.bashrc ~/.zshrc などのプロフィールファイルに export コマンドを書いておけばok

# NOTE

なぜかこちらの方法だと反映されなかった。

```
curl httpbin.org/ip
```

[グローバルIPをcurlで確認 - Qiita](https://qiita.com/kanpou0108/items/734b947f5a95109e7bb9)

# 関連

[Mac OS で ssh サーバーを踏み台にして SOCK プロクシ経由で Web ページにアクセスする例 ( #Mac #ssh ) - Qiita](https://qiita.com/YumaInaura/items/7e4c9335e0f07b64319d)

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ZK Frameworkの環境構築の仕方

ZK Frameworkを使用するための環境構築の仕方を書いていきます。
<br>

開発環境:
・eclipse version 4.13.0
・java8
・Tomcat8.0
<br>

引用元:
https://www.youtube.com/watch?v=HuzarS_adYI
<br>

[Help] → [Eclipse Marketplace]　を開きます.
![スクリーンショット (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520803/8bd6a93d-8a47-b718-dc37-450bc23729db.png)
<br>


Searchタブの[Find:]で「zk studio」と検索します.
「zk studio」が出てきたら[Install]を押下.
![スクリーンショット (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520803/eaddbc8e-2291-0d6f-231b-ef1922b9ca7f.png)
<br>


ライセンス確認画面が出るので、
[I accept the terms of the license agreement]にチェックを入れて[Finish]ボタンを押下.
![スクリーンショット (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520803/bbf97508-1f1f-3a63-9e16-78f6bb75e9ae.png)
<br>


Security Warningのポップが出ますが、[Install anyway]ボタンを押下.
![スクリーンショット (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520803/9660e1e5-f893-ec48-6553-97d073a1f05a.png)
<br>


再起動についてのポップが出るので、[Restart Now]ボタンを押下.
![スクリーンショット (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520803/47ef71a1-1f21-ee7a-15ca-496f8ae1a9c8.png)
<br>


再起動するとインストールが完了し、ZKのトップページが表示されます.
※※インストール途中にSign inのポップが出ますので、その時に任意のUserNameとPasswordを入力してください.
![スクリーンショット (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520803/ae8d03c7-0897-712d-ba9c-2dd4dd7ae266.png)
<br>


zkのプロジェクトが作成できるようになっています.
![スクリーンショット (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520803/28421c37-9ef2-b001-91f9-e5a7877de075.png)
![スクリーンショット (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520803/cc09d5e1-25d8-68cc-fd1a-3a17f52ebedc.png)
<br>


ZUL Paletteの表示手順
![スクリーンショット (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520803/89cb974d-01de-7b91-533d-a073384ee12e.png)
![スクリーンショット (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520803/ea203ffe-3447-03f7-6208-7c7f6318db1d.png)
<br>


Hello Worldプログラムの作成.
WebContent直下にzulファイルを作成し、実行します.
![スクリーンショット (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520803/db51bb29-5e65-a900-6fa2-f68d731b5316.png)
<br>


実行結果
![スクリーンショット (19).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520803/bcdd081a-c1e2-b001-c9f6-e6dd6def4545.png)
elixir を asdf で環境構築する手順

## Homebrew Install
Mac OSX 

Homebrewのインストール
1. macOSでHomebrew パッケージマネージャーをインストール

HomebrewのHP > [https://brew.sh/index_ja](https://brew.sh/index_ja)

ターミナルに下記のコマンドをコピーしてペースト

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

## asdf Install

```sh
brew install asdf
```

Homebrewによるインストール

```sh
echo -e "\n. $(brew --prefix asdf)/asdf.sh" >> ~/.bash_profile
echo -e "\n. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash" >> ~/.bash_profile
```

ターミナルを再起動します。

## プラグインの依存関係

```sh
brew install \
  coreutils automake autoconf openssl \
  libyaml readline libxslt libtool unixodbc \
  unzip curl
```

### asdfの概要と流れ

1. プラグインのインストール
 asdfで管理したい言語のプラグインをインストールします。
 asdfで管理する為の言語が入ってる場合は
 asdf plugin-list で確認できます。
 
 プラグインをインストール後に、プラグインのリストにある言語の
 バージョンを指定してインストールします。
 
2. 言語のバージョンをインストール
 インストールしたいバージョンを確認する為に

```sh
 asdf list-all プラグインに入っている言語名
```
バージョンを選んでインストール

```sh
asdf install プラグインに入っている言語名 バージョン番号
```

3. インストールしたバージョンを有効にする

ターミナルのディレクトリ配下でのみ、そのバージョンを有効にしたい場合


```sh
asdf local プラグインに入っている言語名 バージョン番号
```

どこからでも使えるようにしたい場合

```sh
asdf global プラグインに入っている言語名 バージョン番号
```

## elixirの環境構築の流れ

* asdfでerlangのプラグインをインストールします。

```sh
 asdf plugin-add erlang
```

* asdfでelixirのプラグインをインストールします。

```sh
 asdf plugin-add elixir
```

* asdf plugin-list で確認する

```sh
asdf plugin-list
erlang
elixir
```

* バージョンを確認する

```sh
asdf list-all erlang
```

```sh
asdf list-all elixir
```

* インストールする

```sh
asdf install erlang 21.1.0
asdf install elixir 1.7.4
```

* 使えるようにする

```sh
asdf global erlang 21.1.0
asdf global elixir 1.7.4
```

* 確認する

```sh
asdf current
```
サーバ用のCPU切り替え機のモニターを交換したら「Out of range」出た時の対処方法

この文章にはオチがあります。最後まで読みましょう。

# CPU切り替え機(KVM) ATEN CS1316
職場のサーバ室のCPU切り替え機(KVM)のATEN CS1316に、10年物の古いモニターを繫いでたのですが、解像度が低かったので、高解像度の「1920x1200@60Hz」のモニターに交換したのですが、繋ぎ変えたあと、KVMのメニューを表示させたら「Out of range」と表示されて何も映らなくなりました。。

検索すると、

> https://eservice.aten.com/eServiceCx/Common/FAQ/view.do?id=6427
> メニュー画面だけが表示されない(CS13xx、CS17xxA、KH15xxAシリーズ)

KVMメニューの解像度は「640x480@75hz」がデフォルトらしいです。この解像度を新しいモニターが対応してないのですね。上記URLにはF10キーで「800x600@60hz」に切り替わると書いてあります。

ですがF10キーをおしても何も反応ありません。。なんでや？

#KVMのファームが古い
これはKVMのファームウエアが古いのではという予想に至ったので、最新の「v1.6.159」をダウンロードしました。

> https://www.aten.com/global/en/supportcenter/downloads/?q=CS1316

ファームの更新には専用ケーブルが必要です。最初から付いてるのではと思います(maybe)。

##更新に悪戦苦闘
ファームの更新時にPC側にシリアルポート(RS-232C)が必要です。手元のPCにはついてませんでした。USB-シリアル変換アダプタでつないでみました。。

ですが、何回やっても更新に失敗します。。

マニュアルにKVMに接続してあるPCをすべてshutdownしろと書いてあったので、落としてみましたがダメでした。

USB-シリアル変換が悪いのではと予想したので、マザーボードにシリアルポートがついてる古ーいPCを発掘してきて、ファームの更新を試したところ成功しました(^_^; USB-シリアル変換はダメのようです。

#ファーム更新後、KVMのメニューが映るようになりました。

F10で解像度を「800x600@60hz」に切りかえることができるようになり、メニューは表示されるようになりました。

#やっぱり駄目だった
しかし、、メニューは映るようになりましたが、KVMに接続しているサーバに切り替えると、半分ぐらいのサーバはやっぱり「Out of Range」で映りません。。。サーバ側のビデオ出力を切り替えないといけないようです。。多種多様なOS(CentOS７/CentOS6/HyperV/VmwareESXi)混在している環境で、、切り替える方法を調べるのが面倒になりました。

やっぱりモニターを古いのに戻した(^_^;

サーバに使うモニターは「640x480@75hz」対応のを買いましょう。

後日談： モニターをいろいろ交換してみましたが、手元にあった1920x1200のモニター２機種は全滅でした。ちょっと画面が狭いですが、Eizo FlexScan EV2450 (1920x1080)に交換したらすべてのサーバのビデオ出力が映りました(^_^)


> https://www.eizo.co.jp/products/lcd/ev2450z/index.html

(補足：上記のURLは手元の機材と微妙に型番違います。上記は EV2450-Z。手元のはZ無しのEV2450。)
ssh の鍵を、ホストやユーザごとに切り替える設定

## はじめに
SSH の鍵を、ホストやユーザごとに切り替える設定を記載します。
客先やプロジェクト毎に、Git管理サービスのユーザやホストが変わって面倒な場合があるやつです。

### 環境
ちなみに、筆者の環境は Windows 10 です。
記載内容は関係ないですが、config ファイルのありかは環境依存になると思います。

config ファイルのありか：`C:\Users\your_user_name\.ssh\config`

## ユーザごとに切り替える設定

```
Host               bitbucket.org
    Hostname       bitbucket.org
    IdentityFile   ~/.ssh/id_rsa_for_tanaka_private
    IdentitiesOnly yes
    User           tanaka_private

Host               bitbucket.org
    Hostname       bitbucket.org
    IdentityFile   ~/.ssh/id_rsa_for_tanaka_work
    IdentitiesOnly yes
    User           tanaka_work

```

## ホストごとに切り替える設定

```
Host               hoge.git.backlog.jp
    Hostname       hoge.git.backlog.jp
    IdentityFile   ~/.ssh/id_rsa_for_hoge
    IdentitiesOnly yes

Host               foo.git.backlog.jp
    Hostname       foo.git.backlog.jp
    IdentityFile   ~/.ssh/id_rsa_for_foo
    IdentitiesOnly yes

```
IPAファイルの署名やプロファイルを手作業で差し替える

勤務先のプロジェクトで発生したトラブル対応のお話を、備忘録も含め書き残したいと思います。

# Enterprise な Developer Program に優しくない
勤務先のあるプロジェクトでは、私が所属しているのとは別のチームのメンバーが Unreal Engine (以下、UE) でモバイルアプリを開発し、そのアプリの配布先がインハウスな iOS デバイス、というワークフローが存在します。

今回そのプロジェクトの成果物であるアプリが、Provisioning Profile の有効期限切れを迎えるため UE 側から再ビルドしようとしていたのですが、Apple の証明書周りの不具合？でビルドできず詰んでしまい、急遽 .ipa ファイルの中身 (Provisioning Profile) を差し替え、手作業で再署名することでなんとか延命しようと対応しました。

もはや慣れっこですが、iOS 開発は Developer Program 契約なしでの開発入門であったり、Xcode による証明書の自動生成であったり、何かと "初見殺し" とか、"最初は問題なくとも後々の応用部分で詰む" トラップが多彩で困りますね…。UE を使った開発プロジェクトの着手当初も色々サポートしていたのですが、だいぶ苦しめられました。


# いきなり参照先
*[iOS]ipaファイルの署名やプロファイルやアプリバージョン等をターミナル操作で変更する*
https://reftec.work/posts/2019/7/71/

それらしいワードでググるとそれらしい情報がいくつかヒットするのですが、そこは Apple さんのことなので、古い情報は不足や変更が生じて大抵使い物にならなくなっていたりします。
この "コン" さんのブログ記事は現時点でほぼ最新の情報ということもあり、必要な情報と手順がまとまっており、すぐに ipa をゴニョゴニョすることができました。この場を借りてお礼申し上げます m(_ _)m 。


# ちょっとつまづいた点
Apple iOS Developer Enterprise Program のヘビーユーザーである当方勤務先では、色々な都合から社名の表記違いで2つの Developer Enterprise Program を契約しているのですが、そのようなケース (超弩級、レア中のレアケースだと思いますが…) だと上掲のワークフローで少し不都合といいますか、暫定的な個別対応が必要になりましたので、記録を残しておこうと思った次第です。

### ambiguous な組織名
Enterprise Program 2つ持ちの弊社では、下記のような配布用 (iPhone Distribution) 証明書が存在します。英語大文字か小文字かの違いだけ。

- iPhone Distribution: HEISHA CO.,LTD. (メインのプロジェクト用)
- iPhone Distribution: heisha co.,ltd. (UEプロジェクト用)

*※社名はサンプルです。*

この組織名は Enterprise Program メンバーシップのチーム名が影響すると思いますが、表記の重複が原因と思われる理由により、codesign コマンドを使用した再署名の際に「証明書の指定が曖昧(ambiguous) だ」と叱られました。

`codesign --force --sign 'iPhone Distribution: 組織名' --entitlements ./enetitlements.plist --timestamp=none 'Payload/APP名.app'`

### 対処方法
ズバリ、**今回再署名したいアプリのプロジェクト (UEプロジェクト用) とは無関係な証明書と秘密鍵を、一時的にキーチェーンアクセスから削除してしまう**ことです (バックアップ注意) 。

これで問題なく再署名を実行することができました。
ᕙ( 'ω' )ᕗ
ActionBarに画像を表示する

# はじめに

Androidアプリ作成において、ActionBarに画像を表示する方法のメモになります。

アイコンを表示する方法が出てきたり、ToolBarに差し替えましょう、とあったのですが、ロゴなどの画像をそのまま表示する方法は見受けられませんでした。

筆者はAndroidに詳しくなく、知っていれば簡単なのに検索しても簡易的な記事が見つからなかったので記事として残します。

環境は、

- AndroidStudio: 3.4.1
- Kotlin: 1.3.40-release-Studio3.4-1

です

# 結果


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69911/defa63a3-35ac-2bec-67f8-48ea3d8cee5c.png" data-canonical-src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69911/defa63a3-35ac-2bec-67f8-48ea3d8cee5c.png" width="50%" />


サンプルロゴは【[Free Logo Maker — Create a Logo — Squarespace](https://www.freelogodesign.org/)】で作成しました。

# 解法

手順としては、

1. 画像の取り込み
2. ImageViewのxmlを作成
3. ActionBarにCustomViewを設定

です。

## 1. 画像の取り込み

New -> Image Assets で画像の取り込み。

<img width="1011" alt="Screen Shot 2019-11-02 at 14.48.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69911/9e6fa96a-acc6-96ba-f305-82de83a41ef3.png">


## 2. ImageViewのxmlを作成

今回は`app/res/layout/logo_image_view.xml`という名前で作成しました。

WidgetsのImageViewを追加し、取り込んだ画像を設定、レイアウトを整え点完了

<img width="1023" alt="Screen Shot 2019-11-02 at 14.39.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69911/9e29f130-a311-86f8-9512-b4015db0c40b.png">


## 3. ActionBarにCustomViewを設定


`MainActivity.kt`を開き、(2)で作成したImageViewをセットします

```kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    // ActionBarにcustomViewを設定する
    supportActionBar?.setCustomView(R.layout.logo_image_view)
    // CustomViewを表示する
    supportActionBar?.setDisplayShowCustomEnabled(true)

    // ...
}
```

これだけで画像を表示するだけなら問題ないと思います、




# おまけ: 画像を左寄せにするTips

`logo_iamge_view.xml`をtextモードで開いて、ImageViewに`android:scaleType="fitStart"`を追加すればok

参考: [Android layout - alignment issue with ImageView - Stack Overflow](https://stackoverflow.com/questions/655994/android-layout-alignment-issue-with-imageview)

# おわり

サンプルリポジトリ([SampleAppImageViewOnActionBar](https://github.com/mtfum/SampleAppImageViewOnActionBar))を置いておきます 


画像の取り込み方の最適解も知らず、レイアウトも雰囲気なのでご指摘いただけると幸いです！
Java 1 1 support from Google App Engine

Google’s App Engine cloud has added official support for Java 11, the latest long-term support (LTS) version of the Java language platform, as a production release.
The App Engine Standard Environment Java 11 runtime is generally available for running any Java 11 application, web framework, or service in a managed serverless environment. Java 11 had been offered on App Engine in a beta release since June.
The Java 11 runtime on App Engine offers twice the amount of memory as the earlier Java 8 runtime, providing better support for applications that run under a heavy workload with large amounts of data. Developers can use frameworks including Spring Boot, Ktor, Vert.x, or Micronaut.

In the Google App Engine managed the environment, the runtime is automatically updated with the latest security patches to the operating system and minor revisions to the Java Development Kit (JDK). App Engine also provides services including request tracing, traffic splitting, centralized logging, and production debugging.

Java 11, or JDK 11, was made available by Oracle in September 2018. As an LTS version, Java 11 is slated to receive support from Oracle well into the next decade. This contrasts with six months of Oracle support for other releases, such as the current JDK 13 release or the prior JDK 12 release.

How to access Google App Engine’s Java 11 runtime;
You can access the Google App Engine Java 11 Standard Environment documentation from the Google Cloud website. Google also is offering guidance on migrating App Engine Java 8 applications to App Engine Java 11. You can learn directly from the java training in Chennai. for references google cloud website.

[Spring boot interview questions](http://candidjava.com/tutorial/spring-boot-interview-questions/)
Vitualboxの仮想マシンイメージをVMwareESXiのマシンイメージに変換

#はじめに

本記事では、VirtualboxのイメージファイルをVMwareESXiに対応するイメージファイルに変換する手順である。
「OVAファイル」から「VMXファイル」「VMDKファイル」を生成する。

#前提条件

・実施環境は、Winodows10PCとする
・VMwareの「OVF Tool」がインストール済であること。
※インストール済みでない場合は、[ここ](https://my.vmware.com/jp/web/vmware/details?productId=352&downloadGroup=OVFTOOL350)からインストールする。
※本書では、OVF Toolのインストール手順は割愛する。


#(1)Virtualboxの仮想マシンをエクスポート
①「OUIにエクスポート」を押下する。
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252895/eeae8d41-40a1-4045-b6e5-edd71ef2d7c2.png)

②以下、設定項目を入力し、「次へ」を押下する。
フォーマット：Virtualization Format1.0
ファイル：※エクスポート先のフォルダを指定
備考：他、デフォルト設定
※「Virtualization Format」が2.0の場合、VMwareとの互換性がないので、変換処理に失敗する。そのため、1.0を指定。
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252895/5d26a220-93f6-5bd0-9d87-1fcbdddbd8d7.png)

③確認画面で内容に誤りが無いようであれば「エクスポート」を押下する。
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252895/d4a8c3f5-9d10-b68e-2edd-d7f40f04ba12.png)

④エクスポート処理
※5分～10分ぐらいかかる
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252895/b5e6634c-c45b-4750-08af-334bc2836697.png)

⑤エクスポート後の確認
![7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252895/2f34f36e-9530-6230-0e31-8b8b31a02131.png)
※OVAファイルが生成される。


#(2)OVAファイルをVMDKファイルに変換
①コマンドプロンプトを開く。
②VMware OVF Toolの格納フォルダに移動。

```
> cd C:\Program Files\VMware\VMware OVF Tool
```
※ovftoolのデフォルトのインストール先は、「C:\Program Files\VMware\VMware OVF Tool」である。

③ovftoolコマンドを実施。

```
> ovftool -lax OVAファイル.ova VMXファイル.vmx
```

※処理に10～15分ぐらいかかる


以下、実行結果

``` :コマンドプロンプト画面
C:\Users\taro>cd C:\Program Files\VMware\VMware OVF Tool
C:\Program Files\VMware\VMware OVF Tool>ovftool --lax C:\work\CentOS7.ova C:\work\CentOS7.vmx
Opening OVA source: C:\work\CentOS7.ova
Opening VMX target: C:\work\CentOS7.vmx
Warning:
 - The specified operating system identifier 'RedHat_64' (id: 80) is not supported on the selected host. It will be mapped to the following OS identifier: 'Other (32-bit)'.
 - Line 28: Unsupported hardware family 'virtualbox-2.2'.
 - Line 69: OVF hardware element 'ResourceType' with instance ID '5': No support for the virtual hardware device type '20'.
 - Line 86: OVF hardware element 'ResourceType' with instance ID '7': No support for the virtual hardware device type '35'.
Writing VMX file: C:\work\CentOS7.vmx
Transfer Completed
The manifest validates
Warning:
 - No manifest entry found for: 'CentOS7-disk001.vmdk'.
Completed successfully

C:\Program Files\VMware\VMware OVF Tool>

```

なんかエラーぽいのでてるけど、とりあえずVMDKファイルはできました
![6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252895/a5dc5ac3-f314-81ab-5246-20986aa63f06.png)

#参考URL

https://manual.sakura.ad.jp/cloud/design-pattern/tips/vmware-to-sacloud.html
https://communities.vmware.com/thread/485315


#全体を通した所感
Virtualboxのイメージファイルって変換できるんだ～へえ～
最新のiOSで最新のXcodeで実機ビルドしようとすると、最新のXcodeバージョンアップしてくれよと言われビルド出来ない

状況は掲題の通りで、Flutterを実機ビルドしようとすると「Xcodeでやってくれ」と言われ、Xcodeでビルドしてみると、最新なのに「最新のXcodeにアップデートしてくれ」と言われました。

今回こちらを参考にさせていただきました。
https://qiita.com/yamataku29/items/6fdc9e512b42d7f66386

Device Support Fileというのが足りないのが原因だった模様。こちらでダウンロード出来ます。
https://github.com/filsv/iPhoneOSDeviceSupport

私はiOS13.2でしたので13.2.zipをダウンロードし、READMEに従ってunzipしたものを`/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/`へ配置。
Xcodeを再起動したらXcodeでのビルドも、Flutterコマンドでのビルドも出来るようになりました！

出来るようになったのですが、今度はXcodeが急に落ちる現象に見舞われる。
https://qiita.com/UJIPOID/items/015805c89bddca540129 に従って、Xcodeを完全アンインストールしたのち、インストールを実施してひとまずことなきを得るに至りました。

再インストールした後、先ほどの`/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/`を確認したら13.2のがあったので、再インストールしても解決することが出来たようです。急に落ちるなどがなければDevice Support Fileを入れてあげるのがベターか。

本来はXcodeアップデートの時に13.2のDevice　Support Fileが入っていればいいだけなのでしょうけど、なぜ入っていなかったのか。。
EDNS非対応のルータとIPv6環境で詰んだ詰んだ

## DNSぴょんぴょん

2019年2月1日の「[DNS flag day](https://blog.nic.ad.jp/2018/1848/)」からだいぶ時が過ぎ、時代は「[EDNS1](https://dnsflagday.net/2020/index-ja.html)」の検討にむかいつつあるようだ。

そう、古い時代のDNSを搭載するような機器は淘汰されたはずなのだ。

ところがどどっこい、特定のDNSリクエストがエラーになって、名前解決に失敗する、ないし、フォールバックが発生して妙に時間がかかるクソ環境...

__それがありえるかも、YAMAHA色のRTXシリーズ♪__

> 公式で言及されてるように、YAMAHAは対応するゼロの模様：
http://www.rtpro.yamaha.co.jp/RT/FAQ/TOPIC/root-ksk-rollover.html

まぁ、他にも古いルータにDNSさせてると起きるんですけどね。

## 困りました： 対処

DHCPで配布するDNSサーバとして、8.8.8.8や1.1.1.1といったパブリックDNSを渡してやる、もしくは、まともなISPのDNSサーバを直接渡してやる。

と、IPv4だけならこれでいいんですが、IPv6環境も考えるとどうだ？

実は、ルータ側の設定で上記の設定をしつつ、IPv6のDHCPv6ないしRAでもDNSを指定できる実装が、そういうルータに限って不十分な事が多い。

なんなら、埋め込みで自身をv6のDNSとして渡してしまう奴や、v4のDNS機能を切ると、53番に対するFWを閉じて、IPv6のDNS問い合わせを蹴り出す奴まで居る。（ありえない）

## ふわふわどきどき：結論

ルータのDNS/DHCPはおまけと考えて、独自にDNS/DHCP/RAをする箱を置こう。