OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu16.04LTSで突然GUIログインできなくなった

#<b>環境
OS　　 　 　Ubuntu16.04LTS　64bit 日本語版
メモリ　　 　16GB
プロセッサ 　Intel(R) Core(TM) i7-7700 CPU @ 3.60GHz
グラフィック　msi GeForce GTX 1060 6GB (製品型番: GeForce® GTX AERO ITX 6G OC)

#<b>症状
<b>ログイン画面が出ず、フリーズしているような状態。<b>

はじめはフリーズしているのかと思ったが、どうやらEnterを押して、いつものようにログインパスワードを入力するとログインできた。
しかし、ログインしてみると背景しか表示されない！これは困ったということで、解決法を模索しうまく言ったのでメモ。


#<b>やったこと
###1. 状態確認
まずフリーズしているような状態からCUIでログインを行いました。（Ctl+Alt+F1）
うまく画面が表示されない系は、だいたいグラボのドライバが悪さをしている場合が多いので、


```グラフィックドライバ確認
dpkg -l | grep nvidia
```
で確認をして、もし入っていたら

```グラフィックドライバ確認
sudo apt remove nvidia*
sudo apt autoremove
```
これでアンインストール。ここで一旦、rebootします。
再起動できたらCUIでまたログインしてください。

###2. ドライバを入れなおす
ドライバを入れなおすためにX Serverを止めます。

```XServerを止める
sudo service lightdm stop
pkill Xorg
```

もし一行目でエラーが起きたら、ディスプレイマネージャーがlightdmではなく他のもの（たぶんGDM）になっていると思うので

```XServerを止める
sudo dpkg-reconfigure lightdm
```
とか入力してみてください。そうするとlightdmが選べるので、選択すれば変更できます。

このあとNVIDIAのドライバーを入れるのですが、
 [NVIDIA公式サイト](www.nvidia.com/drivers) にアクセスして入手した.runファイルは，うまくいかないと評判らしいので、ppaから入れます。


```ドライバーインストール
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt-get install nvidia-390
```

これで再起動したら無事に動きました。

#<b>参考
http://swytel.hatenablog.com/entry/2018/05/08/174943
マウスを使おう

