OmniAICreator/Qiita-1.07M huggingface dataset:
windows10で快適なCUI環境を構築する

(追記)
この記事は古いのでWSL2対応版を参照してください。
https://qiita.com/vitway/items/c0383f701f14997e052a

# windows10で快適なCUI環境を構築する

* Bash on Ubuntu on Windows環境を構築する
* AWS上のサーバーにはこの環境からsshする
* 脱cygwin

# Bash on Ubuntu on Windows本体の導入

* 本体の導入についてはここでは割愛
* 以下を参照
[Bash on Ubuntu on Windowsをインストールしてみよう！](http://qiita.com/Aruneko/items/c79810b0b015bebf30bb)

# ターミナルがcmd.exeだとつらい

* 伝統的なDOS窓ではとても快適とは言えない
* mintty経由で使えるらしい

# wsl-terminalを使う

[wsl-terminal](https://github.com/goreliu/wsl-terminal/releases)から最新版を入手して、適当なディレクトリに展開するだけ
以下では c:\wsl-terminal に展開したものとする

参考: [Bash on Ubuntu on Windows + オールインワンmintty](http://qiita.com/shiena/items/b8036514c217000a221e)

## 使い方

c:\wsl-terminal\open-wsl.exeを実行するのみ

## 起動後のカレントディレクトリが起動時のカレントディレクトリになる件

c:\wsl-terminal\open-wsl.exe -l として実行する
または、c:\wsl-terminal\etc\wsl-terminal.conf を設定する

```ini:\wsl-terminal\etc\wsl-terminal.conf
[config]
title="        "
shell=bash -l
use_cbwin=0
use_tmux=0
attach_tmux_locally=0
```

## 起動時にbashではなく、zshを使いたい

```ini:\wsl-terminal\etc\wsl-terminal.conf
[config]
title="        "
shell=/usr/bin/zsh
use_cbwin=0
use_tmux=0
attach_tmux_locally=0
```

事前に一旦bashでログインしてから、apt-get install zshしておく必要あり

# Ubuntu on Windows内での環境設定

## aptのproxy設定

社内ネットワークなどでproxyを通さないと外部に出られない場合、/etc/apt/apt.conf にproxyの設定を書く

```conf:/etc/apt/apt.conf
Acquire::ftp::proxy "http://proxy.example.com:8080/";
Acquire::http::proxy "http://proxy.example.com:8080/";
Acquire::https::proxy "http://proxy.example.com:8080/";
```

これでapt-get installで好きなパッケージを導入できるようになる

## よく使うものを導入

```sh:sh
$ apt-get install git zsh screen
```

## あとはsshするだけ

```sh:sh
$ ssh user@your_server
```
Using apt-get at offline environment

#Prerequisites
- Prepare a Ubuntu running machine which is online
- Preferably better to build a online machine exactly the same as offline machine

#Procedures at online machine
- First, install whatever software you want to install to the online machine

1. Delete all .deb files at /var/cache/apt/archives
`sudo apt-get clean`

2. Confirm .deb files are not present at /var/cache/apt/archives
`ls /var/cache/apt/archives`

3. Install whatever software you want to install
`sudo apt-get install cacti`

4. confirm .deb files are present at /var/cache/apt/archives
`ls /var/cache/apt/archives`

5. Compress /var/chache/apt/archives to archives.tar.gz
`sudo tar -cvzf archives.tar.gz /var/cache/apt/archives`
 
6. Copy archives.tar.gz from online machine to the offline machine via USB memory or whatever


#Procedures at offline machine
- Copy the .deb files from online machine to offline machine

1. Uncompress archives.tar.gz
`sudo tar -xvzf archives.tar.gz`

2. Create your own repository and compress it to Packages.gz
`sudo apt-ftparchive packages . | gzip > Packages.gz`

3. Add directory to Packages.gz and comment out all other deb sources.(Or delete all other deb sources)
`sudo vi /etc/apt/sources.list`
`+ deb file:///home/user/ ./`

4. Update your packages
`sudo apt-get update`

5. Install the software 
`sudo apt-get install cacti`
[rubyクイズ]join

#問題

```rb
arr = [
        1,
        [2,3],
        [4,[5,6]]
      ]
arr.join("*") #=> ?
```

:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:
:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:

#答え

```rb
arr = [
        1,
        [2,3],
        [4,[5,6]]
      ]
arr.join("*") #=> 1*2*3*4*5*6
```
ポートを開放してXAMMP環境でテスト環境設定をする

 
# 概要
開発がいい感じになり、テストがしたい。しかし、検証環境がない、、、どうしよう、、、
その辺にあるWindowsPCをWEBサーバに見立てて検証すればいいじゃん？そこに役割分担してアクセスしてテストすればいいじゃん！
 
# 環境
- OS windows10
- XAMPP Apache port=80（デフォルト）

一番簡単な手段で構築するため、XAMMPを使用します。
インストール時間を除けば５分あればできます。
 
# 手順
## 1.ポート開放
### 1-1.ネットワークと共有センター
![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/139352/e1a320f8-5df0-790d-51b4-4209408c8fab.png "1.PNG")

 
### 1-2.接続：イーサネット
![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/139352/3f9e294d-f0bd-03d4-10db-7b0b9719f213.png "2.PNG")

 
### 1-3.プロパティ
![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/139352/fd03ed16-391f-8c9a-2b6b-e63859af63c0.png "3.PNG")

 
### 1-4.インターネット接続の共有
1.共有（タブ）をクリック
2.「インターネット接続の共有」　「ネットワークのほかのユーザに、このコンピュータのインターネット接続を通しての接続を許可する」にチェックを入れる
3.設定をクリック

![5.PNG](https://qiita-image-store.s3.amazonaws.com/0/139352/43944e70-9213-9a79-463a-b67af0dccb93.png "5.PNG")

 
### 1-5.設定の追加
任意のポートを設定。このときApache Port=80, 外部ポート8080など変えることも可能。

![7.PNG](https://qiita-image-store.s3.amazonaws.com/0/139352/ebf342ea-b1d6-6571-2c1e-87bcd4faab6f.png "7.PNG")

![8.PNG](https://qiita-image-store.s3.amazonaws.com/0/139352/1da22133-2a29-5733-c8a3-c7da206ed0ad.png "8.PNG")

 
### 1-6.ポートが開放できているか確認
別の端末から[http://192.168.11.5/](http://192.168.11.5/)へアクセス。IPはXAMMPを入れた環境、各自読み替え。
以下画像が表示されれば、ポートの設定は完了。

![スクリーンショット 2017-09-07 23.35.33.png](https://qiita-image-store.s3.amazonaws.com/0/139352/f1ef9e08-434b-0803-d334-8ca84b4b6459.png "スクリーンショット 2017-09-07 23.35.33.png")

 
## 2.Apacheのドキュメントルートの変更
### 2-1.Apache(http.comf)を開く
![13.PNG](https://qiita-image-store.s3.amazonaws.com/0/139352/c898134f-f53f-be3c-d0c3-c46e2361a5e7.png "13.PNG")

 
### 2-2.ドキュメントルートの変更
今回は xammp > htdocs > test > index.php を作成し、そこにアクセスさせます。
※　変更はApacheを再起動しないと反映されません。

![14-1.png](https://qiita-image-store.s3.amazonaws.com/0/139352/99d11889-f553-4020-6032-b955ea578120.png "14-1.png")

### 2-3.index.phpの内容

```php:index.php
<?php echo "this is the test server!";
```

 
### 2-4.別端末から接続
![スクリーンショット 2017-09-07 23.50.37.png](https://qiita-image-store.s3.amazonaws.com/0/139352/1727f516-4a0b-7bca-1abc-6bdc61284229.png "スクリーンショット 2017-09-07 23.50.37.png")
SQLサンプルコード (MySQLで動作確認)

# 概要

タイトルの通りSQLのTips的なサンプルコードです。MySQLで動作確認をしています。
内容的には個人的な備忘録になるかもしれませんが、随時更新していきます。

**環境**

* Windows10 Professional
* MySQL 5.6.25

**参考**

* [MySQL 5.6 リファレンスマニュアル  /  関数と演算子  /  その他の関数] (https://dev.mysql.com/doc/refman/5.6/ja/miscellaneous-functions.html)

## 時間のかかるクエリを疑似的に発生させる

SLEEP関数を使用します。

```sql
> select sleep(10);
+-----------+
| sleep(10) |
+-----------+
|         0 |
+-----------+
1 row in set (10.00 sec)
```

技術検証や動作確認などでタイムアウトを意図的に起こしたい場合、下記のようなビューを作り、それに対して問い合わせを行います。

```sql
CREATE OR REPLACE VIEW temp_v (
      id
    , sleep
    , create_at ) AS
SELECT UUID() AS id
    , SLEEP(10) AS sleep
    , NOW() AS create_at
;
```

```sql
mysql> select * from temp_v;
+--------------------------------------+-------+---------------------+
| id                                   | sleep | create_at           |
+--------------------------------------+-------+---------------------+
| 68ce1e08-940a-11e7-9c5f-1c6f65331b46 |     0 | 2017-09-07 21:23:28 |
+--------------------------------------+-------+---------------------+
1 row in set (10.00 sec)
```

Javaでは下記のようなエンティティクラスを作成しJPAで検索すると結果が返るまで10秒かかります。
このことを利用してトランザクションタイムアウトを意図的に発生させることができます。

**エンティティクラス**

```java
@Entity
@Table(name="temp_v")
public class Temp implements Serializable {

    private static final long serialVersionUID = -7295335149208136304L;

    @Id
    private String id;
    @Column(name="sleep")
    private Integer sleep;
    @Column(name="create_at")
    private LocalDateTime createAt;

    @Override
    public String toString() {
        return "Temp{" +
                "id='" + id + '\'' +
                ", sleep=" + sleep +
                ", createAt=" + createAt +
                '}';
    }
}

```
Cloud9小技集（随時更新）

## コンソールからファイルを開く
```
$ c9 file.txt
```
これだけ。
応用編で、新しいファイルを作りつつ開きたいときは

```
$ touch file.txt && c9 file.txt
```
のようにする。しかし長いので、

```
echo "function touchnc9(){ touch \$1 && c9 \$1; }; alias c9=touchnc9;" >> ~/.bashrc
```

のようにaliasにしてしまうと、`c9 file.txt`一発でファイル作りつつ開いてくれる。


## MySQLを立ち上げる
`mysql`コマンドは使えない（細かいことは知らん）ので、ラッパコマンド`mysql-ctl`を使う。

```bash

$ mysql-ctl start  # 立ち上げる
$ mysql-ctl cli # コマンドラインツールを起動

```
Apache Kafkaメモ

[Kafka definitive guide](https://www.confluent.io/resources/kafka-the-definitive-guide/)を読んでいく上での自分用メモ

つど追記予定

## 特徴

[Apache Kafka](https://kafka.apache.org/)はLinkedInでスタートしたstreaming processing framework。

当初の目的として以下が挙げられている。

- push-pullモデルによって、producerとconsumerを疎結合にする
- メッセージの永続性
- 高スループット
- 水平スケール

guideでは、serialization formatとしてAvroが推奨されている。

2015年8月時点で、LinkedInでは1日あたり

- 1兆メッセージのproduce
- ペタバイト超のconsume

で使ってるらしい。恐ろしいスケールだ。

## 基本用語/概念

### Topic

messageをカテゴライズする単位。

アクセス解析システムだったらPV / Click / CVみたいな単位になりそう。

messageはtopicに対してappend-onlyで書き込まれていく。

### Partition

topicが分散させる単位のことをpartitionと呼ぶ。

topicに対するpartition数は、増加させることしかできない。

partition数は、Kafka cluster内のbrokerと同一か、その倍数にすることで効率よく分散させられる。

### Broker

一つのKafka serverをbrokerと呼ぶ。

### Producer

topicに対してmessageを書き込むKafka clientのことをproducerと呼ぶ。

デフォルトではpartitionを指定せずに、すべてのpartitionに均等に書き込むが、partitionerによって明示することも可能。ここらへんはSparkと似てる。

### Consumer

topicからmessageを読み出すKafka clientのことをconsumerと呼ぶ。

messageはpartition内でユニークなoffsetを持っており、これを使うことでどこまでconsumeしたかをトラッキングできる。

同一のtopicをsubscribeするconsumerたちは同一のconsumer groupに属する。

## Kafka clusterのサイジング

以下から算出する

- messageを保持するために必要なdisk space
- 必要となるスループットと、一台あたりの処理可能なnetwork capacity

## Producer

Producerの詳細。

`KafkaProducer`インスタンスに対して行う。

書き込みスループットを上げたい場合、複数スレッドからsendを呼び出してよい。

messageの書き込み方法には以下の3種類がある。

- Fire-and-forget
  - sendを呼び出し、返値を無視する
- Synchronous
  - sendで返されるFutureを同期的に待ち受ける
- Asynchronous
  - callbackとともにsendを呼び出す

### Producerの設定

#### acks

sendが成功したと判断するために、いくつのpartition replicaに対する書き込み成功を要求するか、を表す。

- acks=0
  - brokerからのresponseを待たずに成功と判断する。もっともスループットは出るが、messageがロストしうる
- acks=1
  - leader replicaへの書き込み成功を待つ。leaderがcrashして他のreplicaがleader選出された場合にはmessageがロストしうる
- acks=all
  - 全replicaへの書き込み成功を待つ

ここらへん、LinkedInでは具体的にどういうログをどのacksで運用しているのか、気になる

## Consumer

Consumerの詳細。

一つのtopicに対するconsumerのスループットを上げたい場合、consumer groupにconsumerを追加する。

topicの持つpartition数を超える数のconsumerがconsumer group内にあっても、意味がない（いくつかは遊ぶことになる）

複数のapplicationで同一のtopicをsubscribeしたい場合は、それぞれのapplicationでconsumer groupを用意する。

### rebalance

consumerの追加/削除を行った場合、partitionのrebalanceが行われる。

rebalanceの最中はconsumeができなくなるため、若干のダウンタイムが発生する。

consumerの追加 / 削除は、brokerのgroup coordinatorへのAPI request /  heartbeatによって行われる。

### Consumerの作成

### Commits / Offsets
PHPでの開発で役立ったものリスト(随時更新)

# 目的
新しいPC環境を整える時用の備忘録メモです（Windows向け）

# PhpStormプラグイン
[Jetbrains製品の環境構築](http://childhooddream.sakura.ne.jp/2017/08/12/jetbrains%E8%A3%BD%E5%93%81%E3%81%AE%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89/)

# 便利ツール
- Postman（Chromeアドオン版もあり）
    - https://www.getpostman.com/
- HeidiSQL
    - https://www.heidisql.com/
- RLogin
    - http://nanno.dip.jp/softlib/man/rlogin/
- Cyberduck
    - https://cyberduck.io/index.ja.html?l=ja
- Zeal
    - https://zealdocs.org/
    - https://github.com/miukoba/phpdoc-ja-docset
XdebugをWindowsのPhpStormに導入する

# 前提
- Windows環境への導入
- PhpStorm2017.2.1への導入
- Vagrant環境への導入
- Laravel(Homestead)への導入
- PHP7

# 目的
- Xdebugを使えるようにする

# 操作方法
1. Windows環境にPHPをインストールする。Vagrant環境にLaravel（Homestead）環境を用意します
2. https://xdebug.org/download.php からXdebugをインストールします
3. 2には沢山のバージョンがあり、どれを使ったらいいか分からない（私はそうでした）ので、https://xdebug.org/wizard.php のカスタムインストールを利用します
4. コマンドで「php -i」と入力するとPHPの情報が表示されるので、それをまるっとコピーして3のサイトに貼り付けます
5. 推奨のXdebugが表示されるので、それをDLし、指示に従って適する場所に配置します
6. 5の指示の3番に関して、php.iniファイルに下記を追加します

		[xdebug]
		zend_extension = C:\php\ext\**********************
		xdebug.remote_enable=1
		xdebug.remote_host=127.0.0.1
		xdebug.remote_port=9000
		xdebug.remote_handler=dbgp
		xdebug.profiler_enable=1
		xdebug.profiler_output_dir=C:\Users\******\PhpProj\xdebug
		xdebug.idekey="PHPSTORM"

7. リモート側の設定も変更します

		$ vagrant ssh
		$ sudo vim /etc/php/7.1/mods-available/xdebug.ini

		zend_extension=xdebug.so
		xdebug.remote_enable = 1
		xdebug.remote_connect_back = 1
		xdebug.remote_port = 9000
		xdebug.max_nesting_level = 512
		xdebug.idekey = "vagrant" ←これを追記。

8. PhpStormを起動し、ツールバーから設定変更を行います（PhpStormを日本語化しています）。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/164066/db97f834-a650-21de-c0cd-7f84a62a99d2.png)

9. サーバー上の絶対パスとファイル/ディレクトリーのパスが一致するように入力します
![2017-09-08_03h01_26.png](https://qiita-image-store.s3.amazonaws.com/0/164066/55f799be-3bea-75ae-36b6-26d6486570c3.png)

10. ツールバーの実行->構成の編集をクリックし、デバッグ構成を追加します。ldeキーは任意の値を入力します
![2017-09-08_03h04_57.png](https://qiita-image-store.s3.amazonaws.com/0/164066/e6555362-a347-981e-8d68-cfd5971d6b02.png)

# 参考
- PhpStormでLaravelをリモートデバッグ
    - http://qiita.com/yamatmoo/items/7dd991bbcca44044397c
- PhpStorm から Vagrant VM の PHP アプリケーションをリモートデバッグする（Web & CLI）
    - http://www.1x1.jp/blog/2014/08/how-to-setup-php-remote-debug-with-vagrant-vm.html
- PHPStormとVagrantでXdebugをインストールする方法
    - https://www.sitepoint.com/install-xdebug-phpstorm-vagrant/
- Xdebug helper
    - [Chrome アドオン](https://chrome.google.com/webstore/detail/xdebug-helper/eadndfjplgieldjbigjakmdgkmoaaaoc?utm_source=chrome-app-launcher-info-dialog)
ls よりも役に立つ loコマンドを作った

# `ls` の時代は終わった

ターミナルに触れるととりあえず `ls` と打ってしまう人は多いと思いますが、この行為は時間の浪費でしかないことには既に周知の事実であり、もっと有意義な時間の使い方をすべきです。
見知ったファイル一覧を見たところで得になることなどただの一つもありませんよね。

そこで私は `ls` よりも有用な `lo` コマンドを作りました。
その名の通り最新の COMIC LO のタイトルを取得して艶やかなピンク色で出力してくれる`ls`よりも有用なコマンドです。
`ping` 代わりにも使えます()

![](http://sagisawa.0am.jp/etc/a9932203adbe412745f85c45e2a15400.gif)


下記のpythonスクリプトをPATHが通っている場所に`lo`として置きましょう。

```python3
#! /usr/bin/env python3
from urllib.request import urlopen
import re

with urlopen("http://www.akaneshinsha.co.jp/category/item/itemgenre/itemad/magazine-ad/comic-lo/") as res:
    html = res.read().decode("utf-8")
urlprefix = "http://www.akaneshinsha.co.jp/item/"
founds = re.findall(r'<a href="{}(\d+?)/?".+?>'.format(urlprefix), html)
if not founds:
    quit()

with urlopen(urlprefix + founds[0]) as res:
    html = res.read().decode("utf-8").replace("\n", " ")
founds = re.findall(
    r'<div class="freetxt">\s*<p>.+?</p>\s*<p>(.+?)</p>', html)
if not founds:
    quit()
founds = re.findall(r'「(.+?)」', founds[0])
color = 202
for i, found in enumerate(founds):
    print('\033[38;5;%dm%s\033[0m' % (color, found))
    if (i + 1) % (max(4, len(founds)) // 4) == 0:
        color += 1
```

# まとめ
COMIC LO is god

# TODO
-l -a -h オプションつけたい
TouchDesignerで日本語を含むパスに保存されたファイルは読み込めないバグ

# 問題
TouchDesignerで遊び始めて、日本語パスを含むフォルダにtoeファイルを保存し、
読み込むと、正常にプロジェクトが復元できなかった

#環境
Widnows 10 Pro
TouchDesigner099 64bit 2017.12740


#解決方法
日本語を含まないパスにtoeを保存、読み込みとする

#感想
このご時世に、日本語含むパスを含むバグをふむなんんて。。。
ARKitのサンプルプログラムをビルドする（初心者向け）

iOS11から公開されたARKitのサンプルプログラム(以下DemoApp)のをビルドする方法を紹介します。
XcodeのダウンロードiOS11へのアップグレード方法はここでは扱いません。

### 実行環境
---
- macOS 10.12.6 Sierra
- Xcode9
- iOS11

### Xcodeで実機デバッグできるようにするための設定
---
- 事前にAppleIDを取得しておく

![xcode_menu.png](https://qiita-image-store.s3.amazonaws.com/0/200963/1179a69c-e2c3-8454-1d8f-5288b2448b86.png)

- Xcode を開きメニューより Xcode ＞ Preferences... を選択

![Accounts.png](https://qiita-image-store.s3.amazonaws.com/0/200963/8cc85057-ff2c-60c3-263a-503cfd0d0863.png)

- Accountsタブを選択し左下の＋ボタンを選択し、自分のAppleIDとパスワードを入力する
- アカウントが登録されたら右下の View Details... を選択し自分の署名情報を確認する

![accounts_setting.png](https://qiita-image-store.s3.amazonaws.com/0/200963/7421c346-0761-b97d-8d12-2e3abbbaec5e.png)

- もしもこの時 iOS Development が Create の状態であった場合は Create を選択する


### サンプルプログラムのビルド
---
![download_page.png](https://qiita-image-store.s3.amazonaws.com/0/200963/6d14b9c6-62d3-6c2b-849f-fd45f65f3a22.png)

- [AppleのARKit紹介ページ](https://developer.apple.com/arkit/)よりARKitのサンプルプログラムをダウンロードする
- ダウンロードしたPlacingObjects.zipを解凍する

![directory.png](https://qiita-image-store.s3.amazonaws.com/0/200963/160d009e-06a2-683a-852d-29ca0d9d1da5.png)

- Xcode9で解凍したディレクトリ内にあるARKitExample.xcodeprojを開く

![xcode_setting.png](https://qiita-image-store.s3.amazonaws.com/0/200963/942e3722-8567-e5f5-e9d3-7fa2f7db1459.png)

- 左のペインにあるARKitExampleを選択しTARGETのARKitExampleを選択する
- Generalタブを選択し、Signing項目にあるAutomatically manage signingのチェックをONにする
- さらに、Teamの項目より自分の名前(Personal Team)を選択する

![build_setting.png](https://qiita-image-store.s3.amazonaws.com/0/200963/c3c66d41-b499-fcd8-cc80-fb191a997e18.png)

- Build Phasesタブを選択し、Link Binary With Libraries項目にある＋ボタンを選択する
- 追加できるframework一覧が表示されるのでARKit.frameworkを選択し追加する
- iOS11のデバイスをmacに接続する

![run@device.png](https://qiita-image-store.s3.amazonaws.com/0/200963/aa9ac6e2-bab5-82a5-5857-80d0d7c5ab5c.png)

- メニューのProduct ＞ Run または 実行ボタンよりプログラムを実行する
- ここまで問題がなければデバイスにサンプルプログラムがインストールされる
 
![ipad_setting.png](https://qiita-image-store.s3.amazonaws.com/0/200963/6bbdb39d-b6f5-e798-dd52-bc3889413c99.png)

- インストールはできるのにエラーが出て実行ができない場合はiOSデバイスの設定 ＞ プロファイルとデバイス管理 ＞ デベロッパAPP より自分のアカウントを信頼する設定を行う
静的ライブラリを試す小さなメモ

静的ライブラリは実行ファイルに同梱されるらしい。
リンク後にライブラリファイル削除しても実行できた。

# コード

これを静的ライブラリに使う

```c:sum.c
int sum(int a, int b){
        int r = a + b;
        return r;
}
```

ライブラリを使う側のコード
プロトタイプ宣言の部分はヘッダファイルを読み込む感じにするといいらしい

```c:test2.c
#include <stdio.h>

int sum(int, int);

int main(int arg, char *argv[]){
        printf("hello\n");
        int n;
        n = sum(1, 4);
        printf("%d", n);
}
```

# 実行

まず静的ライブラリを作る

```
★オブジェクトファイル生成（この時点ではリンクはしない。sum.oができる）
# gcc -c sum.c
★静的ライブラリ作成（libsum.aができる）
# ar rusv libsum.a sum.o
```

で、できた静的ライブラリを使って実行ファイル作成

```
# gcc test2.c -o test2 -L . -lsum
# ./test2
hello
5
```

# リンカのパスに通してみた場合

```
★パスを確認
# ldconfig -v
# cp libsum.a /usr/local/lib
★ -L で指定する必要がない
# gcc test2.c -o test2 -lsum
```



# 参考
ほとんど以下のサイトの抜粋

C: 静的ライブラリと共有ライブラリについて - CUBE SUGAR CONTAINER http://blog.amedama.jp/entry/2016/05/29/222739

[C言語] 共有ライブラリと静的ライブラリを整理する - Qiita http://qiita.com/edo_m18/items/b9765ff3313d5a13f82f
Reactのライフサイクル

## React v16.3
新しいライフサイクル関数が追加されました。

```javascript
static getDerivedStateFromProps(nextProps, prevState) {
  /* 戻り値：処理後の新しいState、変更なければ、nullで返す */
  // v17からcomponentWillReceivePropsが削除されるので、基本同様な機能実現できます。
  // getDerivedStateFromPropsが初回描画も呼ばれます
}

getSnapshotBeforeUpdate(prevProps, prevState) {
  // DOMが変更される前に呼ばれます。
  // 戻り値はcomponentDidUpdateの三つ目パラメータとして渡されます。
}

UNSAFE_componentWillMount(){
  // v17からcomponentWillMountが削除されます
}

UNSAFE_componentWillReceiveProps() {
  // v17からcomponentWillReceivePropsが削除されます
}

UNSAFE_componentWillUpdate() {
  // v17からcomponentWillUpdateが削除されます
}
```

## React v16.2 以前

```javascript
getDefalutProps(){
  /* 全体で一度しか呼ばれない */
  /* インスタンス作成時に親コンポーネントが値を指定しなかった時だけ、ここの値が使用される */
  /* 戻り値：Propsのキーと初期値(バリュー) */
}

getInitialState(){
  /* インスタンス作成毎に呼ばれる */
  /* 描画前にコンポーネントの状態を変更する最後のチャンス */
  /* 戻り値：Stateのキーと初期値(バリュー) */
}

componentWillMount(){
  /* 初回の描画時にのみ呼び出される */
  /* コンポーネントがページに追加される直前に呼び出される */
  /* 引数も戻り値もなし */
}

/* 描画 */
render: function(){
  /* 戻り値：ReactのElement */
}

/* 描画後 */
componentDidMount(){
  /* 初回の描画完了後に呼ばれる */
  /* ここではじめて実際のDOMの操作が出来る(React.findDOMNode(this)) */
}

/* 再描画前 */
componentWillReceiveProps(nextProps) {
  /* 引数 : 親から送られた値(props) */
  /* 親コンポーネントのstate等が変更されて、再描画が発生する際に呼ばれる */
  /* ただしこの時点ではthis.propsは変わっていない */
}

/* 再描画キャンセル */
shouldComponentUpdate(nextProps, nextState) {
  /* falseを返すと、componentWillUpdateとcomponentDidUpdateとrenderをskipする */
  /* propsやstateが変わっても描画内容に変更がないとわかるときにパフォーマンスを早くするために使用 */
}

componentWillUpdate(nextProps, nextState){
  /* propsとstateの更新による再描画が行われる直前に呼び出される */
  /* stateやpropsは変更できない */
}

/* 再描画後 */
componentDidUpdate(prevProps, prevState){
  /* 再描画後に実際のDOMにアクセスするためのメソッド */
}

/* コンポーネント破棄時 */
componentWillUnmount() {
  /* コンポーネント削除時に呼び出される */
}
```
子供用PCでscratch

最近子供がscratch(https://scratch.mit.edu)に興味をもってきたみたいなので。。
大人用PC(Mac)でscratchで遊ぶんですが、それじゃ不便だろうということで、自分で好き勝手もできるように、古いPCにLinuxをいれて、scratchで遊べるようにしてみました。

ただただ流れを書き連ねてみます。
(今回こういう系は本当に先にVMで動作検証しておくと、ひっかかることがすくないなぁというのを実感しました。今更何を、という感じですがw)

# Puppy Linux
http://openlab.jp/puppylinux/

大昔Puppyを一瞬使っていたことがあって動作がたいへん軽いことを記憶していました。

あまり新しいPCでもないし、とりあえず軽けりゃいいやと、インストールして見たのですが、どうもscratch(ブラウザ版)がうまく動かない、と。

おそらくFlashがまともにうごかないからか、と思うけれども、深追いはせず。
オフライン版はAdobeエアーを入れないとダメなんだけど、インストールがうまく行かない。

結局自分の能力不足でPuppyのパッケージまわりの仕組みがよく理解できず、Chromeすらうまくインストールできなかったので、Puppy挫折。くっ。

# FreeBSD
https://www.freebsd.org

とりあえず、GNOMEを使うかたちで。VMに入れて使って見たけど重い。。
実機もそんなに速度出ないだろう、とおもわれるので、はやくも挫折。

xdm+xfceだとまぁまぁいけるかも、くらいにはなった。
と思ったけど、やっぱりなんか挙動が重いかも。。

やはり、scratch(web版)がうまくうごかなかったのでオフライン版を試して見ることに。AdoveエアーはFreeBSDのパッケージがなし。
あとはScratchをソースからビルドしてと思ったけど、一筋縄ではいかん雰囲気。挫折。くっ。

# Debian
https://www.debian.org

いろいろ調べて見た結果、結局Debianでscratch1.4(オフライン版)を入れるのが一番良さそう。
Raspbianの元がDebianだしし考えてみれば当たり前か。。。

とりあえずDebian入れて見た。
scratchは1.4だけどaptで入れられるので難しいことは何もない。

あと、下記ができればいいな、と思い、調べながら設定。
・パスワード入力スキップ
・無線LANつかえない。
・日本語入力

## パスワードスキップ
debian-xfceのログインマネージャはlightdmというアプリらしくて、[Seat:*]のしたのautologin-userとautologin-time-なんたら、というパラメータを設定するだけで行けた。
サスペンドの後の復帰時のパスワードは、xfceメニューの電源管理から設定した。

参考
http://linux-suomi.net/modules/tinyd8/index.php?id=18


## 無線LANアダプタをなぜか認識しない。

調べて見ると、無線に関してはここがかなり参考になりそうな感じ。
http://note.kurodigi.com/post-0-16/

要はwifiチップのファームがプロプライエタリなので、標準設定ではインストールされないから、ということらしいので、上記に従って入れて見る。

https://help.ubuntu.com/community/HardwareSupportComponentsWirelessNetworkCardsIntel

上記によれば、うちのチップにはiwl3945というドライバが必要らしいが、iwlwifiというのしか提供されていなかったので、それを入れたら無事wifi接続できるようになった。

ネットワーク設定はxfceの設定マネージャ経由でできるっぽいので/etc/network/interfacesの内容は無効にしておいた。

## 日本語入力
ということであとは日本語入力環境のみ。

anthy、scimなど、いりそうなやつを追加して、xfceの「設定」から「入力メソッド」を選択して案内に従うだけでできるようになった。

ということで問題は全て解決！

だらだらと長文失礼しました。
in_arrayを使うときは黙って第三引数を付けること


## はじめに

- phpでin_array使ってますか？
- その時、第3引数って使ってますか？
- 使ってない？いつ事故ってもおかしくないですよ？


## まずは普通に使ってみる

```php
<?php

$students = ['山本', '山下', '山田'];

var_dump(in_array('山田', $students)); // trueを返すはず
var_dump(in_array('山原', $students)); // falseを返すはず
```

実行してみましょう。山原さんは`$students`にいないのでfalse返すはずですよね。

```bash
$ php test.php
bool(true)
bool(false)
```

はい。想定通りですね。

## じゃあ問題です

```php
<?php

$numbers = [0, 1, 2, 3, 4, 5];

var_dump(in_array(3,      $numbers)); // trueを返すはず
var_dump(in_array('山原', $numbers)); // falseを返すはず
```

さぁ、どうなるでしょうか？

```bash
$ php test.php
bool(true)
bool(true)
```

なんという事でしょう！！
`山原`なんて文字列は`$numbers`に含まれてないのにtrueを返してきました。

## 一体何が起きたのか

マニュアルを読んで見ましょう。

http://php.net/manual/ja/function.in-array.php

```
bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )


needle で haystack を検索します。 strict が設定されていない限りは型の比較は行いません。
```

なんという事でしょう。
第三引数の`strict`はデフォルトでfalseになっているため、型比較までしない。
つまり、`==`で比較してるわけですね。

これがPHPの悲しい所ですが、1つ簡単な実験をします。

```php
<?php

var_dump('山原' == 0);
var_dump('山原' === 0);
```

さぁ、これはどうなるでしょうか。両方falseになると思いがちですよね。

```bash
$ php test.php
bool(true)
bool(false)
```

なんと・・・

これがPHPな訳です。

答えは、[比較演算子](http://www.php.net/manual/ja/language.operators.comparison.php)に書いてあります。

```
例	名前	結果
$a == $b	等しい	型の相互変換をした後で $a が $b に等しい時に TRUE。
```

`型の相互変換をした後で`とありますね。

つまり、これが暗黙の型変換ってやつで、文字列と数値を比較する場合には暗黙の間に文字列の型変換が行われて`0`になってしまうのです。
怖いかもしれませんが仕様です。

## じゃあどうすればよいのか？

答えですが、**in_array使うときは黙って第三引数にtrueを指定しなさい**です。

元のコードに戻って、in_arrayの第三引数にtrueを指定して型までチェックさせてみます。

```php
<?php

$numbers = [0, 1, 2, 3, 4, 5];

var_dump(in_array(3,      $numbers, true)); // trueを返すはず
var_dump(in_array('山原', $numbers, true)); // falseを返すはず
```

いざ・・！


```bash
$ php test.php
bool(true)
bool(false)
```

ようやく想定どおりの結果になりました。

PHPでは色んな罠がありますが、これも一種です。
サーバアプリケーションでは、受け取った値を元にバリデーションするシーンで使う機会は多いと思います。
そんな時に通っちゃいけない文字列が通るという危険なバグになりかねないです。

最後にもう一度

**in_array使うときは黙って第三引数にtrueを指定しなさい**

以上です。
subscribeOnとobserveOn

Androidアプリを開発する中で、RXJavaを使うことがあるかと思います。
その際、subscribeOnとobserveOnのスケジューラ周りでハマったのでメモ

# subscribeOn

subscribeOnはRXJavaのストリーム全体で使うスレッドを指定します。
例えば、次のようなコードがあったら
([https://medium.com/upday-devs/rxjava-subscribeon-vs-observeon-9af518ded53a](https://medium.com/upday-devs/rxjava-subscribeon-vs-observeon-9af518ded53a)より抜粋)

```
just("Some String") // Computation
  .map(str -> str.length()) // Computation
  .map(length -> 2 * length) // Computation
  .subscribeOn(Schedulers.computation()) // Computation
  .subscribe(number -> Log.d("", "Number " + number));// Computation
```

これはObservableから流れてくるデータの処理全体をComputationスレッドにて行います。

# observeOn

これに対してobserveOnは

```
just("Some String") // UI
  .map(str -> str.length()) // UI
  .map(length -> 2 * length) // UI
  .observeOn(Schedulers.computation()) // Computation
  .subscribe(number -> Log.d("", "Number " + number));// Computation
```

observeOnを置いた下流以降の処理が指定したスレッドになります。
このコードでは、指定がない場合はUIスレッドで処理していますが、observeOnで指定した後の処理はComputationスレッドにて処理しています。

# どう使い分けるか
APIアクセスなど、時間のかかる処理を非同期で行い、データが用意できた段階でSubscriberに通知してあげる処理をRXJavaを使って行う場合を考えます。
その時、非同期で行う処理を行うスレッドをワーカースレッドに指定することが考えられます。
そこで、全体の処理を行うスレッドをsubscribeOnで指定します。

しかし、subscribeを実行して、その中でviewの操作を行う場合はそのままワーカースレッドで行うわけにはいきません。
そこで、view操作を行うときにobserveOnしてUIスレッドで処理をしてあげればview操作が行えます。

# 参考
http://techlife.cookpad.com/entry/2015/04/13/170000

https://medium.com/upday-devs/rxjava-subscribeon-vs-observeon-9af518ded53a
Swift3 配列の要素を後ろから表示

配列を引数として受け取り、最後から順に表示。

```swift:配列の要素を逆順に表示

func printArray(it1:[String]){

    //配列の要素数表示
    print(it1.count)

    let max :Int = it1.count - 1

    //max...0と書くのは通用しない。昇順でなければならない
    //for文の中で降順を実現
    for index in 0...max {
        var backIndex = index
        backIndex = max - index
        print(it1[backIndex])
    }
}

printArray(it1: ["000","111","222","333","444","555","666","777","888","999",])
printArray(it1: ["aaa","bbb","ccc","ddd","eee","fff",])
[SCSS]supports()を書き出すmixin


CSSのat-rulesであるsupportsとsupports notを簡単に書き出すmixinの紹介です。

[現場で役立つ実践Sass（4）MixinとExtendの使いどころ](https://blogs.adobe.com/creativestation/web-practical-sass-04-mixin-extend)で紹介されている書き方をさらに使いやすくアレンジしたものになります。
メディアクエリーをmixinで管理している人も多いと思いますが、それらと組み合わせても便利なので是非ご利用ください。

## コード

### Mixinの設定

```scss
// supports
@mixin supports($property, $value) {
	$style : "#{$property} : #{$value}";
	$style : "(#{$style})";

	@supports (#{$style}) {
		#{$property} : #{$value};
		@content;
	}
}

// supports not
@mixin unsupports($property, $value) {
	$style : "#{$property} : #{$value}";
	$style : "(#{$style})";

	@supports not (#{$style}) {
		@content;
	}
}
```

### 書き方

```scss
.card {
    // supports()
    @include supports(display,flex); // (プロパティ,値)を引数に
    
    // supports not()
    @include unsupports(display,flex) { // (プロパティ,値)を引数に
        display : block; // 代替スタイルを記述
    }
}
```

### コンパイルされたCSS

```css
@supports (display : flex) {
	.card {
		display : flex;
	}
}

@supports not (display : flex) {
	.card {
		display : block;
	}
}
```

以上です。
mixinで処理することで、```.class {...}```内にまとめて書けるのが個人的に便利だと思う点です。

ちなみに、```@supports(){...}```には引数の他にスタイルを指定することが出来ます。

```scss
.card {
    // supports()
    @include supports(display,flex) {
    	justify-content : center; // スタイルを追加することも出来ます
    }
}
```

コンパイルすると

```css
@supports (display : flex) {
	.card {
		display : flex;
		justify-content : center;
	}
}
```

このようなCSSになります。

お役に立てたら幸いです。
Macにnode.jsをインストールする手順

***Macにnode.jsをインストールする手順***
https://qiita.com/akakuro43/items/600e7e4695588ab2958d


***途中nodebrewでnode.js入れようとしたらエラー出た場合は
こちらの記事に解決法が載っています***
https://qiita.com/katamuki/items/11700f21fd251e54d67b
Javaのお勉強#3(型の変換と命令実行)

## 型の変換について
- double d = 3;　←　double型変数にint型の３を代入できたり、
- String s = "ベスト" + 3;　←　String型とint型を連結できたりします。
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　これはJavaが自動で式を評価して、変換している為なのだとか。

### 三種類の型変換
1. 代入時の自動変換
2. 明示的な型変換
3. 演算時の自動型変換

代入時の自動型変換は、"小さな型"の値を"大きな型"の変数代入する場合に限って値が自動的に箱の方に変換されて代入されるようです。
例としては、

```java

float f = 3;
double d = f;

```

としても、出力すると、fは3.0、dも3.0と変換されて代入される。
なので、int型には小数点有りを入れるとエラーになりました。
しかし、強制的に代入できる方法もあるようで・・・

```java
int a = (int)3.2；
```


↑3.2をintに型変換して代入させる命令
この強制させる命令（※int）はキャスト演算子といいます。
※（）内は変換先の型名を記述すること
この方法にはリスクもあって、元のデータの一部を失ってもデータを強制的に変換しようとするため、

```java
int　a　=　(int)3.2;
```

を出力すると、3と表示されます。正確なことを求められることが多いのでこれは最終手段ですかね・・・？これは結構使われる手法なのでしょうか・・・？個人的には怖いので使いたくないのですが(^o^)

## 命令実行の文
```java
System.out.println("ランカ");
```

↑これが命令実行の文
つまりは、呼び出す命令の名前(引数);という形になる。

### 命令の種類
1. System.out.print();　←　改行をせずに文字を表示する。
2. int m = Math.max(①,②); ←2つの値を比較して大きい方の数字を代入する。
3. int n = Integer.parseInt(①); ←文字列を数字に変換する。
4. int r = new java.util.Random().nextInt(①); ←乱数を生み出して代入する命令
5. String input = new java.util.Scanner( System.in).nextInt(); ←キーボードから１行の文字列の入力を受け付ける
6. int input = new java.util.Scanner(System.in).nextInt(); ←キーボードから１つの整数の入力を受け付ける

 ・・・というわけで、第二章が終わりました！
 あとは用意されている練習問題をやってみようと思います。（今日は思いの外早くとりかかれたのでw）
 ここまで進んでくると暗記しきれてはいないですが、勉強した事を使って小規模なゲームなどを書けそうでワクワクします^_^
 今日はウメッシュ片手に勉強していたのでほろ酔い気分でございます・・・おやすみなさい(´･ωゞ)
【linux】指定した単語を除外してgrepしたい【コマンド】

意外と便利なのでメモ:pencil2:

# grepコマンドの-vオプション
```
# grep -v "test"
```
文字列「test」を除外してgrepしてくれます。
もしかしたら、あまり使う機会はないかもしれないですね・・・。

## ２つ以上の単語を除外したい時
```
# grep -v "hoge" | grep -v "fuga"
```
正規表現を使う方法もありますが、パイプ（半角の｜）で区切る方法が手っ取り早い:dash:
なにより、正規表現がわからなくても使えるのがいい！
PhpStormのDatabase tool windowにてbulk-insertのSQLでダンプする

# はじめに
**IntelliJ IDEA Ultimate 2020.2相当で動作するように修正しました**

PhpStormのDatabase tool windowのダンプ機能って便利ですよね～
INSERT文でダンプについては、ほんとよくお世話になっているのですが、複数列の登録を１つのINSERT文で実行したいので、ダンプ後に整形してたんですが、あまりにも頻繁にやってるので、ちょっと面倒になってきます。
でも、groovyでスクリプトを作ってしまえばイッパツでできちゃいますYO!
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68254/b83190ec-7c42-2dd8-ac49-da694fc58dd7.png)

#PHP出力用のScriptをダウンロード
ここからダウンロードします。
https://github.com/albyte/phpstorm-utilities/blob/master/extensions/database/data/extractors/SQL-bulk-Insert.groovy
※もともとあったINSERT SQLのScriptをいじったのですが、groovyはよくわからないので、大量データだと重いとかあるかもです。

#スクリプトをPhpStormに入れる
ダウンロードしたファイルを拡張フォルダに入れます。
![2017-09-27_23h30_12.png](https://qiita-image-store.s3.amazonaws.com/0/68254/316db354-3c11-9e51-9128-7c16e59a0d72.png)

# おわりに
これで好きなテーブルを開いたら、dump形式のところにSQL-bulk-insert.groovyってのがでるようになります。

もうPhpStorm なしでは、コード書けない
Swift3　switchで月の日数表示

月を表す数値を受け取り、その月の日数を表示する。

```swift

//2月は、28日とする
//Javaなどとは違いbreakがなくても処理が下に流れない

//戻り値にIntとString型が混在しているので、Any型を使用
func numOfDays(_ month:Int)->Any{
    switch month{
        case 1,3,5,7,8,10,12:
            return 31
        case 2 :
            return 28
        case 4,6,9,11:
            return 30
        default:
            return "入力が間違っています"
    }
}

var result = numOfDays(10)
print(result)

result = numOfDays(14)
print(result)
riot gulp フロントエンド開発環境

# riot gulp npm

## github

[toknsi/riotjs_frontend](https://github.com/toknsi/riotjs_frontend)

## package.json

```sh
{
  "devDependencies": {
    "browser-sync": "^2.17.0",
    "browserify": "^13.1.0",
    "gulp": "~3.9.1",
    "gulp-compass": "~2.0.1",
    "gulp-convert-encoding": "^1.0.0",
    "gulp-jade": "^1.1.0",
    "gulp-livereload": "2.1.1",
    "gulp-plumber": "^1.1.0",
    "gulp-riot": "^0.5.5",
    "gulp-watch": "~1.1.0",
    "riotify": "^1.0.1",
    "vinyl-source-stream": "^1.1.0"
  }
}
```

## gulpfile.js

```javascript
require("./gulptask.js");
```

## gulptask.js

```javascript
'use strict';

var gulp            = require('gulp');
var compass         = require('gulp-compass');
var livereload      = require('gulp-livereload');
var browserify      = require('browserify');
var riotify         = require('riotify');
var source          = require('vinyl-source-stream');
var browsersync     = require("browser-sync");
var jade            = require('gulp-jade');
var convertEncoding = require('gulp-convert-encoding');
var plumber         = require('gulp-plumber');


/*
 * Compass
 */
 gulp.task('compass', function(){
     gulp.src('./src/scss/**/*.scss')
     .pipe(plumber())
     .pipe(compass({
         config_file: 'config.rb',
         comments: false,
         css: './dest/css',
         sass: './src/scss'
     }))
     .pipe(convertEncoding({to: "utf-8"}))
     .pipe(gulp.dest('./dest/css'))
     .pipe(browsersync.stream());
 });

/*
 * jade
*/
gulp.task('jade', function ()  {
    return gulp.src(['./src/jade/**/*.jade', '!./src/jade/**/_*.jade'])
        .pipe(plumber())
        .pipe(jade({
            pretty: true
        }))
        .pipe(convertEncoding({to: "utf-8"}))
        .pipe(gulp.dest('./dest/'))
        .pipe(browsersync.stream());
});

/*
 * riot
 */
gulp.task('concat', function () {
  return browserify({entries: ['./src/main.js']})
    .transform(riotify, { template: 'jade' })
    .bundle()
    .on('error', function (err) {
      console.log(err.toString());
      this.emit('end');
    })
    .pipe(source('main.bundle.js'))
    .pipe(convertEncoding({to: "utf-8"}))
    .pipe(gulp.dest('./dest/'))
    .pipe(browsersync.stream());
});
/*
 * BrowserSync
 */
gulp.task('server', function () {
 browsersync.init({
   server: {
     baseDir: 'dest'
   },
   open: false,
 });
});


/*
 * Watch
 */
gulp.task('default', ['server'], function() {
  gulp.watch("./dest/*", function() {
    browsersync.reload();
  });
  gulp.watch("./src/**/*.js", ['concat']);
  gulp.watch("./src/**/*.tag", ['concat']);
  gulp.watch("./src/**/*.scss", ['compass']);
  gulp.watch("./src/**/*.jade", ['jade']);
});

```
Ruby | alias_method はメソッド / alias はキーワード

# alias_method

メソッドなのでオーバーライド出来る。

```rb
class User
  def full_name
    puts "Strawberry Kiwi"
  end

  # alias_method メソッドをオーバーライドする
  def self.alias_method(arg1, arg2)
    puts "alias_method : #{arg1} to #{arg2}"
  end

  # オーバーライドしたメソッドが呼ばれる
  alias_method :name, :full_name # alias_method : name to full_name

  # 同じくオーバーライドしたメソッドが呼ばれる
  self.alias_method :name, :full_name # alias_method : name to full_name
end

# メソッドのエイリアスはおこなわれていない
User.new.name # undefined method `name'
```

# alias

言語キーワードなのでオーバーライドできない。

```rb
class User
  def full_name
    puts "Banana Orange"
  end
  
  # alias メソッドを定義する
  def self.alias(arg1, arg2)
    puts "alias : #{arg1} to #{arg2}"
  end

  # オーバーライドしたメソッドが呼ばれる
  self.alias :name, :full_name # alias : name to full_name

  # 言語キーワードとして実行される
  alias :name :full_name
end

# エイリアスが生成されている
User.new.name # Banana Orange
```

こんな風に、メソッド自体を引数として渡しているかのように書けるのも、`alias` がメソッドではなくてキーワードだから。(たぶん)

```rb
alias name full_name
```

# 環境

- ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-darwin15]

# 参考

- http://blog.bigbinary.com/2012/01/08/alias-vs-alias-method.html
- https://stackoverflow.com/questions/4763121/should-i-use-alias-or-alias-method








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Swift3で素数判定


数値を受け取り、入力された数が素数かどうかを判定。
約数が二つだけなのが素数。

->Void は省略可。

```swift

func isPrimeNumbers(_ number:Int)->Void{
    let num = number
    var yakusuu:Int = 0

    //divisor＝割る数
    for divisor in 1...num{
        //余りがゼロならば
        if num % divisor == 0{
            yakusuu += 1
        }
    }
    //ループが終了した時の最終的な約数の数で一回判定すれば良い→for文の外に書く。
    if yakusuu == 2{
        print("素数です")
    }else {
        print("素数ではありません")
    }
}
isPrimeNumbers(2017)
ITエンジニアがスムーズに独立を果たすための4つのステップ

手に職を持っている私達ITエンジニアは一般的に『独立しやすい』と思われているようですが当の本人達はあまりそう考えていません。
それは、技術はあってもビジネスのことがよくわからないからです。

今回は、これから羽ばたいていく皆さんのために、私が独立するまでに辿ってきた道を体系化し、再現しやすいような道筋として書いてみました。

#ステップ１）正社員＋受託案件

まずは会社員をやりながら、クラウドソーシングなどのサイトから、副業で『在宅でできる案件』を取りにいきます。

日中は会社の仕事をしっかりとやり、『アフター9』や土日など、忙しいエンジニアとはいえ確保できる時間を使って、副業により収入を稼ぐとともに、顧客との信頼関係を構築していきます。

通常は『アフター5』と言われますがITエンジニア業界は5時に帰れることはまずなく、午後9時に切り上げられれば御の字です。その後も疲れていようが力を振り絞って頑張ります。

![SS-2016-05-18-16.55.59.png](https://qiita-image-store.s3.amazonaws.com/0/164635/e3f87ee1-b15f-0718-bed4-cddb01bb3c02.png)

#ステップ2）常駐型フリーランス＋受託案件

ステップ１で受託系の副業で顧客を開拓しながら、ある程度スキルに自信がついてきたら思い切ってサラリーマンを辞め、派遣社員でも良いので『常駐型』の案件に参加します。

このスタイルの良いところは、

・常駐型の案件で安定収入を稼ぐことができる
　⇒手取り額で2倍になるケースも！
・サラリーマン時代よりも割り切って時間を確保しやすくなる
　⇒サービス残業や『飲みニケーション』がほぼ無くなる
・参加するプロジェクトを選びやすくなる
　⇒会社員時代よりも自分にとって興味のある分野に携わりやすい

といった点が挙げられます。

例えば、『自分はひたすらSAP(Enterprise Resource Planningソフトウェアの一種)の道を極めたい』と思っていても、会社員の場合には会社都合で全く関係の無いプロジェクトに配属されてしまうことの方が多いです。

また、派遣社員の場合は残業代が必ずつくかどうかも、重要視します。

唯一のデメリットは、『将来への不安』でしょうか。

それも、次のステップを読んで頂ければ和らぐのではないかと思います。

![SS-2016-05-18-16.56.53.png](https://qiita-image-store.s3.amazonaws.com/0/164635/833aae24-da5c-7a4e-49e3-a05c14d55525.png)

#ステップ3）受託案件＋自社ビジネス（B2C）

常駐型の案件で安定収入を稼ぎ、受託系副業で固定の顧客を稼ぎながら、『＠SOHO』のようなB2Cの自社ビジネスを立ち上げていきます。

自社ビジネスのメリットは安定性です。

B2Bといえる常駐型、受託型の案件は、『相手があってこそ』のものなので、リスクがあります。

こちらがきちんとやっていても、顧客のビジネスがうまくいかなくなれば、来月からの売上は0（ゼロ）になってしまう可能性もあるのです。

実際、私も2006年に独立した当初は毎月のように顧客から新規開発の相談が来ていたのですが、2008年のリーマン・ショック以降、パタリと止まってしまいました。

一方、自社B2Cのビジネスというものは、B2Bよりも顧客が多くなるので、売上がある日突然0（ゼロ）になることはありません。

きちんと納めれば確実に収入が見込める受託系副業をこなしつつも、空き時間を確保して自社ビジネスを如何に早く軌道に乗せられるか？

がこのステップのポイントになります。

また、ステップ4へ向けて最低1年は無収入でも生きていけるような貯蓄も行っておきましょう。

![SS-2016-05-18-16.56.59.png](https://qiita-image-store.s3.amazonaws.com/0/164635/b582077a-62dc-cfda-54fa-232f05eb0743.png)

#ステップ4）自社ビジネス専業

自社ビジネスが軌道にのってきたら、受託系の案件も新規はとらずに、既存の顧客を維持する形にシフトしていきます。

この頃になると、受託系の案件も引っ張りだこになってしまっている可能性がありますが、そこはぐっとこらえて、自社ビジネスを育てて行くことが重要です。受託系の案件は短期的にはお金になりますが、所詮は『時間の切り売り』ですしストレスフルでもあります。

私も現在は新規の顧客は取らずに、既存の顧客からのリピート案件だけは、責任を持ってお付き合いしていますが、それ以外は自社ビジネスに集中することにしています。

![SS-2016-05-18-16.57.08.png](https://qiita-image-store.s3.amazonaws.com/0/164635/d186f527-f614-a2aa-6124-b1d82b085966.png)


如何でしたか？

私は、会社員をやりながら無我夢中で独立起業に向けて邁進していった結果、振り返ってみたらこの『4つのステップ』を通っていました。

一見、独立起業が難しそうに思えても、この『4つのステップ』を地道に着実に実践していけば、かなり高い確立で成功できるのではないかと思います。
BigQuery Standard SQL で UDF を使って UserAgent を判別する

- [BigQuery User Defined Functionとwoothee.jsでユーザエージェント判別する - Qiita](https://qiita.com/etoriet/items/dfe62de60aa438837486)

こちらの記事が Legacy SQL での方法を解説していました。諸事情で Standard SQL でやったのでその時の方法を書いておきます。

## （準備）Google Cloud Storage に woothee.js をアップロードする

- https://console.cloud.google.com/storage/browser

woothee.js は大きい & ある程度繰り返し使えるように Google Cloud Storage にアップロードします。ここでは仮に[このファイル](https://github.com/woothee/woothee-js/blob/692926db2efdca610ee7849521ac523c2ead1b73/release/woothee.js)を `gs://example/woothee.js` にアップロードしたとします。

## UDF を定義する

```sql
CREATE TEMPORARY FUNCTION uaCategory(ua STRING)
RETURNS STRING
LANGUAGE js AS """
  return woothee.parse(ua).category;
"""
OPTIONS (
  library="gs://example/woothee.js"
);
```

これが UDF の本体です。 `uaCategory` が関数の名前で `"""` の中身が関数の本体になります。ここで `woothee` というオブジェクトにアクセスしていますが、これは `gs://example/woothee.js` で定義されているもので、ようするに woothee.js の実体です。

なんとなくわかると思いますがここではパース結果のうち category を STRING として return しています。 Legacy SQL では一気にテーブルを出力（？）できたみたいですが、 Standard SQL では一つの値を返すことしかできません。なのでもし os も必要ならその分 UDF を増やす必要があります。

## UDF を使う

```sql
SELECT uaCategory(user_agent) AS category, count(*)
FROM `example.access_log_20170927`
GROUP BY uaCategory(user_agent);
```

このように `SELECT` 文で先程定義した `uaCategory` 関数を使うことができます。この結果は例えば

Row | category | f0_
---|---|---
1 | crawler | 12345
2 | smartphone | 234
3 | pc | 678

とかそんな感じになります。

## 最終形態

```sql
#standardSQL
CREATE TEMPORARY FUNCTION uaCategory(ua STRING)
RETURNS STRING
LANGUAGE js AS """
  return woothee.parse(ua).category;
"""
OPTIONS (
  library="gs://example/woothee.js"
);

SELECT uaCategory(user_agent) AS category, count(*)
FROM `example.access_log_20170927`
GROUP BY uaCategory(user_agent);
```

全体をひとまとめにするとこんな感じになります。

## Ref
- [woothee/woothee-js: Woothee javascript(and node.js) implementation](https://github.com/woothee/woothee-js)
- [BigQuery User Defined Functionとwoothee.jsでユーザエージェント判別する - Qiita](https://qiita.com/etoriet/items/dfe62de60aa438837486) 
- [User-Defined Functions  |  BigQuery  |  Google Cloud Platform](https://cloud.google.com/bigquery/docs/reference/standard-sql/user-defined-functions?hl=en)
Githubにオープンな経歴書を置くのが流行だがPDFで置いたほうがいいと思う話

（ブログからの転記：http://www.hakopako.net/entry/2017/09/27/224012）

オープンな職務経歴書を置くのはとてもいい活動だと思う。
もちろんGithubを利用するのもいい方法だと思う。  

こういった感じの。
https://qiita.com/akichim21/items/91375b047c419a1d680e
https://qiita.com/okoysm/items/abcad0b4aefa585bc50b


ただマークダウンでは非効率だと思っている。
PDFにしたほうがいい。 [^1]


# PDF にしたほうがいい理由

## 1. 適度な情報量を保てる

強制的にページで切られるため簡潔にしようという意識がでる。
（日本では関係ないかもしれないが） デザイン含めアピールポイントを調整できる。
開いて５秒以内に主要な情報が相手に伝わるものにしていける。


## 2. すぐデータを渡せる（DLしてメールに添付する等）

たとえば転職エージェントに登録するときや、誰かにメールを送る際に
PDFであればGithubからダウンロードしてすぐ添付できる。[^2]
マークダウンだと .md -> .pdf などに変換すると思われるが、
「レイアウトが乱れる → 見辛い → 情報拾えない → 見送り」
という機会損失の可能性は間違いなく上がる。

## 3. すぐURLを渡せる（メールやチャットに貼る等）

Github.io リポジトリに置けばブラウザからPDFを閲覧できる。
2.と少し被るが、ここではメールやチャットなどでURLを貼るだけで情報を渡せる。
この点だけみるとマークダウンとさほど変わらないが、
無駄な情報は削るという点でコミットログやブランチ情報などのない、
PDFへの直リンクが有効だと感じている。

## 4. もちろんGithubリポジトリ上からでも閲覧可

マークダウンで書くといい感じにテキスト表示されるが、
PDFでもファイルの中身をロードしてそのまま表示してくれる。
Github内へ流入してきた人でも見れる。


　    


　    
こんな感じ。  
http://web.hakopako.net/resume-aya-shimada-pub.pdf
https://github.com/hakopako/hakopako.github.io/blob/master/resume-aya-shimada-pub.pdf




　  

以上、異論は認める。  

　  
[^1]: htmlで書いてpdfに変換がお勧め
[^2]: 電話番号付きのものはDropBoxに入れて用途によってはそっちからDLしてる
Geb　対象要素を表示させるためにスクロール


Gebでリンクをクリックする処理が動作しないという現象につまづきました。
調べると、画面にはあるがスクロールしないと表示されない状態だとクリックできないようです。

以下のコードで対象のリンクまでスクロールしてクリックするとうまくいきました。

```
js.exec("¥$(window).scrollTop(¥$('#target').offset().top")
```

クリックに関連して、AdminLTEのチェックボックスをGebのClick()でチェックしようとした時もうまく動作しませんでした。
これは、inputタグのcheckboxの上にAdminLTEの見栄えの良い部品が重なっていたことが原因でした。

画面上で要素を重ねて表示している場合は気をつけてください。
Flask-SQLAlchemyの使い方

[Flask-SQLAlchemy](http://flask-sqlalchemy.pocoo.org/2.1/): Flaskで[SQLALchemy](https://qiita.com/msrks/items/15144746ff4f7aced4b5)を簡単に扱うための拡張

```bash:インストール
$ pip install flask-sqlalchemy
```

## 使い方

#### 1. モデルを作る

- `db = flask_sqlalchemy.SQLAlchemy()`をつくる
- `db.Model`を継承してモデルをつくる
- `db.Column`でcolumnを定義する
- `db.relationship`でモデル同士を繋ぐ

```python:app.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)

    def __init__(self, username, email):
        self.username = username
        self.email = email

    def __repr__(self):
        return '<User %r>' % self.username
```

#### 2. データベースを作る

```python
>>> from app import db
>>> db.create_all()
```

#### 3. CRUD操作

create

```python
user = User('shinzo', 'shinzo.abe@example.com')
db.session.add(user)
db.session.commit()
```

read all

```python
users = User.query.all()
```

read, delete

```python
user = db.session.query(User).filter_by(name='shinzo').first()
db.session.delete(user)
db.session.commit()
```

read, update

```python
user = db.session.query(User).filter_by(name='shinzo').first()
user.email = 'shinzo.abe@google.com'
db.session.add(user)
db.session.commit()
```
Geb 右クリックのコード


Gebで右クリックを実装した時のサンプルコードです。

```
// 対象要素を取得
def target = $("#target")

// 対象要素を右クリック
interact {
	contextClick(target)
}

waitFor {
	// 右クリックで表示されるコンテキストメニューをウェイト
	$("#contextMenu1").displayed
}

// コンテキストメニューをクリック
$("#contextMenu1").click()

```

試してはいませんが、interactの内には次のページのメソッドも実行できると思います。

http://www.gebish.org/manual/current/api/geb/interaction/InteractDelegate.html
Swift3で九九の表示

Swiftで九九の表示

初投稿なので、投稿の練習も兼ねて。

## Swift3で九九の表示

Xcode8のplaygroundで、//九九表を「○×▲＝XXX」と表示するプログラムなだけ。
Javaと違って戻り値を->と書くの面白い。

```swift
func kuku()->Void{
    for number1 in 1...9{
        for number2 in 1...9{
            let result = number1 * number2
            print("「\(number1)*\(number2)=\(result)」")
        }
    }
}
kuku()
```
```:実行結果

「1*1=1」
「1*2=2」
「1*3=3」
「1*4=4」
「1*5=5」
・
・
・
「9*5=45」
「9*6=54」
「9*7=63」
「9*8=72」
「9*9=81」
```
Flask-Bootstrapの使い方

[Flask-Bootstrap](https://pythonhosted.org/Flask-Bootstrap/): Bootstrapスタイルのアプリを簡単に作れるFlask拡張

```bash:インストール
$ pip install flask-bootstrap
```

## 使い方

#### 1. Bootstrapインスタンスの作成

```python
from flask import Flask
from flask_bootstrap import Bootstrap

app = Flask(__name__)
bootstrap = Bootstrap(app)
```

#### 2. Templateの作成

1. `extends "bootstrap/base.html"` してbootstrapのテンプレートを継承する
2. `title` `navbar` `content`などのblockを適宜、記述する

```html+jinja
{% extends "bootstrap/base.html" %}
{% block title %}This is an example page{% endblock %}

{% block navbar %}
<div class="navbar navbar-fixed-top">
  <!-- ... -->
</div>
{% endblock %}

{% block content %}
  <h1>Hello, Bootstrap</h1>
{% endblock %}
```

必要に応じて`super()`を使う（`script`や`style`のblockで必須）

```html+jinja
{% block scripts %}
<script src="{{url_for('.static', filename='myscripts.js')}}"></script>
{{super()}}
{% endblock %}
```

## 便利マクロ

#### Flask-WTF

BootstrapスタイルのFormを簡単に作れる

```html+jinja
{% import "bootstrap/wtf.html" as wtf %}
{{ wtf.quick_form(form) }}
```
Cloud9のHibernateについて

クラウドIDE[cloud9](https://c9.io)のワークスペースは基本的にはアクセス後10秒程度で読み込みが終わり使えるようになるのだが、たまにHibernate（休止）に入ってしまい、使い始めるまで5〜10分くらいかかるパターンがある。
この挙動について、[フォーラムに回答](https://community.c9.io/t/what-are-hot-workspaces/1334)があったのでざっくり要約。

* プランごとにアクティブなワークスペース(Hot Workspace)の上限が異なる（プランごとのHot Workspaceの数は[Pricing](https://c9.io/pricing)参照）
* 加入プランの上限を超えたWorkspaceを起動すると、最終アクセス日時が一番古いWorkspaceがHibernateされる。
* Hibernateされたワークスペースにアクセスすると、そのワークスペースはHotになる。代わりに、最終アクセス日時が一番古いHot WorkspaceがHibernateされる。
* 頻繁にアクセスしているWorkspaceでも、ハードウェアリタイアなどのタイミングでHibernateされることはままある。

というわけですので、cloud9で本番Webアプリを公開するのはやめましょう。
そもそものコンセプトが「開発環境」であって、デプロイサーバではないですからね。
macOS High SierraのApacheのhttpd.confの変更点

macOSのバージョンを上げると必ず行うApacheの再設定。

Sierraで使っていたhttpd.confとHigh Sierraのhttpd.confの差分をとったら以下の部分がでてきました。

（以下の行数は全てHigh Sierraのhttpd.confでのものです。）

High Sierraにバージョンアップして、httpd.confのドキュメントルートをへんこうして`sudo apachectl restart`しても`It works!`だけしか表示されなくて焦ってたのですが、よくよく比較して安堵。

#52〜56行目

ListenするポートがHigh Sierraのhttpd.confではこうなっていました。
`<IfDefine SERVER_APP_HAS_DEFAULT_PORTS>
    Listen 8080
</IfDefine>
<IfDefine !SERVER_APP_HAS_DEFAULT_PORTS>
    Listen 80
</IfDefine>`

Sierra時はシンプルにこうでした。
`Listen 80`

#151行目

High Sierraのhttpd.confでは以下が新規追加
`#LoadModule http2_module libexec/apache2/mod_http2.so`

#176行目

High Sierraのhttpd.confでは以下に変更
`#LoadModule php7_module libexec/apache2/libphp7.so`

Sierra時はこうでした。
`#LoadModule php5_module libexec/apache2/libphp5.so`
SRE本まとめ（1章 イントロダクション）

自分の理解を深めるためにまとめてみました。

## 1章 イントロダクション

### Dev（開発）とOps（運用）を分離することによるOps観点でのメリデメ
#### メリット
- 業界的にナレッジが蓄積されており、学習＆真似がしやすい。
- 人材確保しやすい。

#### デメリット
- マニュアルでの運用がベースとなるため、サービスの規模に比例してチームの規模が大きくなってしまう。
- 開発と運用でバックグラウンドが異なるために衝突しやすい。
- 開発はスピードを素早くリリースしたいという目標に対して、運用は極力問題が起こさないようにしたいという開発とは逆行する目標となってしまう。

### 上記デメリットに対するGoogleのアプローチ
ソフトウェアエンジニアにサービスを運用させることで、自動化をすすめた。GoogleのSREの大半はソフトウェアエンジニアリング＋一連の技術的スキル（主要なものとしてUNIXシステムの理解＆ネットワーク（L1～L3））を持っている。さらに全てのSREに共通するのは、複雑な問題を解決するソフトウェアシステムの開発に対する信念と適正。自動化にリソースを割かせるために運用業務は全業務時間の50％以下に抑えるようにしている。そのためにはまずは時間の計測から。そしてもし運用業務が50％以上になっているのであれば人員追加を行う。SREチームと開発チームとの間で人的交換が可能となり、エンジニアのスキルアップという副次的効果もある。課題としては人材採用が難しい。というのもコーディング＋技術の両方を有する人材はかなり少ないからである。また、リリースの調整が必要なことからマネジメント層の理解/協力が必須。

### SREの信条
#### 継続的な学習
実戦からの経験を得ながら改善するためには障害の発生度合いが大事。障害が多すぎるのは当然良くないが、少なすぎると時間だけが無駄に過ぎてしまい学習することができない。改善のための事後検証（ポストモーテム）は必須である。

#### SLOの考え方
100%の信頼性は目指すべきできはなく、サービスの内容を鑑みて99%なのか99.9%なのか99.99%なのかを決める。100%から信頼性を引いた値をエラーバジェットとして捉え、エラーバジェットをどのように使うかが重要。理想的にはローンチに関することにバジェット（予算）を使用できるとよい。

#### モニタリング
設定した閾値を超えたらアラートメールを飛ばし、それを受け取った人間がリカバリを行うという旧来のフローはよろしくないので、極力人間を介さずにリカバリできるような仕組みを構築し、やむを得ず人間の判断が必要な場合だけ通知するフローにする。

#### 緊急対応
MTTF（平均故障時間）とMTTR（平均修復時間）ではMTTRの方が重要。その場の判断でスーパーエンジニアが神がかり的なテクニックで復旧することよりも、事前に手順書を作っておき有事の際は手順書を使って復旧することのほうがよい。その手順書を使って事前に障害復旧のシミュレーションをしておくとさらによい。

#### 変更管理
少しずつリリースしていき、何か問題が発生したらすぐに検知できるようにし、必要に応じてミスの無い切り戻しができることを目指す。

#### キャパシティプランニング
問題が起こる前に、自然的/突発的な需要を加味してキャパシティの計画を行う。

#### プロビジョニング（リソース増強）
コスト面を考えるとプロビジョニングは素早くかつ必要な場合のみ行うべき。

#### 効率とパフォーマンス
コストとパフォーマンスのバランスを意識してリソースを調整する必要がある。

（[2章](https://qiita.com/bassbone/items/38eb4793366b1e11a610)に続く）