OmniAICreator/Qiita-1.07M huggingface dataset:
Lombokお試し

これも超今さら。読み方は「ロンボク」。

# 準備

Mavenで入れるのが一番ラクでした。
要は、lombok.jarにクラスパスさえ通れば何でもいいです。

```xml:pom.xml
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.16</version>
    <scope>compile</scope>
</dependency>
```

# getter/setterの自動生成

↓これが

```java:Product.java（@Data導入前）
public class Product implements Serializable {
    private String code;
    private String name;
    private BigDecimal price;

    /* ごちゃごちゃ */
    public Product() {}
    public String getCode() { return this.code; }
    public String getName() { return this.name; }
    public BigDecimal getPrice() { return this.price; }
    public void setCode(String code) { this.code = code; }
    public void setName(String name) { this.name = name; }
    public void setPrice(BigDecimal price) { this.price = price; }
}
```

↓こうなる。

```java:Product.java（@Data導入後）
@Data
public class Product implements Serializable {
    private String code;
    private String name;
    private BigDecimal price;

    /* スッキリ！ */
}
```

呼び出し元は、getter/setterがあるものと考えて普通に呼び出せばOK。

```java:
Product product = new Product();
product.setCode("0001");
product.setName("商品０１");
product.setPrice(BigDecimal.valueOf(10000L));

product.getCode();  // => 0001
product.getName();  // => 商品０１
product.getPrice(); // => 10,000
```

可読性が向上していいと思います。

# Builderパターンの自動生成

前述のProduct.javaに`@Builder`アノテーションを付けると、呼び出し元で以下のようなこともできる。

```java:
Product product = Product.builder()
        .code("0001")
        .name("商品０１")
        .price(BigDecimal.valueOf(10000L))
        .build();
```

なんか今風でカッコいい。

ちなみにJavaBeansとBuilderパターンは矛盾しないと考えてＯＫ？
（JavaBeansの仕様書には「getter/setterを持つこと」（※getter/setter以外のメソッドを持つなとは言っていない）と記載してあった）

# 検査例外を非検査例外のように扱う

検査例外を呼び出し元でcatchしなくてもコンパイルエラーにならなくなります。
すなわち、↓これが

```java:@SneakyThrows導入前
private String encrypt(String src) {
    MessageDigest md;
    try {
        md = MessageDigest.getInstance("SHA-256");
    } catch (NoSuchAlgorithmException e) {
        throw new RuntimeException(e);
    }

    md.update(src.getBytes());
    return md.digest();
}
```

↓こうなる。

```java:@SneakyThrows導入後
@SneakyThrows
private String encrypt(String src) {
    MessageDigest md = MessageDigest.getInstance("SHA-256");
    md.update(src.getBytes());
    return md.digest();
}
```

ただ、詳しく調べきれていないのですがこれは使わない方がいいような気がします。どういう原理かイマイチ理解できていませんが、検査例外を`RuntimeException`で包んでいるのではなく、検査例外がコンパイルエラーにならないようにコンパイラを騙しているだけのようなのです。前述のソースで意図的に`NoSuchAlgorithmException`を発生させると、これが呼び出し元にそのまま飛んできます。これはこれで思わぬ副作用があるかもしれません。
前述のソースのように絶対に例外が発生しないとわかりきっている（SHA-256は必ず入っている）ならいいかもしれませんが。

あと細かい話ですが、SneakyThrowsアノテーションがついているとJacoco(0.8.2)のカバレッジが100%になりませんでした。カバレッジ100%をテスト計画でうたっていたりすると、後々面倒なことになるかもしれません。

# 余談

getter/setterが自動生成できるのはまあいいとして、そもそもJavaBeansのsetter自体がカプセル化の考え方に反しているのではないかという、本質的な矛盾に直面中。「getter/setter無くして、フィールドをpublicにするだけじゃダメなんですか？」と聞かれたときに満足のいく回答ができる自信がない。
mysql_secure_installation の初期パスワード確認

#経緯
MySQLの設定をする際に初期パスワードが自動発行されていることを知らなかったため、記事に残しました。


Conohaのサポートブログ
https://support.conoha.jp/v/setupmysql/



#問題点

▼SQLのセキュリティ設定の際に下記のエラーで躓いてしまった

```
$ mysql_secure_installation
Securing the MySQL server deployment.

Enter password for user root: 
Error: Access denied for user 'root'@'localhost' (using password: YES)
```

#解決

どうやらSQLには初期パスワードが事前に発行されているようです。
初期パスワードの格納場所は`/var/log/mysqld.log`
▼root@localhost:の後ろが初期パスワードです

```
$ cat /var/log/mysqld.log

~~省略~~
[Note] [MY-010454] [Server] A temporary password is generated for root@localhost: [初期パスワード]
```


▼`mysql_secure_installation`で初期パスワードを入力し新しいパスワードを設定

```

$ mysql_secure_installation

Securing the MySQL server deployment.

Enter password for user root: [初期パスワード]

The existing password for the user account root has expired. Please set a new password.

New password: [新しいパスワード]

Re-enter new password: [もう一度新しいパスワード]
The 'validate_password' component is installed on the server.
The subsequent steps will run with the existing configuration
of the component.
Using existing password for root.

Estimated strength of the password: 100 
Change the password for root ? ((Press y|Y for Yes, any other key for No) : y

New password: [新しいパスワード]

Re-enter new password: [もう一度新しいパスワード]

Estimated strength of the password: 100 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done! 

```



▼参考サイト
https://weblabo.oscasierra.net/mysql-57-init-setup/
micro:bitの直刺しサーボ3台の制限をハックして、直刺しサーボ6台の2足歩行ロボットを作ってみた

#■ハックに走った動機
micro:bitに***直接繋げられるサーボの台数は、どうやら3台まで***らしい。16台まで繋げられる拡張ボードなんかも市販されてはいるが、micro:bitのコンパクトさを生かすためにもなるべく***拡張ボードは使わず、すっきりとスマートに接続したい***。そこで、***3台の制限をハックして、6台まで直接繋げる方法***をあみ出したので紹介する。

#■まずは6台直接繋げて作った2足歩行ロボットの動画を見てほしい
・足2軸のロボット
・サーボは右脚/左脚/右足首/左足首/右腕/左腕の6台
https://youtu.be/G0M1QShnloM

関連記事で、ロボット筐体の作り方はこちらで紹介しています。
https://qiita.com/Google_Homer/items/bf269828fbdf3ce83a8e