人によっては、マウスを使うなという人もいますが、マウスもそれなりに優秀なデバイスなので、どんなところが便利か説明します。
#マウスの操作の基本
マウス操作の基本は、これだけ。
**マウスのボタンって離した時に反応する**
ボタンを離す時にだけ気を遣えばいいんです。
ドラッグが苦手な人はここ！！そういうとこだぞ！！
#Excelのドラッグ
Excelは特にマウスを使うなっていう人が多いです。
ショートカットキー便利ですもんね。
でもそれだけじゃありません。
1.マウスで範囲選択して、
2.範囲選択した周りの線にマウスを合わせて＋字アイコンにして・・・
3.そのままドラッグして離すと・・・
4．移動できます。
![data223.gif](https://qiita-image-store.s3.amazonaws.com/0/247287/ab16c265-c92c-787e-eabe-b7a76d1fd9fa.gif)
移動するセルが式を参照していても・・・
![data226.gif](https://qiita-image-store.s3.amazonaws.com/0/247287/6704a1b3-d166-0909-f43f-cabeb6156ab2.gif)
元の参照は変わりません。
ちなみに、Ctrlを押したまま同じ方法でドラッグするとコピーになります。
この場合、普通のコピーと同じくコピーした先の計算式は相対参照でずれていきます。
#Wordのドラッグ
1.範囲選択して
2.ドラッグすると・・・
3.移動します。
![data227.gif](https://qiita-image-store.s3.amazonaws.com/0/247287/80fa982f-967f-7b1f-5d24-74e3cbf30aa2.gif)
WordもExcel同様、Ctrlキーを押したままドラッグすることでコピーになります。
#まとめ・マウスでの操作のメリット
実はマウスで操作するには大きなメリットがあります。
**この移動、コピーは一切クリップボードをいじりません。**
つまり、はじめにＡをCtrl+Cでコピーしておいて、Bをマウスドラッグで移動した後に、AをCtrl⁺Vで貼り付けることができます。
この操作はGUIのテキストエディタであれば共通して使える動作なのでプログラミング時にも役立つと思います。
Vueライブラリをnuxtで作ってnpmに公開してみる

# 背景
フロントエンドが全然わかっていない。
例えばかの有名な、Angular, React, Vueあたりに触ったことがないので、
個人的に今熱そうなVuejsに触れて見ることにした。
目標は自作ライブラリ公開にした

# Nuxt.js
とりあえず公式見ながら適当に遊んでいたら、
いつの間にかフレームワークのNuxt.jsを使っていた。

```
Nuxt.js はユニバーサルな Vue.js アプリケーションを構築するためのフレームワークです。
```

まあ、とりあえず良しとする

# 外部ライブラリ呼び出しを学ぶ

適当なライブラリをインポートして遊んでみることにする。
[vue-typer](https://www.npmjs.com/package/vue-typer)が直感的に使えそうだったのでnuxtにインポートしてみた。
これだけでも初見だと難しかったが、検索エンジンを駆使してなんとか。

- npm installする
- ロード用のpluginを作る

```root/plugins/vue-typer.js

import Vue from 'vue'
import VueTyper from 'vue-typer'

Vue.use(VueTyper)

```

- nuxt.config.jsに登録する

```nuxt.config.js

plugins: [
    { src: '~plugins/vue-typer.js', ssr: false },
]
```

- コンポーネントを呼び出す

```pages/index.vue
    <no-ssr>
      <vue-typer text='Hello World! I was registered locally!'></vue-typer>
    </no-ssr>
```

no-ssrで呼ばなければエラー出るようだ。（サーバーサイドレンダリングしない）


ざっとVueライブラリの形が見えてきたので
今度はそれに習い、コンポーネントを作ってみる。

# コンポーネント作成まで

#### まずはローカルで作成することにする
vue-typerの動きだけを模倣するような、コンポーネントをローカルで作った。
そのあとはそれを加工して、こんな感じで文章がランダムで構築されていくように見えるコンポーネントを作った。

![vue-chara-builder-demo.gif](https://qiita-image-store.s3.amazonaws.com/0/105662/76d3ae49-a4c1-475f-b8ac-86ba17bc0b4d.gif)

- ページリロードのたびに実行される
- 毎回ランダムな順番に文字列を組み立てる（上の画像はgifなんで同じですが）

良い名前が思いつかなかったので、vue-chara-builderと名付けた。

[ソースコード](https://github.com/SLEAZOIDS/vue-chara-builder)


# ライブラリにしよう

ライブラリ公開の方法はこちらを参考にさせていただきました。ありがとうございます！
https://allabout-tech.hatenablog.com/entry/2018/03/22/124300

なので基本はそちらを見てもらった方が良いかとは思いますが、初心者視点から簡単に解説を。

### ライブラリ公開用に別の環境を作ろう
vue-cliなどで、別のディレクトリに環境を一個作る

### ローカルで作成したライブラリをその環境に移す

### npm用にwebpack.config.jsとpackage.jsonを用意する
npmにアップロードしたり、インストールするために用意する
書き方はコピペになってしまうので上記サイトをご参考ください。
なお、ライブラリ名は自身のものに合わせる

### npm run buildで公開用jsを作成しよう
webpack.config.jsに設定した内容に沿ってビルドされ、
dist以下にライブラリ名のjsが生成される
極論こいつさえあればライブラリは動く。（たぶん）

### READMEを書こう
まあ後でもいいのですが、書いておいた方が良いです。

### githubにcommitしてpushしよう（任意）
多分なくても良い、のかな。

### npmのアカウント作成しよう
https://www.npmjs.com/
ここでregistする。
なお、登録後に届いたメールの認証をしておかないと次に進めない

### npmアカウントをライブラリと紐付けよう
`$npm adduser`でライブラリとアカウントを紐付けられます。

### ライブラリをpushしよう
`$npm publish`でライブラリをnpmに配置できます

#### 落とし穴
メインは
`dist/vue-chara-builder.js`
ってファイルだったんですが、最初はgitignoreされていてpushされてなかったんで
npm installしてもライブラリが見つかりません、って怒られた。

#### npmに配置できた
<img width="1225" alt="スクリーンショット 2018-08-29 14.49.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/105662/56b5bb7b-ecef-4aa4-06ae-ab8ebd0e2278.png">

https://www.npmjs.com/package/vue-chara-builder

### 更新するときは
`$npm version patch`でライブラリのバージョンをあげて
`$npm publish`で更新可能



# ライブラリを使おう
さて、npmには無事登録できたので、npmを経由して使ってみよう

### npm install
`npm install xxxxx`でインストールしよう

### ライブラリを読み込もう
上の方で書いてる「外部ライブラリを読み込もう」と同じことをする。

#### これで、無事npm経由で自作ライブラリを読み込むことができました。


# 感想とか
正直今回のライブラリではあまりVuejsの良さを引き出せるようなものではなかったのですが、
興味を持つとっかかりとしてはやって良かったなあ、と思いました。

nuxtjsの実行環境はDockerコンテナをベースにしているので、
もしかしたらローカルとは何か違っていたりするかもしれません。

また、nuxtjs使わずにVueだけでライブラリを読み込む場合だったら、
vueへインポートする手法に差が出るかと思いますのでご注意ください。
（そっちはググればいっぱい出てきます）

学ぶ前にtry&errorでいつもやっちゃうのでなんか間違ってたらごめんなさい。。
Ubuntuを18.04にアップグレードしたらRailsが動かなくなったときのメモ

# 起きたこと
Ubuntuを16.04から18.04にアップグレードした後にRailsを動作させようとしたところ、以下のエラーが発生

```sh
 % rails s -b 0.0.0.0                                             
    Sorry, you can't use byebug without Readline. To solve this, you need to
    rebuild Ruby with Readline support. If using Ubuntu, try `sudo apt-get
    install libreadline-dev` and then reinstall your Ruby
（略）
history.rb:4:in `require': libreadline.so.6: cannot open shared object file: No such file or directory - .rbenv/versions/2.5.0/lib/ruby/2.5.0/x86_64-linux/readline.so (LoadError)
```

メッセージを確認すると `byebug` というライブラリの動作に失敗しているようで、確認したところ以下の通り同様のメッセージを確認

```sh
 % byebug                               
    Sorry, you can't use byebug without Readline. To solve this, you need to
    rebuild Ruby with Readline support. If using Ubuntu, try `sudo apt-get
    install libreadline-dev` and then reinstall your Ruby.
```

# やったこと

`libreadline.so.6` が読み込めないとのことだったので、読み込み状況を確認すると以下の通り。多分.7にアップグレードされたせい？か？

```sh
% ldconfig -p | grep libread
	libreadline.so.7 (libc6,x86-64) => /lib/x86_64-linux-gnu/libreadline.so.7
	libreadline.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libreadline.so
```

とりあえず以下の通り、シンボリックリンクを貼って対処。これが良いかどうかはよく分からない。

```sh
% ln -s /usr/lib/x86_64-linux-gnu/libreadline.so /usr/lib/x86_64-linux-gnu/libreadline.so.6
```

# 参考
pryでReadlineがないエラーの解決方法 - Qiita https://qiita.com/kanpou0108/items/0fe67e313c03e87277e7

railsで Sorry, you can't use byebug without Readline ていうエラーになるとき - development log http://makotottn.hatenablog.com/entry/2017/08/24/001250
Macでオレオレ証明書＋ webpack-dev-server

`2018/8/29 Sierra で確認済み。`

今回はアプリの webView などで呼ばれる事を想定して、Macのネットワーク名で証明書を作成します。

## Macのネットワーク名取得
[システム環境設定]→[共有]で出てくる、以下の画面でMacのネットワーク名を確認します。

![mac-network-name.png](https://qiita-image-store.s3.amazonaws.com/0/55938/3db80fc1-d02c-b451-8232-508b65e9d352.png)

## pemファイル作成
プロジェクト以下の適当なフォルダに移動して下記を実行。今回は `public/ca` というフォルダで実行しています。

```bash
cd public
mkdir ca & cd ca
openssl req -days 365 -new -nodes -newkey rsa:4096 -x509 -keyout cert.pem -out cert.pem
```
国など聞かれますが、大事なのは `Common Name` です。先程メモしたMacのネットワーク名を入力します。
![1__fish___Users_kurodaeiji_workspace_dfp_popup_video_dist_ca__fish_.png](https://qiita-image-store.s3.amazonaws.com/0/55938/e0c17a5a-9e41-1e3b-9882-16402ffc3c12.png)

これで `cert.pem` が出来ました。これで一応動きはするんですが、この証明書をMacに信頼させます。

## 証明書のインストール
下記コマンドでキーチェーンアクセスを起動し、キーチェーンに登録します。

```bash
open cert.pem
```

![証明書の追加_と_キーチェーンアクセス_と_1__fish___Users_kurodaeiji_workspace_dfp_popup_video_dist_ca__fish_.png](https://qiita-image-store.s3.amazonaws.com/0/55938/c921d2c7-85ec-d552-360a-63b6584d6a55.png)

登録した証明書を探して、ダブルクリックで詳細を開きます。`信頼`という項目があるので、`常に信頼`に変更します。

![キーチェーンアクセス.png](https://qiita-image-store.s3.amazonaws.com/0/55938/a43126ac-145c-08a6-c24a-c3ef32c5e512.png)
![t-mn-ekuroda_local.png](https://qiita-image-store.s3.amazonaws.com/0/55938/3fefd4ab-5341-40fc-9389-65db75b14efa.png)

## webpack-dev-server の設定
configの中身を下記のように書き換えます。

```js
const path = require('path');
const fs = require('fs');
...
    devServer: {
        https: {
            key: fs.readFileSync(path.resolve(__dirname, 'public/ca/cert.pem')),
            cert: fs.readFileSync(path.resolve(__dirname, 'public/ca/cert.pem')),
        },
    }

```
関数もオブジェクトということを忘れないためのコード

# 何をしたかったの？

* vue.jsを解析する際に引っかかったこと

1. はて、Vueオブジェクトの定義が見つからない
2. Vue関数の定義しかない
3. もしかして：Vue関数をオブジェクトとして使ってる!?

* というわけで、検証用のコードを作ってみました。HTML側は適当に書けばOKです（あんまり重要じゃないし）

# コード

```javascript:understand_vue.js
// Vue.jsのソース解析を習熟するためのソース
// Vueの最初の初期化が関数定義だったため、ちゃんと動くのか、どのように動くのか検証するために実装した
(function(param){
  function SomeObj(options){
    console.log(options.msg+"Hi! "+param+" / instance of SomeObj? : " + (this instanceof SomeObj));
  }

  SomeObj.prototype.hoge = function(v){
    console.log("[X]"+v);
  }

  function ex1(Obj){
    Obj.p = param;
  }

  ex1(SomeObj); // Vue関数がひとつのオブジェクトとして存在していることを意味している

  console.log(SomeObj.p);

  v = new SomeObj({msg:"[Create]"}); // new 命令でVueというクラスのインスタンスにもなることも示している

  v.hoge(param);

  SomeObj({msg:"[Call]"});

}('Some Obj is Here!'));
```

# 実行結果

* 結果はコンソールに表示されます

```
Some Obj is Here!
[Create]Hi! Some Obj is Here! / instance of SomeObj? : true
[X]Some Obj is Here!
[Call]Hi! Some Obj is Here! / instance of SomeObj? : false
```

# まとめ

関数を定義するとそれ自体もオブジェクトとして扱えるのを失念しやすいのでこの際覚えよう！
AWS上のWindowsServerにドライブを追加する。

#全体の流れ
*1.AWS Management Console でVolumeの追加
*2.Windows上で、ボリュームディスクを認識させる

##1.AWS Management Console でVolumeの追加
* Management Console からVolumneの新規作成

※省略

* Volumeが作成される。
![B_Volume_01.png](https://qiita-image-store.s3.amazonaws.com/0/284238/5d6cd6bf-f8fe-6b53-da67-f123c35ae73c.png)

* 作成したVolumeを選択して、Actions> Attach Volumeをクリック
![B_Volume_02.png](https://qiita-image-store.s3.amazonaws.com/0/284238/9d54555c-06be-e256-641d-2acd471541f8.png)


* Incetanceは追加したいOSのインスタンスを選択する。[Attach]をクリック
![B_Volume_03.png](https://qiita-image-store.s3.amazonaws.com/0/284238/f6122bdd-08d5-3a79-a25e-779437d70d87.png)

* アタッチしたVolumeのステータスが[in-use]になる。
![B_Volume_04.png](https://qiita-image-store.s3.amazonaws.com/0/284238/5c159a8c-41c0-ed9c-0af8-d580f79b2717.png)

AWSコンソール側はこれで終わり。
普通のサーバーならサーバーにただただHDDを挿しただけの状態。
以降で、サーバー側で認識させる。

##2.Windows上で、ボリュームディスクを認識させる


*対象のサーバーにログインする。
*コントロールパネル ＞ 管理ツール　＞　コンピュータの設定を開く
![B_Volume_05.png](https://qiita-image-store.s3.amazonaws.com/0/284238/1a7be838-3b6c-076d-41b9-a80ff3d0c28f.png)

* ディスクの管理を開くと、追加したディスクがofflineになっている事を確認する。
![B_Volume_06.png](https://qiita-image-store.s3.amazonaws.com/0/284238/a1d83c6f-3ee3-0028-0cd8-319c75d2ae44.png)

* コマンドプロンプトを開き以下を実行

```
echo list volume | diskpart
```
ディスクボリュームがないことをここでも確認
![B_Volume_07.png](https://qiita-image-store.s3.amazonaws.com/0/284238/a9fa5345-e6c6-eceb-2569-693d5cf4e8a7.png)

* diskpartを実行

```
diskpart
```

![B_Volume_08.png](https://qiita-image-store.s3.amazonaws.com/0/284238/1324e1b6-3848-420a-4363-a21917fb8f23.png)

*ポリシーを変更してボリュームディスクを認識させる。

```
san policy=Onlineall

list disk
```


![B_Volume_09.png](https://qiita-image-store.s3.amazonaws.com/0/284238/db65bfcb-9c46-b992-d8bb-52514212d0dc.png)

* 追加したボリュームディスクをオンラインにする。

```
select disk 1
attributes disl clear readonly
online disk
```

![B_Volume_10.png](https://qiita-image-store.s3.amazonaws.com/0/284238/41fb1c48-5fb6-f2e7-481e-4559c2e07586.png)

* コンピュータの管理で、追加したボリュームディスクがonlineになっている事を確認する。

![B_Volume_11.png](https://qiita-image-store.s3.amazonaws.com/0/284238/6b9bea4b-bb09-d388-0ba4-78bb615d8f64.png)

* 追加したボリュームディスクを[右クリック]-[新しいシンプルボリューム]をクリック
![B_Volume_12.png](https://qiita-image-store.s3.amazonaws.com/0/284238/321e3ac0-ff36-abf3-4295-bba1e12d3652.png)

*[次へ]をクリック
![B_Volume_13.png](https://qiita-image-store.s3.amazonaws.com/0/284238/1041b65e-6caf-9ab7-c856-e5e442d3df63.png)

*作成するディスクサイズを入力して[次へ]をクリック
![B_Volume_14.png](https://qiita-image-store.s3.amazonaws.com/0/284238/16fefb40-fcf6-cee0-a2c0-62772574dfbd.png)

*[次へ]をクリック
![B_Volume_15.png](https://qiita-image-store.s3.amazonaws.com/0/284238/a6be3df2-5c0d-ce13-2a57-a0d758fc934f.png)

*[完了]をクリック
![B_Volume_16.png](https://qiita-image-store.s3.amazonaws.com/0/284238/852d93e8-e3ba-3c1a-44fd-a1321d7527d3.png)

*追加されている事を確認
![B_Volume_17.png](https://qiita-image-store.s3.amazonaws.com/0/284238/d749107d-bac9-b92c-6227-80df8b3e317c.png)

*エクスプローラ上からもD:ドライブを確認
![B_Volume_18.png](https://qiita-image-store.s3.amazonaws.com/0/284238/33b107e6-f850-a0c4-3909-09f3aa00b93c.png)

* 完了
CentOS Remiリポジトリ経由でインストールしたphp に ziparchiveを加える

```
yum --enablerepo=remi,remi-php72 install php-pecl-zip
```

でインストール。

```
php -m
```

で`zip`が入ってればOK。

最後に、

```
systemctl restart php-fpm
```
phpinfo情報を見る方法


## ①phpのファイルを用意する

phpinfo.php

```php
<?
phpinfo();
```

## ②php コマンドに実行オプション渡して実行する
```
php -r 'phpinfo();'
```

いっぱい出ちゃって分かりにくければパイプでlessとかに渡すがいいです。

```
php -r 'phpinfo();' | less
```

-r はスクリプトを渡せるコマンド。

## ③php のオプション -i で見る
```
php -i
```
-i は　PHP information

## ④php のオプション　-a で対話形式で実行する
```
php -a
Interactive mode enabled

php > phpinfo();
```

色々方法ありますが、③が良いんじゃないですかね。
kaggleのGetting Startedについて

# 背景
機械学習を勉強しようとした際、kaggleが良いと聞いたため、色々調べていたら以下の記事が...
https://qiita.com/rinn650/items/51ed74616ac42b708264
（わかりやすいですありがとうございます！）

上記記事より、とりあえずGetting startedをすればいいと思い、やろうと思ったのがきっかけ。

また、Qiitaを活用することで自身のモチベーションを上げていこうというのも狙い

# kaggleのカテゴリについて

上記記事より、kaggleは以下のカテゴリに分類されていることがわかった。

- Featured
- Research
- Getting Started
- Playground
- Recruitment
- Masters / Limited Participation
- Annual

※詳細は割愛。

# Getting startedを整理

とりあえず初心者向けのGetting Startedを始めようと思ったところ、いくつか課題が用意されていた。その整理をする。

### Titanic: Machine Learning from Disaster
- 色々な人が記事を書いている登竜門的コンペ
- タイタニック号の乗客の生存予測
- 学べるスキル1：バイナリクラシフィケーション
- 学べるスキル2：PythonもしくはRの基礎
- 生死を0 or 1で出力させて、生存を予測

### House Prices:Advanced Regression Techiniques
- 家の価格を予想する問題
- 回帰問題の一つ
- 様々なデータから家の価格を推定するモデルを作成
- 学べるスキル1：特徴量選択のための創造的な技術
- 学べるスキル2：ランダムフォレストや勾配ブースティング法のような回帰モデル

※学べるスキル1はこの課題は大量の特徴量があり、どの特徴量を使えば家の価格推定のモデルに貢献できるかがミソな部分。その特徴量を理解するのが学べるということ（だと理解しました）

### Digit Recognizer
- 手書き文字を認識する問題
- 画像解析問題の一つ
- 大量の手書き文字データを入力データとし、識別させるためのモデルを構築する。
- 学べるスキル1：シンプルニューラルネットワークを含んだコンピュータビジョン
- 学べるスキル2：SVMやK-nnのようなクラス分類手法

※つまりMNIST

### その他
- Facial Keypoints Detection
- First Steps with Julia
- Bag of Words Meets Bags of Popcorn
- Data Science London + Scikit-learn
- Just the Basics - Strata 2013 After-party
- Just the Basics - Strata 2013

計6つは、カーネルがないため参考になるコードがなかった。。。


タイタニック、家の価格予想、画像の文字認識の三つをやるだけでも以下の技術が学べる
- バイナリクラシフィケーション（つまり二値化）
- PythonもしくはRの基礎
- 特徴量選択のための機械学習に対するマインド
- ランダムフォレストや勾配ブースティングといった回帰モデル
- コンピュータビジョン（ニューラルネットを含む）
- SVMやk-nnといった分類期

# あとがき
今活躍しているデータサイエンティストも最初は基礎から始めたはず（たぶん）。
自分もデータ分析な人間になるべく、一歩一歩がんばろう。
python loggingの書き方(超簡略版)

# 背景

[ログ出力のための print と import logging はやめてほしい](https://qiita.com/amedama/items/b856b2f30c2f38665701)
この記事に出会って、Loggingの考え方を変えた！ありがとうございます！
そして、一応https://docs.python.jp/3/howto/logging.html こっちも軽く読んだ。

でも、じっくり読む暇はない人も多いと思う、自分もじっくり読んでない。とりあえず、上記の記事に則って、自分で使ってみたので、その使い方を共有。

# おまじないを使う

amedamaさんの記事にもある通り、これを書いた。

```python
from logging import getLogger, StreamHandler, FileHandler, DEBUG
logger = getLogger(__name__)
handler = StreamHandler()
handler.setLevel(DEBUG)
logger.setLevel(DEBUG)
logger.addHandler(handler)
logger.propagate = False
```

が、StreamHandlerなので、全部出力される。

でもおそらく、loggingを今まで使ってた人は、printレベルより上なので、logfileに書きたいと思う！

ということで、

# 目標

1. logfileに書きたい！
2. が、一部は、標準出力もしたい。(以前はprintしていたかも?)


# 最終型

1. おまじないに、FileHandlerを追加した。
2. INFOは標準出力(StreamHandler)、DEBUGはlogfile(FileHandler)と設定

```python
from logging import getLogger, StreamHandler, FileHandler, DEBUG, INFO
logger = getLogger(__name__)
handler = FileHandler('/path/to/logfile.log')
handler.setLevel(DEBUG)

stream_handler = StreamHandler()
stream_handler.setLevel(INFO)
logger.setLevel(DEBUG)
logger.addHandler(handler)
logger.addHandler(stream_handler)
logger.propagate = False
```

これで、logfileだけに書きたいものは、`logger.debug('only logfile')`と書いて、標準出力でも見たいものは、`logger.debug('print')`と書けばよい。

infoとdebugの使い方間違ってるかもしれないが、とりあえずやりたいことはできた。


# 最後に

amedamaさんの記事のコメント欄には、色んな人との意見交換があるので、そこも参考にしていただけると。私は全部は見てないし、これが要点だろと勝手にとってきたのを自分なりの使い方に変えただけなので、間違ってると指摘を受ける可能性もありますが、参考になれば嬉しいです。
selenium と python3 でログインしたセッションを維持する方法

# 課題

テストの度にログインするとアクセスをブロックされる可能性があるので、ログイン状態を維持したままテストを行いたい。


#環境
Python 3.6
Selenium
Mac 10.13.6

#コード

```python3:test.py
from selenium import webdriver
options = webdriver.ChromeOptions()
#現在使っているプロファイルへのパス （chrome://version/ を開いて「プロフィール パス」から確認できます）
options.add_argument("user-data-dir=/Users/<ユーザー名>/Library/Application Support/Google/Chrome") 
w = webdriver.Chrome(executable_path="chromedriverへのパス", chrome_options=options)
```

#結果
無事ログインできました。
user-data-dir=/Users/<ユーザー名>/Library/Application Support/Google/Chromeの後に、
Defaultをつけているサイトがあってはまっていました。
【Unity】～SIerからゲーム業界へ～ 第4-3回 簡易アニメーション

・画面上の敵を全て倒す
・ボス登場のアニメーションが流れる
・ボス登場

といった流れをどう作るかということで
簡易的ではありますがアニメーションを作ってみました。

参考サイトは[こちら](https://www.g-angle.co.jp/blog/animation/unity-gacha-performance/)

##実装
Canvasを配置し、子オブジェクトとしてImage(Bossの文字の画像)を作成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/267737/8229e9af-5ae3-cc64-fdc8-e0214cd7c5da.png)


Imageの配置を
1.画面外(左)へ配置
2.画面内へ移動
3.画面外(右)へ移動
となるように録画

![ActionRPGSample3.gif](https://qiita-image-store.s3.amazonaws.com/0/267737/4e858a2c-cce3-b8a3-4718-307740f546e3.gif)



全く味気ないアニメーションですが、徐々にUnityでの表現方法がわかってきました。
作るのが楽しくて仕方ないです。


##現時点
・タイトル
・ゲーム画面
・結果画面
各画面の肉付けは後からやるとして、基本機能を少しずつ実装してきました。

![ActionRPGSample2.gif](https://qiita-image-store.s3.amazonaws.com/0/267737/65713e8b-987f-5e0b-3e52-8db8dbd3eec6.gif)

ソースはGitHubにて公開中です。
https://github.com/straycatz/AcrionRPGSample
グリニッジ天文台に本初子午線は存在しない

![airy-circle-small.jpeg](https://qiita-image-store.s3.amazonaws.com/0/35350/06ff5d83-bc50-5e29-ba6a-0387f7edb6dc.jpeg) [(Airy's transit circle)](http://collections.rmg.co.uk/collections/objects/11153.html)

<iframe src="//www.slideshare.net/slideshow/embed_code/key/HmAcRCIspWB9qh" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/propella/ss-250834108" title="本初子午線はグリニッジ天文台を通らない" target="_blank">本初子午線はグリニッジ天文台を通らない</a> </strong> from <strong><a href="https://www.slideshare.net/propella" target="_blank">Takashi Yamamiya</a></strong> </div>



[グリニッジ天文台](https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%AA%E3%83%8B%E3%83%83%E3%82%B8%E5%A4%A9%E6%96%87%E5%8F%B0)といえば世界標準時の観測地点として、または経度ゼロを決定する基準点として有名です。私達が日々お世話になっている時計や地図アプリが便利に使えるのも、このグリニッジ天文台のおかげなのです。その憧れのグリニッジ天文台ですが、ふと Wikipedia を眺めるとすでに天文台を辞めてしまっただけでなく、本初子午線(経度ゼロの線)すら通っていませんでした！現在では本初子午線は本来の観測器のあった場所から 102 メートルほど東の点にズレたそうです。ズレた理由としては、[IERS基準子午線](https://ja.wikipedia.org/wiki/IERS%E5%9F%BA%E6%BA%96%E5%AD%90%E5%8D%88%E7%B7%9A) にこのような記載があります。

> IRMとグリニッジ子午線との間の約5.3秒のずれは、グリニッジ子午線がグリニッジにおける局所的な鉛直を用いた局所座標系であったために生じたものである。

これを読んでもさっぱり意味が分からなかったので自分なりに調べました。こういう事のようです。

* 昔は天体を観測する時、角度の基準として重力の方向を使っていた。
* 重力の方向は地下の様子によってゆらぎがあるため、GPS などでは地球の形に似た楕円体(の法線)を基準にした。
* GPS では、楕円体を基準にした座標を使っていたが、時刻はあい変わらずグリニッジ天文台の重力方向を基準にした標準時を使っていた。
* GPS で地点計測に使う時刻はグリニッジ天文台の重力方向を基準にしているので、そのまま楕円体を基準にして経度ゼロの位置を調べるとグリニッジ天文台より 102 メートル東にずれてしまった。

> The 102-m offset between the Airy Transit Circle and zero longitude indicated by a GNSS receiver is attributable to the fact that continuity in the UT1 time series was maintained in the BIH reference frames, as geodetic longitudes replaced astronomical longitudes when space-geodetic methods were introduced.

[Why the Greenwich meridian moved](https://link.springer.com/article/10.1007%2Fs00190-015-0844-y)

ようするに、天体を観測する基準を重力方向から地球の形に似た楕円体の法線に切り替える必要が出てきた時に、標準時をずらすか本初子午線の位置をずらすか選ぶ必要があり、本初子午線をずらす事に決めたようです。いろいろ調べても「俺が変えた！」という人の話を見つける事は出来なかったので、もしかして誰かが意識的に変えたというよりは、GPS を運用してみてグリニッジ子午線の重力方向が楕円体の法線と結構ズレてる事に気づいたのかも知れません。

![greenwich-move.png](https://qiita-image-store.s3.amazonaws.com/0/35350/b36c2092-c7eb-9284-1d2e-54ea38ac62ff.png)

これを図で説明してみます。地球を北極の方向から見下ろした図だと思ってください。今本初子午線であるグリニッジ天文台の真上に太陽が登っているので、ある日これをお昼の 12 時と決めました。ここで自然と「真上」の基準として、水準器で測れる重力の方向を使ってしまったのですが、実はあとから重力の方向は場所によって微妙に異なり(赤い破線)、地球の中心(青い丸)を通っていない事が分かってしまったのです。

その後 GPS による位置の測定が可能になりましたが、緯度や経度の計測には局所的な影響のある水準器ではなく、地球に似た楕円体の中心からの角度を使う(正確には法線を使うので南北方向には中心からズレる)事になりました。

すると困った事が起こりました。地球に似た楕円体の中心から伸びた線 (青の Normal)を「真上」と定義してしまうと、今までのお昼の時刻に太陽が本初子午線の真上に来ないという事になってしまうのです。今までどおり本初子午線の真上に太陽が来た時をお昼と定義するには、今までの子午線を地中の中心を通るように平行移動する必要があります。

こうして決められた新しい本初子午線 (Zero longitude) は古い子午線から 102 メートル東に移動になってしまいましたが、おかげちょうど太陽が真昼に楕円体の法線上に来るようになりました。

本初子午線は世界時や緯度経度を決める非常に大切な基準ですが、全く恣意的な位置のため地球上のどこにあっても構わないはずです。それがグリニッジ天文台の 102 メートル東という微妙な位置に定義されてしまっているのは非常に興味深いです。
よく迷子になるから人工衛星"みちびき"を使って現在地を簡単に取得してみた②

#はじめに
みなさんこんにちは
RHEMS技研の荒木です


今回は実際にGY-NEO6MVで位置情報を取得し、みちのりをマップにプロットして迷子になっちゃっても大丈夫なようにしました

①は[コチラ](https://qiita.com/Akijin/items/dad2d7fc5a4b3290420c)

#使用した機器・サービス

- ESP-WROOM-02
- GY-NEO6MV
- [Ambient](https://ambidata.io/)

おおよそはこんな感じです


#Ambientとは

Ambientは簡単に説明するとIoTのめんどくさい部分を全部簡単化してくれるサービスです
Ambientにデータを送るだけでグラフ化してくれたり、保存してくれます
なので、めっちゃ便利になるということです

また、Arduinoにライブラリもあるのでコードもとても簡単なのです
初心者でもラクラクIoTに触れることができるようになるサービスとなっています

今回はAmbientにとてもお世話になります


#くわしく

GY-NEO6MVで位置情報を取得→ESP-WROOM-02を使って送信→Ambientが処理→Web上で現在地を確認→やったー

全然詳しくなってないですがこんなかんじですすめていきます

まずコードはこんな感じです

```
#include <ESP8266WiFi.h>
#include <SoftwareSerial.h>
#include <TinyGPS++.h>
#include <Ambient.h>
// WiFiアクセスポイントの定数
#define WIFI_SSID     "SSID"
#define WIFI_PASSWD   "PASSWORD"

//ambientの定数
unsigned int channelId = ①;
const char* writekey = "②";

SoftwareSerial mySerial(4, 5); //RX=pin4, TX=pin5
TinyGPSPlus gps; 
WiFiClient client;
Ambient ambient;


// 起動時に一度だけ呼ばれるセットアップ関数
void setup(void) {
//シリアルコンソールの準備
  Serial.begin(115200);
  while (!Serial) {
    ;
  }
  Serial.begin(9600);
  while (!Serial) {
    ;
  }
  
  // WiFi接続設定を行う
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWD);

  // WiFi接続を開始する
  while ( WiFi.status() != WL_CONNECTED ) {
    delay(500);
  }
  Serial.println(WiFi.localIP());
  ambient.begin(channelId, writekey, &client);

}

//変数の準備
double ido, keido;
int zikan,hun;

// メインループ
void loop() {
  
  while (mySerial.available()) {
    gps.encode(mySerial.read());
  }
  if (gps.location.isUpdated()) {
    
    Serial.print("緯度 :"); Serial.println(gps.location.lat(), 6);
    Serial.print("経度 :"); Serial.println(gps.location.lng(), 6);
    Serial.print("時間 :"); Serial.println(gps.time.hour() + 9);
    Serial.print("分 :"); Serial.println(gps.time.minute());
    Serial.println(" ");

//諸情報を代入
    zikan = gps.time.hour() + 9;
    hun = gps.time.minute();
    ido = gps.location.lat(), 8;
    keido = gps.location.lng(), 8;

//送るデータを準備(set)したあと送信(send)
    ambient.set(1, zikan);
    ambient.set(2, hun);
    ambient.set(9, ido);
    ambient.set(10, keido);
    ambient.send();
  }
}
```

Ambientにデータを送るために[ライブラリ](https://github.com/AmbientDataInc/Ambient_ESP8266_lib)を導入しています
使い方は、

1. ①、②をambientのmyチャンネルからコピペしてくる
2.  setup内で**ambient.begin(channelId, writekey, &client)**で送る準備をする
3.  loop内で**ambient.set()**で第一引数に1~8の数字、第二引数に送りたいデータをいれる
4.  **ambient.send()**でsetしてきたデータを送る

またAmbientの使用上、9に緯度、10に経度を送ることで自動でマップにプロットされるようになっています
たったこれだけなので簡単ですね！




次は回路部分です
![yK7RNC2+TAaaKCwIhIGeNw.jpg](https://qiita-image-store.s3.amazonaws.com/0/269207/097f821c-4557-f3f6-6223-8f4a13e02ca2.jpeg)

GY-NEO6MVに電源を供給するのにESP-WROOM-02だけだと全然足りてなかった(未検証)ような気がしたのでArduinoから５Vを供給しています
なのでもっともっと小型化は可能になっています
回路部分もこれだけで簡単なものになっているのでIoT初心者でもとっかかりやすいと思います

#おわりに

さていかがでいたでしょうか
とても簡単に現在地を確認できるようになりました
次回は実際に使ってみて本当に現在地が取得できて使用感はいかほどなのかを記事にしたいと思います

ではよきIoTにライフを！
WebAssemblyのloopはまりどころ

はじめてWebAssemblyを書く時は恐らくloopではまります。

以下の関数を見て下さい。1からnまでの和を計算する関数のつもりです。

```
  ;; i32型引数$nを取りi32の返り値を返す関数。さらにローカル変数として$iと$sumを使う。
  ;; ローカル変数は0初期化されるのでそのまま使う
  (func $sum_bad (param $n i32) (result i32)  (local $i i32) (local $sum i32)
    (loop $loop
      ;; もし$iが$nを以上ならloopから抜ける
      (br_if $loop (i32.le_s (get_local $n) (get_local $i)))
      ;; $sum = $sum + $i
      (set_local $sum (i32.add (get_local $sum) (get_local $i)))
      ;; $i = $i + 1
      (set_local $i (i32.add (get_local $i) (i32.const 1))))
    ;; ループから抜けたらreturn
    (return (get_local $sum)))
```

これを動かすと

```
sum_bad: 0
```

と返ってきます。何故でしょう。

なんと`loop`はただの後方ジャンプのためのラベルで、末尾まで到達しても`loop`の位置まで戻りません。戻りたければ `br` を呼ぶと`loop`の位置に飛ぶことになっています。
`loop`に対する`br`が一般の言語でいう `continue` 相当になっている訳ですね。なので上記実装だとloop内は一度しか実行されずに抜けてしまいます。

それを踏まえた実装がこちら。


```
  (func $sum_good (param $n i32) (result i32)  (local $i i32) (local $sum i32)
    ;; loopから脱出するためのラベルを作っておく
    (block $exit 
      (loop $loop
        ;; ループから脱出するときは$exitの方を指定する
        (br_if $exit (i32.le_s (get_local $n) (get_local $i)))
        (set_local $sum (i32.add (get_local $sum) (get_local $i)))
        (set_local $i (i32.add (get_local $i) (i32.const 1)))
        ;; **ちゃんと** ループするためにbrを呼ぶ
        (br $loop)))
    (return (get_local $sum)))
```

今回のコードはこちらで試せます。皆様ご安全に。

https://webassembly.studio/?f=hqjrwuamf7
【プラグインなし】横スクロールなHTML要素の上下にスクロールバーを設置する

通常、横スクロールなHTML要素であれば、要素の下にスクロールバーが出ますが、以前案件で、HTML要素の上にもスクロールバーを設置するというものありました。
その際に使用した、プラグインは使わずにjQueryを使って設置する、ちょっとだけトリッキーな方法をご紹介します。
JS使ってまで上に設置する必要あるんかい！というツッコミが沸くかと思いますが、ちょっとした小技としてご参考になれば嬉しいです。

# 完成イメージ
![img.gif](https://qiita-image-store.s3.amazonaws.com/0/267886/c2931c01-ae1f-2bd5-faf6-510c8576285e.gif)

# サンプルコード
[jQuery](https://code.jquery.com/)を使用します。ここでは3.3.1を使用しました。

## ディレクトリ構造
root/
  ├ index.html
  ├ style.css
  ├ main.js

## HTML

```ruby:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>横スクロールなHTML要素の上下にスクロールバーを設置する</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
  <div id="wrapper">
    <div class="scrollbar" id="scrollbar"><div class="inner"></div></div>
    <div class="scrollbox" id="scrollbox">
      <div class="inner">
        <p class="txt">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Mollitia est similique velit provident illo pariatur quia dolores, molestias deleniti aperiam rerum ducimus, odio, dolorem eos. Quo quos id dolores aperiam!</p>
      </div>
    </div>
  </div>
<script
  src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
  integrity="sha256-3edrmyuQ0w65f8gfBsqowzjJe2iM6n0nKciPUp8y+7E="
  crossorigin="anonymous"></script>
<script src="main.js"></script>
</body>
</html>
```

コンテンツが入るボックスの上に`<div class="scrollbar" id="scrollbar"><div class="inner"></div></div>`を設置しています。
このdiv要素で擬似スクロールバーを設置します。

## CSS
次にスタイルを指定していきます。

```ruby:style.css
#wrapper {
  width: 200px;
  margin: auto;
  padding: 100px 0;
}
.scrollbar {
  width: 100%;
  height: 10px;
  overflow-x: scroll;
  overflow-y: hidden;
}
.scrollbar .inner {
  width: 500px;
  height: 1px;
}
.scrollbox {
  width: 100%;
  margin-top: 5px;
  overflow-x: scroll;
  overflow-y: hidden;
}
.scrollbox .inner {
  width: 500px;
  height: 200px;
  margin-bottom: 5px;
  background-color: #F9F8F6;
}
.scrollbox .txt {
  margin: 0;
  font-size: 16px;
  line-height: 1.5;
}
/* スクロールバーのスタイル */
.scrollbar::-webkit-scrollbar,
.scrollbox::-webkit-scrollbar {
  height: 10px;
}
.scrollbar::-webkit-scrollbar-track,
.scrollbox::-webkit-scrollbar-track {
  border-radius: 5px;
}
.scrollbar::-webkit-scrollbar-thumb,
.scrollbox::-webkit-scrollbar-thumb {
  border-radius: 5px;
  background-color: #e7e7e7;
}
```

スタイル指定のポイントをまとめます。

- `.scrollbar`に`.scrollbox`（スクロールをする外側のボックス）と同じwidthを指定する。
- `.scrollbar` > `.inner`に`.scrollbar > .inner`（コンテンツが入る内側のボックス）と同じwidthを指定する。
- `.scrollbar`のheightを1pxとする。

現地点での見た目はこんな感じです。
まるで`.scrollbox`に2つのスクロールバーが付いているかのように見えます。
<img width="259" alt="img1.png" src="https://qiita-image-store.s3.amazonaws.com/0/267886/83b0fc68-e5df-71bc-317b-9abb810a3220.png">


## JavaScript
最後にJSで`.scrollbar`と`.scrollbox`のそれぞれスクロールが連動するように設定します。

```ruby:main.js
$(function() {
  'use strict';
  $("#scrollbar, #scrollbox").on('scroll', function() {
    if ( $(this).attr('id') === 'scrollbar' ) {
      $('#scrollbox').scrollLeft($(this).scrollLeft());
    } else {
      $("#scrollbar").scrollLeft($(this).scrollLeft());
    }
  });
});
```

表示を確認してみましょう。`.scrollbar`と`.scrollbox`のそれぞれスクロールが連動してれば、完成です。
JQueryでappendしたオブジェクトを消す

探せば、他の人の解説でいっぱいでるが、自宅外から参照する場合の、自分用備忘録として記載する。

##　課題
JQueryのappendしたものでは、単純にClickイベントが発生しない、なんでも「.clickは新たに追加されたDOMに影響を与えないから」だそう。

それだと、フォームにオブジェクトを追加したり・消したりと、subumit前に任意操作できるようなUIでは、うまくいかない
多分、厳密にIDを発行してそれを渡すような関数をボタンにでも設定すれば、消せると思うが、面倒なので.clickイベントで.parentから消したいのだ、その場合どうするか。

##　解決法
答えは、最大上位のページの関数に設定するとよい

######HTML
```html:html
        <fieldset name="testfset" id="testfset">
            <legend id="legend_testfset">test</legend>
        </fieldset>

        <input type="button" value="add" id="jq_test">
```
######Javascript
```js:javascript
$(function() {
 　//追加部
  $('#jq_test').click(function(){
    let html = '<div class="p">aaa<input type="checkbox"><button class="dbtn">del</button></div>';
    $('#testfset').append(html);
  });

  //削除部
  $(document).on("click", ".dbtn", function(){
    $(this).parent().remove();
  });
});
```
追加するオブジェクトが divに囲まれたもので、そのdivごと消える。
それにcheckboxを入れているのは同じ文字列だけだと、どれを消したか判別しづらいので、確実に判別する為。
XojoでMac版アプリの名前を自動的に日本語ローカライズする方法

Mac標準のアプリ「メール」「プレビュー」などは、日本語環境で日本語名が表示されるようになっています。Xojoで作るMac版アプリの名前を日本語にするときも同じようにしたいですよね。

ここではビルド時に自動的に日本語ローカライズ名にするための仕込み方を説明します。

## 前提
これから説明する方法は、Xojoのプロジェクトファイルで言語を「English」にしていて、日本語表記はすべてグローバル定数でローカライズしているのを前提にしています。
![english.png](https://qiita-image-store.s3.amazonaws.com/0/27806/38ee06f6-52c6-7a83-d2df-5e2bb2cc7881.png)


## 目標
最終的にどうなればいいのかを先に説明しておきます。２ヵ所の仕込みが必要です。

### Info.plist
.app内のContentsフォルダにあるInfo.plistに「Bundle display name」が必要です。Xojoのデフォルトでは記述されないので、追加する必要があります。
![info-plist.png](https://qiita-image-store.s3.amazonaws.com/0/27806/69bb09ca-a160-1348-2fa5-88646765720f.png)

### InfoPlist.strings
Contents/Resources/ja.lprojフォルダの中にInfoPlist.stringsファイルが必要です。
![InfoPlist-strings.png](https://qiita-image-store.s3.amazonaws.com/0/27806/cf237352-bb4e-6bce-3b34-a8329eb4dbbd.png)
InfoPlist.stringsはただのプレーンテキストファイルです。ここにローカライズ名が記述されています。Xojoのデフォルトでは、このファイルは生成されません。自分でこのファイルを作って入れる必要があります。

ビルドした後にこれらを手動で仕込むのは可能です。でもビルドする毎にいちいち仕込むのはかなり面倒です。

## 自動的に仕込む方法

### Info.plistに「Bundle display name」を追加する
Xojo 2014 Release 2でできるようになった方法です。
出典：[Adding plist Settings To Your OS X Apps](https://blog.xojo.com/2014/07/14/adding-plist-settings-to-your-os-x-apps/)

プレーンテキストで「Info.plist」という名前で新規ファイルを作ります。中は下記のように記述します。stringタグにアプリの英語名を書いておきます。

```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
<plist version="0.9">
<dict>
   <key>CFBundleDisplayName</key>
   <string>Ukigami 8</string>
</dict>
</plist>
```

Xojoのプロジェクトファイルを開き、左サイドバーにこの「Info.plist」ファイルをドラッグ＆ドロップします。これだけでビルド時に「Bundle display name」が追加されるようになります。

### ja.lprojフォルダにInfoPlist.stringsをコピーする
新規で「ja.lproj」フォルダを作り、中にInfoPlist.stringsファイルを入れておきます。InfoPlist.stringsには下記のように日本語ローカライズ名を書いておきます。

```
CFBundleName = "浮紙８";
CFBundleDisplayName = "浮紙８";
```

左サイドバーの［macOS］を右クリックし、［Copy Files］を選択します。
![copy-files-menu.png](https://qiita-image-store.s3.amazonaws.com/0/27806/ba485366-c78a-1453-962c-c7f4dfaa562d.png)
「CopyFiles1」が追加されるので、そのままコピー先を「Resources Folder」に変更します。
![copy-files1.png](https://qiita-image-store.s3.amazonaws.com/0/27806/42ac3a6b-0e25-02a8-af9d-f67b288ac063.png)
「CopyFiles1」の真っ白いスペースに先ほど用意した「ja.lproj」フォルダをドラッグ＆ドロップします。フルパスが表示されればOK。
![copy-files2.png](https://qiita-image-store.s3.amazonaws.com/0/27806/db71f1d2-52b7-8407-bc08-ec37bacdd691.png)
この「ja.lproj」フォルダにはInfoPlist.stringsファイルが１つ入っているだけですが、ビルドすると上書されることなく、Xojoが生成するLocalizable.stringsと一緒に「ja.lproj」フォルダの中に入ってくれます。

これで仕込みは完了。これを一度しておけば、以降はビルドする毎に自動的に日本語ローカライズ名になります。
uwsc で、access の制御（UPDATE編）

#uwsc で、access の制御サンプルが少ないが、作成する機会があったのでメモしておきます。
## UPDATE文
```
Dim DBE	= CreateOleObj("Access.Application")

try
	strFileName = "D:\usr\test.accdb"
	DBE.OpenCurrentDatabase( strFileName )
	DBE.DoCmd.RunSQL("UPDATE T_1 SET x = 5 WHERE id =  1" )
	DBE.CloseCurrentDatabase()
except
	print "Error"
	DBE.CloseCurrentDatabase()
endtry
```
デフォルトのAtomでerbの自動インデント(atom-beautify)が効かない時の解決法

このgithubのissueによると、Pretty Diffという外部ライブラリのバグだそうなので
https://github.com/Glavin001/atom-beautify/issues/1167

[preferences] -> [packageでatom-beautifyと検索] -> [atom-beautifyのSettings] -> [ERB] -> [Default Beautifier] -> で[HTML Beatifier]を選択

HTML BeautifierはRubyのgemなので

```bash
gem install htmlbeautifier
```
(rbenvを使っている時はatomの起動ディレクトリのrubyが使われるっぽい?)
ブラウザのJavaScriptでShiftJISのcsvを作ってダウンロードさせる

**JavaScriptでやる必要があるのだろうか……**
サーバ側が対応してくれないので、rest apiを駆使してブラウザでcsvを作るとかでしょうか……？

まぁ、それは一旦横に置いておくとして。

utf-8だったらそんなに難しくないんですけれどもね。
その形式だとexcelに優しくないので、ShiftJISの形式にして頑張ってcsvを作ってみようと思います。

# 実装例とデモ

https://github.com/fumihiko-hidaka/create-sjis-csv
https://neko-tech-test-storage.storage.googleapis.com/create-sjis-csv/index.html

こっちの方が楽だよ！　とかあれば、コメントやprいただければ:yum:
動作確認はchromeだけです:sob:

# 使ったライブラリ

日本語の変換用に[encoding-japanese](https://github.com/polygonplanet/encoding.js)
ファイルのダウンロード用に[file-saver](https://github.com/eligrey/FileSaver.js)

主に上記の2つを使いました！

# 実装例

```js
const csvFormat = (col => `"${col}"`);

const csvData = [
  ['列1', '列2', '列3'].map(csvFormat).join(','),
  ['あいうえお', 'かきくけこ', 'さしすせそ\nたちつてと'].map(csvFormat).join(','),
  ['キズナアイ', '輝夜月', '虹河ラキ'].map(csvFormat).join(','),
].join('\n');

const unicodeList = [];
for (let i = 0; i < csvData.length; i += 1) {
  unicodeList.push(csvData.charCodeAt(i));
}

// 変換処理の実施
const shiftJisCodeList = Encoding.convert(unicodeList, 'sjis', 'unicode');
const uInt8List = new Uint8Array(shiftJisCodeList);

// csv書き込みの実装
const writeData = new Blob([uInt8List], { type: 'text/csv' });

FileSaver.saveAs(writeData, `shift-jis-${(new Date()).getTime()}.csv`);
```

実はそんなに難しいことはしていないのです。
文字列をcharCodeAtにしたものを変換、Blobを作成しダウンロードさせています。
FileSaverを使わなくても行けるんですが……まぁ、使ったほうが実装は楽なので！

# 最後に
[株式会社ネコカリ](https://www.nekokari.co.jp/)では猫の手も借りたい🔥炎上中🔥なお仕事を募集しています！
一緒に働くメンバーも募集していますので、よかったら是非！
OpenMPIを使う in Julia 1.0

# 最新版OpenMPIのインストール on Ubuntu 16.04
［20180908：追記］
gfortranをインストールする。これを忘れるとMPI.jlのビルドでfortran関連のエラーが出る。

```:Shell
$ sudo apt-get install gfortran
```
［20180908：追記ここまで］

Ubuntu 16.04に以下のコマンド

```:Shell
$ sudo apt install openmpi-doc openmpi-bin openmpi-dev
```

でOpenMPIをインストールした後に、Julia 1.0でMPI.jlのビルド中に以下のエラーが出た。

Error: Symbol 'mpi_no_op' at (1) has no IMPLICIT type

[ここ](https://www.bountysource.com/issues/54892698-add-one-sided-communcation-calls)を参考にすると、どうやらapt installで入るOpenMPI(v1.8.x)が古いことが原因のようである。よってOpenMPIの公式サイトからソース（openmpi-3.1.2.tar.gz）をダウンロードしてインストールする。以下にその手順を示す。

```Bash:Shell
# OpenMPIの最新版インストール
$ ./configure --prefix=/usr/local/openmpi-3.1.2 --enable-mpi-cxx --enable-mpi-cxx-seek  CC=gcc CXX=g++
$ make -j 4 all 2>&1 | tee make.log
$ sudo make -j 4 install 2>&1 | tee install.log

# .bashrcに追記
$ vi .bashrc
MPIROOT=/usr/local/openmpi-3.1.2
export PATH=$MPIROOT/bin:$PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$MPIROOT/lib
export MANPATH=$MANPATH:$MPIROOT/share/man

# テスト
$ mpiexec -np 4 echo Hello
```
# MPI.jlのインストール on Julia 1.0

JuliaのREPLでMPI.jlをaddしたあとに、以下のhello_mpi.jlでテストを実行する。

```hello_mpi.jl
using MPI

function main()
    # initialize
    MPI.Init()

    # establish the MPI communicator and obtain rank
    comm = MPI.COMM_WORLD
    rank = MPI.Comm_rank(comm)

    # wait not to be mixed
    sleep(rank*0.1)
    println("Hello! I am rank $(rank).")

    # finalize
    MPI.Finalize()
end

main()
```

コマンドは以下の通り。

```Bash:Shell
$ mpiexec -np 4 julia hello_mpi.jl
```

各プロセスから応答が確認できれば完了である。お疲れ様でした。
git alias で --no-pager を使いたい

解決方法: `!git` を使う

```だめ.gitconfig
[alias]
  b = --no-pager branch
```

```shell-session
$ git b
fatal: alias 'b' changes environment variables.
You can use '!git' in the alias to do this
```

怒られた。 `!git` を使えという

```正解.gitconfig
[alias]
  b = !git --no-pager branch
```

```shell-session
$ git b
  release
* master
```

便利ですね。

> As you can tell, Git simply replaces the new command with whatever you alias it for. However, maybe you want to run an external command, rather than a Git subcommand. In that case, you start the command with a ! character. This is useful if you write your own tools that work with a Git repository.

[2.7 Git Basics - Git Aliases](https://git-scm.com/book/en/v2/Git-Basics-Git-Aliases) より引用

git alias の定義は `!` を先頭におくことで外部コマンドを使える。外部コマンドとして git を呼び出してるんですね。
Google Play Developer Console の備忘録

# apk / aab のアップロードについて
- バージョンコードがユニークである必要があるので、同じバージョンコードのバイナリを複数回上げることはできない。これは内部テスト・アルファ・ベータ・製品版問わずである（不便）。

# アプリの公開・非公開ステータスについて
- Play ストアに該当アプリが公開されるか否かを司る。なので、例えば内部テスト版の配布でしか使わなかったとしても、アプリ自体のステータスは「公開」にする必要がある。
- 製品版やオープンベータないしオープンアルファ版にしなければ、このデベロッパーの他のアプリ一覧には出現しない。

- アプリの公開・非公開のステータスを変更するには、各アプリの管理画面内メニューにある「価格と配布」を開く。
<img width="1425" alt="Screen Shot 2018-08-29 at 12.38.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/17579/4a40719d-e4c8-7bb2-6bd0-c2316066106c.png">
<img width="1390" alt="Screen Shot 2018-08-29 at 12.47.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/17579/82c8f5c8-469c-fe20-e890-91f6ed249ffc.png">


# テスト課金について
- 「テスターの管理」とは **別に** 、テストしたいアカウントのメールアドレスを登録する必要がある。 Play Console の「設定」から、「アカウントの詳細」にある、ライセンステストの項目にある、「テスト用のアクセス権がある gmail アカウント」に CSV 形式でメールアドレスを追加する必要がある。

<img width="387" alt="Screen Shot 2018-08-29 at 12.55.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/17579/eb44185d-40bf-c562-ea40-8dbd8f95c064.png">
<img width="1432" alt="Screen Shot 2018-08-29 at 12.57.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/17579/cf0023d0-cb73-e90c-306e-f24a97ae07c3.png">

以下は入力例。

```
hello@test.com,sample@sample.com
```

# 課金テストの詳細
- https://developer.android.com/google/play/billing/billing_testing?hl=ja
pyenv利用時のMacVim + powerline導入メモ

## Introduction

Macbookを新調したので憧れのiTerm2 + zsh + tmux + vim環境を整えています。
powerlineを導入する際に少々苦戦したため覚書です。

## Goal

zsh, tmux, vimに対しpowerlineを導入する。

## How to

### Python (pyenv)

pyenvをインストールします。

```zsh
$ brew update
$ brew install pyenv
$ echo 'export PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.zshrc
$ echo 'eval "$(pyenv init -)"' >> ~/.zshrc
$ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.zshrc
$ source ~/.zshrc
$ pyenv -v
```
via / [pyenv/pyenv: Simple Python version management](https://github.com/pyenv/pyenv#homebrew-on-mac-os-x)


python3.5.1をインストールします。
このとき、MacVimのビルドに必要なDLLを含めるように環境変数を設定します。
otoolでDLLのパスを確認できます。

```zsh
$ PYTHON_CONFIGURE_OPTS="--enable-shared" \
    LDSHARED="clang -bundle" \
    LDCXXSHARED="clang++ -bundle" \
    BLDSHARED="clang -bundle -lpython3.5m" \
    pyenv install 3.5.1
$ otool -L $HOME/.pyenv/versions/3.5.1/lib/python3.5/lib-dynload/_ctypes.cpython-35m-darwin.so
```

via / [MacVim with Python 2.x and Python 3.x](https://gist.github.com/splhack/4ec93591aec286beac496bbd5cc8d764)

### MacVim

macvimのリポジトリからソースコードを取得します。

```zsh
$ brew tap macvim-dev/macvim
$ brew edit macvim-dev/macvim/macvim
```

MacVimのビルド引数を編集します。
HomeBrewのpythonを見ているので、pyenvでインストールしたpythonのパスに変更します。

```vim
# ENV.append 'vi_cv_path_python3', "#{HOMEBREW_PREFIX}/bin/python3"
# ENV.append 'vi_cv_dll_name_python3', "#{HOMEBREW_PREFIX}/Frameworks/Python.framework/Versions/3.5/Python"
ENV.append 'vi_cv_path_python3', "/Users/<ユーザ名>/.pyenv/versions/3.5.1/bin/python3"
ENV.append 'vi_cv_dll_name_python3', "/Users/<ユーザ名>/.pyenv/versions/3.5.1/lib/libpython3.5m.dylib"
```

macvimをインストールします。

```zsh
$ brew install --HEAD --with-properly-linked-python2-python3 --with-override-system-vim macvim-dev/macvim/macvim
```

via / [HomebrewでインストールしたMacVimがpyenvのpythonでビルドされない問題を解決](https://qiita.com/ens/items/6b3282650290e6ea556e)

### powerline

```zsh
$ pip install powerline-status
$ git clone https://github.com/powerline/fonts.git 
$ fonts/install.sh
$ rm -rf fonts

$ cp -r ~/.pyenv/versions/3.5.1/lib/python3.5/site-packages/powerline/config_files/* ~/.config/powerline
```
## 設定

### zsh

```zsh:~/.zshrc
powerline-daemon -q
. /Users/<ユーザ名>/.pyenv/versions/3.5.1/lib/python3.5/site-packages/powerline/bindings/zsh/powerline.zsh
```

### tmux

```conf:~/.tmux.conf
set-option -g default-terminal screen-256color
set -g terminal-overrides 'xterm:colors=256'
run-shell "powerline-daemon -q"
source "/Users/<ユーザ名>/.pyenv/versions/3.5.1/lib/python3.5/site-packages/powerline/bindings/tmux/powerline.conf"
```

### vim

```vim:~/.vimrc
python3 from powerline.vim import setup as powerline_setup
python3 powerline_setup()
python3 del powerline_setup
set laststatus=2
set showtabline=2
set noshowmode
```

via / [Powerline導入例](https://qiita.com/tkhr/items/8cc17c02dea1803be9c6)

## Conclusion

苦戦した原因は、MacVimを素でインストールするとpythonが実行できないという点でした。
またpyenvによるpythonのバージョン切替を行えるようにしていたためMacVimのビルド設定にも調整が必要でした。

改めて考えると
わざわざMacVimでなくてもよかったのでは･･･
powerline使うならVim 8.xでいいのでは･･･
Vimはvim-airline使えばよかったのでは･･･
など反省点は尽きません。

しばらくはiTerm2以外のGUIも頻繁に使うため、スタンドアロンで動くMacVimはひとまずアリかなと思いつつ、今後dotfile化させるためにも整理していきます。
Laravel Homesteadで、CLI実行時phpデフォルトバージョン変更

Laravel5.2のプロジェクトで日次のバッチ処理追加を依頼されたため、環境を立ててartisanコマンドを実行したところ

``` text:エラー
  [ErrorException]
  count(): Parameter must be an array or an object that implements Countable
```

というエラーが発生した。
artisan コマンドに -v オプションつけて叩いたところ、Illuminate/Database/Eloquent/Builder.phpでエラーが起きてるよ、と言っている。該当箇所は下記。

```php:Illuminate/Database/Eloquent/Builder.php（該当箇所のみ抜粋）
    /**
     * Apply the given scope on the current builder instance.
     *
     * @param  callable $scope
     * @param  array $parameters
     * @return mixed
     */
    protected function callScope(callable $scope, $parameters = [])
    {
        array_unshift($parameters, $this);

        $query = $this->getQuery();
        // We will keep track of how many wheres are on the query before running the
        // scope so that we can properly group the added scope constraints in the
        // query as their own isolated nested where statement and avoid issues.
        $originalWhereCount = count($query->wheres);

        $result = call_user_func_array($scope, $parameters) ?: $this;

        if ($this->shouldNestWheresForScope($query, $originalWhereCount)) {
            $this->nestWheresForScope($query, $originalWhereCount);
        }

        return $result;
    }
```

エラーメッセージでググったところ、PHP7.2からcount()にnull渡すとwarning吐くようになったらしい。

もともと、nginx経由の場合は7.0に振るよう、nginx.confを書き換えて凌いでおいたのだが、CLIだとデフォルトバージョンの7.2の方が呼ばれてしまっている、ということらしい。確認すると、確かにartisanコマンド実行時には7.2になっている。

```sh:バージョン確認
$ php artisan tinker
Psy Shell v0.7.2 (PHP 7.2.3-1+ubuntu16.04.1+deb.sury.org+1 ― cli) by Justin Hileman
```

CLIのデフォルトバージョンを変えてしまえ、ということで方法を調べたところ、だいたい同じ問題で困っている人を発見。
https://stackoverflow.com/questions/48813252/calling-composer-with-specific-php-version-on-homestead

回答中に、下記githubへのリンクがあった。
https://github.com/laravel/homestead/blob/master/resources/aliases

開発環境用の応急処置なので、シェルの内容のうち、下記必要な３行だけ実行して解決。

``` sh
sudo update-alternatives --set php /usr/bin/php7.0
sudo update-alternatives --set php-config /usr/bin/php-config7.0
sudo update-alternatives --set phpize /usr/bin/phpize7.0
```

```sh:バージョン再確認
$ php artisan tinker
Psy Shell v0.7.2 (PHP 7.0.28-1+ubuntu16.04.1+deb.sury.org+1 ― cli) by Justin Hileman
```

無事、7.0.28になりました。
本番のミドルウェアバージョンしっかり確認してから環境構築すればよかった。

# 参考
PHP7.2のcountにハマった話
https://qiita.com/masaki-ogawa/items/1671d110b2286ececd09

下位互換性のない変更点(PHPドキュメント)
http://php.net/manual/ja/migration72.incompatible.php



# 追記（2020-04-08）
homestead 6以降であれば、コマンドが用意されている。
https://readouble.com/laravel/6.x/ja/homestead.html#multiple-php-versions
Swift 4 ネットワークの接続チェック

## はじめに
iOSアプリ上で、端末のネットワークの接続状況をチェックする要件が出てきた為、
ライブラリがあるか調べてみた。
[ReachabilitySwift](https://github.com/ashleymills/Reachability.swift)というライブラリがあったので、使用方法記載する。

## 導入

CocoaPodsからインストール

```:Podfile
pod 'ReachabilitySwift'
```

## 実装

```swift:Uitls.swift
import Reachability

final class Network {
    
    static func isOnline() -> Bool {
        guard let reachability = Reachability() else { return false }
        return reachability.connection != .none
    }
    
}
```

呼び出し元

```swift:Test.swift
if Network.isOnline {
    // オンライン
} else {
    // オフライン
}
```
Amazon Linuxに必要なパッケージをインストールしてみる - Amazon EC2

Amazon Linuxは軽量かつシンプルに設計されており必要のないアプリケーションやサービスは入っていないため安全性は高いのですが同時によく使用するものも入っていません。
その為、必要なパッケージは独自にインストールする必要があります。
ちょっとだけ触ってみようという感じです。


---
###1.gcc/gcc-c++
gcc/gcc-c++ は、OSで使用するソフトウェアを「rpm」などのインストールコマンドでインストールせず、ソースコードをコンパイルしてインストールするためのコンパイラになります。

スーパーユーザで、gcc/gcc-c++をインストールする。
`sudo su -`
`yum -y install gcc gcc-c++ make`
![スクリーンショット 2018-08-28 22.38.11.png](https://qiita-image-store.s3.amazonaws.com/0/280929/4381a2dd-e0a7-0d33-c3c1-95d3f2211908.png)

Complete!と表示されたら、完了です。
![スクリーンショット 2018-08-28 22.38.36.png](https://qiita-image-store.s3.amazonaws.com/0/280929/48c4f177-aafc-b31d-8e95-102e1b73001c.png)
Adobe XDでオブジェクトを反転（水平・垂直）する

#XDでオブジェクトを反転したい
左右反転（垂直軸を基準に、水平方向に反転）したいとき、XDのオブジェクト操作メニューに「反転」は存在していないので、思い切って端を掴んで反対にグイッとやると、案外うまくいきます。

##1 オブジェクトサイズを把握
Width=180というところだけ覚えればOK
![スクリーンショット 2018-08-29 11.42.18.png](https://qiita-image-store.s3.amazonaws.com/0/275110/fd6dd0b8-73bc-9935-b9c7-5a2a49a31712.png)


##2 反転したい方向（左右なら左か右）を掴む
![スクリーンショット 2018-08-29 12.01.45.png](https://qiita-image-store.s3.amazonaws.com/0/275110/c23a6cd3-714a-f69d-0951-e28044add567.png)


##3 そのままめっちゃ反対までひっぱる
このとき、元のサイズより大きくしておくとよい。
![スクリーンショット 2018-08-29 12.02.30.png](https://qiita-image-store.s3.amazonaws.com/0/275110/cb43855c-1b70-44ec-2c97-d63a107d43f8.png)

##4 縦横比固定にしてWidthを元のやつに合わせる
![グループ化 7.png](https://qiita-image-store.s3.amazonaws.com/0/275110/05bd379b-f348-15d3-0734-ad36b8e446e2.png)

##5 完成！ いい感じ
![スクリーンショット 2018-08-29 11.45.06.png](https://qiita-image-store.s3.amazonaws.com/0/275110/2d78c5b4-376b-aec4-7f61-ecfa6d1d03ed.png)

##ちなみに結合したオブジェクトや複雑なパスでも大丈夫そう
![スクリーンショット 2018-08-29 11.49.23.png](https://qiita-image-store.s3.amazonaws.com/0/275110/3dd36b2e-016d-368a-cf97-f05f093e0a1d.png)
![スクリーンショット 2018-08-29 11.53.10.png](https://qiita-image-store.s3.amazonaws.com/0/275110/ad9d380b-016f-c1f7-d2ba-785f5610174f.png)

以上、回転やパスの操作はよく見るけど、反転についての情報が少なかったので検証とメモ。
IntelliJ IDEAからGitリモートリポジトリのWebサイトを開くことができるようにする

# はじめに

以前にポストした記事 「[IntelliJ IDEAからディレクトリやファイルをEmacs（およびMagit）で開くことができるようにする](https://qiita.com/crossroad0201/items/179ae43e5454c69de1ec) 」の応用編として、**IntelliJ IDEA** から **GitHub** などのリモートリポジトリのWebサイトを開くようにしてみます。

<img width="650" alt="idea.png" src="https://qiita-image-store.s3.amazonaws.com/0/94618/faa69092-c722-a5b4-a031-bd918f5d6707.png">


# 前提

## git-openのインストール

あらかじめ、GitリモートリポジトリのWebサイトを開くためのツール [git-open](https://github.com/paulirish/git-open) をインストールしておきます。

これは、ローカルのGitワーキングコピー上で `git open` コマンドを実行すると、クローン元のリモートリポジトリを自動的に判別し、そのWebサイトを Webブラウザで開いてくれるツールです。

対応するGitクローンとしては、[GitHub](https://github.com/) はもちろん、[BitBucket](https://bitbucket.org/product) や [GitLab](https://about.gitlab.com/) などもサポートされています。
（自分も [AWS Code Commit](https://aws.amazon.com/jp/codecommit/) 対応でコントリビュートしました。 2018/8/29時点では master にマージはされていますが、まだリリースはされてません）


# 設定

「[IntelliJ IDEAからディレクトリやファイルをEmacs（およびMagit）で開くことができるようにする](https://qiita.com/crossroad0201/items/179ae43e5454c69de1ec) 」と同様に、*External Tools* に *git-open* を実行する設定を追加します。

|設定項目|設定値|説明|
|----|----|----|
|Name|`Git Open`|任意の名前を付けます|
|Program|`/usr/local/bin/zsh`|使っているシェルへのパスを指定します。|
|Arguments|`-c "git open"`|`git open`コマンドを実行します。|
|Working directory|`$ContentRoot$`|選択したファイルを含むモジュールのルートディレクトリで実行されるようにします。|
|Open console for tool output|OFF|実行時に、IDEAのコンソールが開くと邪魔なのでOFFにしておきます。|

<img width="1070" alt="git-open.png" src="https://qiita-image-store.s3.amazonaws.com/0/94618/ee084850-b22d-c32b-b211-a23e0f5d5a8e.png">

----

以上です。