OmniAICreator/Qiita-1.07M huggingface dataset:
ReactとVueの好きなところ、微妙なところ

常に比較される両者で初心者が触ってどっちが初心者に向いているのか？
好きなところ、戸惑ったところを思った事をまとめてみました。

#好きなところ

## React
* propsやstateの受け取り方、定義の仕方が明示的かつ統一されていて好き
* stateが更新されるタイミングが```this.setState ```ではっきりわかる　
* recompose好き(Hooks勉強します。)
* 処理と描画を分ける考え方好き


## Vue

* プロパティを```{{}}```でアクセスできるのがはっきりしてて好き
* Reactの```classNames```ライブラリを使用しなくても``` :class```で状態によって表示を切り替えられるのが楽

## Vuex

* storeを分割させる考え方好き
* Vueと繋げてCRUDまでそこまで苦労しなかった
* mapState,mapActionsすげーわかりやすい


# 微妙なところ

## Vue
* どうやってデータを更新しているのか最初戸惑った
* ```v-bind```単語がReact(JavaScript)の``` bind```と少し被ってややこしかった
* propsの受け取り方好きじゃない



---

Reactは初めての人でもどこでstateを定義して更新しているのかがはっきりとしているので、簡単とは言いにくいですがVueよりデータフローを意識できるのかなと思います。
ReduxとVuexはVuexの方が自分はわかりやすく、store(state)を意外と簡単に変更、操作することができました。

単一ファイルコンポーネントはコードが短ければまとまっているので、そのコンポーネントが何をしているか短時間で把握することができますが、長くなるとスクロールがめんどくさいです。


自分はReact始まりで、どうしてもReactと比較してしまいましたので、みなさんの意見も聞きたいです！
【Unity】テクスチャの端が完全に透過されない場合の対処法

こんにちは、電車君です。
今回は、Unityでテクスチャの端が完全に透過されない場合の対処法を解説します。