#■6台直刺の構成
***ロボット本体***
![microbit 6台写真-1.png](https://qiita-image-store.s3.amazonaws.com/0/234533/0aab0ca0-9d99-49cf-7046-f398164c8a9f.png)
***配線は、電子部品なしで単にピンヘッダを経由して接続しているだけ***
![WIN_20190228_18_30_50_Pro.jpg](https://qiita-image-store.s3.amazonaws.com/0/234533/78e2e021-8f6d-6560-8a16-25a6b9d42359.jpeg)

***詳しい配線図・・・・なんとなくからくりが見えてくる・・・・***
![microbit サーボ6台配線図.png](https://qiita-image-store.s3.amazonaws.com/0/234533/42a52307-4cba-038e-c923-4c6e1baa4443.png)
***参考までに歩行のブロックプログラム***
![プログラム.png](https://qiita-image-store.s3.amazonaws.com/0/234533/67c6426e-5ea7-81e6-f7fa-78b32e318ebf.png)

#■はい、6台のサーボ直刺しのからくりは、たこ足配線です
サーボの電源を外部供給し、***同一のサーボ信号のSignalを複数のサーボに送る***事で実現しています。

#■なぜたこ足で同じ角度なのに、ロボットは歩けているのか
**たまたま自分の作ったロボットの複数個所のサーボが同じ角度で動作するロジックになっていたので可能***だっただけの話。
P2のサーボーのSignal端子を右腕/左腕/右脚/左脚のサーボにたこ足で接続している。
右脚と左脚が常に同じ角度で動作するという歩行ロジックに依存している。
同様に両脚と左右の腕も同じ角度で動作している。
本来は脚の歩幅と腕の振り幅は別々であるが、同じ幅で妥協している。
また、動画をよくみると脚と腕が同じ方向に動いているが、それもたこ足なので妥協。

まあ、こんな感じで***特別な条件下でしか使えないハック技***なのである。

今回6台まで試したが、電源の容量が持つ限りもっと行けると踏んでいる。

#■結論
こんな記事を書いておいて、こういうのもなんであるが、あまりお勧めはできない。なぜなら、拡張ボードなしでスマートに接続したいというのが発端だったわけであるが、電気的には確かに直刺しになっているが、物理的にはサーボ端子がmicro:bitに直接刺さらないのでピンヘッダを介したり、micro:bit本体のとは別にサーボ用の電源が必要だったりと、あまりスマートではない絵面になってしまったからである。
ということで
#利用したいサーボの台数にかかわらず、最初からサーボの拡張ボードを利用した方がよっぽどスマートであるという結論に達した。とはいうものの、何かの参考にはなるかもしれないと思い投稿した。

こなか感じでスッキリと。***拡張ボード実装の図***。
![WIN_20190228_23_20_15_Pro.jpg](https://qiita-image-store.s3.amazonaws.com/0/234533/9196a334-3d64-508b-9057-6c06de1bd606.jpeg)
マークアップエンジニアの私が業務で使っているMacのソフト・設定など

私が業務で使用しているPCはMacになります。
そのMacにインストールしているソフトや各種設定を備忘録としてこの記事に残します。
※随時アップデート予定。

## ソフト
- Adobe CC
    - Photoshop
    - Illustrator
    - XD
    - Bridge
    - Acrobat
    - Dreamweaver
- Microsoft Office 365
    - Word
    - Excel
    - PowerPoint
- Virtual Box
    - 下記サイトから必要なOSをダウンロードする
        - https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/
- Slack・Chatworkといったチャットアプリ
  - [Station](https://getstation.com/)でまとめていましたが、Stationを入れてからPCが重くなった気がします…
- LINE
  - LINEが来るたびにスマホに目をやるのが面倒なので…
- SourceTree
  - Gitは基本ターミナルでやりますが、あると時々便利なので。
  - 差分抽出はこちらを参考にしました。[SourceTreeの使い方 | コミット間の差分ファイルの抽出 (カスタム操作を使う方法) - ICS MEDIA](https://ics.media/entry/4475)
- Thunderbird
  - これと同じくらいの機能があって便利なメーラーを知らないので、もしあれば教えてほしいです。便利だけと重たい…
- FileZilla
  - 無料のFTPソフトはこれが一番使いやすいかなぁ…
- Xcode
  - アプリ開発はしませんが、端末検証の際にエミュレーターを使用。
- Android Studio
  - こちらもアプリ開発はしませんが、端末検証用に。
  - 本当はRemote TestKitにしたい。
- MAMP
  - 時代遅れかもしれませんが、時々WordPressを弄ったりするレベルの私には十分です。
- URLcollector
  - 本番環境からファイルをダウンロードしたい時に大活躍。
- CompareMerge
  - WindowsでいうWinMerge。WinMergeレベルの性能はありませんがこれがないと仕事になりません。
- Spectacle
  - ウィンドウを右半分いっぱい・左半分・上半分・下半分いっぱいといったようにショートカットで配置できるアプリ。最近あまり使用していないのでなくても良いかも。
- CleanArchiver
  - ファイル圧縮ツール。パスワードもかけられる。
- Google日本語入力
  - かゆいところに手が届くので、Mac標準よりも好きです。
- AppCleaner
  - アプリ削除アプリ。
- ImageOptim
  - 画像軽量化ツール。他にももっと圧縮かけられるソフトはありますが、圧縮かけすぎでジャギジャギにならないレベルで留めて置いてくれるのでまずはこれにかけます。
- Charles
  - 本番環境でテストしたいけどFTP権限が無い時に、これでローカルのファイルと置き換えたりします。
- Scroll Reverser
  - マウスとトラックパッドのスクロール方向を個別に指定できるアプリ。
- Visual Studio Code
  - メインのエディタ。
  - 設定は[どこでも同じ設定でVisualStudioCodeを使う方法 - Qiita](https://qiita.com/canpok1/items/a7c4c96e3c1c2a1cc532)で紹介されていたやり方で復元するのが良さそうです。
  - 拡張機能の復元は[Visual Studio Code のExtension(拡張)を管理する | tyablog.net](https://tyablog.net/2017/03/07/visual-studio-code-extensions/)を参考にしています。
  - [Settings Sync](https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync)を使用する方法もあるとか。
- Boostnote
  - マークダウンが使えるメモアプリ。
- Tw
  - [Tw](http://shokai.github.io/tw/)はターミナルで使うTwitterクライアントです。ちょっと発言したいけどツイッター開くほどでもない・ちらっとタイムライン見たい時に便利。
- Clipy
  - ターミナルコマンドやよく使う文章などを保存しています。
- Node.js
- Browser-sync
    - Gulpを導入していない案件では `browser-sync start --server --files "**/*" --open "external"` で起動しています。


## ブラウザ
- Google Chrome
  - 拡張機能の場所はこちらを参考にしました。[Google Chrome 拡張機能のフォルダ | ルート40](https://route40.me/google-chrome-extension/)
- Firefox
- Google Chrome Canary


### あんまり使っていなけど便利そうなソフトメモ
- Advanced REST client
  - GET・POSTリクエストの検証ツール？Chromeにも似たような拡張機能があった気がする。
- mi
  - ちょっとした文章を書くのに使ってましたが、正直なくても良いレベル。
- TextWrangler
  - あってもなくても良いですが、ディレクトリを放り込むとツリーを作成してくれるのが時々便利です。
- JPEGmini
  - JPEG画像軽量化アプリ。
- Microsoft Remote Desktop
  - MacでWindowsをリモート操作する時に使ってました。


## 今後追加したいソフト
- パワーマッパー
https://www.powermapper.com/products/mapper/
サイトのディレクトリマップを自動生成するソフト。
1ライセンス1万5千円くらい。

- Integrity Plus
こちらもディクトリマップを自動生成するのに良さそうです。
参考： https://aco-tokyo.com/journal/tips/30/
メモ > Vue フォーム とバリデーション（途中です）



Vueで、フォームを作成したのでメモ（途中です）


動作デモ
[sugasaki vue form test](https://sugasaki.github.io/vue-mailform-test/)

ソース
[sugasaki/vue-mailform-test: vue mail form test](https://github.com/sugasaki/vue-mailform-test)


##

- vue
- vuex
- vue-router
- axios
- sanitaize-html
- vuetify
- element-ui




cccccccc

* namespaced: true,
sotreはネームスペースでモジュール分け
* 値はgettersで取得
* 値のSETはactionsからmutationsをCALL

例

```js:store.js
import Vue from "vue";
import Vuex from "vuex";

Vue.use(Vuex);

//カウンターのモジュール
const counterModule = {
  namespaced: true,
  state: { count: 0 },
  mutations: {
    increment(state) {
      state.count++;
    },
    increment2(state, addCount) {
      state.count += addCount;
    },
    decrement(state) {
      state.count--;
    }
  },
  actions: {
    increment(context) {
      context.commit("increment");
    },
    decrement(context) {
      context.commit("decrement");
    },
    increment2(context, data) {
      //console.log("increment2", data);
      context.commit("increment2", data);
    }
  }
};
```

* ActionをCALLするときは、以下のような感じ
 this.$store.dispatch("counter/increment2", 2);


# router

```js:router.js
import Vue from "vue";
import Router from "vue-router";
import Home from "./views/Home.vue";

Vue.use(Router);

export default new Router({
  mode: "history",
  base: process.env.BASE_URL,
  scrollBehavior() {
    return { x: 0, y: 0 };
  },
  routes: [
    {
      path: "/",
      name: "home",
      component: Home
    },
    {
      path: "/counter",
      name: "counter",
      component: () =>
        import(/* webpackChunkName: "counter" */ "./views/Counter.vue")
    }
  ]
});

```

画面遷移した時に、スクロール位置を最上部にしたければ以下を付ける
```js
  scrollBehavior() {
    return { x: 0, y: 0 };
  },
```
  
  
  
# view

  ```js:counter.vue
  <template>
  <div class="about">
    <h1>This is an counter page</h1>

    <el-button type="primary" v-on:click="increment">+</el-button>
    <el-button type="danger" v-on:click="decrement">-</el-button>
    <el-button type="primary" v-on:click="increment_add">+2</el-button>
    <el-button type="primary" v-on:click="increment2(2)">+2</el-button>

    <h2>{{ count }}</h2>
  </div>
</template>

<script>
import { mapActions } from "vuex";

export default {
  name: "about",
  components: {},
  computed: {
    count() {
      return this.$store.state.counter.count;
    }
  },
  methods: {
    ...mapActions("counter", [
      "increment", // -> this.increment()
      "increment2", // -> this.increment2()
      "decrement" // -> this.decrement()
    ]),
    increment_add: function() {
      this.$store.dispatch("counter/increment2", 2);
      //console.log(this.$store.state.counter);
    }
  }
};
</script>
```
[MailhogとLaravel]Expected response code 220 but got code "500"のエラー解決方法

# Expected response code 220 but got code "500"
上記のようなエラーが発生する場合の解決方法

## 環境
* docker
* laravel
* mailhog
* 開発環境（ENV=development)

## 問題点：確実に環境変数
* 500エラーが帰ってきているのでメールサーバにはアクセスできている
* 環境変数自体がおかしいか、読み込めていない

## 実際に通る.env
`MAIL_USERNAME`と`MAIL_PASSWORD`、`MAIL_ENCRYPTION`はNULLを設定しておきましょう。

```.env
MAIL_DRIVER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
```

## 解決方法
上記の環境変数さえ読み込めれば、実行はできる。
もしこれを設定してできない場合は環境変数がうまく読み込めていない。
以下の手順で確認してください。

### 0.環境変数が読み込めているか確認するコマンド
```php
\Config::get('mail')
```
上記コマンドを実行して、意図した環境変数になっているか確認。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/69647/14f3c22b-f710-ba72-44a9-6adf893d9aab.png)

なっていない場合は以下の手順を試すべし

### 1.キャッシュクリア
```bash:bash
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear
```

### 2.環境変数ロード
```bash:bash
. .env
# もしくは環境変数を環境ごとに分けてる場合は読み込みたいファイルを指定
. .env.development
```

### 3.環境変数直接設定する
```bash:bash
MAIL_DRIVER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
```

### 4.最終手段、mail.phpを書き換える
環境変数を実際に読み込んでいるのは`config/mail.php`というファイルだ。
ここの環境変数を読み込む部分を削除し、直接値を書き込んでしまえば良い。

```bash:bash
'encryption' => env('MAIL_ENCRYPTION', 'ssl'),

# こうなっているのをこうじゃ！

'encryption' => env(''),
```
【Rails】renderでインスタンス配列を繰り返し処理したい【部分テンプレート】


もうeachをビューで使うなんて　言わないよ絶対。

renderでインスタンス配列だけを渡してクールにキメたい。

<br />

```ruby:views/xxxs/xxx.html.erb
<%= render @users %>
```

この場合、`views/users/_user.html.erb`の部分テンプレートを呼び出す
インスタンス配列`@users`の中身が無くなるまで、繰り返し処理される
部分テンプレートファイルの`_user.html.erb`ファイル内では、変数`user`を扱えるようになる
テンプレートファイル名は**単数形**であることに注意

```ruby:views/users/_user.html.erb
<%= user.name %>

#例として、nameカラムがある場合
#部分テンプレート内で使う変数名が単数形になっていることに注意
```
<br />
続いて、アソシエーションを組んでいる場合

```ruby:views/xxxs/xxx.html.erb
<%= render @user.books %>
```

この場合、Bookクラスのインスタンスとして扱われるので上記と差はあまりなかったりします。
`views/books/_book.html.erb`の部分テンプレートを呼び出す
インスタンス配列`@user.books`の中身が無くなるまで、繰り返し処理される
部分テンプレートファイルの`_book.html.erb`ファイル内では、変数`book`を扱えるようになる
テンプレートファイル名は**単数形**であることに注意

```ruby:views/books/_book.html.erb
<%= book.title %>
#例として、titleカラムがある場合
#部分テンプレート内で使う変数名が単数形になっていることに注意
```

<br />

以上です！ご指摘等ありましたらコメント欄にお願いします！

<br />
Arch LinuxのFcitx+Mozcで日本語入力できない問題の解決法

## かなり既出だと思うけど。。。
なんだかんだ結構苦労したので、記録しておきます。
ChromiumやLibreOfficeなどのGtkアプリケーション上で日本語入力ができませんでしたが、設定を１行追加するだけで解決しました。

## 日本語入力ができなかった環境
- Arch Linux
- Fcitx+Mozc

参考までに、pacmanのコマンドを書いておきます。

```
sudo pacman -S fcitx-im fcitx-configtool fcitx-mozc
```

fcitx-gtk* とか fcitx-qt* は勝手に入るからいらない（と思う）。

ディストリビューションは関係ないかも。

## 日本語入力ができなかったアプリケーション
- Chromium
- LibreOffice

主にGtkアプリケーション。

## 解決法
~/.config/locale.conf に以下の内容を書き込んで再ログインするだけ。

```
LC_CTYPE=ja_JP.UTF-8
```

/etc/locale.conf に書くとシステム全体の変更が可能らしいけど、書き込みに管理者権限が必要だから嫌。

## まとめ
簡単に日本語入力ができた。
GraphQLメモ



GraphQLはクエリ言語（データに対するクエリ言語の仕様）


# GraphQL

2016年12月24日
[GraphQL入門 - 使いたくなるGraphQL - Qiita](https://qiita.com/bananaumai/items/3eb77a67102f53e8a1ad)

[アプリ開発の流れを変える「GraphQL」はRESTとどう違うのか比較してみた - WPJ](https://www.webprofessional.jp/rest-2-0-graphql/)


# Client

## Apollo

### @seya

2018年06月04日
- [世のフロントエンドエンジニアにApollo Clientを布教したい - Qiita](https://qiita.com/seya/items/26c8a0dc549a10efcdf8)
- [Apollo Client + React 入門 - Qiita](https://qiita.com/seya/items/e1d8e77352239c4c4897)


### @teradonburi

[Apolloでの綺麗なAPI実装（GraphQL）を試す - Qiita](https://qiita.com/teradonburi/items/2ad98c7c21f1f6cc4390)



# Server Side

## C#

[ASP.NET Core で GraphQL API の Mutation を実装する - present](https://tnakamura.hatenablog.com/entry/2018/12/14/graphql-mutation)

[C#（ASP.NET Core）で GraphQL API を提供する - miso_soup3 Blog](http://miso-soup3.hateblo.jp/entry/2017/11/30/162445)
メモ > Leaflet > Vue > Vue2Leaflet




[vue2-leaflet - Vue2 leaflet library](https://korigan.github.io/Vue2Leaflet/#/)



```shell

yarn add leaflet
yarn add vue2-leaflet


```


yarn add vue-style-loader
yarn add css-loader
yarn add sass-loader


@import "../node_modules/leaflet/dist/leaflet.css";
メモ > vue > error: Parsing error: Unexpected token





```js: .eslintrc.json
{
    "parser": "babel-eslint",
    // 以下、設定が続く…
}
```


[ESLintで Parsing error: Unexpected token = となる場合の対処法 - Qiita](https://qiita.com/kurkuru/items/d4eebd34f0898c6a2d5a)


```
error: Parsing error: Unexpected token < at

> 1 | <template>
    | ^
  2 |   <div class="hello">
```


```
npm install --save-dev eslint eslint-plugin-vue
```
Adversarial Validationについてメモ

## 概要

Adversarial Validationとは、学習データとテストデータが大きく異なる場合、
学習データをそのまま使ってもいい検証結果が得られないから、
テストデータに似た学習データを作ろうという手法みたいです。

## 元ネタ

http://fastml.com/adversarial-validation-part-one/
http://fastml.com/adversarial-validation-part-two/

## 手順

取り込んだ学習データとテストデータが判別できるラベルを追加します。

``` python
train = pd.DataFrame({'A': [1,2,3,4,5,6,7,8,9,10]})
test = pd.DataFrame({'A': [100,200,300,400,3,1,200]})

train['TARGET'] = 1
test['TARGET'] = 0
```

学習データとテストデータをくっつけます。

``` python
data = pd.concat(( train, test ))

x = data.drop( [ 'TARGET' ], axis = 1 )
y = data.TARGET
```

データを分割します。

``` python
from sklearn.model_selection import train_test_split

num_train = 5
x_train, x_test, y_train, y_test = train_test_split( x, y, train_size = num_train )
```

作成した、テストデータと検証データで、分類モデルを作成、評価します。

``` python

from sklearn.ensemble import RandomForestClassifier

clf = RandomForestClassifier(random_state=0)
clf = clf.fit(x_train, y_train)

yy = clf.predict(x_train)
```


テストデータに似ているスコアでソートします

``` python
y_sorted = np.sort(yy, axis=0)
plt.plot(y_sorted)
```
![スクリーンショット 2019-02-28 21.01.48.png](https://qiita-image-store.s3.amazonaws.com/0/15074/3116995a-40d0-730c-e8c0-53455ee36926.png)

``` python
x_sorted = np.sort(x_train, axis=0)
plt.plot(x_sorted)
```
![スクリーンショット 2019-02-28 21.15.04.png](https://qiita-image-store.s3.amazonaws.com/0/15074/0b6797e4-2585-7823-2c8a-acca77125b51.png)

ソートしたデータから60%を学習データとして使用します。

``` python
sixty = int(num_train * .6)
sixty = num_train - sixty
thresh = x_sorted[sixty, 0] #このグラフだと200とかになりました
# threshより大きい値を学習データにする
```

以上、Adversarial Validationの考え方のメモです。

分類モデルはCNNや、他のアルゴリズムでも問題ないです。

KaggleでPublic LBとLocalCVの結果が大幅に違う場合、試してみる価値ありかと。

めっちゃわかりやすい記事ありました！
https://blog.amedama.jp/entry/adversarial-validation
機械学習論文読みメモ_161

[On Large-Batch Training for Deep Learning: Generalization Gap and Sharp Minima](https://arxiv.org/abs/1609.04836)
SGDで最適化を行う際、小さなバッチを用いた学習が行われるが、
このバッチサイズを大きくした場合に、SGDによる汎化性能向上効果が低減する
事が実用上分かっている。
本論ではその原因を探り、大きなバッチサイズを利用するとよりsharpな極値へ収束
しやすくなることを数値的に示した。
そして経験的にsharpな極値におけるモデルは低い汎化性能になる事が知られている。
一方で小さなバッチサイズを用いた場合には、一貫して平坦な極値へ収束し、
これは小さなバッチサイズを用いた事によるノイズ混入が原因である事がわかった。

[Pooling is neither necessary nor sufficienc for appropriate deformation stability in CNNs](https://arxiv.org/abs/1804.04438)
CNNに関する仮定の一つに、CNNは入力の小さなtranslationやdeformationに関して頑健であることが
画像認識タスクを解くに当たって重要である、という事がある。
その頑健性はCNNにpooling layerを入れ込む事で実現されてきた。
しかし最近の研究においてpooling layerの利用はされなくなってきた。
これは先程の仮定に疑問を差し込む。
本論では改めてこの仮定を検討した。
結論として以下の知見が得られた。
１．Deformation invarianceは各層毎に異なったレベルで要求される。
２．Deformation invarianceは学習を通して適応的に学習される。
３．pooling layerはそうした必要なレベルのinvarianceを獲得するにあたって不要か、不十分である。
４．学習初期において、pooling layerが導入するinvariance性、学習へ悪影響を与える。結果として学習プロセスにおいてpooling layerを影響をキャンセルさせるような学習がなされる。

[Fast and Furious: Real Time End-to-End 3D Detection, Tracking and Motion Forecasting with a Single Convolutional Net](https://eng.uber.com/research/fast-and-furious-real-time-end-to-end-3d-detection-tracking-and-motion-forecasting-with-a-single-convolutional-net/)
3D detection, tracking, motion forecastingを同時に行う事が可能な単一のCNNモデルを提案する。
複数のタスクに関して理由付けを行う構造により、この総体的な手法はocclusionや遠距離の
スパースデータに対しても頑健性を持つ。
提案手法はLidarなどの3D sensorデータを入力とし、鳥瞰視点のデータとして時空間方向に３D convolutionsを適用する。
モデルは時間方向の情報を前段・後段どちらの層でfusionするかの違いで２つの構造を提案する。
これら２つの構造は精度と効率性の関係においてトレードオフ関係がある。
k3s動かしてみた (1台構成)

VirtualBox上のubuntu 18.10 (x86_64)にて実施。

## ダウンロード

* https://github.com/rancher/k3s/releases

![スクリーンショット_2019-03-01_10-42-18.png](https://qiita-image-store.s3.amazonaws.com/0/25728/80714ae8-9e5c-4e76-ef5f-b18516e26ae5.png)

## server起動

```sh
# 実行権限
chmod +x k3s

# server起動
sudo ./k3s server

# node一覧確認 (Readyであること)
sudo ./k3s kubectl get node

# nodeを追加したい場合、以下のtokenを使うらしい
sudo cat /var/lib/rancher/k3s/server/node-token

# nodeをtoken指定で追加する場合。IPとtoken値を適宜修正。
sudo ./k3s agent --server https://192.168.9.9:6443 \
 --token "K10d2c5c59d6eece74ffad3f5a3bd8ec034b2608cdfcf07ec88312978ba252c1892::node:2cb458aa6092629dbcbff65e53440dab"
```

* `./k3s server`を停止すると`./k3s kubectl`を受け付けなくなるので注意。



## pods作成

```yaml:pod-nginx.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
    - name: nginx-container
      image: nginx
      ports:
      - containerPort: 80
```

```sh:
# pod起動
sudo ./k3s kubectl create -f pod-nginx.yaml

# pod一覧確認
sudo ./k3s kubectl get pod
```

```:status(Runningであること)
NAME        READY   STATUS    RESTARTS   AGE
nginx-pod   1/1     Running   0          7m54s
```

## 画面確認

```sh:ポートフォワード
# port8080 に nginxコンテナのport80を割り当て
sudo ./k3s kubectl port-forward nginx-pod 8080:80
```

* http://localhost:8080 にアクセスしてnginxの画面が表示されることを確認。

![localhost.png](https://qiita-image-store.s3.amazonaws.com/0/25728/83a40793-7d4f-d527-9d13-3e71ed44caec.png)


## 後片付け

```sh:podsの削除
sudo ./k3s kubectl delete pods --all
```

* `containerd-shim`プロセスが残る。これの止めかたがわからなかったので以下のようにした。

```sh
sudo killall containerd-shim
```
An error occurred while installing pg (0.20.0), and Bundler cannot continue.の対処

Rails チュートリアル 1.5.1 あたりで PostgreSQL を追加し bundle install するところで表題のエラーが出ました。

`sudo yum install postgresql-devel`

を実行すると直ったので、同じ悩みがある人はやってみるといいかもしれません。

ちなみに、 Cloud9 での開発です。
ノスタルジアpc-9801 その8

#概要

整理していたら、フロッピーディスクが出てきた。
せっかくなので、エミュで動かしてみた。

#環境

- windows vista
- t98-next
- disk explorer

#dbaseⅡで、データ出力して、N88BASICで読み込む。

##dbaseⅡで、データ出力

![cc.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/d5984c5b-a951-3db8-ed8b-a1c6087001a6.jpeg)

##N88BASICで読み込む

![cf.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/e1777f39-420e-ad9e-0358-6a428fc13e0e.jpeg)




以上。
機械学習で1週間浪費した男が作る3カ条

## 機械学習3箇条

- ゴールからやれ
- 認知バイアスを認識しろ
- オッカムの剃刀

対象読者: 手法の研究ではなく、機械学習で特定の問題をときたい人

## ゴールからやれ

プライオリティ
ポリシー > データとドメイン知識 > 検証 > 学習

ポリシーが決まると、データとドメイン知識が決まる。
データとドメイン知識が決まると、検証が決まる。
検証が決まると、学習が決まる。

学習を始める前に、絶対に抜け道の無い検証を作れ。 <- マジで
いろいろ試行錯誤してチューニングしてそこそこ良いのができたと思ったら、
検証が間違えていたことがわかり、全てが無に帰すことが何度もある。

検証を作る前に、データの質を疑え。
データの質が悪いならデータを用意する方法を考えろ。
さんざんやってデータの質が悪いという結論に至ると検証以下が無に帰す。 <- 俺なう

データを用意する前に、ポリシーを決めろ。
例えば、データの質を判断するポリシー。
データを全て目視してOKなら良いのか？
サンプリングしてOKなら良いのか？
データがちゃんとした方法で作られていればよいのか？

どこまでドメイン知識を入れるかのポリシー。
ポリシーが決まらないと、データとドメイン知識を確定できない。
ボトムアップでやると探索範囲が広すぎて時間を浪費する。

一般化すると、手戻りをなくすためにゴールからやれ。

## 認知バイアスを認識しろ

わかりやすいもの(事実ではないもの)に注目する。
良い結果(事実ではないもの)に注目する。

これでなんども痛い目を見た。

成果を求めてコンプライアンス違反をする会社のように、
良い結果を得るために検証方法を間違えたりする。
人間はかなり優秀な探索アルゴリズム。

## オッカムの剃刀

いろいろやっていると、
僕の考えた最強の手法を編み出したくなる。
でも、オリジナルな方法は既存手法に比べて仮定が多すぎる。

ぼくの取り組んでいる問題は、
新しい手法を使わないと解けない問題なんだ。
すごいんだ。

と考えたくなる気持ちも分かるが、
Pandasでデータを操る。ある列に特定の文字(文字列)を含んだ行を削除編

タイトルの通り、「ある列に特定の文字(文字列)が含まれている場合、それを行ごと削除したい」という願いを叶えるPythonスクリプトをご紹介します。

## Pythonスクリプト

```python:nonG.py

'''
    nonG.py
    purpose: delete G row in ALT column
'''

import os
import pandas as pd
import argparse
import sys


def main():

    # make parser
    parser = argparse.ArgumentParser()

    # add argument
    parser.add_argument('input')
    parser.add_argument('output')

    # analize arguments
    args = parser.parse_args()

    # set input filename and the number of vcf header
    inputfile = args.input
    print(inputfile)

    # if inputfile does not exist, print error message and program done
    if os.path.exists(inputfile) == False:
        print(inputfile+' does not exist. Please check file name.')
        sys.exit(1)

    # set output filename
    outputfile = args.output

    # if outputfile already exists, print error message and program done
    if os.path.exists(outputfile) == True:
        print(outputfile+' already exists. Please delete or rename.')
        sys.exit(1)

    # input tsv
    data = pd.read_csv(inputfile, delimiter='\t')

    # delete row contains G in ALT column
    data = data[~data['ALT'].str.contains('G')]

    # output data to outputfile
    data.to_csv(outputfile, index=False, mode='a', sep='\t')


if __name__ == '__main__':

    main()

```

テストデータには以下のようなinput.tsvファイルを用います。

![スクリーンショット 2019-03-01 10.24.48.png](https://qiita-image-store.s3.amazonaws.com/0/335400/976340d1-ba0d-a485-2e2b-d20790d418bd.png)


このスクリプトを実行するにはターミナルで以下のようにタイプしてください。

```
$ python nonG.py input.tsv output.tsv
```

結果がoutput.tsvとして出力されます。

## スクリプト詳細

最初の方はinput.tsvを読み込む作業をしているので無視して、本題のデータ操作を説明したいと思います。

```python:
 # delete row contains G in ALT column
data = data[~data['ALT'].str.contains('G')]
```

このたった1行で「'ALT'列にある、'G'を含む行を削除」しています。

```python:
data['ALT'].str.contains('G')
```

でdataの中の'ALT'列の中で、文字(文字列)'G'を含むものを抽出しています。そこに否定を意味する演算子 ~ をつけ、

```python:
~data['ALT'].str.contains('G')
```

とすることで、文字(文字列)'G'を含まないものを抽出することができます。このようにすることで、特定の文字を含む行を削除したデータテーブルを簡単に作成することができます。結果は以下のようになります。

![スクリーンショット 2019-03-01 10.26.41.png](https://qiita-image-store.s3.amazonaws.com/0/335400/626020f4-c36b-bf67-cb25-e4823cd549d4.png)

'ALT'列から文字(文字列)'G'を含む行が削除されていることがわかります。
WSL admin

※超初心者が書いた自分への備忘録です。  


- 最初のログイン時に聞かれるユーザー名を **root** にする。  
- 再起動して  

```bash
groupdel admin
useradd -m -u 1000 -s /bin/bash admin
usermod -g root admin
usermod -g sudo admin
chown admin:admin /home/admin
passwd admin
```
- ubuntu 閉じる
- DOS で

```bat
C:\Users\admin\AppData\Local\Microsoft\WindowsApps\ubuntu1804.exe config --default-user admin
```
-  

```bash
cd /home
sudo mv admin admin2
sudo ln -s /mnt/c/Users/admin/OneDrive/home_wsl /home/admin
cp admin2/.b* admin2/.p* admin
sudo rm -rf /home/admin2
cd ~
PATH=/home/admin/bin:${PATH}
echo "source /home/.my/bash_wsl.sh" >> .bashrc
. ./.bashrc
```
-  

```bash
sudo apu-get update
sudo apt-get dist-upgrade -y
sudo apt-get install -y build-essential exfat-fuse lsof tree git rng-tools rename
sudo apt-get autoremove -y
sudo apt-get autoclean -y
```
- openssl 1.1.1a

```bash
mkdir /home/admin/tmp
cd /home/admin/tmp
wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz
tar -zxf openssl-1.1.1a.tar.gz && cd openssl-1.1.1a
sudo ./config -Wl,--enable-new-dtags,-rpath,'$(LIBRPATH)'
sudo make
sudo make install
sudo rm /usr/bin/openssl
sudo ln -s /usr/local/bin/openssl /usr/bin/openssl
sudo ldconfig
openssl version
cd /home/admin
rm -rf /home/admin/tmp
```
C++ Builder XE4 > TeeChart > 折れ線グラフ > 時系列データの欠損期間の線を切断する

```txt:動作環境
C++ builder XE4
    TeeChart Lite v2013.08.130414
```

### 処理概要

- 時系列のデータがある
- データの欠損期間がある
- 折れ線グラフにする時に欠損期間の線を切断する

### 実装 (関数のみ)

```cpp
void __fastcall CUtilGraph_backupSeries::cutLine_dataMissingPeriod(TDateTime addDt, double yval, int updateIntvl_sec, TFastLineSeries *dstPtr)
{
	if (dstPtr == NULL) {
		return;
	}

	if (dstPtr->XValues->Count == 0) {
		// Count==0でXValues->Last()をコールするとメモリエラー「
		// 「モジュール 'Tee9180.bpl'のアドレスXXXXでアドレスYYYYに対する読み取り違反がおきました。」
		// になるため
		return;
	}

	TDateTime preDt = dstPtr->XValues->Last();

	int secBetwn = SecondsBetween(addDt, preDt);

	if (secBetwn > (updateIntvl_sec * 1.5)) { // 1.5: インターバル秒で判断したとき、1秒のずれで失敗するため1.5倍と基準とする
		dstPtr->AddNullXY(addDt, yval); // 線をつなげないための処理
	}
}
```

欠損期間の判断となる[updateIntvl_sec]を指定して使う。


### 使用方法

TFastLineSeries に対してAddXY()を実行する前にcutLine_dataMissingPeriod()をコールする。


### 関連

- [c++ builder XE4, 10.2 Tokyo > TeeChart > 折れ線グラフにてデータがないところの線を切る (+ データ欠損処理)](https://qiita.com/7of9/items/8e112537905dc59d8caf)
プログラマが展示会場で質問するときの５つの方法。仮説（126）

コンピュータを内蔵し、ソフトウェアが動いている機器はたくさんある。

家庭用電化製品（洗濯機、掃除機、冷蔵庫、炊飯器、電子レンジ、電気温水器、ガス湯沸か器、テレビ、ステレオ）、ゲーム機、携帯電話、自動車、バイク、

いろいろな展示会に行った時に、その機器のプログラムについて教えてもらおうと思った時に取る行動を5つ例示する。

# 1. 初心者
その機器をあまり触ったことがなかったり、特定のメーカの機器を触ったことがない場合は、計算機、プログラムの初心者として質問する。

「どうやれば動きますか」
「止まらなくなった時はどうすればいいですか」

自分のありとあらゆる知識と経験は忘れ去って、３歳児の「どうして」「どうして」で問い続ける。

自分が思ってもみなかった事を教えてもらえることがある。

### 基本機能についての冊子、URL
「自動車とは」「冷蔵庫の機能」など、その製品の基本機能についてよく整理されている資料を教えてもらえることがある。
### わかりやすい初心者への説明の仕方
「電気炊飯器だと火を切らなくても自動で切れるから人がそばにいなくてもいい。」
当たり前のような事でも、普段意識していないことを、専門にやっている方は、丁寧におしえてくださる。

### 何を勉強するといいか
その製品を仕事で扱おうと思った時に、何から勉強するといいかを教えてくださることがある。
「電気の勉強をしましょう。」「電磁気の勉強は学校でしかやる時間とれませんよ。」「ゲームが作れるようになれば制御もできますよ」

# 2. 説明する方と同じ目線
説明される方が、営業であるか、管理者であるか、設計者であるかをそれとなく聞いたり、相手の名札などを見たり、相手が他の人に説明しているのを聞いて、その人の目線でわかりそうなことを質問する。

自分が答えられることを聞かれると、喜んで説明してもらえる。

設計者以外の場合だったら、最後の最後に、技術的なことをちょろっときくと、「ちょうど今、設計者がきてるから答えさせます」って設計者の人を紹介してくださる。

# 3.他社との比較
「A社だと機能を減らしてもっと安くしてるけど、そういうものはないんですか」「海外製品だと構造はもっと簡単なのに、なんでこんなに複雑にしているんですか」

# 4. 法令、規格視点
「この製品の安全に関する法規は何ていうものですか」「この製品はどういう規格にもとづいていますか」という知らない人の聞き方をする。

資料の中に、法律、規格について言及していれば、最初から、
「電波法のX条X項に関する取り扱い規則のX項にどう適合してるかの試験記録は見せてもらえるんですか」とか、より具体的に聞く。

# 5.設計者視点
相手が技術的なことに答えてくれそうな時、あるいは設計者と対応を代わってもらった時。
「自分が設計するときは、なるべく電圧を下げるように設計しているけど、なんでこの製品は5V使っているんですか？」「これくらいの規模だとアセンブラで組んでいるものが多いけど、どういう言語で開発されているんですか？」

名刺を渡して、競合他社の仕事をしていないことがわかると、いろいろおしえてくださることがある。

# まとめ
相手の名札などを見たり、相手が他の人に説明しているのを聞いて、どの立場の人かわかった時には、まず相手目線で質問を始める。わからないときは、初心者として聞き始める。

ちゃんとした説明をしてくださる方なら、どんどん相手がはなしたいことを話してもらう。最後に、一つだけ技術的な質問する。設計者を紹介してもらえると嬉しい。

基本の筋書きかも。

ちゃんとした応答をしてもらえなかったり、設計者を紹介してもらえなかったら、翌日、違う人がいるときに訪れることもある。

p.s.
ここに書いた方法で紹介していただいたのは、
海外ではWaltnut Creek CD-ROMのLinuxのslackwareの開発チーム、
Borlandの社長など。日本ではSonyの携帯端末の開発者、
田中貴金属の技術部長など、技術者だけでなく、責任者を紹介してもらうこともしばしば。こちらから会いに行ったら断られる相手も、間に人が入るとこんなに簡単に会えるという、、、。
 # 文書履歴(document history)
ver. 0.01 初稿 20190301 午前８時
ver. 0.02 まとめ　追記 20190301 午前９時
ver. 0.03 はてなブックマーク 20190301 午前１０時
ver. 0.04 3と4順番入れ替え 20190301 午前１１時
ver. 0.05 p.s. 追記 20190301 夜
ver. 0.06 標題追記 20190821
### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
<a href="http://b.hatena.ne.jp/entry/s/qiita.com/kaizen_nagoya/items/f8a852241bd6e46fb52a" class="hatena-bookmark-button" data-hatena-bookmark-layout="basic-label-counter" data-hatena-bookmark-lang="ja" title="このエントリーをはてなブックマークに追加"><img src="https://b.st-hatena.com/images/v4/public/entry-button/button-only@2x.png" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script> 
http://b.hatena.ne.jp/guide/bbutton
Windows Serverでcmdからユーザ追加

# Windowsサーバでのユーザ追加
個人の忘備録です。
サーバにユーザを一括で追加する必要があったので、
パーツとしてのメモになります。

下記、test_～は必要に応じて書き換え。

## 情報確認
```
net user test_user1
```

上記コマンドの入力結果例

```
ユーザー名                           test_user1
フル ネーム                          テストユーザ
コメント                             コメント
ユーザーのコメント
国/地域番号                          000 (システム既定)
アカウント有効                       Yes
アカウントの期限                     2020/04/01 0:00:00

最終パスワード変更日時               2019/01/01 00:00:00
パスワード有効期間                   2019/04/01 00:00:00
パスワード次回変更可能日時           2019/04/01 00:00:00
パスワードあり                       Yes
ユーザーによるパスワード変更可能     Yes

ログオン可能なワークステーション     すべて
ログオン スクリプト
ユーザー プロファイル
ホーム ディレクトリ
最終ログオン日時                     なし

ログオン可能時間                     すべて

所属しているローカル グループ        *Remote Desktop Users
                                     *Users
所属しているグローバル グループ      *なし
コマンドは正常に終了しました。
```

## 追加
パスワードと一緒にユーザ追加して
フルネームとコメントも登録して
リモートデスクトップ接続を可能にする場合

```
net user test_user1 test_pass1 /ADD
net user test_user1 /fullname:"テストユーザ"
net user test_user1 /comment:"コメント"
net localgroup "Remote Desktop Users" test_user1 /ADD
```

## 削除
```
net user test_user1 /DELETE
```
5ヶ月間のプログラミング学習の振り返り

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンに参加した大学生です。
プログラミングコースを受講し始めて約5ヶ月が経ち今回カリキュラムを終了したので、これまでの学習内容を振り返っていこうと思います。
初心者からプログラミング学習を始めた一例として何かしらの参考になればと思います。

##10月(後半から)

・[Progate](https://prog-8.com/)と[ドットインストール](https://dotinstall.com/)を使ってHTML、CSS、PHPを学習

##11月

・MySQLを学習し、PHPとデータベースの簡単な連携フォームを作成
・Jqueryを学習し、ドットインストールの[PHPでTodo管理アプリを作ろう](https://dotinstall.com/lessons/todo_app_php_v3)を参考に成果物作成
・ドットインストールの[ローカル開発環境の構築 Windows編]
(https://dotinstall.com/lessons/basic_localdev_win_v2)を参考に開発環境構築
（これまでは会社が用意してくれた開発環境をCyberDuckのSFTP接続を用いて使ってました）

##12月

・MVCモデルについて学習し、ドットインストールの[Laravel 5.5入門](https://dotinstall.com/lessons/basic_laravel_v2)を参考に成果物作成
・オブジェクト指向やアルゴリズム、データ構造について学習
（Kindle Unlimitedで参考書を読んだり[一週間で身につくアルゴリズムとデータ構造](http://sevendays-study.com/algorithm/)を参考にしました。)
・Linexを学習
・Sell、Docker、Kubernetes、Gitなどの各種開発ツールについて学習
・Word PressでHP製作を始める


##1月

・Markdown、Less、Webpackなど各種コーディングツールについて学習
・ProgateでJava Script(ES6)を学習
・[Hacker Rank]
(https://www.hackerrank.com/)や[Paiza](https://paiza.jp/)のスキルチェックなど練習問題をひたすら解き始める

##2月

・Paizaをメインに引き続き練習問題を解く
・EslintやJestなど各種コーディングチェックツールについて学習
・Phalconチュートリアル
・コース全体の復習


##全体を通しての感想

以前に勉強した内容を忘れていたときにモチベーションが下がるので、定期的な復習が大事だと思った。
カリキュラムを通してwebアプリ開発に必要な知識を習得できたので、あとは練習あるのみだと思った。

##これからやりたいこと
・WordPressを用いたHP製作の数をこなす（まずは有名サイトの模写から始める。）
・公開用のHPにアプリケーションを導入してリリース
・Paizaのランクを上げていく
・基本情報技術者試験の対策

ここまでお読みいただきありがとうございました。
常用漢字の中からランダムで元号を生成するコマンドを作りました

# 概要

元号は常用漢字から選ばれていると聞きましたので、常用漢字の中からランダムで元号を生成するコマンドを作りました。

https://github.com/suzuki86/gengo-generator

# こんなことに役立つかもしれません

- 実はまだ元号が決まっていないので急ぎで元号のブレストがしたい。
- 元号が漏洩したので別の元号を急ぎで欲しい。

...など

# インストール方法

```
go get github.com/suzuki86/gengo-generator
```

```
go install github.com/suzuki86/gengo-generator
```

以上で `gengo-generator` コマンドが使えるようになります。 `gengo-generator` コマンドを実行するとランダムに元号が出力されます。

# 例

```
# gengo-generator 
則栄
# gengo-generator 
商湯
# gengo-generator 
外附

```
ProgressTimeLatchとは何なのか

[DroidKaigiのカンファレンスアプリのソースコード](https://github.com/DroidKaigi/conference-app-2019)を見ていたら、 `ProgressTimeLatch` なるものが[使われており](https://github.com/DroidKaigi/conference-app-2019/blob/94a9955b319720cacfd28975ba9fb4698f043631/feature/announcement/src/main/java/io/github/droidkaigi/confsched2019/announcement/ui/AnnouncementFragment.kt#L37)、何だろうと思い調べてみると、色々と便利なやつだったので投稿します。

端的にいうと、**プログレスバーなどを使っている時に起こるチラつきを、いい感じに制御してくれるやつ**でした。

# ProgressTimeLatchとは
調べてみると、下記のツイートで紹介されたのが最初のようです。（おそらく）
Chris Banes氏と言えば、色々ライブラリを公開されており、お世話になった方も多いのではないかと思います。
https://twitter.com/chrisbanes/status/927928428539580416
<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Handy class I&#39;ve just wrote: ProgressTimeLatch. It&#39;s basically ContentLoadingProgressBar but works with any view <a href="https://t.co/qaMKi9ctxm">https://t.co/qaMKi9ctxm</a></p>&mdash; Chris Banes (@chrisbanes) <a href="https://twitter.com/chrisbanes/status/927928428539580416?ref_src=twsrc%5Etfw">2017年11月7日</a></blockquote>

ここで `ContentLoadingProgressBar` なるもの出てきますが、そもそも `ProgressTimeLatch` は `ContentLoadingProgressBar` の機能をどんなViewでも手軽に使えるように作られたもののようです。

ちなみに `ContentLoadingProgressBar` はSupport Libraryに入っているらしいです。（知らなかった…）
https://developer.android.com/reference/android/support/v4/widget/ContentLoadingProgressBar

# どう便利なのか
アプリを作っていると、下記のようなことがあるかと思います。

1. API通信などの非同期処理をする。
2. 処理をしている間は、プログレスバーなどを表示して、処理中を表す。
3. 処理が終了したら、プログレスバーなどを非表示にする。

あるあるの処理だと思います。

しかしながら、この処理の小さな問題として、APIの通信が一瞬で終わった場合は、プログレスバーの表示・非表示が一瞬で行われ、ユーザーとしては**何かがチラついた**ように感じることがあるかと思います。

これをいい感じに制御してくれるのが `ProgressTimeLatch` というわけです。

# 使い方
かなりシンプルなクラスなので、ソースコードを読めばなんとなくわかるかと思いますが、軽く解説。
（ ソースコードはこちら→ https://github.com/chrisbanes/tivi/commit/96e7cae7560ffd358b8c58c47267ed1024df53f6 ）

```kotlin
class ProgressTimeLatch(
        private val delayMs: Long = 750,
        private val minShowTime: Long = 500,
        private val viewRefreshingToggle: ((Boolean) -> Unit)
)
```
コンストラクタは上記のような感じになっています。

`delayMs` 
Viewを表示するまで遅延させる時間をセットします。

`minShowTime`
Viewの最低限の表示時間をセットします。

`viewRefreshingToggle`
Viewの表示・非表示のLambdaをセットします。

既存のコードに適用する場合は、[こちらのdiff](https://github.com/chrisbanes/tivi/commit/96e7cae7560ffd358b8c58c47267ed1024df53f6#diff-5b05c0aca5f47494a10a6f565657e7f1)が参考になりそうです。対象のViewをラップするようにして、今まで表示・非表示を切り替えていたところで、 `refreshing` を切り替える形。

## いい感じに制御してくれる例
下記のような場合を想定します。

```kotlin
ProgressTimeLatch(delayMs = 500, minShowTime = 500) {
 // ProgressBarの表示・非表示
}
```
・非同期処理が早く（100ms）終わった場合
　→ `delayMs` より小さいのでProgressBarは表示されない（チラつかない）

・非同期処理がやや早く（600ms）終わった場合
　→ `delayMs` より大きいのでProgressBarは表示される
　→ `minShowTime` が残っているので、残り時間分表示して非表示になる（チラつかない）

・非同期処理が遅く（2000ms）終わった場合
　→ `delayMs` より大きいのでProgressBarは表示される
　→ `delayMs` と `minShowTime` の合計以上なので、元の処理が終わったタイミングで非表示になる（チラつかない）


という感じです。便利！

# まとめ
- `ProgressTimeLatch` はチラつきをいい感じに制御してくれるやつだった
- 使い方もシンプルなので、使っていきたい
Ruby  メソッド

動作環境はMacを使用しています。


##メソッド

複数の処理を1つにまとめて扱いやすくしたもの
クラス内に定義される
≒クラス内に定義する関数

**構文**

**def メソッド名(引数１、引数2...)**
実行したい処理
**end**

引数がない場合省略可。
引数は、メソッドに渡すもの。

---

**実践**

"Hello, World"と出力するプログラムを実装
メソッド名はhello_world

```method_hello.rb

def hello_world
  puts "Hello, World!"
end

hello_world
```

出力結果

```irb
$ ruby method_hello.rb
Hello, World!
```

**引数を使用して、任意の数字を計算するプログラム**

```method_add.rb
def add(x, y)
  x + y
end

puts add(10,1)
#10+１の計算結果が出力される
#メソッド内にputsを定義しない理由は文字列ではないから

```


出力結果

```irb

$ ruby method_add.rb
11
```

**戻り値**
メソッドからメソッドの呼び出し元に戻す値のこと

他のプログラミング言語で戻り値を明示的に表す場合があるがrubyの場合は不要

```method_add.rb
def add(x, y)
  return x + y
end

puts add(10,1)
```

```irb
$ ruby method_add.rb
11
#エラーにはならない
```

**メソッドの命名規則**


メソッド名は小文字

```method_name.rb
def hello
  puts "Hello"
end

hello
```

出力結果

```irb
$ ruby method_name.rb
Hello
```

２語以上のメソッド名になる場合はスネークケース（アンダースコア）でつなぐ
※アンダースコアで始まるメソッド名はエラーにはならないが意図がない限り避ける

```method_name.rb
def hello_world
  puts "Hello"
end

hello_world
```
出力結果

```irb
$ ruby method_name.rb
Hello
```

メソッド名に数字は使用可能。ただし、使用しない方が良い
製作者しかわからないマジックナンバーになるため

```method_name.rb
def hello1
  puts "Hello"
end

hello1

#行頭に数字を持ってくるとエラーになる
def 1hello
  puts "Hello"
end

1hello
```

出力結果

```irb 
$ ruby method_name.rb
Hello

$ ruby method_name.rb
method_name.rb:1: syntax error, unexpected tINTEGER
def 1hello
     ^
```

**実践**

引数にcatが渡されたら"meow"
引数にdogが渡されたら"bowwow"
それ以外なら"???と出力されるメソッド

```animal_cry.rb

def cry(animal)
  if animal == "cat"
    puts "meow"
  elsif animal == "dog"
    puts "bowwow"
  else
    puts "???"
  end
end

puts cry(引数)　#戻り値の出力
```

出力結果

```irb

$ ruby animal_cry.rb
meow #cat
$ ruby animal_cry.rb
bowwow #dog
$ ruby animal_cry.rb
??? #それ以外
```

**FizzBuzzメソッド**

3で割り切れる時Fizz
5で割り切れる時Buzz
15で割り切れる時FizzBuzz
それ以外は数値を文字列にして返す



```fizz_buzz.rb
def fizz_buzz(n)
  if n % 15 == 0
    "FizzBuzz"
  elsif n % 3 == 0
    "Fizz"
  elsif n % 5 == 0
    "Buzz"
  else
    n.to_s
  end
end

puts fizz_buzz(1)
puts fizz_buzz(2)
puts fizz_buzz(3)
puts fizz_buzz(4)
puts fizz_buzz(5)
puts fizz_buzz(6)
puts fizz_buzz(7)
puts fizz_buzz(8)
puts fizz_buzz(9)
puts fizz_buzz(10)
puts fizz_buzz(11)
puts fizz_buzz(12)
puts fizz_buzz(13)
puts fizz_buzz(14)
puts fizz_buzz(15)
```

出力結果

```
1　
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
```

ポイントは3で割る処理の一番最初に持ってきてしまうと、
15で割る時にFizzが返ってしまうので、15で割る処理を一番最初に持ってくること。
AWS認定資格のバッジがいつの間にか変わってた

AWS認定資格のバッジがいつの間にか変わってます。

| 資格 | バッジ |
| --- | --- |
| ソリューションアーキテクト プロフェッショナル | ![4.png](https://qiita-image-store.s3.amazonaws.com/0/41574/d5c24664-cf97-2b57-1563-2806705c1c7c.png) |
| ソリューションアーキテクト アソシエイト| ![1.png](https://qiita-image-store.s3.amazonaws.com/0/41574/6c6b80f5-d9a2-74a8-e5c4-28ba4cfd3015.png) | 

枠の色が資格ごとに違うようです。
他の資格は持ってないのでわかりません。
コーポレートエンジニアの目指すべき姿、スキル

# はじめに
ここ数年、コーポレートエンジニアとして働いてきました。
その中で目指すべき姿や必要そうなスキルを書いていきます。

あくまで私個人の考えです。

# 目指すべき姿
* 全社横断で組織の課題を抽出し、テクノロジーやエンジニアリングで解決すること
* 解決は個別最適ではなく全体最適であること
    * 特定の社員、特定のチームではなく企業全体としてどうなのかという視点
* ビジネスプロセスの改善やビジネスモデルの変革
* 信頼され、愛され、相談される存在であること
* （生産性あげて、働きやすい環境作って、新規事業も作って、楽に儲かる会社にしよう！というチーム、部門）

# 必要なスキル
* 経営戦略からIT戦略へ落とし込むことができる
    * 課題の具体化、優先順位付け
* 絡み合った事象を解きほぐし、整理し、本質的な課題を見つけられる
* 広範囲なテクノロジーについて知っており、必要であれば検証し使うことができる
    * 広範囲なテクノロジーとは、コードを書く、グローバルで最先端なSaaSやハードウェア
* ビジネスの興味、視点
* UX的な思考
* さまざまな職種や考えを受け入れつつ、自分の意見も言えるコミュニケーションスキル
* 経営層から予算をもぎ取るスキル
* 社外への発信スキル

※１人ですべてを持っている必要はなく、チーム全体でカバーできれば良い

# 実際にやってきたこと
* ネットワーク機器以外のフルクラウドオフィス化
* 会議室の映像ケーブルのコードレス化
* ほぼ全部のPCをMac化
* 全社的なシステムの整理
* シングルサインオンの構築
* Web会議システムを常時接続し、地方拠点とのコミュニケーション改善、地方拠点の社員のエンゲージメントを高める
* 受付システムを導入し、受付取次の業務をなくす
* Slackで勤怠
* イベント登壇や社外への発信
* （当たり前だけど）その他、採用やプロセス改善、ネットワーク構築などなどのフツーの業務

# 今後やっていきたいこと
* ゼロトラストネットワーク化
* ビジネスプロセスの改善
* 人事や会計システムに対してプロダクトマネージャ導入
* 固定電話をなくす

# 魅力
* 未開拓の領域であること
* 様々な部署と仕事をするため組織全体を知ることができる
* いろいろなテクノロジー、ツールに触れることができる

# 悪いところ
* 経営陣によっては、従来型の情報システム部門のようにコストセンターだと見られる
* 予算がないとやりたくてもできない状態に陥りやすく、ストレスを抱える
* 一般的にプロダクト開発のほうが面白いし、そっちのほうが年収も高いので不人気職種
TensorFlowの基礎についての備忘録

簡単なメモ書き

```python:TensorFlow
import tensorflow as tf

#定数/変数の宣言
const1 = tf.constant(2.0, tf.float32)
var1 = tf.Variable(3.0, tf.float32)
tf.assign(var1, 5.0) #変数への代入

#placeholderは実行時に値が設定可能
holder1 = tf.placeholder(tf.float32) 


#四則演算(その他、数学関数なども豊富に揃っています
add_op = tf.add(const1, var1) #和
sub_op = tf.sub(const1, var1) #差
mul_op = tf.mul(const1, var1) #積
div_op = tf.div(const1, var1) #商
mod_op = tf.mod(const1, var1) #余り
pow_op = tf.pow(holder1, var1) #べき乗


#グラフ実行
with tf.Session() as sess:
    #変数(Variable)は初期化が必要
    sess.run(tf.global_variables_initializer())

    result1 = sess.run(add_op)

    #holderへ値を設定
    result2 = sess.run(pow_op, feed_dict={holder1: 4.0})
```

参考
---
[DeepAge TensorFlow](https://deepage.net/categories/tensorflow/)
[TensorFlowの定数、変数、プレースホルダーの使い方](https://note.nkmk.me/python-tensorflow-constant-variable-placeholder/)
mac のメニューバーで猫が飼える RunCat なる App を見つけた！

Twitter の TL を眺めてたら衝撃を受けた。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Little kitty runs faster when my cpu usage goes higher. (I&#39;m building something so the little guy&#39;s really movin.) <a href="https://t.co/xeNRYC21SG">pic.twitter.com/xeNRYC21SG</a></p>&mdash; Paul Frazee✌️ (@pfrazee) <a href="https://twitter.com/pfrazee/status/1101127817927057409?ref_src=twsrc%5Etfw">2019年2月28日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

メニューバーで😺走ってるやん！

早速検索した。

RunCat

https://itunes.apple.com/jp/app/runcat/id1429033973?mt=12

もちろん、インストール！

… … …

<img width="983" alt="スクリーンショット 2019-03-01 3.14.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/3243/d9326451-5d85-8f81-8c5a-e2a734f86c81.png">

はい。

RunCat したいから、 10.12 にしようかな…
Gatsby・VSCodeなプロジェクトにeslintするにはこのへんだけ見ればいけます



導入

```
yarn add eslint eslint-loader
```

参照； https://www.gatsbyjs.org/packages/gatsby-plugin-eslint/

https://eslint.org/demo/


で内容の確認


<img width="611" alt="Screen Shot 2019-03-01 at 3.03.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/117615/d7c33e5e-476f-0cba-78c9-4960d2261e2c.png">

ほんでこの設定すると、ファイル保存時にLint設定を元にソースをいい感じにしてくれる。精神衛生上よい。


わたしの設定

```js
{
  "extends": "airbnb",
  "rules": {
    "array-callback-return": 0,
    "react/no-unused-state": 1,
    "no-unused-vars": 0,
    "react/jsx-filename-extension": 0
  }
}
```


以上
Laravel-Mixコンパイル時のcode ELIFECYCLEエラーに対応する

# 概要
Laravel-Mixコンパイル時のエラーに対応したのでメモ。

# 事象
Laravel-Mixのコンパイルを実行すると、```code ELIFECYCLE〜```のエラーが発生。

``` terminal
npm run dev
npm run watch
npm run production

-------

npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! @ development: `cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the @ development script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/xxxx/.npm/_logs/xxxx.log
```

# 対策
## node_modulesを入れ直す

```terminal
#既存jsモジュール群を全削除
rm -rf node_modules

#lockファイルを削除
rm package-lock.json yarn.lock

#npmのキャッシュをクリア
npm cache clear --force

#jsモジュール群をインストール
npm install

#動作確認
npm run dev
```

# 参考
[Sudden npm error](https://laracasts.com/discuss/channels/javascript/sudden-npm-error)

[LaravelMIX セットアップ](https://qiita.com/harukingo/items/1cc681b4f280aa245abe)
AtCoderのためにjupyterの入力を複数行に対応させる

筆者は最近流行りの[atcoder](https://atcoder.jp/)というものを始めた。

そこで一つ困ったことがある。
それはをatcoderを批判するわけではないが、コードテストのタブが時々読み込むことを繰り返し、なかなか実行してくれないことである。

これの回避策として考えたのはオフラインpython実行環境であるjupyterでコードテストを行うことであるが、
jupyterが複数行の入力に対応しておらず（inputなど）一行ずつコピペしなければならないのでこれもまたストレスである。

＊2020/3/3追記 いつぞやのアップデートで高速になりました。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/369642/5a2e60dc-f9dd-01b9-ab14-389a4ca3b8d7.png)


そこで本記事ではjupyterの入力を複数行に対応させる手法を紹介する。
今回はモジュールのipywidgetを使用した。

参考文献は[こちら](https://drillan.github.io/articles/jupyterbook_reject03a.html)である。
どうして没にされてしまったのかわからない。

#コード

```python

from ipywidgets import Textarea

def get_input(change):
    global Input
    Input=change["new"]

textarea = Textarea()
textarea.observe(get_input, names='value')
display(textarea)

#jupyterの別枠で

n,*a=Input.split()
print(n,a)

```
#jupyter
![qiita2.png](https://qiita-image-store.s3.amazonaws.com/0/369642/19d03a09-2f0f-7c9c-9a5c-b0a4b4f9b32b.png)

以上のように使える。ちなみに一番上の枠を一度実行しさえすれば、observe関数は常時テキストボックスを監視しているため、入力例でテキストボックス内を書き換えれば、再実行せずともInputが変わる。
また、Input以降の扱いは諸君の得意とするところであろうから、ここでは割愛する。

それでは諸君の良い精進日和を期待する。
IPythonとbravadoでOpenAPI (Swagger) をテストする

Swagger UI でぽちぽちやるタスクを IPython と bravado で行うととても便利。

## 補完を効かせる

`__getattr__` で作られる属性の補完のために `__dir__` が用意されているけど、2段階目の時点ではさらに `__dir__` でたどってくれるわけではないので、 `client` を作成した直後に実体化しておくと良い。

```python
for tag in dir(client): 
    setattr(client, tag, getattr(client, tag))
```

これで `operationId` まで補完されるようになる。

## Base URL を変える

プログラム上で変えたい時は `swagger_spec` でアクセスする。

```python
client.swagger_spec.api_url = "http://..."
```

## 後から API Token を設定する

`client.swagger_spec.http_client` に設定する。

```python
client.swagger_spec.http_client.set_api_key(
    'api.yourhost.com', 'token',
    param_name='api_key', param_in='header'
)
```

## Jupyter notebook

編集して一気に再実行できたりできる。Markdown を含めてテストケースを共有できたりもする。

## autoreload と一緒に使う

https://qiita.com/Accent/items/f6bb4d4b7adf268662f4

よく使う共通の流れをファイルにして保存しておく。
VSCode 環境をgit管理してどこでも同じ環境を引き継ぐ

# VSCodeの環境をgit管理するメリット
- どこでも同じ環境を使える
- 会社で作った環境を自宅でもう一度設定しなくてよい
- 違う端末にVSCodeをinstallしたときに一瞬で同じ環境が再現できる

なんか[ポータブルモード](https://www.atmarkit.co.jp/ait/articles/1807/20/news023.html)とか、[Settings Sync](https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync)とかあるっぽいけど。

## VSCodeの環境

環境はだいたい以下の３つで構築されている。

- `settings.json` : 設定全般
- `keybindings.json` : キーバインド
- extension（拡張機能）

## 引き継ぎ方

### 1. 設定ファイルをgit管理するディレクトリに移動

```zsh
cd ~/Library/Application\ Support/Code/User/
```
ここに`settings.json`と`keybindings.json`がある。


これをgit管理するディレクトリに移動。（自分の場合は/dotfiles/.vscode/においた）

```zsh
mv settings.json "ファイルを移動したいディレクトリパス"
```

そして `~/Library/Application\ Support/Code/User/`にそれぞれのファイルのシンボリックリンクを貼る。

```zsh
ln -s "移動したファイルパス/settings.json" "~/Library/Application\ Support/Code/User/settings.json"
```

### 2. extention のリスト書き出す

```zsh
code --list-extensions > extensions
```
ちなみに`code`コマンドが使えないときはコマンドパレットに「shell」と入力してinstallするとすぐつかえるようになる。

### 3. 本題、一発で環境設定するファイル

```shell:vscode_install.sh
#!/bin/sh

SCRIPT_DIR=$(cd $(dirname $0) && pwd)
VSCODE_SETTING_DIR=~/Library/Application\ Support/Code/User

rm "$VSCODE_SETTING_DIR/settings.json"
ln -s "$SCRIPT_DIR/settings.json" "${VSCODE_SETTING_DIR}/settings.json"

rm "$VSCODE_SETTING_DIR/keybindings.json"
ln -s "$SCRIPT_DIR/keybindings.json" "${VSCODE_SETTING_DIR}/keybindings.json"

# install extention
cat extensions | while read line
do
 code --install-extension $line
done

code --list-extensions > extensions

```

### 5. git管理
以下のファイルをgitにあげておく。

- settings.json
- keybindings.json
- extention
- vscode_install.sh


### 4. 設定インストール
設定ファイルのリポジトリを`git clone`してきて以下を実行。

```zsh
"~/ディレクトリパス"/vscode_install.sh
```
⚠設定ファイルがある場合は、`rm`で一旦設定ファイルを削除してシンボリックリンクを貼るので、引き継ぎたい設定がある場合は必ず`mv`しておく。

---
おわり。
最近入れて気に入っているextentionは「[vscode-spotify](https://marketplace.visualstudio.com/items?itemName=shyykoserhiy.vscode-spotify)」。
spotifyへの画面移動がなくなってとても快適。

その他、[VSCodeを使いやすくした](https://qiita.com/miiina016/items/b895096f712c0cc31972)。

*参考 :* https://note.mu/teitei_tk/n/n7204cb8d97c5