OmniAICreator/Qiita-1.07M huggingface dataset:
Android PでtargetSdkVersionを28に指定した場合にHTTP通信が失敗する

弊社優秀なエンジニアが解決していただいて自分が代わりに書きます。



## HTTP通信に失敗する


APIを叩いた時に下記のエラーが出力されました。

```
java.net.UnknownServiceException: CLEARTEXT communication to "接続先URL" not permitted by network security policy
```

## 原因


https://developer.android.com/training/articles/security-config#CleartextTrafficPermitted

詳しくは上記のページを確認してほしいのですが、Android P から `cleartextTrafficPermitted="false` がデフォルトで設定されるため暗号化されていないHTTP通信（つまり、 httpsのsが付いてない通信)に失敗します。


## 解決方法

解決方法は３つあります。

1. 叩くAPIをHTTPS通信にする

まあいうまでもなく。


2. AndroidManifest.xmlに　`usesCleartextTraffic` を設定する

AndroidManifestに設定することでも全ての通信に対して、暗号化されていない、HTTP通信を許可することができます。

```xml
<application
            android:usesCleartextTraffic="true">
</application>
```

`<application>` タグに `usersCleartextTraffic=true` を設定すれば全ての通信を許可できます。

3. `network_security_config.xml` を設定する

`network_security_config.xml` を設定しれば細かく設定を書くことができます。

例えば
- このドメインだけHTTP通信を明示的に許可したい
- 開発環境だけ許可したい(ビルドバリアントごとに別に設定したい)

みたいな状況で使います。

`res/xml/network_security_config.xml` というファイルを作成して下記を記述します。

```xml

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <!-- デファルトの設定 -->
    <base-config cleartextTrafficPermitted="false" />
    <!-- ドメイン毎の設定 -->
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">secure.example.com</domain>
    </domain-config>
</network-security-config>
```

上記の設定は `<domain-config>`  でドメイン毎に設定しています。

ビルドバリアント毎に設定したい場合は、ビルドバリアントに適したパッケージに `network_security_config.xml` を置けば解決します。
htmlのtable内で改ページさせるのに迷った話

## 初投稿。主に自分のメモ用に。

初めまして。omochisanと申します。
主婦パートとしてプログラマをしております。プログラミング経験も数年の若輩モノです。
最近javascriptを始めて、現在勉強中…。主に自分が忘れないための防波堤としてこちらに投稿させていただきますが、もしも誰かの何かのお役に立てれば幸いです。
そして特に、「こうすればええやん」というご意見など、超ありがたいのでぜひお願い致します！

## tableタグ内で改ページさせる

ご挨拶はほどほどに、本題です('_'；)
tableが含まれているWEBページを印刷する際、行数が多く印刷数が何ページにも渡る時がありました。
それはいいのですが、レイアウトの都合上、一定の行数で改ページをさせたい…。
ということでtableタグ内で改ページ設定を行うことにしました。


```javascript:webTable.js
if (telements.length >= 10) {
  for (let i = 1; i < telements.length; i++) {
   if (i % 9 === 0) {
    telements[i].className = "pagebreak";
   }
  }
}
```

```css:table.css
@media print {
  tr[class="pagebreak"]  {
    page-break-after: always;
  }
}

```

上記はページ印刷時、10行ごとに改ページを行うよう指定しています。
最初は改ページしたい部分のtrタグ内にtdタグと並列でdivを追加して、追加したdivへpage-break-after: always（改ページ指定）を設定したのですが、うんともすんとも改ページされず。。。
なのでtrブロック自体に改ページ指定を行いました。


tableタグ内で改ページ処理ってこんな感じであってるの…かな…？(--;)
今回は以上です！
【Rails】ちゃんとビルドパック追加してる？【Heroku】

# 背景
Herokuにデプロイして

```bash:bash
$ heroku run rails db:migrate
```

とかしたら

```bash:bash
/usr/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require`: cannot load such file -- bundler (LoadError)
```

なんて具合の初心者がデプロイ成功して安堵したところに突然襲いかかるようなエラー。
よく質問も見かけるわりにググってもヒットしづらい印象を受けた。
なのでここにでも書いておきます。
それほど難しいエラーでもないので、時間の浪費を防げれば幸い。

# 原因と解決
原因は大抵rubyのビルドパックが入ってないからなんだけど...
`https://dashboard.heroku.com/apps/<アプリ名>/settings`
の`Buildpacks`って項目を見てばビルドパックが入ってるか確認できます。

```bash:bash
$ heroku buildpacks:add heroku/ruby
```

で追加。ダッシュボードから追加するのもあり。
追加したらデプロイし直す。これをしないと反映されない。

# おまけ
Rails5.1以上だとyarnサポートにより`yarn install`を行う必要がある。
rubyのビルドパックには`yarn install`を行うコマンドがないので
nodejsのビルドパックを追加する必要が出てくる

```bash:bash
$ heroku buildpacks:add --index 1 heroku/nodejs
$ heroku buildpacks:add --index 2 heroku/ruby
```

indexを指定してあげるのがミソ。この順番が大事。
【Rails】form_withがどうやってデータを飛ばしているのか

# はじめに
よくRailsは**「ブラックボックスだらけだ」**と聞きます。

初学者の自分にとって一番ブラックボックスに感じたのは`form_with`でした。

なんでこの書き方でちゃんとデータがDBに登録されるのかがわかりにくいので、それを紐解いてみましょう！

# どこでどうやってデータを飛ばすモデルの指定をしているの？

```ruby
<%= form_with(model: @blog, local: true) do |form| %>
```

早速本題から入るんですが、**`model: @blog`**でもうBlogモデルにデータを飛ばすことが決まるんです。

じゃあもっと具体的に見ていきましょう！

# @blogにはなにがはいっている？

先ほどの**`model: @blog`**の`@blog`に何が入っているかでRailsが`コントローラのアクション`を決めてくれます。

### ○newのとき

```ruby:new.html.erb
                   # @blog = Blog.newの場合
<%= form_with(model: @blog, local: true) do |form| %>
```

@blogが**`Blog.new`**の場合、pathが`blog_path`、HTTPメソッドが**`POST`**になります。

ルーティングを見るとわかると思いますが、blog_pathでPOSTなのはコントローラの**`create`**になります。

これはRailsが自動推測してくれているおかげなんです！

じゃあ次はeditのときをみてみましょう。

### ○editのとき

```ruby:new.html.erb
                   # @blog = Blog.new（blog_params）の場合
<%= form_with(model: @blog, local: true) do |form| %>
```

今度は@blogにblog_paramsで元々の値が入っています。

@blogが**`Blog.new(blog_params)`**で値が入っている場合、pathが`blog_path`、HTTPメソッドが**`PATCH`**になります。

ちなみにblog_pathでPATCHなのはコントローラの**`update`**になります。

これもRailsの自動推測のおかげですね！

# まとめ

同じ書き方でもインスタンス変数になにがはいっているかで動きが変わるのがわかったと思います。

最初、form_withに慣れなかったのはRailsが自動推測でよしなにしてくれるからなのかなと個人的に感じてます。

なにか間違っているところ、追加で聞きたいことなどあればコメントください！
Ubuntu or CentOS7にPandora FMSをインストール

数回インストールをやり直したりしたので誰かの役にたてばと思い書きました。