# 症状
![icon1080.png](https://qiita-image-store.s3.amazonaws.com/0/236865/2e98bfcf-974f-2f57-08a1-03daa951ca99.png)
![icon1080_zoom.png](https://qiita-image-store.s3.amazonaws.com/0/236865/3acb1c8d-ab97-74d9-b509-5f1a5be016a7.png)
二枚目の画像は一枚目の画像を拡大したものです。
Filter ModeをPointにしても、画像のように、テクスチャの端が完全に透過されない場合があります。

# 対処法
画像のAssetsを選択し、Inspectorから **Wrap Mode** を **Repeat以外** にすると直ります。
![icon1080.png](https://qiita-image-store.s3.amazonaws.com/0/236865/0a03854a-6fba-76f9-78f7-6ed5b284f19b.png)
![icon1080_zoom.png](https://qiita-image-store.s3.amazonaws.com/0/236865/28449bd8-b1cb-38f2-c0a9-49f49c0b72c1.png)

以上です。
Google Spreadsheetでランダムに出力するオミクジ的なサイトを作る(1)

前に[Google SpreadsheetとCloud Functionsでランダムに出力するオミクジ的なサイトを作る](https://qiita.com/usop4/items/9c00ac04497ec0dcb5ec)というエントリを書いた。

Google App Scriptで`ContentService.createTextOutput()`を使って値を出力し、Cloud FunctionsでHTMLに加工するというものだが、`HtmlService.createHtmlOutput()`でHTMLを直接生成するという手もある。

この方法、どういうわけか「このアプリケーションは、Google ではなく、別のユーザーによって作成されたものです。」という文言が出てしまって使いにくいが、個人用に使うぐらいだったらいいかな。前回同様、スクリプトエディタから公開を選べば実行できる。


```js
function doGet(){
  var spreadsheet = SpreadsheetApp.openById('{スプレッドシートのID}');
  var sheet = spreadsheet.getSheetByName('{シート名}');
  var lastRow = sheet.getLastRow();
  var rand = Math.floor( Math.random() * lastRow ) + 1;
  var url = sheet.getRange(rand,1).getValue();
  var title = URLtoTitle(url);
  var content = '<h1><a href="'+url+'" target="_top">'+title+'</a></h1>';
  return HtmlService.createHtmlOutput(content);
}
```
Gitlabに画像を貼り付ける

## 課題

Gitlab上にTips共有のためにMarkdown形式でナレッジをためていたのですが、  
図を使いたい時はImageディレクトリを作ってそこに画像を配置し、Markdownの中でパスを指定して表示していました。

```bash-session
# ファイル構成
.
├── Image
│   └── Metabase_MySQL.png
└── Markdown
    └── 009_MetabaseとMySQL環境をDockerで作る.md
```

```Markdown
![SS1](../Image/Metabase_MySQL.png)  
```

しかし、個人用なら良かったのですが、共有している環境でこれをやってしまうと
pullした時にみんなのローカルに画像ファイルを大量に置くことになってしまうことに気がつきました。

## 解決策

### 参考

なんでもQiitaが教えてくれる。

* [GitHubでREADME.mdに画像を使用したい](https://qiita.com/lowg/items/06dd096e7ed1acce4b1e)

### Gitlabでも試す。

`課題`から`新規課題`を選択

![01_Gitlabで画像リンクをつくる_Issue画面.jpg](https://qiita-image-store.s3.amazonaws.com/0/223761/67038dea-f5e6-e0fc-e3e7-c4cda5584882.jpeg)

New Issueの画面が表示されるので

![02_NewIssue.jpg](https://qiita-image-store.s3.amazonaws.com/0/223761/665eb956-a072-3f27-5135-ea2aadcb1813.jpeg)

リンクを作りたいファイルをドラッグ＆ドロップ

![03_DragandDrop.jpg](https://qiita-image-store.s3.amazonaws.com/0/223761/6367c550-b46b-fd82-22ea-c257c5cd73ae.jpeg)

リンクが作成されるので、これをMarkdownの中に記載すれば画像が表示されます。

![04_リンク作成完了.jpg](https://qiita-image-store.s3.amazonaws.com/0/223761/f5cf252e-89a8-237a-f47e-df6084df85c1.jpeg)
Lightning Web Components（メタデータ）


AuraコンポーネントではComponentタグのimplementsで指定したコンポーネントのタイプは、メタファイル上で指定するように変更されている。

```html
<?xml version="1.0" encoding="UTF-8"?>
<LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata" fqn="LWC_MyComponent">
    <apiVersion>45.0</apiVersion>
    <isExposed>true</isExposed>
    <description>サンプルコンポーネント</description>
    <targets>
      <target>lightning__RecordPage</target>
    </targets>
</LightningComponentBundle>
```

isExposedがfalseだと、App Builder上にコンポーネントとして表示されない。

targetsの指定

```html
  <targets>
      <target>lightning__RecordPage</target>
      <target>lightning__AppPage</target>
      <target>lightning__HomePage</target>
      <target>lightningCommunity__Page</target>
  </targets>
```

App Builder上で設定する設計プロパティを指定

```html
<targetConfigs>
  <targetConfig targets="lightning__RecordPage">
    <property name="prop1" type="String" />
    <objects>
      <object>Account</object>
      <object>Opportunity</object>
    </objects>
  </targetConfig>
  <targetConfig targets="lightning__AppPage, lightning_HomePage">
    <property name="prop2" type="Boolean" />
    <property name="label" label="ラベル" type="String" description="画面に表示するラベルを入力して下さい" />
    <property name="type" label="表示タイプ" type="String" default="richtext" datasource="richtext,code,link"/>
  </targetConfig>
</targetConfigs>
```

設計プロパティは、コントローラJS内で@apiを付けて変数として定義すると、自動的に値がセットされる。

```js
export default class xxxxx extends NavigationMixin(LightningElement) {
    /////////// design property
    @api
    type;

    @api
    prop2;

    @api
    label;

```

[開発ガイド](https://developer.salesforce.com/docs/component-library/documentation/lwc/lwc.reference_configuration_tags)
いま、StackEditを使わないで、いつ使いますか？

仕事の待ち時間が暇すぎる！
のでStackEditを使ってQiitaの記事を書く。

## StackEditとは

StackEdit は、Stack Overflow や他のスタック交換サイトで使⽤されるマークダウ ン・ライブラリと、PageDownをベースとした**フル機能のオープンソース・マー クダウン・エディタ**。（公式）

## 使うに至った経緯

今の仕事してると結構空き時間がある事が多くて この暇な時間に何かできないものかと。
で、Qiitaの記事でも書こうかと思ったんだけどログインしないと書けないわけで...
結局、客先の端末で勝手にログインして何か言われても面倒なので
マークダウン記法ができるいいサイトはないかと調べていたらヒットしたのが**StackEdit**だったってわけ。

## 何ができるのか

**フル機能のオープンソース・マー クダウン・エディタ**って具体的に何ができるの？ってなる。
StackEditのサイト開くと機能説明書が書いてある。
Driveとの同期やBlogger 、 Dropbox 、 Gist 、 GitHub 、 Google Drive 、 Tumblr 、 WordPress 、
任意のSSHサーバへの公開、マークダウン記法では数式からUML、フローチャートまで書ける。
（Qiitaには対応してないものもあるみたい）

## おわりに

この記事もﾋﾏｰな時間にStackEditで書きました。
これで技術記事漁っててネタになりそうなのを見つけたときに
すぐ書けるねﾒﾃﾞﾀｼﾒﾃﾞﾀｼ。

タイトルは今流行り(？)のコピーメカで
[Qiitaやブログのタイトルは自分で考える必要なんてなかったんだ](https://qiita.com/YumaInaura/items/0d8427bfe2d7be476d0d)

[@ka215](https://qiita.com/ka215)さんがWelcome Documentを和訳してくださっています。
[超高機能マークダウンエディタ「StackEdit」の Welcome Document を和訳してみた](https://qiita.com/ka215/items/9a7768609b88c5df8ef6)
不要なPCとWebカメラで監視カメラを作成する。

# 前提
会社の倉庫から不要な小型PCと、webカメラが発掘された。これを使ってなにかできないだろうかと上司に相談を受けたため、監視カメラの作成を決定。

# 使ったもの
Chromebox：会社に転がっていた不用品。RAM4GB、Celeron3215U。
Logitech QuickCam pro：会社に転がっていたWebカメラ。2メガピクセル。

# 使用した技術、ソフトウェア
OS：Linux mint 19 mate x64
監視カメラ機能：motion

#### OSとソフトの選定理由
- OS
Chromeboxには標準でChromeOSが搭載されているが、これは拡張性が乏しいため、USBハードディスクにlinuxmint19 mateをインストールした。Ubuntuベースであり情報が豊富にあること、Ubuntuよりもメモリ消費が激しくなく、軽量であることから、mintを選択した。

- Motion
motionは撮影している画角に変化があると、それに応じて動画を撮影する。また、同じネットワークにある別の端末で動画のストリーミングと、設定が行える。しかしながら、webページから変更した設定はたまに反映されないこともあるので、motion.confを書き換えたほうが確実。


### motionの設定
上述の通り、motionには各種の設定が用意されている。
設定は“/home/etc/motion/motion.conf“に記述されている。変更した設定は以下の通り。

daemon on *デーモンプロセスとして起動
frame rate 15　*フレームレート15
locate_motion_mode on *動く物体を追尾　
locate_motion_style box *白い枠で追尾
stream_quality 75　＊ストリーム時のクオリティを保存している動画と同程度に
stream_maxrate 15 *ストリーム時のフレームレート
webcontrol_localhost off *offでないとChromebox以外で設定ができない
stream_localhost off　*offでないとChromebox以外で見ることができない
target_dir /home/$username/motion *動画を保存するディレクトリを変更
output_pictures off  *写真は保存しない

### Bashスクリプトの作成、cronの設定
motionには撮影した動画を削除する機能はない。そのため、一定期間（現在は2日）経過したファイルを探し、削除するスクリプトを作成した。これが毎日13時20分にcronで実行される。

```bash:deletemov.sh
#!/bin/sh
#motionで撮影した動画を一定期間経過したら削除します

#保存場所
target="/home/USER/motion"
#何日(以上前:+n,より新しい:-n)
days="+2"

#findが指定した日数を経過したファイルを探し、rmを実行する
find ${target} -type f -mtime ${days} -exec rm -f {} \;
```
# 実際に運用してみて

一般的中小企業のオフィスの机において2018年12月10日13時22分から、12月11日18時11分まで連続で稼働させたところ、生成された動画は252個、445.8MBだった。人通りなどにもよるがそれほどディスク容量を消費しないことが分かったので、スクリプトの消去設定を2日から1週間に変更してもいいかもしれない。社内wifiに接続しテストを行ったところ、オフィス内では殆どの場所でストリーミングを見ることができたが、少し端に移動すると、接続するアクセスポイントが変わるからなのか（社内には4台のアクセスポイントがある）、ストリーミングができなくなる。同じSSIDでも、接続するアクセスポイントが変わるとローカルホストという扱いではなくなるのかどうなのかは不明。

# 所感
今回はChromeBoxを利用したが、ChromeOSでは上記のような目的が達成できないのでmintをUSBメモリから起動した。bashやmintを触るのは初めてだったので少し躓いたが、Raspberry Pi関連の情報が国内外ともに充実していたため、手探りながらそれらを参照して監視カメラが完成できた。

# 参照
[Raspberry Piでmotionを動かして、カメラの画像をストリーミング配信する方法](http://asukiaaa.blogspot.com/2016/10/raspberry-pimotionusb.htm)
[Motion の導入手順 ～ 指定した内容、パラメータの意味について]
(http://safe-linux.homeip.net/web/motion/motion-03.html)
他多数
Use Trello Api from Groovy

# TL;DR
* Use Library Trello4j

# Prepare
Api Keyをこちらから取得する https://trello.com/app-key
合わせて、「手動でトークンを生成」する

# Sample
```Groovy
@GrabResolver(name='trello4j', root='https://raw.github.com/joelso/joelso-mvn-repo/master/snapshots/')
@Grab(group='org.trello4j', module='trello4j', version='1.0-SNAPSHOT')
import org.trello4j.*

Trello trello = new TrelloImpl('Api Key', 'token')

// display boards
boardList = trello.getBoardsByMember('YourID')
boardList.each { println "ID: ${it.getId()}, NAME: ${it.getName()}" }

// display list in the Board
listInBoard = trello.getListByBoard('YourBoard')
listInBoard.each { println "ID: ${it.getId()}, NAME: ${it.getName()}" }

// add new card
cardName = 'new card'
cardPropertyMap = ['desc':'description']
card = trello.createCard('list id', cardName, cardPropertyMap)
```

# 参考
https://github.com/joelso/trello4j
Font Awesomeで目だの手だの書いて「おめでとう」って言ってみた

# はじめに
アニメ初期のちびまる子ちゃんで、「まるちゃん年賀状を書く」というお話がありました。[^1]
[^1]: コミックスだと７巻くらい・・・？墨汁が垂れたのをごまかしたり、いも判に失敗しておてもやんにされたり、あぶり出ししようとしてボヤ騒ぎになったりする話です（笑
年賀状のネタに困ったまるちゃんが、膝を打って「いいこと思いついた！」とやりだしたのが、目や手の絵をかいて「おめでとう」と書くこと:pencil2:[^2]
[^2]: このシーンのキートン山田のナレーションが「まさか、目だの手だの書いておめでとうって言うんじゃないだろうな」でした。

アニメや漫画では、お姉ちゃんのサインペンを借りて書いていたまるちゃんですが、21世紀になるとデジタルでできちゃうのでは・・・と思い、まるちゃんの代わりにやってみました。

# 元ネタ
まるちゃんが書いていた文章は、以下の通り:arrow_down:

```text
あけましておめでとう　ことしもよろしく　まる子より
```
この中で、イラストがふんだんに使われているのが「あけましておめでとう」の部分なので、ここを再現してみます！
ちなみに、YouTubeに上がっていたアニメのキャプチャを取ってきたら、こんな感じでした。
![newYearCard.png](https://qiita-image-store.s3.amazonaws.com/0/188980/eee5614b-f1f1-a023-aa5f-cc617081b243.png)


# 使う技術：アイコンフォント
画像をイラストレーターなどで書き起こすなら、20世紀のサインペンのまるちゃんと（ほぼ）変わらない！！
21世紀なら、アイコンフォント使おうよ！
ってことで、今回は[FontAwesome](https://fontawesome.com)を使いました。

# やってみた
## 下準備
Font Awesomeを使えるように、HTMLのheaderタグの中に、以下のタグを埋め込んでおきます。

```html
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.6.3/css/all.css" integrity="sha384-UHRtZLI+pbxtHCWp1t77Bi1L4ZtiqrqD80Kn4Z8NTSRyMA2Fd33n5dQ8lWUE00s/" crossorigin="anonymous">
```

## 出力結果
![fontAwesome_02.png](https://qiita-image-store.s3.amazonaws.com/0/188980/37953b29-c668-b8bb-1c4a-815d7ad0a4b5.png)

## ソースコード
```HTML
<div><i class="fab fa-dropbox"></i></div> <!-- あけ -->
<div>ま</div>
<div>４</div>  <!-- し -->
<div>て<i class="far fa-hand-paper"></i></div>

<div><i class="fas fa-dog"></i><span style="background-color: #FFFFFF; position:relative; left: -7px;">　</span></div> <!-- お -->
<div><i class="fas fa-eye"></i></div>  <!-- め -->
<div><i class="far fa-hand-paper"></i></div>  <!-- で -->
<div><i class="fas fa-door-open"></i></div>  <!-- と -->
<div>う</div>
```

# 元ネタとの違い
## 「あけまして」のあけ
元ネタでは、窓を開けて人が顔を出しているイラストでしたが、FontAwesomeには見当たらなかったので、「何かが開いている」アイコンを探しました。
ドアのアイコンだと、後半に出てくる「おめでとう」とイラストが被るので、箱のふたが開いているものを探しました。
・・・結果、DropBoxのロゴになりました :sweat_drops: 

## 「おめでとう」のお
些細なことなんですが、元ネタでは右側に尻尾が出ています（＝顔が左を向いている）。
が、FontAwesomeでは動物は全て右を向いていたので、元ネタとは逆向きの方向になってます。
そして、頭を隠すために、

```HTML
<span style="background-color: #FFFFFF; position:relative; left: -7px;">　</span>
```
を使ってます。
「なんか白いのをpositonずらして重ねればいいんじゃね？」というやっつけ感ハンパない仕上がりです・・・。

## 「おめでとう」のと
元ネタによく似たイラストが見つかりませんでした・・・。
でも、ドア・扉のアイコンがあったので、それを使ってます。

# 感想
年が明けてから思いついて、やっつけ突貫工事で作った割には、案外うまく再現できたなぁ思いました。
イヌのしっぽを隠すやり方が全くイケてないので、もうちょっとイケてる方法があれば、そっちにしたかった・・・。
シェルスクリプトでJSONを扱う

入出力がJSON形式のWeb APIを呼び出すシェルスクリプトを実装する必要があったため、簡単にJSONを扱う方法を調査した。

結論としては、Web APIへ入力するJSONの作成にはヒアドキュメントを使い、Web APIから出力されたJSONの解析には[jq](https://stedolan.github.io/jq/)を使うこととした。

#### サンプルコード

```shell
number=1
string="abc"

# JSON作成にはヒアドキュメントを使う
json=$(cat << EOS
{
  "number": ${number},
  "string": "${string}"
}
EOS
)

echo "$json"
# => {
#      "number": 1,
#      "string": "abc"
#    }

# JSON解析にはjqを使う 
echo $JSON | jq '.number'
# => 1  

# -r: string型の"を除去する
echo $JSON | jq -r '.string'
# => abc
```

#### 参考

* https://stedolan.github.io/jq/
* https://dev.classmethod.jp/server-side/os/how-to-inject-variable-to-json-on-bash/
CentOS Unix.Trojan.DDoS_XOR-1 対策 メモ

## Unix.Trojan.DDoS_XOR-1 に感染してしまった場合
- よくわからないプロセスが立ち上がっている
- /binや/usr/bin以下に不明なファイルが多数できている

```
-rwxr-xr-x  1 root root      0  1月 29 13:50 2019 barepswq
-rwxr-xr-x  1 root root 278528  1月 29 13:50 2019 zxotxe
-rwxr-xr-x  1 root root 487424  1月 29 13:50 2019 hqzejsnyveoqm
-rwxr-xr-x  1 root root      0  1月 29 13:50 2019 aljkkbgj
-rwxr-xr-x  1 root root      0  1月 29 13:50 2019 resylbr
-rwxr-xr-x  1 root root      0  1月 29 13:50 2019 jhzagsci
-rwxr-xr-x  1 root root 155648  1月 29 13:50 2019 hlisfkbmaqyjsj
-rwxr-xr-x  1 root root 217088  1月 29 13:50 2019 bsxjjfyopeza
-rwxr-xr-x  1 root root  12288  1月 29 13:50 2019 mdvzstmhkiob
```
- /etc/ini.d以下も同様だったり

```
-rwxr-xr-x  1 root root   323  1月 29 13:25 2019 ykaswyskkm
-rwxr-xr-x  1 root root   343  1月 29 13:31 2019 jfmwrnnctkg
```

- /etc/cron.hourly/gcc.sh が勝手に生成されている

```
[root@localhost ~]# cat /etc/cron.hourly/gcc.sh
#!/bin/sh
  PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/X11R6/bin
  for i in cat `/proc/net/dev|grep :|awk -F: {'print $1'}`; do ifconfig $i up& done
  cp /lib/libudev.so /lib/libudev.so.6
  /lib/libudev.so.6
```

- /etc/crontabに勝手に追記されている

```
*/3 * * * * root /etc/cron.hourly/gcc.sh
```

## とりあえずやること

- /lib/libudev.so.6, /lib/libudev.soの削除
- /etc/cron.hourly/gcc.sh の削除
- clamscanのインストールと実行  →[検索](https://qiita.com/search?q=clamscan)
- clamscanのインストールが終わったらLANケーブルを外すか /etc/resolve.conf のnameserver をコメントアウトして外部に悪影響を及ぼさないようにする

```
[root@localhost ~]# /usr/bin/clamscan  --infected --remove --recursive /bin
/bin/sypkjtdjssjyzp: Unix.Malware.Agent-1696011 FOUND
/bin/sypkjtdjssjyzp: Removed.
/bin/ufrpaoflslie: Unix.Malware.Agent-1696011 FOUND
/bin/ufrpaoflslie: Removed.

----------- SCAN SUMMARY -----------
Known viruses: 6785903
Engine version: 0.100.2
Scanned directories: 1
Scanned files: 421
Infected files: 2
Data scanned: 51.68 MB
Data read: 96.56 MB (ratio 0.54:1)
Time: 16.545 sec (0 m 16 s)
```
まずは clamscan に頑張ってもらうが
ファイルは復活するので基本的な対策にはならない。

## さらに
### /etc/rc.d書き込み保護
```
[root@localhost ~]# find . -type l -name "K90*" -o -name "S90*" |grep -v crond|xargs rm -f && chattr -R +i /etc/rc.d/
```

### 同様に/lib以下も

```
[root@localhost ~]# rm -f /lib/libudev.so && chattr +i /lib
```

### 同様に保護
```
[root@localhost ~]# chattr -i /lib64 /bin /sbin /usr/sbin /usr/local
[root@localhost ~]# chmod 000 /etc/crontab
```
### AVG もインストールしておく
[Linux版 AVG インストール](https://qiita.com/dicek_nicno/items/6636e517076180d1ed73)

/etc/crontab 設定の例

```
# anti virus
0 2 * * * root /usr/bin/avgupdate > /var/log/avgupdate.log 2>&1
0 5 * * * root /usr/bin/avgscan /bin /home /lost+found /misc /net /proc /sbin /srv /var /tmp /boot /etc /lib /opt /root /selinux /sys /usr --report=/root/avg_report.txt > /var/log/avgscan.log 2>&1
```

### 最後に
- 不明なプロセスが動いていない、/lib/libudev.so が存在しない、/etc/cron.daily 以下が無事なのを確認する
- /bin, /usr/bin, /etc/init.d 以下の怪しそうなファイルは地道に削除
- 大丈夫そうになったらLANケーブルを繋ぐ
- ls や ps といったコマンドの内容を書き換えるものもあるので注意
PuTTYで鍵認証を使う

## やりたかったこと。

- SSHで鍵認証を使ったログイン
- パスフレーズ付きの鍵
- クライアントは Windows/PuTTY


## ハマった流れ。

PuTTYgenで作成するも、

```console
Unable to use key file (OpenSSH SSH-2 private key (old PEM format))
```

で認証失敗。

ssh-keygenで作成した秘密鍵をPuTTY形式に変換すると良いと判明したので、試みるも

```console
Couldn't load private key (unrecognised cipher name)
```

PuTTYgenで読み込めず。


WinSCPに付属のPuTTYgenが良いと古い情報を見つけたが、PuTTYとWinSCPのどちらのPuTTYgenもバージョン同じでした。


## 原因。

すごく単純、、、
ssh-keygenで作成した鍵はパスフレーズを指定していたため、PuTTYgenで読み込めないエラーでした。


## 作成手順。

###### 1. 鍵を作成する。

```bash
ssh-keygen -t rsa -b 4096
```

###### 2. 秘密鍵のパスフレーズを削除

```bash
ssh-keygen -p '秘密鍵'
```

###### 3. PuTTYgenで変換

メニューからインポートした後に、
![PuTTYgen.png](https://qiita-image-store.s3.amazonaws.com/0/351480/46fcffa1-75c8-eb6a-379f-372a8a4ade19.png)
パスフレーズをPuTTYgenで再設定して、[Save private key]で出力します。

###### 4. 公開鍵の登録

ssh-keygenで作成した公開鍵をサーバーに登録します。

```bash
cat '公開鍵' >> authorized_keys
```
OPTUNAを使ってみる

話題のOptunaを使ってみました。PFNのハイパーパラメータ最適化ソフトウェアです。

https://github.com/pfnet/optuna/blob/ccc9f479a276c48437d52154655b60d5c3ec5f96/docs/source/index.rst

もともとは機械学習などのパラメータ最適化用とのことですが、汎用性があるようで、CAEなどの形状パラメータ最適化にも使えそうです。

※ トポロジー最適化とか組み合わせ最適化は適用可能かどうか、もう少し調べてみます。

# 導入方法（python3）

導入は極めて簡単でした。python2系列にも対応しているようですが、python3で使うことにします。

方法１) Gitでダウンロード＆インストール

```
$ git clone https://github.com/pfnet/optuna.git
$ cd optuna
$ sudo python3 setup.py install
```

方法２）PIPでインストール。

```
$ pip3 install git+https://github.com/pfnet/optuna.git
```

# 最適化の例1：単目的関数の最適化
```
import numpy as np
import optuna

def objective(trial):
   x = trial.suggest_uniform('x', -1, 1)
   y = trial.suggest_uniform('y', -1, 1)
   return -10**(-(x-0.1)**2)*10**(-y**2)*np.sin(5*x)*np.sin(3*y)

study = optuna.create_study()

study.optimize(objective, n_trials=200)

print(study.best_params)
```

# 最適化の例2:多目的関数の最適化
とここまで書いてきてなんですが、複数の目的関数や制約条件ってとれるのかな。
公式ドキュメントには、それらしい解説がないようです。
設計空間の定義は、一通りそろってるようですが...。
BitbucketからGithubへ移行する場合

##初めに
移行法は非常に簡単です。

Githubのタブから以下の部分を選択肢し
<img width="219" alt="スクリーンショット 2019-01-29 20.51.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/319723/a3505067-a8f0-9454-3bec-3a4c7801348a.png">

BitbucketのレポジトリURLをここに貼り付けしましょう。
<img width="666" alt="スクリーンショット 2019-01-29 20.52.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/319723/5ac98d60-9928-0150-8cd1-590c639b2e11.png">

##リモート先の変更

現在のリモート先を確認し

```
$ git remote -v　　//Bitbucketのリモート先になっていると思います
```

Gitのレポジトリにリモート先を変更しましょう。

```
$　git remote set-url origin https://github.com/〜/〜.git
```

##最後に

git　pushを行うとこのようになる場合があります。

```
$　git　push
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'c:\tmp\gittest\test'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```

自分がリモートの変更をpullしてから、pushするまでの間に、他からのpushがあるなどしてリモートが変更されている状況になっているので、エラーメッセージが教えてくれているように、あなたのブランチの先端はリモートのより後ろになっています。


- 対応方法 1） とりあえず git pull する

```
$ git pull
```

自動的にマージされて、これでpushできる状態になる


- 対応方法 2）fetch して merge する

```
$ git fetch    （リモートの変更を取ってきて）
$ git merge origin/master    （マージする）
これも上と同じような結果になる。
```

- 対応方法 3）fetch して rebase する
rebase で、リモートの変更の後に自分の変更を持ってくることもできる。

```
$ git fetch    （リモートの変更を取ってきて）
$ git rebase origin/master
```

- 対応方法 4）pull –commit や pull –rebase する
これでも何とかなるようだが、無理してpullコマンドを使わなくてよい。

fetchとmergeとrebaseで何とかなると思います。
Random.ints()をdistinct()+parallel()に繋ぐと動かなかった

# Random.ints()の戻り値のIntStreamをdistinct()とparallel()に食わすと戻ってこなくなる。

下のようなJavaのプログラムを動かすと、なぜか8つの数字が出力された時点で止まってしまった戻ってこなくなります。

```
serial
2
1
0
3
parallel
3
0
3
2
parallel + distinct ←ここで止まって戻ってこない。
```

#　問題のコード

distince()とparallel()を同時に使うときだけ問題が発生するようです。

```java
import java.util.*;
public class testParallel {
    //sequential
    static void printRandom(){
        Random rint = new Random();
        rint.ints(0,4)
            .distinct()
            .limit(4)
            .forEach(System.out::println);
    }
    //parallel
    static void printRandomParallel(){
        Random rint = new Random();
        rint.ints(0,4)
            .limit(4)
            .parallel()
            .forEach(System.out::println);
    }
    //parallel+distinct
    static void printRandomParallelDistinct(){
        Random rint = new Random();
        rint.ints(0,4)
            .distinct()
            .limit(4)
            .parallel()
            .forEach(System.out::println);
    }
    public static void main(String[] args){
        System.out.println("serial");
        printRandom();
        System.out.println("parallel");
        printRandomParallel();
        System.out.println("parallel + distinct");
        printRandomParallelDistinct();
    }
}
```

# 対策

自前でIntStreamを生成したらうまく動いたというお話でした。
理由は良くわかりません。

```java
import java.util.*;
import java.util.stream.*;
public class testParallel2 {
    static void printRandomParallel(){
        getRandomStream(4)
            .distinct()
            .limit(4)
            .parallel()
            .forEach(System.out::println);
    }
    static IntStream getRandomStream(int max){
        PrimitiveIterator.OfInt p = new PrimitiveIterator.OfInt(){
            Random r = new Random();
            @Override
            public boolean hasNext(){
                return true;
            }
            @Override
            public int nextInt(){
                int ret = r.nextInt(max);
                return ret;
            }
        };
        Spliterator.OfInt sp = Spliterators.spliteratorUnknownSize(p,0);
        IntStream ints = StreamSupport.intStream(sp,false);
        return ints;
    }
    public static void main(String[] args){
        printRandomParallel();
    }
}
```
### 結果

```
1
3
2
0
```

## 動作環境

```
java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)
```
VS Code の設定をデバイスごとに分ける - Settings Sync

Visual Studio Code の拡張機能 Settings Sync は Gist を経由して複数デバイスの設定を同期することができる便利なものですが、Ubuntu の VS Code と macOS の VS Code では分けたい設定もあると思います。

例えば MacBook Pro と Ubuntu Desktop の間で VS Code の設定を共有した場合には、画面サイズが異なるでしょうから `editor.fontSize` を共有したくないこともあります。

この記事では Visual Studio Code の拡張機能 Settings Sync で特定の設定を共有せずにデバイスごとに設定する方法を解説します。


## 設定方法

Gist で共有されない `syncLocalSettings.json` の中にある `replaceCodeSettings` で共有したくない設定項目を書き換えます。


## syncLocalSettings の保存場所

- [Settings Sync - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync)

上記のページによると、各 OS における `syncLocalSettings` の保存場所は次のようになっています。

- Windows: `%APPDATA%\Code\User\syncLocalSettings.json`
- macOS: `$HOME/Library/Application Support/Code/User/syncLocalSettings.json`
- Linux: `~/.config/Code/User/syncLocalSettings.json`


## 書き方

- [Code Settings Sync Customizable Sync](http://shanalikhan.github.io/2017/02/19/Option-to-ignore-settings-folders-code-settings-sync.html)

例えば macOS のフォントサイズを `14` に指定したい場合は以下のように書きます。

```diff
- "replaceCodeSettings":{}
+ "replaceCodeSettings":{"editor.fontSize":14}
```

Ubuntu の方は画面が大きいのでフォントサイズは `16` で使いたいとします。

```diff
- "replaceCodeSettings":{}
+ "replaceCodeSettings":{"editor.fontSize":16}
```


## 変更の確認

`syncLocalSettings.json` を保存した後に `Sync: Download Settings` を実行します。そして、`settings.json` を確認すると、

macOS では

```
{
    "window.zoomLevel": 0,
    "editor.fontSize": 14,
}
```

Ubuntu では

```
{
    "window.zoomLevel": 0,
    "editor.fontSize": 16,
}
```

となっており、それぞれのデバイスでそれぞれの設定が反映されていることが確認できます。
JSONファイルにdatetimeとか保存したいやん？

# 前置き

Pythonの標準ライブラリ`json.dump`は、辞書型のオブジェクトの内容をそのまま保存でき、仕事でも重宝しています。
しかし難点があって、扱えるのは

* 数値型
* 文字列型
* リスト型
* 辞書型

といった基本型のオブジェクトだけであり、datetimeオブジェクトなど時刻の情報をJSONファイルに保存するときは

```python
record_time = datetime.now()
obj = {
    'RecordTime': record_time.strftime('%Y%m%d-%H%M%S')
}
...
```
のように一度文字列に変換しないといけないし、
JSONファイルからdatetimeオブジェクトを生成するときも　

```python
obj['RecordTime'] = datetime.strptime(obj['RecordTime'], '%Y%m%d-%H%M%S')
```

っていちいち変換しないといけないし、不便だなぁ。

そう思っていた時期が、僕にもありました。

# そんなあなたに`JSONEncoder`

そんなある日、[jsonモジュールのドキュメント](https://docs.python.org/3/library/json.html?highlight=jsondecoder#module-json)を眺めていたら、見つけました。
これを使えば、datetimeなどのオブジェクトと、文字列や数値との変換を`json.dump`を実行する時に同時に実行してくれるそうです。

たとえば、

```
record = {
    "singleTimestamp": datetime.datetime(2019, 1, 29, 19, 29, 2, 234680),
    "listedTimestamps": [
        datetime.datetime(2019, 1, 29, 19, 57, 2, 234693),
        datetime.datetime(2019, 1, 29, 19, 47, 2, 234695),
        datetime.datetime(2019, 1, 29, 19, 37, 2, 234697)
    ],
    "nested": {
        "timestamp": datetime.datetime(2019, 1, 29, 19, 31, 2, 234689)
    }
```

こんなデータをJSONに保存したいと思ったら、

```python
from json import JSONEncoder
class DatetimeJSONEncoder(JSONEncoder): # JSONEncoderを継承させる
    
    def default(self, o):
        if type(o).__name__ == 'datetime':     # 値がdatetime型だったら、
            return o.strftime('%Y%m%d-%H%M%S') # 文字列に変換して返す
        else:
            return o
```

のように`JSONEncoder`を継承する形で新しいクラスを定義し、`default()`メソッドに、エントリーのtypeとその変換の仕方を対応させて書いて、

```python
with open('jsonencodertest.json', 'w') as fp:
    json.dump(record, fp, indent=2, cls=DatetimeJSONEncoder)
```

と、`cls`引数にそのクラスを指定してあげれば良いだけです。

# 最後に

やっぱドキュメント読むって大事ですね。
【Unity】UIの色を変更する【uGUI】

こんにちは、電車君です。
今回は、Unityで**UIの色を変更する方法**を紹介します。

```
Mathf.Abs(Mathf.Repeat(Time.time, 2f) - 1f);
```
この記事ではこのコードを使って、時間に対してアルファ値を変更してみたいと思います。
ちなみに、**Time.time** で取得できる値は**ゲーム開始からの秒数**です。
https://docs.unity3d.com/jp/current/ScriptReference/Time-time.html

**追記: Time.time は、 Time.timeScale に影響されるため、
影響されない値を使いたい場合は Time.unscaledTime を使ってください**

# Graphic.color (Text.color など) を設定する
描画機能を持つuGUIのコンポーネントには、Graphicクラスを継承しています。

Graphicにはcolor変数があり、それを変更することで色を設定する事ができます。

color変数はColorクラスです。
Colorはr,g,bの三原色とaのアルファ値でできており、それらを設定することができます。
https://docs.unity3d.com/ja/2017.4/ScriptReference/Color.html

```
using UnityEngine;
using UnityEngine.UI;

public class Blinker : MonoBehaviour
{

    public Graphic r;

    void Update()
    {
        var c = r.color;
        c.a = Mathf.Abs(Mathf.Repeat(Time.time, 2f) - 1f);
        r.color = c;
    }
}
```

これで2秒周期でフェードさせることができます。

# CanvasRenderer.SetColor, CanvasRenderer.SetAlpha を使う
実はもっと簡単な方法があります。
Colorでは変数の値をコピーする必要がありますが、
こちらではたった一行で設定することができます。

CanvasRendererは描画機能を持つコンポーネントを表示するために、
必ず付けられているコンポーネントです。
![2ecbb62e8450840cf3987ee15c79fd08.png](https://qiita-image-store.s3.amazonaws.com/0/236865/e8d52b37-35ba-3bde-ec10-fe766415ae0a.png)


```
using UnityEngine;

public class Blinker : MonoBehaviour
{

    public CanvasRenderer r;

    void Update()
    {
        r.SetAlpha(Mathf.Abs(Mathf.Repeat(Time.time, 2f) - 1f));
    }
}
```

今回は以上です。
バグなどは検証していませんので、
他に方法などがありましたら教えてください。
THML　CSSの基本の書き方

こんにちは!
プログラミング初心者のめいです！:relaxed:

昨日から学んでいる、プログラミングの超基本事項、HTMLとCSSの基本的な使い方について書いて行きます！

□HTML
HTMLとは……ウェブページの要素や構造を指定するための言語。
＊HTMLの使いかた
HTMLはタグでできている！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/350441/6335c7e1-d800-4036-eebf-6da0038758f8.png)

<>の中身によって画像やリンクを張ることができます。

a href="url" ←リンクを表せる
img src="URL"　←画像を表せる
ul li ←リスト化できる




□CSS
CSSとは……HTMLで作った構造にカラーやデザインを付け加え、装飾するための言語。

*CSSの書き方
![image.png](https://qiita-image-store.s3.amazonaws.com/0/350441/a5865363-45ea-61dc-a614-0dedb71f6676.png)

HTMLで用意した要素に対して、CSSを用いてでは「どこの」「何を」「どうする」を作ります。
上の図では、h1の(どこの)color(何を)#ff0000(どうする)となります。

「何を」に当たる部分はプロパティと呼ばれ次のようなものがあります。

＊プロパティ一覧
color 色
font-size　フォントサイズ
background-color　背景色
width　幅
height　高さ


本日はHTML、CSSの超基本事項について書きました!
ありがとうございました。
AndroidでTermuxを使いroot化なしでLinux環境を作る！

「Androidからも、Gitをいじりたい！」
「X11環境を作って使い慣れたテキストエディタを使いたい！」
それを実現させるものがあります。
それが**Termux**。
デベロッパの間では人気を誇る、root化要らずのエミュレーターです。


# Termuxの入手
TermuxはGoogle Playストアから入手できます。
https://play.google.com/store/apps/details?id=com.termux

インストールできると、一見普通の端末が開きます。
![Screenshot_2019-01-29-20-16-05.png](https://qiita-image-store.s3.amazonaws.com/0/196404/8f830bd7-f47d-d3bd-a624-fdee476ebc02.png)
# Termuxの特徴
「なんだ、よくある端末エミュレーターじゃん」と思った方は必見です。
Termuxは**Linuxのパッケージをインストール、利用**することができます。
ここが一つの魅力です。
パッケージ管理システムはDebian系でおなじみのAPTです。
※別途ArchLinuxのpacmanに切替可能です

# X11環境を作る
Termuxでできることはたくさんあります。今回はその一つを紹介します。
それは、**VNCサーバーを動かせる**ということです。
今まで、X11を利用するにはAndroidでも動くようにしたMODが必要でしたが、不要です。

```
$ pkg install x11-repo tigervnc pypanel xorg-xsetroot nano man xterm
```

Termux上でpkgコマンドを実行してパッケージをインストールします。
※pkgコマンドはaptコマンドのラッパーコマンドです。

インストールできたら

```
$ vncserver
```

で、セットアップします。

```
You will require a password to access your desktops.

Password:
Verify:
Would you like to enter a view-only password (y/n)? n
```

パスワードを設定するよう求められますので、2回パスワードを入力します。
最後に聞かれる質問に対しては「n」と答えます。

次にデスクトップ環境を設定します。

```
$ nano ~/.vnc/xstartup
```

nanoでVNCの環境設定ファイルを開きます。

ファイルの末尾に

```bash:~/.vnc/xstartup
openbox-session &
pypanel &
```

Ctrl+Oで保存し、Ctrl+Xで終了します。

これでセットアップできました。

VNCを起動します。

```
$ vncserver :1 -geometry 1280x800 -depth 24
New 'localhost:1 ()' desktop is localhost:1

Creating default startup script /data/data/com.termux/files/home/.vnc/xstartup
Creating default config /data/data/com.termux/files/home/.vnc/config
Starting applications specified in /data/data/com.termux/files/home/.vnc/xstartup
Log file is /data/data/com.termux/files/home/.vnc/localhost:1.log
$
```

これでVNCサーバーが起動しました。
次にクライアントアプリで接続します。
アプリは、RealVNCでもなんでも構いません。

|Name|Value|
|-------|--------|
|接続先アドレス|localhost:5901|
|パスワード|先程設定したパスワード|

これをもとに接続します。
パスワードは接続時に求められる場合もあります。

うまく設定できているなら、接続できるはずです！
![Screenshot_2019-01-29-20-42-35.png](https://qiita-image-store.s3.amazonaws.com/0/196404/9ebb537e-be27-3505-60f5-ad1793d754f5.png)

他に、Wireshark(パッケージ名: wireshark、コマンド名: wireshark-gtk)、Geany(パッケージ名/コマンド名：geany)をインストールすることもできます。

![Screenshot_2019-01-27-22-35-48.png](https://qiita-image-store.s3.amazonaws.com/0/196404/c1fb63bb-83d8-9ae1-0f25-d0f212c933b6.png)


その他情報は、[Termux公式Wiki（英語）](https://wiki.termux.com/wiki/Main_Page)で入手できます。
GAE/GOの次世代ランタイムgo1.11に移行したときのメモ

最近GAEのバージョンをgo1.11にアップデートしたのでそのときのメモ

# なぜgo1.11に移行したか
[GAE/GO(1.9) Standard から Cloud PubSubに秒間15000件パブリッシュしようとして色々ハマった話](https://qiita.com/munaita_/items/643008f37ade4777c6e8)でも書いたように、go1.9を使っていたためにGAEのfetchURLの制限にひっかかってました。それを解決するために、リクエストをメモリ上にキャッシングするような実装をしていました。実は、このpubsubを使った実装への移行によりGAEの料金が3割程度あがってしまったという問題があり、その原因としてこのキューに詰め込む処理が怪しいという仮説を立てていました。

今回、go1.11へ移行し、シンプルな実装に戻して料金がどうなるかを検証するために移行を行いました。

# あ、うちもgo1.9 -> go1.11に移行したほうがいいの？
まだgo1.11はベータ版ですし、go1.9で問題なく動いているなら必要ないとは思います。
新規で作る場合はgo1.11がよさそうです。

[App Engine Standard Go 1.9 migration to Go 1.11](https://github.com/gcpug/nouhau/tree/master/app-engine/note/gaego19-migration-gaego111)

# やったこと
箇条書きするとこんな感じでした。

- goのバージョンを1.11にする
- app.yamlを書き換える
  - `runtime: go` -> `runtime: go111`に
  - `script: _go_app` -> `script: auto`に
- main.goの変更
  - package名をmainに
  - init() -> main() に
  - appengine.Main() を追加
     - これないと`dev_appserver`起動時に`connection error`発生した
- デプロイできるようにディレクトリを調整([※1](https://qiita.com/munaita_/items/01117ad2cc4778f65f42#%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%82%92%E8%AA%BF%E6%95%B4))

基本、公式マニュアル通りにやればだいじょぶです。
[Migrating your App Engine app from Go 1.9 to Go 1.11](https://cloud.google.com/appengine/docs/standard/go111/go-differences)

こちらも、日本語でわかりやすかったです。
[GAE/Go アプリケーションを Go 1.11 に移行するためにやったこと](https://blog.a-know.me/entry/2018/10/28/215508)


# Gcloud SDK と GAE SDK for GO
GAEを取り扱うコマンドラインツールは[Gcloud SDK](https://cloud.google.com/sdk/docs/?hl=ja)と[GAE SDK for GO](https://cloud.google.com/appengine/docs/standard/go/download?hl=ja#previous-sdk)の2つあります。
現在はGcloud SDKが推奨のようです。弊システムでもGcloud SDKを使っています。


# depとglide
Goのパッケージマネージャには[dep](https://github.com/golang/dep)と[glide](https://github.com/Masterminds/glide)があります。glideのリポジトリをみるとdepへの移行を推奨しているようなので、depを使ったほうがよさそうです。
弊システムではglideを使っていたので引き続きglideを使います。

# デプロイできるようにディレクトリを調整
`gcloud deploy` しようとしたらパッケージのimportパスが見つからないエラーが出ました。
すべての実装ファイルを `GOPATH/src` 以下に配置したら動くようになりました。

↓こんな感じ

```
GOPATH/
  - bin
  - pkg
  - src
    - main
      - main.go
      - app.yaml
    - hoge
      - hige.go
    - fuga
      - foo.go
    - glide.lock
    - glide.yaml
    - vendor
      - github.com/...
      - google.golang.org/...
```

sonatardさんのサンプルを参考にさせてもらいました [sonatard/appengine-go-migrate-2nd-gen-sample](https://github.com/sonatard/appengine-go-migrate-2nd-gen-sample)。glideも`GOPATH/src/`以下で `glide update`すれば普通にパス通るので便利です。

go1.11のディレクトリに関する公式ドキュメント
[structuring_your_files](https://cloud.google.com/appengine/docs/standard/go111/go-differences#structuring_your_files)
[gopath](https://cloud.google.com/appengine/docs/standard/go111/go-differences#gopath)

# で、課金額はどうなった？
go1.11にあげて、実装をシンプルなものに戻したところ、課金額が3割ほど下がりました。作成インスタンス数は前バージョンからあまり変わっていないのですが、有効インスタンス数が下がったのが大きかったと思います。前バージョンでは作成インスタンス数が有効インスタンス数と同数になってしまっていました。これは、普通ではありえないと思います。おそらく、ログのロストを避けるために長い時間リクエストコネクションはるような実装をしていたので、そのあたりが悪さをしていたと考えています。

※ go1.9 -> go1.11になれば料金が安くなるという意味ではありません。

[GAE(AppEngine)ダッシュボードのインスタンス（作成、有効、課金インスタンス推定）について](https://qiita.com/mokrai/items/fcd68f35fa59f2eaefd3)
UITableViewにて、セルの高さを画面へ描画後に変更する

## 概要

- `UITableView.rowHeight = UITableViewAutomaticDimension` が諸事情によりされていない or できないテーブルビューのお話
- 描画後なので、UITableViewDelegate
のメソッド`tableView(_:heightForRowAt:)` はすでに走った後に該当セルについて高さを変える方法
- 既存のソースコードで上記を実現するため、`UITableView.reloadData()`が呼ばれていたのを止めるために試行した内容と結果のメモ

## セルの高さを変更したときに画面へ反映する処理

### 差し替え前
```swift:ViewController.swift
tableView.reloadData()
```

### 差し替え後
```swift:ViewController.swift
if #available(iOS 11.0, *) {
    tableView.performBatchUpdates(nil, completion: nil)
} else {
    tableView.beginUpdates()
    tableView.endUpdates()
}
```

`beginUpdates()`と`endUpdates()`が将来的に非推奨になるらしいコメントが記載されていたので、`performBatchUpdates(_:completion:)`を引数空で呼ぶ形。
iOS11以上のみのサポートの場合は、elseスコープの処理は不要。

### セルの高さを変更する処理の中身
- セル内で画像URLから実際に画像取得完了後、画像の縦横比を計算
- UIImageViewの縦横比率について、デフォルト値（4:3）でなければNSLayoutConstraintの設定を差し替え
    - この処理を行う先がUITableViewCellでなければ変更完了後に`updateConstraints()`などを呼んであげると素直に反映されるはずという内容

## 結論に至るまでに試したこと
### 該当セルにて`reloadRows(at:with:)`を呼ぶ
高さ以外の要素を変更したい場合はこの処理だけでいけるはずだが、変更後の高さは反映されず。

### `beginUpdates()`と`endUpdates()`の間にレイアウト更新処理を挟む
`performBatchUpdates(_:completion:)`では、１個目の引数に完了後に表示を更新したい処理をクロージャで渡す処理と同等。

`updateConstraints()`辺りが必要だろうと入れてたのだけど、上記の差し替え後の挙動と何ら変わらず。
少なくとも今回のパターンでは必要なく、本来の用途？（該当セルのリロード・削除など）ではこの対応が必要。

## 参考

[StackOverflowの「How to dynamically resize UITableViewCell height」の回答の１つ](https://stackoverflow.com/a/4692563)
Lightning Web Components（開発環境）

Lightning Web Componentsの開発には、Visual Studio CodeおよびSalesforce CLIのセットアップが必要。

###Visual Studio Codeのセットアップ手順

1 . Salesforce CLIの導入

Lightning Web Components の作成/デプロイには Saelsforce CLIが必要

[Mac用](https://sfdc.co/sfdx_cli_osx)
[Windows用 64bit](https://sfdc.co/sfdx_cli_win64)

インストーラーをダウンロードして実行する。インストール後にコマンドプロンプトを立ち上げて、下記のコマンドを入力して、salesforcedxプラグインを導入する。

`sfdx plugins:install salesforcedx@pre-release`

最後に確認のために下記のコマンドを入力する。

`sfdx plugins`
<img width="378" alt="Screen Shot 2019-01-29 at 21.11.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/161463/31e74e05-e68c-9dd0-5bf3-4f8e02ef9f0e.png">


2 . Visual Studio Codeの最新版をインストールする

https://code.visualstudio.com/

3 .  Visual Studio Codeを立ち上げて、下記のExtensionを導入する

- Salesforce Extension Pack
- Lightning Web Components
- ESLint

<img width="606" alt="Screen Shot 2019-01-29 at 21.17.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/161463/df03dcc4-9d34-5283-2ccf-a0ace8f3f3fb.png">

環境のセットアップが完了したら、Salesforce CLIコマンドを使ってプロジェクトを作成し開発を行う。CLIコマンドはコマンドプロンプト以外にもVisual Studio Code上からも実行可能（Macでは Command+Shift+P）。

[Salesforce CLIコマンド（開発用）](https://qiita.com/TaigarAndDragon/items/e25fff8d032abfbf5144)

注意；Lightningコンポーネントの開発を行う組織では、キャッシュの無効化とデバッグモードの有効化を必ず行っておくこと。設定手順については[こちら](https://qiita.com/TaigarAndDragon/items/3a7f4d716b147fcec4a7) を参照。
Vuetifyを使用事例のご紹介

Vueを使うならとVuetifyをつかうことになった。BootStrap4を当初想定していて戸惑うことなどもありつつ、
便利なコンポーネントに溢れる便利さもあり。
色々とご紹介。

####導入
こちらは非常に簡単。下記を参考に。
https://vuetifyjs.com/ja/getting-started/quick-start


####レイアウト
GridレイアウトなのでBootStrapをご使用の方なら戸惑うことなく取り込めるかと。
marginやpaddingなども属性として用意されているコンポーネントがあってこちらもBootStrapと同等。
ただ、classで使用しないといけないコンポーネントもあるので、注意が必要。


####使用したコンポーネント
※徐々に書き足していく予定。

[button](https://vuetifyjs.com/ja/components/buttons)
よく使用した属性は`small`。ボタンでもなんでも大きめなので基本的に小さくして、
`disabled`でボタン制御。枠内いっぱいに広げる場合は`block`を使用。

[dialog](https://vuetifyjs.com/ja/components/dialogs)
spinnerや確認画面を出す際に便利。`persistent`で枠外をクリックしても閉じないようにできる。

[panel](https://vuetifyjs.com/en/components/expansion-panels)
アコーディオンパネル。`expand`を使用してほかのパネルが開いたら閉じることができる。

[table](https://vuetifyjs.com/ja/components/data-tables)
ページネーションが組み込まれたテーブルを簡単に作成できる。ページの表示件数もプルダウンで指定可能。
`headers`の幅は%表示にしないと効かない。
`hide-actions`で件数表示とページネーションを無効にできる。
リストの件数だけを消したい場合は、`rows-per-page-items`と`rows-per-page-text`を空に設定する。
ただし、警告が出る。
`select-all`で全件チェックのチェックボックスがヘッダー項目に設定できる。
ただし、チェックする処理は自前で用意する必要あり。
modelにバインドとしたリストにチェックした値が設定される。
tr単位でクラスを設定したい場合、vueのbindを使用できるが、1番最初のレコードだけクラスが適用されない場合があったら、trの属性に`:key="index"`などとやると解決するかも。

[stepper](https://vuetifyjs.com/en/components/steppers)
決済処理のような画面を構築できるコンポーネント。

[tab](https://vuetifyjs.com/en/components/tabs)
タブを構成するのに使用するコンポーネント。

[toolbar](https://vuetifyjs.com/en/components/toolbars#toolbar)
ヘッダーのメニューを構成するようなコンポーネント。
レスポンシブでメニューを変えたい場合はクラス`hidden-sm-and-down`などの設定に合わせて表示の制御を行う。
Three.jsでハイポリ化、ローポリ化。その２

#概要

Three.jsでハイポリ化、ローポリ化して見たが、現バージョンで動かなくなったので、対応した。

#写真
![p.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/b72d6857-4cc1-b3c4-90a1-04e67a3794b3.jpeg)


#ハイポリ化。

http://jsdo.it/ohisama1/sm2F

#ローポリ化。

http://jsdo.it/ohisama1/cx51

以上。
cloud watch logs ,cloud watch,cloud watch events ,cloud trail   それぞれの違いとは 


## 記事の目的
自分の覚書

## cloud watchについて
- EC2
- EMR
- EBS
- S3

の監視が可能。
しきい値、検知間隔の設定を行い、アクションの設定を行うことが可能。
※quicksightは連携なし

**「カスタムメトリクス」**を用いるとメトリクスにて収集されない項目を管理することが可能。

監視項目としては

- cpu使用率
- ロードアベレージ✖︎
- メモリ使用率✖︎
- swap使用率✖︎
- ディスク使用率✖︎
が確認できる。

✖︎をつけた項目はEC2にログインしてリソース情報取得スクリプトをインストールし、
カスタムメトリクスの登録が必要。

##cloud watch logsについて
各インスタンスにエージェントのインストールが必要だが、アプリ内でのエクセプションなどのログが出力された際の検知が可能となる。
メトリクスフィルタを作成し、該当するパターンマッチを検出する仕組みを作成し、
それに対応するアクションをcloud watchで設定することでメールを飛ばしたりが可能。

※pythonでも検知可能


##cloud watch eventsについて
検出したイベントに基づいてSNSやLambdaと連携ができるサービス

イベントソースとして
ec2やs3にデータが置かれたときみたいな形でせって

ターゲットとして
SNSやステップファンクション、ラムダを設定可能。

##cloud trail
このサービスを使うことで、システムの安全性の観点から不正操作が発生しないようにするためのログを取得することも可能。
余談だが、quicksightとの連携については特に強力と思った
quicksight https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/logging-non-api.html
athena https://docs.aws.amazon.com/ja_jp/athena/latest/ug/monitor-with-cloudtrail.html
RailsでFont Awesomeを導入する際の注意点

# RailsにFont Awesomeを導入する方法
導入方法を調べると二つやり方が出てきました。

一つは gem 'font-awesome-rails'を導入する方法。
もう一つは gem 'font-awesome-sass'を導入する方法。

前者だと最新版のfont-awesome5に対応していないという記事を見つけました。
なので後者を導入したのですが、少しだけハマった為、共有いたします。

※参考にした記事
https://qiita.com/paudorino/items/d54348f6d48eefcee6c7

# 両者の違い

詳しい導入方法は別の記事を参考にしていただけたらと思います。
font-awesome-railsと、font-awesome-sassの違い
それはヘルパーメソッドです。

font-awesome-railsを導入すると
fa_icon, fa_stacked_iconの二種類のヘルパーメソッドが使用できます。
なのでfont-awesome-sassを導入してFontAwesomeを使用する場合は、
上記のヘルパーメソッドは使えないので気をつけましょうということです！！

# font-awesome-sassを導入した場合
こちらのコードだとしっかり表示されます。
他にもおそらくやり方はありますが、、、

```
<%= icon("fas", "star") %>
または
= icon("fas", "star")
```

先ほどのヘルパーメソッドを使用するとこのようなエラーが出ると思います。
undefined method `fa_icon'
GitHubのプルリクエストをチェックアウトする


自分のリポジトリに他の人がforkしたリポジトリからプルリクを送ってくれた際、マージする前にローカルにチェックアウトする方法です。

コードのチェックだけでなくビルドして動作確認したい時などに有効です。


```
git fetch origin pull/ID/head:BRANCH_NAME
git checkout BRANCH_NAME
```

*ID*はプルリクエストのID(#の後の数字）を入れます。
*BRANCH_NAME*にブランチ名を入れます。

プルリクしてくれた人のリポジトリ名を含めたり`remote add`する必要はありません。
MacでCommandキーを使った同時選択ができなくなった話

> Qiitaは、プログラミングに関する知識を記録・共有するためのサービスです。
> [Qiitaとは - Qiita](https://qiita.com/about)

プログラミングとは全く関係のない話を投稿すること、ご容赦下さい。
<font color="LightGray">~~は○な匿名ダイアリーにでも投げておけばいい話題かもしれない。~~</font>
情報をネット上で探しても出てこなかったので、もし誰か同様の事象に悩まされている人がいれば、と思い投稿します。

# 前提知識
マカーの皆さんにとっては常識的なことですが、MacではFinder等でCommandキーを押しながらファイルを選択すると、複数のファイルを同時に選択することができます。他にもShiftキーを押しながらファイルを2つ選択すると、その間にある全てのファイルを選択することができます。
Appleのサポートページにもそう書いてあります。

>- 複数の項目を選択する：Command キーを押したまま、項目をクリックします。
>- まとまってリスト表示されている複数の項目を選択する：最初の項目をクリックしてから、Shift キーを押しながら最後の項目をクリックします。間にあるすべての項目が選択範囲に含まれます。
>
>[Mac 画面の項目を選択する - Apple サポート](https://support.apple.com/ja-jp/guide/mac-help/select-items-mchlp1378/mac)

……特に新しいことではありません、はい。

# では何が起きたか
Commandキーを使ったファイルの同時選択ができなくなりました。地味に不便です。

## 解決策
- Finder上では"Command+Shift"キーを押しながらファイルを選択する
 - Commandキーを押してからShiftキーを押すと、Shiftキーによる誤連続選択を防げます
- Desktop上では"Shift"キーを押しながらファイルを選択する
 - Finder上同様に、"Command+Shift"キーを押しながらファイル選択でもOKです
 - Desktop上で連続したファイルを選択したい場合はマウスドラッグで対処します

## 原因
不明です。

# おしまい
以上です。ご清聴ありがとうございました。
<br>
<br>
<br>
---
……流石にふざけ過ぎかと思うので補足情報をば。

### 問題が起きたMacについて
- macOS Mojave バージョン 10.14.2
- MacBook Pro (Retina, 13-inch, Late 2013)
- 2.6 GHz Intel Core i5
- 16GB 1600 MHz DDR3

<font color="LightGray">~~この情報いる？~~</font>

### いつ頃から問題が発現？
あまり正確な記憶はありませんが、確かMojaveにアップデートした頃（2018年10月くらい）からだったと思います。

### 周囲のMacでは？
自分の周りに同じバージョンのMacを使っている人がいますが、彼／彼女らには同じ問題は発現していませんでした。ということはOSのバージョンアップなどのせいではなく、自分のMacの中にインストールされているアプリが悪さしているのかな？　と思った次第です。

### 悪さしている可能性があるアプリは？
自分はUSキーボードを使っているのですが、テキスト入力時に英語<-->日本語の切り替えを行うためにキーマッピングツールのKarabiner-Elementsを使用しています。

> Karabiner-Elements is a powerful utility for keyboard customization on macOS Sierra (10.12) or later. 
>[GitHub - tekezo/Karabiner-Elements](https://github.com/tekezo/Karabiner-Elements)

<font color="LightGray">~~GitHubのリンク貼るだけでプログラミングっぽい話題が出たって感じですね良かった良かった。~~</font>

Commandキーが効かなくなった→キーマップがおかしい？　ということでこのアプリがバージョンアップの影響で悪さしたのかなと思いましたが、このアプリを無効にしても改善は見られませんでした。
まあ元々Commandキーを使った他のショートカット（コピーペーストとか）は普通に動いていたので、これが悪いとはなかなか考えられませんよね……

### というわけで
原因については！！　なんの成果も！！　得られませんでした！！！（古い）

# まとめていないまとめ
根本的な解決には至っていませんが、代替策があることを今更ながらに知ったので良しとします。
<br>
<br>
<br>
---
###### さらにどうでもいい（一番プログラミングっぽい）話
最近O/penP/ose<font color="lightgray">（一応検索避け）</font>というライブラリを上記のMacで試してみたら、リ/アルタ/イム推/定<font color="lightgray">（検索避け）</font>で1.0fpsも出ませんでした。CPU版だとこれが限界のようですね……（後は精度を下げるしかない）
Windows 7からWINDOWS10へのアップグレード失敗 0x800f0955-0x20003 の対処方法

#概要
WINDOWS7からWINDOWS10にアップグレートした際に、エラー「0x800f0955 - 0x20003」が発生した場合の対処方法覚書です。

以下の記事を参考に対処しました。
https://www.jomebrew.com/2018/12/windows-7-to-10-upgrade-0x800f0955.html


##そもそもの操作（WINDOWS7からWINDOWS10へのアップグレード）

2019年10月現在、マイクロソフトが用意してくれているWINDOWS10へのアップグレードツールをダウンロードして実行することで
OSのアップグレードを実施することができます。これは、2016年に大々的にPRしていた無償アップデート期間を過ぎていても問題なく使用できるためまだアップグレードしていない人は対応を早めに実施したほうがいいです。
WINDOWS7は2020年1月14日にサポート切れとなることがアナウンスされています。

###ダウンロード
以下のサイトから「ツールをいますぐダウンロード」をクリックして
MediaCreationTool1909.exeをダウンロード
https://www.microsoft.com/ja-jp/software-download/windows10%E3%80%80

###実行
ダウンロードが終わったら、ダウンロードしたツールをつかってアップグレードすれば、1時間～2時間程度で
OSがWINDOWS10にアップグレードされるはずです。

##発生した問題
3台中1台で、以下のような問題が発生しました。
（2台は問題なくアップグレード完了）

ツールを実行すると、WINDOWS10に関するアップグレードのため
WINDOWS10 OSイメージのダウンロード➡展開用データの作成➡
WINDOWS10のインストール➡WINDOWS10の更新アップデート

と自動的に処理を実施してくれるのですが
最後のWINDOWS10の更新アップデートを実施途中に、

~~~
WINDOWS10はインストールできませんでした。
お使いのPCはWINDOWS10をインストールする直前の状態に戻りました。

0x800f0955 - 0x20003
INSTALL_UPDATES操作中にエラーが発生したため、インストールはSAFE_OSフェーズで失敗しました。
~~~

とエラーが発生し、WINDOWS7の状態に戻ってしまいました。


##対処方法
以下の方法で、正常にアップグレードすることができました。

###必要なもの
USBフラッシュメモリ（8GB以上）

###事前準備（USBフラッシュメモリにインストールメディアを作成）
１．USBメディアをWINDOWS用にフォーマットしておく。
２．MediaCreationTool1909.exeを実行する。
３．「実行する操作を選んでください」と表示したら「別のPCのインストールメディアを作成する」を選択し「次へ」
　　（USBフラッシュドライブ、DVD、またはISOファイル）を選択して実行。
４．「言語、アーキテクチャ、エディションの選択」画面になったら対象PCの情報に合わせて設定をして「次へ」
　　（デフォルトでは、ツールを起動したPCの環境に自動設定されています。）
５．「使用するメディアを選んでください」とメッセージがでたら、USBフラッシュドライブを選択して「次へ」
６．対象のメディアを選択して、「次へ」
７．USBにインストールが完了するまで1時間程度かかります。メディアが作成出来たら準備OKです。

###セットアップ作業
１．作成したUSBメモリを開きsetup.exeを実行
２．「更新プログラム、ドライバ、オプション機能の入手」がひらいたら、「今は実行しない」を選択して次へ
３．あとは通常通りセットアップを進めてください。正常にOSのアップグレードができるはずです。


##最後に
~~4回ほど、アップグレード失敗を繰り返したのですが~~
~~INSTALLメディアからのアップグレードを実行して~~
~~「更新プログラム、ドライバ、オプション機能の入手」を「今は実行しない」とすれば~~
~~インストールできたのでは？と思っています。が未検証です。~~

コメント欄に報告いただき、
「更新プログラム、ドライバ、オプション機能の入手」を「今は実行しない」でOKだったようです。
元記事にあったキャッシュデータの削除に関する記載は削除しました。

同じ問題に悩んでいる方の参考になれば幸いです。
Oracle Cloud Infrastructure(OCI) Database System のバックアップ

# Oracle Cloud Infrastructure(OCI) Database System のバックアップ注意点
Oracle Cloud Infrastructure(OCI)のDatabase Systemのバックアップについてわかったことがあるのでまとめました。  
[参考マニュアル](https://docs.cloud.oracle.com/iaas/Content/Database/Concepts/overview.htm)


## バックアップ対象
まずは、バックアップ対象について。  
通常、バックアップ対象として考えられるのはいくつかありますが、Database SystemはPaaSということもありバックアップ可能なものが限られています。

|項番|バックアップ対象|オンプレミスの場合|Database Systemの場合|→代替案|
|:--------------------------------------|:--------------------------------------|:--------------------------------------|:--------------------------------------|:--------------------------------------|
|1|システムバックアップ|取得を検討|取得不可能|変更内容を把握しておく(Ansibleとかも有)|
|2|製品領域|取得を検討|取得不可能|変更内容を把握しておく、同じバージョンが使用可能な必要有|
|3|DBのデータやアーカイブ、制御ファイル、spfile等|取得を検討|Cloud機能(RMAN)による自動取得|－|

上記、1と2に関しては要検討だがCloudの機能を使用して意識せずに取得可能な3について詳細な説明をしたいと思います。

## バックアップの機能概要
下記の内容をまとめています。  
[バックアップ参考マニュアル](https://docs.cloud.oracle.com/iaas/Content/Database/Tasks/backingup.htm)  
※自身で取得する場合は、色々と変更可能だが今回は自動バックアップ機能だけが対象。

|項目|内容|変更可否|
|:-------------------|:--------------|:-------------------|
|バックアップコマンド|RMAN|不可能|
|バックアップ場所|Object Storage|不可能|
|バックアップ方式|Incremental、毎週末にレベル0/毎日レベル1、30日前までの保持(RMANの設定のWINDOW OF 30 DAYS)|不可能|
|バックアップ時間|0～6時の間(そのRegionのTimezone)|可能！→★SRで依頼|


## その他注意点

* アーカイブログモードであること（デフォルトからそうなので変えることはないと思うが）
* /u01ディレクトリの容量に空きがあること
* .bash_profileにinteractiveなコマンドを入れない
* WALLET_LOCATIONは変更しない
* RMANのconfigに関して設定変更しない

## バックアップ時間の変更方法
上記の★にも記載の通り、SRでバックアップ変更方法が可能だ。
マニュアルには記載がないが、以下の項目をSRでは答える必要がある。 
 
- バックアップ開始時間
- Region
- TenancyのOCID
- DBが所属するCompartmentのOCID
- DBが所属するAD名
* Database SystemのOCID
* DatabaseのOCID

最初からこの情報を追記しておくことで、結構早く対応をしてくれる。
**また、JSTの〇時でという依頼でも対応してくれる。**
Rails で view から controller のファイルパスを得る方法

Rails 5.0.1 にて

```ruby
"app/controllers/#{controller.class.name.underscore}.rb"
```

# 仕組み
view では `controller` というメソッドで controller のインスタンスが取れる。

ので、それの class 名をとって ( `.class.name` )、ファイル名（拡張子なし）にするために `underscore` してみる。これにディレクトリと拡張子を追加することで、通常の命名規則でやっている限りは解決できる。

# 本当に `String#underscore` でいいのか

`AbsctractController::Base#controller_path` にて、下記のように 「"Controller" を消す && underscore にする」で実装されているので、これと同じようにやれば問題ないはず

```ruby
    def controller_path
      @controller_path ||= name.sub(/Controller$/, ''.freeze).underscore unless anonymous?
    end
```

https://github.com/rails/rails/blob/v5.0.1/actionpack/lib/abstract_controller/base.rb#L96-L98


# イマイチな点

* `app/controllers/` を決め打ちで書かなくてはいけない
* `.rb` を決め打ちで書かなくてはいけない

今のところ解消方法が見つかっていないです。
CircleCI のジョブから GitHub の Pull Request を作る

## やりたいこと

いろいろあって、CircleCI のジョブからプルリクエストを作りたい。

## やり方

`hub` コマンドを使う。

使用するバージョン

- `hub`: 2.8.3
- CircleCI: 2.0

### 1. OAuth トークンを用意する

[`man hub`](https://hub.github.com/hub.1.html) 曰く、
`GITHUB_TOKEN` 環境変数に、 `repo` の permission を付与した GitHub の OAuth トークンをセットしておけばよさそう。

トークンの作り方: https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/

### 2. CircleCI プロジェクトの環境変数にトークンをセットする

前手順で取得したトークンを`GITHUB_TOKEN`にセットするわけですが、
このトークンは自分以外から見られると困るので、
プロジェクト設定で環境変数をセットします。

プロジェクトの環境変数のセットの仕方: https://circleci.com/docs/2.0/env-vars/#setting-an-environment-variable-in-a-project

### 3. CircleCI の job を書く

`hub`がインストール済みのいい感じのコンテナが見つからなかったので自前でダウンロードします。
ただし別にここで毎回インストールしなくても、コンテナレジストリに`hub`インストール済みのイメージを上げておけばそれでOKです。

`BASE_BRANCH` と `HEAD_BRANCH`は適宜うめてください。

```config.yml
(略)
jobs:
  create-pull-request:
    docker:
      - image: circleci/golang:1.11-stretch
    steps:
      - checkout
      - run:
          name: Install hub command
          command: |
            curl -sSLf https://github.com/github/hub/releases/download/v2.8.3/hub-linux-amd64-2.8.3.tgz | \
            tar zxf - --strip-components=1 -C /tmp/ && \
            mv /tmp/bin/hub /usr/local/bin/hub
      - run:
          name: Create a pull request
          command: |
            hub pull-request --message="あああ" --base=${CIRCLE_PROJECT_USERNAME}:${BASE_BRANCH} --head=${CIRCLE_PROJECT_USERNAME}:${HEAD_BRANCH}
(略)
```


## 注意点

`GITHUB_TOKEN`がセットされていることによって使えるようになる`hub`のサブコマンドは、
GitHub の WebAPI を使っているものだけです。

`hub`コマンドは `hub push` など git リポジトリに対するサブコマンドも内包していますが、
これらを使うには別途 git リポジトリにアクセスするための設定が必要となります。
具体的には SSH 鍵の設定などを行う必要があります。

詳しくはこちら: https://circleci.com/docs/2.0/gh-bb-integration