基本は[公式](https://wiki.pandorafms.com/index.php?title=Pandora:Documentation_ja:Installing)のインストール方法のままですが、
Ubuntuの場合はリポジトリが見つけられなかったのでdpkgでインストールしてます。
CentOSの場合は公式に記載の通りです。特に迷うことはないかと思います。

## OSのインストール
### Ubuntuの場合
今回はServerの18.04を使用しました。インストール時にパッケージを追加するか？など聞かれますが特に追加せずインストールです。

### CentOSの場合
7の[minimam](http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso)を使用しました。特に追加とかは無しで問題ありません。

## インストール後の確認
SSHやFirewall周りをチェックしておきます。とりあえずはSSHが使えればよいと思います。

## Pandora FMSのインストール
### Ubuntuの場合
一発でインストールできれば良いのですが、できなかったので個別にインストールします。
まずは以下のコマンドでリポジトリを追加します。

`apt-add-repository universe
apt-add-repository multiverse
add-apt-repository ppa:ondrej/php`

次にmariadbをインストールします。その後に初期設定をしますが、ubuntuの場合rootが**unix_socket**になっていてOSのrootでしか入れないのでなんらかしらの対処をします。
__※[こちら](https://jyn.jp/ubuntu-16-04-mariadb-password-bug/)が参考になりました__

次に依存ライブラリをインストールします。
`apt-get install  snmp snmpd libtime-format-perl libxml-simple-perl libxml-twig-perl libdbi-perl libnetaddr-ip-perl libhtml-parser-perl xprobe2 nmap libmail-sendmail-perl traceroute libio-socket-inet6-perl libhtml-tree-perl libsnmp-perl snmp-mibs-downloader libio-socket-multicast-perl libsnmp-perl libjson-perl php5.6 libapache2-mod-php5.6 apache2 mysql-server php5.6-gd php5.6-mysql php-pear php5.6-snmp php-db php-gettext graphviz mysql-client php5.6-curl php5.6-xmlrpc php5.6-ldap dbconfig-common`

インストール終了後、パッケージを[ここ](http://firefly.artica.es/debian/wheezy/ )からダウンロードします。
console、server、そしてwmi-clientをダウンロードします。

ダウンロードしたならばwmi-client、console、serverの順にインストールします。
インストール作業は上記で終わりです。

### CentOS7の場合
簡単です。公式の通り、リポジトリを追加してyumでインストールすればOKです。
この際、dbも同時に入るので同時に設定します。
ちなみに公式のコマンドではインストールできず、searchしたら以下でした。
`yum install pandorafms_console.noarch pandorafms_server.noarch mariadb-server`

インストールが終わったらhttpdとmariadbを起動し、SELinuxを無効にしておきます。

## GUIでのインストール（初期設定）
Pandora FMSがインストールされたならばhttp://{ip}/pandora_consoleでアクセスできます。
指示に従いインストールを行います。この際、Pandora FMSは自身のDBを作成するのでDBのrootかそれに類するアカウントが必要になります。

DBの作成までができたら、Pandoraが作成したユーザーのパスワードが表示されるのでサーバ側の設定ファイルにパスワードを記述します。同時に、install.phpをリネームするボタンが現れるのでクリックしてリネームしておきます。
初期設定は上記で終わりです。

## 個人的にハマったポイント
### Ubuntuの場合
当初、リポジトリの追加にハマりました。結局見つからなかったのでdpkg -iでインストールしましたが。
__※`deb http://firefly.artica.es/debian/wheezy /`　←これが入らないんです__

他、GUIでのインストール中、**PHP ZIP**が無いとか**PHP MBSTRING**が無いとか言われましたので`apt install php5.6-zipなど`でインストールしました。

### CentOS7の場合
インストールそのものは苦労しませんでしたが、その後のGUIでちょっと手間取りました。
httpdが起動していなかったり、SELinuxのせいでインストールが進まなかったりと。
あとはiptablesが効いているのでその設定ですね。面倒なので無効化しちゃいました。

次はエージェントの設定などについて書こうかと思います。
DockerでCentOSを動かしたらlessが使えなかったのであたふた

WindowsでもDockerが使えると知り、Docker for Windowsを
Windows10Proにインストールした。
マウントした先のディレクトリが使えるかを確認することが今回の目的。
CentOSを起動して、コマンドプロンプトが表示され、lsでファイルが確認でき、
catで表示できた。
（ただWindows側でなにも考えずメモ帳で作ったファイルは文字コードが
　Unicodeになっていたので、英字が2バイト文字で表示されて
　ちょっと驚いた）

lessコマンドで大きなファイルも参照しようとしたところ、
"bash: less: command not found"となって使えない。viで編集はできる。
yumで`lessをインンストール`したら何事もなく使えるようになった。

「Dockerのイメージファイルとはそういうものです」とご指摘を受けそうですが、
初めて使って、何が起きているのか、lessをインストールするという概念がなく
「Dockerのインストール、イメージのpullがちゃんとできているの？」と
思ったので、書いておきました。

```
$ docker run --name mycent -it centos /bin/bash

[root@1f2d9093c63d /]# less
bash: less: command not found

[root@1f2d9093c63d /]# yum install less
Installed:
  less.x86_64 0:458-9.el7  
Dependency Installed:
  groff-base.x86_64 0:1.22.2-8.el7    

Complete!
```
infiniband接続のホスト上のnvidia-docker2でchainermnを動かす

# やりたいこと
chainermnのサンプルをinfiniband接続のhost上で稼働するnvidia-docker2コンテナ内で動かす．(ただし，この記事ではとりあえず，ノード数1で動かすことを目指す）

# 何故この記事を書いた？
Infiniband接続のPC内のdocker上でchainermnを使おうとすると，multi-gpu (multi-nodeではない)であっても，dockerに対してInfinibandのdriverを入れる必要があるようだったので，備忘録として．


# 環境・前提
## Host
- Ubuntu16.04 x64
- Infiniband (Mellanox)

## Docker Image (nvidia-docker2)
- docker-image: 9.0-cudnn7-devel
- gitやらなんやらある程度インストールしてある状況を想定。まっさらなものから設定するときは、基本的に各項目の[参考]リンクを参照。

## この作業をした日
2018.11.20

## まず確認すること
最新版のchainer(5.0.0)にはchainermnが含まれているようです。現時点では古い情報のほうが多いようです。例えば、サンプルコードは[ここのもの]
(https://github.com/chainer/chainer/blob/master/examples/chainermn/mnist/train_mnist.py)を使うべきです。

このコードをlocalに落として来て、下記が動くようであれば、何もする必要がありません。

    % export CUDA_VISIBLE_DEVICES='0,1';\
      mpiexec -n 2 train_mnist.py -g

ちなみに，googleで「chainermn mnist」くらいで検索すると[こちらの公式インストラクション](https://docs.chainer.org/en/stable/chainermn/tutorial/step1_communicators_optimizers.html?highlight=chainermn)がヒットしますが，今回はシステムの動作確認なので，手動での変更方法に関するこのインストラクションは使わず，gitにあるサンプルコードを使うのが吉．(地味にこれが一番罠だったかも。何も考えず勉強がてら，インストラクションに従ってコーディングしたが，エラーの原因がコードにあるのかシステムの設定にあるのかわからなくなった．当たり前だけれど，システムの設定をしたいのに手動で編集したコードを使うのは全く良いアイディアではない。)


# 手順
### 1. コンテナにinfinibandのドライバーをインストールする([参考](https://community.mellanox.com/docs/DOC-2971#jive_content_id_Option_3))
 
    apt-get install -y autoconf automake swig m4 chrpath dpatch
    cd /tmp
    wget http://content.mellanox.com/ofed/MLNX_OFED-4.2-1.0.0.0/MLNX_OFED_LINUX-4.2-1.0.0.0-ubuntu16.04-x86_64.tgz
    tar -xvzf MLNX_OFED_LINUX-4.2-1.0.0.0-ubuntu16.04-x86_64.tgz
    MLNX_OFED_LINUX-4.2-1.0.0.0-ubuntu16.04-x86_64/mlnxofedinstall --user-space-only --without-fw-update --all -q
必要に応じて、最後のinstallスクリプトに--forceオプションを渡す。 

### 2. openmpi3.0.0をソースからコンパイル([参考](https://qiita.com/sonots/items/ee247a2e36033646c914))
ちなみに[コンパイル済みのcupyパッケージ](https://docs-cupy.chainer.org/en/stable/install.html#install-cupy)を使うと以下の手順は不要かも．

    apt install -y --no-install-recommends libtool flex
    git clone --depth=1 -b v3.0.0 https://github.com/open-mpi/ompi.git /tmp/ompi
    cd /tmp/ompi
    ./autogen.pl
    ./configure --with-cuda --with-hwloc
    make -j8
    make install

#### 3. mpi4pyをインストールする
もし既にインストール済みなら一旦削除してから入れ直す

    pip uninstall mpi4py
    pip install mpi4py --no-cache

コンパイルに失敗するようなら、setuptoolsのリンクが切れている可能性がある。私の場合はlibopen-palが見つからなかった(といわれるのにldconfig -v|grep libopen-palは存在していた)。baseとなるライブラリが入れ替わったためと思われたので、setuptoolsを再インストールした。

    pip install setuptools --force

#### 4. chainerをインストールする
ここまでできたら、chainerをインストールします。もし、すでにインストール済みのものがあれば、一旦uninstallします。

    pip uninstall cupy chainer chainermn
    pip install cupy chainer --no-cache

#### 5. 動かしてみる

    wget https://raw.githubusercontent.com/chainer/chainermn/release/1.3/examples/mnist/train_mnist.py 
    export CUDA_VISIBLE_DEVICES='0,1'
    mpiexec --allow-run-as-root -n 2 python train_mnist.py -g
GPS・QZSSロボットカーコンテスト2018にエントリー

#概要

GPSで自動走行する、コンテストがある。[GPS・QZSSロボットカーコンテスト2018](https://robot-car.jimdo.com/)
ソフトウェアコンテストは、本日開催です。
エントリーしてますが、問題が出てます。

#ohiapp148の問題点

緯度経度取得から進まない。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/9a7b944e-86c7-f1cd-9114-09aa8f07f128.png)

#対策版のohiapp149を作成。

緯度経度のパーサーをregexpで、書き直す。
昨日、事務局に送った。

以上。
react document



```javascript


 function formanName(user) {
   return user.firstName + user.lastName;

 }

const user = {
firstName: 'haroer',
lastName: 'perse'
}

const element = (
  <h1>
     hello, {formanName(user)}
  </h1>
)


気づき

{}と()には違いがある！！

{}はjson

()はパーツ


```
23個のサンプルで一貫したこと

Hooks に限った話ではないですが、React では最適化をサボるとすぐに不要な再計算や rerender が発生します。GUI設計の話に入る前に、本日は memoize と useContext による最適化について考えます。

# memoize が肝心

scroll や touchMove などを利用したGUIの場合は特に気をつけないといけません。下手をすると指が画面に触れている間、包含コンポーネントで rerender しっぱなしという事が起こり得ます。この課題への取り組みとして3つの方法があります。いずれも共通点として、**コンポーネントを細分化し rerender 層を薄くする事**が重要です。

- props.children による回避
- renderProps + useMemo による回避
- ContextAPI + useMemo による回避

ContextAPI を利用することで Dan が言う complex pattern 解消に近づくので、サンプルでは積極的に ContextAPI を利用しています。


# Container 相当の Memoized Component

memoize input array は初見煩わしく思われるかもしれませんし、「将来的にコンパイラが自動で生成してくれる様になる」という一文が公式に注記されています。一方で、この memoize input array が意図的な rerender コントロールを有効にしてくれます。サンプルでよく利用した雛形が以下の様なものです。

- **「View」** は Hooks さえ許容しない Stateless Function
- そのひとつ高階層**「Container」**で memoize し props 注入
- **「View」**の rerender を Container memoize input array でコントロール


Hooks API を利用出来る層を限定する切り口は**「従来SFCは従来のままで良い」**ので個人的に推しです。

Container を構えると、ここで将来 useRedux や useApollo などが合流可能に見えますね。

```typescript
// ____________________________________
//
// @ View

const View = (props: Props) => (...)
// ____________________________________
//
// @ Container

export default () => {
  const { ... } = useContext(...)
  return useMemo(
    () => (
      <View {...} />
    ),
    [...] // here!!
  )
}
```




# Context Hooks への集約

**However, we often can’t break complex components down any further because the logic is stateful and can’t be extracted to a function or another component.**

Hooks 利用モチベーションで強調されている一文。Custom Hooks はポータブルで単一責務にするのが良さそうです。

ただし GUI を作るとなると、それらを複合した中粒度の Custom Hooks が欲しくなります。サンプルの中では以下の様に、Custom Hooks 戻り値と Context 定義を対にするシーンが何度もあります。この Context と対の Custom Hooks にビジネスロジックを集約、状態や更新ハンドラを限定的に末端コンポーネントへ公開しています。

```typescript
import { createContext } from 'react'
import { usePieChart } from './usePieChart'

export const PieChartContext = createContext(
  {} as ReturnType<typeof usePieChart>
)
```
Custom Hooks の戻り値は自由なので、状態の公開・非公開など、スコープを閉じやすいです。また型との相性も良く、上記の定義だけ初期指定しておけば、実装に推論が追従してくれます。


# useReducer を使っていない理由

そもそもこの中粒度で reducer は必要ないという点がひとつ。useReducer は、いずれ来るであろう useRedux が混在した時、混乱の元になると考えているためです。

筆者は Hooks を利用しても、Redux は引き続き使い続けたいと思っています。ContextProvider を中粒度コンポーネントの状態管理 gateway として Store に接続するのが良さそう、と考えています。Redux を「Hooks と Context API で代替しようとすれば可能だが、良いかどうかは別の話」が、今のところの所感です。
KerasのGPU使用率を制限する[チートシート]

# はじめに

Kerasは何らかの形でGPUリソースを使えるようであれば優先して使うようですが，
デフォルト設定ではGPUのメモリを最初にすべて占有してしまうようです．

また，(少なくともCUDA環境では)GPUメモリ使用率が100%を超えると
プログラムをアボートします(メモリを占有してるプログラムはそのまま)．

これではGPUを利用したプログラムを2つ以上動かせません．

ということで，Keras使用時のGPUメモリ使用率に制限をかけてみます．

# チートシート

できあがったものがこちらになります．

```limitGPU_cheat.py
# import 
import tensorflow as tf
from keras import backend
import numpy as np

# Kerasを使う前に
config = tf.ConfigProto()
# 次のコンフィグはどちらかお好きなほうをお使いください
# GPUメモリ占有をメモリ全体の30%に制限する
config.gpu_options.per_process_gpu_memory_fraction = 0.3
# GPUメモリを必要な分だけ確保する(自動開放するわけではないので注意)
config.gpu_options.allow_growth = True
sess = tf.Session(config=config)
backend.set_session(sess)

# この後にKerasを使う

```

# おわりに

複数の人物，もしくはプログラムで単一のGPUリソースにアクセスする場合は必須に近いんじゃないかなと思います．
[bitcoin core] getrawtransactionコマンドでの"Use -txindex"エラー

# 環境
bitcoind 0.17

`getrawtransaction`([bitcoin coreドキュメント](https://bitcoincore.org/en/doc/0.17.0/rpc/rawtransactions/getrawtransaction/))でtransactionの情報をとろうとすると以下のエラー

```
$ bitcoin-cli getrawtransaction 5d55ed7b2e4e0d8896359ee457ca05ac6265914cfa712c4b695e279a5ceb893d true
error code: -5
error message:
No such mempool transaction. Use -txindex to enable blockchain transaction queries. Use gettransaction for wallet transactions.
```

# getrawtransactionコマンド

ドキュメントによれば、
`getrawtransaction`はmempoolのtransactionに対するコマンドです。
ブロックに入ったあとのtransactionに対しても使うためには、bitcoindを`-txindex`オプション付きで動作させる必要があります。

## txindexを有効にするには

- 設定ファイルに書く(方法調べてないし実証もしていないm(__)m)
- 起動時にオプション付きで、`$ bitcoind -txindex`

すでに起動している場合は、それまでのtransactionをインデックスし直す必要があるようで
`$ bitcoind -reindex -txindex`
とします。
reindexには時間がかかります。

# 参考
[bitcoin core 0.17](https://bitcoincore.org/en/doc/0.17.0/rpc/rawtransactions/getrawtransaction/)
[What are pros and cons of txindex option?](https://bitcoin.stackexchange.com/questions/35707/what-are-pros-and-cons-of-txindex-option)
[Bitcoin wiki](https://en.bitcoin.it/wiki/Running_Bitcoin)
php-master-changes 2018-11-20

今日は typo の修正、代入周りの処理の微妙な最適化、ftp_close() で SSL 接続を閉じようとした際に出る問題の修正、php-7.3.0RC6 のタグ打ち、opcache のエラーメッセージ修正があった！

# 2018-11-20
## villfa: Fix typo in tests
- https://github.com/php/php-src/commit/2b9ceffb4126f8f3a3cc212f7c775cf1325d8fa2
- テスト内の qeury を query へ修正

## dstogov: Optimization
- https://github.com/php/php-src/commit/a5a3d507d27cce6ee4e02ea7d62ac837e9b29334
- オブジェクト/連想配列への代入時の処理を最適化
- 結果を使わない命令で使われる方が多いみたいな感じなのかな？

## dstogov: fixed typo
- https://github.com/php/php-src/commit/93f7cbf29b8f0c99f26147424dc933e40a72d291
- うっかりミスの修正

## dstogov: Delay exceptional case check
- https://github.com/php/php-src/commit/1f3a535324d4e1e6283f8b6b27d8a151c9f6983c
- 代入処理で例外的なケースのチェックを後回しに

## remicollet: Fix [#77151](https://bugs.php.net/bug.php?id=77151) ftp_close(): SSL_read on shutdown
- https://github.com/php/php-src/commit/d9afc2f662587a042db38c8f0df98a27bfc89d29
- [7.1~]
- ext/ftp で、ftp_close() が SSL 接続を閉じようとした時に警告が出る問題の修正
- [#76972](https://bugs.php.net/bug.php?id=76972) を[以前に修正した際](https://qiita.com/sj-i/items/32d5af40165069dd1beb#manuelm-fix-76972-ftp-data-truncation-due-to-forceful-ssl-socket-shutdown)の regression

## remicollet: NEWS
- https://github.com/php/php-src/commit/3ed07cc34aeeb0b90c6f1cbf7cd84a7e1b8d749a
- [7.1~]
- ↑について NEWS の更新

## cmb69: [ci skip] Update NEWS wrt. php-7.3.0RC6 tagging
- https://github.com/php/php-src/commit/03a3a04e5593854dd7e0fa421e562f2b2749ed8b
- [7.3~]
- php-7.3.0RC6 のタグを打って開発バージョンを PHP 7.3 リリース版に
- 予定通りの進行なら次は 7.3 が出る

## dstogov: Improved error messages
- https://github.com/php/php-src/commit/05875bcfc698a8b693679306d3cc59ed3995523d
- ext/opcache のエラーメッセージを修正
Qiitaが新規フォームで「プログラミング」を強調しいる？ ユーザーの注意を引く UI/UX とは

# フォームで「プログラミング」が強調されている

- 前からだった？ 
- どちらにしても今回、1ユーザー = @yumainaura の目を引いた。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/cb30a19f-8412-fbab-17a6-bbaa0b23c266.png)

# 絶好のタイミング・場所

- ユーザーが重要アクションを起こそうとするタイミングで、注意を引く
- ユーザーが重要アクションを起こす場所で、注意を引く。
- ユーザーアクションと注意を引く内容がマッチしている。

# アクションの重要度と注意喚起レベルのバランス

- ユーザーが重要アクションを起こすのを邪魔してはいけない。
- ポップアップが出るとかは最悪で、ユーザー体験を著しく損なう。
- 注意喚起レベル10段階の中の5ぐらい。たぶん、

# サービス思想と合ってるの？

- Qiitaトップページでは「エンジニアリング」という表記がある
- プログラミングとエンジニアリングは大きな違い。
- サービス思想にブレがあるとユーザーの混乱を招く。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/055883b7-8e8c-5295-25ef-3b77866d914a.png)

# サービスが提示するサービス思想

- 思想のあるサービスは強い。
  - 飲食店と同じで「ブレないブランディング」はユーザーを引きつける。
  - スターバックス然り。yumainauraは大好きです。
- 広義のユーザー体験を考えよう。
- 言葉でも良いし、インターフェイスがそのまま思想化されていても良い。

# Hey yumainaura

- [yumainaura さーびす ux - Google Search](https://www.google.co.jp/search?q=yumainaura+%E3%81%95%E3%83%BC%E3%81%B3%E3%81%99+ux&oq=yumainaura+%E3%81%95%E3%83%BC%E3%81%B3%E3%81%99+ux&aqs=chrome..69i57j69i64l2.12053j0j7&sourceid=chrome&ie=UTF-8)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
go mockについての悩み

## 背景

例えば python だとこんな感じで関数を入れ替えることができちゃう。

```python
class A(object):

    def my_method(self):
        return "this is original"


if __name__ == '__main__':
    a = A()
    print a.my_method()  # "this is original"

    def dummy_method():
        return "this is dummy"

    setattr(a, 'my_method', dummy_method)  # method is replaced here.

    print a.my_method()  # "this is dummy"
```

この原理を使って、unittest時にAPI Clientを無理やりdummy methodに置き換えて、実際にリクエストが送出されるのを防止する・・・なんてこともその気になれば可能だし、場合によってはモックが難しい関数を無理やり置き換えるなんてこともできる。

さて、これと同じようなことを go でやりたいと思った。
何故かと言うと、

- いろいろ調べてみても、PHPのrunkitみたいな強力な関数置換方法がない
- gomock を見てみたが、世の中にあるモジュールをモックしたい場合に自由度が低いように見える（僕の勉強不足なだけかもしれません・・・） 

で、いい方法はないものか・・・というのが目下の悩みで、以下のようなことを勉強してた。

[goの継承の仕組みを試してみて][1]
[1]:https://qiita.com/keiichi-hikita/items/32e54dcac0b26e69ff06

## 実際に困っていること

ということで、先のpythonの例とほぼ同じようなことを go でやってみる。

```go
package main

import (
	"fmt"
	"time"
)

func FiveHoursAgo() time.Time {
	n := time.Now()
	return n.Add(-5 * time.Hour)
}

func main() {
	layout := "2006-01-02 15:04:05 MST"
	f := FiveHoursAgo()
	fmt.Println(f.Format(layout))
}
```

例えばこの `FiveHoursAgo` をテストしたいとする。
しかし内部で `time.Now` が呼ばれてしまうので、returnされる値の期待値を書きたくても、テストの実行時刻によってそれが変わってしまう。
つまるところアサーションの比較対象を定義できない。

そこで、unitest時のみ `time.Now` を何かしらの方法でreplaceすることができれば、他の方が作ったものを楽にテストできないか・・・と考えたが。
が、実際やってみると、例として以下のような事はできない。

```go
package main

import (
	"fmt"
	"time"
)

// こんな事はできない部
// cannot define new methods on non-local type time.Time
func (time.Time) Now() time.Time {
	return time.Now()
}

func FiveHoursAgo() time.Time {
	n := time.Now()
	return n.Add(-5 * time.Hour)
}

func main() {
	layout := "2006-01-02 15:04:05 MST"
	f := FiveHoursAgo()
	fmt.Println(f.Format(layout))
}
```

当然あくまでこれは例です。

## ということで課題

とりあえずもっと調べないと・・・

- 本質的に普通にモックできればいいだけなので、もう一度ちゃんと調べよう
- 自作なら最初からテストを書きやすくしておけばいいのかもしれないが、他の方が作ったものに対してそれは無理
- それすら可能にする強力な置換方法があればなぁ・・・
資本政策の失敗例

#資本政策の失敗例
##ストックオプションの発行しすぎ
やはり株発行数の10%以下

ビジネスモデルにもよるが、
エンジニアなどの従業員によって会社の勢いが変わるようであればストックオプションはあげても大丈夫。
ただそこでの配布数を資本政策で要検討

##早い段階で外部の株主に株式を渡しすぎるケース
=>調達する必要がある資金量に対して、企業価値評価が低すぎる

**企業価値を資本金の倍率で考えるのは時代遅れ！！**
「未来の」数字で見てもらう必要がある
【Docker】ubuntuの環境で日本語入力を可能にする

dockerのubuntuのコンテナ内で日本語入力ができなくて苦労したので、改善しました。

ネットに転がってる記事で全然解決せずに、いろいろ組み合わせていたら日本語入力できるようになりました！

ubuntu環境で日本語入力を可能にさせるDockerfileの書き方を説明します。

# dockerのubuntu環境で日本語入力を可能にする

dockerfileにこのように書けば日本語入力ができます。

```.bashrc
RUN apt-get update \
    && apt-get install -y locales \
    && locale-gen ja_JP.UTF-8 \
    && echo "export LANG=ja_JP.UTF-8" >> ~/.bashrc
```

ちなみに、Dockerfileに書かずに、dockerコンテナに侵入していろいろインストールしても良いですが、一度docker-compose downすると、リセットされます。
何度も使いたい場合は、dockerfileに書きましょう！

もし、コンテナ内で直接やりたいなら、このコマンドを実行しましょう

```
apt-get update && apt-get install -y locales && locale-gen ja_JP.UTF-8 && echo "export LANG=ja_JP.UTF-8" >> ~/.bashrc
```

# 調べまくった結果できなかった話

これできそうじゃんっていうの見つけたんですよ。

```
RUN apt-get update \
    && apt-get install -y language-pack-ja-base language-pack-ja \
    && echo "export LANG=ja_JP.UTF-8" >> ~/.bashrc
```

でも、これだと、エラーが出てしまいます。
`Unable to locate package language-pack-ja-base'
`Unable to locate package language-pack-ja`

で、調べてみると、解決策は`apt-get update`をしろ！というものなんですよね。

apt-get updateしてるんだけどなあ。。。ってずっと悩んでいましたが、別の解決策を考えるべきでした。。。

ま、解決したからよかったんですけどね！
アプリケーションのユーザー動線が悪いと混乱を引き起こす (UI UX サービス設計論)

# Slackのプロフィール編集の例

# 初期アクセスしづらい。

- 自分のプロフィール・設定関係のリンクがチャンネル一覧に並んでいる。
  - いつも思い出すのに時間がかかる。
- 他のアクセス方法もあるかもしれないが、ユーザーはいちど覚えた行動を繰り返す。
- せめて色を変えるなりした方が良い。コンテンツ分離を。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/96d2a990-411f-c3c0-8ee8-7289493757e5.png)

# ユーザー意図と異なるインターフェイス

- Edit Status は落とし穴。
- 編集したい時はユーザーは編集 = Edit という文字を捜す。
- ユーザーの意図を正しく反映できていない。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/c6e8a686-2cf6-40ee-fc7d-d00f02f42610.png)


# 混同しやすいリンクが並んでる

- Edit と Edit Profile
- これもなんなの。
- 多段的に落とし穴を仕掛けてくる。

# 教訓

- 単一画面だけではユーザー行動は測定できない
- ユーザー動線を考えよう
- プロフィール編集など重要なアクションは特に注意しよう

# Hey yumainaura

- [yumainaura ui ux - Google Search](https://www.google.co.jp/search?q=yumainaura+ui+ux&oq=yumainaura+ui+ux&aqs=chrome..69i57j69i60l3j69i64l2.2833j0j7&sourceid=chrome&ie=UTF-8)









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
QiitaとScrapBox – サービスアプリケーションで「嫌なら使わなければ良い」が成り立たない理由

# Question

- 短文記事書くなら、QiitaよりScrapBoxを使えば良いんじゃない？

# Answer

- 木を見て森を見ず。

# サービスアプリケーションの複合性

- ユーザーが気に入っている要素は単一ではない
- ユーザーの全てのニーズを完璧に満たすサービスは存在しない

# ユーザー選択の最適化

- ユーザーは現実的解決策として、最も求めるものに近いサービスを選ぶ
- それが本来の目的に合った使い方であろうとなかろうと、最も良いものを選ぶ

# QiitaにあってScrapboxにないもの

- ScrapBoxにはソーシャル性がない(たぶん)
-  ScrapBoxはGoogle検索に強いとは言えない(誤り。コメント欄参照)
  - タイトルタグとかすら付いていない(誤り。コメント欄参照)
- Scrapboxにはエンジニアのコミュニティ歴史がない
- ScrapBoxはエンジニア向けサービスではない
- 他にもあげれば数えきれない

# 僕が求める理想のサービスは

- Qiita + ScrapBox = :question: 
- Qiita + Twitter = エンジニアのTumblr的な何か

足して割るところの2みたいな。

# Hey yumainaura

- [yumainaura scrapbox - Google Search](https://www.google.co.jp/search?q=yumainaura+scrapbox&oq=yumainaura+scrapbox+&aqs=chrome..69i57j69i60l3j69i64l2.2361j0j7&sourceid=chrome&ie=UTF-8)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
FirstVRでHello World

## 概要

今回は、[FirstVR](https://first-vr.com/)というデバイスを手に入れることができたのでHello Worldしたまとめです。


## FirstVRとは


FirstVRとはH2Lが開発している「**筋変位センサ搭載コントローラ**」です。
VRと名前がついている通り、VRコンテンツで利用することを想定されたデバイスです。

↓こんな感じのやつ。ゴーグルもセットでついてきます。
![FirstVR](https://i0.wp.com/first-vr.com/wp-content/uploads/2015/11/2000_720.jpg?w=720&ssl=1)

着脱に関しては時計みたいにして腕につける形のデバイスです。
ジャイロを搭載しており、3軸での回転と、グー・パーなどのジェスチャ、そして空間をスワイプしたことを検知するなど意外と色々とデータを取得できるデバイスになっています。

↓実際に手のモデルを動かしてみた例。わりとしっかり動いてる。
[![](https://qiita-image-store.s3.amazonaws.com/0/5616/e6ed05bb-b572-d0e1-b97b-6e090d84f7a3.png)](https://twitter.com/edo_m18/status/1065018134610903040)


比較的スムーズに接続してくれます。
（VR向けを想定したデバイスですが、意外とVR以外でも使いみちがありそうな感じ）

今回はまず、動画のように手をトラッキングする部分だけを作ってみたのでHelloWorld的な部分を書いてみたいと思います。
（後日、ちょっとしたアプリを作るので、それについてはまたまとめる予定）


## セットアップ

まず、[開発者サイト](https://dev.first-vr.com/)から[SDKをダウンロード](https://dev.first-vr.com/downloads?locale=ja)します。
現在はUnity向けのみ提供とのこと。

Unityパッケージをimportすると、**FVR**というフォルダに色々入っているので、まずは必要なPrefabだけをシーンに配置します。

<img width="432" alt="Prefabを配置" src="https://qiita-image-store.s3.amazonaws.com/0/5616/5f4d1067-8dfe-7f84-6045-1c9c01c15458.png">
`ConnectionCheck`のPrefabは`UICanvas`にリネームしてますが同じPrefabです。

FirstVRデバイスへの接続へはこれで準備完了です。
ただ、内部的に接続していてもなにも面白くないので、コンテンツ制作に使えそうな値を出力してみます。


## FVRConnectionクラスから色々取得してみる

`FVRConnection`がデバイスとのインターフェースになっていて、色々と情報を取得することができます。
先の動画でも、手の回転といくつかのパラメータが表示されていましたが、それはそれぞれ以下のように取得することができます。

```cs
private void Update()
{
    _target.rotation = _fvr.centeredRotation;

    _vertText.text = _fvr.verticalOrientation.ToString();
    _horiText.text = _fvr.horizontalOrientation.ToString();
    _palmText.text = _fvr.palmOrientation.ToString();
}
```

`centeredRotation`でジャイロによる回転値を、UnityのRotationに与えることができます。
これによって動画の手の回転のように、オブジェクトの回転として利用することができます。

続く3つの項目は、それぞれ「**手がどういう状態にあるか**」を教えてくれます。
まず`verticalOrientation`は`Up`、`Down`などの「**手の縦方向の状態**」を教えてくれます。
コンテンツを作る際に、手が下を向いたら、みたいな判定に使えそうですね。

次に`horizontalOrientation`は「**手の横方向の状態**」を教えてくれます。
手を左右に振ったときに、左と右どちらを向いているか、などです。
ジャスト左右だけでなく、やや前方向に手がある場合は`front left`などと表示してくれるので結構細かく値が取れそうです。

そして最後の`palmOrientation`ですが、これはそのまま「**手のひらの向き**」です。
`Up`なら上向き、`Down`なら下向き。そして`Side`は横を向いている、という状態を教えてくれます。

このへんの値が取れると、以前、Oculus DK2の時代に作ったコンテンツを、それっぽく移植できそうなのでやってみようかなｗ

[![【ドラゴンボール】気孔弾を誰でも撃てるゲーム作りました](https://qiita-image-store.s3.amazonaws.com/0/5616/c9f810b0-ae4e-4cb0-991f-ffa37d71ad6e.png)
](https://www.youtube.com/watch?v=QLyhL4sH5cA)[【ドラゴンボール】気孔弾を誰でも撃てるゲーム作りました](https://www.youtube.com/watch?v=QLyhL4sH5cA)


## Recenterでモデルの回転を初期化する

さて最後に、動画でもタップしてリセンターしていますが、リセンターについてはとても簡単です。
以下のように`Recenter`メソッドを呼ぶだけです。


```cs
private void Update()
{
    // ... 中略 ...

    if (Input.touchCount > 0)
    {
        Touch touch = Input.touches[0];
        if (touch.phase == TouchPhase.Began)
        {
            _fvr.Recenter();
        }
    }
}
```

この他にも注目する機能としてカスタムジェスチャーがあります。
ジェスチャの状態を登録することで、グー・チョキ・パーなどの状態を判別することが可能なようです。

上で紹介したコンテンツはまさにグーとパーの状態を判別して気孔弾を撃つ、というコンテンツなので次回はそのコンテンツの簡易的なものの制作について＋カスタムジェスチャについて書きたいと思います。
マインドフルネス瞑想がサービスアプリケーション設計に影響力を及ぼす理由

# 不満からアプリケーションは生まれる

- サービス設計者の不満からアプリケーションは生まれる
- サービスのユーザーとしての自分の不満からアプリケーションは生まれる

# 自己洞察力が上がると不満に気付きやすくなる

- マインドフルネス瞑想は自己洞察力、自己客観性を上げる
- そもそも不満に気付いていないと発想も生まれない
- 不満を解決する手段としてアプリケーションを

# 人間がアプリケーションを生み出している

- サービス設計・アプリケーション設計の根源は人間の脳だ
- 人間ドメインを一歩でも外れたアプリケーションは存在しない
- 僕らがAIに駆逐されるまでは人間が必要だ

# Hey yumainaura

- [瞑想 yumainaura - Google Search](https://www.google.co.jp/search?q=%E7%9E%91%E6%83%B3+yumainaura&oq=%E7%9E%91%E6%83%B3+yumainaura&aqs=chrome..69i57j69i60l2j69i65l2j69i60.2198j0j7&sourceid=chrome&ie=UTF-8)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
vbsの作法 その16

#概要

vbsの作法調べてみた。
csvにcrudしてみた。

#結果

insert,selectは、OK。
update,deleteは、NG。

#サンプルコード

insert

```
Set db = CreateObject("ADODB.Connection")
db.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\;Extended Properties=""text;FMT=Delimited;"";"
sql = "INSERT INTO [test.csv](lat,lon,mise) VALUES('35.0','140.0', 'test1')"
Set rs = db.Execute(sql)
db.close

```

select

```
Set db = CreateObject("ADODB.Connection")
db.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\;Extended Properties=""text;FMT=Delimited;"";"

Set rs = db.Execute("SELECT * FROM [test.csv] WHERE mise='test'")
Do Until rs.EOF
	msgbox "lat: " & rs(0) & " lon: " & rs(1) & " mise: " & rs(2)
	rs.MoveNext
Loop
rs.close
db.close

```

以上。
QiitaでUI/UX/サービス設計記事にいいねが付かない理由の憶測

# エンジニア向けサービスだから

- 身も蓋もない話。
- UI/UX感度の高い人が比較的少ないかもしれない。
- Qiitaの良いところは爆速markdownで記事が書けるところなので、エンジニアの中では感度高い層が揃っている可能性もある。


# デザイナー向けQiitaが求められる

- サービスアイディアゆるぼ。
- 理想のサービス論の雑談したい。
- どうせアイディアだけ思いついても、アプリケーションを作るのは100億倍の苦労があるのでアイディア剽窃など意味がない。

# その他の理由

- コメント欄でゆるぼ








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
IBM i (旧AS400）の自己学習メモ０１

# 自己学習メモインデックス

[IBM i (旧AS400）の自己学習メモ　インデックス](https://qiita.com/You_name_is_YU/items/3964849e7803c8eaf767)

# IBM i (旧AS400）の自己学習メモ０１

IBM i（旧AS400）について自己学習していくなかで、備忘録としてメモを残すためにQiita記事を書いています。
他の方の参考になるかはわかりませんが、何かご指摘などある方いらっしゃいましたら、コメントいただけると幸いです。

また、周囲の人が「IBM i」と表現するよりも「AS400」と呼称している人が圧倒的に多いことから、記事内では「AS400」と記載するようにします。

まず第１回目のメモとしては、AS400で登場する基本的な用語について抑えていく。

## オブジェクト

AS400内にある開発ソースやコンパイルしたプログラム、DB2 for iのテーブルなどなど、これら全てが**オブジェクト**である。
私の理解では、Javaのように、全てのオブジェクト型は`java.lang.Object`を暗黙継承しており、その実態は別々の能力（状態や振る舞い）を持ったオブジェクトとなっているように、AS400内にあるソースやプログラム、テーブルなどを**オブジェクト**として管理しているような感覚で理解している。

このオブジェクトを特化したタイプとして以降に記載する**ライブラリ**や**ファイル**などが登場してくる。

## ライブラリ

複数のオブジェクトをまとめて管理するための空間を**ライブラリ**と呼ぶ。
ライブラリには次のようなものがAS400標準で存在している。

- QSYS
  - システムライブラリ
- QGPL
  - 汎用ライブラリ
- QTEMP
  - 一時ライブラリ
- QRPG
  - RPG Ⅲ ライブラリ

AS400標準で存在しているライブラリは、「Q」から始まる名称となっているようだ。
なので、独自で利用したいライブラリを作る際は「Q」から始まらない名前にすると良い。

ライブラリは、複数のオブジェクトを管理するための空間であるが、オブジェクトのタイプでも他のライブラリを自身のライブラリに含めることはできない。
ライブラリ以外のオブジェクトを管理することができると理解する。

## ジョブ

Windowsでいうところの　**プロセス**と同じ位置付け。

## サブシステム

ジョブが動作する空間（作業場所）をサブシステムと呼ぶ。
サブシステムごとにCPUやメモリの割り当てを設定し、他のサブシステムで動作するジョブに影響を出さないように仕組みを構築することが可能。

例えば、重たいバッチジョブが動作中に、一般利用者が操作するシステム（オンラインジョブ）に影響が出ないようにサブシステムを分けておくことができる。

## CLコマンド

LinuxのシェルやWindowsのコマンドと同様に、制御言語（Control Language）と呼ばれ、OSに対して動作を命令する際用いられるコマンドを指す。

## ファイル

ファイルとは、私の理解ではRDBMSでいうところのテーブルを指す。
ファイルには物理ファイル（P）と論理ファイル（L）が存在する。

- 物理ファイル
    - RDBMSでいうところのテーブル
    - テーブルの実態
- 論理ファイル
    - RDBMSでいうところのビュー（マテリアライズドビュー？）という理解
    - 例えば削除フラグ＝０のデータだけを抽出できるように定義された論理ファイルなどを作れる。

## CCSID

文字コードを一意に識別できるコードをCCSID（コード化文字セットID：Coded Character Set IDentifiers）と呼ぶ。

AS400上で取り扱われる文字コードはEBCDIC（拡張二進化十進コード：Extended Binary Coded Decimal Interchange Code）という特殊な文字コードとなっており、WindowsやLinuxなどのOSでは利用できないものとなっている。
このEBCDICの中でも扱われるCCSIDがいくつか分かれるみたいで、このCCSIDを理解することが非常に重要なポイントだと思われる。

- CCSID 5026／CCSID 5035
    - 日本語を取り扱うことができる。
    - 5026はCCSID 5035と英小文字/半角カタカナのコードポイントが逆になっている。
    - 5026にはコードページが内部的に２つ存在しており、それを切り替えながら利用することができる。
        - 英小文字と半角カタカナが同じコードポイントとなっていて、それを切り替えられるという理解で良いか？
- CCSID 1399
    - 5035の拡張でJIS第三・第四水準文字も取り扱える文字コードも取り扱うことができる。

## シフトイン・シフトアウト

EBCDICの文字コードにおける`0E` `0F`の文字コードを表し、全角文字の開始位置から終了位置までを囲う文字コード。
このシフトイン・シフトアウトが正しくセットされていないと、EBCDICではダブルバイトの文字を正しく表示できない。
Docker 入門にはインストールなしで使える「Play with Docker」がいいと思う


[Play with Docker]:http://play-with-docker.com/
[Play with Docker Classroom]:https://training.play-with-docker.com/
[Docker Hub]:https://hub.docker.com/

# Play with Docker とは

[Play with Docker] \(以下PWD)はブラウザで使えるクラウド上の使い捨て Docker 実行環境です。
PC に Docker をインストールする必要はありません。
必要なのはブラウザと Docker ID([Docker Hub] のアカウント)だけです。

<img width="611" alt="Play_with_Docker.png" src="https://qiita-image-store.s3.amazonaws.com/0/35192/d3b5337d-9bff-de2f-cd91-9983e13c3d0b.png">

起動するとブラウザ上にコンソールが開くのでここで docker コマンドや docker-compose コマンドが使えます。

<img width="1008" alt="Docker_Playground.png" src="https://qiita-image-store.s3.amazonaws.com/0/35192/0c88fb3f-8126-57ea-8229-005bfc2c0811.png">

# こんな人にオススメ

- Docker を使ってみたいけどインストールするのが面倒だと思っている人
- 回線が遅すぎてイメージのダウンロードに時間がかかる人
- Docker でローカルPC環境を汚すのが嫌な人

# Play with Docker のここが凄い

- ブラウザだけで使える
- ポートが使える
- sshが使える
- gitが使える

## ブラウザだけで使える

PWD を使うには ローカルPCにブラウザだけインストールしてあれば Docker が使えます。
ローカルPCを一切汚すことはありません。
ちなみにローカルPCに Docker をインストールして使う場合には結構環境が汚れます。

## ポートが使える

PWD でコンテナを実行するときに`-p`オプションでポートを指定すると、外部からアクセスできるようになります。
PWD でミドルウェアを起動してローカルPCからアクセスするということができます。

<img width="1008" alt="Docker_Playground.png" src="https://qiita-image-store.s3.amazonaws.com/0/35192/d4770239-50fe-3218-55a9-f02356d470da.png">

<img width="560" alt="Welcome_to_nginx_.png" src="https://qiita-image-store.s3.amazonaws.com/0/35192/104181e4-14c4-00de-233b-a103349d5b38.png">

## sshが使える

PWD の環境にはsshでアクセスできるので、scpでファイルを転送したりできます。

## gitコマンドが使える

PWD の環境には git もインストールされているので、Docker Hub で公開されていないアプリでも GitHub から clone して使うことができます。

# Play with Docker の注意点

- PWD環境の制限時間は4時間です。４時間経過すると環境が削除されるので新たに作成しなおす必要があります。
- セキュリティは考慮されていないので重要なデータを置くことはできません。

# Play with Docker Classroom

[Play with Docker Classroom] は [Play with Docker] を使いながら Docker の使い方を学習できるトレーニングサイト(英語)です。

<img width="1276" alt="Docker_for_Beginners_-_Linux.png" src="https://qiita-image-store.s3.amazonaws.com/0/35192/f40d597b-42a0-b7dc-c133-e50db7a7d8e9.png">

左側に説明があり、右側に PWD のコンソールが表示されます。

説明内のコマンドはクリックすると右側でコマンドが実行できるので、コマンドをて入力する必要はありません。

<img width="1168" alt="Docker_for_Beginners_-_Linux.png" src="https://qiita-image-store.s3.amazonaws.com/0/35192/b45acad8-6004-fa9e-4d55-61521788cd6f.png">

# ローカルPCに Docker をインストールして使うと環境が汚れる

世間一般では「Docker を使えば環境が汚れない」と言われていますが、実際には結構汚れます。

- Docker をインストールする必要がある
- イメージをダウンロード(pull)するのでディスク容量を使う
- 消し忘れのコンテナが溜まる
- ポートを使う

Docker の入門書などでは前半で`--rm`オプションには触れていないことが多いので、気づいたら大量のコンテナが作成されていたという経験をした人は多いはずです。

# まとめ

- PWD はブラウザで使える Docker 環境
- PWD を使えばローカルPCの環境を一切汚さない
- Docker をローカルPCで使うと環境が汚れる
Slackが最強完璧なアイディアノート & メモアプリケーションである理由 (UI/UX/アプリケーション論)


# 例

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/8def3644-6a4c-ed50-d0d0-49662cd3e433.png)


# 爆速UI

- 人間の脳との親和性。
- 人間のアイディアは生まれては消えてゆく。
- 思考スピードに追いつくUI。

# 積み上げ型・ストリーム式

- 管理式ではなく、積み上げ型として使える。
- ユーザーに「管理コスト」を支払わせない。これが激しく大事。
- メモの数が膨大になってくると管理は不可能になる。

# スター

- 特に重要なアイディアやメモはハイライト出来る。

# コメント絵文字で激アツな視認性

- コメントの絵文字で視認性を上げられる。これが激しく重要。

# 絵文字リアクションで完了マーク

- 絵文字リアクションで「完了済み」のものなどに印を付けられる。

# カスタム絵文字でシンボルのアイデンティティを創造

- カスタム絵文字が使える。例外的なシンボルを使える。

# スレッド機能

- メインのストリームを汚さずに詳細情報を書くことが出来る。
- ストリームが汚れると視認性が激しく下がる。
- トップビューなめんな。

# ソーシャル性

- public チャンネルであれば他の人が見ることができる。

# マルチデバイス対応

- これがなくては話にならない。

# Cloud対応

- これがなくては話にならない。
- Cloudというか、どこからでもアクセスできるというだけの話だけど。

# Hey yumainaura

- [yumainaura slack ui ux - Google Search](https://www.google.co.jp/search?q=yumainaura+slack+ui+ux&oq=yumainaura+slack+ui+ux&aqs=chrome..69i57j69i60l3j69i64l2.3500j0j7&sourceid=chrome&ie=UTF-8)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
PySparkでS3上のファイルマージ

# マージ処理

いろいろ調べた結果以下のように

- [Sparkで集計し終わったファイルをひとまとめにする](https://qiita.com/RyujiKawazoe/items/0d2051637e9ce3b33e20)

を元にScalaコードをPythonへ移しました。

- `s3a`は`s3`でもいいのだろうか？未検証
- `copyMerge`の第５引数はTrueでマージ元ディレクトリを消す
- マージしたファイルをマージ元ディレクトリに入れていると一緒に削除されてしまう

ScalaのAPI, [copyMerge](https://hadoop.apache.org/docs/r2.7.1/api/org/apache/hadoop/fs/FileUtil.html#copyMerge(org.apache.hadoop.fs.FileSystem,%20org.apache.hadoop.fs.Path,%20org.apache.hadoop.fs.FileSystem,%20org.apache.hadoop.fs.Path,%20boolean,%20org.apache.hadoop.conf.Configuration,%20java.lang.String))

```java
public static boolean copyMerge(FileSystem srcFS,
                Path srcDir,
                FileSystem dstFS,
                Path dstFile,
                boolean deleteSource,
                Configuration conf,
                String addString)
                         throws IOException
Copy all files in a directory to one output file (merge).
```

書いたコード

```python
    def merge(bucket, suffix, file_name):
        uri = spark_context._gateway.jvm.java.net.URI
        path = spark_context._gateway.jvm.org.apache.hadoop.fs.Path
        file_sys = spark_context._gateway.jvm.org.apache.hadoop.fs.s3.S3FileSystem
        file_util = spark_context._gateway.jvm.org.apache.hadoop.fs.FileUtil
        conf = spark_context._jsc.hadoopConfiguration()

        # ex) bucket = 'hangedman.s3.com'
        # ex) suffix = '/output/dir'
        # ex) file_name = 'output.csv'
        src_path = "s3a://{}{}".format(bucket, suffix)
        fs = file_sys.get(uri.create(src_path), conf)
        dst_file = "s3a://{}{}/{}".format(bucket, suffix, file_name)
        file_util.copyMerge(fs, path(src_path), fs, path(dst_file), False, conf, None)
```
全てのアプリケーションは人間ドメインに依存している。(UI UX サービス設計)


# 人間の記憶

- 揮発性である。
- だからこそアプリケーションには速度が要求される。
- 速度が遅いと数秒単位でユーザーの記憶は失われる。

# 人間の注意力

- とても逸れやすい。
- だからこそアプリケーションの本質とは、つまり、ユーザーの注意力に対する働きかけだ。
- アテンション・コントロールは未来のアプリケーションの究極の命題だ。

# 人間のデバイス

- とても優れている。
- だからアプリケーションは「手足」のように動かせる必要がある。
- 現状は全てのアプリケーションが「手足」よりも劣るボトルネックになっている。

# Link

- [ui ux yumainaura - Google Search](https://www.google.co.jp/search?q=ui+ux+yumainaura&oq=ui+ux+yumainaura&aqs=chrome..69i57j69i60l3.2834j0j7&sourceid=chrome&ie=UTF-8)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
メモ: 事業主はクーリングオフ出来ない

クーリング オフが出来るのは消費者の場合であって、
事業主（フリーランスももちろん）はクーリング オフ出来ない。常識だったかな。。

* [中小企業庁：相談事例その1：事業者間の取引に関しては、クーリング・オフは適用されません](http://www.chusho.meti.go.jp/faq/jirei/jirei001.html)

* [クーリングオフできない？事業者間の契約について | 相談サポート通信｜日本法規情報株式会社](https://news.soudan-form.com/news/post260.html)

事業主を狙った営業が多いのはこういうことなのかも。


## 対策

* 消費者センター
* 商工会議所
* 警察

などの相談窓口に相談

弁護士と顧問契約を結ぶことも1つの方法。
[Javascript] Swiperで初期状態非表示にするとスワイプがぎこちなくなるバグの対処方法

![image.png](https://qiita-image-store.s3.amazonaws.com/0/52847/752b3cc6-73a2-6d34-15a6-e632f64cf4f9.png)

カルーセルの実装に[Swiper](https://idangero.us/swiper/)を最近よく使っていたが、
初期状態がdisplay: noneなどで非表示で、あとから表示した場合、スワイプがぎこちなくなるというバグに遭遇。

https://github.com/nolimits4web/Swiper/issues/1981

```
observer: true,
observeParents: true,
```

インスタンス作成時に↑の2つのオプションを渡すとうまくいくようになった。
git commit, fetch, pull (git LT vol.1)

社内 LT に使ったものを少し改編しています
主に git 初級者の方 (私もですが) に向けた内容だと思います
Qiita スライドモードでご覧頂ければ幸いです

---

# 目次

- 1. 「commit & push」 ボタンを常用しない (IDE 等)
- 2. pull だけでなく fetch も (たまに) 使ってみよう！
- おまけ. 私が git を好きな訳

---

# 1. 「commit & push」 ボタンを常用しない (IDE 等)

---

## commit と push の役割を理解しよう！

- commit -> ローカルリポジトリへの変更
- push -> リモートリポジトリへの変更

なのでいくら commit しても push するまで他の人は見られない
また、commit しなければ push し続けてもリモートは変更されない

---

## commit & push だと・・

- 共通のブランチ (チームで 1 ブランチ等) で作業している場合、他の人の PR 中だと自分が commit & push できない
- commit & push した後に間違いに気づいたら都度 commit & push となり commit log が汚くなりがち

PR: Pull Request

---

## commit をある程度まとめて push だと・・

- 共通のブランチ (チームで 1 ブランチ等) で作業している場合、他の人の PR 中でも自分のタイミングで commit ができる
- commit した後に間違いに気づいても push 前だったら修正可能
- 1 commit の粒度を小さくする習慣が身につく (と思う) ！
- push 前に commit を見返すことで、commit log が綺麗に　(なりそう) ！

---

## 「commit & push」 ボタンを常用している方は「commit」 をある程度まとめて 「push」も試すと良いかも :smile:

---

# 2. pull だけでなく fetch も使ってみよう！

---

## pull と fetch の役割

- pull -> リモートリポジトリから最新の情報を取得し、ローカルブランチに反映
- fetch -> リモートリポジトリから最新の情報を取得

---

## しかし fetch だけしてもローカルブランチに反映されないよ？

fetch した情報はいったいどこへ・・

---

## リモートとローカルの整理

|種別  |場所  | |
|---|---|---|
|リモートブランチ  |リモート  |  |
|リモート追跡ブランチ  |ローカル  |remotes/origin/master, remotes/origin/develop 等  |
|ローカルブランチ  |ローカル  |master, develop 等  |

リモートブランチとローカルブランチの間に、**「リモート追跡ブランチ」がローカルに存在します**！

---

## pull

|種別  |場所  | |
|---|---|---|
|リモートブランチ  |リモート  ||
|リモート追跡ブランチ  |ローカル  |↓ pull |
|ローカルブランチ  |ローカル  |↓ pull|

pull はローカルブランチの変更まで全て一気に行う

---

## fetch

|種別  |場所  | |
|---|---|---|
|リモートブランチ  |リモート  ||
|リモート追跡ブランチ  |ローカル  |↓ fetch |
|ローカルブランチ  |ローカル  ||

fetch はリモート追跡ブランチの変更まで
なので merge するまでローカルブランチは変更されません

---

## pull = fetch + merge

`$ git pull`

は

`$ git fetch && git merge origin/master`

---

## ところで pull じゃなくて fetch する時って

- リモート上 (GitHub 等) からリモートブランチを作った場合
 - `$ git fetch -a`
- リモートの master を pull して自分の作業ブランチに反映させたい時
 - `$ git fetch -a && git merge origin/master`
 - これは長い `$ git stash && git checkout master && git pull && git checkout my-branch && git merge master`

とか？他にあったら教えてください！

---

## たまには fetch も:smile:

---

# おまけ. 私が git を好きな訳

- ブランチのチェックアウトが速い
- リーナス・トーバルズさんが作った動機がかっこいい

---

## TED「リーナス・トーバルズ: Linuxの背後にある精神」より抜粋

- (リーナス) Gitは私にとって２番目の 大プロジェクトですが それはただ自分の最初の大プロジェクトを 維持管理するために作ったんです それが私の 仕事の仕方なんです ただ楽しみのために プログラムを 書くこともありますが 私は役に立つプログラムを 作りたいんです だから 私のプロジェクトはどれも 私自身が必要としていた ものでした
- (クリス) つまりLinuxにせよGitにせよ あまり多くの人と働かずに 済むようにしたいという あなたの欲求から予期せず生まれた 結果だったわけですね
- (リーナス) まったくもってそうです
- (笑)
- (クリス) いやはや驚きです
- (リーナス) まったく
- (拍手)

2016/5/17(火) 9:39配信
( translated by Yasushi Aoki , reviewed by Natsuhiko Mizutani )
https://headlines.yahoo.co.jp/ted?a=20160517-00002464-ted
remとかemとか・・・「htmlのフォントサイズを62.5%にするのは何でだろう？」bodyに記述するんじゃダメなの？

フォントサイズ "rem" と "em" の指定

"rem" と "em" が相対指定っていうのは知ってるよね？

では、何基準の相対なのかな？

相対ってことは、何かを基準にしてるってことだよね？

▼答え

"rem" は "root-em"　の略
html文書のrootはhtmlタグ。
だから
remの単位は、htmlタグのフォントサイズに対して、何emかを指定してるっていう意味になるんだ。

では、 "em" ってなーに？

"em" っていうのは、「親要素の文字サイズを基準にして、どのくらい大きいの？小さいの？」っていう指定なんだ。

>em (単位) - Wikipedia
>https://ja.wikipedia.org/wiki/Em_(%E5%8D%98%E4%BD%8D)

>em（エム）は、出版において使用される長さの単位である。文字の大きさを表す。名称の由来は大文字M。Mの活字が縦横いっぱいの空間を占めることから、文字の大きさの基準となったとされる。現代では文字の高さと同じ幅と定義され、和文組版では全角幅に等しい。


ちなみに、htmlの "emタグ" はEmphasis（強調）の略なので、フォントサイズの指定の"em"とは意味がちがうんだ。


## 実際のサイズはいくつ？

```html:html
<!DOCTYPE html>
<html lang="ja">
<head>
    <title>remとかemとか</title>
</head>
<body>
    <p><span>フォントサイズは何pxになるのかな？</span></p>
</body>
</html>

```


```scss:style.scss
html {font-size: 16px;}
p {font-size: 10px;}
span {font-size: $font-size;}

//$font-sizeが "1rem" のとき、フォントサイズは "16px" になる
//$font-sizeが "1em" のとき、フォントサイズは "10px" になる
```

▲$font-sizeが "1rem" のとき、実際のspanのフォントサイズは "16px" になる
▲$font-sizeが "1em" のとき、実際のspanのフォントサイズは "10px" になる


## まとめ
「htmlのフォントサイズを62.5%にするのは何でだろう？」　
remやemの意味を調べたきっかけです。
言葉の意味や歴史まで知ってみると、本当の意味を理解しやすいと思う。
実際に "rem" が "root-em" ってことを知ってからは、フォントサイズの基準をhtmlに記述する意味が理解できました。
それと、
 "em" という呼称は大文字Mに由来してるって・・・めっちゃ驚きました！！！
MySQL で UPDATE された行の ID をアトミックに取得する

# 例

以下のようなテーブルがあります。

```sql
create table users(
  id integer not null primary key auto_increment,
  email varchar(191) not null unique,
  name varchar(191) not null
);
``` 

- メールアドレスが `example@example.com` のユーザの名前を `John` に設定
- 同時にそのユーザの `id` を取得

これを**SQL1文**だけでアトミックに実行する方法を紹介します。

## SQL

```sql
-- 更新と id の記憶
update users
set id = LAST_INSERT_ID(id),
    name = 'John'
where LAST_INSERT_ID(null) is null
  and email = 'example@example.com'
limit 1;

-- 選択
select LAST_INSERT_ID(); -- これは C API の mysql_insert_id() でも呼べる
                         -- PHP なら PDO::lastInsertId()
```

## 解説

[MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.14 情報関数](https://dev.mysql.com/doc/refman/5.6/ja/information-functions.html#function_last-insert-id)

- MySQL の `LAST_INSERT_ID()` は，テーブルに対して最後にインサートされた値を返す関数ではなく， **<ins>接続ごとに</ins>任意の値をローカル変数のように記憶できる関数** である。
  - `LAST_INSERT_ID()` として引数無しで呼ぶと，記録されている値を返す。
  - `LAST_INSERT_ID(expr)` とすると `expr` の 値を記録する。
  - オートインクリメントが設定されている場合， `LAST_INSERT_ID(主キー)` に相当する処理がインサート処理の後に自動で実行される。
- 評価順序は `where` 句が先で，合致した場合のみ `set` 句が評価される。

これを踏まえた上で先程のSQLをコメントで解説するとこんな感じ↓

```sql
update users
set id = LAST_INSERT_ID(id),         -- (2) email での絞り込みが済んだ後に該当する行の id を記憶
    name = 'John'
where LAST_INSERT_ID(null) is null   -- (1) 以前の結果が残っている場合に備えてNULLクリア
  and email = 'example@example.com'
limit 1;
```

更新後の値が同じで `ROW_COUNT()` がゼロを返す場合にも `set` 句が評価さえされていれば有効なので，実際に行の1カラム以上が更新されたかどうかに左右されず，常に結果を取得できます。

### 注意点

`LAST_INSERT_ID()` は文の種類を問わずに `LAST_INSERT_ID(expr)` の値を取得できますが， **`mysql_insert_id()` は `insert` `update` のいずれかを実行した場合にしか更新されません！**

今回のケースでは `update` を使っているので問題なく `mysql_insert_id()` のほう使っちゃってOKです。つまり本当に1文だけで実現できています。

## おまけ

Laravel 版

```php
User::query()
    ->whereNull(DB::raw('LAST_INSERT_ID(null)'))
    ->where('email', 'example@example.com')
    ->limit(1)
    ->update([
        'id' => DB::raw('LAST_INSERT_ID(`id`)'),
        'name' => 'John',
    ]);

$id = (int)DB::getPdo()->lastInsertId() ?: null;
```

この順番のほうが直感的で読みやすい感！
Swift：macのCPU使用率を取得する

#ソースと使用例

```swift:ソース
import Darwin

public class CPU {
    
    private let loadInfoCount: mach_msg_type_number_t!
    private let machHost = mach_host_self()
    private var loadPrevious = host_cpu_load_info()
    
    init() {
        loadInfoCount = UInt32(MemoryLayout<host_cpu_load_info_data_t>.size / MemoryLayout<integer_t>.size)
    }
    
    private func hostCPULoadInfo() -> host_cpu_load_info {
        var size: mach_msg_type_number_t = loadInfoCount
        let hostInfo = host_cpu_load_info_t.allocate(capacity: 1)
        
        let _ = hostInfo.withMemoryRebound(to: integer_t.self, capacity: Int(size)) { (pointer) -> kern_return_t in
            return host_statistics(machHost, HOST_CPU_LOAD_INFO, pointer, &size)
        }
        let data = hostInfo.move()
        hostInfo.deallocate()
        
        return data
    }
    
    public func usageCPU() -> (system: Double, user: Double, idle: Double) {
        let load = hostCPULoadInfo()
        let userDiff = Double(load.cpu_ticks.0 - loadPrevious.cpu_ticks.0)
        let sysDiff  = Double(load.cpu_ticks.1 - loadPrevious.cpu_ticks.1)
        let idleDiff = Double(load.cpu_ticks.2 - loadPrevious.cpu_ticks.2)
        let niceDiff = Double(load.cpu_ticks.3 - loadPrevious.cpu_ticks.3)
        loadPrevious = load
        let totalTicks = sysDiff + userDiff + idleDiff + niceDiff
        let sys  = 100.0 * sysDiff / totalTicks
        let user = 100.0 * userDiff / totalTicks
        let idle = 100.0 * idleDiff / totalTicks
        return (sys, user, idle)
    }
    
}
```

```Swift:使用例
let cpu = CPU()
var timer = Timer.scheduledTimer(withTimeInterval: 3.0, repeats: true) { (t) in
    let res = cpu.usageCPU()
    Swift.print("システム: \(res.system)")
    Swift.print("ユーザ: \(res.user)")
    Swift.print("アイドル: \(res.idle)")
    Swift.print("CPU使用率: \(round(10.0 * (res.system + res.user)) / 10.0)\n")
}
```

#参考
[beltex/SystemKit](https://github.com/beltex/SystemKit)
[SwiftでアプリのCPU使用率とメモリ使用量を取得する](https://qiita.com/rinov/items/f30d386fb7b8b12278a5)
Ubuntu14.04にCUDA10を入れる

まずは、以下を実行しておく

```
apt-get update
apt-get upgrade
```

今まで使っていたものを削除する

```
sudo apt-get remove nvidia*
sudo apt-get remove cuda*
sudo apt-get autoremove
```

[CUDA Toolkit 10.0 Download](https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1404&target_type=runfilelocal)
で以下のように選択する。

![cuda-download-image.png](https://qiita-image-store.s3.amazonaws.com/0/182253/5d96e99c-db61-6ed1-6ac2-a0dee18a814d.png)

`Ctrl + Alt + F1`でCUIに移動して、

```
sudo service lightdm stop
```

ファイルのある場所に移動して(`cd ~/ダウンロード`)

```
sudo sh cuda_10.0.hoge_hoge.hoge_linux.run
```

## おまけ
tensorflow-gpuとkerasはanacondaで入れると必要なcudnnとかを自動でインストールしてくれる。さらにpipで入れるより高速らしい

```
conda install tensorflow-gpu
conda install keras
```